package fr.openwide.core.showcase.web.application.widgets.component;
import java.util.List;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
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.spring.injection.annot.SpringBean;
import org.wicketstuff.wiquery.core.javascript.JsScopeContext;
import org.wicketstuff.wiquery.ui.core.JsScopeUiEvent;
import org.wicketstuff.wiquery.ui.sortable.SortableBehavior;
import org.wicketstuff.wiquery.ui.sortable.SortableBehavior.ToleranceEnum;
import org.wicketstuff.wiquery.ui.sortable.SortableRevert;
import fr.openwide.core.showcase.core.business.user.model.User;
import fr.openwide.core.showcase.core.business.user.service.IUserService;
import fr.openwide.core.showcase.core.util.binding.Bindings;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.sortable.SortableListUpdateJavaScriptResourceReference;
import fr.openwide.core.wicket.more.model.BindingModel;
public class SortableUserListPanel extends GenericPanel<List<User>> {
private static final long serialVersionUID = 2647182262770724957L;
@SpringBean
private IUserService userService;
private Form<List<User>> userListForm;
private ListView<User> sortableUserListView;
private SortableBehavior listeUserSortableBehavior;
private boolean sortMode;
public SortableUserListPanel(String id, IModel<List<User>> userListModel) {
super(id, userListModel);
setOutputMarkupId(true);
userListForm = new Form<List<User>>("userListForm", userListModel) {
private static final long serialVersionUID = -4854860245258596038L;
@Override
public void onSubmit() {
try {
userService.updateUserPosition(SortableUserListPanel.this.getModelObject());
sortableUserListView.getModel().detach();
sortableUserListView.removeAll();
SortableUserListPanel.this.setSortMode(false);
getSession().success(getString("widgets.sortable.message.success"));
} catch (Exception e) {
getSession().error(getString("widgets.sortable.message.error"));
}
throw new RestartResponseException(getPage());
}
};
add(userListForm);
// List view
sortableUserListView = new ListView<User>("userListView", userListModel) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<User> item) {
IModel<User> userModel = item.getModel();
item.setOutputMarkupId(true);
item.add(new RequiredTextField<Integer>("positionField", BindingModel.of(userModel, Bindings.user().position())));
item.add(new Label("positionLabel", BindingModel.of(userModel, Bindings.user().position())));
item.add(new Label("username", BindingModel.of(userModel, Bindings.user().userName())));
item.add(new Label("fullname", BindingModel.of(userModel, Bindings.user().fullName())));
}
};
WebMarkupContainer listeUserContainer = new WebMarkupContainer("listeUserContainer");
listeUserSortableBehavior = new SortableBehavior();
listeUserSortableBehavior
.setUpdateEvent(new JsScopeUiEvent() {
private static final long serialVersionUID = 1L;
@Override
protected void execute(JsScopeContext scopeContext) {
scopeContext.append("onSortableUpdate($(this));");
}
})
.setPlaceholder("element-place-holder")
.setRevert(new SortableRevert(true))
.setForcePlaceholderSize(true)
.setTolerance(ToleranceEnum.POINTER)
.setDisabled(!isSortMode());
listeUserContainer.add(sortableUserListView);
listeUserContainer.add(listeUserSortableBehavior);
listeUserContainer.add(new ClassAttributeAppender(new LoadableDetachableModel<String>() {
private static final long serialVersionUID = 1L;
@Override
protected String load() {
if (!SortableUserListPanel.this.isSortMode()) {
return "ui-sortable-disabled";
}
return null;
}
}));
userListForm.add(listeUserContainer);
// Actions sur la liste des users
WebMarkupContainer actions = new WebMarkupContainer("actions");
userListForm.add(actions);
AjaxLink<?> modifierOrdre = new AjaxLink<Void>("modifierOrdre") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
SortableUserListPanel.this.listeUserSortableBehavior.enable(target);
SortableUserListPanel.this.setSortMode(true);
target.add(SortableUserListPanel.this);
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!SortableUserListPanel.this.isSortMode());
}
};
actions.add(modifierOrdre);
Button enregistrerOrdre = new Button("enregistrerOrdre") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(SortableUserListPanel.this.isSortMode());
}
};
actions.add(enregistrerOrdre);
AjaxLink<?> annulerOrdre = new AjaxLink<Void>("annulerOrdre") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
SortableUserListPanel.this.setSortMode(false);
SortableUserListPanel.this.listeUserSortableBehavior.disable(target);
target.add(SortableUserListPanel.this);
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(SortableUserListPanel.this.isSortMode());
}
};
actions.add(annulerOrdre);
}
public boolean isSortMode() {
return sortMode;
}
public void setSortMode(boolean sortMode) {
this.sortMode = sortMode;
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(JavaScriptHeaderItem.forReference(SortableListUpdateJavaScriptResourceReference.get()));
}
}