-
+
- No. RM
+ Tgl. Lahir
+
{{ data.patient.person.birthDate?.substring(0, 10) }}
- Jenis Kelamin
+ Jns. Kelamin
+
- {{ data.patient.person.gender_code }}
+ {{ genderCodes[data.patient.person.gender_code as keyof typeof genderCodes] }}
Alamat
+
-
+ {{ addressText }}
-
+
- Tgl. Kunjungan
+ Tgl. Masuk
+
{{ data.visitDate.substring(0, 10) }}
- Klinik
+ Poliklinik
+
{{ data.unit?.name }}
- DPJP
+ Diagnosa
+
- {{ dpjp }}
+ {{ data.unit?.name }}
-
+
- Billing
+ DPJP
+
+
+ {{ dpjpText }}
+
+
+
+ Pembayaran
+
+
+ {{ paymentMethodText }}
+
+
+
+
+ Billing
+
+
Rp. 000.000
diff --git a/app/components/app/encounter/quick-shortcut.vue b/app/components/app/encounter/quick-shortcut.vue
new file mode 100644
index 00000000..1ca7b23d
--- /dev/null
+++ b/app/components/app/encounter/quick-shortcut.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
Akses Cepat:
+
+
+
+
+
+
+
+
diff --git a/app/components/app/encounter/status-badge.vue b/app/components/app/encounter/status-badge.vue
index c8d4cd06..2ddd6549 100644
--- a/app/components/app/encounter/status-badge.vue
+++ b/app/components/app/encounter/status-badge.vue
@@ -12,7 +12,7 @@ const statusCodeColors: Record = {
review: 'fresh',
process: 'fresh',
done: 'positive',
- canceled: 'destructive',
+ cancel: 'destructive',
rejected: 'destructive',
skiped: 'negative',
}
diff --git a/app/components/app/encounter/status.vue b/app/components/app/encounter/status.vue
deleted file mode 100644
index e45c0a78..00000000
--- a/app/components/app/encounter/status.vue
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
- Hello World!!!
-
\ No newline at end of file
diff --git a/app/components/app/general-consent/entry.vue b/app/components/app/general-consent/entry.vue
new file mode 100644
index 00000000..75e30cec
--- /dev/null
+++ b/app/components/app/general-consent/entry.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
diff --git a/app/components/app/general-consent/list.cfg.ts b/app/components/app/general-consent/list.cfg.ts
new file mode 100644
index 00000000..c2f57c54
--- /dev/null
+++ b/app/components/app/general-consent/list.cfg.ts
@@ -0,0 +1,82 @@
+import type { Config, RecComponent, RecStrFuncComponent, RecStrFuncUnknown } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { GeneralConsent } from '~/models/general-consent'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+export const config: Config = {
+ cols: [{ width: 100 }, {}, {}, {}, { width: 50 }],
+ headers: [
+ [
+ { label: 'Tanggal' },
+ { label: 'Anggota Keluarga' },
+ { label: 'Penanggung Jawab' },
+ { label: 'Pemberi Informasi' },
+ { label: 'Saksi 1' },
+ { label: 'Saksi 2' },
+ { label: '' },
+ ],
+ ],
+ keys: ['date', 'relatives', 'responsible', 'informant', 'witness1', 'witness2', 'action'],
+ delKeyNames: [
+ { key: 'data', label: 'Tanggal' },
+ { key: 'dstDoctor.name', label: 'Dokter' },
+ ],
+ parses: {
+ date(rec) {
+ const recX = rec as GeneralConsent
+ return recX?.createdAt?.substring(0, 10) || '-'
+ },
+ relatives(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.relatives?.join(', ') || '-'
+ },
+ responsible(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.responsible || '-'
+ },
+ informant(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.informant || '-'
+ },
+ witness1(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.witness1 || '-'
+ },
+ witness2(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.witness2 || '-'
+ },
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ } as RecStrFuncComponent,
+ htmls: {} as RecStrFuncUnknown,
+}
diff --git a/app/components/app/general-consent/list.vue b/app/components/app/general-consent/list.vue
new file mode 100644
index 00000000..46f595f5
--- /dev/null
+++ b/app/components/app/general-consent/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/app/components/app/icd/list-cfg.ts b/app/components/app/icd/list-cfg.ts
index c413e737..44a43eb4 100644
--- a/app/components/app/icd/list-cfg.ts
+++ b/app/components/app/icd/list-cfg.ts
@@ -7,94 +7,18 @@ const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dr
const statusBadge = defineAsyncComponent(() => import('./status-badge.vue'))
export const config: Config = {
- cols: [
- {},
- {},
- {},
- { width: 100 },
- { width: 120 },
- {},
- {},
- {},
- { width: 100 },
- { width: 100 },
- {},
- { width: 50 },
- ],
+ cols: [{}, {}, {}, {}],
- headers: [
- [
- { label: 'Nama' },
- { label: 'Rekam Medis' },
- { label: 'KTP' },
- { label: 'Tgl Lahir' },
- { label: 'Umur' },
- { label: 'JK' },
- { label: 'Pendidikan' },
- { label: 'Status' },
- { label: '' },
- ],
- ],
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
- keys: [
- 'name',
- 'medicalRecord_number',
- 'identity_number',
- 'birth_date',
- 'patient_age',
- 'gender',
- 'education',
- 'status',
- 'action',
- ],
+ keys: ['code', 'name', 'indName', 'action'],
delKeyNames: [
{ key: 'code', label: 'Kode' },
{ key: 'name', label: 'Nama' },
],
- parses: {
- name: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- return `${recX.firstName} ${recX.middleName || ''} ${recX.lastName || ''}`
- },
- identity_number: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (recX.identity_number?.substring(0, 5) === 'BLANK') {
- return '(TANPA NIK)'
- }
- return recX.identity_number
- },
- birth_date: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (typeof recX.birth_date == 'object' && recX.birth_date) {
- return (recX.birth_date as Date).toLocaleDateString()
- } else if (typeof recX.birth_date == 'string') {
- return (recX.birth_date as string).substring(0, 10)
- }
- return recX.birth_date
- },
- patient_age: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- return recX.birth_date?.split('T')[0]
- },
- gender: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (typeof recX?.gender_code !== 'number' && recX?.gender_code !== '') {
- return 'Tidak Diketahui'
- }
- return recX.gender_code
- },
- education: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (typeof recX.education_code == 'number' && recX.education_code >= 0) {
- return recX.education_code
- } else if (typeof recX.education_code) {
- return recX.education_code
- }
- return '-'
- },
- },
+ parses: {},
components: {
action(rec, idx) {
diff --git a/app/components/app/icd/multiselect-picker.vue b/app/components/app/icd/multiselect-picker.vue
index ce4dbd80..e8f03084 100644
--- a/app/components/app/icd/multiselect-picker.vue
+++ b/app/components/app/icd/multiselect-picker.vue
@@ -2,7 +2,7 @@
import { config } from './list-cfg'
defineProps<{ data: any[] }>()
-const modelValue = defineModel()
+const modelValue = defineModel('modelValue', { default: [] })
diff --git a/app/components/app/icd/preview.vue b/app/components/app/icd/preview.vue
index 36bb193c..3c3d7d1f 100644
--- a/app/components/app/icd/preview.vue
+++ b/app/components/app/icd/preview.vue
@@ -1,8 +1,5 @@
@@ -30,12 +27,19 @@ function removeItem(id: number) {
-
+
{{ i + 1 }}
- {{ item.diagnosa }}
- {{ item.icd }}
+ {{ item.code }}
+ {{ item.name }}
-
diff --git a/app/components/app/initial-nursing/entry-form.vue b/app/components/app/initial-nursing/entry-form.vue
new file mode 100644
index 00000000..acca54fb
--- /dev/null
+++ b/app/components/app/initial-nursing/entry-form.vue
@@ -0,0 +1,524 @@
+
+
+
+
+
diff --git a/app/components/app/initial-nursing/list-cfg.ts b/app/components/app/initial-nursing/list-cfg.ts
new file mode 100644
index 00000000..4461a35b
--- /dev/null
+++ b/app/components/app/initial-nursing/list-cfg.ts
@@ -0,0 +1,73 @@
+import type { Config } 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-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 100 }, { width: 120 }, {}, {}, {}, { width: 100 }, { width: 50 }],
+
+ headers: [
+ [{ label: 'Tanggal' }, { label: 'Diagnosa' }, { label: 'Tanggal Selesai' }, { label: 'Staff' }, { label: 'Aksi' }],
+ ],
+
+ keys: ['date', 'diagnosa', 'finishDate', 'staff', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ time(rec: any) {
+ return rec.time ? new Date(rec.time).toLocaleDateString() : ''
+ },
+ main_complaint(rec: any) {
+ const { value } = rec ?? {}
+
+ if (typeof value !== 'string') return '-'
+
+ try {
+ const parsed = JSON.parse(value)
+ console.log('parsed', parsed)
+ return parsed?.['prim-compl'] || '-'
+ } catch {
+ return '-'
+ }
+ },
+ encounter(rec: any) {
+ const data = rec?.encounter ?? {}
+ return data?.class_code || '-'
+ },
+ diagnose(rec: any) {
+ const { value } = rec ?? {}
+
+ if (typeof value !== 'string') return '-'
+
+ try {
+ const parsed = JSON.parse(value)
+ const diagnose = parsed?.diagnose || []
+ return diagnose.map((d: any) => d.name).join(', ')
+ } catch {
+ return '-'
+ }
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+ patient_address(_rec) {
+ return '-'
+ },
+ },
+}
diff --git a/app/components/app/initial-nursing/list.vue b/app/components/app/initial-nursing/list.vue
new file mode 100644
index 00000000..96697bde
--- /dev/null
+++ b/app/components/app/initial-nursing/list.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/app/components/app/initial-nursing/preview.vue b/app/components/app/initial-nursing/preview.vue
new file mode 100644
index 00000000..501969f0
--- /dev/null
+++ b/app/components/app/initial-nursing/preview.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+ Jam Tanggal
+ : {{ '-' }}
+
+
+
+
+
A. Data Subyektif
+
+
+
+ Keluhan Pasien
+ : {{ preview?.['pri-complain'] || '-' }}
+
+
+
+
+ Riwayat Alergi dan Reaksi
+ :
+
+
+
+
+ a. Obat
+ : {{ preview?.['med-type'] || '-' }}
+ Sebutkan
+ : {{ preview?.['med-name'] || '-' }}
+ Reaksi
+ : {{ preview?.['med-reaction'] || '-' }}
+
+
+
+ b. Makanan
+ : {{ preview?.['food-type'] || '-' }}
+ Sebutkan
+ : {{ preview?.['food-name'] || '-' }}
+ Reaksi
+ : {{ preview?.['food-reaction'] || '-' }}
+
+
+
+ c. Lain-lain
+ : {{ preview?.['other-type'] || '-' }}
+ Sebutkan
+ : {{ preview?.['other-name'] || '-' }}
+ Reaksi
+ : {{ preview?.['other-reaction'] || '-' }}
+
+
+
+
+
+ Kajian Nyeri
+ : {{ preview?.['pain-asst'] || '-' }}
+
+
+
+ Skala Nyeri
+ : {{ preview?.['pain-scale'] || '-' }}
+
+
+ Waktu Nyeri
+ : {{ preview?.['pain-time'] || '-' }}
+
+
+ Durasi Nyeri
+ : {{ preview?.['pain-duration'] || '-' }}
+
+
+ Frekwensi Nyeri
+ : {{ preview?.['pain-freq'] || '-' }}
+
+
+ Lokasi
+ : {{ preview?.['pain-loc'] || '-' }}
+
+
+
+ Skrining Nutrisi
+ : {{ preview?.['nut-screening'] || '-' }}
+
+
+
+ Kajian psiko-sosio-kultural-spiritual
+ : {{ preview?.['spiritual-asst'] || '-' }}
+
+
+
+
+
+
B. Data Obyektif
+
+
+
+ Keadaan Umum
+ : {{ preview?.['general-condition'] || '-' }}
+
+
+
+ Pemeriksaan Penunjang
+ : {{ preview?.['support-exam'] || '-' }}
+
+
+
+ Risiko Jatuh
+ : {{ preview?.['risk-fall'] || '-' }}
+
+
+
+ Pemakaian Gelang Risiko Jatuh
+ : {{ preview?.['bracelet'] || '-' }}
+
+
+
+ Pasang Gelang Alergi
+ : {{ preview?.['bracelet-alg'] || '-' }}
+
+
+
+
diff --git a/app/components/app/installation-position/entry-detail.vue b/app/components/app/installation-position/entry-detail.vue
new file mode 100644
index 00000000..a6bfd113
--- /dev/null
+++ b/app/components/app/installation-position/entry-detail.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
diff --git a/app/components/app/installation-position/entry-form.vue b/app/components/app/installation-position/entry-form.vue
new file mode 100644
index 00000000..1bf65323
--- /dev/null
+++ b/app/components/app/installation-position/entry-form.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
diff --git a/app/components/app/installation-position/list.cfg.ts b/app/components/app/installation-position/list.cfg.ts
new file mode 100644
index 00000000..fe3f6c9c
--- /dev/null
+++ b/app/components/app/installation-position/list.cfg.ts
@@ -0,0 +1,65 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { DivisionPosition } from '~/models/division-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Nama Instalasi ' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['code', 'name', 'installation.name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ division: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.division?.name || '-'
+ },
+ employee: (rec: unknown): unknown => {
+ const recX = rec as DivisionPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/installation-position/list.vue b/app/components/app/installation-position/list.vue
new file mode 100644
index 00000000..6ad7dd81
--- /dev/null
+++ b/app/components/app/installation-position/list.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/app/components/app/installation/detail/index.vue b/app/components/app/installation/detail/index.vue
new file mode 100644
index 00000000..8a668d1c
--- /dev/null
+++ b/app/components/app/installation/detail/index.vue
@@ -0,0 +1,34 @@
+
+
+
+ {{ installation.code || '-' }}
+ {{ installation.name || '-' }}
+
+
+
diff --git a/app/components/app/installation/detail/list.cfg.ts b/app/components/app/installation/detail/list.cfg.ts
new file mode 100644
index 00000000..bf341ff9
--- /dev/null
+++ b/app/components/app/installation/detail/list.cfg.ts
@@ -0,0 +1,65 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { DivisionPosition } from '~/models/division-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: '#' },
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['index', 'code', 'name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ division: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.division?.name || '-'
+ },
+ employee: (rec: unknown): unknown => {
+ const recX = rec as DivisionPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/installation/detail/list.vue b/app/components/app/installation/detail/list.vue
new file mode 100644
index 00000000..b5884cfd
--- /dev/null
+++ b/app/components/app/installation/detail/list.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/installation/list-cfg.ts b/app/components/app/installation/list.cfg.ts
similarity index 83%
rename from app/components/app/installation/list-cfg.ts
rename to app/components/app/installation/list.cfg.ts
index f64ecea8..e2a39d80 100644
--- a/app/components/app/installation/list-cfg.ts
+++ b/app/components/app/installation/list.cfg.ts
@@ -3,19 +3,12 @@ import { defineAsyncComponent } from 'vue'
type SmallDetailDto = any
-const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
export const config: Config = {
cols: [{}, {}, {}, { width: 50 }],
- headers: [
- [
- { label: 'Kode' },
- { label: 'Nama' },
- { label: 'Encounter Class' },
- { label: '' },
- ],
- ],
+ headers: [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Encounter Class' }, { label: '' }]],
keys: ['code', 'name', 'encounterClass_code', 'action'],
diff --git a/app/components/app/installation/list.vue b/app/components/app/installation/list.vue
index 1be60a60..6ad7dd81 100644
--- a/app/components/app/installation/list.vue
+++ b/app/components/app/installation/list.vue
@@ -6,7 +6,7 @@ import PaginationView from '~/components/pub/my-ui/pagination/pagination-view.vu
import type { PaginationMeta } from '~/components/pub/my-ui/pagination/pagination.type'
// Configs
-import { config } from './list-cfg'
+import { config } from './list.cfg'
interface Props {
data: any[]
@@ -31,6 +31,9 @@ function handlePageChange(page: number) {
:rows="data"
:skeleton-size="paginationMeta?.pageSize"
/>
-
+
diff --git a/app/components/app/kfr/_common/banner-patient-in-therapy.vue b/app/components/app/kfr/_common/banner-patient-in-therapy.vue
new file mode 100644
index 00000000..27dc4445
--- /dev/null
+++ b/app/components/app/kfr/_common/banner-patient-in-therapy.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
Pasien telah mencapai atau telah melampaui jadwal Asesment pada
+ {{ new Date(props.assesmentDate).toDateString() }}
+
+ Harap melakukan Re-Asement sebelum melanjutkan Protocol Therapy
+
+
diff --git a/app/components/app/kfr/_common/btn-confirmation-detail.vue b/app/components/app/kfr/_common/btn-confirmation-detail.vue
new file mode 100644
index 00000000..e09432d5
--- /dev/null
+++ b/app/components/app/kfr/_common/btn-confirmation-detail.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Konfirmasi
+
+
diff --git a/app/components/app/kfr/_common/btn-history.vue b/app/components/app/kfr/_common/btn-history.vue
new file mode 100644
index 00000000..6804c451
--- /dev/null
+++ b/app/components/app/kfr/_common/btn-history.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+ History
+
+
diff --git a/app/components/app/kfr/_common/card-result.vue b/app/components/app/kfr/_common/card-result.vue
new file mode 100644
index 00000000..d77302ef
--- /dev/null
+++ b/app/components/app/kfr/_common/card-result.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+ | S : |
+ {{ props.rec.result.s }} |
+
+
+
+
+
+
+
+ | O : |
+ {{ props.rec.result.o }} |
+
+
+
+
+
+
+
+ | A : |
+ {{ props.rec.result.a }} |
+
+
+
+
+
+
P :
+
+ -
+
Goal of Treatment
+ {{ props.rec.result.p.goal }}
+
+ -
+
Tindakan/Program Rehabilitasi Medik
+ {{ props.rec.result.p.action }}
+
+ -
+
Edukasi
+ {{ props.rec.result.p.education }}
+
+ -
+
Frekuensi Kunjungan
+ {{ props.rec.result.p.frequency }} x Perminggu
+
+
+
+
+
+
+
+ | Rencana Tindak Lanjut : |
+ {{ props.rec.result.plan }} - {{ props.rec.result.planDesc }} |
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/kfr/_common/dropdown-action.vue b/app/components/app/kfr/_common/dropdown-action.vue
new file mode 100644
index 00000000..f99c3c43
--- /dev/null
+++ b/app/components/app/kfr/_common/dropdown-action.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/kfr/_common/radio-followup.vue b/app/components/app/kfr/_common/radio-followup.vue
new file mode 100644
index 00000000..94ede9cb
--- /dev/null
+++ b/app/components/app/kfr/_common/radio-followup.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/kfr/_common/verify-badge.vue b/app/components/app/kfr/_common/verify-badge.vue
new file mode 100644
index 00000000..c82c0c7c
--- /dev/null
+++ b/app/components/app/kfr/_common/verify-badge.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+ {{ verifyStatusText }}
+
+
+ {{ validateStatusText }}
+
+
+
\ No newline at end of file
diff --git a/app/components/app/kfr/entry.vue b/app/components/app/kfr/entry.vue
new file mode 100644
index 00000000..e7d0c64f
--- /dev/null
+++ b/app/components/app/kfr/entry.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
diff --git a/app/components/app/kfr/history-list.cfg.ts b/app/components/app/kfr/history-list.cfg.ts
new file mode 100644
index 00000000..bc86241e
--- /dev/null
+++ b/app/components/app/kfr/history-list.cfg.ts
@@ -0,0 +1,60 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dp.vue'))
+const resultData = defineAsyncComponent(() => import('./_common/card-result.vue'))
+const statusBadge = defineAsyncComponent(() => import('./_common/verify-badge.vue'))
+
+export const config: Config = {
+ cols: [{}, { width: 800 }, {}, { width: 120 }, { width: 3 },],
+
+ headers: [
+ [
+ { label: 'Tanggal' },
+ { label: 'Hasil Asesmen Pasien Dan Pemberian Pelayanan' },
+ { label: 'Jenis Form' },
+ { label: 'Status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'result', 'type', 'status', 'action'],
+
+ 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
+ },
+ },
+
+ components: {
+ result(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: resultData,
+ }
+ },
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+}
diff --git a/app/components/app/kfr/history-list.vue b/app/components/app/kfr/history-list.vue
new file mode 100644
index 00000000..d0a0619a
--- /dev/null
+++ b/app/components/app/kfr/history-list.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ {{ df.format(props.dateValue.start.toDate(getLocalTimeZone())) }} -
+ {{ df.format(props.dateValue.end.toDate(getLocalTimeZone())) }}
+
+
+
+ {{ df.format(props.dateValue.start.toDate(getLocalTimeZone())) }}
+
+
+ Pick a date
+
+
+
+ emit('update:dateValue', date)" />
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/kfr/list.cfg.ts b/app/components/app/kfr/list.cfg.ts
new file mode 100644
index 00000000..1ba6a461
--- /dev/null
+++ b/app/components/app/kfr/list.cfg.ts
@@ -0,0 +1,59 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./_common/dropdown-action.vue'))
+const statusBadge = defineAsyncComponent(() => import('./_common/verify-badge.vue'))
+const resultData = defineAsyncComponent(() => import('./_common/card-result.vue'))
+
+export const config: Config = {
+ cols: [{}, { width: 800 }, {}, { width: 120 }, { width: 3 },],
+
+ headers: [
+ [
+ { label: 'Tanggal' },
+ { label: 'Hasil Asesmen Pasien Dan Pemberian Pelayanan' },
+ { label: 'Jenis Form' },
+ { label: 'Status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'result', 'type', 'status', 'action'],
+
+ 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
+ },
+ },
+
+ components: {
+ result(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: resultData,
+ }
+ },
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+}
diff --git a/app/components/app/kfr/list.vue b/app/components/app/kfr/list.vue
new file mode 100644
index 00000000..f5d7a6bb
--- /dev/null
+++ b/app/components/app/kfr/list.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/kfr/verify-dialog.vue b/app/components/app/kfr/verify-dialog.vue
new file mode 100644
index 00000000..c67bd977
--- /dev/null
+++ b/app/components/app/kfr/verify-dialog.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
diff --git a/app/components/app/material-package-item/quick-list.cfg.ts b/app/components/app/material-package-item/quick-list.cfg.ts
new file mode 100644
index 00000000..90caf510
--- /dev/null
+++ b/app/components/app/material-package-item/quick-list.cfg.ts
@@ -0,0 +1,23 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+type SmallDetailDto = any
+
+export const config: Config = {
+ cols: [ { width: 150 }, {}, { width: 150 }],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Name' },
+ { label: 'Jumlah' },
+ ],
+ ],
+
+ keys: ['number', 'material.name', 'count'],
+
+ parses: {
+ number: (rec: unknown): unknown => {
+ return (rec as SmallDetailDto).medicineGroup?.name || '-'
+ },
+ },
+}
diff --git a/app/components/app/material-package-item/quick-list.vue b/app/components/app/material-package-item/quick-list.vue
new file mode 100644
index 00000000..2ff50a73
--- /dev/null
+++ b/app/components/app/material-package-item/quick-list.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Daftar Item BMHP
+
+
+
+
diff --git a/app/components/app/material-package/switcher.vue b/app/components/app/material-package/switcher.vue
new file mode 100644
index 00000000..2709ff5e
--- /dev/null
+++ b/app/components/app/material-package/switcher.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
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..841b77a0
--- /dev/null
+++ b/app/components/app/mcu-order-item/list-entry.cfg.ts
@@ -0,0 +1,46 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { McuOrderItem } from '~/models/mcu-order-item'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
+// const input = defineAsyncComponent(() => import('~/components/pub/my-ui/data/editable-div.vue'))
+const input = defineAsyncComponent(() => import('~/components/pub/ui/input/Input.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, { classVal: '!p-0.5' }],
+
+ headers: [
+ [
+ { label: 'Nama' },
+ { label: 'Jenis' },
+ { label: 'Catatan', classVal: '!w-[40%]' },
+ // { label: '' },
+ ],
+ ],
+
+ keys: ['mcuSrc.name', 'mcuSrc.mcuSrcCategory.name', 'note'],
+
+ delKeyNames: [
+ { key: 'mcuSrc.name', label: 'Nama' },
+ ],
+
+ components: {
+ note(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ props: { data: (rec as McuOrderItem).note },
+ 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..4fd8edb8
--- /dev/null
+++ b/app/components/app/mcu-order-item/list-entry.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+ Pilih Item
+
+
+
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..28441165
--- /dev/null
+++ b/app/components/app/mcu-order-item/list.cfg.ts
@@ -0,0 +1,20 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+export const config: Config = {
+ cols: [{}, { width: 150 }, {}],
+
+ headers: [
+ [
+ { label: 'Nama' },
+ { label: 'Jadwal Pemeriksaan' },
+ { label: 'Status' },
+ { label: 'Catatan' },
+ ],
+ ],
+
+ keys: ['mcuSrc.name', 'examinationDate', 'status_code', 'note'],
+
+ 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/confirmation-info.vue b/app/components/app/mcu-order/confirmation-info.vue
new file mode 100644
index 00000000..4f7c9a9d
--- /dev/null
+++ b/app/components/app/mcu-order/confirmation-info.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
Tanggal
+
:
+
{{ recItem.createdAt?.substring(0, 10) }}
+
+
+
DPJP
+
:
+
{{ recItem.doctor?.employee?.person?.name }}
+
+
\ No newline at end of file
diff --git a/app/components/app/mcu-order/detail.vue b/app/components/app/mcu-order/detail.vue
new file mode 100644
index 00000000..8d86a98b
--- /dev/null
+++ b/app/components/app/mcu-order/detail.vue
@@ -0,0 +1,32 @@
+
+
+
+
+ Order {{ data?.createdAt?.substring(0, 10) }} - {{ data?.status_code }}
+
+
+
+
+ DPJP
+
+ {{ data?.doctor?.employee?.person?.name || '.........' }}
+
+
+
+
+ PPDS
+
+ ...........
+
+
+
+
+
\ 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 @@
+
+
+
+
+
+
+ Order #{{ data.length - idx }} - {{ item.createdAt?.substring(0, 10) }} - {{ item.status_code }}
+
+
+
+ DPJP
+
+ {{ item.doctor?.employee?.person?.name || '........' }}
+
+
+
+ PPDS
+
+ ...........
+
+
+
+
+
+
+
+
diff --git a/app/components/app/mcu-order/list.vue b/app/components/app/mcu-order/list.vue
new file mode 100644
index 00000000..4c749dc9
--- /dev/null
+++ b/app/components/app/mcu-order/list.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+ Order #{{ data.length - idx }} - {{ item.createdAt?.substring(0, 10) }} - {{ item.status_code }}
+
+
+
+ DPJP
+
+ {{ item.doctor?.employee?.person?.name || '........' }}
+
+
+
+ PPDS
+
+ ...........
+
+
+
+
+
+
+
+
diff --git a/app/components/app/mcu-order/micro-list.vue b/app/components/app/mcu-order/micro-list.vue
new file mode 100644
index 00000000..e63ad40b
--- /dev/null
+++ b/app/components/app/mcu-order/micro-list.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+ Order #{{ data.length - idx }} - {{ item.createdAt?.substring(0, 10) }} - {{ item.status_code }}
+
+
+
+ DPJP
+
+ {{ item.doctor?.employee?.person?.name || '........' }}
+
+
+
+ PPDS
+
+ ...........
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ Kategori
+
+
+
+ {{ item.name }}
+
+
+
+
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..79429e9d
--- /dev/null
+++ b/app/components/app/mcu-src/picker-accordion.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
diff --git a/app/components/app/medicine-form/entry-form.vue b/app/components/app/medicine-form/entry-form.vue
new file mode 100644
index 00000000..fb26631e
--- /dev/null
+++ b/app/components/app/medicine-form/entry-form.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
diff --git a/app/components/app/medicine-form/list-cfg.ts b/app/components/app/medicine-form/list-cfg.ts
new file mode 100644
index 00000000..5b66812a
--- /dev/null
+++ b/app/components/app/medicine-form/list-cfg.ts
@@ -0,0 +1,38 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Aksi' },
+ ],
+ ],
+
+ keys: ['code', 'name', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/medicine-form/list.vue b/app/components/app/medicine-form/list.vue
new file mode 100644
index 00000000..e4544c2f
--- /dev/null
+++ b/app/components/app/medicine-form/list.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
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/medicine/entry-form.vue b/app/components/app/medicine/entry-form.vue
index 42989fcb..af4df34f 100644
--- a/app/components/app/medicine/entry-form.vue
+++ b/app/components/app/medicine/entry-form.vue
@@ -18,6 +18,7 @@ interface Props {
isReadonly?: boolean
medicineGroups?: { value: string; label: string }[]
medicineMethods?: { value: string; label: string }[]
+ medicineForms?: { value: string; label: string }[]
uoms?: { value: string; label: string }[]
}
@@ -36,6 +37,7 @@ const { defineField, errors, meta } = useForm({
name: '',
medicineGroup_code: '',
medicineMethod_code: '',
+ medicineForm_code: '',
uom_code: '',
stock: 0,
},
@@ -45,6 +47,7 @@ const [code, codeAttrs] = defineField('code')
const [name, nameAttrs] = defineField('name')
const [medicineGroup_code, medicineGroupAttrs] = defineField('medicineGroup_code')
const [medicineMethod_code, medicineMethodAttrs] = defineField('medicineMethod_code')
+const [medicineForm_code, medicineFormAttrs] = defineField('medicineForm_code')
const [uom_code, uomAttrs] = defineField('uom_code')
const [stock, stockAttrs] = defineField('stock')
@@ -53,6 +56,7 @@ if (props.values) {
if (props.values.name !== undefined) name.value = props.values.name
if (props.values.medicineGroup_code !== undefined) medicineGroup_code.value = props.values.medicineGroup_code
if (props.values.medicineMethod_code !== undefined) medicineMethod_code.value = props.values.medicineMethod_code
+ if (props.values.medicineForm_code !== undefined) medicineForm_code.value = props.values.medicineForm_code
if (props.values.uom_code !== undefined) uom_code.value = props.values.uom_code
if (props.values.stock !== undefined) stock.value = props.values.stock
}
@@ -62,6 +66,7 @@ const resetForm = () => {
name.value = ''
medicineGroup_code.value = ''
medicineMethod_code.value = ''
+ medicineForm_code.value = '',
uom_code.value = ''
stock.value = 0
}
@@ -72,6 +77,7 @@ function onSubmitForm() {
name: name.value || '',
medicineGroup_code: medicineGroup_code.value || '',
medicineMethod_code: medicineMethod_code.value || '',
+ medicineForm_code: medicineForm_code.value || '',
uom_code: uom_code.value || '',
stock: stock.value || 0,
}
@@ -138,6 +144,20 @@ function onCancelForm() {
/>
+
+
+
+
+
+ |
diff --git a/app/components/app/medicine/list-cfg.ts b/app/components/app/medicine/list-cfg.ts
index 059022c8..5d1740f8 100644
--- a/app/components/app/medicine/list-cfg.ts
+++ b/app/components/app/medicine/list-cfg.ts
@@ -15,12 +15,13 @@ export const config: Config = {
{ label: 'Golongan' },
{ label: 'Metode Pemberian' },
{ label: 'Satuan' },
+ { label: 'Sediaan' },
{ label: 'Stok' },
{ label: 'Aksi' },
],
],
- keys: ['code', 'name', 'group', 'method', 'unit', 'stock', 'action'],
+ keys: ['code', 'name', 'group', 'method', 'unit', 'form', 'stock', 'action'],
delKeyNames: [
{ key: 'code', label: 'Kode' },
@@ -37,6 +38,9 @@ export const config: Config = {
unit: (rec: unknown): unknown => {
return (rec as SmallDetailDto).uom?.name || '-'
},
+ form: (rec: unknown): unknown => {
+ return (rec as SmallDetailDto).medicineForm?.name || '-'
+ },
},
components: {
diff --git a/app/components/app/patient/list-cfg.patient.ts b/app/components/app/patient/list-cfg.patient.ts
new file mode 100644
index 00000000..3c77bfaa
--- /dev/null
+++ b/app/components/app/patient/list-cfg.patient.ts
@@ -0,0 +1,41 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const SelectedRadio = defineAsyncComponent(() => import('~/components/pub/my-ui/data/select-radio.vue'))
+
+export interface PatientData {
+ id: string
+ identity: string
+ number: string
+ bpjs: string
+ name: string
+}
+
+export const config: Config = {
+ cols: [{ width: 50 }, { width: 100 }, { width: 100 }, { width: 100 }, { width: 100 }],
+
+ headers: [
+ [{ label: '' }, { label: 'NO. KTP' }, { label: 'NO. RM' }, { label: 'NO. KARTU BPJS' }, { label: 'NAMA PASIEN' }],
+ ],
+
+ keys: ['check', 'identity', 'number', 'bpjs', 'name'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {},
+
+ components: {
+ check(rec, idx) {
+ return {
+ idx,
+ rec: { ...rec as object, menu: 'patient' },
+ component: SelectedRadio,
+ }
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/patient/list-patient.vue b/app/components/app/patient/list-patient.vue
new file mode 100644
index 00000000..2b9902f2
--- /dev/null
+++ b/app/components/app/patient/list-patient.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
diff --git a/app/components/app/patient/view-patient.vue b/app/components/app/patient/view-patient.vue
new file mode 100644
index 00000000..e24554b7
--- /dev/null
+++ b/app/components/app/patient/view-patient.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
diff --git a/app/components/app/prb/_common/btn-history.vue b/app/components/app/prb/_common/btn-history.vue
new file mode 100644
index 00000000..972eab8e
--- /dev/null
+++ b/app/components/app/prb/_common/btn-history.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+ History
+
+
\ No newline at end of file
diff --git a/app/components/app/prb/_common/filter.vue b/app/components/app/prb/_common/filter.vue
new file mode 100644
index 00000000..d5e99b30
--- /dev/null
+++ b/app/components/app/prb/_common/filter.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-date.vue b/app/components/app/prb/_common/select-date.vue
new file mode 100644
index 00000000..d94d04eb
--- /dev/null
+++ b/app/components/app/prb/_common/select-date.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-dpjp.vue b/app/components/app/prb/_common/select-dpjp.vue
new file mode 100644
index 00000000..9e83e64f
--- /dev/null
+++ b/app/components/app/prb/_common/select-dpjp.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-medicine-form.vue b/app/components/app/prb/_common/select-medicine-form.vue
new file mode 100644
index 00000000..9e83e64f
--- /dev/null
+++ b/app/components/app/prb/_common/select-medicine-form.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-medicine.vue b/app/components/app/prb/_common/select-medicine.vue
new file mode 100644
index 00000000..9e83e64f
--- /dev/null
+++ b/app/components/app/prb/_common/select-medicine.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/_common/select-program.vue b/app/components/app/prb/_common/select-program.vue
new file mode 100644
index 00000000..cde3fb66
--- /dev/null
+++ b/app/components/app/prb/_common/select-program.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/bpjs-list.cfg.ts b/app/components/app/prb/bpjs-list.cfg.ts
new file mode 100644
index 00000000..92d68f73
--- /dev/null
+++ b/app/components/app/prb/bpjs-list.cfg.ts
@@ -0,0 +1,60 @@
+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-upd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'No. PRB' },
+ { label: 'No. RM' },
+ { label: 'Nama Pasien' },
+ { label: 'Jenis Kelamin' },
+ { label: 'Alamat' },
+ { label: 'Klinik' },
+ { label: 'Nama Dokter' },
+ { label: 'Tanggal' },
+ { label: 'Program PRB' },
+ { label: 'No. SEP' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/prb/detail.vue b/app/components/app/prb/detail.vue
new file mode 100644
index 00000000..7e40366d
--- /dev/null
+++ b/app/components/app/prb/detail.vue
@@ -0,0 +1,62 @@
+
+
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+
+
diff --git a/app/components/app/prb/entry.vue b/app/components/app/prb/entry.vue
new file mode 100644
index 00000000..4658578a
--- /dev/null
+++ b/app/components/app/prb/entry.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
diff --git a/app/components/app/prb/history-list.cfg.ts b/app/components/app/prb/history-list.cfg.ts
new file mode 100644
index 00000000..6f571af3
--- /dev/null
+++ b/app/components/app/prb/history-list.cfg.ts
@@ -0,0 +1,62 @@
+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-print.vue'))
+const statusBadge = defineAsyncComponent(() => import('~/components/pub/my-ui/badge/status-badge.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {width: 100}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Tgl Diterbitkan' },
+ { label: 'Kode Obat' },
+ { label: 'Nama Obat' },
+ { label: 'Signa' },
+ { label: 'Jumlah' },
+ { label: 'Durasi Pemberian' },
+ { label: 'status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'name1', 'name2', 'name3', 'name4', 'name5', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/prb/history-list.vue b/app/components/app/prb/history-list.vue
new file mode 100644
index 00000000..20cc7eaf
--- /dev/null
+++ b/app/components/app/prb/history-list.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/prb/list.cfg.ts b/app/components/app/prb/list.cfg.ts
new file mode 100644
index 00000000..4da07cdd
--- /dev/null
+++ b/app/components/app/prb/list.cfg.ts
@@ -0,0 +1,56 @@
+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-upd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Tgl Diterbitkan' },
+ { label: 'Kode Obat' },
+ { label: 'Nama Obat' },
+ { label: 'Signa' },
+ { label: 'Jumlah' },
+ { label: 'Durasi Pemberian' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'name1', 'name2', 'name3', 'name4', 'name5', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/prb/list.vue b/app/components/app/prb/list.vue
new file mode 100644
index 00000000..5e51b50f
--- /dev/null
+++ b/app/components/app/prb/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/app/components/app/prb/obat-picker/form.vue b/app/components/app/prb/obat-picker/form.vue
new file mode 100644
index 00000000..510cae69
--- /dev/null
+++ b/app/components/app/prb/obat-picker/form.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/prb/obat-picker/picker-dialog.vue b/app/components/app/prb/obat-picker/picker-dialog.vue
new file mode 100644
index 00000000..69ea3b90
--- /dev/null
+++ b/app/components/app/prb/obat-picker/picker-dialog.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+ {{ title }}
+
+
+ Pilih {{ title }}
+
+
+
+
+
+
+
+
+
+
+ Code
+ Name
+ Signa
+ Jumlah
+ Durasi Pemberian
+ Action
+
+
+
+
+ {{ field.value?.code }}
+ {{ field.value?.name }}
+ {{ field.value?.signa }}
+ {{ field.value?.total }}
+ {{ field.value?.duration }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prb/sep-picker/list.cfg.ts b/app/components/app/prb/sep-picker/list.cfg.ts
new file mode 100644
index 00000000..5a928e2d
--- /dev/null
+++ b/app/components/app/prb/sep-picker/list.cfg.ts
@@ -0,0 +1,83 @@
+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-choose.vue'))
+const statusBadge = defineAsyncComponent(() => import('~/components/pub/my-ui/badge/status-badge.vue'))
+
+export const config: Config = {
+ cols: [
+ { width: 120 }, // TGL. SEP
+ { width: 150 }, // NO. SEP
+ { width: 120 }, // PELAYANAN
+ { width: 100 }, // JALUR
+ { width: 150 }, // NO. RM
+ { width: 200 }, // NAMA PASIEN
+ { width: 150 }, // NO. KARTU BPJS
+ { width: 150 }, // NO. SURAT KONTROL
+ { width: 150 }, // TGL SURAT KONTROL
+ { width: 150 }, // KLINIK TUJUAN
+ { width: 200 }, // DPJP
+ { width: 200 }, // DIAGNOSIS AWAL
+ { width: 100 }, // AKSI
+ ],
+
+ headers: [
+ [
+ { label: 'TGL. SEP' },
+ { label: 'NO. SEP' },
+ { label: 'PELAYANAN' },
+ { label: 'JALUR' },
+ { label: 'NO. RM' },
+ { label: 'NAMA PASIEN' },
+ { label: 'NO. KARTU BPJS' },
+ { label: 'NO. SURAT KONTROL' },
+ { label: 'TGL SURAT KONTROL' },
+ { label: 'KLINIK TUJUAN' },
+ { label: 'DPJP' },
+ { label: 'DIAGNOSIS AWAL' },
+ { label: 'AKSI' },
+ ],
+ ],
+
+ keys: [
+ 'letterDate',
+ 'letterNumber',
+ 'serviceType',
+ 'flow',
+ 'medicalRecordNumber',
+ 'patientName',
+ 'cardNumber',
+ 'controlLetterNumber',
+ 'controlLetterDate',
+ 'clinicDestination',
+ 'attendingDoctor',
+ 'diagnosis',
+ 'action',
+ ],
+
+ delKeyNames: [
+ { key: 'letterNumber', label: 'NO. SEP' },
+ { key: 'patientName', label: 'Nama Pasien' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+
+ htmls: {},
+}
\ No newline at end of file
diff --git a/app/components/app/prb/sep-picker/list.vue b/app/components/app/prb/sep-picker/list.vue
new file mode 100644
index 00000000..9c8aa593
--- /dev/null
+++ b/app/components/app/prb/sep-picker/list.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
diff --git a/app/components/app/prb/sep-picker/picker-dialog.vue b/app/components/app/prb/sep-picker/picker-dialog.vue
new file mode 100644
index 00000000..efb32023
--- /dev/null
+++ b/app/components/app/prb/sep-picker/picker-dialog.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/prescription-item/list-entry.cfg.ts b/app/components/app/prescription-item/list-entry.cfg.ts
index 070dd65f..cfc6bdbd 100644
--- a/app/components/app/prescription-item/list-entry.cfg.ts
+++ b/app/components/app/prescription-item/list-entry.cfg.ts
@@ -11,16 +11,17 @@ export const config: Config = {
headers: [
[
{ label: 'Nama' },
+ { label: 'Cara Buat' },
{ label: 'Bentuk' },
{ label: 'Freq' },
{ label: 'Dosis' },
- { label: 'Interval' },
+ // { label: 'Interval' },
{ label: 'Total' },
{ label: '' },
],
],
- keys: ['name', 'uom_code', 'frequency', 'multiplier', 'interval', 'total', 'action'],
+ keys: ['medicine.name', 'isMix', 'medicine.medicineForm.name', 'frequency', 'dose', 'quantity', 'action'], //
delKeyNames: [
{ key: 'code', label: 'Kode' },
@@ -28,17 +29,8 @@ export const config: Config = {
],
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 || '-'
+ isMix: (rec: unknown): unknown => {
+ return (rec as SmallDetailDto).isMix ? 'Racikan' : 'Non Racikan'
},
},
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 @@
-
+
+
+
+ Tambah Racikan
+
+
+
+ Tambah Non Racikan
+
+
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..5a3447ef
--- /dev/null
+++ b/app/components/app/prescription-item/list.cfg.ts
@@ -0,0 +1,40 @@
+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: 'Total' },
+ ],
+ ],
+
+ keys: ['medicine.name', 'medicine.medicineForm.name', 'frequency', 'dose', '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..d8c4c107
--- /dev/null
+++ b/app/components/app/prescription-item/list.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
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..05960307
--- /dev/null
+++ b/app/components/app/prescription-item/mix-entry.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+ Nama
+
+
+
+
+
+ Frequensi
+
+
+
+ Dosis
+
+
+
+ Sediaan
+
+
+
+ Total
+
+
+
+ Cara Pakai
+
+
+
+ Daftar Obat
+
+
+
+ Nama
+ Dosis
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Belum ada data
+
+
+
+
+
+
+
+ Tambah
+
+
+
+
+
+
+
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..78ee9ada
--- /dev/null
+++ b/app/components/app/prescription-item/non-mix-entry.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+ Nama
+
+
+
+
+
+ Frequensi
+
+
+
+ Dosis
+
+
+
+
+ Total
+
+
+
+
+
+ Sediaan
+
+
+
+ Cara Pakai
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prescription/detail.vue b/app/components/app/prescription/detail.vue
new file mode 100644
index 00000000..21962532
--- /dev/null
+++ b/app/components/app/prescription/detail.vue
@@ -0,0 +1,32 @@
+
+
+
+
+ Order {{ data.issuedAt?.substring(0, 10) || data.createdAt?.substring(0, 10) }} - {{ data.status_code }}
+
+
+
+
+ DPJP
+
+ {{ data.doctor?.employee?.person?.name || '.........' }}
+
+
+
+
+ PPDS
+
+ ...........
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/prescription/entry.vue b/app/components/app/prescription/entry.vue
index 3b4acf28..28041eea 100644
--- a/app/components/app/prescription/entry.vue
+++ b/app/components/app/prescription/entry.vue
@@ -1,32 +1,50 @@
+
+
-
-
-
- DPJP
-
-
-
-
-
-
- Tgl Order
-
-
-
-
-
- DPJP
-
-
-
-
-
-
- Status
-
-
-
-
-
+
+
diff --git a/app/components/app/prescription/flat-list.vue b/app/components/app/prescription/flat-list.vue
new file mode 100644
index 00000000..2c768201
--- /dev/null
+++ b/app/components/app/prescription/flat-list.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+ Tgl Order
+ DPJP
+ PPDS
+ Jenis Obat
+ Status
+
+
+
+
+
+
+ {{ item.issuedAt?.substring(0, 10) || item.createdAt?.substring(0, 10) }}
+
+
+ {{ item.doctor?.employee?.person?.name || '-' }}
+
+
+
+
+
+ Racikan: {{ item.items.filter(function(element){ return element.isMix}).length }}
+
+
+ Non Racikan: {{ item.items.filter(function(element){ return !element.isMix}).length }}
+
+
+
+ {{ item.status_code }}
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/prescription/grouped-list.vue b/app/components/app/prescription/grouped-list.vue
new file mode 100644
index 00000000..87e202bb
--- /dev/null
+++ b/app/components/app/prescription/grouped-list.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+ Order #{{ data.length - idx }} - {{ item.issuedAt?.substring(0, 10) || item.createdAt?.substring(0, 10) }} - {{ item.status_code }}
+
+
+
+ DPJP
+
+ {{ item.doctor?.employee?.person?.name || '-' }}
+
+
+
+ PPDS
+
+ ...........
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+ Memuat data..
+
+
+
+
+
+
+
+
+ Order #{{ data.length - idx }}
+
+ 2025-01-01
+
+
+
+ Status
+
+ {{ item.status_code }}
+
+
+
+
+
+
+
+ DPJP
+
+ {{ item.doctor?.employee?.person.name }}
+
+
+
+ PPDS
+
+ {{ item.specialistIntern?.person.name }}
+
+
+
+
+
+
+
+
+
+
+
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..4d1a2cdf
--- /dev/null
+++ b/app/components/app/prescription/list-with-sub.vue
@@ -0,0 +1,54 @@
+
+
+
+
+ Belum Ada Data
+
+
+
+ Tambah Order
+
+
+
+
+
+
+
+
+ Order #1
+
+
+ 2025-01-01
+
+
+
+ Status
+
+
+ Status
+
+
+
+
+
+
+
+ DPJP
+
+
+ Nama Dokter
+
+
+
+ PPDS
+
+
+ Nama PPDS
+
+
+
+
+
+
diff --git a/app/components/app/prescription/list.vue b/app/components/app/prescription/list.vue
deleted file mode 100644
index 6fe27d39..00000000
--- a/app/components/app/prescription/list.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
- Belum Ada Data
-
-
-
- Tambah Order
-
-
-
-
-
-
diff --git a/app/components/app/procedure-room-order-item/list-detail.cfg.ts b/app/components/app/procedure-room-order-item/list-detail.cfg.ts
new file mode 100644
index 00000000..cf0f6dab
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-detail.cfg.ts
@@ -0,0 +1,16 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+export const config: Config = {
+ cols: [{}, {}, { classVal: '!p-0.5' }],
+
+ headers: [
+ [
+ { label: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Catatan' },
+ ],
+ ],
+
+ keys: ['procedureRoom.code', 'procedureRoom.infra.name', 'note'],
+}
diff --git a/app/components/app/procedure-room-order-item/list-detail.vue b/app/components/app/procedure-room-order-item/list-detail.vue
new file mode 100644
index 00000000..75727a72
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-detail.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+ Daftar Order Ruang
+
+
+
+
diff --git a/app/components/app/procedure-room-order-item/list-entry.cfg.ts b/app/components/app/procedure-room-order-item/list-entry.cfg.ts
new file mode 100644
index 00000000..2afcd855
--- /dev/null
+++ b/app/components/app/procedure-room-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: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Catatan' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['procedureRoom.code', 'procedureRoom.infra.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/procedure-room-order-item/list-entry.vue b/app/components/app/procedure-room-order-item/list-entry.vue
new file mode 100644
index 00000000..f86a0b8e
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-entry.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Daftar Order Ruang
+
+
+
+
+
+ Pilih Item
+
+
+
+
diff --git a/app/components/app/procedure-room-order/detail.vue b/app/components/app/procedure-room-order/detail.vue
new file mode 100644
index 00000000..23d0dc75
--- /dev/null
+++ b/app/components/app/procedure-room-order/detail.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Detail Order
+
+
+
+ No. Order
+
+ ORT-{{ data.id }}
+
+
+ Tgl. Order
+
+ {{ data.createdAt?.substring(0, 10) }}
+
+
+
+
diff --git a/app/components/app/procedure-room-order/form.vue b/app/components/app/procedure-room-order/form.vue
new file mode 100644
index 00000000..ff6c3835
--- /dev/null
+++ b/app/components/app/procedure-room-order/form.vue
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/app/components/app/procedure-room-order/list.cfg.ts b/app/components/app/procedure-room-order/list.cfg.ts
new file mode 100644
index 00000000..e415e26f
--- /dev/null
+++ b/app/components/app/procedure-room-order/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { ProcedureRoomOrder } from '~/models/procedure-room-order'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dsd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [[
+ { label: 'Tgl. Order' },
+ { label: 'No. Order' },
+ { label: 'Ruangan' },
+ { label: 'Status' },
+ { label: 'Resume' },
+ { label: '' },
+ ]],
+
+ keys: ['date', 'number', 'room', 'status_code', 'resume', 'action'],
+
+ delKeyNames: [
+ { key: 'createdAt', label: 'Tgl. Order' },
+ { key: 'id', label: 'No. Order' },
+ ],
+
+ parses: {
+ date: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ return recX.createdAt ? recX.createdAt.substring(0, 10) : ''
+
+ },
+ number: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ return `ORT-${recX.id}`
+ },
+ room: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ let result = ''
+ if (recX.items && recX.items.length > 0) {
+ recX.items.forEach((item, idx) => {
+ result += item.infra?.name ? ` ${item.infra.name} ` : ''
+ })
+ }
+ // recX.ite
+ return ''
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/procedure-room-order/list.vue b/app/components/app/procedure-room-order/list.vue
new file mode 100644
index 00000000..bdbfe1be
--- /dev/null
+++ b/app/components/app/procedure-room-order/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
diff --git a/app/components/app/procedure-room/multi-opt-picker.vue b/app/components/app/procedure-room/multi-opt-picker.vue
new file mode 100644
index 00000000..ecdd945a
--- /dev/null
+++ b/app/components/app/procedure-room/multi-opt-picker.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+ {{ item.infra?.name }}
+
+
+
+ Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/picker.vue b/app/components/app/procedure-room/picker.vue
new file mode 100644
index 00000000..3660e0cb
--- /dev/null
+++ b/app/components/app/procedure-room/picker.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+ {{ item.infra?.name }}
+
+
+
+ Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/single-opt-picker.vue b/app/components/app/procedure-room/single-opt-picker.vue
new file mode 100644
index 00000000..ecdd945a
--- /dev/null
+++ b/app/components/app/procedure-room/single-opt-picker.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+ {{ item.infra?.name }}
+
+
+
+ Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/switcher.vue b/app/components/app/procedure-room/switcher.vue
new file mode 100644
index 00000000..fdd80e7d
--- /dev/null
+++ b/app/components/app/procedure-room/switcher.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Jenis Ruang Tindakan
+
+
+
+ {{ item }}
+
+
+
+
diff --git a/app/components/app/procedure-src/list.vue b/app/components/app/procedure-src/list.vue
index 1be60a60..d976b660 100644
--- a/app/components/app/procedure-src/list.vue
+++ b/app/components/app/procedure-src/list.vue
@@ -7,13 +7,16 @@ import type { PaginationMeta } from '~/components/pub/my-ui/pagination/paginatio
// Configs
import { config } from './list-cfg'
+import type { Config } from '~/components/pub/my-ui/data-table'
interface Props {
data: any[]
paginationMeta: PaginationMeta
+ tableConfig?: Config
}
-
-defineProps ()
+const props = withDefaults(defineProps(), {
+ tableConfig: () => config,
+})
const emit = defineEmits<{
pageChange: [page: number]
@@ -27,7 +30,7 @@ function handlePageChange(page: number) {
diff --git a/app/components/app/resume/_common/print-btn.vue b/app/components/app/resume/_common/print-btn.vue
new file mode 100644
index 00000000..5688d007
--- /dev/null
+++ b/app/components/app/resume/_common/print-btn.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+ {{ props.btnTxt || 'Lampiran' }}
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/_common/select-arrangement.vue b/app/components/app/resume/_common/select-arrangement.vue
new file mode 100644
index 00000000..7e236ff0
--- /dev/null
+++ b/app/components/app/resume/_common/select-arrangement.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-concious-level.vue b/app/components/app/resume/_common/select-concious-level.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-concious-level.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-date.vue b/app/components/app/resume/_common/select-date.vue
new file mode 100644
index 00000000..74245e7e
--- /dev/null
+++ b/app/components/app/resume/_common/select-date.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-death-cause.vue b/app/components/app/resume/_common/select-death-cause.vue
new file mode 100644
index 00000000..a155b139
--- /dev/null
+++ b/app/components/app/resume/_common/select-death-cause.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-faskes.vue b/app/components/app/resume/_common/select-faskes.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-faskes.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-following-arrangement.vue b/app/components/app/resume/_common/select-following-arrangement.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-following-arrangement.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-hospital-leave-condition.vue b/app/components/app/resume/_common/select-hospital-leave-condition.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-hospital-leave-condition.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-hospital-leave-method.vue b/app/components/app/resume/_common/select-hospital-leave-method.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-hospital-leave-method.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-icd-10.vue b/app/components/app/resume/_common/select-icd-10.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-icd-10.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-icd-9.vue b/app/components/app/resume/_common/select-icd-9.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-icd-9.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-national-program-service-status.vue b/app/components/app/resume/_common/select-national-program-service-status.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-national-program-service-status.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-national-program-service.vue b/app/components/app/resume/_common/select-national-program-service.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-national-program-service.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-pain-scale.vue b/app/components/app/resume/_common/select-pain-scale.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-pain-scale.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-primary-diagnosis.vue b/app/components/app/resume/_common/select-primary-diagnosis.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/resume/_common/select-primary-diagnosis.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/select-secondary-diagnosis.vue b/app/components/app/resume/_common/select-secondary-diagnosis.vue
new file mode 100644
index 00000000..a155b139
--- /dev/null
+++ b/app/components/app/resume/_common/select-secondary-diagnosis.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/resume/_common/verify-badge.vue b/app/components/app/resume/_common/verify-badge.vue
new file mode 100644
index 00000000..8a999895
--- /dev/null
+++ b/app/components/app/resume/_common/verify-badge.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+ {{ statusText }}
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/add.vue b/app/components/app/resume/add.vue
new file mode 100644
index 00000000..d5fa3370
--- /dev/null
+++ b/app/components/app/resume/add.vue
@@ -0,0 +1,482 @@
+
+
+
+
+
diff --git a/app/components/app/resume/history-list/action-history-dialog.vue b/app/components/app/resume/history-list/action-history-dialog.vue
new file mode 100644
index 00000000..5602016e
--- /dev/null
+++ b/app/components/app/resume/history-list/action-history-dialog.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/history-list/action-list.cfg.ts b/app/components/app/resume/history-list/action-list.cfg.ts
new file mode 100644
index 00000000..2dad3e6a
--- /dev/null
+++ b/app/components/app/resume/history-list/action-list.cfg.ts
@@ -0,0 +1,94 @@
+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-dvvp.vue'))
+
+export const config: Config = {
+ cols: [{width: 140}, {}, {}, {width: 140}, {width: 10},],
+
+ headers: [
+ [
+ { label: 'Tanggal/Jam' },
+ { label: 'Dokter' },
+ { label: 'Tempat Layanan' },
+ { label: 'Jenis' },
+ { label: 'Jenis Pemeriksaan' },
+ { label: 'Tanggal/Jam' },
+ ],
+ ],
+
+ keys: ['birth_date', 'person.name', 'person.name', 'person.name', 'person.name', 'birth_date',],
+
+ 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,
+ }
+ },
+ },
+
+ htmls: {
+ patient_address(_rec) {
+ return '-'
+ },
+ },
+}
diff --git a/app/components/app/resume/history-list/consultation-history-dialog.vue b/app/components/app/resume/history-list/consultation-history-dialog.vue
new file mode 100644
index 00000000..ad1e777e
--- /dev/null
+++ b/app/components/app/resume/history-list/consultation-history-dialog.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/history-list/consultation-list.cfg.ts b/app/components/app/resume/history-list/consultation-list.cfg.ts
new file mode 100644
index 00000000..196c208c
--- /dev/null
+++ b/app/components/app/resume/history-list/consultation-list.cfg.ts
@@ -0,0 +1,51 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+import { defineAsyncComponent } from 'vue'
+
+const lampiranBtn = defineAsyncComponent(() => import('../_common/print-btn.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {},],
+
+ headers: [
+ [
+ { label: 'Tanggal/Jam' },
+ { label: 'Dokter' },
+ { label: 'Tempat Layanan' },
+ { label: 'KSM' },
+ { label: 'Tanggal/Jam' },
+ { label: 'Tujuan' },
+ { label: 'Dokter' },
+ { label: 'Berkas' },
+ ],
+ ],
+
+ keys: ['birth_date', 'person.name', 'person.name', 'person.name', 'person.name', 'birth_date','person.name', 'action', ],
+
+ parses: {
+ 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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: lampiranBtn,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/resume/history-list/farmacy-history-dialog.vue b/app/components/app/resume/history-list/farmacy-history-dialog.vue
new file mode 100644
index 00000000..53bf3875
--- /dev/null
+++ b/app/components/app/resume/history-list/farmacy-history-dialog.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/history-list/farmacy-list.cfg.ts b/app/components/app/resume/history-list/farmacy-list.cfg.ts
new file mode 100644
index 00000000..75ea1e80
--- /dev/null
+++ b/app/components/app/resume/history-list/farmacy-list.cfg.ts
@@ -0,0 +1,39 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {},],
+
+ headers: [
+ [
+ { label: 'Tanggal Order' },
+ { label: 'No Resep' },
+ { label: 'Tempat Layanan' },
+ { label: 'Nama Obat' },
+ { label: 'Tanggal Disetujui' },
+ ],
+ ],
+
+ keys: ['birth_date', 'person.name', 'person.name', 'person.name', 'birth_date',],
+
+ parses: {
+ 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
+ },
+ },
+
+ components: {
+
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/resume/history-list/national-program-history-dialog.vue b/app/components/app/resume/history-list/national-program-history-dialog.vue
new file mode 100644
index 00000000..cc702227
--- /dev/null
+++ b/app/components/app/resume/history-list/national-program-history-dialog.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/history-list/national-program-list.cfg.ts b/app/components/app/resume/history-list/national-program-list.cfg.ts
new file mode 100644
index 00000000..fe6d3ea0
--- /dev/null
+++ b/app/components/app/resume/history-list/national-program-list.cfg.ts
@@ -0,0 +1,30 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {},],
+
+ headers: [
+ [
+ { label: 'Nomor' },
+ { label: 'Layanan Program Nasional' },
+ { label: 'Status' },
+ ],
+ ],
+
+ keys: ['person.name', 'person.name', 'person.name',],
+
+ parses: {
+ // birth_date: (rec: unknown): unknown => {
+
+ // },
+ },
+
+ components: {
+
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/resume/history-list/supporting-history-dialog.vue b/app/components/app/resume/history-list/supporting-history-dialog.vue
new file mode 100644
index 00000000..32fb4508
--- /dev/null
+++ b/app/components/app/resume/history-list/supporting-history-dialog.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/history-list/supporting-list.cfg.ts b/app/components/app/resume/history-list/supporting-list.cfg.ts
new file mode 100644
index 00000000..f005042d
--- /dev/null
+++ b/app/components/app/resume/history-list/supporting-list.cfg.ts
@@ -0,0 +1,39 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {},],
+
+ headers: [
+ [
+ { label: 'Tanggal Order' },
+ { label: 'No Lab' },
+ { label: 'Nama Pemeriksaan' },
+ { label: 'Tanggal Pemeriksaan' },
+ ],
+ ],
+
+ keys: ['birth_date', 'person.name', 'person.name', 'birth_date',],
+
+ parses: {
+ 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
+ },
+ },
+
+ components: {
+ },
+
+ htmls: {
+ // patient_address(_rec) {
+ // return '-'
+ // },
+ },
+}
diff --git a/app/components/app/resume/list.cfg.ts b/app/components/app/resume/list.cfg.ts
new file mode 100644
index 00000000..b756b1ee
--- /dev/null
+++ b/app/components/app/resume/list.cfg.ts
@@ -0,0 +1,101 @@
+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-dvvp.vue'))
+const statusBadge = defineAsyncComponent(() => import('./_common/verify-badge.vue'))
+
+export const config: Config = {
+ cols: [{width: 140}, {}, {}, {width: 140}, {width: 10},],
+
+ headers: [
+ [
+ { label: 'Tgl Simpan' },
+ { label: 'DPJP' },
+ { label: 'KSM' },
+ { label: 'Status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['birth_date', 'number', 'person.name', '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/resume/list.vue b/app/components/app/resume/list.vue
new file mode 100644
index 00000000..0d62cc6c
--- /dev/null
+++ b/app/components/app/resume/list.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/resume/verify-dialog.vue b/app/components/app/resume/verify-dialog.vue
new file mode 100644
index 00000000..ca4fb554
--- /dev/null
+++ b/app/components/app/resume/verify-dialog.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/sep/action-history.vue b/app/components/app/sep/action-history.vue
new file mode 100644
index 00000000..8ca652b1
--- /dev/null
+++ b/app/components/app/sep/action-history.vue
@@ -0,0 +1,32 @@
+
+
+
+
+ Detail SEP
+
+
diff --git a/app/components/app/sep/entry-form.vue b/app/components/app/sep/entry-form.vue
index e48d23ec..594d2f02 100644
--- a/app/components/app/sep/entry-form.vue
+++ b/app/components/app/sep/entry-form.vue
@@ -1,91 +1,362 @@
-
diff --git a/app/components/app/sep/list-cfg.control.ts b/app/components/app/sep/list-cfg.control.ts
new file mode 100644
index 00000000..40156465
--- /dev/null
+++ b/app/components/app/sep/list-cfg.control.ts
@@ -0,0 +1,51 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const SelectedRadio = defineAsyncComponent(() => import('~/components/pub/my-ui/data/select-radio.vue'))
+
+export const config: Config = {
+ cols: [
+ { width: 50 },
+ { width: 150 },
+ { width: 120 },
+ { width: 120 },
+ { width: 120 },
+ { width: 120 },
+ { width: 120 },
+ { width: 150 },
+ ],
+
+ headers: [
+ [
+ { label: '' },
+ { label: 'NO. SURAT KONTROL' },
+ { label: 'TANGGAL SURAT KONTROL' },
+ { label: 'NO. SEP' },
+ { label: 'NAMA PASIEN' },
+ { label: 'NO. KARTU BPJS' },
+ { label: 'KLINIK TUJUAN' },
+ { label: 'DOKTER' },
+ ],
+ ],
+
+ keys: ['check', 'letterNumber', 'plannedDate', 'sepNumber', 'patientName', 'bpjsCardNo', 'clinic', 'doctor'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Code' },
+ { key: 'name', label: 'Name' },
+ ],
+
+ parses: {},
+
+ components: {
+ check(rec, idx) {
+ return {
+ idx,
+ rec: { ...(rec as object), menu: 'letter' },
+ component: SelectedRadio,
+ }
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/sep/list-cfg.history.ts b/app/components/app/sep/list-cfg.history.ts
new file mode 100644
index 00000000..5e46a335
--- /dev/null
+++ b/app/components/app/sep/list-cfg.history.ts
@@ -0,0 +1,63 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+export interface SepHistoryData {
+ sepNumber: string
+ sepDate: string
+ referralNumber: string
+ diagnosis: string
+ serviceType: string
+ careClass: string
+}
+
+const ActionHistory = defineAsyncComponent(() => import('~/components/app/sep/action-history.vue'))
+
+const keysDefault = ['sepNumber', 'sepDate', 'referralNumber', 'diagnosis', 'serviceType', 'careClass']
+const colsDefault = [{ width: 100 }, { width: 100 }, { width: 100 }, { width: 100 }, { width: 100 }, { width: 100 }]
+const headersDefault = [
+ { label: 'NO. SEP' },
+ { label: 'TGL. SEP' },
+ { label: 'NO. RUJUKAN' },
+ { label: 'DIAGNOSIS AWAL' },
+ { label: 'JENIS PELAYANAN' },
+ { label: 'KELAS RAWAT' },
+]
+
+export const config: Config = {
+ cols: [...colsDefault],
+
+ headers: [[...headersDefault]],
+
+ keys: [...keysDefault],
+
+ delKeyNames: [{ key: 'code', label: 'Kode' }],
+
+ parses: {},
+
+ components: {},
+
+ htmls: {},
+}
+
+export const configDetail: Config = {
+ cols: [...colsDefault, { width: 50 }],
+
+ headers: [[...headersDefault, { label: 'AKSI' }]],
+
+ keys: [...keysDefault, 'action'],
+
+ delKeyNames: [{ key: 'code', label: 'Kode' }],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: { ...(rec as object) },
+ component: ActionHistory,
+ }
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/sep/list-cfg.letter.ts b/app/components/app/sep/list-cfg.letter.ts
new file mode 100644
index 00000000..44458afc
--- /dev/null
+++ b/app/components/app/sep/list-cfg.letter.ts
@@ -0,0 +1,51 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const SelectedRadio = defineAsyncComponent(() => import('~/components/pub/my-ui/data/select-radio.vue'))
+
+export interface LetterData {
+ letterNumber: string
+ plannedDate: string
+ sepNumber: string
+ patientName: string
+ bpjsCardNo: string
+ clinic: string
+ doctor?: string
+}
+
+export const config: Config = {
+ cols: [{ width: 50 }, { width: 150 }, { width: 120 }, { width: 120 }, { width: 120 }, { width: 120 }, { width: 120 }],
+
+ headers: [
+ [
+ { label: '' },
+ { label: 'NO. SURAT RUJUKAN' },
+ { label: 'TANGGAL SURAT RUJUKAN' },
+ { label: 'NO. SEP' },
+ { label: 'NAMA PASIEN' },
+ { label: 'NO. KARTU BPJS' },
+ { label: 'KLINIK TUJUAN' },
+ ],
+ ],
+
+ keys: ['check', 'letterNumber', 'plannedDate', 'sepNumber', 'patientName', 'bpjsCardNo', 'clinic'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Code' },
+ { key: 'name', label: 'Name' },
+ ],
+
+ parses: {},
+
+ components: {
+ check(rec, idx) {
+ return {
+ idx,
+ rec: { ...(rec as object), menu: 'letter' },
+ component: SelectedRadio,
+ }
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/sep/list-cfg.ts b/app/components/app/sep/list-cfg.ts
index 4a6784fc..2c3e7af8 100644
--- a/app/components/app/sep/list-cfg.ts
+++ b/app/components/app/sep/list-cfg.ts
@@ -1,9 +1,7 @@
import type { Config } from '~/components/pub/my-ui/data-table'
import { defineAsyncComponent } from 'vue'
-type SepDto = any
-
-const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dd.vue'))
export const config: Config = {
cols: [
@@ -41,24 +39,24 @@ export const config: Config = {
],
keys: [
- 'tgl_sep',
- 'no_sep',
- 'pelayanan',
- 'jalur',
- 'no_rm',
- 'nama_pasien',
- 'no_kartu_bpjs',
- 'no_surat_kontrol',
- 'tgl_surat_kontrol',
- 'klinik_tujuan',
- 'dpjp',
- 'diagnosis_awal',
+ 'letterDate',
+ 'letterNumber',
+ 'serviceType',
+ 'flow',
+ 'medicalRecordNumber',
+ 'patientName',
+ 'cardNumber',
+ 'controlLetterNumber',
+ 'controlLetterDate',
+ 'clinicDestination',
+ 'attendingDoctor',
+ 'diagnosis',
'action',
],
delKeyNames: [
- { key: 'no_sep', label: 'NO. SEP' },
- { key: 'nama_pasien', label: 'Nama Pasien' },
+ { key: 'letterNumber', label: 'NO. SEP' },
+ { key: 'patientName', label: 'Nama Pasien' },
],
parses: {},
diff --git a/app/components/app/sep/list-cfg.visit.ts b/app/components/app/sep/list-cfg.visit.ts
new file mode 100644
index 00000000..3de1f0a3
--- /dev/null
+++ b/app/components/app/sep/list-cfg.visit.ts
@@ -0,0 +1,50 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+export interface SepVisitData {
+ letterNumber: string
+ letterDate: string
+ sepNumber: string
+ patientName: string
+ bpjsNumber: string
+ poly: string
+ diagnosis: string
+ serviceType: string
+ careClass: string
+}
+
+export const config: Config = {
+ cols: [
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ ],
+
+ headers: [
+ [
+ { label: 'NO. SURAT KONTROL' },
+ { label: 'TGL RENCANA KONTROL' },
+ { label: 'NO. SEP' },
+ { label: 'NAMA PASIEN' },
+ { label: 'NO. KARTU BPJS' },
+ { label: 'DIAGNOSIS AWAL' },
+ { label: 'JENIS PELAYANAN' },
+ { label: 'KELAS RAWAT' },
+ ],
+ ],
+
+ keys: ['letterNumber', 'letterDate', 'sepNumber', 'patientName', 'bpjsNumber', 'diagnosis', 'serviceType', 'careClass'],
+
+ delKeyNames: [{ key: 'code', label: 'Kode' }],
+
+ parses: {},
+
+ components: {},
+
+ htmls: {},
+}
diff --git a/app/components/app/sep/list-history.vue b/app/components/app/sep/list-history.vue
new file mode 100644
index 00000000..cea58e3d
--- /dev/null
+++ b/app/components/app/sep/list-history.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
diff --git a/app/components/app/sep/list-letter.vue b/app/components/app/sep/list-letter.vue
new file mode 100644
index 00000000..b4b9b3fe
--- /dev/null
+++ b/app/components/app/sep/list-letter.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/sep/list-visit.vue b/app/components/app/sep/list-visit.vue
new file mode 100644
index 00000000..ed6aec77
--- /dev/null
+++ b/app/components/app/sep/list-visit.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
diff --git a/app/components/app/sep/list.vue b/app/components/app/sep/list.vue
index f44166e2..78a0b740 100644
--- a/app/components/app/sep/list.vue
+++ b/app/components/app/sep/list.vue
@@ -1,29 +1,18 @@
diff --git a/app/components/app/sep/print-preview.vue b/app/components/app/sep/print-preview.vue
new file mode 100644
index 00000000..92ba7324
--- /dev/null
+++ b/app/components/app/sep/print-preview.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ SURAT ELIGIBILITAS PESERTA
+ RSUD dr. Saiful Anwar
+
+
+
+ Peserta: {{ sepData?.peserta?.jenisPeserta || "-" }}
+
+
+
+
+
+
+
+
+
+ No. SEP : {{ sepData?.noSEP }}
+ Tgl. SEP : {{ sepData?.tglSEP }}
+ No. Kartu : {{ sepData?.noKartu }}
+ Nama Peserta : {{ sepData?.nama }}
+ Tgl. Lahir : {{ sepData?.tglLahir }} Kelamin: {{ sepData?.kelamin }}
+ No. Telepon : {{ sepData?.telepon }}
+ Sub/Spesialis : {{ sepData?.spesialis }}
+ Dokter : {{ sepData?.dokter }}
+ Faskes Perujuk : {{ sepData?.faskes }}
+ Diagnosa Awal : {{ sepData?.diagnosa }}
+ Catatan : {{ sepData?.catatan }}
+
+
+
+
+ Jns. Rawat : {{ sepData?.jenisRawat }}
+ Jns. Kunjungan : {{ sepData?.jenisKunjungan }}
+ Poli Perujuk : {{ sepData?.poliPerujuk }}
+ Kls. Hak : {{ sepData?.kelasHak }}
+ Kls. Rawat : {{ sepData?.kelasRawat }}
+ Penjamin : {{ sepData?.penjamin }}
+
+
+ Persetujuan
+ Pasien/Keluarga Pasien
+ ![QR Code]()
+ {{ sepData?.nama }}
+
+
+
+
+
+
+
+
+ *Saya menyetujui BPJS Kesehatan untuk:
+
+ - membuka dan atau menggunakan informasi medis Pasien untuk keperluan administrasi dan pembiayaan
+ - memberikan akses informasi kepada tenaga medis di RSUD Dr. Saiful Anwar
+ - Penjaminan lainnya sesuai ketentuan yang berlaku
+
+
+ Cetakan ke {{ sepData?.cetakanKe || 1 }} |
+ {{ sepData?.tglCetak }}
+
+
+
+
+
+
diff --git a/app/components/app/sep/small-entry.vue b/app/components/app/sep/small-entry.vue
deleted file mode 100644
index a5372099..00000000
--- a/app/components/app/sep/small-entry.vue
+++ /dev/null
@@ -1,218 +0,0 @@
-
-
-
-
-
-
diff --git a/app/components/app/sep/table-history-sep.vue b/app/components/app/sep/table-history-sep.vue
deleted file mode 100644
index bfe00e51..00000000
--- a/app/components/app/sep/table-history-sep.vue
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
diff --git a/app/components/app/sep/table-search-letter.vue b/app/components/app/sep/table-search-letter.vue
deleted file mode 100644
index 64e65ff6..00000000
--- a/app/components/app/sep/table-search-letter.vue
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
diff --git a/app/components/app/sep/table-search-patient.vue b/app/components/app/sep/table-search-patient.vue
deleted file mode 100644
index 13a78651..00000000
--- a/app/components/app/sep/table-search-patient.vue
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
-
diff --git a/app/components/app/sep/view-history.vue b/app/components/app/sep/view-history.vue
new file mode 100644
index 00000000..13b54feb
--- /dev/null
+++ b/app/components/app/sep/view-history.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
diff --git a/app/components/app/sep/view-letter.vue b/app/components/app/sep/view-letter.vue
new file mode 100644
index 00000000..e1c0ecf2
--- /dev/null
+++ b/app/components/app/sep/view-letter.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
diff --git a/app/components/app/soapi/early-entry.vue b/app/components/app/soapi/early-entry.vue
index c5697a7a..4d2367be 100644
--- a/app/components/app/soapi/early-entry.vue
+++ b/app/components/app/soapi/early-entry.vue
@@ -4,24 +4,67 @@ import Cell from '~/components/pub/my-ui/doc-entry/cell.vue'
import Field from '~/components/pub/my-ui/doc-entry/field.vue'
import Label from '~/components/pub/my-ui/doc-entry/label.vue'
+// Helpers
+import type z from 'zod'
+import { toTypedSchema } from '@vee-validate/zod'
+import { useForm } from 'vee-validate'
+import { genBase } from '~/models/_base'
+
const props = defineProps<{
+ modelValue: any
+ schema: z.ZodSchema
excludeFields?: string[]
+ isReadonly?: boolean
}>()
-const emits = defineEmits(['click'])
+const emit = defineEmits<{
+ (e: 'update:modelValue', val: any): void
+ (e: 'submit', val: any): void
+}>()
-const subject = ref({
- 'prim-compl': '',
- 'sec-compl': '',
- 'cur-disea-hist': '',
- 'pas-disea-hist': '',
- 'fam-disea-hist': '',
- 'alg-hist': '',
- 'alg-react': '',
- 'med-hist': '',
- 'blood-type': '',
+// Setup form
+const {
+ validate: _validate,
+ defineField,
+ handleSubmit,
+ errors,
+ values,
+} = useForm({
+ validationSchema: toTypedSchema(props.schema),
+ initialValues: props.modelValue,
})
+watch(values, (val) => emit('update:modelValue', val), { deep: true })
+
+const [primaryComplaint, primaryComplaintAttrs] = defineField('prim-compl')
+const [curDiseaseHistory, curDiseaseHistoryAttrs] = defineField('cur-disea-hist')
+const [systolic, systolicAttrs] = defineField('syst-bp')
+const [diastolic, diastolicAttrs] = defineField('diast-bp')
+const [pulse, pulseAttrs] = defineField('pulse')
+const [respiratoryRate, respiratoryRateAttrs] = defineField('resp-rate')
+const [temperature, temperatureAttrs] = defineField('temp')
+const [weight, weightAttrs] = defineField('weight')
+const [height, heightAttrs] = defineField('height')
+const [bloodGroup, bloodGroupAttrs] = defineField('reflect-fisio')
+const [physicalExamination, physicalExaminationAttrs] = defineField('reflect-pato')
+const [diagnosisMedical, diagnosisMedicalAttrs] = defineField('autonom-neuron')
+const [medicalPlan, medicalPlanAttrs] = defineField('medical-act')
+const [therapy, therapyAttrs] = defineField('therapy')
+
+const validate = async () => {
+ const result = await _validate()
+ console.log('Component validate() result:', result)
+
+ return {
+ valid: true,
+ data: result.values,
+ errors: result.errors,
+ }
+}
+
+defineExpose({ validate })
+const icdPreview = inject('icdPreview')
+
const isExcluded = (key: string) => props.excludeFields?.includes(key)
@@ -34,11 +77,17 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
-
+
@@ -50,11 +99,17 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
-
+
@@ -66,11 +121,17 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
-
+
@@ -79,88 +140,141 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
-
-
+
+
|
|
-
+
|
-
+
|
-
+
|
-
+
|
-
+
|
-
+
|
-
+
|
-
+
|
-
+
|
-
+
|
@@ -171,9 +285,10 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
+ Pilih Diagnosa
+ + Pilih Diagnosa
+
@@ -183,37 +298,47 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
+ Pilih Prosedur
+ + Pilih Prosedur
+
-
+
|
-
+
|
-
+
|
diff --git a/app/components/app/soapi/early-rehab-entry.vue b/app/components/app/soapi/early-rehab-entry.vue
index 61beb0f3..e4ec3114 100644
--- a/app/components/app/soapi/early-rehab-entry.vue
+++ b/app/components/app/soapi/early-rehab-entry.vue
@@ -4,24 +4,89 @@ import Cell from '~/components/pub/my-ui/doc-entry/cell.vue'
import Field from '~/components/pub/my-ui/doc-entry/field.vue'
import Label from '~/components/pub/my-ui/doc-entry/label.vue'
+// Helpers
+import type z from 'zod'
+import { toTypedSchema } from '@vee-validate/zod'
+import { useForm } from 'vee-validate'
+import { genBase } from '~/models/_base'
+
const props = defineProps<{
+ modelValue: any
+ schema: z.ZodSchema
excludeFields?: string[]
+ isReadonly?: boolean
}>()
-const emits = defineEmits(['click'])
+const emit = defineEmits<{
+ (e: 'update:modelValue', val: any): void
+ (e: 'submit', val: any): void
+}>()
-const subject = ref({
- 'prim-compl': '',
- 'sec-compl': '',
- 'cur-disea-hist': '',
- 'pas-disea-hist': '',
- 'fam-disea-hist': '',
- 'alg-hist': '',
- 'alg-react': '',
- 'med-hist': '',
- 'blood-type': '',
+// Setup form
+const {
+ validate: _validate,
+ defineField,
+ handleSubmit,
+ errors,
+ values,
+} = useForm({
+ validationSchema: toTypedSchema(props.schema),
+ initialValues: props.modelValue,
})
+watch(values, (val) => emit('update:modelValue', val), { deep: true })
+
+const [primaryComplaint, primaryComplaintAttrs] = defineField('prim-compl')
+const [medicalPlan, medicalPlanAttrs] = defineField('medical-plan')
+const [diagnosisMedical, diagnosisMedicalAttrs] = defineField('diagnosis-medical')
+const [rehabTrouble, rehabTroubleAttrs] = defineField('rehab-trouble')
+const [medicalTrouble, medicalTroubleAttrs] = defineField('medical-trouble')
+const [physicModal, physicModalAttrs] = defineField('physic-modal')
+const [exercise, exerciseAttrs] = defineField('exercise')
+const [orthoPesa, orthoPesaAttrs] = defineField('ortho-pesa')
+const [education, educationAttrs] = defineField('education')
+const [other, otherAttrs] = defineField('other')
+const [cranialis, cranialisAttrs] = defineField('cranialis')
+const [sensoris, sensorisAttrs] = defineField('sensoris')
+const [reflectFisio, reflectFisioAttrs] = defineField('reflect-fisio')
+const [reflectPato, reflectPatoAttrs] = defineField('reflect-pato')
+const [otonom, otonomAttrs] = defineField('otonom')
+const [localis, localisAttrs] = defineField('localis')
+const [medicalTrial, medicalTrialAttrs] = defineField('medical-trial')
+const [therapy, therapyAttrs] = defineField('therapy')
+const [systolic, systolicAttrs] = defineField('syst-bp')
+const [diastolic, diastolicAttrs] = defineField('diast-bp')
+const [pulse, pulseAttrs] = defineField('pulse')
+const [gcs, gcsAttrs] = defineField('gcs')
+const [respiratoryRate, respiratoryRateAttrs] = defineField('respiratory-rate')
+const [temperature, temperatureAttrs] = defineField('temperature')
+const [weight, weightAttrs] = defineField('weight')
+const [height, heightAttrs] = defineField('height')
+const [ambulance, ambulanceAttrs] = defineField('ambulance')
+const [gait, gaitAttrs] = defineField('gait')
+const [neckRom, neckRomAttrs] = defineField('neck-rom')
+const [bodyRom, bodyRomAttrs] = defineField('body-rom')
+const [agaRom, agaRomAttrs] = defineField('aga-rom')
+const [agbRom, agbRomAttrs] = defineField('agb-rom')
+const [neckMmt, neckMmtAttrs] = defineField('neck-mmt')
+const [bodyMmt, bodyMmtAttrs] = defineField('body-mmt')
+const [agaMmt, agaMmtAttrs] = defineField('aga-mmt')
+const [agbMmt, agbMmtAttrs] = defineField('agb-mmt')
+
+const validate = async () => {
+ const result = await _validate()
+ console.log('Component validate() result:', result)
+
+ return {
+ valid: true,
+ data: result.values,
+ errors: result.errors,
+ }
+}
+
+defineExpose({ validate })
+const icdPreview = inject('icdPreview')
+
const isExcluded = (key: string) => props.excludeFields?.includes(key)
@@ -36,8 +101,11 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
-
+
+
|
@@ -46,21 +114,30 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
-
+
|
@@ -77,22 +154,36 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
-
+
+
|
-
+
|
-
+
|
@@ -100,14 +191,21 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
props.excludeFields?.includes(key)
|
-
+
|
@@ -144,21 +245,30 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
-
+
|
@@ -166,13 +276,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
@@ -187,13 +303,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
@@ -201,13 +323,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
@@ -222,13 +350,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
@@ -236,13 +370,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
@@ -256,7 +396,10 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
@@ -271,7 +414,10 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
@@ -286,13 +432,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
@@ -301,10 +453,18 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
Diagnosa Fungsional (ICD-X)
+
+
+ + Pilih Prosedur
+
@@ -316,21 +476,30 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
-
+
|
@@ -338,13 +507,19 @@ const isExcluded = (key: string) => props.excludeFields?.includes(key)
-
+
|
-
+
|
diff --git a/app/components/app/soapi/entry.vue b/app/components/app/soapi/entry.vue
index ced3e3d8..e7eecf32 100644
--- a/app/components/app/soapi/entry.vue
+++ b/app/components/app/soapi/entry.vue
@@ -1,28 +1,48 @@
-
+
diff --git a/app/components/app/soapi/function-entry.vue b/app/components/app/soapi/function-entry.vue
index 98d35663..01276c03 100644
--- a/app/components/app/soapi/function-entry.vue
+++ b/app/components/app/soapi/function-entry.vue
@@ -4,24 +4,90 @@ import Cell from '~/components/pub/my-ui/doc-entry/cell.vue'
import Field from '~/components/pub/my-ui/doc-entry/field.vue'
import Label from '~/components/pub/my-ui/doc-entry/label.vue'
+// Helpers
+import type z from 'zod'
+import { toTypedSchema } from '@vee-validate/zod'
+import { useForm } from 'vee-validate'
+import { genBase } from '~/models/_base'
+
const props = defineProps<{
+ modelValue: any
+ schema: z.ZodSchema
excludeFields?: string[]
+ isReadonly?: boolean
}>()
-const emits = defineEmits(['click'])
+const emit = defineEmits<{
+ (e: 'update:modelValue', val: any): void
+ (e: 'submit', val: any): void
+}>()
-const subject = ref({
- 'prim-compl': '',
- 'sec-compl': '',
- 'cur-disea-hist': '',
- 'pas-disea-hist': '',
- 'fam-disea-hist': '',
- 'alg-hist': '',
- 'alg-react': '',
- 'med-hist': '',
- 'blood-type': '',
+// Setup form
+const {
+ validate: _validate,
+ defineField,
+ handleSubmit,
+ errors,
+ values,
+} = useForm({
+ validationSchema: toTypedSchema(props.schema),
+ initialValues: props.modelValue,
})
+watch(values, (val) => emit('update:modelValue', val), { deep: true })
+
+const [primaryComplaint, primaryComplaintAttrs] = defineField('prim-compl')
+const [pastDisease, pastDiseaseAttrs] = defineField('past-disease')
+const [currentDisease, currentDiseaseAttrs] = defineField('current-disease')
+const [gcs, gcsAttrs] = defineField('gcs')
+const [respiratoryRate, respiratoryRateAttrs] = defineField('respiratory-rate')
+const [respiratoryRateType, respiratoryRateTypeAttrs] = defineField('respiratory-rate-type')
+const [pulse, pulseAttrs] = defineField('pulse')
+const [pulseType, pulseTypeAttrs] = defineField('pulse-type')
+const [rightArmBp, rightArmBpAttrs] = defineField('right-arm-bp')
+const [leftArmBp, leftArmBpAttrs] = defineField('left-arm-bp')
+const [axillaryTemp, axillaryTempAttrs] = defineField('axillary-temp')
+const [rektalTemp, rektalTempAttrs] = defineField('rektal-temp')
+const [skin, skinAttrs] = defineField('skin')
+const [head, headAttrs] = defineField('head')
+const [ear, earAttrs] = defineField('ear')
+const [nose, noseAttrs] = defineField('nose')
+const [oralCavity, oralCavityAttrs] = defineField('oral-cavity')
+const [eye, eyeAttrs] = defineField('eye')
+const [otherBodyPart, otherBodyPartAttrs] = defineField('other-body-part')
+const [neck, neckAttrs] = defineField('neck')
+const [thyroid, thyroidAttrs] = defineField('thyroid')
+const [thorax, thoraxAttrs] = defineField('thorax')
+const [heart, heartAttrs] = defineField('heart')
+const [lung, lungAttrs] = defineField('lung')
+const [abdomen, abdomenAttrs] = defineField('abdomen')
+const [heart2, heart2Attrs] = defineField('heart2')
+const [lien, lienAttrs] = defineField('lien')
+const [back, backAttrs] = defineField('back')
+const [extremity, extremityAttrs] = defineField('extremity')
+const [gender, genderAttrs] = defineField('gender')
+const [rectum, rectumAttrs] = defineField('rectum')
+const [systemSyaraf, systemSyarafAttrs] = defineField('system-syaraf')
+const [nervousSystem, nervousSystemAttrs] = defineField('nervous-system')
+const [cardioRespiratory, cardioRespiratoryAttrs] = defineField('cardio-respiratory')
+const [imaging, imagingAttrs] = defineField('imaging')
+const [laboratory, laboratoryAttrs] = defineField('laboratory')
+
+const validate = async () => {
+ const result = await _validate()
+ console.log('Component validate() result:', result)
+
+ return {
+ valid: true,
+ data: result.values,
+ errors: result.errors,
+ }
+}
+
+defineExpose({ validate })
+
+const icdPreview = inject('icdPreview')
+
const isExcluded = (key: string) => props.excludeFields?.includes(key)
const disorders = ref([])
const therapies = ref([])
@@ -55,8 +121,11 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
-
+
+
|
@@ -65,14 +134,20 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -86,7 +161,7 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
@@ -100,7 +175,10 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
@@ -108,14 +186,20 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -123,13 +207,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -137,13 +227,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -151,13 +247,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -172,7 +274,10 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
@@ -183,19 +288,28 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
-
+
|
@@ -204,19 +318,28 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
-
+
|
@@ -227,13 +350,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -250,19 +379,28 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
|
-
+
|
-
+
|
-
+
|
@@ -281,19 +419,28 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
-
+
|
@@ -312,19 +459,28 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
-
+
|
@@ -332,13 +488,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -348,13 +510,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -369,13 +537,19 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
-
+
|
-
+
|
@@ -386,33 +560,33 @@ const therapyOptions = ['Terapi Latihan', 'Modalitas Fisik', 'Protesa/Ortosa', '
+ Pilih Prosedur
-
+
+ |
+
+ Diagnosa Fungsional (ICD-X)
+
+ + Pilih Prosedur
+
+
Diagnosa Medis (ICD-X)
+ Pilih Prosedur
-
-
-
- Diagnosa Medis (ICD-X)
-
- + Pilih Prosedur
-
-
+
diff --git a/app/components/app/soapi/list-cfg.ts b/app/components/app/soapi/list-cfg.ts
index 6fa11bda..3db1b24a 100644
--- a/app/components/app/soapi/list-cfg.ts
+++ b/app/components/app/soapi/list-cfg.ts
@@ -3,49 +3,24 @@ import { defineAsyncComponent } from 'vue'
type SmallDetailDto = any
-const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
export const config: Config = {
- cols: [
- {},
- {},
- {},
- { width: 100 },
- { width: 120 },
- {},
- {},
- {},
- { width: 100 },
- { width: 100 },
- {},
- { width: 50 },
- ],
+ cols: [{}, {}, {}, { width: 100 }, { width: 120 }, {}, {}, {}, { width: 100 }, { width: 100 }, {}, { width: 50 }],
headers: [
[
- { label: 'Nama' },
- { label: 'Rekam Medis' },
- { label: 'KTP' },
- { label: 'Tgl Lahir' },
- { label: 'Umur' },
- { label: 'JK' },
- { label: 'Pendidikan' },
+ { label: 'Tanggal' },
+ { label: 'DPJP' },
+ { label: 'Keluhan & Riwayat' },
+ { label: 'Pemeriksaan' },
+ { label: 'Diagnosa' },
{ label: 'Status' },
- { label: '' },
+ { label: 'Aksi' },
],
],
- keys: [
- 'name',
- 'medicalRecord_number',
- 'identity_number',
- 'birth_date',
- 'patient_age',
- 'gender',
- 'education',
- 'status',
- 'action',
- ],
+ keys: ['time', 'employee_id', 'main_complaint', 'encounter', 'diagnose', 'status', 'action'],
delKeyNames: [
{ key: 'code', label: 'Kode' },
@@ -53,45 +28,38 @@ export const config: Config = {
],
parses: {
- name: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- return `${recX.firstName} ${recX.middleName || ''} ${recX.lastName || ''}`
+ time(rec: any) {
+ return rec.time ? new Date(rec.time).toLocaleDateString() : ''
},
- identity_number: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (recX.identity_number?.substring(0, 5) === 'BLANK') {
- return '(TANPA NIK)'
+ main_complaint(rec: any) {
+ const { value } = rec ?? {}
+
+ if (typeof value !== 'string') return '-'
+
+ try {
+ const parsed = JSON.parse(value)
+ console.log('parsed', parsed)
+ return parsed?.['prim-compl'] || '-'
+ } catch {
+ return '-'
}
- return recX.identity_number
},
- birth_date: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (typeof recX.birth_date === 'object' && recX.birth_date) {
- return (recX.birth_date as Date).toLocaleDateString()
- } else if (typeof recX.birth_date === 'string') {
- return recX.birth_date.substring(0, 10)
+ encounter(rec: any) {
+ const data = rec?.encounter ?? {}
+ return data?.class_code || '-'
+ },
+ diagnose(rec: any) {
+ const { value } = rec ?? {}
+
+ if (typeof value !== 'string') return '-'
+
+ try {
+ const parsed = JSON.parse(value)
+ const diagnose = parsed?.diagnose || []
+ return diagnose.map((d: any) => d.name).join(', ')
+ } catch {
+ return '-'
}
- return recX.birth_date
- },
- patient_age: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- return recX.birth_date?.split('T')[0]
- },
- gender: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (typeof recX?.gender_code !== 'number' && recX?.gender_code !== '') {
- return 'Tidak Diketahui'
- }
- return recX.gender_code
- },
- education: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- if (typeof recX.education_code === 'number' && recX.education_code >= 0) {
- return recX.education_code
- } else if (typeof recX.education_code !== 'undefined') {
- return recX.education_code
- }
- return '-'
},
},
diff --git a/app/components/app/specialist-position/entry-detail.vue b/app/components/app/specialist-position/entry-detail.vue
new file mode 100644
index 00000000..099927f6
--- /dev/null
+++ b/app/components/app/specialist-position/entry-detail.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
diff --git a/app/components/app/specialist-position/entry-form.vue b/app/components/app/specialist-position/entry-form.vue
new file mode 100644
index 00000000..e1ef6009
--- /dev/null
+++ b/app/components/app/specialist-position/entry-form.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
diff --git a/app/components/app/specialist-position/list.cfg.ts b/app/components/app/specialist-position/list.cfg.ts
new file mode 100644
index 00000000..35f49c20
--- /dev/null
+++ b/app/components/app/specialist-position/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { DivisionPosition } from '~/models/division-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Nama Spesialis ' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['code', 'name', 'specialist.name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ employee: (rec: unknown): unknown => {
+ const recX = rec as DivisionPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/specialist-position/list.vue b/app/components/app/specialist-position/list.vue
new file mode 100644
index 00000000..6ad7dd81
--- /dev/null
+++ b/app/components/app/specialist-position/list.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/app/components/app/specialist/detail/index.vue b/app/components/app/specialist/detail/index.vue
new file mode 100644
index 00000000..3f32a78f
--- /dev/null
+++ b/app/components/app/specialist/detail/index.vue
@@ -0,0 +1,37 @@
+
+
+
+ {{ specialist.code || '-' }}
+ {{ specialist.name || '-' }}
+
+ {{ [specialist.unit?.code, specialist.unit?.name].filter(Boolean).join(' / ') || '-' }}
+
+
+
+
diff --git a/app/components/app/specialist/detail/list.cfg.ts b/app/components/app/specialist/detail/list.cfg.ts
new file mode 100644
index 00000000..8faf9e61
--- /dev/null
+++ b/app/components/app/specialist/detail/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { UnitPosition } from '~/models/unit-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: '#' },
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['index', 'code', 'name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ employee: (rec: unknown): unknown => {
+ const recX = rec as UnitPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/specialist/detail/list.vue b/app/components/app/specialist/detail/list.vue
new file mode 100644
index 00000000..da83e7ca
--- /dev/null
+++ b/app/components/app/specialist/detail/list.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/specialist/entry-form.vue b/app/components/app/specialist/entry-form.vue
index 70c0f294..8e9175cd 100644
--- a/app/components/app/specialist/entry-form.vue
+++ b/app/components/app/specialist/entry-form.vue
@@ -36,19 +36,19 @@ const { defineField, errors, meta } = useForm({
initialValues: {
code: '',
name: '',
- unit_id: 0,
+ unit_code: '',
} as Partial,
})
const [code, codeAttrs] = defineField('code')
const [name, nameAttrs] = defineField('name')
-const [unit, unitAttrs] = defineField('unit_id')
+const [unit, unitAttrs] = defineField('unit_code')
// Fill fields from props.values if provided
if (props.values) {
if (props.values.code !== undefined) code.value = props.values.code
if (props.values.name !== undefined) name.value = props.values.name
- if (props.values.unit_id !== undefined) unit.value = props.values.unit_id ? String(props.values.unit_id) : null
+ if (props.values.unit_code !== undefined) unit.value = props.values.unit_code ? String(props.values.unit_code) : null
}
const resetForm = () => {
@@ -63,7 +63,7 @@ function onSubmitForm(values: any) {
...genBase(),
name: name.value || '',
code: code.value || '',
- unit_id: unit.value ? Number(unit.value) : null,
+ unit_code: unit.value ? String(unit.value) : null,
}
emit('submit', formData, resetForm)
}
diff --git a/app/components/app/specialist/list-cfg.ts b/app/components/app/specialist/list-cfg.ts
index 8ed75f28..010358c4 100644
--- a/app/components/app/specialist/list-cfg.ts
+++ b/app/components/app/specialist/list-cfg.ts
@@ -8,16 +8,9 @@ const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dr
export const config: Config = {
cols: [{}, {}, {}, { width: 50 }],
- headers: [
- [
- { label: 'Kode' },
- { label: 'Nama' },
- { label: 'Unit' },
- { label: '' },
- ],
- ],
+ headers: [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Nama Unit' }, { label: '' }]],
- keys: ['code', 'name', 'unit', 'action'],
+ keys: ['code', 'name', 'unit.name', 'action'],
delKeyNames: [
{ key: 'code', label: 'Kode' },
@@ -29,10 +22,6 @@ export const config: Config = {
const recX = rec as SmallDetailDto
return `${recX.name}`.trim()
},
- unit: (rec: unknown): unknown => {
- const recX = rec as SmallDetailDto
- return recX.unit_id || '-'
- },
},
components: {
diff --git a/app/components/app/subspecialist-position/entry-detail.vue b/app/components/app/subspecialist-position/entry-detail.vue
new file mode 100644
index 00000000..2a3e5e1c
--- /dev/null
+++ b/app/components/app/subspecialist-position/entry-detail.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
diff --git a/app/components/app/subspecialist-position/entry-form.vue b/app/components/app/subspecialist-position/entry-form.vue
new file mode 100644
index 00000000..4522d82c
--- /dev/null
+++ b/app/components/app/subspecialist-position/entry-form.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
diff --git a/app/components/app/subspecialist-position/list.cfg.ts b/app/components/app/subspecialist-position/list.cfg.ts
new file mode 100644
index 00000000..028bc7bf
--- /dev/null
+++ b/app/components/app/subspecialist-position/list.cfg.ts
@@ -0,0 +1,65 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { SubSpecialistPosition } from '~/models/subspecialist-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Nama Sub Spesialis ' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['code', 'name', 'subspecialist', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ subspecialist: (rec: unknown): unknown => {
+ const recX = rec as SubSpecialistPosition
+ return recX.subspecialist?.name || '-'
+ },
+ employee: (rec: unknown): unknown => {
+ const recX = rec as SubSpecialistPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/subspecialist-position/list.vue b/app/components/app/subspecialist-position/list.vue
new file mode 100644
index 00000000..6ad7dd81
--- /dev/null
+++ b/app/components/app/subspecialist-position/list.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/app/components/app/subspecialist/detail/index.vue b/app/components/app/subspecialist/detail/index.vue
new file mode 100644
index 00000000..154acf75
--- /dev/null
+++ b/app/components/app/subspecialist/detail/index.vue
@@ -0,0 +1,49 @@
+
+
+
+ {{ subspecialist.code || '-' }}
+ {{ subspecialist.name || '-' }}
+
+ {{ [subspecialist.specialist?.code, subspecialist.specialist?.name].filter(Boolean).join(' / ') || '-' }}
+
+
+ {{
+ [subspecialist.specialist?.unit?.code, subspecialist.specialist?.unit?.name].filter(Boolean).join(' / ') || '-'
+ }}
+
+
+ {{
+ [subspecialist.specialist?.unit?.installation?.code, subspecialist.specialist?.unit?.installation?.name]
+ .filter(Boolean)
+ .join(' / ') || '-'
+ }}
+
+
+
+
diff --git a/app/components/app/subspecialist/detail/list.cfg.ts b/app/components/app/subspecialist/detail/list.cfg.ts
new file mode 100644
index 00000000..8faf9e61
--- /dev/null
+++ b/app/components/app/subspecialist/detail/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { UnitPosition } from '~/models/unit-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: '#' },
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['index', 'code', 'name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ employee: (rec: unknown): unknown => {
+ const recX = rec as UnitPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/subspecialist/detail/list.vue b/app/components/app/subspecialist/detail/list.vue
new file mode 100644
index 00000000..11431e25
--- /dev/null
+++ b/app/components/app/subspecialist/detail/list.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/subspecialist/entry-form.vue b/app/components/app/subspecialist/entry-form.vue
index 8f176fb1..14a34eff 100644
--- a/app/components/app/subspecialist/entry-form.vue
+++ b/app/components/app/subspecialist/entry-form.vue
@@ -36,20 +36,20 @@ const { defineField, errors, meta } = useForm({
initialValues: {
code: '',
name: '',
- specialist_id: 0,
+ specialist_code: '',
} as Partial,
})
const [code, codeAttrs] = defineField('code')
const [name, nameAttrs] = defineField('name')
-const [specialist, specialistAttrs] = defineField('specialist_id')
+const [specialist, specialistAttrs] = defineField('specialist_code')
// Fill fields from props.values if provided
if (props.values) {
if (props.values.code !== undefined) code.value = props.values.code
if (props.values.name !== undefined) name.value = props.values.name
- if (props.values.specialist_id !== undefined)
- specialist.value = props.values.specialist_id ? String(props.values.specialist_id) : null
+ if (props.values.specialist_code !== undefined)
+ specialist.value = props.values.specialist_code ? String(props.values.specialist_code) : null
}
const resetForm = () => {
@@ -64,7 +64,7 @@ function onSubmitForm(values: any) {
...genBase(),
name: name.value || '',
code: code.value || '',
- specialist_id: specialist.value ? Number(specialist.value) : null,
+ specialist_code: specialist.value ? String(specialist.value) : "",
}
emit('submit', formData, resetForm)
}
diff --git a/app/components/app/subspecialist/list-cfg.ts b/app/components/app/subspecialist/list-cfg.ts
index 7e9e7b79..99d34169 100644
--- a/app/components/app/subspecialist/list-cfg.ts
+++ b/app/components/app/subspecialist/list-cfg.ts
@@ -8,16 +8,9 @@ const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dr
export const config: Config = {
cols: [{}, {}, {}, { width: 50 }],
- headers: [
- [
- { label: 'Kode' },
- { label: 'Nama' },
- { label: 'Specialis' },
- { label: '' },
- ],
- ],
+ headers: [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Specialis' }, { label: '' }]],
- keys: ['code', 'name', 'specialist', 'action'],
+ keys: ['code', 'name', 'specialist.name', 'action'],
delKeyNames: [
{ key: 'code', label: 'Kode' },
diff --git a/app/components/app/subspecialist/list.vue b/app/components/app/subspecialist/list.vue
index 1be60a60..2f7908cb 100644
--- a/app/components/app/subspecialist/list.vue
+++ b/app/components/app/subspecialist/list.vue
@@ -31,6 +31,9 @@ function handlePageChange(page: number) {
:rows="data"
:skeleton-size="paginationMeta?.pageSize"
/>
-
+
|
diff --git a/app/components/app/summary-medic/entry.vue b/app/components/app/summary-medic/entry.vue
new file mode 100644
index 00000000..f75e918e
--- /dev/null
+++ b/app/components/app/summary-medic/entry.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
diff --git a/app/components/app/summary-medic/list.cfg.ts b/app/components/app/summary-medic/list.cfg.ts
new file mode 100644
index 00000000..c2f57c54
--- /dev/null
+++ b/app/components/app/summary-medic/list.cfg.ts
@@ -0,0 +1,82 @@
+import type { Config, RecComponent, RecStrFuncComponent, RecStrFuncUnknown } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { GeneralConsent } from '~/models/general-consent'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+export const config: Config = {
+ cols: [{ width: 100 }, {}, {}, {}, { width: 50 }],
+ headers: [
+ [
+ { label: 'Tanggal' },
+ { label: 'Anggota Keluarga' },
+ { label: 'Penanggung Jawab' },
+ { label: 'Pemberi Informasi' },
+ { label: 'Saksi 1' },
+ { label: 'Saksi 2' },
+ { label: '' },
+ ],
+ ],
+ keys: ['date', 'relatives', 'responsible', 'informant', 'witness1', 'witness2', 'action'],
+ delKeyNames: [
+ { key: 'data', label: 'Tanggal' },
+ { key: 'dstDoctor.name', label: 'Dokter' },
+ ],
+ parses: {
+ date(rec) {
+ const recX = rec as GeneralConsent
+ return recX?.createdAt?.substring(0, 10) || '-'
+ },
+ relatives(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.relatives?.join(', ') || '-'
+ },
+ responsible(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.responsible || '-'
+ },
+ informant(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.informant || '-'
+ },
+ witness1(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.witness1 || '-'
+ },
+ witness2(rec) {
+ const recX = rec as GeneralConsent
+ const parsed = JSON.parse(recX?.value || '{}')
+ return parsed?.witness2 || '-'
+ },
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ } as RecStrFuncComponent,
+ htmls: {} as RecStrFuncUnknown,
+}
diff --git a/app/components/app/summary-medic/list.vue b/app/components/app/summary-medic/list.vue
new file mode 100644
index 00000000..46f595f5
--- /dev/null
+++ b/app/components/app/summary-medic/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/btn-history.vue b/app/components/app/surgery-report/_common/btn-history.vue
new file mode 100644
index 00000000..972eab8e
--- /dev/null
+++ b/app/components/app/surgery-report/_common/btn-history.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+ History
+
+
\ No newline at end of file
diff --git a/app/components/app/surgery-report/_common/filter.vue b/app/components/app/surgery-report/_common/filter.vue
new file mode 100644
index 00000000..d5e99b30
--- /dev/null
+++ b/app/components/app/surgery-report/_common/filter.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/history-dialog.vue b/app/components/app/surgery-report/_common/history-dialog.vue
new file mode 100644
index 00000000..4172aaec
--- /dev/null
+++ b/app/components/app/surgery-report/_common/history-dialog.vue
@@ -0,0 +1,52 @@
+
+
+
+
+ -
+
+
+
+
+
+
+ Ditambahkan Oleh : {{ item.updatedBy }}
+
+ Lihat Detail
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/surgery-report/_common/radio-blood-type.vue b/app/components/app/surgery-report/_common/radio-blood-type.vue
new file mode 100644
index 00000000..91def086
--- /dev/null
+++ b/app/components/app/surgery-report/_common/radio-blood-type.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-billing-code.vue b/app/components/app/surgery-report/_common/select-billing-code.vue
new file mode 100644
index 00000000..321c2d33
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-billing-code.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-birth-desc.vue b/app/components/app/surgery-report/_common/select-birth-desc.vue
new file mode 100644
index 00000000..2b19f3bc
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-birth-desc.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-birth-place-desc.vue b/app/components/app/surgery-report/_common/select-birth-place-desc.vue
new file mode 100644
index 00000000..c6f2ed06
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-birth-place-desc.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-date.vue b/app/components/app/surgery-report/_common/select-date.vue
new file mode 100644
index 00000000..0468c752
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-date.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-dissection-type.vue b/app/components/app/surgery-report/_common/select-dissection-type.vue
new file mode 100644
index 00000000..45708dac
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-dissection-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-dpjp-anastesi.vue b/app/components/app/surgery-report/_common/select-dpjp-anastesi.vue
new file mode 100644
index 00000000..b649c28f
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-dpjp-anastesi.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-dpjp-bedah.vue b/app/components/app/surgery-report/_common/select-dpjp-bedah.vue
new file mode 100644
index 00000000..b649c28f
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-dpjp-bedah.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-specimen-type.vue b/app/components/app/surgery-report/_common/select-specimen-type.vue
new file mode 100644
index 00000000..e1017e76
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-specimen-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-surgery-order.vue b/app/components/app/surgery-report/_common/select-surgery-order.vue
new file mode 100644
index 00000000..ff48d195
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-surgery-order.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-surgery-system-type.vue b/app/components/app/surgery-report/_common/select-surgery-system-type.vue
new file mode 100644
index 00000000..745904eb
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-surgery-system-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/_common/select-surgery-type.vue b/app/components/app/surgery-report/_common/select-surgery-type.vue
new file mode 100644
index 00000000..e396fe7d
--- /dev/null
+++ b/app/components/app/surgery-report/_common/select-surgery-type.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/detail.vue b/app/components/app/surgery-report/detail.vue
new file mode 100644
index 00000000..e0bb7727
--- /dev/null
+++ b/app/components/app/surgery-report/detail.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+ Dibuat oleh {{ `Dr. Agus` }} pada {{ `11 Agustus 2025, 20.00` }}
+ {{ props.instance?.date ? new
+ Date(props.instance?.date).toLocaleDateString('id-ID') : '-' }}
+
+
+ Tim Pelaksanaan Operasi
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+
+ Tindakan Operatif / Non Operatif Lain
+
+
+
+
+ No
+ Prosedur
+ Code
+
+
+
+
+ {{ idx + 1 }}
+ {{ field.name }}
+ {{ field.code }}
+
+
+
+
+
+
+
+ Data Pelaksanaan Operasi
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ 1 }} Jam {{ 1 }} Menit
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ 1 }} Jam {{ 1 }} Menit
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }} CC
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }} CC
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+ {{ `Example` }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/surgery-report/entry.vue b/app/components/app/surgery-report/entry.vue
new file mode 100644
index 00000000..8ac204f7
--- /dev/null
+++ b/app/components/app/surgery-report/entry.vue
@@ -0,0 +1,259 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/list.cfg.ts b/app/components/app/surgery-report/list.cfg.ts
new file mode 100644
index 00000000..6a63af13
--- /dev/null
+++ b/app/components/app/surgery-report/list.cfg.ts
@@ -0,0 +1,57 @@
+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: [{}, {}, {}, {}, {}, {}, {}, {},],
+
+ headers: [
+ [
+ { label: 'Tgl Laporan' },
+ { label: 'DPJP Bedah' },
+ { label: 'DPJP Anastesi' },
+ { label: 'Tgl Pembedahan' },
+ { label: 'Jenis Operasi' },
+ { label: 'Kode Billing' },
+ { label: 'Sistem Operasi' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['date', 'doctor.employee.person.name', 'doctor.employee.person.name', 'date', 'name', 'name', 'name', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/surgery-report/list.vue b/app/components/app/surgery-report/list.vue
new file mode 100644
index 00000000..8274e752
--- /dev/null
+++ b/app/components/app/surgery-report/list.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/operative-action/dropdown-action.vue b/app/components/app/surgery-report/operative-action/dropdown-action.vue
new file mode 100644
index 00000000..7dc56c86
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/dropdown-action.vue
@@ -0,0 +1,30 @@
+
+
+
+
+ Pilih
+
+
+
diff --git a/app/components/app/surgery-report/operative-action/list.cfg.ts b/app/components/app/surgery-report/operative-action/list.cfg.ts
new file mode 100644
index 00000000..eeb08cff
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/list.cfg.ts
@@ -0,0 +1,44 @@
+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('./dropdown-action.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {width: 30}, ],
+
+ headers: [
+ [
+ { label: 'Nama Prosedur' },
+ { label: 'Code' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['name', 'code', 'action',],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/surgery-report/operative-action/list.vue b/app/components/app/surgery-report/operative-action/list.vue
new file mode 100644
index 00000000..8b025e4f
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/list.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
diff --git a/app/components/app/surgery-report/operative-action/picker-dialog.vue b/app/components/app/surgery-report/operative-action/picker-dialog.vue
new file mode 100644
index 00000000..a568c159
--- /dev/null
+++ b/app/components/app/surgery-report/operative-action/picker-dialog.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+ {{ title }}
+
+
+ Pilih {{ title }}
+
+
+
+
+
+
+
+
+
+
+ Prosedur
+ Code
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/banner-patient-in-therapy.vue b/app/components/app/therapy-protocol/_common/banner-patient-in-therapy.vue
new file mode 100644
index 00000000..46ea79d9
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/banner-patient-in-therapy.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+ Pasien ini sedang menjalankan program terapi sampai {{ new Date(props.therapyEndDate).toDateString() }}
+
+
diff --git a/app/components/app/therapy-protocol/_common/btn-confirmation-detail.vue b/app/components/app/therapy-protocol/_common/btn-confirmation-detail.vue
new file mode 100644
index 00000000..e09432d5
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/btn-confirmation-detail.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Konfirmasi
+
+
diff --git a/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue b/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue
new file mode 100644
index 00000000..86953443
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/radio-illness-bcs-work.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/radio-relationship.vue b/app/components/app/therapy-protocol/_common/radio-relationship.vue
new file mode 100644
index 00000000..07aad8b8
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/radio-relationship.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-arrangement.vue b/app/components/app/therapy-protocol/_common/select-arrangement.vue
new file mode 100644
index 00000000..9a945d44
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-arrangement.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-date-range.vue b/app/components/app/therapy-protocol/_common/select-date-range.vue
new file mode 100644
index 00000000..c9048fcf
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-date-range.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+ {{ df.format(dateValueStart.toDate(getLocalTimeZone())) }} -
+ {{ df.format(dateValueEnd.toDate(getLocalTimeZone())) }}
+
+
+
+ {{ df.format(dateValueStart.toDate(getLocalTimeZone())) }}
+
+
+ Pick a date
+
+
+
+ (dateValueStart = startDate)" />
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-date.vue b/app/components/app/therapy-protocol/_common/select-date.vue
new file mode 100644
index 00000000..74245e7e
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-date.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-death-cause.vue b/app/components/app/therapy-protocol/_common/select-death-cause.vue
new file mode 100644
index 00000000..a155b139
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-death-cause.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-faskes.vue b/app/components/app/therapy-protocol/_common/select-faskes.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-faskes.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-primary-diagnosis.vue b/app/components/app/therapy-protocol/_common/select-primary-diagnosis.vue
new file mode 100644
index 00000000..0852195b
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-primary-diagnosis.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/select-secondary-diagnosis.vue b/app/components/app/therapy-protocol/_common/select-secondary-diagnosis.vue
new file mode 100644
index 00000000..a155b139
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/select-secondary-diagnosis.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/_common/text-captcha.vue b/app/components/app/therapy-protocol/_common/text-captcha.vue
new file mode 100644
index 00000000..de9d7f4b
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/text-captcha.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+ {{ errorMessage }}
+ Correct
+ Not case-sensitive
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/_common/verify-badge.vue b/app/components/app/therapy-protocol/_common/verify-badge.vue
new file mode 100644
index 00000000..30cd4c54
--- /dev/null
+++ b/app/components/app/therapy-protocol/_common/verify-badge.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+ {{ statusText }}
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/add-list.cfg.ts b/app/components/app/therapy-protocol/add-list.cfg.ts
new file mode 100644
index 00000000..856ae82b
--- /dev/null
+++ b/app/components/app/therapy-protocol/add-list.cfg.ts
@@ -0,0 +1,51 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+export const medicalDiagnosisConfig: Config = {
+ cols: [{width: 10}, {}, {},],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Diagnosa' },
+ { label: 'ICD-X' },
+ ],
+ ],
+
+ keys: ['number', 'diagnosis', 'icd_x'],
+
+ parses: { },
+}
+
+export const functionalDiagnosisConfig: Config = {
+ cols: [{width: 10}, {}, {},],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Diagnosa' },
+ { label: 'ICD-X' },
+ ],
+ ],
+
+ keys: ['number', 'diagnosis', 'icd_x'],
+
+ parses: { },
+}
+
+
+
+export const proceduralConfig: Config = {
+ cols: [{width: 10}, {}, {},],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Prosedur' },
+ { label: 'ICD-IX' },
+ ],
+ ],
+
+ keys: ['number', 'procedure', 'icd_x'],
+
+ parses: { },
+}
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/detail-list.cfg.ts b/app/components/app/therapy-protocol/detail-list.cfg.ts
new file mode 100644
index 00000000..e50113d7
--- /dev/null
+++ b/app/components/app/therapy-protocol/detail-list.cfg.ts
@@ -0,0 +1,28 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+const action = defineAsyncComponent(() => import('./_common/btn-confirmation-detail.vue'))
+
+export const detailTherapyProtocolListConfig: Config = {
+ cols: [{}, {}, {}, {width: 100},],
+
+ headers: [
+ [
+ { label: 'Program Kegiatan' },
+ { label: 'Paraf Terapis' },
+ { label: 'Paraf Dokter' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['program', 'therapistSign', 'doctorSign', 'action'],
+
+ parses: { },
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+}
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/detail.vue b/app/components/app/therapy-protocol/detail.vue
new file mode 100644
index 00000000..e57ff3b1
--- /dev/null
+++ b/app/components/app/therapy-protocol/detail.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+ Kembali
+
+
+
+
+ Form 1
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa bulan` }}
+
+
+
+
+ Form 2
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+
+ aaaaaa
+
+
+ aaaaaa
+
+
+ aaaaaa
+
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+
+
+
+
+ Form 3
+ {{ `aaaaaa` }}
+ {{ `aaaaaa` }}
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/edit.vue b/app/components/app/therapy-protocol/edit.vue
new file mode 100644
index 00000000..e871fc90
--- /dev/null
+++ b/app/components/app/therapy-protocol/edit.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/entry-form.vue b/app/components/app/therapy-protocol/entry-form.vue
new file mode 100644
index 00000000..22bae769
--- /dev/null
+++ b/app/components/app/therapy-protocol/entry-form.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/entry.vue b/app/components/app/therapy-protocol/entry.vue
new file mode 100644
index 00000000..48065416
--- /dev/null
+++ b/app/components/app/therapy-protocol/entry.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/base-textarea.vue b/app/components/app/therapy-protocol/field/base-textarea.vue
new file mode 100644
index 00000000..e6e7a63c
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/base-textarea.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/index.ts b/app/components/app/therapy-protocol/field/index.ts
new file mode 100644
index 00000000..f3df2c2d
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/index.ts
@@ -0,0 +1,4 @@
+export { default as RadioRelations } from './radio-relations.vue'
+export { default as SelectExaminationDate } from './select-examination-date.vue'
+export { default as BaseTextarea } from './base-textarea.vue'
+export { default as RadioWorkDisease } from './radio-work-disease.vue'
diff --git a/app/components/app/therapy-protocol/field/radio-relations.vue b/app/components/app/therapy-protocol/field/radio-relations.vue
new file mode 100644
index 00000000..aba12b86
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/radio-relations.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/radio-work-disease.vue b/app/components/app/therapy-protocol/field/radio-work-disease.vue
new file mode 100644
index 00000000..9eeaa0d8
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/radio-work-disease.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/field/select-examination-date.vue b/app/components/app/therapy-protocol/field/select-examination-date.vue
new file mode 100644
index 00000000..6ab232b9
--- /dev/null
+++ b/app/components/app/therapy-protocol/field/select-examination-date.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/history-dialog.vue b/app/components/app/therapy-protocol/history-dialog.vue
new file mode 100644
index 00000000..7bfcac10
--- /dev/null
+++ b/app/components/app/therapy-protocol/history-dialog.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/history-list.cfg.ts b/app/components/app/therapy-protocol/history-list.cfg.ts
new file mode 100644
index 00000000..0467589e
--- /dev/null
+++ b/app/components/app/therapy-protocol/history-list.cfg.ts
@@ -0,0 +1,45 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dp.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 140}, {width: 3},],
+
+ headers: [
+ [
+ { label: 'Tgl Pemeriksaan' },
+ { label: 'DPJP' },
+ { label: 'Anamnesa' },
+ { label: 'Permintaan Terapi' },
+ { label: 'Program/Kegiatan' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['birth_date', 'person.name', 'person.name', 'person.name', 'birth_date', "action"],
+
+ parses: {
+ 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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+}
diff --git a/app/components/app/therapy-protocol/list.cfg.ts b/app/components/app/therapy-protocol/list.cfg.ts
new file mode 100644
index 00000000..34155752
--- /dev/null
+++ b/app/components/app/therapy-protocol/list.cfg.ts
@@ -0,0 +1,53 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import type { Patient } from '~/models/patient'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-duvp.vue'))
+const statusBadge = defineAsyncComponent(() => import('./_common/verify-badge.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 140}, {width: 3},],
+
+ headers: [
+ [
+ { label: 'Tgl Pemeriksaan' },
+ { label: 'Anamnesa' },
+ { label: 'Permintaan Terapi' },
+ { label: 'Program' },
+ { label: 'Status' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['anamnesis', 'anamnesis', 'anamnesis', 'anamnesis', 'status', 'action'],
+
+ parses: {
+ 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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ status(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: statusBadge,
+ }
+ },
+ },
+}
diff --git a/app/components/app/therapy-protocol/list.vue b/app/components/app/therapy-protocol/list.vue
new file mode 100644
index 00000000..0d62cc6c
--- /dev/null
+++ b/app/components/app/therapy-protocol/list.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/dropdown-action-p.vue b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/dropdown-action-p.vue
new file mode 100644
index 00000000..91e9f72c
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list-cfg.ts b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list-cfg.ts
new file mode 100644
index 00000000..cc02aa1d
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list-cfg.ts
@@ -0,0 +1,33 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./dropdown-action-p.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
+
+ keys: ['code', 'name', 'indName', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama (FHIR)' },
+ { key: 'indName', label: 'Nama (ID)' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
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
new file mode 100644
index 00000000..e4836c7c
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-list.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
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
new file mode 100644
index 00000000..4a44a40f
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/arrangement-procedure/procedure-picker.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+ {{ title }}
+
+
+ Pilih Diagnosis
+
+
+
+
+
+
+
+
+
+
+ Prosedur
+ ICD-X
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list-cfg.ts b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list-cfg.ts
new file mode 100644
index 00000000..cc02aa1d
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list-cfg.ts
@@ -0,0 +1,33 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./dropdown-action-p.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
+
+ keys: ['code', 'name', 'indName', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama (FHIR)' },
+ { key: 'indName', label: 'Nama (ID)' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list.vue b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list.vue
new file mode 100644
index 00000000..67be3075
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-list.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-picker.vue b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-picker.vue
new file mode 100644
index 00000000..e609450b
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/diagnosis-picker.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+ {{ title }}
+
+
+ Pilih Diagnosis
+
+
+
+
+
+
+
+
+
+
+ Diagnosis
+ ICD-X
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/dropdown-action-p.vue b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/dropdown-action-p.vue
new file mode 100644
index 00000000..ac7c8f29
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/functional-diagnosis/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list-cfg.ts b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list-cfg.ts
new file mode 100644
index 00000000..cc02aa1d
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list-cfg.ts
@@ -0,0 +1,33 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('./dropdown-action-p.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, { width: 50 }],
+
+ headers: [[{ label: 'Kode' }, { label: 'Nama (FHIR)' }, { label: 'Nama (ID)' }, { label: '' }]],
+
+ keys: ['code', 'name', 'indName', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama (FHIR)' },
+ { key: 'indName', label: 'Nama (ID)' },
+ ],
+
+ parses: {},
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list.vue b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list.vue
new file mode 100644
index 00000000..d299219f
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-list.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-picker.vue b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-picker.vue
new file mode 100644
index 00000000..76ce6dfd
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/diagnosis-picker.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+ {{ title }}
+
+
+ Pilih Diagnosis
+
+
+
+
+
+
+
+
+
+
+ Diagnosis
+ ICD-X
+ Action
+
+
+
+
+ {{ field.value?.name }}
+ {{ field.value?.code }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/dropdown-action-p.vue b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/dropdown-action-p.vue
new file mode 100644
index 00000000..a30ca20c
--- /dev/null
+++ b/app/components/app/therapy-protocol/picker-dialog/medical-diagnosis/dropdown-action-p.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/therapy-protocol/verify-dialog.vue b/app/components/app/therapy-protocol/verify-dialog.vue
new file mode 100644
index 00000000..d72a96c2
--- /dev/null
+++ b/app/components/app/therapy-protocol/verify-dialog.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
diff --git a/app/components/app/unit-position/entry-form.vue b/app/components/app/unit-position/entry-form.vue
new file mode 100644
index 00000000..ea2efc09
--- /dev/null
+++ b/app/components/app/unit-position/entry-form.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
diff --git a/app/components/app/unit-position/list.cfg.ts b/app/components/app/unit-position/list.cfg.ts
new file mode 100644
index 00000000..fb5e319b
--- /dev/null
+++ b/app/components/app/unit-position/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { UnitPosition } from '~/models/unit-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Nama Unit ' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['code', 'name', 'unit.name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ employee: (rec: unknown): unknown => {
+ const recX = rec as UnitPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/unit-position/list.vue b/app/components/app/unit-position/list.vue
new file mode 100644
index 00000000..6ad7dd81
--- /dev/null
+++ b/app/components/app/unit-position/list.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/app/components/app/unit/detail/index.vue b/app/components/app/unit/detail/index.vue
new file mode 100644
index 00000000..9b38aa2b
--- /dev/null
+++ b/app/components/app/unit/detail/index.vue
@@ -0,0 +1,35 @@
+
+
+
+ {{ unit.code || '-' }}
+ {{ unit.name || '-' }}
+
+
+
+
diff --git a/app/components/app/unit/detail/list.cfg.ts b/app/components/app/unit/detail/list.cfg.ts
new file mode 100644
index 00000000..8faf9e61
--- /dev/null
+++ b/app/components/app/unit/detail/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { UnitPosition } from '~/models/unit-position'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [
+ [
+ { label: '#' },
+ { label: 'Kode Posisi' },
+ { label: 'Nama Posisi' },
+ { label: 'Karyawan' },
+ { label: 'Status Kepala' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['index', 'code', 'name', 'employee', 'head', 'action'],
+
+ delKeyNames: [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+ ],
+
+ parses: {
+ employee: (rec: unknown): unknown => {
+ const recX = rec as UnitPosition
+ const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle]
+ .filter(Boolean)
+ .join(' ')
+ .trim()
+
+ return fullName || '-'
+ },
+ head: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return recX.headStatus ? 'Ya' : 'Tidak'
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ props: {
+ size: 'sm',
+ },
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/unit/detail/list.vue b/app/components/app/unit/detail/list.vue
new file mode 100644
index 00000000..f878d14c
--- /dev/null
+++ b/app/components/app/unit/detail/list.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/app/components/app/unit/entry-form.vue b/app/components/app/unit/entry-form.vue
index 1b369695..e6c80df6 100644
--- a/app/components/app/unit/entry-form.vue
+++ b/app/components/app/unit/entry-form.vue
@@ -35,20 +35,20 @@ const { defineField, errors, meta } = useForm({
initialValues: {
code: '',
name: '',
- installation_id: 0,
+ installation_code: '',
} as Partial,
})
const [code, codeAttrs] = defineField('code')
const [name, nameAttrs] = defineField('name')
-const [installation, installationAttrs] = defineField('installation_id')
+const [installation, installationAttrs] = defineField('installation_code')
// Fill fields from props.values if provided
if (props.values) {
if (props.values.code !== undefined) code.value = props.values.code
if (props.values.name !== undefined) name.value = props.values.name
- if (props.values.installation_id !== undefined)
- installation.value = props.values.installation_id ? Number(props.values.installation_id) : null
+ if (props.values.installation_code !== undefined)
+ installation.value = props.values.installation_code ? String(props.values.installation_code) : null
}
const resetForm = () => {
@@ -62,7 +62,7 @@ function onSubmitForm() {
const formData: UnitFormData = {
name: name.value || '',
code: code.value || '',
- installation_id: installation.value ? Number(installation.value) : null,
+ installation_code: installation.value ? String(installation.value) : "",
}
emit('submit', formData, resetForm)
}
diff --git a/app/components/app/vaccine-data/_common/select-date.vue b/app/components/app/vaccine-data/_common/select-date.vue
new file mode 100644
index 00000000..d94d04eb
--- /dev/null
+++ b/app/components/app/vaccine-data/_common/select-date.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+ {
+ const dateStr = typeof value === 'number' ? String(value) : value
+ patientAge = calculateAge(dateStr)
+ }
+ "
+ />
+
+
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/_common/select-vaccine-type.vue b/app/components/app/vaccine-data/_common/select-vaccine-type.vue
new file mode 100644
index 00000000..cde3fb66
--- /dev/null
+++ b/app/components/app/vaccine-data/_common/select-vaccine-type.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/detail.vue b/app/components/app/vaccine-data/detail.vue
new file mode 100644
index 00000000..2c79e461
--- /dev/null
+++ b/app/components/app/vaccine-data/detail.vue
@@ -0,0 +1,68 @@
+
+
+
+
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+ {{ props.instance?.date ? props.instance?.date : '-' }}
+
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/entry.vue b/app/components/app/vaccine-data/entry.vue
new file mode 100644
index 00000000..4b8f291b
--- /dev/null
+++ b/app/components/app/vaccine-data/entry.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
diff --git a/app/components/app/vaccine-data/list-doctor.cfg.ts b/app/components/app/vaccine-data/list-doctor.cfg.ts
new file mode 100644
index 00000000..be938aa5
--- /dev/null
+++ b/app/components/app/vaccine-data/list-doctor.cfg.ts
@@ -0,0 +1,53 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import actionDoctor from '~/components/pub/my-ui/data/dropdown-action-dd.vue'
+import actionNursePhysio from '~/components/pub/my-ui/data/dropdown-action-detail.vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Jenis Vaksin' },
+ { label: 'Tanggal Pemberian Vaksin' },
+ { label: 'Tanggal Kedaluwarsa Vaksin' },
+ { label: 'Dosis Ke' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['name1', 'date', 'date', 'name2', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/vaccine-data/list-nurse-physio.cfg.ts b/app/components/app/vaccine-data/list-nurse-physio.cfg.ts
new file mode 100644
index 00000000..acfc698c
--- /dev/null
+++ b/app/components/app/vaccine-data/list-nurse-physio.cfg.ts
@@ -0,0 +1,53 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import actionDoctor from '~/components/pub/my-ui/data/dropdown-action-dd.vue'
+import actionNursePhysio from '~/components/pub/my-ui/data/dropdown-action-detail.vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-detail.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {width: 50}, ],
+
+ headers: [
+ [
+ { label: 'Jenis Vaksin' },
+ { label: 'Tanggal Pemberian Vaksin' },
+ { label: 'Tanggal Kedaluwarsa Vaksin' },
+ { label: 'Dosis Ke' },
+ { label: 'Action' },
+ ],
+ ],
+
+ keys: ['name1', 'date', 'date', 'name2', '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
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {
+
+ },
+}
diff --git a/app/components/app/vaccine-data/list.vue b/app/components/app/vaccine-data/list.vue
new file mode 100644
index 00000000..7960112b
--- /dev/null
+++ b/app/components/app/vaccine-data/list.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.firstName }}
+
+
+ Kode:
+ {{ record.cellphone }}
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ Administrasi Pasien Rawat Jalan Kemoterapi
+
+ Manajemen pendaftaran serta monitoring terapi pasien tindakan rawat jalan
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dateRangeDisplay }}
+
+
+
+
+
+
+
+
+
+
+ Filter
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ Daftar Kunjungan Rawat Jalan Kemoterapi
+
+ Manajemen pendaftaran serta monitoring terapi pasien tindakan rawat jalan
+
+
+
+
+
+
+
+
diff --git a/app/components/content/chemotherapy/process.vue b/app/components/content/chemotherapy/process.vue
new file mode 100644
index 00000000..5cd0b452
--- /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 @@
+
+
+
+
+
+
+
+
+ Kembali ke Administrasi Kunjungan
+
+
+
+
+
+ Data Pasien:
+
+
+
+
+ No. RM:
+ {{ patientData.noRm }}
+
+
+ Nama:
+ {{ patientData.nama }}
+
+
+ Jenis Pembayaran:
+ {{ patientData.jenisPembayaran }}
+
+
+ No Billing:
+ {{ patientData.noBilling }}
+
+
+
+
+
+ Tanggal Lahir / Usia:
+ {{ patientData.tanggalLahir }} / {{ patientData.usia }}
+
+
+ Jenis Kelamin:
+ {{ patientData.jenisKelamin }}
+
+
+ Diagnosis:
+ {{ patientData.diagnosis }}
+
+
+ Klinik:
+ {{ patientData.klinik }}
+
+
+
+
+
+
+
+ Verifikasi Jadwal Pasien
+
+ Pantau riwayat masuk, dokter penanggung jawab, dan status pasien secara real-time.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dateRangeDisplay }}
+
+
+
+
+
+
+
+
+
+
+ Filter
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/consultation/list.vue b/app/components/content/consultation/list.vue
index cfce5ae3..d581e530 100644
--- a/app/components/content/consultation/list.vue
+++ b/app/components/content/consultation/list.vue
@@ -43,7 +43,7 @@ interface Props {
}
const props = defineProps()
-let units = ref<{ value: string; label: string }[]>([])
+const units = ref<{ value: string; label: string }[]>([])
const encounterId = ref(props?.encounter?.id || 0)
const title = ref('')
diff --git a/app/components/content/control-letter/add.vue b/app/components/content/control-letter/add.vue
new file mode 100644
index 00000000..4ca1d089
--- /dev/null
+++ b/app/components/content/control-letter/add.vue
@@ -0,0 +1,134 @@
+
+
+
+ Tambah Surat Kontrol
+
+
+
+
+
+
+
+
diff --git a/app/components/content/control-letter/detail.vue b/app/components/content/control-letter/detail.vue
new file mode 100644
index 00000000..effabb7f
--- /dev/null
+++ b/app/components/content/control-letter/detail.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
diff --git a/app/components/content/control-letter/edit.vue b/app/components/content/control-letter/edit.vue
new file mode 100644
index 00000000..0d81eb17
--- /dev/null
+++ b/app/components/content/control-letter/edit.vue
@@ -0,0 +1,151 @@
+
+
+
+ Update Surat Kontrol
+
+
+
+
+
+
+
+
diff --git a/app/components/content/control-letter/list.vue b/app/components/content/control-letter/list.vue
new file mode 100644
index 00000000..4308269b
--- /dev/null
+++ b/app/components/content/control-letter/list.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+ Riwayat Program Nasional
+
+
+
+
+
+
+
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.firstName }}
+
+
+ Kode:
+ {{ record.cellphone }}
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/control-letter/main.vue b/app/components/content/control-letter/main.vue
new file mode 100644
index 00000000..0850c900
--- /dev/null
+++ b/app/components/content/control-letter/main.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
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..8bb06569
--- /dev/null
+++ b/app/components/content/cp-lab-order/list.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ />
+
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/cprj/entry.vue b/app/components/content/cprj/entry.vue
new file mode 100644
index 00000000..5769e967
--- /dev/null
+++ b/app/components/content/cprj/entry.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
diff --git a/app/components/content/cprj/form.vue b/app/components/content/cprj/form.vue
new file mode 100644
index 00000000..ef2a51d7
--- /dev/null
+++ b/app/components/content/cprj/form.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
diff --git a/app/components/content/cprj/list.vue b/app/components/content/cprj/list.vue
new file mode 100644
index 00000000..6da61716
--- /dev/null
+++ b/app/components/content/cprj/list.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
+
+ ID:
+ {{ record?.id }}
+
+
+ Nama:
+ {{ record.name }}
+
+
+ Kode:
+ {{ record.code }}
+
+
+
+
+
diff --git a/app/components/content/device-order/entry.vue b/app/components/content/device-order/entry.vue
new file mode 100644
index 00000000..5d87d960
--- /dev/null
+++ b/app/components/content/device-order/entry.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ handleActionRemove(recId, getDeviceOrderItems, toast)"
+ @cancel=""
+ >
+
+
+ Nama
+
+
+ {{ recItem.device.name }}
+
+
+
+ Dosis
+
+
+ {{ recItem.quantity }}
+
+
+
+
+
diff --git a/app/components/content/device-order/list.vue b/app/components/content/device-order/list.vue
new file mode 100644
index 00000000..1ffa324d
--- /dev/null
+++ b/app/components/content/device-order/list.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+ handleActionSubmit(recId, getMyList, toast)"
+ >
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ >
+
+
+
diff --git a/app/components/content/device-order/main.vue b/app/components/content/device-order/main.vue
new file mode 100644
index 00000000..ff8722de
--- /dev/null
+++ b/app/components/content/device-order/main.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/components/content/division-position/list.vue b/app/components/content/division-position/list.vue
index 019e64a9..10bbc4e2 100644
--- a/app/components/content/division-position/list.vue
+++ b/app/components/content/division-position/list.vue
@@ -54,6 +54,7 @@ const {
sort: 'createdAt:asc',
'page-number': params['page-number'] || 0,
'page-size': params['page-size'] || 10,
+ includes: 'division,Employee.Person',
})
return { success: result.success || false, body: result.body || {} }
},
@@ -61,7 +62,7 @@ const {
})
const headerPrep: HeaderPrep = {
- title: 'Divisi',
+ title: 'Divisi - Posisi',
icon: 'i-lucide-box',
refSearchNav: {
placeholder: 'Cari (min. 3 karakter)...',
@@ -104,13 +105,13 @@ const getCurrentDivisionDetail = async (id: number | string) => {
watch([recId, recAction], () => {
switch (recAction.value) {
case ActionEvents.showDetail:
- getCurrentDivisionDetail(recId.value)
- title.value = 'Detail Divisi'
+ getCurrentDivisionDetail(recItem.value.code)
+ title.value = 'Detail Divisi Position'
isReadonly.value = true
break
case ActionEvents.showEdit:
- getCurrentDivisionDetail(recId.value)
- title.value = 'Edit Divisi'
+ getCurrentDivisionDetail(recItem.value.code)
+ title.value = 'Edit Divisi Position'
isReadonly.value = false
break
case ActionEvents.showConfirmDelete:
@@ -120,9 +121,19 @@ watch([recId, recAction], () => {
})
onMounted(async () => {
- divisions.value = await getDivisionLabelList({ sort: 'createdAt:asc', 'page-size': 100 })
- employees.value = await getEmployeeLabelList({ sort: 'createdAt:asc', 'page-size': 100 })
- await getDivisionList()
+ try {
+ divisions.value = await getDivisionLabelList({ sort: 'createdAt:asc', 'page-size': 100 }, true)
+ employees.value = await getEmployeeLabelList({ sort: 'createdAt:asc', 'page-size': 100, includes: 'person' })
+ await getDivisionList()
+ } catch (err) {
+ console.log(err)
+ // show toast
+ toast({
+ title: 'Terjadi Kesalahan',
+ description: 'Terjadi kesalahan saat memuat data',
+ variant: 'destructive',
+ })
+ }
})
@@ -142,7 +153,7 @@ onMounted(async () => {
|