Skip to content

Commit 1fb9965

Browse files
authored
Ask for confirmation before deleting users (#31)
Signed-off-by: AAJELLAL <[email protected]>
1 parent d56ce77 commit 1fb9965

File tree

4 files changed

+115
-1
lines changed

4 files changed

+115
-1
lines changed

src/pages/users/UsersPage.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import {
4444
TextFilterParams,
4545
} from 'ag-grid-community';
4646
import PaperForm from '../common/paper-form';
47+
import DeleteUserDialog from './delete-user-dialog';
4748

4849
const defaultColDef: ColDef<UserInfos> = {
4950
editable: false,
@@ -187,6 +188,7 @@ const UsersPage: FunctionComponent = () => {
187188
defaultValues: { user: '' }, //need default not undefined value for html input, else react error at runtime
188189
});
189190
const [open, setOpen] = useState(false);
191+
const [showDeletionDialog, setShowDeletionDialog] = useState(false);
190192
const handleClose = () => {
191193
setOpen(false);
192194
reset();
@@ -242,7 +244,7 @@ const UsersPage: FunctionComponent = () => {
242244
onClick={useCallback(() => setOpen(true), [])}
243245
/>
244246
<GridButtonDelete
245-
onClick={deleteUsers}
247+
onClick={() => setShowDeletionDialog(true)}
246248
disabled={deleteUsersDisabled}
247249
/>
248250
</GridTable>
@@ -302,6 +304,13 @@ const UsersPage: FunctionComponent = () => {
302304
</Button>
303305
</DialogActions>
304306
</Dialog>
307+
308+
<DeleteUserDialog
309+
open={showDeletionDialog}
310+
setOpen={setShowDeletionDialog}
311+
usersInfos={rowsSelection}
312+
deleteUsers={deleteUsers}
313+
/>
305314
</Grid>
306315
</Grid>
307316
);
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* Copyright (c) 2024, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
import { FunctionComponent, useCallback } from 'react';
9+
import {
10+
Button,
11+
Dialog,
12+
DialogActions,
13+
DialogContent,
14+
DialogContentText,
15+
DialogTitle,
16+
} from '@mui/material';
17+
import { FormattedMessage, useIntl } from 'react-intl';
18+
import { UserInfos } from '../../services';
19+
20+
export interface DeleteUserDialogProps {
21+
open: boolean;
22+
setOpen: (open: boolean) => void;
23+
usersInfos: UserInfos[];
24+
deleteUsers: () => void;
25+
}
26+
27+
const DeleteUserDialog: FunctionComponent<DeleteUserDialogProps> = (props) => {
28+
const { open, setOpen, deleteUsers, usersInfos } = props;
29+
const intl = useIntl();
30+
31+
const handleClose = useCallback(() => {
32+
setOpen(false);
33+
}, [setOpen]);
34+
35+
const buildTitle = useCallback(
36+
(users: UserInfos[]) => {
37+
const hasMultipleItems = users.length > 1;
38+
const descriptor = {
39+
id: hasMultipleItems
40+
? 'users.form.delete.multiple.dialog.title'
41+
: 'users.form.delete.dialog.title',
42+
};
43+
return intl.formatMessage(
44+
descriptor,
45+
hasMultipleItems ? { itemsCount: users.length } : undefined
46+
);
47+
},
48+
[intl]
49+
);
50+
const onSubmit = useCallback(() => {
51+
deleteUsers();
52+
setOpen(false);
53+
}, [deleteUsers, setOpen]);
54+
55+
const buildContent = useCallback(
56+
(users: UserInfos[]) => {
57+
const hasMultipleItems = users.length > 1;
58+
const descriptor = {
59+
id: hasMultipleItems
60+
? 'users.form.delete.multiple.dialog.message'
61+
: 'users.form.delete.dialog.message',
62+
};
63+
if (hasMultipleItems) {
64+
return intl.formatMessage(descriptor, {
65+
itemsCount: users.length,
66+
});
67+
}
68+
return intl.formatMessage(descriptor, {
69+
itemName: users.length === 1 && users[0].sub,
70+
});
71+
},
72+
[intl]
73+
);
74+
75+
return (
76+
<Dialog open={open} onClose={handleClose}>
77+
<DialogTitle>{buildTitle(usersInfos)}</DialogTitle>
78+
<DialogContent>
79+
<DialogContentText>
80+
{buildContent(usersInfos)}
81+
</DialogContentText>
82+
</DialogContent>
83+
<DialogActions>
84+
<Button onClick={handleClose}>
85+
<FormattedMessage id="cancel" />
86+
</Button>
87+
<Button type="submit" onClick={onSubmit}>
88+
<FormattedMessage id="ok" />
89+
</Button>
90+
</DialogActions>
91+
</Dialog>
92+
);
93+
};
94+
95+
export default DeleteUserDialog;

src/translations/en.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@
4343
"users.form.content": "Please fill in new user data.",
4444
"users.form.field.username.label": "User ID",
4545

46+
"users.form.delete.dialog.title": "Delete a user",
47+
"users.form.delete.multiple.dialog.message": "{itemsCount} users will be deleted.",
48+
"users.form.delete.dialog.message": "{itemName} will be deleted.",
49+
"users.form.delete.multiple.dialog.title": "Delete {itemsCount} users",
50+
4651
"profiles.table.toolbar.add": "Add profile",
4752
"profiles.table.toolbar.add.label": "Add a profile",
4853
"profiles.form.title": "Add a profile",

src/translations/fr.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
"users.form.content": "Veuillez renseigner les informations de l'utilisateur.",
4545
"users.form.field.username.label": "ID utilisateur",
4646

47+
"users.form.delete.dialog.title": "Supprimer utilisateur",
48+
"users.form.delete.dialog.message": "{itemName} va être supprimé.",
49+
"users.form.delete.multiple.dialog.message": "{itemsCount} utilisateurs vont être supprimés.",
50+
"users.form.delete.multiple.dialog.title": "Supprimer {itemsCount} utilisateurs",
51+
4752
"profiles.table.toolbar.add": "Ajouter profil",
4853
"profiles.table.toolbar.add.label": "Ajouter un profil",
4954
"profiles.form.title": "Ajouter un profil",

0 commit comments

Comments
 (0)