/*******************************************************************************
* Copyright (c) 2012 Dmitry Tikhomirov.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Dmitry Tikhomirov - initial API and implementation
******************************************************************************/
package org.opensheet.client.widges.admin;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.opensheet.client.dto.AuthmethodDTO;
import org.opensheet.client.dto.PermissionDTO;
import org.opensheet.client.dto.UserDTO;
import org.opensheet.client.services.UserService;
import org.opensheet.client.services.UserServiceAsync;
import com.extjs.gxt.ui.client.Style.SortDir;
import com.extjs.gxt.ui.client.Style.Orientation;
import com.extjs.gxt.ui.client.binding.FormBinding;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.data.BasePagingLoadConfig;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoader;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.CheckBox;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class PermissionFormGrid extends ContentPanel{
private FormPanel panel;
private ListStore<BeanModel> userPermissionStore;
private PagingLoader<PagingLoadResult<ModelData>> loader;
private UserServiceAsync userPermissionService = GWT.create(UserService.class);
private FormBinding formBindings;
private NumberField id;
private CheckBox admin,pm,dm,fd;
private Grid<BeanModel> UserPermissionGrid;
@SuppressWarnings("rawtypes")
public PermissionFormGrid(){
setFrame(true);
setSize(1024, 600);
setLayout(new RowLayout(Orientation.HORIZONTAL));
RpcProxy<PagingLoadResult<BaseModel>> proxy = new RpcProxy<PagingLoadResult<BaseModel>>() {
@Override
public void load(Object loadConfig, AsyncCallback<PagingLoadResult<BaseModel>> callback) {
userPermissionService.getUsersPermissions((PagingLoadConfig)loadConfig, callback);
}
};
loader = new BasePagingLoader<PagingLoadResult<ModelData>>(proxy);
loader.setRemoteSort(true);
ListStore<BaseModel> store = new ListStore<BaseModel>(loader);
PagingToolBar toolBar = new PagingToolBar(20);
toolBar.bind(loader);
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
columns.add(new ColumnConfig("fullName", "Login", 170));
ColumnConfig adminColumnConfig = new ColumnConfig("admin", "Administrator", 100);
adminColumnConfig.setRenderer(getGridCellRenderer());
adminColumnConfig.setSortable(false);
adminColumnConfig.setMenuDisabled(true);
columns.add(adminColumnConfig);
ColumnConfig pmColumnConfig = new ColumnConfig("pm", "Project Manager", 100);
pmColumnConfig.setSortable(false);
pmColumnConfig.setMenuDisabled(true);
pmColumnConfig.setRenderer(getGridCellRenderer());
columns.add(pmColumnConfig);
ColumnConfig dmColumnConfig = new ColumnConfig("dm", "Department Manager", 100);
dmColumnConfig.setSortable(false);
dmColumnConfig.setMenuDisabled(true);
dmColumnConfig.setRenderer(getGridCellRenderer());
columns.add(dmColumnConfig);
ColumnConfig fmColumnConfig =new ColumnConfig("fd", "Financinal Department", 100);
fmColumnConfig.setSortable(false);
fmColumnConfig.setSortable(false);
fmColumnConfig.setRenderer(getGridCellRenderer());
columns.add(fmColumnConfig);
ColumnModel cm = new ColumnModel(columns);
final Grid<BaseModel> grid = new Grid<BaseModel>(store, cm);
grid.setStateId("PermissionFormGrid");
grid.setStateful(true);
grid.addListener(Events.Attach, new Listener<GridEvent<BeanModel>>() {
public void handleEvent(GridEvent<BeanModel> be) {
PagingLoadConfig config = new BasePagingLoadConfig();
config.setOffset(0);
config.setLimit(20);
Map<String, Object> state = grid.getState();
if (state.containsKey("offset")) {
int offset = (Integer) state.get("offset");
int limit = (Integer) state.get("limit");
config.setOffset(offset);
config.setLimit(limit);
}
if (state.containsKey("sortField")) {
config.setSortField((String) state.get("sortField"));
config.setSortDir(SortDir.valueOf((String) state.get("sortDir")));
}
loader.load(config);
}
});
grid.setLoadMask(true);
grid.setBorders(true);
grid.setAutoExpandColumn("fullName");
grid.setStyleAttribute("borderTop", "none");
grid.setStripeRows(true);
grid.setColumnLines(true);
grid.setWidth(600);
grid.setHeight(300);
grid.getSelectionModel().addListener(Events.SelectionChange,
new Listener<SelectionChangedEvent<BeanModel>>() {
public void handleEvent(SelectionChangedEvent<BeanModel> be) {
if (be.getSelection().size() > 0) {
formBindings.bind((ModelData) be.getSelection().get(0));
} else {
formBindings.unbind();
}
}
});
panel = createForm();
panel.setWidth(300);
formBindings = new FormBinding(panel, true);
formBindings.setStore((Store) grid.getStore());
ContentPanel cp = new ContentPanel();
cp.add(grid);
cp.setHeaderVisible(false);
cp.setBottomComponent(toolBar);
add(cp);
add(panel);
}
private FormPanel createForm() {
panel = new FormPanel();
panel.setFrame(true);
panel.setHeaderVisible(false);
id = new NumberField();
id.setName("id");
id.hide();
panel.add(id);
admin = new CheckBox();
admin.setName("admin");
admin.setFieldLabel("Administrator");
panel.add(admin);
pm = new CheckBox();
pm.setName("pm");
pm.setFieldLabel("Project Manager");
panel.add(pm);
dm = new CheckBox();
dm.setName("dm");
dm.setFieldLabel("Department Manager");
panel.add(dm);
fd = new CheckBox();
fd.setName("fd");
fd.setFieldLabel("Financial Manager");
panel.add(fd);
Button button = new Button();
button.setText("Send");
panel.add(button);
button.addListener(Events.OnClick, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
updatePermission();
}
});
return panel;
}
public void updatePermission(){
UserDTO u = new UserDTO();
PermissionDTO p =new PermissionDTO();
u.setId((Integer) id.getValue().intValue());
if(admin.getValue() != true){
p.setAdmin(false);
}else{
p.setAdmin(true);
}
if(pm.getValue() != true){
p.setPm(false);
}else{
p.setPm(true);
}
if(dm.getValue() != true){
p.setDm(false);
}else{
p.setDm(true);
}
if(fd.getValue() != true){
p.setFd(false);
}else{
p.setFd(true);
}
u.setPermission(p);
u.setAuthmethod(new AuthmethodDTO());
userPermissionService.updateUserPermission(u, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
MessageBox.alert("Cannot update permission", caught.getMessage(), null);
}
@Override
public void onSuccess(Void result) {
loader.load();
}
});
}
private GridCellRenderer<ModelData> getGridCellRenderer(){
GridCellRenderer<ModelData> r = new GridCellRenderer<ModelData>(){
@Override public Object render(ModelData model, String property,ColumnData config, int rowIndex, int colIndex,
ListStore<ModelData> store, Grid<ModelData> grid) {
if(model.get(property).toString().equals("true")){
config.style = "background-image: url("+ GWT.getHostPageBaseURL().toString() + "resources/icons/add.gif) !important; background-repeat: no-repeat;";
}else{
config.style = "background-color: white;";
}
return "";
}
};
return r;
}
}