From bd6811f45aeaa037a62ee579f1a299f301fe0c30 Mon Sep 17 00:00:00 2001 From: Manuel Meister Date: Fri, 19 Jan 2024 09:05:51 +0100 Subject: [PATCH 01/18] Add edit schedule entries ability to activity (cherry picked from commit c9cfe1362826cf25487850493e0dfc234f64bf29) --- .../src/components/activity/ScheduleEntry.vue | 16 +++++++++- .../components/program/DialogActivityEdit.vue | 32 ++++++++++++++----- .../components/program/DialogActivityForm.vue | 6 +++- frontend/src/scss/tailwind.scss | 4 +++ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/activity/ScheduleEntry.vue b/frontend/src/components/activity/ScheduleEntry.vue index 655ba7caa2..25cf67fe3c 100644 --- a/frontend/src/components/activity/ScheduleEntry.vue +++ b/frontend/src/components/activity/ScheduleEntry.vue @@ -164,7 +164,7 @@ Displays a single scheduleEntry - + Date: Sat, 20 Jan 2024 11:51:45 +0100 Subject: [PATCH 02/18] Move activity edit dialogs and simplify props (cherry picked from commit e726a7f513817fcf53ddadb86b326fa8f90f0877) --- .../src/components/activity/ScheduleEntry.vue | 6 ++-- .../dialog}/DialogActivityEdit.vue | 33 ++++++------------- .../dialog}/DialogActivityForm.vue | 2 +- .../dialog}/FormScheduleEntryItem.vue | 0 .../dialog}/FormScheduleEntryList.vue | 2 +- .../program/DialogActivityCreate.vue | 8 ++--- .../components/program/ScheduleEntries.vue | 5 ++- .../program/picasso/PicassoEntry.vue | 7 +++- frontend/src/locales/de.json | 8 +++++ frontend/src/locales/en.json | 8 +++++ frontend/src/locales/it.json | 8 +++++ frontend/src/locales/rm.json | 8 +++++ 12 files changed, 59 insertions(+), 36 deletions(-) rename frontend/src/components/{program => activity/dialog}/DialogActivityEdit.vue (79%) rename frontend/src/components/{program => activity/dialog}/DialogActivityForm.vue (95%) rename frontend/src/components/{program => activity/dialog}/FormScheduleEntryItem.vue (100%) rename frontend/src/components/{program => activity/dialog}/FormScheduleEntryList.vue (97%) diff --git a/frontend/src/components/activity/ScheduleEntry.vue b/frontend/src/components/activity/ScheduleEntry.vue index 25cf67fe3c..67bfd2a5a8 100644 --- a/frontend/src/components/activity/ScheduleEntry.vue +++ b/frontend/src/components/activity/ScheduleEntry.vue @@ -203,9 +203,9 @@ Displays a single scheduleEntry diff --git a/frontend/src/views/camp/activity/SideBarProgram.vue b/frontend/src/views/camp/activity/SideBarProgram.vue index e8ca4dbc26..79f11d8948 100644 --- a/frontend/src/views/camp/activity/SideBarProgram.vue +++ b/frontend/src/views/camp/activity/SideBarProgram.vue @@ -37,13 +37,15 @@ import ScheduleEntries from '@/components/program/ScheduleEntries.vue' import { HTML5_FMT } from '@/common/helpers/dateFormat.js' import DaySwitcher from '@/components/activity/DaySwitcher.vue' +import { firstActivityScheduleEntry } from '@/router.js' export default { name: 'SideBarProgram', components: { DaySwitcher, SideBar, Picasso, ScheduleEntries }, props: { - day: { type: Object, required: true }, camp: { type: Object, required: true }, + activityId: { type: String, required: true }, + scheduleEntryId: { type: String, default: null }, }, data() { return { @@ -51,6 +53,13 @@ export default { } }, computed: { + day() { + if (this.scheduleEntryId) { + return this.api.get().scheduleEntries({ id: this.scheduleEntryId }).day() + } else { + return firstActivityScheduleEntry(this.activityId).day() + } + }, period() { return this.daySelection.period() }, From 563361272b4d5dfd02c72c34c87aea2cf7506450 Mon Sep 17 00:00:00 2001 From: Manuel Meister Date: Sat, 8 Feb 2025 19:51:14 +0100 Subject: [PATCH 07/18] Fix timing issue with browser back --- .../src/components/activity/ScheduleEntry.vue | 10 ++++---- frontend/src/router.js | 9 +++++--- .../views/camp/activity/SideBarProgram.vue | 23 +++++++++++++++++-- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/activity/ScheduleEntry.vue b/frontend/src/components/activity/ScheduleEntry.vue index cd84cbf75a..5b71122d96 100644 --- a/frontend/src/components/activity/ScheduleEntry.vue +++ b/frontend/src/components/activity/ScheduleEntry.vue @@ -342,15 +342,15 @@ export default { .get() .scheduleEntries({ id: to.params.scheduleEntryId }) ._meta.load.then(() => next()) - .catch(() => - next({ + .catch(async () => { + return next({ name: 'camp/activity', params: { - ...to.params, - scheduleEntryId: firstActivityScheduleEntry(this.activity).id, + activityId: to.params.activityId, + scheduleEntryId: (await firstActivityScheduleEntry(this.activityId)).id, }, }) - ) + }) } else { return next() } diff --git a/frontend/src/router.js b/frontend/src/router.js index b52f4a4528..0e12ab06ba 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -625,11 +625,13 @@ async function requireActivityScheduleEntry(to, from, next) { }) .catch(async () => { // scheduleEntry is not found, use first activity scheduleEntry - to.params.scheduleEntryId = firstActivityScheduleEntry(activity).id + const scheduleEntry = await firstActivityScheduleEntry(activity) + to.params.scheduleEntryId = scheduleEntry.id next(to) }) + } else { + next() } - next() }) .catch(() => { // activityId does not exist, check if scheduleEntryId exists @@ -987,8 +989,9 @@ async function firstFuturePeriod(route) { export async function firstActivityScheduleEntry(activity) { if (typeof activity === 'string') { - activity = apiStore.get().activities({ id: activity }) + activity = await apiStore.get().activities({ id: activity })._meta.load } + await activity.scheduleEntries()._meta.load return activity .scheduleEntries() .items.reduce( diff --git a/frontend/src/views/camp/activity/SideBarProgram.vue b/frontend/src/views/camp/activity/SideBarProgram.vue index 79f11d8948..a730e4a848 100644 --- a/frontend/src/views/camp/activity/SideBarProgram.vue +++ b/frontend/src/views/camp/activity/SideBarProgram.vue @@ -3,7 +3,7 @@ :title="$tc('views.camp.activity.sideBarProgram.title')" icon="mdi-format-list-numbered" > - + From 8bc9fd2ca1b576279f68b6dfbb1bc2caa60009de Mon Sep 17 00:00:00 2001 From: Manuel Meister Date: Sun, 23 Feb 2025 11:50:01 +0100 Subject: [PATCH 17/18] Prevent error on activity change and scheduleEntry/activity mismatch --- .../src/helpers/scheduleEntryRouteChange.js | 7 ++-- frontend/src/router.js | 33 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/frontend/src/helpers/scheduleEntryRouteChange.js b/frontend/src/helpers/scheduleEntryRouteChange.js index ce34c6e4dd..8c788bd839 100644 --- a/frontend/src/helpers/scheduleEntryRouteChange.js +++ b/frontend/src/helpers/scheduleEntryRouteChange.js @@ -10,7 +10,10 @@ import { apiStore } from '@/plugins/store' * @return {Promise<*>} */ export default async function scheduleEntryRouteChange(activity, to, from, next) { - if (to.params.scheduleEntryId !== from.params.scheduleEntryId) { + if ( + to.params.scheduleEntryId !== from.params.scheduleEntryId || + to.params.activityId !== from.params.activityId + ) { return await apiStore .get() .scheduleEntries({ id: to.params.scheduleEntryId }) @@ -21,7 +24,7 @@ export default async function scheduleEntryRouteChange(activity, to, from, next) name: 'camp/activity', params: { ...to.params, - scheduleEntryId: (await firstActivityScheduleEntry(activity)).id, + scheduleEntryId: (await firstActivityScheduleEntry(to.params.activityId)).id, }, }) }) diff --git a/frontend/src/router.js b/frontend/src/router.js index 0c50397c54..5cb1871a6d 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -613,24 +613,22 @@ async function requireActivityScheduleEntry(to, from, next) { await apiStore .get() .activities({ id: to.params.activityId }) - ._meta.load.then((activity) => { + .$reload() + .then(async (activity) => { // activity exists - if (to.params.scheduleEntryId) { - apiStore - .get() - .scheduleEntries({ id: to.params.scheduleEntryId }) - ._meta.load.then(() => { - // activity and scheduleEntry exist - next() - }) - .catch(async () => { - // scheduleEntry is not found, use first activity scheduleEntry - const scheduleEntry = await firstActivityScheduleEntry(activity) - to.params.scheduleEntryId = scheduleEntry.id - next(to) - }) - } else { + const scheduleEntry = to.params.scheduleEntryId + ? activity + .scheduleEntries() + .items.find((entry) => entry.id === to.params.scheduleEntryId) + : null + + if (scheduleEntry) { + // activity and scheduleEntry exist next() + } else { + // scheduleEntry is not found, use first activity scheduleEntry + to.params.scheduleEntryId = (await firstActivityScheduleEntry(activity)).id + next(to) } }) .catch(() => { @@ -640,8 +638,7 @@ async function requireActivityScheduleEntry(to, from, next) { .get() .scheduleEntries({ id: to.params.scheduleEntryId }) ._meta.load.then(async (scheduleEntry) => { - const activity = await scheduleEntry.activity()._meta.load - to.params.activityId = activity.id + to.params.activityId = scheduleEntry.activity().id next(to) }) .catch(async () => { From 203b7f40f3a78778e21c1dc3b2b2b20d497f9ee1 Mon Sep 17 00:00:00 2001 From: Manuel Meister Date: Sun, 23 Feb 2025 11:55:27 +0100 Subject: [PATCH 18/18] Show edit button iff scheduleEntry loaded --- frontend/src/components/activity/ScheduleEntry.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/activity/ScheduleEntry.vue b/frontend/src/components/activity/ScheduleEntry.vue index 7374601361..f0093491cc 100644 --- a/frontend/src/components/activity/ScheduleEntry.vue +++ b/frontend/src/components/activity/ScheduleEntry.vue @@ -230,7 +230,7 @@ Displays a single scheduleEntry