From 1367ba4fa104bb4665b157760c730eef2b65d488 Mon Sep 17 00:00:00 2001 From: Alex <$(pass /github/email)> Date: Tue, 8 Oct 2024 07:39:03 +0200 Subject: [PATCH] grouped and sorted licence categories display --- frontend/src/hooks.server.js | 2 +- .../routes/auth/about/[id]/+page.server.js | 26 ++++-- .../src/routes/auth/about/[id]/+page.svelte | 87 ++++++++++++++----- 3 files changed, 83 insertions(+), 32 deletions(-) diff --git a/frontend/src/hooks.server.js b/frontend/src/hooks.server.js index ca883c4..c36f567 100644 --- a/frontend/src/hooks.server.js +++ b/frontend/src/hooks.server.js @@ -47,7 +47,7 @@ export async function handle({ event, resolve }) { event.locals.subscriptions = data.subscriptions; event.locals.user = data.user; event.locals.licence_categories = data.licence_categories; - console.dir(event.locals.licence_categories); + console.dir(event.locals.user); if (event.locals.user.date_of_birth) { event.locals.user.date_of_birth = event.locals.user.date_of_birth.split("T")[0]; diff --git a/frontend/src/routes/auth/about/[id]/+page.server.js b/frontend/src/routes/auth/about/[id]/+page.server.js index 7b91992..68d4bcd 100644 --- a/frontend/src/routes/auth/about/[id]/+page.server.js +++ b/frontend/src/routes/auth/about/[id]/+page.server.js @@ -24,6 +24,18 @@ export const actions = { updateUser: async ({ request, fetch, cookies, locals }) => { let formData = await request.formData(); + const licenceCategories = formData + .getAll("licence_categories[]") + .filter((value) => typeof value === "string") + .map((value) => { + try { + return JSON.parse(value); + } catch (e) { + console.error("Failed to parse licence category:", value); + return null; + } + }) + .filter(Boolean); /** @type {Partial} */ const updateData = { id: Number(formData.get("id")), @@ -67,19 +79,15 @@ export const actions = { issued_date: toRFC3339(formData.get("issued_date")), expiration_date: toRFC3339(formData.get("expiration_date")), country: String(formData.get("country")), - licence_categories: formData - .getAll("licence_categories[]") - .map((category) => ({ - id: -1, // Use -1 as a placeholder for new categories - category: String(category), - })), + licence_categories: licenceCategories, }, }; - // Remove undefined or null properties - const cleanUpdateData = Object.fromEntries( - Object.entries(updateData).filter(([_, v]) => v != null) + const cleanUpdateData = JSON.parse( + JSON.stringify(updateData), + (key, value) => (value !== null && value !== "" ? value : undefined) ); + console.dir(formData); console.dir(cleanUpdateData); const apiURL = `${BASE_API_URI}/backend/users/update/`; const res = await fetch(apiURL, { diff --git a/frontend/src/routes/auth/about/[id]/+page.svelte b/frontend/src/routes/auth/about/[id]/+page.svelte index 34deed7..515bf38 100644 --- a/frontend/src/routes/auth/about/[id]/+page.svelte +++ b/frontend/src/routes/auth/about/[id]/+page.svelte @@ -20,9 +20,36 @@ /** @type {App.Locals['user']}*/ $: user = $page.data.user; + /** + * creates groups of categories depending on the first letter + * @param {App.Locals['licence_categories']} categories - the categories to sort and group + * @returns {Object.} Grouped categories + */ + function groupCategories(categories) { + return Object.entries(categories) + .sort((a, b) => a[1].category.localeCompare(b[1].category)) + .reduce( + ( + /** @type {Object.} */ acc, + [_, category] + ) => { + const firstLetter = category.category[0]; + if (!acc[firstLetter]) { + acc[firstLetter] = []; + } + acc[firstLetter].push(category); + return acc; + }, + {} + ); + } + /** @type {App.Locals['licence_categories']} */ $: licence_categories = $page.data.licence_categories; + /** @type {Object.} */ + $: groupedCategories = groupCategories(licence_categories); + // /** @typedef {{name: string, src: string}} Avatar */ // const avatarFiles = import.meta.glob("$lib/img/Avatar-*.jpeg", { // eager: true, @@ -368,24 +395,30 @@

{$t("licence_categories")}

- {#each licence_categories as category} -
-
- cat.category === category.category - )} - /> + {#each Object.entries(groupedCategories) as [group, categories], groupIndex} + {#if groupIndex > 0} +
+ {/if} + {#each categories as category} +
+
+ cat.category === category.category + )} + /> +
+ + {$t(`licenceCategory.${category.category}`)} +
- - {$t(`licenceCategory.${category.category}`)} - -
+ {/each} {/each}
@@ -525,6 +558,16 @@ {/if}