/******************************************************************************* * 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.project; import java.util.Arrays; import java.util.Date; import org.opensheet.client.dto.grid.AssignmentGridTemplate; import org.opensheet.client.services.AssignmentService; import org.opensheet.client.services.AssignmentServiceAsync; import org.opensheet.client.services.StatService; import org.opensheet.client.services.StatServiceAsync; import org.opensheet.client.services.TimelineService; import org.opensheet.client.services.TimelineServiceAsync; import org.opensheet.client.services.UserService; import org.opensheet.client.services.UserServiceAsync; import org.opensheet.client.utils.AssignmentTypes; import org.opensheet.client.utils.Resources; import org.opensheet.client.widges.Reloadable; import org.opensheet.client.widges.windows.AddAssignmentWindow; import com.extjs.gxt.ui.client.Style.HideMode; import com.extjs.gxt.ui.client.Style.Orientation; import com.extjs.gxt.ui.client.Style.Scroll; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.ModelIconProvider; 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.MenuEvent; 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.TreeStore; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.TabItem; import com.extjs.gxt.ui.client.widget.TabPanel; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.form.FormPanel; 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.RowLayout; import com.extjs.gxt.ui.client.widget.menu.Menu; import com.extjs.gxt.ui.client.widget.menu.MenuItem; 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.core.client.RunAsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; public class ProjectPanel extends ContentPanel implements Reloadable{ private AssignmentServiceAsync assignmentService = GWT.create(AssignmentService.class); private UserServiceAsync userService = GWT.create(UserService.class); private StatServiceAsync chartService = GWT.create(StatService.class); private TimelineServiceAsync timelineService = GWT.create(TimelineService.class); private TabPanel tabPanel; private TreeGrid<ModelData> grid; private TreeStore<ModelData> assignmentStore; final ListStore<AssignmentTypes> typeStore = new ListStore<AssignmentTypes>(); private FormPanel form; private Boolean statusOfAssignmentToLoad = true; private Button statusAssignmentButton; private Date date = new Date();; private ContentPanel south; private AssignmentDetailPanel assignmentDetailPanel; private AssignmentDepartmentPanel assignmentDepartmentPanel; public ProjectPanel() { this.addListener(Events.Attach, new Listener<BaseEvent>(){ @Override public void handleEvent(BaseEvent be) { loadAssignments(); } }); setLayout(new RowLayout(Orientation.VERTICAL)); setFrame(true); setHeaderVisible(false); ContentPanel north = new ContentPanel(); south = new ContentPanel(); north.setLayout(new RowLayout(Orientation.HORIZONTAL)); north.setWidth(1024); north.setHeight(330); north.setHeaderVisible(false); // south.setLayout(new RowLayout(Orientation.HORIZONTAL)); south.setWidth(1024); south.setHeight(265); south.setHeaderVisible(false); south.setFrame(true); south.setScrollMode(Scroll.AUTO); // assignmentQuickReportContentPanel = new AssignmentQuickReportContentPanel(south); ContentPanel temp = new ContentPanel(); temp.setWidth(20); temp.setHeight(330); temp.setFrame(true); temp.setBorders(false); temp.setHeaderVisible(false); north.add(drawAssignemntTree()); north.add(temp); north.add(tabPanel()); add(north); add(south); } private ContentPanel drawAssignemntTree(){ assignmentStore = new TreeStore<ModelData>(); loadAssignments(); ColumnConfig name = new ColumnConfig("name", "Name", 300); name.setRenderer(new TreeGridCellRenderer<ModelData>()); name.setMenuDisabled(true); name.setSortable(false); ColumnModel cm = new ColumnModel(Arrays.asList(name)); grid = new TreeGrid<ModelData>(assignmentStore, cm); grid.setHeight(280); grid.setWidth(330); grid.getSelectionModel().addListener(Events.SelectionChange, new Listener<SelectionChangedEvent<ModelData>>() { public void handleEvent(SelectionChangedEvent<ModelData> be) { if (be.getSelection().size() > 0) { Integer assignmentId = Integer.parseInt(be.getSelectedItem().getProperties().get("index").toString()); assignmentDetailPanel.setData(assignmentId); assignmentDepartmentPanel.setData(assignmentId); // loadAssignmentDetailsForm(assignmentId); // getAssignmentTimeline(assignmentId); //убрать в loadAssignmentDetailsForm // drawAssignemntYearChart(date.getYear(),assignmentId); // departmentTimeline.setData(assignmentId); // assignmentQuickReportContentPanel.setData(assignmentId); // assignmentExportAndReportContentPanel.setData(assignmentId); // departmentCheckGrid.setData(assignmentId); } else { // form.clear(); } } }); final Menu contextMenu = new Menu(); final MenuItem insert = new MenuItem(); insert.setText("Insert Task"); insert.setIconStyle("icon-add"); insert.addSelectionListener(new SelectionListener<MenuEvent>() { public void componentSelected(MenuEvent ce) { final Integer parentId = (Integer) grid.getSelectionModel().getSelectedItem().getProperties().get("index"); addAssignmentWindow(false,parentId); } }); contextMenu.add(insert); final MenuItem addDepartmentMenuItem = new MenuItem(); addDepartmentMenuItem.setText("Department Managment"); addDepartmentMenuItem.setIcon(Resources.ICONS.table()); addDepartmentMenuItem.addSelectionListener(new SelectionListener<MenuEvent>() { public void componentSelected(MenuEvent ce) { final Integer assignmentId = (Integer) grid.getSelectionModel().getSelectedItem().getProperties().get("index"); addDepartmentWindow(assignmentId); } }); contextMenu.add(addDepartmentMenuItem); MenuItem remove = new MenuItem(); remove.setIconStyle("icon-delete"); remove.setText("Change Status"); remove.addSelectionListener(new SelectionListener<MenuEvent>() { public void componentSelected(MenuEvent ce) { ModelData sel = grid.getSelectionModel().getSelectedItem(); assignmentService.changeStatusAssignment(sel.get("index").toString(), new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { MessageBox.alert("Cannot Change Status", caught.getMessage(), null); } @Override public void onSuccess(Void result) { loadAssignments(); } }); } }); contextMenu.add(remove); contextMenu.addListener(Events.BeforeShow, new Listener<BaseEvent>(){ @Override public void handleEvent(BaseEvent be) { Boolean leaf = (Boolean) grid.getSelectionModel().getSelectedItem().getProperties().get("leaf"); if(leaf == false){ insert.enable(); }else{ insert.disable(); } } }); MenuItem users = new MenuItem("Users"); users.setIcon(Resources.ICONS.user_add()); users.addSelectionListener(new SelectionListener<MenuEvent>() { public void componentSelected(MenuEvent ce) { ModelData sel = grid.getSelectionModel().getSelectedItem(); final Integer assignmentId = Integer.parseInt(sel.get("index").toString()); // new AssignmentUsers(assignmentId); // addDepartmentWindow(assignmentId); GWT.runAsync(new RunAsyncCallback() { public void onFailure(Throwable err) { MessageBox.info("ERROR",err.getMessage(),null); } public void onSuccess() { new AssignmentUsers(assignmentId); } }); } }); contextMenu.add(users); grid.setContextMenu(contextMenu); ToolBar assignmentToolBar = new ToolBar(); assignmentToolBar.add(new LabelToolItem("Status Mode: ")); statusAssignmentButton = new Button(); statusAssignmentButton.setWidth(100); statusAssignmentButton.setText("Active"); statusAssignmentButton.setBorders(true); statusAssignmentButton.setIcon(Resources.ICONS.user_add()); statusAssignmentButton.addListener(Events.Select,new Listener<ButtonEvent>() { @Override public void handleEvent(ButtonEvent be) { if(statusOfAssignmentToLoad == true){ statusAssignmentButton.setText("All"); statusAssignmentButton.setIcon(Resources.ICONS.user_delete()); statusOfAssignmentToLoad = false; }else if(statusOfAssignmentToLoad == false){ statusAssignmentButton.setText("Active"); statusAssignmentButton.setIcon(Resources.ICONS.user_add()); statusOfAssignmentToLoad = true; } loadAssignments(); } }); assignmentToolBar.add(statusAssignmentButton); assignmentToolBar.add(new SeparatorToolItem()); Button addAssignmentButton = new Button("Add new Assignment"); addAssignmentButton.setIcon(Resources.ICONS.add()); addAssignmentButton.addListener(Events.Select,new Listener<ButtonEvent>() { @Override public void handleEvent(ButtonEvent be) { addAssignmentWindow(true,0); } }); assignmentToolBar.add(addAssignmentButton); ContentPanel p = new ContentPanel(); p.add(assignmentToolBar); p.setTopComponent(assignmentToolBar); p.setHeadingHtml("Your Assignments:"); p.add(grid); return p; } private void addAssignmentWindow(final Boolean root,final Integer parentId){ final ProjectPanel cp = this; GWT.runAsync(new RunAsyncCallback() { public void onSuccess() { new AddAssignmentWindow(root,parentId,cp); } public void onFailure(Throwable msg) { MessageBox.info("Somethings wrong, ask your Administrator", msg.getMessage(),null); } }); } private void addDepartmentWindow(final Integer assignmentId){ final ProjectPanel cp = this; GWT.runAsync(new RunAsyncCallback() { public void onSuccess() { new AddDepartmentToAssignmentWindow(assignmentId,cp); } public void onFailure(Throwable msg) { MessageBox.info("Somethings wrong, ask your Administrator", msg.getMessage(),null); } }); } public void loadAssignments(){ final AssignmentServiceAsync assignmentService = GWT.create(AssignmentService.class); assignmentService.getProjectManagerAssignments(statusOfAssignmentToLoad, new AsyncCallback<AssignmentGridTemplate>(){ @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(AssignmentGridTemplate result) { grid.getStore().removeAll(); grid.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 if (attribute.get("leaf").equals(false) && attribute.get("status").equals(true)){ return Resources.ICONS.table(); }else{ return Resources.ICONS.delete(); } } }); assignmentStore.add(result.getChildren(), true); } }); } private TabPanel tabPanel(){ tabPanel = new TabPanel(); tabPanel.setWidth(670); tabPanel.setHeight(300); tabPanel.setAutoHeight(true); TabItem assignmentDetailsTab = new TabItem("Assignment Details"); assignmentDetailsTab.setIcon(Resources.ICONS.table()); assignmentDetailsTab.addStyleName("pad-text"); assignmentDetailPanel = new AssignmentDetailPanel(this); assignmentDetailsTab.add(assignmentDetailPanel); TabItem assignmentDepartmentTab = new TabItem("Assignment => Department"); assignmentDepartmentTab.setHideMode(HideMode.OFFSETS); assignmentDepartmentTab.setIconStyle("icon-dm"); assignmentDepartmentTab.addStyleName("pad-text"); assignmentDepartmentPanel = new AssignmentDepartmentPanel(); assignmentDepartmentTab.add(assignmentDepartmentPanel); TabItem assignmentReportTab = new TabItem("Assignemnt Report"); assignmentReportTab.setIcon(Resources.ICONS.table()); assignmentReportTab.setLayout(new RowLayout()); tabPanel.add(assignmentDetailsTab); tabPanel.add(assignmentDepartmentTab); return tabPanel; } @Override public void reload() { loadAssignments(); } public void assignmentDepartmentPanelSetData(Integer assignmentId){ assignmentDepartmentPanel.setData(assignmentId); } /* Button save = new Button(); save.setText("Save"); save.addListener(Events.Select, new Listener<BaseEvent>(){ @Override public void handleEvent(BaseEvent be) { assignmentUpdateDTO = new AssignmentDTO(idField.getValue().intValue()); assignmentUpdateDTO.setName(name.getValue()); assignmentUpdateDTO.setIndex(indexTextField.getValue()); assignmentUpdateDTO.setOwner(thisAssignmentDTO.getOwner()); assignmentUpdateDTO.setType(typeSimpleComboBox.getValue().getId()); assignmentUpdateDTO.setFinished(finish.getValue()); assignmentUpdateDTO.setNote(noteTextArea.getValue()); assignmentUpdateDTO.setStatus(checkBox.getValue()); timelineService.setAssignmentTimeline(idField.getValue().intValue(), assignmentTimeline.getValue().intValue(),false, new AsyncCallback<BaseModel>(){ @Override public void onFailure(Throwable caught) { MessageBox.alert("ERROR", caught.getMessage(), null); } @Override public void onSuccess(BaseModel result) { Integer assignmentId = Integer.parseInt(grid.getSelectionModel().getSelectedItem().getProperties().get("index").toString()); if(result.get("type").equals("error") || result.get("type").equals("root_error")){ assignmentTimelineError(assignmentId,assignmentTimeline.getValue().intValue(),result.get("type").toString(),result.get("string").toString()); }else{ Info.display("Success", "Everythings OK"); } } }); if(checkBox.getValue() == false && thisAssignmentDTO.getStatus()==true){ final Dialog dialog = new Dialog(); dialog.setHeading("Assignemnt Disable Action"); dialog.setButtons(Dialog.YESNO); dialog.setBodyStyleName("pad-text"); dialog.addText("If you disable an Assignemnt it will remove all users/departments from this assignment"); dialog.getItem(0).getFocusSupport().setIgnore(true); dialog.setScrollMode(Scroll.AUTO); dialog.setHideOnButtonClick(true); dialog.getButtonById("yes").addListener(Events.Select, new SelectionListener<ButtonEvent>(){ @Override public void componentSelected(ButtonEvent ce) { assignmentUpdateDTO.setStatus(false); assignmentService.updateAssignment(assignmentUpdateDTO, new AsyncCallback<BaseModel>(){ @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(BaseModel result) { loadAssignments(); // Add byDefault Assignemnt check } }); } }); dialog.getButtonById("no").addListener(Events.Select, new SelectionListener<ButtonEvent>(){ @Override public void componentSelected(ButtonEvent ce) { assignmentUpdateDTO.setStatus(true); assignmentService.updateAssignment(assignmentUpdateDTO, new AsyncCallback<BaseModel>(){ @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(BaseModel result) { // Add Error Check loadAssignments(); } }); } }); dialog.setClosable(false); dialog.show(); }else{ assignmentService.updateAssignment(assignmentUpdateDTO, new AsyncCallback<BaseModel>(){ @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(BaseModel result) { // Add Error Dialog! loadAssignments(); } }); } } }); Button cancel = new Button(); cancel.setText("Cancel"); cancel.addListener(Events.Select, new Listener<BaseEvent>(){ @Override public void handleEvent(BaseEvent be) { form.clear(); if(thisAssignmentDTO !=null) loadAssignmentDetailsForm(thisAssignmentDTO.getId()); } }); form.setButtonAlign(HorizontalAlignment.LEFT); form.addButton(save); form.addButton(cancel); fcp.add(form); TabPanel tabPanel = new TabPanel(); tabPanel.setHeight(300); tabPanel.setWidth(255); // tabPanel.setWidth(268); departmentCheckGrid = new DepartmentCheckGrid(); departmentTimeline = new DepartmentTimeline(south); departmentTimeline.disable(); TabItem departmentTimelineTab = new TabItem(); departmentTimelineTab.setText("departments & timelines"); departmentTimelineTab.add(departmentTimeline); tabPanel.add(departmentTimelineTab); TabItem departmentCheckTab = new TabItem(); departmentCheckTab.setText("departments"); departmentCheckTab.add(departmentCheckGrid); tabPanel.add(departmentCheckTab); fcp.add(tabPanel); return fcp; } private void drawAssignemntYearChart(int year,int assignemntId){ final Chart chart = new Chart("resources/chart/open-flash-chart.swf"); chart.setId("chartId"); chartService.getAssignemntStatByYear(year+1900,assignemntId,new AsyncCallback<List<Number>>(){ @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(List<Number> result) { south.removeAll(); MonthChart f = new MonthChart(); chart.setHeight(220); chart.setChartModel(f.getChartModel(result)); south.add(chart); south.layout(); } }); } private void getAssignmentTimeline(Integer assignmentId){ timelineService.getAssignmentTimeline(assignmentId, new AsyncCallback<Integer>(){ @Override public void onFailure(Throwable caught) {} @Override public void onSuccess(Integer result) { assignmentTimeline.setValue(result); } }); } */ /* private void assignmentTimelineError(final Integer assignmentId,final Integer timeline,String error,String errorString){ assignmentTimelineErrorWindow = new Window(); assignmentTimelineErrorWindow.setWidth(250); assignmentTimelineErrorWindow.setHeight(180); assignmentTimelineErrorWindow.setResizable(false); assignmentTimelineErrorWindow.setHeading("ERROR"); assignmentTimelineErrorWindow.setClosable(false); Button okButton = new Button("OK"); okButton.addListener(Events.Select,new Listener<ButtonEvent>(){ @Override public void handleEvent(ButtonEvent be) { timelineService.setAssignmentTimeline(assignmentId, timeline,true, new AsyncCallback<BaseModel>(){ @Override public void onFailure(Throwable caught) { Info.display("ERROR", "Something Wrong"); } @Override public void onSuccess(BaseModel result) { if(result.get("type").equals("error") || result.get("type").equals("root_error")){ assignmentTimelineError(assignmentId,timeline,result.get("type").toString(),result.get("string").toString()); }else{ Info.display("Success", "Everythings OK"); } } }); assignmentTimelineErrorWindow.hide(); } }); Button cancelButton = new Button("Cancel"); cancelButton.addListener(Events.Select,new Listener<ButtonEvent>(){ @Override public void handleEvent(ButtonEvent be) { assignmentTimelineErrorWindow.hide(); // getAssignmentTimeline(assignmentId); } }); if(error.equals("root_error")){ assignmentTimelineErrorWindow.addText(errorString); okButton.disable(); }else if(error.equals("error")){ assignmentTimelineErrorWindow.addText(errorString + "<br>" + "You can allocate additional hours to Root assignment or cancel allocation for this assignment "); } assignmentTimelineErrorWindow.addButton(okButton); assignmentTimelineErrorWindow.addButton(cancelButton); assignmentTimelineErrorWindow.show(); } */ }