diff --git a/app/components/app/cemotherapy/entry-form.vue b/app/components/app/cemotherapy/entry-form.vue new file mode 100644 index 00000000..3a4104b8 --- /dev/null +++ b/app/components/app/cemotherapy/entry-form.vue @@ -0,0 +1,302 @@ + + + + + + + Data Pasien + + + Nama Pasien + + + + + + Tanggal Lahir + + + + + + No. RM + + + + + + Alamat + + + + + + Berat Badan + + + + + + Tinggi Badan + + + + + + Diagnosa + + + + + + + + + + Protokol Kemoterapi + + + Siklus + + + + + + Periode + + + + + Sampai + + + + + + + Tanggal Kemoterapi + + + + + + Dokter Ruang Tindakan + + + + + + + + + + + Kembali + + + Simpan + + + + diff --git a/app/components/app/cemotherapy/list-cfg.protocol.ts b/app/components/app/cemotherapy/list-cfg.protocol.ts new file mode 100644 index 00000000..da678c0f --- /dev/null +++ b/app/components/app/cemotherapy/list-cfg.protocol.ts @@ -0,0 +1,62 @@ +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +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: 50 }, + ], + + headers: [ + [ + { label: 'NO.' }, + { label: 'TANGGAL' }, + { label: 'SIKLUS' }, + { label: 'PERIODE KEMOTERAPI' }, + { label: 'KEHADIRAN' }, + { label: '' }, + ], + ], + + keys: [ + 'number', + 'tanggal', + 'siklus', + 'periode', + 'kehadiran', + 'action', + ], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + parent: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + 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/cemotherapy/list-cfg.ts b/app/components/app/cemotherapy/list-cfg.ts new file mode 100644 index 00000000..29c24e6f --- /dev/null +++ b/app/components/app/cemotherapy/list-cfg.ts @@ -0,0 +1,80 @@ +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +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: 120 }, + { width: 120 }, + { width: 120 }, + { width: 120 }, + { width: 50 }, + ], + + headers: [ + [ + { label: 'TANGGAL' }, + { label: 'NO. RM' }, + { label: 'NO. BILL' }, + { label: 'JK' }, + { label: 'ALAMAT' }, + { label: 'KLINIK ASAL' }, + { label: 'NAMA DOKTER' }, + { label: 'CARA BAYAR' }, + { label: 'RUJUKAN' }, + { label: 'KET. RUJUKAN' }, + { label: 'ASAL' }, + { label: '' }, + ], + ], + + keys: [ + 'tanggal', + 'noRm', + 'noBill', + 'jk', + 'alamat', + 'klinik', + 'dokter', + 'caraBayar', + 'rujukan', + 'ketRujukan', + 'asal', + 'action', + ], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + parent: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + 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/cemotherapy/list.protocol.vue b/app/components/app/cemotherapy/list.protocol.vue new file mode 100644 index 00000000..7b5c3234 --- /dev/null +++ b/app/components/app/cemotherapy/list.protocol.vue @@ -0,0 +1,75 @@ + + + + + + + + + Protokol Kemoterapi + Rangkaian prosedur kemoterapi yang terintegrasi dan konsisten. + + + + Tambah Protokol Kemoterapi + + + + + + + + + + + + + + + diff --git a/app/components/app/cemotherapy/list.vue b/app/components/app/cemotherapy/list.vue new file mode 100644 index 00000000..19642581 --- /dev/null +++ b/app/components/app/cemotherapy/list.vue @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/app/components/app/cemotherapy/sample.ts b/app/components/app/cemotherapy/sample.ts new file mode 100644 index 00000000..24b9ebbf --- /dev/null +++ b/app/components/app/cemotherapy/sample.ts @@ -0,0 +1,49 @@ +export type CemotherapyData = { + id: number + tanggal: 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: CemotherapyData[] = [ + { + id: 1, + tanggal: '12 Agustus 2025', + 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, + tanggal: '11 Agustus 2025', + 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/content/cemotherapy/list.vue b/app/components/content/cemotherapy/list.vue new file mode 100644 index 00000000..957a827f --- /dev/null +++ b/app/components/content/cemotherapy/list.vue @@ -0,0 +1,75 @@ + + + + + + Daftar Kunjungan Rawat Jalan Kemoterapi + + Manajemen pendaftaran serta monitoring terapi pasien tindakan rawat jalan + + + + + + + + + + + - + + + + Filter + + + + + + + diff --git a/app/components/content/cemotherapy/protocol.vue b/app/components/content/cemotherapy/protocol.vue new file mode 100644 index 00000000..427b4642 --- /dev/null +++ b/app/components/content/cemotherapy/protocol.vue @@ -0,0 +1,106 @@ + + + + + + + + + + + diff --git a/app/pages/(features)/outpation-action/cemotherapy/index.vue b/app/pages/(features)/outpation-action/cemotherapy/index.vue index 50485cec..06da4369 100644 --- a/app/pages/(features)/outpation-action/cemotherapy/index.vue +++ b/app/pages/(features)/outpation-action/cemotherapy/index.vue @@ -1,10 +1,7 @@ - - Hello world!! - You are accessing "{{ route.fullPath }}" - + diff --git a/app/pages/(features)/outpation-action/cemotherapy/list.vue b/app/pages/(features)/outpation-action/cemotherapy/list.vue new file mode 100644 index 00000000..02326343 --- /dev/null +++ b/app/pages/(features)/outpation-action/cemotherapy/list.vue @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/app/schemas/cemotherapy.schema.ts b/app/schemas/cemotherapy.schema.ts new file mode 100644 index 00000000..df00c200 --- /dev/null +++ b/app/schemas/cemotherapy.schema.ts @@ -0,0 +1,73 @@ +import { z } from 'zod' + +const dateStringSchema = z.string().min(1) + +export const cemotherapySchema = z.object({ + // Data Pasien + namaPasien: z.string({ + required_error: 'Nama pasien harus diisi', + }).min(1, 'Nama pasien harus diisi'), + + tanggalLahir: z.string({ + required_error: 'Tanggal lahir harus diisi', + }).min(1, 'Tanggal lahir harus diisi'), + + noRM: z.string({ + required_error: 'Nomor RM harus diisi', + }).min(1, 'Nomor RM harus diisi'), + + alamat: z.string({ + required_error: 'Alamat harus diisi', + }).min(1, 'Alamat harus diisi'), + + beratBadan: z.union([ + z.string(), + z.number() + ]).transform(val => val === '' ? null : Number(val)) + .refine(val => val === null || (val >= 0 && val <= 500), { + message: 'Berat badan harus di antara 0-500 kg', + }), + + tinggiBadan: z.union([ + z.string(), + z.number() + ]).transform(val => val === '' ? null : Number(val)) + .refine(val => val === null || (val >= 0 && val <= 300), { + message: 'Tinggi badan harus di antara 0-300 cm', + }), + + diagnosa: z.string({ + required_error: 'Diagnosa harus dipilih', + }).min(1, 'Diagnosa harus dipilih'), + + // Protokol Kemoterapi + siklus: z.string({ + required_error: 'Siklus harus diisi', + }).min(1, 'Siklus harus diisi'), + + periodeAwal: z.string({ + required_error: 'Periode awal harus diisi', + }).min(1, 'Periode awal harus diisi'), + + periodeAkhir: dateStringSchema.refine((val) => { + if (!val) return false + const date = new Date(val) + return !isNaN(date.getTime()) + }, { + message: 'Format tanggal tidak valid' + }), + + tanggalKemoterapi: dateStringSchema.refine((val) => { + if (!val) return false + const date = new Date(val) + return !isNaN(date.getTime()) + }, { + message: 'Format tanggal tidak valid' + }), + + dokterKRJ: z.string({ + required_error: 'Dokter harus dipilih', + }).refine(val => val !== '', { + message: 'Dokter harus dipilih', + }), +}) \ No newline at end of file
Rangkaian prosedur kemoterapi yang terintegrasi dan konsisten.
+ Manajemen pendaftaran serta monitoring terapi pasien tindakan rawat jalan +