package de.flower.rmt.ui.page.blog;
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.AjaxLinkWithConfirmation;
import de.flower.common.ui.markup.html.form.TextAreaMaxLengthBehavior;
import de.flower.rmt.model.db.entity.BArticle;
import de.flower.rmt.model.db.entity.BComment;
import de.flower.rmt.model.db.entity.QBComment;
import de.flower.rmt.service.IBlogManager;
import de.flower.rmt.ui.panel.RMTBasePanel;
import de.flower.rmt.util.Dates;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
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 BCommentsPanel extends RMTBasePanel<BArticle> {
@SpringBean
private IBlogManager blogManager;
public BCommentsPanel(final IModel<BArticle> model) {
super(model);
add(new AjaxEventListener(model, BComment.class));
add(new ArticleListPanel.NumCommentsLabel("numComments", model, false));
ListView<BComment> comments = new ListView<BComment>("comments", getListModel(model)) {
@Override
protected void populateItem(final ListItem<BComment> item) {
BComment comment = item.getModelObject();
item.add(new Label("author", comment.getAuthor().getFullname()));
item.add(new Label("date", Dates.formatDateTimeShortWithWeekday(comment.getCreateDate())));
AjaxEditableMultiLineLabel<String> editLabel = new AjaxEditableMultiLineLabelExtended<String>("text", new PropertyModel<String>(item.getModel(), "text")) {
{
setRows(7);
if (isEnabled()) {
getLabel().add(AttributeModifier.replace("title", new ResourceModel("blog.comments.label.help")));
}
getEditor().add(new TextAreaMaxLengthBehavior(BComment.MAXLENGTH));
getEditor().add(AttributeModifier.replace("title", new ResourceModel("blog.comments.edit.help")));
}
@Override
protected void onSubmit(final AjaxRequestTarget target) {
super.onSubmit(target);
BComment comment = item.getModelObject();
if (StringUtils.isBlank(comment.getText())) {
blogManager.remove(comment);
// update this list to remove comment
AjaxEventSender.send(this, model);
} else {
blogManager.save(comment);
}
}
@Override
public boolean isEnabled() {
return securityService.isCurrentUserOrManager(item.getModelObject().getAuthor());
}
};
item.add(editLabel);
item.add(new AjaxLinkWithConfirmation("removeLink", new ResourceModel("blog.comment.delete.confirm")) {
@Override
public void onClick(final AjaxRequestTarget target) {
blogManager.remove(item.getModelObject());
// update this list to remove comment
AjaxEventSender.send(this, model);
}
@Override
public boolean isVisible() {
return securityService.isCurrentUserOrManager(item.getModelObject().getAuthor());
}
});
}
};
add(comments);
// new comment form
add(new CommentFormPanel(model));
}
private IModel<List<BComment>> getListModel(final IModel<BArticle> model) {
return new LoadableDetachableModel<List<BComment>>() {
@Override
protected List<BComment> load() {
return blogManager.findAllComments(model.getObject(), QBComment.bComment.author);
}
};
}
}