diff --git a/frontend/src/lib/components/MaintenanceEventsTable.svelte b/frontend/src/lib/components/MaintenanceEventsTable.svelte index c81a8e10..5e42e93a 100644 --- a/frontend/src/lib/components/MaintenanceEventsTable.svelte +++ b/frontend/src/lib/components/MaintenanceEventsTable.svelte @@ -16,11 +16,14 @@ @@ -192,7 +207,7 @@ - + {/each} @@ -241,6 +256,17 @@ {/if} + + {}} + /> diff --git a/frontend/src/routes/admin/users/+page.svelte b/frontend/src/routes/admin/users/+page.svelte index 9f264e64..59e997df 100644 --- a/frontend/src/routes/admin/users/+page.svelte +++ b/frontend/src/routes/admin/users/+page.svelte @@ -22,7 +22,7 @@ // [SECTION: IMPORTS] import { onMount } from 'svelte'; import { t } from '$lib/i18n/index.svelte.js'; - import { Button } from '$lib/ui'; + import { Button, ConfirmDialog } from '$lib/ui'; import ProtectedRoute from '$lib/components/auth/ProtectedRoute.svelte'; import { adminService } from '../../../services/adminService'; // [/SECTION: IMPORTS] @@ -36,6 +36,8 @@ let showModal = false; let isEditing = false; let currentUserId = null; + let showDeleteUserConfirm = $state(false); + let deleteUserTarget = $state(null); let userForm = { username: '', email: '', @@ -135,20 +137,34 @@ } // #endregion handleSaveUser:Function - // #region handleDeleteUser:Function [TYPE Function] + // #region promptDeleteUser:Function [TYPE Function] // @ingroup Routes /** - * @purpose Deletes a user after confirmation. + * @purpose Opens confirmation dialog before deleting a user. * @pre user object must be valid. - * @post User deleted if confirmed, data reloaded. - * @side_effect Triggers API call to adminService. - * @relation CALLS -> [EXT:method:adminService.deleteUser] + * @post Confirmation dialog shown, deletes on confirm. * @param {Object} user - The user to delete. */ - async function handleDeleteUser(user) { + function promptDeleteUser(user) { + if (deletingUserId) return; + deleteUserTarget = user; + showDeleteUserConfirm = true; + } + // #endregion promptDeleteUser:Function + + // #region onConfirmDeleteUser:Function [TYPE Function] +// @ingroup Routes + /** + * @purpose Deletes a user after dialog confirmation. + * @pre deleteUserTarget is set. + * @post User deleted, data reloaded. + * @side_effect Triggers API call to adminService. + * @relation CALLS -> [EXT:method:adminService.deleteUser] + */ + async function onConfirmDeleteUser() { + const user = deleteUserTarget; + deleteUserTarget = null; if (deletingUserId) return; - if (!confirm($t.admin.users.confirm_delete.replace('{username}', user.username))) return; - console.log('[AdminUsersPage][handleDeleteUser][Entry]'); deletingUserId = user.id; try { @@ -162,7 +178,7 @@ deletingUserId = null; } } - // #endregion handleDeleteUser:Function + // #endregion onConfirmDeleteUser:Function onMount(loadData); @@ -230,7 +246,7 @@ - @@ -350,4 +357,15 @@ {/if} + + {}} +/> \ No newline at end of file diff --git a/frontend/src/routes/tools/storage/+page.svelte b/frontend/src/routes/tools/storage/+page.svelte index 1ef17054..35aeb9fa 100644 --- a/frontend/src/routes/tools/storage/+page.svelte +++ b/frontend/src/routes/tools/storage/+page.svelte @@ -22,6 +22,7 @@ import { listFiles, deleteFile } from '../../../services/storageService'; import { addToast } from '$lib/toasts.svelte.js'; import { t } from '$lib/i18n/index.svelte.js'; + import { ConfirmDialog } from "$lib/ui"; import FileList from '$lib/components/storage/FileList.svelte'; import FileUpload from '$lib/components/storage/FileUpload.svelte'; // [/SECTION: IMPORTS] @@ -36,6 +37,8 @@ let files = $state([]); let isLoading = $state(false); let currentPath = $state(''); + let showDeleteConfirm = $state(false); + let deletePayload = $state(null); // #region resolveStorageQueryFromPath:Function [TYPE Function] // @ingroup Routes @@ -89,8 +92,15 @@ console.warn('[STORAGE-PAGE][DELETE_SKIP] invalid payload', payload); return; } + deletePayload = payload; + showDeleteConfirm = true; + } + + async function onConfirmDelete() { + const payload = deletePayload; + const { category, path, name } = payload || {}; + deletePayload = null; console.log('[STORAGE-PAGE][DELETE_START] category=%s path=%s', category, path); - if (!confirm($t.storage.messages.delete_confirm.replace('{name}', name))) return; try { await deleteFile(category, path); @@ -229,6 +239,17 @@ + + {}} +/>