import { DatetoLocaleDynamicString, getMinutesDifference, getRelativeTime, } from "../modules/relative_time.js"; export class UIManager { ui; mainmanager; uiElements = {}; floorsEmpty = true; constructor(ui) { this.ui = ui; } mainmanagerInit() { this.__initUIElements(); this.__initZoom(); this.__initEvents(); this.__initInspector(); } // State setLoading(state) { if (state) { this.ui.classList.add("loading"); } else { this.ui.classList.remove("loading"); } } setZoomDisabled(state = 0) { if (state > 0) { this.uiElements.zoomIn.disabled = true; this.uiElements.zoomOut.disabled = false; } else if (state < 0) { this.uiElements.zoomIn.disabled = false; this.uiElements.zoomOut.disabled = true; } else { this.uiElements.zoomIn.disabled = false; this.uiElements.zoomOut.disabled = false; } } setEventsMinimized(state) { if (state) { this.uiElements.eventsContainer.classList.add("minimized"); } else { this.uiElements.eventsContainer.classList.remove("minimized"); } } setEventsInspector(state) { this.setEventsMinimized(false); if (state) { this.uiElements.eventsContainer.classList.add("inspector"); } else { this.uiElements.eventsContainer.classList.remove("inspector"); } } getEventsEmpty() { return this.uiElements.events.classList.contains("empty"); } // Init __initUIElements() { // Zoom this.uiElements.zoomButtons = this.ui.querySelector("#zoom"); this.uiElements.zoomIn = this.uiElements.zoomButtons.querySelector("#zoom-in"); this.uiElements.zoomOut = this.uiElements.zoomButtons.querySelector("#zoom-out"); // Floors this.uiElements.floors = this.ui.querySelector("#floors"); this.uiElements.floorsHeading = this.ui.querySelector( "#floors .widget-heading" ); this.uiElements.floorButtons = this.uiElements.floors.querySelector("#floor-buttons"); // Events this.uiElements.eventsContainer = this.ui.querySelector("#events-container"); this.uiElements.events = this.uiElements.eventsContainer.querySelector("#events"); this.uiElements.eventsBackButton = this.uiElements.events.querySelector( "#events-header #back" ); this.uiElements.eventsRoomName = this.uiElements.events.querySelector( "#events-header #room-name" ); this.uiElements.eventsRoomDescription = this.uiElements.events.querySelector("#events-header #room-description"); this.uiElements.eventList = this.uiElements.events.querySelector("#event-list"); this.uiElements.eventsMinimized = this.uiElements.eventsContainer.querySelector("#events-minimized"); this.uiElements.eventsMinimizedBackButton = this.uiElements.eventsMinimized.querySelector("#back"); this.uiElements.eventsInspector = this.uiElements.eventsContainer.querySelector("#events-inspector"); this.uiElements.eventsInspectorHeader = this.uiElements.eventsInspector.querySelector("#events-header"); this.uiElements.eventsInspectorRoomName = this.uiElements.eventsInspectorHeader.querySelector("#room-name"); this.uiElements.eventsInspectorEventLength = this.uiElements.eventsInspectorHeader.querySelector("#event-length"); this.uiElements.eventsInspectorRoomTime = this.uiElements.eventsInspector.querySelector("#room-time"); this.uiElements.eventsInspectorMinimized = this.uiElements.eventsContainer.querySelector( "#events-inspector-minimized" ); this.uiElements.eventsInspectorBackButton = this.uiElements.eventsInspector.querySelector("#back"); this.uiElements.eventsInspectorBody = this.uiElements.eventsInspector.querySelector("#event-body"); this.uiElements.eventsInspectorMinimizedBackButton = this.uiElements.eventsInspectorMinimized.querySelector("#back"); this.uiElements.minimizeButton = this.uiElements.events.querySelector( "#footer #footer-buttons #minimize" ); this.uiElements.maximizeButton = this.uiElements.eventsMinimized.querySelector("#maximize"); this.uiElements.eventsInspectorMinimizeButton = this.uiElements.eventsInspector.querySelector( "#footer #footer-buttons #minimize" ); this.uiElements.eventsInspectorMaximizeButton = this.uiElements.eventsInspectorMinimized.querySelector("#maximize"); // Loading this.uiElements.loading = this.ui.querySelector("#loading"); } __initZoom() { this.uiElements.zoomIn.addEventListener("click", () => this.mainmanager.callManagerFunction("map", "zoomIn") ); this.uiElements.zoomOut.addEventListener("click", () => this.mainmanager.callManagerFunction("map", "zoomOut") ); this.mainmanager.addManagerEventListener("map", "zoomMin", () => { this.setZoomDisabled(-1); }); this.mainmanager.addManagerEventListener("map", "zoomMax", () => { this.setZoomDisabled(1); }); this.mainmanager.addManagerEventListener("map", "zoom", () => { this.setZoomDisabled(0); }); } __initInspector() { this.uiElements.eventsInspectorMinimizeButton.addEventListener( "click", () => this.setEventsMinimized(true) ); this.uiElements.eventsInspectorMaximizeButton.addEventListener( "click", () => this.setEventsMinimized(false) ); this.uiElements.eventsInspectorBackButton.addEventListener("click", () => { window.location.hash = this.mainmanager.getCurrentFocus("room"); }); this.uiElements.eventsInspectorMinimizedBackButton.addEventListener( "click", () => { window.location.hash = this.mainmanager.getCurrentFocus("room"); } ); } updateInspector() { const currentLocalization = this.mainmanager.getCurrentLocalization(); const currentEvent = this.mainmanager.getCurrentFocusObject("event"); const eventRoom = this.mainmanager.getCurrentFocusObject("room"); this.uiElements.eventsInspectorBackButton.title = currentLocalization.event_inspector_back; this.uiElements.eventsInspectorMinimizedBackButton.title = currentLocalization.event_inspector_back; this.uiElements.eventsInspectorMinimizeButton.title = currentLocalization.event_inspector_minimize; this.uiElements.eventsInspectorMaximizeButton.title = currentLocalization.event_inspector_maximize; const currentDate = new Date(); const eventDateStart = new Date(currentEvent.when.start); const eventDateEnd = new Date(currentEvent.when.end); const eventStarted = currentDate > eventDateStart; const eventEnded = currentDate > eventDateEnd; let datePrefix; if (eventEnded) { return; // Don't display this event } else if (eventStarted) { datePrefix = currentLocalization.date_started; } else { datePrefix = currentLocalization.date_starting; } this.uiElements.eventsInspectorRoomName.textContent = currentLocalization.event_inspector_header(currentEvent.name); this.uiElements.eventsInspectorRoomTime.textContent = currentLocalization.date_summary( datePrefix, getRelativeTime( eventDateStart, currentDate, this.mainmanager.getCurrentLangCode() ) ) + " " + currentLocalization.parenthesis( DatetoLocaleDynamicString( eventDateStart, currentDate, this.mainmanager.getCurrentLangCode() ) ); this.uiElements.eventsInspectorEventLength.textContent = currentLocalization.separator( currentLocalization.minutes_long( getMinutesDifference(eventDateStart, eventDateEnd) ), "" ); const eventWhere = document.createElement("a"); eventWhere.href = "#" + eventRoom.id; eventWhere.textContent = eventRoom.name; this.uiElements.eventsInspectorEventLength.appendChild(eventWhere); // Remove all children this.uiElements.eventsInspectorBody.replaceChildren(); if (currentEvent.url) { const eventLink = document.createElement("p"); eventLink.classList.add("widget-description"); const eventAnchor = document.createElement("a"); const eventURL = new URL(currentEvent.url); eventAnchor.href = eventURL; eventAnchor.target = "_blank"; eventAnchor.textContent = eventURL.toString(); eventLink.appendChild(eventAnchor); this.uiElements.eventsInspectorBody.appendChild(eventLink); } this.uiElements.eventsInspectorBody.appendChild( document.createElement("hr") ); const eventDescription = document.createElement("p"); eventDescription.classList.add("widget-description"); eventDescription.textContent = currentEvent.description; this.uiElements.eventsInspectorBody.appendChild(eventDescription); } __initEvents() { this.uiElements.eventsBackButton.addEventListener("click", () => { window.location.hash = this.mainmanager.getCurrentFocus("floor"); }); this.uiElements.eventsMinimizedBackButton.addEventListener("click", () => { window.location.hash = this.mainmanager.getCurrentFocus("floor"); }); this.uiElements.minimizeButton.addEventListener("click", () => { this.uiElements.eventsContainer.classList.add("minimized"); }); this.uiElements.maximizeButton.addEventListener("click", () => { this.uiElements.eventsContainer.classList.remove("minimized"); }); } __updateEventsSoft() { const focusedFloor = this.mainmanager.getCurrentFocusObject("floor"); if (focusedFloor == null) { this.uiElements.eventsContainer.classList.add("empty"); } else { this.uiElements.eventsContainer.classList.remove("empty"); } } updateEvents() { const currentLocalization = this.mainmanager.getCurrentLocalization(); const currentEvents = this.mainmanager.getAllFocusObject("event"); const focusedFloor = this.mainmanager.getCurrentFocusObject("floor"); const focusedRoom = this.mainmanager.getCurrentFocusObject("room"); this.uiElements.minimizeButton.title = currentLocalization.minimize; this.uiElements.maximizeButton.title = currentLocalization.maximize; // Figure out header if (this.mainmanager.getIsFocused("room")) { if (currentEvents.size < 1) { this.uiElements.eventsRoomName.textContent = focusedRoom.name; } else { this.uiElements.eventsRoomName.textContent = currentLocalization.events_in(focusedRoom.name); } this.uiElements.eventsRoomDescription.textContent = focusedRoom.description; this.uiElements.eventsBackButton.disabled = false; this.uiElements.eventsBackButton.title = currentLocalization.view_events_in(focusedFloor.name); this.uiElements.eventsMinimizedBackButton.disabled = false; this.uiElements.eventsMinimizedBackButton.title = currentLocalization.view_events_in(focusedFloor.name); } else { if (currentEvents.size < 1) { this.uiElements.eventsRoomName.textContent = focusedFloor.name; } else { this.uiElements.eventsRoomName.textContent = currentLocalization.events_in(focusedFloor.name); } this.uiElements.eventsRoomDescription.textContent = focusedFloor.description; this.uiElements.eventsBackButton.disabled = true; this.uiElements.eventsBackButton.title = ""; this.uiElements.eventsMinimizedBackButton.disabled = true; this.uiElements.eventsMinimizedBackButton.title = ""; } // Remove all children this.uiElements.eventList.replaceChildren(); // Put them back const currentDate = new Date(); currentEvents.forEach((event, id) => { const eventRoom = this.mainmanager .getAllFocusObject("room") .get(this.mainmanager.convertIdFocus(event.id, "room")); const eventDateStart = new Date(event.when.start); const eventDateEnd = new Date(event.when.end); const eventStarted = currentDate > eventDateStart; const eventEnded = currentDate > eventDateEnd; let datePrefix; if (eventEnded) { return; // Don't display this event } else if (eventStarted) { datePrefix = currentLocalization.date_started; } else { datePrefix = currentLocalization.date_starting; } const eventListContainer = document.createElement("div"); eventListContainer.classList.add("event-list-container"); eventListContainer.id = "event-" + id; const eventListContainerSummary = document.createElement("p"); const eventListContainerSummaryName = document.createElement("a"); eventListContainerSummaryName.href = "#" + id; eventListContainerSummaryName.textContent = event.name; eventListContainerSummary.appendChild(eventListContainerSummaryName); eventListContainerSummary.appendChild(document.createTextNode(" ")); if (!this.mainmanager.getIsFocused("room")) { const eventListContainerSummaryRoom = document.createElement("a"); eventListContainerSummaryRoom.href = "#" + eventRoom.id; eventListContainerSummaryRoom.textContent = currentLocalization.parenthesis(eventRoom.name); eventListContainerSummary.appendChild(eventListContainerSummaryRoom); } eventListContainerSummary.appendChild(document.createElement("br")); const eventListContainerSummarySmall = document.createElement("small"); const eventListContainerSummaryTime = document.createElement("span"); eventListContainerSummaryTime.classList.add("clarification"); eventListContainerSummaryTime.title = eventDateStart.toLocaleString( this.mainmanager.getCurrentLangCode(), { dateStyle: "short", timeStyle: "short", } ); eventListContainerSummaryTime.textContent = currentLocalization.date_summary( datePrefix, getRelativeTime( eventDateStart, currentDate, this.mainmanager.getCurrentLangCode() ) ); eventListContainerSummarySmall.appendChild(eventListContainerSummaryTime); eventListContainerSummarySmall.appendChild(document.createTextNode(" ")); const eventListContainerSummaryLength = document.createElement("span"); eventListContainerSummaryLength.textContent = currentLocalization.parenthesis( currentLocalization.minutes_long( getMinutesDifference(eventDateStart, eventDateEnd) ) ); eventListContainerSummarySmall.appendChild( eventListContainerSummaryLength ); eventListContainerSummary.appendChild(eventListContainerSummarySmall); eventListContainer.appendChild(eventListContainerSummary); this.uiElements.eventList.appendChild(eventListContainer); }); if (currentEvents.size < 1) { this.uiElements.events.classList.add("empty"); } else { this.uiElements.events.classList.remove("empty"); } } __updateFloorsHard() { const currentLocalization = this.mainmanager.getCurrentLocalization(); const currentFloors = this.mainmanager.getAllFocusObject("floor"); const mainFocus = this.mainmanager.getCurrentFocus("floor"); // Remove all children this.uiElements.floorButtons.replaceChildren(); this.uiElements.floorsHeading.textContent = currentLocalization.floors_header; // Put them back currentFloors.forEach(({ name }, id) => { const floorButton = document.createElement("button"); floorButton.textContent = name; floorButton.classList.add("floor-button"); floorButton.id = "floor-" + id; if (id === mainFocus) floorButton.classList.add("selected"); floorButton.addEventListener("click", () => { window.location.hash = id; }); this.uiElements.floorButtons.appendChild(floorButton); }); if (currentFloors.size < 1) { this.uiElements.floors.classList.add("empty"); this.floorsEmpty = true; } else { this.uiElements.floors.classList.remove("empty"); this.floorsEmpty = false; } } __updateFloorsSoft() { const currentLocalization = this.mainmanager.getCurrentLocalization(); const currentFloors = this.mainmanager.getAllFocusObject("floor"); const mainFocus = this.mainmanager.getCurrentFocus("floor"); this.uiElements.floorsHeading.textContent = currentLocalization.floors_header; currentFloors.forEach((_, id) => { const child = this.uiElements.floorButtons.querySelector("#floor-" + id); if (id === mainFocus) child.classList.add("selected"); else child.classList.remove("selected"); }); } }