fix: add tree select subspecialist and filter doctor

This commit is contained in:
riefive
2025-10-28 10:02:12 +07:00
parent 803139cc17
commit 99c5266f2b
5 changed files with 183 additions and 23 deletions

No files matched your search

@@ -5,10 +5,18 @@ import AppViewPatient from '~/components/app/patient/view-patient.vue'
// Types
import type { DataTableLoader } from '~/components/pub/my-ui/data-table/type'
import type { TreeItem } from '~/components/pub/my-ui/select-tree/type'
// Constants
import { paymentTypes, sepRefTypeCodes, participantGroups } from '~/lib/constants.vclaim'
// Services
import {
getList as getSpecialistList,
getValueTreeItems as getSpecialistTreeItems,
} from '~/services/specialist.service'
import { getValueLabelList as getDoctorValueLabelList } from '~/services/doctor.service'
// Handlers
import {
patients,
@@ -32,6 +40,8 @@ const isLoading = reactive<DataTableLoader>({
const paymentsList = ref<Array<{ value: string; label: string }>>([])
const sepsList = ref<Array<{ value: string; label: string }>>([])
const participantGroupsList = ref<Array<{ value: string; label: string }>>([])
const specialistsTree = ref<TreeItem[]>([])
const doctorsList = ref<Array<{ value: string; label: string }>>([])
function handleSavePatient() {
selectedPatientObject.value = null
@@ -71,6 +81,74 @@ function handleEvent(menu: string, value?: any) {
}
}
async function handleFetchSpecialists() {
try {
const specialistsResult = await getSpecialistList({ 'page-size': 100, includes: 'subspecialists' })
if (specialistsResult.success) {
const specialists = specialistsResult.body?.data || []
specialistsTree.value = getSpecialistTreeItems(specialists)
}
} catch (error) {
console.error('Error fetching specialist-subspecialist tree:', error)
}
}
/**
* Helper function to check if a value exists in the specialistsTree
* Returns true if it's a leaf node (subspecialist), false if parent node (specialist)
*/
function isSubspecialist(value: string, items: TreeItem[]): boolean {
for (const item of items) {
if (item.value === value) {
// If this item has children, it's not selected, so skip
// If this is the selected item, check if it has children in the tree
return false // This means it's a specialist, not a subspecialist
}
if (item.children) {
for (const child of item.children) {
if (child.value === value) {
// This is a subspecialist (leaf node)
return true
}
}
}
}
return false
}
async function handleFetchDoctors(subSpecialistId: string) {
try {
// Check if the selected value is a subspecialist or specialist
const isSub = isSubspecialist(subSpecialistId, specialistsTree.value)
// Build filter based on selection type
const filterParams: any = { 'page-size': 100 }
if (isSub) {
// If selected is subspecialist, filter by subspecialist-id
filterParams['subspecialist-id'] = subSpecialistId
} else {
// If selected is specialist, filter by specialist-id
filterParams['specialist-id'] = subSpecialistId
}
console.log('Fetching doctors with filter:', filterParams)
const doctors = await getDoctorValueLabelList(filterParams)
doctorsList.value = doctors
console.log('Fetched doctors:', doctors)
} catch (error) {
console.error('Error fetching doctors:', error)
doctorsList.value = []
}
}
function handleFetch(value?: any) {
if (value?.subSpecialistId) {
handleFetchDoctors(value.subSpecialistId)
}
}
async function handleInit() {
paymentsList.value = Object.keys(paymentTypes).map((item) => ({
value: item.toString(),
@@ -84,6 +162,8 @@ async function handleInit() {
value: item.toString(),
label: participantGroups[item],
})) as any
// Fetch tree data
await handleFetchSpecialists()
}
provide('table_data_loader', isLoading)
@@ -107,8 +187,11 @@ onMounted(async () => {
:payments="paymentsList"
:seps="sepsList"
:participant-groups="participantGroupsList"
:specialists="specialistsTree"
:doctor="doctorsList"
:patient="selectedPatientObject"
@event="handleEvent"
@fetch="handleFetch"
/>
<AppViewPatient