From b38487e41f5413a028186bd6e42c02727402cf35 Mon Sep 17 00:00:00 2001 From: riefive Date: Thu, 27 Nov 2025 11:46:06 +0700 Subject: [PATCH 01/41] feat: enhance encounter entry forms with mode handling and default date setup --- app/components/app/encounter/entry-form.vue | 68 +++++++++++-------- app/components/app/sep/entry-form.vue | 2 +- app/components/content/encounter/entry.vue | 7 +- app/handlers/encounter-entry.handler.ts | 16 ++--- .../emergency/encounter/[id]/edit.vue | 2 +- .../(features)/emergency/encounter/add.vue | 4 +- .../inpatient/encounter/[id]/edit.vue | 2 +- .../(features)/inpatient/encounter/add.vue | 2 +- .../outpatient/encounter/[id]/edit.vue | 2 +- .../(features)/outpatient/encounter/add.vue | 2 +- 10 files changed, 57 insertions(+), 50 deletions(-) diff --git a/app/components/app/encounter/entry-form.vue b/app/components/app/encounter/entry-form.vue index 22acbbb8..9cb4d177 100644 --- a/app/components/app/encounter/entry-form.vue +++ b/app/components/app/encounter/entry-form.vue @@ -27,6 +27,7 @@ const props = defineProps<{ isReadonly?: boolean isSepValid?: boolean isCheckingSep?: boolean + mode?: string doctor?: any[] subSpecialist?: any[] specialists?: TreeItem[] @@ -63,11 +64,10 @@ const patientId = ref('') const isLoading = props.isLoading !== undefined ? props.isLoading : false const isReadonly = props.isReadonly !== undefined ? props.isReadonly : false - +const mode = props.mode !== undefined ? props.mode : 'add' // SEP validation state from props const isSepValid = computed(() => props.isSepValid || false) const isCheckingSep = computed(() => props.isCheckingSep || false) - const doctorOpts = computed(() => { // Add default option const defaultOption = [{ label: 'Pilih', value: '' }] @@ -75,9 +75,17 @@ const doctorOpts = computed(() => { const doctors = props.doctor || [] return [...defaultOption, ...doctors] }) - const isJKNPayment = computed(() => paymentType.value === 'jkn') +if (mode === 'add') { + // Set default sepDate to current date in YYYY-MM-DD format + const today = new Date() + const year = today.getFullYear() + const month = String(today.getMonth() + 1).padStart(2, '0') + const day = String(today.getDate()).padStart(2, '0') + registerDate.value = `${year}-${month}-${day}` +} + async function onFetchChildren(parentId: string): Promise { console.log('onFetchChildren', parentId) } @@ -141,7 +149,7 @@ function onAddSep() { registerDate: registerDate.value, cardNumber: cardNumber.value, paymentType: paymentType.value, - sepType: sepType.value + sepType: sepType.value, } emit('event', 'add-sep', formValues) } @@ -165,7 +173,7 @@ function submitForm() { }) console.log('🔵 Form errors:', errors.value) console.log('🔵 Form meta:', meta.value) - + // Trigger form submit using native form submit // This will trigger validation and onSubmit handler if (formRef.value) { @@ -179,7 +187,7 @@ function submitForm() { preventDefault: () => {}, target: formRef.value || {}, } as SubmitEvent - + // Call onSubmit directly console.log('🔵 Calling onSubmit with mock event') onSubmit(mockEvent) @@ -285,6 +293,22 @@ defineExpose({ :colCount="3" :cellFlex="false" > + + + + + + + - - - - - - - - - + + @@ -407,6 +439,26 @@ defineExpose({ placeholder="Masukkan nomor kartu BPJS" /> +
+ + Aktif +
+
+ + Tidak aktif +
@@ -469,7 +521,19 @@ defineExpose({ /> + - +
+ + Aktif +
{{ noteReference }} diff --git a/app/components/content/encounter/entry.vue b/app/components/content/encounter/entry.vue index c48e16e2..8d11d0fb 100644 --- a/app/components/content/encounter/entry.vue +++ b/app/components/content/encounter/entry.vue @@ -93,9 +93,15 @@ async function handleEvent(menu: string, value?: any) { ...value, }) } else if (menu === 'sep-number-changed') { - await getValidateSepNumber(String(value || '')) + const sepNumberText = String(value || '').trim() + if (sepNumberText.length > 5) { + await getValidateSepNumber(sepNumberText) + } } else if (menu === 'member-changed') { - await getValidateMember(String(value || '')) + const memberText = String(value || '').trim() + if (memberText.length > 5) { + await getValidateMember(memberText) + } } else if (menu === 'save') { await handleSaveEncounter(value) } else if (menu === 'cancel') { diff --git a/app/handlers/encounter-entry.handler.ts b/app/handlers/encounter-entry.handler.ts index b23e6409..3d418991 100644 --- a/app/handlers/encounter-entry.handler.ts +++ b/app/handlers/encounter-entry.handler.ts @@ -209,6 +209,10 @@ export function useEncounterEntry(props: { try { const result = await getMemberList({ mode: 'by-card', number: member, date: new Date().toISOString().split('T')[0] }) if (result.success && result.body?.response !== null) { + const response = result.body?.response || {} + if (Object.keys(response).length > 0) { + formObjects.value.nationalIdentity = response.peserta?.nik || '' + } isMemberValid.value = result.body?.metaData?.code === '200' } } catch (error) { From e9ed2a3715889cedecfd4d25166085816c7a80f0 Mon Sep 17 00:00:00 2001 From: riefive Date: Fri, 28 Nov 2025 14:48:29 +0700 Subject: [PATCH 05/41] feat: implement SEP search functionality and enhance history management --- app/components/app/encounter/entry-form.vue | 24 +++------ app/components/app/sep/action-history.vue | 31 +++++++++++ app/components/app/sep/list-cfg.history.ts | 52 ++++++++++++++----- app/components/app/sep/list-history.vue | 5 +- app/components/app/sep/view-history.vue | 3 +- app/components/content/encounter/entry.vue | 16 ++++++ app/components/content/sep/entry.vue | 2 +- app/handlers/integration-sep-entry.handler.ts | 14 ++--- 8 files changed, 108 insertions(+), 39 deletions(-) create mode 100644 app/components/app/sep/action-history.vue diff --git a/app/components/app/encounter/entry-form.vue b/app/components/app/encounter/entry-form.vue index 43a7a48c..961b105c 100644 --- a/app/components/app/encounter/entry-form.vue +++ b/app/components/app/encounter/entry-form.vue @@ -183,6 +183,10 @@ function onAddSep() { emit('event', 'add-sep', formValues) } +function onSearchSep() { + emit('event', 'search-sep', { cardNumber: cardNumber.value }) +} + // Submit handler const onSubmit = handleSubmit((values) => { console.log('✅ Validated form values:', JSON.stringify(values, null, 2)) @@ -193,23 +197,11 @@ const onSubmit = handleSubmit((values) => { const formRef = ref(null) function submitForm() { - console.log('🔵 submitForm called, formRef:', formRef.value) - console.log('🔵 Form values:', { - doctorId: doctorId.value, - subSpecialistId: subSpecialistId.value, - registerDate: registerDate.value, - paymentType: paymentType.value, - }) - console.log('🔵 Form errors:', errors.value) - console.log('🔵 Form meta:', meta.value) - // Trigger form submit using native form submit // This will trigger validation and onSubmit handler if (formRef.value) { - console.log('🔵 Calling formRef.value.requestSubmit()') formRef.value.requestSubmit() } else { - console.warn('⚠️ formRef.value is null, cannot submit form') // Fallback: directly call onSubmit handler // Create a mock event object const mockEvent = { @@ -218,7 +210,6 @@ function submitForm() { } as SubmitEvent // Call onSubmit directly - console.log('🔵 Calling onSubmit with mock event') onSubmit(mockEvent) } } @@ -498,7 +489,7 @@ defineExpose({ v-bind="sepNumberAttrs" placeholder="Tambah SEP terlebih dahulu" class="flex-1" - :disabled="isLoading || isReadonly" + :disabled="isLoading || isReadonly || isSepValid" />