From a3e8f9e22528ec1d8fdd9442b18575d63a0e678c Mon Sep 17 00:00:00 2001 From: CarliPinell Date: Wed, 22 May 2024 01:40:30 +0000 Subject: [PATCH 01/11] Saving progress working fine --- .../Controllers/Api/TaskDraftController.php | 14 +++- .../js/tasks/components/QuickFillPreview.vue | 82 ++++++++++++++++--- resources/views/tasks/preview.blade.php | 13 ++- routes/api.php | 1 + 4 files changed, 98 insertions(+), 12 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/TaskDraftController.php b/ProcessMaker/Http/Controllers/Api/TaskDraftController.php index d9b4c6bae8..a721e6c434 100644 --- a/ProcessMaker/Http/Controllers/Api/TaskDraftController.php +++ b/ProcessMaker/Http/Controllers/Api/TaskDraftController.php @@ -12,6 +12,19 @@ class TaskDraftController extends Controller { + public function index(Request $request, ProcessRequestToken $task) + { + $search = ['task_id' => $task->id]; + $draft = TaskDraft::where($search)->first(); + + if ($draft) { + $draftData = $draft->data; + return new ApiResource($draftData); + } + + return new ApiResource(null); + } + public function update(Request $request, ProcessRequestToken $task) { $search = ['task_id' => $task->id]; @@ -24,7 +37,6 @@ public function update(Request $request, ProcessRequestToken $task) } $draft->data = $data; $draft->saveOrFail(); - return new ApiResource($draft); } diff --git a/resources/js/tasks/components/QuickFillPreview.vue b/resources/js/tasks/components/QuickFillPreview.vue index 4356c1ee60..6f4df64f13 100644 --- a/resources/js/tasks/components/QuickFillPreview.vue +++ b/resources/js/tasks/components/QuickFillPreview.vue @@ -270,16 +270,78 @@ export default { this.$emit("close"); }, buttonThisDataFromFullTask(data) { - return ProcessMaker.apiClient - .put("drafts/" + this.task.id, data) - .then((response) => { - this.task.draft = _.merge({}, this.task.draft, response.data); - window.location.href = `/tasks/${this.task.id}/edit`; - ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); - }) - .catch((error) => { - console.error("Error", error); - }); + // return ProcessMaker.apiClient + // .put("drafts/" + this.task.id, data) + // .then((response) => { + // this.task.draft = _.merge({}, this.task.draft, response.data); + // window.location.href = `/tasks/${this.task.id}/edit`; + // ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); + // }) + // .catch((error) => { + // console.error("Error", error); + // }); + + if (this.propFromButton === "fullTask") { + return new Promise((resolve, reject) => { + ProcessMaker.apiClient.get("drafts/" + this.task.id) + .then(responseGet => { + const dataFromGet = responseGet.data; + if (Array.isArray(dataFromGet) && dataFromGet.length === 0) { + console.log("devuelve array vacio: ", dataFromGet); + // Si dataFromGet es un array vacío, mantén la variable data original + resolve(data); + } else { + console.log("devuelve objeto"); + // Si dataFromGet no es un array vacío, asigna su valor a data + //const newData = dataFromGet; + const newData = _.mergeWith( + _.cloneDeep(dataFromGet), + data, + (objValue, srcValue) => { + // If object value is falsy returns value from source(event.detail) + if (!objValue) { + return srcValue; + } + // Otherwise, keeps object value(this.formData) + return objValue; + } + ); + resolve(newData); + } + }) + .catch(errorGet => { + reject(errorGet); + }); + }) + .then(dataToUse => { + return ProcessMaker.apiClient.put("drafts/" + this.task.id, dataToUse) + .then(responsePut => { + this.task.draft = _.merge({}, this.task.draft, responsePut.data); + window.location.href = `/tasks/${this.task.id}/edit`; + ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); + }) + .catch(errorPut => { + console.error("Error", errorPut); + }); + }) + .catch(error => { + console.error("Error", error); + }); + } else { + return ProcessMaker.apiClient + .put("drafts/" + this.task.id, data) + .then((response) => { + this.task.draft = _.merge({}, this.task.draft, response.data); + window.location.href = `/tasks/${this.task.id}/edit`; + ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); + }) + .catch((error) => { + console.error("Error", error); + }); + + } + + }, /* * To do: There's a global-search-bar class with a large z-index. We added a class diff --git a/resources/views/tasks/preview.blade.php b/resources/views/tasks/preview.blade.php index 0e7a734d77..7a8b876683 100644 --- a/resources/views/tasks/preview.blade.php +++ b/resources/views/tasks/preview.blade.php @@ -437,7 +437,18 @@ class="card border-0" }); window.addEventListener('fillData', event => { - this.formData = _.merge(_.cloneDeep(this.formData), event.detail); + this.formData = _.mergeWith( + _.cloneDeep(this.formData), + event.detail, + (objValue, srcValue) => { + // If object value is falsy returns value from source(event.detail) + if (!objValue) { + return srcValue; + } + // Otherwise, keeps object value(this.formData) + return objValue; + } + ); }); window.addEventListener('eraseData', event => { diff --git a/routes/api.php b/routes/api.php index 7ca9f54b60..f19aa4f79a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -196,6 +196,7 @@ Route::put('tasks/{task}/setPriority', [TaskController::class, 'setPriority'])->name('tasks.priority'); // TaskDrafts + Route::get('drafts/{task}', [TaskDraftController::class, 'index'])->name('taskdraft.index'); Route::put('drafts/{task}', [TaskDraftController::class, 'update'])->name('taskdraft.update'); Route::delete('drafts/{task}', [TaskDraftController::class, 'delete'])->name('taskdraft.delete'); From a795af01bb9be96873db011b6be0b8d0f8330f95 Mon Sep 17 00:00:00 2001 From: CarliPinell Date: Wed, 22 May 2024 14:22:22 +0000 Subject: [PATCH 02/11] Ready for PR1 --- .../components/InboxRuleFillData.vue | 13 ++++++++++++- .../js/tasks/components/QuickFillPreview.vue | 18 ++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/resources/js/inbox-rules/components/InboxRuleFillData.vue b/resources/js/inbox-rules/components/InboxRuleFillData.vue index ce5a5f0364..b9ff5e4afa 100644 --- a/resources/js/inbox-rules/components/InboxRuleFillData.vue +++ b/resources/js/inbox-rules/components/InboxRuleFillData.vue @@ -44,7 +44,18 @@ this.$emit("data", this.formData); }, propInboxQuickFill() { - this.formData = _.merge({}, this.formData, this.propInboxQuickFill); + console.log("InboxRuleFillData this.formData: ",this.formData); + console.log("InboxRuleFillData this.propInboxQuickFill: ",this.propInboxQuickFill); + //this.formData = _.merge({}, this.formData, this.propInboxQuickFill); + this.formData = _.mergeWith(this.formData, this.propInboxQuickFill, + (objValue, srcValue) => { + // If object value is falsy returns value from source(event.detail) + if (!objValue) { + return srcValue; + } + // Otherwise, keeps object value(this.formData) + return objValue; + }); this.iframeContentWindow.location.reload(); } }, diff --git a/resources/js/tasks/components/QuickFillPreview.vue b/resources/js/tasks/components/QuickFillPreview.vue index 6f4df64f13..b91ac091b2 100644 --- a/resources/js/tasks/components/QuickFillPreview.vue +++ b/resources/js/tasks/components/QuickFillPreview.vue @@ -270,30 +270,16 @@ export default { this.$emit("close"); }, buttonThisDataFromFullTask(data) { - // return ProcessMaker.apiClient - // .put("drafts/" + this.task.id, data) - // .then((response) => { - // this.task.draft = _.merge({}, this.task.draft, response.data); - // window.location.href = `/tasks/${this.task.id}/edit`; - // ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); - // }) - // .catch((error) => { - // console.error("Error", error); - // }); - if (this.propFromButton === "fullTask") { return new Promise((resolve, reject) => { ProcessMaker.apiClient.get("drafts/" + this.task.id) .then(responseGet => { const dataFromGet = responseGet.data; if (Array.isArray(dataFromGet) && dataFromGet.length === 0) { - console.log("devuelve array vacio: ", dataFromGet); - // Si dataFromGet es un array vacío, mantén la variable data original + // If dataFromGet is an empty array keeps original form data resolve(data); } else { - console.log("devuelve objeto"); - // Si dataFromGet no es un array vacío, asigna su valor a data - //const newData = dataFromGet; + // If dataFromGet is an object asigns its value to form data const newData = _.mergeWith( _.cloneDeep(dataFromGet), data, From 83e35f9a13a46c917017cf812226cefc5e253e41 Mon Sep 17 00:00:00 2001 From: CarliPinell Date: Wed, 22 May 2024 14:42:49 +0000 Subject: [PATCH 03/11] Ready for PR 2 --- resources/js/inbox-rules/components/InboxRuleFillData.vue | 3 --- 1 file changed, 3 deletions(-) diff --git a/resources/js/inbox-rules/components/InboxRuleFillData.vue b/resources/js/inbox-rules/components/InboxRuleFillData.vue index b9ff5e4afa..82f627bbab 100644 --- a/resources/js/inbox-rules/components/InboxRuleFillData.vue +++ b/resources/js/inbox-rules/components/InboxRuleFillData.vue @@ -44,9 +44,6 @@ this.$emit("data", this.formData); }, propInboxQuickFill() { - console.log("InboxRuleFillData this.formData: ",this.formData); - console.log("InboxRuleFillData this.propInboxQuickFill: ",this.propInboxQuickFill); - //this.formData = _.merge({}, this.formData, this.propInboxQuickFill); this.formData = _.mergeWith(this.formData, this.propInboxQuickFill, (objValue, srcValue) => { // If object value is falsy returns value from source(event.detail) From 4be573aa15d6a1ce0433aebfb985bd88128abf58 Mon Sep 17 00:00:00 2001 From: CarliPinell Date: Wed, 22 May 2024 14:57:27 +0000 Subject: [PATCH 04/11] Ready for PR 3 --- .../js/tasks/components/QuickFillPreview.vue | 86 ++++++++----------- 1 file changed, 35 insertions(+), 51 deletions(-) diff --git a/resources/js/tasks/components/QuickFillPreview.vue b/resources/js/tasks/components/QuickFillPreview.vue index b91ac091b2..044e2871c2 100644 --- a/resources/js/tasks/components/QuickFillPreview.vue +++ b/resources/js/tasks/components/QuickFillPreview.vue @@ -270,64 +270,48 @@ export default { this.$emit("close"); }, buttonThisDataFromFullTask(data) { - if (this.propFromButton === "fullTask") { - return new Promise((resolve, reject) => { - ProcessMaker.apiClient.get("drafts/" + this.task.id) - .then(responseGet => { - const dataFromGet = responseGet.data; - if (Array.isArray(dataFromGet) && dataFromGet.length === 0) { - // If dataFromGet is an empty array keeps original form data - resolve(data); - } else { - // If dataFromGet is an object asigns its value to form data - const newData = _.mergeWith( - _.cloneDeep(dataFromGet), - data, - (objValue, srcValue) => { - // If object value is falsy returns value from source(event.detail) - if (!objValue) { - return srcValue; - } - // Otherwise, keeps object value(this.formData) - return objValue; - } - ); - resolve(newData); + return new Promise((resolve, reject) => { + ProcessMaker.apiClient.get("drafts/" + this.task.id) + .then(responseGet => { + const dataFromGet = responseGet.data; + if (Array.isArray(dataFromGet) && dataFromGet.length === 0) { + // If dataFromGet is an empty array keeps original form data + resolve(data); + } else { + // If dataFromGet is an object asigns its value to form data + const newData = _.mergeWith( + _.cloneDeep(dataFromGet), + data, + (objValue, srcValue) => { + // If object value is falsy returns value from source(data) + if (!objValue) { + return srcValue; + } + // Otherwise, keeps object value(dataFromGet) + return objValue; } - }) - .catch(errorGet => { - reject(errorGet); - }); + ); + resolve(newData); + } }) - .then(dataToUse => { - return ProcessMaker.apiClient.put("drafts/" + this.task.id, dataToUse) - .then(responsePut => { - this.task.draft = _.merge({}, this.task.draft, responsePut.data); - window.location.href = `/tasks/${this.task.id}/edit`; - ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); - }) - .catch(errorPut => { - console.error("Error", errorPut); - }); + .catch(errorGet => { + reject(errorGet); + }); + }) + .then(dataToUse => { + return ProcessMaker.apiClient.put("drafts/" + this.task.id, dataToUse) + .then(responsePut => { + this.task.draft = _.merge({}, this.task.draft, responsePut.data); + window.location.href = `/tasks/${this.task.id}/edit`; + ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); }) - .catch(error => { - console.error("Error", error); + .catch(errorPut => { + console.error("Error", errorPut); }); - } else { - return ProcessMaker.apiClient - .put("drafts/" + this.task.id, data) - .then((response) => { - this.task.draft = _.merge({}, this.task.draft, response.data); - window.location.href = `/tasks/${this.task.id}/edit`; - ProcessMaker.alert(this.$t("Task Filled successfully."), "success"); }) - .catch((error) => { + .catch(error => { console.error("Error", error); }); - - } - - }, /* * To do: There's a global-search-bar class with a large z-index. We added a class From f0b91f5956e3d0866965e83af442d6fb4e401f30 Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Wed, 22 May 2024 14:12:03 -0700 Subject: [PATCH 05/11] Refactor quickfill from full screen --- .../Http/Controllers/TaskController.php | 4 ++ .../js/tasks/components/QuickFillPreview.vue | 72 ++++++++----------- resources/views/tasks/editQuickFill.blade.php | 8 ++- 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/ProcessMaker/Http/Controllers/TaskController.php b/ProcessMaker/Http/Controllers/TaskController.php index f66d143828..cb8ccdc17d 100644 --- a/ProcessMaker/Http/Controllers/TaskController.php +++ b/ProcessMaker/Http/Controllers/TaskController.php @@ -165,8 +165,12 @@ public function edit(ProcessRequestToken $task, string $preview = '') public function quickFillEdit(ProcessRequestToken $task) { + $screenVersion = $task->getScreenVersion(); + $screenFields = $screenVersion ? $screenVersion->screenFilteredFields() : []; + return view('tasks.editQuickFill', [ 'task' => $task, + 'screenFields' => $screenFields, ]); } } diff --git a/resources/js/tasks/components/QuickFillPreview.vue b/resources/js/tasks/components/QuickFillPreview.vue index 044e2871c2..5cdc27e8a0 100644 --- a/resources/js/tasks/components/QuickFillPreview.vue +++ b/resources/js/tasks/components/QuickFillPreview.vue @@ -175,7 +175,7 @@