diff --git a/WebDisplay/components.d.ts b/WebDisplay/components.d.ts index 6ff400d..b4d2b18 100644 --- a/WebDisplay/components.d.ts +++ b/WebDisplay/components.d.ts @@ -8,12 +8,14 @@ export {} declare module 'vue' { export interface GlobalComponents { Almanac: typeof import('./src/components/Almanac.vue')['default'] + CalendarAgenda: typeof import('./src/components/CalendarAgenda.vue')['default'] CurrentLaundryStatus: typeof import('./src/components/CurrentLaundryStatus.vue')['default'] CurrentPower: typeof import('./src/components/CurrentPower.vue')['default'] CurrentWeather: typeof import('./src/components/CurrentWeather.vue')['default'] DashboardItem: typeof import('./src/components/DashboardItem.vue')['default'] Indoor: typeof import('./src/components/Indoor.vue')['default'] IndoorSummary: typeof import('./src/components/IndoorSummary.vue')['default'] + NationalDays: typeof import('./src/components/NationalDays.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] TimeRange: typeof import('./src/components/TimeRange.vue')['default'] diff --git a/WebDisplay/src/components/CalendarAgenda.vue b/WebDisplay/src/components/CalendarAgenda.vue new file mode 100644 index 0000000..e62a9ae --- /dev/null +++ b/WebDisplay/src/components/CalendarAgenda.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/WebDisplay/src/components/NationalDays.vue b/WebDisplay/src/components/NationalDays.vue new file mode 100644 index 0000000..caac44c --- /dev/null +++ b/WebDisplay/src/components/NationalDays.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/WebDisplay/src/pages/kiosk.vue b/WebDisplay/src/pages/kiosk.vue index 1ea3b0b..338336f 100644 --- a/WebDisplay/src/pages/kiosk.vue +++ b/WebDisplay/src/pages/kiosk.vue @@ -4,12 +4,7 @@ import { useLaundryStore } from '@/stores/laundryStore'; import { usePowerStore } from '@/stores/powerStore'; import { useHomeAssistantStore } from '@/stores/homeAssistantStore'; - import { useCalendarStore } from '@/stores/calendarStore'; - import { format, startOfDay, endOfDay, isEqual } from 'date-fns'; - import CalendarDay from '@/models/calendar/calendar-day'; - import NationalDayEntry from '@/models/calendar/national-day'; - - const calendarDayCount = 7; + import CalendarAgenda from '@/components/CalendarAgenda.vue'; const weatherStore = useWeatherStore(); weatherStore.start(); @@ -23,15 +18,7 @@ const homeAssistantStore = useHomeAssistantStore(); homeAssistantStore.start(); - const calendarStore = useCalendarStore(); - const currentTime = ref(new Date()); - const calendarDays = ref([] as CalendarDay[]); - const calendarReady = ref(false); - - const nationalDays = ref([] as NationalDayEntry[]); - const nationalDaysReady = ref(false); - const loadedNationalDay = ref(null as Date | null); const timeFormatter = new Intl.DateTimeFormat('en-US', { hour: 'numeric', minute: '2-digit' }); const dateFormatter = new Intl.DateTimeFormat('en-US', { weekday: 'long', month: 'long', day: 'numeric' }); @@ -49,67 +36,7 @@ } } - function loadCalendar() { - const newCalendarDays = [] as CalendarDay[]; - - calendarStore.getUpcoming(calendarDayCount, true).then((upcoming) => { - const currentDay = startOfDay(currentTime.value); - - for (let i = 0; i < calendarDayCount; i++) { - const day = new Date(currentDay); - day.setDate(day.getDate() + i); - - const entries = upcoming - .filter((entry) => { - const entryStart = startOfDay(entry.start); - const entryEnd = endOfDay(entry.end); - - if (entry.isAllDay) { - return day > entryStart && day < entryEnd; - } - - return day >= entryStart && day <= entryEnd; - }) - .sort((a, b) => { - if (a.isHoliday == b.isHoliday) { - return a.summary.localeCompare(b.summary); - } - - return (b.isHoliday ? 1 : 0) - (a.isHoliday ? 1 : 0); - }); - - newCalendarDays.push(new CalendarDay(day, entries)); - } - - calendarDays.value = newCalendarDays; - - calendarReady.value = true; - }); - } - - loadCalendar(); - - function loadNationalDays() { - calendarStore.getNationalDays().then((data) => { - nationalDays.value = data.sort((a, b) => a.name.localeCompare(b.name)); - - loadedNationalDay.value = startOfDay(currentTime.value); - - nationalDaysReady.value = true; - }); - } - - loadNationalDays(); - - setInterval(() => { - currentTime.value = new Date(); - - if (loadedNationalDay.value && !isEqual(loadedNationalDay.value, startOfDay(currentTime.value))) { - loadNationalDays(); - } - }, 1000); - - setInterval(() => loadCalendar(), 30 * 60 * 1000); + setInterval(() => (currentTime.value = new Date()), 1000); @@ -356,66 +248,14 @@ .kiosk-calendar { grid-area: kiosk-calendar; - background-color: #121212; - border-radius: 10px; - display: flex; - flex: 1; - flex-direction: column; + overflow: auto; } .kiosk-national-days { grid-area: kiosk-national-days; - background-color: #121212; - border-radius: 10px; - padding: 10px; overflow: auto; } - .kiosk-calendar-header { - font-size: 1.15em; - padding-top: 10px; - padding-bottom: 2px; - text-align: center; - } - - .kiosk-calendar-day-item-header { - display: flex; - align-items: center; - } - - .kiosk-calendar-day-item-number { - font-size: 1.25em; - padding-right: 0.5em; - } - - .kiosk-calendar-day-item-name { - font-size: 1em; - } - - .kiosk-calendar-day-list { - margin-left: 10px; - overflow: auto; - flex: 1; - } - - .kiosk-calendar-day-item:not(:last-child) { - padding-bottom: 2px; - } - - .kiosk-calendar-day-item:first-of-type { - color: #c75ec7; - } - - .kiosk-calendar-day-item:not(:first-child) { - padding-top: 4px; - } - - .kiosk-calendar-entry { - color: #ebebeb; - padding-left: 2em; - padding-bottom: 2px; - } - .warning { color: #d09f27; } @@ -423,8 +263,4 @@ .normal { color: #208b20; } - - .holiday { - color: #5e83c7; - }