Skip to content

Commit d78b8ec

Browse files
authored
Merge pull request #6046 from simfeld/feature/edit-delete-checklists
feat: edit and delete checklists
2 parents 26b0b8b + 54f8ae2 commit d78b8ec

File tree

4 files changed

+110
-6
lines changed

4 files changed

+110
-6
lines changed

frontend/src/components/checklist/ChecklistDetail.vue

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,69 @@
55
class="ec-checklist"
66
toolbar
77
back
8-
:title="checklist.name"
98
>
9+
<template #title>
10+
<v-toolbar-title v-if="!editChecklistName" tag="h1" class="font-weight-bold">
11+
{{ checklist.name }}
12+
</v-toolbar-title>
13+
<v-btn
14+
v-if="!editChecklistName"
15+
icon
16+
class="ml-1 visible-on-hover"
17+
width="24"
18+
height="24"
19+
@click="makeChecklistNameEditable()"
20+
>
21+
<v-icon small>mdi-pencil</v-icon>
22+
</v-btn>
23+
<api-form v-if="editChecklistName" :entity="checklist" class="mx-2 flex-grow-1">
24+
<api-text-field
25+
path="name"
26+
:disabled="layoutMode"
27+
dense
28+
autofocus
29+
:auto-save="false"
30+
@finished="editChecklistName = false"
31+
/>
32+
</api-form>
33+
</template>
1034
<template #title-actions>
1135
<ChecklistItemCreate :checklist="checklist" />
36+
<!-- hamburger menu -->
37+
<v-menu offset-y>
38+
<template #activator="{ on, attrs }">
39+
<v-btn icon v-bind="attrs" v-on="on">
40+
<v-icon>mdi-dots-vertical</v-icon>
41+
</v-btn>
42+
</template>
43+
<v-list>
44+
<!-- remove checklist -->
45+
<DialogEntityDelete
46+
:entity="checklist"
47+
:error-handler="deleteErrorHandler"
48+
:success-handler="deleteSuccessHandler"
49+
>
50+
<template #activator="{ on }">
51+
<v-list-item v-on="on">
52+
<v-list-item-icon>
53+
<v-icon>mdi-delete</v-icon>
54+
</v-list-item-icon>
55+
<v-list-item-title>
56+
{{ $tc('global.button.delete') }}
57+
</v-list-item-title>
58+
</v-list-item>
59+
</template>
60+
{{ $tc('components.checklist.checklistDetail.deleteWarning') }}
61+
</DialogEntityDelete>
62+
</v-list>
63+
</v-menu>
1264
</template>
1365
<v-list>
14-
<SortableChecklist :parent="null" :checklist="checklist" />
66+
<SortableChecklist
67+
v-if="checklist && !checklist._meta.deleting"
68+
:parent="null"
69+
:checklist="checklist"
70+
/>
1571
</v-list>
1672
</content-card>
1773
</template>
@@ -20,28 +76,53 @@
2076
import ContentCard from '@/components/layout/ContentCard.vue'
2177
import ChecklistItemCreate from '@/components/checklist/ChecklistItemCreate.vue'
2278
import SortableChecklist from '@/components/checklist/SortableChecklist.vue'
79+
import ApiForm from '@/components/form/api/ApiForm.vue'
80+
import DialogEntityDelete from '@/components/dialog/DialogEntityDelete.vue'
81+
import { checklistRoute } from '@/router.js'
2382
2483
export default {
2584
name: 'ChecklistDetail',
2685
components: {
2786
SortableChecklist,
2887
ChecklistItemCreate,
2988
ContentCard,
89+
ApiForm,
90+
DialogEntityDelete,
3091
},
3192
props: {
93+
camp: {
94+
type: Object,
95+
default: null,
96+
required: false,
97+
},
3298
checklist: {
3399
type: Object,
34100
default: null,
35101
required: false,
36102
},
37103
},
38104
data() {
39-
return { dragging: false }
105+
return { dragging: false, editChecklistName: false }
40106
},
41107
computed: {
42108
items() {
43109
return this.checklist.checklistItems().items.filter((item) => !item.parent)
44110
},
45111
},
112+
methods: {
113+
makeChecklistNameEditable() {
114+
this.editChecklistName = true
115+
},
116+
deleteErrorHandler(e) {
117+
if (e?.response?.status === 422 /* Validation Error */) {
118+
return this.$tc('components.checklist.checklistDetail.deleteError')
119+
}
120+
return null
121+
},
122+
deleteSuccessHandler() {
123+
// redirect to Checklist overview
124+
this.$router.replace(checklistRoute(this.camp))
125+
},
126+
},
46127
}
47128
</script>

frontend/src/locales/de.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@
206206
"delete": "Möchtest du diesen Eintrag wirklich löschen?",
207207
"title": "Checklisteneintrag bearbeiten"
208208
},
209+
"checklistDetail": {
210+
"deleteWarning": "Möchtest du diese Checkliste wirklich löschen? Der komplette Inhalt dieser Checkliste wird gelöscht.",
211+
"deleteError": "Checkliste konnte nicht gelöscht werden. Überprüfe vor dem Löschen, dass die Checkliste nicht mehr in Aktivitäten verwendet wird."
212+
},
209213
"sortableChecklist": {
210214
"add": "Zu \"{parent}\" hinzufügen"
211215
}

frontend/src/router.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,9 @@ export function materialListFromRoute(route) {
730730
}
731731

732732
export function checklistFromRoute(route) {
733-
return apiStore.get().checklists({ id: route.params.checklistId })
733+
return campFromRoute(route)
734+
.checklists()
735+
.allItems.find((c) => c.id === route.params.checklistId)
734736
}
735737

736738
function getContentLayout(route) {
@@ -864,9 +866,15 @@ export function categoryRoute(camp, category, query = {}) {
864866
}
865867

866868
export function checklistRoute(camp, checklist, query = {}) {
867-
if (camp?._meta.loading || checklist._meta.loading) return {}
869+
if (camp?._meta.loading || checklist?._meta.loading) return {}
868870

869871
if (!camp) {
872+
if (!checklist) {
873+
return {
874+
name: 'admin/checklists',
875+
query,
876+
}
877+
}
870878
return {
871879
name: 'admin/checklists/checklist',
872880
params: {
@@ -877,6 +885,16 @@ export function checklistRoute(camp, checklist, query = {}) {
877885
}
878886
}
879887

888+
if (!checklist) {
889+
return {
890+
name: 'camp/admin/checklists',
891+
params: {
892+
campId: camp.id,
893+
campTitle: slugify(camp.title),
894+
},
895+
query,
896+
}
897+
}
880898
return {
881899
name: 'camp/admin/checklists/checklist',
882900
params: {

frontend/src/views/camp/checklist/Checklist.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<v-container fluid>
3-
<ChecklistDetail :checklist="checklist" />
3+
<ChecklistDetail :camp="camp" :checklist="checklist" />
44
</v-container>
55
</template>
66

@@ -13,6 +13,7 @@ export default {
1313
ChecklistDetail,
1414
},
1515
props: {
16+
camp: { type: Object, required: true },
1617
checklist: {
1718
type: Object,
1819
default: null,

0 commit comments

Comments
 (0)