From d059c8b1bbe489e352e2a7bde0a272338dbb17f6 Mon Sep 17 00:00:00 2001 From: Will Ezell Date: Thu, 11 Jan 2018 14:19:31 -0500 Subject: [PATCH 1/4] #13352 adding drag and drop to workflow builder --- .../api/v1/workflow/WorkflowResource.java | 60 ++++ .../workflow/form/WorkflowActionStepBean.java | 18 +- .../workflow/helper/WorkflowHelper.java | 19 +- .../portlets/workflows/ajax/WfStepAjax.java | 6 +- .../workflows/business/WorkflowAPIImpl.java | 13 +- .../src/main/webapp/html/common/top_inc.jsp | 1 + .../ext/workflows/schemes/view_action.jsp | 4 +- .../ext/workflows/schemes/view_schemes.jsp | 81 ++--- .../ext/workflows/schemes/view_steps.jsp | 323 +++++++----------- .../ext/workflows/schemes/workflow.css | 218 +++++++++++- .../ext/workflows/schemes/workflow_js.jsp | 213 ++++++++++-- .../ext/workflows/schemes/workflow_main.jsp | 1 + 12 files changed, 647 insertions(+), 310 deletions(-) diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/workflow/WorkflowResource.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/workflow/WorkflowResource.java index 3d6f793ce6a3..11a9bb665dfe 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/workflow/WorkflowResource.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/workflow/WorkflowResource.java @@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Locale; +import java.util.stream.IntStream; @SuppressWarnings("serial") @Beta /* Non Official released */ @@ -622,7 +623,66 @@ public final Response deleteAction(@Context final HttpServletRequest request, return response; } // deleteAction + + /** + * Change the order of the steps in a scheme + * @param request HttpServletRequest + * @param workflowReorderActionStepForm WorkflowReorderBean + * @return Response + */ + @PUT + @Path("/reorder/step/{stepId}/order/{order}") + @JSONP + @NoCache + @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) + public final Response reorderStep(@Context final HttpServletRequest request, + @PathParam("stepId") final String stepId, + @PathParam("order") final int order) { + + final InitDataObject initDataObject = this.webResource.init + (null, true, request, true, null); + Response response; + try { + WorkflowStep step = workflowAPI.findStep(stepId); + WorkflowScheme scheme = workflowAPI.findScheme(step.getSchemeId()); + List steps = workflowAPI.findSteps(scheme); + IntStream.range(0, steps.size()) + .filter(i -> steps.get(i).getId().equals(step.getId())) + .boxed() + .findFirst() + .map(i -> steps.remove((int) i)); + + int newOrder = (order > steps.size()) ? steps.size():order; + steps.add(newOrder, step); + + int i=0; + for(WorkflowStep stepp : steps) { + stepp.setMyOrder(i++); + workflowAPI.saveStep(stepp); + } + + response = Response.ok(new ResponseEntityView("Ok")).build(); // 200 + } catch (DoesNotExistException e) { + + Logger.error(this.getClass(), + "DoesNotExistException on reorderStep, stepId: " + stepId + + ", exception message: " + e.getMessage(), e); + response = ExceptionMapperUtil.createResponse(e, Response.Status.NOT_FOUND); + } catch (Exception e) { + + Logger.error(this.getClass(), + "Exception on reorderStep, stepId: " + stepId + + ", exception message: " + e.getMessage(), e); + response = (e.getCause() instanceof SecurityException)? + ExceptionMapperUtil.createResponse(e, Response.Status.UNAUTHORIZED) : + ExceptionMapperUtil.createResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } + + return response; + } // reorderAction + + /** * Change the order of an action associated to the step * @param request HttpServletRequest diff --git a/dotCMS/src/main/java/com/dotcms/workflow/form/WorkflowActionStepBean.java b/dotCMS/src/main/java/com/dotcms/workflow/form/WorkflowActionStepBean.java index 3be5f84262af..98640061c8ef 100644 --- a/dotCMS/src/main/java/com/dotcms/workflow/form/WorkflowActionStepBean.java +++ b/dotCMS/src/main/java/com/dotcms/workflow/form/WorkflowActionStepBean.java @@ -13,7 +13,10 @@ public class WorkflowActionStepBean extends Validated { @NotNull private final String stepId; - + + @NotNull + private final int order; + public String getActionId() { return actionId; } @@ -21,7 +24,9 @@ public String getActionId() { public String getStepId() { return stepId; } - + public int getOrder() { + return order; + } @Override public String toString() { return "WorkflowActionStepBean{" + @@ -34,11 +39,13 @@ public WorkflowActionStepBean(final Builder builder) { this.actionId = builder.actionId; this.stepId = builder.stepId; + this.order = builder.order; this.checkValid(); } public static final class Builder { - + @JsonProperty(required = true) + private int order=0; @JsonProperty(required = true) private String actionId; @JsonProperty(required = true) @@ -54,7 +61,10 @@ public Builder stepId(String stepId) { this.stepId = stepId; return this; } - + public Builder order(int order) { + this.order = order; + return this; + } public WorkflowActionStepBean build() { diff --git a/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java b/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java index 1c935d38043e..89200efe479d 100644 --- a/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java +++ b/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java @@ -593,10 +593,23 @@ public WorkflowAction save (final WorkflowActionForm workflowActionForm, final U } // save. @WrapInTransaction - public void saveActionToStep(final WorkflowActionStepBean workflowActionStepForm, final User user) { - + public void saveActionToStep(final WorkflowActionStepBean workflowActionStepForm, final User user) throws DotDataException, DotSecurityException { + + WorkflowAction action = this.workflowAPI.findAction(workflowActionStepForm.getActionId(), workflowActionStepForm.getStepId(), user); + if(action!=null) { + WorkflowReorderBean bean = new WorkflowReorderBean.Builder() + .actionId(workflowActionStepForm.getActionId()).stepId(workflowActionStepForm.getStepId()) + .order(workflowActionStepForm.getOrder()).build(); + + this.reorderAction(bean, user); + + }else { + + + this.workflowAPI.saveAction(workflowActionStepForm.getActionId(), - workflowActionStepForm.getStepId(), user); + workflowActionStepForm.getStepId(), user, workflowActionStepForm.getOrder()); + } } // addActionToStep. diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/ajax/WfStepAjax.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/ajax/WfStepAjax.java index 7c87a7871b5f..6d33f5b1b922 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/ajax/WfStepAjax.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/ajax/WfStepAjax.java @@ -114,17 +114,21 @@ public void addActionToStep(final HttpServletRequest request, final String stepId = request.getParameter("stepId"); final String actionId = request.getParameter("actionId"); - + final int order= (request.getParameter("order")!=null) ? Integer.valueOf(request.getParameter("order")): 0; try { final User user = this.userWebAPI.getUser(request); Logger.debug(this, "Adding the action: " + actionId + ", to the step: " + stepId); + + + this.workflowHelper.saveActionToStep ( new WorkflowActionStepBean.Builder() .stepId(stepId) .actionId(actionId) + .order(order) .build(), user); writeSuccess(response, stepId ); diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java index f71d9ce54f27..731f60a5e080 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java @@ -698,9 +698,18 @@ public void saveAction(final String actionId, final String stepId, try { Logger.debug(this, "Saving (doing the relationship) the actionId: " + actionId + ", stepId: " + stepId); - - workflowAction = this.findAction(actionId, user); workflowStep = this.findStep (stepId); + + workflowAction = this.findAction(actionId,stepId, user); + + if(workflowAction!=null) { + this.reorderAction(workflowAction, workflowStep, user, order); + } + + if(workflowAction==null) { + workflowAction = this.findAction(actionId, user); + } + if (null == workflowAction) { diff --git a/dotCMS/src/main/webapp/html/common/top_inc.jsp b/dotCMS/src/main/webapp/html/common/top_inc.jsp index bb397668124b..9f36518876dc 100644 --- a/dotCMS/src/main/webapp/html/common/top_inc.jsp +++ b/dotCMS/src/main/webapp/html/common/top_inc.jsp @@ -26,6 +26,7 @@ THIS FILE AND ITS INCLUDES + diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action.jsp index 3fe81bd0ad65..7f4dc8f31b26 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action.jsp @@ -57,6 +57,8 @@ } %> + + - -
- -
-
- <%=LanguageUtil.get(pageContext, "Workflow-Scheme")%> -
- -
- -
-
- + var arr = new Array(<%=steps.size()%>); + <%for(WorkflowStep step : steps){ %> + arr.push(document.getElementById("jsNode<%=step.getId()%>")); + <%}%> - - - - - - - - - - - - - - - - - - - - <%if(scheme.isMandatory() && entryAction !=null){ %> - - - - - <%} %> - -
<%=LanguageUtil.get(pageContext, "Name")%>: - <%=UtilMethods.webifyString(scheme.getName())%> -
<%=LanguageUtil.get(pageContext, "Description")%>:<%=UtilMethods.webifyString(scheme.getDescription())%> -
<%=LanguageUtil.get(pageContext, "Archived")%>:<%=(scheme.isArchived()) ? LanguageUtil.get(pageContext, "Yes") : LanguageUtil.get(pageContext, "No")%> -
<%=LanguageUtil.get(pageContext, "Mandatory")%>: - <%=(scheme.isMandatory()) ? LanguageUtil.get(pageContext, "Yes") : LanguageUtil.get(pageContext, "No")%> + + dragula(arr, { + moves: function (el, source, handle, sibling) { -
<%=LanguageUtil.get(pageContext, "Default-Initial-Action")%>: - "<%=entryAction.getName() %>" + return el.classList.contains('wf-action-wrapper'); + }, + accepts: function (el, target, source, sibling) { -
-
+ return true; + }, + revertOnSpill: true, + copy: true, // elements are moved by default, not copied + copySortSource: true, // elements in copy-source containers can be reordered + + }).on('drop', function (ele) { -
- -
-
+ actionAdmin.copyOrReorderAction(ele); + }); -
-
- - -
- -
-
- - - -
+ -
-
-
- Schema Workflow Actions -
-
-
- " dojoType="dojo.dnd.Source" class="dndContainer container" accept="actionOrderClass<%=scheme.getId()%>"> - - <%for(WorkflowAction action : schemaActions){ - actionsDropDownOptions.append(""); - %> - - - - - <%} %> - -
- - <%=action.getName() %> - ‣ <%=!action.isNextStepCurrentStep()?wapi.findStep(action.getNextStep()).getName():LanguageUtil.get(pageContext, "Current-Step") %> - <%if(action.requiresCheckout()){ %>
: (<%=LanguageUtil.get(pageContext, "Requires-Checkout")%>)" style="float:right;opacity:0.45;">
<%} %> -
+
+
+ + +
+

<%=UtilMethods.webifyString(scheme.getName())%> &nbps; &nbps;

+

<%=UtilMethods.webifyString(scheme.getDescription())%>

+
+
+ +
+ +
+ + +
+ +
-
- -
- - <%for(WorkflowStep step : steps){ %> - - <%List actions = wapi.findActions(step, APILocator.getUserAPI().getSystemUser());%> -
-
-
- <%=step.getName() %> - - <%=step.isResolved() ? "(" + LanguageUtil.get(pageContext, "resolved") + ")" : "" %> - -
-
-
-
- " dojoType="dojo.dnd.Source" class="dndContainer container" accept="actionOrderClass<%=step.getId()%>"> - - - <%for(WorkflowAction action : actions){ %> - - - - - <%} %> - -
- - <%=action.getName() %> - ‣ <%=!action.isNextStepCurrentStep()?wapi.findStep(action.getNextStep()).getName():LanguageUtil.get(pageContext, "Current-Step") %> - <%if(action.requiresCheckout()){ %>
: (<%=LanguageUtil.get(pageContext, "Requires-Checkout")%>)" style="float:right;opacity:0.45;">
<%} %> -
- - -
- - - +

Steps

+ + +
+
+
+
+ + <%for(WorkflowStep step : steps){ %> + <%List actions = wapi.findActions(step, APILocator.getUserAPI().getSystemUser());%> +
+
+
+
+ <%=step.getName() %> + + <%=step.isResolved() ? "(" + LanguageUtil.get(pageContext, "resolved") + ")" : "" %> + +
+
+
+
+ <%for(WorkflowAction action : actions){ %> +
+
+
+
+ +
+ <%=action.getName() %> ‣ <%=(WorkflowAction.CURRENT_STEP.equals(action.getNextStep())) ? WorkflowAction.CURRENT_STEP : wapi.findStep(action.getNextStep()).getName() %> +
+
+
+ <%} %> + +
+ +
+
Delete
+
+ Add +
+
+
+
+ <%}%>
- - <%} %> +
+ \ No newline at end of file diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css index eaf8fe832517..471cfc2c62ea 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css @@ -1,9 +1,51 @@ -.editRow{width:97%;margin:auto;} +.portlet-toolbar__actions-secondary{padding-right: 50px;} + +.flex-container { + padding: 0; + margin: 0; + list-style: none; + -ms-box-orient: horizontal; + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -moz-flex; + display: -webkit-flex; + display: flex; +} +.flex-wrap{ + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + padding-left:10px; +} +.flex-item { + position: relative; + background: #fff; + padding: 0; + width: 45%; + max-width: 420px; + min-height: 300px; + margin: 10px; + box-sizing: border-box; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); +} + +.wfSchemeTitle { + background-color: #fff; + color: #666; + margin-bottom: 0; + padding: 16px 24px 8px 16px; + font-size: 16px; + font-weight: bold; + border-bottom: 1px solid #e0e0e0; + min-height: 75px; +} + .editRow:hover th{background:#C1D9EE;} .editRow:hover td{background:#DBEBF9;} -ol.wfStepsList{margin:15px 15px 20px 15px;} -ol.wfStepsList li{padding:3px 10px;margin:0 10px; list-style:decimal; border-bottom:1px dashed #ccc; list-style-position:inside;} -ol.wfStepsList li:first-child{border-top:1px dashed #ccc;} + +ol.wfStepsList{margin:15px 15px 75px 15px;} +ol.wfStepsList li{padding:8px 16px;margin:0 10px; list-style:decimal; list-style-position:inside;} + .wfSchemeShowSteps{ padding:10px; margin:10px; @@ -30,11 +72,10 @@ ol.wfStepsList li:first-child{border-top:1px dashed #ccc;} margin:10px; } .wfStepTitle{ - padding-left:10px; - padding-right:10px; + padding: 8px 8px 8px 24px; background: #eeeeee; - font-weight: bold; margin-bottom:20px; + font-size: 14px; } .wfStepTitleDivs{ padding-top:10px; @@ -59,27 +100,22 @@ ol.wfStepsList li:first-child{border-top:1px dashed #ccc;} width:20px;text-align: center;cursor:pointer; } - .container { - +.container { display: block; } + .showPointer{ cursor: pointer; } + .wfAddActionButtonRow{ margin:10px; - text-align: center; - } .wfWhoCanUseDiv{ padding:10px; } -.saveButtonHide{ - //visibility:hidden; - //font-:1px solid white; -} .saveButtonDivShow{ font-weight:bold; } @@ -128,3 +164,155 @@ ol.wfStepsList li:first-child{border-top:1px dashed #ccc;} height:300px; margin:auto; } + +.portlet-toolbar { + background-color: #fff; + margin: 0 0 0 0; + padding: 32px 0 16px 24px; + border-bottom: #e3e3e3; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); + position: absolute; + z-index: 10; + top: 0; + width: 100%; + height: 92px; +} +.board-wrapper { + position: absolute; + left: 0px; + right: 0px; + top: 92px; + bottom: 0; + padding-top: 30px; + background-color: #F4F3F4; +} +.board-main-content{ + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + margin-right: 0; + -webkit-transition: margin .1s ease-in; + transition: margin .1s ease-in; +} +.board-canvas { + position: relative; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.board { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; + margin-bottom: 10px; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 10px; + padding-right: 56px; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.list-wrapper { + width: 275px; + margin: 0 8px; + height: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + vertical-align: top; + white-space: nowrap; +} +.list-wrapper:first-child { + margin-left: 20px; +} +.list-item { + background: #Fff; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + max-height: 100%; + position: relative; + white-space: normal; + padding-bottom: 24px; + min-height: 450px; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); +} +.wfActionList { + border: 0; + margin-left:5px; + margin-right: 5px; + width: 265px; + min-height: 300px; +} + +.scrollbar { + -webkit-overflow-scrolling: touch; + -webkit-transform: translate3d(0, 0, 0); +} + +.wfStepTitle { + background-color: #0F75C4; + color: #fff; + margin-bottom: 0; +} + +.wf-action-wrapper { + background: #fcfcfc; + margin: 8px 0px; + border-bottom: 1px solid #ccc; + padding: 12px 12px; + +} +.wf-action-wrapper:hover{ + background: #E6EFF7; +} +.pull-right { + float: right; + margin: 0 0px 8px 8px; +} + +.btn-flat-wrapper { + position: absolute; + bottom: 18px; + width: 100%; + text-align: right; +} + +.btn-flat { + text-transform: uppercase; + display: inline-block; + padding: 8px 16px; + margin: 0px; + text-decoration: none; + font-size: 14px; + font-weight: 300; + color: #a6a6a6; + letter-spacing: 0.1em +} +.btn-flat:last-child{ + margin-right: 10px; +} + +.btn-flat:hover{ + background: #F4F3F4; +} + +.btn-primary { + color: #0F75C4; +} \ No newline at end of file diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp index a32e202ab047..8e1d3e243576 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp @@ -323,6 +323,7 @@ dojo.declare("dotcms.dijit.workflows.StepAdmin", null, { }, alreadyDone : "", addStep : function (){ + var stepName = encodeURIComponent(dijit.byId("stepName").getValue()); @@ -351,12 +352,39 @@ dojo.declare("dotcms.dijit.workflows.StepAdmin", null, { dojo.xhrPost(xhrArgs); return; + }, + + showAddNewStep : function (){ + var dia = dijit.byId("addNewStepDia"); + if(dia){ + dia.destroyRecursive(); + } + + dia = new dijit.Dialog({ + content: '
<%=LanguageUtil.get(pageContext, "Name")%>:  
', + id : "addNewStepDia", + title : "<%=LanguageUtil.get(pageContext, "Add-Step")%>", + onKeyPress:function(e){ + if(e.keyCode==13){ + stepAdmin.addStep(); + } + } + }); - + dia.show(); + + }, + + + addSuccess : function (data){ mainAdmin.refresh(); showDotCMSSystemMessage("Added"); + var dia = dijit.byId("addNewStepDia"); + if(dia){ + dia.destroyRecursive(); + } }, deleteStep : function (stepId){ @@ -389,10 +417,34 @@ dojo.declare("dotcms.dijit.workflows.StepAdmin", null, { dojo.xhrPut(xhrArgs); return; + }, + reorderStep : function (stepId, order){ + var xhrArgs = { + url: "/api/v1/workflow/reorder/step/" + stepId+ "/order/" + order, + async:true, + handle : function(dataOrError, ioArgs) { + if (dojo.isString(dataOrError)) { + if (dataOrError.indexOf("FAILURE") == 0) { + showDotCMSSystemMessage("<%=LanguageUtil.get(pageContext, "Unable-to-reorder-Step")%>", true); + return false; + } else { + console.log("worked"); + return false; + } + } else { + showDotCMSSystemMessage("<%=LanguageUtil.get(pageContext, "Unable-to-reorder-Step")%>", true); + return false; + + } + } + }; + dojo.xhrPut(xhrArgs); + + return; }, deleteSuccess : function (data){ mainAdmin.refresh(); @@ -585,9 +637,6 @@ dojo.declare("dotcms.dijit.workflows.ActionAdmin", null, { var actionId = movedId.split("_")[1]; var i=0; dojo.query("#jsNode" + stepId + " tr").forEach(function(node){ - - - if(node.id == movedId ){ var xhrArgs = { url: "/DotAjaxDirector/com.dotmarketing.portlets.workflows.ajax.WfActionAjax?cmd=reorder&actionId=" + actionId + "&order=" + i + "&stepId=" + stepId, @@ -613,37 +662,84 @@ dojo.declare("dotcms.dijit.workflows.ActionAdmin", null, { }) }, - deleteAction : function (actionId){ - if(!confirm("<%=LanguageUtil.get(pageContext, "Confirm-Delete-Action")%>")){ - return; + findStepDiv : function (ele){ + var parent = ele; + while (true) { + if(parent.dataset.wfstepId){ + return parent; + } + parent = parent.parentNode; + if(parent == document.body){ + return; + } } - var xhrArgs = { - url: "/DotAjaxDirector/com.dotmarketing.portlets.workflows.ajax.WfActionAjax?cmd=delete&actionId=" + actionId , - handle : function(dataOrError, ioArgs) { - if (dojo.isString(dataOrError)) { + return ; + }, + + findStepId : function (ele){ + var parent = ele; + while (true) { + if(parent.dataset.wfstepId){ + return parent.dataset.wfstepId; + } + parent = parent.parentNode; + if(parent == document.body){ + return; + } + } + return ; + }, + + findActionId : function (ele){ + var parent = ele; + while (true) { + if(parent.dataset.wfactionId){ + return parent.dataset.wfactionId; + } + parent = parent.parentNode; + if(parent == document.body){ + return; + } + } + return ; + }, + findActionDiv : function (ele){ + var parent = ele; + while (true) { + if(parent.classList.contains("wf-action-wrapper")){ + return parent; + } + parent = parent.parentNode; + if(parent == document.body){ + return; + } + } + return ; + }, + + deleteActionForStep : function (ele){ + var stepId = this.findStepId(ele); + var actionId = this.findActionId(ele); - if (dataOrError.indexOf("FAILURE") == 0) { - showDotCMSSystemMessage(dataOrError, true); - } else { - mainAdmin.refresh(); - } - } else { - this.saveError("<%=LanguageUtil.get(pageContext, "unable-to-save-scheme")%>"); - } - } - }; - dojo.xhrPut(xhrArgs); - return; - }, + + let matches = document.querySelectorAll('.x' + actionId ); - deleteActionForStep : function (actionId, stepId){ - if(!confirm("<%=LanguageUtil.get(pageContext, "Confirm-Delete-Action")%>")){ - return; + // we only confirm if this is the last instance of the action + + + var deleteUrl = "/DotAjaxDirector/com.dotmarketing.portlets.workflows.ajax.WfActionAjax?cmd=deleteActionForStep&actionId=" + actionId + "&stepId=" + stepId ; + if(matches.length ==1){ + if(!confirm("<%=LanguageUtil.get(pageContext, "Confirm-Delete-Action")%>")){ + return; + } + else{ + deleteUrl = "/DotAjaxDirector/com.dotmarketing.portlets.workflows.ajax.WfActionAjax?cmd=delete&actionId=" + actionId + "&stepId=" + stepId ; + } } var xhrArgs = { - url: "/DotAjaxDirector/com.dotmarketing.portlets.workflows.ajax.WfActionAjax?cmd=deleteActionForStep&actionId=" + actionId + "&stepId=" + stepId , + url: deleteUrl , handle : function(dataOrError, ioArgs) { if (dojo.isString(dataOrError)) { @@ -653,6 +749,10 @@ dojo.declare("dotcms.dijit.workflows.ActionAdmin", null, { } else { + var die =actionAdmin.findActionDiv(ele); + + die.parentNode.removeChild(die); + actionAdmin.deleteSuccess(dataOrError); } } else { @@ -668,17 +768,14 @@ dojo.declare("dotcms.dijit.workflows.ActionAdmin", null, { deleteSuccess : function(message) { - console.log(message); - console.log(message.split(":")[1]); - stepAdmin.showViewSteps(message.split(":")[1]); + showDotCMSSystemMessage("<%=LanguageUtil.get(pageContext, "Deleted")%>"); }, deleteSuccess : function(message) { - console.log(message); - console.log(message.split(":")[1]); - stepAdmin.showViewSteps(message.split(":")[1]); + + showDotCMSSystemMessage("<%=LanguageUtil.get(pageContext, "Deleted")%>"); @@ -692,7 +789,12 @@ dojo.declare("dotcms.dijit.workflows.ActionAdmin", null, { addOrAssociatedAction : function(schemeId, stepId, actionsDropDownOptionsId) { let actionsDropDownOptions = document.getElementById (actionsDropDownOptionsId); - let actionId = actionsDropDownOptions.options[actionsDropDownOptions.selectedIndex].value; + let actionId = "new"; + + if(actionsDropDownOptions !=null ){ + actionId = actionsDropDownOptions.options[actionsDropDownOptions.selectedIndex].value; + } + if ('new' === actionId) { mainAdmin.show(this.baseJsp + "?schemeId=" + schemeId + "&stepId=" + stepId + "&actionId=" + actionId + "&" + Math.random()); } else { @@ -718,7 +820,48 @@ dojo.declare("dotcms.dijit.workflows.ActionAdmin", null, { } }, + copyOrReorderAction : function(ele) { + + let stepId = this.findStepId(ele); + let stepDiv = this.findStepDiv(ele); + let actionDiv = this.findActionDiv(ele); + let actionId = this.findActionId(ele); + let order=0; + let actions = stepDiv.querySelectorAll(".wf-action-wrapper"); + + for(i=0;i"); + + } + } + }; + + dojo.xhrPost(xhrArgs); + + }, saveAction : function(schemeId) { var myForm = dijit.byId("addEditAction"); diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_main.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_main.jsp index f4e3be317973..43472e53b8e1 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_main.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_main.jsp @@ -5,6 +5,7 @@
From e4d0a4bc44ba3bf805038e3b2c3b0cd3512ed9b0 Mon Sep 17 00:00:00 2001 From: Will Ezell Date: Thu, 11 Jan 2018 14:38:01 -0500 Subject: [PATCH 2/4] #13352 cool new hover trick --- .../ext/workflows/schemes/view_steps.jsp | 44 ++++++++----------- .../ext/workflows/schemes/workflow.css | 23 +++++++++- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_steps.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_steps.jsp index 035f842f53d1..c6326d0d5b1c 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_steps.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_steps.jsp @@ -89,7 +89,7 @@
-

<%=UtilMethods.webifyString(scheme.getName())%> &nbps; &nbps;

+

<%=UtilMethods.webifyString(scheme.getName())%>    

<%=UtilMethods.webifyString(scheme.getDescription())%>

@@ -98,29 +98,12 @@
-
- - -
+
-

Steps

+
@@ -147,18 +130,12 @@
-
<%=action.getName() %> ‣ <%=(WorkflowAction.CURRENT_STEP.equals(action.getNextStep())) ? WorkflowAction.CURRENT_STEP : wapi.findStep(action.getNextStep()).getName() %>
<%} %> -
@@ -170,6 +147,21 @@
<%}%> +
+
+
+
+ <%=LanguageUtil.get(pageContext, "Add-Workflow-Step")%> +
+
+
+
+ +
+
+
+ +
diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css index 471cfc2c62ea..aa5768a5aca0 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css @@ -315,4 +315,25 @@ ol.wfStepsList li{padding:8px 16px;margin:0 10px; list-style:decimal; list-styl .btn-primary { color: #0F75C4; -} \ No newline at end of file +} + +.box-wrapper:hover .ghost-box { + opacity: 1 +} +.box-wrapper:hover .title { + opacity: 0 +} + +.ghostAddDiv { + opacity: .3; + -webkit-transition: opacity .5s; + -moz-transition: opacity .5s; + transition: opacity .5s; +} + +.ghostAddDiv:hover { + opacity: 1; + cursor: pointer; +} + + From f81f47975d283f7e039ce58ea0470dd18f76ab90 Mon Sep 17 00:00:00 2001 From: Will Ezell Date: Thu, 11 Jan 2018 14:44:31 -0500 Subject: [PATCH 3/4] #13352 we didn't need api changed --- .../workflows/business/WorkflowAPIImpl.java | 13 ++----------- .../html/portlet/ext/workflows/schemes/workflow.css | 4 +++- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java index 731f60a5e080..f71d9ce54f27 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java @@ -698,18 +698,9 @@ public void saveAction(final String actionId, final String stepId, try { Logger.debug(this, "Saving (doing the relationship) the actionId: " + actionId + ", stepId: " + stepId); + + workflowAction = this.findAction(actionId, user); workflowStep = this.findStep (stepId); - - workflowAction = this.findAction(actionId,stepId, user); - - if(workflowAction!=null) { - this.reorderAction(workflowAction, workflowStep, user, order); - } - - if(workflowAction==null) { - workflowAction = this.findAction(actionId, user); - } - if (null == workflowAction) { diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css index aa5768a5aca0..f46df02f213a 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css @@ -325,7 +325,8 @@ ol.wfStepsList li{padding:8px 16px;margin:0 10px; list-style:decimal; list-styl } .ghostAddDiv { - opacity: .3; + opacity: .1; + border:2px dotted black; -webkit-transition: opacity .5s; -moz-transition: opacity .5s; transition: opacity .5s; @@ -334,6 +335,7 @@ ol.wfStepsList li{padding:8px 16px;margin:0 10px; list-style:decimal; list-styl .ghostAddDiv:hover { opacity: 1; cursor: pointer; + border:1px dotted silver; } From 09ad3e8d6eeef60f98eb97a144de73891f4595db Mon Sep 17 00:00:00 2001 From: Will Ezell Date: Thu, 11 Jan 2018 14:58:16 -0500 Subject: [PATCH 4/4] #13352 --- .../workflows/schemes/view_action_class_params.jsp | 2 +- .../html/portlet/ext/workflows/schemes/workflow.css | 13 ++++++++----- .../portlet/ext/workflows/schemes/workflow_js.jsp | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action_class_params.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action_class_params.jsp index 08a085a7b3c7..9c72fd265811 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action_class_params.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/view_action_class_params.jsp @@ -80,7 +80,7 @@ <%} %> diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css index f46df02f213a..446423fdc0fd 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow.css @@ -135,9 +135,10 @@ ol.wfStepsList li{padding:8px 16px;margin:0 10px; list-style:decimal; list-styl float:right; } #actionClassParamsDia{ - width:600px; - min-height:250px; - max-height:600px; + min-width:600px; + max-width:70%; + min-height:400px; + max-height:90%; overflow:auto; } .wfnoSubActions{ @@ -145,8 +146,10 @@ ol.wfStepsList li{padding:8px 16px;margin:0 10px; list-style:decimal; list-styl padding:10px; } .wfParamTextArea{ - min-height:40px; - max-height:120px; + min-height:75px; + max-height:200px; + width:300px; + } #stepEditDia .escalation-row { diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp index 8e1d3e243576..cd9d77ffdd23 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/schemes/workflow_js.jsp @@ -1198,7 +1198,7 @@ dojo.declare("dotcms.dijit.workflows.ActionClassAdmin", null, { href : "/html/portlet/ext/workflows/schemes/view_action_class_params.jsp?actionClassId=" + actionClassId }); - + dojo.body().appendChild(dia.domNode); dia.show();