| 
									
										
										
										
											2021-01-02 16:04:16 +01:00
										 |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import {UIElement} from "../UIElement"; | 
					
						
							|  |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import State from "../../State"; | 
					
						
							|  |  |  | import {FixedUiElement} from "../Base/FixedUiElement"; | 
					
						
							|  |  |  | import {OH} from "./OpeningHours"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							| 
									
										
										
										
											2021-01-02 19:09:49 +01:00
										 |  |  | import Constants from "../../Models/Constants"; | 
					
						
							| 
									
										
										
										
											2021-01-03 13:50:18 +01:00
										 |  |  | import opening_hours from "opening_hours"; | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | export default class OpeningHoursVisualization extends UIElement { | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |     private readonly _key: string; | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |     constructor(tags: UIEventSource<any>, key: string) { | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |         super(tags); | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |         this._key = key; | 
					
						
							| 
									
										
										
										
											2020-10-11 18:21:40 +02:00
										 |  |  |         this.ListenTo(UIEventSource.Chronic(60*1000)); // Automatically reload every minute
 | 
					
						
							| 
									
										
										
										
											2020-10-11 22:44:58 +02:00
										 |  |  |         this.ListenTo(UIEventSource.Chronic(500, () => { | 
					
						
							|  |  |  |             return tags.data._country === undefined; | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-11 22:44:58 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |     private static GetRanges(oh: any, from: Date, to: Date): ({ | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |         isOpen: boolean, | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |         isSpecial: boolean, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |         comment: string, | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |         startDate: Date, | 
					
						
							|  |  |  |         endDate: Date | 
					
						
							|  |  |  |     }[])[] { | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |         const values = [[], [], [], [], [], [], []]; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-19 12:08:42 +02:00
										 |  |  |         const start = new Date(from); | 
					
						
							| 
									
										
										
										
											2020-10-11 22:37:55 +02:00
										 |  |  |         // We go one day more into the past, in order to force rendering of holidays in the start of the period
 | 
					
						
							|  |  |  |         start.setDate(from.getDate() - 1); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         const iterator = oh.getIterator(start); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |         let prevValue = undefined; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |         while (iterator.advance(to)) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             if (prevValue) { | 
					
						
							|  |  |  |                 prevValue.endDate = iterator.getDate() as Date | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const endDate = new Date(iterator.getDate()) as Date; | 
					
						
							|  |  |  |             endDate.setHours(0, 0, 0, 0) | 
					
						
							|  |  |  |             endDate.setDate(endDate.getDate() + 1); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |             const value = { | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |                 isSpecial: iterator.getUnknown(), | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |                 isOpen: iterator.getState(), | 
					
						
							|  |  |  |                 comment: iterator.getComment(), | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |                 startDate: iterator.getDate() as Date, | 
					
						
							|  |  |  |                 endDate: endDate // Should be overwritten by the next iteration
 | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             prevValue = value; | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             if (value.comment === undefined && !value.isOpen && !value.isSpecial) { | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |                 // simply closed, nothing special here
 | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-11 22:37:55 +02:00
										 |  |  |              | 
					
						
							|  |  |  |             if(value.startDate < from){ | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             // Get day: sunday is 0, monday is 1. We move everything so that monday == 0
 | 
					
						
							|  |  |  |             values[(value.startDate.getDay() + 6) % 7].push(value); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return values; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |     private static getMonday(d) { | 
					
						
							|  |  |  |         d = new Date(d); | 
					
						
							|  |  |  |         const day = d.getDay(); | 
					
						
							|  |  |  |         const diff = d.getDate() - day + (day == 0 ? -6 : 1); // adjust when day is sunday
 | 
					
						
							|  |  |  |         return new Date(d.setDate(diff)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |     private allChangeMoments(ranges: { | 
					
						
							|  |  |  |         isOpen: boolean, | 
					
						
							|  |  |  |         isSpecial: boolean, | 
					
						
							|  |  |  |         comment: string, | 
					
						
							|  |  |  |         startDate: Date, | 
					
						
							|  |  |  |         endDate: Date | 
					
						
							|  |  |  |     }[][]): [number[], string[]] { | 
					
						
							|  |  |  |         const changeHours: number[] = [] | 
					
						
							|  |  |  |         const changeHourText: string[] = []; | 
					
						
							|  |  |  |         const extrachangeHours: number[] = [] | 
					
						
							|  |  |  |         const extrachangeHourText: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const weekday of ranges) { | 
					
						
							|  |  |  |             for (const range of weekday) { | 
					
						
							|  |  |  |                 if (!range.isOpen && !range.isSpecial) { | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 const startOfDay: Date = new Date(range.startDate); | 
					
						
							|  |  |  |                 startOfDay.setHours(0, 0, 0, 0); | 
					
						
							|  |  |  |                 // @ts-ignore
 | 
					
						
							|  |  |  |                 const changeMoment: number = (range.startDate - startOfDay) / 1000; | 
					
						
							|  |  |  |                 if (changeHours.indexOf(changeMoment) < 0) { | 
					
						
							|  |  |  |                     changeHours.push(changeMoment); | 
					
						
							|  |  |  |                     changeHourText.push(OH.hhmm(range.startDate.getHours(), range.startDate.getMinutes())) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // @ts-ignore
 | 
					
						
							|  |  |  |                 let changeMomentEnd: number = (range.endDate - startOfDay) / 1000; | 
					
						
							|  |  |  |                 if (changeMomentEnd >= 24 * 60 * 60) { | 
					
						
							|  |  |  |                     if (extrachangeHours.indexOf(changeMomentEnd) < 0) { | 
					
						
							|  |  |  |                         extrachangeHours.push(changeMomentEnd); | 
					
						
							|  |  |  |                         extrachangeHourText.push(OH.hhmm(range.endDate.getHours(), range.endDate.getMinutes())) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } else if (changeHours.indexOf(changeMomentEnd) < 0) { | 
					
						
							|  |  |  |                     changeHours.push(changeMomentEnd); | 
					
						
							|  |  |  |                     changeHourText.push(OH.hhmm(range.endDate.getHours(), range.endDate.getMinutes())) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         changeHourText.sort(); | 
					
						
							|  |  |  |         changeHours.sort(); | 
					
						
							|  |  |  |         extrachangeHourText.sort(); | 
					
						
							|  |  |  |         extrachangeHours.sort(); | 
					
						
							|  |  |  |         changeHourText.push(...extrachangeHourText); | 
					
						
							|  |  |  |         changeHours.push(...extrachangeHours); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return [changeHours, changeHourText] | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |     private static readonly weekdays = [ | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.monday, | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.tuesday, | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.wednesday, | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.thursday, | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.friday, | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.saturday, | 
					
						
							|  |  |  |         Translations.t.general.weekdays.abbreviations.sunday, | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     InnerRender(): string { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |         const today = new Date(); | 
					
						
							|  |  |  |         today.setHours(0, 0, 0, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const lastMonday = OpeningHoursVisualization.getMonday(today); | 
					
						
							|  |  |  |         const nextSunday = new Date(lastMonday); | 
					
						
							|  |  |  |         nextSunday.setDate(nextSunday.getDate() + 7); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const tags = this._source.data; | 
					
						
							| 
									
										
										
										
											2020-10-21 20:54:15 +02:00
										 |  |  |         if (tags._country === undefined) { | 
					
						
							| 
									
										
										
										
											2020-12-05 03:22:17 +01:00
										 |  |  |             return "Loading country information..."; | 
					
						
							| 
									
										
										
										
											2020-10-11 22:44:58 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-21 20:54:15 +02:00
										 |  |  |         let oh = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             oh = new opening_hours(tags[this._key], { | 
					
						
							|  |  |  |                 lat: tags._lat, | 
					
						
							|  |  |  |                 lon: tags._lon, | 
					
						
							|  |  |  |                 address: { | 
					
						
							|  |  |  |                     country_code: tags._country | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, {tag_key: this._key}); | 
					
						
							|  |  |  |         } catch (e) { | 
					
						
							|  |  |  |             console.log(e); | 
					
						
							| 
									
										
										
										
											2020-12-08 23:44:34 +01:00
										 |  |  |             const msg = new Combine([Translations.t.general.opening_hours.error_loading, | 
					
						
							| 
									
										
										
										
											2021-01-02 19:09:49 +01:00
										 |  |  |             State.state?.osmConnection?.userDetails?.data?.csCount >= Constants.userJourney.tagsVisibleAndWikiLinked ? | 
					
						
							| 
									
										
										
										
											2020-12-08 23:44:34 +01:00
										 |  |  |                  `<span class='subtle'>${e}</span>` | 
					
						
							|  |  |  |                 : "" | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |             return msg.Render(); | 
					
						
							| 
									
										
										
										
											2020-10-21 20:54:15 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!oh.getState() && !oh.getUnknown()) { | 
					
						
							|  |  |  |             // POI is currently closed
 | 
					
						
							|  |  |  |             const nextChange: Date = oh.getNextChange(); | 
					
						
							|  |  |  |             if ( | 
					
						
							|  |  |  |                 // Shop isn't gonna open anymore in this timerange
 | 
					
						
							|  |  |  |                 nextSunday < nextChange | 
					
						
							|  |  |  |                 // And we are already in the weekend to show next week
 | 
					
						
							|  |  |  |                 && (today.getDay() == 0 || today.getDay() == 6) | 
					
						
							|  |  |  |             ) { | 
					
						
							|  |  |  |                 // We mover further along
 | 
					
						
							|  |  |  |                 lastMonday.setDate(lastMonday.getDate() + 7); | 
					
						
							|  |  |  |                 nextSunday.setDate(nextSunday.getDate() + 7); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // ranges[0] are all ranges for monday
 | 
					
						
							|  |  |  |         const ranges = OpeningHoursVisualization.GetRanges(oh, lastMonday, nextSunday); | 
					
						
							|  |  |  |         if (ranges.map(r => r.length).reduce((a, b) => a + b, 0) == 0) { | 
					
						
							|  |  |  |             // Closed!
 | 
					
						
							|  |  |  |             const opensAtDate = oh.getNextChange(); | 
					
						
							|  |  |  |             if(opensAtDate === undefined){ | 
					
						
							| 
									
										
										
										
											2021-01-06 01:11:07 +01:00
										 |  |  |                 const comm = oh.getComment() ?? oh.getUnknown(); | 
					
						
							| 
									
										
										
										
											2021-01-07 04:50:12 +01:00
										 |  |  |                 if(!!comm){ | 
					
						
							| 
									
										
										
										
											2021-01-05 03:33:41 +01:00
										 |  |  |                     return new FixedUiElement(comm).SetClass("ohviz-closed").Render(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |                 if(oh.getState()){ | 
					
						
							|  |  |  |                     return Translations.t.general.opening_hours.open_24_7.SetClass("ohviz-closed").Render() | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |                 return Translations.t.general.opening_hours.closed_permanently.SetClass("ohviz-closed").Render() | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const moment = `${opensAtDate.getDay()}/${opensAtDate.getMonth() + 1} ${OH.hhmm(opensAtDate.getHours(), opensAtDate.getMinutes())}` | 
					
						
							|  |  |  |             return Translations.t.general.opening_hours.closed_until.Subs({date: moment}).SetClass("ohviz-closed").Render() | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const isWeekstable = oh.isWeekStable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let [changeHours, changeHourText] = this.allChangeMoments(ranges); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // By default, we always show the range between 8 - 19h, in order to give a stable impression
 | 
					
						
							|  |  |  |         // Ofc, a bigger range is used if needed
 | 
					
						
							|  |  |  |         const earliestOpen = Math.min(8 * 60 * 60, ...changeHours); | 
					
						
							|  |  |  |         let latestclose = Math.max(...changeHours); | 
					
						
							|  |  |  |         // We always make sure there is 30m of leeway in order to give enough room for the closing entry
 | 
					
						
							|  |  |  |         latestclose = Math.max(19 * 60 * 60, latestclose + 30 * 60) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const rows: UIElement[] = []; | 
					
						
							|  |  |  |         const availableArea = latestclose - earliestOpen; | 
					
						
							|  |  |  |         // @ts-ignore
 | 
					
						
							|  |  |  |         const now = (100 * (((new Date() - today) / 1000) - earliestOpen)) / availableArea; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let header = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (now >= 0 && now <= 100) { | 
					
						
							|  |  |  |             header += new FixedUiElement("").SetStyle(`left:${now}%;`).SetClass("ohviz-now").Render() | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         for (const changeMoment of changeHours) { | 
					
						
							|  |  |  |             const offset = 100 * (changeMoment - earliestOpen) / availableArea; | 
					
						
							|  |  |  |             if (offset < 0 || offset > 100) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const el = new FixedUiElement("").SetStyle(`left:${offset}%;`).SetClass("ohviz-line").Render(); | 
					
						
							|  |  |  |             header += el; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (let i = 0; i < changeHours.length; i++) { | 
					
						
							|  |  |  |             let changeMoment = changeHours[i]; | 
					
						
							|  |  |  |             const offset = 100 * (changeMoment - earliestOpen) / availableArea; | 
					
						
							|  |  |  |             if (offset < 0 || offset > 100) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const el = new FixedUiElement( | 
					
						
							|  |  |  |                 `<div style='margin-top: ${i % 2 == 0 ? '1.5em;' : "1%"}'>${changeHourText[i]}</div>` | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |                 .SetStyle(`left:${offset}%`) | 
					
						
							|  |  |  |                 .SetClass("ohviz-time-indication").Render(); | 
					
						
							|  |  |  |             header += el; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rows.push(new Combine([`<td width="5%"> </td>`, | 
					
						
							|  |  |  |             `<td style="position:relative;height:2.5em;">${header}</td>`])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (let i = 0; i < 7; i++) { | 
					
						
							|  |  |  |             const dayRanges = ranges[i]; | 
					
						
							|  |  |  |             const isToday = (new Date().getDay() + 6) % 7 === i; | 
					
						
							|  |  |  |             let weekday = OpeningHoursVisualization.weekdays[i].Render(); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-22 02:34:31 +01:00
										 |  |  |             let dateToShow = "" | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             if (!isWeekstable) { | 
					
						
							|  |  |  |                 const day = new Date(lastMonday) | 
					
						
							|  |  |  |                 day.setDate(day.getDate() + i); | 
					
						
							| 
									
										
										
										
											2021-03-22 02:34:31 +01:00
										 |  |  |                 dateToShow = "" + day.getDate() + "/" + (day.getMonth() + 1); | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             let innerContent: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-11 22:37:55 +02:00
										 |  |  |             // Add the lines
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             for (const changeMoment of changeHours) { | 
					
						
							|  |  |  |                 const offset = 100 * (changeMoment - earliestOpen) / availableArea; | 
					
						
							|  |  |  |                 innerContent.push(new FixedUiElement("").SetStyle(`left:${offset}%;`).SetClass("ohviz-line").Render()) | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-11 22:37:55 +02:00
										 |  |  |             // Add the actual ranges
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             for (const range of dayRanges) { | 
					
						
							|  |  |  |                 if (!range.isOpen && !range.isSpecial) { | 
					
						
							|  |  |  |                     innerContent.push( | 
					
						
							| 
									
										
										
										
											2021-03-22 02:34:31 +01:00
										 |  |  |                         new FixedUiElement(range.comment ?? dateToShow).SetClass("ohviz-day-off").Render()) | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |                 const startOfDay: Date = new Date(range.startDate); | 
					
						
							|  |  |  |                 startOfDay.setHours(0, 0, 0, 0); | 
					
						
							|  |  |  |                 // @ts-ignore
 | 
					
						
							|  |  |  |                 const startpoint = (range.startDate - startOfDay) / 1000 - earliestOpen; | 
					
						
							|  |  |  |                 // @ts-ignore
 | 
					
						
							|  |  |  |                 const width = (100 * (range.endDate - range.startDate) / 1000) / (latestclose - earliestOpen); | 
					
						
							|  |  |  |                 const startPercentage = (100 * startpoint / availableArea); | 
					
						
							|  |  |  |                 innerContent.push( | 
					
						
							| 
									
										
										
										
											2021-03-22 02:34:31 +01:00
										 |  |  |                     new FixedUiElement(range.comment ?? dateToShow).SetStyle(`left:${startPercentage}%; width:${width}%`).SetClass("ohviz-range").Render()) | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-11 22:37:55 +02:00
										 |  |  |             // Add line for 'now'
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             if (now >= 0 && now <= 100) { | 
					
						
							|  |  |  |                 innerContent.push(new FixedUiElement("").SetStyle(`left:${now}%;`).SetClass("ohviz-now").Render()) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             let clss = "" | 
					
						
							|  |  |  |             if (isToday) { | 
					
						
							|  |  |  |                 clss = "ohviz-today" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             rows.push(new Combine( | 
					
						
							|  |  |  |                 [`<td class="ohviz-weekday ${clss}">${weekday}</td>`, | 
					
						
							|  |  |  |                     `<td style="position:relative;" class="${clss}">${innerContent.join("")}</td>`])) | 
					
						
							| 
									
										
										
										
											2020-10-08 19:03:00 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return new Combine([ | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |             "<table class='ohviz' style='width:100%; word-break: normal; word-wrap: normal'>", | 
					
						
							| 
									
										
										
										
											2020-10-09 20:10:21 +02:00
										 |  |  |             rows.map(el => "<tr>" + el.Render() + "</tr>").join(""), | 
					
						
							|  |  |  |             "</table>" | 
					
						
							|  |  |  |         ]).SetClass("ohviz-container").Render(); | 
					
						
							| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |