diff --git a/app/components/app/action-report/entry-form.vue b/app/components/app/action-report/entry-form.vue new file mode 100644 index 00000000..2479e1c7 --- /dev/null +++ b/app/components/app/action-report/entry-form.vue @@ -0,0 +1,468 @@ + + + diff --git a/app/components/app/action-report/fields/fill-notes.vue b/app/components/app/action-report/fields/fill-notes.vue new file mode 100644 index 00000000..41c948c5 --- /dev/null +++ b/app/components/app/action-report/fields/fill-notes.vue @@ -0,0 +1,65 @@ + + diff --git a/app/components/app/action-report/fields/index.ts b/app/components/app/action-report/fields/index.ts new file mode 100644 index 00000000..ea1a0e72 --- /dev/null +++ b/app/components/app/action-report/fields/index.ts @@ -0,0 +1,10 @@ +export { default as FillNotes } from './fill-notes.vue' +export { default as RadioBloods } from './radio-bloods.vue' +export { default as SelectBilling } from './select-billing.vue' +export { default as SelectBirthPlace } from './select-birth-place.vue' +export { default as SelectBirthType } from './select-birth-type.vue' +export { default as SelectOperationSystem } from './select-operation-system.vue' +export { default as SelectOperationType } from './select-operation-type.vue' +export { default as SelectSpecimen } from './select-specimen.vue' +export { default as SelectSurgeryCounter } from './select-surgery-counter.vue' +export { default as SelectSurgeryType } from './select-surgery-type.vue' diff --git a/app/components/app/action-report/fields/radio-bloods.vue b/app/components/app/action-report/fields/radio-bloods.vue new file mode 100644 index 00000000..9bdaa187 --- /dev/null +++ b/app/components/app/action-report/fields/radio-bloods.vue @@ -0,0 +1,101 @@ + + + diff --git a/app/components/app/action-report/fields/select-billing.vue b/app/components/app/action-report/fields/select-billing.vue new file mode 100644 index 00000000..f8df074e --- /dev/null +++ b/app/components/app/action-report/fields/select-billing.vue @@ -0,0 +1,68 @@ + + + diff --git a/app/components/app/action-report/fields/select-birth-place.vue b/app/components/app/action-report/fields/select-birth-place.vue new file mode 100644 index 00000000..b2314129 --- /dev/null +++ b/app/components/app/action-report/fields/select-birth-place.vue @@ -0,0 +1,71 @@ + + + diff --git a/app/components/app/action-report/fields/select-birth-type.vue b/app/components/app/action-report/fields/select-birth-type.vue new file mode 100644 index 00000000..537e8282 --- /dev/null +++ b/app/components/app/action-report/fields/select-birth-type.vue @@ -0,0 +1,67 @@ + + + diff --git a/app/components/app/action-report/fields/select-operation-system.vue b/app/components/app/action-report/fields/select-operation-system.vue new file mode 100644 index 00000000..bae300b2 --- /dev/null +++ b/app/components/app/action-report/fields/select-operation-system.vue @@ -0,0 +1,69 @@ + + + diff --git a/app/components/app/action-report/fields/select-operation-type.vue b/app/components/app/action-report/fields/select-operation-type.vue new file mode 100644 index 00000000..e05a4196 --- /dev/null +++ b/app/components/app/action-report/fields/select-operation-type.vue @@ -0,0 +1,69 @@ + + + diff --git a/app/components/app/action-report/fields/select-specimen.vue b/app/components/app/action-report/fields/select-specimen.vue new file mode 100644 index 00000000..9be2bb93 --- /dev/null +++ b/app/components/app/action-report/fields/select-specimen.vue @@ -0,0 +1,69 @@ + + + diff --git a/app/components/app/action-report/fields/select-surgery-counter.vue b/app/components/app/action-report/fields/select-surgery-counter.vue new file mode 100644 index 00000000..2c682529 --- /dev/null +++ b/app/components/app/action-report/fields/select-surgery-counter.vue @@ -0,0 +1,67 @@ + + + diff --git a/app/components/app/action-report/fields/select-surgery-type.vue b/app/components/app/action-report/fields/select-surgery-type.vue new file mode 100644 index 00000000..2c59438a --- /dev/null +++ b/app/components/app/action-report/fields/select-surgery-type.vue @@ -0,0 +1,69 @@ + + + diff --git a/app/components/app/action-report/list-history.cfg.ts b/app/components/app/action-report/list-history.cfg.ts new file mode 100644 index 00000000..d943bc7d --- /dev/null +++ b/app/components/app/action-report/list-history.cfg.ts @@ -0,0 +1,88 @@ +import { defineAsyncComponent } from 'vue' + +import { format } from 'date-fns' +import { id } from 'date-fns/locale' + +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import type { ActionReportData } from '~/components/app/action-report/sample' +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-d.vue')) + +export const config: Config = { + cols: [ + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 50 }, + ], + + headers: [ + [ + { label: 'TANGGAL LAPORAN' }, + { label: 'DPJP' }, + { label: 'OPERATOR' }, + { label: 'TANGGAL PEMBEDAHAN' }, + { label: 'JENIS OPERASI' }, + { label: 'KODE BILLING' }, + { label: 'SISTEM OPERASI' }, + { label: 'AKSI' }, + ], + ], + + keys: ['reportAt', 'dpjp', 'operator', 'operationAt', 'operationType', 'billing', 'system', 'action'], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + reportAt: (rec: unknown): unknown => { + const attr = (rec as ActionReportData).reportAt + const result = format(new Date(attr), 'd MMMM yyyy, HH:mm', { locale: id }) + + return result + }, + operationAt: (rec: unknown): unknown => { + const attr = (rec as ActionReportData).operationAt + const result = format(new Date(attr), 'd MMMM yyyy', { locale: id }) + + return result + }, + system: (rec: unknown): unknown => { + return 'Cito' + }, + operator: (rec: unknown): unknown => { + return 'dr. Dewi Arum Sawitri, Sp.An' + }, + billing: (rec: unknown): unknown => { + return 'General' + }, + operationType: (rec: unknown): unknown => { + return 'Besar' + }, + dpjp: (rec: unknown): unknown => { + return 'dr. Irwansyah Kurniawan Sp.Bo' + }, + parent: (rec: unknown): unknown => { + const recX = rec as any + return recX.parent?.name || '-' + }, + }, + + components: { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + }, + + htmls: {}, +} diff --git a/app/components/app/action-report/list-history.vue b/app/components/app/action-report/list-history.vue new file mode 100644 index 00000000..6ad7dd81 --- /dev/null +++ b/app/components/app/action-report/list-history.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/components/app/action-report/list.cfg.ts b/app/components/app/action-report/list.cfg.ts new file mode 100644 index 00000000..13a78728 --- /dev/null +++ b/app/components/app/action-report/list.cfg.ts @@ -0,0 +1,89 @@ +import { defineAsyncComponent } from 'vue' + +import { format } from 'date-fns' +import { id } from 'date-fns/locale' + +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import type { ActionReportData } from '~/components/app/action-report/sample' +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue')) + +export const config: Config = { + cols: [ + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 50 }, + ], + + headers: [ + [ + { label: 'TANGGAL LAPORAN' }, + { label: 'DPJP' }, + { label: 'OPERATOR' }, + { label: 'TANGGAL PEMBEDAHAN' }, + { label: 'JENIS OPERASI' }, + { label: 'KODE BILLING' }, + { label: 'SISTEM OPERASI' }, + { label: 'AKSI' }, + ], + ], + + keys: ['reportAt', 'dpjp', 'operator', 'operationAt', 'operationType', 'billing', 'system', 'action'], + + delKeyNames: [ + { key: 'id', label: 'ID' }, + { key: 'dokter', label: 'Dokter' }, + { key: 'reportAt', label: 'Tanggal Laporan' }, + ], + + parses: { + reportAt: (rec: unknown): unknown => { + const attr = (rec as ActionReportData).reportAt + const result = format(new Date(attr), 'd MMMM yyyy, HH:mm', { locale: id }) + + return result + }, + operationAt: (rec: unknown): unknown => { + const attr = (rec as ActionReportData).operationAt + const result = format(new Date(attr), 'd MMMM yyyy', { locale: id }) + + return result + }, + system: (rec: unknown): unknown => { + return 'Cito' + }, + operator: (rec: unknown): unknown => { + return 'dr. Dewi Arum Sawitri, Sp.An' + }, + billing: (rec: unknown): unknown => { + return 'General' + }, + operationType: (rec: unknown): unknown => { + return 'Besar' + }, + dpjp: (rec: unknown): unknown => { + return 'dr. Irwansyah Kurniawan Sp.Bo' + }, + parent: (rec: unknown): unknown => { + const recX = rec as any + return recX.parent?.name || '-' + }, + }, + + components: { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + }, + + htmls: {}, +} diff --git a/app/components/app/action-report/list.vue b/app/components/app/action-report/list.vue new file mode 100644 index 00000000..6ad7dd81 --- /dev/null +++ b/app/components/app/action-report/list.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/components/app/action-report/preview.vue b/app/components/app/action-report/preview.vue new file mode 100644 index 00000000..fa113333 --- /dev/null +++ b/app/components/app/action-report/preview.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/app/components/app/action-report/sample.ts b/app/components/app/action-report/sample.ts new file mode 100644 index 00000000..b067e859 --- /dev/null +++ b/app/components/app/action-report/sample.ts @@ -0,0 +1,54 @@ +import { addWeeks, formatISO } from 'date-fns' + +export type ActionReportData = { + id: number + reportAt: string + operationAt: string + noRm: string + noBill: string + nama: string + jk: string + alamat: string + klinik: string + dokter: string + caraBayar: string + rujukan: string + ketRujukan: string + asal: string +} + +export const sampleRows: ActionReportData[] = [ + { + id: 1, + reportAt: formatISO(addWeeks(new Date(), -1)), + operationAt: formatISO(addWeeks(new Date(), 1)), + noRm: 'RM23311224', + noBill: '-', + nama: 'Ahmad Baidowi', + jk: 'L', + alamat: 'Jl Jaksa Agung S. No. 9', + klinik: 'Penyakit dalam', + dokter: 'Dr. Andreas Sutaji', + caraBayar: 'JKN', + rujukan: 'Faskes BPJS', + ketRujukan: 'RUMAH SAKIT - RS Lawang Medika - Malang', + asal: 'Rawat Jalan Reguler', + }, + { + id: 2, + reportAt: new Date().toISOString(), + operationAt: formatISO(addWeeks(new Date(), 2)), + noRm: 'RM23455667', + noBill: '-', + nama: 'Abraham Sulaiman', + jk: 'L', + alamat: 'Purwantoro, Blimbing', + klinik: 'Penyakit dalam', + dokter: 'Dr. Andreas Sutaji', + caraBayar: 'JKN', + rujukan: 'Faskes BPJS', + ketRujukan: 'RUMAH SAKIT - RS Lawang Medika - Malang', + asal: 'Rawat Jalan Reguler', + }, + // tambahkan lebih banyak baris contoh jika perlu +] diff --git a/app/components/app/doctor/fields/index.ts b/app/components/app/doctor/fields/index.ts new file mode 100644 index 00000000..32d92f2f --- /dev/null +++ b/app/components/app/doctor/fields/index.ts @@ -0,0 +1 @@ +export { default as SelectDoctor } from './select-doctor.vue' diff --git a/app/components/app/doctor/fields/select-doctor.vue b/app/components/app/doctor/fields/select-doctor.vue new file mode 100644 index 00000000..8921350c --- /dev/null +++ b/app/components/app/doctor/fields/select-doctor.vue @@ -0,0 +1,72 @@ + + + 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 @@ 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 @@ + + + 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 @@ + + + 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/encounter/process.vue b/app/components/content/encounter/process.vue index 58b26000..5bbf9c53 100644 --- a/app/components/content/encounter/process.vue +++ b/app/components/content/encounter/process.vue @@ -29,6 +29,7 @@ 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' @@ -57,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) => { @@ -124,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/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/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/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 @@ + + + diff --git a/app/components/pub/my-ui/form/file-field.vue b/app/components/pub/my-ui/form/file-field.vue index b995ca56..125ece00 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 @@ 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 @@