/**
* 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.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
import org.apache.wicket.behavior.AttributeAppender;
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.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.UrlValidator;
import org.sakaiproject.profile2.logic.ProfileLogic;
import org.sakaiproject.profile2.logic.ProfileWallLogic;
import org.sakaiproject.profile2.logic.SakaiProxy;
import org.sakaiproject.profile2.model.SocialNetworkingInfo;
import org.sakaiproject.profile2.model.UserProfile;
import org.sakaiproject.profile2.tool.components.ComponentVisualErrorBehaviour;
import org.sakaiproject.profile2.tool.components.FeedbackLabel;
import org.sakaiproject.profile2.tool.components.IconWithClueTip;
import org.sakaiproject.profile2.util.ProfileConstants;
import org.sakaiproject.profile2.util.ProfileUtils;
/**
* Panel for editing social networking profile data.
*/
public class MySocialNetworkingEdit extends Panel {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(MySocialNetworkingEdit.class);
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
private SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileLogic")
private ProfileLogic profileLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileWallLogic")
private ProfileWallLogic wallLogic;
public MySocialNetworkingEdit(final String id, final UserProfile userProfile) {
super(id);
log.debug("MySocialNetworkingEdit()");
// heading
add(new Label("heading", new ResourceModel("heading.social.edit")));
// setup form
Form form = new Form("form", new Model(userProfile));
form.setOutputMarkupId(true);
// form submit feedback
final Label formFeedback = new Label("formFeedback");
formFeedback.setOutputMarkupPlaceholderTag(true);
form.add(formFeedback);
// add warning message if superUser and not editing own profile
Label editWarning = new Label("editWarning");
editWarning.setVisible(false);
if (sakaiProxy.isSuperUserAndProxiedToUser(
userProfile.getUserUuid())) {
editWarning.setDefaultModel(new StringResourceModel(
"text.edit.other.warning", null, new Object[] { userProfile
.getDisplayName() }));
editWarning.setEscapeModelStrings(false);
editWarning.setVisible(true);
}
form.add(editWarning);
//facebook
WebMarkupContainer facebookContainer = new WebMarkupContainer("facebookContainer");
facebookContainer.add(new Label("facebookLabel", new ResourceModel("profile.socialnetworking.facebook.edit")));
final TextField<String> facebookUrl = new TextField<String>("facebookUrl", new PropertyModel<String>(userProfile, "socialInfo.facebookUrl")) {
private static final long serialVersionUID = 1L;
@Override
protected void convertInput() {
validateUrl(this);
}
};
facebookUrl.setMarkupId("facebookurlinput");
facebookUrl.setOutputMarkupId(true);
facebookUrl.add(new UrlValidator());
facebookContainer.add(facebookUrl);
facebookContainer.add(new IconWithClueTip("facebookToolTip", ProfileConstants.INFO_IMAGE, new ResourceModel("text.profile.facebook.tooltip")));
//feedback
final FeedbackLabel facebookUrlFeedback = new FeedbackLabel("facebookUrlFeedback", facebookUrl);
facebookUrlFeedback.setOutputMarkupId(true);
facebookUrlFeedback.setMarkupId("facebookUrlFeedback");
facebookContainer.add(facebookUrlFeedback);
facebookUrl.add(new ComponentVisualErrorBehaviour("onblur", facebookUrlFeedback));
form.add(facebookContainer);
//linkedin
WebMarkupContainer linkedinContainer = new WebMarkupContainer("linkedinContainer");
linkedinContainer.add(new Label("linkedinLabel", new ResourceModel("profile.socialnetworking.linkedin.edit")));
final TextField<String> linkedinUrl = new TextField<String>("linkedinUrl", new PropertyModel<String>(userProfile, "socialInfo.linkedinUrl")) {
private static final long serialVersionUID = 1L;
@Override
protected void convertInput() {
validateUrl(this);
}
};
linkedinUrl.setMarkupId("linkedinurlinput");
linkedinUrl.setOutputMarkupId(true);
linkedinUrl.add(new UrlValidator());
linkedinContainer.add(linkedinUrl);
linkedinContainer.add(new IconWithClueTip("linkedinToolTip", ProfileConstants.INFO_IMAGE, new ResourceModel("text.profile.linkedin.tooltip")));
//feedback
final FeedbackLabel linkedinUrlFeedback = new FeedbackLabel("linkedinUrlFeedback", linkedinUrl);
linkedinUrlFeedback.setMarkupId("linkedinUrlFeedback");
linkedinUrlFeedback.setOutputMarkupId(true);
linkedinContainer.add(linkedinUrlFeedback);
linkedinUrl.add(new ComponentVisualErrorBehaviour("onblur", linkedinUrlFeedback));
form.add(linkedinContainer);
//myspace
WebMarkupContainer myspaceContainer = new WebMarkupContainer("myspaceContainer");
myspaceContainer.add(new Label("myspaceLabel", new ResourceModel("profile.socialnetworking.myspace.edit")));
final TextField<String> myspaceUrl = new TextField<String>("myspaceUrl", new PropertyModel<String>(userProfile, "socialInfo.myspaceUrl")) {
private static final long serialVersionUID = 1L;
@Override
protected void convertInput() {
validateUrl(this);
}
};
myspaceUrl.setMarkupId("myspaceurlinput");
myspaceUrl.setOutputMarkupId(true);
myspaceUrl.add(new UrlValidator());
myspaceContainer.add(myspaceUrl);
myspaceContainer.add(new IconWithClueTip("myspaceToolTip", ProfileConstants.INFO_IMAGE, new ResourceModel("text.profile.myspace.tooltip")));
//feedback
final FeedbackLabel myspaceUrlFeedback = new FeedbackLabel("myspaceUrlFeedback", myspaceUrl);
myspaceUrlFeedback.setMarkupId("myspaceUrlFeedback");
myspaceUrlFeedback.setOutputMarkupId(true);
myspaceContainer.add(myspaceUrlFeedback);
myspaceUrl.add(new ComponentVisualErrorBehaviour("onblur", myspaceUrlFeedback));
form.add(myspaceContainer);
//twitter
WebMarkupContainer twitterContainer = new WebMarkupContainer("twitterContainer");
twitterContainer.add(new Label("twitterLabel", new ResourceModel("profile.socialnetworking.twitter.edit")));
final TextField<String> twitterUrl = new TextField<String>("twitterUrl", new PropertyModel<String>(userProfile, "socialInfo.twitterUrl")) {
private static final long serialVersionUID = 1L;
@Override
protected void convertInput() {
validateUrl(this);
}
};
twitterUrl.setMarkupId("twitterurlinput");
twitterUrl.setOutputMarkupId(true);
twitterUrl.add(new UrlValidator());
twitterContainer.add(twitterUrl);
twitterContainer.add(new IconWithClueTip("twitterToolTip", ProfileConstants.INFO_IMAGE, new ResourceModel("text.profile.twitter.tooltip")));
//feedback
final FeedbackLabel twitterUrlFeedback = new FeedbackLabel("twitterUrlFeedback", twitterUrl);
twitterUrlFeedback.setMarkupId("twitterUrlFeedback");
twitterUrlFeedback.setOutputMarkupId(true);
twitterContainer.add(twitterUrlFeedback);
twitterUrl.add(new ComponentVisualErrorBehaviour("onblur", twitterUrlFeedback));
form.add(twitterContainer);
//skype
WebMarkupContainer skypeContainer = new WebMarkupContainer("skypeContainer");
skypeContainer.add(new Label("skypeLabel", new ResourceModel("profile.socialnetworking.skype.edit")));
TextField skypeUsername = new TextField("skypeUsername", new PropertyModel(userProfile, "socialInfo.skypeUsername"));
skypeUsername.setMarkupId("skypeusernameinput");
skypeUsername.setOutputMarkupId(true);
skypeContainer.add(skypeUsername);
form.add(skypeContainer);
//submit button
AjaxFallbackButton submitButton = new AjaxFallbackButton("submit", new ResourceModel("button.save.changes"), form) {
private static final long serialVersionUID = 1L;
protected void onSubmit(AjaxRequestTarget target, Form form) {
if (save(form)) {
// post update event
sakaiProxy.postEvent(ProfileConstants.EVENT_PROFILE_SOCIAL_NETWORKING_UPDATE,"/profile/" + userProfile.getUserUuid(), true);
//post to wall if enabled
if (true == sakaiProxy.isWallEnabledGlobally() && false == sakaiProxy.isSuperUserAndProxiedToUser(userProfile.getUserUuid())) {
wallLogic.addNewEventToWall(ProfileConstants.EVENT_PROFILE_SOCIAL_NETWORKING_UPDATE, sakaiProxy.getCurrentUserId());
}
// repaint panel
Component newPanel = new MySocialNetworkingDisplay(id, userProfile);
newPanel.setOutputMarkupId(true);
MySocialNetworkingEdit.this.replaceWith(newPanel);
if (target != null) {
target.addComponent(newPanel);
// resize iframe
target.appendJavascript("setMainFrameHeight(window.name);");
}
} else {
formFeedback.setDefaultModel(new ResourceModel("error.profile.save.business.failed"));
formFeedback.add(new AttributeModifier("class", true,new Model<String>("save-failed-error")));
target.addComponent(formFeedback);
}
}
// This is called if the form validation fails, ie Javascript turned off,
//or we had preexisting invalid data before this fix was introduced
protected void onError(AjaxRequestTarget target, Form form) {
//check which item didn't validate and update the class and feedback model for that component
if(!facebookUrl.isValid()) {
facebookUrl.add(new AttributeAppender("class", new Model<String>("invalid"), " "));
target.addComponent(facebookUrl);
target.addComponent(facebookUrlFeedback);
}
if(!linkedinUrl.isValid()) {
linkedinUrl.add(new AttributeAppender("class", new Model<String>("invalid"), " "));
target.addComponent(linkedinUrl);
target.addComponent(linkedinUrlFeedback);
}
if(!myspaceUrl.isValid()) {
myspaceUrl.add(new AttributeAppender("class", new Model<String>("invalid"), " "));
target.addComponent(myspaceUrl);
target.addComponent(myspaceUrlFeedback);
}
if(!twitterUrl.isValid()) {
twitterUrl.add(new AttributeAppender("class", new Model<String>("invalid"), " "));
target.addComponent(twitterUrl);
target.addComponent(twitterUrlFeedback);
}
}
};
form.add(submitButton);
//cancel button
AjaxFallbackButton cancelButton = new AjaxFallbackButton("cancel",new ResourceModel("button.cancel"), form) {
private static final long serialVersionUID = 1L;
protected void onSubmit(AjaxRequestTarget target, Form form) {
Component newPanel = new MySocialNetworkingDisplay(id, userProfile);
newPanel.setOutputMarkupId(true);
MySocialNetworkingEdit.this.replaceWith(newPanel);
if (target != null) {
target.addComponent(newPanel);
target.appendJavascript("setMainFrameHeight(window.name);");
}
}
};
cancelButton.setDefaultFormProcessing(false);
form.add(cancelButton);
add(form);
}
// adds http:// if missing
private void validateUrl(TextField<String> urlTextField) {
String input = urlTextField.getInput();
if (StringUtils.isNotBlank(input)
&& !(input.startsWith("http://") || input
.startsWith("https://"))) {
urlTextField.setConvertedInput("http://" + input);
} else {
urlTextField.setConvertedInput(StringUtils.isBlank(input) ? null : input);
}
}
// called when the form is to be saved
private boolean save(Form form) {
// get the backing model
UserProfile userProfile = (UserProfile) form.getModelObject();
// save social networking information
SocialNetworkingInfo socialNetworkingInfo = new SocialNetworkingInfo(userProfile.getUserUuid());
String tFacebook = ProfileUtils.truncate(userProfile.getSocialInfo().getFacebookUrl(), 255, false);
String tLinkedin = ProfileUtils.truncate(userProfile.getSocialInfo().getLinkedinUrl(), 255, false);
String tMyspace = ProfileUtils.truncate(userProfile.getSocialInfo().getMyspaceUrl(), 255, false);
String tSkype = ProfileUtils.truncate(userProfile.getSocialInfo().getSkypeUsername(), 255, false);
String tTwitter = ProfileUtils.truncate(userProfile.getSocialInfo().getTwitterUrl(), 255, false);
socialNetworkingInfo.setFacebookUrl(tFacebook);
socialNetworkingInfo.setLinkedinUrl(tLinkedin);
socialNetworkingInfo.setMyspaceUrl(tMyspace);
socialNetworkingInfo.setSkypeUsername(tSkype);
socialNetworkingInfo.setTwitterUrl(tTwitter);
return profileLogic.saveSocialNetworkingInfo(socialNetworkingInfo);
}
}