Skip to content

Commit 500e49e

Browse files
Add confirmation dialog when deleting one or multiple user profile(s) (#51)
Signed-off-by: Franck LECUYER <[email protected]>
1 parent f6164ea commit 500e49e

File tree

5 files changed

+72
-51
lines changed

5 files changed

+72
-51
lines changed

src/pages/users/delete-user-dialog.tsx renamed to src/pages/common/delete-confirmation-dialog.tsx

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,61 +8,65 @@
88
import { FunctionComponent, useCallback } from 'react';
99
import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';
1010
import { FormattedMessage, useIntl } from 'react-intl';
11-
import { UserInfos } from '../../services';
1211

13-
export interface DeleteUserDialogProps {
12+
export interface DeleteConfirmationDialogProps {
1413
open: boolean;
1514
setOpen: (open: boolean) => void;
16-
usersInfos: UserInfos[];
17-
deleteUsers: () => void;
15+
itemType: string;
16+
itemNames: string[];
17+
deleteFunc: () => void;
1818
}
1919

20-
const DeleteUserDialog: FunctionComponent<DeleteUserDialogProps> = (props) => {
21-
const { open, setOpen, deleteUsers, usersInfos } = props;
20+
const DeleteConfirmationDialog: FunctionComponent<DeleteConfirmationDialogProps> = (props) => {
21+
const { open, setOpen, itemType, itemNames, deleteFunc } = props;
2222
const intl = useIntl();
2323

2424
const handleClose = useCallback(() => {
2525
setOpen(false);
2626
}, [setOpen]);
2727

2828
const buildTitle = useCallback(
29-
(users: UserInfos[]) => {
30-
const hasMultipleItems = users.length > 1;
29+
(itemType: string, itemNames: string[]) => {
30+
const hasMultipleItems = itemNames.length > 1;
3131
const descriptor = {
32-
id: hasMultipleItems ? 'users.form.delete.multiple.dialog.title' : 'users.form.delete.dialog.title',
32+
id: hasMultipleItems ? 'form.delete.multiple.dialog.title' : 'form.delete.dialog.title',
3333
};
34-
return intl.formatMessage(descriptor, hasMultipleItems ? { itemsCount: users.length } : undefined);
34+
return intl.formatMessage(
35+
descriptor,
36+
hasMultipleItems ? { itemType: itemType, itemsCount: itemNames.length } : { itemType: itemType }
37+
);
3538
},
3639
[intl]
3740
);
3841
const onSubmit = useCallback(() => {
39-
deleteUsers();
42+
deleteFunc();
4043
setOpen(false);
41-
}, [deleteUsers, setOpen]);
44+
}, [deleteFunc, setOpen]);
4245

4346
const buildContent = useCallback(
44-
(users: UserInfos[]) => {
45-
const hasMultipleItems = users.length > 1;
47+
(itemType: string, itemNames: string[]) => {
48+
const hasMultipleItems = itemNames.length > 1;
4649
const descriptor = {
47-
id: hasMultipleItems ? 'users.form.delete.multiple.dialog.message' : 'users.form.delete.dialog.message',
50+
id: hasMultipleItems ? 'form.delete.multiple.dialog.message' : 'form.delete.dialog.message',
4851
};
4952
if (hasMultipleItems) {
5053
return intl.formatMessage(descriptor, {
51-
itemsCount: users.length,
54+
itemType: itemType,
55+
itemsCount: itemNames.length,
5256
});
5357
}
5458
return intl.formatMessage(descriptor, {
55-
itemName: users.length === 1 && users[0].sub,
59+
itemName: itemNames.length === 1 && itemNames[0],
5660
});
5761
},
5862
[intl]
5963
);
6064

6165
return (
6266
<Dialog open={open} onClose={handleClose}>
63-
<DialogTitle>{buildTitle(usersInfos)}</DialogTitle>
67+
<DialogTitle>{buildTitle(itemType, itemNames)}</DialogTitle>
6468
<DialogContent>
65-
<DialogContentText>{buildContent(usersInfos)}</DialogContentText>
69+
<DialogContentText>{buildContent(itemType, itemNames)}</DialogContentText>
6670
</DialogContent>
6771
<DialogActions>
6872
<Button onClick={handleClose}>
@@ -76,4 +80,4 @@ const DeleteUserDialog: FunctionComponent<DeleteUserDialogProps> = (props) => {
7680
);
7781
};
7882

79-
export default DeleteUserDialog;
83+
export default DeleteConfirmationDialog;

src/pages/profiles/profiles-table.tsx

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
TextFilterParams,
1919
} from 'ag-grid-community';
2020
import { useSnackMessage } from '@gridsuite/commons-ui';
21+
import DeleteConfirmationDialog from '../common/delete-confirmation-dialog';
2122

2223
const defaultColDef: ColDef<UserProfile> = {
2324
editable: false,
@@ -40,6 +41,7 @@ const ProfilesTable: FunctionComponent<ProfilesTableProps> = (props) => {
4041
const { snackError } = useSnackMessage();
4142

4243
const [rowsSelection, setRowsSelection] = useState<UserProfile[]>([]);
44+
const [showDeletionDialog, setShowDeletionDialog] = useState(false);
4345

4446
function getRowId(params: GetRowIdParams<UserProfile>): string {
4547
return params.data.id ? params.data.id : '';
@@ -124,26 +126,36 @@ const ProfilesTable: FunctionComponent<ProfilesTableProps> = (props) => {
124126
);
125127

126128
return (
127-
<GridTable<UserProfile, {}>
128-
ref={props.gridRef}
129-
dataLoader={UserAdminSrv.fetchProfiles}
130-
columnDefs={columns}
131-
defaultColDef={defaultColDef}
132-
gridId="table-profiles"
133-
getRowId={getRowId}
134-
rowSelection="multiple"
135-
onRowDoubleClicked={props.onRowDoubleClicked}
136-
onSelectionChanged={onSelectionChanged}
137-
>
138-
<GridButton
139-
labelId="profiles.table.toolbar.add.label"
140-
textId="profiles.table.toolbar.add"
141-
startIcon={<ManageAccounts fontSize="small" />}
142-
color="primary"
143-
onClick={onAddButton}
129+
<>
130+
<GridTable<UserProfile, {}>
131+
ref={props.gridRef}
132+
dataLoader={UserAdminSrv.fetchProfiles}
133+
columnDefs={columns}
134+
defaultColDef={defaultColDef}
135+
gridId="table-profiles"
136+
getRowId={getRowId}
137+
rowSelection="multiple"
138+
onRowDoubleClicked={props.onRowDoubleClicked}
139+
onSelectionChanged={onSelectionChanged}
140+
>
141+
<GridButton
142+
labelId="profiles.table.toolbar.add.label"
143+
textId="profiles.table.toolbar.add"
144+
startIcon={<ManageAccounts fontSize="small" />}
145+
color="primary"
146+
onClick={onAddButton}
147+
/>
148+
<GridButtonDelete onClick={() => setShowDeletionDialog(true)} disabled={deleteProfilesDisabled} />
149+
</GridTable>
150+
151+
<DeleteConfirmationDialog
152+
open={showDeletionDialog}
153+
setOpen={setShowDeletionDialog}
154+
itemType={intl.formatMessage({ id: 'form.delete.dialog.profile' })}
155+
itemNames={rowsSelection.map((userProfile) => userProfile.name)}
156+
deleteFunc={deleteProfiles}
144157
/>
145-
<GridButtonDelete onClick={deleteProfiles} disabled={deleteProfilesDisabled} />
146-
</GridTable>
158+
</>
147159
);
148160
};
149161
export default ProfilesTable;

src/pages/users/UsersPage.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
TextFilterParams,
3333
} from 'ag-grid-community';
3434
import PaperForm from '../common/paper-form';
35-
import DeleteUserDialog from './delete-user-dialog';
35+
import DeleteConfirmationDialog from '../common/delete-confirmation-dialog';
3636

3737
const defaultColDef: ColDef<UserInfos> = {
3838
editable: false,
@@ -276,11 +276,12 @@ const UsersPage: FunctionComponent = () => {
276276
</DialogActions>
277277
</Dialog>
278278

279-
<DeleteUserDialog
279+
<DeleteConfirmationDialog
280280
open={showDeletionDialog}
281281
setOpen={setShowDeletionDialog}
282-
usersInfos={rowsSelection}
283-
deleteUsers={deleteUsers}
282+
itemType={intl.formatMessage({ id: 'form.delete.dialog.user' })}
283+
itemNames={rowsSelection.map((user) => user.sub)}
284+
deleteFunc={deleteUsers}
284285
/>
285286
</Grid>
286287
</Grid>

src/translations/en.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@
4444
"users.form.content": "Please fill in new user data.",
4545
"users.form.field.username.label": "User ID",
4646

47-
"users.form.delete.dialog.title": "Delete a user",
48-
"users.form.delete.multiple.dialog.message": "{itemsCount} users will be deleted.",
49-
"users.form.delete.dialog.message": "{itemName} will be deleted.",
50-
"users.form.delete.multiple.dialog.title": "Delete {itemsCount} users",
47+
"form.delete.dialog.user": "user",
48+
"form.delete.dialog.profile": "profile",
49+
"form.delete.dialog.title": "Delete a {itemType}",
50+
"form.delete.multiple.dialog.message": "{itemsCount} {itemType}s will be deleted.",
51+
"form.delete.dialog.message": "{itemName} will be deleted.",
52+
"form.delete.multiple.dialog.title": "Delete {itemsCount} {itemType}s",
5153

5254
"profiles.table.toolbar.add": "Add profile",
5355
"profiles.table.toolbar.add.label": "Add a profile",

src/translations/fr.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@
4545
"users.form.content": "Veuillez renseigner les informations de l'utilisateur.",
4646
"users.form.field.username.label": "ID utilisateur",
4747

48-
"users.form.delete.dialog.title": "Supprimer utilisateur",
49-
"users.form.delete.dialog.message": "{itemName} va être supprimé.",
50-
"users.form.delete.multiple.dialog.message": "{itemsCount} utilisateurs vont être supprimés.",
51-
"users.form.delete.multiple.dialog.title": "Supprimer {itemsCount} utilisateurs",
48+
"form.delete.dialog.user": "utilisateur",
49+
"form.delete.dialog.profile": "profil",
50+
"form.delete.dialog.title": "Supprimer {itemType}",
51+
"form.delete.dialog.message": "{itemName} va être supprimé.",
52+
"form.delete.multiple.dialog.message": "{itemsCount} {itemType}s vont être supprimés.",
53+
"form.delete.multiple.dialog.title": "Supprimer {itemsCount} {itemType}s",
5254

5355
"profiles.table.toolbar.add": "Ajouter profil",
5456
"profiles.table.toolbar.add.label": "Ajouter un profil",

0 commit comments

Comments
 (0)