Merge branch 'dev' into feat/consultation-82

This commit is contained in:
2025-10-19 06:30:09 +07:00
9 changed files with 162 additions and 146 deletions
-127
View File
@@ -1,127 +0,0 @@
import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
import { defineAsyncComponent } from 'vue'
type SmallDetailDto = any
const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-pdud.vue'))
const statusBadge = defineAsyncComponent(() => import('./status-badge.vue'))
export const config: Config = {
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: 'Status' },
{ label: '' },
],
],
keys: [
'name',
'medicalRecord_number',
'identity_number',
'birth_date',
'patient_age',
'gender',
'education',
'status',
'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 '-'
},
},
components: {
action(rec, idx) {
const res: RecComponent = {
idx,
rec: rec as object,
component: action,
}
return res
},
status(rec, idx) {
const recX = rec as SmallDetailDto
if (recX.status_code === null) {
recX.status_code = 0
}
const res: RecComponent = {
idx,
rec: rec as object,
component: statusBadge,
}
return res
},
},
htmls: {
patient_address(_rec) {
return '-'
},
},
}
+104
View File
@@ -0,0 +1,104 @@
import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
import { defineAsyncComponent } from 'vue'
import type { Encounter } from '~/models/encounter'
import { educationCodes, genderCodes } from '~/lib/constants'
import { getAge } from '~/lib/date'
type SmallDetailDto = Encounter
const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-pdud.vue'))
const statusBadge = defineAsyncComponent(() => import('./status-badge.vue'))
export const config: Config = {
cols: [
{},
{},
{},
{ width: 160 },
{},
{ width: 70 },
{ },
{ width: 50 },
],
headers: [
[
{ label: 'Nama' },
{ label: 'Rekam Medis' },
{ label: 'KTP' },
{ label: 'Tgl Lahir / Umur' },
{ label: 'JK' },
{ label: 'Pendidikan' },
{ label: 'Status', classVal: '!text-center' },
{ label: '' },
],
],
keys: [
'patient.person.name',
'patient.number',
'patient.person.residentIdentityNumber',
'birth_date',
'gender',
'education',
'status',
'action',
],
delKeyNames: [
{ key: 'code', label: 'Kode' },
{ key: 'name', label: 'Nama' },
],
parses: {
gender: (rec: unknown): unknown => {
const recX = rec as Encounter
if (recX.patient?.person?.gender_code) {
return genderCodes[recX.patient.person.gender_code]
}
return '-'
},
education: (rec: unknown): unknown => {
const recX = rec as SmallDetailDto
if (recX.patient?.person?.education_code) {
return educationCodes[recX.patient.person.education_code]
}
return '-'
},
},
components: {
action(rec, idx) {
const res: RecComponent = {
idx,
rec: rec as object,
component: action,
}
return res
},
status(rec, idx) {
const recX = rec as Encounter
if (!recX.status_code) {
recX.status_code = 'new'
}
const res: RecComponent = {
idx,
rec: recX,
component: statusBadge,
}
return res
},
},
htmls: {
birth_date: (rec: unknown): unknown => {
const recX = rec as Encounter
if (recX.patient?.person?.birthDate) {
return '' +
'<div>' + (recX.patient.person.birthDate as string).substring(0, 10) + ' / </div>' +
getAge(recX.patient.person.birthDate as string).extFormat
}
return '-'
},
},
}
+2 -2
View File
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { config } from './list-cfg'
import { config } from './list.cfg'
defineProps<{
const props = defineProps<{
data: any[]
}>()
</script>
+12 -6
View File
@@ -1,22 +1,28 @@
<script setup lang="ts">
import { Badge } from '~/components/pub/ui/badge'
import { type Variants, Badge } from '~/components/pub/ui/badge'
import { dataStatusCodes } from '~/lib/constants';
const props = defineProps<{
rec: any
idx?: number
}>()
const doctorStatus = {
0: 'Tidak Aktif',
1: 'Aktif',
const statusCodeColors: Record<string, Variants> = {
new: 'warning',
review: 'fresh',
process: 'fresh',
done: 'positive',
canceled: 'destructive',
rejected: 'destructive',
skiped: 'negative',
}
const statusText = computed(() => {
return doctorStatus[props.rec.status_code as keyof typeof doctorStatus]
return dataStatusCodes[props.rec.status_code as keyof typeof dataStatusCodes]
})
const badgeVariant = computed(() => {
return props.rec.status_code === 1 ? 'default' : 'destructive'
return (statusCodeColors[props.rec.status_code as keyof typeof statusCodeColors] || 'default')
})
</script>
+1 -1
View File
@@ -49,7 +49,7 @@ const refSearchNav: RefSearchNav = {
async function getPatientList() {
isLoading.isTableLoading = true
const resp = await xfetch('/api/v1/encounter')
const resp = await xfetch('/api/v1/encounter?includes=patient,patient-person')
if (resp.success) {
data.value = (resp.body as Record<string, any>).data
}
+4 -2
View File
@@ -30,7 +30,9 @@ const activeTab = computed({
})
const id = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
const encounter = ref<Encounter>((await getDetail(id)) as Encounter)
const encounterRes = await getDetail(id)
const encounterResBody = encounterRes.body ?? null
const encounter = encounterResBody?.data ?? null
const data = {
noRm: 'RM21123',
@@ -46,7 +48,7 @@ const data = {
}
const tabs: TabItem[] = [
{ value: 'status', label: 'Status Masuk/Keluar', component: Status },
{ value: 'status', label: 'Status Masuk/Keluar', component: Status, props: { encounter } },
{ value: 'early-medical-assessment', label: 'Pengkajian Awal Medis', component: EarlyMedicalAssesmentList },
{
value: 'rehab-medical-assessment',