001/* 002 * Copyright 2022 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.plugins.forms.workflow; 017 018import java.util.ArrayList; 019import java.util.Arrays; 020import java.util.HashMap; 021import java.util.List; 022import java.util.Map; 023import java.util.stream.Collectors; 024 025import org.ametys.cms.workflow.AmetysObjectCheckRightsCondition; 026import org.ametys.core.ui.Callable; 027import org.ametys.plugins.forms.repository.FormEntry; 028import org.ametys.plugins.workflow.AbstractWorkflowComponent; 029 030import com.opensymphony.workflow.Workflow; 031import com.opensymphony.workflow.spi.Step; 032 033/** 034 * This class creates multiple toggle buttons each representing a workflow step on form entries 035 */ 036public class FormEntryWorkflowStepsClientSideElement extends AbstractFormEntriesWorkflowStepsClientSideElement 037{ 038 @Override 039 protected String _getDefaultMenuClassName() 040 { 041 return "Ametys.plugins.forms.workflow.FormEntryWorkflowMenu"; 042 } 043 044 @Override 045 protected String _getDefaultActionClassName() 046 { 047 return "Ametys.plugins.forms.workflow.FormEntryWorkflowAction.doAction"; 048 } 049 050 @Override 051 protected List<ScriptFile> _getAdditionalScriptFiles() 052 { 053 List<ScriptFile> scriptFiles = new ArrayList<>(); 054 scriptFiles.add(new ScriptFile("/plugins/forms/resources/js/Ametys/plugins/forms/workflow/AbstractFormEntriesWorkflowAction.js")); 055 scriptFiles.add(new ScriptFile("/plugins/forms/resources/js/Ametys/plugins/forms/workflow/FormEntryWorkflowAction.js")); 056 scriptFiles.add(new ScriptFile("/plugins/forms/resources/js/Ametys/plugins/forms/workflow/AbstractFormEntriesWorkflowMenu.js")); 057 scriptFiles.add(new ScriptFile("/plugins/forms/resources/js/Ametys/plugins/forms/workflow/FormEntryWorkflowMenu.js")); 058 return scriptFiles; 059 } 060 061 @Override 062 protected String _getSelectionTargetId() 063 { 064 return "^(form-target)$"; 065 } 066 067 @Callable 068 @SuppressWarnings("unchecked") 069 @Override 070 public Map<String, Object> getWorkflowState(List<Object> entryIds, String formId, String scriptId) 071 { 072 List<Map<String, Object>> entries = new ArrayList<> (); 073 074 List<FormEntry> formEntries = entryIds.stream() 075 .filter(String.class::isInstance) 076 .map(String.class::cast) 077 .map(this::_resolveEntry) 078 .collect(Collectors.toList()); 079 080 for (FormEntry entry : formEntries) 081 { 082 Workflow workflow = _workflowProvider.getAmetysObjectWorkflow(entry); 083 for (Script script : _scripts) 084 { 085 if (script.getId().equals(scriptId)) 086 { 087 Map<String, Object> entryMap = new HashMap<> (); 088 089 long workflowId = entry.getWorkflowId(); 090 List<Step> steps = workflow.getCurrentSteps(workflowId); 091 List<Integer> stepIds = new ArrayList<>(); 092 for (Step step : steps) 093 { 094 stepIds.add(step.getStepId()); 095 } 096 097 Integer workflowStepId = (Integer) script.getParameters().get("workflow-step"); 098 if (stepIds.contains(workflowStepId)) 099 { 100 Map<String, Object> transientVars = new HashMap<>(); 101 102 // Used to check the rights on the form's content 103 transientVars.put(AmetysObjectCheckRightsCondition.AMETYS_OBJECT_KEY, entry); 104 transientVars.put(AbstractWorkflowComponent.FAIL_CONDITIONS_KEY, new ArrayList<String> ()); 105 106 int[] availableActions = workflow.getAvailableActions(workflowId, transientVars); 107 Arrays.sort(availableActions); 108 109 List<Integer> activeActions = new ArrayList<>(); 110 for (int actionId : (List<Integer>) script.getParameters().get("workflow-actions-ids")) 111 { 112 if (Arrays.binarySearch(availableActions, actionId) >= 0) 113 { 114 activeActions.add(actionId); 115 } 116 } 117 118 entryMap.put("id", entry.getId()); 119 entryMap.put("actions", activeActions); 120 entries.add(entryMap); 121 } 122 } 123 } 124 } 125 126 Map<String, Object> results = new HashMap<> (); 127 results.put("entries", entries); 128 return results; 129 } 130 131 private FormEntry _resolveEntry(String entryId) 132 { 133 return _resolver.resolveById(entryId); 134 } 135}