diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java index 55de35a24..e3f1ae11f 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java @@ -1606,4 +1606,14 @@ public abstract class OrderElement extends IntegrationEntity implements return sumChargedEffort.isFinishedTimesheets(); } + @Override + public boolean isUpdatedFromTimesheets() { + TaskElement taskElement = getTaskElement(); + if (taskElement == null) { + return false; + } + + return taskElement.isUpdatedFromTimesheets(); + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java index b201fe655..faf62a494 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java @@ -158,6 +158,11 @@ public class OrderLineGroup extends OrderElement implements return false; } + @Override + public boolean isUpdatedFromTimesheets() { + return getThis().isUpdatedFromTimesheets(); + } + } public static OrderLineGroup create() { diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java index 2d350f74a..8152b32ea 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java @@ -590,4 +590,9 @@ public abstract class OrderElementTemplate extends BaseEntity implements public abstract boolean isOrderTemplate(); + @Override + public boolean isUpdatedFromTimesheets() { + return false; + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java index cf8b62b7d..16e020a3c 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java @@ -100,6 +100,11 @@ public class OrderLineGroupTemplate extends OrderElementTemplate implements return false; } + @Override + public boolean isUpdatedFromTimesheets() { + return false; + } + } public static OrderLineGroupTemplate createNew() { diff --git a/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java b/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java index f27bb8d54..bd6facd23 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java +++ b/libreplan-business/src/main/java/org/libreplan/business/trees/ITreeNode.java @@ -60,4 +60,6 @@ public interface ITreeNode> { */ boolean isEmptyLeaf(); + boolean isUpdatedFromTimesheets(); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java index 2a8e41928..f4d1d7f8e 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java @@ -41,7 +41,6 @@ import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLine; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.business.orders.entities.SchedulingState; -import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.business.requirements.entities.CriterionRequirement; import org.libreplan.business.templates.entities.OrderElementTemplate; import org.libreplan.business.users.entities.UserRole; @@ -519,15 +518,6 @@ public class OrderElementTreeController extends TreeController { super.removeCodeTextbox(key); } - @Override - protected boolean isUpdatedFromTimesheets(OrderElement currentElement) { - TaskElement taskElement = currentElement.getTaskElement(); - if (taskElement != null) { - return taskElement.isUpdatedFromTimesheets(); - } - return false; - } - } @Override diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java index 352b5b85a..f86df4495 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java @@ -169,12 +169,6 @@ public class TemplatesTreeController extends return currentElement.getSchedulingState(); } - @Override - protected boolean isUpdatedFromTimesheets( - OrderElementTemplate currentElement) { - return false; - } - } public TemplatesTreeController(IOrderTemplatesModel model, diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java b/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java index 4c76fe68b..f8681f3a0 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java @@ -116,6 +116,7 @@ public abstract class TreeController> extends viewStateSnapshot = TreeViewStateSnapshot.takeSnapshot(tree); getModel().indent(element); filterByPredicateIfAny(); + updateControlButtons(); } public TreeModel getTreeModel() { @@ -140,6 +141,7 @@ public abstract class TreeController> extends viewStateSnapshot = TreeViewStateSnapshot.takeSnapshot(tree); getModel().unindent(element); filterByPredicateIfAny(); + updateControlButtons(); } public void up() { @@ -153,6 +155,7 @@ public abstract class TreeController> extends viewStateSnapshot = TreeViewStateSnapshot.takeSnapshot(tree); getModel().up(element); filterByPredicateIfAny(); + updateControlButtons(); } public void down() { @@ -165,6 +168,7 @@ public abstract class TreeController> extends viewStateSnapshot = TreeViewStateSnapshot.takeSnapshot(tree); getModel().down(element); filterByPredicateIfAny(); + updateControlButtons(); } public T getSelectedNode() { @@ -350,6 +354,15 @@ public abstract class TreeController> extends private List columns; + private Button btnNewFromTemplate; + + private Button downButton; + + private Button upButton; + + private Button leftButton; + + private Button rightButton; protected TreeViewStateSnapshot getSnapshotOfOpenedNodes() { return viewStateSnapshot; @@ -357,6 +370,13 @@ public abstract class TreeController> extends private void resetControlButtons() { btnNew.setDisabled(isNewButtonDisabled()); + btnNewFromTemplate.setDisabled(isNewButtonDisabled()); + + boolean disabled = readOnly || isPredicateApplied(); + downButton.setDisabled(disabled); + upButton.setDisabled(disabled); + leftButton.setDisabled(disabled); + rightButton.setDisabled(disabled); } protected abstract boolean isNewButtonDisabled(); @@ -763,7 +783,7 @@ public abstract class TreeController> extends SchedulingStateToggler schedulingStateToggler = new SchedulingStateToggler( schedulingState); schedulingStateToggler.setReadOnly(readOnly - || isUpdatedFromTimesheets(currentElement)); + || currentElement.isUpdatedFromTimesheets()); final Treecell cell = addCell( getDecorationFromState(getSchedulingStateFrom(currentElement)), schedulingStateToggler); @@ -1143,8 +1163,6 @@ public abstract class TreeController> extends } - protected abstract boolean isUpdatedFromTimesheets(T currentElement); - } public void setColumns(List columns) { @@ -1192,17 +1210,40 @@ public abstract class TreeController> extends /** * Disable control buttons (new, up, down, indent, unindent, delete) */ - public void updateControlButtons(Event event) { - updateControlButtons((Tree) event.getTarget()); - } - - public void updateControlButtons(Tree tree) { - final Treeitem item = tree.getSelectedItem(); - if (item == null) { + public void updateControlButtons() { + T element = getSelectedNode(); + if (element == null) { resetControlButtons(); return; } - btnNew.setDisabled(false); + Treeitem item = tree.getSelectedItem(); + + btnNew.setDisabled(isNewButtonDisabled() + || element.isUpdatedFromTimesheets()); + btnNewFromTemplate.setDisabled(isNewButtonDisabled() + || element.isUpdatedFromTimesheets()); + + boolean disabled = readOnly || isPredicateApplied(); + downButton.setDisabled(disabled || isLastItem(element)); + upButton.setDisabled(disabled || isFirstItem(element)); + + disabled |= element.isUpdatedFromTimesheets(); + leftButton.setDisabled(disabled + || isFirstLevelElement(item) + || element.getParent().isUpdatedFromTimesheets()); + + boolean previousSiblingIsUpdatedFromTimesheets = false; + try { + Treeitem previousItem = (Treeitem) item.getParent() + .getChildren().get(item.getIndex() - 1); + T previousSibling = type.cast(previousItem.getValue()); + previousSiblingIsUpdatedFromTimesheets = previousSibling + .isUpdatedFromTimesheets(); + } catch (IndexOutOfBoundsException e) { + // Do nothing + } + rightButton.setDisabled(disabled || isFirstItem(element) + || previousSiblingIsUpdatedFromTimesheets); } protected abstract boolean isPredicateApplied(); diff --git a/libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul b/libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul index ca0ca9c8d..17c919d3c 100644 --- a/libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul +++ b/libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul @@ -82,7 +82,7 @@