diff --git a/ProcessMaker/Http/Controllers/Api/TaskController.php b/ProcessMaker/Http/Controllers/Api/TaskController.php index d4b0321ea9..16506b0855 100644 --- a/ProcessMaker/Http/Controllers/Api/TaskController.php +++ b/ProcessMaker/Http/Controllers/Api/TaskController.php @@ -185,8 +185,30 @@ public function index(Request $request, $getTotal = false, User $user = null) // order by one or more columns $orderColumns = explode(',', $request->input('order_by', 'updated_at')); foreach ($orderColumns as $column) { + $parts = explode('.', $column); + $table = count($parts) > 1 ? array_shift($parts) : 'process_request_tokens'; + $columnName = array_pop($parts); if (!Str::contains($column, '.')) { $query->orderBy($column, $request->input('order_direction', 'asc')); + } elseif ($table === 'process_request' || $table === 'processRequest') { + if ($columnName === 'id') { + $query->orderBy( + 'process_request_id', + $request->input('order_direction', 'asc') + ); + } else { + // Raw sort by (select column from process_requests ...) + $query->orderBy( + DB::raw("(select + $columnName + from + process_requests + where + process_requests.id = process_request_tokens.process_request_id + )"), + $request->input('order_direction', 'asc') + ); + } } } diff --git a/ProcessMaker/Http/Controllers/RequestController.php b/ProcessMaker/Http/Controllers/RequestController.php index 6f03db4b49..ed4d43d82e 100644 --- a/ProcessMaker/Http/Controllers/RequestController.php +++ b/ProcessMaker/Http/Controllers/RequestController.php @@ -22,6 +22,8 @@ use ProcessMaker\Models\ScreenVersion; use ProcessMaker\Models\UserResourceView; use ProcessMaker\Package\PackageComments\PackageServiceProvider; +use ProcessMaker\Package\SavedSearch\Http\Controllers\SavedSearchController; +use ProcessMaker\Package\SavedSearch\Models\SavedSearch; use ProcessMaker\RetryProcessRequest; use ProcessMaker\Traits\HasControllerAddons; use ProcessMaker\Traits\SearchAutocompleteTrait; @@ -61,8 +63,19 @@ public function index($type = null) $userFilter = SaveSession::getConfigFilter('requestFilter', Auth::user()); + // Get default Saved search config + $defaultSavedSearch = SavedSearch::firstSystemSearchFor( + Auth::user(), + SavedSearch::KEY_REQUESTS, + ); + if ($defaultSavedSearch) { + $defaultColumns = SavedSearchController::adjustColumnsOf($defaultSavedSearch->columns); + } else { + $defaultColumns = null; + } + return view('requests.index', compact( - ['type', 'title', 'currentUser', 'userFilter'] + ['type', 'title', 'currentUser', 'userFilter', 'defaultColumns'] )); } diff --git a/ProcessMaker/Http/Controllers/TaskController.php b/ProcessMaker/Http/Controllers/TaskController.php index a0c8095bee..ac20276af4 100644 --- a/ProcessMaker/Http/Controllers/TaskController.php +++ b/ProcessMaker/Http/Controllers/TaskController.php @@ -15,6 +15,8 @@ use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\UserResourceView; use ProcessMaker\Nayra\Contracts\Bpmn\ScriptTaskInterface; +use ProcessMaker\Package\SavedSearch\Http\Controllers\SavedSearchController; +use ProcessMaker\Package\SavedSearch\Models\SavedSearch; use ProcessMaker\Traits\HasControllerAddons; use ProcessMaker\Traits\SearchAutocompleteTrait; @@ -43,7 +45,18 @@ public function index() $userFilter = SaveSession::getConfigFilter('taskFilter', Auth::user()); - return view('tasks.index', compact('title', 'userFilter')); + // Get default Saved search config + $defaultSavedSearch = SavedSearch::firstSystemSearchFor( + Auth::user(), + SavedSearch::KEY_TASKS, + ); + if ($defaultSavedSearch) { + $defaultColumns = SavedSearchController::adjustColumnsOf($defaultSavedSearch->columns); + } else { + $defaultColumns = null; + } + + return view('tasks.index', compact('title', 'userFilter', 'defaultColumns')); } public function edit(ProcessRequestToken $task, string $preview = '') diff --git a/resources/js/components/shared/Column.vue b/resources/js/components/shared/Column.vue index 95350fe072..8f068d236c 100644 --- a/resources/js/components/shared/Column.vue +++ b/resources/js/components/shared/Column.vue @@ -10,7 +10,7 @@ {{ item.label }}
- +
@@ -22,7 +22,7 @@ import DataFormats from '../../data-formats'; export default { - props: ["column","withoutConfig","withoutRemove","withoutFormat"], + props: ["column","withoutConfig","withoutRemove","withoutFormat","forceEnableConfig"], data() { return { item: this.column diff --git a/resources/js/components/shared/ColumnConfig.vue b/resources/js/components/shared/ColumnConfig.vue index 2a6c1c182e..6c2dbfc225 100644 --- a/resources/js/components/shared/ColumnConfig.vue +++ b/resources/js/components/shared/ColumnConfig.vue @@ -10,16 +10,16 @@ - + - + - + {{ $t('Sortable') }} @@ -44,6 +44,12 @@ export default { DataFormatSelector, DataMaskSelector }, + props: { + editOnlyLabel: { + type: Boolean, + default: false, + }, + }, data() { return { disabled: true, @@ -102,6 +108,7 @@ export default { onShow() { this.index = this.$parent.columnToConfig.index; + this.original.default = this.$parent.columnToConfig.data.default; this.original.label = this.$parent.columnToConfig.data.label; this.original.field = this.$parent.columnToConfig.data.field; this.original.sortable = this.$parent.columnToConfig.data.sortable; @@ -114,6 +121,7 @@ export default { this.title = this.$t('Configure {{name}}', {name: this.original.label}); } + this.column.default = this.original.default; this.column.label = this.original.label; this.column.field = this.original.field; this.column.sortable = this.original.sortable; diff --git a/resources/js/components/shared/DataFormatSelector.vue b/resources/js/components/shared/DataFormatSelector.vue index bd3219e812..50bb1ff9e0 100644 --- a/resources/js/components/shared/DataFormatSelector.vue +++ b/resources/js/components/shared/DataFormatSelector.vue @@ -11,6 +11,7 @@ :searchable="true" :internal-search="true" :allow-empty="false" + :disabled="disabled" > @@ -24,7 +25,11 @@ export default { value: { type: String, default: 'string' - } + }, + disabled: { + type: Boolean, + default: false, + }, }, data() { return { diff --git a/resources/js/requests/components/RequestsListing.vue b/resources/js/requests/components/RequestsListing.vue index d1b3bf72ca..cffc8440a6 100644 --- a/resources/js/requests/components/RequestsListing.vue +++ b/resources/js/requests/components/RequestsListing.vue @@ -367,7 +367,8 @@ export default { }, }; }, - transform(data) { + transform(dataInput) { + const data = _.cloneDeep(dataInput); // Clean up fields for meta pagination so vue table pagination can understand data.meta.last_page = data.meta.total_pages; data.meta.from = (data.meta.current_page - 1) * data.meta.per_page; @@ -502,7 +503,7 @@ export default { */ storeFilterConfiguration() { let url = "users/store_filter_configuration/requestFilter"; - if (this.$props.columns) { + if (this.$props.columns && this.savedSearch) { url = "saved-searches/" + this.savedSearch + "/advanced-filters"; } let config = { diff --git a/resources/js/requests/index.js b/resources/js/requests/index.js index e05d764b79..00d6322f96 100644 --- a/resources/js/requests/index.js +++ b/resources/js/requests/index.js @@ -12,6 +12,7 @@ new Vue({ CounterCard, CounterCardGroup, RequestsListing }, data: { + columns: window.Processmaker.defaultColumns || null, filter: "", pmql: "", urlPmql: "", @@ -22,7 +23,7 @@ new Vue({ additions: [], }, created() { - const params = {}; + let status; switch (Processmaker.status) { case "": diff --git a/resources/js/tasks/components/TasksList.vue b/resources/js/tasks/components/TasksList.vue index a57360d4db..c9a9590ddc 100644 --- a/resources/js/tasks/components/TasksList.vue +++ b/resources/js/tasks/components/TasksList.vue @@ -240,8 +240,12 @@ export default { if (Array.isArray(newData.data) && newData.data.length > 0) { for (let record of newData.data) { //format Status - record["case_number"] = this.formatCaseNumber(record.process_request); - record["case_title"] = this.formatCaseTitle(record.process_request); + record["case_number"] = this.formatCaseNumber(record.process_request, record); + record["case_title"] = this.formatCaseTitle(record.process_request, record); + if (record.process_request) { + record.process_request["case_number"] = record["case_number"]; + record.process_request["case_title"] = record["case_title"]; + } record["status"] = this.formatStatus(record); record["assignee"] = this.formatAvatar(record["user"]); record["request"] = this.formatRequest(record); @@ -268,18 +272,18 @@ export default { openRequest(data) { return `/requests/${data.id}`; }, - formatCaseNumber(processRequest) { + formatCaseNumber(processRequest, record) { return ` - # ${processRequest.case_number} + # ${processRequest.case_number || record.case_number} `; }, - formatCaseTitle(processRequest) { + formatCaseTitle(processRequest, record) { return ` - ${processRequest.case_title_formatted || ""} + ${processRequest.case_title_formatted || record.case_title || ""} `; }, formatActiveTask(row) { @@ -522,7 +526,7 @@ export default { */ storeFilterConfiguration() { let url = "users/store_filter_configuration/taskFilter"; - if (this.$props.columns) { + if (this.$props.columns && this.savedSearch) { url = "saved-searches/" + this.savedSearch + "/advanced-filters"; } let config = { diff --git a/resources/js/tasks/index.js b/resources/js/tasks/index.js index e5acd43f5c..8f6d4e5a9e 100644 --- a/resources/js/tasks/index.js +++ b/resources/js/tasks/index.js @@ -5,6 +5,7 @@ new Vue({ el: "#tasks", components: { TasksList }, data: { + columns: window.Processmaker.defaultColumns || null, filter: "", pmql: "", urlPmql: "", diff --git a/resources/views/requests/index.blade.php b/resources/views/requests/index.blade.php index 285fd97b53..398ccc175e 100644 --- a/resources/views/requests/index.blade.php +++ b/resources/views/requests/index.blade.php @@ -89,11 +89,33 @@ function() use ($title) { return [__($title), null]; } + + - + @@ -110,6 +132,7 @@ function() use ($title) { return [__($title), null]; } window.Processmaker.user = @json($currentUser); window.Processmaker.status = '{{ $type }}'; window.Processmaker.filter_user = @json($userFilter); + window.Processmaker.defaultColumns = @json($defaultColumns); @endsection diff --git a/resources/views/tasks/index.blade.php b/resources/views/tasks/index.blade.php index 0b62c9d3c2..c27192eec0 100644 --- a/resources/views/tasks/index.blade.php +++ b/resources/views/tasks/index.blade.php @@ -64,11 +64,33 @@ + - + @@ -82,6 +104,7 @@ @section('js') @endsection