/**
* 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.log4j.Logger;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.RestartResponseException;
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.spring.injection.annot.SpringBean;
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.tool.pages.MyProfile;
import org.sakaiproject.profile2.util.ProfileConstants;
/**
* Container for viewing user's own wall.
*
* @author d.b.robinson@lancaster.ac.uk
*/
public class MyWallPanel extends Panel {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(MyWallPanel.class);
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
private SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileWallLogic")
private ProfileWallLogic wallLogic;
/**
* Creates a new instance of <code>MyWallPanel</code>.
*
* This method is used when a super user is viewing the profile of another
* user.
*/
public MyWallPanel(String panelId, String userUuid) {
super(panelId);
// double check for super user
if (false == sakaiProxy.isSuperUser()) {
log.error("MyWallPanel: user " + sakaiProxy.getCurrentUserId()
+ " attempted to access MyWallPanel for " + userUuid
+ ". Redirecting...");
throw new RestartResponseException(new MyProfile());
}
renderWallPanel(userUuid);
}
/**
* Creates a new instance of <code>MyWallPanel</code>.
*/
public MyWallPanel(String panelId) {
super(panelId);
renderWallPanel(sakaiProxy.getCurrentUserId());
}
private void renderWallPanel(final String userUuid) {
setOutputMarkupId(true);
// 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>("myWallPostForm",
new Model<WallItem>(wallItem));
form.setOutputMarkupId(true);
add(form);
// 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 myWallPostContainer = new WebMarkupContainer(
"myWallPostContainer");
final CKEditorTextArea myWallPost = new CKEditorTextArea("myWallPost",new PropertyModel<String>(wallItem, "text"));
myWallPost.setEditorConfig(CKEditorConfig.createCkConfig());
myWallPost.setMarkupId("wallpostinput");
myWallPost.setOutputMarkupId(true);
myWallPostContainer.add(myWallPost);
form.add(myWallPostContainer);
IndicatingAjaxButton submitButton = new IndicatingAjaxButton(
"myWallPostSubmit", 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 {
replaceSelf(target, userUuid);
}
}
@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
return CKEditorTextArea.getAjaxCallDecoratedToUpdateElementForAllEditorsOnPage();
}
};
submitButton.setModel(new ResourceModel("button.wall.post"));
myWallPostContainer.add(submitButton);
WallItemDataProvider provider = new WallItemDataProvider(userUuid);
// if no wall items, display a message
if (0 == provider.size()) {
add(new Label("wallInformationMessage", new ResourceModel(
"text.wall.no.items")));
} else {
// blank label when there are items to display
add(new Label("wallInformationMessage"));
}
final 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();
// pass reference to MyWallPanel for updating when posts are removed
item
.add(new WallItemPanel("wallItemPanel", userUuid,
wallItem, MyWallPanel.this));
}
};
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);
}
// this is used to replace the panel so the paging is updated
protected void replaceSelf(AjaxRequestTarget target, String userUuid) {
MyWallPanel newPanel;
if (true == sakaiProxy.isSuperUser()) {
newPanel= new MyWallPanel(MyWallPanel.this.getId(), userUuid);
} else {
newPanel= new MyWallPanel(MyWallPanel.this.getId());
}
newPanel.setOutputMarkupId(true);
MyWallPanel.this.replaceWith(newPanel);
if (null != target) {
target.addComponent(newPanel);
target.appendJavascript("setMainFrameHeight(window.name);");
}
}
}