From 8dd2afa73b0591726c0a4d838f4e353d431df48e Mon Sep 17 00:00:00 2001
From: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Date: Wed, 18 Sep 2024 04:33:27 +0100
Subject: [PATCH] Bug 10190: Clarify workflow

This patch re-arranges the edit/add modal form to clarify the
need to select context, then decide on editing an existing trigger or
adding a new one and then, and only then, exposes the actual rule inputs
---
 .../CirculationTriggersFormAdd.vue            | 53 ++++++++++++-------
 .../CirculationTriggers/TriggersTable.vue     | 46 ++++++++++++++--
 2 files changed, 77 insertions(+), 22 deletions(-)

diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/CirculationTriggersFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/CirculationTriggersFormAdd.vue
index 0ae22737919..998d3dcd8dd 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/CirculationTriggersFormAdd.vue
+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/CirculationTriggersFormAdd.vue
@@ -5,30 +5,21 @@
     <div v-if="initialized" class="modal-content">
         <form @submit="addCircRule($event)">
             <div class="modal-header">
-                <h1 v-if="!editMode">{{ $__("Add circulation trigger") }}</h1>
-                <h1 v-else>{{ $__("Edit circulation trigger") }}</h1>
+                <h1 class="modal-title" v-if="!editMode">
+                    {{ $__("Circulation triggers") }}
+                </h1>
+                <h1 class="modal-title" v-else>
+                    {{ $__("Edit circulation trigger") }}
+                </h1>
             </div>
             <div class="modal-body">
                 <div class="page-section bg-info" v-if="circRules.length">
-                    <h2>{{ $__("Trigger context") }}</h2>
+                    <h2>{{ $__("Circulation context") }}</h2>
                     <TriggerContext :ruleInfo="ruleInfo" />
-                    <h2 v-if="ruleInfo.numberOfTriggers > 0">
-                        {{ $__("Existing rules") }}
-                    </h2>
-                    <p v-if="ruleInfo.numberOfTriggers > 0">
-                        {{ $__("Notice") }} {{ " " + newTriggerNumber - 1 }}
-                    </p>
-                    <TriggersTable
-                        v-if="ruleInfo.numberOfTriggers > 0"
-                        :circRules="circRules"
-                        :triggerNumber="newTriggerNumber - 1"
-                        :modal="true"
-                        :ruleBeingEdited="ruleBeingEdited"
-                        :triggerBeingEdited="triggerBeingEdited"
-                        :letters="letters"
-                    />
                 </div>
+
                 <fieldset class="rows">
+                    <legend>{{ $__("Select trigger context") }}</legend>
                     <ol>
                         <li>
                             <label for="library_id" class="required"
@@ -102,6 +93,32 @@
                             </v-select>
                             <span class="required">{{ $__("Required") }}</span>
                         </li>
+                    </ol>
+
+                    <div
+                        class="page-section bg-warning-subtle"
+                        v-if="circRules.length"
+                    >
+                        <TriggersTable
+                            :circRules="circRules"
+                            :triggerNumber="newTriggerNumber - 1"
+                            :modal="true"
+                            :ruleBeingEdited="ruleBeingEdited"
+                            :triggerBeingEdited="triggerBeingEdited"
+                            :letters="letters"
+                        />
+                    </div>
+                </fieldset>
+
+                <fieldset class="rows" v-if="editMode">
+                    <legend v-if="ruleInfo.numberOfTriggers < newTriggerNumber">
+                        {{ $__("Add new trigger") }}
+                        {{ " " + newTriggerNumber }}
+                    </legend>
+                    <legend v-else>
+                        {{ $__("Edit trigger") }} {{ " " + newTriggerNumber }}
+                    </legend>
+                    <ol>
                         <li>
                             <label for="overdue_delay"
                                 >{{ $__("Delay") }}:
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/TriggersTable.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/TriggersTable.vue
index 06d540e93b9..1e208c2ab1d 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/TriggersTable.vue
+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Admin/CirculationTriggers/TriggersTable.vue
@@ -1,6 +1,12 @@
 <template>
     <div class="page-section">
-        <div class="page-section bg-info">{{ $__("Bolid italic values denote fallback values where an override has not been set for the context.") }}</div>
+        <div class="page-section bg-info" v-if="!modal">
+            {{
+                $__(
+                    "Bolid italic values denote fallback values where an override has not been set for the context."
+                )
+            }}
+        </div>
         <table>
             <thead>
                 <th v-if="!modal">
@@ -10,7 +16,7 @@
                     {{ $__("Item type") }}
                 </th>
                 <th v-if="modal">
-                    {{ $__("Rule") }}
+                    {{ $__("Trigger") }}
                 </th>
                 <th>
                     {{ $__("Delay") }}
@@ -260,6 +266,28 @@
                         >
                     </td>
                 </tr>
+                <tr v-if="modal">
+                    <td colspan="7"></td>
+                    <td class="actions">
+                        <router-link
+                            :to="{
+                                name: 'CirculationTriggersFormEdit',
+                                query: {
+                                    library_id:
+                                        ruleBeingEdited.context.library_id,
+                                    item_type_id:
+                                        ruleBeingEdited.context.item_type_id,
+                                    patron_category_id:
+                                        ruleBeingEdited.context
+                                            .patron_category_id,
+                                    triggerNumber: numberOfTriggers + 1,
+                                },
+                            }"
+                            class="btn btn-default btn-xs"
+                            ><i class="fa-solid fa-pencil"></i> Add</router-link
+                        >
+                    </td>
+                </tr>
             </tbody>
         </table>
     </div>
@@ -277,6 +305,11 @@ export default {
         "itemTypes",
         "letters",
     ],
+    data() {
+        return {
+            numberOfTriggers: 0,
+        }
+    },
     methods: {
         handleContext(value, data, type, displayProperty = "name") {
             const item = data.find(item => item[type] === value)
@@ -304,12 +337,17 @@ export default {
 
             // Calculate the number of 'overdue_X_' triggers in the effectiveRule
             const regex = /overdue_(\d+)_delay/g
-            const numberOfTriggers = Object.keys(effectiveRule).filter(
+            this.numberOfTriggers = Object.keys(effectiveRule).filter(
                 key => regex.test(key) && effectiveRule[key] !== null
             ).length
 
+            // Shortcut for the case where no triggers exist yet
+            if (this.numberOfTriggers === 0) {
+                return undefined
+            }
+
             // Ensure there is one contextRule per 'X' from 1 to numberOfTriggers
-            for (let i = 1; i <= numberOfTriggers; i++) {
+            for (let i = 1; i <= this.numberOfTriggers; i++) {
                 // Check if there's already a rule for overdue_X_ in contextRules
                 const matchingRule = contextRules.find(
                     rule => rule[`overdue_${i}_delay`] !== undefined
-- 
2.47.0