forked from MapComplete/MapComplete
Refactoring: port Parts of OHVis to svelte
This commit is contained in:
parent
56020adc2f
commit
3b2c2462c5
4 changed files with 65 additions and 58 deletions
|
@ -2,6 +2,9 @@ import { FixedUiElement } from "./FixedUiElement"
|
||||||
import { Utils } from "../../Utils"
|
import { Utils } from "../../Utils"
|
||||||
import BaseUIElement from "../BaseUIElement"
|
import BaseUIElement from "../BaseUIElement"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
export default class Combine extends BaseUIElement {
|
export default class Combine extends BaseUIElement {
|
||||||
private readonly uiElements: BaseUIElement[]
|
private readonly uiElements: BaseUIElement[]
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,13 @@ import BaseUIElement from "../BaseUIElement"
|
||||||
import Toggle from "../Input/Toggle"
|
import Toggle from "../Input/Toggle"
|
||||||
import { VariableUiElement } from "../Base/VariableUIElement"
|
import { VariableUiElement } from "../Base/VariableUIElement"
|
||||||
import Table from "../Base/Table"
|
import Table from "../Base/Table"
|
||||||
import { Translation, TypedTranslation } from "../i18n/Translation"
|
import { Translation } from "../i18n/Translation"
|
||||||
import Loading from "../Base/Loading"
|
import Loading from "../Base/Loading"
|
||||||
import opening_hours from "opening_hours"
|
import opening_hours from "opening_hours"
|
||||||
import Locale from "../i18n/Locale"
|
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 {
|
export default class OpeningHoursVisualization extends Toggle {
|
||||||
private static readonly weekdays: Translation[] = [
|
private static readonly weekdays: Translation[] = [
|
||||||
|
@ -79,7 +82,7 @@ export default class OpeningHoursVisualization extends Toggle {
|
||||||
return OpeningHoursVisualization.ConstructVizTable(oh, ranges, lastMonday)
|
return OpeningHoursVisualization.ConstructVizTable(oh, ranges, lastMonday)
|
||||||
}
|
}
|
||||||
// The special case that range is completely empty
|
// The special case that range is completely empty
|
||||||
return OpeningHoursVisualization.ShowSpecialCase(oh)
|
return new SvelteUIElement(SpecialCase, { oh })
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ConstructVizTable(
|
private static ConstructVizTable(
|
||||||
|
@ -130,13 +133,13 @@ export default class OpeningHoursVisualization extends Toggle {
|
||||||
day.SetClass("w-full h-full flex")
|
day.SetClass("w-full h-full flex")
|
||||||
|
|
||||||
const rangesForDay = ranges[i].map((range) =>
|
const rangesForDay = ranges[i].map((range) =>
|
||||||
OpeningHoursVisualization.CreateRangeElem(
|
new SvelteUIElement(OpeningHoursRangeElement, {
|
||||||
availableArea,
|
availableArea,
|
||||||
earliestOpen,
|
earliestOpen,
|
||||||
latestclose,
|
latestclose,
|
||||||
range,
|
range,
|
||||||
isWeekstable
|
isWeekstable
|
||||||
)
|
})
|
||||||
)
|
)
|
||||||
const allRanges = new Combine([
|
const allRanges = new Combine([
|
||||||
...OpeningHoursVisualization.CreateLinesAtChangeHours(
|
...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(
|
private static CreateLinesAtChangeHours(
|
||||||
changeHours: number[],
|
changeHours: number[],
|
||||||
availableArea: number,
|
availableArea: number,
|
||||||
|
@ -280,27 +252,4 @@ export default class OpeningHoursVisualization extends Toggle {
|
||||||
const headerHeight = showHigherUsed ? "4rem" : "2rem"
|
const headerHeight = showHigherUsed ? "4rem" : "2rem"
|
||||||
return [headerElem, headerHeight]
|
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<script lang="ts">
|
||||||
|
/**
|
||||||
|
* A single bar in the Opening-Hours visualisations table, eventually with a text
|
||||||
|
*/
|
||||||
|
export let availableArea: number
|
||||||
|
export let earliestOpen: number
|
||||||
|
export let latestclose: number
|
||||||
|
export let range: {
|
||||||
|
isOpen: boolean
|
||||||
|
isSpecial: boolean
|
||||||
|
comment: string
|
||||||
|
startDate: Date
|
||||||
|
endDate: Date
|
||||||
|
}
|
||||||
|
export let isWeekstable: boolean
|
||||||
|
|
||||||
|
let textToShow = range.comment ?? (isWeekstable ? "" : range.startDate.toLocaleDateString())
|
||||||
|
let startOfDay: Date = new Date(range.startDate)
|
||||||
|
startOfDay.setHours(0, 0, 0, 0)
|
||||||
|
let startpoint = (range.startDate.getTime() - startOfDay.getTime()) / 1000 - earliestOpen
|
||||||
|
// prettier-ignore
|
||||||
|
let width = (100 * (range.endDate.getTime() - range.startDate.getTime()) / 1000) / (latestclose - earliestOpen)
|
||||||
|
let startPercentage = (100 * startpoint) / availableArea
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if !range.isOpen && !range.isSpecial}
|
||||||
|
<div class="ohviz-day-off">{textToShow}</div>
|
||||||
|
{:else}
|
||||||
|
<div class="ohviz-range" style={`left:${startPercentage}%; width:${width}%`}>{textToShow}</div>
|
||||||
|
{/if}
|
24
src/UI/OpeningHours/Visualisation/SpecialCase.svelte
Normal file
24
src/UI/OpeningHours/Visualisation/SpecialCase.svelte
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<script lang="ts">
|
||||||
|
/*
|
||||||
|
* Visualizes any special case: e.g. not open for a long time, 24/7 open, ...
|
||||||
|
* */
|
||||||
|
import opening_hours from "opening_hours"
|
||||||
|
import Tr from "../../Base/Tr.svelte"
|
||||||
|
import Translations from "../../i18n/Translations"
|
||||||
|
|
||||||
|
export let oh: opening_hours
|
||||||
|
let nextChange = oh.getNextChange()
|
||||||
|
let nowOpen = oh.getState(new Date())
|
||||||
|
let comment = oh.getComment() ?? oh.getUnknown()
|
||||||
|
const t = Translations.t.general.opening_hours
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if nextChange !== undefined}
|
||||||
|
<Tr t={(nowOpen ? t.open_until : t.closed_until).Subs({ date :nextChange.toLocaleString() })} />
|
||||||
|
{:else if typeof comment === "string"}
|
||||||
|
<div>{comment}</div>
|
||||||
|
{:else if oh.getState()}
|
||||||
|
<Tr t={t.open_24_7} />
|
||||||
|
{:else}
|
||||||
|
<Tr t={t.closed_permanently} />
|
||||||
|
{/if}
|
Loading…
Add table
Add a link
Reference in a new issue