From 3b2c2462c5c544538d4b215e34cdec3314ff61c2 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 2 Jun 2025 17:19:55 +0200 Subject: [PATCH] Refactoring: port Parts of OHVis to svelte --- src/UI/Base/Combine.ts | 3 + .../OpeningHours/OpeningHoursVisualization.ts | 65 ++----------------- .../OpeningHoursRangeElement.svelte | 31 +++++++++ .../Visualisation/SpecialCase.svelte | 24 +++++++ 4 files changed, 65 insertions(+), 58 deletions(-) create mode 100644 src/UI/OpeningHours/Visualisation/OpeningHoursRangeElement.svelte create mode 100644 src/UI/OpeningHours/Visualisation/SpecialCase.svelte diff --git a/src/UI/Base/Combine.ts b/src/UI/Base/Combine.ts index 2ef8b6585..92691efe0 100644 --- a/src/UI/Base/Combine.ts +++ b/src/UI/Base/Combine.ts @@ -2,6 +2,9 @@ import { FixedUiElement } from "./FixedUiElement" import { Utils } from "../../Utils" import BaseUIElement from "../BaseUIElement" +/** + * @deprecated + */ export default class Combine extends BaseUIElement { private readonly uiElements: BaseUIElement[] diff --git a/src/UI/OpeningHours/OpeningHoursVisualization.ts b/src/UI/OpeningHours/OpeningHoursVisualization.ts index 1648d9b6a..c98e86663 100644 --- a/src/UI/OpeningHours/OpeningHoursVisualization.ts +++ b/src/UI/OpeningHours/OpeningHoursVisualization.ts @@ -7,10 +7,13 @@ import BaseUIElement from "../BaseUIElement" import Toggle from "../Input/Toggle" import { VariableUiElement } from "../Base/VariableUIElement" import Table from "../Base/Table" -import { Translation, TypedTranslation } from "../i18n/Translation" +import { Translation } from "../i18n/Translation" import Loading from "../Base/Loading" import opening_hours from "opening_hours" import Locale from "../i18n/Locale" +import SpecialCase from "./Visualisation/SpecialCase.svelte" +import SvelteUIElement from "../Base/SvelteUIElement" +import OpeningHoursRangeElement from "./Visualisation/OpeningHoursRangeElement.svelte" export default class OpeningHoursVisualization extends Toggle { private static readonly weekdays: Translation[] = [ @@ -79,7 +82,7 @@ export default class OpeningHoursVisualization extends Toggle { return OpeningHoursVisualization.ConstructVizTable(oh, ranges, lastMonday) } // The special case that range is completely empty - return OpeningHoursVisualization.ShowSpecialCase(oh) + return new SvelteUIElement(SpecialCase, { oh }) } private static ConstructVizTable( @@ -130,13 +133,13 @@ export default class OpeningHoursVisualization extends Toggle { day.SetClass("w-full h-full flex") const rangesForDay = ranges[i].map((range) => - OpeningHoursVisualization.CreateRangeElem( + new SvelteUIElement(OpeningHoursRangeElement, { availableArea, earliestOpen, latestclose, range, isWeekstable - ) + }) ) const allRanges = new Combine([ ...OpeningHoursVisualization.CreateLinesAtChangeHours( @@ -172,37 +175,6 @@ export default class OpeningHoursVisualization extends Toggle { ) } - private static CreateRangeElem( - availableArea: number, - earliestOpen: number, - latestclose: number, - range: { - isOpen: boolean - isSpecial: boolean - comment: string - startDate: Date - endDate: Date - }, - isWeekstable: boolean - ): BaseUIElement { - const textToShow = - range.comment ?? (isWeekstable ? "" : range.startDate.toLocaleDateString()) - - if (!range.isOpen && !range.isSpecial) { - return new FixedUiElement(textToShow).SetClass("ohviz-day-off") - } - - const startOfDay: Date = new Date(range.startDate) - startOfDay.setHours(0, 0, 0, 0) - const startpoint = (range.startDate.getTime() - startOfDay.getTime()) / 1000 - earliestOpen - // prettier-ignore - const width = (100 * (range.endDate.getTime() - range.startDate.getTime()) / 1000) / (latestclose - earliestOpen) - const startPercentage = (100 * startpoint) / availableArea - return new FixedUiElement(textToShow) - .SetStyle(`left:${startPercentage}%; width:${width}%`) - .SetClass("ohviz-range") - } - private static CreateLinesAtChangeHours( changeHours: number[], availableArea: number, @@ -280,27 +252,4 @@ export default class OpeningHoursVisualization extends Toggle { const headerHeight = showHigherUsed ? "4rem" : "2rem" return [headerElem, headerHeight] } - - /* - * Visualizes any special case: e.g. not open for a long time, 24/7 open, ... - * */ - private static ShowSpecialCase(oh: opening_hours) { - const nextChange = oh.getNextChange() - if (nextChange !== undefined) { - const nowOpen = oh.getState(new Date()) - const t = Translations.t.general.opening_hours - const tr: TypedTranslation<{ date }> = nowOpen ? t.open_until : t.closed_until - const date = nextChange.toLocaleString() - return tr.Subs({ date }) - } - const comment = oh.getComment() ?? oh.getUnknown() - if (typeof comment === "string") { - return new FixedUiElement(comment) - } - - if (oh.getState()) { - return Translations.t.general.opening_hours.open_24_7.Clone() - } - return Translations.t.general.opening_hours.closed_permanently.Clone() - } } diff --git a/src/UI/OpeningHours/Visualisation/OpeningHoursRangeElement.svelte b/src/UI/OpeningHours/Visualisation/OpeningHoursRangeElement.svelte new file mode 100644 index 000000000..cab67ee29 --- /dev/null +++ b/src/UI/OpeningHours/Visualisation/OpeningHoursRangeElement.svelte @@ -0,0 +1,31 @@ + + +{#if !range.isOpen && !range.isSpecial} +
{textToShow}
+{:else} +
{textToShow}
+{/if} diff --git a/src/UI/OpeningHours/Visualisation/SpecialCase.svelte b/src/UI/OpeningHours/Visualisation/SpecialCase.svelte new file mode 100644 index 000000000..ad74b91a2 --- /dev/null +++ b/src/UI/OpeningHours/Visualisation/SpecialCase.svelte @@ -0,0 +1,24 @@ + + +{#if nextChange !== undefined} + +{:else if typeof comment === "string"} +
{comment}
+{:else if oh.getState()} + +{:else} + +{/if}