initial group test & payload group

This commit is contained in:
faiztyanirh 2026-03-07 22:56:48 +07:00
parent 3573b1b2dc
commit 34f81fbe1a
4 changed files with 64 additions and 28 deletions

View File

@ -74,7 +74,7 @@ export const testCalSchema = z
}); });
export const testGroupSchema = z.object({ export const testGroupSchema = z.object({
Member: z.string().optional() Members: z.string().optional()
}); });
export const refNumSchema = z export const refNumSchema = z
@ -219,7 +219,7 @@ export const testCalInitialForm = {
export const testGroupInitialForm = { export const testGroupInitialForm = {
TestGrpID: '', TestGrpID: '',
TestSiteID: '', TestSiteID: '',
Member: '', Members: [],
} }
export const refNumInitialForm = { export const refNumInitialForm = {
@ -284,7 +284,7 @@ export const testCalDefaultErrors = {
}; };
export const testGroupDefaultErrors = { export const testGroupDefaultErrors = {
Member: null, Members: 'fdsa',
} }
export const refNumDefaultErrors = { export const refNumDefaultErrors = {
@ -1062,6 +1062,11 @@ export function buildTestPayload({ mainForm, activeFormStates, testType, refNumD
} else if (key === 'refTxt' && refTxtData?.length > 0) { } else if (key === 'refTxt' && refTxtData?.length > 0) {
payload[key] = refTxtData; payload[key] = refTxtData;
} else if(key === 'group') {
payload[key] = {
...state.form,
Members: state.form?.Members?.map((m) => m.value).filter(Boolean) ?? []
};
} else if (state?.form) { } else if (state?.form) {
payload[key] = { payload[key] = {
...state.form ...state.form

View File

@ -123,6 +123,9 @@
map: mapFormState map: mapFormState
}; };
case 'GROUP': case 'GROUP':
return {
group: groupFormState
}
case 'TITLE': case 'TITLE':
default: default:
return {}; return {};

View File

@ -1,25 +1,34 @@
<script> <script>
import DictionaryFormRenderer from "$lib/components/reusable/form/dictionary-form-renderer.svelte"; import DictionaryFormRenderer from '$lib/components/reusable/form/dictionary-form-renderer.svelte';
let props = $props(); let props = $props();
let members = $state([{ id: 1, value: "" }]); // function addMember() {
// members = [...members, { id: Date.now(), value: '' }];
// }
function addMember() { function addMember() {
members = [...members, { id: Date.now(), value: "" }]; props.groupFormState.form.Members = [
...(props.groupFormState.form.Members ?? []),
{ id: Date.now(), value: '' }
];
} }
// function removeMember(id) {
// members = members.filter((m) => m.id !== id);
// }
// $inspect(props.groupFormState.form)
function removeMember(id) { function removeMember(id) {
members = members.filter(m => m.id !== id); props.groupFormState.form.Members =
props.groupFormState.form.Members.filter((m) => m.id !== id);
} }
</script> </script>
<div class="flex flex-col gap-4 w-full"> <div class="flex flex-col gap-4 w-full">
<DictionaryFormRenderer <DictionaryFormRenderer
formState={props.groupFormState} formState={props.groupFormState}
formFields={props.testGroupFormFields} formFields={props.testGroupFormFields}
{members} onAddMember={addMember}
onAddMember={addMember} onRemoveMember={removeMember}
onRemoveMember={removeMember} />
/>
</div> </div>

View File

@ -30,11 +30,26 @@
handleTestTypeChange, handleTestTypeChange,
handleResultTypeChange, handleResultTypeChange,
handleRefTypeChange, handleRefTypeChange,
members = [],
onAddMember, onAddMember,
onRemoveMember, onRemoveMember
} = $props(); } = $props();
// $effect(() => {
// if (!formFields) return;
// const hasMembersField = formFields.some((group) =>
// group.rows?.some((row) => row.columns?.some((col) => col.type === 'members'))
// );
// if (hasMembersField) {
// if (members.length > 0) {
// formState.form.Member = members.map((m) => m.value).filter((v) => v);
// } else {
// formState.form.Member = '';
// }
// }
// });
const operators = ['+', '-', '*', '/', '^', '(', ')']; const operators = ['+', '-', '*', '/', '^', '(', ')'];
let searchQuery = $state({}); let searchQuery = $state({});
@ -615,14 +630,13 @@
</div> </div>
{/if} {/if}
</div> </div>
{:else if type === "members"} {:else if type === 'members'}
{@const filteredOptions = getFilteredOptions(key)} {@const filteredOptions = getFilteredOptions(key)}
<div class="flex flex-col gap-2 w-full"> <div class="flex flex-col gap-2 w-full">
{#each members as member, index (member.id)} {#each formState.form.Members as member, index (member.id)}
{@const selectedLabel = {@const selectedLabel =
formState.selectOptions?.[key]?.find( formState.selectOptions?.[key]?.find((opt) => opt.value === member.value)?.label ||
(opt) => opt.value === member.value 'Choose'}
)?.label || 'Choose'}
<div class="flex gap-1 w-full"> <div class="flex gap-1 w-full">
<Button type="button" variant="outline" size="icon" disabled> <Button type="button" variant="outline" size="icon" disabled>
{index + 1} {index + 1}
@ -668,7 +682,12 @@
</Select.Content> </Select.Content>
</Select.Root> </Select.Root>
</div> </div>
<Button type="button" variant="outline" size="icon" onclick={() => onRemoveMember(member.id)}> <Button
type="button"
variant="outline"
size="icon"
onclick={() => onRemoveMember(member.id)}
>
<Trash2Icon class="size-4" /> <Trash2Icon class="size-4" />
</Button> </Button>
</div> </div>