/*******************************************************************************
* 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.ArrayList;
import java.util.List;
import org.opensheet.client.exceptions.ParentTimelineIsNullException;
import org.opensheet.client.exceptions.ParentTimelineTooSmallException;
import org.opensheet.client.services.DepartmentService;
import org.opensheet.client.services.DepartmentServiceAsync;
import org.opensheet.client.services.TimelineService;
import org.opensheet.client.services.TimelineServiceAsync;
import org.opensheet.client.utils.Resources;
import org.opensheet.client.widges.BranchComboBox;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.ModelData;
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.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
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.FormPanel;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
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.toolbar.LabelToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.view.client.SelectionModel;
public class AssignmentDepartmentPanel extends ContentPanel {
private BranchComboBox branchComboBox;
private Integer branchId = 9999999;
private Integer assignmentId,departmentId;
private Grid<BaseModel> departmentGrid;
private DepartmentServiceAsync departmentService = GWT.create(DepartmentService.class);
final private TimelineServiceAsync timelineService = GWT.create(TimelineService.class);
private FormPanel fp;
private NumberField timelineField,timelineOverTimeField,hourSumField;
public AssignmentDepartmentPanel(){
setWidth(700);
setHeight(300);
setFrame(true);
setHeaderVisible(false);
setBodyBorder(false);
setButtonAlign(HorizontalAlignment.CENTER);
setLayout(new ColumnLayout());
doDepartmentPanel();
doDetailPanel();
}
private void doDepartmentPanel(){
ToolBar tb = new ToolBar();
branchComboBox = new BranchComboBox(true);
branchComboBox.setEmptyText("all");
branchComboBox.addSelectionChangedListener(new SelectionChangedListener<BeanModel>(){
@Override public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
branchId = Integer.parseInt(se.getSelectedItem().get("id").toString());
populateDepartmentGrid();
}
});
tb.add(new LabelToolItem("Choose Branch: "));
tb.add(branchComboBox);
Button xlsExportButton = new Button();
xlsExportButton.setText("Excel Export");
xlsExportButton.setIcon(Resources.ICONS.table());
xlsExportButton.addListener(Events.Select, new Listener<BaseEvent>(){
@Override
public void handleEvent(BaseEvent be) {
com.google.gwt.user.client.Window.Location.assign(GWT.getHostPageBaseURL().toString() +"departmentassignmenttoxls.htm?assignment_id="+assignmentId+"&branch_id"+branchId);
}
});
tb.add(xlsExportButton);
setTopComponent(tb);
doDepartmentGrid();
}
private void doDepartmentGrid(){
List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig depsConfig = new ColumnConfig("name", "Department", 150);
depsConfig.setSortable(false);
depsConfig.setMenuDisabled(true);
configs.add(depsConfig);
ColumnModel cm = new ColumnModel(configs);
departmentGrid = new Grid<BaseModel>(new ListStore<BaseModel>(), cm);
departmentGrid.setLoadMask(true);
departmentGrid.setWidth(300);
departmentGrid.setHeight(260);
departmentGrid.addStyleName(".my-table-style");
departmentGrid.setBorders(true);
departmentGrid.setAutoExpandColumn("name");
departmentGrid.getView().setEmptyText("no data");
departmentGrid.setId("departmentGridId");
departmentGrid.getSelectionModel().addListener(Events.SelectionChange, new Listener<SelectionChangedEvent<ModelData>>() {
public void handleEvent(SelectionChangedEvent<ModelData> be) {
if (be.getSelection().size() > 0) {
departmentId = Integer.parseInt(departmentGrid.getSelectionModel().getSelectedItem().get("id").toString());
populateDepartmentTimelinePanel();
}
}
});
add(departmentGrid);
}
public void setData(Integer assignmentId){
this.assignmentId = assignmentId;
populateDepartmentGrid();
}
private void populateDepartmentGrid(){
departmentService.getDepartmentsBaseModelByAssignemntAndByBranch(assignmentId,branchId, new AsyncCallback<List<BaseModel>>(){
@Override public void onFailure(Throwable caught) { }
@Override public void onSuccess(List<BaseModel> result) {
departmentGrid.getStore().removeAll();
if(result != null){
for(BaseModel bm: result){
if(bm.get("selected").equals(true)) {
departmentGrid.getStore().add(bm);
}
}
}else{
MessageBox.info("Error", "answer is null", null);
}
}
});
}
private void doDetailPanel(){
fp = new FormPanel();
fp.setHeight(260);
fp.setWidth(300);
fp.setHeaderVisible(false);
LayoutContainer main = new LayoutContainer();
main.setLayout(new ColumnLayout());
LayoutContainer left = new LayoutContainer();
left.setStyleAttribute("paddingRight", "10px");
FormLayout layout = new FormLayout();
layout.setLabelAlign(LabelAlign.TOP);
left.setLayout(layout);
LayoutContainer right = new LayoutContainer();
right.setStyleAttribute("paddingLeft", "10px");
layout = new FormLayout();
layout.setLabelAlign(LabelAlign.TOP);
right.setLayout(layout);
timelineField = new NumberField();
timelineField.setFieldLabel("Timeline");
timelineField.setEditable(true);
left.add(timelineField,new FormData(100, 22));
hourSumField = new NumberField();
hourSumField.setFieldLabel("Hour Sum");
hourSumField.setEditable(false);
right.add(hourSumField,new FormData(100, 22));
timelineOverTimeField = new NumberField();
timelineOverTimeField.setFieldLabel("Over Time");
timelineOverTimeField.setEditable(false);
right.add(timelineOverTimeField,new FormData(100, 22));
main.add(left, new ColumnData(.5));
main.add(right, new ColumnData(.5));
fp.add(main);
Button save = new Button("Save");
save.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override public void componentSelected(ButtonEvent ce) {
System.out.println("click");
setAssignmentDepartmentTimeline();
}
});
Button reload = new Button("Reload");
reload.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override public void componentSelected(ButtonEvent ce) {
populateDepartmentTimelinePanel();
}
});
fp.addButton(save);
fp.addButton(reload);
add(fp);
}
private void populateDepartmentTimelinePanel(){
fp.clear();
if(assignmentId != null && departmentId != null){
timelineService.getAssignmentDepartmentDetail(assignmentId, departmentId, new AsyncCallback<BaseModel>(){
@Override public void onFailure(Throwable caught) {
MessageBox.info("Error","Somethings wrong, ask your support",null);
}
@Override public void onSuccess(BaseModel result) {
Integer timeline = Integer.parseInt(result.get("timeline").toString());
Integer sum = Integer.parseInt(result.get("sum").toString());
Integer overtime = 0;
if(sum > timeline){
overtime = sum - timeline;
timelineOverTimeField.setValue(overtime);
timelineOverTimeField.setInputStyleAttribute("color", "red");
}
timelineField.setValue(timeline);
hourSumField.setValue(sum);
}
});
}
}
private void setAssignmentDepartmentTimeline(){
System.out.println("assignmentId :" + assignmentId + " departmentId :" + departmentId);
Integer timeline = timelineField.getValue().intValue();
if(assignmentId != null && departmentId != null){
timelineService.setAssignmentDepartmentTimeline(assignmentId, departmentId, timeline, false, new AsyncCallback<BaseModel>(){
@Override public void onFailure(Throwable caught) {
if(caught instanceof ParentTimelineIsNullException){
MessageBox.info("Error",caught.getMessage(),null);
}else if(caught instanceof ParentTimelineTooSmallException){
MessageBox.info("Error",caught.getMessage(),null);
}else{
MessageBox.info("Error",caught.getMessage(),null);
}
}
@Override public void onSuccess(BaseModel result) {
Info.display("Success","OK");
}
});
}
}
}