diff --git a/frontend/src/views/DiaryView.vue b/frontend/src/views/DiaryView.vue index 377cd1dc..752289af 100644 --- a/frontend/src/views/DiaryView.vue +++ b/frontend/src/views/DiaryView.vue @@ -1049,14 +1049,37 @@ export default { }, filteredTrainingPlan() { const allItems = Array.isArray(this.trainingPlan) ? this.trainingPlan : []; + const toMinutes = (timeValue) => { + if (!timeValue || typeof timeValue !== 'string' || !timeValue.includes(':')) { + return Number.MAX_SAFE_INTEGER; + } + const [h, m] = timeValue.split(':').map((part) => parseInt(part, 10)); + if (!Number.isFinite(h) || !Number.isFinite(m)) { + return Number.MAX_SAFE_INTEGER; + } + return (h * 60) + m; + }; + + const sortByStartTime = (items) => items.slice().sort((a, b) => { + const startA = toMinutes(a?.startTime); + const startB = toMinutes(b?.startTime); + if (startA !== startB) return startA - startB; + + const orderA = Number.isFinite(Number(a?.orderId)) ? Number(a.orderId) : Number.MAX_SAFE_INTEGER; + const orderB = Number.isFinite(Number(b?.orderId)) ? Number(b.orderId) : Number.MAX_SAFE_INTEGER; + if (orderA !== orderB) return orderA - orderB; + + return Number(a?.id || 0) - Number(b?.id || 0); + }); + if (this.planGroupFilter === '__all__') { - return allItems; + return sortByStartTime(allItems); } const selectedGroupId = Number(this.planGroupFilter); if (!Number.isFinite(selectedGroupId)) { - return allItems; + return sortByStartTime(allItems); } - return allItems.filter((item) => { + const filtered = allItems.filter((item) => { if (!item) return false; if (item.isTimeblock) { return this.getVisibleGroupActivities(item).length > 0; @@ -1067,6 +1090,7 @@ export default { } return Number(item.groupId) === selectedGroupId; }); + return sortByStartTime(filtered); }, activePlanEditorType() { if (this.editingActivityId) return 'activity';