diff --git a/frontend/src/lib/@api/candidate.ts b/frontend/src/lib/@api/candidate.ts index 6ef2929..2b9da43 100644 --- a/frontend/src/lib/@api/candidate.ts +++ b/frontend/src/lib/@api/candidate.ts @@ -85,6 +85,9 @@ export const apiLogin = async (data: CandidateLogin): Promise => { export const apiFillDetails = async (data: CandidateData): Promise => { // Sanitize candidate data Object.keys(data.candidate).forEach((key) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (typeof data.candidate[key] !== 'string' && typeof data.candidate[key] !== 'number') return; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore data.candidate[key] = DOMPurify.sanitize(data.candidate[key]); diff --git a/frontend/src/lib/components/button/Submit.svelte b/frontend/src/lib/components/button/Submit.svelte index e7daefc..4c51767 100644 --- a/frontend/src/lib/components/button/Submit.svelte +++ b/frontend/src/lib/components/button/Submit.svelte @@ -20,7 +20,7 @@ input { @apply hover:cursor-pointer; @apply bg-sspsBlue hover:bg-sspsBlueDark - @apply @apply rounded-lg p-3 text-xl font-semibold + @apply rounded-lg p-3 text-xl font-semibold text-white transition-colors duration-300; @apply w-full; } diff --git a/frontend/src/lib/components/grades/GradesRow.svelte b/frontend/src/lib/components/grades/GradesRow.svelte new file mode 100644 index 0000000..9341c45 --- /dev/null +++ b/frontend/src/lib/components/grades/GradesRow.svelte @@ -0,0 +1,41 @@ + + + + +
+ + {#each SEMESTERS as semester} + + {/each} +
+ + diff --git a/frontend/src/lib/components/grades/GradesTable.svelte b/frontend/src/lib/components/grades/GradesTable.svelte new file mode 100644 index 0000000..165fd4c --- /dev/null +++ b/frontend/src/lib/components/grades/GradesTable.svelte @@ -0,0 +1,122 @@ + + + + +
+ Známky + 1/8 + 2/8 + 1/9 + 2/9 +
+
+ {#each gradesLocal as _, i} +
+ +
+ {/each} + +
+ + diff --git a/frontend/src/lib/stores/candidate.ts b/frontend/src/lib/stores/candidate.ts index 013c204..0deb860 100644 --- a/frontend/src/lib/stores/candidate.ts +++ b/frontend/src/lib/stores/candidate.ts @@ -1,3 +1,4 @@ +import type { GradeBackend } from '$lib/components/grades/GradesTable.svelte'; import { writable } from 'svelte/store'; export interface CandidateData { @@ -14,6 +15,7 @@ export interface CandidateData { personalIdNumber: string; schoolName: string; healthInsurance: string; + grades: Array; }; parents: Array<{ name: string; @@ -72,7 +74,8 @@ export const candidateData = writable({ sex: '', personalIdNumber: '', schoolName: '', - healthInsurance: '' + healthInsurance: '', + grades: [] }, parents: [] }); diff --git a/frontend/src/routes/(admin)/admin/(authenticated)/candidate/[code=application]/+page.server.ts b/frontend/src/routes/(admin)/admin/(authenticated)/candidate/[code=application]/+page.server.ts index 50a759b..0e0a9db 100644 --- a/frontend/src/routes/(admin)/admin/(authenticated)/candidate/[code=application]/+page.server.ts +++ b/frontend/src/routes/(admin)/admin/(authenticated)/candidate/[code=application]/+page.server.ts @@ -19,7 +19,8 @@ export const load: PageServerLoad = async ({ fetch, params }) => { sex: '', personalIdNumber: '', schoolName: '', - healthInsurance: '' + healthInsurance: '', + grades: [] }, parents: [] }; diff --git a/frontend/src/routes/(candidate)/(authenticated)/register/+page.svelte b/frontend/src/routes/(candidate)/(authenticated)/register/+page.svelte index 97674e4..061e750 100644 --- a/frontend/src/routes/(candidate)/(authenticated)/register/+page.svelte +++ b/frontend/src/routes/(candidate)/(authenticated)/register/+page.svelte @@ -21,10 +21,11 @@ import * as yup from 'yup'; import type { CandidateData } from '$lib/stores/candidate'; import AccountLinkCheckBox from '$lib/components/checkbox/AccountLinkCheckBox.svelte'; + import GradesTable from '$lib/components/grades/GradesTable.svelte'; - const pageCount = 6; + const pageCount = 7; let pageIndex = 0; - let pagesFilled = [false, false, false, false, false, false]; + let pagesFilled = [false, false, false, false, false, false, false]; let pageTexts = [ 'Zpracování osobních údajů', 'Registrace', @@ -58,7 +59,8 @@ citizenship: '', personalIdNumber: '', schoolName: '', - healthInsurance: '' + healthInsurance: '', + grades: [] }, parents: [ { @@ -105,7 +107,20 @@ citizenship: yup.string().required(), personalIdNumber: yup.string().required(), schoolName: yup.string().required(), - healthInsurance: yup.number().required() + healthInsurance: yup.number().required(), + grades: yup + .array() + .min(1) + .of( + yup + .object() + .shape({ + subject: yup.string().required(), + value: yup.number().required(), + semester: yup.string().required() + }) + .required() + ).required() }), parents: yup.array().of( yup.object().shape({ @@ -244,22 +259,36 @@ values.parents = values.parents.filter( (x) => x.name !== '' && x.surname !== '' && x.email !== '' && x.telephone !== '' ); - // @ts-ignore - let addressArray: Array = [values.candidate.street + ' ' + values.candidate.houseNumber, values.candidate.city, values.candidate.zip]; + let addressArray: Array = [ + // @ts-ignore + values.candidate.street + ' ' + values.candidate.houseNumber, + // @ts-ignore + values.candidate.city, + // @ts-ignore + values.candidate.zip + ]; values.candidate.address = addressArray.map((x) => x.replaceAll(',', '').trim()).join(','); // @ts-ignore - delete values.candidate.street; delete values.candidate.houseNumber; delete values.candidate.city; delete values.candidate.zip; + delete values.candidate.street; + // @ts-ignore + delete values.candidate.houseNumber; + // @ts-ignore + delete values.candidate.city; + // @ts-ignore + delete values.candidate.zip; await apiFillDetails(values); + goto('/dashboard'); } catch (e) { values = oldValues; + $form = oldValues; console.error('error while submitting data: ' + e); } } }; - const { form, errors, handleSubmit, handleChange } = createForm({ + const { form, errors, handleSubmit } = createForm({ initialValues: formInitialValues, validationSchema: formValidationSchema, @@ -332,6 +361,9 @@ return true; } break; + case 7: + if ($typedErrors["candidate"]["grades"].length > 0) return true; + break; default: return false; } @@ -358,7 +390,9 @@ street: details.candidate.address.split(',')[0].split(' ')[0], houseNumber: details.candidate.address.split(',')[0].split(' ')[1], city: details.candidate.address.split(',')[1], - zip: details.candidate.address.split(',')[2] + zip: details.candidate.address.split(',')[2], + // @ts-ignore + grades: details.candidate.grades }, parents: [ { @@ -384,7 +418,7 @@
- {#if pageIndex > 0} + {#if pageIndex !== 0 && pageIndex !== 7}
@@ -402,7 +436,6 @@ applications={baseCandidateDetails.applications} bind:linkOk={$form.linkOk} bind:linkError={$form.linkError} - on:change={handleChange} error={$typedErrors['linkOk']} />
@@ -418,7 +451,6 @@

@@ -435,7 +467,6 @@ @@ -452,7 +482,6 @@ @@ -470,7 +499,6 @@ @@ -561,7 +582,6 @@ @@ -576,7 +596,6 @@ @@ -593,7 +611,6 @@ @@ -609,7 +626,6 @@ {:else} {/if}
+ {:else if pageIndex === 7} +

{pageTexts[5]}

+

+ Přidejte prosím přepis Vaších známek z posledních dvou let studia +

+ {/if}
-
+
{