diff --git a/src/lib/api/api-client.js b/src/lib/api/api-client.js index 94e4798..eceef27 100644 --- a/src/lib/api/api-client.js +++ b/src/lib/api/api-client.js @@ -114,19 +114,19 @@ export async function create(endpoint, formData) { export async function update(endpoint, formData) { console.log(cleanEmptyStrings(formData)); - // try { - // const res = await fetch(`${API.BASE_URL}${endpoint}`, { - // method: 'PATCH', - // headers: { - // 'Content-Type': 'application/json', - // }, - // body: JSON.stringify(cleanEmptyStrings(formData)) - // }); + try { + const res = await fetch(`${API.BASE_URL}${endpoint}`, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(cleanEmptyStrings(formData)) + }); - // const data = await res.json(); - // return data; - // } catch (err) { - // console.error('Update Error:', err.message); - // return { success: false, message: err.message || 'Network error' }; - // } + const data = await res.json(); + return data; + } catch (err) { + console.error('Update Error:', err.message); + return { success: false, message: err.message || 'Network error' }; + } } \ No newline at end of file diff --git a/src/lib/components/composable/use-form-state.svelte.js b/src/lib/components/composable/use-form-state.svelte.js index a2b145e..a7511e5 100644 --- a/src/lib/components/composable/use-form-state.svelte.js +++ b/src/lib/components/composable/use-form-state.svelte.js @@ -2,13 +2,23 @@ export function useFormState(initial) { const form = $state(structuredClone(initial)) const isSaving = $state({ current: false }); + // function resetForm() { + // Object.assign(form, structuredClone(initial)); + // } + function resetForm() { + Object.keys(form).forEach(key => delete form[key]); Object.assign(form, structuredClone(initial)); } + // function setForm(data) { + // const snapshotData = $state.snapshot(data); + // Object.assign(form, JSON.parse(JSON.stringify(snapshotData))); + // } + function setForm(data) { - const snapshotData = $state.snapshot(data); - Object.assign(form, JSON.parse(JSON.stringify(snapshotData))); + // Object.keys(form).forEach(key => delete form[key]); + Object.assign(form, structuredClone(data)); } return { isSaving, form, resetForm, setForm } diff --git a/src/lib/components/composable/use-master-detail.svelte.js b/src/lib/components/composable/use-master-detail.svelte.js index 7915834..61ee763 100644 --- a/src/lib/components/composable/use-master-detail.svelte.js +++ b/src/lib/components/composable/use-master-detail.svelte.js @@ -7,6 +7,7 @@ export function useMasterDetail(options = {}) { let selectedItem = $state(null); let mode = $state("view"); let isLoadingDetail = $state(false); + let formSnapshot = $state(null); const formState = useForm(formConfig); @@ -23,6 +24,10 @@ export function useMasterDetail(options = {}) { detailWidth: isMobile ? "w-full" : isFormMode ? "w-[97%]" : "w-[65%]", }); + const isDirty = $derived( + JSON.stringify(formState.form) !== JSON.stringify(formSnapshot) + ); + async function select(item) { mode = "view"; @@ -49,32 +54,46 @@ export function useMasterDetail(options = {}) { formState.reset(); if (initialData) { - formState.setForm({ - ...formState.form, - ...initialData - }); + formState.setForm(initialData); } } - function enterEdit(mapToForm = null) { + function enterEdit(param) { if (!selectedItem) return; mode = "edit"; - const data = mapToForm - ? mapToForm(selectedItem) + const raw = param + ? selectedItem[param] : selectedItem; + if (!raw) return; + + const base = $state.snapshot(raw); + + const entity = formConfig.mapToForm + ? formConfig.mapToForm(base) + : base; + formState.reset(); - Object.assign(formState.form, data); + formState.setForm(entity); Object.keys(formState.errors).forEach(key => { formState.errors[key] = null; }); + + formSnapshot = $state.snapshot(formState.form); } function exitForm() { + if (isDirty) { + const ok = confirm('You have unsaved changes. Discard them?'); + if (!ok) return; + } + mode = "view"; selectedItem = null; + + formSnapshot = null; } function backToList() { @@ -108,6 +127,9 @@ export function useMasterDetail(options = {}) { get layout() { return layout; }, + get formSnapshot() { + return formSnapshot; + }, // get form() { // return form; // }, diff --git a/src/lib/components/composable/use-patient-form.svelte.js b/src/lib/components/composable/use-patient-form.svelte.js index 9c7c35b..152ab20 100644 --- a/src/lib/components/composable/use-patient-form.svelte.js +++ b/src/lib/components/composable/use-patient-form.svelte.js @@ -5,7 +5,14 @@ export function usePatientForm(formState, patientSchema) { let uploadErrors = $state({}); let isChecking = $state({}); - async function validateFieldAsync(field) { + async function validateFieldAsync(field, mode = 'create', originalValue = null) { + + if (mode === 'edit' && formState.form[field] === originalValue) { + formState.errors[field] = null; + isChecking[field] = false; + return; + } + isChecking[field] = true; try { @@ -33,8 +40,8 @@ export function usePatientForm(formState, patientSchema) { } function validateIdentifier() { - const identifierType = formState.form.PatIdt.IdentifierType; - const identifierValue = formState.form.PatIdt.Identifier; + const identifierType = formState.form.PatIdt?.IdentifierType; + const identifierValue = formState.form.PatIdt?.Identifier; if (!identifierType || !identifierValue) { formState.errors['PatIdt.Identifier'] = null; return; diff --git a/src/lib/components/patient/admission/config/admission-form-config.js b/src/lib/components/patient/admission/config/admission-form-config.js index 09ee352..4f39a76 100644 --- a/src/lib/components/patient/admission/config/admission-form-config.js +++ b/src/lib/components/patient/admission/config/admission-form-config.js @@ -133,7 +133,7 @@ export const admissionFormFields = [ }, { key: "isDischarge", - label: "Discharge Status", + label: "Admission Status", required: false, type: "toggle", defaultValue: false, diff --git a/src/lib/components/patient/admission/config/admission-payload.js b/src/lib/components/patient/admission/config/admission-payload.js index 7bbfb0e..92f9285 100644 --- a/src/lib/components/patient/admission/config/admission-payload.js +++ b/src/lib/components/patient/admission/config/admission-payload.js @@ -67,12 +67,26 @@ export function buildEditAdmissionPayload(form, diffs = []) { const PatVisitADT = diffs.map(diff => { // Determine ADTCode based on discharge status let ADTCode; - if (diff.isDischarge) { - ADTCode = "A03"; // Discharge - } else if (diff.originalisDischarge) { - ADTCode = "A13"; // Cancel discharge + // if (diff.isDischarge) { + // ADTCode = "A03"; // Discharge + // } else if (diff.originalisDischarge) { + // ADTCode = "A13"; // Cancel discharge + // } else { + // ADTCode = diff.code; // Normal update + // } + + if (diff.isDischarge && !diff.originalisDischarge) { + // NEW discharge (false → true) + ADTCode = "A03"; + } else if (!diff.isDischarge && diff.originalisDischarge) { + // CANCEL discharge (true → false) + ADTCode = "A13"; + } else if (diff.isDischarge && diff.originalisDischarge) { + // ALREADY discharged, other field changed + ADTCode = "A03"; // Keep discharge } else { - ADTCode = diff.code; // Normal update + // Normal update (not related to discharge) + ADTCode = diff.code; } return { @@ -96,7 +110,6 @@ export function buildEditPayloadWithDiff(originalData, formData) { // Compare & get diffs const diffs = compareAdmissionData(cleanedOriginal, cleanedForm); - console.log(formData); // Build payload const payload = buildEditAdmissionPayload(cleanedForm, diffs); diff --git a/src/lib/components/patient/admission/modal/search-param-modal.svelte b/src/lib/components/patient/admission/modal/search-param-modal.svelte index cff58ca..3781e36 100644 --- a/src/lib/components/patient/admission/modal/search-param-modal.svelte +++ b/src/lib/components/patient/admission/modal/search-param-modal.svelte @@ -45,8 +45,8 @@