{#snippet Fieldset({ key, label, required, type, optionsEndpoint, options, validateOn, dependsOn, endpointParamKey, valueKey, labelKey })}
{#if required} * {/if}
{#if type === "text"} { if (validateOn?.includes("input")) { formState.validateField(key, formState.form[key], false); } }} onblur={() => { if (validateOn?.includes("blur")) { validateFieldAsync(key, mode, originalData?.[key]); } }} /> {:else if type === "email"} { if (validateOn?.includes("input")) { formState.validateField(key, formState.form[key], false); } }} onblur={() => { if (validateOn?.includes("blur")) { formState.validateField(key, formState.form[key], false); } }} /> {:else if type === "number"} { if (validateOn?.includes("input")) { formState.validateField(key, formState.form[key], false); } }} onblur={() => { if (validateOn?.includes("blur")) { formState.validateField(key, formState.form[key], false); } }} /> {:else if type === "date"} { formState.form[key] = dateStr; if (validateOn?.includes("input")) { formState.validateField(key, dateStr, false); } }} /> {:else if type === "datetime"} { formState.form[key] = val; if (validateOn?.includes("input")) { formState.validateField(key, formState.form[key], false); } }} /> {:else if type === "textarea"} {:else if type === "select"} {@const selectedLabel = formState.selectOptions[key]?.find(opt => opt.value === formState.form[key])?.label || "Choose"} {@const filteredOptions = getFilteredOptions(key)} { formState.form[key] = val; if (validateOn?.includes("input")) { formState.validateField(key, formState.form[key], false); } if (key === "Province") { formState.form.City = ""; formState.selectOptions.City = []; formState.lastFetched.City = null; } }} onOpenChange={(open) => { if (open && optionsEndpoint) { formState.fetchOptions( { key, optionsEndpoint, dependsOn, endpointParamKey, valueKey, labelKey }, formState.form ); } }} > {selectedLabel}
{#if formState.loadingOptions[key]} Loading... {:else} {#if !required} - None - {/if} {#each filteredOptions as option} {option.label} {/each} {/if}
{:else if type === "identity"} {@const selectedLabel = formState.selectOptions[key]?.find(opt => opt.value === formState.form.PatIdt_IdentifierType)?.label || "Choose"}
{ if (open && optionsEndpoint) { formState.fetchOptions({ key, optionsEndpoint}); } }} onValueChange={(val) => { formState.form.PatIdt_IdentifierType = val; formState.form.PatIdt_Identifier = '' formState.errors.PatIdt_Identifier = null }} > {selectedLabel} {#if formState.loadingOptions[key]} Loading... {:else} {#if !required} - None - {/if} {#each formState.selectOptions[key] ?? [] as option} {option.label} {/each} {/if}
{:else if type === "custodian"}
{:else if type === "linkto"}
{:else if type === "fileupload"}
{#if Object.keys(uploadErrors).length > 0}
{#each Object.entries(uploadErrors) as [file, msg]} {msg} {/each}
{/if}
{:else if type === "toggle"}
{#if formState.form.isDischarge} {:else} {/if} {formState.form.isDischarge ? "Discharged" : "Active"}
{:else} {/if}
{#if isChecking[key]}
Checking...
{:else if formState.errors[key]} {formState.errors[key]} {/if}
{/snippet}
{#each formFields as group}
{#if group.title}
{group.title}
{/if} {#each group.rows as row}
{#each row.columns as col} {#if col.type === "group"}
{#each col.columns as child} {@render Fieldset(child)} {/each}
{:else} {@render Fieldset(col)} {/if} {/each}
{/each}
{/each}