feat(patient): add callback url support for patient creation

Add callback URL parameter to redirect after successful patient creation. The URL can be passed via 'return-path' query parameter and will include the created patient's ID. This enables seamless integration with external systems that need to handle post-creation flows.
This commit is contained in:
Khafid Prayoga
2025-10-09 20:21:06 +07:00
parent 33f17e54b1
commit bd4a269fad
2 changed files with 25 additions and 4 deletions
+23 -3
View File
@@ -1,6 +1,7 @@
<script setup lang="ts">
import type { PatientEntity, genPatientProps } from '~/models/patient'
import type { ExposedForm } from '~/types/form'
import type { PatientBase } from '~/models/patient'
import Action from '~/components/pub/my-ui/nav-footer/ba-dr-su.vue'
import { genPatient } from '~/models/patient'
import { PatientSchema } from '~/schemas/patient.schema'
@@ -12,6 +13,9 @@ import { ResponsiblePersonSchema } from '~/schemas/person-relative.schema'
import { postPatient } from '~/services/patient.service'
// #region Props & Emits
const props = defineProps<{
callbackUrl?: string
}>()
const payload = ref<PatientEntity>()
// form related state
@@ -32,7 +36,11 @@ onMounted(() => {
// Initial synchronization when forms are mounted and isSameAddress is true by default
nextTick(() => {
const isSameAddress = personAddressRelativeForm.value?.values?.isSameAddress
if ((isSameAddress === true || isSameAddress === '1') && personAddressForm.value?.values && personAddressRelativeForm.value) {
if (
(isSameAddress === true || isSameAddress === '1') &&
personAddressForm.value?.values &&
personAddressRelativeForm.value
) {
const currentAddressValues = personAddressForm.value.values
if (Object.keys(currentAddressValues).length > 0) {
personAddressRelativeForm.value.setValues(
@@ -91,8 +99,16 @@ async function submitAll() {
try {
const result = await postPatient(formData)
const patientData: PatientBase = result.body
if (result.success) {
console.log('Patient created successfully:', result.body)
console.log('Patient created successfully:', patientData)
// If has callback provided redirect to callback with patientData
if (props.callbackUrl) {
await navigateTo(props.callbackUrl + '?patient-id=' + patientData.person_id)
return
}
// Navigate to patient list or show success message
await navigateTo('/client/patient')
} else {
@@ -172,7 +188,11 @@ watch(
watch(
() => personAddressRelativeForm.value?.values?.isSameAddress,
(isSameAddress) => {
if ((isSameAddress === true || isSameAddress === '1') && personAddressForm.value?.values && personAddressRelativeForm.value) {
if (
(isSameAddress === true || isSameAddress === '1') &&
personAddressForm.value?.values &&
personAddressRelativeForm.value
) {
// Ketika isSameAddress diubah menjadi true, copy alamat sekarang ke alamat KTP
const currentAddressValues = personAddressForm.value.values
personAddressRelativeForm.value.setValues(
+2 -1
View File
@@ -28,12 +28,13 @@ if (!hasAccess) {
// Define permission-based computed properties
const canRead = hasReadAccess(roleAccess)
const callbackUrl = route.query['return-path'] as string | undefined
</script>
<template>
<div>
<div v-if="canRead">
<ContentPatientEntry />
<ContentPatientEntry :callback-url="callbackUrl" />
</div>
<Error
v-else