package fr.openwide.core.basicapp.web.application.administration.component;
import static fr.openwide.core.basicapp.web.application.property.BasicApplicationWebappPropertyIds.PORTFOLIO_ITEMS_PER_PAGE_DESCRIPTION;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.openwide.core.basicapp.core.business.user.model.User;
import fr.openwide.core.basicapp.core.business.user.model.UserGroup;
import fr.openwide.core.basicapp.core.business.user.search.UserSort;
import fr.openwide.core.basicapp.core.business.user.service.IUserGroupService;
import fr.openwide.core.basicapp.web.application.administration.model.UserDataProvider;
import fr.openwide.core.basicapp.web.application.administration.template.AdministrationUserDescriptionTemplate;
import fr.openwide.core.basicapp.web.application.common.form.UserAutocompleteAjaxComponent;
import fr.openwide.core.basicapp.web.application.common.renderer.ActionRenderers;
import fr.openwide.core.basicapp.web.application.common.util.CssClassConstants;
import fr.openwide.core.basicapp.web.application.navigation.link.LinkFactory;
import fr.openwide.core.spring.property.service.IPropertyService;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.link.model.ComponentPageModel;
import fr.openwide.core.wicket.more.markup.html.action.AbstractOneParameterAjaxAction;
import fr.openwide.core.wicket.more.markup.html.bootstrap.label.model.BootstrapColor;
import fr.openwide.core.wicket.more.markup.html.factory.AbstractDetachableFactory;
import fr.openwide.core.wicket.more.markup.html.factory.AbstractParameterizedComponentFactory;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.form.LabelPlaceholderBehavior;
import fr.openwide.core.wicket.more.markup.repeater.table.DecoratedCoreDataTablePanel;
import fr.openwide.core.wicket.more.markup.repeater.table.DecoratedCoreDataTablePanel.AddInPlacement;
import fr.openwide.core.wicket.more.markup.repeater.table.builder.DataTableBuilder;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
public class UserGroupMembersPanel extends GenericPanel<UserGroup> {
private static final long serialVersionUID = 1955579250974258074L;
private static final Logger LOGGER = LoggerFactory.getLogger(UserGroupMembersPanel.class);
@SpringBean
private IUserGroupService userGroupService;
@SpringBean
private IPropertyService propertyService;
private final UserDataProvider dataProvider;
public UserGroupMembersPanel(String id, IModel<UserGroup> userGroupModel) {
super(id, userGroupModel);
setOutputMarkupId(true);
// Members list
dataProvider = new UserDataProvider();
dataProvider.getGroupModel().setObject(userGroupModel.getObject());
LinkFactory.get();
DecoratedCoreDataTablePanel<User, UserSort> groupMemberships =
DataTableBuilder.start(dataProvider, dataProvider.getSortModel())
.addLabelColumn(new ResourceModel("administration.usergroup.field.name"))
.withLink(AdministrationUserDescriptionTemplate.mapper().setParameter2(new ComponentPageModel(this)))
.withClass("text text-md")
.addActionColumn()
.addConfirmAction(ActionRenderers.constant("administration.usergroup.members.delete", "fa fa-fw fa-times", BootstrapColor.DANGER))
.title(new ResourceModel("administration.usergroup.members.delete.confirmation.title"))
.content(new AbstractDetachableFactory<IModel<User>, IModel<String>>() {
private static final long serialVersionUID = 1L;
@Override
public IModel<String> create(IModel<User> userModel) {
return new StringResourceModel("administration.usergroup.members.delete.confirmation.text")
.setParameters(userModel.getObject().getFullName(), UserGroupMembersPanel.this.getModelObject().getName());
}
})
.confirm()
.onClick(new AbstractOneParameterAjaxAction<IModel<User>>() {
private static final long serialVersionUID = 1L;
@Override
public void execute(AjaxRequestTarget target, IModel<User> parameter) {
try {
UserGroup userGroup = UserGroupMembersPanel.this.getModelObject();
User user = parameter.getObject();
userGroupService.removeUser(userGroup, user);
Session.get().success(getString("administration.usergroup.members.delete.success"));
throw new RestartResponseException(getPage());
} catch (RestartResponseException e) {
throw e;
} catch (Exception e) {
LOGGER.error("Unknown error occured while removing a group from the user", e);
getSession().error(getString("common.error.unexpected"));
FeedbackUtils.refreshFeedback(target, getPage());
}
}
})
.hideLabel()
.withClassOnElements(CssClassConstants.BTN_SM)
.end()
.withClass("actions")
.bootstrapPanel()
.addIn(AddInPlacement.FOOTER_RIGHT, new AbstractParameterizedComponentFactory<Component, Component>() {
private static final long serialVersionUID = 1L;
@Override
public Component create(String wicketId, final Component table ) {
return new UserGroupAddUserFragment(wicketId)
.add(new ClassAttributeAppender("add-in-quick-add"));
}
})
.ajaxPager(AddInPlacement.HEADING_RIGHT)
.count("administration.usergroup.members.count")
.build("groupMemberships", propertyService.get(PORTFOLIO_ITEMS_PER_PAGE_DESCRIPTION));
add(
groupMemberships
);
}
private class UserGroupAddUserFragment extends Fragment {
private static final long serialVersionUID = 1L;
public UserGroupAddUserFragment(String id) {
super(id, "addUser", UserGroupMembersPanel.this);
// Add member form
IModel<User> emptyUserModel = new GenericEntityModel<Long, User>();
final UserAutocompleteAjaxComponent userAutocomplete = new UserAutocompleteAjaxComponent("userAutocomplete",
emptyUserModel);
userAutocomplete.setAutoUpdate(true);
IModel<String> autocompleteLabelModel = new ResourceModel("administration.user.user");
userAutocomplete.getAutocompleteField()
.setLabel(autocompleteLabelModel)
.add(new LabelPlaceholderBehavior());
final Form<User> addMemberForm = new Form<User>("addMemberForm", emptyUserModel);
addMemberForm.add(
userAutocomplete
.setRequired(true)
.setLabel(autocompleteLabelModel)
);
addMemberForm.add(new AjaxSubmitLink("addMemberLink", addMemberForm) {
private static final long serialVersionUID = 6935376642872117563L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
UserGroup userGroup = UserGroupMembersPanel.this.getModelObject();
User selectedUser = userAutocomplete.getModelObject();
if (selectedUser != null) {
if (!selectedUser.getGroups().contains(userGroup)) {
try {
userGroupService.addUser(userGroup, selectedUser);
getSession().success(getString("administration.usergroup.members.add.success"));
} catch (Exception e) {
LOGGER.error("Unknown error occured while adding a user to a usergroup", e);
getSession().error(getString("administration.usergroup.members.add.error"));
}
} else {
LOGGER.error("User already added to this group");
getSession().warn(getString("administration.usergroup.members.add.alreadyMember"));
}
}
userAutocomplete.setModelObject(null);
target.add(getPage());
FeedbackUtils.refreshFeedback(target, getPage());
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
FeedbackUtils.refreshFeedback(target, getPage());
}
});
add(addMemberForm);
}
}
}