From 18e682461109bb97dce3ce7eb8a98a88732f051d Mon Sep 17 00:00:00 2001 From: Abizrh Date: Tue, 23 Sep 2025 19:40:19 +0700 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9A=A1=20enhance=20(lib):=20adjust=20lib?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/page-permission.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/lib/page-permission.ts b/app/lib/page-permission.ts index 3d06cfdc..95673f20 100644 --- a/app/lib/page-permission.ts +++ b/app/lib/page-permission.ts @@ -25,4 +25,12 @@ export const PAGE_PERMISSIONS = { billing: ['R'], management: ['R'], }, + '/rehab/encounter': { + doctor: ['C', 'R', 'U', 'D'], + nurse: ['R'], + admisi: ['R'], + pharmacy: ['R'], + billing: ['R'], + management: ['R'], + }, } as const satisfies Record From 688e79680f16785133406affdced9455a6af9771 Mon Sep 17 00:00:00 2001 From: Abizrh Date: Tue, 23 Sep 2025 19:41:14 +0700 Subject: [PATCH 2/9] =?UTF-8?q?=E2=9C=A8=20feat=20(encounter):=20add=20ent?= =?UTF-8?q?ry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/app/divison/list.vue | 13 +- app/components/app/encounter/entry-form.vue | 338 ++++++++++++++++++ app/components/app/encounter/filter.vue | 114 ++++++ app/components/app/encounter/list-cfg.ts | 131 +++++++ app/components/app/encounter/list.vue | 19 + app/components/app/encounter/picker.vue | 0 app/components/app/encounter/search.vue | 0 app/components/app/encounter/status-badge.vue | 29 ++ app/components/content/encounter/entry.vue | 9 + app/components/content/encounter/list.vue | 78 ++++ app/components/content/satusehat/list.vue | 54 ++- .../rehab/encounter/[id]/detail.vue | 9 + .../(features)/rehab/encounter/[id]/edit.vue | 9 + app/pages/(features)/rehab/encounter/add.vue | 41 +++ .../(features)/rehab/encounter/index.vue | 40 +++ 15 files changed, 849 insertions(+), 35 deletions(-) create mode 100644 app/components/app/encounter/entry-form.vue create mode 100644 app/components/app/encounter/filter.vue create mode 100644 app/components/app/encounter/list-cfg.ts create mode 100644 app/components/app/encounter/list.vue create mode 100644 app/components/app/encounter/picker.vue create mode 100644 app/components/app/encounter/search.vue create mode 100644 app/components/app/encounter/status-badge.vue create mode 100644 app/components/content/encounter/entry.vue create mode 100644 app/components/content/encounter/list.vue create mode 100644 app/pages/(features)/rehab/encounter/[id]/detail.vue create mode 100644 app/pages/(features)/rehab/encounter/[id]/edit.vue create mode 100644 app/pages/(features)/rehab/encounter/add.vue create mode 100644 app/pages/(features)/rehab/encounter/index.vue diff --git a/app/components/app/divison/list.vue b/app/components/app/divison/list.vue index e2540e85..dd450462 100644 --- a/app/components/app/divison/list.vue +++ b/app/components/app/divison/list.vue @@ -22,11 +22,16 @@ function handlePageChange(page: number) { diff --git a/app/components/app/encounter/entry-form.vue b/app/components/app/encounter/entry-form.vue new file mode 100644 index 00000000..01f97c23 --- /dev/null +++ b/app/components/app/encounter/entry-form.vue @@ -0,0 +1,338 @@ + + + diff --git a/app/components/app/encounter/filter.vue b/app/components/app/encounter/filter.vue new file mode 100644 index 00000000..91812991 --- /dev/null +++ b/app/components/app/encounter/filter.vue @@ -0,0 +1,114 @@ + + + diff --git a/app/components/app/encounter/list-cfg.ts b/app/components/app/encounter/list-cfg.ts new file mode 100644 index 00000000..fd4d0317 --- /dev/null +++ b/app/components/app/encounter/list-cfg.ts @@ -0,0 +1,131 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +export const cols: Col[] = [ + {}, + {}, + {}, + { width: 100 }, + { width: 120 }, + {}, + {}, + {}, + { width: 100 }, + { width: 100 }, + {}, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Nama' }, + { label: 'Rekam Medis' }, + { label: 'KTP' }, + { label: 'Tgl Lahir' }, + { label: 'Umur' }, + { label: 'JK' }, + { label: 'Pendidikan' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'name', + 'medicalRecord_number', + 'identity_number', + 'birth_date', + 'patient_age', + 'gender', + 'education', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.firstName} ${recX.middleName || ''} ${recX.lastName || ''}` + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + birth_date: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX.birth_date == 'object' && recX.birth_date) { + return (recX.birth_date as Date).toLocaleDateString() + } else if (typeof recX.birth_date == 'string') { + return (recX.birth_date as string).substring(0, 10) + } + return recX.birth_date + }, + patient_age: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.birth_date?.split('T')[0] + }, + gender: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX?.gender_code !== 'number' && recX?.gender_code !== '') { + return 'Tidak Diketahui' + } + return recX.gender_code + }, + education: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX.education_code == 'number' && recX.education_code >= 0) { + return recX.education_code + } else if (typeof recX.education_code) { + return recX.education_code + } + return '-' + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + if (rec.status === null) { + rec.status_code = 0 + } + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/encounter/list.vue b/app/components/app/encounter/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/encounter/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/encounter/picker.vue b/app/components/app/encounter/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/encounter/search.vue b/app/components/app/encounter/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/encounter/status-badge.vue b/app/components/app/encounter/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/encounter/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/content/encounter/entry.vue b/app/components/content/encounter/entry.vue new file mode 100644 index 00000000..66f3dbc7 --- /dev/null +++ b/app/components/content/encounter/entry.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/components/content/encounter/list.vue b/app/components/content/encounter/list.vue new file mode 100644 index 00000000..1a3044e1 --- /dev/null +++ b/app/components/content/encounter/list.vue @@ -0,0 +1,78 @@ + + + diff --git a/app/components/content/satusehat/list.vue b/app/components/content/satusehat/list.vue index 879a3fed..ab0bf8c2 100644 --- a/app/components/content/satusehat/list.vue +++ b/app/components/content/satusehat/list.vue @@ -112,27 +112,27 @@ const activeTabFilter = computed({
-

FHIR Resource

+

FHIR Resource

-
+
+ > {{ tab.label }} -
- +
- - + @@ -152,19 +152,13 @@ v-for="tab in tabs" :key="tab.value" :value="tab.value" Status @@ -181,12 +175,8 @@ v-for="tab in tabs" :key="tab.value" :value="tab.value" - - + + @@ -194,9 +184,11 @@ v-for="tab in tabs" :key="tab.value" :value="tab.value" + />
@@ -206,11 +198,11 @@ v-for="action in actions" :key="action.value" :icon="action.icon"
+ v-if="!isLoading.satusehatConn && !isLoading.isTableLoading && pagination.total > 0" + class="mt-4 flex items-center justify-between" + >
- Menampilkan {{ ((pagination.page - 1) * pagination.limit) + 1 }} - + Menampilkan {{ (pagination.page - 1) * pagination.limit + 1 }} - {{ Math.min(pagination.page * pagination.limit, pagination.total) }} dari {{ pagination.total }} data
diff --git a/app/pages/(features)/rehab/encounter/[id]/detail.vue b/app/pages/(features)/rehab/encounter/[id]/detail.vue new file mode 100644 index 00000000..33a36f0f --- /dev/null +++ b/app/pages/(features)/rehab/encounter/[id]/detail.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/pages/(features)/rehab/encounter/[id]/edit.vue b/app/pages/(features)/rehab/encounter/[id]/edit.vue new file mode 100644 index 00000000..2b7e8a31 --- /dev/null +++ b/app/pages/(features)/rehab/encounter/[id]/edit.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/pages/(features)/rehab/encounter/add.vue b/app/pages/(features)/rehab/encounter/add.vue new file mode 100644 index 00000000..4c5e17d4 --- /dev/null +++ b/app/pages/(features)/rehab/encounter/add.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/pages/(features)/rehab/encounter/index.vue b/app/pages/(features)/rehab/encounter/index.vue new file mode 100644 index 00000000..777eebf3 --- /dev/null +++ b/app/pages/(features)/rehab/encounter/index.vue @@ -0,0 +1,40 @@ + + + From 4acc8cf3f401edd54116ef8ca8d38a239193191e Mon Sep 17 00:00:00 2001 From: Abizrh Date: Tue, 23 Sep 2025 19:41:48 +0700 Subject: [PATCH 3/9] =?UTF-8?q?=E2=9A=A1=20enhance=20(public):=20adjust=20?= =?UTF-8?q?path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/side-menu-items/sys.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/side-menu-items/sys.json b/public/side-menu-items/sys.json index 488d9fa2..6b9f0dcd 100644 --- a/public/side-menu-items/sys.json +++ b/public/side-menu-items/sys.json @@ -96,9 +96,9 @@ "link": "/rehab/examination-queue" }, { - "title": "Pemeriksaan", + "title": "Kunjungan", "icon": "i-lucide-building-2", - "link": "/rehab/examination" + "link": "/rehab/encounter" } ] }, From 4a480548dfc3d664a48caeab087df041399cbb17 Mon Sep 17 00:00:00 2001 From: Abizrh Date: Tue, 23 Sep 2025 19:42:08 +0700 Subject: [PATCH 4/9] =?UTF-8?q?=E2=9C=A8=20feat=20(nav-header):=20implemen?= =?UTF-8?q?t=20filter=20component=20with=20search=20and=20date=20range?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pub/custom-ui/nav-header/filter.vue | 93 + .../pub/custom-ui/nav-header/prep.vue | 12 +- pnpm-lock.yaml | 4370 ++++++----------- 3 files changed, 1718 insertions(+), 2757 deletions(-) create mode 100644 app/components/pub/custom-ui/nav-header/filter.vue diff --git a/app/components/pub/custom-ui/nav-header/filter.vue b/app/components/pub/custom-ui/nav-header/filter.vue new file mode 100644 index 00000000..ca89728d --- /dev/null +++ b/app/components/pub/custom-ui/nav-header/filter.vue @@ -0,0 +1,93 @@ + + + diff --git a/app/components/pub/custom-ui/nav-header/prep.vue b/app/components/pub/custom-ui/nav-header/prep.vue index 27398802..61b83af9 100644 --- a/app/components/pub/custom-ui/nav-header/prep.vue +++ b/app/components/pub/custom-ui/nav-header/prep.vue @@ -24,17 +24,17 @@ function btnClick() {
- + {{ props.prep.title }}
- + + + + +
- + diff --git a/app/lib/page-permission.ts b/app/lib/page-permission.ts index 95673f20..c527a8cc 100644 --- a/app/lib/page-permission.ts +++ b/app/lib/page-permission.ts @@ -33,4 +33,12 @@ export const PAGE_PERMISSIONS = { billing: ['R'], management: ['R'], }, + '/rehab/registration': { + doctor: ['C', 'R', 'U', 'D'], + nurse: ['R'], + admisi: ['R'], + pharmacy: ['R'], + billing: ['R'], + management: ['R'], + }, } as const satisfies Record diff --git a/app/pages/(features)/rehab/encounter/[id]/process.vue b/app/pages/(features)/rehab/encounter/[id]/process.vue index ad499dfe..c1b8b716 100644 --- a/app/pages/(features)/rehab/encounter/[id]/process.vue +++ b/app/pages/(features)/rehab/encounter/[id]/process.vue @@ -35,7 +35,7 @@ const canCreate = hasCreateAccess(roleAccess) diff --git a/app/pages/(features)/rehab/encounter/index.vue b/app/pages/(features)/rehab/encounter/index.vue index 777eebf3..7cd6c5ed 100644 --- a/app/pages/(features)/rehab/encounter/index.vue +++ b/app/pages/(features)/rehab/encounter/index.vue @@ -33,7 +33,7 @@ const canRead = hasReadAccess(roleAccess)