From f6ae61849d4e714b8d7a888178b0382a358c3eab Mon Sep 17 00:00:00 2001 From: hasyim_kai Date: Tue, 25 Nov 2025 14:09:25 +0700 Subject: [PATCH] Squashed commit of the following: commit 8e3ea9e8d1d7e3b06bc6e53e0b97f62222276171 Author: hasyim_kai Date: Thu Nov 20 16:14:03 2025 +0700 Feat: UI control letter history commit f11f97f936447bdb225918abb43313f8db540d67 Author: hasyim_kai Date: Thu Nov 20 15:18:25 2025 +0700 Squashed commit of the following: commit dab6adc4a98820d8686c5a336172af586b883c24 Author: hasyim_kai Date: Tue Nov 18 11:19:48 2025 +0700 Fix: add role authorization in Resume commit c28fc8f7aa54048472b535ac7ccd916d5b0769c2 Merge: 7ed1cc8 bcfb4c1 Author: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Tue Nov 18 09:02:16 2025 +0700 Merge branch 'dev' into feat/resume-81 commit 7ed1cc83bfa62d8c9660ff1ee61b1f96661ef45a Author: hasyim_kai Date: Mon Nov 17 15:04:01 2025 +0700 Feat: add doc preview in Resume List commit bcfb4c1456b7b58c63d4969985200ceca72aee16 Merge: 1cbde57 975c87d Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Mon Nov 17 11:15:14 2025 +0700 Merge pull request #147 from dikstub-rssa/feat/surat-kontrol-135 Feat: Integration Rehab Medik - Surat Kontrol commit 15ab43c1b143627892df2a9f82f418091b55ed7f Author: hasyim_kai Date: Mon Nov 17 10:38:21 2025 +0700 Feat: add verification capthca and form adjustment commit 53bd8e7f6e2b22b03690947f52b42744a17703ee Author: hasyim_kai Date: Fri Nov 7 08:55:23 2025 +0700 Fix: refactor rehab medik - Resume UI commit fc308809b848512a664659a51475e634e08f06f4 Author: hasyim_kai Date: Wed Oct 29 14:57:19 2025 +0700 Feat: add UI Rehab Medik > Proses > Resume commit 9b383a543703f9331a7ff90d81abe16717a39884 Merge: a4dc7d7 831749a Author: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Wed Oct 29 13:32:47 2025 +0700 Merge pull request #139 from dikstub-rssa/dev Update branch feat/resume-81 commit 2b7bea70d66e8472220a2a2406889fc489cc1ebd Author: hasyim_kai Date: Tue Nov 18 11:20:51 2025 +0700 Fix: Typo in Control Letter commit 808e91527cf95de2a47387bb792a3af2e16d907b Author: hasyim_kai Date: Tue Nov 18 10:59:50 2025 +0700 Fix: add role authorization in Control Letter --- .../app/control-letter/history-dialog.vue | 28 ++++++ .../app/control-letter/history-list.cfg.ts | 85 +++++++++++++++++++ .../content/control-letter/list.vue | 69 ++++++++++++--- app/components/pub/my-ui/data/print-btn.vue | 30 +++++++ app/lib/utils.ts | 2 +- 5 files changed, 202 insertions(+), 12 deletions(-) create mode 100644 app/components/app/control-letter/history-dialog.vue create mode 100644 app/components/app/control-letter/history-list.cfg.ts create mode 100644 app/components/pub/my-ui/data/print-btn.vue diff --git a/app/components/app/control-letter/history-dialog.vue b/app/components/app/control-letter/history-dialog.vue new file mode 100644 index 00000000..7e5a2304 --- /dev/null +++ b/app/components/app/control-letter/history-dialog.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/app/components/app/control-letter/history-list.cfg.ts b/app/components/app/control-letter/history-list.cfg.ts new file mode 100644 index 00000000..443bf237 --- /dev/null +++ b/app/components/app/control-letter/history-list.cfg.ts @@ -0,0 +1,85 @@ +import type { Config } from '~/components/pub/my-ui/data-table' +import type { Patient } from '~/models/patient' +import { defineAsyncComponent } from 'vue' +import { educationCodes, genderCodes } from '~/lib/constants' +import { calculateAge } from '~/lib/utils' + +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/print-btn.vue')) + +export const config: Config = { + cols: [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {width: 130}, {width: 30},], + + headers: [ + [ + { label: 'NAMA PASIEN' }, + { label: 'NO.SURAT KONTROL' }, + { label: 'NO.SEP' }, + { label: 'TANGGAL RENCANA KONTROL' }, + { label: 'TANGGAL TERBIT' }, + { label: 'DPJP' }, + { label: 'SPESIALIS' }, + { label: 'SUBSPESIALIS' }, + { label: 'TIPE RAWAT' }, + { label: 'DIBUAT OLEH' }, + { label: 'DIEDIT OLEH' }, + { label: 'STATUS' }, + { label: 'AKSI' }, + ], + ], + + keys: [ + 'date', + 'name', + 'name', + 'name', + 'name', + 'name', + 'name', + 'name', + 'name', + 'name', + 'name', + 'status', + 'action', + ], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + date: (rec: unknown): unknown => { + const date = (rec as any).date + if (typeof date == 'object' && date) { + return (date as Date).toLocaleDateString('id-ID') + } else if (typeof date == 'string') { + return (date as string).substring(0, 10) + } + return date + }, + specialist_subspecialist: (rec: unknown): unknown => { + return '-' + }, + dpjp: (rec: unknown): unknown => { + // const { person } = rec as Patient + return '-' + }, + }, + + components: { + action(rec, idx) { + return { + idx, + rec: rec as object, + component: action, + } + }, + }, + + htmls: { + sep_status(_rec) { + return 'SEP Internal' + }, + }, +} diff --git a/app/components/content/control-letter/list.vue b/app/components/content/control-letter/list.vue index c9353057..87a3d33e 100644 --- a/app/components/content/control-letter/list.vue +++ b/app/components/content/control-letter/list.vue @@ -11,8 +11,19 @@ import { getList, remove } from '~/services/control-letter.service' import { toast } from '~/components/pub/ui/toast' import type { Encounter } from '~/models/encounter' import WarningAlert from '~/components/pub/my-ui/alert/warning-alert.vue' +import type { PagePermission } from '~/models/role' +import { PAGE_PERMISSIONS } from '~/lib/page-permission' +import { unauthorizedToast } from '~/lib/utils' +import Dialog from '~/components/pub/my-ui/modal/dialog.vue' +import DocPreviewDialog from '~/components/pub/my-ui/modal/doc-preview-dialog.vue' +import HistoryDialog from '~/components/app/control-letter/history-dialog.vue' // #endregion +// #region Permission +const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter'] +const { getPagePermissions } = useRBAC() +const pagePermission = getPagePermissions(roleAccess) + // #region State const props = defineProps<{ encounter?: Encounter @@ -24,6 +35,10 @@ const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSe fetchFn: (params) => getList({ ...params, includes: 'specialist,subspecialist,doctor-employee-person', }), entityName: 'control-letter', }) +const historyData = usePaginatedList({ + fetchFn: (params) => getList({ ...params, includes: ['person', 'person-Addresses'] }), + entityName: 'control-letter-history', +}) const refSearchNav: RefSearchNav = { onClick: () => { @@ -37,6 +52,10 @@ const refSearchNav: RefSearchNav = { }, } +const isHistoryDialogOpen = ref(false) +provide('isHistoryDialogOpen', isHistoryDialogOpen) + +const isDocPreviewDialogOpen = ref(false) const isRecordConfirmationOpen = ref(false) const summaryLoading = ref(false) const isRequirementsMet = ref(true) @@ -44,17 +63,20 @@ const isRequirementsMet = ref(true) const recId = ref(0) const recAction = ref('') const recItem = ref(null) +const timestamp = ref(new Date().toISOString()) const headerPrep: HeaderPrep = { title: "Surat Kontrol", icon: 'i-lucide-newspaper', - addNav: { +} +if (pagePermission.canCreate) { + headerPrep.addNav = { label: "Surat Kontrol", onClick: () => navigateTo({ name: 'rehab-encounter-id-control-letter-add', params: { id: encounterId }, }), - }, + } } // #endregion @@ -105,11 +127,12 @@ function handleCancelConfirmation() { provide('rec_id', recId) provide('rec_action', recAction) provide('rec_item', recItem) +provide('timestamp', isLoading) provide('table_data_loader', isLoading) // #endregion // #region Watchers -watch([recId, recAction], () => { +watch([recId, recAction, timestamp], () => { switch (recAction.value) { case ActionEvents.showDetail: navigateTo({ @@ -119,17 +142,22 @@ watch([recId, recAction], () => { break case ActionEvents.showEdit: - // TODO: Handle edit action - // isFormEntryDialogOpen.value = true - navigateTo({ - name: 'rehab-encounter-id-control-letter-control_letter_id-edit', - params: { id: encounterId, "control_letter_id": recId.value }, - }) + if(pagePermission.canUpdate){ + navigateTo({ + name: 'rehab-encounter-id-control-letter-control_letter_id-edit', + params: { id: encounterId, "control_letter_id": recId.value }, + }) + } else { + unauthorizedToast() + } break case ActionEvents.showConfirmDelete: - // Trigger confirmation modal open - isRecordConfirmationOpen.value = true + if(pagePermission.canDelete){ + isRecordConfirmationOpen.value = true + } else { + unauthorizedToast() + } break } }) @@ -151,8 +179,19 @@ watch([recId, recAction], () => { :ref-search-nav="refSearchNav" @search="handleSearch" /> +
+ +
+ + + + + + + + diff --git a/app/components/pub/my-ui/data/print-btn.vue b/app/components/pub/my-ui/data/print-btn.vue new file mode 100644 index 00000000..a3d131b8 --- /dev/null +++ b/app/components/pub/my-ui/data/print-btn.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/app/lib/utils.ts b/app/lib/utils.ts index 67f3d04b..e201a439 100644 --- a/app/lib/utils.ts +++ b/app/lib/utils.ts @@ -160,4 +160,4 @@ export function unauthorizedToast() { description: 'You are not authorized to perform this action.', variant: 'destructive', }) -} +} \ No newline at end of file