diff --git a/package.json b/package.json index 9d833a8..72be3b0 100755 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "0.0.1", "private": true, "scripts": { - "dev": "vite --host", + "dev": "vite", + "host": "vite --host", "tailwind": "tailwindcss -i ./src/assets/css/tailwind.css -o ./src/assets/css/style.css --watch", "build": "run-p type-check build-only", "preview": "vite preview --host", diff --git a/src/assets/css/style.css b/src/assets/css/style.css index 7e3d44c..bd90444 100755 --- a/src/assets/css/style.css +++ b/src/assets/css/style.css @@ -5545,10 +5545,6 @@ body { grid-column-start: 2; } - .sm\:m-8 { - margin: 2rem; - } - .sm\:mx-0 { margin-left: 0px; margin-right: 0px; diff --git a/src/components/DatePicker.vue b/src/components/DatePicker.vue index 1821a2f..3a7bb7b 100755 --- a/src/components/DatePicker.vue +++ b/src/components/DatePicker.vue @@ -4,7 +4,7 @@ import { ref, watch } from 'vue' import VueTailwindDatepicker from 'vue-tailwind-datepicker' const dateValue = ref( - `${new Date().getDay().toString().length == 1 ? `0${new Date().getDay()}` : new Date().getDay()}-${new Date().getMonth().toString().length == 1 ? `0${new Date().getMonth()}` : new Date().getMonth()}-${new Date().getFullYear()} s/d ${new Date().getDay().toString().length == 1 ? `0${new Date().getDay()}` : new Date().getDay()}-${new Date().getMonth().toString().length == 1 ? `0${new Date().getMonth()}` : new Date().getMonth()}-${new Date().getFullYear()}` + `${new Date().getDay().toString().length == 1 ? `0${new Date().getDay()}` : new Date().getDay()}-${(new Date().getMonth() + 1).toString().length == 1 ? `0${new Date().getMonth() + 1}` : new Date().getMonth() + 1}-${new Date().getFullYear()} s/d ${new Date().getDay().toString().length == 1 ? `0${new Date().getDay()}` : new Date().getDay()}-${(new Date().getMonth() + 1).toString().length == 1 ? `0${new Date().getMonth() + 1}` : new Date().getMonth() + 1}-${new Date().getFullYear()}` ) const formatter = ref({ date: 'DD-MM-YYYY', @@ -15,14 +15,56 @@ const emit = defineEmits(['update:dateValue']) const customShortcuts = () => { return [ { - label: 'Last 15 Days', + label: 'Hari Ini', + atClick: () => { + const date = new Date() + return [new Date(date.setHours(0, 0, 0, 0)), new Date()] + } + }, + { + label: 'Kemarin', + atClick: () => { + const date = new Date() + return [new Date(date.setDate(date.getDate() - 1)), new Date(date.setHours(0, 0, 0, 0))] + } + }, + { + label: '7 Hari Terakhir', + atClick: () => { + const date = new Date() + return [new Date(date.setDate(date.getDate() - 7)), new Date()] + } + }, + { + label: '15 Hari Terakhir', atClick: () => { const date = new Date() return [new Date(date.setDate(date.getDate() - 15)), new Date()] } }, { - label: 'Last Years', + label: '30 Hari Terakhir', + atClick: () => { + const date = new Date() + return [new Date(date.setDate(date.getDate() - 30)), new Date()] + } + }, + { + label: '3 Bulan Terakhir', + atClick: () => { + const date = new Date() + return [new Date(date.setMonth(date.getMonth() - 3)), new Date()] + } + }, + { + label: '6 Bulan Terakhir', + atClick: () => { + const date = new Date() + return [new Date(date.setMonth(date.getMonth() - 6)), new Date()] + } + }, + { + label: '1 Tahun Terakhir', atClick: () => { const date = new Date() return [new Date(date.setFullYear(date.getFullYear() - 1)), new Date()] diff --git a/src/components/Form/FiltersType/Type7.vue b/src/components/Form/FiltersType/Type7.vue index ad0f5f6..e32f770 100755 --- a/src/components/Form/FiltersType/Type7.vue +++ b/src/components/Form/FiltersType/Type7.vue @@ -6,9 +6,9 @@ interface SlaOption { max: string } -import Select from '@/components/Select.vue'; -import DatePicker from '@/components/DatePicker.vue'; -import InputWithSuffix from '../InputWithSuffix.vue'; +import Select from '@/components/Select.vue' +import DatePicker from '@/components/DatePicker.vue' +import InputWithSuffix from '../InputWithSuffix.vue' import { selectedUid, selectedUp3Posko, @@ -17,8 +17,8 @@ import { itemsUid, itemsUp3, itemsPosko -} from './reference'; -import { onMounted, ref, watch } from 'vue'; +} from './reference' +import { onMounted, ref, watch } from 'vue' const props = defineProps({ slaOptions: { @@ -27,7 +27,7 @@ const props = defineProps({ { id: 1, name: 'Dibawah / Sesuai SLA (<= 45 menit)', - min: '1', + min: '0', max: '45' }, { @@ -143,14 +143,23 @@ onMounted(() => {
+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -239,7 +242,10 @@
-+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -251,7 +257,10 @@
-+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -263,7 +272,10 @@
-+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -275,7 +287,7 @@
-+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -287,7 +299,7 @@
-+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -299,7 +311,10 @@
-+
{{ isNumber(data.text) ? data.column.caption == '%' @@ -311,19 +326,25 @@
-+
{{ isNumber(data.text) ? formatPercentage(data.text) : data.text }}
-+
{{ data.text }}
-+
{{ parseInt(data.text) ? formatWaktu(data.text) : '-' }}
@@ -435,6 +456,19 @@ /> + ++ {{ data.text }} +
+ + + ++ {{ + isNumber(data.text) + ? data.column.caption == '%' + ? formatPercentage(data.text) + : formatNumber(data.text) + : data.text + }} +
+ -+
+ {{ + isNumber(data.text) + ? data.column.caption == '%' + ? formatPercentage(data.text) + : formatNumber(data.text) + : data.text + }} +
+ + + ++ {{ + isNumber(data.text) + ? data.column.caption == '%' + ? formatPercentage(data.text) + : formatNumber(data.text) + : data.text + }} +
+ + + ++ {{ + isNumber(data.text) + ? data.column.caption == '%' + ? formatPercentage(data.text) + : formatNumber(data.text) + : data.text + }} +
+ + + ++ {{ + isNumber(data.text) + ? data.column.caption == '%' + ? formatPercentage(data.text) + : formatNumber(data.text) + : data.text + }} +
+ + + +{{ isNumber(data.text) ? data.column.caption == '%' @@ -264,7 +325,7 @@
-+
{{ data.text }}
@@ -710,12 +771,6 @@ import { DxSummary, DxTotalItem } from 'devextreme-vue/data-grid' -import { jsPDF } from 'jspdf' -import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter' -import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter' -import { saveAs } from 'file-saver' -import { Workbook } from 'exceljs' -import { useQuery } from '@vue/apollo-composable' import { getMonthName } from '@/utils/texts' import { queries, requestGraphQl } from '@/utils/api/api.graphql' import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' @@ -725,6 +780,12 @@ import DetailDialog from '@/components/Dialogs/DetailDialog.vue' import { formatWaktu } from '@/components/Form/FiltersType/reference' import InputText from '@/components/InputText.vue' import BufferDialog from '@/components/Dialogs/BufferDialog.vue' +import { + exportToPDF, + exportToXLSX, + exportDetailToPDF, + exportDetailToXLSX +} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan' const client = apolloClient() provideApolloClient(client) @@ -747,33 +808,45 @@ const dialogDetail = ref(false) const closedialogDetail = () => (dialogDetail.value = false) const loadingData = ref(false) const loadingSubData = ref(false) +const dataType = ref('') +const dataYear = ref(new Date().getFullYear()) +const dataMonth = ref(new Date().getMonth()) +const reportMeta = ref({ + regional: { id: 0, name: 'Semua Regional' }, + uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' }, + up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' }, + ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' }, + bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) }, + tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() }, + periode: '', + lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1, + lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(), + currentMonth: new Date().getMonth(), + currentYear: new Date().getFullYear(), + lastYear: new Date().getFullYear() - 1 +}) + +const setRequirements = (type: string, month: number, year: number) => { + dataType.value = type + dataYear.value = year + dataMonth.value = month +} const onExporting = (e: any) => { if (e.format === 'pdf') { - const doc = new jsPDF() - - exportToPdf({ - jsPDFDocument: doc, - component: e.component, - indent: 5 - }).then(() => { - doc.save(`.pdf`) - }) + exportToPDF(reportMeta.value, data.value) + } else if (e.format === 'xlsx') { + exportToXLSX(reportMeta.value, e) } else { - const workbook = new Workbook() - const worksheet = workbook.addWorksheet('Employees') + } +} - exportToExcel({ - component: e.component, - worksheet, - autoFilterEnabled: true - }).then(() => { - workbook.xlsx.writeBuffer().then((buffer: any) => { - saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx') - }) - }) - - e.cancel = true +const onExportingDetail = (e: any) => { + if (e.format === 'pdf') { + exportDetailToPDF(reportMeta.value, dataSub.value) + } else if (e.format === 'xlsx') { + exportDetailToXLSX(reportMeta.value, e) + } else { } } @@ -801,6 +874,21 @@ const filterData = async (params: any) => { } else { data.value = [] } + + reportMeta.value = { + regional: regional, + uid: uid, + up3: up3, + ulp: ulp, + bulan: bulan, + tahun: tahun, + periode: `${bulan.name} ${tahun.name}`, + lastMonth: lastMonth.value, + lastYearMoM: lastYearMoM.value, + currentMonth: currentMonth.value, + currentYear: currentYear.value, + lastYear: lastYear.value + } }) .catch((err) => { console.error(err) @@ -816,32 +904,30 @@ const filterData = async (params: any) => { } const getDetail = async () => { - const dateValue = filters.value.periode.split(' s/d ') const selected = dataSelected.value const query = { - dateFrom: dateValue[0] - ? dateValue[0].split('-').reverse().join('-') - : new Date().toISOString().slice(0, 10), - dateTo: dateValue[1] - ? dateValue[1].split('-').reverse().join('-') - : new Date().toISOString().slice(0, 10), + bulan: dataMonth.value, + tahun: dataYear.value, idUlp: selected?.id_ulp ? selected?.id_ulp : 0, idUid: selected?.id_uid ? selected?.id_uid : 0, - idUp3: selected?.id_up3 ? selected?.id_up3 : 0, - namaRegional: selected?.nama_regional ? selected?.nama_regional : '', - media: selected?.media ? selected?.media : '', - isSelesai: 0, - tanggal: '', - namaIssuetype: '', - namaSubissuetype: '' + idUp3: selected?.id_up3 ? selected?.id_up3 : 0 } loadingSubData.value = true - await requestGraphQl(queries.keluhan.rekap.rekapKeluhanAllDetail, query) + await requestGraphQl( + dataType.value == 'yoy' + ? queries.monalisa.gangguan.rekap.dispatchingTimeGangguanDetailYoy + : queries.monalisa.gangguan.rekap.dispatchingTimeGangguanDetailMom, + query + ) .then((result) => { if (result.data.data != undefined) { - dataSub.value = result.data.data.detailKeluhanAll + if (dataType.value == 'yoy') { + dataSub.value = result.data.data.detailMonalisaDispatchingTimeGangguanYoy + } else { + dataSub.value = result.data.data.detailMonalisaDispatchingTimeGangguanMoM + } } else { dataSub.value = [] } @@ -863,7 +949,9 @@ const clearSelection = () => { const showDetail = () => { clearSelection() dataSubSelected.value = null - getDetail() + if (dataType.value == 'yoy' || dataType.value == 'mom') { + getDetail() + } } const onDataSelectionChanged = ({ selectedRowsData }: any) => { if (selectedRowsData[0] != undefined) { @@ -877,8 +965,6 @@ const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { dataSubSelected.value = data } -const onExportingDetail = (e: any) => {} - const filters = ref() onMounted(() => { if (import.meta.env.DEV) { diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue index 49e996e..3e8d408 100755 --- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue +++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue @@ -1,5 +1,6 @@+ {{ data.text }} +
+ + + ++ {{ data.text }} +
+ + + ++ {{ parseInt(data.text) ? formatWaktu(data.text) : '-' }} +
+ +