diff --git a/src/lib/components/admin/user/UserForm.svelte b/src/lib/components/admin/user/UserForm.svelte
index 31e7c378..8698bc11 100644
--- a/src/lib/components/admin/user/UserForm.svelte
+++ b/src/lib/components/admin/user/UserForm.svelte
@@ -3,77 +3,98 @@
import { getToastStore } from '@skeletonlabs/skeleton';
const toastStore = getToastStore();
- import { type ExtendedUser } from '$lib/models/User';
- import { type Connection } from '$lib/models/Connection';
- import UsersStore from '$lib/stores/Users';
- import ConnectionStore from '$lib/stores/Connections';
- import RoleStore from '$lib/stores/Roles';
- import PrivilegesStore from '$lib/stores/Privileges';
- const { addUser, updateUser } = UsersStore;
- const { getConnection } = ConnectionStore;
- const { getRole } = RoleStore;
- const { getPrivilege } = PrivilegesStore;
+ import type { ExtendedUser, UserRequest } from '$lib/models/User';
+ import type { Connection } from '$lib/models/Connection';
+
+ import { addUser, updateUser, getUserByEmailAndConnection } from '$lib/stores/Users';
+ import { getConnection } from '$lib/stores/Connections';
+ import { getRole } from '$lib/stores/Roles';
+ import { getPrivilege } from '$lib/stores/Privileges';
export let user: ExtendedUser | undefined = undefined;
export let roleList: string[][];
export let connections: Connection[];
- let email = user ? user.email : '';
- let connection = user ? user.connection : '';
- let active = user ? user.active : true;
+ let email: string = user && user.email ? user.email : '';
+ let connection: string = user && user.connection ? user.connection : '';
+ let active: boolean = user ? user.active : true;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
let roles = roleList.map(([_name, uuid]) => ({
uuid,
checked: user ? user.roles.includes(uuid) : false,
}));
+ let validationError: string = '';
async function saveUser() {
+ const selectedRoles = roles.filter((role) => role.checked);
+ if (selectedRoles.length === 0) {
+ validationError = 'At least one role must be selected.';
+ return;
+ } else {
+ validationError = '';
+ }
+
const generalMetadata = JSON.parse(user?.generalMetadata || '{"email":""}');
generalMetadata.email = email;
- let newUser = {
+ let newUser: UserRequest = {
email,
connection: await getConnection(connection),
generalMetadata: JSON.stringify(generalMetadata),
active,
roles: await Promise.all(
- roles
- .filter((role) => role.checked)
- .map((role) =>
- getRole(role.uuid).then((role) => ({
- ...role,
- privileges: role.privileges.map((uuid: string) => getPrivilege(uuid)),
- })),
- ),
+ selectedRoles.map((role) =>
+ getRole(role.uuid).then((role) => ({
+ ...role,
+ privileges: role.privileges.map((uuid: string) => getPrivilege(uuid)),
+ })),
+ ),
),
};
try {
if (user) {
await updateUser({ ...newUser, uuid: user.uuid });
} else {
+ const findUser = await getUserByEmailAndConnection(email, connection);
+ if (findUser) {
+ toastStore.trigger({
+ message: 'Cannot add a user that already exists.',
+ background: 'variant-filled-error',
+ });
+ return;
+ }
+
await addUser(newUser);
}
+
toastStore.trigger({
- message: `Successfully saved ${newUser ? 'new user' : 'user'} '${email}'`,
+ message: `Successfully saved ${user ? '' : 'new '}user '${email}'`,
background: 'variant-filled-success',
});
goto('/admin/users');
} catch (error) {
console.error(error);
toastStore.trigger({
- message: `An error occured while saving ${newUser ? 'new user' : 'user'} '${email}'`,
+ message: `An error occured while saving ${user ? '' : 'new '}user '${email}'`,
background: 'variant-filled-error',
});
}
}
-
+ {#if validationError}
+
+ {/if}
-
+
+
diff --git a/src/lib/components/admin/user/cell/Actions.svelte b/src/lib/components/admin/user/cell/Actions.svelte
index d9568b0f..4621886e 100644
--- a/src/lib/components/admin/user/cell/Actions.svelte
+++ b/src/lib/components/admin/user/cell/Actions.svelte
@@ -5,14 +5,10 @@
import { goto } from '$app/navigation';
- import UsersStore from '$lib/stores/Users';
- import ConnectionStore from '$lib/stores/Connections';
- import RoleStore from '$lib/stores/Roles';
- import PrivilegesStore from '$lib/stores/Privileges';
- const { getUser, updateUser } = UsersStore;
- const { getConnection } = ConnectionStore;
- const { getRole } = RoleStore;
- const { getPrivilege } = PrivilegesStore;
+ import { getUser, updateUser } from '$lib/stores/Users';
+ import { getConnection } from '$lib/stores/Connections';
+ import { getRole } from '$lib/stores/Roles';
+ import { getPrivilege } from '$lib/stores/Privileges';
export let data = { cell: '', row: { status: '', email: '' } };
@@ -43,13 +39,13 @@
try {
await updateUser(newUser);
toastStore.trigger({
- message: `Successfully ${activate ? 'activated' : 'deactivated'} user '${user.email}'`,
+ message: `Successfully ${activate ? 'r' : 'd'}eactivated user '${user.email}'`,
background: 'variant-filled-success',
});
} catch (error) {
console.error(error);
toastStore.trigger({
- message: `An error occured while ${activate ? 'activating' : 'deactivating'} user '${
+ message: `An error occured while ${activate ? 'r' : 'd'}eactivating user '${
user.email
}'`,
background: 'variant-filled-error',
@@ -60,17 +56,6 @@
}
-
-
{#if data.row.status === 'Active'}