/******************************************************************************* * 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 org.opensheet.client.dto.DepartmentDTO; import org.opensheet.client.dto.UserDTO; import org.opensheet.client.services.DepartmentService; import org.opensheet.client.services.DepartmentServiceAsync; import org.opensheet.client.services.UserService; import org.opensheet.client.services.UserServiceAsync; import org.opensheet.client.widges.BranchComboBox; import org.opensheet.client.widges.admin.windows.addDepartmentWindow; import com.extjs.gxt.ui.client.Style.HorizontalAlignment; import com.extjs.gxt.ui.client.Style.Orientation; import com.extjs.gxt.ui.client.Style.SelectionMode; import com.extjs.gxt.ui.client.binding.FormBinding; import com.extjs.gxt.ui.client.data.BaseListLoader; import com.extjs.gxt.ui.client.data.BeanModel; import com.extjs.gxt.ui.client.data.BeanModelReader; import com.extjs.gxt.ui.client.data.ListLoadResult; import com.extjs.gxt.ui.client.data.ListLoader; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.RpcProxy; 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.FieldEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.store.Store; 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.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.ComboBox; import com.extjs.gxt.ui.client.widget.form.DateField; 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.form.SimpleComboBox; import com.extjs.gxt.ui.client.widget.form.TextArea; import com.extjs.gxt.ui.client.widget.form.TextField; 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.grid.Grid; 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.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.rpc.AsyncCallback; public class DepartmentFormGrid extends ContentPanel{ private FormPanel panel; private FormBinding formBindings; private Integer selectedBranch = 1; private TextField<String> note,name,owner; private NumberField id; private DateField start,finish,updated; private Boolean status; private CheckBox statusBox; private ListStore<BeanModel> store; private ComboBox<BeanModel> ownerComboBox; private String usersRpcCriteria = "1"; private String departmentRpcCriteria = "1"; private ListStore<BeanModel> userStore; private ListLoader<?> loader; private ListLoader<?> userloader; private TextArea noteTextArea; private BranchComboBox branchComboBox,newUserBranchComboBox,toolBarBranchComboBox; private DepartmentServiceAsync departmentService = GWT.create(DepartmentService.class); private UserServiceAsync userService = GWT.create(UserService.class); @SuppressWarnings({ "deprecation", "rawtypes" }) public DepartmentFormGrid(){ RpcProxy<List<DepartmentDTO>> proxy = new RpcProxy<List<DepartmentDTO>>() { @Override protected void load(Object loadConfig, AsyncCallback<List<DepartmentDTO>> callback) { departmentService.getDepartmentsByBranch(departmentRpcCriteria,selectedBranch,callback); } }; this.loader = new BaseListLoader<ListLoadResult<ModelData>>(proxy,new BeanModelReader()); final ListStore<BeanModel> store = new ListStore<BeanModel>(this.loader); store.setMonitorChanges(true); loader.load(); List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); columns.add(new ColumnConfig("name", "Department", 120)); columns.add(new ColumnConfig("owner.fullName", "Owner", 200)); columns.add(new ColumnConfig("status", "Status", 200)); ColumnConfig column = new ColumnConfig("started", "Started", 100); column.setAlignment(HorizontalAlignment.RIGHT); column.setDateTimeFormat(DateTimeFormat.getShortDateFormat()); columns.add(column); ColumnModel cm = new ColumnModel(columns); final Grid<BeanModel> grid = new Grid<BeanModel>(store, cm); grid.setLoadMask(true); grid.setWidth(800); grid.setHeight(200); grid.addStyleName(".my-table-style"); grid.setBorders(true); grid.setAutoExpandColumn("name"); grid.getView().setEmptyText("no data"); grid.setId("myid"); // setHeading("Departments"); setFrame(true); setSize(800, 400); setLayout(new RowLayout(Orientation.HORIZONTAL)); ToolBar toolBar = new ToolBar(); toolBar.add(new LabelToolItem("Department Mode: ")); final SimpleComboBox<String> type = new SimpleComboBox<String>(); type.setTriggerAction(TriggerAction.ALL); type.setEditable(false); type.setFireChangeEventOnSetValue(true); type.setWidth(100); type.add("Active"); type.add("Killed in Action"); type.add("EveryBody"); type.setSimpleValue("EveryBody"); toolBar.add(type); type.addListener(Events.Change, new Listener<FieldEvent>() { @Override public void handleEvent(FieldEvent be) { if(type.getSimpleValue().equals("EveryBody")){ departmentRpcCriteria = "any"; }else if(type.getSimpleValue().equals("Active")){ departmentRpcCriteria = "1"; }else if(type.getSimpleValue().equals("Killed in Action")){ departmentRpcCriteria = "0"; } grid.getStore().getLoader().load(); } }); toolBar.add(new SeparatorToolItem()); toolBar.add(new LabelToolItem("Branch: ")); toolBarBranchComboBox = new BranchComboBox(true); toolBarBranchComboBox.setEmptyText("Default"); toolBarBranchComboBox.addListener(Events.Select, new Listener<FieldEvent>(){ @Override public void handleEvent(FieldEvent be) { selectedBranch = Integer.parseInt(toolBarBranchComboBox.getValue().get("id").toString()); grid.getStore().getLoader().load(); } }); 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()); Button addDepartmnetButton = new Button("Add Department", new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { new addDepartmentWindow(grid); } }); addDepartmnetButton.setIconStyle("icon-user"); toolBar.add(addDepartmnetButton); setTopComponent(toolBar); setHeaderVisible(false); grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); 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(); } } }); FormPanel panel = createForm(); formBindings = new FormBinding(panel, true); formBindings.setStore((Store) grid.getStore()); add(grid, new RowData(.6, 1)); add(panel, new RowData(.4, 1)); } private FormPanel createForm() { RpcProxy<List<UserDTO>> UserProxy = new RpcProxy<List<UserDTO>>() { @Override protected void load(Object loadConfig, AsyncCallback<List<UserDTO>> callback) { userService.getUsersByRole("dm",callback); } }; userloader = new BaseListLoader<ListLoadResult<ModelData>>(UserProxy,new BeanModelReader()); userStore = new ListStore<BeanModel>(userloader); userStore.setMonitorChanges(true); userloader.load(); panel = new FormPanel(); panel.setHeaderVisible(false); id = new NumberField(); id.setName("id"); id.hide(); panel.add(id); name = new TextField<String>(); name.setName("name"); name.setAllowBlank(false); name.setAutoValidate(true); name.setFieldLabel("Name"); panel.add(name); statusBox = new CheckBox(); statusBox.setName("status"); statusBox.setFieldLabel("Status"); panel.add(statusBox); branchComboBox = new BranchComboBox(false); branchComboBox.setName("branch"); branchComboBox.setDisplayField("name"); panel.add(branchComboBox); ownerComboBox = new ComboBox<BeanModel>(); ownerComboBox.setDisplayField("fullName"); ownerComboBox.setWidth(150); ownerComboBox.setName("owner"); ownerComboBox.setFieldLabel("Owner"); ownerComboBox.setAllowBlank(false); ownerComboBox.setEditable(false); ownerComboBox.setStore(userStore); ownerComboBox.setTriggerAction(TriggerAction.ALL); panel.add(ownerComboBox); start = new DateField(); start.setName("started"); start.setFieldLabel("Start"); start.disable(); panel.add(start); updated = new DateField(); updated.setName("updated"); updated.setFieldLabel("Updated"); updated.disable(); panel.add(updated); finish = new DateField(); finish.setName("finished"); finish.setFieldLabel("Finish"); panel.add(finish); noteTextArea = new TextArea(); noteTextArea.setPreventScrollbars(true); noteTextArea.setFieldLabel("Description"); noteTextArea.setName("note"); noteTextArea.setMaxLength(450); panel.add(noteTextArea); Button button = new Button(); button.setText("Send"); panel.add(button); button.addListener(Events.OnClick, new Listener<BaseEvent>() { @Override public void handleEvent(BaseEvent be) { if((Integer) id.getValue().intValue() == 1 && statusBox.getValue() == false ){ MessageBox.alert("Update Failed", "Default Department cant be disabled", null); loader.load(); }else{ updateDepartment(); } } }); return panel; } private void updateDepartment() { DepartmentDTO departmentDTO = new DepartmentDTO(); departmentDTO.setId((Integer) id.getValue().intValue()); departmentDTO.setName(name.getValue().toString()); departmentDTO.setBranch(branchComboBox.get()); if(statusBox.getValue() != true){ departmentDTO.setStatus(false); }else{ departmentDTO.setStatus(true); } departmentDTO.setOwner((UserDTO) ownerComboBox.getValue().getBean()); departmentDTO.setFinished(finish.getValue()); if(noteTextArea.getValue() == null){ departmentDTO.setNote(null); } else { departmentDTO.setNote(noteTextArea.getValue().toString()); } departmentService.updateDepartment(departmentDTO, new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { MessageBox.alert("Cannot update department", caught.getMessage(), null); } @Override public void onSuccess(Void result) { Info.display("Ok!", "Department has been updated"); loader.load(); } }); } }