diff --git a/app/components/app/cprj/entry.vue b/app/components/app/cprj/entry.vue new file mode 100644 index 00000000..d03bbf77 --- /dev/null +++ b/app/components/app/cprj/entry.vue @@ -0,0 +1,146 @@ + + + + + + + Data Petugas + + + + + + PPA + + + + + + + Nama PPA + + + + + + + + + Data S.O.A.P + + + + + + Subjektif + + + + + + + Objektif + + + + + + + + Assesmen + + + + + + + Plan + + + + + + + + Review + + + + + + + + + + diff --git a/app/components/app/cprj/list.cfg.ts b/app/components/app/cprj/list.cfg.ts new file mode 100644 index 00000000..a394e81d --- /dev/null +++ b/app/components/app/cprj/list.cfg.ts @@ -0,0 +1,56 @@ +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: 'PPA' }, + { label: 'Hasil' }, + { label: 'Review & Verifikasi' }, + { label: 'Status' }, + { label: 'Aksi' }, + ], + ], + keys: ['date', 'ppa', 'result', 'review', 'status', 'action'], + delKeyNames: [ + { key: 'data', label: 'Tanggal' }, + { key: 'dstDoctor.name', label: 'Dokter' }, + ], + parses: { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + props: { + size: 'sm', + }, + } + return res + }, + date(rec) { + const recX = rec as GeneralConsent + return recX.date?.substring(0, 10) || '-' + }, + }, + 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/cprj/list.vue b/app/components/app/cprj/list.vue new file mode 100644 index 00000000..46f595f5 --- /dev/null +++ b/app/components/app/cprj/list.vue @@ -0,0 +1,34 @@ + + + + + + + + + diff --git a/app/components/app/soapi/list-cfg.ts b/app/components/app/soapi/list-cfg.ts index 648297c4..3db1b24a 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-dud.vue')) +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue')) export const config: Config = { cols: [{}, {}, {}, { width: 100 }, { width: 120 }, {}, {}, {}, { width: 100 }, { width: 100 }, {}, { width: 50 }], @@ -20,7 +20,7 @@ export const config: Config = { ], ], - keys: ['time', 'employee_id', 'main_complaint', 'encounter_id', 'diagnose', 'status', 'action'], + keys: ['time', 'employee_id', 'main_complaint', 'encounter', 'diagnose', 'status', 'action'], delKeyNames: [ { key: 'code', label: 'Kode' }, @@ -44,6 +44,10 @@ export const config: Config = { return '-' } }, + encounter(rec: any) { + const data = rec?.encounter ?? {} + return data?.class_code || '-' + }, diagnose(rec: any) { const { value } = rec ?? {} diff --git a/app/components/content/cprj/entry.vue b/app/components/content/cprj/entry.vue new file mode 100644 index 00000000..5769e967 --- /dev/null +++ b/app/components/content/cprj/entry.vue @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/components/content/cprj/form.vue b/app/components/content/cprj/form.vue new file mode 100644 index 00000000..ef2a51d7 --- /dev/null +++ b/app/components/content/cprj/form.vue @@ -0,0 +1,74 @@ + + + + + + + diff --git a/app/components/content/cprj/list.vue b/app/components/content/cprj/list.vue new file mode 100644 index 00000000..109bea6b --- /dev/null +++ b/app/components/content/cprj/list.vue @@ -0,0 +1,183 @@ + + + + + + + + + handleActionRemove(recId, getMyList, toast)" + @cancel="" + > + + + + ID: + {{ record?.id }} + + + Nama: + {{ record.name }} + + + Kode: + {{ record.code }} + + + + + diff --git a/app/components/content/document-upload/list.vue b/app/components/content/document-upload/list.vue index d1f6fbad..7f7631d9 100644 --- a/app/components/content/document-upload/list.vue +++ b/app/components/content/document-upload/list.vue @@ -20,8 +20,8 @@ const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter'] const { getPagePermissions } = useRBAC() const pagePermission = getPagePermissions(roleAccess) -const {user,userRole} = useUserStore() -const {getUserPermissions} = useRBAC() +// const {user,userRole} = useUserStore() +// const {getUserPermissions} = useRBAC() // #endregion // #region State @@ -121,6 +121,7 @@ watch([recId, recAction, timestamp], () => { case ActionEvents.showDetail: isDocPreviewDialogOpen.value = true break + case ActionEvents.showEdit: if(pagePermission.canUpdate){ navigateTo({ @@ -131,22 +132,13 @@ watch([recId, recAction, timestamp], () => { unauthorizedToast() } break + case ActionEvents.showConfirmDelete: if(pagePermission.canDelete){ isRecordConfirmationOpen.value = true } else { unauthorizedToast() } - navigateTo(recItem.value.filePath, { external: true, open: { target: '_blank' } }) - break - case ActionEvents.showEdit: - navigateTo({ - name: 'rehab-encounter-id-document-upload-document_id-edit', - params: { id: encounterId, "document_id": recId.value }, - }) - break - case ActionEvents.showConfirmDelete: - isRecordConfirmationOpen.value = true break } }) diff --git a/app/components/content/encounter/process.vue b/app/components/content/encounter/process.vue index 4e0da61b..02fc7495 100644 --- a/app/components/content/encounter/process.vue +++ b/app/components/content/encounter/process.vue @@ -21,6 +21,7 @@ import Prescription from '~/components/content/prescription/main.vue' 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 DocUploadList from '~/components/content/document-upload/list.vue' import GeneralConsentList from '~/components/content/general-consent/entry.vue' import ResumeList from '~/components/content/resume/list.vue' @@ -42,9 +43,10 @@ const data = ref(genEncounter()) async function fetchDetail() { const res = await getDetail(id, { - includes: 'patient,patient-person,patient-person-addresses,unit,Appointment_Doctor,Appointment_Doctor-employee,Appointment_Doctor-employee-person,EncounterDocuments', + includes: + 'patient,patient-person,patient-person-addresses,unit,Appointment_Doctor,Appointment_Doctor-employee,Appointment_Doctor-employee-person,EncounterDocuments', }) - if(res.body?.data) data.value = res.body?.data + if (res.body?.data) data.value = res.body?.data } onMounted(() => { @@ -73,12 +75,13 @@ const tabs: TabItem[] = [ }, { value: 'therapy-protocol', label: 'Protokol Terapi' }, { value: 'education-assessment', label: 'Asesmen Kebutuhan Edukasi' }, + { value: 'patient-note', label: 'CPRJ', component: Cprj, props: { encounter: data } }, { value: 'consent', label: 'General Consent', component: GeneralConsentList, props: { encounter: data } }, - { value: 'patient-note', label: 'CPRJ' }, { 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: '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: 'device', label: 'Order Alkes' }, + { value: 'mcu-radiology', label: 'Order Radiologi', component: Radiology, props: { encounter_id: data.id } }, + { value: 'mcu-lab-cp', label: 'Order Lab PK', component: CpLabOrder, props: { encounter_id: data.id } }, { value: 'mcu-lab-micro', label: 'Order Lab Mikro' }, { value: 'mcu-lab-pa', label: 'Order Lab PA' }, { value: 'medical-action', label: 'Order Ruang Tindakan' }, @@ -87,7 +90,12 @@ const tabs: TabItem[] = [ { 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: 'supporting-document', label: 'Upload Dokumen Pendukung', component: DocUploadList, props: { encounter: data }, }, + { + value: 'supporting-document', + label: 'Upload Dokumen Pendukung', + component: DocUploadList, + props: { encounter: data }, + }, ] diff --git a/app/components/content/soapi/entry.vue b/app/components/content/soapi/entry.vue index ee3c7c32..d4e960f3 100644 --- a/app/components/content/soapi/entry.vue +++ b/app/components/content/soapi/entry.vue @@ -24,12 +24,7 @@ const ActiveForm = computed(() => formMap[type.value] || EarlyForm) - - + ({ async function getDiagnoses() { isLoading.isTableLoading = true - const resp = await xfetch('/api/v1/diagnose-src') + const resp = await xfetch(`/api/v1/soapi/${recordId}`) if (resp.success) { diagnoses.value = (resp.body as Record).data } @@ -77,6 +78,7 @@ function handleOpen(type: string) { const entryRef = ref() async function actionHandler(type: string) { + console.log(type) if (type === 'back') { backToList() return diff --git a/app/components/content/soapi/list.vue b/app/components/content/soapi/list.vue index 5a960d5d..a23d8434 100644 --- a/app/components/content/soapi/list.vue +++ b/app/components/content/soapi/list.vue @@ -22,10 +22,14 @@ interface Props { encounter: Encounter label: string } -const route = useRoute() const props = defineProps() const emits = defineEmits(['add', 'edit']) +const { recordId } = useQueryCRUDRecordId() +const { goToEntry, backToList } = useQueryCRUDMode('mode') +const router = useRouter() +const route = useRoute() + const data = ref([]) const encounterId = ref(props?.encounter?.id || 0) const title = ref('') @@ -56,13 +60,10 @@ const hreaderPrep: HeaderPrep = { icon: 'i-lucide-users', addNav: { label: 'Tambah', - onClick: () => emits('add'), + onClick: () => goToEntry(), }, } -const { recordId } = useQueryCRUDRecordId() -const { goToEntry, backToList } = useQueryCRUDMode('mode') - const type = computed(() => (route.query.tab as string) || 'early-medical-assessment') onMounted(async () => { @@ -70,13 +71,24 @@ onMounted(async () => { }) async function getMyList() { - const url = `/api/v1/soapi?type-code=${typeCode.value}?includes=encounter` + const url = `/api/v1/soapi?typeCode=${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 } } +const goEdit = (id: string) => { + router.replace({ + path: route.path, + query: { + ...route.query, + mode: 'entry', + 'record-id': id, + }, + }) +} + function handlePageChange(page: number) { emits('pageChange', page) } @@ -142,6 +154,14 @@ watch([recId, recAction], () => { } }) +// watch(recId, () => { +// console.log('recId', recId.value) +// console.log('recIdaacin', recAction.value) +// if (recAction.value === 'showEdit') { +// goEdit(recId.value) +// } +// }) + provide('rec_id', recId) provide('rec_action', recAction) provide('rec_item', recItem) diff --git a/app/schemas/soapi.schema.ts b/app/schemas/soapi.schema.ts index 50ade93e..2f5f8667 100644 --- a/app/schemas/soapi.schema.ts +++ b/app/schemas/soapi.schema.ts @@ -179,6 +179,14 @@ const InstructionSchema = z.object({ other: z.string().default(''), }) +export const CprjSoapiSchema = z.object({ + subjective: z.string().default(''), + objective: z.string().default(''), + assesment: z.string().default(''), + plan: z.string().default(''), + review: z.string().default(''), +}) + export const SoapSchema = z.object({ subject: SubjectSchema, object: ObjectSchema,
+ ID: + {{ record?.id }} +
+ Nama: + {{ record.name }} +
+ Kode: + {{ record.code }} +