eeg_certs/frontend/src/certs/NewRegister/RegisterPreview.tsx

103 lines
3.6 KiB
TypeScript
Raw Normal View History

import { FilledCard } from "../../components/FilledCard";
import { For } from "solid-js";
import { XIcon } from "../../icons/XIcon";
2023-08-25 22:54:30 +00:00
import { allCourses } from "../../utils/allCourses";
2023-08-28 22:28:58 +00:00
import { RegisterBatchCreate } from "../../types/Register";
import { RegistrationPreview } from ".";
2023-09-03 00:42:57 +00:00
import { loadCustomLabels } from "../../utils/allCustomLabels";
function isoDateToLocalDate(date: string): string {
const [,month, day] = /\d{4}-(\d{2})-(\d{2})/.exec(date) ?? "";
return `${day}/${month}`;
}
export function RegisterPreview(props: {selections: Array<RegistrationPreview>, personId: number | null, onDelete: (v: number) => void, onRegister: () => void}) {
const submit = async() => {
2023-09-03 00:42:57 +00:00
const registers: RegisterBatchCreate = props.selections.map(({courseId, date, customLabel}) => ({
2023-08-28 22:28:58 +00:00
person_id: props.personId!,
course_id: courseId,
date,
2023-09-03 00:42:57 +00:00
custom_label: customLabel,
2023-08-28 22:28:58 +00:00
}));
const result = await createRegisters(registers);
2023-08-28 22:28:58 +00:00
if (result === null) {
2023-08-31 17:11:48 +00:00
console.log("Create register: success");
2023-09-03 00:42:57 +00:00
// Custom labels may have changed, reload them
loadCustomLabels();
2023-08-28 22:28:58 +00:00
} else {
console.log(`error. ${result}`);
}
props.onRegister();
};
return (
<FilledCard class="border border-c-outline overflow-hidden">
<h2 class="p-4 font-bold text-xl">Confirmar registro</h2>
<div class="bg-c-surface p-4">
<For each={props.selections}>
{({courseId, date, customLabel}) => (
<Register
courseId={courseId}
date={date}
onDelete={props.onDelete}
customLabel={customLabel}
/>
)}
</For>
<button
class="bg-c-primary text-c-on-primary px-4 py-2 rounded-full cursor-pointer mt-4
disabled:opacity-50 disabled:cursor-not-allowed"
type="button"
disabled={props.selections.length === 0}
onclick={submit}
>
Registrar los {props.selections.length} cursos
</button>
</div>
</FilledCard>
);
}
function Register(props: {courseId: number, date: string, customLabel: string, onDelete: (v: number) => void}) {
const courseName = () => {
2023-08-25 22:54:30 +00:00
const courses = allCourses();
2023-08-31 17:11:48 +00:00
return courses.find((course) => course.course_id === props.courseId)?.course_name ?? `Curso invalido! (${props.courseId})`;
};
return (
<div class="grid grid-cols-[auto_4rem_1.5rem] py-1 px-2 rounded-md border border-c-outline my-1">
{courseName()}
<span class="font-mono">{isoDateToLocalDate(props.date)}</span>
<button
class="hover:bg-c-surface-variant rounded-md"
onclick={() => props.onDelete(props.courseId)}
>
<XIcon fill="var(--c-on-surface)" />
</button>
</div>
);
}
2023-08-28 22:28:58 +00:00
async function createRegisters(data: RegisterBatchCreate): Promise<null | string> {
const response = await fetch(`${import.meta.env.VITE_BACKEND_URL}/api/register/batch`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
2023-08-28 22:28:58 +00:00
body: JSON.stringify(data),
});
if (response.ok) {
return null;
} else {
const data = await response.json();
return JSON.stringify(data);
}
}