Merge pull request #152 from EETagent/version_2_zeroday_fixes

(frontend) (backend) zero day fixes for v2, study & register ui
This commit is contained in:
Sebastian Pravda 2023-01-16 15:16:17 +01:00 committed by GitHub
commit c2f2710990
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 62 additions and 79 deletions

View file

@ -12,6 +12,7 @@ pub struct ApplicationCandidateJoin {
pub surname: Option<String>, pub surname: Option<String>,
pub email: Option<String>, pub email: Option<String>,
pub telephone: Option<String>, pub telephone: Option<String>,
pub field_of_study: Option<String>,
} }
use crate::{Query}; use crate::{Query};

View file

@ -14,6 +14,7 @@ pub struct ApplicationResponse {
pub surname: String, pub surname: String,
pub email: String, pub email: String,
pub telephone: String, pub telephone: String,
pub field_of_study: Option<String>,
} }
impl ApplicationResponse { impl ApplicationResponse {
@ -25,7 +26,6 @@ impl ApplicationResponse {
let surname = EncryptedString::decrypt_option(&EncryptedString::try_from(&c.surname).ok(), private_key).await?; let surname = EncryptedString::decrypt_option(&EncryptedString::try_from(&c.surname).ok(), private_key).await?;
let email = EncryptedString::decrypt_option(&EncryptedString::try_from(&c.email).ok(), private_key).await?; let email = EncryptedString::decrypt_option(&EncryptedString::try_from(&c.email).ok(), private_key).await?;
let telephone = EncryptedString::decrypt_option(&EncryptedString::try_from(&c.telephone).ok(), private_key).await?; let telephone = EncryptedString::decrypt_option(&EncryptedString::try_from(&c.telephone).ok(), private_key).await?;
Ok( Ok(
Self { Self {
application_id: c.application_id, application_id: c.application_id,
@ -34,6 +34,7 @@ impl ApplicationResponse {
email: email.unwrap_or_default(), email: email.unwrap_or_default(),
telephone: telephone.unwrap_or_default(), telephone: telephone.unwrap_or_default(),
candidate_id: c.candidate_id, candidate_id: c.candidate_id,
field_of_study: c.field_of_study,
} }
) )
} }

View file

@ -1,5 +1,10 @@
import axios, { type AxiosProgressEvent } from 'axios'; import axios, { type AxiosProgressEvent } from 'axios';
import type { BaseCandidate, CandidateData, CandidateLogin, CreateCandidate } from '$lib/stores/candidate'; import type {
BaseCandidate,
CandidateData,
CandidateLogin,
CreateCandidate
} from '$lib/stores/candidate';
import type { SubmissionProgress } from '$lib/stores/portfolio'; import type { SubmissionProgress } from '$lib/stores/portfolio';
import { API_URL, errorHandler, type Fetch } from '.'; import { API_URL, errorHandler, type Fetch } from '.';
import DOMPurify from 'isomorphic-dompurify'; import DOMPurify from 'isomorphic-dompurify';

View file

@ -62,10 +62,6 @@
<td class="px-2 py-2 font-semibold text-gray-500">E-mail</td> <td class="px-2 py-2 font-semibold text-gray-500">E-mail</td>
<td class="px-2 py-2">{candidate.email}</td> <td class="px-2 py-2">{candidate.email}</td>
</tr> </tr>
<tr>
<td class="px-2 py-2 font-semibold text-gray-500">Obor</td>
<td class="px-2 py-2">{candidate.study}</td>
</tr>
<tr> <tr>
<td class="px-2 py-2 font-semibold text-gray-500">Rodné číslo</td> <td class="px-2 py-2 font-semibold text-gray-500">Rodné číslo</td>
<td class="px-2 py-2">{candidate.personalIdNumber}</td> <td class="px-2 py-2">{candidate.personalIdNumber}</td>

View file

@ -36,7 +36,7 @@
{candidate.surname} {candidate.surname}
</td> </td>
<td class="text-gray-900"> <td class="text-gray-900">
{candidate.study} {candidate.fieldOfStudy}
</td> </td>
<td class="text-sm"> <td class="text-sm">
<Delete id={candidate.applicationId} on:delete value="Odstranit" /> <Delete id={candidate.applicationId} on:delete value="Odstranit" />

View file

@ -1,4 +1,3 @@
<script lang="ts"> <script lang="ts">
export let linkOk: boolean = false; export let linkOk: boolean = false;
export let linkError: boolean = false; export let linkError: boolean = false;
@ -12,19 +11,18 @@
title2 = `Ne, přihlášku na SSPŠaG jsem podával více přihlášek`; title2 = `Ne, přihlášku na SSPŠaG jsem podával více přihlášek`;
} }
$: console.log(linkOk, linkError); $: console.log(linkOk, linkError);
export let error: string = ''; export let error: string = '';
const switchSelection = (id: number) => { const switchSelection = (id: number) => {
if (id === 0) { if (id === 0) {
linkOk = true; linkOk = true;
linkError = false; linkError = false;
} else { } else {
linkOk = false; linkOk = false;
linkError = true; linkError = true;
} }
}; };
</script> </script>
@ -43,7 +41,7 @@
<span class="text-2xl">📜</span> <span class="text-2xl">📜</span>
<div class="w-full text-lg font-semibold"> <div class="w-full text-lg font-semibold">
{title1} {title1}
</div> </div>
<div class="w-full text-sm">Vše je v pořádku</div> <div class="w-full text-sm">Vše je v pořádku</div>
</div> </div>
@ -58,10 +56,7 @@
checked={linkError} checked={linkError}
class="peer hidden" class="peer hidden"
/> />
<label <label for="linkError" class="peer-checked:border-sspsBlue peer-checked:text-gray-600">
for="linkError"
class="peer-checked:border-sspsBlue peer-checked:text-gray-600"
>
<div class="block"> <div class="block">
<span class="text-2xl">📜</span> <span class="text-2xl">📜</span>

View file

@ -66,13 +66,13 @@
}; };
const getField = (id: number) => { const getField = (id: number) => {
if (id.toString().startsWith("101")) { if (id.toString().startsWith('101')) {
return 'G'; return 'G';
} else if (id.toString().startsWith("102")) { } else if (id.toString().startsWith('102')) {
return 'IT'; return 'IT';
} else { } else {
return 'KB'; return 'KB';
} }
}; };
const editDetails = async () => { const editDetails = async () => {
@ -159,7 +159,6 @@
<span class="font-bold">{$baseCandidateData.applications[1]}</span></span <span class="font-bold">{$baseCandidateData.applications[1]}</span></span
> >
{/if} {/if}
<span>Obor: <span class="font-bold">{$candidateData.candidate.study}</span></span>
<span>Adresa: <span class="font-bold">{$candidateData.candidate.address}</span></span> <span>Adresa: <span class="font-bold">{$candidateData.candidate.address}</span></span>
<span <span
>Datum narození: <span class="font-bold">{$candidateData.candidate.birthdate}</span >Datum narození: <span class="font-bold">{$candidateData.candidate.birthdate}</span
@ -174,9 +173,17 @@
>{$candidateData.candidate.personalIdNumber}</span >{$candidateData.candidate.personalIdNumber}</span
></span ></span
> >
<span>IČO/Název školy: <span class="font-bold">{$candidateData.candidate.schoolName}</span></span> <span
<span>Číslo zdravotní pojišťovny: <span class="font-bold">{$candidateData.candidate.healthInsurance}</span></span> >IČO/Název školy: <span class="font-bold">{$candidateData.candidate.schoolName}</span
<span>Telefon: <span class="font-bold">{$candidateData.candidate.telephone}</span></span> ></span
>
<span
>Číslo zdravotní pojišťovny: <span class="font-bold"
>{$candidateData.candidate.healthInsurance}</span
></span
>
<span>Telefon: <span class="font-bold">{$candidateData.candidate.telephone}</span></span
>
</div> </div>
<div <div
use:tippy={{ use:tippy={{

View file

@ -29,12 +29,12 @@
} }
.bgImage { .bgImage {
@apply -z-20; @apply -z-20;
@apply min-w-screen absolute min-h-screen min-w-full; @apply min-w-screen fixed min-h-screen min-w-full;
@apply bg-cover bg-no-repeat; @apply bg-cover bg-no-repeat;
background-position: 55%; background-position: 55%;
} }
.bgOverlay { .bgOverlay {
@apply min-w-screen absolute -z-10 min-h-screen; @apply min-w-screen fixed -z-10 min-h-screen;
background: linear-gradient(45deg, rgba(18, 48, 75, 1), rgba(119, 173, 224, 0.443)); background: linear-gradient(45deg, rgba(18, 48, 75, 1), rgba(119, 173, 224, 0.443));
@apply bg-cover; @apply bg-cover;
} }
@ -50,7 +50,7 @@
@apply p-7; @apply p-7;
} }
.view { .view {
@apply z-10 overflow-scroll; @apply z-10;
@apply top-0 right-0 bottom-0 left-0 m-auto h-screen w-screen; @apply top-0 right-0 bottom-0 left-0 m-auto h-screen w-screen;
} }
.content { .content {

View file

@ -28,11 +28,11 @@
<style lang="postcss"> <style lang="postcss">
.bgImage { .bgImage {
@apply -z-20; @apply -z-20;
@apply min-w-screen absolute min-h-full md:min-w-[50vw]; @apply min-w-screen fixed min-h-full md:min-w-[50vw];
@apply bg-cover bg-no-repeat; @apply bg-cover bg-no-repeat;
} }
.bgOverlay { .bgOverlay {
@apply min-w-screen absolute -z-10 min-h-full md:min-w-[50vw]; @apply min-w-screen fixed -z-10 min-h-full md:min-w-[50vw];
background: linear-gradient(45deg, rgba(18, 48, 75, 1), rgba(119, 173, 224, 0.443)); background: linear-gradient(45deg, rgba(18, 48, 75, 1), rgba(119, 173, 224, 0.443));
@apply bg-cover; @apply bg-cover;
} }
@ -48,7 +48,7 @@
@apply p-7; @apply p-7;
} }
.view { .view {
@apply z-10 overflow-scroll; @apply z-10;
@apply absolute top-0 right-0 bottom-0 left-0 m-auto md:top-auto md:bottom-auto md:left-auto md:m-0; @apply absolute top-0 right-0 bottom-0 left-0 m-auto md:top-auto md:bottom-auto md:left-auto md:m-0;
@apply md:h-screen md:w-[50vw]; @apply md:h-screen md:w-[50vw];
@apply md:my-auto; @apply md:my-auto;

View file

@ -11,7 +11,6 @@ export interface CandidateData {
citizenship: string; citizenship: string;
email: string; email: string;
sex: string; sex: string;
study: string;
personalIdNumber: string; personalIdNumber: string;
schoolName: string; schoolName: string;
healthInsurance: string; healthInsurance: string;
@ -28,7 +27,7 @@ export interface CandidatePreview {
applicationId?: number; applicationId?: number;
name?: string; name?: string;
surname?: string; surname?: string;
study?: string; fieldOfStudy?: string;
} }
export interface CandidateLogin { export interface CandidateLogin {
@ -71,7 +70,6 @@ export const candidateData = writable<CandidateData>({
citizenship: '', citizenship: '',
email: '', email: '',
sex: '', sex: '',
study: '',
personalIdNumber: '', personalIdNumber: '',
schoolName: '', schoolName: '',
healthInsurance: '' healthInsurance: ''

View file

@ -17,7 +17,6 @@ export const load: PageServerLoad = async ({ fetch, params }) => {
citizenship: '', citizenship: '',
email: '', email: '',
sex: '', sex: '',
study: '',
personalIdNumber: '', personalIdNumber: '',
schoolName: '', schoolName: '',
healthInsurance: '' healthInsurance: ''

View file

@ -38,9 +38,6 @@
let details = data.candidate; let details = data.candidate;
let baseCandidateDetails = data.whoami; let baseCandidateDetails = data.whoami;
let detailsFilledByAnotherAccount = baseCandidateDetails.encryptedBy !== null &&
baseCandidateDetails.currentApplication !== baseCandidateDetails.encryptedBy;
const formInitialValues = { const formInitialValues = {
gdpr: false, gdpr: false,
linkOk: false, linkOk: false,
@ -61,8 +58,7 @@
citizenship: '', citizenship: '',
personalIdNumber: '', personalIdNumber: '',
schoolName: '', schoolName: '',
healthInsurance: '', healthInsurance: ''
study: ''
}, },
parents: [ parents: [
{ {
@ -109,8 +105,7 @@
citizenship: yup.string().required(), citizenship: yup.string().required(),
personalIdNumber: yup.string().required(), personalIdNumber: yup.string().required(),
schoolName: yup.string().required(), schoolName: yup.string().required(),
healthInsurance: yup.number().required(), healthInsurance: yup.number().required()
study: yup.string().required()
}), }),
parents: yup.array().of( parents: yup.array().of(
yup.object().shape({ yup.object().shape({
@ -253,7 +248,7 @@
let addressArray: Array<string> = [values.candidate.street + ' ' + values.candidate.houseNumber, values.candidate.city, values.candidate.zip]; let addressArray: Array<string> = [values.candidate.street + ' ' + values.candidate.houseNumber, values.candidate.city, values.candidate.zip];
values.candidate.address = addressArray.map((x) => x.replaceAll(',', '').trim()).join(','); values.candidate.address = addressArray.map((x) => x.replaceAll(',', '').trim()).join(',');
// @ts-ignore // @ts-ignore
delete values.candidate.street;delete values.candidate.houseNumber;delete values.candidate.city;delete values.candidate.zip; delete values.candidate.street; delete values.candidate.houseNumber; delete values.candidate.city; delete values.candidate.zip;
await apiFillDetails(values); await apiFillDetails(values);
goto('/dashboard'); goto('/dashboard');
@ -332,8 +327,7 @@
$typedErrors['candidate']['citizenship'] || $typedErrors['candidate']['citizenship'] ||
$typedErrors['candidate']['personalIdNumber'] || $typedErrors['candidate']['personalIdNumber'] ||
$typedErrors['candidate']['schoolName'] || $typedErrors['candidate']['schoolName'] ||
$typedErrors['candidate']['healthInsurance'] || $typedErrors['candidate']['healthInsurance']
$typedErrors['candidate']['study']
) { ) {
return true; return true;
} }
@ -389,16 +383,19 @@
<SvelteToast /> <SvelteToast />
<div class="form relative"> <div class="form relative">
<div class="bottom-3/12 absolute flex w-full flex-col md:h-auto"> <div class="bottom-3/12 absolute flex w-full flex-col md:h-auto">
<div class="<md:h-24 <md:w-24 mb-4 h-32 w-32 self-center"> <!-- TODO: Find different way how to display SchoolBadge -->
<SchoolBadge /> {#if pageIndex > 0}
</div> <div class="<md:h-24 <md:w-24 mb-4 h-32 w-32 self-center">
<SchoolBadge />
</div>
{/if}
<form on:submit={handleSubmit} id="triggerForm" class="invisible hidden" /> <form on:submit={handleSubmit} id="triggerForm" class="invisible hidden" />
{#if pageIndex === 0} {#if pageIndex === 0}
<form on:submit={handleSubmit}> <form on:submit={handleSubmit}>
<h1 class="title mt-8">Propojení účtů</h1> <h1 class="title mt-8">Propojení účtů</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
Elektronickou přihlášky stačí vyplnit jen jednou i v případě, že jste podali dvě přihlášky. Elektronickou přihlášky stačí vyplnit jen jednou i v případě, že jste podali dvě
Potvrďte, že jste jste k nám skutečně podali dvě přihlášky. přihlášky. Potvrďte, že jste jste k nám skutečně podali dvě přihlášky.
</p> </p>
<div class="field"> <div class="field">
<AccountLinkCheckBox <AccountLinkCheckBox
@ -468,16 +465,16 @@
Pro registraci je potřeba vyplnit několik údajů o Vás. Tyto údaje budou použity pro Pro registraci je potřeba vyplnit několik údajů o Vás. Tyto údaje budou použity pro
přijímací řízení. Všechny údaje jsou důležité. přijímací řízení. Všechny údaje jsou důležité.
</p> </p>
<div class="flex field"> <div class="field flex">
<span class="w-[66%]"> <span class="w-[66%]">
<NameField <NameField
error={$typedErrors['candidate']['street'] || $typedErrors['candidate']['houseNumber']} error={$typedErrors['candidate']['street'] ||
$typedErrors['candidate']['houseNumber']}
on:change={handleChange} on:change={handleChange}
bind:valueName={$form.candidate.street} bind:valueName={$form.candidate.street}
bind:valueSurname={$form.candidate.houseNumber} bind:valueSurname={$form.candidate.houseNumber}
placeholder="Ulice a č. p." placeholder="Ulice a č. p."
helperText="Uveďte ulici a číslo popisné (např. Preslova 72)." helperText="Uveďte ulici a číslo popisné (např. Preslova 72)."
/> />
</span> </span>
<span class="ml-2 w-[33%]"> <span class="ml-2 w-[33%]">
@ -491,7 +488,7 @@
/> />
</span> </span>
</div> </div>
<div class="flex field"> <div class="field flex">
<span> <span>
<TextField <TextField
error={$typedErrors['candidate']['city']} error={$typedErrors['candidate']['city']}
@ -619,7 +616,6 @@
/> />
</span> </span>
<div class="field flex flex-row"> <div class="field flex flex-row">
<span> <span>
{#if $form.candidate.citizenship === 'Česká republika' || !$form.candidate.citizenship} {#if $form.candidate.citizenship === 'Česká republika' || !$form.candidate.citizenship}
<TextField <TextField
@ -640,7 +636,7 @@
{/if} {/if}
</span> </span>
<span> <span class="ml-2">
<TextField <TextField
error={$typedErrors['candidate']['healthInsurance']} error={$typedErrors['candidate']['healthInsurance']}
on:change={handleChange} on:change={handleChange}
@ -649,7 +645,6 @@
placeholder="Číslo zdravotní pojišťovny" placeholder="Číslo zdravotní pojišťovny"
/> />
</span> </span>
</div> </div>
</div> </div>
<div class="field flex items-center justify-center"> <div class="field flex items-center justify-center">
@ -668,15 +663,6 @@
placeholder="Rodné číslo" placeholder="Rodné číslo"
/> />
{/if} {/if}
<span class="ml-2">
<SelectField
error={$typedErrors['candidate']['study']}
on:change={handleChange}
bind:value={$form.candidate.study}
placeholder="Obor"
options={['KB', 'IT', 'G']}
/>
</span>
</div> </div>
{/if} {/if}
</div> </div>
@ -729,11 +715,6 @@
@apply mx-auto h-full w-[90%]; @apply mx-auto h-full w-[90%];
@apply items-center justify-center; @apply items-center justify-center;
} }
.form > form {
@apply flex flex-col;
@apply w-full;
@apply items-center justify-center;
}
.dot { .dot {
@apply @apply hover:bg-sspsBlue @apply @apply @apply hover:bg-sspsBlue @apply
bg-sspsGray ml-2 h-4 bg-sspsGray ml-2 h-4

View file

@ -152,7 +152,7 @@
input { input {
@apply text-sspsBlue text-center font-semibold; @apply text-sspsBlue text-center font-semibold;
@apply transition-colors duration-300; @apply transition-colors duration-300;
@apply focus:border-sspsBlue hover:border-sspsBlue rounded-xl border border-2 bg-[#f8fafb] p-3 shadow-lg outline-none caret-sspsBlueDark @apply focus:border-sspsBlue hover:border-sspsBlue caret-sspsBlueDark rounded-xl border border-2 bg-[#f8fafb] p-3 shadow-lg outline-none;
} }
.separater { .separater {
@apply bg-sspsBlue mr-2 hidden h-2 w-8 md:block; @apply bg-sspsBlue mr-2 hidden h-2 w-8 md:block;