package fr.openwide.maven.artifact.notifier.web.application.administration.component;
import java.util.List;
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.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
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.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.markup.html.collection.GenericEntityListView;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.confirm.component.AjaxConfirmLink;
import fr.openwide.core.wicket.more.model.BindingModel;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
import fr.openwide.core.wicket.more.model.ReadOnlyModel;
import fr.openwide.maven.artifact.notifier.core.business.user.model.User;
import fr.openwide.maven.artifact.notifier.core.business.user.model.UserGroup;
import fr.openwide.maven.artifact.notifier.core.business.user.service.IUserGroupService;
import fr.openwide.maven.artifact.notifier.core.business.user.service.IUserService;
import fr.openwide.maven.artifact.notifier.core.util.binding.Binding;
import fr.openwide.maven.artifact.notifier.web.application.administration.page.AdministrationUserDescriptionPage;
import fr.openwide.maven.artifact.notifier.web.application.common.component.UserAutocompleteAjaxComponent;
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 IUserService userService;
private GenericEntityListView<User> memberListView;
public UserGroupMembersPanel(String id, final IModel<UserGroup> userGroupModel) {
super(id, userGroupModel);
// Members list
memberListView = new GenericEntityListView<User>("members", new LoadableDetachableModel<List<User>>() {
private static final long serialVersionUID = 1L;
@Override
protected List<User> load() {
return userService.listByUserGroup(userGroupModel.getObject());
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final ListItem<User> item) {
Link<Void> userLink = AdministrationUserDescriptionPage.linkDescriptor(ReadOnlyModel.of(item.getModelObject()))
.link("userLink");
userLink.add(new Label("userName", BindingModel.of(item.getModel(), Binding.user().userName())));
item.add(userLink);
item.add(new Label("fullName", BindingModel.of(item.getModel(), Binding.user().fullName())));
IModel<String> confirmationTextModel = new StringResourceModel(
"administration.usergroup.members.delete.confirmation.text")
.setParameters(
item.getModelObject().getDisplayName(),
UserGroupMembersPanel.this.getModelObject().getName()
)
;
item.add(new AjaxConfirmLink<User>("deleteLink", item.getModel(),
new ResourceModel("administration.usergroup.members.delete.confirmation.title"),
confirmationTextModel,
new ResourceModel("common.confirm"),
new ResourceModel("common.cancel"),
null, false) {
private static final long serialVersionUID = -5179621361619239269L;
@Override
public void onClick(AjaxRequestTarget target) {
try {
UserGroup userGroup = UserGroupMembersPanel.this.getModelObject();
User user = getModelObject();
userGroupService.removeUser(userGroup, user);
Session.get().success(getString("administration.usergroup.members.delete.success"));
} catch (Exception e) {
LOGGER.error("Error occured while removing user from user group", e);
Session.get().error(getString("administration.usergroup.members.delete.error"));
}
target.add(getPage());
FeedbackUtils.refreshFeedback(target, getPage());
}
});
}
};
add(memberListView);
add(new WebMarkupContainer("emptyList") {
private static final long serialVersionUID = 6700720373087584498L;
@Override
public void onConfigure() {
super.onConfigure();
setVisible(memberListView.size() <= 0);
}
});
// Add member form
IModel<User> emptyUserModel = new GenericEntityModel<Long, User>(null);
final UserAutocompleteAjaxComponent userAutocomplete = new UserAutocompleteAjaxComponent("userAutocomplete",
emptyUserModel);
userAutocomplete.setAutoUpdate(true);
final Form<User> addMemberForm = new Form<User>("addMemberForm", emptyUserModel);
addMemberForm.add(userAutocomplete);
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) {
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"));
}
}
userAutocomplete.setModelObject(null);
target.add(getPage());
FeedbackUtils.refreshFeedback(target, getPage());
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
FeedbackUtils.refreshFeedback(target, getPage());
}
});
add(addMemberForm);
}
}