ItEr10S10CUCreacionDeOrganizacionsDeTraballo: Add CRUD and drag and drop operations to workorganization controller (work in progress)
* Data is loaded from a fake model * Delete and create operations need to get correct focus * Drag and drop will be done against model operations
This commit is contained in:
parent
28224f65f3
commit
18c6864aa8
5 changed files with 309 additions and 64 deletions
|
|
@ -1,10 +1,29 @@
|
|||
package org.navalplanner.web.workorders;
|
||||
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import java.awt.dnd.DragSourceEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.navalplanner.web.common.Util;
|
||||
import org.zkoss.ganttz.Task;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.event.DropEvent;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zk.ui.metainfo.EventHandlerMap;
|
||||
import org.zkoss.zk.ui.util.GenericForwardComposer;
|
||||
import org.zkoss.zul.Datebox;
|
||||
import org.zkoss.zul.SimpleTreeModel;
|
||||
import org.zkoss.zul.SimpleTreeNode;
|
||||
import org.zkoss.zul.Textbox;
|
||||
import org.zkoss.zul.TreeModel;
|
||||
import org.zkoss.zul.Treecell;
|
||||
import org.zkoss.zul.Treeitem;
|
||||
import org.zkoss.zul.TreeitemRenderer;
|
||||
import org.zkoss.zul.Treerow;
|
||||
import org.zkoss.zul.api.Tree;
|
||||
import org.zkoss.zul.api.Window;
|
||||
import org.zkoss.zul.event.TreeDataListener;
|
||||
|
||||
/**
|
||||
* Controller for {@link WorkOrganization} view of WorkOrder entitites <br />
|
||||
|
|
@ -12,19 +31,202 @@ import org.zkoss.zul.Treerow;
|
|||
*/
|
||||
public class WorkOrganizationController extends GenericForwardComposer {
|
||||
|
||||
private Tree tree;
|
||||
private WorkOrganizationModel model;
|
||||
private List taskWorkList = new ArrayList();
|
||||
private TaskWorkTreeitemRenderer renderer = new TaskWorkTreeitemRenderer();
|
||||
|
||||
public WorkOrganizationController() {
|
||||
}
|
||||
|
||||
public void move(Component self, Component dragged) {
|
||||
public TaskWorkTreeitemRenderer getRenderer() {
|
||||
return renderer;
|
||||
}
|
||||
|
||||
public WorkOrganizationController(Tree tree) {
|
||||
this.tree = tree;
|
||||
}
|
||||
|
||||
public void move(Component self, Component dragged) {
|
||||
/* if (self instanceof Treeitem) {
|
||||
if (dragged.getParent().getId().equals("right")) {
|
||||
self.insertBefore(dragged, self.getNextSibling());
|
||||
} else {
|
||||
self.insertBefore(dragged, self.getNextSibling());
|
||||
}
|
||||
} else {
|
||||
self.appendChild(dragged);
|
||||
} */
|
||||
|
||||
Treeitem elem = new Treeitem("Elemento");
|
||||
//elem.appendChild(dragged);
|
||||
self.appendChild(elem);
|
||||
}
|
||||
|
||||
if (self != null) {
|
||||
System.out.println("SELF: " + self.toString());
|
||||
}
|
||||
if (dragged != null) {
|
||||
System.out.println("DRAGGED: " + dragged.toString());
|
||||
}
|
||||
|
||||
self.appendChild(elem);
|
||||
}
|
||||
|
||||
public void addTaskWork() {
|
||||
if (tree == null) {
|
||||
System.out.println("Tree is null");
|
||||
} else {
|
||||
int index = tree.getSelectedCount();
|
||||
taskWorkList.add(
|
||||
index,
|
||||
new SimpleTreeNode(new TaskWork("Nueva tarea", null, null, 10), new ArrayList()));
|
||||
this.tree.setModel(this.model);
|
||||
}
|
||||
Util.reloadBindings(tree);
|
||||
}
|
||||
|
||||
public void removeTaskWork() {
|
||||
if (tree == null) {
|
||||
System.out.println("Tree is null");
|
||||
} else {
|
||||
if (!(taskWorkList.isEmpty())) {
|
||||
// Handle subchildren!
|
||||
int index = tree.getSelectedCount();
|
||||
// System.out.println(
|
||||
// "TREE+ "+tree.getSelectedItems().toArray().toString());
|
||||
|
||||
taskWorkList.remove(index);
|
||||
|
||||
this.tree.setModel(this.model);
|
||||
}
|
||||
}
|
||||
Util.reloadBindings(tree);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAfterCompose(Component comp) throws Exception {
|
||||
super.doAfterCompose(comp);
|
||||
comp.setVariable("controller", this, true);
|
||||
|
||||
// Get real TaskWorkList
|
||||
List children1 = new ArrayList();
|
||||
|
||||
children1.add(new SimpleTreeNode(new TaskWork("uno", null, null, 10), new ArrayList()));
|
||||
children1.add(new SimpleTreeNode(new TaskWork("dos", null, null, 10), new ArrayList()));
|
||||
children1.add(new SimpleTreeNode(new TaskWork("tres", null, null, 10), new ArrayList()));
|
||||
children1.add(new SimpleTreeNode(new TaskWork("cuatro", null, null, 10), new ArrayList()));
|
||||
|
||||
SimpleTreeNode stn1 =
|
||||
new SimpleTreeNode(new TaskWork("uno", null, null, 10), children1);
|
||||
SimpleTreeNode stn2 =
|
||||
new SimpleTreeNode(new TaskWork("dos", null, null, 10), children1);
|
||||
SimpleTreeNode stn3 =
|
||||
new SimpleTreeNode(new TaskWork("tres", null, null, 10), new ArrayList());
|
||||
SimpleTreeNode stn4 =
|
||||
new SimpleTreeNode(new TaskWork("cuatro", null, null, 10), children1);
|
||||
|
||||
taskWorkList.add(stn1);
|
||||
taskWorkList.add(stn2);
|
||||
taskWorkList.add(stn3);
|
||||
taskWorkList.add(stn4);
|
||||
|
||||
this.model = new WorkOrganizationModel(taskWorkList);
|
||||
|
||||
// Set model (annalize parameter values)
|
||||
// this.model = new WorkOrganizationModel(taskWorkList);
|
||||
// this.tree.setModel(this.model);
|
||||
}
|
||||
|
||||
public WorkOrganizationModel getTasksWork() {
|
||||
return this.model;
|
||||
}
|
||||
|
||||
// -------------------------------------------------
|
||||
// -------------------------------------------------
|
||||
public class TaskWork {
|
||||
|
||||
private String name;
|
||||
private Date startDate;
|
||||
private Date endDate;
|
||||
private int hours;
|
||||
|
||||
public TaskWork(String name, Date startdate, Date enddate, int hours) {
|
||||
this.name = name;
|
||||
this.startDate = startdate;
|
||||
this.endDate = enddate;
|
||||
this.hours = hours;
|
||||
}
|
||||
|
||||
public Date getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public int getHours() {
|
||||
return hours;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Date getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------
|
||||
// -------------------------------------------------
|
||||
public class TaskWorkTreeitemRenderer implements TreeitemRenderer {
|
||||
|
||||
public void TaskWorkTreeitemRenderer() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Treeitem item, Object data) throws Exception {
|
||||
SimpleTreeNode t = (SimpleTreeNode) data;
|
||||
TaskWork taskWork = (TaskWork) t.getData();
|
||||
//Contruct treecells
|
||||
Treecell tcName = new Treecell(taskWork.getName());
|
||||
tcName.appendChild(new Textbox(taskWork.getName()));
|
||||
Treecell tcAccountId = new Treecell();
|
||||
tcAccountId.appendChild(new Textbox("" + taskWork.getHours()));
|
||||
Treecell tcDateStart = new Treecell();
|
||||
tcDateStart.appendChild(new Datebox(taskWork.getStartDate()));
|
||||
Treecell tcDateEnd = new Treecell();
|
||||
tcDateStart.appendChild(new Datebox(taskWork.getEndDate()));
|
||||
Treerow tr = null;
|
||||
/*
|
||||
* Since only one treerow is allowed, if treerow is not null,
|
||||
* append treecells to it. If treerow is null, contruct a new
|
||||
* treerow and attach it to item.
|
||||
*/
|
||||
if (item.getTreerow() == null) {
|
||||
tr = new Treerow();
|
||||
tr.setParent(item);
|
||||
} else {
|
||||
tr = item.getTreerow();
|
||||
tr.getChildren().clear();
|
||||
}
|
||||
//Attach treecells to treerow
|
||||
tr.setDraggable("true");
|
||||
tr.setDroppable("true");
|
||||
|
||||
tcName.setParent(tr);
|
||||
tcDateStart.setParent(tr);
|
||||
tcDateEnd.setParent(tr);
|
||||
tcAccountId.setParent(tr);
|
||||
item.setOpen(false);
|
||||
|
||||
tr.addEventListener("onDrop", new EventListener() {
|
||||
|
||||
@Override
|
||||
public void onEvent(org.zkoss.zk.ui.event.Event arg0) throws Exception {
|
||||
DropEvent dropEvent = (DropEvent) arg0;
|
||||
move((Component) dropEvent.getTarget(),
|
||||
(Component) dropEvent.getDragged());
|
||||
System.out.println("Dragging"+dropEvent.toString());
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package org.navalplanner.web.workorders;
|
||||
|
||||
import java.util.List;
|
||||
import org.zkoss.zul.SimpleTreeModel;
|
||||
import org.zkoss.zul.SimpleTreeNode;
|
||||
import org.zkoss.zul.TreeModel;
|
||||
import org.zkoss.zul.event.TreeDataListener;
|
||||
|
||||
/**
|
||||
* Model for WorkOrganization <br />
|
||||
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
|
||||
* Pending of real implementation of methods
|
||||
*/
|
||||
public class WorkOrganizationModel extends SimpleTreeModel {
|
||||
|
||||
public WorkOrganizationModel(List children) {
|
||||
super(new SimpleTreeNode("Root", children));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -74,6 +74,6 @@
|
|||
|
||||
<div self="@{insert(content)}"/>
|
||||
|
||||
<n:div class="footer">© Fundación para o Fomento da Calidade Industrial e
|
||||
Desenvolvemento Tecnolóxico de Galicia. Xunta de Galicia</n:div>
|
||||
<div class="footer">© Fundación para o Fomento da Calidade Industrial e
|
||||
Desenvolvemento Tecnolóxico de Galicia. Xunta de Galicia</div>
|
||||
</div>
|
||||
|
|
@ -20,6 +20,9 @@
|
|||
<button label="Remove"
|
||||
onClick="controller.confirmRemove(self.parent.parent.value);">
|
||||
</button>
|
||||
<button label="Details"
|
||||
href="/workorders/workorganization.zul">
|
||||
</button>
|
||||
</hbox>
|
||||
<label value="@{project.name}" />
|
||||
<label value="@{project.initDate}" />
|
||||
|
|
|
|||
|
|
@ -7,64 +7,84 @@
|
|||
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
|
||||
<zk>
|
||||
<window self="@{define(content)}"
|
||||
apply="org.navalplanner.web.workorders.WorkOrganizationController">
|
||||
<tree id="tree" width="600px" rows="8" multiple="true"
|
||||
droppable="true" onDrop="controller.move(self, event.dragged)">
|
||||
<treecols sizable="true">
|
||||
<treecol label="Name" />
|
||||
<treecol label="Description" />
|
||||
</treecols>
|
||||
<treechildren>
|
||||
<treeitem>
|
||||
<treerow draggable="true">
|
||||
<treecell label=" Task 1 ">
|
||||
<textbox value="Task 1 Name" width="230px"/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<textbox value="10" width="30px"/> hours
|
||||
</treecell>
|
||||
</treerow>
|
||||
</treeitem>
|
||||
<treeitem>
|
||||
<treerow draggable="true">
|
||||
<treecell label=" Task 2 " >
|
||||
<textbox value="Task 2 Name" width="230px"/>
|
||||
</treecell>
|
||||
<treecell>--- hours </treecell>
|
||||
</treerow>
|
||||
<treechildren>
|
||||
<treeitem>
|
||||
<treerow draggable="true">
|
||||
<treecell label="Task 2.1 " >
|
||||
<textbox value="Task 1 Name" width="200px"/>
|
||||
</treecell>
|
||||
</treerow>
|
||||
<treechildren>
|
||||
<treeitem>
|
||||
<treerow draggable="true" droppable="true">
|
||||
<treecell label="Task 2.1.1 " >
|
||||
<textbox value="Task 2.1.1 Name" width="170px"/>
|
||||
</treecell>
|
||||
</treerow>
|
||||
</treeitem>
|
||||
<treeitem>
|
||||
<treerow draggable="true">
|
||||
<treecell label="Item 2.1.2" />
|
||||
</treerow>
|
||||
</treeitem>
|
||||
</treechildren>
|
||||
</treeitem>
|
||||
<treeitem>
|
||||
<treerow draggable="true">
|
||||
<treecell label="Item 2.2" />
|
||||
</treerow>
|
||||
</treeitem>
|
||||
</treechildren>
|
||||
</treeitem>
|
||||
</treechildren>
|
||||
</tree>
|
||||
|
||||
</window>
|
||||
apply="org.navalplanner.web.workorders.WorkOrganizationController"
|
||||
title="Organización de traballo">
|
||||
<vbox>
|
||||
<label value="@{project.name}" />
|
||||
<label value="@{project.initDate}" />
|
||||
<label value="@{project.endDate}" />
|
||||
<label value="@{project.responsible}" />
|
||||
<label value="@{project.customer}" />
|
||||
<label value="@{project.description}" />
|
||||
</vbox>
|
||||
<vbox>
|
||||
<hbox>
|
||||
<button label="Nova tarefa"
|
||||
onClick="controller.addTaskWork();">
|
||||
</button>
|
||||
<button label="Eliminar tarefa"
|
||||
onClick="controller.removeTaskWork();">
|
||||
</button>
|
||||
<button label="Convertir en subtarefa"
|
||||
onClick="controller.addTask(self.parent.parent.value);">
|
||||
</button>
|
||||
<button label="Baixar"
|
||||
onClick="controller.addTask(self.parent.parent.value);">
|
||||
</button>
|
||||
<button label="Subir"
|
||||
onClick="controller.addTask(self.parent.parent.value);">
|
||||
</button>
|
||||
</hbox>
|
||||
</vbox>
|
||||
<vbox>
|
||||
<tree id="tree" width="900px" multiple="true"
|
||||
droppable="true" onDrop="controller.move(self, event.dragged)"
|
||||
model="@{controller.tasksWork}"
|
||||
treeitemRenderer="@{controller.renderer}"
|
||||
pageSize="5">
|
||||
<treecols sizable="true">
|
||||
<treecol label="Nome e descripción" />
|
||||
<treecol label="Comezo estimado" />
|
||||
<treecol label="Fin estimado" />
|
||||
<treecol label="Horas" />
|
||||
</treecols>
|
||||
<!--treechildren>
|
||||
<treeitem>
|
||||
<treerow draggable="true" self="@{each='taskWork'}" value="@{taskWork}">
|
||||
<treecell label="@{taskWork.name}">
|
||||
<textbox value="Task 1 Name" width="230px"/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<datebox/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<datebox/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<textbox value="10" width="30px"/> hours
|
||||
</treecell>
|
||||
</treerow>
|
||||
</treeitem>
|
||||
<treeitem>
|
||||
<treerow draggable="true">
|
||||
<treecell label=" Task 1 ">
|
||||
<textbox value="Task 1 Name" width="230px"/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<datebox/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<datebox/>
|
||||
</treecell>
|
||||
<treecell>
|
||||
<textbox value="10" width="30px"/> hours
|
||||
</treecell>
|
||||
</treerow>
|
||||
</treeitem>
|
||||
</treechildren-->
|
||||
</tree>
|
||||
</vbox>
|
||||
</window>
|
||||
<!--zscript>
|
||||
void move(Component dragged) {
|
||||
if (self instanceof Treerow) {
|
||||
|
|
@ -74,4 +94,4 @@
|
|||
}
|
||||
}
|
||||
</zscript-->
|
||||
</zk>
|
||||
</zk>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue