211 lines
6.3 KiB
JavaScript

import { API } from "$lib/config/api";
import EraserIcon from "@lucide/svelte/icons/eraser";
import { z } from "zod";
import { cleanEmptyStrings } from "$lib/utils/cleanEmptyStrings";
export const testSchema = z.object({});
export const admissionInitialForm = {
InternalPVID: "",
InternalPID: "",
PVID: "",
EpisodeID: "",
DiagCode: "",
Diagnosis: "",
ADTCode: "",
LocationID: "",
AttDoc: "",
RefDoc: "",
AdmDoc: "",
CnsDoc: "",
isDischarge: false
};
export const admissionDefaultErrors = {};
export const admissionFormFields = [
{
title: "Visit Information",
rows: [
{
type: "row",
columns: [
// {
// key: "PVID",
// label: "Visit ID",
// required: false,
// type: "text",
// },
{
key: "EpisodeID",
label: "Episode ID",
required: false,
type: "text",
}
]
}
]
},
{
title: "Medical Team",
rows: [
{
type: "row",
columns: [
{
key: "AttDoc",
label: "Attended Doctor",
required: false,
type: "select",
optionsEndpoint: `${API.BASE_URL}${API.CONTACT}`,
valueKey: "ContactID",
labelKey: (item) => `${item.Initial} - ${item.NameFirst} ${item.NameLast}`,
},
{
key: "RefDoc",
label: "Reference Doctor",
required: false,
type: "select",
optionsEndpoint: `${API.BASE_URL}${API.CONTACT}`,
valueKey: "ContactID",
labelKey: (item) => `${item.Initial} - ${item.NameFirst} ${item.NameLast}`,
}
]
},
{
type: "row",
columns: [
{
key: "AdmDoc",
label: "Admitted Doctor",
required: false,
type: "select",
optionsEndpoint: `${API.BASE_URL}${API.CONTACT}`,
valueKey: "ContactID",
labelKey: (item) => `${item.Initial} - ${item.NameFirst} ${item.NameLast}`,
},
{
key: "CnsDoc",
label: "Consulte Doctor",
required: false,
type: "select",
optionsEndpoint: `${API.BASE_URL}${API.CONTACT}`,
valueKey: "ContactID",
labelKey: (item) => `${item.Initial} - ${item.NameFirst} ${item.NameLast}`,
}
]
}
]
},
{
title: "Visit Classification",
rows: [
{
type: "row",
columns: [
{
key: "LocationID",
label: "Location",
required: false,
type: "select",
optionsEndpoint: `${API.BASE_URL}${API.LOCATION}`,
valueKey: "LocationID",
labelKey: (item) => `${item.LocCode} - ${item.LocFull}`,
},
{
key: "VisitClass",
label: "Visit Class",
required: false,
type: "select",
// optionsEndpoint: `${API.BASE_URL}${API.VALUESET}/visit_classes`,
}
]
},
{
type: "row",
columns: [
{
key: "ServiceClass",
label: "Service Class",
required: false,
type: "select",
// optionsEndpoint: `${API.BASE_URL}${API.VALUESET}/service_classes`,
},
{
key: "isDischarge",
label: "Admission Status",
required: false,
type: "toggle",
defaultValue: false,
}
]
}
]
},
{
title: "Clinical Information",
rows: [
{
type: "row",
columns: [
{
key: "Diagnosis",
label: "Diagnosis",
required: false,
type: "textarea",
rows: 4,
maxLength: 1000,
}
]
}
]
}
];
export function getAdmissionFormActions(handlers) {
return [
{
Icon: EraserIcon,
label: 'Clear Form',
onClick: handlers.clearForm,
},
];
}
const admissionTemplate = {
PVID: 'PVID',
InternalPID: 'InternalPID',
EpisodeID: 'EpisodeID',
PatDiag: {
DiagCode: 'DiagCode',
Diagnosis: 'Diagnosis',
},
PatVisitADT: {
ADTCode: () => 'A04',
LocationID: 'LocationID',
AttDoc: 'AttDoc',
RefDoc: 'RefDoc',
AdmDoc: 'AdmDoc',
CnsDoc: 'CnsDoc',
},
};
export function buildPayload(form, schema = admissionTemplate) {
const payload = {};
for (const [key, config] of Object.entries(schema)) {
if (typeof config === 'string') {
// Kirim nilai dari form, atau null jika tidak ada (agar key tetap ada)
payload[key] = form[config] ?? null;
}
else if (typeof config === 'function') {
payload[key] = config(form);
}
else if (typeof config === 'object' && config !== null) {
// Rekursif tanpa pengecekan panjang keys, agar objek nested selalu dibuat
payload[key] = buildPayload(form, config);
}
}
return cleanEmptyStrings(payload);
}