mirror of
https://github.com/danbulant/Portfolio
synced 2026-06-24 17:11:49 +00:00
feat: high school field of study selection
This commit is contained in:
parent
1370881eee
commit
ca09a35493
4 changed files with 1390 additions and 16 deletions
1313
frontend/src/lib/assets/list/high_schools.json
Normal file
1313
frontend/src/lib/assets/list/high_schools.json
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -2,16 +2,20 @@
|
||||||
import LL from '$i18n/i18n-svelte';
|
import LL from '$i18n/i18n-svelte';
|
||||||
|
|
||||||
import School from './School.svelte';
|
import School from './School.svelte';
|
||||||
import type { School as SchoolType } from '$lib/stores/candidate';
|
import type { School as SchoolType, SchoolJson } from '$lib/stores/candidate';
|
||||||
|
import SelectField from '../SelectField.svelte';
|
||||||
|
import TextField from '$lib/components/textfield/TextField.svelte';
|
||||||
|
|
||||||
export let schoolList: Array<string>;
|
export let schoolNames: Array<string>;
|
||||||
|
export let schoolList: Array<SchoolJson>;
|
||||||
|
|
||||||
|
let fields: Array<string> = [];
|
||||||
let filteredSchools: Array<string> = [];
|
let filteredSchools: Array<string> = [];
|
||||||
|
|
||||||
const filterSchools = () => {
|
const filterSchools = () => {
|
||||||
let storageArr: Array<string> = [];
|
let storageArr: Array<string> = [];
|
||||||
if (schoolNameInputValue) {
|
if (schoolNameInputValue) {
|
||||||
schoolList.forEach((school) => {
|
schoolNames.forEach((school) => {
|
||||||
if (
|
if (
|
||||||
school
|
school
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
|
|
@ -36,17 +40,30 @@
|
||||||
|
|
||||||
let schoolNameInputValue = '';
|
let schoolNameInputValue = '';
|
||||||
let schoolFieldInputValue = '';
|
let schoolFieldInputValue = '';
|
||||||
|
let fieldFocusInputValue = '';
|
||||||
|
|
||||||
$: if (!schoolNameInputValue) {
|
$: if (!schoolNameInputValue) {
|
||||||
filteredSchools = [];
|
filteredSchools = [];
|
||||||
hiLiteIndex = -1;
|
hiLiteIndex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const setFields = (schoolName: string) => {
|
||||||
|
let school = schoolList.find((school) => school.n === schoolName);
|
||||||
|
if (school) {
|
||||||
|
fields = school.f;
|
||||||
|
} else {
|
||||||
|
fields = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$: setFields(schoolNameInputValue);
|
||||||
|
|
||||||
const setInputVal = (schoolName: string) => {
|
const setInputVal = (schoolName: string) => {
|
||||||
schoolNameInputValue = removeBold(schoolName);
|
schoolNameInputValue = removeBold(schoolName);
|
||||||
filteredSchools = [];
|
filteredSchools = [];
|
||||||
hiLiteIndex = -1;
|
hiLiteIndex = -1;
|
||||||
searchInput.focus();
|
searchInput.focus();
|
||||||
|
// setFields(schoolNameInputValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
const makeMatchBold = (str: string) => {
|
const makeMatchBold = (str: string) => {
|
||||||
|
|
@ -86,33 +103,67 @@
|
||||||
export let selectedSchool: SchoolType;
|
export let selectedSchool: SchoolType;
|
||||||
export let error: string = '';
|
export let error: string = '';
|
||||||
|
|
||||||
schoolFieldInputValue = selectedSchool.field;
|
if (selectedSchool.field.split(';').length > 1) {
|
||||||
|
console.log(selectedSchool.field);
|
||||||
|
schoolFieldInputValue = selectedSchool.field.split(';')[0];
|
||||||
|
fieldFocusInputValue = selectedSchool.field.split(';')[1];
|
||||||
|
} else {
|
||||||
|
schoolFieldInputValue = selectedSchool.field;
|
||||||
|
}
|
||||||
schoolNameInputValue = selectedSchool.name;
|
schoolNameInputValue = selectedSchool.name;
|
||||||
|
|
||||||
$: selectedSchool.field = schoolFieldInputValue;
|
$: selectedSchool.field = schoolFieldInputValue + (fieldFocusInputValue ? `;${fieldFocusInputValue}` : '');
|
||||||
$: selectedSchool.name = schoolNameInputValue;
|
$: selectedSchool.name = schoolNameInputValue;
|
||||||
|
|
||||||
|
let isSSPS = false;
|
||||||
|
$: isSSPS = schoolNameInputValue === 'Smíchovská střední průmyslová škola a gymnázium';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:window on:keydown={navigateList} />
|
<svelte:window on:keydown={navigateList} />
|
||||||
|
|
||||||
<div class="autocomplete">
|
<div class="autocomplete">
|
||||||
<div class="flex">
|
<div class="flex flex-col">
|
||||||
<input
|
<input
|
||||||
class:error
|
class:error
|
||||||
class="flex-1"
|
class=""
|
||||||
type="text"
|
type="text"
|
||||||
bind:this={searchInput}
|
bind:this={searchInput}
|
||||||
bind:value={schoolNameInputValue}
|
bind:value={schoolNameInputValue}
|
||||||
on:input={filterSchools}
|
on:input={filterSchools}
|
||||||
placeholder={$LL.input.schoolName()}
|
placeholder={$LL.input.schoolName()}
|
||||||
/>
|
/>
|
||||||
<input
|
<div class="flex mt-2">
|
||||||
|
<span class="w-1/2" class:w-full={isSSPS}>
|
||||||
|
<SelectField
|
||||||
|
on:focus={() => setFields(schoolNameInputValue)}
|
||||||
|
bind:value={schoolFieldInputValue}
|
||||||
|
options={fields}
|
||||||
|
placeholder={$LL.input.fieldOfStudy()}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
<span class="w-1/2 ml-2" class:hidden={isSSPS}>
|
||||||
|
<TextField
|
||||||
|
bind:value={fieldFocusInputValue}
|
||||||
|
placeholder="Zaměření (nepovinné)"
|
||||||
|
helperText="Např. Kybernetická bezpečnost, protože obor nemá svůj vlastní kód"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- <select
|
||||||
|
on:focus={() => setFields(schoolNameInputValue)}
|
||||||
|
>
|
||||||
|
{#each fields as field}
|
||||||
|
<option>{field}</option>
|
||||||
|
{/each}
|
||||||
|
</select> -->
|
||||||
|
<!-- <input
|
||||||
|
on:focus={() => setFields(schoolNameInputValue)}
|
||||||
class:error
|
class:error
|
||||||
class="ml-2 w-2/5"
|
class="mt-4"
|
||||||
type="text"
|
type="text"
|
||||||
bind:value={schoolFieldInputValue}
|
bind:value={schoolFieldInputValue}
|
||||||
placeholder={$LL.input.fieldOfStudy()}
|
placeholder={$LL.input.fieldOfStudy()}
|
||||||
/>
|
/> -->
|
||||||
</div>
|
</div>
|
||||||
{#if filteredSchools.length > 0}
|
{#if filteredSchools.length > 0}
|
||||||
<ul bind:this={optionsList} class="schoolAutocompleteList">
|
<ul bind:this={optionsList} class="schoolAutocompleteList">
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
import type { GradeBackend } from '$lib/components/grades/GradesTable.svelte';
|
import type { GradeBackend } from '$lib/components/grades/GradesTable.svelte';
|
||||||
import { writable } from 'svelte/store';
|
import { writable } from 'svelte/store';
|
||||||
|
|
||||||
|
export interface SchoolJson {
|
||||||
|
n: string;
|
||||||
|
f: string[];
|
||||||
|
}
|
||||||
export interface School {
|
export interface School {
|
||||||
name: string;
|
name: string;
|
||||||
field: string;
|
field: string;
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,13 @@
|
||||||
import type { Writable } from 'svelte/store';
|
import type { Writable } from 'svelte/store';
|
||||||
import { pushErrorText, pushSuccessText } from '$lib/utils/toast';
|
import { pushErrorText, pushSuccessText } from '$lib/utils/toast';
|
||||||
|
|
||||||
import schoolList from '$lib/assets/list/school.json';
|
// import schoolList from '$lib/assets/list/school.json';
|
||||||
|
import schoolList from '$lib/assets/list/high_schools.json';
|
||||||
import countriesList from '$lib/assets/list/countries.json';
|
import countriesList from '$lib/assets/list/countries.json';
|
||||||
|
|
||||||
|
// const schoolList = highSchoolList.map((school) => school['n']);
|
||||||
|
const schoolNames = schoolList.map((school) => school['n']);
|
||||||
|
|
||||||
let pageIndex = 0;
|
let pageIndex = 0;
|
||||||
let pagesFilled = [false, false, false, false, false, false, false, false];
|
let pagesFilled = [false, false, false, false, false, false, false, false];
|
||||||
const editModePageIndex = 3;
|
const editModePageIndex = 3;
|
||||||
|
|
@ -158,7 +162,7 @@
|
||||||
.required()
|
.required()
|
||||||
.test((_val) => {
|
.test((_val) => {
|
||||||
if (!_val) return false;
|
if (!_val) return false;
|
||||||
if (schoolList.includes(_val)) {
|
if (schoolNames.includes(_val)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
pushErrorText('Vyberte prosím školu ze seznamu.');
|
pushErrorText('Vyberte prosím školu ze seznamu.');
|
||||||
|
|
@ -174,7 +178,7 @@
|
||||||
.test((_val) => {
|
.test((_val) => {
|
||||||
if (!_val) return false;
|
if (!_val) return false;
|
||||||
if (!_val) return false;
|
if (!_val) return false;
|
||||||
if (schoolList.includes(_val)) {
|
if (schoolNames.includes(_val)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
pushErrorText('Vyberte prosím školu ze seznamu.');
|
pushErrorText('Vyberte prosím školu ze seznamu.');
|
||||||
|
|
@ -722,16 +726,17 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{:else if pageIndex === 7}
|
{:else if pageIndex === 7}
|
||||||
<h1 class="title mt-8">{pageTexts[5]}</h1>
|
<!-- <h1 class="title mt-8">{pageTexts[5]}</h1> -->
|
||||||
<p class="description mt-8 block text-center">
|
<!-- <p class="description mt-8 block text-center">
|
||||||
{$LL.candidate.register.seventh.description()}
|
{$LL.candidate.register.seventh.description()}
|
||||||
</p>
|
</p> -->
|
||||||
<div class="flex h-full flex-col justify-between">
|
<div class="flex h-full flex-col justify-between">
|
||||||
<span class="field">
|
<span class="field">
|
||||||
<h2 class="text-sspsBlueDark mb-6 text-3xl font-bold">
|
<h2 class="text-sspsBlueDark mb-6 text-3xl font-bold">
|
||||||
První škola - termín JPZ: <span class="underline">13. 4. 2023</span>
|
První škola - termín JPZ: <span class="underline">13. 4. 2023</span>
|
||||||
</h2>
|
</h2>
|
||||||
<SchoolSelect
|
<SchoolSelect
|
||||||
|
{schoolNames}
|
||||||
{schoolList}
|
{schoolList}
|
||||||
error={$typedErrors['candidate']['firstSchool']['name'] ||
|
error={$typedErrors['candidate']['firstSchool']['name'] ||
|
||||||
$typedErrors['candidate']['firstSchool']['field']}
|
$typedErrors['candidate']['firstSchool']['field']}
|
||||||
|
|
@ -756,6 +761,7 @@
|
||||||
Druhá škola - termín JPZ: <span class="underline">14. 4. 2023</span>
|
Druhá škola - termín JPZ: <span class="underline">14. 4. 2023</span>
|
||||||
</h2>
|
</h2>
|
||||||
<SchoolSelect
|
<SchoolSelect
|
||||||
|
{schoolNames}
|
||||||
{schoolList}
|
{schoolList}
|
||||||
error={$typedErrors['candidate']['secondSchool']['name'] ||
|
error={$typedErrors['candidate']['secondSchool']['name'] ||
|
||||||
$typedErrors['candidate']['secondSchool']['field']}
|
$typedErrors['candidate']['secondSchool']['field']}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue