@@ -8,7 +8,9 @@ import { displayedRowKey, selectedLanguageKey } from "@/components/ControlledLis
8
8
import { bestLabel , findItemInTree } from " @/components/ControlledListManager/utils.ts" ;
9
9
10
10
import Button from " primevue/button" ;
11
+ import ConfirmDialog from " primevue/confirmdialog" ;
11
12
import Dropdown from " primevue/dropdown" ;
13
+ import { useConfirm } from " primevue/useconfirm" ;
12
14
import { useToast } from " primevue/usetoast" ;
13
15
14
16
import type { TreeExpandedKeys , TreeSelectionKeys , TreeNode } from " primevue/tree/Tree" ;
@@ -28,13 +30,14 @@ const controlledListItemsTree = defineModel();
28
30
const expandedKeys: Ref <typeof TreeExpandedKeys > = defineModel (" expandedKeys" );
29
31
const selectedKeys: Ref <typeof TreeSelectionKeys > = defineModel (" selectedKeys" );
30
32
31
- const { $gettext } = useGettext ();
33
+ const { $gettext, $ngettext } = useGettext ();
32
34
const ADD_NEW_LIST = $gettext (" Add New List" );
33
35
const ADD_CHILD_ITEM = $gettext (" Add Child Item" );
34
36
const lightGray = " #f4f4f4" ; // todo: import from theme somewhere
35
37
const buttonGreen = " #10b981" ;
36
38
const buttonPink = " #ed7979" ;
37
39
40
+ const confirm = useConfirm ();
38
41
const toast = useToast ();
39
42
40
43
const expandAll = () => {
@@ -255,7 +258,7 @@ const deleteSelected = async () => {
255
258
if (! selectedKeys .value ) {
256
259
return ;
257
260
}
258
- const deletes = Object .entries (selectedKeys .value ). map (([ id , ]) => id );
261
+ const deletes = Object .keys (selectedKeys .value );
259
262
if (deletes .length !== 1 ) {
260
263
throw new Error (' Mass deletion not yet implemented.' );
261
264
}
@@ -270,8 +273,26 @@ const deleteSelected = async () => {
270
273
}
271
274
};
272
275
273
- const deleteAndRefetch = async () => {
274
- await deleteSelected ().then (fetchLists );
276
+ const confirmDelete = () => {
277
+ const numItems = Object .keys (selectedKeys .value ).length ;
278
+ confirm .require ({
279
+ message: $ngettext (
280
+ " Are you sure you want to delete %{ numItems } item (including all children)?" ,
281
+ " Are you sure you want to delete %{ numItems } items (including all children)?" ,
282
+ numItems ,
283
+ { numItems },
284
+ ),
285
+ header: $gettext (" Confirm deletion" ),
286
+ icon: " fa fa-exclamation-triangle" ,
287
+ rejectLabel: $gettext (" Cancel" ),
288
+ rejectClass: " p-button-secondary p-button-outlined" ,
289
+ acceptLabel: $gettext (" Delete" ),
290
+ draggable: false ,
291
+ accept : async () => {
292
+ await deleteSelected ().then (fetchLists );
293
+ },
294
+ reject : () => {},
295
+ });
275
296
};
276
297
277
298
await fetchLists ();
@@ -288,14 +309,14 @@ await fetchLists();
288
309
:pt =" { root: { style: { background: buttonGreen } } }"
289
310
@click =" onCreate"
290
311
/>
291
- <!-- We might want an are you sure? modal -- >
312
+ <ConfirmDialog :draggable = " false " / >
292
313
<Button
293
314
class =" list-button"
294
315
:label =" $gettext('Delete')"
295
316
raised
296
317
:disabled =" !Object.keys(selectedKeys).length"
297
318
:pt =" { root: { style: { background: buttonPink } } }"
298
- @click =" deleteAndRefetch "
319
+ @click =" confirmDelete "
299
320
/>
300
321
</div >
301
322
<div class =" controls" >
@@ -357,3 +378,24 @@ await fetchLists();
357
378
text-wrap : nowrap ;
358
379
}
359
380
</style >
381
+
382
+ <style >
383
+ .p-confirm-dialog {
384
+ font-size : small ;
385
+ }
386
+ .p-dialog-header {
387
+ background : #2d3c4b ;
388
+ color : white ;
389
+ }
390
+ .p-dialog-title {
391
+ font-weight : 800 ;
392
+ }
393
+ .p-dialog-content {
394
+ padding-top : 1.25rem ;
395
+ }
396
+ .p-confirm-dialog-accept {
397
+ background : #ed7979 ;
398
+ color : white ;
399
+ font-weight : 600 ;
400
+ }
401
+ </style >
0 commit comments