From 1f61c9ad71116206b887fd6a926ad13a6245bf9d Mon Sep 17 00:00:00 2001 From: Alex <$(pass /github/email)> Date: Sun, 2 Mar 2025 23:12:10 +0100 Subject: [PATCH] frontend: add defaultUser, supporter --- frontend/src/app.d.ts | 4 + frontend/src/lib/components/InputField.svelte | 3 + .../src/lib/components/UserEditForm.svelte | 166 ++++++------------ frontend/src/lib/utils/constants.js | 2 + frontend/src/lib/utils/defaults.js | 119 +++++++++++++ .../src/routes/auth/admin/users/+page.svelte | 21 +-- 6 files changed, 186 insertions(+), 129 deletions(-) create mode 100644 frontend/src/lib/utils/defaults.js diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts index 09c7e91..d446664 100644 --- a/frontend/src/app.d.ts +++ b/frontend/src/app.d.ts @@ -80,6 +80,10 @@ declare global { interface Types { licenceCategory: LicenceCategory; subscription: Subscription; + membership: Membership; + licence: Licence; + licenceCategory: LicenceCategory; + bankAccount: BankAccount; } // interface PageData {} // interface Platform {} diff --git a/frontend/src/lib/components/InputField.svelte b/frontend/src/lib/components/InputField.svelte index 978c040..856d921 100644 --- a/frontend/src/lib/components/InputField.svelte +++ b/frontend/src/lib/components/InputField.svelte @@ -130,6 +130,9 @@ {#if error} {error} {/if} + {#if readonly} + + {/if} {#if type === 'select'} +

- {localUser.id ? $t('user.edit') : $t('user.create')} + {user.id ? $t('user.edit') : $t('user.create')}

{#if form?.success}

@@ -243,11 +172,11 @@ name="user[role_id]" type="select" label={$t('user.role')} - bind:value={localUser.role_id} + bind:value={user.role_id} options={userRoleOptions} /> {/if} - {#if hasPrivilige(localUser, PERMISSIONS.Member)} + {#if hasPrivilige(user, PERMISSIONS.Member)} @@ -299,35 +228,39 @@ name="user[phone]" type="tel" label={$t('user.phone')} - bind:value={localUser.phone} + bind:value={user.phone} placeholder={$t('placeholder.phone')} /> - {#if hasPrivilige(localUser, PERMISSIONS.Member)} + {#if hasPrivilige(user, PERMISSIONS.Member)} {/if} {#if !readonlyUser} @@ -335,22 +268,22 @@ name="user[notes]" type="textarea" label={$t('notes')} - bind:value={localUser.notes} + bind:value={user.notes} placeholder={$t('placeholder.notes', { - values: { name: localUser.first_name || '' } + values: { name: user.first_name || '' } })} rows={10} /> {/if} - {#if hasPrivilige(localUser, PERMISSIONS.Member)} + {#if hasPrivilige(user, PERMISSIONS.Member)}
@@ -358,7 +291,7 @@ name="user[licence][number]" type="text" label={$t('licence_number')} - bind:value={localUser.licence.number} + bind:value={user.licence.number} placeholder={$t('placeholder.licence_number')} toUpperCase={true} readonly={readonlyUser} @@ -367,7 +300,7 @@ name="user[licence][issued_date]" type="date" label={$t('issued_date')} - bind:value={localUser.licence.issued_date} + bind:value={user.licence.issued_date} placeholder={$t('placeholder.issued_date')} readonly={readonlyUser} /> @@ -375,14 +308,14 @@ name="user[licence][expiration_date]" type="date" label={$t('expiration_date')} - bind:value={localUser.licence.expiration_date} + bind:value={user.licence.expiration_date} placeholder={$t('placeholder.expiration_date')} readonly={readonlyUser} /> @@ -401,10 +334,8 @@ name="user[licence][categories][]" value={JSON.stringify(category)} label={category.category} - checked={localUser.licence.categories != null && - localUser.licence.categories.some( - (cat) => cat.category === category.category - )} + checked={user.licence.categories != null && + user.licence.categories.some((cat) => cat.category === category.category)} />
@@ -422,7 +353,7 @@ name="user[membership][status]" type="select" label={$t('status')} - bind:value={localUser.membership.status} + bind:value={user.membership.status} options={membershipStatusOptions} readonly={readonlyUser} /> @@ -430,12 +361,12 @@ name="user[membership][subscription_model][name]" type="select" label={$t('subscription.subscription')} - bind:value={localUser.membership.subscription_model.name} + bind:value={user.membership.subscription_model.name} options={subscriptionModelOptions} - readonly={readonlyUser} + readonly={readonlyUser || !hasPrivilige(user, PERMISSIONS.Member)} />
- {#if hasPrivilige(editor, PERMISSIONS.Member)} + {#if hasPrivilige(user, PERMISSIONS.Member)}

{$t('subscription.monthly_fee')}: @@ -476,7 +407,7 @@ name="user[membership][start_date]" type="date" label={$t('start')} - bind:value={localUser.membership.start_date} + bind:value={user.membership.start_date} placeholder={$t('placeholder.start_date')} readonly={readonlyUser} /> @@ -484,16 +415,16 @@ name="user[membership][end_date]" type="date" label={$t('end')} - bind:value={localUser.membership.end_date} + bind:value={user.membership.end_date} placeholder={$t('placeholder.end_date')} readonly={readonlyUser} /> - {#if hasPrivilige(editor, PERMISSIONS.Member)} + {#if hasPrivilige(user, PERMISSIONS.Member)} @@ -503,33 +434,34 @@ @@ -537,7 +469,7 @@ name="user[bank_account][mandate_date_signed]" label={$t('mandate_date_signed')} type="date" - bind:value={localUser.bank_account.mandate_date_signed} + bind:value={user.bank_account.mandate_date_signed} readonly={true} />

diff --git a/frontend/src/lib/utils/constants.js b/frontend/src/lib/utils/constants.js index 65a874c..7a454bf 100644 --- a/frontend/src/lib/utils/constants.js +++ b/frontend/src/lib/utils/constants.js @@ -10,3 +10,5 @@ export const PERMISSIONS = { Delete: 4, Super: 8 }; + +export const SUPPORTER_SUBSCRIPTION_MODEL_NAME = 'Keins'; diff --git a/frontend/src/lib/utils/defaults.js b/frontend/src/lib/utils/defaults.js new file mode 100644 index 0000000..cef4889 --- /dev/null +++ b/frontend/src/lib/utils/defaults.js @@ -0,0 +1,119 @@ +// src/lib/utils/defaults.js + +import { SUPPORTER_SUBSCRIPTION_MODEL_NAME } from './constants'; + +/** + * @returns {App.Types['subscription']} + */ +export function defaultSubscription() { + return { + id: 0, + name: '', + details: '', + conditions: '', + monthly_fee: 0, + hourly_rate: 0, + included_hours_per_year: 0, + included_hours_per_month: 0 + }; +} + +/** + * @returns {App.Types['membership']} + */ +export function defaultMembership() { + return { + id: 0, + status: 3, + start_date: '', + end_date: '', + parent_member_id: 0, + subscription_model: defaultSubscription() + }; +} + +/** + * @returns {App.Types['bankAccount']} + */ +export function defaultBankAccount() { + return { + id: 0, + mandate_date_signed: '', + bank: '', + account_holder_name: '', + iban: '', + bic: '', + mandate_reference: '' + }; +} + +/** + * @returns {App.Types['licence']} + */ +export function defaultLicence() { + return { + id: 0, + status: 0, + number: '', + issued_date: '', + expiration_date: '', + country: '', + categories: [] + }; +} + +/** + * @returns {App.Locals['user']} + */ +export function defaultUser() { + return { + id: 0, + email: '', + first_name: '', + last_name: '', + password: '', + phone: '', + address: '', + zip_code: '', + city: '', + company: '', + dateofbirth: '', + notes: '', + profile_picture: '', + payment_status: 0, + status: 1, + role_id: 1, + membership: defaultMembership(), + licence: defaultLicence(), + bank_account: defaultBankAccount() + }; +} + +/** + * @returns {App.Locals['user']} + */ +export function defaultSupporter() { + let supporter = { + id: 0, + email: '', + first_name: '', + last_name: '', + password: '', + phone: '', + address: '', + zip_code: '', + city: '', + company: '', + dateofbirth: '', + notes: '', + profile_picture: '', + payment_status: 0, + status: 1, + role_id: 0, + membership: defaultMembership(), + licence: defaultLicence(), + bank_account: defaultBankAccount() + }; + supporter.membership.subscription_model.name = SUPPORTER_SUBSCRIPTION_MODEL_NAME; + return supporter; +} diff --git a/frontend/src/routes/auth/admin/users/+page.svelte b/frontend/src/routes/auth/admin/users/+page.svelte index dfcda3d..65f3da7 100644 --- a/frontend/src/routes/auth/admin/users/+page.svelte +++ b/frontend/src/routes/auth/admin/users/+page.svelte @@ -8,6 +8,7 @@ import { applyAction, enhance } from '$app/forms'; import { hasPrivilige, receive, send } from '$lib/utils/helpers'; import { PERMISSIONS } from '$lib/utils/constants'; + import { defaultSupporter, defaultUser } from '$lib/utils/defaults'; /** @type {import('./$types').ActionData} */ export let form; @@ -96,7 +97,7 @@ /** * Opens the edit modal for the selected user. - * @param {App.Locals['user'] | null} user The user to edit. + * @param {App.Locals['user']} user The user to edit. */ const openEditUserModal = (user) => { selectedUser = user; @@ -213,7 +214,7 @@
- @@ -314,7 +315,7 @@
- @@ -330,21 +331,17 @@
- - - - - - + + - - + + @@ -536,7 +533,7 @@ -{#if showUserModal} +{#if showUserModal && selectedUser !== null}
{$t('user.id')}{user.id}
{$t('name')} {user.first_name} {user.last_name}
{$t('user.email')}{user.email}{$t('company')}{user.company}
{$t('subscription.subscription')}{user.membership?.subscription_model?.name}{$t('user.email')}{user.email}
{$t('status')}