package org.opensheet.client.widges.admin.tools;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.opensheet.client.dto.UserDTO;
import org.opensheet.client.dto.grid.AssignmentGridTemplate;
import org.opensheet.client.services.AssignmentService;
import org.opensheet.client.services.AssignmentServiceAsync;
import org.opensheet.client.services.HourService;
import org.opensheet.client.services.HourServiceAsync;
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.BranchComboBox;
import com.extjs.gxt.ui.client.Style.HideMode;
import com.extjs.gxt.ui.client.Style.SelectionMode;
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.ModelIconProvider;
import com.extjs.gxt.ui.client.data.RpcProxy;
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.TreeStore;
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.TabItem;
import com.extjs.gxt.ui.client.widget.button.Button;
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.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.ColumnLayout;
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.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
public class ExternalRatePanel extends ContentPanel{
private Grid<BeanModel> grid;
private UserServiceAsync userService = GWT.create(UserService.class);
private TimelineServiceAsync timelineService = GWT.create(TimelineService.class);
private ListLoader<?> loader;
private String usersRpcCriteria = "1";
private Integer selectedBranch = 1;
private BranchComboBox toolBarBranchComboBox;
private NumberField internalRate,externalRate;
private Integer userId;
private DateField start,end;
private TreeGrid<ModelData> tree;
private TreeStore<ModelData> store;
public ExternalRatePanel(){
setHideMode(HideMode.OFFSETS);
this.setWidth(1024);
this.setHeight(600);
this.setLayout(new ColumnLayout());
this.add(doUserGrid());
this.add(doRatePanel());
grid.getStore().getLoader().load();
}
private ContentPanel doUserGrid(){
ContentPanel cp = new ContentPanel();
cp.setHeaderVisible(false);
cp.setHeight(600);
cp.setWidth(380);
cp.setFrame(true);
cp.setTopComponent(doToolBar());
cp.add(doGrid());
return cp;
}
private Grid<BeanModel> doGrid(){
RpcProxy<List<UserDTO>> UserProxy = new RpcProxy<List<UserDTO>>() {
@Override
protected void load(Object loadConfig, AsyncCallback<List<UserDTO>> callback) {
userService.getUsersByBranch(usersRpcCriteria,selectedBranch,callback);
}
};
loader = new BaseListLoader<ListLoadResult<ModelData>>(UserProxy,new BeanModelReader());
final ListStore<BeanModel> UserStore = new ListStore<BeanModel>(loader);
UserStore.setMonitorChanges(true);
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
columns.add(new ColumnConfig("login", "Login", 80));
columns.add(new ColumnConfig("fullName", "Name", 150));
columns.add(new ColumnConfig("status", "Status", 60));
columns.add(new ColumnConfig("department.name", "Department", 80));
ColumnModel cm = new ColumnModel(columns);
grid = new Grid<BeanModel>(UserStore, cm);
grid.setLoadMask(true);
grid.setWidth(380);
grid.setHeight(600);
grid.addStyleName(".my-table-style");
grid.setBorders(true);
grid.setAutoExpandColumn("login");
grid.getView().setEmptyText("no data");
grid.setId("myGridid");
grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
grid.getSelectionModel().addListener(Events.SelectionChange,new Listener<SelectionChangedEvent<BeanModel>>(){
@Override
public void handleEvent(SelectionChangedEvent<BeanModel> be) {
if (be.getSelection().size() > 0) {
userId = Integer.parseInt(grid.getSelectionModel().getSelectedItem().get("id").toString());
setExternalRateFieldValue();
}
}
});
return grid;
}
private ToolBar doToolBar(){
ToolBar toolBar = new ToolBar();
toolBar.add(new LabelToolItem("User 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("Active");
type.addListener(Events.Change, new Listener<FieldEvent>() {
@Override
public void handleEvent(FieldEvent be) {
if(type.getSimpleValue().equals("EveryBody")){
usersRpcCriteria = "any";
}else if(type.getSimpleValue().equals("Active")){
usersRpcCriteria = "1";
}else if(type.getSimpleValue().equals("Killed in Action")){
usersRpcCriteria = "0";
}
grid.getStore().getLoader().load();
}
});
toolBar.add(type);
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);
return toolBar;
}
@SuppressWarnings("deprecation")
public FormPanel doRatePanel(){
FormPanel cp = new FormPanel();
cp.setHeaderVisible(false);
cp.setHeight(500);
cp.setWidth(640);
cp.setFrame(true);
ToolBar toolBar = new ToolBar();
toolBar.add(new LabelToolItem("From: "));
Date startDate = new Date();
startDate.setMonth(startDate.getMonth()-5);
start =new DateField();
start.setValue(startDate);
start.setWidth(100);
toolBar.add(start);
toolBar.add(new LabelToolItem("To: "));
end =new DateField();
end.setWidth(100);
end.setValue(new Date());
toolBar.add(end);
toolBar.add(new LabelToolItem("Internal Rate: "));
internalRate = new NumberField();
internalRate.setWidth(60);
toolBar.add(internalRate);
toolBar.add(new LabelToolItem("External Rate: "));
externalRate = new NumberField();
externalRate.setWidth(60);
toolBar.add(externalRate);
Button loadAssignmentTreeBtn = new Button("Load");
loadAssignmentTreeBtn.setIcon(Resources.ICONS.project_icon());
loadAssignmentTreeBtn.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override
public void componentSelected(ButtonEvent ce) {
loadAssignmentTreeGrid();
}
});
toolBar.add(loadAssignmentTreeBtn);
cp.setTopComponent(toolBar);
cp.add(doAssignmentTree());
Button saveInternal = new Button("Save Internal Rate");
saveInternal.setIcon(Resources.ICONS.reload());
saveInternal.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override
public void componentSelected(ButtonEvent ce) {
timelineService.recalculateInternalRate(userId, internalRate.getValue().intValue(), start.getValue(), end.getValue(),new AsyncCallback<Void>(){
@Override
public void onFailure(Throwable caught) {
MessageBox.info("ERROR",caught.getMessage(),null);
}
@Override
public void onSuccess(Void result) {
Info.display("OK","Updated");
}
});
}
});
cp.addButton(saveInternal);
Button saveExternal = new Button("Save External Rate");
saveExternal.setIcon(Resources.ICONS.reload());
saveExternal.addSelectionListener(new SelectionListener<ButtonEvent>(){
@Override
public void componentSelected(ButtonEvent ce) {
timelineService.recalculateInternalRate(userId, externalRate.getValue().intValue(), start.getValue(), end.getValue(),new AsyncCallback<Void>(){
@Override
public void onFailure(Throwable caught) {
MessageBox.info("ERROR",caught.getMessage(),null);
}
@Override
public void onSuccess(Void result) {
Info.display("OK","Updated");
}
});
}
});
cp.addButton(saveExternal);
return cp;
}
private void setExternalRateFieldValue(){
timelineService.getUserInternalRate(userId, new AsyncCallback<Integer>(){
@Override
public void onFailure(Throwable caught) {
MessageBox.info("ERROR",caught.getMessage(),null);
}
@Override
public void onSuccess(Integer result) {
internalRate.setValue(result);
}
});
}
private TreeGrid<ModelData> doAssignmentTree(){
ColumnConfig name = new ColumnConfig("name", "Name", 100);
name.setRenderer(new TreeGridCellRenderer<ModelData>());
ColumnConfig hours = new ColumnConfig("hours", "Hours", 80);
ColumnConfig inrate = new ColumnConfig("inrate", "Inrate", 80);
ColumnConfig exrate = new ColumnConfig("exrate", "Exrate", 80);
ColumnModel cm = new ColumnModel(Arrays.asList(name, hours, inrate,exrate));
store = new TreeStore<ModelData>();
tree = new TreeGrid<ModelData>(store, cm);
tree.setBorders(true);
tree.setAutoExpandColumn("name");
tree.setTrackMouseOver(false);
tree.setLoadMask(true);
tree.setWidth(630);
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) {
}
});
return tree;
}
public void loadAssignmentTreeGrid(){
tree.getStore().removeAll();
final HourServiceAsync hourService = GWT.create(HourService.class);
hourService.getHoursByUserAndByAssignmentOnPeriod(userId, start.getValue(), end.getValue(), new AsyncCallback<AssignmentGridTemplate>(){
@Override
public void onFailure(Throwable caught) {
MessageBox.info("ERROR", caught.getMessage(), null);
}
@Override
public void onSuccess(AssignmentGridTemplate result) {
if(result != null){
store.add(result.getChildren(), true);
}
}
});
}
}