/*******************************************************************************
* 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.department;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.omg.CORBA.INTERNAL;
import org.opensheet.client.dto.DepartmentDTO;
import org.opensheet.client.dto.grid.AssignmentGridTemplate;
import org.opensheet.client.services.AssignmentService;
import org.opensheet.client.services.AssignmentServiceAsync;
import org.opensheet.client.services.DepartmentService;
import org.opensheet.client.services.DepartmentServiceAsync;
import org.opensheet.client.services.HourService;
import org.opensheet.client.services.HourServiceAsync;
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.Resources;
import org.opensheet.client.widges.Reloadable;
import com.extjs.gxt.ui.client.Style.HideMode;
import com.extjs.gxt.ui.client.Style.Orientation;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.data.BaseTreeModel;
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.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.Info;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
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.ComboBox;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel;
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.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
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.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.FlexTable;
public class DepartmentPanel extends ContentPanel implements Reloadable{
private ContentPanel assignemntsTreePanel;
private UserDepartmentReportContentPanel userDepartmentReportContentPanel;
private ComboBox<BeanModel> departmentComboBox;
private TreeGrid<ModelData> assignmentTreeGrid;
private TreeStore<ModelData> assignmentStore;
private Grid<BaseModel> userAssignmentGrid;
private DepartmentServiceAsync departmentService = GWT.create(DepartmentService.class);
private StatServiceAsync statService = GWT.create(StatService.class);
private TimelineServiceAsync timelineService = GWT.create(TimelineService.class);
private UserServiceAsync userService = GWT.create(UserService.class);
private AssignmentDetailPanel assignmentDetailPanel;
private NumberField userHourSumField,userHourSumThisMonthField,timelineField, timelineOverTimeField,externalRateField,internalRateField;
private FormPanel userAssignmentDetailsContentPanel;
private DepartmentReportContentPanel departmentReportContentPanel;
private Integer departmentId;
private Integer assignmentId;
private Integer userId;
public DepartmentPanel(){
this.setHeaderVisible(false);
setLayout(new RowLayout(Orientation.HORIZONTAL));
setFrame(true);
add(doLeftPanel());
add(doRightPanel());
}
private ContentPanel doLeftPanel(){
assignemntsTreePanel = new ContentPanel();
assignemntsTreePanel.setFrame(true);
assignemntsTreePanel.setWidth(300);
assignemntsTreePanel.setHeight(700);
assignemntsTreePanel.setHeadingHtml("Assignments:");
ToolBar toolBar = new ToolBar();
toolBar.add(new LabelToolItem("Choose Department: "));
toolBar.add(doDepartmentComboBox());
assignemntsTreePanel.add(toolBar);
assignemntsTreePanel.add(doAssignmentTreeGrid());
return assignemntsTreePanel;
}
private TabPanel doRightPanel(){
TabPanel folder = new TabPanel();
TabItem assignmentTab = new TabItem("Assignment Detail");
assignmentTab.setWidth(724);
assignmentTab.setHeight(600);
assignmentDetailPanel = new AssignmentDetailPanel();
assignmentTab.add(assignmentDetailPanel);
folder.add(assignmentTab);
TabItem usersTreePanelTab = new TabItem("Users Statistic");
usersTreePanelTab.setHideMode(HideMode.OFFSETS);
usersTreePanelTab.setWidth(724);
usersTreePanelTab.setHeight(600);
userDepartmentReportContentPanel = new UserDepartmentReportContentPanel();
usersTreePanelTab.add(userDepartmentReportContentPanel);
folder.add(usersTreePanelTab);
TabItem usersAssignmentTab = new TabItem("Users Assignments");
usersAssignmentTab.setHideMode(HideMode.OFFSETS);
usersAssignmentTab.add(doUserAssignmentContentPanel());
folder.add(usersAssignmentTab );
TabItem reportTab = new TabItem("Department Report");
reportTab.setHideMode(HideMode.OFFSETS);
reportTab.setWidth(724);
reportTab.setHeight(600);
departmentReportContentPanel = new DepartmentReportContentPanel();
reportTab.add(departmentReportContentPanel);
folder.add(reportTab);
return folder;
}
private ComboBox<BeanModel> doDepartmentComboBox(){
ListStore<BeanModel> departmentStore;
final DepartmentServiceAsync departmentService = GWT.create(DepartmentService.class);
ListLoader<?> loader;
RpcProxy<List<DepartmentDTO>> DepartmentProxy = new RpcProxy<List<DepartmentDTO>>() {
@Override
protected void load(Object loadConfig, AsyncCallback<List<DepartmentDTO>> callback) {
departmentService.getDepartments(callback);
}
};
loader = new BaseListLoader<ListLoadResult<ModelData>>(DepartmentProxy,new BeanModelReader());
departmentStore = new ListStore<BeanModel>(loader);
departmentStore.setMonitorChanges(true);
loader.load();
departmentComboBox = new ComboBox<BeanModel>();
departmentComboBox.setDisplayField("name");
departmentComboBox.setWidth(150);
departmentComboBox.setName("department");
departmentComboBox.setFieldLabel("Department");
departmentComboBox.setAllowBlank(false);
departmentComboBox.setEditable(false);
departmentComboBox.setValue(departmentStore.getAt(0));
departmentComboBox.setStore(departmentStore);
departmentComboBox.setTypeAhead(true);
departmentComboBox.setTriggerAction(TriggerAction.ALL);
departmentComboBox.addListener(Events.Select,new Listener<BaseEvent>(){
@Override public void handleEvent(BaseEvent be) {
departmentId = Integer.parseInt(departmentComboBox.getValue().get("id").toString());
loadAssignmentTreeGrid();
departmentReportContentPanel.setDepartment(departmentId);
}
});
return departmentComboBox;
}
private TreeGrid<ModelData> doAssignmentTreeGrid(){
assignmentStore = new TreeStore<ModelData>();
ColumnConfig name = new ColumnConfig("name", "Name", 100);
name.setRenderer(new TreeGridCellRenderer<ModelData>());
ColumnConfig index = new ColumnConfig("assignmentIndex", "Index", 100);
index.setSortable(false);
index.setFixed(true);
index.setMenuDisabled(true);
ColumnConfig status = new ColumnConfig("status", "Status", 100);
ColumnModel cm = new ColumnModel(Arrays.asList(name, index, status));
assignmentTreeGrid = new TreeGrid<ModelData>(assignmentStore, cm);
assignmentTreeGrid.setBorders(true);
assignmentTreeGrid.setAutoExpandColumn("name");
assignmentTreeGrid.setTrackMouseOver(false);
assignmentTreeGrid.setLoadMask(true);
assignmentTreeGrid.setWidth(600);
assignmentTreeGrid.setHeight(580);
assignmentTreeGrid.setBorders(true);
assignmentTreeGrid.getView().setEmptyText("no data");
assignmentTreeGrid.setId("myAssignmentTreeGridid");
assignmentTreeGrid.getSelectionModel().addListener(Events.SelectionChange,
new Listener<SelectionChangedEvent<ModelData>>() {
public void handleEvent(SelectionChangedEvent<ModelData> be) {
if (be.getSelection().size() > 0) {
assignmentId = Integer.parseInt(assignmentTreeGrid.getSelectionModel().getSelectedItem().get("index").toString());
userDepartmentReportContentPanel.loadData(assignmentId, departmentId);
loadUserAssignmentCheckGrid();
assignmentDetailPanel.setData(assignmentId, departmentId);
} else {
//panel.clear();
}
}
});
Menu menu = new Menu();
MenuItem addUserToAssignmentMenuItem = new MenuItem();
addUserToAssignmentMenuItem.setText("Add/Remove User to Assignment");
addUserToAssignmentMenuItem.setIcon(Resources.ICONS.add16());
addUserToAssignmentMenuItem.addSelectionListener(new SelectionListener<MenuEvent>(){
@Override public void componentSelected(MenuEvent ce) {
addUserToAssignmentWindow();
}
});
menu.add(addUserToAssignmentMenuItem);
assignmentTreeGrid.setContextMenu(menu);
return assignmentTreeGrid;
}
private void addUserToAssignmentWindow(){
final DepartmentPanel panel = this;
GWT.runAsync(new RunAsyncCallback(){
@Override
public void onFailure(Throwable reason) {
MessageBox.info("ERROR, can't draw addUserToAssignmentWindow",reason.getMessage(),null);
}
@Override
public void onSuccess() {
new AddUserToAssignmentWindow(assignmentId,departmentId,panel);
}
});
}
public void loadAssignmentTreeGrid(){
final AssignmentServiceAsync assignmentService = GWT.create(AssignmentService.class);
assignmentService.getDepartmentManagerAssignments(new DepartmentDTO(departmentId), new AsyncCallback<AssignmentGridTemplate>() {
public void onFailure(Throwable caught) {
MessageBox.alert("Cant get Assignemnts",caught.getMessage(), null);
}
public void onSuccess(AssignmentGridTemplate model) {
assignmentTreeGrid.getStore().removeAll();
assignmentStore.add(model.getChildren(), true);
}
});
}
private ContentPanel doUserAssignmentContentPanel(){
ContentPanel userAssignmentContentPanel = new ContentPanel();
userAssignmentContentPanel.setFrame(true);
userAssignmentContentPanel.setWidth(724);
userAssignmentContentPanel.setHeight(600);
userAssignmentContentPanel.setLayout(new RowLayout());
userAssignmentContentPanel.setHeadingHtml("Users in assignment: ");
userAssignmentContentPanel.add(doUserAssignmentCheckGrid());
userAssignmentContentPanel.add(doUserAssignmentDetailsContentPanel());
return userAssignmentContentPanel;
}
private void loadUserAssignmentCheckGrid(){
userAssignmentGrid.getStore().removeAll();
statService.getUsersByDepartmentAndByAssignmentWithStats(departmentId,assignmentId,new AsyncCallback<List<BaseModel>>(){
@Override public void onFailure(Throwable caught) {
Info.display("Error", caught.toString());
}
@Override
public void onSuccess(List<BaseModel> result) {
userAssignmentGrid.getStore().add(result);
}
});
}
private Grid<BaseModel> doUserAssignmentCheckGrid(){
List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig userConfig = new ColumnConfig("name", "User", 250);
userConfig.setFixed(true);
userConfig.setSortable(false);
userConfig.setMenuDisabled(true);
configs.add(userConfig);
ColumnConfig sumConfig = new ColumnConfig("sum", "∑", 50);
sumConfig.setFixed(true);
sumConfig.setSortable(false);
sumConfig.setMenuDisabled(true);
configs.add(sumConfig);
ColumnConfig timelineConfig = new ColumnConfig("timeline", "Timeline", 50);
timelineConfig.setFixed(true);
timelineConfig.setSortable(false);
timelineConfig.setMenuDisabled(true);
configs.add(timelineConfig);
ColumnConfig overtimelineConfig = new ColumnConfig("overtimeline", "Over Timeline", 70);
overtimelineConfig.setFixed(true);
overtimelineConfig.setSortable(false);
overtimelineConfig.setMenuDisabled(true);
configs.add(overtimelineConfig);
ColumnConfig internalrateConfig = new ColumnConfig("internalrate", "in cost", 70);
internalrateConfig.setFixed(true);
internalrateConfig.setSortable(false);
internalrateConfig.setMenuDisabled(true);
configs.add(internalrateConfig);
ColumnConfig internalrateSumConfig = new ColumnConfig("internalrateSum", "in cost ∑ ", 70);
internalrateSumConfig.setFixed(true);
internalrateSumConfig.setSortable(false);
internalrateSumConfig.setMenuDisabled(true);
configs.add(internalrateSumConfig);
ColumnConfig externalRateConfig = new ColumnConfig("externalrate", "ext cost", 70);
externalRateConfig.setFixed(true);
externalRateConfig.setSortable(false);
externalRateConfig.setMenuDisabled(true);
configs.add(externalRateConfig);
ColumnConfig externalRateSumConfig = new ColumnConfig("externalRateSum", "ext cost ∑", 70);
// externalRateSumConfig.setFixed(true);
externalRateSumConfig.setSortable(false);
externalRateSumConfig.setMenuDisabled(true);
configs.add(externalRateSumConfig);
ColumnModel cm = new ColumnModel(configs);
userAssignmentGrid = new Grid<BaseModel>(new ListStore<BaseModel>(), cm);
userAssignmentGrid.setLoadMask(true);
userAssignmentGrid.setWidth(700);
userAssignmentGrid.setHeight(350);
userAssignmentGrid.addStyleName(".my-table-style");
userAssignmentGrid.setBorders(true);
userAssignmentGrid.setAutoExpandColumn("name");
userAssignmentGrid.getView().setEmptyText("No users assigned");
userAssignmentGrid.setId("userAssignmentCheckGridId");
userAssignmentGrid.getSelectionModel().addListener(Events.SelectionChange,
new Listener<SelectionChangedEvent<ModelData>>() {
public void handleEvent(SelectionChangedEvent<ModelData> be) {
if (be.getSelection().size() > 0) {
userId = Integer.parseInt(userAssignmentGrid.getSelectionModel().getSelectedItem().get("id").toString());
loadUserAssignmentDetail();
} else {
userAssignmentDetailsContentPanel.clear();
}
}
});
return userAssignmentGrid;
}
private FormPanel doUserAssignmentDetailsContentPanel(){
userAssignmentDetailsContentPanel = new FormPanel();
userAssignmentDetailsContentPanel.setHeaderVisible(false);
userAssignmentDetailsContentPanel.setWidth(724); //288
userAssignmentDetailsContentPanel.setHeight(250);
FlexTable table = new FlexTable();
table.getElement().getStyle().setProperty("margin", "10px");
table.setCellSpacing(8);
table.setCellPadding(4);
Label label = new Label("Timeline");
table.setWidget(0,0, label);
timelineField = new NumberField();
timelineField.setWidth(60);
table.setWidget(0, 1,timelineField);
Button saveTimelineRateBtn = new Button("Save");
saveTimelineRateBtn.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override public void componentSelected(ButtonEvent ce) {
saveTimeline();
}
});
table.setWidget(0,2, saveTimelineRateBtn);
label = new Label("Internal Cost");
table.setWidget(1,0, label);
internalRateField = new NumberField();
internalRateField.setWidth(60);
table.setWidget(1, 1,internalRateField);
Button saveInternalRateBtn = new Button("Save");
saveInternalRateBtn.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override public void componentSelected(ButtonEvent ce) {
saveInternal();
}
});
table.setWidget(1,2, saveInternalRateBtn);
label = new Label("External Cost");
table.setWidget(2,0, label);
externalRateField = new NumberField();
externalRateField.setWidth(60);
table.setWidget(2, 1,externalRateField);
Button saveExternalRateBtn = new Button("Save");
saveExternalRateBtn.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override public void componentSelected(ButtonEvent ce) {
saveExternal();
}
});
table.setWidget(2,2, saveExternalRateBtn);
userAssignmentDetailsContentPanel.add(table);
return userAssignmentDetailsContentPanel;
}
private void loadUserAssignmentDetail(){
userAssignmentDetailsContentPanel.clear();
statService.getAssignmentDepartmentUserDetail(assignmentId, departmentId, userId, new AsyncCallback<BaseModel>(){
@Override public void onFailure(Throwable caught) {
MessageBox.info("Error", caught.getMessage(), null);
}
@Override
public void onSuccess(BaseModel result) {
timelineField.setValue(Integer.parseInt(result.get("timeline").toString()));
internalRateField.setValue(Integer.parseInt(result.get("intra_rate").toString()));
externalRateField.setValue(Integer.parseInt(result.get("extra_rate").toString()));
}
});
}
@Override
public void reload() {
loadUserAssignmentCheckGrid();
}
private void saveTimeline(){
if(assignmentId != null && userId != null){
Integer timeline = (Integer) timelineField.getValue().intValue();
timelineService.setUserAssignmentTimeline(userId, assignmentId, timeline, new AsyncCallback<Void>(){
@Override public void onFailure(Throwable caught) {
MessageBox.info("ERROR",caught.getMessage(),null);
}
@Override public void onSuccess(Void result) {
Info.display("OK","Timeline updated");
loadUserAssignmentCheckGrid();
}
});
}
}
private void saveInternal(){
Integer internal = (Integer) internalRateField.getValue().intValue();
userService.setUserInternalRate(userId, internal, new AsyncCallback<Void>(){
@Override public void onFailure(Throwable caught) {
MessageBox.info("ERROR",caught.getMessage(),null);
}
@Override public void onSuccess(Void result) {
Info.display("OK","Internal cost updated");
loadUserAssignmentCheckGrid();
}
});
}
private void saveExternal(){
if(assignmentId != null && userId != null){
Integer external = (Integer) externalRateField.getValue().intValue();
timelineService.setUserAssignmentRate(userId, assignmentId, external,new AsyncCallback<Void>(){
@Override public void onFailure(Throwable caught) {
MessageBox.info("ERROR",caught.getMessage(),null);
}
@Override public void onSuccess(Void result) {
Info.display("OK","External cost updated");
loadUserAssignmentCheckGrid();
}
});
}
}
}