diff --git a/app/components/app/diagnose-src/entry-form.vue b/app/components/app/diagnose-src/entry-form.vue new file mode 100644 index 00000000..3f84b2a2 --- /dev/null +++ b/app/components/app/diagnose-src/entry-form.vue @@ -0,0 +1,137 @@ + + + + + + + Kode + + + + + + Nama (FHIR) + + + + + + Nama (ID) + + + + + + + + Kembali + + + Simpan + + + + diff --git a/app/components/app/diagnose-src/list-cfg.ts b/app/components/app/diagnose-src/list-cfg.ts new file mode 100644 index 00000000..0a576270 --- /dev/null +++ b/app/components/app/diagnose-src/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('~/components/pub/my-ui/data/dropdown-action-dud.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/diagnose-src/list.vue b/app/components/app/diagnose-src/list.vue new file mode 100644 index 00000000..1be60a60 --- /dev/null +++ b/app/components/app/diagnose-src/list.vue @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/components/app/medical-action-src/entry-form.vue b/app/components/app/medical-action-src/entry-form.vue new file mode 100644 index 00000000..f8bf87e4 --- /dev/null +++ b/app/components/app/medical-action-src/entry-form.vue @@ -0,0 +1,144 @@ + + + + + + + Kode + + + + + + Nama + + + + + + Type Kode + + + + + + + + Kembali + + + Simpan + + + + diff --git a/app/components/app/medical-action-src/list-cfg.ts b/app/components/app/medical-action-src/list-cfg.ts new file mode 100644 index 00000000..2fecde69 --- /dev/null +++ b/app/components/app/medical-action-src/list-cfg.ts @@ -0,0 +1,32 @@ +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-dud.vue')) + +export const config: Config = { + cols: [{}, {}, {}, { width: 50 }], + + headers: [[{ label: 'Kode' }, { label: 'Nama' }, { label: '' }]], + + 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/medical-action-src/list.vue b/app/components/app/medical-action-src/list.vue new file mode 100644 index 00000000..1be60a60 --- /dev/null +++ b/app/components/app/medical-action-src/list.vue @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/components/app/procedure-src/entry-form.vue b/app/components/app/procedure-src/entry-form.vue new file mode 100644 index 00000000..fd33cf90 --- /dev/null +++ b/app/components/app/procedure-src/entry-form.vue @@ -0,0 +1,137 @@ + + + + + + + Kode + + + + + + Nama (FHIR) + + + + + + Nama (ID) + + + + + + + + Kembali + + + Simpan + + + + diff --git a/app/components/app/procedure-src/list-cfg.ts b/app/components/app/procedure-src/list-cfg.ts new file mode 100644 index 00000000..0a576270 --- /dev/null +++ b/app/components/app/procedure-src/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('~/components/pub/my-ui/data/dropdown-action-dud.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/procedure-src/list.vue b/app/components/app/procedure-src/list.vue new file mode 100644 index 00000000..1be60a60 --- /dev/null +++ b/app/components/app/procedure-src/list.vue @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/components/content/diagnose-src/list.vue b/app/components/content/diagnose-src/list.vue new file mode 100644 index 00000000..2b056697 --- /dev/null +++ b/app/components/content/diagnose-src/list.vue @@ -0,0 +1,184 @@ + + + + + + + { + onResetState() + isFormEntryDialogOpen = value + } + " + > + , resetForm: () => void) => { + if (recId > 0) { + handleActionEdit(recId, values, getItemList, resetForm, toast) + return + } + handleActionSave(values, getItemList, resetForm, toast) + } + " + @cancel="handleCancelForm" + /> + + + handleActionRemove(recId, getItemList, toast)" + @cancel="" + > + + + + {{ field.label }}: + {{ record[field.key] }} + + + + + diff --git a/app/components/content/medical-action-src/list.vue b/app/components/content/medical-action-src/list.vue new file mode 100644 index 00000000..c39ff4b8 --- /dev/null +++ b/app/components/content/medical-action-src/list.vue @@ -0,0 +1,184 @@ + + + + + + + { + onResetState() + isFormEntryDialogOpen = value + } + " + > + , resetForm: () => void) => { + if (recId > 0) { + handleActionEdit(recId, values, getItemList, resetForm, toast) + return + } + handleActionSave(values, getItemList, resetForm, toast) + } + " + @cancel="handleCancelForm" + /> + + + handleActionRemove(recId, getItemList, toast)" + @cancel="" + > + + + + {{ field.label }}: + {{ record[field.key] }} + + + + + diff --git a/app/components/content/procedure-src/list.vue b/app/components/content/procedure-src/list.vue new file mode 100644 index 00000000..fad041ea --- /dev/null +++ b/app/components/content/procedure-src/list.vue @@ -0,0 +1,184 @@ + + + + + + + { + onResetState() + isFormEntryDialogOpen = value + } + " + > + , resetForm: () => void) => { + if (recId > 0) { + handleActionEdit(recId, values, getItemList, resetForm, toast) + return + } + handleActionSave(values, getItemList, resetForm, toast) + } + " + @cancel="handleCancelForm" + /> + + + handleActionRemove(recId, getItemList, toast)" + @cancel="" + > + + + + {{ field.label }}: + {{ record[field.key] }} + + + + + diff --git a/app/handlers/diagnose-src.handler.ts b/app/handlers/diagnose-src.handler.ts new file mode 100644 index 00000000..c109e6fc --- /dev/null +++ b/app/handlers/diagnose-src.handler.ts @@ -0,0 +1,24 @@ +// Handlers +import { genCrudHandler } from '~/handlers/_handler' + +// Services +import { create, update, remove } from '~/services/diagnose-src.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ + create, + update, + remove, +}) diff --git a/app/handlers/medical-action-src.handler.ts b/app/handlers/medical-action-src.handler.ts new file mode 100644 index 00000000..652d6d60 --- /dev/null +++ b/app/handlers/medical-action-src.handler.ts @@ -0,0 +1,24 @@ +// Handlers +import { genCrudHandler } from '~/handlers/_handler' + +// Services +import { create, update, remove } from '~/services/medical-action-src.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ + create, + update, + remove, +}) diff --git a/app/handlers/procedure-src.handler.ts b/app/handlers/procedure-src.handler.ts new file mode 100644 index 00000000..7c949356 --- /dev/null +++ b/app/handlers/procedure-src.handler.ts @@ -0,0 +1,24 @@ +// Handlers +import { genCrudHandler } from '~/handlers/_handler' + +// Services +import { create, update, remove } from '~/services/procedure-src.service' + +export const { + recId, + recAction, + recItem, + isReadonly, + isProcessing, + isFormEntryDialogOpen, + isRecordConfirmationOpen, + onResetState, + handleActionSave, + handleActionEdit, + handleActionRemove, + handleCancelForm, +} = genCrudHandler({ + create, + update, + remove, +}) diff --git a/app/lib/constants.ts b/app/lib/constants.ts index 5b579e27..59dd9bf5 100644 --- a/app/lib/constants.ts +++ b/app/lib/constants.ts @@ -357,3 +357,12 @@ export const addressLocationTypeCode: Record = { } export type AddressLocationTypeCode = keyof typeof addressLocationTypeCode +export const medicalActionTypeCode: Record = { + chemo: 'Chemo', + hemo: 'Hemo', + thalasemia: 'Thalasemia', + echocardio: 'Echocardiography', + spirometry: 'Spirometry', +} as const + +export type medicalActionTypeCodeKey = keyof typeof medicalActionTypeCode diff --git a/app/models/diagnose-src.ts b/app/models/diagnose-src.ts new file mode 100644 index 00000000..5d25a54a --- /dev/null +++ b/app/models/diagnose-src.ts @@ -0,0 +1,16 @@ +import { type Base, genBase } from './_base' + +export interface DiagnoseSrc extends Base { + code: string + name: string + indName: string +} + +export function genDiagnoseSrc(): DiagnoseSrc { + return { + ...genBase(), + code: '', + name: '', + indName: '', + } +} diff --git a/app/models/medical-action-src-item.ts b/app/models/medical-action-src-item.ts new file mode 100644 index 00000000..0f04657a --- /dev/null +++ b/app/models/medical-action-src-item.ts @@ -0,0 +1,16 @@ +import { type Base, genBase } from './_base' + +export interface MedicalActionSrcItem extends Base { + medicalActionSrc_id: number + procedureSrc_id: number + item_id: number +} + +export function genMedicalActionSrcItem(): MedicalActionSrcItem { + return { + ...genBase(), + medicalActionSrc_id: 0, + procedureSrc_id: 0, + item_id: 0, + } +} diff --git a/app/models/medical-action-src.ts b/app/models/medical-action-src.ts new file mode 100644 index 00000000..21d36c84 --- /dev/null +++ b/app/models/medical-action-src.ts @@ -0,0 +1,19 @@ +import { type Base, genBase } from './_base' +import type { medicalActionTypeCodeKey } from '~/lib/constants' + +export interface MedicalActionSrc extends Base { + code: string + name: string + type_code: medicalActionTypeCodeKey + item_id: number +} + +export function genMedicalActionSrc(): MedicalActionSrc { + return { + ...genBase(), + code: '', + name: '', + type_code: '', + item_id: 0, + } +} diff --git a/app/models/procedure-src.ts b/app/models/procedure-src.ts new file mode 100644 index 00000000..c86adcf9 --- /dev/null +++ b/app/models/procedure-src.ts @@ -0,0 +1,16 @@ +import { type Base, genBase } from './_base' + +export interface ProcedureSrc extends Base { + code: string + name: string + indName: string +} + +export function genProcedureSrc(): ProcedureSrc { + return { + ...genBase(), + code: '', + name: '', + indName: '', + } +} diff --git a/app/pages/(features)/mcu-src/diagnose/index.vue b/app/pages/(features)/mcu-src/diagnose/index.vue new file mode 100644 index 00000000..c557cf5f --- /dev/null +++ b/app/pages/(features)/mcu-src/diagnose/index.vue @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/app/pages/(features)/mcu-src/mcu/index.vue b/app/pages/(features)/mcu-src/mcu/index.vue new file mode 100644 index 00000000..cefa57c6 --- /dev/null +++ b/app/pages/(features)/mcu-src/mcu/index.vue @@ -0,0 +1,40 @@ + + + + MCU - SRC + + diff --git a/app/pages/(features)/mcu-src/medical-action/index.vue b/app/pages/(features)/mcu-src/medical-action/index.vue new file mode 100644 index 00000000..7e471367 --- /dev/null +++ b/app/pages/(features)/mcu-src/medical-action/index.vue @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/app/pages/(features)/mcu-src/procedure/index.vue b/app/pages/(features)/mcu-src/procedure/index.vue new file mode 100644 index 00000000..030c0ab3 --- /dev/null +++ b/app/pages/(features)/mcu-src/procedure/index.vue @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/app/schemas/diagnose-src.schema.ts b/app/schemas/diagnose-src.schema.ts new file mode 100644 index 00000000..c174f4c8 --- /dev/null +++ b/app/schemas/diagnose-src.schema.ts @@ -0,0 +1,22 @@ +import { z } from 'zod' +import type { DiagnoseSrc } from '~/models/diagnose-src' + +const DiagnoseSrcSchema = z.object({ + code: z + .string({ required_error: 'Kode harus diisi' }) + .min(1, 'Kode minimum 1 karakter') + .max(10, 'Kode maksimum 10 karakter'), + name: z + .string({ required_error: 'Nama harus diisi' }) + .min(1, 'Nama minimum 1 karakter') + .max(2048, 'Nama maksimum 2048 karakter'), + indName: z + .string({ required_error: 'Nama (ID) harus diisi' }) + .min(1, 'Nama (ID) minimum 1 karakter') + .max(2048, 'Nama (ID) maksimum 2048 karakter'), +}) + +type DiagnoseSrcFormData = z.infer & Partial + +export { DiagnoseSrcSchema } +export type { DiagnoseSrcFormData } diff --git a/app/schemas/medical-action-src.schema.ts b/app/schemas/medical-action-src.schema.ts new file mode 100644 index 00000000..a1caaeeb --- /dev/null +++ b/app/schemas/medical-action-src.schema.ts @@ -0,0 +1,22 @@ +import { z } from 'zod' +import type { MedicalActionSrc } from '~/models/medical-action-src' + +const MedicalActionSrcSchema = z.object({ + code: z + .string({ required_error: 'Kode harus diisi' }) + .min(1, 'Kode minimum 1 karakter') + .max(10, 'Kode maksimum 10 karakter'), + name: z + .string({ required_error: 'Nama harus diisi' }) + .min(1, 'Nama minimum 1 karakter') + .max(2048, 'Nama maksimum 2048 karakter'), + type_code: z + .string({ required_error: 'Nama (ID) harus diisi' }) + .min(1, 'Nama (ID) minimum 1 karakter') + .max(2048, 'Nama (ID) maksimum 2048 karakter'), +}) + +type MedicalActionSrcFormData = z.infer & Partial + +export { MedicalActionSrcSchema } +export type { MedicalActionSrcFormData } diff --git a/app/schemas/procedure-src.schema.ts b/app/schemas/procedure-src.schema.ts new file mode 100644 index 00000000..dfbdc43a --- /dev/null +++ b/app/schemas/procedure-src.schema.ts @@ -0,0 +1,22 @@ +import { z } from 'zod' +import type { ProcedureSrc } from '~/models/procedure-src' + +const ProcedureSrcSchema = z.object({ + code: z + .string({ required_error: 'Kode harus diisi' }) + .min(1, 'Kode minimum 1 karakter') + .max(10, 'Kode maksimum 10 karakter'), + name: z + .string({ required_error: 'Nama harus diisi' }) + .min(1, 'Nama minimum 1 karakter') + .max(2048, 'Nama maksimum 2048 karakter'), + indName: z + .string({ required_error: 'Nama (ID) harus diisi' }) + .min(1, 'Nama (ID) minimum 1 karakter') + .max(2048, 'Nama (ID) maksimum 2048 karakter'), +}) + +type ProcedureSrcFormData = z.infer & Partial + +export { ProcedureSrcSchema } +export type { ProcedureSrcFormData } diff --git a/app/services/diagnose-src.service.ts b/app/services/diagnose-src.service.ts new file mode 100644 index 00000000..4c5b50d4 --- /dev/null +++ b/app/services/diagnose-src.service.ts @@ -0,0 +1,41 @@ +// Base +import * as base from './_crud-base' + +// Types +import type { DiagnoseSrc } from '~/models/diagnose-src' + +const path = '/api/v1/diagnose-src' +const name = 'diagnose-src' + +export function create(data: any) { + return base.create(path, data, name) +} + +export function getList(params: any = null) { + return base.getList(path, params, name) +} + +export function getDetail(id: number | string) { + return base.getDetail(path, id, name) +} + +export function update(id: number | string, data: any) { + return base.update(path, id, data, name) +} + +export function remove(id: number | string) { + return base.remove(path, id, name) +} + +export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> { + let data: { value: string; label: string }[] = [] + const result = await getList(params) + if (result.success) { + const resultData = result.body?.data || [] + data = resultData.map((item: DiagnoseSrc) => ({ + value: item.id ? Number(item.id) : item.code, + label: item.name, + })) + } + return data +} diff --git a/app/services/medical-action-src.service.ts b/app/services/medical-action-src.service.ts new file mode 100644 index 00000000..aa196962 --- /dev/null +++ b/app/services/medical-action-src.service.ts @@ -0,0 +1,41 @@ +// Base +import * as base from './_crud-base' + +// Types +import type { MedicalActionSrc } from '~/models/medical-action-src' + +const path = '/api/v1/medical-action-src' +const name = 'medical-action-src' + +export function create(data: any) { + return base.create(path, data, name) +} + +export function getList(params: any = null) { + return base.getList(path, params, name) +} + +export function getDetail(id: number | string) { + return base.getDetail(path, id, name) +} + +export function update(id: number | string, data: any) { + return base.update(path, id, data, name) +} + +export function remove(id: number | string) { + return base.remove(path, id, name) +} + +export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> { + let data: { value: string; label: string }[] = [] + const result = await getList(params) + if (result.success) { + const resultData = result.body?.data || [] + data = resultData.map((item: MedicalActionSrc) => ({ + value: item.id ? Number(item.id) : item.code, + label: item.name, + })) + } + return data +} diff --git a/app/services/procedure-src.service.ts b/app/services/procedure-src.service.ts new file mode 100644 index 00000000..a4bca68b --- /dev/null +++ b/app/services/procedure-src.service.ts @@ -0,0 +1,41 @@ +// Base +import * as base from './_crud-base' + +// Types +import type { ProcedureSrc } from '~/models/procedure-src' + +const path = '/api/v1/procedure-src' +const name = 'procedure-src' + +export function create(data: any) { + return base.create(path, data, name) +} + +export function getList(params: any = null) { + return base.getList(path, params, name) +} + +export function getDetail(id: number | string) { + return base.getDetail(path, id, name) +} + +export function update(id: number | string, data: any) { + return base.update(path, id, data, name) +} + +export function remove(id: number | string) { + return base.remove(path, id, name) +} + +export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> { + let data: { value: string; label: string }[] = [] + const result = await getList(params) + if (result.success) { + const resultData = result.body?.data || [] + data = resultData.map((item: ProcedureSrc) => ({ + value: item.id ? Number(item.id) : item.code, + label: item.name, + })) + } + return data +} diff --git a/public/side-menu-items/sys.json b/public/side-menu-items/sys.json index c7b15101..19491069 100644 --- a/public/side-menu-items/sys.json +++ b/public/side-menu-items/sys.json @@ -259,6 +259,18 @@ { "title": "Checkup", "link": "/mcu-src/mcu" + }, + { + "title": "Prosedur", + "link": "/mcu-src/procedure" + }, + { + "title": "Diagnosis", + "link": "/mcu-src/diagnose" + }, + { + "title": "Medical Action", + "link": "/mcu-src/medical-action" } ] },
+ {{ field.label }}: + {{ record[field.key] }} +