diff --git a/app/components/app/bpjs/control-letter/_common/dropdown-action.vue b/app/components/app/bpjs/control-letter/_common/dropdown-action.vue new file mode 100644 index 00000000..9086c883 --- /dev/null +++ b/app/components/app/bpjs/control-letter/_common/dropdown-action.vue @@ -0,0 +1,90 @@ + + + diff --git a/app/components/app/bpjs/control-letter/_common/history-dialog.vue b/app/components/app/bpjs/control-letter/_common/history-dialog.vue new file mode 100644 index 00000000..00d7b32f --- /dev/null +++ b/app/components/app/bpjs/control-letter/_common/history-dialog.vue @@ -0,0 +1,49 @@ + + + \ No newline at end of file diff --git a/app/components/app/bpjs/control-letter/_common/select-date-range.vue b/app/components/app/bpjs/control-letter/_common/select-date-range.vue new file mode 100644 index 00000000..114f8542 --- /dev/null +++ b/app/components/app/bpjs/control-letter/_common/select-date-range.vue @@ -0,0 +1,104 @@ + + + diff --git a/app/components/app/bpjs/control-letter/_common/select-destination-polyclinic.vue b/app/components/app/bpjs/control-letter/_common/select-destination-polyclinic.vue new file mode 100644 index 00000000..0852195b --- /dev/null +++ b/app/components/app/bpjs/control-letter/_common/select-destination-polyclinic.vue @@ -0,0 +1,70 @@ + + + diff --git a/app/components/app/bpjs/control-letter/_common/select-origin-polyclinic.vue b/app/components/app/bpjs/control-letter/_common/select-origin-polyclinic.vue new file mode 100644 index 00000000..0852195b --- /dev/null +++ b/app/components/app/bpjs/control-letter/_common/select-origin-polyclinic.vue @@ -0,0 +1,70 @@ + + + diff --git a/app/components/app/bpjs/control-letter/filter.vue b/app/components/app/bpjs/control-letter/filter.vue new file mode 100644 index 00000000..50005069 --- /dev/null +++ b/app/components/app/bpjs/control-letter/filter.vue @@ -0,0 +1,128 @@ + + + diff --git a/app/components/app/bpjs/control-letter/list.cfg.ts b/app/components/app/bpjs/control-letter/list.cfg.ts new file mode 100644 index 00000000..8eb7e5f4 --- /dev/null +++ b/app/components/app/bpjs/control-letter/list.cfg.ts @@ -0,0 +1,108 @@ +import type { Config } from '~/components/pub/my-ui/data-table' +import type { Patient } from '~/models/patient' +import { defineAsyncComponent } from 'vue' +import { educationCodes, genderCodes } from '~/lib/constants' +import { calculateAge } from '~/lib/utils' + +const action = defineAsyncComponent(() => import('./_common/dropdown-action.vue')) +const statusBadge = defineAsyncComponent(() => import('~/components/pub/my-ui/badge/status-badge.vue')) + +export const config: Config = { + cols: [{}, {}, {}, {},{}, {}, {}, {}, {}, {width: 90},{width: 10},], + + headers: [ + [ + { label: 'No Surat' }, + { label: 'No MR' }, + { label: 'Nama' }, + { label: 'Tgl Rencana Kontrol' }, + { label: 'Tgl Penerbitan' }, + { label: 'Klinik Asal' }, + { label: 'Klinik Tujuan' }, + { label: 'DPJP' }, + { label: 'No SEP Asal' }, + { label: 'Status' }, + { label: 'Action' }, + ], + ], + + keys: ['birth_date', 'number', 'person.name', 'birth_date', 'birth_date', + 'birth_date', 'number', 'person.name', 'birth_date', 'status', 'action'], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + patientId: (rec: unknown): unknown => { + const patient = rec as Patient + return patient.number + }, + identity_number: (rec: unknown): unknown => { + const { person } = rec as Patient + + if (person.nationality == 'WNA') { + return person.passportNumber + } + + return person.residentIdentityNumber || '-' + }, + birth_date: (rec: unknown): unknown => { + const { person } = rec as Patient + + if (typeof person.birthDate == 'object' && person.birthDate) { + return (person.birthDate as Date).toLocaleDateString('id-ID') + } else if (typeof person.birthDate == 'string') { + return (person.birthDate as string).substring(0, 10) + } + return person.birthDate + }, + patient_age: (rec: unknown): unknown => { + const { person } = rec as Patient + return calculateAge(person.birthDate) + }, + gender: (rec: unknown): unknown => { + const { person } = rec as Patient + + if (typeof person.gender_code == 'number' && person.gender_code >= 0) { + return person.gender_code + } else if (typeof person.gender_code === 'string' && person.gender_code) { + return genderCodes[person.gender_code] || '-' + } + return '-' + }, + education: (rec: unknown): unknown => { + const { person } = rec as Patient + if (typeof person.education_code == 'number' && person.education_code >= 0) { + return person.education_code + } else if (typeof person.education_code === 'string' && person.education_code) { + return educationCodes[person.education_code] || '-' + } + return '-' + }, + }, + + components: { + action(rec, idx) { + return { + idx, + rec: rec as object, + component: action, + } + }, + status(rec, idx) { + return { + idx, + rec: rec as object, + component: statusBadge, + } + }, + }, + + htmls: { + patient_address(_rec) { + return '-' + }, + }, +} diff --git a/app/components/app/bpjs/control-letter/list.vue b/app/components/app/bpjs/control-letter/list.vue new file mode 100644 index 00000000..8274e752 --- /dev/null +++ b/app/components/app/bpjs/control-letter/list.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/app/chemotherapy/action-proses.vue b/app/components/app/chemotherapy/action-proses.vue new file mode 100644 index 00000000..4e2efeb3 --- /dev/null +++ b/app/components/app/chemotherapy/action-proses.vue @@ -0,0 +1,30 @@ + + + + diff --git a/app/components/app/chemotherapy/dialog-verification.vue b/app/components/app/chemotherapy/dialog-verification.vue new file mode 100644 index 00000000..2d617445 --- /dev/null +++ b/app/components/app/chemotherapy/dialog-verification.vue @@ -0,0 +1,164 @@ + + + + diff --git a/app/components/app/chemotherapy/dropdown-action-process.vue b/app/components/app/chemotherapy/dropdown-action-process.vue new file mode 100644 index 00000000..56e14886 --- /dev/null +++ b/app/components/app/chemotherapy/dropdown-action-process.vue @@ -0,0 +1,63 @@ + + + diff --git a/app/components/app/chemotherapy/entry-form.vue b/app/components/app/chemotherapy/entry-form.vue new file mode 100644 index 00000000..39113d63 --- /dev/null +++ b/app/components/app/chemotherapy/entry-form.vue @@ -0,0 +1,302 @@ + + + diff --git a/app/components/app/chemotherapy/list-admin.vue b/app/components/app/chemotherapy/list-admin.vue new file mode 100644 index 00000000..a201f2a1 --- /dev/null +++ b/app/components/app/chemotherapy/list-admin.vue @@ -0,0 +1,37 @@ + + + + diff --git a/app/components/app/chemotherapy/list-cfg.admin.ts b/app/components/app/chemotherapy/list-cfg.admin.ts new file mode 100644 index 00000000..38d77121 --- /dev/null +++ b/app/components/app/chemotherapy/list-cfg.admin.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('./dropdown-action-process.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/chemotherapy/list-cfg.medicine.ts b/app/components/app/chemotherapy/list-cfg.medicine.ts new file mode 100644 index 00000000..103452f5 --- /dev/null +++ b/app/components/app/chemotherapy/list-cfg.medicine.ts @@ -0,0 +1,69 @@ +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: 60 }, + { width: 200 }, + { width: 100 }, + { width: 100 }, + { width: 150 }, + { width: 80 }, + { width: 200 }, + { width: 120 }, + ], + + headers: [ + [ + { label: 'NO.' }, + { label: 'NAMA OBAT' }, + { label: 'DOSIS' }, + { label: 'SATUAN' }, + { label: 'RUTE PEMBERIAN' }, + { label: 'HARI' }, + { label: 'CATATAN' }, + { label: '' }, + ], + ], + + keys: [ + 'number', + 'namaObat', + 'dosis', + 'satuan', + 'rute', + 'hari', + 'catatan', + '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/chemotherapy/list-cfg.protocol.ts b/app/components/app/chemotherapy/list-cfg.protocol.ts new file mode 100644 index 00000000..da678c0f --- /dev/null +++ b/app/components/app/chemotherapy/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/chemotherapy/list-cfg.ts b/app/components/app/chemotherapy/list-cfg.ts new file mode 100644 index 00000000..29c24e6f --- /dev/null +++ b/app/components/app/chemotherapy/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/chemotherapy/list-cfg.verification.ts b/app/components/app/chemotherapy/list-cfg.verification.ts new file mode 100644 index 00000000..e75aa615 --- /dev/null +++ b/app/components/app/chemotherapy/list-cfg.verification.ts @@ -0,0 +1,78 @@ +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) +const verifyButton = defineAsyncComponent(() => import('./verify-button.vue')) + +export const config: Config = { + cols: [ + { width: 120 }, + { width: 150 }, + { width: 150 }, + { width: 150 }, + { width: 150 }, + { width: 180 }, + { width: 150 }, + { width: 100 }, + ], + + headers: [ + [ + { label: 'TANGGAL MASUK' }, + { label: 'PJ BERKAS RM' }, + { label: 'DOKTER' }, + { label: 'JENIS RUANGAN' }, + { label: 'JENIS TINDAKAN' }, + { label: 'TANGGAL JADWAL TINDAKAN' }, + { label: 'STATUS' }, + { label: 'AKSI' }, + ], + ], + + keys: [ + 'tanggalMasuk', + 'pjBerkasRm', + 'dokter', + 'jenisRuangan', + 'jenisTindakan', + 'tanggalJadwalTindakan', + 'status', + '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: { + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: verifyButton, + } + return res + }, + }, + + htmls: {}, +} + diff --git a/app/components/app/chemotherapy/list-cfg.visit.ts b/app/components/app/chemotherapy/list-cfg.visit.ts new file mode 100644 index 00000000..cb242d62 --- /dev/null +++ b/app/components/app/chemotherapy/list-cfg.visit.ts @@ -0,0 +1,99 @@ +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' +import { format, parseISO } from 'date-fns' +import { id as localeID } from 'date-fns/locale' + +type VisitDto = any + +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) +const verifyButton = defineAsyncComponent(() => import('./verify-button.vue')) + +export const config: Config = { + cols: [ + { width: 150 }, // TANGGAL MASUK + { width: 180 }, // PJ BERKAS RM + { width: 200 }, // DOKTER + { width: 150 }, // JENIS RUANGAN + { width: 150 }, // JENIS TINDAKAN + { width: 180 }, // TANGGAL JADWAL TINDAKAN + { width: 150 }, // STATUS + { width: 120 }, // AKSI + ], + + headers: [ + [ + { label: 'TANGGAL MASUK' }, + { label: 'PJ BERKAS RM' }, + { label: 'DOKTER' }, + { label: 'JENIS RUANGAN' }, + { label: 'JENIS TINDAKAN' }, + { label: 'TANGGAL JADWAL TINDAKAN' }, + { label: 'STATUS' }, + { label: 'AKSI' }, + ], + ], + + keys: [ + 'tanggal_masuk', + 'pj_berkas_rm', + 'dokter', + 'jenis_ruangan', + 'jenis_tindakan', + 'tanggal_jadwal_tindakan', + 'status', + 'action', + ], + + delKeyNames: [ + { key: 'id', label: 'ID' }, + { key: 'nama', label: 'Nama' }, + ], + + parses: { + tanggal_masuk: (rec: unknown): string => { + const recX = rec as VisitDto + if (!recX.tanggal_masuk) return '-' + try { + const date = typeof recX.tanggal_masuk === 'string' ? parseISO(recX.tanggal_masuk) : recX.tanggal_masuk + return format(date, 'dd MMMM yyyy', { locale: localeID }) + } catch { + return recX.tanggal_masuk.toString() + } + }, + tanggal_jadwal_tindakan: (rec: unknown): string => { + const recX = rec as VisitDto + if (!recX.tanggal_jadwal_tindakan) return '-' + try { + const date = + typeof recX.tanggal_jadwal_tindakan === 'string' + ? parseISO(recX.tanggal_jadwal_tindakan) + : recX.tanggal_jadwal_tindakan + return format(date, 'dd MMMM yyyy', { locale: localeID }) + } catch { + return recX.tanggal_jadwal_tindakan.toString() + } + }, + }, + + components: { + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: verifyButton, + } + return res + }, + }, + + htmls: {}, +} + diff --git a/app/components/app/chemotherapy/list-verification.vue b/app/components/app/chemotherapy/list-verification.vue new file mode 100644 index 00000000..93120f69 --- /dev/null +++ b/app/components/app/chemotherapy/list-verification.vue @@ -0,0 +1,37 @@ + + + + diff --git a/app/components/app/chemotherapy/list.medicine.vue b/app/components/app/chemotherapy/list.medicine.vue new file mode 100644 index 00000000..748c8cb9 --- /dev/null +++ b/app/components/app/chemotherapy/list.medicine.vue @@ -0,0 +1,76 @@ + + + + diff --git a/app/components/app/chemotherapy/list.protocol.vue b/app/components/app/chemotherapy/list.protocol.vue new file mode 100644 index 00000000..7b5c3234 --- /dev/null +++ b/app/components/app/chemotherapy/list.protocol.vue @@ -0,0 +1,75 @@ + + + diff --git a/app/components/app/chemotherapy/list.register.vue b/app/components/app/chemotherapy/list.register.vue new file mode 100644 index 00000000..131afc04 --- /dev/null +++ b/app/components/app/chemotherapy/list.register.vue @@ -0,0 +1,71 @@ + + + diff --git a/app/components/app/chemotherapy/list.visit.vue b/app/components/app/chemotherapy/list.visit.vue new file mode 100644 index 00000000..de451f31 --- /dev/null +++ b/app/components/app/chemotherapy/list.visit.vue @@ -0,0 +1,45 @@ + + + + diff --git a/app/components/app/chemotherapy/list.vue b/app/components/app/chemotherapy/list.vue new file mode 100644 index 00000000..19642581 --- /dev/null +++ b/app/components/app/chemotherapy/list.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/app/components/app/chemotherapy/sample.ts b/app/components/app/chemotherapy/sample.ts new file mode 100644 index 00000000..082cde66 --- /dev/null +++ b/app/components/app/chemotherapy/sample.ts @@ -0,0 +1,49 @@ +export type ChemotherapyData = { + 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: ChemotherapyData[] = [ + { + 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/app/chemotherapy/status-badge.vue b/app/components/app/chemotherapy/status-badge.vue new file mode 100644 index 00000000..1a7d94ca --- /dev/null +++ b/app/components/app/chemotherapy/status-badge.vue @@ -0,0 +1,28 @@ + + + + diff --git a/app/components/app/chemotherapy/verify-button.vue b/app/components/app/chemotherapy/verify-button.vue new file mode 100644 index 00000000..1d9c2d3a --- /dev/null +++ b/app/components/app/chemotherapy/verify-button.vue @@ -0,0 +1,31 @@ + + + + diff --git a/app/components/app/control-letter/_common/select-date.vue b/app/components/app/control-letter/_common/select-date.vue new file mode 100644 index 00000000..057d0a63 --- /dev/null +++ b/app/components/app/control-letter/_common/select-date.vue @@ -0,0 +1,116 @@ + + + diff --git a/app/components/app/control-letter/_common/select-dpjp.vue b/app/components/app/control-letter/_common/select-dpjp.vue new file mode 100644 index 00000000..2053ebdb --- /dev/null +++ b/app/components/app/control-letter/_common/select-dpjp.vue @@ -0,0 +1,98 @@ + + + diff --git a/app/components/app/control-letter/_common/select-specialist.vue b/app/components/app/control-letter/_common/select-specialist.vue new file mode 100644 index 00000000..cd5ee923 --- /dev/null +++ b/app/components/app/control-letter/_common/select-specialist.vue @@ -0,0 +1,98 @@ + + + diff --git a/app/components/app/control-letter/_common/select-subspecialist.vue b/app/components/app/control-letter/_common/select-subspecialist.vue new file mode 100644 index 00000000..61567c0c --- /dev/null +++ b/app/components/app/control-letter/_common/select-subspecialist.vue @@ -0,0 +1,97 @@ + + + diff --git a/app/components/app/control-letter/_common/select-unit.vue b/app/components/app/control-letter/_common/select-unit.vue new file mode 100644 index 00000000..afe0ca0a --- /dev/null +++ b/app/components/app/control-letter/_common/select-unit.vue @@ -0,0 +1,85 @@ + + + diff --git a/app/components/app/control-letter/entry-form.vue b/app/components/app/control-letter/entry-form.vue new file mode 100644 index 00000000..2517e8b1 --- /dev/null +++ b/app/components/app/control-letter/entry-form.vue @@ -0,0 +1,94 @@ + + + diff --git a/app/components/app/control-letter/list.cfg.ts b/app/components/app/control-letter/list.cfg.ts new file mode 100644 index 00000000..3eb7bd84 --- /dev/null +++ b/app/components/app/control-letter/list.cfg.ts @@ -0,0 +1,64 @@ +import type { Config } from '~/components/pub/my-ui/data-table' +import type { Patient } from '~/models/patient' +import { defineAsyncComponent } from 'vue' +import { educationCodes, genderCodes } from '~/lib/constants' +import { calculateAge } from '~/lib/utils' + +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue')) + +export const config: Config = { + cols: [{width: 180}, {}, {}, {}, {}, {width: 30},], + + headers: [ + [ + { label: 'Tgl Rencana Kontrol' }, + { label: 'Spesialis' }, + { label: 'Sub Spesialis' }, + { label: 'DPJP' }, + { label: 'Status SEP' }, + { label: 'Action' }, + ], + ], + + keys: ['date', 'specialist.name', 'subspecialist.name', 'doctor.employee.person.name', 'sep_status', 'action'], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + date: (rec: unknown): unknown => { + const date = (rec as any).date + if (typeof date == 'object' && date) { + return (date as Date).toLocaleDateString('id-ID') + } else if (typeof date == 'string') { + return (date as string).substring(0, 10) + } + return date + }, + specialist_subspecialist: (rec: unknown): unknown => { + return '-' + }, + dpjp: (rec: unknown): unknown => { + // const { person } = rec as Patient + return '-' + }, + }, + + components: { + action(rec, idx) { + return { + idx, + rec: rec as object, + component: action, + } + }, + }, + + htmls: { + sep_status(_rec) { + return 'SEP Internal' + }, + }, +} diff --git a/app/components/app/control-letter/list.vue b/app/components/app/control-letter/list.vue new file mode 100644 index 00000000..8274e752 --- /dev/null +++ b/app/components/app/control-letter/list.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/app/control-letter/preview.vue b/app/components/app/control-letter/preview.vue new file mode 100644 index 00000000..e10a2b91 --- /dev/null +++ b/app/components/app/control-letter/preview.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/app/components/app/mcu-order-item/list-entry.cfg.ts b/app/components/app/mcu-order-item/list-entry.cfg.ts new file mode 100644 index 00000000..89d85dce --- /dev/null +++ b/app/components/app/mcu-order-item/list-entry.cfg.ts @@ -0,0 +1,43 @@ +import type { Config } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' + +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue')) +const input = defineAsyncComponent(() => import('~/components/pub/ui/input/Input.vue')) + +export const config: Config = { + cols: [{}, {}, { classVal: '!p-0.5' }, { width: 50 }], + + headers: [ + [ + { label: 'Nama' }, + { label: 'Jenis' }, + { label: 'Catatan' }, + { label: '' }, + ], + ], + + keys: ['mcuSrc.name', 'mcuSrc.mcuSrcCategory.name', 'note'], + + delKeyNames: [ + { key: 'mcuSrc.name', label: 'Nama' }, + ], + + components: { + note(rec, idx) { + return { + idx, + rec: rec as object, + component: input, + } + }, + action(rec, idx) { + return { + idx, + rec: rec as object, + component: action, + } + }, + }, + + htmls: {}, +} diff --git a/app/components/app/mcu-order-item/list-entry.vue b/app/components/app/mcu-order-item/list-entry.vue new file mode 100644 index 00000000..6c93c5ac --- /dev/null +++ b/app/components/app/mcu-order-item/list-entry.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/app/mcu-order-item/list.cfg.ts b/app/components/app/mcu-order-item/list.cfg.ts new file mode 100644 index 00000000..2b054379 --- /dev/null +++ b/app/components/app/mcu-order-item/list.cfg.ts @@ -0,0 +1,18 @@ +import type { Config } from '~/components/pub/my-ui/data-table' + +export const config: Config = { + cols: [{}, {}], + + headers: [ + [ + { label: 'Nama' }, + { label: 'Jenis' }, + ], + ], + + keys: ['mcuSrc.name', 'mcuSrcCategory.name'], + + delKeyNames: [ + { key: 'mcuSrc.name', label: 'Nama' }, + ], +} diff --git a/app/components/app/mcu-order-item/list.vue b/app/components/app/mcu-order-item/list.vue new file mode 100644 index 00000000..ef7438c6 --- /dev/null +++ b/app/components/app/mcu-order-item/list.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/app/mcu-order/detail.vue b/app/components/app/mcu-order/detail.vue new file mode 100644 index 00000000..fe161595 --- /dev/null +++ b/app/components/app/mcu-order/detail.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/app/components/app/mcu-order/entry.vue b/app/components/app/mcu-order/entry.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/mcu-order/list-pk.vue b/app/components/app/mcu-order/list-pk.vue new file mode 100644 index 00000000..df296419 --- /dev/null +++ b/app/components/app/mcu-order/list-pk.vue @@ -0,0 +1,64 @@ + + + diff --git a/app/components/app/mcu-order/list.vue b/app/components/app/mcu-order/list.vue new file mode 100644 index 00000000..df296419 --- /dev/null +++ b/app/components/app/mcu-order/list.vue @@ -0,0 +1,64 @@ + + + diff --git a/app/components/app/mcu-src-category/switcher.vue b/app/components/app/mcu-src-category/switcher.vue new file mode 100644 index 00000000..78c54acb --- /dev/null +++ b/app/components/app/mcu-src-category/switcher.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/app/mcu-src/picker-accordion.vue b/app/components/app/mcu-src/picker-accordion.vue new file mode 100644 index 00000000..a42834f9 --- /dev/null +++ b/app/components/app/mcu-src/picker-accordion.vue @@ -0,0 +1,49 @@ + + + diff --git a/app/components/app/medicine-mix/list-entry.ts b/app/components/app/medicine-mix/list-entry.ts new file mode 100644 index 00000000..03202670 --- /dev/null +++ b/app/components/app/medicine-mix/list-entry.ts @@ -0,0 +1,50 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/my-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue')) + +export const cols: Col[] = [{}, {}, {}, {}, {}, {}, { width: 50 }] + +export const header: Th[][] = [ + [ + { label: 'Nama' }, + { label: "Dosis" }, + { label: 'Satuan' }, + { label: '' }, + ], +] + +export const keys = ['name', 'dose', 'uom.name', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + group: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineGroup_code || '-' + }, +} + +export const funcComponent: RecStrFuncComponent = { + action: (rec: unknown, idx: number): RecComponent => { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = {} diff --git a/app/components/app/medicine-mix/list-entry.vue b/app/components/app/medicine-mix/list-entry.vue new file mode 100644 index 00000000..ba0fa689 --- /dev/null +++ b/app/components/app/medicine-mix/list-entry.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/app/prescription-item/list-entry.vue b/app/components/app/prescription-item/list-entry.vue index 5b496b2b..422ebba7 100644 --- a/app/components/app/prescription-item/list-entry.vue +++ b/app/components/app/prescription-item/list-entry.vue @@ -1,14 +1,30 @@ diff --git a/app/components/app/prescription-item/list.cfg.ts b/app/components/app/prescription-item/list.cfg.ts new file mode 100644 index 00000000..fd980bb1 --- /dev/null +++ b/app/components/app/prescription-item/list.cfg.ts @@ -0,0 +1,41 @@ +import type { Config } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +export const config: Config = { + cols: [{}, {}, {}, {}, {}, {}], + + headers: [ + [ + { label: 'Nama' }, + { label: 'Bentuk' }, + { label: 'Freq' }, + { label: 'Dosis' }, + { label: 'Interval' }, + { label: 'Total' }, + ], + ], + + keys: ['name', 'uom_code', 'frequency', 'multiplier', 'interval', 'total'], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + cateogry: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineCategory?.name || '-' + }, + group: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineGroup?.name || '-' + }, + method: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineMethod?.name || '-' + }, + unit: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineUnit?.name || '-' + }, + }, +} diff --git a/app/components/app/prescription-item/list.vue b/app/components/app/prescription-item/list.vue new file mode 100644 index 00000000..ed64b09e --- /dev/null +++ b/app/components/app/prescription-item/list.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/app/prescription-item/mix-entry.vue b/app/components/app/prescription-item/mix-entry.vue new file mode 100644 index 00000000..d9b4881e --- /dev/null +++ b/app/components/app/prescription-item/mix-entry.vue @@ -0,0 +1,113 @@ + + + diff --git a/app/components/app/prescription-item/non-mix-entry.vue b/app/components/app/prescription-item/non-mix-entry.vue new file mode 100644 index 00000000..25970646 --- /dev/null +++ b/app/components/app/prescription-item/non-mix-entry.vue @@ -0,0 +1,90 @@ + + + diff --git a/app/components/app/prescription/detail.vue b/app/components/app/prescription/detail.vue new file mode 100644 index 00000000..694eb9a1 --- /dev/null +++ b/app/components/app/prescription/detail.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/app/components/app/prescription/entry.vue b/app/components/app/prescription/entry.vue index 3b4acf28..ef8756e8 100644 --- a/app/components/app/prescription/entry.vue +++ b/app/components/app/prescription/entry.vue @@ -1,32 +1,36 @@ diff --git a/app/components/app/prescription/list-entry.vue b/app/components/app/prescription/list-entry.vue new file mode 100644 index 00000000..aa768000 --- /dev/null +++ b/app/components/app/prescription/list-entry.vue @@ -0,0 +1,88 @@ + + + + + + diff --git a/app/components/app/prescription/list-with-sub.vue b/app/components/app/prescription/list-with-sub.vue new file mode 100644 index 00000000..14bc1785 --- /dev/null +++ b/app/components/app/prescription/list-with-sub.vue @@ -0,0 +1,56 @@ + + + diff --git a/app/components/app/prescription/list.vue b/app/components/app/prescription/list.vue index 6fe27d39..ae5126ca 100644 --- a/app/components/app/prescription/list.vue +++ b/app/components/app/prescription/list.vue @@ -1,5 +1,37 @@ + + diff --git a/app/components/content/bpjs/control-letter/list.vue b/app/components/content/bpjs/control-letter/list.vue new file mode 100644 index 00000000..66ed00a5 --- /dev/null +++ b/app/components/content/bpjs/control-letter/list.vue @@ -0,0 +1,220 @@ + + + diff --git a/app/components/content/chemotherapy/admin-list.vue b/app/components/content/chemotherapy/admin-list.vue new file mode 100644 index 00000000..be6d5810 --- /dev/null +++ b/app/components/content/chemotherapy/admin-list.vue @@ -0,0 +1,150 @@ + + + + diff --git a/app/components/content/chemotherapy/list.vue b/app/components/content/chemotherapy/list.vue new file mode 100644 index 00000000..d4104f03 --- /dev/null +++ b/app/components/content/chemotherapy/list.vue @@ -0,0 +1,75 @@ + + + diff --git a/app/components/content/chemotherapy/process.vue b/app/components/content/chemotherapy/process.vue new file mode 100644 index 00000000..7f355b4b --- /dev/null +++ b/app/components/content/chemotherapy/process.vue @@ -0,0 +1,7 @@ + + + diff --git a/app/components/content/chemotherapy/protocol.vue b/app/components/content/chemotherapy/protocol.vue new file mode 100644 index 00000000..82050d79 --- /dev/null +++ b/app/components/content/chemotherapy/protocol.vue @@ -0,0 +1,106 @@ + + + diff --git a/app/components/content/chemotherapy/verification.vue b/app/components/content/chemotherapy/verification.vue new file mode 100644 index 00000000..3243547a --- /dev/null +++ b/app/components/content/chemotherapy/verification.vue @@ -0,0 +1,241 @@ + + + + diff --git a/app/components/content/control-letter/add.vue b/app/components/content/control-letter/add.vue new file mode 100644 index 00000000..44f03a2f --- /dev/null +++ b/app/components/content/control-letter/add.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/app/components/content/control-letter/detail.vue b/app/components/content/control-letter/detail.vue new file mode 100644 index 00000000..d9019d57 --- /dev/null +++ b/app/components/content/control-letter/detail.vue @@ -0,0 +1,79 @@ + + + diff --git a/app/components/content/control-letter/edit.vue b/app/components/content/control-letter/edit.vue new file mode 100644 index 00000000..99a5c282 --- /dev/null +++ b/app/components/content/control-letter/edit.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/app/components/content/control-letter/list.vue b/app/components/content/control-letter/list.vue new file mode 100644 index 00000000..c9353057 --- /dev/null +++ b/app/components/content/control-letter/list.vue @@ -0,0 +1,176 @@ + + + diff --git a/app/components/content/cp-lab-order/entry.vue b/app/components/content/cp-lab-order/entry.vue new file mode 100644 index 00000000..4d0aa002 --- /dev/null +++ b/app/components/content/cp-lab-order/entry.vue @@ -0,0 +1,155 @@ + + + diff --git a/app/components/content/cp-lab-order/list.vue b/app/components/content/cp-lab-order/list.vue new file mode 100644 index 00000000..73b9361c --- /dev/null +++ b/app/components/content/cp-lab-order/list.vue @@ -0,0 +1,169 @@ + + + diff --git a/app/components/content/cp-lab-order/main.vue b/app/components/content/cp-lab-order/main.vue new file mode 100644 index 00000000..033d093f --- /dev/null +++ b/app/components/content/cp-lab-order/main.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/content/encounter/home.vue b/app/components/content/encounter/home.vue new file mode 100644 index 00000000..1f2c2943 --- /dev/null +++ b/app/components/content/encounter/home.vue @@ -0,0 +1,190 @@ + + + diff --git a/app/components/content/encounter/process.vue b/app/components/content/encounter/process.vue index ad93387d..23640af7 100644 --- a/app/components/content/encounter/process.vue +++ b/app/components/content/encounter/process.vue @@ -14,8 +14,11 @@ import Status from '~/components/content/encounter/status.vue' import AssesmentFunctionList from '~/components/content/soapi/entry.vue' import EarlyMedicalAssesmentList from '~/components/content/soapi/entry.vue' import EarlyMedicalRehabList from '~/components/content/soapi/entry.vue' -import PrescriptionList from '~/components/content/prescription/list.vue' +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 ControlLetterList from '~/components/content/control-letter/list.vue' const route = useRoute() const router = useRouter() @@ -60,17 +63,17 @@ const tabs: TabItem[] = [ { value: 'education-assessment', label: 'Asesmen Kebutuhan Edukasi' }, { value: 'consent', label: 'General Consent' }, { value: 'patient-note', label: 'CPRJ' }, - { value: 'prescription', label: 'Order Obat', component: PrescriptionList }, + { value: 'prescription', label: 'Order Obat', component: Prescription, props: { encounter_id: data.id } }, { value: 'device', label: 'Order Alkes' }, - { value: 'mcu-radiology', label: 'Order Radiologi' }, - { value: 'mcu-lab-pc', label: 'Order Lab PK' }, + { 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' }, { value: 'mcu-result', label: 'Hasil Penunjang' }, { value: 'consultation', label: 'Konsultasi', component: Consultation, props: { encounter: data } }, { value: 'resume', label: 'Resume' }, - { value: 'control', label: 'Surat Kontrol' }, + { value: 'control', label: 'Surat Kontrol', component: ControlLetterList, props: { encounter: data } }, { value: 'screening', label: 'Skrinning MPP' }, { value: 'supporting-document', label: 'Upload Dokumen Pendukung' }, ] diff --git a/app/components/content/prescription/entry.vue b/app/components/content/prescription/entry.vue new file mode 100644 index 00000000..4b3fa663 --- /dev/null +++ b/app/components/content/prescription/entry.vue @@ -0,0 +1,132 @@ + + + diff --git a/app/components/content/prescription/list.vue b/app/components/content/prescription/list.vue index f8059b9d..844cb04f 100644 --- a/app/components/content/prescription/list.vue +++ b/app/components/content/prescription/list.vue @@ -1,37 +1,82 @@ diff --git a/app/components/content/prescription/main.vue b/app/components/content/prescription/main.vue new file mode 100644 index 00000000..033d093f --- /dev/null +++ b/app/components/content/prescription/main.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/content/radiology-order/entry.vue b/app/components/content/radiology-order/entry.vue new file mode 100644 index 00000000..4d0aa002 --- /dev/null +++ b/app/components/content/radiology-order/entry.vue @@ -0,0 +1,155 @@ + + + diff --git a/app/components/content/radiology-order/list.vue b/app/components/content/radiology-order/list.vue new file mode 100644 index 00000000..b2c8571d --- /dev/null +++ b/app/components/content/radiology-order/list.vue @@ -0,0 +1,169 @@ + + + diff --git a/app/components/content/radiology-order/main.vue b/app/components/content/radiology-order/main.vue new file mode 100644 index 00000000..033d093f --- /dev/null +++ b/app/components/content/radiology-order/main.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/layout/AppSidebar.vue b/app/components/layout/AppSidebar.vue index 4f51e42c..a14b2137 100644 --- a/app/components/layout/AppSidebar.vue +++ b/app/components/layout/AppSidebar.vue @@ -1,5 +1,12 @@ diff --git a/app/components/pub/my-ui/nav-footer/ba-dr-su.vue b/app/components/pub/my-ui/nav-footer/ba-dr-su.vue index 4598817b..8c292758 100644 --- a/app/components/pub/my-ui/nav-footer/ba-dr-su.vue +++ b/app/components/pub/my-ui/nav-footer/ba-dr-su.vue @@ -1,10 +1,12 @@ + + diff --git a/app/components/pub/my-ui/nav-header/filter.vue b/app/components/pub/my-ui/nav-header/filter.vue index ab28620b..74f6d8dc 100644 --- a/app/components/pub/my-ui/nav-header/filter.vue +++ b/app/components/pub/my-ui/nav-header/filter.vue @@ -5,11 +5,13 @@ import type { Ref } from 'vue' import type { DateRange } from 'radix-vue' import { CalendarDate, DateFormatter, getLocalTimeZone } from '@internationalized/date' import { cn } from '~/lib/utils' -import type { HeaderPrep, RefSearchNav } from '~/components/pub/my-ui/data/types' +import type { HeaderPrep, RefExportNav, RefSearchNav } from '~/components/pub/my-ui/data/types' const props = defineProps<{ prep: HeaderPrep refSearchNav?: RefSearchNav + enableExport?: boolean + refExportNav?: RefExportNav }>() // function emitSearchNavClick() { @@ -57,7 +59,7 @@ function onFilterClick() { diff --git a/app/components/pub/my-ui/nav-header/prep.vue b/app/components/pub/my-ui/nav-header/prep.vue index 63535847..7aa5e4f2 100644 --- a/app/components/pub/my-ui/nav-header/prep.vue +++ b/app/components/pub/my-ui/nav-header/prep.vue @@ -30,15 +30,24 @@ function btnClick() {
- {{ props.prep.title }} + {{ prep.title }}
+
+ +
+import { ref, inject } from "vue" +// import Toggle from '~/components/pub/ui/toggle/Toggle.vue' + +const props = defineProps<{ + label: string, + providedKey?: string, + variant?: 'default' | 'outline' | null | undefined +}>() + +const model = defineModel() +const provideKey = props.providedKey || 'toggle-provide' +const { updateProvidedVal } = inject(provideKey) + +watch(model, (newVal) => { + updateProvidedVal(newVal) +}) + + + diff --git a/app/components/pub/ui/button/index.ts b/app/components/pub/ui/button/index.ts index c4063089..43c75876 100644 --- a/app/components/pub/ui/button/index.ts +++ b/app/components/pub/ui/button/index.ts @@ -19,7 +19,7 @@ export const buttonVariants = cva( link: 'text-primary underline-offset-4 hover:underline', }, size: { - default: 'md:h8 2xl:h-9 px-4 py-2', + default: 'md:h-8 2xl:h-9 px-4 py-2', xs: 'h-7 rounded px-2', sm: 'h-8 rounded-md px-3 text-xs', lg: 'h-10 rounded-md px-8', diff --git a/app/components/pub/ui/toggle/index.ts b/app/components/pub/ui/toggle/index.ts index 07acae50..9486e903 100644 --- a/app/components/pub/ui/toggle/index.ts +++ b/app/components/pub/ui/toggle/index.ts @@ -4,16 +4,16 @@ import { cva } from 'class-variance-authority' export { default as Toggle } from './Toggle.vue' export const toggleVariants = cva( - 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground', + 'inline-flex items-center justify-center rounded-md text-xs 2xl:text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground', { variants: { variant: { default: 'bg-transparent', outline: - 'border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground', + 'border border-slate-300 bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground', }, size: { - default: 'h-9 px-3', + default: 'md:h-8 2xl:h-9 px-3', sm: 'h-8 px-2', lg: 'h-10 px-3', }, diff --git a/app/handlers/control-letter.handler.ts b/app/handlers/control-letter.handler.ts new file mode 100644 index 00000000..b096a178 --- /dev/null +++ b/app/handlers/control-letter.handler.ts @@ -0,0 +1,24 @@ +// Handlers +import { genCrudHandler } from '~/handlers/_handler' + +// Services +import { create, update, remove } from '~/services/control-letter.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ + create, + update, + remove, +}) diff --git a/app/handlers/mcu-order-item.handler.ts b/app/handlers/mcu-order-item.handler.ts new file mode 100644 index 00000000..62e1861e --- /dev/null +++ b/app/handlers/mcu-order-item.handler.ts @@ -0,0 +1,17 @@ +import { createCrudHandler, genCrudHandler } from '~/handlers/_handler' +import { create, update, remove } from '~/services/prescription.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ create, update, remove}) diff --git a/app/handlers/mcu-order.handler.ts b/app/handlers/mcu-order.handler.ts new file mode 100644 index 00000000..4b114dfc --- /dev/null +++ b/app/handlers/mcu-order.handler.ts @@ -0,0 +1,17 @@ +import { createCrudHandler, genCrudHandler } from '~/handlers/_handler' +import { create, update, remove } from '~/services/mcu-order.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ create, update, remove}) diff --git a/app/handlers/mcu-src-category.handler.ts b/app/handlers/mcu-src-category.handler.ts new file mode 100644 index 00000000..8369666b --- /dev/null +++ b/app/handlers/mcu-src-category.handler.ts @@ -0,0 +1,24 @@ +// Handlers +import { genCrudHandler } from '~/handlers/_handler' + +// Services +import { create, update, remove } from '~/services/mcu-src-category.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ + create, + update, + remove, +}) diff --git a/app/handlers/prescription-item.handler.ts b/app/handlers/prescription-item.handler.ts new file mode 100644 index 00000000..70450970 --- /dev/null +++ b/app/handlers/prescription-item.handler.ts @@ -0,0 +1,17 @@ +import { createCrudHandler, genCrudHandler } from '~/handlers/_handler' +import { create, update, remove } from '~/services/prescription-item.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ create, update, remove}) diff --git a/app/handlers/prescription.handler.ts b/app/handlers/prescription.handler.ts new file mode 100644 index 00000000..62e1861e --- /dev/null +++ b/app/handlers/prescription.handler.ts @@ -0,0 +1,17 @@ +import { createCrudHandler, genCrudHandler } from '~/handlers/_handler' +import { create, update, remove } from '~/services/prescription.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ create, update, remove}) diff --git a/app/lib/date.ts b/app/lib/date.ts index 502a6cfb..2c7b92cf 100644 --- a/app/lib/date.ts +++ b/app/lib/date.ts @@ -41,4 +41,12 @@ export function getAge(dateString: string, comparedDate?: string): { idFormat: s idFormat, extFormat }; +} + +export function formatDateYyyyMmDd(isoDateString: string): string { + const date = new Date(isoDateString); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; } \ No newline at end of file diff --git a/app/lib/page-permission.ts b/app/lib/page-permission.ts index 1b70af31..ab7b5550 100644 --- a/app/lib/page-permission.ts +++ b/app/lib/page-permission.ts @@ -2,67 +2,67 @@ import type { RoleAccess } from '~/models/role' export const PAGE_PERMISSIONS = { '/patient': { - doctor: ['R'], - nurse: ['R'], - admisi: ['C', 'R', 'U', 'D'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['R'], + 'emp|nur': ['R'], + 'emp|reg': ['C', 'R', 'U', 'D'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/doctor': { - doctor: ['C', 'R', 'U', 'D'], - nurse: ['R'], - admisi: ['R'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['C', 'R', 'U', 'D'], + 'emp|nur': ['R'], + 'emp|reg': ['R'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/satusehat': { - doctor: ['R'], - nurse: ['R'], - admisi: ['C', 'R', 'U', 'D'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['R'], + 'emp|nur': ['R'], + 'emp|reg': ['C', 'R', 'U', 'D'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/outpatient/encounter': { - doctor: ['C', 'R', 'U', 'D'], - nurse: ['C', 'R', 'U', 'D'], - admisi: ['R'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['C', 'R', 'U', 'D'], + 'emp|nur': ['C', 'R', 'U', 'D'], + 'emp|reg': ['R'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/emergency/encounter': { - doctor: ['C', 'R', 'U', 'D'], - nurse: ['C', 'R', 'U', 'D'], - admisi: ['R'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['C', 'R', 'U', 'D'], + 'emp|nur': ['C', 'R', 'U', 'D'], + 'emp|reg': ['R'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/inpatient/encounter': { - doctor: ['C', 'R', 'U', 'D'], - nurse: ['C', 'R', 'U', 'D'], - admisi: ['R'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['C', 'R', 'U', 'D'], + 'emp|nur': ['C', 'R', 'U', 'D'], + 'emp|reg': ['R'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/rehab/encounter': { - doctor: ['C', 'R', 'U', 'D'], - nurse: ['R'], - admisi: ['R'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['C', 'R', 'U', 'D'], + 'emp|nur': ['R'], + 'emp|reg': ['R'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, '/rehab/registration': { - doctor: ['C', 'R', 'U', 'D'], - nurse: ['R'], - admisi: ['R'], - pharmacy: ['R'], - billing: ['R'], - management: ['R'], + 'emp|doc': ['C', 'R', 'U', 'D'], + 'emp|nur': ['R'], + 'emp|reg': ['R'], + 'emp|pha': ['R'], + 'emp|pay': ['R'], + 'emp|mng': ['R'], }, } as const satisfies Record diff --git a/app/models/consultation.ts b/app/models/consultation.ts index 09d050a8..595d628e 100644 --- a/app/models/consultation.ts +++ b/app/models/consultation.ts @@ -28,9 +28,10 @@ export interface DeleteDto { export function genCreateDto(): CreateDto { return { + date: '', encounter_id: 0, problem: '', - unit_id: 0, + dstUnit_id: 0, } } diff --git a/app/models/control-letter.ts b/app/models/control-letter.ts new file mode 100644 index 00000000..8f520212 --- /dev/null +++ b/app/models/control-letter.ts @@ -0,0 +1,37 @@ +import { type Base, genBase } from "./_base" +import { genDoctor, type Doctor } from "./doctor" +import { genEncounter, type Encounter } from "./encounter" +import { genSpecialist, type Specialist } from "./specialist" +import { genSubspecialist, type Subspecialist } from "./subspecialist" +import { genUnit, type Unit } from "./unit" + +export interface ControlLetter extends Base { + encounter_id: number + encounter: Encounter + unit_id: number + unit: Unit + specialist_id: number + specialist: Specialist + subspecialist_id: number + subspecialist: Subspecialist + doctor_id: number + doctor: Doctor + date: '' +} + +export function genControlLetter(): ControlLetter { + return { + ...genBase(), + encounter_id: 0, + encounter: genEncounter(), + unit_id: 0, + unit: genUnit(), + specialist_id: 0, + specialist: genSpecialist(), + subspecialist_id: 0, + subspecialist: genSubspecialist(), + doctor_id: 0, + doctor: genDoctor(), + date: '' + } +} diff --git a/app/models/doctor.ts b/app/models/doctor.ts index 3f517476..1b631907 100644 --- a/app/models/doctor.ts +++ b/app/models/doctor.ts @@ -8,10 +8,11 @@ export interface Doctor extends Base { employee: Employee ihs_number: string sip_number: string - unit_id?: number - specialist_id?: number + code?: string + unit_icode?: number + specialist_icode?: number specialist?: Specialist - subspecialist_id?: number + subspecialist_icode?: number subspecialist?: Subspecialist bpjs_code?: string } @@ -21,9 +22,9 @@ export interface CreateDto { employee_id: number ihs_number: string sip_number: string - unit_id?: number - specialist_id?: number - subspecialist_id?: number + unit_code?: number + specialist_code?: number + subspecialist_code?: number bpjs_code: string } diff --git a/app/models/mcu-order.ts b/app/models/mcu-order.ts index e3899aab..35e4018c 100644 --- a/app/models/mcu-order.ts +++ b/app/models/mcu-order.ts @@ -1,14 +1,18 @@ import { type Base, genBase } from "./_base" +import { type Doctor, genDoctor } from "./doctor" +import type { McuOrderItem } from "./mcu-order-item" export interface McuOrder extends Base { encounter_id: number doctor_id: number + doctor: Doctor status_code?: string specimenPickTime: string examinationDate: string number?: number temperature?: number mcuUrgencyLevel_code?: string + items: McuOrderItem[] } export function genMcuOrder(): McuOrder { @@ -16,8 +20,10 @@ export function genMcuOrder(): McuOrder { ...genBase(), encounter_id: 0, doctor_id: 0, + doctor: genDoctor(), specimenPickTime: '', - examinationDate: '' + examinationDate: '', + items: [] } } diff --git a/app/models/prescription.ts b/app/models/prescription.ts index 543724d2..12d5eb9d 100644 --- a/app/models/prescription.ts +++ b/app/models/prescription.ts @@ -1,10 +1,10 @@ +import { type Base, genBase } from "./_base"; import { type Encounter, genEncounter } from "./encounter"; import { type Doctor, genDoctor } from "./doctor"; import { type PrescriptionItem } from "./prescription-item"; import type { SpecialistIntern } from "./specialist-intern"; -export interface Prescription { - id: number +export interface Prescription extends Base { encounter_id: number encounter: Encounter doctor_id: number @@ -44,7 +44,7 @@ export interface DeleteDto { export function genPresciption(): Prescription { return { - id: 0, + ...genBase(), encounter_id: 0, encounter: genEncounter(), doctor_id: 0, diff --git a/app/pages/(features)/integration/bpjs/control-letter/index.vue b/app/pages/(features)/integration/bpjs/control-letter/index.vue new file mode 100644 index 00000000..8dcb9006 --- /dev/null +++ b/app/pages/(features)/integration/bpjs/control-letter/index.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/pages/(features)/integration/bpjs/sep/add.vue b/app/pages/(features)/integration/bpjs/sep/add.vue index 5db12aac..0658780b 100644 --- a/app/pages/(features)/integration/bpjs/sep/add.vue +++ b/app/pages/(features)/integration/bpjs/sep/add.vue @@ -22,12 +22,12 @@ const { checkRole, hasCreateAccess } = useRBAC() // Check if user has access to this page const hasAccess = checkRole(roleAccess) -if (!hasAccess) { - throw createError({ - statusCode: 403, - statusMessage: 'Access denied', - }) -} +// if (!hasAccess) { +// throw createError({ +// statusCode: 403, +// statusMessage: 'Access denied', +// }) +// } // Define permission-based computed properties const canCreate = true // hasCreateAccess(roleAccess) diff --git a/app/pages/(features)/integration/bpjs/sep/index.vue b/app/pages/(features)/integration/bpjs/sep/index.vue index b8ec57c4..d99dbb5d 100644 --- a/app/pages/(features)/integration/bpjs/sep/index.vue +++ b/app/pages/(features)/integration/bpjs/sep/index.vue @@ -22,9 +22,9 @@ const { checkRole, hasReadAccess } = useRBAC() // Check if user has access to this page const hasAccess = checkRole(roleAccess) -if (!hasAccess) { - navigateTo('/403') -} +// if (!hasAccess) { +// navigateTo('/403') +// } // Define permission-based computed properties const canRead = true // hasReadAccess(roleAccess) diff --git a/app/pages/(features)/outpatient/encounter/[id]/index.vue b/app/pages/(features)/outpatient/encounter/[id]/index.vue new file mode 100644 index 00000000..1864cf2c --- /dev/null +++ b/app/pages/(features)/outpatient/encounter/[id]/index.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/pages/(features)/outpation-action/cemotherapy/index.vue b/app/pages/(features)/outpation-action/cemotherapy/index.vue deleted file mode 100644 index 50485cec..00000000 --- a/app/pages/(features)/outpation-action/cemotherapy/index.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/pages/(features)/outpation-action/chemotherapy/[mode]/[id]/verification.vue b/app/pages/(features)/outpation-action/chemotherapy/[mode]/[id]/verification.vue new file mode 100644 index 00000000..ef936ff2 --- /dev/null +++ b/app/pages/(features)/outpation-action/chemotherapy/[mode]/[id]/verification.vue @@ -0,0 +1,47 @@ + + + diff --git a/app/pages/(features)/outpation-action/chemotherapy/[mode]/index.vue b/app/pages/(features)/outpation-action/chemotherapy/[mode]/index.vue new file mode 100644 index 00000000..cf33691a --- /dev/null +++ b/app/pages/(features)/outpation-action/chemotherapy/[mode]/index.vue @@ -0,0 +1,55 @@ + + + + diff --git a/app/pages/(features)/outpation-action/chemotherapy/index.vue b/app/pages/(features)/outpation-action/chemotherapy/index.vue new file mode 100644 index 00000000..a2dfdea5 --- /dev/null +++ b/app/pages/(features)/outpation-action/chemotherapy/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/pages/(features)/outpation-action/chemotherapy/list.vue b/app/pages/(features)/outpation-action/chemotherapy/list.vue new file mode 100644 index 00000000..a141baaa --- /dev/null +++ b/app/pages/(features)/outpation-action/chemotherapy/list.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/pages/(features)/rehab/examination-queue/index.vue b/app/pages/(features)/rehab/encounter-queue/index.vue similarity index 100% rename from app/pages/(features)/rehab/examination-queue/index.vue rename to app/pages/(features)/rehab/encounter-queue/index.vue diff --git a/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/edit.vue b/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/edit.vue new file mode 100644 index 00000000..cc5d182f --- /dev/null +++ b/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/edit.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/index.vue b/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/index.vue new file mode 100644 index 00000000..612315ad --- /dev/null +++ b/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/index.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/pages/(features)/rehab/encounter/[id]/control-letter/add.vue b/app/pages/(features)/rehab/encounter/[id]/control-letter/add.vue new file mode 100644 index 00000000..1070a29f --- /dev/null +++ b/app/pages/(features)/rehab/encounter/[id]/control-letter/add.vue @@ -0,0 +1,42 @@ + + + diff --git a/app/pages/(features)/rehab/encounter/[id]/process.vue b/app/pages/(features)/rehab/encounter/[id]/process.vue index 3fa7525a..abd0efa7 100644 --- a/app/pages/(features)/rehab/encounter/[id]/process.vue +++ b/app/pages/(features)/rehab/encounter/[id]/process.vue @@ -22,15 +22,15 @@ const { checkRole, hasCreateAccess } = useRBAC() // Check if user has access to this page const hasAccess = checkRole(roleAccess) -if (!hasAccess) { - throw createError({ - statusCode: 403, - statusMessage: 'Access denied', - }) -} +// if (!hasAccess) { +// throw createError({ +// statusCode: 403, +// statusMessage: 'Access denied', +// }) +// } // Define permission-based computed properties -const canCreate = hasCreateAccess(roleAccess) +const canCreate = true // hasCreateAccess(roleAccess)