Skip to content

Commit 798d33f

Browse files
Add delete confirmation dialog #10553
1 parent ec04d09 commit 798d33f

File tree

1 file changed

+48
-6
lines changed

1 file changed

+48
-6
lines changed

arches/app/src/components/ControlledListManager/ListTreeControls.vue

+48-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import { displayedRowKey, selectedLanguageKey } from "@/components/ControlledLis
88
import { bestLabel, findItemInTree } from "@/components/ControlledListManager/utils.ts";
99
1010
import Button from "primevue/button";
11+
import ConfirmDialog from "primevue/confirmdialog";
1112
import Dropdown from "primevue/dropdown";
13+
import { useConfirm } from "primevue/useconfirm";
1214
import { useToast } from "primevue/usetoast";
1315
1416
import type { TreeExpandedKeys, TreeSelectionKeys, TreeNode } from "primevue/tree/Tree";
@@ -28,13 +30,14 @@ const controlledListItemsTree = defineModel();
2830
const expandedKeys: Ref<typeof TreeExpandedKeys> = defineModel("expandedKeys");
2931
const selectedKeys: Ref<typeof TreeSelectionKeys> = defineModel("selectedKeys");
3032
31-
const { $gettext } = useGettext();
33+
const { $gettext, $ngettext } = useGettext();
3234
const ADD_NEW_LIST = $gettext("Add New List");
3335
const ADD_CHILD_ITEM = $gettext("Add Child Item");
3436
const lightGray = "#f4f4f4"; // todo: import from theme somewhere
3537
const buttonGreen = "#10b981";
3638
const buttonPink = "#ed7979";
3739
40+
const confirm = useConfirm();
3841
const toast = useToast();
3942
4043
const expandAll = () => {
@@ -255,7 +258,7 @@ const deleteSelected = async () => {
255258
if (!selectedKeys.value) {
256259
return;
257260
}
258-
const deletes = Object.entries(selectedKeys.value).map(([id, ]) => id);
261+
const deletes = Object.keys(selectedKeys.value);
259262
if (deletes.length !== 1) {
260263
throw new Error('Mass deletion not yet implemented.');
261264
}
@@ -270,8 +273,26 @@ const deleteSelected = async () => {
270273
}
271274
};
272275
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+
});
275296
};
276297
277298
await fetchLists();
@@ -288,14 +309,14 @@ await fetchLists();
288309
:pt="{ root: { style: { background: buttonGreen } } }"
289310
@click="onCreate"
290311
/>
291-
<!-- We might want an are you sure? modal -->
312+
<ConfirmDialog :draggable="false" />
292313
<Button
293314
class="list-button"
294315
:label="$gettext('Delete')"
295316
raised
296317
:disabled="!Object.keys(selectedKeys).length"
297318
:pt="{ root: { style: { background: buttonPink } } }"
298-
@click="deleteAndRefetch"
319+
@click="confirmDelete"
299320
/>
300321
</div>
301322
<div class="controls">
@@ -357,3 +378,24 @@ await fetchLists();
357378
text-wrap: nowrap;
358379
}
359380
</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

Comments
 (0)