style: fix linting issues met Prettier
This commit is contained in:
		
							parent
							
								
									56d34adbc0
								
							
						
					
					
						commit
						7ad808cf3b
					
				
					 34 changed files with 244 additions and 214 deletions
				
			
		|  | @ -9,7 +9,7 @@ import { EnvVars, getNumericEnvVar } from './util/envvars.js'; | ||||||
| import apiRouter from './routes/router.js'; | import apiRouter from './routes/router.js'; | ||||||
| import swaggerMiddleware from './swagger.js'; | import swaggerMiddleware from './swagger.js'; | ||||||
| import swaggerUi from 'swagger-ui-express'; | import swaggerUi from 'swagger-ui-express'; | ||||||
| import {errorHandler} from "./middleware/error-handling/error-handler"; | import { errorHandler } from './middleware/error-handling/error-handler'; | ||||||
| 
 | 
 | ||||||
| const logger: Logger = getLogger(); | const logger: Logger = getLogger(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ import { EnvVars, getEnvVar } from '../util/envvars.js'; | ||||||
| import { Language } from '../entities/content/language.js'; | import { Language } from '../entities/content/language.js'; | ||||||
| import attachmentService from '../services/learning-objects/attachment-service.js'; | import attachmentService from '../services/learning-objects/attachment-service.js'; | ||||||
| import { NotFoundError } from '@mikro-orm/core'; | import { NotFoundError } from '@mikro-orm/core'; | ||||||
| import {BadRequestException} from "../exceptions/bad-request-exception.js"; | import { BadRequestException } from '../exceptions/bad-request-exception.js'; | ||||||
| 
 | 
 | ||||||
| function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { | function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { | ||||||
|     if (!req.params.hruid) { |     if (!req.params.hruid) { | ||||||
|  |  | ||||||
|  | @ -8,8 +8,8 @@ import { | ||||||
|     personalizedForGroup, |     personalizedForGroup, | ||||||
|     personalizedForStudent, |     personalizedForStudent, | ||||||
| } from '../services/learning-paths/learning-path-personalization-util.js'; | } from '../services/learning-paths/learning-path-personalization-util.js'; | ||||||
| import {BadRequestException} from "../exceptions/bad-request-exception.js"; | import { BadRequestException } from '../exceptions/bad-request-exception.js'; | ||||||
| import {NotFoundException} from "../exceptions/not-found-exception.js"; | import { NotFoundException } from '../exceptions/not-found-exception.js'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Fetch learning paths based on query parameters. |  * Fetch learning paths based on query parameters. | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ export async function createStudentHandler(req: Request, res: Response) { | ||||||
| 
 | 
 | ||||||
|     if (!newUser) { |     if (!newUser) { | ||||||
|         res.status(500).json({ |         res.status(500).json({ | ||||||
|             error: 'Something went wrong while creating student' |             error: 'Something went wrong while creating student', | ||||||
|         }); |         }); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| import { EntityRepository, FilterQuery } from '@mikro-orm/core'; | import { EntityRepository, FilterQuery } from '@mikro-orm/core'; | ||||||
| import {EntityAlreadyExistsException} from "../exceptions/entity-already-exists-exception"; | import { EntityAlreadyExistsException } from '../exceptions/entity-already-exists-exception'; | ||||||
| 
 | 
 | ||||||
| export abstract class DwengoEntityRepository<T extends object> extends EntityRepository<T> { | export abstract class DwengoEntityRepository<T extends object> extends EntityRepository<T> { | ||||||
|     public async save(entity: T, options?: { preventOverwrite?: boolean }): Promise<void> { |     public async save(entity: T, options?: { preventOverwrite?: boolean }): Promise<void> { | ||||||
|         if (options?.preventOverwrite && await this.findOne(entity)) { |         if (options?.preventOverwrite && (await this.findOne(entity))) { | ||||||
|             throw new EntityAlreadyExistsException(`A ${this.getEntityName()} with this identifier already exists.`); |             throw new EntityAlreadyExistsException(`A ${this.getEntityName()} with this identifier already exists.`); | ||||||
|         } |         } | ||||||
|         await this.getEntityManager().persistAndFlush(entity); |         await this.getEntityManager().persistAndFlush(entity); | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import {ExceptionWithHttpState} from "./exception-with-http-state.js"; | import { ExceptionWithHttpState } from './exception-with-http-state.js'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Exception for HTTP 400 Bad Request |  * Exception for HTTP 400 Bad Request | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import {ExceptionWithHttpState} from "./exception-with-http-state.js"; | import { ExceptionWithHttpState } from './exception-with-http-state.js'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Exception for HTTP 409 Conflict |  * Exception for HTTP 409 Conflict | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import {ConflictException} from "./conflict-exception"; | import { ConflictException } from './conflict-exception'; | ||||||
| 
 | 
 | ||||||
| export class EntityAlreadyExistsException extends ConflictException { | export class EntityAlreadyExistsException extends ConflictException { | ||||||
|     constructor(message: string) { |     constructor(message: string) { | ||||||
|  |  | ||||||
|  | @ -2,8 +2,10 @@ | ||||||
|  * Exceptions which are associated with a HTTP error code. |  * Exceptions which are associated with a HTTP error code. | ||||||
|  */ |  */ | ||||||
| export abstract class ExceptionWithHttpState extends Error { | export abstract class ExceptionWithHttpState extends Error { | ||||||
|     constructor(public status: number, public error: string) { |     constructor( | ||||||
|  |         public status: number, | ||||||
|  |         public error: string | ||||||
|  |     ) { | ||||||
|         super(error); |         super(error); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import {ExceptionWithHttpState} from "./exception-with-http-state.js"; | import { ExceptionWithHttpState } from './exception-with-http-state.js'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Exception for HTTP 403 Forbidden |  * Exception for HTTP 403 Forbidden | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import {ExceptionWithHttpState} from "./exception-with-http-state.js"; | import { ExceptionWithHttpState } from './exception-with-http-state.js'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Exception for HTTP 404 Not Found |  * Exception for HTTP 404 Not Found | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import {ExceptionWithHttpState} from "./exception-with-http-state.js"; | import { ExceptionWithHttpState } from './exception-with-http-state.js'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Exception for HTTP 401 Unauthorized |  * Exception for HTTP 401 Unauthorized | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| import { Student } from '../entities/users/student.entity.js'; | import { Student } from '../entities/users/student.entity.js'; | ||||||
| import {getStudentRepository} from "../data/repositories"; | import { getStudentRepository } from '../data/repositories'; | ||||||
| 
 | 
 | ||||||
| export interface StudentDTO { | export interface StudentDTO { | ||||||
|     id: string; |     id: string; | ||||||
|  | @ -27,6 +27,6 @@ export function mapToStudent(studentData: StudentDTO): Student { | ||||||
|     return getStudentRepository().create({ |     return getStudentRepository().create({ | ||||||
|         username: studentData.username, |         username: studentData.username, | ||||||
|         firstName: studentData.firstName, |         firstName: studentData.firstName, | ||||||
|         lastName: studentData.lastName |         lastName: studentData.lastName, | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| import { Teacher } from '../entities/users/teacher.entity.js'; | import { Teacher } from '../entities/users/teacher.entity.js'; | ||||||
| import {getTeacherRepository} from "../data/repositories"; | import { getTeacherRepository } from '../data/repositories'; | ||||||
| 
 | 
 | ||||||
| export interface TeacherDTO { | export interface TeacherDTO { | ||||||
|     id: string; |     id: string; | ||||||
|  | @ -27,6 +27,6 @@ export function mapToTeacher(teacherData: TeacherDTO): Teacher { | ||||||
|     return getTeacherRepository().create({ |     return getTeacherRepository().create({ | ||||||
|         username: teacherData.username, |         username: teacherData.username, | ||||||
|         firstName: teacherData.firstName, |         firstName: teacherData.firstName, | ||||||
|         lastName: teacherData.lastName |         lastName: teacherData.lastName, | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ import * as express from 'express'; | ||||||
| import * as jwt from 'jsonwebtoken'; | import * as jwt from 'jsonwebtoken'; | ||||||
| import { AuthenticatedRequest } from './authenticated-request.js'; | import { AuthenticatedRequest } from './authenticated-request.js'; | ||||||
| import { AuthenticationInfo } from './authentication-info.js'; | import { AuthenticationInfo } from './authentication-info.js'; | ||||||
| import {UnauthorizedException} from "../../exceptions/unauthorized-exception"; | import { UnauthorizedException } from '../../exceptions/unauthorized-exception'; | ||||||
| import {ForbiddenException} from "../../exceptions/forbidden-exception"; | import { ForbiddenException } from '../../exceptions/forbidden-exception'; | ||||||
| 
 | 
 | ||||||
| const JWKS_CACHE = true; | const JWKS_CACHE = true; | ||||||
| const JWKS_RATE_LIMIT = true; | const JWKS_RATE_LIMIT = true; | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| import {NextFunction, Request, Response} from "express"; | import { NextFunction, Request, Response } from 'express'; | ||||||
| import {getLogger, Logger} from "../../logging/initalize"; | import { getLogger, Logger } from '../../logging/initalize'; | ||||||
| import {ExceptionWithHttpState} from "../../exceptions/exception-with-http-state"; | import { ExceptionWithHttpState } from '../../exceptions/exception-with-http-state'; | ||||||
| 
 | 
 | ||||||
| const logger: Logger = getLogger(); | const logger: Logger = getLogger(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -92,4 +92,3 @@ export async function getLearningObjectsFromPath(hruid: string, language: string | ||||||
| export async function getLearningObjectIdsFromPath(hruid: string, language: string): Promise<string[]> { | export async function getLearningObjectIdsFromPath(hruid: string, language: string): Promise<string[]> { | ||||||
|     return (await fetchLearningObjects(hruid, false, language)) as string[]; |     return (await fetchLearningObjects(hruid, false, language)) as string[]; | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1,9 +1,4 @@ | ||||||
| import { | import { getClassRepository, getLearningObjectRepository, getQuestionRepository, getTeacherRepository } from '../data/repositories.js'; | ||||||
|     getClassRepository, |  | ||||||
|     getLearningObjectRepository, |  | ||||||
|     getQuestionRepository, |  | ||||||
|     getTeacherRepository, |  | ||||||
| } from '../data/repositories.js'; |  | ||||||
| import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; | import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; | ||||||
| import { getClassStudents } from './classes.js'; | import { getClassStudents } from './classes.js'; | ||||||
| import { StudentDTO } from '../interfaces/student.js'; | import { StudentDTO } from '../interfaces/student.js'; | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ import { useThemeQuery } from "@/queries/themes.ts"; | ||||||
| 
 | 
 | ||||||
|     const props = defineProps({ |     const props = defineProps({ | ||||||
|         selectedTheme: { type: String, required: true }, |         selectedTheme: { type: String, required: true }, | ||||||
|     selectedAge: { type: String, required: true } |         selectedAge: { type: String, required: true }, | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     const { locale } = useI18n(); |     const { locale } = useI18n(); | ||||||
|  | @ -23,9 +23,10 @@ watchEffect(() => { | ||||||
|         allCards.value = themes; |         allCards.value = themes; | ||||||
| 
 | 
 | ||||||
|         if (props.selectedTheme) { |         if (props.selectedTheme) { | ||||||
|         cards.value = themes.filter((theme) => |             cards.value = themes.filter( | ||||||
|  |                 (theme) => | ||||||
|                     THEMESITEMS[props.selectedTheme]?.includes(theme.key) && |                     THEMESITEMS[props.selectedTheme]?.includes(theme.key) && | ||||||
|             AGE_TO_THEMES[props.selectedAge]?.includes(theme.key) |                     AGE_TO_THEMES[props.selectedAge]?.includes(theme.key), | ||||||
|             ); |             ); | ||||||
|         } else { |         } else { | ||||||
|             cards.value = themes; |             cards.value = themes; | ||||||
|  | @ -33,15 +34,23 @@ watchEffect(() => { | ||||||
|     }); |     }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| <template> | <template> | ||||||
|     <v-container> |     <v-container> | ||||||
|         <div v-if="isLoading" class="text-center py-10"> |         <div | ||||||
|             <v-progress-circular indeterminate color="primary" /> |             v-if="isLoading" | ||||||
|  |             class="text-center py-10" | ||||||
|  |         > | ||||||
|  |             <v-progress-circular | ||||||
|  |                 indeterminate | ||||||
|  |                 color="primary" | ||||||
|  |             /> | ||||||
|             <p>Loading...</p> |             <p>Loading...</p> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <div v-else-if="error" class="text-center py-10 text-error"> |         <div | ||||||
|  |             v-else-if="error" | ||||||
|  |             class="text-center py-10 text-error" | ||||||
|  |         > | ||||||
|             <v-icon large>mdi-alert-circle</v-icon> |             <v-icon large>mdi-alert-circle</v-icon> | ||||||
|             <p>Error loading: {{ error.message }}</p> |             <p>Error loading: {{ error.message }}</p> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ | ||||||
|         { name: "English", code: "en" }, |         { name: "English", code: "en" }, | ||||||
|         { name: "Nederlands", code: "nl" }, |         { name: "Nederlands", code: "nl" }, | ||||||
|         { name: "Français", code: "fr" }, |         { name: "Français", code: "fr" }, | ||||||
|         { name: "Deutsch", code: "de" } |         { name: "Deutsch", code: "de" }, | ||||||
|     ]); |     ]); | ||||||
| 
 | 
 | ||||||
|     // Logic to change the language of the website to the selected language |     // Logic to change the language of the website to the selected language | ||||||
|  |  | ||||||
|  | @ -31,7 +31,10 @@ defineProps<{ | ||||||
|         </v-card-title> |         </v-card-title> | ||||||
|         <v-card-text class="description flex-grow-1">{{ description }}</v-card-text> |         <v-card-text class="description flex-grow-1">{{ description }}</v-card-text> | ||||||
|         <v-card-actions> |         <v-card-actions> | ||||||
|             <v-btn :to="`theme/${path}`" variant="text"> |             <v-btn | ||||||
|  |                 :to="`theme/${path}`" | ||||||
|  |                 variant="text" | ||||||
|  |             > | ||||||
|                 {{ t("read-more") }} |                 {{ t("read-more") }} | ||||||
|             </v-btn> |             </v-btn> | ||||||
|         </v-card-actions> |         </v-card-actions> | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ import i18n from "./i18n/i18n.ts"; | ||||||
| // Components
 | // Components
 | ||||||
| import App from "./App.vue"; | import App from "./App.vue"; | ||||||
| import router from "./router"; | import router from "./router"; | ||||||
| import { VueQueryPlugin, QueryClient } from '@tanstack/vue-query'; | import { VueQueryPlugin, QueryClient } from "@tanstack/vue-query"; | ||||||
| 
 | 
 | ||||||
| const app = createApp(App); | const app = createApp(App); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,11 +1,12 @@ | ||||||
| import { useQuery } from '@tanstack/vue-query'; | import { useQuery } from "@tanstack/vue-query"; | ||||||
| import { getThemeController } from '@/controllers/controllers'; | import { getThemeController } from "@/controllers/controllers"; | ||||||
| import { type MaybeRefOrGetter, toValue } from "vue"; | import { type MaybeRefOrGetter, toValue } from "vue"; | ||||||
| 
 | 
 | ||||||
| const themeController = getThemeController(); | const themeController = getThemeController(); | ||||||
| 
 | 
 | ||||||
| export const useThemeQuery = (language: MaybeRefOrGetter<string>) => useQuery({ | export const useThemeQuery = (language: MaybeRefOrGetter<string>) => | ||||||
|         queryKey: ['themes', language], |     useQuery({ | ||||||
|  |         queryKey: ["themes", language], | ||||||
|         queryFn: () => { |         queryFn: () => { | ||||||
|             const lang = toValue(language); |             const lang = toValue(language); | ||||||
|             return themeController.getAll(lang); |             return themeController.getAll(lang); | ||||||
|  | @ -13,9 +14,9 @@ export const useThemeQuery = (language: MaybeRefOrGetter<string>) => useQuery({ | ||||||
|         enabled: () => Boolean(toValue(language)), |         enabled: () => Boolean(toValue(language)), | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| export const useThemeHruidsQuery = (themeKey: string | null) => useQuery({ | export const useThemeHruidsQuery = (themeKey: string | null) => | ||||||
|         queryKey: ['theme-hruids', themeKey], |     useQuery({ | ||||||
|  |         queryKey: ["theme-hruids", themeKey], | ||||||
|         queryFn: () => themeController.getHruidsByKey(themeKey!), |         queryFn: () => themeController.getHruidsByKey(themeKey!), | ||||||
|         enabled: Boolean(themeKey), |         enabled: Boolean(themeKey), | ||||||
|     }); |     }); | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1,37 +1,64 @@ | ||||||
| export const THEMES_KEYS = [ | export const THEMES_KEYS = [ | ||||||
|     "kiks", "art", "socialrobot", "agriculture", "wegostem", |     "kiks", | ||||||
|     "computational_thinking", "math_with_python", "python_programming", |     "art", | ||||||
|     "stem", "care", "chatbot", "physical_computing", "algorithms", "basics_ai" |     "socialrobot", | ||||||
|  |     "agriculture", | ||||||
|  |     "wegostem", | ||||||
|  |     "computational_thinking", | ||||||
|  |     "math_with_python", | ||||||
|  |     "python_programming", | ||||||
|  |     "stem", | ||||||
|  |     "care", | ||||||
|  |     "chatbot", | ||||||
|  |     "physical_computing", | ||||||
|  |     "algorithms", | ||||||
|  |     "basics_ai", | ||||||
| ]; | ]; | ||||||
| 
 | 
 | ||||||
| export const THEMESITEMS: Record<string, string[]> = { | export const THEMESITEMS: Record<string, string[]> = { | ||||||
|     "all": THEMES_KEYS, |     all: THEMES_KEYS, | ||||||
|     "culture": ["art", "wegostem", "chatbot"], |     culture: ["art", "wegostem", "chatbot"], | ||||||
|     "electricity-and-mechanics": ["socialrobot", "wegostem", "stem", "physical_computing"], |     "electricity-and-mechanics": ["socialrobot", "wegostem", "stem", "physical_computing"], | ||||||
|     "nature-and-climate": ["kiks", "agriculture"], |     "nature-and-climate": ["kiks", "agriculture"], | ||||||
|     "agriculture": ["agriculture"], |     agriculture: ["agriculture"], | ||||||
|     "society": ["kiks", "socialrobot", "care", "chatbot"], |     society: ["kiks", "socialrobot", "care", "chatbot"], | ||||||
|     "math": ["kiks", "math_with_python", "python_programming", "stem", "care", "basics_ai"], |     math: ["kiks", "math_with_python", "python_programming", "stem", "care", "basics_ai"], | ||||||
|     "technology": ["socialrobot", "wegostem", "computational_thinking", "stem", "physical_computing", "basics_ai"], |     technology: ["socialrobot", "wegostem", "computational_thinking", "stem", "physical_computing", "basics_ai"], | ||||||
|     "algorithms": ["math_with_python", "python_programming", "stem", "algorithms", "basics_ai"], |     algorithms: ["math_with_python", "python_programming", "stem", "algorithms", "basics_ai"], | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export const AGEITEMS = [ | export const AGEITEMS = ["all", "primary-school", "lower-secondary", "upper-secondary", "high-school", "older"]; | ||||||
|     "all", "primary-school", "lower-secondary", "upper-secondary", "high-school", "older" |  | ||||||
| ]; |  | ||||||
| 
 | 
 | ||||||
| export const AGE_TO_THEMES: Record<string, string[]> = { | export const AGE_TO_THEMES: Record<string, string[]> = { | ||||||
|     "all": THEMES_KEYS, |     all: THEMES_KEYS, | ||||||
|     "primary-school": ["wegostem", "computational_thinking", "physical_computing"], |     "primary-school": ["wegostem", "computational_thinking", "physical_computing"], | ||||||
|     "lower-secondary": ["socialrobot", "art", "wegostem", "computational_thinking", "physical_computing"], |     "lower-secondary": ["socialrobot", "art", "wegostem", "computational_thinking", "physical_computing"], | ||||||
|     "upper-secondary": ["kiks", "art", "socialrobot", "agriculture", |     "upper-secondary": [ | ||||||
|         "computational_thinking", "math_with_python", "python_programming", |         "kiks", | ||||||
|         "stem", "care", "chatbot", "algorithms", "basics_ai"], |         "art", | ||||||
|     "high-school": [ |         "socialrobot", | ||||||
|         "kiks", "art", "agriculture", "computational_thinking", "math_with_python", "python_programming", |         "agriculture", | ||||||
|         "stem", "care", "chatbot", "algorithms", "basics_ai" |         "computational_thinking", | ||||||
|  |         "math_with_python", | ||||||
|  |         "python_programming", | ||||||
|  |         "stem", | ||||||
|  |         "care", | ||||||
|  |         "chatbot", | ||||||
|  |         "algorithms", | ||||||
|  |         "basics_ai", | ||||||
|     ], |     ], | ||||||
|     "older": [ |     "high-school": [ | ||||||
|         "kiks", "computational_thinking", "algorithms", "basics_ai" |         "kiks", | ||||||
|     ] |         "art", | ||||||
|  |         "agriculture", | ||||||
|  |         "computational_thinking", | ||||||
|  |         "math_with_python", | ||||||
|  |         "python_programming", | ||||||
|  |         "stem", | ||||||
|  |         "care", | ||||||
|  |         "chatbot", | ||||||
|  |         "algorithms", | ||||||
|  |         "basics_ai", | ||||||
|  |     ], | ||||||
|  |     older: ["kiks", "computational_thinking", "algorithms", "basics_ai"], | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -1,11 +1,7 @@ | ||||||
| <script setup lang="ts"> | <script setup lang="ts"></script> | ||||||
| 
 |  | ||||||
| </script> |  | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|     <main></main> |     <main></main> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <style scoped> | <style scoped></style> | ||||||
| 
 |  | ||||||
| </style> |  | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ import {ref, watch} from "vue"; | ||||||
| 
 | 
 | ||||||
|     const { t, locale } = useI18n(); |     const { t, locale } = useI18n(); | ||||||
| 
 | 
 | ||||||
|     const selectedThemeKey = ref<string>('all'); |     const selectedThemeKey = ref<string>("all"); | ||||||
|     const selectedAgeKey = ref<string>('all'); |     const selectedAgeKey = ref<string>("all"); | ||||||
| 
 | 
 | ||||||
|     const allThemes = ref(Object.keys(THEMESITEMS)); |     const allThemes = ref(Object.keys(THEMESITEMS)); | ||||||
|     const availableThemes = ref([...allThemes.value]); |     const availableThemes = ref([...allThemes.value]); | ||||||
|  | @ -17,18 +17,17 @@ import {ref, watch} from "vue"; | ||||||
| 
 | 
 | ||||||
|     // Reset selection when language changes |     // Reset selection when language changes | ||||||
|     watch(locale, () => { |     watch(locale, () => { | ||||||
|         selectedThemeKey.value = 'all'; |         selectedThemeKey.value = "all"; | ||||||
|         selectedAgeKey.value = 'all'; |         selectedAgeKey.value = "all"; | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     watch(selectedThemeKey, () => { |     watch(selectedThemeKey, () => { | ||||||
|         if (selectedThemeKey.value === "all") { |         if (selectedThemeKey.value === "all") { | ||||||
|             availableAges.value = [...allAges.value]; // Reset to all ages |             availableAges.value = [...allAges.value]; // Reset to all ages | ||||||
|         } else { |         } else { | ||||||
|             const themes = THEMESITEMS[selectedThemeKey.value]; |             const themes = THEMESITEMS[selectedThemeKey.value]; | ||||||
|             availableAges.value = allAges.value.filter(age => |             availableAges.value = allAges.value.filter((age) => | ||||||
|                 AGE_TO_THEMES[age]?.some(theme => themes.includes(theme)) |                 AGE_TO_THEMES[age]?.some((theme) => themes.includes(theme)), | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|  | @ -38,32 +37,31 @@ import {ref, watch} from "vue"; | ||||||
|             availableThemes.value = [...allThemes.value]; // Reset to all themes |             availableThemes.value = [...allThemes.value]; // Reset to all themes | ||||||
|         } else { |         } else { | ||||||
|             const themes = AGE_TO_THEMES[selectedAgeKey.value]; |             const themes = AGE_TO_THEMES[selectedAgeKey.value]; | ||||||
|             availableThemes.value = allThemes.value.filter(theme => |             availableThemes.value = allThemes.value.filter((theme) => | ||||||
|                 THEMESITEMS[theme]?.some(theme => themes.includes(theme)) |                 THEMESITEMS[theme]?.some((theme) => themes.includes(theme)), | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
| 
 |  | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|     <div class="main-container"> |     <div class="main-container"> | ||||||
|         <h1 class="title">{{ t("themes") }}</h1> |         <h1 class="title">{{ t("themes") }}</h1> | ||||||
|         <v-container class="dropdowns"> |         <v-container class="dropdowns"> | ||||||
|             <v-select class="v-select" |             <v-select | ||||||
|  |                 class="v-select" | ||||||
|                 :label="t('choose-theme')" |                 :label="t('choose-theme')" | ||||||
|                       :items="availableThemes.map(theme => ({ title: t(`theme-options.${theme}`), value: theme }))" |                 :items="availableThemes.map((theme) => ({ title: t(`theme-options.${theme}`), value: theme }))" | ||||||
|                 v-model="selectedThemeKey" |                 v-model="selectedThemeKey" | ||||||
|                 item-title="title" |                 item-title="title" | ||||||
|                 item-value="value" |                 item-value="value" | ||||||
|                 variant="outlined" |                 variant="outlined" | ||||||
|             /> |             /> | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|             <v-select |             <v-select | ||||||
|                 class="v-select" |                 class="v-select" | ||||||
|                 :label="t('choose-age')" |                 :label="t('choose-age')" | ||||||
|                 :items="availableAges.map(age => ({ key: age, label: t(`age-options.${age}`), value: age }))" |                 :items="availableAges.map((age) => ({ key: age, label: t(`age-options.${age}`), value: age }))" | ||||||
|                 v-model="selectedAgeKey" |                 v-model="selectedAgeKey" | ||||||
|                 item-title="label" |                 item-title="label" | ||||||
|                 item-value="key" |                 item-value="key" | ||||||
|  | @ -71,7 +69,10 @@ import {ref, watch} from "vue"; | ||||||
|             ></v-select> |             ></v-select> | ||||||
|         </v-container> |         </v-container> | ||||||
| 
 | 
 | ||||||
|         <BrowseThemes :selectedTheme="selectedThemeKey ?? ''" :selectedAge="selectedAgeKey ?? ''"/> |         <BrowseThemes | ||||||
|  |             :selectedTheme="selectedThemeKey ?? ''" | ||||||
|  |             :selectedAge="selectedAgeKey ?? ''" | ||||||
|  |         /> | ||||||
|     </div> |     </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  | @ -94,7 +95,6 @@ import {ref, watch} from "vue"; | ||||||
|         justify-content: center; |         justify-content: center; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     .dropdowns { |     .dropdowns { | ||||||
|         display: flex; |         display: flex; | ||||||
|         justify-content: space-between; |         justify-content: space-between; | ||||||
|  | @ -107,7 +107,6 @@ import {ref, watch} from "vue"; | ||||||
|         min-width: 100px; |         min-width: 100px; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     @media (max-width: 768px) { |     @media (max-width: 768px) { | ||||||
|         .main-container { |         .main-container { | ||||||
|             padding: 1rem; |             padding: 1rem; | ||||||
|  | @ -121,5 +120,4 @@ import {ref, watch} from "vue"; | ||||||
|             width: 80%; |             width: 80%; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Lint Action
						Lint Action