diff --git a/resources/assets/js/api/Cases.js b/resources/assets/js/api/Cases.js index ea0003d1f..3a009f571 100644 --- a/resources/assets/js/api/Cases.js +++ b/resources/assets/js/api/Cases.js @@ -18,25 +18,56 @@ export let cases = { keys: {} }); }, - draft(data) { + inbox(data) { + let service = "INBOX_LIST", + keys = {}; + if (data && data.id) { + service = "INBOX_CUSTOM_LIST"; + keys["id"] = data.id; + } return Api.get({ - service: "DRAFT_LIST", + service, + params: data.filters, + keys + }); + }, + draft(data) { + let service = "DRAFT_LIST", + keys = {}; + if (data && data.id) { + service = "DRAFT_CUSTOM_LIST"; + keys["id"] = data.id; + } + return Api.get({ + service, params: data, - keys: {} + keys }); }, paused(data) { + let service = "PAUSED_LIST", + keys = {}; + if (data && data.id) { + service = "PAUSED_CUSTOM_LIST"; + keys["id"] = data.id; + } return Api.get({ - service: "PAUSED_LIST", + service, params: data, - keys: {} + keys }); }, unassigned(data) { + let service = "UNASSIGNED_LIST", + keys = {}; + if (data && data.id) { + service = "UNASSIGNED_CUSTOM_LIST"; + keys["id"] = data.id; + } return Api.get({ - service: "UNASSIGNED_LIST", + service, params: data, - keys: {} + keys }); }, summary(data) { diff --git a/resources/assets/js/api/Services.js b/resources/assets/js/api/Services.js index 215bbd3ba..e874cc744 100644 --- a/resources/assets/js/api/Services.js +++ b/resources/assets/js/api/Services.js @@ -72,5 +72,9 @@ GET_CONFIG: "/home/config/{id}/{name}", PAUSE_CASE: "/cases/{app_uid}/pause", REASSIGN_CASE: "/cases/{app_uid}/reassign-case", - REASSIGN_USERS: "/light/userstoreassign/{task_uid}" + REASSIGN_USERS: "/light/userstoreassign/{task_uid}", + INBOX_CUSTOM_LIST: "/home/inbox/{id}", + DRAFT_CUSTOM_LIST: "/home/draft/{id}", + PAUSED_CUSTOM_LIST: "/home/paused/{id}", + UNASSIGNED_CUSTOM_LIST: "/home/unassigned/{id}" }; \ No newline at end of file diff --git a/resources/assets/js/components/utils/CustomTooltip.vue b/resources/assets/js/components/utils/CustomTooltip.vue index ecb31f6f3..1f360ba95 100644 --- a/resources/assets/js/components/utils/CustomTooltip.vue +++ b/resources/assets/js/components/utils/CustomTooltip.vue @@ -1,16 +1,16 @@ + + + diff --git a/resources/assets/js/home/CustomCaseList/defaultMixins.js b/resources/assets/js/home/CustomCaseList/defaultMixins.js new file mode 100644 index 000000000..1e96cdeee --- /dev/null +++ b/resources/assets/js/home/CustomCaseList/defaultMixins.js @@ -0,0 +1,197 @@ +import _ from "lodash"; +import api from "../../api/index"; +export default { + data() { + let that = this; + return { + typeView: "GRID", + random: 1, + dataCasesList: [], + defaultColumns: [ + "case_number", + "case_title", + "process_name", + "task", + "send_by", + "due_date", + "delegation_date", + "priority", + ], + dataMultiviewHeader: { + actions: [ + { + id: "view-grid", + title: "Grid", + onClick(action) { + that.typeView = "GRID"; + }, + icon: "fas fa-table", + }, + { + id: "view-list", + title: "List", + onClick(action) { + that.typeView = "LIST"; + }, + icon: "fas fa-list", + }, + { + id: "view-card", + title: "Card", + onClick(action) { + that.typeView = "CARD"; + }, + icon: "fas fa-th", + }, + ], + }, + optionsVueView: { + limit: 10, + dblClick: (event, item, options) => { + this.openCase(item); + }, + headings: { + case_number: this.$i18n.t("ID_MYCASE_NUMBER"), + case_title: this.$i18n.t("ID_CASE_TITLE"), + process_name: this.$i18n.t("ID_PROCESS_NAME"), + task: this.$i18n.t("ID_TASK"), + send_by: this.$i18n.t("ID_SEND_BY"), + current_user: this.$i18n.t("ID_CURRENT_USER"), + due_date: this.$i18n.t("ID_DUE_DATE"), + delegation_date: this.$i18n.t("ID_DELEGATION_DATE"), + priority: this.$i18n.t("ID_PRIORITY") + }, + columns: [], + requestFunction(data) { + return that.getCases(data); + }, + requestFunctionViewMore(data) { + return that.getCasesViewMore(data); + } + } + } + }, + created: function () { + + }, + methods: { + /** + * Get cases for Vue Card View + */ + getCases(data) { + let that = this, + dt, + start = 0, + limit = data.limit, + filters = {}; + filters = { + paged: "0," + limit, + }; + + _.forIn(this.filters, function (item, key) { + filters[item.filterVar] = item.value; + }); + return new Promise((resolutionFunc, rejectionFunc) => { + api.cases[that.data.pageParent](filters) + .then((response) => { + dt = that.formatDataResponse(response.data.data); + resolutionFunc({ + data: dt, + count: response.data.total, + }); + }) + .catch((e) => { + rejectionFunc(e); + }); + }); + }, + /** + * Get cases for Vue Card View + */ + getCasesViewMore(data) { + let that = this, + dt, + paged, + limit = data.limit, + start = data.page === 1 ? 0 : limit * (data.page - 1), + filters = {}; + paged = start + "," + limit; + + filters = { + paged: paged, + }; + _.forIn(this.filters, function (item, key) { + if (filters && item.value) { + filters[item.filterVar] = item.value; + } + }); + return new Promise((resolutionFunc, rejectionFunc) => { + api.cases[that.data.pageParent] + (filters) + .then((response) => { + dt = that.formatDataResponse(response.data.data); + resolutionFunc({ + data: dt, + count: response.data.total, + }); + }) + .catch((e) => { + rejectionFunc(e); + }); + }); + }, + /** + * Event handler when update the settings columns + * @param {*} columns + */ + onUpdateColumnSettings(columns) { + this.columns = this.getTableColumns(columns); + this.random = _.random(0, 10000000000); + }, + /** + * Get columns for origin , settings or custom cases list + */ + getColumnsFromSource() { + let dt = _.clone(this.dataCasesList), + res = _.clone(this.defaultColumns); + if (!this.data.customListId) { + res = _.map(_.filter(dt, o => o.set), s => s.field); + } + return res; + }, + /** + * Return the columns for table - concat with field "detail" "actions" + */ + getTableColumns(columns) { + return _.concat(["detail"], columns, ["actions"]); + }, + /** + * Return options for Table + * @returns Object + */ + getTableOptions() { + let dt = _.clone(this.options); + dt.headings = _.pick(this.headings, this.columns); + return dt; + }, + /** + * Return options for Table + * @returns Object + */ + getVueViewOptions() { + let dt = _.clone(this.optionsVueView); + dt.columns = this.cardColumns; + return dt; + }, + /** + * Format column settings for popover + * @param {*} headings + * @returns + */ + formatColumnSettings(columns) { + return _.map(_.pick(this.headings, columns), (value, key) => { + return { value, key } + }); + } + } +} \ No newline at end of file diff --git a/resources/assets/js/home/Draft/Draft.vue b/resources/assets/js/home/Draft/Draft.vue index 5a8de6de0..9c6dc9ad5 100644 --- a/resources/assets/js/home/Draft/Draft.vue +++ b/resources/assets/js/home/Draft/Draft.vue @@ -127,7 +127,7 @@ -
+
diff --git a/resources/assets/js/home/Draft/defaultMixins.js b/resources/assets/js/home/Draft/defaultMixins.js index eb1762c6b..db7efd865 100644 --- a/resources/assets/js/home/Draft/defaultMixins.js +++ b/resources/assets/js/home/Draft/defaultMixins.js @@ -50,7 +50,6 @@ export default { priority: this.$i18n.t("ID_PRIORITY") }, columns: [ - "detail", "case_number", "case_title", "process_name", diff --git a/resources/assets/js/home/Home.vue b/resources/assets/js/home/Home.vue index ce0c20e7f..8c3614b50 100644 --- a/resources/assets/js/home/Home.vue +++ b/resources/assets/js/home/Home.vue @@ -26,6 +26,7 @@ :defaultOption="defaultOption" :settings="config.setting[page]" :filters="filters" + :data="pageData" @onSubmitFilter="onSubmitFilter" @onRemoveFilter="onRemoveFilter" @onUpdatePage="onUpdatePage" @@ -53,6 +54,7 @@ import XCase from "./XCase"; import TaskReassignments from "./TaskReassignments"; import AdvancedSearch from "./AdvancedSearch/AdvancedSearch.vue"; import LegacyFrame from "./LegacyFrame"; +import CustomCaseList from "./CustomCaseList/CustomCaseList.vue" import api from "./../api/index"; import eventBus from './EventBus/eventBus' @@ -71,7 +73,8 @@ export default { Paused, Unassigned, CaseDetail, - LegacyFrame + LegacyFrame, + CustomCaseList, }, data() { return { @@ -105,7 +108,8 @@ export default { CASES_TO_REASSIGN: "task-reassignments", CASES_FOLDERS: "my-documents" }, - defaultOption: window.config.defaultOption || '' + defaultOption: window.config.defaultOption || '', + pageData: {} }; }, mounted() { @@ -243,11 +247,11 @@ export default { newData = data, auxId; for (i = 0; i < data.length; i += 1) { - auxId = data[i].id || ""; + auxId = data[i].page || ""; if (auxId !== "" && this.menuMap[auxId]) { - newData[i].id = this.menuMap[auxId]; + newData[i].page = this.menuMap[auxId]; } else if (newData[i].href) { - newData[i].id = "LegacyFrame"; + newData[i].page = "LegacyFrame"; } // Tasks group need pie chart icon if (data[i].header && data[i].id === "FOLDERS") { @@ -267,8 +271,7 @@ export default { } } } - if (data[i].id === "inbox" || data[i].id === "draft" - || data[i].id === "paused" || data[i].id === "unassigned") { + if (data[i].customCasesList) { data[i]["child"] = this.sortCustomCasesList( data[i].customCasesList, this.config.setting[this.page] && @@ -346,7 +349,7 @@ export default { this.defaultOption = ""; }, OnClickSidebarItem(item) { - if (item.item.page && item.item.page === "/advanced-search") { + if (item.item.page && item.item.page === "advanced-search") { this.page = "advanced-search"; this.filters = item.item.filters; this.pageId = item.item.id; @@ -356,11 +359,21 @@ export default { this.filters = []; this.pageId = null; this.pageUri = item.item.href; - this.page = item.item.id || "MyCases"; + this.page = item.item.page || "MyCases"; + if (!item.item.customCasesList) { + this.page = "custom-case-list"; + this.pageData = { + pageUri: item.item.pageUri, + pageParent: item.item.page, + pageName: item.item.title, + pageIcon: item.item.icon, + customListId: item.item.id + } + } if (this.page === this.lastPage && this.$refs["component"] && this.$refs["component"].updateView) { - this.$refs["component"].updateView(); + this.$refs["component"].updateView(this.pageData); } this.lastPage = this.page; } diff --git a/resources/assets/sass/menu.scss b/resources/assets/sass/menu.scss index badd7792d..6034f633d 100755 --- a/resources/assets/sass/menu.scss +++ b/resources/assets/sass/menu.scss @@ -111,7 +111,7 @@ } .vsm--link_level-2>.vsm--icon { - margin-top: 8px; + margin-top: 0px; } .v-sidebar-menu .vsm--arrow { diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Home.php b/workflow/engine/src/ProcessMaker/Services/Api/Home.php index 6ec5bdc90..792f4d4f7 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Home.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Home.php @@ -658,6 +658,7 @@ class Home extends Api $option->href = $menuInstance->Options[$i]; $option->id = $menuInstance->Id[$i]; $option->title = $menuInstance->Labels[$i]; + $option->page = $menuInstance->Id[$i]; $option->icon = $menuInstance->Icons[$i]; } @@ -670,7 +671,7 @@ class Home extends Api foreach ($filters as $filter) { $childFilter = new stdClass(); $childFilter->id = $filter->id; - $childFilter->page = '/advanced-search'; + $childFilter->page = 'advanced-search'; $childFilter->href = "{$childFilter->page}/{$filter->id}"; $childFilter->title = $filter->name; $childFilter->icon = 'fas fa-circle'; @@ -700,7 +701,8 @@ class Home extends Api "id" => $value['id'], "title" => $value['name'], "description" => $value['description'], - "icon" => $value['iconList'] + "icon" => $value['iconList'], + "page" => $mapKeys[$menuInstance->Id[$i]] ]; } }