From b9dda667c64e7b8a6ca0ca866bfa7c213ce5047a Mon Sep 17 00:00:00 2001 From: Franck LECUYER Date: Thu, 26 Sep 2024 16:56:52 +0200 Subject: [PATCH] Add confirmation dialog when deleting one or multiple user profile(s) Signed-off-by: Franck LECUYER --- .../delete-confirmation-dialog.tsx} | 44 ++++++++-------- src/pages/profiles/profiles-table.tsx | 50 ++++++++++++------- src/pages/users/UsersPage.tsx | 9 ++-- src/translations/en.json | 10 ++-- src/translations/fr.json | 10 ++-- 5 files changed, 72 insertions(+), 51 deletions(-) rename src/pages/{users/delete-user-dialog.tsx => common/delete-confirmation-dialog.tsx} (54%) diff --git a/src/pages/users/delete-user-dialog.tsx b/src/pages/common/delete-confirmation-dialog.tsx similarity index 54% rename from src/pages/users/delete-user-dialog.tsx rename to src/pages/common/delete-confirmation-dialog.tsx index 30cffdd..bd44d8b 100644 --- a/src/pages/users/delete-user-dialog.tsx +++ b/src/pages/common/delete-confirmation-dialog.tsx @@ -8,17 +8,17 @@ import { FunctionComponent, useCallback } from 'react'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material'; import { FormattedMessage, useIntl } from 'react-intl'; -import { UserInfos } from '../../services'; -export interface DeleteUserDialogProps { +export interface DeleteConfirmationDialogProps { open: boolean; setOpen: (open: boolean) => void; - usersInfos: UserInfos[]; - deleteUsers: () => void; + itemType: string; + itemNames: string[]; + deleteFunc: () => void; } -const DeleteUserDialog: FunctionComponent = (props) => { - const { open, setOpen, deleteUsers, usersInfos } = props; +const DeleteConfirmationDialog: FunctionComponent = (props) => { + const { open, setOpen, itemType, itemNames, deleteFunc } = props; const intl = useIntl(); const handleClose = useCallback(() => { @@ -26,33 +26,37 @@ const DeleteUserDialog: FunctionComponent = (props) => { }, [setOpen]); const buildTitle = useCallback( - (users: UserInfos[]) => { - const hasMultipleItems = users.length > 1; + (itemType: string, itemNames: string[]) => { + const hasMultipleItems = itemNames.length > 1; const descriptor = { - id: hasMultipleItems ? 'users.form.delete.multiple.dialog.title' : 'users.form.delete.dialog.title', + id: hasMultipleItems ? 'form.delete.multiple.dialog.title' : 'form.delete.dialog.title', }; - return intl.formatMessage(descriptor, hasMultipleItems ? { itemsCount: users.length } : undefined); + return intl.formatMessage( + descriptor, + hasMultipleItems ? { itemType: itemType, itemsCount: itemNames.length } : { itemType: itemType } + ); }, [intl] ); const onSubmit = useCallback(() => { - deleteUsers(); + deleteFunc(); setOpen(false); - }, [deleteUsers, setOpen]); + }, [deleteFunc, setOpen]); const buildContent = useCallback( - (users: UserInfos[]) => { - const hasMultipleItems = users.length > 1; + (itemType: string, itemNames: string[]) => { + const hasMultipleItems = itemNames.length > 1; const descriptor = { - id: hasMultipleItems ? 'users.form.delete.multiple.dialog.message' : 'users.form.delete.dialog.message', + id: hasMultipleItems ? 'form.delete.multiple.dialog.message' : 'form.delete.dialog.message', }; if (hasMultipleItems) { return intl.formatMessage(descriptor, { - itemsCount: users.length, + itemType: itemType, + itemsCount: itemNames.length, }); } return intl.formatMessage(descriptor, { - itemName: users.length === 1 && users[0].sub, + itemName: itemNames.length === 1 && itemNames[0], }); }, [intl] @@ -60,9 +64,9 @@ const DeleteUserDialog: FunctionComponent = (props) => { return ( - {buildTitle(usersInfos)} + {buildTitle(itemType, itemNames)} - {buildContent(usersInfos)} + {buildContent(itemType, itemNames)} - user.sub)} + deleteFunc={deleteUsers} /> diff --git a/src/translations/en.json b/src/translations/en.json index 13c2b0f..54e751d 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -44,10 +44,12 @@ "users.form.content": "Please fill in new user data.", "users.form.field.username.label": "User ID", - "users.form.delete.dialog.title": "Delete a user", - "users.form.delete.multiple.dialog.message": "{itemsCount} users will be deleted.", - "users.form.delete.dialog.message": "{itemName} will be deleted.", - "users.form.delete.multiple.dialog.title": "Delete {itemsCount} users", + "form.delete.dialog.user": "user", + "form.delete.dialog.profile": "profile", + "form.delete.dialog.title": "Delete a {itemType}", + "form.delete.multiple.dialog.message": "{itemsCount} {itemType}s will be deleted.", + "form.delete.dialog.message": "{itemName} will be deleted.", + "form.delete.multiple.dialog.title": "Delete {itemsCount} {itemType}s", "profiles.table.toolbar.add": "Add profile", "profiles.table.toolbar.add.label": "Add a profile", diff --git a/src/translations/fr.json b/src/translations/fr.json index 2588c0c..4ac3a48 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -45,10 +45,12 @@ "users.form.content": "Veuillez renseigner les informations de l'utilisateur.", "users.form.field.username.label": "ID utilisateur", - "users.form.delete.dialog.title": "Supprimer utilisateur", - "users.form.delete.dialog.message": "{itemName} va être supprimé.", - "users.form.delete.multiple.dialog.message": "{itemsCount} utilisateurs vont être supprimés.", - "users.form.delete.multiple.dialog.title": "Supprimer {itemsCount} utilisateurs", + "form.delete.dialog.user": "utilisateur", + "form.delete.dialog.profile": "profil", + "form.delete.dialog.title": "Supprimer {itemType}", + "form.delete.dialog.message": "{itemName} va être supprimé.", + "form.delete.multiple.dialog.message": "{itemsCount} {itemType}s vont être supprimés.", + "form.delete.multiple.dialog.title": "Supprimer {itemsCount} {itemType}s", "profiles.table.toolbar.add": "Ajouter profil", "profiles.table.toolbar.add.label": "Ajouter un profil",