/**
* Copyright 2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.bricket.plugin.user_role.web;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.StringValueConversionException;
import org.bricket.plugin.role.domain.Role;
import org.bricket.plugin.user.web.UserPageParameterDefinition;
import org.bricket.plugin.user_role.domain.UserRole;
import org.bricket.plugin.user_role.service.UserRoleService;
import org.bricket.service.BricketServiceException;
import org.bricket.web.BricketPanel;
import org.bricket.web.common.ActionPanelBuilder;
import org.bricket.web.common.DeleteActionLink;
import org.bricket.web.common.table.AjaxFallbackDefaultDataTableBuilder;
import brix.jcr.wrapper.BrixNode;
import brix.web.nodepage.BrixPageParameters;
import brix.web.nodepage.PageParametersAware;
/**
* @author Ingo Renner
* @author Henning Teek
*
*/
public class ManageUserRolesPanel extends BricketPanel implements PageParametersAware {
@SpringBean
private UserRoleService userRoleService;
private long userId;
private Role role;
public ManageUserRolesPanel(String id, IModel<BrixNode> tileNode) {
super(id, tileNode);
}
@Override
protected void initGui() {
add(getTable());
add(getDropDownChoice());
}
private Component getDropDownChoice() {
return new DropDownChoice<Role>("roles", new PropertyModel<Role>(ManageUserRolesPanel.this, "role"),
new LoadableDetachableModel<List<Role>>() {
@Override
protected List<Role> load() {
return userRoleService.loadAllRoles();
}
}, new ChoiceRenderer<Role>("name", "id")).add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (role != null) {
try {
// feedback
getSession().cleanupFeedbackMessages();
target.addComponent(getFeedback());
// delete
userRoleService.assignRole(userId, role.getName());
// manage
Component table = getTable();
ManageUserRolesPanel.this.addOrReplace(table);
target.addComponent(table);
role = null;
Component ddc = getDropDownChoice();
ManageUserRolesPanel.this.addOrReplace(ddc);
target.addComponent(ddc);
} catch (BricketServiceException e) {
error(new StringResourceModel(e.getKey(), ManageUserRolesPanel.this, null).getString());
target.addComponent(getFeedback());
}
}
}
});
}
private Component getTable() {
String id = "table";
if (userId > 0l) {
return AjaxFallbackDefaultDataTableBuilder
.getBuilder(ManageUserRolesPanel.this)
.addDataProvider(new UserRoleDataProvider(userId))
.add(new AbstractColumn<Object>(new StringResourceModel("actions.label", ManageUserRolesPanel.this,
null)) {
@Override
public void populateItem(Item<ICellPopulator<Object>> cellItem, String componentId,
IModel<Object> rowModel) {
final ActionPanelBuilder linkBuilder = ActionPanelBuilder.getBuilder();
final UserRole userRole = (UserRole) rowModel.getObject();
DeleteActionLink removeLink = new DeleteActionLink(new StringResourceModel(
"actions.delete.confirm", ManageUserRolesPanel.this, null), true) {
@Override
public void onClick(AjaxRequestTarget target) {
try {
// feedback
getSession().cleanupFeedbackMessages();
target.addComponent(getFeedback());
// delete
userRoleService.deleteUserRole(userRole);
// manage
Component table = getTable();
ManageUserRolesPanel.this.addOrReplace(table);
target.addComponent(table);
} catch (BricketServiceException e) {
error(new StringResourceModel(e.getKey(), ManageUserRolesPanel.this, null)
.getString());
target.addComponent(getFeedback());
}
}
};
linkBuilder.add(removeLink);
cellItem.add(linkBuilder.build(componentId));
}
}).addPropertyColumn("id", true).addPropertyColumn("role.name", true)
.addBooleanPropertyColumn("role.systemRole", true).setNumberOfRows(10).build(id);
} else {
return new EmptyPanel(id);
}
}
@Override
public void contributeToPageParameters(BrixPageParameters params) {
}
@Override
public void initializeFromPageParameters(BrixPageParameters params) {
try {
userId = params.getQueryParam(UserPageParameterDefinition.USER_PAGE_PARAMETER).toLong();
} catch (StringValueConversionException svce) {
userId = 0l;
}
}
}