/******************************************************************************* * 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.Arrays; import java.util.List; import org.opensheet.client.dto.AssignmentDTO; import org.opensheet.client.dto.DepartmentDTO; import org.opensheet.client.dto.grid.AssignmentGridTemplate; import org.opensheet.client.mvc.events.AdminEvents; import org.opensheet.client.mvc.events.EventBus; import org.opensheet.client.services.AssignmentService; import org.opensheet.client.services.AssignmentServiceAsync; import org.opensheet.client.utils.AssignmentTypes; import org.opensheet.client.utils.Resources; import org.opensheet.client.widges.BranchComboBox; import org.opensheet.client.widges.BranchDepartmentUserSwitchMenu; import org.opensheet.shared.model.BaseModel.DepartmentBaseModel; import org.opensheet.shared.model.BaseModel.UserBaseModel; import com.extjs.gxt.ui.client.Style.Orientation; import com.extjs.gxt.ui.client.data.BaseModel; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.ModelIconProvider; import com.extjs.gxt.ui.client.dnd.ListViewDragSource; import com.extjs.gxt.ui.client.dnd.ListViewDropTarget; import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.Events; 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.TreeStore; import com.extjs.gxt.ui.client.util.Margins; import com.extjs.gxt.ui.client.widget.BoxComponent; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.Info; import com.extjs.gxt.ui.client.widget.ListView; 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.ComboBox; import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.layout.RowData; import com.extjs.gxt.ui.client.widget.layout.RowLayout; import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid; import com.extjs.gxt.ui.client.widget.treegrid.TreeGridCellRenderer; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; //public class AssignmentTreeUserGrid extends TabPanel{ public class AssignmentTreeUserGrid extends ContentPanel { private TreeGrid<ModelData> tree; private TreeStore<ModelData> store; private ListStore<UserBaseModel> activeUsersStore; private ListView<UserBaseModel> activeUsers; private ListView<UserBaseModel> inactiveUsers; private ListStore<DepartmentBaseModel> departmentBaseModelStore; private BranchComboBox toolBarBranchComboBox; private Integer assignmentBranch = 1; private Integer userBranch = 1; private Integer department = 1; private Integer assignmentType = 0; private Integer assignment; private BranchDepartmentUserSwitchMenu branchDepartmentUserSwitchMenu; /* here we updating department combobox store, coz it can changed since * start. * .. and assignment tree also public void doUpdateStore(){ if(departmentComboBox.isRendered()){ final DepartmentServiceAsync depService = GWT.create(DepartmentService.class); depService.getDepartmentsBaseModel("1", new AsyncCallback<List<DepartmentBaseModel>>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(List<DepartmentBaseModel> result) { departmentBaseModelStore = new ListStore<DepartmentBaseModel>(); departmentBaseModelStore.add(new DepartmentBaseModel(99999999,"All Users")); departmentBaseModelStore.add(result); departmentComboBox.setStore(departmentBaseModelStore); departmentComboBox.setValue(departmentBaseModelStore.getAt(0)); } }); } loadAssignmentTreeGrid(); } */ public AssignmentTreeUserGrid(){ setFrame(true); setSize(1024, 600); setLayout(new RowLayout(Orientation.HORIZONTAL)); setHeaderVisible(false); getAssignmentTreeGrid(); loadAssignmentTreeGrid(); addUserLists(); } public void getAssignmentTreeGrid(){ ColumnConfig name = new ColumnConfig("name", "Name", 230); name.setRenderer(new TreeGridCellRenderer<ModelData>()); name.setSortable(false); name.setFixed(true); name.setMenuDisabled(true); ColumnModel cm = new ColumnModel(Arrays.asList(name)); store = new TreeStore<ModelData>(); tree = new TreeGrid<ModelData>(store, cm); tree.setBorders(true); tree.setAutoExpandColumn("name"); tree.setTrackMouseOver(false); tree.setLoadMask(true); tree.setWidth(250); tree.setHeight(400); tree.setBorders(true); tree.getView().setEmptyText("no data"); tree.setId("myTreeid"); tree.getSelectionModel().addListener(Events.SelectionChange, new Listener<SelectionChangedEvent<ModelData>>() { public void handleEvent(SelectionChangedEvent<ModelData> be) { if (be.getSelection().size() > 0) { assignment = Integer.parseInt(be.getSelectedItem().getProperties().get("index").toString()); AssignmentDTO a = new AssignmentDTO(assignment); populateUserLists(a,new DepartmentDTO(department),assignmentBranch); } } }); ToolBar toolBar = new ToolBar(); toolBar.add(new LabelToolItem("Assignment Mode: ")); List<AssignmentTypes> list = AssignmentTypes.get(); final ListStore<AssignmentTypes> store = new ListStore<AssignmentTypes>(); store.add(list); final ComboBox<AssignmentTypes> typeCombo = new ComboBox<AssignmentTypes>(); typeCombo.setTriggerAction(TriggerAction.ALL); typeCombo.setEditable(false); typeCombo.setWidth(100); typeCombo.setStore(store); typeCombo.setDisplayField("name"); typeCombo.setValue(store.getAt(0)); typeCombo.setFieldLabel("Type"); typeCombo.setAllowBlank(false); typeCombo.addListener(Events.Select, new Listener<BaseEvent>() { @Override public void handleEvent(BaseEvent be) { assignmentType = typeCombo.getValue().getId(); loadAssignmentTreeGrid(); } }); toolBar.add(typeCombo); toolBar.add(new SeparatorToolItem()); toolBar.add(new LabelToolItem("Branch: ")); toolBarBranchComboBox = new BranchComboBox(false); toolBarBranchComboBox.setEmptyText("Default"); toolBarBranchComboBox.addListener(Events.Select,new Listener<BaseEvent>(){ @Override public void handleEvent(BaseEvent be) { assignmentBranch = Integer.parseInt(toolBarBranchComboBox.getValue().get("id").toString()); loadAssignmentTreeGrid(); } }); toolBar.add(toolBarBranchComboBox); final BoxComponent spaceItem = new BoxComponent(){ @Override protected void onRender(final Element target, final int index) { this.setElement(DOM.createDiv(), target, index); } }; spaceItem.setWidth(20); toolBar.add(spaceItem); toolBar.add(new SeparatorToolItem()); toolBar.add(new LabelToolItem("Branch/Department: ")); branchDepartmentUserSwitchMenu = new BranchDepartmentUserSwitchMenu(); toolBar.add(branchDepartmentUserSwitchMenu); EventBus.get().addListener(AdminEvents.AdminAssignmentDepartmentUserSwitch, new Listener<BaseEvent>() { public void handleEvent(BaseEvent e) { BaseModel result = branchDepartmentUserSwitchMenu.getResult(); userBranch = Integer.parseInt(result.get("branch").toString()); department = Integer.parseInt(result.get("department").toString()); populateUserLists(new AssignmentDTO(assignment),new DepartmentDTO(department),userBranch); } }); setTopComponent(toolBar); add(tree); } public void loadAssignmentTreeGrid(){ final AssignmentServiceAsync assignmentService = GWT.create(AssignmentService.class); assignmentService.getAssignmentDTOs(assignmentType,true,assignmentBranch, new AsyncCallback<AssignmentGridTemplate>() { public void onFailure(Throwable caught) { } public void onSuccess(AssignmentGridTemplate model) { tree.getStore().removeAll(); tree.setIconProvider(new ModelIconProvider<ModelData>() { public AbstractImagePrototype getIcon(ModelData model) { ModelData attribute = (ModelData ) model; if (attribute.get("leaf").equals(true) && attribute.get("status").equals(true)) { return Resources.ICONS.add(); }else if(attribute.get("leaf").equals(true) && attribute.get("status").equals(false)){ return Resources.ICONS.delete(); } else { return Resources.ICONS.table(); } } }); store.add(model.getChildren(), true); } }); } public void addUserLists(){ ContentPanel cp = new ContentPanel(); cp.setHeadingHtml("Left List -> Users within Assignment,Right nope, drap&drop them"); cp.setSize(500, 400); cp.setLayout(new RowLayout(Orientation.HORIZONTAL)); ToolBar toolBar = new ToolBar(); Button btnCommit = new Button("Commit"); btnCommit.addListener(Events.Select, new Listener<ButtonEvent>() { @Override public void handleEvent(ButtonEvent be) { AssignmentDTO a = null; try{ a = new AssignmentDTO((Integer) tree.getSelectionModel().getSelectedItem().get("index")); updateUsersList(activeUsers.getStore().getModels(),a,new DepartmentDTO(department)); }catch (NumberFormatException nfe) { System.out.println("NumberFormatException: " + nfe.getMessage()); } } }); btnCommit.setIcon(Resources.ICONS.add()); Button btnClean = new Button("Reload"); btnClean.addListener(Events.Select, new Listener<ButtonEvent>() { @Override public void handleEvent(ButtonEvent be) { AssignmentDTO a = new AssignmentDTO((Integer) tree.getSelectionModel().getSelectedItem().get("index")); populateUserLists(a,new DepartmentDTO(department),userBranch); } }); btnClean.setIcon(Resources.ICONS.delete()); toolBar.add(btnCommit); toolBar.add(btnClean); cp.setBottomComponent(toolBar); activeUsers = new ListView<UserBaseModel>(); activeUsers.setWidth(250); activeUsers.setDisplayProperty("name"); activeUsers.setTitle("Users in Assignmnet"); RowData data = new RowData(.5, 1); data.setMargins(new Margins(5)); cp.add(activeUsers,data); inactiveUsers = new ListView<UserBaseModel>(); inactiveUsers.setDisplayProperty("name"); inactiveUsers.setTitle("Users not in Assignmnet"); inactiveUsers.setWidth(250); cp.add(inactiveUsers,data); add(cp); } public void populateUserLists(AssignmentDTO assigmentDTO,DepartmentDTO departmentDTO,Integer branch){ final AssignmentServiceAsync assignmentService = GWT.create(AssignmentService.class); assignmentService.getAssignmentUsersByDepartmentByBranch(assigmentDTO,departmentDTO,true ,branch,new AsyncCallback<List<UserBaseModel>>() { @Override public void onFailure(Throwable caught) { Info.display("Somethings wrong!", caught.toString()); } @Override public void onSuccess(List<UserBaseModel> result) { activeUsersStore = new ListStore<UserBaseModel>(); activeUsersStore.add(result); activeUsers.setStore(activeUsersStore); } }); assignmentService.getAssignmentUsersByDepartmentByBranch(assigmentDTO,departmentDTO,false,branch,new AsyncCallback<List<UserBaseModel>>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(List<UserBaseModel> result) { ListStore<UserBaseModel> inactiveUsersStore = new ListStore<UserBaseModel>(); inactiveUsersStore.add(result); inactiveUsers.setStore(inactiveUsersStore); } }); new ListViewDragSource(activeUsers); new ListViewDragSource(inactiveUsers); new ListViewDropTarget(activeUsers); new ListViewDropTarget(inactiveUsers); } public void updateUsersList(List<UserBaseModel> users,AssignmentDTO assignmentDTO,DepartmentDTO departmentDTO){ final AssignmentServiceAsync assignmentService = GWT.create(AssignmentService.class); assignmentService.updateAssignmentUsers(users,assignmentDTO,departmentDTO, new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { MessageBox.alert("Error!", "Try again later" + caught, null); } @Override public void onSuccess(Void result) { Info.display("Assignment Has Been Added", "Succesfull"); } }); } }