/**
* Copyright (c) 2008-2012 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.profile2.tool.pages.panels;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.behavior.StringHeaderContributor;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.sakaiproject.profile2.logic.ProfileExternalIntegrationLogic;
import org.sakaiproject.profile2.logic.ProfileMessagingLogic;
import org.sakaiproject.profile2.logic.ProfilePreferencesLogic;
import org.sakaiproject.profile2.logic.ProfileStatusLogic;
import org.sakaiproject.profile2.logic.ProfileWallLogic;
import org.sakaiproject.profile2.logic.SakaiProxy;
import org.sakaiproject.profile2.model.UserProfile;
import org.sakaiproject.profile2.tool.components.ProfileStatusRenderer;
import org.sakaiproject.profile2.tool.models.StringModel;
import org.sakaiproject.profile2.util.ProfileConstants;
public class MyStatusPanel extends Panel {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(MyStatusPanel.class);
private ProfileStatusRenderer status;
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
private SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileStatusLogic")
private ProfileStatusLogic statusLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfilePreferencesLogic")
private ProfilePreferencesLogic preferencesLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileMessagingLogic")
private ProfileMessagingLogic messagingLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileExternalIntegrationLogic")
protected ProfileExternalIntegrationLogic externalIntegrationLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileWallLogic")
protected ProfileWallLogic wallLogic;
//get default text that fills the textField
String defaultStatus = new ResourceModel("text.no.status", "Say something").getObject().toString();
public MyStatusPanel(String id, UserProfile userProfile) {
super(id);
log.debug("MyStatusPanel()");
//get info
final String displayName = userProfile.getDisplayName();
final String userId = userProfile.getUserUuid();
//if superUser and proxied, can't update
boolean editable = true;
if(sakaiProxy.isSuperUserAndProxiedToUser(userId)) {
editable = false;
}
//name
Label profileName = new Label("profileName", displayName);
add(profileName);
//status component
status = new ProfileStatusRenderer("status", userId, null, "tiny") {
@Override
public boolean isVisible(){
return sakaiProxy.isProfileStatusEnabled();
}
};
status.setOutputMarkupId(true);
add(status);
//clear link
final AjaxFallbackLink clearLink = new AjaxFallbackLink("clearLink") {
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget target) {
//clear status, hide and repaint
if(statusLogic.clearUserStatus(userId)) {
status.setVisible(false); //hide status
this.setVisible(false); //hide clear link
target.addComponent(status);
target.addComponent(this);
}
}
@Override
public boolean isVisible(){
return sakaiProxy.isProfileStatusEnabled();
}
};
clearLink.setOutputMarkupPlaceholderTag(true);
clearLink.add(new Label("clearLabel",new ResourceModel("link.status.clear")));
//set visibility of clear link based on status and if it's editable
if(!status.isVisible() || !editable) {
clearLink.setVisible(false);
}
add(clearLink);
WebMarkupContainer statusFormContainer = new WebMarkupContainer("statusFormContainer") {
@Override
public boolean isVisible(){
return sakaiProxy.isProfileStatusEnabled();
}
};
//setup SimpleText object to back the single form field
StringModel stringModel = new StringModel();
//status form
Form form = new Form("form", new Model(stringModel));
form.setOutputMarkupId(true);
//status field
final TextField statusField = new TextField("message", new PropertyModel(stringModel, "string"));
statusField.setMarkupId("messageinput");
statusField.setOutputMarkupId(true);
statusField.setOutputMarkupPlaceholderTag(true);
form.add(statusField);
//link the status textfield field with the focus/blur function via this dynamic js
//also link with counter
StringHeaderContributor statusJavascript = new StringHeaderContributor(
"<script type=\"text/javascript\">" +
"$(document).ready( function(){" +
"autoFill('#" + statusField.getMarkupId() + "', '" + defaultStatus + "');" +
"countChars('#" + statusField.getMarkupId() + "');" +
"});" +
"</script>");
add(statusJavascript);
//submit button
IndicatingAjaxButton submitButton = new IndicatingAjaxButton("submit", form) {
private static final long serialVersionUID = 1L;
protected void onSubmit(AjaxRequestTarget target, Form form) {
//get the backing model
StringModel stringModel = (StringModel) form.getModelObject();
//get userId from sakaiProxy
String userId = sakaiProxy.getCurrentUserId();
//get the status. if its the default text, do not update, although we should clear the model
String statusMessage = StringUtils.trim(stringModel.getString());
if(StringUtils.isBlank(statusMessage) || StringUtils.equals(statusMessage, defaultStatus)) {
log.warn("Status for userId: " + userId + " was not updated because they didn't enter anything.");
return;
}
//save status from userProfile
if(statusLogic.setUserStatus(userId, statusMessage)) {
log.info("Saved status for: " + userId);
//post update event
sakaiProxy.postEvent(ProfileConstants.EVENT_STATUS_UPDATE, "/profile/"+userId, true);
//update twitter
externalIntegrationLogic.sendMessageToTwitter(userId, statusMessage);
// post to walls if wall enabled
if (true == sakaiProxy.isWallEnabledGlobally()) {
wallLogic.addNewStatusToWall(statusMessage, sakaiProxy.getCurrentUserId());
}
//repaint status component
ProfileStatusRenderer newStatus = new ProfileStatusRenderer("status", userId, null, "tiny");
newStatus.setOutputMarkupId(true);
status.replaceWith(newStatus);
newStatus.setVisible(true);
//also show the clear link
clearLink.setVisible(true);
if(target != null) {
target.addComponent(newStatus);
target.addComponent(clearLink);
status=newStatus; //update reference
//reset the field
target.appendJavascript("autoFill('#" + statusField.getMarkupId() + "', '" + defaultStatus + "');");
//reset the counter
target.appendJavascript("countChars('#" + statusField.getMarkupId() + "');");
}
} else {
log.error("Couldn't save status for: " + userId);
String js = "alert('Failed to save status. If the problem persists, contact your system administrator.');";
target.prependJavascript(js);
}
}
};
submitButton.setModel(new ResourceModel("button.sayit"));
form.add(submitButton);
//add form to container
statusFormContainer.add(form);
//if not editable, hide the entire form
if(!editable) {
statusFormContainer.setVisible(false);
}
add(statusFormContainer);
}
}