diff --git a/ProcessMaker/Filters/Filter.php b/ProcessMaker/Filters/Filter.php index 2ae8b71ca4..04e381a2da 100644 --- a/ProcessMaker/Filters/Filter.php +++ b/ProcessMaker/Filters/Filter.php @@ -13,6 +13,8 @@ class Filter { const TYPE_PARTICIPANTS = 'Participants'; + const TYPE_PARTICIPANTS_FULLNAME = 'ParticipantsFullName'; + const TYPE_STATUS = 'Status'; const TYPE_FIELD = 'Field'; @@ -195,6 +197,9 @@ private function valueAliasMethod() case self::TYPE_PARTICIPANTS: $method = 'valueAliasParticipant'; break; + case self::TYPE_PARTICIPANTS_FULLNAME: + $method = 'valueAliasParticipantByFullName'; + break; case self::TYPE_STATUS: $method = 'valueAliasStatus'; break; diff --git a/ProcessMaker/Models/ProcessRequest.php b/ProcessMaker/Models/ProcessRequest.php index 43c3ea179c..7c10244fcf 100644 --- a/ProcessMaker/Models/ProcessRequest.php +++ b/ProcessMaker/Models/ProcessRequest.php @@ -725,6 +725,26 @@ public function valueAliasParticipant($value, $expression) } } + /** + * PMQL value alias for participant field by fullname. + * @param string $value + * @return callable + */ + public function valueAliasParticipantByFullName($value, $expression) + { + return function ($query) use ($value, $expression) { + $query->whereIn('id', function ($subquery) use ($value, $expression) { + $subquery->select('process_request_id')->from('process_request_tokens') + ->whereIn('user_id', function ($subquery) use ($value, $expression) { + $subquery->select('id') + ->from('users') + ->whereRaw("CONCAT(firstname, ' ', lastname) " . $expression->operator . " ?", [$value]); + }) + ->whereIn('element_type', ['task', 'userTask', 'startEvent']); + }); + }; + } + /** * Get the process version used by this request * diff --git a/resources/js/common/PMColumnFilterPopoverCommonMixin.js b/resources/js/common/PMColumnFilterPopoverCommonMixin.js index 6b03592443..0e749b1269 100644 --- a/resources/js/common/PMColumnFilterPopoverCommonMixin.js +++ b/resources/js/common/PMColumnFilterPopoverCommonMixin.js @@ -123,7 +123,7 @@ const PMColumnFilterCommonMixin = { if (column.format) { format = column.format; } - if (column.field === "status" || column.field === "assignee" || column.field === "participants" || column.field === 'process') { + if (column.field === "status" || column.field === "assignee") { format = "stringSelect"; } return format; @@ -136,17 +136,14 @@ const PMColumnFilterCommonMixin = { if (column.field === "assignee") { formatRange = this.viewAssignee; } - if (column.field === "participants") { - formatRange = this.viewParticipants; - } - if (column.field === "process") { - formatRange = this.viewProcesses; - } return formatRange; }, getOperators(column) { let operators = []; - if (column.field === "status" || column.field === "assignee" || column.field === "participants" || column.field === 'process') { + if (column.field === "case_title" || column.field === "name" || column.field === "process" || column.field === "task_name" || column.field === "participants") { + operators = ["=", "in", "contains", "regex"]; + } + if (column.field === "status" || column.field === "assignee") { operators = ["=", "in"]; } return operators; diff --git a/resources/js/components/PMColumnFilterPopover/PMColumnFilterForm.vue b/resources/js/components/PMColumnFilterPopover/PMColumnFilterForm.vue index c905b7d675..476ed8f79e 100644 --- a/resources/js/components/PMColumnFilterPopover/PMColumnFilterForm.vue +++ b/resources/js/components/PMColumnFilterPopover/PMColumnFilterForm.vue @@ -2,7 +2,8 @@
+ @onChange="onChangeSort" + v-if="typeof hideSortingButtons === 'boolean' ? !hideSortingButtons : true">
@@ -90,7 +91,7 @@ components: { ...Components }, - props: ["type", "value", "format", "formatRange", "operators", "viewConfig", "sort"], + props: ["type", "value", "format", "formatRange", "operators", "viewConfig", "sort", "hideSortingButtons"], data() { return { items: [], diff --git a/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue b/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue index 7e3586317c..6e0a4703a5 100644 --- a/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue +++ b/resources/js/components/PMColumnFilterPopover/PMColumnFilterPopover.vue @@ -23,6 +23,7 @@ :operators="operators" :viewConfig="viewConfig" :sort="sort" + :hideSortingButtons="hideSortingButtons" @onChangeSort="onChangeSort" @onApply="onApply" @onClear="onClear" @@ -41,7 +42,7 @@ PMColumnFilterForm, PMColumnFilterIconThreeDots }, - props: ["container", "boundary", "id", "type", "value", "format", "formatRange", "operators", "viewConfig", "sort"], + props: ["container", "boundary", "id", "type", "value", "format", "formatRange", "operators", "viewConfig", "sort", "hideSortingButtons"], data() { return { popoverShow: false @@ -103,4 +104,4 @@ .popover{ max-width: 375px; } - \ No newline at end of file + diff --git a/resources/js/requests/components/RequestsListing.vue b/resources/js/requests/components/RequestsListing.vue index d1b3bf72ca..5207d5f959 100644 --- a/resources/js/requests/components/RequestsListing.vue +++ b/resources/js/requests/components/RequestsListing.vue @@ -29,6 +29,7 @@ :viewConfig="getViewConfigFilter()" :container="''" :boundary="'viewport'" + :hideSortingButtons="column.hideSortingButtons" @onChangeSort="onChangeSort($event, column.field)" @onApply="onApply($event, column.field)" @onClear="onClear(column.field)" @@ -266,6 +267,7 @@ export default { default: true, width: 160, truncate: true, + hideSortingButtons: true, }, { label: this.$t("Status"), @@ -527,7 +529,7 @@ export default { type = "Task"; } if (value === "participants") { - type = "Participants"; + type = "ParticipantsFullName"; } if (value === "status") { type = "Status";