diff --git a/frontend/src/routes/auth/admin/users/+page.svelte b/frontend/src/routes/auth/admin/users/+page.svelte index 016ea0c..ff3ed48 100644 --- a/frontend/src/routes/auth/admin/users/+page.svelte +++ b/frontend/src/routes/auth/admin/users/+page.svelte @@ -2,6 +2,7 @@ import Modal from '$lib/components/Modal.svelte'; import UserEditForm from '$lib/components/UserEditForm.svelte'; import SubscriptionEditForm from '$lib/components/SubscriptionEditForm.svelte'; + import InputField from '$lib/components/InputField.svelte'; import { t } from 'svelte-i18n'; import { page } from '$app/stores'; import { applyAction, enhance } from '$app/forms'; @@ -25,6 +26,59 @@ let selectedSubscription = null; let showSubscriptionModal = false; let showUserModal = false; + let searchTerm = ''; + + $: filteredUsers = searchTerm ? getFilteredUsers() : users; + + function handleMailButtonClick() { + const subject = 'Important Announcement'; + const body = `Hello everyone,\n\nThis is an important message.`; + const bccEmails = filteredUsers + .map((/** @type{App.Locals['user']}*/ user) => user.email) + .join(','); + const encodedSubject = encodeURIComponent(subject); + const encodedBody = encodeURIComponent(body); + const mailtoLink = `mailto:?bcc=${bccEmails}&subject=${encodedSubject}&body=${encodedBody}`; + window.location.href = mailtoLink; // Open the mail client + } + + /** + * returns a set of users depending on the entered search query + * @return {App.Locals['user'][]}*/ + const getFilteredUsers = () => { + if (!searchTerm.trim()) return users; + + const term = searchTerm.trim().toLowerCase(); + + return users.filter((/** @type{App.Locals['user']}*/ user) => { + const basicMatch = [ + user.first_name?.toLowerCase(), + user.last_name?.toLowerCase(), + user.email?.toLowerCase(), + user.address?.toLowerCase(), + user.city?.toLowerCase(), + user.dateofbirth?.toLowerCase(), + user.phone?.toLowerCase(), + user.company?.toLowerCase(), + user.licence?.number?.toLowerCase() + ].some((field) => field?.includes(term)); + + const subscriptionMatch = user.membership?.subscription_model?.name + ?.toLowerCase() + .includes(term); + + const licenceCategoryMatch = user.licence?.categories?.some((cat) => + cat.category.toLowerCase().includes(term) + ); + + const addressMatch = [ + user.address?.toLowerCase(), + user.zip_code?.toLowerCase(), + user.city?.toLowerCase() + ].some((field) => field?.includes(term)); + return basicMatch || subscriptionMatch || licenceCategoryMatch || addressMatch; + }); + }; /** * Opens the edit modal for the selected user. @@ -50,7 +104,7 @@ selectedUser = null; selectedSubscription = null; if (form) { - form.errors = undefined; + form.errors = []; } }; @@ -117,13 +171,32 @@ {#if activeSection === 'users'}