mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-11-04 03:08:25 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			export-202
			...
			workflow/i
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 3a98a316fe | |||
| 829bf01eca | 
@@ -271,7 +271,7 @@ class ActivityType
 | 
			
		||||
    public function checkSocialActionsVisibility(ExecutionContextInterface $context, $payload)
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->socialIssuesVisible !== $this->socialActionsVisible) {
 | 
			
		||||
            if (!($this->socialIssuesVisible === 2 && $this->socialActionsVisible === 1)) {
 | 
			
		||||
            if (!(2 === $this->socialIssuesVisible && 1 === $this->socialActionsVisible)) {
 | 
			
		||||
                $context
 | 
			
		||||
                    ->buildViolation('The socialActionsVisible value is not compatible with the socialIssuesVisible value')
 | 
			
		||||
                    ->atPath('socialActionsVisible')
 | 
			
		||||
 
 | 
			
		||||
@@ -174,6 +174,20 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCurrentStepChained(): ?EntityWorkflowStep
 | 
			
		||||
    {
 | 
			
		||||
        $steps = $this->getStepsChained();
 | 
			
		||||
        $currentStep = $this->getCurrentStep();
 | 
			
		||||
 | 
			
		||||
        foreach ($steps as $step) {
 | 
			
		||||
            if ($step === $currentStep) {
 | 
			
		||||
                return $step;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCurrentStepCreatedAt(): ?DateTimeInterface
 | 
			
		||||
    {
 | 
			
		||||
        if (null !== $previous = $this->getPreviousStepIfAny()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,8 @@ class WorkflowStepType extends AbstractType
 | 
			
		||||
        $entityWorkflow = $options['entity_workflow'];
 | 
			
		||||
        $handler = $this->entityWorkflowManager->getHandler($entityWorkflow);
 | 
			
		||||
        $workflow = $this->registry->get($entityWorkflow, $entityWorkflow->getWorkflowName());
 | 
			
		||||
        $place = $workflow->getMarking($entityWorkflow);
 | 
			
		||||
        $placeMetadata = $workflow->getMetadataStore()->getPlaceMetadata(array_keys($place->getPlaces())[0]);
 | 
			
		||||
 | 
			
		||||
        if (true === $options['transition']) {
 | 
			
		||||
            if (null === $options['entity_workflow']) {
 | 
			
		||||
@@ -68,40 +70,77 @@ class WorkflowStepType extends AbstractType
 | 
			
		||||
                $transitions
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            if (array_key_exists('validationFilterInputLabels', $placeMetadata)) {
 | 
			
		||||
                $inputLabels = $placeMetadata['validationFilterInputLabels'];
 | 
			
		||||
 | 
			
		||||
                $builder->add('transitionFilter', ChoiceType::class, [
 | 
			
		||||
                    'multiple' => false,
 | 
			
		||||
                    'label' => 'workflow.My decision',
 | 
			
		||||
                    'choices' => [
 | 
			
		||||
                        'forward' => 'forward',
 | 
			
		||||
                        'backward' => 'backward',
 | 
			
		||||
                        'neutral' => 'neutral',
 | 
			
		||||
                    ],
 | 
			
		||||
                    'choice_label' => function (string $key) use ($inputLabels) {
 | 
			
		||||
                        return $this->translatableStringHelper->localize($inputLabels[$key]);
 | 
			
		||||
                    },
 | 
			
		||||
                    'choice_attr' => static function (string $key) {
 | 
			
		||||
                        return [
 | 
			
		||||
                            $key => $key,
 | 
			
		||||
                        ];
 | 
			
		||||
                    },
 | 
			
		||||
                    'mapped' => false,
 | 
			
		||||
                    'expanded' => true,
 | 
			
		||||
                    'data' => 'forward',
 | 
			
		||||
                ]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $builder
 | 
			
		||||
                ->add('transition', ChoiceType::class, [
 | 
			
		||||
                    'label' => 'workflow.Transition to apply',
 | 
			
		||||
                    'label' => 'workflow.Next step',
 | 
			
		||||
                    'mapped' => false,
 | 
			
		||||
                    'multiple' => false,
 | 
			
		||||
                    'expanded' => true,
 | 
			
		||||
                    'choices' => $choices,
 | 
			
		||||
                    'choice_label' => function (Transition $transition) use ($workflow) {
 | 
			
		||||
                            $meta = $workflow->getMetadataStore()->getTransitionMetadata($transition);
 | 
			
		||||
                        $meta = $workflow->getMetadataStore()->getTransitionMetadata($transition);
 | 
			
		||||
 | 
			
		||||
                            if (array_key_exists('label', $meta)) {
 | 
			
		||||
                                return $this->translatableStringHelper->localize($meta['label']);
 | 
			
		||||
                            }
 | 
			
		||||
                        if (array_key_exists('label', $meta)) {
 | 
			
		||||
                            return $this->translatableStringHelper->localize($meta['label']);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                            return $transition->getName();
 | 
			
		||||
                        },
 | 
			
		||||
                        return $transition->getName();
 | 
			
		||||
                    },
 | 
			
		||||
                    'choice_attr' => static function (Transition $transition) use ($workflow) {
 | 
			
		||||
                            $toFinal = true;
 | 
			
		||||
                        $toFinal = true;
 | 
			
		||||
                        $isForward = 'neutral';
 | 
			
		||||
 | 
			
		||||
                            foreach ($transition->getTos() as $to) {
 | 
			
		||||
                                $meta = $workflow->getMetadataStore()->getPlaceMetadata($to);
 | 
			
		||||
                        $metadata = $workflow->getMetadataStore()->getTransitionMetadata($transition);
 | 
			
		||||
 | 
			
		||||
                                if (
 | 
			
		||||
                        if (array_key_exists('isForward', $metadata)) {
 | 
			
		||||
                            if ($metadata['isForward']) {
 | 
			
		||||
                                $isForward = 'forward';
 | 
			
		||||
                            } else {
 | 
			
		||||
                                $isForward = 'backward';
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        foreach ($transition->getTos() as $to) {
 | 
			
		||||
                            $meta = $workflow->getMetadataStore()->getPlaceMetadata($to);
 | 
			
		||||
 | 
			
		||||
                            if (
 | 
			
		||||
                                    !array_key_exists('isFinal', $meta) || false === $meta['isFinal']
 | 
			
		||||
                                ) {
 | 
			
		||||
                                    $toFinal = false;
 | 
			
		||||
                                }
 | 
			
		||||
                                $toFinal = false;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                            return [
 | 
			
		||||
                                'data-is-transition' => 'data-is-transition',
 | 
			
		||||
                                'data-to-final' => $toFinal ? '1' : '0',
 | 
			
		||||
                            ];
 | 
			
		||||
                        },
 | 
			
		||||
                        return [
 | 
			
		||||
                            'data-is-transition' => 'data-is-transition',
 | 
			
		||||
                            'data-to-final' => $toFinal ? '1' : '0',
 | 
			
		||||
                            'data-is-forward' => $isForward,
 | 
			
		||||
                        ];
 | 
			
		||||
                    },
 | 
			
		||||
                ])
 | 
			
		||||
                ->add('future_dest_users', PickUserDynamicType::class, [
 | 
			
		||||
                    'label' => 'workflow.dest for next steps',
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,19 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Create a control to show or hide values
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * Possible options are:
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 *  - froms: an Element, an Array of Element, or a NodeList. A
 | 
			
		||||
 *    listener will be attached to **all** input of those elements
 | 
			
		||||
 *    and will trigger the check on changes
 | 
			
		||||
 *  - test: a function which will test the element and will return true 
 | 
			
		||||
 *  - test: a function which will test the element and will return true
 | 
			
		||||
 *    if the content must be shown, false if it must be hidden.
 | 
			
		||||
 *    The function will receive the `froms` as first argument, and the 
 | 
			
		||||
 *    The function will receive the `froms` as first argument, and the
 | 
			
		||||
 *    event as second argument.
 | 
			
		||||
 *  - container: an Element, an Array of Element, or a Node List. The 
 | 
			
		||||
 *  - container: an Element, an Array of Element, or a Node List. The
 | 
			
		||||
 *    child nodes will be hidden / shown inside this container
 | 
			
		||||
 *  - event_name: the name of the event to listen to. `'change'` by default.
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @param object options
 | 
			
		||||
 */
 | 
			
		||||
var ShowHide = function(options) {
 | 
			
		||||
@@ -26,8 +26,10 @@ var ShowHide = function(options) {
 | 
			
		||||
        container_content = [],
 | 
			
		||||
        debug = 'debug' in options ? options.debug : false,
 | 
			
		||||
        load_event = 'load_event' in options ? options.load_event : 'load',
 | 
			
		||||
        id = 'uid' in options ? options.id : Math.random();
 | 
			
		||||
    
 | 
			
		||||
        id = 'uid' in options ? options.id : Math.random(),
 | 
			
		||||
        toggle_callback = 'toggle_callback' in options ? options.toggle_callback : null
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
    var bootstrap = function(event) {
 | 
			
		||||
        if (debug) {
 | 
			
		||||
            console.log('debug is activated on this show-hide', this);
 | 
			
		||||
@@ -39,15 +41,14 @@ var ShowHide = function(options) {
 | 
			
		||||
                contents.push(el);
 | 
			
		||||
            }
 | 
			
		||||
            container_content.push(contents);
 | 
			
		||||
            // console.log('container content', container_content);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // attach the listener on each input
 | 
			
		||||
        for (let f of froms.values()) {
 | 
			
		||||
            let 
 | 
			
		||||
                inputs = f.querySelectorAll('input'), 
 | 
			
		||||
            let
 | 
			
		||||
                inputs = f.querySelectorAll('input'),
 | 
			
		||||
                selects = f.querySelectorAll('select');
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
            for (let input of inputs.values()) {
 | 
			
		||||
                if (debug) {
 | 
			
		||||
                    console.log('attaching event to input', input);
 | 
			
		||||
@@ -67,10 +68,10 @@ var ShowHide = function(options) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // first launch of the show/hide
 | 
			
		||||
        onChange(event);    
 | 
			
		||||
        onChange(event);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    var onChange = function (event) {
 | 
			
		||||
        var result = test(froms, event), me;
 | 
			
		||||
 | 
			
		||||
@@ -89,45 +90,53 @@ var ShowHide = function(options) {
 | 
			
		||||
        } else {
 | 
			
		||||
            throw "the result of test is not a boolean";
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    var forceHide = function() {
 | 
			
		||||
        if (debug) {
 | 
			
		||||
            console.log('force hide');
 | 
			
		||||
        }
 | 
			
		||||
        for (let contents of container_content.values()) {
 | 
			
		||||
            for (let el of contents.values()) {
 | 
			
		||||
                el.remove();
 | 
			
		||||
        if (toggle_callback !== null) {
 | 
			
		||||
            toggle_callback(container, 'hide');
 | 
			
		||||
        } else {
 | 
			
		||||
            for (let contents of container_content.values()) {
 | 
			
		||||
                for (let el of contents.values()) {
 | 
			
		||||
                    el.remove();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        is_shown = false;
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    var forceShow = function() {
 | 
			
		||||
        if (debug) {
 | 
			
		||||
            console.log('show');
 | 
			
		||||
        }
 | 
			
		||||
        for (let i of container_content.keys()) {
 | 
			
		||||
            var contents = container_content[i];
 | 
			
		||||
            for (let el of contents.values()) {
 | 
			
		||||
                container[i].appendChild(el);
 | 
			
		||||
        if (toggle_callback !== null) {
 | 
			
		||||
            toggle_callback(container, 'show');
 | 
			
		||||
        } else {
 | 
			
		||||
            for (let i of container_content.keys()) {
 | 
			
		||||
                var contents = container_content[i];
 | 
			
		||||
                for (let el of contents.values()) {
 | 
			
		||||
                    container[i].appendChild(el);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        is_shown = true;
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    var forceCompute = function(event) {
 | 
			
		||||
        onChange(event);
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (load_event !== null) {
 | 
			
		||||
        window.addEventListener('load', bootstrap);
 | 
			
		||||
    } else {
 | 
			
		||||
        bootstrap(null);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        forceHide: forceHide,
 | 
			
		||||
        forceShow: forceShow,
 | 
			
		||||
 
 | 
			
		||||
@@ -2,29 +2,74 @@ import {ShowHide} from 'ChillMainAssets/lib/show_hide/show_hide.js';
 | 
			
		||||
 | 
			
		||||
window.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    let
 | 
			
		||||
        finalizeAfterContainer = document.querySelector('#finalizeAfter'),
 | 
			
		||||
        divTransitions = document.querySelector('#transitions'),
 | 
			
		||||
        futureDestUsersContainer = document.querySelector('#futureDestUsers')
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
    if (null === finalizeAfterContainer) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    new ShowHide({
 | 
			
		||||
        load_event: null,
 | 
			
		||||
        froms: [finalizeAfterContainer],
 | 
			
		||||
        container: [futureDestUsersContainer],
 | 
			
		||||
        test: function(containers, arg2, arg3) {
 | 
			
		||||
            for (let container of containers) {
 | 
			
		||||
                for (let input of container.querySelectorAll('input')) {
 | 
			
		||||
                    if (!input.checked) {
 | 
			
		||||
                        return true;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        return false;
 | 
			
		||||
    if (null !== divTransitions) {
 | 
			
		||||
        new ShowHide({
 | 
			
		||||
            load_event: null,
 | 
			
		||||
            froms: [divTransitions],
 | 
			
		||||
            container: [futureDestUsersContainer],
 | 
			
		||||
            test: function(divs, arg2, arg3) {
 | 
			
		||||
                for (let div of divs) {
 | 
			
		||||
                    for (let input of div.querySelectorAll('input')) {
 | 
			
		||||
                        if (input.checked) {
 | 
			
		||||
                            if (input.dataset.toFinal === "1") {
 | 
			
		||||
                                return false;
 | 
			
		||||
                            } else {
 | 
			
		||||
                                return true;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        },
 | 
			
		||||
    })
 | 
			
		||||
                return true;
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let
 | 
			
		||||
        transitionFilterContainer = document.querySelector('#transitionFilter'),
 | 
			
		||||
        transitions = document.querySelector('#transitions')
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
    if (null !== transitionFilterContainer) {
 | 
			
		||||
        transitions.querySelectorAll('.form-check').forEach(function(row) {
 | 
			
		||||
 | 
			
		||||
            const isForward = row.querySelector('input').dataset.isForward;
 | 
			
		||||
            console.log(row);
 | 
			
		||||
            console.log(isForward);
 | 
			
		||||
 | 
			
		||||
            new ShowHide({
 | 
			
		||||
                load_event: null,
 | 
			
		||||
                froms: [transitionFilterContainer],
 | 
			
		||||
                container: row,
 | 
			
		||||
                test: function (containers) {
 | 
			
		||||
                    for (let container of containers) {
 | 
			
		||||
                        for (let input of container.querySelectorAll('input')) {
 | 
			
		||||
                            if (input.checked) {
 | 
			
		||||
                                return isForward === input.value;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                toggle_callback: function (c, dir) {
 | 
			
		||||
                    for (let div of c) {
 | 
			
		||||
                        let input = div.querySelector('input');
 | 
			
		||||
                        if ('hide' === dir) {
 | 
			
		||||
                            input.checked = false;
 | 
			
		||||
                            input.disabled = true;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            input.disabled = false;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   <button v-if="hasWorkflow"
 | 
			
		||||
      class="btn btn-primary"
 | 
			
		||||
      @click="openModal">
 | 
			
		||||
@@ -7,36 +7,39 @@
 | 
			
		||||
      <template v-if="countWorkflows > 1">{{ $t('workflows') }}</template>
 | 
			
		||||
      <template v-else>{{ $t('workflow') }}</template>
 | 
			
		||||
   </button>
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   <pick-workflow v-else-if="allowCreate"
 | 
			
		||||
      :relatedEntityClass="this.relatedEntityClass"
 | 
			
		||||
      :relatedEntityId="this.relatedEntityId"
 | 
			
		||||
      :workflowsAvailables="workflowsAvailables"
 | 
			
		||||
      @go-to-generate-workflow="goToGenerateWorkflow"
 | 
			
		||||
   ></pick-workflow>
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   <teleport to="body">
 | 
			
		||||
      <modal v-if="modal.showModal"
 | 
			
		||||
         :modalDialogClass="modal.modalDialogClass"
 | 
			
		||||
         @close="modal.showModal = false">
 | 
			
		||||
         
 | 
			
		||||
 | 
			
		||||
         <template v-slot:header>
 | 
			
		||||
            <h2 class="modal-title">{{ $t('workflow_list') }}</h2>
 | 
			
		||||
         </template>
 | 
			
		||||
         
 | 
			
		||||
 | 
			
		||||
         <template v-slot:body>
 | 
			
		||||
            <list-workflow-vue
 | 
			
		||||
               :workflows="workflows"
 | 
			
		||||
            ></list-workflow-vue>
 | 
			
		||||
         </template>
 | 
			
		||||
         
 | 
			
		||||
 | 
			
		||||
         <template v-slot:footer>
 | 
			
		||||
            <pick-workflow v-if="allowCreate"
 | 
			
		||||
               :relatedEntityClass="this.relatedEntityClass"
 | 
			
		||||
               :relatedEntityId="this.relatedEntityId"
 | 
			
		||||
               :workflowsAvailables="workflowsAvailables"
 | 
			
		||||
               :preventDefaultMoveToGenerate="this.$props.preventDefaultMoveToGenerate"
 | 
			
		||||
               @go-to-generate-workflow="this.goToGenerateWorkflow"
 | 
			
		||||
            ></pick-workflow>
 | 
			
		||||
         </template>
 | 
			
		||||
         
 | 
			
		||||
 | 
			
		||||
      </modal>
 | 
			
		||||
   </teleport>
 | 
			
		||||
</template>
 | 
			
		||||
@@ -53,6 +56,7 @@ export default {
 | 
			
		||||
      PickWorkflow,
 | 
			
		||||
      ListWorkflowVue
 | 
			
		||||
   },
 | 
			
		||||
   emits: ['goToGenerateWorkflow'],
 | 
			
		||||
   props: {
 | 
			
		||||
      workflows: {
 | 
			
		||||
         type: Array,
 | 
			
		||||
@@ -73,9 +77,14 @@ export default {
 | 
			
		||||
      workflowsAvailables: {
 | 
			
		||||
         type: Array,
 | 
			
		||||
         required: true,
 | 
			
		||||
      }
 | 
			
		||||
      },
 | 
			
		||||
      preventDefaultMoveToGenerate: {
 | 
			
		||||
          type: Boolean,
 | 
			
		||||
          required: false,
 | 
			
		||||
          default: false,
 | 
			
		||||
      },
 | 
			
		||||
   },
 | 
			
		||||
   data() {
 | 
			
		||||
    data() {
 | 
			
		||||
      return {
 | 
			
		||||
         modal: {
 | 
			
		||||
            showModal: false,
 | 
			
		||||
@@ -95,6 +104,10 @@ export default {
 | 
			
		||||
      openModal() {
 | 
			
		||||
         this.modal.showModal = true;
 | 
			
		||||
      },
 | 
			
		||||
      goToGenerateWorkflow(data) {
 | 
			
		||||
          console.log('go to generate workflow intercepted');
 | 
			
		||||
          this.$emit('goToGenerateWorkflow', data);
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   i18n: {
 | 
			
		||||
      messages: {
 | 
			
		||||
@@ -108,4 +121,4 @@ export default {
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped></style>
 | 
			
		||||
<style scoped></style>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
            </button>
 | 
			
		||||
            <ul class="dropdown-menu" aria-labelledby="createWorkflowButton">
 | 
			
		||||
                <li v-for="w in workflowsAvailables" :key="w.name">
 | 
			
		||||
                    <a class="dropdown-item" :href="makeLink(w.name)" @click="goToGenerateWorkflow($event, w.name)">{{ w.text }}</a>
 | 
			
		||||
                    <a class="dropdown-item" :href="makeLink(w.name)" @click.prevent="goToGenerateWorkflow($event, w.name)">{{ w.text }}</a>
 | 
			
		||||
                </li>
 | 
			
		||||
            </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -31,7 +31,12 @@ export default {
 | 
			
		||||
        workflowsAvailables: {
 | 
			
		||||
            type: Array,
 | 
			
		||||
            required: true,
 | 
			
		||||
        }
 | 
			
		||||
        },
 | 
			
		||||
        preventDefaultMoveToGenerate: {
 | 
			
		||||
            type: Boolean,
 | 
			
		||||
            required: false,
 | 
			
		||||
            default: false,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    emits: ['goToGenerateWorkflow'],
 | 
			
		||||
    methods: {
 | 
			
		||||
@@ -39,6 +44,12 @@ export default {
 | 
			
		||||
            return buildLinkCreate(workflowName, this.relatedEntityClass, this.relatedEntityId);
 | 
			
		||||
        },
 | 
			
		||||
        goToGenerateWorkflow(event, workflowName) {
 | 
			
		||||
            console.log('goToGenerateWorkflow', event, workflowName);
 | 
			
		||||
 | 
			
		||||
            if (!this.$props.preventDefaultMoveToGenerate) {
 | 
			
		||||
                event.target.click();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.$emit('goToGenerateWorkflow', {event, workflowName, link: this.makeLink(workflowName)});
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,60 @@
 | 
			
		||||
{% if transition_form is not null %}
 | 
			
		||||
    {{ form_start(transition_form) }}
 | 
			
		||||
 | 
			
		||||
    {{ form_row(transition_form.transition) }}
 | 
			
		||||
    {% set step = entity_workflow.currentStepChained %}
 | 
			
		||||
    {% set labels = workflow_metadata(entity_workflow, 'label', step.currentStep) %}
 | 
			
		||||
    {% set label = labels is null ? step.currentStep : labels|localize_translatable_string %}
 | 
			
		||||
 | 
			
		||||
    <div class="card">
 | 
			
		||||
        <div class="card-body">
 | 
			
		||||
            <div class="row">
 | 
			
		||||
                <div class="col-sm-12">
 | 
			
		||||
                    {{ 'workflow.Current step'|trans }} :
 | 
			
		||||
                    <span class="badge bg-primary">{{ label }}</span>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            {% if step.previous is not null %}
 | 
			
		||||
                {% if step.previous.comment is not empty %}
 | 
			
		||||
                    <div class="row">
 | 
			
		||||
                        <div class="col-sm-12">
 | 
			
		||||
                            <blockquote class="chill-user-quote">
 | 
			
		||||
                                {{ step.previous.comment|chill_markdown_to_html }}
 | 
			
		||||
                            </blockquote>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
                <div class="row">
 | 
			
		||||
                    <div class="col-sm-12">
 | 
			
		||||
                        {{ 'By'|trans }}
 | 
			
		||||
                        {{ step.previous.transitionBy|chill_entity_render_box }},
 | 
			
		||||
                        {{ step.previous.transitionAt|format_datetime('short', 'short') }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            {% else %}
 | 
			
		||||
                <div class="row">
 | 
			
		||||
                    <div class="col-sm-4">{{ 'workflow.Created by'|trans }}</div>
 | 
			
		||||
                    <div class="col-sm-8">{{ step.entityWorkflow.createdBy|chill_entity_render_box }}</div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="row">
 | 
			
		||||
                    <div class="col-sm-4">{{ 'Le'|trans }}</div>
 | 
			
		||||
                    <div class="col-sm-8">{{ step.entityWorkflow.createdAt|format_datetime('short', 'short') }}</div>
 | 
			
		||||
                </div>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <div id="transitionFilter">
 | 
			
		||||
        {% if transition_form.transitionFilter is defined %}
 | 
			
		||||
            {{ form_row(transition_form.transitionFilter) }}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="transitions">
 | 
			
		||||
        {{ form_row(transition_form.transition) }}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    {% if transition_form.freezeAfter is defined %}
 | 
			
		||||
        {{ form_row(transition_form.freezeAfter) }}
 | 
			
		||||
 
 | 
			
		||||
@@ -69,6 +69,18 @@
 | 
			
		||||
                    </blockquote>
 | 
			
		||||
                </div>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
            {% if loop.last and step.destUser|length > 0 %}
 | 
			
		||||
                <div class="item-row separator">
 | 
			
		||||
                    <div>
 | 
			
		||||
                        <p><b>{{ 'workflow.Users allowed to apply transition'|trans }} : </b></p>
 | 
			
		||||
                        <ul>
 | 
			
		||||
                            {% for u in step.destUser %}
 | 
			
		||||
                                <li>{{ u|chill_entity_render_box }}</li>
 | 
			
		||||
                            {% endfor %}
 | 
			
		||||
                        </ul>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
 
 | 
			
		||||
@@ -370,7 +370,8 @@ Workflow history: Historique de la décision
 | 
			
		||||
 | 
			
		||||
workflow:
 | 
			
		||||
    Created by: Créé par
 | 
			
		||||
    Transition to apply: Ma décision
 | 
			
		||||
    My decision: Ma décision
 | 
			
		||||
    Next step: Prochaine étape
 | 
			
		||||
    dest for next steps: Utilisateurs qui valideront la prochaine étape
 | 
			
		||||
    Freeze: Geler
 | 
			
		||||
    Freezed: Gelé
 | 
			
		||||
@@ -392,6 +393,9 @@ workflow:
 | 
			
		||||
    dest: Workflows en attente d'action
 | 
			
		||||
    you subscribed to all steps: Vous recevrez une notification à chaque étape
 | 
			
		||||
    you subscribed to final step: Vous recevrez une notification à l'étape finale
 | 
			
		||||
    Current step: Étape actuelle
 | 
			
		||||
    Comment on last change: Commentaire à la transition précédente
 | 
			
		||||
    Users allowed to apply transition: Utilisateurs pouvant valider cette étape
 | 
			
		||||
 | 
			
		||||
Subscribe final: Recevoir une notification à l'étape finale
 | 
			
		||||
Subscribe all steps: Recevoir une notification à chaque étape
 | 
			
		||||
 
 | 
			
		||||
@@ -213,7 +213,7 @@ class AccompanyingPeriod implements
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Column(type="date")
 | 
			
		||||
     * @Groups({"read", "write", "docgen:read"})
 | 
			
		||||
     * @Assert\LessThan(value= "today", groups={AccompanyingPeriod::STEP_CONFIRMED})
 | 
			
		||||
     * @Assert\LessThan(value="today", groups={AccompanyingPeriod::STEP_CONFIRMED})
 | 
			
		||||
     * @Assert\LessThan(propertyPath="closingDate", groups={AccompanyingPeriod::STEP_CONFIRMED})
 | 
			
		||||
     */
 | 
			
		||||
    private ?DateTime $openingDate = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,11 @@ final class AccompanyingPeriodRepository implements ObjectRepository
 | 
			
		||||
        $this->repository = $entityManager->getRepository(AccompanyingPeriod::class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function countBy(array $criteria): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->repository->count($criteria);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function countByRecentUserHistory(User $user, DateTimeImmutable $since): int
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->buildQueryByRecentUserHistory($user, $since);
 | 
			
		||||
@@ -35,11 +40,6 @@ final class AccompanyingPeriodRepository implements ObjectRepository
 | 
			
		||||
        return $qb->select('count(a)')->getQuery()->getSingleScalarResult();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function countBy(array $criteria): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->repository->count($criteria);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function createQueryBuilder(string $alias, ?string $indexBy = null): QueryBuilder
 | 
			
		||||
    {
 | 
			
		||||
        return $this->repository->createQueryBuilder($alias, $indexBy);
 | 
			
		||||
 
 | 
			
		||||
@@ -251,6 +251,7 @@
 | 
			
		||||
          relatedEntityClass="Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork"
 | 
			
		||||
          :relatedEntityId="this.work.id"
 | 
			
		||||
          :workflowsAvailables="this.work.workflows_availables"
 | 
			
		||||
          @go-to-generate-workflow="goToGenerateWorkflow"
 | 
			
		||||
       ></list-workflow-modal>
 | 
			
		||||
    </li>
 | 
			
		||||
 | 
			
		||||
@@ -284,6 +285,7 @@ import OnTheFly from 'ChillMainAssets/vuejs/OnTheFly/components/OnTheFly.vue';
 | 
			
		||||
import ListWorkflowModal from 'ChillMainAssets/vuejs/_components/EntityWorkflow/ListWorkflowModal.vue';
 | 
			
		||||
import PickWorkflow from 'ChillMainAssets/vuejs/_components/EntityWorkflow/PickWorkflow.vue';
 | 
			
		||||
import PersonText from 'ChillPersonAssets/vuejs/_components/Entity/PersonText.vue';
 | 
			
		||||
import {buildLinkCreate} from 'ChillMainAssets/lib/entity-workflow/api.js';
 | 
			
		||||
 | 
			
		||||
const i18n = {
 | 
			
		||||
   messages: {
 | 
			
		||||
@@ -334,7 +336,6 @@ export default {
 | 
			
		||||
      ListWorkflowModal,
 | 
			
		||||
      OnTheFly,
 | 
			
		||||
      PickWorkflow,
 | 
			
		||||
      OnTheFly,
 | 
			
		||||
      PersonText,
 | 
			
		||||
   },
 | 
			
		||||
   i18n,
 | 
			
		||||
@@ -461,6 +462,15 @@ export default {
 | 
			
		||||
      removeThirdParty(t) {
 | 
			
		||||
         this.$store.commit('removeThirdParty', t);
 | 
			
		||||
      },
 | 
			
		||||
      goToGenerateWorkflow({link}) {
 | 
			
		||||
        console.log('save before leave to generate workflow')
 | 
			
		||||
        const callback = (data) => {
 | 
			
		||||
          window.location.assign(link);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return this.$store.dispatch('submit', callback)
 | 
			
		||||
            .catch(e => { console.log(e); throw e; });
 | 
			
		||||
      },
 | 
			
		||||
      submit() {
 | 
			
		||||
         this.$store.dispatch('submit');
 | 
			
		||||
      },
 | 
			
		||||
 
 | 
			
		||||
@@ -10,16 +10,16 @@
 | 
			
		||||
 | 
			
		||||
        <ul class="record_actions">
 | 
			
		||||
           <li v-if="evaluation.workflows_availables.length > 0">
 | 
			
		||||
             
 | 
			
		||||
 | 
			
		||||
              <list-workflow-modal
 | 
			
		||||
                 :workflows="evaluation.workflows"
 | 
			
		||||
                 :allowCreate="true"
 | 
			
		||||
                 relatedEntityClass="faked"
 | 
			
		||||
                 relatedEntityClass="Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation"
 | 
			
		||||
                 :relatedEntityId="evaluation.id"
 | 
			
		||||
                 :workflowsAvailables="evaluation.workflows_availables"
 | 
			
		||||
                 @goToGenerateWorkflow="goToGenerateWorkflow"
 | 
			
		||||
                 @go-to-generate-workflow="goToGenerateWorkflow"
 | 
			
		||||
             ></list-workflow-modal>
 | 
			
		||||
             
 | 
			
		||||
 | 
			
		||||
           </li>
 | 
			
		||||
            <li>
 | 
			
		||||
               <a class="btn btn-delete" @click="modal.showModal = true" :title="$t('action.delete')"></a>
 | 
			
		||||
@@ -106,8 +106,7 @@ export default {
 | 
			
		||||
         this.toggleEditEvaluation();
 | 
			
		||||
      },
 | 
			
		||||
      goToGenerateWorkflow({event, link, workflowName}) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
        console.log(event, link, workflowName);
 | 
			
		||||
        console.log('goToGenerate in evaluation', event, link, workflowName);
 | 
			
		||||
 | 
			
		||||
        const callback = (data) => {
 | 
			
		||||
          let evaluationId = data.accompanyingPeriodWorkEvaluations.find(e => e.key === this.evaluation.key).id;
 | 
			
		||||
 
 | 
			
		||||
@@ -210,6 +210,7 @@ const store = createStore({
 | 
			
		||||
        editEvaluation: true,
 | 
			
		||||
        workflows_availables: state.work.workflows_availables_evaluation,
 | 
			
		||||
        documents: [],
 | 
			
		||||
        workflows: [],
 | 
			
		||||
      };
 | 
			
		||||
      state.evaluationsPicked.push(e);
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user