diff --git a/frontend/src/components/activity/ScheduleEntry.vue b/frontend/src/components/activity/ScheduleEntry.vue
index 655ba7caa2..f0093491cc 100644
--- a/frontend/src/components/activity/ScheduleEntry.vue
+++ b/frontend/src/components/activity/ScheduleEntry.vue
@@ -164,11 +164,15 @@ Displays a single scheduleEntry
@@ -31,7 +30,7 @@
import DialogForm from '@/components/dialog/DialogForm.vue'
import DialogBase from '@/components/dialog/DialogBase.vue'
import DialogActivityForm from './DialogActivityForm.vue'
-import { scheduleEntryRoute } from '@/router.js'
+import { firstActivityScheduleEntryRoute } from '@/router.js'
export default {
name: 'DialogActivityEdit',
@@ -39,6 +38,10 @@ export default {
extends: DialogBase,
props: {
scheduleEntry: { type: Object, required: true },
+ hideHeaderFields: {
+ type: Boolean,
+ default: false,
+ },
},
data() {
return {
@@ -47,12 +50,15 @@ export default {
}
},
computed: {
- scheduleEntries() {
- return this.activity.scheduleEntries()
- },
activity() {
return this.scheduleEntry.activity()
},
+ period() {
+ return this.scheduleEntry.period()
+ },
+ scheduleEntries() {
+ return this.activity.scheduleEntries()
+ },
},
watch: {
showDialog: async function (showDialog) {
@@ -95,24 +101,49 @@ export default {
// update existing
if (entry.self) {
- return this.api.patch(entry.self, {
+ return this.api
+ .patch(entry.self, {
+ period: entry.period()._meta.self,
+ start: entry.start,
+ end: entry.end,
+ })
+ .then((serverEntry) => {
+ entry.start = serverEntry.start
+ entry.end = serverEntry.end
+ entry.period = serverEntry.period
+ })
+ .catch(async (e) => {
+ // entry was deleted in the meantime
+ if (e.response.status === 404) {
+ if (entry.self === this.scheduleEntry._meta.self) {
+ // redirect to first entry to not break UI
+ this.$router.push(await firstActivityScheduleEntryRoute(this.activity))
+ }
+ entry.deleted = true
+ return Promise.resolve()
+ }
+ return Promise.reject(e)
+ })
+ }
+
+ // else: create new entry
+ return this.scheduleEntries
+ .$post({
period: entry.period()._meta.self,
start: entry.start,
end: entry.end,
+ activity: this.activity._meta.self,
+ })
+ .then((data) => {
+ entry.self = data._meta.self
})
- }
-
- // else: create new entry
- return this.scheduleEntries.$post({
- period: entry.period()._meta.self,
- start: entry.start,
- end: entry.end,
- activity: this.activity._meta.self,
- })
})
// patch activity entity
const activityPayload = { ...this.entityData }
+ if (this.hideHeaderFields) {
+ delete activityPayload.location
+ }
delete activityPayload.scheduleEntries
promises.push(this.api.patch(this.entityUri, activityPayload))
@@ -126,9 +157,10 @@ export default {
},
updatedSuccessful(data) {
this.close()
+ this.api.reload(this.activity)
+ this.api.reload(this.scheduleEntry.period().scheduleEntries())
this.$emit('activity-updated', data)
},
- scheduleEntryRoute,
},
}
diff --git a/frontend/src/components/program/DialogActivityForm.vue b/frontend/src/components/activity/dialog/DialogActivityForm.vue
similarity index 87%
rename from frontend/src/components/program/DialogActivityForm.vue
rename to frontend/src/components/activity/dialog/DialogActivityForm.vue
index f1d9c7b5eb..b28db8a9d7 100644
--- a/frontend/src/components/program/DialogActivityForm.vue
+++ b/frontend/src/components/activity/dialog/DialogActivityForm.vue
@@ -36,11 +36,12 @@
-
+
@@ -69,10 +70,18 @@ export default {
type: Object,
required: true,
},
+ currentScheduleEntry: {
+ type: Object,
+ default: null,
+ },
autoselectTitle: {
type: Boolean,
default: false,
},
+ hideLocation: {
+ type: Boolean,
+ default: false,
+ },
},
data() {
return {
diff --git a/frontend/src/components/program/FormScheduleEntryItem.vue b/frontend/src/components/activity/dialog/FormScheduleEntryItem.vue
similarity index 97%
rename from frontend/src/components/program/FormScheduleEntryItem.vue
rename to frontend/src/components/activity/dialog/FormScheduleEntryItem.vue
index 2726ce06a6..fe35687130 100644
--- a/frontend/src/components/program/FormScheduleEntryItem.vue
+++ b/frontend/src/components/activity/dialog/FormScheduleEntryItem.vue
@@ -50,7 +50,7 @@
-
+
@@ -82,9 +82,9 @@ export default {
},
// true if current item is the last scheduleEntry
- isLastItem: {
+ deletable: {
type: Boolean,
- required: true,
+ required: false,
},
},
data() {
diff --git a/frontend/src/components/program/FormScheduleEntryList.vue b/frontend/src/components/activity/dialog/FormScheduleEntryList.vue
similarity index 90%
rename from frontend/src/components/program/FormScheduleEntryList.vue
rename to frontend/src/components/activity/dialog/FormScheduleEntryList.vue
index c0d7c1e716..ac79f70d12 100644
--- a/frontend/src/components/program/FormScheduleEntryList.vue
+++ b/frontend/src/components/activity/dialog/FormScheduleEntryList.vue
@@ -4,7 +4,7 @@