-
Penanggung Jawab
+
+
+
+ Nama Penanggung Jawab
+
+
+
+ |
-
-
-
- Nama Penanggung Jawab
-
-
-
- |
-
-
- No. Hp Penanggung Jawab
-
-
-
- |
-
-
-
-
+
+ No. Hp Penanggung Jawab
+
+
+
+ |
+
-
-
Pemberi Informasi
+
+
+
+ Informant
+
+
+
+ |
+
-
-
-
- Informant
-
-
-
- |
-
-
-
-
-
diff --git a/app/components/app/general-consent/list.cfg.ts b/app/components/app/general-consent/list.cfg.ts
index c2f57c54..24ed191a 100644
--- a/app/components/app/general-consent/list.cfg.ts
+++ b/app/components/app/general-consent/list.cfg.ts
@@ -6,7 +6,7 @@ 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 }],
+ cols: [{ width: 100 }, {}, {}, {}, {}, {}, { width: 50 }],
headers: [
[
{ label: 'Tanggal' },
diff --git a/app/components/app/mcu-order/detail.vue b/app/components/app/mcu-order/detail.vue
index 8d86a98b..59cd5595 100644
--- a/app/components/app/mcu-order/detail.vue
+++ b/app/components/app/mcu-order/detail.vue
@@ -13,20 +13,33 @@ const props = defineProps<{
Order {{ data?.createdAt?.substring(0, 10) }} - {{ data?.status_code }}
-
+
- DPJP
+ DPJP
- {{ data?.doctor?.employee?.person?.name || '.........' }}
+
- PPDS
+ PPDS
- ...........
+
+
+
+
+ Pemeriksaan Ke
+
+
+
+
+
+
+ Temperatur Aksiler
+
+
-
\ No newline at end of file
+
diff --git a/app/components/app/mcu-order/entry-for-ap.vue b/app/components/app/mcu-order/entry-for-ap.vue
new file mode 100644
index 00000000..80d0f7df
--- /dev/null
+++ b/app/components/app/mcu-order/entry-for-ap.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+ Tgl. Order
+
+
+
+
+
+ DPJP
+
+
+
+
+
+ PPDS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lokalisasi
+
+
+
+
+
+ Diagnosa Klinik
+
+
+
+
+
+ Stadium T
+
+
+
+
+
+ Stadium M
+
+
+
+
+
+ Stadium N
+
+
+
+
+
+
+ Keterangan Klinik
+
+
+
+
+
+
+
+
+
+ Riwayat Dulu
+
+
+
+
+
+ Riwayat Sekarang
+
+
+
+
+
+ Pemeriksaan PA Sebelumnya
+
+
+
+
+
+
+ Keterangan PA Sebelumnya
+
+
+
+
+
+ Pemeriksaan Penunjang
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/person-contact/entry-form.vue b/app/components/app/person-contact/entry-form.vue
index 431a3c79..bcbc8aea 100644
--- a/app/components/app/person-contact/entry-form.vue
+++ b/app/components/app/person-contact/entry-form.vue
@@ -39,7 +39,7 @@ defineExpose({
{{ props.title || 'Kontak Pasien' }}
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/history-dialog.vue b/app/components/app/surgery-report/_common/history-dialog.vue
index d92da4a5..4172aaec 100644
--- a/app/components/app/surgery-report/_common/history-dialog.vue
+++ b/app/components/app/surgery-report/_common/history-dialog.vue
@@ -42,7 +42,7 @@ const itemsCount = computed(() => items.length || 0)
{{ item?.createdAt.toLocaleDateString('id-ID') }}
Ditambahkan Oleh : {{ item.updatedBy }}
-
+
Lihat Detail
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
index e4836c7c..fabb0463 100644
--- 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
@@ -45,6 +45,7 @@ const {
handleSearch,
fetchData: getItemList,
} = usePaginatedList({
+ syncToUrl: false,
fetchFn: async (params: any) => {
const result = await getList({
search: params.search,
@@ -102,19 +103,23 @@ onMounted(async () => {
-
-
-
+
+
+
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
index 4a44a40f..11a2b514 100644
--- 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
@@ -1,62 +1,143 @@
-
-
-
{{ title }}
-
-
- Pilih Diagnosis
-
+
+
+
+
+
+
+
+
+
+ Prosedur
+ ICD-X
+ Action
+
+
+
+
+
+ Belum ada data dipilih.
+
+
+
+
+
+ {{ (field.value as ProcedureSrc)?.name }}
+
+
+ {{ (field.value as ProcedureSrc)?.code }}
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+ Prosedur
+ ICD-X
+
+
+
+
+
+ Tidak ada data.
+
+
-
-
-
-
- Prosedur
- ICD-X
- Action
-
-
-
-
- {{ field.value?.name }}
- {{ field.value?.code }}
-
-
-
-
-
-
-
-
-
-
+
+
+ {{ item.name }}
+
+
+ {{ item.code }}
+
+
+
+
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
+
+
+
+
+
+
+
+ {
+ isDialogOpen = value
+ }
+ "
+ >
+
+
+
+
+ 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
+
+
+
+
+
+
+
+ {
+ isDialogOpen = value
+ }
+ "
+ >
+
+
+
+
+ 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/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/document-upload/add.vue b/app/components/content/document-upload/add.vue
index 9d099189..95febcca 100644
--- a/app/components/content/document-upload/add.vue
+++ b/app/components/content/document-upload/add.vue
@@ -10,13 +10,13 @@ import { toFormData } from '~/lib/utils'
import { uploadAttachment } from '~/services/supporting-document.service'
// #region Props & Emits
-const props = defineProps<{
- callbackUrl?: string
-}>()
+const props = withDefaults(defineProps<{
+ encounter_id: number
+}>(), {
+
+})
// form related state
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
const inputForm = ref | null>(null)
const { user } = useUserStore()
// #endregion
@@ -43,20 +43,14 @@ async function handleConfirmAdd() {
const inputFormData: FormData = toFormData(inputData)
const response = await handleActionSave(inputFormData, () => { }, () => { }, toast, )
- const data = (response?.body?.data ?? null)
- if (!data) return
-
- // // If has callback provided redirect to callback with patientData
- if (props.callbackUrl) {
- navigateTo(props.callbackUrl + '?control-letter-id=' + inputData.id)
- }
+ // const data = (response?.body?.data ?? null)
goBack()
}
async function composeFormData(): Promise {
inputForm.value?.setValues({
...inputForm.value?.values,
- ref_id: encounterId,
+ ref_id: props.encounter_id,
upload_employee_id: user.employee_id
})
@@ -83,13 +77,7 @@ async function handleActionClick(eventType: string) {
isConfirmationOpen.value = true
}
- if (eventType === 'back') {
- if (props.callbackUrl) {
- await navigateTo(props.callbackUrl)
- return
- }
- goBack()
- }
+ if (eventType === 'back') goBack()
}
function handleCancelAdd() {
diff --git a/app/components/content/document-upload/edit.vue b/app/components/content/document-upload/edit.vue
index c4033fb2..1719c274 100644
--- a/app/components/content/document-upload/edit.vue
+++ b/app/components/content/document-upload/edit.vue
@@ -8,15 +8,15 @@ import Confirmation from '~/components/pub/my-ui/confirmation/confirmation.vue'
import { DocumentUploadSchema } from '~/schemas/document-upload.schema'
import { getDetail } from '~/services/supporting-document.service'
-// #region Props & Emits
-const props = defineProps<{
- callbackUrl?: string
-}>()
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ record_id: number
+}>(), {
+
+})
// form related state
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const docId = typeof route.params.document_id == 'string' ? parseInt(route.params.document_id) : 0
+const docId = props.record_id
const inputForm = ref | null>(null)
// #endregion
@@ -77,7 +77,7 @@ async function composeFormData(): Promise {
if (!allValid) return Promise.reject('Form validation failed')
const formData = inputFormState?.values
- formData.encounter_id = encounterId
+ formData.encounter_id = props.encounter_id
return new Promise((resolve) => resolve(formData))
}
// #endregion region
@@ -88,14 +88,7 @@ async function handleActionClick(eventType: string) {
isConfirmationOpen.value = true
}
- if (eventType === 'back') {
- if (props.callbackUrl) {
- await navigateTo(props.callbackUrl)
- return
- }
-
- goBack()
- }
+ if (eventType === 'back') goBack()
}
function handleCancelAdd() {
@@ -109,7 +102,7 @@ function handleCancelAdd() {
-
Upload Dokumen
+ Update Upload Dokumen
void
-}>()
-
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ redirectToForm?: (myRecord_id?: any) => void
+}>(), {
+ redirectToForm: () => { }
+})
const { data, paginationMeta, handlePageChange, handleSearch, searchInput, fetchData } = usePaginatedList({
fetchFn: (params) => getList({
- 'encounter-id': encounterId,
+ 'encounter-id': props.encounter_id,
// includes: "employee",
...params,
}),
@@ -56,10 +53,9 @@ const headerPrep: HeaderPrep = {
if (pagePermission.canCreate) {
headerPrep.addNav = {
label: "Upload Dokumen",
- onClick: () => navigateTo({
- name: 'rehab-encounter-id-document-upload-add',
- params: { id: encounterId },
- }),
+ onClick: () => {
+ props.redirectToForm()
+ },
}
}
@@ -78,6 +74,7 @@ const refSearchNav: RefSearchNav = {
// #region Lifecycle Hooks
onMounted(() => {
+
})
// #endregion
@@ -99,7 +96,6 @@ async function handleConfirmDelete(record: any, action: string) {
}
}
-
function handleCancelConfirmation() {
// Reset record state when cancelled
recId.value = 0
@@ -124,10 +120,7 @@ watch([recId, recAction, timestamp], () => {
case ActionEvents.showEdit:
if(pagePermission.canUpdate){
- navigateTo({
- name: 'rehab-encounter-id-document-upload-document_id-edit',
- params: { id: encounterId, "document_id": recId.value },
- })
+ props.redirectToForm(recId.value)
} else {
unauthorizedToast()
}
diff --git a/app/components/content/document-upload/main.vue b/app/components/content/document-upload/main.vue
new file mode 100644
index 00000000..d4e09da3
--- /dev/null
+++ b/app/components/content/document-upload/main.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/encounter/list.vue b/app/components/content/encounter/list.vue
index 1210ab68..80a42528 100644
--- a/app/components/content/encounter/list.vue
+++ b/app/components/content/encounter/list.vue
@@ -169,10 +169,10 @@ async function getPatientList() {
try {
const params: any = { includes: includesParams, ...filterParams.value }
if (props.classCode) {
- params.class_code = props.classCode
+ params['class-code'] = props.classCode
}
if (props.subClassCode) {
- params.sub_class_code = props.subClassCode
+ params['sub-class-code'] = props.subClassCode
}
const result = await getEncounterList(params)
if (result.success) {
diff --git a/app/components/content/encounter/process.vue b/app/components/content/encounter/process.vue
index fcfc3671..044b44dc 100644
--- a/app/components/content/encounter/process.vue
+++ b/app/components/content/encounter/process.vue
@@ -29,8 +29,10 @@ import CpLabOrder from '~/components/content/cp-lab-order/main.vue'
import Radiology from '~/components/content/radiology-order/main.vue'
import Consultation from '~/components/content/consultation/list.vue'
import Cprj from '~/components/content/cprj/entry.vue'
+import ActionReport from '~/components/content/action-report/entry.vue'
import DocUploadList from '~/components/content/document-upload/list.vue'
import GeneralConsentList from '~/components/content/general-consent/entry.vue'
+import SummaryMedic from '~/components/content/summary-medic/entry.vue'
import ResumeList from '~/components/content/resume/list.vue'
import ControlLetterList from '~/components/content/control-letter/list.vue'
import InitialNursingStudy from '~/components/content/initial-nursing/entry.vue'
@@ -56,7 +58,7 @@ const router = useRouter()
const { user, userActiveRole, getActiveRole } = useUserStore()
const activeRole = getActiveRole()
const activePosition = ref(getServicePosition(activeRole))
-const menus = ref([] as any)
+const menus = shallowRef([] as any)
const activeMenu = computed({
get: () => (route.query?.menu && typeof route.query.menu === 'string' ? route.query.menu : 'status'),
set: (value: string) => {
@@ -101,6 +103,13 @@ const protocolRows = [
{ value: 'therapy-protocol', label: 'Protokol Terapi' },
{ value: 'education-assessment', label: 'Asesmen Kebutuhan Edukasi' },
{ value: 'patient-note', label: 'CPRJ', component: Cprj, props: { encounter: data } },
+ { value: 'summary-medic', label: 'Profil Ringkasan Medis', component: SummaryMedic, props: { encounter: data } },
+ { value: 'consent', label: 'General Consent', component: GeneralConsentList, props: { encounter: data } },
+ { value: 'prescription', label: 'Order Obat', component: Prescription, props: { encounter_id: data.value.id } },
+ { value: 'device-order', label: 'Order Alkes', component: DeviceOrder, props: { encounter_id: data.value.id } },
+ { value: 'device', label: 'Order Alkes' },
+ { value: 'mcu-radiology', label: 'Order Radiologi', component: Radiology, props: { encounter_id: data.value.id } },
+ { value: 'mcu-lab-cp', label: 'Order Lab PK', component: CpLabOrder, props: { encounter_id: data.value.id } },
{ value: 'consent', label: 'General Consent', component: GeneralConsentList, props: { encounter: data } },
{
value: 'initial-nursing-study',
@@ -108,11 +117,6 @@ const protocolRows = [
component: InitialNursingStudy,
props: { encounter: data },
},
- { value: 'prescription', label: 'Order Obat', component: Prescription, props: { encounter_id: data.value.id } },
- { value: 'device-order', label: 'Order Alkes', component: DeviceOrder, props: { encounter_id: data.value.id } },
- { value: 'device', label: 'Order Alkes' },
- { value: 'mcu-radiology', label: 'Order Radiologi', component: Radiology, props: { encounter_id: data.value.id } },
- { value: 'mcu-lab-cp', label: 'Order Lab PK', component: CpLabOrder, props: { encounter_id: data.value.id } },
{ value: 'mcu-lab-micro', label: 'Order Lab Mikro' },
{ value: 'mcu-lab-pa', label: 'Order Lab PA' },
{ value: 'medical-action', label: 'Order Ruang Tindakan' },
@@ -121,6 +125,13 @@ const protocolRows = [
{ value: 'resume', label: 'Resume', component: ResumeList, props: { encounter: data } },
{ value: 'control', label: 'Surat Kontrol', component: ControlLetterList, props: { encounter: data } },
{ value: 'screening', label: 'Skrinning MPP' },
+ {
+ value: 'report',
+ label: 'Laporan Tindakan',
+ groups: ['ambulatory', 'rehabilitation', 'chemotherapy'],
+ component: ActionReport,
+ props: { encounter: data },
+ },
{
value: 'supporting-document',
label: 'Upload Dokumen Pendukung',
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/kfr/entry.vue b/app/components/content/kfr/entry.vue
index a2352c1a..142b5fe4 100644
--- a/app/components/content/kfr/entry.vue
+++ b/app/components/content/kfr/entry.vue
@@ -10,17 +10,16 @@ import { getDetail } from '~/services/kfr.service';
// #region Props & Emits
const props = withDefaults(defineProps<{
+ encounter_id: number
callbackUrl?: string
- mode?: 'add' | 'edit'
+ record_id: number
}>(), {
- mode: "add",
+
})
// form related state
const route = useRoute()
-
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const kfrId = typeof route.params.kfr_id == 'string' ? parseInt(route.params.kfr_id) : 0
+const mode = computed(() => props.record_id ? `edit` : `add`)
const inputForm = ref | null>(null)
// #endregion
@@ -31,13 +30,13 @@ const isConfirmationOpen = ref(false)
// #region Lifecycle Hooks
onMounted(() => {
- if(props.mode === `edit`) init()
+ if(mode.value === `edit`) init()
})
// #endregion
// #region Functions
async function init(){
- const result = await getDetail(kfrId)
+ const result = await getDetail(props.record_id)
if (result.success) {
const currentValue = result.body?.data || {}
inputForm.value?.setValues(currentValue)
@@ -50,7 +49,7 @@ function goBack() {
async function handleConfirmAdd() {
const inputData: any = await composeFormData()
- const response = props.mode === `add`
+ const response = mode.value === `add`
? await handleActionSave(
inputData,
() => { },
@@ -58,7 +57,7 @@ async function handleConfirmAdd() {
toast,
)
: await handleActionEdit(
- kfrId,
+ props.record_id,
inputData,
() => { },
() => { },
@@ -82,7 +81,7 @@ async function composeFormData(): Promise {
if (!allValid) return Promise.reject('Form validation failed')
const formData = input?.values
- formData.encounter_id = encounterId
+ formData.encounter_id = props.encounter_id
return new Promise((resolve) => resolve(formData))
}
@@ -123,7 +122,7 @@ const initial = {
- {{ props.mode === "add" ? `Tambah` : `Update` }} Formulir Rawat Jalan KFR
+ Formulir Rawat Jalan KFR
()
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const kfrId = typeof route.params.kfr_id == 'string' ? parseInt(route.params.kfr_id) : 0
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ redirectToForm?: (myRecord_id?: any) => void
+}>(), {
+ redirectToForm: () => { }
+})
// #endregion
// #region State
@@ -104,17 +106,16 @@ const addBtnTxt = computed(() => {
}
return `Tambah Asesmen`
})
-
- const headerPrep: HeaderPrep = {
+const headerPrep: HeaderPrep = {
title: "Formulir Rawat Jalan KFR",
icon: 'i-lucide-newspaper',
}
if(isDoctor.value || isAdmin.value) {
headerPrep.addNav = {
label: addBtnTxt.value,
- onClick: () => navigateTo({
- name: 'rehab-encounter-id-kfr-add',
- }),
+ onClick: () => {
+ props.redirectToForm()
+ },
}
}
if(!isAssessment.value) {
@@ -283,12 +284,7 @@ watch([recId, recAction, timestamp], () => {
switch (recAction.value) {
case ActionEvents.showEdit:
// if(pagePermission.canUpdate) {
- navigateTo({
- name: 'rehab-encounter-id-kfr-kfr_id-edit',
- params: {
- kfr_id: kfrId
- }
- })
+ props.redirectToForm(recId.value)
// } else {
// unauthorizedToast()
// }
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
index f07310b3..0de46970 100644
--- a/app/components/content/mcu-order/entry.vue
+++ b/app/components/content/mcu-order/entry.vue
@@ -131,6 +131,7 @@ async function getItems() {
+ Daftar Item
diff --git a/app/components/content/prb/detail.vue b/app/components/content/prb/detail.vue
index 4de8f260..43b09fa6 100644
--- a/app/components/content/prb/detail.vue
+++ b/app/components/content/prb/detail.vue
@@ -11,17 +11,18 @@ import Header from '~/components/pub/my-ui/nav-header/prep.vue'
import type { Prb } from '~/models/prb'
// #region Props & Emits
-const props = defineProps<{
-}>()
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ record_id: number
+}>(), {
+
+})
// #endregion
// #region State & Computed
-const route = useRoute()
const router = useRouter()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const PrbId = typeof route.params.surgery_report_id == 'string' ? parseInt(route.params.surgery_report_id) : 0
const Prb = ref(null)
const headerPrep: HeaderPrep = {
diff --git a/app/components/content/prb/entry.vue b/app/components/content/prb/entry.vue
index 244c49b0..a6612411 100644
--- a/app/components/content/prb/entry.vue
+++ b/app/components/content/prb/entry.vue
@@ -4,21 +4,11 @@ import type { Patient, genPatientProps } from '~/models/patient'
import type { ExposedForm } from '~/types/form'
import type { PatientBase } from '~/models/patient'
import Action from '~/components/pub/my-ui/nav-footer/ba-dr-su.vue'
-import Header from '~/components/pub/my-ui/nav-header/prep.vue'
-import { genPatient } from '~/models/patient'
-import { PatientSchema } from '~/schemas/patient.schema'
-import { PersonAddressRelativeSchema } from '~/schemas/person-address-relative.schema'
-import { PersonAddressSchema } from '~/schemas/person-address.schema'
-import { PersonContactListSchema } from '~/schemas/person-contact.schema'
-import { PersonFamiliesSchema } from '~/schemas/person-family.schema'
-import { ResponsiblePersonSchema } from '~/schemas/person-relative.schema'
-import { uploadAttachment } from '~/services/patient.service'
import { getDetail, update } from '~/services/prb.service'
import type { Prb } from '~/models/prb'
import ActionDialog from '~/components/pub/my-ui/nav-footer/ba-su.vue'
import { toast } from '~/components/pub/ui/toast'
-import { withBase } from '~/models/_base'
import Confirmation from '~/components/pub/my-ui/confirmation/confirmation.vue'
import { PrbSchema } from '~/schemas/prb.schema'
import { formatDateYyyyMmDd } from '~/lib/date'
@@ -29,8 +19,10 @@ import type { HeaderPrep, RefSearchNav } from '~/components/pub/my-ui/data/types
import { formatDateToDatetimeLocal } from '~/lib/utils'
// #region Props & Emits
-const props = withDefaults(defineProps<{
+const props = withDefaults(defineProps<{
+ encounter_id: number
callbackUrl?: string
+ record_id: number
isBpjs?: boolean
}>(), {
isBpjs: false,
@@ -44,11 +36,7 @@ const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSe
// #endregion
// #region State & Computed
-const route = useRoute()
const router = useRouter()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const PrbId = typeof route.params.surgery_report_id == 'string' ? parseInt(route.params.surgery_report_id) : 0
-
const inputForm = ref | null>(null)
const Prb = ref({})
const isConfirmationOpen = ref(false)
@@ -60,7 +48,7 @@ provide("isSepDialogOpen", isSepDialogOpen);
// #region Lifecycle Hooks
onMounted(async () => {
- const result = await getDetail(PrbId)
+ const result = await getDetail(props.record_id)
if (result.success) {
const responseData = {...result.body.data, date: formatDateYyyyMmDd(result.body.data.date)}
Prb.value = responseData
@@ -76,7 +64,7 @@ function goBack() {
async function handleConfirmAdd() {
const response = await handleActionEdit(
- PrbId,
+ props.record_id,
await composeFormData(),
() => { },
() => { },
@@ -97,7 +85,7 @@ async function composeFormData(): Promise {
if (!allValid) return Promise.reject('Form validation failed')
const formData = input?.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/prb/list.vue b/app/components/content/prb/list.vue
index a1c09696..02acba94 100644
--- a/app/components/content/prb/list.vue
+++ b/app/components/content/prb/list.vue
@@ -19,13 +19,16 @@ import Dialog from '~/components/pub/my-ui/modal/dialog.vue'
// #region State
const props = withDefaults(defineProps<{
- encounter?: Encounter
+ encounter_id: number
isBpjs?: boolean
+ redirectToForm?: (myRecord_id?: any) => void
+ redirectToDetail?: (myRecord_id: string|number) => void
}>(), {
isBpjs: false,
+ redirectToForm: () => { },
+ redirectToDetail: () => { }
})
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
+const { user } = useUserStore()
const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSearch, fetchData } = usePaginatedList({
fetchFn: (params) => getList({ ...params, includes: '', }),
@@ -66,10 +69,9 @@ const headerPrep: HeaderPrep = {
if(true){
headerPrep.addNav = {
label: "Program Rujuk Balik",
- onClick: () => navigateTo({
- name: 'rehab-encounter-id-prb-add',
- params: { id: encounterId },
- }),
+ onClick: () => {
+ props.redirectToForm()
+ },
};
}
headerPrep.components = [
@@ -134,10 +136,7 @@ provide('isHistoryDialogOpen', isHistoryDialogOpen)
watch([recId, recAction, timestamp], () => {
switch (recAction.value) {
case ActionEvents.showEdit:
- navigateTo({
- name: 'rehab-encounter-id-prb-prb_id-edit',
- params: { id: encounterId, "prb_id": recId.value },
- })
+ props.redirectToForm(recId.value)
break
case ActionEvents.showPrint:
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/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/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/summary-medic/entry.vue b/app/components/content/summary-medic/entry.vue
new file mode 100644
index 00000000..5769e967
--- /dev/null
+++ b/app/components/content/summary-medic/entry.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
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
index 7c266329..5fc7f2d6 100644
--- a/app/components/content/surgery-report/detail.vue
+++ b/app/components/content/surgery-report/detail.vue
@@ -11,17 +11,18 @@ import Header from '~/components/pub/my-ui/nav-header/prep.vue'
import type { SurgeryReport } from '~/models/surgery-report'
// #region Props & Emits
-const props = defineProps<{
-}>()
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ record_id: number
+}>(), {
+
+})
// #endregion
// #region State & Computed
-const route = useRoute()
const router = useRouter()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const surgeryReportId = typeof route.params.surgery_report_id == 'string' ? parseInt(route.params.surgery_report_id) : 0
const surgeryReport = ref(null)
const headerPrep: HeaderPrep = {
@@ -33,11 +34,11 @@ const headerPrep: HeaderPrep = {
// #region Lifecycle Hooks
// onMounted(async () => {
-// const result = await getDetail(controlLetterId, {
+// const result = await getDetail(props.record_id, {
// includes: "unit,specialist,subspecialist,doctor-employee-person",
// })
// if (result.success) {
-// controlLetter.value = result.body?.data
+// surgeryReport.value = result.body?.data
// }
// })
// #endregion
diff --git a/app/components/content/surgery-report/entry.vue b/app/components/content/surgery-report/entry.vue
index ff817905..4a2d0911 100644
--- a/app/components/content/surgery-report/entry.vue
+++ b/app/components/content/surgery-report/entry.vue
@@ -28,9 +28,13 @@ import { handleActionEdit } from '~/handlers/surgery-report.handler'
import type { HeaderPrep, RefSearchNav } from '~/components/pub/my-ui/data/types'
// #region Props & Emits
-const props = defineProps<{
+const props = withDefaults(defineProps<{
+ encounter_id: number
callbackUrl?: string
-}>()
+ record_id: number
+}>(), {
+
+})
// form related state
const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSearch, fetchData } = usePaginatedList({
@@ -40,10 +44,7 @@ const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSe
// #endregion
// #region State & Computed
-const route = useRoute()
const router = useRouter()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const surgeryReportId = typeof route.params.surgery_report_id == 'string' ? parseInt(route.params.surgery_report_id) : 0
const inputForm = ref | null>(null)
const surgeryReport = ref({})
@@ -53,7 +54,7 @@ const selectedOperativeAction = ref(null)
// #region Lifecycle Hooks
onMounted(async () => {
- const result = await getDetail(surgeryReportId)
+ const result = await getDetail(props.record_id)
if (result.success) {
const responseData = {...result.body.data, date: formatDateYyyyMmDd(result.body.data.date)}
surgeryReport.value = responseData
@@ -69,7 +70,7 @@ function goBack() {
async function handleConfirmAdd() {
const response = await handleActionEdit(
- surgeryReportId,
+ props.record_id,
await composeFormData(),
() => { },
() => { },
@@ -90,7 +91,7 @@ async function composeFormData(): Promise {
if (!allValid) return Promise.reject('Form validation failed')
const formData = input?.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/surgery-report/list.vue b/app/components/content/surgery-report/list.vue
index 82bbd7b3..bb3a6728 100644
--- a/app/components/content/surgery-report/list.vue
+++ b/app/components/content/surgery-report/list.vue
@@ -16,11 +16,14 @@ import Dialog from '~/components/pub/my-ui/modal/dialog.vue'
// #endregion
// #region State
-const props = defineProps<{
- encounter?: Encounter
-}>()
-const route = useRoute()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ redirectToForm?: (myRecord_id?: any) => void
+ redirectToDetail?: (myRecord_id: string|number) => void
+}>(), {
+ redirectToForm: () => { },
+ redirectToDetail: () => { }
+})
const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSearch, fetchData } = usePaginatedList({
fetchFn: (params) => getList({ ...params, includes: 'specialist,subspecialist,doctor-employee-person', }),
@@ -42,10 +45,9 @@ const headerPrep: HeaderPrep = {
icon: 'i-lucide-history',
addNav: {
label: "Laporan Operasi",
- onClick: () => navigateTo({
- name: 'rehab-encounter-id-surgery-report-add',
- params: { id: encounterId },
- }),
+ onClick: () => {
+ props.redirectToForm()
+ },
},
}
const refSearchNav: RefSearchNav = {
@@ -125,23 +127,14 @@ provide('isHistoryDialogOpen', isHistoryDialogOpen)
watch([recId, recAction], () => {
switch (recAction.value) {
case ActionEvents.showDetail:
- navigateTo({
- name: 'rehab-encounter-id-surgery-report-control_letter_id',
- params: { id: encounterId, "control_letter_id": recId.value },
- })
+ props.redirectToDetail(recId.value)
break
case ActionEvents.showEdit:
- // TODO: Handle edit action
- // isFormEntryDialogOpen.value = true
- navigateTo({
- name: 'rehab-encounter-id-surgery-report-control_letter_id-edit',
- params: { id: encounterId, "control_letter_id": recId.value },
- })
+ props.redirectToForm(recId.value)
break
case ActionEvents.showConfirmDelete:
- // Trigger confirmation modal open
isRecordConfirmationOpen.value = true
break
}
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/vaccine-data/detail.vue b/app/components/content/vaccine-data/detail.vue
index fd977b39..9377c374 100644
--- a/app/components/content/vaccine-data/detail.vue
+++ b/app/components/content/vaccine-data/detail.vue
@@ -11,17 +11,18 @@ import Header from '~/components/pub/my-ui/nav-header/prep.vue'
import type { VaccineData } from '~/models/vaccine-data'
// #region Props & Emits
-const props = defineProps<{
-}>()
+const props = withDefaults(defineProps<{
+ encounter_id: number
+ record_id: number
+}>(), {
+
+})
// #endregion
// #region State & Computed
-const route = useRoute()
const router = useRouter()
-const encounterId = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
-const VaccineDataId = typeof route.params.surgery_report_id == 'string' ? parseInt(route.params.surgery_report_id) : 0
const VaccineData = ref(null)
const headerPrep: HeaderPrep = {
diff --git a/app/components/content/vaccine-data/entry.vue b/app/components/content/vaccine-data/entry.vue
index 60fe3775..d8afd94b 100644
--- a/app/components/content/vaccine-data/entry.vue
+++ b/app/components/content/vaccine-data/entry.vue
@@ -1,21 +1,9 @@
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ check(item.value, status)" :checked="checks[item.value]" />
+
+ {{ item.label }}
+
+
+
+
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 ab625b01..5f0292e7 100644
--- a/app/components/pub/my-ui/combobox/combobox.vue
+++ b/app/components/pub/my-ui/combobox/combobox.vue
@@ -4,7 +4,7 @@ import { type Item } from './index'
const props = defineProps<{
id?: string
- modelValue?: string
+ modelValue?: string | number
items: Item[]
placeholder?: string
searchPlaceholder?: string
@@ -16,8 +16,8 @@ const props = defineProps<{
const model = defineModel()
const emit = defineEmits<{
- 'update:modelValue': [value: string]
- 'update:searchText': [value: string]
+ 'update:modelValue': [value: string | number]
+ 'update:searchText': [value: string | number]
}>()
const open = ref(false)
diff --git a/app/components/pub/my-ui/combobox/index.ts b/app/components/pub/my-ui/combobox/index.ts
index e4864f7f..f3038de7 100644
--- a/app/components/pub/my-ui/combobox/index.ts
+++ b/app/components/pub/my-ui/combobox/index.ts
@@ -1,5 +1,5 @@
export interface Item {
- value: string
+ value: string | number
label: string
code?: string
priority?: number
@@ -7,12 +7,12 @@ export interface Item {
export function recStrToItem(input: Record): Item[] {
const items: Item[] = []
- let idx = 0;
+ let idx = 0
for (const key in input) {
if (input.hasOwnProperty(key)) {
items.push({
- value: key || ('unknown-' + idx),
- label: input[key] || ('unknown-' + idx),
+ value: key || 'unknown-' + idx,
+ label: input[key] || 'unknown-' + idx,
})
}
idx++
diff --git a/app/components/pub/my-ui/content-switcher/content-switcher.vue b/app/components/pub/my-ui/content-switcher/content-switcher.vue
index 267d94c1..3b79f193 100644
--- a/app/components/pub/my-ui/content-switcher/content-switcher.vue
+++ b/app/components/pub/my-ui/content-switcher/content-switcher.vue
@@ -1,33 +1,40 @@
-
-
-
-
+
+
+
-
@@ -35,24 +42,45 @@ function switchActiveTab() {
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/doc-entry/block.vue b/app/components/pub/my-ui/doc-entry/block.vue
index 7e217542..b51ad72a 100644
--- a/app/components/pub/my-ui/doc-entry/block.vue
+++ b/app/components/pub/my-ui/doc-entry/block.vue
@@ -53,8 +53,8 @@ const settingClass = computed(() => {
'[&_.cell]:2xl:flex',
][getBreakpointIdx(props.cellFlexPoint)]
cls += ' [&_.label]:flex-shrink-0 ' + [
- '[&_.label]:md:w-16 [&_.label]:xl:w-20',
- '[&_.label]:md:w-20 [&_.label]:xl:w-24',
+ '[&_.label]:md:w-12 [&_.label]:xl:w-20',
+ '[&_.label]:md:w-16 [&_.label]:xl:w-24',
'[&_.label]:md:w-24 [&_.label]:xl:w-32',
'[&_.label]:md:w-32 [&_.label]:xl:w-40',
'[&_.label]:md:w-44 [&_.label]:xl:w-52',
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 90236737..d68401bb 100644
--- a/app/components/pub/my-ui/form/file-field.vue
+++ b/app/components/pub/my-ui/form/file-field.vue
@@ -1,8 +1,5 @@
+
+
+
+
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..0227d2b1 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
index 8d60f742..ecfeb054 100644
--- a/app/components/pub/my-ui/menus/submenu.vue
+++ b/app/components/pub/my-ui/menus/submenu.vue
@@ -4,10 +4,6 @@ import { type EncounterItem } from "~/handlers/encounter-init.handler";
const props = defineProps<{
initialActiveMenu: string
data: EncounterItem[]
- canCreate?: boolean
- canRead?: boolean
- canUpdate?: boolean
- canDelete?: boolean
}>()
const activeMenu = ref(props.initialActiveMenu)
@@ -42,12 +38,7 @@ function changeMenu(value: string) {
class="flex-1 rounded-md border bg-white p-4 shadow-sm dark:bg-neutral-950">
+ v-bind="data.find((m) => m.id === activeMenu)?.props" />
diff --git a/app/components/pub/my-ui/nav-footer/index.ts b/app/components/pub/my-ui/nav-footer/index.ts
new file mode 100644
index 00000000..ba848bbf
--- /dev/null
+++ b/app/components/pub/my-ui/nav-footer/index.ts
@@ -0,0 +1 @@
+export type ClickType = 'back' | 'draft' | 'submit'
diff --git a/app/components/pub/my-ui/pagination/pagination.vue b/app/components/pub/my-ui/pagination/pagination.vue
index 9b1618c3..469f966d 100644
--- a/app/components/pub/my-ui/pagination/pagination.vue
+++ b/app/components/pub/my-ui/pagination/pagination.vue
@@ -93,7 +93,7 @@ function getButtonClass(pageNumber: number) {
-