const loader = query(async (criterion_id: string) => {
"use server";
const criterion = await criterionRepo.find(criterion_id);
const programs = await programRepo.findAll();
const variants = await variantRepo.findByProgram(criterion.program_id);
return { criterion, programs, variants };
}, "admin-criterion");
const findVariantsByProgram = action(async (program_id: string) => {
"use server";
const variants = await variantRepo.findByProgram(program_id);
return json(variants, { revalidate: "nothing" });
}, "find-variants-by-program");
export default function AdminCriteriaAggregate() {
const params = useParams();
const data = createAsync(() => loader(params.id));
const findVariants = useAction(findVariantsByProgram);
const findVariantsSubmission = useSubmission(findVariantsByProgram);
const [programId, setProgramId] = createSignal<string | undefined>(
data()?.criterion.program_id,
);
return (
<Show when={data()}>
<form method="post" action={update} class="flex flex-col gap-md">
...
<Field
id="program_id"
label="Programm"
>
{(field) => (
<Select
{...field}
options={data()!.programs}
valueKey="id"
labelKey="name"
select={(program) => program.id === data()!.criterion.program_id}
onChange={(e) => findVariants(e.currentTarget.value)}
/>
)}
</Field>
<Field
id="variant_id"
label="Programmprofil"
>
{(field) => (
<Select
{...field}
options={findVariantsSubmission.result || data()!.variants}
valueKey="id"
labelKey="name"
select={(variant) => variant.id === data()!.criterion.variant_id}
/>
)}
</Field>