diff --git a/package.json b/package.json index c544d500e..b3f73d27c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@fortawesome/fontawesome-svg-core": "^1.2.35", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/vue-fontawesome": "^2.0.2", + "apexcharts": "^3.27.3", "axios": "^0.15.3", "bootstrap": "^4.5.3", "bootstrap-colorpicker": "^3.0.3", @@ -38,6 +39,7 @@ "idempotent-babel-polyfill": "^7.4.4", "jquery": "^3.1.1", "lodash": "^4.17.20", + "moment": "^2.29.1", "muuri": "^0.7.1", "npm-font-open-sans": "^1.1.0", "popper.js": "^1.12", @@ -48,6 +50,7 @@ "verte": "0.0.12", "vfa-picker": "^5.9.1", "vue": "^2.6.12", + "vue-apexcharts": "^1.6.1", "vue-awesome-swiper": "^3.1.3", "vue-chartjs": "^3.3.2", "vue-clipboards": "^1.2.4", diff --git a/resources/assets/js/api/Cases.js b/resources/assets/js/api/Cases.js index 3a009f571..d3b3b1100 100644 --- a/resources/assets/js/api/Cases.js +++ b/resources/assets/js/api/Cases.js @@ -324,6 +324,17 @@ export let cases = { window.config.SYS_URI + `cases/debug_triggers?r=${r}&_dc=${dc}`); }, + /** + * Make a search request to the Api service + * @param {object} dt - filter parameters + */ + listTotalCases(dt) { + return Api.get({ + service: "LIST_TOTAL_CASES", + params: {}, + keys: {} + }) + }, }; export let casesHeader = { diff --git a/resources/assets/js/api/Filters.js b/resources/assets/js/api/Filters.js index cac153fa5..e0ef9a995 100644 --- a/resources/assets/js/api/Filters.js +++ b/resources/assets/js/api/Filters.js @@ -1,7 +1,7 @@ import axios from "axios"; import ApiInstance from "./Api.js"; import Services from "./Services"; -let Api = new ApiInstance( Services ); +let Api = new ApiInstance(Services); export let filters = { get(data) { return Api.get({ @@ -42,8 +42,8 @@ export let filters = { params.append("action", "startCase"); return axios.post( window.config.SYS_SERVER_AJAX + - window.config.SYS_URI + - `cases/casesStartPage_Ajax.php`, + window.config.SYS_URI + + `cases/casesStartPage_Ajax.php`, params ); }, @@ -88,11 +88,16 @@ export let filters = { * Service to get the categories list */ categories(query) { + let pr = { + limit: 15, + offset: 0 + }; + if (query) { + pr["name"] = query; + } return Api.get({ service: "CATEGORIES", - params: { - name: query, - }, + params: pr, keys: {}, }); }, @@ -102,8 +107,8 @@ export let filters = { userValues(query) { return axios.post( window.config.SYS_SERVER_AJAX + - window.config.SYS_URI + - `cases/casesList_Ajax?actionAjax=userValues&action=search`, + window.config.SYS_URI + + `cases/casesList_Ajax?actionAjax=userValues&action=search`, { query, } diff --git a/resources/assets/js/api/Process.js b/resources/assets/js/api/Process.js index ed4ef4d83..987d4b85c 100644 --- a/resources/assets/js/api/Process.js +++ b/resources/assets/js/api/Process.js @@ -1,6 +1,6 @@ import ApiInstance from "./Api.js"; import Services from "./Services"; -let Api = new ApiInstance( Services ); +let Api = new ApiInstance(Services); export let process = { list: { @@ -12,5 +12,36 @@ export let process = { keys: {} }); } - } + }, + totalCasesByProcess(dt) { + return Api.get({ + service: "TOTAL_CASES_BY_PROCESS", + params: dt, + keys: {} + }); + }, + processCategories() { + return Api.fetch({ + service: "PROCESS_CATEGORIES", + method: "get", + data: {}, + keys: {} + }); + }, + totalCasesByRange(dt) { + return Api.get({ + service: "TOTAL_CASES_BY_RANGE", + method: "get", + params: dt, + keys: {} + }); + }, + totalCasesByRisk(dt) { + return Api.get({ + service: "CASES_RISK", + method: "get", + params: dt, + keys: {} + }); + }, }; \ No newline at end of file diff --git a/resources/assets/js/api/Services.js b/resources/assets/js/api/Services.js index e874cc744..c7f15bb18 100644 --- a/resources/assets/js/api/Services.js +++ b/resources/assets/js/api/Services.js @@ -68,6 +68,10 @@ TASKS: "/home/tasks", CATEGORIES: "/home/categories", DEBUG_STATUS: "/home/process-debug-status?processUid={prj_uid}", + LIST_TOTAL_CASES: "/metrics/list-total-cases", + TOTAL_CASES_BY_PROCESS:"/metrics/total-cases-by-process", + TOTAL_CASES_BY_RANGE:"/metrics/process-total-cases", + CASES_RISK:"/metrics/cases-risk", CONFIG: "/home/config", GET_CONFIG: "/home/config/{id}/{name}", PAUSE_CASE: "/cases/{app_uid}/pause", diff --git a/resources/assets/js/components/utils/BreadCrumb.vue b/resources/assets/js/components/utils/BreadCrumb.vue new file mode 100644 index 000000000..c8181a131 --- /dev/null +++ b/resources/assets/js/components/utils/BreadCrumb.vue @@ -0,0 +1,92 @@ + + + + diff --git a/resources/assets/js/home/Home.vue b/resources/assets/js/home/Home.vue index 977166000..e3c05091b 100644 --- a/resources/assets/js/home/Home.vue +++ b/resources/assets/js/home/Home.vue @@ -48,6 +48,7 @@ import Inbox from "./Inbox/Inbox.vue"; import Paused from "./Paused/Paused.vue"; import Draft from "./Draft/Draft.vue"; import Unassigned from "./Unassigned/Unassigned.vue"; +import TaskMetrics from "./TaskMetrics/TaskMetrics.vue"; import BatchRouting from "./BatchRouting"; import CaseDetail from "./CaseDetail"; import XCase from "./XCase"; @@ -74,7 +75,8 @@ export default { Unassigned, CaseDetail, LegacyFrame, - CustomCaseList, + TaskMetrics, + CustomCaseList }, data() { return { @@ -122,9 +124,15 @@ export default { parseInt(window.config.FORMATS.casesListRefreshTime) * 1000 ); // adding eventBus listener - eventBus.$on('sort-menu', (data) => { + eventBus.$on('sort-menu', (data) => { that.updateUserSettings('customCasesList', data); }); + eventBus.$on('home-update-page', (data) => { + that.onUpdatePage(data); + }); + eventBus.$on('home-update-datacase', (data) => { + that.onUpdateDataCase(data); + }); }, methods: { /** @@ -244,6 +252,7 @@ export default { mappingMenu(data) { var i, j, + that = this, newData = data, auxId; for (i = 0; i < data.length; i += 1) { @@ -265,7 +274,7 @@ export default { hiddenOnCollapse: data[i].hiddenOnCollapse, icon: 'pie-chart-fill', onClick: function (item) { - // TODO click evet handler + that.onUpdatePage("task-metrics"); } } } diff --git a/resources/assets/js/home/TaskMetrics/DrillDown.vue b/resources/assets/js/home/TaskMetrics/DrillDown.vue new file mode 100644 index 000000000..6501d96ee --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/DrillDown.vue @@ -0,0 +1,162 @@ + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/ProcessPopover.vue b/resources/assets/js/home/TaskMetrics/ProcessPopover.vue new file mode 100644 index 000000000..248089870 --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/ProcessPopover.vue @@ -0,0 +1,173 @@ + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/TaskMetrics.vue b/resources/assets/js/home/TaskMetrics/TaskMetrics.vue new file mode 100644 index 000000000..9d735f547 --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/TaskMetrics.vue @@ -0,0 +1,79 @@ + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/VueChartLvOne.vue b/resources/assets/js/home/TaskMetrics/VueChartLvOne.vue new file mode 100644 index 000000000..8f716b39f --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/VueChartLvOne.vue @@ -0,0 +1,365 @@ + + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/VueChartLvThree.vue b/resources/assets/js/home/TaskMetrics/VueChartLvThree.vue new file mode 100644 index 000000000..ed5f662be --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/VueChartLvThree.vue @@ -0,0 +1,493 @@ + + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/VueChartLvTwo.vue b/resources/assets/js/home/TaskMetrics/VueChartLvTwo.vue new file mode 100644 index 000000000..73ab25e90 --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/VueChartLvTwo.vue @@ -0,0 +1,219 @@ + + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/VueChartLvZero.vue b/resources/assets/js/home/TaskMetrics/VueChartLvZero.vue new file mode 100644 index 000000000..82e9f02b5 --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/VueChartLvZero.vue @@ -0,0 +1,248 @@ + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/VueCharts.vue b/resources/assets/js/home/TaskMetrics/VueCharts.vue new file mode 100644 index 000000000..063ff49c2 --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/VueCharts.vue @@ -0,0 +1,157 @@ + + + + \ No newline at end of file diff --git a/resources/assets/js/home/TaskMetrics/defaultMixins.js b/resources/assets/js/home/TaskMetrics/defaultMixins.js new file mode 100644 index 000000000..2481bf105 --- /dev/null +++ b/resources/assets/js/home/TaskMetrics/defaultMixins.js @@ -0,0 +1,16 @@ +import _ from "lodash"; +import api from "../../api/index"; +export default { + data() { + let that = this; + return { + newCase: { + title: this.$i18n.t("ID_NEW_CASE"), + class: "btn-success", + onClick: () => { + this.$refs["newRequest"].show(); + }, + }, + } + } +} \ No newline at end of file diff --git a/resources/assets/js/home/main.js b/resources/assets/js/home/main.js index 1f35d38a2..eaf91b5d1 100644 --- a/resources/assets/js/home/main.js +++ b/resources/assets/js/home/main.js @@ -11,9 +11,13 @@ import Sortable from 'sortablejs'; import "@fortawesome/fontawesome-free/css/all.css"; import 'bootstrap/dist/css/bootstrap-grid.css'; import 'bootstrap/dist/css/bootstrap.min.css' +import 'bootstrap-vue/dist/bootstrap-vue.css'; +import VueApexCharts from 'vue-apexcharts' import 'bootstrap-vue/dist/bootstrap-vue.css' import Home from "./Home"; + +Vue.use(VueApexCharts); Vue.use(VueRouter); Vue.use(VueSidebarMenu); Vue.use(BootstrapVue); @@ -26,9 +30,12 @@ Vue.use(ServerTable, {}, false, 'bootstrap3', { }); Vue.use(ClientTable, {}, false, 'bootstrap3', {}); Vue.component('settings-popover', SettingsPopover); +Vue.component('apexchart', VueApexCharts); + window.ProcessMaker = { apiClient: require('axios') }; + window.ProcessMaker.pluginBase = "/sysworkflow/en/neoclassic/viena/index.php"; window.ProcessMaker.apiClient.defaults.baseURL = '/sysworkflow/en/neoclassic/viena/index.php/api/'; window.ProcessMaker.SYS_SYS = "workflow"; diff --git a/resources/assets/js/home/modal/ModalClaimCase.vue b/resources/assets/js/home/modal/ModalClaimCase.vue index 59267d840..805e320d2 100644 --- a/resources/assets/js/home/modal/ModalClaimCase.vue +++ b/resources/assets/js/home/modal/ModalClaimCase.vue @@ -30,6 +30,8 @@