package de.flower.rmt.ui.page.event;
import de.flower.common.ui.ajax.event.AjaxEventListener;
import de.flower.common.ui.ajax.event.AjaxEventSender;
import de.flower.common.ui.ajax.markup.html.AjaxEditableMultiLineLabelExtended;
import de.flower.common.ui.ajax.markup.html.AjaxLink;
import de.flower.common.ui.markup.html.form.TextAreaMaxLengthBehavior;
import de.flower.common.ui.panel.BasePanel;
import de.flower.rmt.model.db.entity.Comment;
import de.flower.rmt.model.db.entity.Invitation;
import de.flower.rmt.security.ISecurityService;
import de.flower.rmt.service.ICommentManager;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableMultiLineLabel;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import java.util.List;
/**
* @author flowerrrr
*/
public class CommentsPanel extends BasePanel<Invitation> {
@SpringBean
private ICommentManager commentManager;
@SpringBean
private ISecurityService securityService;
private boolean addNew;
public CommentsPanel(final IModel<Invitation> model) {
super(model);
add(new AjaxEventListener(model));
IModel<List<Comment>> listModel = new LoadableDetachableModel<List<Comment>>() {
@Override
protected List<Comment> load() {
List<Comment> list = model.getObject().getComments();
if (addNew) {
// append transient object
Comment comment = commentManager.newInstance(model.getObject());
list.add(comment);
}
return list;
}
};
ListView<Comment> comments = new ListView<Comment>("comments", listModel) {
@Override
protected void populateItem(final ListItem<Comment> item) {
AjaxEditableMultiLineLabel<String> editLabel = new AjaxEditableMultiLineLabelExtended<String>("text", new PropertyModel<String>(item.getModel(), "text")) {
{
setRows(3);
getEditor().add(new TextAreaMaxLengthBehavior(Comment.MAXLENGTH));
getEditor().add(AttributeModifier.replace("title", new ResourceModel("invitation.comments.edit.help")));
}
@Override
protected void onSubmit(final AjaxRequestTarget target) {
super.onSubmit(target);
Comment comment = item.getModelObject();
if (StringUtils.isBlank(comment.getText())) {
if (!comment.isNew()) commentManager.remove(comment);
// update this list to remove line
AjaxEventSender.send(this, model);
} else {
commentManager.save(item.getModelObject());
}
addNew = false;
}
@Override
public boolean isVisible() {
return securityService.isCurrentUser(item.getModelObject().getAuthor());
}
@Override
protected void onInitialize() {
super.onInitialize();
if (item.getModelObject().isNew() && AjaxRequestTarget.get() != null) {
// this is a new comment created after clicking the add-new-comment icon.
// put label in edit mode.
getLabel().setVisible(false);
getEditor().setVisible(true);
AjaxRequestTarget.get().focusComponent(getEditor());
}
}
};
item.add(editLabel);
item.add(new Label("readonlyText", new PropertyModel<String>(item.getModel(), "text")) {
@Override
public boolean isVisible() {
return !securityService.isCurrentUser(item.getModelObject().getAuthor());
}
});
item.add(new Label("author", item.getModelObject().getAuthor().getFullname()) {
{
add(AttributeAppender.append("title", item.getModelObject().getAuthor().getFullname()));
}
@Override
public boolean isVisible() {
// hide author for invitation player
return !item.getModelObject().getAuthor().equals(model.getObject().getUser());
}
});
}
};
add(comments);
add(new AjaxLink("addButton", model) {
@Override
public void onClick(final AjaxRequestTarget target) {
addNew = true;
AjaxEventSender.send(this, model);
}
});
}
}