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}