diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java index e82c5572a..961242c91 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java @@ -34,6 +34,7 @@ import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.qualityforms.entities.QualityForm; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionType; +import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.business.templates.entities.OrderTemplate; /** @@ -106,9 +107,12 @@ public interface IOrderModel { void prepareCreationFrom(OrderTemplate template); + OrderElement createFrom(OrderLineGroup parent, OrderElementTemplate template); + List getExternalCompaniesAreClient(); void setExternalCompany(ExternalCompany externalCompany); public String gettooltipText(Order order); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java index 0a5b62ff7..d6edec0dd 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java @@ -34,14 +34,16 @@ import org.apache.commons.lang.StringUtils; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.OrderLine; +import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.orders.entities.SchedulingState; -import org.navalplanner.business.orders.entities.SchedulingState.ITypeChangedListener; -import org.navalplanner.business.orders.entities.SchedulingState.Type; import org.navalplanner.business.requirements.entities.CriterionRequirement; +import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.web.common.Util; import org.navalplanner.web.common.Util.Getter; import org.navalplanner.web.common.Util.Setter; import org.navalplanner.web.common.components.bandboxsearch.BandboxSearch; +import org.navalplanner.web.orders.assigntemplates.TemplateFinderPopup; +import org.navalplanner.web.orders.assigntemplates.TemplateFinderPopup.IOnResult; import org.navalplanner.web.templates.IOrderTemplatesControllerEntryPoints; import org.navalplanner.web.tree.TreeController; import org.zkoss.zk.ui.Component; @@ -110,6 +112,19 @@ public class OrderElementTreeController extends TreeController { } } + public void createFromTemplate() { + templateFinderPopup.openForSubElemenetCreation(tree, "after_pointer", + new IOnResult() { + @Override + public void found(OrderElementTemplate template) { + OrderLineGroup parent = (OrderLineGroup) getModel() + .getRoot(); + orderModel.createFrom(parent, template); + getModel().addNewlyAddedChildrenOf(parent); + } + }); + } + private void createTemplate(OrderElement selectedNode) { if (!selectedNode.isNewObject()) { orderTemplates.goToCreateTemplateFrom(selectedNode); @@ -156,6 +171,8 @@ public class OrderElementTreeController extends TreeController { filter, new HashMap()); filterComponent.setVariable("treeController", this, true); bdFilter = (BandboxSearch) filterComponent.getFellow("bdFilter"); + templateFinderPopup = (TemplateFinderPopup) comp + .getFellow("templateFinderPopupAtTree"); } public class OrderElementTreeitemRenderer extends Renderer { @@ -436,6 +453,8 @@ public class OrderElementTreeController extends TreeController { Tab tabGeneralData; + private TemplateFinderPopup templateFinderPopup; + private void selectDefaultTab() { tabGeneralData.setSelected(true); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java index 1767236d1..e2823bd45 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java @@ -66,6 +66,7 @@ import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.templates.daos.IOrderElementTemplateDAO; +import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.business.templates.entities.OrderTemplate; import org.navalplanner.business.users.daos.IOrderAuthorizationDAO; import org.navalplanner.business.users.daos.IUserDAO; @@ -389,6 +390,28 @@ public class OrderModel implements IOrderModel { this.order.setCode(code); } + @Override + @Transactional(readOnly = true) + public OrderElement createFrom(OrderLineGroup parent, + OrderElementTemplate template) { + loadNeededDataForConversation(); + OrderElementTemplate templateReloaded = templateDAO + .findExistingEntity(template.getId()); + OrderElement result = templateReloaded.createElement(parent); + if (isCodeAutogenerated()) { + setAllCodeToNull(result); + } + forceLoadAdvanceAssignmentsAndMeasurements(result); + return result; + } + + private void setAllCodeToNull(OrderElement result) { + result.setCode(null); + for (OrderElement each : result.getChildren()) { + setAllCodeToNull(each); + } + } + @Override @Transactional public void save() throws ValidationException { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrdersTreeComponent.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrdersTreeComponent.java index 4aec778fc..9da2a1db8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrdersTreeComponent.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrdersTreeComponent.java @@ -98,4 +98,8 @@ public class OrdersTreeComponent extends TreeComponent { return columns; } + @Override + public boolean isCreateFromTemplateEnabled() { + return true; + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/EntitiesTree.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/EntitiesTree.java index 7d6cf5919..b7b5ca5e8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/EntitiesTree.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/EntitiesTree.java @@ -70,6 +70,10 @@ public abstract class EntitiesTree> { return tree; } + public T getRoot() { + return tree.getRoot(); + } + public void addElement() { addElementAtImpl(tree.getRoot()); } @@ -182,6 +186,47 @@ public abstract class EntitiesTree> { parent) + 1); } + private class WithPosition { + int position; + T element; + + private WithPosition(int position, T element) { + this.position = position; + this.element = element; + } + } + + public void addNewlyAddedChildrenOf(ITreeParentNode parent) { + List treeChildren = getTreeChildren(parent); + List currentChildren = parent.getChildren(); + if (!currentChildren.containsAll(treeChildren)) { + throw new IllegalStateException( + "some children were removed. Can't add new tree children"); + } + int i = 0; + List addings = new ArrayList(); + for (T each : currentChildren) { + if (!treeChildren.contains(each)) { + addings.add(new WithPosition(i, each)); + } + i++; + } + for (WithPosition each : addings) { + tree.add(parent.getThis(), each.position, Collections + .singletonList(each.element)); + addChildren(tree, Collections.singletonList(each.element)); + } + } + + private List getTreeChildren(ITreeParentNode parent) { + List result = new ArrayList(); + int childCount = tree.getChildCount(parent); + for (int i = 0; i < childCount; i++) { + result.add(tree.getChild(parent, i)); + } + return result; + } + public void move(T toBeMoved, T destination) { move(toBeMoved, destination, getChildren(destination).size()); } diff --git a/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul b/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul index 3a0526c41..723caca07 100644 --- a/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul +++ b/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul @@ -26,6 +26,7 @@ +