feat/encounter: wip

This commit is contained in:
Andrian Roshandy
2025-10-13 06:26:30 +07:00
parent f7c53fc4e5
commit 6bdee66cc6
7 changed files with 130 additions and 74 deletions
@@ -40,13 +40,13 @@ const { defineField, errors, meta } = useForm({
}) })
const [responsibleDoctor_id, responsibleDoctor_idAttrs] = defineField('responsibleDoctor_id') const [responsibleDoctor_id, responsibleDoctor_idAttrs] = defineField('responsibleDoctor_id')
const [dischargeMethod_code, dischargeMethod_codeAttrs] = defineField('dischargeMethod_code') // const [dischargeMethod_code, dischargeMethod_codeAttrs] = defineField('dischargeMethod_code')
const [unit_id, unit_idAttrs] = defineField('unit_id') // const [unit_id, unit_idAttrs] = defineField('unit_id')
</script> </script>
<template> <template>
<DE.Block> <DE.Block :cell-flex="false">
<DE.Cell> <DE.Cell>
<DE.Label>Dokter</DE.Label> <DE.Label>Dokter</DE.Label>
<DE.Field> <DE.Field>
+63 -11
View File
@@ -1,14 +1,15 @@
<script lang="ts" setup> <script lang="ts" setup>
// //
import { useForm } from 'vee-validate' import { useForm, useFieldArray } from 'vee-validate'
import { toTypedSchema } from '@vee-validate/zod' import { toTypedSchema } from '@vee-validate/zod'
// //
import type z from 'zod' import type z from 'zod'
import * as CB from '~/components/pub/my-ui/combobox' import * as CB from '~/components/pub/my-ui/combobox'
import { dischargeMethodCodes } from '~/lib/constants'; import { dischargeMethodCodes } from '~/lib/constants';
import type { CheckOutFormData } from '~/schemas/encounter.schema' import type { CheckOutFormData, ConsulPoliesFormData } from '~/schemas/encounter.schema'
import * as Table from '~/components/pub/ui/table'
import * as DE from '~/components/pub/my-ui/doc-entry' import * as DE from '~/components/pub/my-ui/doc-entry'
interface Props { interface Props {
@@ -32,34 +33,36 @@ const { defineField, errors, meta } = useForm({
validationSchema: toTypedSchema(props.schema), validationSchema: toTypedSchema(props.schema),
initialValues: { initialValues: {
dischargeMethod_code: '', dischargeMethod_code: '',
unit_id: 0,
responsible_doctor_id: 0, responsible_doctor_id: 0,
consulPolies: [],
} as Partial<CheckOutFormData>, } as Partial<CheckOutFormData>,
}) })
const { fields, push, remove } = useFieldArray('consulPolies');
const [dischargeMethod_code, dischargeMethod_codeAttrs] = defineField('dischargeMethod_code') const [dischargeMethod_code, dischargeMethod_codeAttrs] = defineField('dischargeMethod_code')
const [unit_id, unit_idAttrs] = defineField('unit_id') // const [consulPolies, consulPoliesAttrs] = defineField<ConsulPoliesFormData[]>([])
const [responsible_doctor_id, responsible_doctor_idAttrs] = defineField('responsible_doctor_id') const [responsible_doctor_id, responsible_doctor_idAttrs] = defineField('responsible_doctor_id')
function onSubmitForm(values: any) { function onSubmitForm(values: any) {
const formData: CheckOutFormData = { const formData: CheckOutFormData = {
dischargeMethod_code: '', dischargeMethod_code: '',
unit_id: 0, // unit_id: 0,
responsible_doctor_id: 0, responsible_doctor_id: 0,
consulPolies: [],
} }
emit('submit', formData) emit('submit', formData)
} }
const resetForm = () => { const resetForm = () => {
dischargeMethod_code.value = '' dischargeMethod_code.value = ''
unit_id.value = '' // unit_id.value = ''
responsible_doctor_id.value = '' responsible_doctor_id.value = ''
} }
</script> </script>
<template> <template>
<DE.Block> <DE.Block :cellFlex="false">
<DE.Cell> <DE.Cell>
<DE.Label>Cara Keluar</DE.Label> <DE.Label>Cara Keluar</DE.Label>
<DE.Field> <DE.Field>
@@ -73,10 +76,9 @@ const resetForm = () => {
search-placeholder="Cari Cara Keluar" search-placeholder="Cari Cara Keluar"
empty-message="Cara Keluar tidak ditemukan" empty-message="Cara Keluar tidak ditemukan"
/> />
{{ dischargeMethod_code }}
</DE.Field> </DE.Field>
</DE.Cell> </DE.Cell>
<DE.Cell> <!-- <DE.Cell>
<DE.Label>Klinik</DE.Label> <DE.Label>Klinik</DE.Label>
<DE.Field> <DE.Field>
<CB.Combobox <CB.Combobox
@@ -90,8 +92,9 @@ const resetForm = () => {
empty-message="Klinik tidak ditemukan" empty-message="Klinik tidak ditemukan"
/> />
</DE.Field> </DE.Field>
</DE.Cell> </DE.Cell> -->
<DE.Cell>
<DE.Cell v-if="['emergency', 'emergency-covid'].includes(dischargeMethod_code)">
<DE.Label>DPJP</DE.Label> <DE.Label>DPJP</DE.Label>
<DE.Field> <DE.Field>
<CB.Combobox <CB.Combobox
@@ -106,6 +109,55 @@ const resetForm = () => {
/> />
</DE.Field> </DE.Field>
</DE.Cell> </DE.Cell>
<DE.Cell>
<DE.Label>Tujuan</DE.Label>
<DE.Field>
<Table.Table class="border mb-3">
<Table.TableHeader class="bg-neutral-100 dark:bg-slate-800">
<Table.TableCell class="text-center">Poly</Table.TableCell>
<Table.TableCell class="text-center">DPJP</Table.TableCell>
<Table.TableCell class="text-center !w-10"></Table.TableCell>
</Table.TableHeader>
<Table.TableBody>
<Table.TableRow v-for="(item, index) in fields" :key="index">
<Table.TableCell class="!p-0.5">
<CB.Combobox
id="dischargeMethodItems"
v-model="item.value.unit_id"
v-bind="unit_idAttrs"
:items="units"
:disabled="isLoading || isReadonly"
placeholder="Pilih Poly"
search-placeholder="Cari Poly"
empty-message="Poly tidak ditemukan"
/>
</Table.TableCell>
<Table.TableCell class="!p-0.5">
<CB.Combobox
id="dischargeMethodItems"
v-model="responsible_doctor_id"
v-bind="responsible_doctor_idAttrs"
:items="units"
:disabled="isLoading || isReadonly"
placeholder="Pilih Dokter"
search-placeholder="Cari Dokter"
empty-message="Dokter tidak ditemukan"
/>
</Table.TableCell>
<Table.TableCell>
<Button variant="destructive" size="xs" @click="remove(index)" class="w-6 h-6 rounded-full">
X
</Button>
</Table.TableCell>
</Table.TableRow>
</Table.TableBody>
</Table.Table>
<div>
<Button @click="push({ unit_id: '', responsible_doctor_id: '' })">Tambah</Button>
</div>
</DE.Field>
</DE.Cell>
</DE.Block> </DE.Block>
<div class="text-center"> <div class="text-center">
<Button <Button
-44
View File
@@ -1,44 +0,0 @@
<script setup lang="ts">
// Type Const Var
import { dischargeMethodCodes } from '~/lib/constants'
import { type Item, recStrToItem } from '~/components/pub/my-ui/combobox'
// Helpers
import type z from 'zod'
import { toTypedSchema } from '@vee-validate/zod'
import { useForm } from 'vee-validate'
// Components
// import ComboBox from '~/components/pub/my-ui/combobox/combobox.vue'
import ComboBox from '~/components/pub/my-ui/form/combobox.vue'
import * as DE from '~/components/pub/my-ui/doc-entry'
const dischargeMethodItems = recStrToItem(dischargeMethodCodes)
let selectedItemLabel = 'test'
let selectedItem = ref<Item>({ label: '', value: '' })
const selectDischargeMethod = (item: Item) => {
selectedItem.value = item
}
</script>
<template>
<div class="lg:grid grid-cols-2">
<div class="border-r lg:pe-4 xl:pe-5">
<div class="mb-4 xl:mb-5 text-base text-center font-semibold">Informasi Masuk</div>
</div>
<div class="lg:ps-4 xl:ps-5">
<div class="mb-4 xl:mb-5 text-base text-center font-semibold">Informasi Keluar</div>
<DE.Block>
<DE.Cell>
<DE.Label>Cara Keluar</DE.Label>
<DE.Field>
<ComboBox id="sumpeh_lu" :items="dischargeMethodItems" :modelValue="selectedItemLabel" />
<!-- {{ selectedItem.value }} -
{{ selectedItem.label }} -->
</DE.Field>
</DE.Cell>
</DE.Block>
</div>
</div>
</template>
+5 -5
View File
@@ -9,13 +9,13 @@ import type { TabItem } from '~/components/pub/my-ui/comp-tab/type'
import { getDetail } from '~/services/encounter.service' import { getDetail } from '~/services/encounter.service'
import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
import EarlyMedicalAssesmentList from '~/components/content/soapi/entry.vue'
import PrescriptionList from '~/components/content/prescription/list.vue'
import type { Encounter } from '~/models/encounter' import type { Encounter } from '~/models/encounter'
import Status from '~/components/app/encounter/status.vue'
// import AssesmentFunctionList from '~/components/content/assesment-function/list.vue' import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
import Status from '~/components/content/encounter/status.vue'
import EarlyMedicalAssesmentList from '~/components/content/soapi/entry.vue'
import EarlyMedicalRehabList from '~/components/content/soapi/entry.vue' import EarlyMedicalRehabList from '~/components/content/soapi/entry.vue'
import PrescriptionList from '~/components/content/prescription/list.vue'
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
+4 -3
View File
@@ -50,19 +50,20 @@ function checkOutSubmit(values: CheckOutFormData) {
<template> <template>
<div class="lg:grid grid-cols-2"> <div class="lg:grid grid-cols-2">
<div class="border-r lg:pe-4 xl:pe-5"> <div class="border-r lg:pe-4 xl:pe-5 mb-10">
<div class="mb-4 xl:mb-5 text-base text-center font-semibold">Informasi Masuk</div> <div class="mb-4 xl:mb-5 text-base text-center font-semibold">Informasi Masuk</div>
<Checkin <Checkin
:schema="CheckInSchema" :schema="CheckInSchema"
:doctors="doctors" :doctors="doctors"
:encounter="encounter" :encounter="encounter"
:values="checkInValues" :values="checkInValues"
:is-loading="checkOutIsLoading" :is-loading="checkInIsLoading"
:is-readonly="checkOutIsReadonly" :is-readonly="checkInIsReadonly"
@submit="checkInSubmit" @submit="checkInSubmit"
/> />
</div> </div>
<div class="lg:ps-4 xl:ps-5"> <div class="lg:ps-4 xl:ps-5">
<Separator class="lg:hidden my-4 xl:my-5" />
<div class="mb-4 xl:mb-5 text-base text-center font-semibold">Informasi Keluar</div> <div class="mb-4 xl:mb-5 text-base text-center font-semibold">Informasi Keluar</div>
<Checkout <Checkout
:schema="CheckOutSchema" :schema="CheckOutSchema"
+16 -8
View File
@@ -8,16 +8,24 @@ const CheckInSchema = z.object({
}) })
type CheckInFormData = z.infer<typeof CheckInSchema> type CheckInFormData = z.infer<typeof CheckInSchema>
export { CheckInSchema } // Check Out Consul Polis
export type { CheckInFormData } const ConsulPoliesSchema = z.object({
// Check Out
const CheckOutSchema = z.object({
dischargeMethod_code: z.string({ required_error: 'Metode pulang harus diisi' }),
unit_id: z.number(), unit_id: z.number(),
responsible_doctor_id: z.number(), responsible_doctor_id: z.number(),
})
type ConsulPoliesFormData = z.infer<typeof ConsulPoliesSchema>
// Checkout
const CheckOutSchema = z.object({
dischargeMethod_code: z.string({ required_error: 'Metode pulang harus diisi' }),
// unit_id: z.number(),
consulPolies: z.array(ConsulPoliesSchema),
responsible_doctor_id: z.number(),
}) })
type CheckOutFormData = z.infer<typeof CheckOutSchema> type CheckOutFormData = z.infer<typeof CheckOutSchema>
export { CheckOutSchema } // Exports
export type { CheckOutFormData } export { CheckInSchema, CheckOutSchema }
export type { CheckInFormData, CheckOutFormData, ConsulPoliesFormData }
+39
View File
@@ -0,0 +1,39 @@
// Base
import * as base from './_crud-base'
import type { Doctor } from "~/models/doctor";
const path = '/api/v1/device'
const name = 'device'
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: Doctor) => ({
value: item.id,
label: item.employee.person.name,
}))
}
return data
}