diff --git a/app/components/app/surgery-report/_common/btn-history.vue b/app/components/app/surgery-report/_common/btn-history.vue
new file mode 100644
index 00000000..972eab8e
--- /dev/null
+++ b/app/components/app/surgery-report/_common/btn-history.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+ History
+
+
\ No newline at end of file
diff --git a/app/components/app/surgery-report/_common/filter.vue b/app/components/app/surgery-report/_common/filter.vue
new file mode 100644
index 00000000..d5e99b30
--- /dev/null
+++ b/app/components/app/surgery-report/_common/filter.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/history-dialog.vue b/app/components/app/surgery-report/_common/history-dialog.vue
new file mode 100644
index 00000000..d92da4a5
--- /dev/null
+++ b/app/components/app/surgery-report/_common/history-dialog.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item?.createdAt.toLocaleDateString('id-ID') }}
+
+
Ditambahkan Oleh : {{ item.updatedBy }}
+
+ Lihat Detail
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/surgery-report/_common/radio-blood-type.vue b/app/components/app/surgery-report/_common/radio-blood-type.vue
new file mode 100644
index 00000000..91def086
--- /dev/null
+++ b/app/components/app/surgery-report/_common/radio-blood-type.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-billing-code.vue b/app/components/app/surgery-report/_common/select-billing-code.vue
new file mode 100644
index 00000000..321c2d33
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-billing-code.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-birth-desc.vue b/app/components/app/surgery-report/_common/select-birth-desc.vue
new file mode 100644
index 00000000..2b19f3bc
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-birth-desc.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-birth-place-desc.vue b/app/components/app/surgery-report/_common/select-birth-place-desc.vue
new file mode 100644
index 00000000..c6f2ed06
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-birth-place-desc.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-date.vue b/app/components/app/surgery-report/_common/select-date.vue
new file mode 100644
index 00000000..0468c752
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-date.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-dissection-type.vue b/app/components/app/surgery-report/_common/select-dissection-type.vue
new file mode 100644
index 00000000..45708dac
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-dissection-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-dpjp-anastesi.vue b/app/components/app/surgery-report/_common/select-dpjp-anastesi.vue
new file mode 100644
index 00000000..b649c28f
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-dpjp-anastesi.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-dpjp-bedah.vue b/app/components/app/surgery-report/_common/select-dpjp-bedah.vue
new file mode 100644
index 00000000..b649c28f
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-dpjp-bedah.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-specimen-type.vue b/app/components/app/surgery-report/_common/select-specimen-type.vue
new file mode 100644
index 00000000..e1017e76
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-specimen-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-surgery-order.vue b/app/components/app/surgery-report/_common/select-surgery-order.vue
new file mode 100644
index 00000000..ff48d195
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-surgery-order.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-surgery-system-type.vue b/app/components/app/surgery-report/_common/select-surgery-system-type.vue
new file mode 100644
index 00000000..745904eb
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-surgery-system-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-surgery-type.vue b/app/components/app/surgery-report/_common/select-surgery-type.vue
new file mode 100644
index 00000000..e396fe7d
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-surgery-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/detail.vue b/app/components/app/surgery-report/detail.vue
new file mode 100644
index 00000000..e0bb7727
--- /dev/null
+++ b/app/components/app/surgery-report/detail.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
Dibuat oleh {{ `Dr. Agus` }} pada {{ `11 Agustus 2025, 20.00` }}
+ {{ props.instance?.date ? new
+ Date(props.instance?.date).toLocaleDateString('id-ID') : '-' }}
+
+
+
Tim Pelaksanaan Operasi
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+
+
Tindakan Operatif / Non Operatif Lain
+
+
+
+
+ No
+ Prosedur
+ Code
+
+
+
+
+ {{ idx + 1 }}
+ {{ field.name }}
+ {{ field.code }}
+
+
+
+
+
+
+
+
Data Pelaksanaan Operasi
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ 1 }} Jam {{ 1 }} Menit
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ 1 }} Jam {{ 1 }} Menit
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }} CC
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }} CC
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+ {{ `Example` }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/entry.vue b/app/components/app/surgery-report/entry.vue
new file mode 100644
index 00000000..8ac204f7
--- /dev/null
+++ b/app/components/app/surgery-report/entry.vue
@@ -0,0 +1,259 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/list.cfg.ts b/app/components/app/surgery-report/list.cfg.ts
new file mode 100644
index 00000000..6a63af13
--- /dev/null
+++ b/app/components/app/surgery-report/list.cfg.ts
@@ -0,0 +1,57 @@
+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/dropdown-action-dud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {}, {},],
+
+ headers: [
+ [
+ { label: 'Tgl Laporan' },
+ { label: 'DPJP Bedah' },
+ { label: 'DPJP Anastesi' },
+ { label: 'Tgl Pembedahan' },
+ { label: 'Jenis Operasi' },
+ { label: 'Kode Billing' },
+ { label: 'Sistem Operasi' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'doctor.employee.person.name', 'doctor.employee.person.name', 'date', 'name', 'name', 'name', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/surgery-report/list.vue b/app/components/app/surgery-report/list.vue
new file mode 100644
index 00000000..8274e752
--- /dev/null
+++ b/app/components/app/surgery-report/list.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/operative-action/dropdown-action.vue b/app/components/app/surgery-report/operative-action/dropdown-action.vue
new file mode 100644
index 00000000..7dc56c86
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/dropdown-action.vue
@@ -0,0 +1,30 @@
+
+
+
+
+ Pilih
+
+
+
diff --git a/app/components/app/surgery-report/operative-action/list.cfg.ts b/app/components/app/surgery-report/operative-action/list.cfg.ts
new file mode 100644
index 00000000..eeb08cff
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/list.cfg.ts
@@ -0,0 +1,44 @@
+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('./dropdown-action.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {width: 30}, ],
+
+ headers: [
+ [
+ { label: 'Nama Prosedur' },
+ { label: 'Code' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['name', 'code', 'action',],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/surgery-report/operative-action/list.vue b/app/components/app/surgery-report/operative-action/list.vue
new file mode 100644
index 00000000..8b025e4f
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/list.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/operative-action/picker-dialog.vue b/app/components/app/surgery-report/operative-action/picker-dialog.vue
new file mode 100644
index 00000000..a568c159
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/picker-dialog.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
{{ title }}
+
+
+ Pilih {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Prosedur
+ Code
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/banner-patient-in-therapy.vue b/app/components/app/therapy-protocol/_common/banner-patient-in-therapy.vue
new file mode 100644
index 00000000..46ea79d9
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/banner-patient-in-therapy.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
Pasien ini sedang menjalankan program terapi sampai {{ new Date(props.therapyEndDate).toDateString() }}
+
+
diff --git a/app/components/app/therapy-protocol/_common/btn-confirmation-detail.vue b/app/components/app/therapy-protocol/_common/btn-confirmation-detail.vue
new file mode 100644
index 00000000..e09432d5
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/btn-confirmation-detail.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Konfirmasi
+
+
diff --git a/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue b/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue
new file mode 100644
index 00000000..86953443
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/radio-relationship.vue b/app/components/app/therapy-protocol/_common/radio-relationship.vue
new file mode 100644
index 00000000..07aad8b8
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/radio-relationship.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-arrangement.vue b/app/components/app/therapy-protocol/_common/select-arrangement.vue
new file mode 100644
index 00000000..9a945d44
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-arrangement.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-date-range.vue b/app/components/app/therapy-protocol/_common/select-date-range.vue
new file mode 100644
index 00000000..c9048fcf
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-date-range.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+ {{ df.format(dateValueStart.toDate(getLocalTimeZone())) }} -
+ {{ df.format(dateValueEnd.toDate(getLocalTimeZone())) }}
+
+
+
+ {{ df.format(dateValueStart.toDate(getLocalTimeZone())) }}
+
+
+ Pick a date
+
+
+
+ (dateValueStart = startDate)" />
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-date.vue b/app/components/app/therapy-protocol/_common/select-date.vue
new file mode 100644
index 00000000..74245e7e
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-date.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-death-cause.vue b/app/components/app/therapy-protocol/_common/select-death-cause.vue
new file mode 100644
index 00000000..a155b139
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-death-cause.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-faskes.vue b/app/components/app/therapy-protocol/_common/select-faskes.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-faskes.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-primary-diagnosis.vue b/app/components/app/therapy-protocol/_common/select-primary-diagnosis.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-primary-diagnosis.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-secondary-diagnosis.vue b/app/components/app/therapy-protocol/_common/select-secondary-diagnosis.vue
new file mode 100644
index 00000000..a155b139
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-secondary-diagnosis.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/text-captcha.vue b/app/components/app/therapy-protocol/_common/text-captcha.vue
new file mode 100644
index 00000000..de9d7f4b
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/text-captcha.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
{{ errorMessage }}
+
Correct
+
Not case-sensitive
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/_common/verify-badge.vue b/app/components/app/therapy-protocol/_common/verify-badge.vue
new file mode 100644
index 00000000..30cd4c54
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/verify-badge.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+ {{ statusText }}
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/add-list.cfg.ts b/app/components/app/therapy-protocol/add-list.cfg.ts
new file mode 100644
index 00000000..856ae82b
--- /dev/null
+++ b/app/components/app/therapy-protocol/add-list.cfg.ts
@@ -0,0 +1,51 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+export const medicalDiagnosisConfig: Config = {
+ cols: [{width: 10}, {}, {},],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Diagnosa' },
+ { label: 'ICD-X' },
+ ],
+ ],
+
+ keys: ['number', 'diagnosis', 'icd_x'],
+
+ parses: { },
+}
+
+export const functionalDiagnosisConfig: Config = {
+ cols: [{width: 10}, {}, {},],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Diagnosa' },
+ { label: 'ICD-X' },
+ ],
+ ],
+
+ keys: ['number', 'diagnosis', 'icd_x'],
+
+ parses: { },
+}
+
+
+
+export const proceduralConfig: Config = {
+ cols: [{width: 10}, {}, {},],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Prosedur' },
+ { label: 'ICD-IX' },
+ ],
+ ],
+
+ keys: ['number', 'procedure', 'icd_x'],
+
+ parses: { },
+}
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/detail-list.cfg.ts b/app/components/app/therapy-protocol/detail-list.cfg.ts
new file mode 100644
index 00000000..e50113d7
--- /dev/null
+++ b/app/components/app/therapy-protocol/detail-list.cfg.ts
@@ -0,0 +1,28 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+const action = defineAsyncComponent(() => import('./_common/btn-confirmation-detail.vue'))
+
+export const detailTherapyProtocolListConfig: Config = {
+ cols: [{}, {}, {}, {width: 100},],
+
+ headers: [
+ [
+ { label: 'Program Kegiatan' },
+ { label: 'Paraf Terapis' },
+ { label: 'Paraf Dokter' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['program', 'therapistSign', 'doctorSign', 'action'],
+
+ parses: { },
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+}
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/detail.vue b/app/components/app/therapy-protocol/detail.vue
new file mode 100644
index 00000000..e57ff3b1
--- /dev/null
+++ b/app/components/app/therapy-protocol/detail.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+ Kembali
+
+
+
+
+ Form 1
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa bulan` }}
+
+
+
+
+ Form 2
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+
+ aaaaaa
+
+
+ aaaaaa
+
+
+ aaaaaa
+
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+
+
+
+
+ Form 3
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/edit.vue b/app/components/app/therapy-protocol/edit.vue
new file mode 100644
index 00000000..e871fc90
--- /dev/null
+++ b/app/components/app/therapy-protocol/edit.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/entry-form.vue b/app/components/app/therapy-protocol/entry-form.vue
new file mode 100644
index 00000000..22bae769
--- /dev/null
+++ b/app/components/app/therapy-protocol/entry-form.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/entry.vue b/app/components/app/therapy-protocol/entry.vue
new file mode 100644
index 00000000..48065416
--- /dev/null
+++ b/app/components/app/therapy-protocol/entry.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/base-textarea.vue b/app/components/app/therapy-protocol/field/base-textarea.vue
new file mode 100644
index 00000000..e6e7a63c
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/base-textarea.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/index.ts b/app/components/app/therapy-protocol/field/index.ts
new file mode 100644
index 00000000..f3df2c2d
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/index.ts
@@ -0,0 +1,4 @@
+export { default as RadioRelations } from './radio-relations.vue'
+export { default as SelectExaminationDate } from './select-examination-date.vue'
+export { default as BaseTextarea } from './base-textarea.vue'
+export { default as RadioWorkDisease } from './radio-work-disease.vue'
diff --git a/app/components/app/therapy-protocol/field/radio-relations.vue b/app/components/app/therapy-protocol/field/radio-relations.vue
new file mode 100644
index 00000000..aba12b86
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/radio-relations.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/radio-work-disease.vue b/app/components/app/therapy-protocol/field/radio-work-disease.vue
new file mode 100644
index 00000000..9eeaa0d8
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/radio-work-disease.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/select-examination-date.vue b/app/components/app/therapy-protocol/field/select-examination-date.vue
new file mode 100644
index 00000000..6ab232b9
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/select-examination-date.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/history-dialog.vue b/app/components/app/therapy-protocol/history-dialog.vue
new file mode 100644
index 00000000..7bfcac10
--- /dev/null
+++ b/app/components/app/therapy-protocol/history-dialog.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/history-list.cfg.ts b/app/components/app/therapy-protocol/history-list.cfg.ts
new file mode 100644
index 00000000..0467589e
--- /dev/null
+++ b/app/components/app/therapy-protocol/history-list.cfg.ts
@@ -0,0 +1,45 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dp.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 140}, {width: 3},],
+
+ headers: [
+ [
+ { label: 'Tgl Pemeriksaan' },
+ { label: 'DPJP' },
+ { label: 'Anamnesa' },
+ { label: 'Permintaan Terapi' },
+ { label: 'Program/Kegiatan' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['birth_date', 'person.name', 'person.name', 'person.name', 'birth_date', "action"],
+
+ parses: {
+ birth_date: (rec: unknown): unknown => {
+ const { person } = rec as Patient
+
+ if (typeof person.birthDate == 'object' && person.birthDate) {
+ return (person.birthDate as Date).toLocaleDateString('id-ID')
+ } else if (typeof person.birthDate == 'string') {
+ return (person.birthDate as string).substring(0, 10)
+ }
+ return person.birthDate
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+}
diff --git a/app/components/app/therapy-protocol/list.cfg.ts b/app/components/app/therapy-protocol/list.cfg.ts
new file mode 100644
index 00000000..34155752
--- /dev/null
+++ b/app/components/app/therapy-protocol/list.cfg.ts
@@ -0,0 +1,53 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-duvp.vue'))
+const statusBadge = defineAsyncComponent(() => import('./_common/verify-badge.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 140}, {width: 3},],
+
+ headers: [
+ [
+ { label: 'Tgl Pemeriksaan' },
+ { label: 'Anamnesa' },
+ { label: 'Permintaan Terapi' },
+ { label: 'Program' },
+ { label: 'Status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['anamnesis', 'anamnesis', 'anamnesis', 'anamnesis', 'status', 'action'],
+
+ parses: {
+ birth_date: (rec: unknown): unknown => {
+ const { person } = rec as Patient
+
+ if (typeof person.birthDate == 'object' && person.birthDate) {
+ return (person.birthDate as Date).toLocaleDateString('id-ID')
+ } else if (typeof person.birthDate == 'string') {
+ return (person.birthDate as string).substring(0, 10)
+ }
+ return person.birthDate
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+}
diff --git a/app/components/app/therapy-protocol/list.vue b/app/components/app/therapy-protocol/list.vue
new file mode 100644
index 00000000..0d62cc6c
--- /dev/null
+++ b/app/components/app/therapy-protocol/list.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/dropdown-action-p.vue b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/dropdown-action-p.vue
new file mode 100644
index 00000000..91e9f72c
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list-cfg.ts b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list-cfg.ts
new file mode 100644
index 00000000..cc02aa1d
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list-cfg.ts
@@ -0,0 +1,33 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./dropdown-action-p.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
+
+ keys: ['code', 'name', 'indName', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama (FHIR)' },
+ { key: 'indName', label: 'Nama (ID)' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list.vue b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list.vue
new file mode 100644
index 00000000..e4836c7c
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-picker.vue b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-picker.vue
new file mode 100644
index 00000000..4a44a40f
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-picker.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
{{ title }}
+
+
+ Pilih Diagnosis
+
+
+
+
+
+
+
+
+
+
+ Prosedur
+ ICD-X
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list-cfg.ts b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list-cfg.ts
new file mode 100644
index 00000000..cc02aa1d
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list-cfg.ts
@@ -0,0 +1,33 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./dropdown-action-p.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
+
+ keys: ['code', 'name', 'indName', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama (FHIR)' },
+ { key: 'indName', label: 'Nama (ID)' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list.vue b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list.vue
new file mode 100644
index 00000000..67be3075
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-picker.vue b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-picker.vue
new file mode 100644
index 00000000..e609450b
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-picker.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
{{ title }}
+
+
+ Pilih Diagnosis
+
+
+
+
+
+
+
+
+
+
+ Diagnosis
+ ICD-X
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/dropdown-action-p.vue b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/dropdown-action-p.vue
new file mode 100644
index 00000000..ac7c8f29
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list-cfg.ts b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list-cfg.ts
new file mode 100644
index 00000000..cc02aa1d
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list-cfg.ts
@@ -0,0 +1,33 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./dropdown-action-p.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
+
+ keys: ['code', 'name', 'indName', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama (FHIR)' },
+ { key: 'indName', label: 'Nama (ID)' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list.vue b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list.vue
new file mode 100644
index 00000000..d299219f
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-picker.vue b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-picker.vue
new file mode 100644
index 00000000..76ce6dfd
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-picker.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
{{ title }}
+
+
+ Pilih Diagnosis
+
+
+
+
+
+
+
+
+
+
+ Diagnosis
+ ICD-X
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/dropdown-action-p.vue b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/dropdown-action-p.vue
new file mode 100644
index 00000000..a30ca20c
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/verify-dialog.vue b/app/components/app/therapy-protocol/verify-dialog.vue
new file mode 100644
index 00000000..d72a96c2
--- /dev/null
+++ b/app/components/app/therapy-protocol/verify-dialog.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
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" />
+
+
+ Riwayat Program Nasional
+
+
+
+
+
+
@@ -172,5 +211,13 @@ watch([recId, recAction], () => {