From 10bdf63f0fe0b04d0ae351c2b32a3a7ee8c60a89 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Tue, 19 Aug 2025 16:26:44 -0400 Subject: [PATCH 1/8] FOUR-25905: Error in alternatives when changing the position of the stages --- ProcessMaker/Traits/HasVersioning.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ProcessMaker/Traits/HasVersioning.php b/ProcessMaker/Traits/HasVersioning.php index 5556cc5bab..c9a6968cad 100644 --- a/ProcessMaker/Traits/HasVersioning.php +++ b/ProcessMaker/Traits/HasVersioning.php @@ -11,6 +11,7 @@ use ProcessMaker\Models\Process; use ProcessMaker\Models\ProcessMakerModel; use ProcessMaker\Models\ProcessRequest; +use ProcessMaker\Models\ProcessVersion; trait HasVersioning { @@ -77,10 +78,16 @@ public function saveVersion() public function saveDraft(string $alternative = null) { $attributes = $this->getModelAttributes(); + $attributes['draft'] = true; if ($this->hasAlternative()) { $alternative = $alternative ?: $this->alternative; $attributes['alternative'] = $alternative; + + $processVersion = ProcessVersion::where('process_id', $this->id)->where('alternative', $attributes['alternative'])->where('draft', false)->first(); + if ($processVersion) { + $attributes['stages'] = $processVersion->stages; + } } return $this->versions()->updateOrCreate( From bb1aa5db57fc2f08e6b6e5389eddaeffdcb9b426 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Wed, 20 Aug 2025 15:52:05 -0400 Subject: [PATCH 2/8] FOUR-25905: Error in alternatives when changing the position of the stages --- ProcessMaker/Traits/HasVersioning.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Traits/HasVersioning.php b/ProcessMaker/Traits/HasVersioning.php index c9a6968cad..b1af167229 100644 --- a/ProcessMaker/Traits/HasVersioning.php +++ b/ProcessMaker/Traits/HasVersioning.php @@ -84,7 +84,7 @@ public function saveDraft(string $alternative = null) $alternative = $alternative ?: $this->alternative; $attributes['alternative'] = $alternative; - $processVersion = ProcessVersion::where('process_id', $this->id)->where('alternative', $attributes['alternative'])->where('draft', false)->first(); + $processVersion = ProcessVersion::where('process_id', $this->id)->where('alternative', $attributes['alternative'])->first(); if ($processVersion) { $attributes['stages'] = $processVersion->stages; } From 59927c8597aac8ef33aa89295985de4e86dc06bb Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Wed, 20 Aug 2025 15:54:46 -0400 Subject: [PATCH 3/8] FOUR-25905: Error in alternatives when changing the position of the stages --- ProcessMaker/Traits/HasVersioning.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Traits/HasVersioning.php b/ProcessMaker/Traits/HasVersioning.php index b1af167229..27ddc42c3d 100644 --- a/ProcessMaker/Traits/HasVersioning.php +++ b/ProcessMaker/Traits/HasVersioning.php @@ -86,7 +86,7 @@ public function saveDraft(string $alternative = null) $processVersion = ProcessVersion::where('process_id', $this->id)->where('alternative', $attributes['alternative'])->first(); if ($processVersion) { - $attributes['stages'] = $processVersion->stages; + $attributes['stages'] = $processVersion->stages; } } From dbcc43a03a1ca63ea7d1fe81d91780ef0274fc05 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Mon, 25 Aug 2025 18:17:30 -0400 Subject: [PATCH 4/8] =?UTF-8?q?FOUR-23421=20There=20is=20confusion=20with?= =?UTF-8?q?=20the=20stages=20when=20they=20are=20not=20published.=20=20##?= =?UTF-8?q?=20Description:=20Create=20a=20process=20Add=20Start=20Event=20?= =?UTF-8?q?=E2=86=92=20Task=20Form=20=E2=86=92=20End=20Event=20Create=20tw?= =?UTF-8?q?o=20stages=20and=20assigned=20these=20to=20flow=20to=20each=20t?= =?UTF-8?q?ask=20Publish=20the=20process=20Open=20the=20process=20by=20lau?= =?UTF-8?q?nchpad=20Create=20a=20case=20Return=20to=20process=20Delete=20t?= =?UTF-8?q?he=20stages=20in=20the=20process=20Does=20not=20publish=20the?= =?UTF-8?q?=20changes=20Go=20to=20process=20launchpad=20Check=20that=20sta?= =?UTF-8?q?ges=20are=20not=20present=20after=20the=20changes=20Create=20ne?= =?UTF-8?q?w=20cases=20The=20new=20cases=20are=20created=20with=20stage=20?= =?UTF-8?q?but=20it=20is=20not=20visible=20in=20process=20launchpad=20Curr?= =?UTF-8?q?ent=20Behavior:=20To=20stages=20are=20visible=20to=20start=20a?= =?UTF-8?q?=20CASE=20is=20necessary=20to=20publish=20the=20process=20with?= =?UTF-8?q?=20stages=20To=20stages=20are=20visible=20in=20LAUNCH=20PAD=20d?= =?UTF-8?q?oes=20not=20necessary=20to=20publish=20the=20process=20with=20s?= =?UTF-8?q?tages=20which=20causes=20confusion=20when=20displaying=20case?= =?UTF-8?q?=20information=20Expected=20Behavior:=20The=20information=20in?= =?UTF-8?q?=20launch=20pad=20should=20be=20sync=20If=20there=20are=20stage?= =?UTF-8?q?s=20the=20new=20cases=20should=20be=20created=20with=20the=20co?= =?UTF-8?q?rresponding=20stage=20If=20there=20are=20not=20stages=20the=20n?= =?UTF-8?q?ew=20cases=20should=20be=20created=20without=20stages=20To=20th?= =?UTF-8?q?is=20it=20necessary=20that=20stages=20will=20be=20publish=20to?= =?UTF-8?q?=20avoid=20errors=20and=20confusions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Related Tickets & Packages https://processmaker.atlassian.net/browse/FOUR-25926 --- .../modeler/components/inspector/StageManager.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/js/processes/modeler/components/inspector/StageManager.vue b/resources/js/processes/modeler/components/inspector/StageManager.vue index c54164b541..acd05d28f8 100644 --- a/resources/js/processes/modeler/components/inspector/StageManager.vue +++ b/resources/js/processes/modeler/components/inspector/StageManager.vue @@ -73,6 +73,10 @@ const getHighlightedNode = () => getModeler().highlightedNode; const getDefinition = () => getHighlightedNode().definition; +const saveProcess = () => { + currentInstance.proxy.$root.$children[0].$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); +} + const getConfigFromDefinition = (definition) => { let config = {}; try { @@ -150,14 +154,17 @@ const onChange = (stages) => { const onUpdate = (stages, index, val, Oldal) => { updateStagesForAllFlowConfigs(stages); + saveProcess(); }; const onRemove = (stages, index, removed) => { removeStageInAllFlowConfig(removed); + saveProcess(); }; const onClickCheckbox = (stage) => { applyStageToFlow(stage); + saveProcess(); }; const onClickSelected = (stage) => { From 79a54998f5445cbd7b4f81ef43230738d827bc75 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Tue, 26 Aug 2025 17:07:53 -0400 Subject: [PATCH 5/8] FOUR-25926 Observations --- .../js/processes/modeler/components/inspector/StageManager.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/js/processes/modeler/components/inspector/StageManager.vue b/resources/js/processes/modeler/components/inspector/StageManager.vue index acd05d28f8..ee9cd46619 100644 --- a/resources/js/processes/modeler/components/inspector/StageManager.vue +++ b/resources/js/processes/modeler/components/inspector/StageManager.vue @@ -74,6 +74,7 @@ const getHighlightedNode = () => getModeler().highlightedNode; const getDefinition = () => getHighlightedNode().definition; const saveProcess = () => { + currentInstance.proxy.$root.$children[0]?.autosaveApiCall?.(); currentInstance.proxy.$root.$children[0].$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); } From 91c0ea772f4c2f715987edf5d32e0933b9d6f786 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Wed, 27 Aug 2025 13:57:26 -0400 Subject: [PATCH 6/8] FOUR-25926 Fix the observations. --- resources/js/processes/modeler/components/ModelerApp.vue | 1 + .../processes/modeler/components/inspector/StageManager.vue | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/js/processes/modeler/components/ModelerApp.vue b/resources/js/processes/modeler/components/ModelerApp.vue index e9dec921ea..d2936c2c83 100644 --- a/resources/js/processes/modeler/components/ModelerApp.vue +++ b/resources/js/processes/modeler/components/ModelerApp.vue @@ -173,6 +173,7 @@ export default { }, }, mounted() { + window.$modelerApp = this; ProcessMaker.$modeler = this.$refs.modeler; window.ProcessMaker.EventBus.$emit("modeler-app-init", this); diff --git a/resources/js/processes/modeler/components/inspector/StageManager.vue b/resources/js/processes/modeler/components/inspector/StageManager.vue index ee9cd46619..f09e4dbed6 100644 --- a/resources/js/processes/modeler/components/inspector/StageManager.vue +++ b/resources/js/processes/modeler/components/inspector/StageManager.vue @@ -74,8 +74,9 @@ const getHighlightedNode = () => getModeler().highlightedNode; const getDefinition = () => getHighlightedNode().definition; const saveProcess = () => { - currentInstance.proxy.$root.$children[0]?.autosaveApiCall?.(); - currentInstance.proxy.$root.$children[0].$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); + window.$modelerApp?.autosaveApiCall?.(); + //Index 0 implies that the component is in a loop; therefore, it will exist anyway, and its existence is validated. + window.$modelerApp?.$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); } const getConfigFromDefinition = (definition) => { From b64a516ba173a5bce657d10830c01365fd4ad78a Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Tue, 2 Sep 2025 16:30:45 -0400 Subject: [PATCH 7/8] FOUR-25979 Label are not lost in alternative B MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description - Steps to Reproduce Create a process Add Start Event → Task form → End Event Add new stages Assign the stages in the flow Create alternative B Delete one alternative Publish the changes - Current Behavior Stage labels are not lost in both alternatives, this remain in alternative B - Expected Behavior Stage labels should lost in both alternatives ## Related Tickets & Packages https://processmaker.atlassian.net/browse/FOUR-25979 --- .../Controllers/Api/ProcessController.php | 26 +++++++++---------- ProcessMaker/Traits/HasVersioning.php | 5 +++- .../components/inspector/StageManager.vue | 4 ++- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/ProcessController.php b/ProcessMaker/Http/Controllers/Api/ProcessController.php index b9b14d3f11..8003a8251c 100644 --- a/ProcessMaker/Http/Controllers/Api/ProcessController.php +++ b/ProcessMaker/Http/Controllers/Api/ProcessController.php @@ -483,6 +483,9 @@ public function update(Request $request, Process $process) $lastVersion = $process->getDraftOrPublishedLatestVersion(); $process->bpmn = $lastVersion->bpmn; $process->alternative = $lastVersion->alternative; + $process->stages = $lastVersion->stages; + logger('update alternative:' . json_encode($lastVersion->alternative)); + logger('update stages:' . json_encode($lastVersion->stages)); $rules = Process::rules($process); if (!$request->has('name')) { @@ -2066,24 +2069,21 @@ public function saveStages(Request $request, Process $process) $stages = $request->input('stages'); if ($alternative === 'B') { - - // Get or create alternative B version - $alternativeVersion = ProcessVersion::where('process_id', $process->id) + ProcessVersion::where('process_id', $process->id) ->where('alternative', 'B') - ->first(); - - // Save stages to alternative B version - $alternativeVersion->stages = $stages; - $alternativeVersion->save(); - - return new ApiCollection($alternativeVersion->stages); + ->update([ + 'stages' => $stages, + ]); } else { - // Save stages to main process (alternative A) + ProcessVersion::where('process_id', $process->id) + ->where('alternative', 'A') + ->update([ + 'stages' => $stages, + ]); $process->stages = $stages; $process->save(); - - return new ApiCollection($process->stages); } + return new ApiCollection($stages); } /** diff --git a/ProcessMaker/Traits/HasVersioning.php b/ProcessMaker/Traits/HasVersioning.php index 27ddc42c3d..ef3d73ba89 100644 --- a/ProcessMaker/Traits/HasVersioning.php +++ b/ProcessMaker/Traits/HasVersioning.php @@ -84,7 +84,10 @@ public function saveDraft(string $alternative = null) $alternative = $alternative ?: $this->alternative; $attributes['alternative'] = $alternative; - $processVersion = ProcessVersion::where('process_id', $this->id)->where('alternative', $attributes['alternative'])->first(); + $processVersion = ProcessVersion::where('process_id', $this->id) + ->where('alternative', $attributes['alternative']) + ->where('draft', 1) + ->first(); if ($processVersion) { $attributes['stages'] = $processVersion->stages; } diff --git a/resources/js/processes/modeler/components/inspector/StageManager.vue b/resources/js/processes/modeler/components/inspector/StageManager.vue index f09e4dbed6..b655af3d6d 100644 --- a/resources/js/processes/modeler/components/inspector/StageManager.vue +++ b/resources/js/processes/modeler/components/inspector/StageManager.vue @@ -74,9 +74,10 @@ const getHighlightedNode = () => getModeler().highlightedNode; const getDefinition = () => getHighlightedNode().definition; const saveProcess = () => { + console.log("saveProcess"); window.$modelerApp?.autosaveApiCall?.(); //Index 0 implies that the component is in a loop; therefore, it will exist anyway, and its existence is validated. - window.$modelerApp?.$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); + //window.$modelerApp?.$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); } const getConfigFromDefinition = (definition) => { @@ -152,6 +153,7 @@ const removeStageToFlow = () => { const onChange = (stages) => { updateStagesForAllFlowConfigs(stages); saveStagesToApi(stages); + saveProcess(); }; const onUpdate = (stages, index, val, Oldal) => { From 5113ba2ac62f8bf5ec862ccdc1e46834af9bfb0d Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Tue, 2 Sep 2025 16:39:23 -0400 Subject: [PATCH 8/8] FOUR-25979 Remove unnecessary code. --- ProcessMaker/Http/Controllers/Api/ProcessController.php | 3 +-- .../js/processes/modeler/components/inspector/StageManager.vue | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/ProcessController.php b/ProcessMaker/Http/Controllers/Api/ProcessController.php index 8003a8251c..8a8d73562e 100644 --- a/ProcessMaker/Http/Controllers/Api/ProcessController.php +++ b/ProcessMaker/Http/Controllers/Api/ProcessController.php @@ -484,8 +484,6 @@ public function update(Request $request, Process $process) $process->bpmn = $lastVersion->bpmn; $process->alternative = $lastVersion->alternative; $process->stages = $lastVersion->stages; - logger('update alternative:' . json_encode($lastVersion->alternative)); - logger('update stages:' . json_encode($lastVersion->stages)); $rules = Process::rules($process); if (!$request->has('name')) { @@ -2083,6 +2081,7 @@ public function saveStages(Request $request, Process $process) $process->stages = $stages; $process->save(); } + return new ApiCollection($stages); } diff --git a/resources/js/processes/modeler/components/inspector/StageManager.vue b/resources/js/processes/modeler/components/inspector/StageManager.vue index b655af3d6d..d6038d9d5e 100644 --- a/resources/js/processes/modeler/components/inspector/StageManager.vue +++ b/resources/js/processes/modeler/components/inspector/StageManager.vue @@ -74,10 +74,7 @@ const getHighlightedNode = () => getModeler().highlightedNode; const getDefinition = () => getHighlightedNode().definition; const saveProcess = () => { - console.log("saveProcess"); window.$modelerApp?.autosaveApiCall?.(); - //Index 0 implies that the component is in a loop; therefore, it will exist anyway, and its existence is validated. - //window.$modelerApp?.$refs["external-ModalSaveVersion"]?.[0]?.saveModal?.(); } const getConfigFromDefinition = (definition) => {