+
+
-
-
+
-
-
+ {{ push({ relation: 'mother', name: '', address: '', education_code: '' }) }}
+ {{ push({ relation: 'father', name: '', address: '', education_code: '' }) }}
+
+
+
-
-
- {{ (values.families as FamilyData[])?.[idx]?.relation === 'mother' ? 'Data Ibu' : 'Data Ayah' }}
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
diff --git a/app/components/app/person/fields/index.ts b/app/components/app/person/fields/index.ts
new file mode 100644
index 00000000..f87c17bd
--- /dev/null
+++ b/app/components/app/person/fields/index.ts
@@ -0,0 +1,2 @@
+export { default as RadioParentsInput } from './radio-parents-input.vue'
+export { default as SelectBirthPlace } from './select-birth-place.vue'
diff --git a/app/components/app/person/_common/radio-parents-input.vue b/app/components/app/person/fields/radio-parents-input.vue
similarity index 75%
rename from app/components/app/person/_common/radio-parents-input.vue
rename to app/components/app/person/fields/radio-parents-input.vue
index bd8b6f15..2001f702 100644
--- a/app/components/app/person/_common/radio-parents-input.vue
+++ b/app/components/app/person/fields/radio-parents-input.vue
@@ -16,6 +16,7 @@ const props = defineProps<{
radioItemClass?: string
labelClass?: string
isRequired?: boolean
+ isDisabled?: boolean
}>()
const {
@@ -28,8 +29,8 @@ const {
} = props
const residenceOptions = [
- { label: 'Ya', value: '1' },
- { label: 'Tidak', value: '0' },
+ { label: 'Ya', value: 'yes' },
+ { label: 'Tidak', value: 'no' },
]
@@ -55,6 +56,7 @@ const residenceOptions = [
import type { FormErrors } from '~/types/error'
import Combobox from '~/components/pub/my-ui/combobox/combobox.vue'
-import FieldGroup from '~/components/pub/my-ui/form/field-group.vue'
-import Field from '~/components/pub/my-ui/form/field.vue'
-import Label from '~/components/pub/my-ui/form/label.vue'
import { cn } from '~/lib/utils'
import * as DE from '~/components/pub/my-ui/doc-entry'
@@ -52,11 +49,21 @@ onMounted(() => {
-
+
Tempat Lahir
-
-
+
+
+import { ActionEvents, type ListItemDto } from '~/components/pub/my-ui/data/types';
+import Button from '~/components/pub/ui/button/Button.vue';
+
+const props = defineProps<{
+
+}>()
+const isModalOpen = inject[>('isHistoryDialogOpen')!
+
+function openDialog() {
+ isModalOpen.value = true
+}
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/prb/_common/filter.vue b/app/components/app/prb/_common/filter.vue
new file mode 100644
index 00000000..d5e99b30
--- /dev/null
+++ b/app/components/app/prb/_common/filter.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-date.vue b/app/components/app/prb/_common/select-date.vue
new file mode 100644
index 00000000..d94d04eb
--- /dev/null
+++ b/app/components/app/prb/_common/select-date.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-dpjp.vue b/app/components/app/prb/_common/select-dpjp.vue
new file mode 100644
index 00000000..9e83e64f
--- /dev/null
+++ b/app/components/app/prb/_common/select-dpjp.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-medicine-form.vue b/app/components/app/prb/_common/select-medicine-form.vue
new file mode 100644
index 00000000..9e83e64f
--- /dev/null
+++ b/app/components/app/prb/_common/select-medicine-form.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-medicine.vue b/app/components/app/prb/_common/select-medicine.vue
new file mode 100644
index 00000000..9e83e64f
--- /dev/null
+++ b/app/components/app/prb/_common/select-medicine.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-program.vue b/app/components/app/prb/_common/select-program.vue
new file mode 100644
index 00000000..cde3fb66
--- /dev/null
+++ b/app/components/app/prb/_common/select-program.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/bpjs-list.cfg.ts b/app/components/app/prb/bpjs-list.cfg.ts
new file mode 100644
index 00000000..92d68f73
--- /dev/null
+++ b/app/components/app/prb/bpjs-list.cfg.ts
@@ -0,0 +1,60 @@
+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-upd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'No. PRB' },
+ { label: 'No. RM' },
+ { label: 'Nama Pasien' },
+ { label: 'Jenis Kelamin' },
+ { label: 'Alamat' },
+ { label: 'Klinik' },
+ { label: 'Nama Dokter' },
+ { label: 'Tanggal' },
+ { label: 'Program PRB' },
+ { label: 'No. SEP' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9', '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/prb/detail.vue b/app/components/app/prb/detail.vue
new file mode 100644
index 00000000..7e40366d
--- /dev/null
+++ b/app/components/app/prb/detail.vue
@@ -0,0 +1,62 @@
+
+
+
+
+ {{ 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 : '-' }}
+
+
+
+
diff --git a/app/components/app/prb/entry.vue b/app/components/app/prb/entry.vue
new file mode 100644
index 00000000..4658578a
--- /dev/null
+++ b/app/components/app/prb/entry.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
diff --git a/app/components/app/prb/history-list.cfg.ts b/app/components/app/prb/history-list.cfg.ts
new file mode 100644
index 00000000..6f571af3
--- /dev/null
+++ b/app/components/app/prb/history-list.cfg.ts
@@ -0,0 +1,62 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-print.vue'))
+const statusBadge = defineAsyncComponent(() => import('~/components/pub/my-ui/badge/status-badge.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {width: 100}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Tgl Diterbitkan' },
+ { label: 'Kode Obat' },
+ { label: 'Nama Obat' },
+ { label: 'Signa' },
+ { label: 'Jumlah' },
+ { label: 'Durasi Pemberian' },
+ { label: 'status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'name1', 'name2', 'name3', 'name4', 'name5', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/prb/history-list.vue b/app/components/app/prb/history-list.vue
new file mode 100644
index 00000000..20cc7eaf
--- /dev/null
+++ b/app/components/app/prb/history-list.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/prb/list.cfg.ts b/app/components/app/prb/list.cfg.ts
new file mode 100644
index 00000000..4da07cdd
--- /dev/null
+++ b/app/components/app/prb/list.cfg.ts
@@ -0,0 +1,56 @@
+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-upd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Tgl Diterbitkan' },
+ { label: 'Kode Obat' },
+ { label: 'Nama Obat' },
+ { label: 'Signa' },
+ { label: 'Jumlah' },
+ { label: 'Durasi Pemberian' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'name1', 'name2', 'name3', 'name4', 'name5', '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/prb/list.vue b/app/components/app/prb/list.vue
new file mode 100644
index 00000000..5e51b50f
--- /dev/null
+++ b/app/components/app/prb/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/app/components/app/prb/obat-picker/form.vue b/app/components/app/prb/obat-picker/form.vue
new file mode 100644
index 00000000..510cae69
--- /dev/null
+++ b/app/components/app/prb/obat-picker/form.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/prb/obat-picker/picker-dialog.vue b/app/components/app/prb/obat-picker/picker-dialog.vue
new file mode 100644
index 00000000..69ea3b90
--- /dev/null
+++ b/app/components/app/prb/obat-picker/picker-dialog.vue
@@ -0,0 +1,140 @@
+
+
+
+ ]
+
+
{{ title }}
+
+
+
+
+
+
+
+
+
+
+ Code
+ Name
+ Signa
+ Jumlah
+ Durasi Pemberian
+ Action
+
+
+
+
+ {{ field.value?.code }}
+ {{ field.value?.name }}
+ {{ field.value?.signa }}
+ {{ field.value?.total }}
+ {{ field.value?.duration }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/sep-picker/list.cfg.ts b/app/components/app/prb/sep-picker/list.cfg.ts
new file mode 100644
index 00000000..5a928e2d
--- /dev/null
+++ b/app/components/app/prb/sep-picker/list.cfg.ts
@@ -0,0 +1,83 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-choose.vue'))
+const statusBadge = defineAsyncComponent(() => import('~/components/pub/my-ui/badge/status-badge.vue'))
+
+export const config: Config = {
+ cols: [
+ { width: 120 }, // TGL. SEP
+ { width: 150 }, // NO. SEP
+ { width: 120 }, // PELAYANAN
+ { width: 100 }, // JALUR
+ { width: 150 }, // NO. RM
+ { width: 200 }, // NAMA PASIEN
+ { width: 150 }, // NO. KARTU BPJS
+ { width: 150 }, // NO. SURAT KONTROL
+ { width: 150 }, // TGL SURAT KONTROL
+ { width: 150 }, // KLINIK TUJUAN
+ { width: 200 }, // DPJP
+ { width: 200 }, // DIAGNOSIS AWAL
+ { width: 100 }, // AKSI
+ ],
+
+ headers: [
+ [
+ { label: 'TGL. SEP' },
+ { label: 'NO. SEP' },
+ { label: 'PELAYANAN' },
+ { label: 'JALUR' },
+ { label: 'NO. RM' },
+ { label: 'NAMA PASIEN' },
+ { label: 'NO. KARTU BPJS' },
+ { label: 'NO. SURAT KONTROL' },
+ { label: 'TGL SURAT KONTROL' },
+ { label: 'KLINIK TUJUAN' },
+ { label: 'DPJP' },
+ { label: 'DIAGNOSIS AWAL' },
+ { label: 'AKSI' },
+ ],
+ ],
+
+ keys: [
+ 'letterDate',
+ 'letterNumber',
+ 'serviceType',
+ 'flow',
+ 'medicalRecordNumber',
+ 'patientName',
+ 'cardNumber',
+ 'controlLetterNumber',
+ 'controlLetterDate',
+ 'clinicDestination',
+ 'attendingDoctor',
+ 'diagnosis',
+ 'action',
+ ],
+
+ delKeyNames: [
+ { key: 'letterNumber', label: 'NO. SEP' },
+ { key: 'patientName', label: 'Nama Pasien' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+
+ htmls: {},
+}
\ No newline at end of file
diff --git a/app/components/app/prb/sep-picker/list.vue b/app/components/app/prb/sep-picker/list.vue
new file mode 100644
index 00000000..9c8aa593
--- /dev/null
+++ b/app/components/app/prb/sep-picker/list.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
diff --git a/app/components/app/prb/sep-picker/picker-dialog.vue b/app/components/app/prb/sep-picker/picker-dialog.vue
new file mode 100644
index 00000000..efb32023
--- /dev/null
+++ b/app/components/app/prb/sep-picker/picker-dialog.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/prescription/flat-list.vue b/app/components/app/prescription/flat-list.vue
index fe0bab9c..2c768201 100644
--- a/app/components/app/prescription/flat-list.vue
+++ b/app/components/app/prescription/flat-list.vue
@@ -31,12 +31,6 @@ function navClick(type: 'cancel' | 'edit' | 'submit', data: Prescription): void
Belum Ada Data
-
-
-
diff --git a/app/components/app/prescription/grouped-list.vue b/app/components/app/prescription/grouped-list.vue
index 07d6fcaa..87e202bb 100644
--- a/app/components/app/prescription/grouped-list.vue
+++ b/app/components/app/prescription/grouped-list.vue
@@ -32,12 +32,6 @@ function navClick(type: 'cancel' | 'edit' | 'submit', data: Prescription): void
Belum Ada Data
-
-
-
diff --git a/app/components/app/procedure-room-order-item/list-detail.cfg.ts b/app/components/app/procedure-room-order-item/list-detail.cfg.ts
new file mode 100644
index 00000000..cf0f6dab
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-detail.cfg.ts
@@ -0,0 +1,16 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+export const config: Config = {
+ cols: [{}, {}, { classVal: '!p-0.5' }],
+
+ headers: [
+ [
+ { label: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Catatan' },
+ ],
+ ],
+
+ keys: ['procedureRoom.code', 'procedureRoom.infra.name', 'note'],
+}
diff --git a/app/components/app/procedure-room-order-item/list-detail.vue b/app/components/app/procedure-room-order-item/list-detail.vue
new file mode 100644
index 00000000..75727a72
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-detail.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+ Daftar Order Ruang
+
+
+
+
diff --git a/app/components/app/procedure-room-order-item/list-entry.cfg.ts b/app/components/app/procedure-room-order-item/list-entry.cfg.ts
new file mode 100644
index 00000000..2afcd855
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-entry.cfg.ts
@@ -0,0 +1,43 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
+const input = defineAsyncComponent(() => import('~/components/pub/ui/input/Input.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, { classVal: '!p-0.5' }, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Catatan' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['procedureRoom.code', 'procedureRoom.infra.name', 'note'],
+
+ delKeyNames: [
+ { key: 'mcuSrc.name', label: 'Nama' },
+ ],
+
+ components: {
+ note(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: input,
+ }
+ },
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/procedure-room-order-item/list-entry.vue b/app/components/app/procedure-room-order-item/list-entry.vue
new file mode 100644
index 00000000..f86a0b8e
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-entry.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Daftar Order Ruang
+
+
+
+
+
+
+
diff --git a/app/components/app/procedure-room-order/detail.vue b/app/components/app/procedure-room-order/detail.vue
new file mode 100644
index 00000000..23d0dc75
--- /dev/null
+++ b/app/components/app/procedure-room-order/detail.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Detail Order
+
+
+
+ No. Order
+
+ ORT-{{ data.id }}
+
+
+ Tgl. Order
+
+ {{ data.createdAt?.substring(0, 10) }}
+
+
+
+
diff --git a/app/components/app/procedure-room-order/form.vue b/app/components/app/procedure-room-order/form.vue
new file mode 100644
index 00000000..ff6c3835
--- /dev/null
+++ b/app/components/app/procedure-room-order/form.vue
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/app/components/app/procedure-room-order/list.cfg.ts b/app/components/app/procedure-room-order/list.cfg.ts
new file mode 100644
index 00000000..e415e26f
--- /dev/null
+++ b/app/components/app/procedure-room-order/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { ProcedureRoomOrder } from '~/models/procedure-room-order'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dsd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [[
+ { label: 'Tgl. Order' },
+ { label: 'No. Order' },
+ { label: 'Ruangan' },
+ { label: 'Status' },
+ { label: 'Resume' },
+ { label: '' },
+ ]],
+
+ keys: ['date', 'number', 'room', 'status_code', 'resume', 'action'],
+
+ delKeyNames: [
+ { key: 'createdAt', label: 'Tgl. Order' },
+ { key: 'id', label: 'No. Order' },
+ ],
+
+ parses: {
+ date: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ return recX.createdAt ? recX.createdAt.substring(0, 10) : ''
+
+ },
+ number: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ return `ORT-${recX.id}`
+ },
+ room: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ let result = ''
+ if (recX.items && recX.items.length > 0) {
+ recX.items.forEach((item, idx) => {
+ result += item.infra?.name ? `
${item.infra.name}
` : ''
+ })
+ }
+ // recX.ite
+ return ''
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/procedure-room-order/list.vue b/app/components/app/procedure-room-order/list.vue
new file mode 100644
index 00000000..bdbfe1be
--- /dev/null
+++ b/app/components/app/procedure-room-order/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
diff --git a/app/components/app/procedure-room/multi-opt-picker.vue b/app/components/app/procedure-room/multi-opt-picker.vue
new file mode 100644
index 00000000..ecdd945a
--- /dev/null
+++ b/app/components/app/procedure-room/multi-opt-picker.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+
+
+
Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/picker.vue b/app/components/app/procedure-room/picker.vue
new file mode 100644
index 00000000..3660e0cb
--- /dev/null
+++ b/app/components/app/procedure-room/picker.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+
+
+
Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/single-opt-picker.vue b/app/components/app/procedure-room/single-opt-picker.vue
new file mode 100644
index 00000000..ecdd945a
--- /dev/null
+++ b/app/components/app/procedure-room/single-opt-picker.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+
+
+
Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/switcher.vue b/app/components/app/procedure-room/switcher.vue
new file mode 100644
index 00000000..fdd80e7d
--- /dev/null
+++ b/app/components/app/procedure-room/switcher.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Jenis Ruang Tindakan
+
+
+
+
+
+
diff --git a/app/components/app/procedure-src/list.vue b/app/components/app/procedure-src/list.vue
index 1be60a60..d976b660 100644
--- a/app/components/app/procedure-src/list.vue
+++ b/app/components/app/procedure-src/list.vue
@@ -7,13 +7,16 @@ import type { PaginationMeta } from '~/components/pub/my-ui/pagination/paginatio
// Configs
import { config } from './list-cfg'
+import type { Config } from '~/components/pub/my-ui/data-table'
interface Props {
data: any[]
paginationMeta: PaginationMeta
+ tableConfig?: Config
}
-
-defineProps
()
+const props = withDefaults(defineProps(), {
+ tableConfig: () => config,
+})
const emit = defineEmits<{
pageChange: [page: number]
@@ -27,7 +30,7 @@ function handlePageChange(page: number) {
diff --git a/app/components/app/sep/action-history.vue b/app/components/app/sep/action-history.vue
new file mode 100644
index 00000000..8ca652b1
--- /dev/null
+++ b/app/components/app/sep/action-history.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
diff --git a/app/components/app/sep/entry-form.vue b/app/components/app/sep/entry-form.vue
index 35956ad7..594d2f02 100644
--- a/app/components/app/sep/entry-form.vue
+++ b/app/components/app/sep/entry-form.vue
@@ -24,11 +24,11 @@ import { useForm } from 'vee-validate'
import { refDebounced } from '@vueuse/core'
const props = defineProps<{
+ mode?: string
isLoading?: boolean
isReadonly?: boolean
isService?: boolean
- isShowPatient?: boolean;
- mode?: string
+ isShowPatient?: boolean
doctors: any[]
diagnoses: any[]
facilitiesFrom: any[]
@@ -102,14 +102,17 @@ const titleLetterNumber = computed(() => (admissionType.value === '3' ? 'Surat K
const titleLetterDate = computed(() =>
admissionType.value === '3' ? 'Tanggal Surat Kontrol' : 'Tanggal Surat Rujukan',
)
+const mode = props.mode !== undefined ? props.mode : 'add'
+const attendingDoctorName = ref('')
+const diagnosisName = ref('')
const isAccidentally = computed(() => accident.value === '1' || accident.value === '2')
const isProvinceSelected = computed(() => accidentProvince.value !== '')
const isCitySelected = computed(() => accidentCity.value !== '')
-const mode = props.mode !== undefined ? props.mode : 'add'
const isLoading = props.isLoading !== undefined ? props.isLoading : false
const isReadonly = props.isReadonly !== undefined ? props.isReadonly : false
const isService = ref(props.isService || false)
const isShowPatient = ref(props.isShowPatient || false)
+const isShowSpecialist = ref(false)
const isDateReload = ref(false)
// Debounced search for bpjsNumber and nationalId
@@ -129,28 +132,138 @@ async function onFetchChildren(parentId: string): Promise
{
console.log('onFetchChildren', parentId)
}
+const onBack = () => {
+ emit('event', 'back')
+}
+
+const onSaveNumber = () => {
+ emit('event', 'save-sep-number', { sepNumber: props?.objects?.sepNumber || '' })
+}
+
// Submit handler
const onSubmit = handleSubmit((values) => {
- console.log('✅ Validated form values:', JSON.stringify(values, null, 2))
emit('event', 'save-sep', values)
})
+const onInitialized = (objects: any) => {
+ sepDate.value = objects?.registerDate || new Date().toISOString().substring(0, 10)
+ cardNumber.value = objects?.cardNumber || '-'
+ nationalId.value = objects?.nationalIdentity || '-'
+ medicalRecordNumber.value = objects?.medicalRecordNumber || '-'
+ patientName.value = objects?.patientName || '-'
+ phoneNumber.value = objects?.phoneNumber || '-'
+ if (objects?.sepType === 'internal') {
+ admissionType.value = '4'
+ }
+ if (objects?.sepType === 'external') {
+ admissionType.value = '1'
+ }
+ if (objects?.diagnosisName) {
+ diagnosisName.value = objects?.diagnosisName
+ }
+ // Patient data
+ if (objects?.serviceType) {
+ serviceType.value = objects?.serviceType
+ }
+ if (objects?.fromClinic) {
+ fromClinic.value = objects?.fromClinic
+ }
+ if (objects?.destinationClinic) {
+ destinationClinic.value = objects?.destinationClinic
+ }
+ // Doctor & Support data
+ if (objects?.attendingDoctor) {
+ attendingDoctor.value = objects?.attendingDoctor
+ }
+ if (objects?.attendingDoctorName) {
+ attendingDoctorName.value = objects?.attendingDoctorName
+ }
+ if (objects?.cob) {
+ cob.value = objects?.cob
+ }
+ if (objects?.cataract) {
+ cataract.value = objects?.cataract
+ }
+ if (objects?.clinicExcecutive) {
+ clinicExcecutive.value = objects?.clinicExcecutive
+ }
+ if (objects?.procedureType) {
+ procedureType.value = objects?.procedureType
+ }
+ if (objects?.supportCode) {
+ supportCode.value = objects?.supportCode
+ }
+ // Class & Payment data
+ if (objects?.classLevel) {
+ classLevel.value = objects?.classLevel
+ }
+ if (objects?.classLevelUpgrade) {
+ classLevelUpgrade.value = objects?.classLevelUpgrade
+ }
+ if (objects?.classPaySource) {
+ classPaySource.value = objects?.classPaySource
+ }
+ if (objects?.responsiblePerson) {
+ responsiblePerson.value = objects?.responsiblePerson
+ }
+ // Accident data
+ if (objects?.trafficAccident) {
+ accident.value = objects?.trafficAccident
+ }
+ if (objects?.lpNumber) {
+ lpNumber.value = objects?.lpNumber
+ }
+ if (objects?.accidentDate) {
+ accidentDate.value = objects?.accidentDate
+ }
+ if (objects?.accidentNote) {
+ accidentNote.value = objects?.accidentNote
+ }
+ if (objects?.accidentProvince) {
+ accidentProvince.value = objects?.accidentProvince
+ }
+ if (objects?.accidentCity) {
+ accidentCity.value = objects?.accidentCity
+ }
+ if (objects?.accidentDistrict) {
+ accidentDistrict.value = objects?.accidentDistrict
+ }
+ if (objects?.suplesi) {
+ suplesi.value = objects?.suplesi
+ }
+ if (objects?.suplesiNumber) {
+ suplesiNumber.value = objects?.suplesiNumber
+ }
+ // Visit purpose & Assessment
+ if (objects?.purposeOfVisit) {
+ purposeOfVisit.value = objects?.purposeOfVisit
+ }
+ if (objects?.serviceAssessment) {
+ serviceAssessment.value = objects?.serviceAssessment
+ }
+ // Note & Specialist
+ if (objects?.note) {
+ note.value = objects?.note
+ }
+ if (objects?.subSpecialistId) {
+ subSpecialistId.value = objects?.subSpecialistId
+ }
+ // Referral letter
+ if (objects?.referralLetterNumber) {
+ referralLetterNumber.value = objects?.referralLetterNumber
+ }
+}
+
watch(props, (value) => {
const objects = value.objects || ({} as any)
if (Object.keys(objects).length > 0) {
- sepDate.value = objects?.registerDate || new Date().toISOString().substring(0, 10)
- cardNumber.value = objects?.cardNumber || '-'
- nationalId.value = objects?.nationalIdentity || '-'
- medicalRecordNumber.value = objects?.medicalRecordNumber || '-'
- patientName.value = objects?.patientName || '-'
- if (objects?.sepType === 'internal') {
- admissionType.value = '4'
- }
- if (objects?.sepType === 'external') {
- admissionType.value = '1'
- }
+ onInitialized(objects)
isDateReload.value = true
setTimeout(() => {
+ if (objects?.sepDate) {
+ sepDate.value = objects?.sepDate
+ referralLetterDate.value = objects?.sepDate
+ }
if (objects?.letterDate) {
referralLetterDate.value = objects?.letterDate
}
@@ -176,6 +289,9 @@ onMounted(() => {
if (!isService.value) {
serviceType.value = '2'
}
+ if (!admissionType.value) {
+ admissionType.value = '1'
+ }
})
@@ -199,10 +315,11 @@ onMounted(() => {
@@ -277,7 +394,7 @@ onMounted(() => {
id="cardNumber"
v-model="cardNumber"
v-bind="cardNumberAttrs"
- :disabled="false"
+ :disabled="isLoading || isReadonly"
/>
@@ -292,7 +409,7 @@ onMounted(() => {
id="nationalId"
v-model="nationalId"
v-bind="nationalIdAttrs"
- :disabled="false"
+ :disabled="isLoading || isReadonly"
/>
@@ -371,6 +488,7 @@ onMounted(() => {
"
/>
@@ -109,6 +112,7 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
@@ -124,6 +128,7 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
@@ -131,6 +136,7 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
diff --git a/app/components/app/soapi/list-cfg.ts b/app/components/app/soapi/list-cfg.ts
index 3db1b24a..b73651bd 100644
--- a/app/components/app/soapi/list-cfg.ts
+++ b/app/components/app/soapi/list-cfg.ts
@@ -3,7 +3,7 @@ import { defineAsyncComponent } from 'vue'
type SmallDetailDto = any
-const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-d.vue'))
export const config: Config = {
cols: [{}, {}, {}, { width: 100 }, { width: 120 }, {}, {}, {}, { width: 100 }, { width: 100 }, {}, { width: 50 }],
diff --git a/app/components/app/summary-medic/entry.vue b/app/components/app/summary-medic/entry.vue
new file mode 100644
index 00000000..f75e918e
--- /dev/null
+++ b/app/components/app/summary-medic/entry.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
diff --git a/app/components/app/summary-medic/list.cfg.ts b/app/components/app/summary-medic/list.cfg.ts
new file mode 100644
index 00000000..c2f57c54
--- /dev/null
+++ b/app/components/app/summary-medic/list.cfg.ts
@@ -0,0 +1,82 @@
+import type { Config, RecComponent, RecStrFuncComponent, RecStrFuncUnknown } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { GeneralConsent } from '~/models/general-consent'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+export const config: Config = {
+ cols: [{ width: 100 }, {}, {}, {}, { width: 50 }],
+ headers: [
+ [
+ { label: 'Tanggal' },
+ { label: 'Anggota Keluarga' },
+ { label: 'Penanggung Jawab' },
+ { label: 'Pemberi Informasi' },
+ { label: 'Saksi 1' },
+ { label: 'Saksi 2' },
+ { label: '' },
+ ],
+ ],
+ keys: ['date', 'relatives', 'responsible', 'informant', 'witness1', 'witness2', 'action'],
+ delKeyNames: [
+ { key: 'data', label: 'Tanggal' },
+ { key: 'dstDoctor.name', label: 'Dokter' },
+ ],
+ parses: {
+ date(rec) {
+ const recX = rec as GeneralConsent
+ return recX?.createdAt?.substring(0, 10) || '-'
+ },
+ relatives(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.relatives?.join(', ') || '-'
+ },
+ responsible(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.responsible || '-'
+ },
+ informant(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.informant || '-'
+ },
+ witness1(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.witness1 || '-'
+ },
+ witness2(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.witness2 || '-'
+ },
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ } as RecStrFuncComponent,
+ htmls: {} as RecStrFuncUnknown,
+}
diff --git a/app/components/app/summary-medic/list.vue b/app/components/app/summary-medic/list.vue
new file mode 100644
index 00000000..46f595f5
--- /dev/null
+++ b/app/components/app/summary-medic/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
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..4172aaec
--- /dev/null
+++ b/app/components/app/surgery-report/_common/history-dialog.vue
@@ -0,0 +1,52 @@
+
+
+
+
+ -
+
+
+
+
+
+
+
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/patient/_common/radio-newborn.vue b/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue
similarity index 100%
rename from app/components/app/patient/_common/radio-newborn.vue
rename to app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue
diff --git a/app/components/app/patient/_common/radio-communication-barrier.vue b/app/components/app/therapy-protocol/_common/radio-relationship.vue
similarity index 83%
rename from app/components/app/patient/_common/radio-communication-barrier.vue
rename to app/components/app/therapy-protocol/_common/radio-relationship.vue
index 56918101..07aad8b8 100644
--- a/app/components/app/patient/_common/radio-communication-barrier.vue
+++ b/app/components/app/therapy-protocol/_common/radio-relationship.vue
@@ -18,8 +18,8 @@ const props = defineProps<{
}>()
const {
- fieldName = 'gender',
- label = 'Gender',
+ fieldName = 'isNewBorn',
+ label = 'Status Pasien',
errors,
class: containerClass,
radioGroupClass,
@@ -27,26 +27,24 @@ const {
labelClass,
} = props
-const genderOptions = [
- { label: 'Ya', value: 'YA' },
- { label: 'Tidak', value: 'TIDAK' },
+const newbornOptions = [
+ { label: 'Suami/Istri', value: 'partner' },
+ { label: 'Anak', value: 'child' },
]
-
+
{{ label }}
+ >
+import type { FormErrors } from '~/types/error'
+import Combobox from '~/components/pub/my-ui/combobox/combobox.vue'
+import { cn, mapToComboboxOptList } from '~/lib/utils'
+import { occupationCodes } from '~/lib/constants'
+
+import * as DE from '~/components/pub/my-ui/doc-entry'
+
+const props = defineProps<{
+ fieldName?: string
+ label?: string
+ placeholder?: string
+ errors?: FormErrors
+ class?: string
+ selectClass?: string
+ fieldGroupClass?: string
+ labelClass?: string
+ isRequired?: boolean
+}>()
+
+const {
+ fieldName = 'job',
+ label,
+ placeholder,
+ errors,
+ class: containerClass,
+ fieldGroupClass,
+ labelClass,
+} = props
+
+const arrangementTypeOpts = [
+ { label: 'KRS', value: "krs" },
+ { label: 'MRS', value: "mrs" },
+ { label: 'Pindah IGD', value: "pindahIgd" },
+ { label: 'Rujuk', value: "rujuk" },
+ { label: 'Rujuk Balik', value: "rujukBalik" },
+ { label: 'Meninggal', value: "meninggal" },
+ { label: 'Lain Lain', value: "other" },
+]
+
+
+
+
+
+ {{ 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/patient/_common/select-dob.vue b/app/components/app/therapy-protocol/_common/select-date.vue
similarity index 81%
rename from app/components/app/patient/_common/select-dob.vue
rename to app/components/app/therapy-protocol/_common/select-date.vue
index eee11acc..74245e7e 100644
--- a/app/components/app/patient/_common/select-dob.vue
+++ b/app/components/app/therapy-protocol/_common/select-date.vue
@@ -16,6 +16,8 @@ const props = defineProps<{
fieldGroupClass?: string
labelClass?: string
isRequired?: boolean
+ isDisabled?: boolean
+ isWithTime?: boolean
}>()
const {
@@ -26,6 +28,7 @@ const {
class: containerClass,
fieldGroupClass,
labelClass,
+ isWithTime = false,
} = props
// Reactive variables for age calculation
@@ -79,7 +82,7 @@ function calculateAge(birthDate: string | Date | undefined): string {
{{ label }}
@@ -96,11 +99,12 @@ function calculateAge(birthDate: string | Date | undefined): string {
{
const dateStr = typeof value === 'number' ? String(value) : value
@@ -114,27 +118,4 @@ function calculateAge(birthDate: string | Date | undefined): string {
-
- Usia
-
-
-
-
-
-
-
-
-
-
-
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..fabb0463
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
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..11a2b514
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-picker.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Prosedur
+ ICD-X
+ Action
+
+
+
+
+
+ Belum ada data dipilih.
+
+
+
+
+
+ {{ (field.value as ProcedureSrc)?.name }}
+
+
+ {{ (field.value as ProcedureSrc)?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Prosedur
+ ICD-X
+
+
+
+
+
+ Tidak ada data.
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ item.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/app/vaccine-data/_common/select-date.vue b/app/components/app/vaccine-data/_common/select-date.vue
new file mode 100644
index 00000000..d94d04eb
--- /dev/null
+++ b/app/components/app/vaccine-data/_common/select-date.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/_common/select-vaccine-type.vue b/app/components/app/vaccine-data/_common/select-vaccine-type.vue
new file mode 100644
index 00000000..cde3fb66
--- /dev/null
+++ b/app/components/app/vaccine-data/_common/select-vaccine-type.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/detail.vue b/app/components/app/vaccine-data/detail.vue
new file mode 100644
index 00000000..2c79e461
--- /dev/null
+++ b/app/components/app/vaccine-data/detail.vue
@@ -0,0 +1,68 @@
+
+
+
+
+ {{ 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 : '-' }}
+
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/entry.vue b/app/components/app/vaccine-data/entry.vue
new file mode 100644
index 00000000..4b8f291b
--- /dev/null
+++ b/app/components/app/vaccine-data/entry.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/list-doctor.cfg.ts b/app/components/app/vaccine-data/list-doctor.cfg.ts
new file mode 100644
index 00000000..be938aa5
--- /dev/null
+++ b/app/components/app/vaccine-data/list-doctor.cfg.ts
@@ -0,0 +1,53 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import actionDoctor from '~/components/pub/my-ui/data/dropdown-action-dd.vue'
+import actionNursePhysio from '~/components/pub/my-ui/data/dropdown-action-detail.vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Jenis Vaksin' },
+ { label: 'Tanggal Pemberian Vaksin' },
+ { label: 'Tanggal Kedaluwarsa Vaksin' },
+ { label: 'Dosis Ke' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['name1', 'date', 'date', 'name2', '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/vaccine-data/list-nurse-physio.cfg.ts b/app/components/app/vaccine-data/list-nurse-physio.cfg.ts
new file mode 100644
index 00000000..acfc698c
--- /dev/null
+++ b/app/components/app/vaccine-data/list-nurse-physio.cfg.ts
@@ -0,0 +1,53 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import actionDoctor from '~/components/pub/my-ui/data/dropdown-action-dd.vue'
+import actionNursePhysio from '~/components/pub/my-ui/data/dropdown-action-detail.vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-detail.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Jenis Vaksin' },
+ { label: 'Tanggal Pemberian Vaksin' },
+ { label: 'Tanggal Kedaluwarsa Vaksin' },
+ { label: 'Dosis Ke' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['name1', 'date', 'date', 'name2', '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/vaccine-data/list.vue b/app/components/app/vaccine-data/list.vue
new file mode 100644
index 00000000..7960112b
--- /dev/null
+++ b/app/components/app/vaccine-data/list.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
diff --git a/app/components/content/action-report/entry.vue b/app/components/content/action-report/entry.vue
new file mode 100644
index 00000000..a127b804
--- /dev/null
+++ b/app/components/content/action-report/entry.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/action-report/form.vue b/app/components/content/action-report/form.vue
new file mode 100644
index 00000000..e6c30c73
--- /dev/null
+++ b/app/components/content/action-report/form.vue
@@ -0,0 +1,82 @@
+
+
+
+ console.log(val)"
+ @back="goBack"
+ @error="
+ (err: Error) => {
+ toast({
+ title: 'Terjadi Kesalahan',
+ description: err.message,
+ variant: 'destructive',
+ })
+ }
+ "
+ :doctors="doctors"
+ :initialValues="reportData"
+ >
+
+
+
+
+
+
diff --git a/app/components/content/action-report/list.vue b/app/components/content/action-report/list.vue
new file mode 100644
index 00000000..13e2825b
--- /dev/null
+++ b/app/components/content/action-report/list.vue
@@ -0,0 +1,276 @@
+
+
+
+
+
+
Laporan Tindakan
+
Infomasi laporan tindakan pasien
+
+
+
+
+
+
+
+
+
+
+ handleActionRemove(
+ recItem.id,
+ () => {
+ router.go(0)
+ },
+ toast,
+ )
+ "
+ @cancel=""
+ >
+
+ {{ console.log(JSON.stringify(record)) }}
+
+
+ {{ field.label }}:
+ {{ record[field.key] }}
+
+
+
+
+
diff --git a/app/components/content/action-report/sample.ts b/app/components/content/action-report/sample.ts
new file mode 100644
index 00000000..f368eea6
--- /dev/null
+++ b/app/components/content/action-report/sample.ts
@@ -0,0 +1,68 @@
+export default {
+ operatorTeam: {
+ dpjpId: -1,
+ operatorName: 'Julian Alvarez',
+ assistantOperatorName: 'Arda Guller',
+ instrumentNurseName: 'Kenan Yildiz',
+ surgeryDate: '2025-11-13T14:29:00',
+ actionDiagnosis: 'Sprei gratisnya mana',
+ },
+ procedures: [
+ {
+ id: -1,
+ name: 'Ndase mumet',
+ code: 'CX1',
+ },
+ ],
+ operationExecution: {
+ surgeryType: 'khusus',
+ billingCode: 'local',
+ operationSystem: 'cito',
+ surgeryCleanType: 'kotor',
+ surgeryNumber: 'retry',
+ birthPlaceNote: 'out3',
+ personWeight: 100,
+ operationDescription: 'asdsadsa1',
+ birthRemark: 'lahir_hidup',
+
+ operationStartAt: '2025-11-13T14:29:00',
+ operationEndAt: '2025-11-13T17:29:00',
+
+ anesthesiaStartAt: '2025-11-13T11:29:00',
+ anesthesiaEndAt: '2025-11-13T18:29:00',
+ },
+ bloodInput: {
+ type: 'tc',
+ amount: {
+ prc: null,
+ wb: null,
+ ffp: null,
+ tc: 3243324,
+ },
+ },
+ implant: {
+ brand: 'Samsung',
+ name: 'S.Komedi',
+ companionName: 'When ya',
+ },
+ specimen: {
+ destination: 'pa',
+ },
+ tissueNotes: [
+ {
+ note: 'Anjai',
+ },
+ {
+ note: 'Ciee Kaget',
+ },
+ {
+ note: 'Baper',
+ },
+ {
+ note: 'Saltink weeh',
+ },
+ {
+ note: 'Kaburrr',
+ },
+ ],
+}
diff --git a/app/components/content/action-report/view.vue b/app/components/content/action-report/view.vue
new file mode 100644
index 00000000..97508a22
--- /dev/null
+++ b/app/components/content/action-report/view.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
diff --git a/app/components/content/ap-lab-order/entry.vue b/app/components/content/ap-lab-order/entry.vue
new file mode 100644
index 00000000..84349b70
--- /dev/null
+++ b/app/components/content/ap-lab-order/entry.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/ap-lab-order/list.vue b/app/components/content/ap-lab-order/list.vue
new file mode 100644
index 00000000..b04cf7e5
--- /dev/null
+++ b/app/components/content/ap-lab-order/list.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ />
+
diff --git a/app/components/content/ap-lab-order/main.vue b/app/components/content/ap-lab-order/main.vue
new file mode 100644
index 00000000..033d093f
--- /dev/null
+++ b/app/components/content/ap-lab-order/main.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/components/content/assessment-education/entry.vue b/app/components/content/assessment-education/entry.vue
new file mode 100644
index 00000000..a127b804
--- /dev/null
+++ b/app/components/content/assessment-education/entry.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/assessment-education/form.vue b/app/components/content/assessment-education/form.vue
new file mode 100644
index 00000000..4553d7d5
--- /dev/null
+++ b/app/components/content/assessment-education/form.vue
@@ -0,0 +1,74 @@
+
+
+
+ console.log(val)"
+ @back="goBack"
+ @error="
+ (err: Error) => {
+ toast({
+ title: 'Terjadi Kesalahan',
+ description: err.message,
+ variant: 'destructive',
+ })
+ }
+ "
+ :doctors="doctors"
+ :initialValues="reportData"
+ />
+
+
+
diff --git a/app/components/content/assessment-education/list.vue b/app/components/content/assessment-education/list.vue
new file mode 100644
index 00000000..91f5ab5d
--- /dev/null
+++ b/app/components/content/assessment-education/list.vue
@@ -0,0 +1,276 @@
+
+
+
+
+
+
Asesmen Kebutuhan Edukasi
+
Manajemen asesmen kebutuhan edukasi pasien rawat jalan
+
+
+
+
+
+
+
+
+
+
+ handleActionRemove(
+ recItem.id,
+ () => {
+ router.go(0)
+ },
+ toast,
+ )
+ "
+ @cancel=""
+ >
+
+ {{ console.log(JSON.stringify(record)) }}
+
+
+ {{ field.label }}:
+ {{ record[field.key] }}
+
+
+
+
+
diff --git a/app/components/content/assessment-education/sample.ts b/app/components/content/assessment-education/sample.ts
new file mode 100644
index 00000000..f368eea6
--- /dev/null
+++ b/app/components/content/assessment-education/sample.ts
@@ -0,0 +1,68 @@
+export default {
+ operatorTeam: {
+ dpjpId: -1,
+ operatorName: 'Julian Alvarez',
+ assistantOperatorName: 'Arda Guller',
+ instrumentNurseName: 'Kenan Yildiz',
+ surgeryDate: '2025-11-13T14:29:00',
+ actionDiagnosis: 'Sprei gratisnya mana',
+ },
+ procedures: [
+ {
+ id: -1,
+ name: 'Ndase mumet',
+ code: 'CX1',
+ },
+ ],
+ operationExecution: {
+ surgeryType: 'khusus',
+ billingCode: 'local',
+ operationSystem: 'cito',
+ surgeryCleanType: 'kotor',
+ surgeryNumber: 'retry',
+ birthPlaceNote: 'out3',
+ personWeight: 100,
+ operationDescription: 'asdsadsa1',
+ birthRemark: 'lahir_hidup',
+
+ operationStartAt: '2025-11-13T14:29:00',
+ operationEndAt: '2025-11-13T17:29:00',
+
+ anesthesiaStartAt: '2025-11-13T11:29:00',
+ anesthesiaEndAt: '2025-11-13T18:29:00',
+ },
+ bloodInput: {
+ type: 'tc',
+ amount: {
+ prc: null,
+ wb: null,
+ ffp: null,
+ tc: 3243324,
+ },
+ },
+ implant: {
+ brand: 'Samsung',
+ name: 'S.Komedi',
+ companionName: 'When ya',
+ },
+ specimen: {
+ destination: 'pa',
+ },
+ tissueNotes: [
+ {
+ note: 'Anjai',
+ },
+ {
+ note: 'Ciee Kaget',
+ },
+ {
+ note: 'Baper',
+ },
+ {
+ note: 'Saltink weeh',
+ },
+ {
+ note: 'Kaburrr',
+ },
+ ],
+}
diff --git a/app/components/content/assessment-education/view.vue b/app/components/content/assessment-education/view.vue
new file mode 100644
index 00000000..97508a22
--- /dev/null
+++ b/app/components/content/assessment-education/view.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
diff --git a/app/components/content/chemotherapy/process.vue b/app/components/content/chemotherapy/process.vue
index 7f355b4b..5cd0b452 100644
--- a/app/components/content/chemotherapy/process.vue
+++ b/app/components/content/chemotherapy/process.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/app/components/content/consultation/list.vue b/app/components/content/consultation/list.vue
index cfce5ae3..d581e530 100644
--- a/app/components/content/consultation/list.vue
+++ b/app/components/content/consultation/list.vue
@@ -43,7 +43,7 @@ interface Props {
}
const props = defineProps()
-let units = ref<{ value: string; label: string }[]>([])
+const units = ref<{ value: string; label: string }[]>([])
const encounterId = ref(props?.encounter?.id || 0)
const title = ref('')
diff --git a/app/components/content/control-letter/add.vue b/app/components/content/control-letter/add.vue
index 44f03a2f..4ca1d089 100644
--- a/app/components/content/control-letter/add.vue
+++ b/app/components/content/control-letter/add.vue
@@ -10,13 +10,14 @@ import Confirmation from '~/components/pub/my-ui/confirmation/confirmation.vue'
import { type ControlLetter } from '~/models/control-letter'
// #region Props & Emits
-const props = defineProps<{
+const props = withDefaults(defineProps<{
+ encounter_id: number
callbackUrl?: string
-}>()
+}>(), {
+
+})
// form related state
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
const controlLetterForm = ref | null>(null)
// #endregion
@@ -72,7 +73,7 @@ async function composeFormData(): Promise {
if (!allValid) return Promise.reject('Form validation failed')
const formData = controlLetter?.values
- formData.encounter_id = encounterId
+ formData.encounter_id = props.encounter_id
return new Promise((resolve) => resolve(formData))
}
// #endregion region
diff --git a/app/components/content/control-letter/detail.vue b/app/components/content/control-letter/detail.vue
index d9019d57..effabb7f 100644
--- a/app/components/content/control-letter/detail.vue
+++ b/app/components/content/control-letter/detail.vue
@@ -1,9 +1,6 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/cp-lab-order/list.vue b/app/components/content/cp-lab-order/list.vue
index 73b9361c..8bb06569 100644
--- a/app/components/content/cp-lab-order/list.vue
+++ b/app/components/content/cp-lab-order/list.vue
@@ -21,7 +21,7 @@ import {
// Apps
import { getList, getDetail } from '~/services/mcu-order.service'
-import List from '~/components/app/mcu-order/list.vue'
+import List from '~/components/app/mcu-order/micro-list.vue'
import type { McuOrder } from '~/models/mcu-order'
const route = useRoute()
@@ -55,7 +55,7 @@ const {
})
const headerPrep: HeaderPrep = {
- title: 'Order Lab PK',
+ title: 'Order Lab Mikro',
icon: 'i-lucide-box',
refSearchNav: {
placeholder: 'Cari (min. 3 karakter)...',
diff --git a/app/components/content/cprj/list.vue b/app/components/content/cprj/list.vue
index 109bea6b..6da61716 100644
--- a/app/components/content/cprj/list.vue
+++ b/app/components/content/cprj/list.vue
@@ -63,7 +63,7 @@ const {
fetchFn: async ({ page, search }) => {
const result = await getList({
'encounter-id': id,
- typeCode: 'dev-record',
+ 'type-code': 'dev-record',
includes: 'encounter',
search,
page,
diff --git a/app/components/content/device-order/list.vue b/app/components/content/device-order/list.vue
index 1ffa324d..e5cc455b 100644
--- a/app/components/content/device-order/list.vue
+++ b/app/components/content/device-order/list.vue
@@ -28,6 +28,7 @@ import ConfirmationInfo from '~/components/app/device-order/confirmation-info.vu
// Props
const props = defineProps<{
encounter_id: number
+ canUpdate?: boolean
}>()
const encounter_id = props.encounter_id
@@ -153,7 +154,7 @@ function pickItem(): DeviceOrder | null {
:pagination-meta="paginationMeta"
@page-change="handlePageChange"
/>
-
-import { computed } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
-
-import { getDetail } from '~/services/encounter.service'
-
-import type { TabItem } from '~/components/pub/my-ui/comp-tab/type'
-import CompTab from '~/components/pub/my-ui/comp-tab/comp-tab.vue'
-
-// PLASE ORDER BY TAB POSITION
-import Status from '~/components/content/encounter/status.vue'
-import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
-import EarlyMedicalAssesmentList from '~/components/content/soapi/entry.vue'
-import EarlyMedicalRehabList from '~/components/content/soapi/entry.vue'
-import PrescriptionList from '~/components/content/prescription/list.vue'
-import Consultation from '~/components/content/consultation/list.vue'
-import ProtocolList from '~/components/app/chemotherapy/list.protocol.vue'
-import MedicineProtocolList from '~/components/app/chemotherapy/list.medicine.vue'
-
-const route = useRoute()
-const router = useRouter()
-
-const props = defineProps<{
- classes?: string
-}>()
-
-// activeTab selalu sinkron dengan query param
-const activeTab = computed({
- get: () => (route.query?.tab && typeof route.query.tab === 'string' ? route.query.tab : 'status'),
- set: (val: string) => {
- router.replace({ path: route.path, query: { tab: val } })
- },
-})
-
-const id = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-// const dataRes = await getDetail(id, {
-// includes:
-// 'patient,patient-person,patient-person-addresses,unit,Appointment_Doctor,Appointment_Doctor-employee,Appointment_Doctor-employee-person',
-// })
-// const dataResBody = dataRes.body ?? null
-// const data = dataResBody?.data ?? null
-
-// Dummy data so AppEncounterQuickInfo can render in development/storybook
-// Replace with real API result when available (see commented fetch below)
-const data = ref({
- patient: {
- number: 'RM-2025-0001',
- person: {
- name: 'John Doe',
- birthDate: '1980-01-01T00:00:00Z',
- gender_code: 'M',
- addresses: [{ address: 'Jl. Contoh No.1, Jakarta' }],
- frontTitle: '',
- endTitle: '',
- },
- },
- visitDate: new Date().toISOString(),
- unit: { name: 'Onkologi' },
- responsible_doctor: null,
- appointment_doctor: { employee: { person: { name: 'Dr. Clara Smith', frontTitle: 'Dr.', endTitle: 'Sp.OG' } } },
-})
-
-// Dummy rows for ProtocolList (matches keys expected by list-cfg.protocol)
-const protocolRows = [
- {
- number: '1',
- tanggal: new Date().toISOString().substring(0, 10),
- siklus: 'I',
- periode: 'Siklus I',
- kehadiran: 'Hadir',
- action: '',
- },
- {
- number: '2',
- tanggal: new Date().toISOString().substring(0, 10),
- siklus: 'II',
- periode: 'Siklus II',
- kehadiran: 'Tidak Hadir',
- action: '',
- },
-]
-
-const paginationMeta = {
- recordCount: protocolRows.length,
- page: 1,
- pageSize: 10,
- totalPage: 1,
- hasNext: false,
- hasPrev: false,
-}
-
-const tabsRaws: TabItem[] = [
- {
- value: 'status',
- label: 'Status Masuk/Keluar',
- groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
- component: Status,
- props: { encounter: data },
- },
- {
- value: 'early-medical-assessment',
- label: 'Pengkajian Awal Medis',
- groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
- component: EarlyMedicalAssesmentList,
- },
- {
- value: 'rehab-medical-assessment',
- label: 'Pengkajian Awal Medis Rehabilitasi Medis',
- groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
- component: EarlyMedicalRehabList,
- },
- {
- value: 'function-assessment',
- label: 'Asesmen Fungsi',
- groups: ['ambulatory', 'rehabilitation'],
- component: AssesmentFunctionList,
- },
- { value: 'therapy-protocol', groups: ['ambulatory', 'rehabilitation'], label: 'Protokol Terapi' },
- {
- value: 'chemotherapy-protocol',
- label: 'Protokol Kemoterapi',
- groups: ['chemotherapy'],
- component: ProtocolList,
- props: { data: protocolRows, paginationMeta },
- },
- {
- value: 'chemotherapy-medicine',
- label: 'Protokol Obat Kemoterapi',
- groups: ['chemotherapy'],
- component: MedicineProtocolList,
- props: { data: protocolRows, paginationMeta },
- },
- { value: 'report', label: 'Laporan Tindakan', groups: ['chemotherapy'] },
- { value: 'patient-note', label: 'CPRJ', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- {
- value: 'education-assessment',
- label: 'Asesmen Kebutuhan Edukasi',
- groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
- },
- { value: 'consent', label: 'General Consent', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'patient-note', label: 'CPRJ', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- {
- value: 'prescription',
- label: 'Order Obat',
- groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
- component: PrescriptionList,
- },
- { value: 'device', label: 'Order Alkes', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'mcu-radiology', label: 'Order Radiologi', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'mcu-lab-pc', label: 'Order Lab PK', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'mcu-lab-micro', label: 'Order Lab Mikro', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'mcu-lab-pa', label: 'Order Lab PA', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'medical-action', label: 'Order Ruang Tindakan', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'mcu-result', label: 'Hasil Penunjang', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- {
- value: 'consultation',
- label: 'Konsultasi',
- groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
- component: Consultation,
- props: { encounter: data },
- },
- { value: 'resume', label: 'Resume', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'control', label: 'Surat Kontrol', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'screening', label: 'Skrinning MPP', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
- { value: 'supporting-document', label: 'Upload Dokumen Pendukung', groups: ['ambulatory', 'rehabilitation'] },
- { value: 'price-list', label: 'Tarif Tindakan', groups: ['ambulatory', 'rehabilitation', 'chemotherapy'] },
-]
-
-const tabs = computed(() => {
- return tabsRaws
- .filter((tab: TabItem) => tab.groups ? tab.groups.some((group: string) => props.classes?.includes(group)) : true)
- .map((tab: TabItem) => {
- return { ...tab, props: { ...tab.props, encounter: data } }
- })
-})
-
-
-
-
-
diff --git a/app/components/content/encounter/list.vue b/app/components/content/encounter/list.vue
index 655a553d..b80b3f16 100644
--- a/app/components/content/encounter/list.vue
+++ b/app/components/content/encounter/list.vue
@@ -1,31 +1,59 @@
-
-
+
+ (isFilterFormDialogOpen = true)"
+ @onExportPdf="() => {}"
+ @onExportExcel="() => {}"
+ @nExportCsv="() => {}"
+ />
+
-
-
-
+
-
+
+
+
+
+ Nama:
+ {{ record.patient.person.name }}
+
+
+ No RM:
+ {{ record.medical_record_number }}
+
+
+
+
+
+
+
@@ -258,4 +449,22 @@ onMounted(() => {
+
+
+
diff --git a/app/components/content/encounter/process-bu.vue b/app/components/content/encounter/process-bu.vue
new file mode 100644
index 00000000..8285d5e6
--- /dev/null
+++ b/app/components/content/encounter/process-bu.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
diff --git a/app/components/content/encounter/process.vue b/app/components/content/encounter/process.vue
index 02fc7495..044b44dc 100644
--- a/app/components/content/encounter/process.vue
+++ b/app/components/content/encounter/process.vue
@@ -1,15 +1,22 @@
-
diff --git a/app/components/content/encounter/status.vue b/app/components/content/encounter/status.vue
index 513a7ab5..067bef46 100644
--- a/app/components/content/encounter/status.vue
+++ b/app/components/content/encounter/status.vue
@@ -5,6 +5,7 @@ import { getValueLabelList as getEmployeeValueLabelList } from '~/services/emplo
import { getValueLabelList as getUnitValueLabelList } from '~/services/unit.service'
import type { CheckInFormData, CheckOutFormData } from '~/schemas/encounter.schema'
import { CheckInSchema, CheckOutSchema } from '~/schemas/encounter.schema'
+import { getEncounterData } from '~/handlers/encounter-process.handler'
//
import Dialog from '~/components/pub/my-ui/modal/dialog.vue'
@@ -14,16 +15,33 @@ import CheckOutView from '~/components/app/encounter/check-out-view.vue'
import CheckOutEntry from '~/components/app/encounter/check-out-entry.vue'
import type { Encounter } from '~/models/encounter'
import { checkIn } from '~/services/encounter.service'
+import { getServicePosition } from '~/lib/roles'
+import type { Item } from '~/components/pub/my-ui/combobox'
//
const props = defineProps<{
encounter: Encounter
+ canUpdate?: boolean
}>()
+//
+const { user } = useUserStore()
+const servicePosition = user.user_contractPosition_code == 'emp' ? getServicePosition('emp|'+user.employee_position_code) : null
+// const subClassCode = servicePosition == 'chemo' ? 'chemo' : null
+
// doctors
-const doctors = await getDoctorValueLabelList({'includes': 'employee,employee-person'})
+const localEncounter = ref
(props.encounter)
+const doctors = ref- ([])
const employees = await getEmployeeValueLabelList({'includes': 'person', 'position-code': 'reg'})
const units = await getUnitValueLabelList()
+const canUpdate = ref(true)
+
+if (props.encounter.status_code == 'done') {
+ canUpdate.value = false
+}
+if (canUpdate.value) {
+ doctors.value = await getDoctorValueLabelList({'includes': 'employee,employee-person', 'unit-code': user.unit_code}, true)
+}
// check in
const checkInValues = ref({
@@ -32,7 +50,7 @@ const checkInValues = ref({
// registeredAt: '',
})
const checkInIsLoading = ref(false)
-const checkInIsReadonly = ref(false)
+const checkInIsReadonly = ref(props.canUpdate )
const checkInDialogOpen = ref(false)
// check out
@@ -49,8 +67,15 @@ function editCheckIn() {
checkInDialogOpen.value = true
}
-function submitCheckIn(values: CheckInFormData) {
- checkIn(props.encounter.id, values)
+async function submitCheckIn(values: CheckInFormData) {
+ const res = await checkIn(props.encounter.id, values)
+ if (res.success) {
+ checkInDialogOpen.value = false
+ const resEnc = await getEncounterData(props.encounter.id)
+ if (resEnc.success) {
+ localEncounter.value = resEnc.body.data
+ }
+ }
}
function editCheckOut() {
@@ -67,9 +92,8 @@ function submitCheckOut(values: CheckOutFormData) {
@@ -77,15 +101,15 @@ function submitCheckOut(values: CheckOutFormData) {
Informasi Keluar
-
\ No newline at end of file
+
diff --git a/app/components/content/general-consent/form.vue b/app/components/content/general-consent/form.vue
index 738adca1..c46e81cf 100644
--- a/app/components/content/general-consent/form.vue
+++ b/app/components/content/general-consent/form.vue
@@ -117,7 +117,6 @@ async function actionHandler(type: string) {
})
}
- console.log('data', result)
const resp = await handleActionSave(
{
...payload.value,
diff --git a/app/components/content/initial-nursing/entry.vue b/app/components/content/initial-nursing/entry.vue
new file mode 100644
index 00000000..5769e967
--- /dev/null
+++ b/app/components/content/initial-nursing/entry.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/content/initial-nursing/form.vue b/app/components/content/initial-nursing/form.vue
new file mode 100644
index 00000000..006b1dc0
--- /dev/null
+++ b/app/components/content/initial-nursing/form.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/initial-nursing/list.vue b/app/components/content/initial-nursing/list.vue
new file mode 100644
index 00000000..0c867b96
--- /dev/null
+++ b/app/components/content/initial-nursing/list.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+ C. Daftar Masalah Keperawatan
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.name }}
+
+
+ Kode:
+ {{ record.code }}
+
+
+
+
+
diff --git a/app/components/content/item-price/list.vue b/app/components/content/item-price/list.vue
index aa277b71..e71e4cf2 100644
--- a/app/components/content/item-price/list.vue
+++ b/app/components/content/item-price/list.vue
@@ -1,70 +1,198 @@
-
+
-
+
-
-
-
+ {
+ onResetState()
+ isFormEntryDialogOpen = value
+ }
+ "
+ >
+ , resetForm: () => void) => {
+ if (recId > 0) {
+ handleActionEdit(recId, values, getItemList, resetForm, toast)
+ return
+ }
+ handleActionSave(values, getItemList, resetForm, toast)
+ }
+ "
+ @cancel="handleCancelForm"
+ />
+
+
+ handleActionRemove(recId, getItemList, toast)"
+ @cancel=""
+ >
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.name }}
+
+
+ Kode:
+ {{ record.code }}
+
+
+
+
diff --git a/app/components/content/item/list.vue b/app/components/content/item/list.vue
index 15887985..727d5200 100644
--- a/app/components/content/item/list.vue
+++ b/app/components/content/item/list.vue
@@ -1,70 +1,208 @@
-
+
-
+
-
-
-
+ {
+ onResetState()
+ isFormEntryDialogOpen = value
+ }
+ "
+ >
+ , resetForm: () => void) => {
+ if (recId > 0) {
+ handleActionEdit(recItem?.code ? recItem.code : recId, values, () => {
+ getItemList()
+ onResetState()
+ }, resetForm, toast)
+ return
+ }
+ handleActionSave(values, getItemList, resetForm, toast)
+ }
+ "
+ @cancel="handleCancelForm"
+ />
+
+
+ handleActionRemove(recItem?.code ? recItem.code : recId, getItemList, toast)"
+ @cancel=""
+ >
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.name }}
+
+
+ Kode:
+ {{ record.code }}
+
+
+
+
diff --git a/app/components/content/kfr/entry.vue b/app/components/content/kfr/entry.vue
new file mode 100644
index 00000000..142b5fe4
--- /dev/null
+++ b/app/components/content/kfr/entry.vue
@@ -0,0 +1,145 @@
+
+
+
+
+ Formulir Rawat Jalan KFR
+
+
+
+
+
+
+
diff --git a/app/components/content/kfr/list.vue b/app/components/content/kfr/list.vue
new file mode 100644
index 00000000..a8aafdac
--- /dev/null
+++ b/app/components/content/kfr/list.vue
@@ -0,0 +1,368 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.firstName }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/content/kfr/main.vue b/app/components/content/kfr/main.vue
new file mode 100644
index 00000000..22be2bca
--- /dev/null
+++ b/app/components/content/kfr/main.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/content/mcu-order/entry.vue b/app/components/content/mcu-order/entry.vue
new file mode 100644
index 00000000..0de46970
--- /dev/null
+++ b/app/components/content/mcu-order/entry.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+ Daftar Item
+
+
+
+
+
+
+
+
+
+
+
+ pickerDialogOpen = false" class="justify-center" />
+
+
diff --git a/app/components/content/mcu-order/list.vue b/app/components/content/mcu-order/list.vue
new file mode 100644
index 00000000..6fcff867
--- /dev/null
+++ b/app/components/content/mcu-order/list.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
+
+ handleActionSubmit(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
+
diff --git a/app/components/content/mcu-order/main.vue b/app/components/content/mcu-order/main.vue
new file mode 100644
index 00000000..033d093f
--- /dev/null
+++ b/app/components/content/mcu-order/main.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/components/content/micro-lab-order/entry.vue b/app/components/content/micro-lab-order/entry.vue
new file mode 100644
index 00000000..e6ef9600
--- /dev/null
+++ b/app/components/content/micro-lab-order/entry.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/app/components/content/micro-lab-order/list.vue b/app/components/content/micro-lab-order/list.vue
new file mode 100644
index 00000000..c2bda748
--- /dev/null
+++ b/app/components/content/micro-lab-order/list.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/app/components/content/micro-lab-order/main.vue b/app/components/content/micro-lab-order/main.vue
new file mode 100644
index 00000000..033d093f
--- /dev/null
+++ b/app/components/content/micro-lab-order/main.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/components/content/patient/add.vue b/app/components/content/patient/add.vue
deleted file mode 100644
index fd42e0a6..00000000
--- a/app/components/content/patient/add.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
- Tambah Pasien
-
-
-
diff --git a/app/components/content/patient/detail.vue b/app/components/content/patient/detail.vue
index da9b2809..ffe315a9 100644
--- a/app/components/content/patient/detail.vue
+++ b/app/components/content/patient/detail.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/app/components/content/patient/entry.vue b/app/components/content/patient/entry.vue
deleted file mode 100644
index 2eed6df5..00000000
--- a/app/components/content/patient/entry.vue
+++ /dev/null
@@ -1,309 +0,0 @@
-
-
-
- Tambah Pasien
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/components/content/patient/form.vue b/app/components/content/patient/form.vue
new file mode 100644
index 00000000..62d85880
--- /dev/null
+++ b/app/components/content/patient/form.vue
@@ -0,0 +1,490 @@
+
+
+
+
+ {{ mode === 'edit' ? 'Edit Pasien' : 'Tambah Pasien' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/patient/list.vue b/app/components/content/patient/list.vue
index 519aeb8e..d8a6a27f 100644
--- a/app/components/content/patient/list.vue
+++ b/app/components/content/patient/list.vue
@@ -6,7 +6,7 @@ import { Calendar, Hospital, UserCheck, UsersRound } from 'lucide-vue-next'
import RecordConfirmation from '~/components/pub/my-ui/confirmation/record-confirmation.vue'
import { ActionEvents } from '~/components/pub/my-ui/data/types'
-import Header from '~/components/pub/my-ui/nav-header/prep.vue'
+import Header from '~/components/pub/my-ui/nav-header/header.vue'
import SummaryCard from '~/components/pub/my-ui/summary-card/summary-card.vue'
import { usePaginatedList } from '~/composables/usePaginatedList'
@@ -46,6 +46,7 @@ const headerPrep: HeaderPrep = {
label: 'Tambah',
onClick: () => navigateTo('/client/patient/add'),
},
+ refSearchNav: refSearchNav,
}
// Disable dulu, ayahab kalo diminta
@@ -137,18 +138,22 @@ provide('table_data_loader', isLoading)
// #endregion
// #region Watchers
-watch([recId, recAction], () => {
- switch (recAction.value) {
+watch([recId, recAction], ([newId, newAction]) => {
+ switch (newAction) {
case ActionEvents.showDetail:
navigateTo({
name: 'client-patient-id',
- params: { id: recId.value },
+ params: { id: newId },
})
break
case ActionEvents.showEdit:
- // TODO: Handle edit action
- // isFormEntryDialogOpen.value = true
+ navigateTo({
+ name: 'client-patient-id-edit',
+ params: {
+ id: newId,
+ },
+ })
break
case ActionEvents.showConfirmDelete:
diff --git a/app/components/content/prb/bpjs-list.vue b/app/components/content/prb/bpjs-list.vue
new file mode 100644
index 00000000..8ce0d050
--- /dev/null
+++ b/app/components/content/prb/bpjs-list.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.firstName }}
+
+
+ Kode:
+ {{ record.cellphone }}
+
+
+
+
+
+
diff --git a/app/components/content/prb/detail.vue b/app/components/content/prb/detail.vue
new file mode 100644
index 00000000..43b09fa6
--- /dev/null
+++ b/app/components/content/prb/detail.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
diff --git a/app/components/content/prb/entry.vue b/app/components/content/prb/entry.vue
new file mode 100644
index 00000000..a6612411
--- /dev/null
+++ b/app/components/content/prb/entry.vue
@@ -0,0 +1,148 @@
+
+
+
+ Update Program Rujuk Balik
+
+
+
+
+
+
+
+
diff --git a/app/components/content/prb/list.vue b/app/components/content/prb/list.vue
new file mode 100644
index 00000000..02acba94
--- /dev/null
+++ b/app/components/content/prb/list.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
Obat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.firstName }}
+
+
+ Kode:
+ {{ record.cellphone }}
+
+
+
+
+
+
diff --git a/app/components/content/prb/main.vue b/app/components/content/prb/main.vue
new file mode 100644
index 00000000..29993fbd
--- /dev/null
+++ b/app/components/content/prb/main.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/procedure-room-order/entry.vue b/app/components/content/procedure-room-order/entry.vue
new file mode 100644
index 00000000..ad780e5b
--- /dev/null
+++ b/app/components/content/procedure-room-order/entry.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ pickerDialogOpen = false" class="justify-center" />
+
+
diff --git a/app/components/content/procedure-room-order/list.vue b/app/components/content/procedure-room-order/list.vue
new file mode 100644
index 00000000..d742941c
--- /dev/null
+++ b/app/components/content/procedure-room-order/list.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
Tanggal
+
:
+
{{ recItem.createdAt?.substring(0, 10) }}
+
+
+
DPJP
+
:
+
{{ recItem.doctor?.employee?.person?.name }}
+
+
+
+ handleActionSubmit(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
Tanggal
+
:
+
{{ recItem.createdAt.substring(0, 10) }}
+
+
+
DPJP
+
:
+
{{ recItem.doctor?.employee?.person?.name }}
+
+
+
diff --git a/app/components/content/procedure-room-order/main.vue b/app/components/content/procedure-room-order/main.vue
new file mode 100644
index 00000000..61250fe1
--- /dev/null
+++ b/app/components/content/procedure-room-order/main.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+ {{ crudQueryParams.mode }}
+
diff --git a/app/components/content/radiology-order/entry.vue b/app/components/content/radiology-order/entry.vue
index 4d0aa002..795f85f8 100644
--- a/app/components/content/radiology-order/entry.vue
+++ b/app/components/content/radiology-order/entry.vue
@@ -132,9 +132,20 @@ async function getItems() {
+
+
+
+
+
Catatan Pemeriksaan DSA
+
+
+
diff --git a/app/components/content/radiology-order/list.vue b/app/components/content/radiology-order/list.vue
index b2c8571d..47c822e9 100644
--- a/app/components/content/radiology-order/list.vue
+++ b/app/components/content/radiology-order/list.vue
@@ -13,7 +13,6 @@ import {
recAction,
recItem,
isReadonly,
- isFormEntryDialogOpen,
isRecordConfirmationOpen,
handleActionSave,
handleActionRemove,
@@ -28,6 +27,7 @@ const route = useRoute()
const { setQueryParams } = useQueryParam()
const title = ref('')
+const addTrigger = ref(false)
const plainEid = route.params.id
const encounter_id = (plainEid && typeof plainEid == 'string') ? parseInt(plainEid) : 0 // here the
@@ -74,7 +74,7 @@ const headerPrep: HeaderPrep = {
onClick: () => {
recItem.value = null
recId.value = 0
- isFormEntryDialogOpen.value = true
+ addTrigger.value = true
isReadonly.value = false
},
},
@@ -90,7 +90,7 @@ const getMyDetail = async (id: number | string) => {
if (result.success) {
const currentValue = result.body?.data || {}
recItem.value = currentValue
- isFormEntryDialogOpen.value = true
+ addTrigger.value = true
}
}
@@ -113,10 +113,10 @@ watch([recId, recAction], () => {
}
})
-watch([isFormEntryDialogOpen], async () => {
- if (isFormEntryDialogOpen.value) {
- isFormEntryDialogOpen.value = false;
- const saveResp = await handleActionSave({ encounter_id }, getMyList, () =>{}, toast)
+watch([addTrigger], async () => {
+ if (addTrigger.value) {
+ addTrigger.value = false;
+ const saveResp = await handleActionSave({ encounter_id, "scope_code": "rad" }, getMyList, () =>{}, toast)
if (saveResp.success) {
setQueryParams({
'mode': 'entry',
diff --git a/app/components/content/resume/add.vue b/app/components/content/resume/add.vue
index 6fda4bf8..a3dba4b6 100644
--- a/app/components/content/resume/add.vue
+++ b/app/components/content/resume/add.vue
@@ -13,9 +13,13 @@ import FarmacyHistoryDialog from '~/components/app/resume/history-list/farmacy-h
import NationalProgramHistoryDialog from '~/components/app/resume/history-list/national-program-history-dialog.vue';
// #region Props & Emits
-const props = defineProps<{
+const props = withDefaults(defineProps<{
+ encounter_id: number
callbackUrl?: string
-}>()
+ record_id: number
+}>(), {
+
+})
// form related state
const personPatientForm = ref | null>(null)
diff --git a/app/components/content/resume/list.vue b/app/components/content/resume/list.vue
index 4b5b5001..70bde415 100644
--- a/app/components/content/resume/list.vue
+++ b/app/components/content/resume/list.vue
@@ -19,18 +19,27 @@ import Confirmation from '~/components/pub/my-ui/confirmation/confirmation.vue'
import type { ExposedForm } from '~/types/form'
import { VerificationSchema } from '~/schemas/verification.schema'
import DocPreviewDialog from '~/components/pub/my-ui/modal/doc-preview-dialog.vue'
-import type { PagePermission } from '~/models/role'
+import type { RoleAccesses } from '~/models/role'
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
import { unauthorizedToast } from '~/lib/utils'
+import { permissions } from '~/const/page-permission/ambulatory'
// #endregion
// #region Permission
-const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
+const roleAccess: RoleAccesses = permissions['/ambulatory/encounter'] || {}
const { getPagePermissions } = useRBAC()
const pagePermission = getPagePermissions(roleAccess)
+// #endregion
// #region State
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ redirectToForm?: (myRecord_id?: any) => void
+}>(), {
+ redirectToForm: () => { }
+})
+
const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSearch, fetchData } = usePaginatedList({
fetchFn: (params) => getPatients({ ...params, includes: ['person', 'person-Addresses'] }),
entityName: 'patient',
@@ -67,7 +76,9 @@ const headerPrep: HeaderPrep = {
if (pagePermission.canCreate) {
headerPrep.addNav = {
label: "Resume",
- onClick: () => navigateTo('/resume/add'),
+ onClick: () => {
+ props.redirectToForm()
+ },
}
}
// #endregion
@@ -158,6 +169,7 @@ provide('table_data_loader', isLoading)
watch([recId, recAction], () => {
switch (recAction.value) {
case ActionEvents.showVerify:
+ isVerifyDialogOpen.value = true
if(pagePermission.canUpdate) {
isVerifyDialogOpen.value = true
} else {
@@ -165,6 +177,7 @@ watch([recId, recAction], () => {
}
break
case ActionEvents.showValidate:
+ isRecordConfirmationOpen.value = true
if(pagePermission.canUpdate) {
isRecordConfirmationOpen.value = true
} else {
diff --git a/app/components/content/resume/main.vue b/app/components/content/resume/main.vue
new file mode 100644
index 00000000..44700587
--- /dev/null
+++ b/app/components/content/resume/main.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/content/sep/entry.vue b/app/components/content/sep/entry.vue
index 3a916c4d..d1d6599a 100644
--- a/app/components/content/sep/entry.vue
+++ b/app/components/content/sep/entry.vue
@@ -1,486 +1,73 @@
@@ -490,12 +77,13 @@ onMounted(async () => {
name="i-lucide-panel-bottom"
class="me-2"
/>
- Tambah
- SEP
+ {{ ['detail', 'link'].includes(props.mode) ? 'Detail' : 'Tambah' }} SEP
// Components
-import type { DataTableLoader } from '~/components/pub/my-ui/data-table/type'
-import type { HeaderPrep, RefSearchNav } from '~/components/pub/my-ui/data/types'
-import type { PaginationMeta } from '~/components/pub/my-ui/pagination/pagination.type'
import Header from '~/components/pub/my-ui/nav-header/prep.vue'
import {
DropdownMenu,
@@ -11,156 +8,95 @@ import {
DropdownMenuItem,
} from '~/components/pub/ui/dropdown-menu'
import AppSepList from '~/components/app/sep/list.vue'
+import RangeCalendar from '~/components/pub/ui/range-calendar/RangeCalendar.vue'
// Icons
import { X, Check } from 'lucide-vue-next'
-// Types
-import type { VclaimSepData } from '~/models/vclaim'
+// Handlers
+import { useIntegrationSepList } from '~/handlers/integration-sep-list.handler'
-// Services
-import { getList as geMonitoringVisitList } from '~/services/vclaim-monitoring-visit.service'
+// Helpers
+import { refDebounced } from '@vueuse/core'
-const search = ref('')
-const dateRange = ref('12 Agustus 2025 - 31 Agustus 2025')
-const open = ref(false)
+// use handler to provide state and functions
+const {
+ recId,
+ recAction,
+ recItem,
+ data,
+ dateSelection,
+ dateRange,
+ serviceType,
+ serviceTypesList,
+ search,
+ open,
+ sepData,
+ headerPrep,
+ paginationMeta,
+ isLoading,
+ getSepList,
+ setServiceTypes,
+ setDateRange,
+ handleExportCsv,
+ handleExportExcel,
+ handleRowSelected,
+ handlePageChange,
+ handleRemove,
+} = useIntegrationSepList()
-const sepData = {
- no_sep: 'SP23311224',
- kartu: '001234',
- nama: 'Kenzie',
-}
-
-const paginationMeta = reactive({
- recordCount: 0,
- page: 1,
- pageSize: 10,
- totalPage: 5,
- hasNext: false,
- hasPrev: false,
-})
-
-function handlePageChange(page: number) {
- console.log('pageChange', page)
-}
-
-const data = ref([])
-
-const refSearchNav: RefSearchNav = {
- onClick: () => {
- // open filter modal
- },
- onInput: (_val: string) => {
- // filter patient list
- },
- onClear: () => {
- // clear url param
- },
-}
-
-const isLoading = reactive({
- isTableLoading: false,
-})
-
-const recId = ref(0)
-const recAction = ref('')
-const recItem = ref(null)
-
-const headerPrep: HeaderPrep = {
- title: 'Daftar SEP Prosedur',
- icon: 'i-lucide-panel-bottom',
- addNav: {
- label: 'Tambah',
- onClick: () => {
- navigateTo('/integration/bpjs/sep/add')
- },
- },
-}
-
-async function getMonitoringVisitMappers() {
- isLoading.dataListLoading = true
- data.value = []
-
- const dateFirst = new Date()
- const result = await geMonitoringVisitList({
- date: dateFirst.toISOString().substring(0, 10),
- serviceType: 1,
- })
-
- if (result && result.success && result.body) {
- const visitsRaw = result.body?.response?.sep || []
-
- if (!visitsRaw) {
- isLoading.dataListLoading = false
- return
- }
-
- visitsRaw.forEach((result: any) => {
- // Format pelayanan: "R.Inap" -> "Rawat Inap", "1" -> "Rawat Jalan", dll
- let serviceType = result.jnsPelayanan || '-'
- if (serviceType === 'R.Inap') {
- serviceType = 'Rawat Inap'
- } else if (serviceType === '1' || serviceType === 'R.Jalan') {
- serviceType = 'Rawat Jalan'
- }
-
- data.value.push({
- letterDate: result.tglSep || '-',
- letterNumber: result.noSep || '-',
- serviceType: serviceType,
- flow: '-',
- medicalRecordNumber: '-',
- patientName: result.nama || '-',
- cardNumber: result.noKartu || '-',
- controlLetterNumber: result.noRujukan || '-',
- controlLetterDate: result.tglPlgSep || '-',
- clinicDestination: result.poli || '-',
- attendingDoctor: '-',
- diagnosis: result.diagnosa || '-',
- careClass: result.kelasRawat || '-',
- })
- })
- }
-
- isLoading.dataListLoading = false
-}
-
-async function getSepList() {
- await getMonitoringVisitMappers()
-}
-
-function exportCsv() {
- console.log('Ekspor CSV dipilih')
- // tambahkan logic untuk generate CSV
-}
-
-function exportExcel() {
- console.log('Ekspor Excel dipilih')
- // tambahkan logic untuk generate Excel
-}
-
-function handleDelete() {
- console.log('Data dihapus:', sepData)
- open.value = false
-}
-
-watch(
- () => recAction.value,
- () => {
- if (recAction.value === 'showConfirmDel') {
- open.value = true
- }
- },
-)
-
-onMounted(() => {
- getSepList()
-})
+const dataFiltered = ref([])
+const debouncedSearch = refDebounced(search, 500)
+// expose provides so component can also use provide/inject if needed
provide('rec_id', recId)
provide('rec_action', recAction)
provide('rec_item', recItem)
provide('table_data_loader', isLoading)
+
+watch([recId, recAction], () => {
+ if (recAction.value === 'showConfirmDel') {
+ open.value = true
+ }
+ if (recAction.value === 'showDetail') {
+ navigateTo(`/integration/bpjs-vclaim/sep/${recItem.value?.letterNumber}/detail`)
+ }
+})
+
+watch(debouncedSearch, (newValue) => {
+ if (newValue && newValue !== '-' && newValue.length >= 3) {
+ dataFiltered.value = data.value.filter(
+ (item: any) =>
+ item.patientName.toLowerCase().includes(newValue.toLowerCase()) ||
+ item.letterNumber.toLowerCase().includes(newValue.toLowerCase()) ||
+ item.cardNumber.toLowerCase().includes(newValue.toLowerCase()),
+ )
+ }
+})
+
+watch(
+ () => dateSelection.value,
+ async (val) => {
+ if (!val) return
+ setDateRange()
+ await getSepList()
+ dataFiltered.value = [...data.value]
+ },
+ { deep: true },
+)
+
+watch(
+ () => serviceType.value,
+ () => {
+ getSepList()
+ },
+)
+
+onMounted(async () => {
+ setServiceTypes()
+ await getSepList()
+ dataFiltered.value = [...data.value]
+})
@@ -175,6 +111,17 @@ provide('table_data_loader', isLoading)
class="w-72"
/>
+
+
+
+
+
@@ -190,7 +137,7 @@ provide('table_data_loader', isLoading)
-
+
@@ -209,8 +156,8 @@ provide('table_data_loader', isLoading)
- Ekspor CSV
- Ekspor Excel
+ Ekspor CSV
+ Ekspor Excel
@@ -218,7 +165,8 @@ provide('table_data_loader', isLoading)
@@ -235,25 +183,36 @@ provide('table_data_loader', isLoading)
-
Hapus SEP
-
Apakah anda yakin ingin menghapus SEP dengan data:
-
-
No. SEP : {{ sepData.no_sep }}
-
No. Kartu BPJS : {{ sepData.kartu }}
-
Nama Pasien : {{ sepData.nama }}
+
+ No. SEP:
+ {{ sepData.sepNumber }}
+
+
+ No. Kartu BPJS:
+ {{ sepData.cardNumber }}
+
+
+ Nama Pasien:
+ {{ sepData.patientName }}
+
-
{
+ recId = 0
+ recAction = ''
+ open = false
+ }
+ "
>
Tidak
@@ -261,7 +220,7 @@ provide('table_data_loader', isLoading)
Ya
diff --git a/app/components/content/soapi/entry.vue b/app/components/content/soapi/entry.vue
index d4e960f3..0bd4f3d1 100644
--- a/app/components/content/soapi/entry.vue
+++ b/app/components/content/soapi/entry.vue
@@ -7,9 +7,17 @@ import SoapiList from './list.vue'
import EarlyForm from './form.vue'
import RehabForm from './form-rehab.vue'
import FunctionForm from './form-function.vue'
+import type { Encounter } from '~/models/encounter'
+
+interface Props {
+ encounter: Encounter
+ label: string
+ canUpdate?: boolean
+}
+const props = defineProps()
const route = useRoute()
-const type = computed(() => (route.query.tab as string) || 'early-medical-assessment')
+const type = computed(() => (route.query.menu as string) || 'early-medical-assessment')
const { mode, goToEntry, backToList } = useQueryCRUDMode('mode')
@@ -23,8 +31,9 @@ const ActiveForm = computed(() => formMap[type.value] || EarlyForm)
+
-
+
({
isTableLoading: false,
@@ -89,9 +92,23 @@ async function getProcedures() {
isLoading.isTableLoading = false
}
+async function getDetail() {
+ isLoading.isTableLoading = true
+ const resp = await xfetch(`/api/v1/soapi/${recordId.value}`)
+ if (resp.success) {
+ const raw = (resp.body as Record).data
+ const values = JSON.parse(raw.value)
+ console.log('values', values)
+ model.value = values
+ formKey.value++ // Force re-render with new data
+ }
+ isLoading.isTableLoading = false
+}
+
onMounted(() => {
getProcedures()
getDiagnoses()
+ getDetail()
})
function handleOpen(type: string) {
@@ -146,6 +163,7 @@ provide('icdPreview', icdPreview)
({
isTableLoading: false,
})
+const formKey = ref(0)
-async function getDiagnoses() {
+async function getDetail() {
isLoading.isTableLoading = true
- const resp = await xfetch(`/api/v1/soapi/${recordId}`)
+ const resp = await xfetch(`/api/v1/soapi/${recordId.value}`)
if (resp.success) {
- diagnoses.value = (resp.body as Record).data
+ const raw = (resp.body as Record).data
+ const values = JSON.parse(raw.value)
+ console.log('values', values)
+ model.value = values
+ formKey.value++ // Force re-render with new data
+ }
+ isLoading.isTableLoading = false
+}
+
+async function getDiagnose() {
+ isLoading.isTableLoading = true
+ const resp = await xfetch('/api/v1/diagnose-src')
+ if (resp.success) {
+ procedures.value = (resp.body as Record).data
}
isLoading.isTableLoading = false
}
@@ -64,8 +78,7 @@ async function getProcedures() {
}
onMounted(() => {
- getProcedures()
- getDiagnoses()
+ getDetail()
})
function handleOpen(type: string) {
@@ -125,6 +138,7 @@ provide('icdPreview', icdPreview)
()
const emits = defineEmits(['add', 'edit'])
@@ -58,20 +59,22 @@ const typeCode = ref('')
const hreaderPrep: HeaderPrep = {
title: props.label,
icon: 'i-lucide-users',
- addNav: {
+}
+if(props.canUpdate) {
+ hreaderPrep['addNav'] = {
label: 'Tambah',
onClick: () => goToEntry(),
- },
+ }
}
-const type = computed(() => (route.query.tab as string) || 'early-medical-assessment')
+const type = computed(() => (route.query.menu as string) || 'early-medical-assessment')
onMounted(async () => {
await getMyList()
})
async function getMyList() {
- const url = `/api/v1/soapi?typeCode=${typeCode.value}&includes=encounter,employee&encounter-id=${route.params.id}`
+ const url = `/api/v1/soapi?type-code=${typeCode.value}&includes=encounter,employee&encounter-id=${route.params.id}`
const resp = await xfetch(url)
if (resp.success) {
data.value = (resp.body as Record).data
@@ -169,6 +172,8 @@ provide('table_data_loader', isLoading)
+
+import { computed } from 'vue'
+import { useRoute } from 'vue-router'
+import { useQueryMode } from '@/composables/useQueryMode'
+
+import List from './list.vue'
+import Form from './form.vue'
+
+// Models
+import type { Encounter } from '~/models/encounter'
+
+// Props
+interface Props {
+ encounter: Encounter
+}
+
+const props = defineProps()
+const route = useRoute()
+
+const { mode, goToEntry, backToList } = useQueryCRUDMode('mode')
+
+
+
+
+
+
+
+
diff --git a/app/components/content/summary-medic/form.vue b/app/components/content/summary-medic/form.vue
new file mode 100644
index 00000000..998270d9
--- /dev/null
+++ b/app/components/content/summary-medic/form.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/content/summary-medic/list.vue b/app/components/content/summary-medic/list.vue
new file mode 100644
index 00000000..5d7d3117
--- /dev/null
+++ b/app/components/content/summary-medic/list.vue
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.name }}
+
+
+ Kode:
+ {{ record.code }}
+
+
+
+
+
diff --git a/app/components/content/surgery-report/detail.vue b/app/components/content/surgery-report/detail.vue
new file mode 100644
index 00000000..5fc7f2d6
--- /dev/null
+++ b/app/components/content/surgery-report/detail.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
diff --git a/app/components/content/surgery-report/entry.vue b/app/components/content/surgery-report/entry.vue
new file mode 100644
index 00000000..04544b53
--- /dev/null
+++ b/app/components/content/surgery-report/entry.vue
@@ -0,0 +1,151 @@
+
+
+
+ Update Laporan Operasi
+ {{ selectedOperativeAction }}
+
+
+
+
+
+
+
+
diff --git a/app/components/content/surgery-report/list.vue b/app/components/content/surgery-report/list.vue
new file mode 100644
index 00000000..bb3a6728
--- /dev/null
+++ b/app/components/content/surgery-report/list.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.firstName }}
+
+
+ Kode:
+ {{ record.cellphone }}
+
+
+
+
+
+
diff --git a/app/components/content/surgery-report/main.vue b/app/components/content/surgery-report/main.vue
new file mode 100644
index 00000000..29993fbd
--- /dev/null
+++ b/app/components/content/surgery-report/main.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/therapy-protocol/add.vue b/app/components/content/therapy-protocol/add.vue
new file mode 100644
index 00000000..bb184e23
--- /dev/null
+++ b/app/components/content/therapy-protocol/add.vue
@@ -0,0 +1,152 @@
+
+
+
+ Tambah
+
+
+
+
+
+
diff --git a/app/components/content/therapy-protocol/detail.vue b/app/components/content/therapy-protocol/detail.vue
new file mode 100644
index 00000000..e40a8044
--- /dev/null
+++ b/app/components/content/therapy-protocol/detail.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
diff --git a/app/components/content/therapy-protocol/edit.vue b/app/components/content/therapy-protocol/edit.vue
new file mode 100644
index 00000000..99dd569e
--- /dev/null
+++ b/app/components/content/therapy-protocol/edit.vue
@@ -0,0 +1,123 @@
+
+
+
+ Edit
+
+
+
+
+
+
diff --git a/app/components/content/therapy-protocol/history-list.vue b/app/components/content/therapy-protocol/history-list.vue
new file mode 100644
index 00000000..c04e7143
--- /dev/null
+++ b/app/components/content/therapy-protocol/history-list.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+ {{ df.format(dateValue.start.toDate(getLocalTimeZone())) }} -
+ {{ df.format(dateValue.end.toDate(getLocalTimeZone())) }}
+
+
+
+ {{ df.format(dateValue.start.toDate(getLocalTimeZone())) }}
+
+
+ Pick a date
+
+
+
+ (dateValue.start = startDate)" />
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/content/therapy-protocol/list.vue b/app/components/content/therapy-protocol/list.vue
new file mode 100644
index 00000000..670f09ec
--- /dev/null
+++ b/app/components/content/therapy-protocol/list.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ df.format(dateValue.start.toDate(getLocalTimeZone())) }} -
+ {{ df.format(dateValue.end.toDate(getLocalTimeZone())) }}
+
+
+
+ {{ df.format(dateValue.start.toDate(getLocalTimeZone())) }}
+
+
+ Pick a date
+
+
+
+ (dateValue.start = startDate)" />
+
+
+
+
+
+
+ History
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/content/vaccine-data/detail.vue b/app/components/content/vaccine-data/detail.vue
new file mode 100644
index 00000000..9377c374
--- /dev/null
+++ b/app/components/content/vaccine-data/detail.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
diff --git a/app/components/content/vaccine-data/entry.vue b/app/components/content/vaccine-data/entry.vue
new file mode 100644
index 00000000..d8afd94b
--- /dev/null
+++ b/app/components/content/vaccine-data/entry.vue
@@ -0,0 +1,144 @@
+
+
+
+ Update Data Vaksin
+
+
+
+
+
+
+
+
diff --git a/app/components/content/vaccine-data/list.vue b/app/components/content/vaccine-data/list.vue
new file mode 100644
index 00000000..d9520c98
--- /dev/null
+++ b/app/components/content/vaccine-data/list.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.name }}
+
+
+
+
+
+
diff --git a/app/components/content/vaccine-data/main.vue b/app/components/content/vaccine-data/main.vue
new file mode 100644
index 00000000..29993fbd
--- /dev/null
+++ b/app/components/content/vaccine-data/main.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/layout/AppSidebar.vue b/app/components/layout/AppSidebar.vue
index a14b2137..2ee07219 100644
--- a/app/components/layout/AppSidebar.vue
+++ b/app/components/layout/AppSidebar.vue
@@ -48,9 +48,18 @@ async function setMenu() {
const activeRoleParts = activeRole ? activeRole.split('|') : []
const role = activeRoleParts[0]+(activeRoleParts.length > 1 ? `-${activeRoleParts[1]}` : '')
try {
+
const res = await fetch(`/side-menu-items/${role.toLowerCase()}.json`)
const rawMenu = await res.text()
- navMenu.value = JSON.parse(rawMenu)
+ const parsedMenu = JSON.parse(rawMenu)
+
+ const { user } = useUserStore()
+ if(user.unit_code == 'rehab') {
+ parsedMenu[0].heading = 'Rehab Medik'
+ parsedMenu[0].items = parsedMenu[0].items.filter((item: any) => item.title != 'IGD')
+ }
+
+ navMenu.value = parsedMenu
} catch (e) {
const res = await fetch(`/side-menu-items/blank.json`)
const rawMenu = await res.text()
diff --git a/app/components/pub/my-ui/checkboxes/checkboxes.vue b/app/components/pub/my-ui/checkboxes/checkboxes.vue
new file mode 100644
index 00000000..0cd21392
--- /dev/null
+++ b/app/components/pub/my-ui/checkboxes/checkboxes.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/checkboxes/index.ts b/app/components/pub/my-ui/checkboxes/index.ts
new file mode 100644
index 00000000..100ae6ab
--- /dev/null
+++ b/app/components/pub/my-ui/checkboxes/index.ts
@@ -0,0 +1,14 @@
+export interface Item {
+ value: string
+ label: string
+ checked?: boolean
+}
+
+export function checkItems(items: Item[], value: string[]) {
+ items.forEach((item, idx) => {
+ items[idx]!.checked = value.includes(item.value)
+ // item.checked = value.includes(item.value)
+ })
+}
+
+export { default as Checkboxes } from './checkboxes.vue'
diff --git a/app/components/pub/my-ui/combobox/combobox.vue b/app/components/pub/my-ui/combobox/combobox.vue
index 713edd57..5f0292e7 100644
--- a/app/components/pub/my-ui/combobox/combobox.vue
+++ b/app/components/pub/my-ui/combobox/combobox.vue
@@ -1,11 +1,10 @@
+
+
+
+
+
+
+
+ {{ menu.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/comp-tab/type.ts b/app/components/pub/my-ui/comp-tab/type.ts
index ba21d0b7..6ca710fa 100644
--- a/app/components/pub/my-ui/comp-tab/type.ts
+++ b/app/components/pub/my-ui/comp-tab/type.ts
@@ -3,5 +3,7 @@ export interface TabItem {
label: string
component?: any
groups?: string[]
+ classCode?: string[]
+ subClassCode?: string[]
props?: Record
}
diff --git a/app/components/pub/my-ui/content-header/content-header.vue b/app/components/pub/my-ui/content-header/content-header.vue
new file mode 100644
index 00000000..be5700a4
--- /dev/null
+++ b/app/components/pub/my-ui/content-header/content-header.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Minimal {{ quickSearchNav.minLength || 3 }} karakter untuk mencari
+
+
+
+
+
+
+
+ {{ addNav.label }}
+
+
+
+
+
+
+
+ {{ filterNav.label }}
+
+
+
+
+
+
+
+ {{ printNav.label }}
+
+
+
+
+
diff --git a/app/components/pub/my-ui/content-header/index.ts b/app/components/pub/my-ui/content-header/index.ts
new file mode 100644
index 00000000..7c07f9d5
--- /dev/null
+++ b/app/components/pub/my-ui/content-header/index.ts
@@ -0,0 +1,59 @@
+export type ComponentWithProps = { component: Component, props: Record }
+
+export interface ButtonNav {
+ variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'
+ classVal?: string
+ classValExt?: string
+ icon?: string
+ label: string
+ onClick?: () => void
+}
+
+// can type directly
+export interface QuickSearchNav {
+ modelValue?: string
+ placeholder?: string
+ inputClass?: string
+ inputPlaceHolder?: string
+ minLength?: number
+ btnClass?: string
+ btnIcon?: string
+ btnLabel?: string
+ showValidationFeedback?: boolean
+ debounceDuration?: number
+ searchParams: object
+ onSubmit?: (searchParams: object) => void
+ onClear: () => void
+}
+
+// callback on event
+export interface RefSearchNav {
+ modelValue?: string
+ placeholder?: string
+ inputClass?: string
+ inputPlaceHolder?: string
+ btnClass?: string
+ btnIcon?: string
+ onInput: (val: string) => void
+ onClick: () => void
+ onClear: () => void
+}
+
+export interface RefExportNav {
+ onExportPdf?: () => void
+ onExportCsv?: () => void
+ onExportExcel?: () => void
+}
+
+export interface Config {
+ title?: string
+ icon?: string
+ components?: ComponentWithProps[]
+ quickSearchNav?: QuickSearchNav
+ refSearchNav?: RefSearchNav // either ref or quick
+ filterNav?: ButtonNav
+ addNav?: ButtonNav
+ printNav?: ButtonNav
+}
+
+export { default as ContentHeader } from './content-header.vue'
diff --git a/app/components/pub/my-ui/content-switcher/content-switcher.vue b/app/components/pub/my-ui/content-switcher/content-switcher.vue
new file mode 100644
index 00000000..267d94c1
--- /dev/null
+++ b/app/components/pub/my-ui/content-switcher/content-switcher.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/data-table/data-table.vue b/app/components/pub/my-ui/data-table/data-table.vue
index 408b6d9d..690ac75e 100644
--- a/app/components/pub/my-ui/data-table/data-table.vue
+++ b/app/components/pub/my-ui/data-table/data-table.vue
@@ -110,8 +110,8 @@ function handleActionCellClick(event: Event, _cellRef: string) {
diff --git a/app/components/pub/my-ui/data/camuflage-input.vue b/app/components/pub/my-ui/data/camuflage-input.vue
new file mode 100644
index 00000000..09500724
--- /dev/null
+++ b/app/components/pub/my-ui/data/camuflage-input.vue
@@ -0,0 +1,59 @@
+
+
+
+ activeState = true"
+ :class="`${defaultClass}`"
+ :style="widthStyle">
+ {{ model }}
+
+ activeState = false"
+ />
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-choose.vue b/app/components/pub/my-ui/data/dropdown-action-choose.vue
new file mode 100644
index 00000000..8fb63f33
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-choose.vue
@@ -0,0 +1,30 @@
+
+
+
+
+ Pilih
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-d.vue b/app/components/pub/my-ui/data/dropdown-action-d.vue
new file mode 100644
index 00000000..ac15ff49
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-d.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-detail.vue b/app/components/pub/my-ui/data/dropdown-action-detail.vue
new file mode 100644
index 00000000..b695fb5c
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-detail.vue
@@ -0,0 +1,30 @@
+
+
+
+
+ Detail
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-dp.vue b/app/components/pub/my-ui/data/dropdown-action-dp.vue
new file mode 100644
index 00000000..479cfebd
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-dp.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-duvp.vue b/app/components/pub/my-ui/data/dropdown-action-duvp.vue
new file mode 100644
index 00000000..22952bd5
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-duvp.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-p.vue b/app/components/pub/my-ui/data/dropdown-action-p.vue
new file mode 100644
index 00000000..2b7ad617
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-print.vue b/app/components/pub/my-ui/data/dropdown-action-print.vue
new file mode 100644
index 00000000..99a7da03
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-print.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+ Preview
+
+
+
diff --git a/app/components/pub/my-ui/data/dropdown-action-upd.vue b/app/components/pub/my-ui/data/dropdown-action-upd.vue
new file mode 100644
index 00000000..611e53d2
--- /dev/null
+++ b/app/components/pub/my-ui/data/dropdown-action-upd.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ {{ props.btnTxt || 'Preview' }}
+
+
\ No newline at end of file
diff --git a/app/components/pub/my-ui/data/types.ts b/app/components/pub/my-ui/data/types.ts
index 0d747580..126c5d8d 100644
--- a/app/components/pub/my-ui/data/types.ts
+++ b/app/components/pub/my-ui/data/types.ts
@@ -71,9 +71,11 @@ export interface KeyNames {
export interface LinkItem {
label: string
+ value?: string
icon?: string
href?: string // to cover the needs of stating full external origins full url
action?: string // for local paths
+ groups?: string[]
onClick?: (event: Event) => void
headerStatus?: boolean
}
@@ -84,7 +86,9 @@ export const ActionEvents = {
showEdit: 'showEdit',
showDetail: 'showDetail',
showProcess: 'showProcess',
+ showCancel: 'showCancel',
showVerify: 'showVerify',
+ showConfirmVerify: 'showConfirmVerify',
showValidate: 'showValidate',
showPrint: 'showPrint',
}
diff --git a/app/components/pub/my-ui/doc-entry/colon.vue b/app/components/pub/my-ui/doc-entry/colon.vue
index a6d379f5..6c3b3100 100644
--- a/app/components/pub/my-ui/doc-entry/colon.vue
+++ b/app/components/pub/my-ui/doc-entry/colon.vue
@@ -1,7 +1,9 @@
- :
+ :
diff --git a/app/components/pub/my-ui/form/button-action.vue b/app/components/pub/my-ui/form/button-action.vue
new file mode 100644
index 00000000..a1054948
--- /dev/null
+++ b/app/components/pub/my-ui/form/button-action.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+ {{ buttonLabel }}
+
+
diff --git a/app/components/pub/my-ui/form/file-field.vue b/app/components/pub/my-ui/form/file-field.vue
index 31885a6f..d68401bb 100644
--- a/app/components/pub/my-ui/form/file-field.vue
+++ b/app/components/pub/my-ui/form/file-field.vue
@@ -1,14 +1,11 @@
-
+
void) {
diff --git a/app/components/pub/my-ui/form/fragment.vue b/app/components/pub/my-ui/form/fragment.vue
new file mode 100644
index 00000000..a3f3135c
--- /dev/null
+++ b/app/components/pub/my-ui/form/fragment.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/app/components/pub/my-ui/form/index.ts b/app/components/pub/my-ui/form/index.ts
new file mode 100644
index 00000000..246bb8c6
--- /dev/null
+++ b/app/components/pub/my-ui/form/index.ts
@@ -0,0 +1,11 @@
+export { default as Block } from './block.vue'
+export { default as ButtonAction } from './button-action.vue'
+export { default as FieldGroup } from './field-group.vue'
+export { default as Field } from './field.vue'
+export { default as FileField } from './file-field.vue'
+export { default as Fragment } from './fragment.vue'
+export { default as InputBase } from './input-base.vue'
+export { default as Label } from './label.vue'
+export { default as Select } from './select.vue'
+export { default as TextAreaInput } from './text-area-input.vue'
+export { default as TextCaptcha } from './text-captcha.vue'
diff --git a/app/components/pub/my-ui/form/input-base.vue b/app/components/pub/my-ui/form/input-base.vue
index c31b2073..398a5af2 100644
--- a/app/components/pub/my-ui/form/input-base.vue
+++ b/app/components/pub/my-ui/form/input-base.vue
@@ -1,17 +1,18 @@
@@ -63,27 +73,51 @@ function handleInput(event: Event) {
v-slot="{ componentField }"
:name="fieldName"
>
-
-
-
- {{ rightLabel }}
+
+
+
+
+
+ {{ suffixMsg }}
+
+
+
+ {{ rightLabel }}
+
+
- {{ bottomLabel }}
+
+ {{ bottomLabel }}
+
diff --git a/app/components/pub/my-ui/form/select.vue b/app/components/pub/my-ui/form/select.vue
index 0cfc926b..a9d79025 100644
--- a/app/components/pub/my-ui/form/select.vue
+++ b/app/components/pub/my-ui/form/select.vue
@@ -1,6 +1,7 @@
-
+
-
+
{{ label }}
+
+ :
+
-
- :
+
diff --git a/app/components/pub/my-ui/menus/submenu.vue b/app/components/pub/my-ui/menus/submenu.vue
new file mode 100644
index 00000000..fb9fdfd9
--- /dev/null
+++ b/app/components/pub/my-ui/menus/submenu.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+ {{ menu.title }}
+
+
+
+
+
+
+
diff --git a/app/components/pub/my-ui/modal/dialog.vue b/app/components/pub/my-ui/modal/dialog.vue
index d771924f..1a3614f6 100644
--- a/app/components/pub/my-ui/modal/dialog.vue
+++ b/app/components/pub/my-ui/modal/dialog.vue
@@ -45,15 +45,12 @@ const isOpen = computed({
- preventOutside && e.preventDefault()"
- @pointer-down-outside="(e: any) => preventOutside && e.preventDefault()"
- >
+ preventOutside && e.preventDefault()"
+ @pointer-down-outside="(e: any) => preventOutside && e.preventDefault()">
-
-
+
+
{{ props.title }}
@@ -66,4 +63,4 @@ const isOpen = computed({
-
+
\ No newline at end of file
diff --git a/app/components/pub/my-ui/nav-content/ba.vue b/app/components/pub/my-ui/nav-content/ba.vue
index c31fe72c..5ebb6386 100644
--- a/app/components/pub/my-ui/nav-content/ba.vue
+++ b/app/components/pub/my-ui/nav-content/ba.vue
@@ -20,7 +20,7 @@ function onClick(type: ClickType) {
@click="onClick('draft')"
class="flex items-center gap-2 rounded-full border border-orange-400 bg-orange-50 px-3 py-1 text-sm font-medium text-orange-600 hover:bg-orange-100"
>
-