From a0dfd214e59c8295d8f18fedb90dad2b7865697c Mon Sep 17 00:00:00 2001 From: Andrian Roshandy Date: Thu, 4 Dec 2025 10:25:50 +0700 Subject: [PATCH] feat/procedure-room-order: finishing --- .../content/procedure-room-order/entry.vue | 155 ++++++++++++++++-- .../content/procedure-room-order/list.vue | 67 +++++--- .../content/procedure-room-order/main.vue | 5 +- app/models/procedure-room-order.ts | 11 +- app/services/procedure-room-order.service.ts | 26 ++- 5 files changed, 209 insertions(+), 55 deletions(-) diff --git a/app/components/content/procedure-room-order/entry.vue b/app/components/content/procedure-room-order/entry.vue index e691fa9c..ad780e5b 100644 --- a/app/components/content/procedure-room-order/entry.vue +++ b/app/components/content/procedure-room-order/entry.vue @@ -1,40 +1,135 @@ diff --git a/app/components/content/procedure-room-order/list.vue b/app/components/content/procedure-room-order/list.vue index 40f5372d..d742941c 100644 --- a/app/components/content/procedure-room-order/list.vue +++ b/app/components/content/procedure-room-order/list.vue @@ -2,38 +2,37 @@ // Composables import { usePaginatedList } from '~/composables/usePaginatedList' +// Handlers +import type { ToastFn } from '~/handlers/_handler' + // Pubs component import { toast } from '~/components/pub/ui/toast' -import { type HeaderPrep } from '~/components/pub/my-ui/data/types' +import { ActionEvents, type HeaderPrep } from '~/components/pub/my-ui/data/types' import Header from '~/components/pub/my-ui/nav-header/prep.vue' import RecordConfirmation from '~/components/pub/my-ui/confirmation/record-confirmation.vue' -// Handlers +// Order import { recId, recAction, recItem, - isReadonly, isRecordConfirmationOpen, handleActionRemove, - handleActionSave, } from '~/handlers/procedure-room-order.handler' - -// Services -import { getList, getDetail } from '~/services/procedure-room-order.service' -import List from '~/components/app/procedure-room-order/list.vue' +import { getList, create, submit } from '~/services/procedure-room-order.service' import type { ProcedureRoomOrder } from '~/models/procedure-room-order' -// import { submit } from '~/services/prescription.service' -import type { ToastFn } from '~/handlers/_handler' +import List from '~/components/app/procedure-room-order/list.vue' +// Common prep const route = useRoute() const { setQueryParams } = useQueryParam() - -const isSubmitConfirmationOpen = ref(false) +const { crudQueryParams } = useQueryCRUD() const plainEid = route.params.id const encounter_id = (plainEid && typeof plainEid == 'string') ? parseInt(plainEid) : 0 +const isSubmitConfirmationOpen = ref(false) +// Main data const { data, isLoading, @@ -44,7 +43,7 @@ const { fetchFn: async (params: any) => { const result = await getList({ 'encounter-id': encounter_id, - // includes: '', + includes: 'items', search: params.search, page: params.page, 'page-number': params['page-number'] || 0, @@ -55,7 +54,7 @@ const { entityName: 'prescription' }) -const vFn = () => {} // Void function +// Header things const headerPrep: HeaderPrep = { title: 'Order Ruang Tindakan', icon: 'i-lucide-box', @@ -76,17 +75,35 @@ const headerPrep: HeaderPrep = { onClick: async () => { recItem.value = null recId.value = 0 - setQueryParams({ - 'mode': 'entry', - }) + const res = await create({ encounter_id }) + if (res.success) { + crudQueryParams.value = { mode: 'entry', recordId: res.body?.data.id.toString() || '0' } + } }, }, } +// list actions +const timestamp = ref({}) provide('rec_id', recId) provide('rec_action', recAction) provide('rec_item', recItem) provide('table_data_loader', isLoading) +provide('timestamp', timestamp) +watch(recAction, () => { + if (!recAction.value) { + return + } else if (recAction.value === ActionEvents.showDetail) { + crudQueryParams.value = { mode: 'entry', recordId: recId.value || '0' } + } else if (recAction.value === ActionEvents.showConfirmSubmit) { + isSubmitConfirmationOpen.value = true + } else if (recAction.value === ActionEvents.showConfirmDelete) { + isRecordConfirmationOpen.value = true + } + recAction.value = '' +}) + +///// functions function confirmCancel(data: ProcedureRoomOrder) { recId.value = data.id @@ -109,13 +126,13 @@ function confirmSubmit(data: ProcedureRoomOrder) { } async function handleActionSubmit(id: number, refresh: () => void, toast: ToastFn) { - // const result = await submit(id) - // if (result.success) { - // toast({ title: 'Berhasil', description: 'Resep telah di ajukan', variant: 'default' }) - // setTimeout(refresh, 300) - // } else { - // toast({ title: 'Gagal', description: 'Gagal menjalankan perintah', variant: 'destructive' }) - // } + const result = await submit(id) + if (result.success) { + toast({ title: 'Berhasil', description: 'Resep telah di ajukan', variant: 'default' }) + setTimeout(refresh, 300) + } else { + toast({ title: 'Gagal', description: 'Gagal menjalankan perintah', variant: 'destructive' }) + } } @@ -141,7 +158,7 @@ async function handleActionSubmit(id: number, refresh: () => void, toast: ToastF
Tanggal
:
-
{{ recItem.createdAt.substring(0, 10) }}
+
{{ recItem.createdAt?.substring(0, 10) }}
DPJP
diff --git a/app/components/content/procedure-room-order/main.vue b/app/components/content/procedure-room-order/main.vue index 033d093f..61250fe1 100644 --- a/app/components/content/procedure-room-order/main.vue +++ b/app/components/content/procedure-room-order/main.vue @@ -7,10 +7,11 @@ const props = defineProps<{ encounter_id: number }>() -const { mode } = useQueryCRUDMode() +const { crudQueryParams } = useQueryCRUD() diff --git a/app/models/procedure-room-order.ts b/app/models/procedure-room-order.ts index a77ed700..4d1bb8c5 100644 --- a/app/models/procedure-room-order.ts +++ b/app/models/procedure-room-order.ts @@ -4,18 +4,19 @@ import { genProcedureRoom, type ProcedureRoom } from "./procedure-room"; export interface ProcedureRoomOrder extends Base { encounter_id: number - infra_code: string - procedureRoom: ProcedureRoom - materialPackage_code: string + materialPackage_code?: string materialPackage: MaterialPackage + items?: ProcedureRoom[] +} + +export interface CreateDto { + encounter_id: number } export function genProcedureRoomOrder(): ProcedureRoomOrder { return { ...genBase(), encounter_id: 0, - infra_code: '', - procedureRoom: genProcedureRoom(), materialPackage_code: '', materialPackage: genMaterialPackage(), } diff --git a/app/services/procedure-room-order.service.ts b/app/services/procedure-room-order.service.ts index 8dd6bfd0..b5c354c3 100644 --- a/app/services/procedure-room-order.service.ts +++ b/app/services/procedure-room-order.service.ts @@ -1,11 +1,11 @@ // Base -import type { ProcedureRoomOrder } from '~/models/procedure-room-order' +import type { ProcedureRoomOrder, CreateDto } from '~/models/procedure-room-order' import * as base from './_crud-base' -const name = 'procedure-room' +const name = 'procedure-room-order' const path = `/api/v1/${name}` -export function create(data: ProcedureRoomOrder) { +export function create(data: CreateDto) { return base.create(path, data, name) } @@ -13,8 +13,8 @@ export function getList(params: any = null) { return base.getList(path, params, name) } -export function getDetail(id: number | string) { - return base.getDetail(path, id, name) +export function getDetail(id: number | string, params: any = null) { + return base.getDetail(path, id, name, params) } export function update(id: number | string, data: ProcedureRoomOrder) { @@ -24,3 +24,19 @@ export function update(id: number | string, data: ProcedureRoomOrder) { export function remove(id: number | string) { return base.remove(path, id, name) } + + +export async function submit(id: number) { + try { + const resp = await xfetch(`${path}/${id}/submit`, 'PATCH') + const result: any = {} + if (resp.success) { + result.success = resp.success + result.body = (resp.body as Record) || {} + return result + } + } catch (error) { + console.error(`Error submitting ${name}:`, error) + throw new Error(`Failed to submit ${name}`) + } +}