From 205078e4c47fe6d779865005213fb886cdcb73f2 Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Fri, 2 Feb 2024 17:05:13 -0800 Subject: [PATCH 01/16] Refactor --- .../PMColumnFilterPopoverCommonMixin.js | 30 ++++++++++++++++++- resources/js/components/shared/PmqlInput.vue | 26 ++++++++++++++-- .../requests/components/RequestsListing.vue | 14 +++------ resources/js/tasks/components/TasksList.vue | 16 ++++------ 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/resources/js/common/PMColumnFilterPopoverCommonMixin.js b/resources/js/common/PMColumnFilterPopoverCommonMixin.js index 6b03592443..dc0eece5a8 100644 --- a/resources/js/common/PMColumnFilterPopoverCommonMixin.js +++ b/resources/js/common/PMColumnFilterPopoverCommonMixin.js @@ -8,7 +8,27 @@ const PMColumnFilterCommonMixin = { viewProcesses: [] }; }, + watch: { + advancedFilter() { + console.log("Advanced filter set", JSON.stringify(this.advancedFilter)); + } + }, methods: { + storeFilterConfiguration() { + const { order, type } = this.filterConfiguration(); + let url = "users/store_filter_configuration/"; + if (this.$props.columns) { + url += "savedSearch|" + this.savedSearch; + } else { + url += type; + } + let config = { + filter: this.advancedFilter, + order, + }; + ProcessMaker.apiClient.put(url, config); + window.Processmaker.filter_user = config; + }, getViewConfigFilter() { return [ { @@ -67,15 +87,23 @@ const PMColumnFilterCommonMixin = { } ]; }, - onApply(json, index) { + addAliases(json) { let oldValue, type, value; for (let i in json) { + console.log("JSON", json[i]); oldValue = json[i].subject.value; type = this.getTypeColumnFilter(oldValue); value = this.getAliasColumnForFilter(oldValue); json[i].subject.type = type; json[i].subject.value = value; + + if (json[i].or && json[i].or.length > 0) { + this.addAliases(json[i].or); + } } + }, + onApply(json, index) { + this.addAliases(json); this.advancedFilterInit(); this.advancedFilter[index] = json; this.markStyleWhenColumnSetAFilter(); diff --git a/resources/js/components/shared/PmqlInput.vue b/resources/js/components/shared/PmqlInput.vue index 27da5985c6..d25f20d3f6 100755 --- a/resources/js/components/shared/PmqlInput.vue +++ b/resources/js/components/shared/PmqlInput.vue @@ -145,11 +145,11 @@
{{ $t(capitalizeString(filter[0])) }}: @@ -173,9 +173,11 @@ diff --git a/resources/js/tasks/components/TasksList.vue b/resources/js/tasks/components/TasksList.vue index 1e48eda37b..c4da7737a0 100644 --- a/resources/js/tasks/components/TasksList.vue +++ b/resources/js/tasks/components/TasksList.vue @@ -257,7 +257,7 @@ export default { this.getAssignee(""); this.getProcess(); this.setupColumns(); - this.getFilterConfiguration("taskFilter"); + this.getFilterConfiguration(); const params = new URL(document.location).searchParams; const successRouting = params.get("successfulRouting") === "true"; if (successRouting) { @@ -307,7 +307,7 @@ export default { default: true, width: 80, filter_subject: { type: 'Relationship', value: 'processRequest.case_number' }, - order_column: 'processRequest.case_number', + order_column: 'process_requests.case_number', }, { label: this.$t("Case title"), @@ -539,15 +539,6 @@ export default { type: 'taskFilter', } }, - getTypeColumnFilter(value) { - return this.tableHeaders.find(column => column.field === value)?.filter_subject?.type || "Field"; - }, - getAliasColumnForFilter(value) { - return this.tableHeaders.find(column => column.field === value)?.filter_subject?.value || value; - }, - getAliasColumnForOrderBy(value) { - return this.tableHeaders.find(column => column.field === value)?.order_column || value; - } } }; diff --git a/resources/views/requests/index.blade.php b/resources/views/requests/index.blade.php index 285fd97b53..093a5966e8 100644 --- a/resources/views/requests/index.blade.php +++ b/resources/views/requests/index.blade.php @@ -109,7 +109,7 @@ function() use ($title) { return [__($title), null]; } //Data needed for default search window.Processmaker.user = @json($currentUser); window.Processmaker.status = '{{ $type }}'; - window.Processmaker.filter_user = @json($userFilter); + window.ProcessMaker.advanced_filter = @json($userFilter); @endsection diff --git a/resources/views/tasks/index.blade.php b/resources/views/tasks/index.blade.php index 0b62c9d3c2..6c87f84eb8 100644 --- a/resources/views/tasks/index.blade.php +++ b/resources/views/tasks/index.blade.php @@ -81,7 +81,7 @@ @section('js') @endsection From 35cf25db850f2e5cefc90e1630ab588b8a2f948d Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Wed, 7 Feb 2024 09:28:09 -0800 Subject: [PATCH 11/16] Fix order column name --- resources/js/tasks/components/TasksList.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/tasks/components/TasksList.vue b/resources/js/tasks/components/TasksList.vue index c4da7737a0..d0af414428 100644 --- a/resources/js/tasks/components/TasksList.vue +++ b/resources/js/tasks/components/TasksList.vue @@ -318,7 +318,7 @@ export default { width: 220, truncate: true, filter_subject: { type: 'Relationship', value: 'processRequest.case_title' }, - order_column: 'processRequest.case_title', + order_column: 'process_requests.case_title', }, { label: this.$t("Process"), From 25c7d22227670712a1e7cf0cfa30959b78366f0e Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Wed, 7 Feb 2024 12:48:39 -0800 Subject: [PATCH 12/16] Fix loading advanced filters --- ProcessMaker/Filters/SaveSession.php | 4 +++- .../PMColumnFilterPopoverCommonMixin.js | 22 ++++++++++++------- .../PMColumnFilterPopover.vue | 4 +--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/ProcessMaker/Filters/SaveSession.php b/ProcessMaker/Filters/SaveSession.php index 77fd973e9b..3a9f8979a4 100644 --- a/ProcessMaker/Filters/SaveSession.php +++ b/ProcessMaker/Filters/SaveSession.php @@ -39,7 +39,9 @@ public static function getConfigFilter(String $name, Object $user) { $key = self::getKey($user, $name); - return self::get($key, []); + $default = ['filters' => []]; + + return self::get($key, $default); } /** diff --git a/resources/js/common/PMColumnFilterPopoverCommonMixin.js b/resources/js/common/PMColumnFilterPopoverCommonMixin.js index 48b028deac..61ad9c2e3f 100644 --- a/resources/js/common/PMColumnFilterPopoverCommonMixin.js +++ b/resources/js/common/PMColumnFilterPopoverCommonMixin.js @@ -88,8 +88,8 @@ const PMColumnFilterCommonMixin = { addAliases(json, key, label) { let type, value; for (let i in json) { - type = this.getTypeColumnFilter(json[i].subject.type); - value = this.getAliasColumnForFilter(json[i].subject.value); + type = this.getTypeColumnFilter(key, json[i].subject.type); + value = this.getAliasColumnForFilter(key, json[i].subject.value); json[i].subject.type = type; json[i].subject.value = value; json[i]._column_field = key; @@ -100,11 +100,11 @@ const PMColumnFilterCommonMixin = { } } }, - getTypeColumnFilter(value) { - return this.tableHeaders.find(column => column.field === value)?.filter_subject?.type || value; + getTypeColumnFilter(field, defaultType) { + return this.tableHeaders.find(column => column.field === field)?.filter_subject?.type || defaultType; }, - getAliasColumnForFilter(value) { - return this.tableHeaders.find(column => column.field === value)?.filter_subject?.value || value; + getAliasColumnForFilter(field, defaultValue) { + return this.tableHeaders.find(column => column.field === field)?.filter_subject?.value || defaultValue; }, getAliasColumnForOrderBy(value) { return this.tableHeaders.find(column => column.field === value)?.order_column || value; @@ -138,9 +138,12 @@ const PMColumnFilterCommonMixin = { formattedFilter() { const filterCopy = cloneDeep(this.advancedFilter); Object.keys(filterCopy).forEach((key) => { + if (filterCopy[key].length === 0) { + delete filterCopy[key]; + } const label = this.tableHeaders.find(column => column.field === key)?.label; this.addAliases(filterCopy[key], key, label); - }) + }); return this.json2Array(filterCopy).flat(1); }, getAdvancedFilter() { @@ -164,6 +167,10 @@ const PMColumnFilterCommonMixin = { let format = "string"; if (column.format) { format = column.format; + if (format === "int") { + // We don't have a field for integers + format = "string"; + } } if (column.field === "status" || column.field === "assignee" || column.field === "participants") { format = "stringSelect"; @@ -260,7 +267,6 @@ const PMColumnFilterCommonMixin = { if (!(key in filters)) { filters[key] = []; } - console.log("Setting filter for", key, filter); filters[key].push(filter); }); this.advancedFilter = filters; diff --git a/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue b/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue index 7e3586317c..14e735977c 100644 --- a/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue +++ b/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue @@ -47,11 +47,9 @@ popoverShow: false }; }, - updated() { - this.$emit("onUpdate", this); - }, methods: { onShown() { + this.$emit("onUpdate", this); this.focusCancelButton(); this.closeOnBlur(); }, From c2f07f4ca4548f562db8cb6bb5243b7953343b4f Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Wed, 7 Feb 2024 15:51:40 -0800 Subject: [PATCH 13/16] Remove debugging --- resources/js/common/advancedFilterStatusMixin.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/js/common/advancedFilterStatusMixin.js b/resources/js/common/advancedFilterStatusMixin.js index ba0699e908..778a200489 100644 --- a/resources/js/common/advancedFilterStatusMixin.js +++ b/resources/js/common/advancedFilterStatusMixin.js @@ -13,8 +13,6 @@ export default { methods: { setAdvancedFilter() { this.advancedFilter = get(window, 'ProcessMaker.advanced_filter.filters', []); - - // console.log("Got advanced filter", JSON.parse(JSON.stringify(this.advancedFilter))); }, formatForBadge(filters, result) { for(const filter of filters) { From 8c091a73a85287deff254da53154434d978b72e6 Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Thu, 8 Feb 2024 10:42:03 -0800 Subject: [PATCH 14/16] Fix default column filter subject type --- resources/js/common/PMColumnFilterPopoverCommonMixin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/common/PMColumnFilterPopoverCommonMixin.js b/resources/js/common/PMColumnFilterPopoverCommonMixin.js index 7e2da478b4..6f013aad6c 100644 --- a/resources/js/common/PMColumnFilterPopoverCommonMixin.js +++ b/resources/js/common/PMColumnFilterPopoverCommonMixin.js @@ -100,7 +100,7 @@ const PMColumnFilterCommonMixin = { } } }, - getTypeColumnFilter(field, defaultType) { + getTypeColumnFilter(field, defaultType = 'Field') { return this.tableHeaders.find(column => column.field === field)?.filter_subject?.type || defaultType; }, getAliasColumnForFilter(field, defaultValue) { From a4831b2f01b18b3c5ff7e7c24d3ce3c392f17d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Busso?= <90727999+agustinbusso@users.noreply.github.com> Date: Thu, 8 Feb 2024 16:56:53 -0300 Subject: [PATCH 15/16] Update assignees column to search using input instead select --- ProcessMaker/Filters/Filter.php | 5 +++++ ProcessMaker/Models/ProcessRequestToken.php | 14 ++++++++++++++ .../js/common/PMColumnFilterPopoverCommonMixin.js | 9 +++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ProcessMaker/Filters/Filter.php b/ProcessMaker/Filters/Filter.php index 04e381a2da..c010558ec6 100644 --- a/ProcessMaker/Filters/Filter.php +++ b/ProcessMaker/Filters/Filter.php @@ -15,6 +15,8 @@ class Filter const TYPE_PARTICIPANTS_FULLNAME = 'ParticipantsFullName'; + const TYPE_ASSIGNEES_FULLNAME = 'AssigneesFullName'; + const TYPE_STATUS = 'Status'; const TYPE_FIELD = 'Field'; @@ -200,6 +202,9 @@ private function valueAliasMethod() case self::TYPE_PARTICIPANTS_FULLNAME: $method = 'valueAliasParticipantByFullName'; break; + case self::TYPE_ASSIGNEES_FULLNAME: + $method = 'valueAliasAssigneeByFullName'; + break; case self::TYPE_STATUS: $method = 'valueAliasStatus'; break; diff --git a/ProcessMaker/Models/ProcessRequestToken.php b/ProcessMaker/Models/ProcessRequestToken.php index a058acfcd0..c9ceb6674a 100644 --- a/ProcessMaker/Models/ProcessRequestToken.php +++ b/ProcessMaker/Models/ProcessRequestToken.php @@ -758,6 +758,20 @@ public function valueAliasProcess_Name(string $value, Expression $expression): c }; } + /** + * PMQL value alias for assignee field by fullname. + * @param string $value + * @return callable + */ + public function valueAliasAssigneeByFullName($value, $expression) + { + return function ($query) use ($expression, $value) { + $query->whereHas('user', function ($query) use ($expression, $value) { + $query->whereRaw("CONCAT(firstname, ' ', lastname) " . $expression->operator . ' ?', [$value]); + }); + }; + } + /** * PMQL wildcard for process request & data fields * diff --git a/resources/js/common/PMColumnFilterPopoverCommonMixin.js b/resources/js/common/PMColumnFilterPopoverCommonMixin.js index 6f013aad6c..550cc36f3e 100644 --- a/resources/js/common/PMColumnFilterPopoverCommonMixin.js +++ b/resources/js/common/PMColumnFilterPopoverCommonMixin.js @@ -172,7 +172,7 @@ const PMColumnFilterCommonMixin = { format = "string"; } } - if (column.field === "status" || column.field === "assignee") { + if (column.field === "status") { format = "stringSelect"; } return format; @@ -182,17 +182,14 @@ const PMColumnFilterCommonMixin = { if (column.field === "status") { formatRange = this.getStatus(); } - if (column.field === "assignee") { - formatRange = this.viewAssignee; - } return formatRange; }, getOperators(column) { let operators = []; - if (column.field === "case_title" || column.field === "name" || column.field === "process" || column.field === "task_name" || column.field === "participants") { + if (column.field === "case_title" || column.field === "name" || column.field === "process" || column.field === "task_name" || column.field === "participants" || column.field === "assignee") { operators = ["=", "in", "contains", "regex"]; } - if (column.field === "status" || column.field === "assignee") { + if (column.field === "status") { operators = ["=", "in"]; } return operators; From dea13ecc3db77acbd1101f7d6409a4e4b9dd62e4 Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Thu, 8 Feb 2024 12:16:03 -0800 Subject: [PATCH 16/16] Remove json2array function --- resources/js/common/PMColumnFilterPopoverCommonMixin.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/resources/js/common/PMColumnFilterPopoverCommonMixin.js b/resources/js/common/PMColumnFilterPopoverCommonMixin.js index 550cc36f3e..d651a425ad 100644 --- a/resources/js/common/PMColumnFilterPopoverCommonMixin.js +++ b/resources/js/common/PMColumnFilterPopoverCommonMixin.js @@ -144,7 +144,7 @@ const PMColumnFilterCommonMixin = { const label = this.tableHeaders.find(column => column.field === key)?.label; this.addAliases(filterCopy[key], key, label); }); - return this.json2Array(filterCopy).flat(1); + return Object.values(filterCopy).flat(1); }, getAdvancedFilter() { let formattedFilter = this.formattedFilter(); @@ -270,13 +270,6 @@ const PMColumnFilterCommonMixin = { this.markStyleWhenColumnSetAFilter(); window.ProcessMaker.EventBus.$emit("advanced-filter-updated"); }, - json2Array(json) { - let result = []; - for (let i in json) { - result.push(json[i]); - } - return result; - } } }; export default PMColumnFilterCommonMixin;