/**
* 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 java.util.Date;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxCallDecorator;
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.feedback.FeedbackMessage;
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.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
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.sakaiproject.profile2.logic.ProfileConnectionsLogic;
import org.sakaiproject.profile2.logic.ProfilePrivacyLogic;
import org.sakaiproject.profile2.logic.ProfileWallLogic;
import org.sakaiproject.profile2.logic.SakaiProxy;
import org.sakaiproject.profile2.model.WallItem;
import org.sakaiproject.profile2.tool.components.CKEditorConfig;
import org.sakaiproject.profile2.tool.components.CKEditorTextArea;
import org.sakaiproject.profile2.tool.components.ErrorLevelsFeedbackMessageFilter;
import org.sakaiproject.profile2.tool.dataproviders.WallItemDataProvider;
import org.sakaiproject.profile2.types.PrivacyType;
import org.sakaiproject.profile2.util.ProfileConstants;
/**
* Container for viewing the wall of someone else.
*
* @author d.b.robinson@lancaster.ac.uk
*/
public class ViewWallPanel extends Panel {
private static final long serialVersionUID = 1L;
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
private SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileWallLogic")
private ProfileWallLogic wallLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfilePrivacyLogic")
private ProfilePrivacyLogic privacyLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileConnectionsLogic")
private ProfileConnectionsLogic connectionsLogic;
public ViewWallPanel(String panelId, final String userUuid) {
super(panelId);
setOutputMarkupId(true);
final String currentUserId = sakaiProxy.getCurrentUserId();
// container which wraps list
final WebMarkupContainer wallItemsContainer = new WebMarkupContainer(
"wallItemsContainer");
wallItemsContainer.setOutputMarkupId(true);
add(wallItemsContainer);
WallItem wallItem = new WallItem();
wallItem.setUserUuid(userUuid);
// always post to my wall as current user, to ensure super users cannot
// make posts as other users
wallItem.setCreatorUuid(sakaiProxy.getCurrentUserId());
wallItem.setType(ProfileConstants.WALL_ITEM_TYPE_POST);
// form for posting to my wall
Form<WallItem> form = new Form<WallItem>("viewWallPostForm", new Model<WallItem>(wallItem));
form.setOutputMarkupId(true);
add(form);
if (false == privacyLogic.isActionAllowed(userUuid, sakaiProxy.getCurrentUserId(), PrivacyType.PRIVACY_OPTION_MYWALL)) {
form.setEnabled(false);
form.setVisible(false);
}
// form submit feedback
final Label formFeedback = new Label("formFeedback");
formFeedback.setOutputMarkupPlaceholderTag(true);
form.add(formFeedback);
final FeedbackPanel feedback = new FeedbackPanel("feedback");
feedback.setOutputMarkupId(true);
form.add(feedback);
int[] filteredErrorLevels = new int[]{FeedbackMessage.ERROR};
feedback.setFilter(new ErrorLevelsFeedbackMessageFilter(filteredErrorLevels));
// container for posting to my wall
WebMarkupContainer viewWallPostContainer = new WebMarkupContainer("viewWallPostContainer");
final CKEditorTextArea myWallPost = new CKEditorTextArea("viewWallPost", new PropertyModel<String>(wallItem, "text"));
myWallPost.setEditorConfig(CKEditorConfig.createCkConfig());
viewWallPostContainer.add(myWallPost);
form.add(viewWallPostContainer);
IndicatingAjaxButton submitButton = new IndicatingAjaxButton("viewWallPostSubmit", form) {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
protected void onSubmit(AjaxRequestTarget target, Form form) {
if (myWallPost.getValue().equals("")) {
formFeedback.setDefaultModel(new ResourceModel(
"error.wall.post.empty"));
formFeedback.add(new AttributeModifier("class", true,
new Model<String>("alertMessage")));
target.addComponent(formFeedback);
return;
}
if (false == save(form, userUuid)) {
formFeedback.setDefaultModel(new ResourceModel("error.wall.post.failed"));
formFeedback.add(new AttributeModifier("class", true, new Model<String>("alertMessage")));
target.addComponent(formFeedback);
} else {
ViewWallPanel newPanel = new ViewWallPanel(ViewWallPanel.this.getId(), userUuid);
newPanel.setOutputMarkupId(true);
ViewWallPanel.this.replaceWith(newPanel);
if (null != target) {
target.addComponent(newPanel);
target.appendJavascript("setMainFrameHeight(window.name);");
}
}
}
@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
return CKEditorTextArea.getAjaxCallDecoratedToUpdateElementForAllEditorsOnPage();
}
};
submitButton.setModel(new ResourceModel("button.wall.post"));
viewWallPostContainer.add(submitButton);
// note: privacy check is handled by the logic component
WallItemDataProvider provider = new WallItemDataProvider(userUuid);
// if no wall items, display a message
if (0 == provider.size()) {
if (privacyLogic.isActionAllowed(userUuid, currentUserId,PrivacyType.PRIVACY_OPTION_MYWALL)) {
// this user has no items on their wall
add(new Label("wallInformationMessage",
new StringResourceModel("text.view.wall.nothing", null, new Object[]{ sakaiProxy.getUserDisplayName(userUuid) } )).setEscapeModelStrings(false));
} else {
// wall privacy is set to connections
add(new Label("wallInformationMessage",
new StringResourceModel("text.view.wall.restricted", null, new Object[]{ sakaiProxy.getUserDisplayName(userUuid) } )).setEscapeModelStrings(false));
}
} else {
// blank label when there are items to display
add(new Label("wallInformationMessage"));
}
DataView<WallItem> wallItemsDataView = new DataView<WallItem>(
"wallItems", provider) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(Item<WallItem> item) {
WallItem wallItem = (WallItem) item.getDefaultModelObject();
item.add(new WallItemPanel("wallItemPanel", userUuid, wallItem));
if (ProfileConstants.WALL_ITEM_TYPE_STATUS == wallItem.getType()) {
// only show if a super user or non-super user is permitted
if (!sakaiProxy.isSuperUser() && !privacyLogic.isActionAllowed(wallItem.getCreatorUuid(), currentUserId, PrivacyType.PRIVACY_OPTION_MYSTATUS)) {
item.setVisible(false);
}
}
}
};
wallItemsDataView.setOutputMarkupId(true);
if (provider.size() <= ProfileConstants.MAX_WALL_ITEMS_PER_PAGE) {
wallItemsContainer.add(new AjaxPagingNavigator("navigator", wallItemsDataView).setVisible(false));
} else {
wallItemsContainer.add(new AjaxPagingNavigator("navigator", wallItemsDataView));
}
wallItemsDataView.setItemsPerPage(ProfileConstants.MAX_WALL_ITEMS_PER_PAGE);
wallItemsContainer.add(wallItemsDataView);
}
// called when form is saved
@SuppressWarnings("unchecked")
private boolean save(Form form, String userUuid) {
WallItem wallItem = (WallItem) form.getModelObject();
wallItem.setDate(new Date());
return wallLogic.postWallItemToWall(userUuid, wallItem);
}
}