From 946991bb9d7fff492db12d302d605b559a828e2c Mon Sep 17 00:00:00 2001 From: CarliPinell Date: Thu, 23 Jul 2026 21:53:55 -0400 Subject: [PATCH 1/2] Controls like loop, signature, record list now are not editable in COMPLETED Tasks --- src/components/renderer/add-loop-row.vue | 28 ++++- .../form-collection-record-control.vue | 42 +++++++- src/components/renderer/form-loop.vue | 28 ++++- .../renderer/form-nested-screen.vue | 16 ++- src/components/renderer/form-record-list.vue | 100 +++++++++++++++--- src/components/task.vue | 24 ++++- src/components/vue-form-renderer.vue | 33 +++++- src/mixins/Json2Vue.js | 12 ++- src/mixins/extensions/LoadFieldComponents.js | 9 ++ 9 files changed, 269 insertions(+), 23 deletions(-) diff --git a/src/components/renderer/add-loop-row.vue b/src/components/renderer/add-loop-row.vue index cf4c2ca60..7d3c72c76 100644 --- a/src/components/renderer/add-loop-row.vue +++ b/src/components/renderer/add-loop-row.vue @@ -7,7 +7,7 @@ @@ -44,15 +44,41 @@ export default { config: Object, error: String }, + computed: { + isDisabled() { + return Boolean( + this.config + && (this.config.disabled || this.config.readonly || this.config.editable === false) + ); + }, + canAddOrRemove() { + return Boolean( + this.value + && this.config + && this.config.settings + && this.config.settings.add + && !this.isDisabled + ); + } + }, methods: { async add() { + if (this.isDisabled) { + return; + } this.value.push({}); }, remove() { + if (this.isDisabled) { + return; + } const removed = this.value.pop(); this.$root.$emit("removed-loop", this, removed); }, removeConfirm() { + if (this.isDisabled) { + return; + } const message = this.$t("Are you sure you want to delete this?"); window.ProcessMaker.confirmModal(this.$t("Caution!"), message, "", () => { this.remove(); diff --git a/src/components/renderer/form-collection-record-control.vue b/src/components/renderer/form-collection-record-control.vue index 50db5fcb7..f64ea994f 100644 --- a/src/components/renderer/form-collection-record-control.vue +++ b/src/components/renderer/form-collection-record-control.vue @@ -10,6 +10,7 @@ :custom-css="customCss" :watchers="watchers" :_parent="_parent" + :read-only="isDisabled" /> @@ -43,7 +44,15 @@ export default { collectionmode: { type: Object }, - taskdraft: Object + taskdraft: Object, + disabled: { + type: [Boolean, String], + default: false + }, + readonly: { + type: [Boolean, String], + default: false + } }, data() { return { @@ -68,6 +77,16 @@ export default { }; }, computed: { + isDisabled() { + return Boolean( + this.disabled === true + || this.disabled === "true" + || this.disabled === "" + || this.readonly === true + || this.readonly === "true" + || this.readonly === "" + ); + }, validatedConfig() { return this.config && this.config[0] ? this.config : defaultConfig; }, @@ -79,6 +98,9 @@ export default { return this.localData; }, set(data) { + if (this.isDisabled) { + return; + } Object.keys(data).forEach((variable) => { this.validationData && this.$set(this.validationData, variable, data[variable]); @@ -138,6 +160,15 @@ export default { this.selRecordId, this.selDisplayMode ); + }, + isDisabled() { + if (this.selCollectionId && this.selRecordId) { + this.loadRecordCollection( + this.selCollectionId, + this.selRecordId, + this.selDisplayMode + ); + } } }, mounted() { @@ -224,7 +255,7 @@ export default { this.watchers = response.data.watchers; this.screenTitle = response.data.title; - if (this.$attrs.disabled) { + if (this.isDisabled) { this.disableForm(this.config); } }); @@ -242,6 +273,8 @@ export default { this.selCollectionId = collectionId; this.selRecordId = recordId; this.selDisplayMode = modeId; + // Completed/closed task previews must not load the editable collection screen. + const effectiveMode = this.isDisabled ? "View" : modeId; this.$dataProvider .getCollectionRecordsView(collectionId, recordId) .then((response) => { @@ -252,10 +285,10 @@ export default { // Choose screen id regarding of the display Mode this.screenCollectionId = typeof this.selDisplayMode === "function" - ? this.collectionmode.modeId === "View" + ? this.collectionmode.modeId === "View" || this.isDisabled ? viewScreen : editScreen - : this.selDisplayMode === "View" + : effectiveMode === "View" ? viewScreen : editScreen; this.loadScreen(this.screenCollectionId); @@ -265,6 +298,7 @@ export default { this.taskDraft?.draft?.data == null || this.taskDraft.draft.data === "" || !this.enableDraft + || this.isDisabled ) { this.localData = respData; } else { diff --git a/src/components/renderer/form-loop.vue b/src/components/renderer/form-loop.vue index 8cbb7bb8f..ce410a876 100644 --- a/src/components/renderer/form-loop.vue +++ b/src/components/renderer/form-loop.vue @@ -17,7 +17,7 @@ @update="setMatrixValue(loopIndex, $event)" /> - + { this.remove(); diff --git a/src/components/renderer/form-nested-screen.vue b/src/components/renderer/form-nested-screen.vue index 4c7ca872c..bb6e3b4a5 100644 --- a/src/components/renderer/form-nested-screen.vue +++ b/src/components/renderer/form-nested-screen.vue @@ -14,6 +14,7 @@ debug-context="Nested Screen" @css-errors="cssErrors = $event" :_parent="_parent" + :read-only="isDisabled" /> @@ -42,6 +43,8 @@ export default { validationData: null, _parent: null, ancestorScreens: {type: Array, default: () => []}, + disabled: { type: [Boolean, String], default: false }, + readonly: { type: [Boolean, String], default: false }, }, data() { return { @@ -54,6 +57,17 @@ export default { }; }, computed: { + isDisabled() { + return Boolean( + this.disabled === true + || this.disabled === "true" + || this.disabled === "" + || this.readonly === true + || this.readonly === "true" + || this.readonly === "" + || this.$attrs.disabled + ); + }, validatedConfig() { return this.config && this.config[0] ? this.config : defaultConfig; }, @@ -133,7 +147,7 @@ export default { this.watchers = response.data.watchers; this.screenTitle = response.data.title; - if (this.$attrs['disabled']) { + if (this.isDisabled) { this.disableForm(this.config); } diff --git a/src/components/renderer/form-record-list.vue b/src/components/renderer/form-record-list.vue index e76faaa3c..ec8b13770 100644 --- a/src/components/renderer/form-record-list.vue +++ b/src/components/renderer/form-record-list.vue @@ -6,7 +6,7 @@