Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions ProcessMaker/Http/Controllers/Api/TaskController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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')
);
}
}
}

Expand Down
15 changes: 14 additions & 1 deletion ProcessMaker/Http/Controllers/RequestController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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']
));
}

Expand Down
15 changes: 14 additions & 1 deletion ProcessMaker/Http/Controllers/TaskController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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 = '')
Expand Down
4 changes: 2 additions & 2 deletions resources/js/components/shared/Column.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<span class="column-label" :class="{'without-format': withoutFormat}">{{ item.label }}</span>
</div>
<div>
<a v-show="!withoutConfig" class="text-primary column-button" v-b-modal.column-modal v-if="! item.default" @click="onConfig"><i class="fa fa-cog fa-fw"></i></a>
<a v-show="!withoutConfig" class="text-primary column-button" v-b-modal.column-modal v-if="! item.default || forceEnableConfig" @click="onConfig"><i class="fa fa-cog fa-fw"></i></a>
<a v-show="!withoutRemove" class="text-primary column-button" @click="onRemove"><i class="fa fa-times fa-fw"></i></a>
</div>
</div>
Expand All @@ -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
Expand Down
14 changes: 11 additions & 3 deletions resources/js/components/shared/ColumnConfig.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
<b-input v-model="column.label" ref="labelInput"></b-input>
</b-form-group>
<b-form-group :label="$t('Field')" class="mb-4">
<b-input v-model="column.field"></b-input>
<b-input v-model="column.field" :disabled="editOnlyLabel && column.default"></b-input>
</b-form-group>
<b-form-group :label="$t('Format')" class="mb-4">
<data-format-selector v-model="column.format"></data-format-selector>
<data-format-selector v-model="column.format" :disabled="editOnlyLabel && column.default"></data-format-selector>
</b-form-group>
<b-form-group :label="$t('Currency Format')" class="mb-4" v-if="column.format == 'currency'">
<data-mask-selector v-model="column.mask"></data-mask-selector>
</b-form-group>
<b-form-group class="mb-4">
<b-form-checkbox v-model="column.sortable" switch>
<b-form-checkbox v-model="column.sortable" :disabled="editOnlyLabel && column.default" switch>
{{ $t('Sortable') }}
</b-form-checkbox>
</b-form-group>
Expand All @@ -44,6 +44,12 @@ export default {
DataFormatSelector,
DataMaskSelector
},
props: {
editOnlyLabel: {
type: Boolean,
default: false,
},
},
data() {
return {
disabled: true,
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
7 changes: 6 additions & 1 deletion resources/js/components/shared/DataFormatSelector.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
:searchable="true"
:internal-search="true"
:allow-empty="false"
:disabled="disabled"
>
</multiselect>
</div>
Expand All @@ -24,7 +25,11 @@ export default {
value: {
type: String,
default: 'string'
}
},
disabled: {
type: Boolean,
default: false,
},
},
data() {
return {
Expand Down
5 changes: 3 additions & 2 deletions resources/js/requests/components/RequestsListing.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 = {
Expand Down
3 changes: 2 additions & 1 deletion resources/js/requests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ new Vue({
CounterCard, CounterCardGroup, RequestsListing
},
data: {
columns: window.Processmaker.defaultColumns || null,
filter: "",
pmql: "",
urlPmql: "",
Expand All @@ -22,7 +23,7 @@ new Vue({
additions: [],
},
created() {
const params = {};
let status;

switch (Processmaker.status) {
case "":
Expand Down
18 changes: 11 additions & 7 deletions resources/js/tasks/components/TasksList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -268,18 +272,18 @@ export default {
openRequest(data) {
return `/requests/${data.id}`;
},
formatCaseNumber(processRequest) {
formatCaseNumber(processRequest, record) {
return `
<a href="${this.openRequest(processRequest, 1)}"
class="text-nowrap">
# ${processRequest.case_number}
# ${processRequest.case_number || record.case_number}
</a>`;
},
formatCaseTitle(processRequest) {
formatCaseTitle(processRequest, record) {
return `
<a href="${this.openRequest(processRequest, 1)}"
class="text-nowrap">
${processRequest.case_title_formatted || ""}
${processRequest.case_title_formatted || record.case_title || ""}
</a>`;
},
formatActiveTask(row) {
Expand Down Expand Up @@ -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 = {
Expand Down
1 change: 1 addition & 0 deletions resources/js/tasks/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ new Vue({
el: "#tasks",
components: { TasksList },
data: {
columns: window.Processmaker.defaultColumns || null,
filter: "",
pmql: "",
urlPmql: "",
Expand Down
25 changes: 24 additions & 1 deletion resources/views/requests/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,33 @@ function() use ($title) { return [__($title), null]; }
</div>
</template>

<template v-slot:right-buttons>
@if(Route::has('package.savedsearch.defaults.edit'))
<b-button
class="ml-md-2"
href="{{route(
'package.savedsearch.defaults.edit',
[
'type'=>'request',
'key'=>'requests',
]
)}}"
>
<i class="fas fw fa-cog"></i>
</b-button>
@endif
</template>

</pmql-input>
</div>
</div>
</div>
<requests-listing ref="requestList" :filter="filter" :pmql="fullPmql"></requests-listing>
<requests-listing
ref="requestList"
:filter="filter"
:columns="columns"
:pmql="fullPmql"
></requests-listing>
</div>

</div>
Expand All @@ -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);
</script>
<script src="{{mix('js/requests/index.js')}}"></script>
@endsection
Expand Down
25 changes: 24 additions & 1 deletion resources/views/tasks/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,33 @@
</div>
</template>

<template v-slot:right-buttons>
@if(Route::has('package.savedsearch.defaults.edit'))
<b-button
class="ml-md-2"
href="{{route(
'package.savedsearch.defaults.edit',
[
'type'=>'task',
'key'=>'tasks',
]
)}}"
>
<i class="fas fw fa-cog"></i>
</b-button>
@endif
</template>
</pmql-input>
</div>
</div>
</div>
<tasks-list ref="taskList" :filter="filter" :pmql="fullPmql" @in-overdue="setInOverdueMessage"></tasks-list>
<tasks-list
ref="taskList"
:filter="filter"
:pmql="fullPmql"
:columns="columns"
@in-overdue="setInOverdueMessage"
></tasks-list>
</div>

</div>
Expand All @@ -82,6 +104,7 @@
@section('js')
<script>
window.Processmaker.filter_user = @json($userFilter);
window.Processmaker.defaultColumns = @json($defaultColumns);
</script>
<script src="{{mix('js/tasks/index.js')}}"></script>
@endsection
Expand Down