From f543d7cadbeb09e3bb325900020527537c3f3311 Mon Sep 17 00:00:00 2001 From: DavePk04 <Dave.Pikop.Pokam@ulb.be> Date: Sat, 29 Mar 2025 16:53:48 +0100 Subject: [PATCH] UI: created tutor profile page --- frontend/src/lang/en.json | 9 +- frontend/src/lang/fr.json | 11 +- frontend/src/routes/Header.svelte | 58 +++---- .../src/routes/tutor/profile/+page.svelte | 142 ++++++++++++++++++ frontend/src/routes/tutor/profile/+page.ts | 0 5 files changed, 186 insertions(+), 34 deletions(-) create mode 100644 frontend/src/routes/tutor/profile/+page.svelte create mode 100644 frontend/src/routes/tutor/profile/+page.ts diff --git a/frontend/src/lang/en.json b/frontend/src/lang/en.json index 348357fc..929a2b0c 100644 --- a/frontend/src/lang/en.json +++ b/frontend/src/lang/en.json @@ -9,7 +9,11 @@ "studies": "Studies" }, "tutor": { - "profile": "My profile" + "profile": "My profile", + "update": "Update", + "selectGender": "Select your gender", + "bio": "Biography", + "availabilities": "Availabilities" }, "availability": "Availability", "language": "Language", @@ -52,7 +56,8 @@ "noCurrentOrFutureSessions": "No session in progress or planned", "pastSessions": "Completed sessions", "plannedSessions": "Scheduled sessions", - "sessionAdded": "You have been added to a session with {users}" + "sessionAdded": "You have been added to a session with {users}", + "birthdate": "Birthdate" }, "signup": { "title": "Register", diff --git a/frontend/src/lang/fr.json b/frontend/src/lang/fr.json index e873b8c7..47c3c157 100644 --- a/frontend/src/lang/fr.json +++ b/frontend/src/lang/fr.json @@ -13,9 +13,13 @@ "users": "Utilisateurs", "sessions": "Sessions", "studies": "Études" - }, + }, "tutor": { - "profile": "Mon profil" + "profile": "Mon profil", + "update": "Confirmer", + "selectGender": "Sélectionnez votre genre", + "bio": "Biographie", + "availabilities": "Disponibilités" } }, "chatbox": { @@ -52,7 +56,8 @@ "actions": "Actions", "date": "Date", "participants": "Participants", - "sessionAdded": "Vous avez été ajouté à une session avec {users}" + "sessionAdded": "Vous avez été ajouté à une session avec {users}", + "birthdate": "Date de naissance" }, "login": { "email": "E-mail", diff --git a/frontend/src/routes/Header.svelte b/frontend/src/routes/Header.svelte index f8282ce3..97086bcd 100644 --- a/frontend/src/routes/Header.svelte +++ b/frontend/src/routes/Header.svelte @@ -99,35 +99,35 @@ </li> {/if} {#if user?.type === 0} - <li> - <details> - <summary class="p-3"> - <Icon src={Cog6Tooth} class="h-5 w-5" /> - </summary> - <ul class="menu menu-sm dropdown-content absolute right-0 z-10"> - <li> - <a data-sveltekit-reload href="/admin/users"> - {$t('header.admin.users')} - </a> - </li> - <li> - <a data-sveltekit-reload href="/admin/sessions"> - {$t('header.admin.sessions')} - </a> - </li> - <li> - <a data-sveltekit-reload href="/admin/studies"> - {$t('header.admin.studies')} - </a> - </li> - <li> - <a data-sveltekit-reload href="/logout" class="whitespace-nowrap"> - {$t('header.signout')} - </a> - </li> - </ul> - </details> - </li> + <li> + <details> + <summary class="p-3"> + <Icon src={Cog6Tooth} class="h-5 w-5" /> + </summary> + <ul class="menu menu-sm dropdown-content absolute right-0 z-10"> + <li> + <a data-sveltekit-reload href="/admin/users"> + {$t('header.admin.users')} + </a> + </li> + <li> + <a data-sveltekit-reload href="/admin/sessions"> + {$t('header.admin.sessions')} + </a> + </li> + <li> + <a data-sveltekit-reload href="/admin/studies"> + {$t('header.admin.studies')} + </a> + </li> + <li> + <a data-sveltekit-reload href="/logout" class="whitespace-nowrap"> + {$t('header.signout')} + </a> + </li> + </ul> + </details> + </li> {:else if !user} <li> <a diff --git a/frontend/src/routes/tutor/profile/+page.svelte b/frontend/src/routes/tutor/profile/+page.svelte new file mode 100644 index 00000000..3825c59c --- /dev/null +++ b/frontend/src/routes/tutor/profile/+page.svelte @@ -0,0 +1,142 @@ +<script lang="ts"> + import { t } from '$lib/services/i18n'; + import type { PageData } from './$types'; + + let { data }: { data: PageData } = $props(); + + const formatBirthdate = (dateStr: string | undefined): string => { + if (!dateStr) return ''; + const isoDate = dateStr.split('T')[0]; + if (/^\d{4}-\d{2}-\d{2}$/.test(isoDate)) return isoDate; + const [day, month, year] = dateStr.split('/'); + if (year?.length === 4) { + return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`; + } + + return ''; + }; + + let email = data.user?.email || ''; + let nickname = data.user?.nickname || ''; + let birthdate = formatBirthdate( + data.user?.birthdate ? data.user.birthdate.toString() : undefined + ); + let gender = data.user?.gender || ''; + let bio = data.user?.bio || ''; + let availabilities = data.user?.availabilities + ? JSON.stringify(data.user.availabilities, null, 2) + : ''; + + function updateProfile() { + let parsedAvailabilities; + try { + parsedAvailabilities = availabilities ? JSON.parse(availabilities) : []; + } catch (error) { + alert($t('errors.invalidAvailabilities')); + return; + } + + console.log({ + email, + nickname, + birthdate, + gender, + bio, + availabilities: parsedAvailabilities + }); + alert($t('profile.updatedSuccessfully')); + } +</script> + +<h1 class="text-2xl font-bold text-center my-5">{$t('header.tutor.profile')}</h1> + +<div class="max-w-lg mx-auto bg-white shadow-md rounded-lg p-6"> + <form on:submit|preventDefault={updateProfile}> + <div class="mb-4"> + <label for="email" class="block text-sm font-medium text-gray-700">{$t('home.email')}</label> + <input + type="email" + id="email" + bind:value={email} + class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" + required + /> + </div> + + <div class="mb-4"> + <label for="nickname" class="block text-sm font-medium text-gray-700" + >{$t('home.nickname')}</label + > + <input + type="text" + id="nickname" + bind:value={nickname} + class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" + required + /> + </div> + + <div class="mb-4"> + <label for="birthdate" class="block text-sm font-medium text-gray-700" + >{$t('home.birthdate')}</label + > + <input + type="date" + id="birthdate" + bind:value={birthdate} + class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" + required + /> + </div> + + <div class="mb-4"> + <label for="gender" class="block text-sm font-medium text-gray-700" + >{$t('users.gender')}</label + > + <select + id="gender" + bind:value={gender} + class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" + required + > + <option value="" disabled>{$t('header.tutor.selectGender')}</option> + <option value="male">{$t('users.genders.male')}</option> + <option value="female">{$t('users.genders.female')}</option> + <option value="other">{$t('users.genders.other')}</option> + </select> + </div> + + <div class="mb-4"> + <label for="bio" class="block text-sm font-medium text-gray-700">{$t('register.bio')}</label> + <textarea + id="bio" + rows="4" + bind:value={bio} + placeholder={$t('header.tutor.bio')} + class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" + required + ></textarea> + </div> + + <div class="mb-4"> + <label for="availabilities" class="block text-sm font-medium text-gray-700" + >{$t('register.availabilities')}</label + > + <textarea + id="availabilities" + rows="4" + bind:value={availabilities} + placeholder={$t('header.tutor.availabilities')} + class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm" + required + ></textarea> + </div> + + <button + type="submit" + class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-md shadow-md focus:outline-none focus:ring focus:ring-indigo-200" + > + {$t('header.tutor.update')} + </button> + </form> +</div> diff --git a/frontend/src/routes/tutor/profile/+page.ts b/frontend/src/routes/tutor/profile/+page.ts new file mode 100644 index 00000000..e69de29b -- GitLab