import { getMinutesDifference, getRelativeTime, } from "../modules/relative_time.js"; import localization from "./localization.js"; export class UIManager { ui; map; floormanager; eventmanager; uiElements = {}; floorsEmpty = true; eventsEmpty = true; constructor(ui, map) { this.ui = ui; this.map = map; // 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.minimizeButton = this.uiElements.events.querySelector( "#footer #footer-buttons #minimize" ); this.uiElements.maximizeButton = this.uiElements.eventsMinimized.querySelector("#maximize"); // Loading this.uiElements.loading = this.ui.querySelector("#loading"); // Zoom buttons this.__initZoom(); this.__initEvents(); } __initZoom() { this.uiElements.zoomIn.addEventListener("click", () => { this.map.zoomLevel += 1; }); this.uiElements.zoomOut.addEventListener("click", () => { this.map.zoomLevel -= 1; }); this.map.kp.onUpdate(() => { if (this.map.zoomLevelLimit > 0) { this.uiElements.zoomIn.disabled = true; this.uiElements.zoomOut.disabled = false; } else if (this.map.zoomLevelLimit < 0) { this.uiElements.zoomIn.disabled = false; this.uiElements.zoomOut.disabled = true; } else { this.uiElements.zoomIn.disabled = false; this.uiElements.zoomOut.disabled = false; } }); } toggleEventsMinimized() { this.uiElements.eventsContainer.classList.toggle("minimized"); } eventsMinimize() { this.uiElements.eventsContainer.classList.add("minimized"); } eventsMaximize() { this.uiElements.eventsContainer.classList.remove("minimized"); } __updateAll() { this.__updateEvents(); this.__updateFloorsHard(); } __initEvents() { this.uiElements.eventsBackButton.addEventListener("click", () => { this.floormanager.setCurrentRoom(""); }); this.uiElements.eventsMinimizedBackButton.addEventListener("click", () => { this.floormanager.setCurrentRoom("", false); }); this.uiElements.minimizeButton.addEventListener("click", () => { this.uiElements.eventsContainer.classList.add("minimized"); }); this.uiElements.maximizeButton.addEventListener("click", () => { this.uiElements.eventsContainer.classList.remove("minimized"); }); } __updateEvents() { const currentLocalization = localization.get(this.floormanager.lang); this.uiElements.minimizeButton.title = currentLocalization.minimize; this.uiElements.maximizeButton.title = currentLocalization.maximize; // Figure out header if (this.floormanager.currentRoomItem != null) { this.uiElements.eventsRoomName.textContent = currentLocalization.events_in(this.floormanager.currentRoomItem.name); this.uiElements.eventsRoomDescription.textContent = this.floormanager.currentRoomItem.description; this.uiElements.eventsBackButton.disabled = false; this.uiElements.eventsBackButton.title = currentLocalization.view_events_in( this.floormanager.currentFloorItem.name ); this.uiElements.eventsMinimizedBackButton.disabled = false; this.uiElements.eventsMinimizedBackButton.title = currentLocalization.view_events_in( this.floormanager.currentFloorItem.name ); } else { this.uiElements.eventsRoomName.textContent = currentLocalization.events_in(this.floormanager.currentFloorItem.name); this.uiElements.eventsRoomDescription.textContent = this.floormanager.currentFloorItem.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(); this.eventmanager.events.forEach((event, id) => { if ( this.floormanager.currentRoomItem && event.where != this.floormanager.currentRoom ) return; // Don't display this event const eventFloor = this.floormanager.currentFloorRooms.get(event.where); 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("details"); eventListContainer.classList.add("event-list-container"); eventListContainer.id = "event-" + id; const eventListContainerSummary = document.createElement("summary"); const eventListContainerSummaryName = document.createElement("b"); eventListContainerSummaryName.textContent = event.name; eventListContainerSummary.appendChild(eventListContainerSummaryName); eventListContainerSummary.appendChild(document.createTextNode(" ")); if (this.floormanager.currentRoomItem == null) { const eventListContainerSummaryRoom = document.createElement("button"); eventListContainerSummaryRoom.classList.add("link"); eventListContainerSummaryRoom.addEventListener("click", () => { this.floormanager.setCurrentRoom(eventFloor.id); }); eventListContainerSummaryRoom.textContent = currentLocalization.parenthesis(eventFloor.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.floormanager.lang.replace(/_/g, "-") ); eventListContainerSummaryTime.textContent = currentLocalization.date_summary( datePrefix, getRelativeTime( eventDateStart, currentDate, this.floormanager.lang.replace(/_/g, "-") ) ); 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); const eventListContainerDescription = document.createElement("p"); eventListContainerDescription.textContent = event.description; eventListContainer.appendChild(eventListContainerDescription); this.uiElements.eventList.appendChild(eventListContainer); }); if (this.eventmanager.events.size < 1) { this.uiElements.eventList.classList.add("empty"); this.eventsEmpty = true; } else { this.uiElements.eventList.classList.remove("empty"); this.eventsEmpty = false; } } setLoading(state) { if (state) { this.ui.classList.add("loading"); } else { this.ui.classList.remove("loading"); } } __updateFloorsHard() { const currentLocalization = localization.get(this.floormanager.lang); // Remove all children this.uiElements.floorButtons.replaceChildren(); this.uiElements.floorsHeading.textContent = currentLocalization.floors_header; // Put them back this.floormanager.floors.forEach(({ name }, id) => { const floorButton = document.createElement("button"); floorButton.textContent = name; floorButton.classList.add("floor-button"); floorButton.id = "floor-" + id; if (id === this.floormanager.currentFloor) floorButton.classList.add("selected"); floorButton.addEventListener("click", () => this.floormanager.changeFloor(id) ); this.uiElements.floorButtons.appendChild(floorButton); }); if (this.floormanager.floors.size < 1) { this.uiElements.floors.classList.add("empty"); this.floorsEmpty = true; } else { this.uiElements.floors.classList.remove("empty"); this.floorsEmpty = false; } } __updateFloorsSoft() { const currentLocalization = localization.get(this.floormanager.lang); this.uiElements.floorsHeading.textContent = currentLocalization.floors_header; this.floormanager.floors.forEach(({ name }, id) => { const child = this.uiElements.floorButtons.querySelector("#floor-" + id); if (id === this.floormanager.currentFloor) child.classList.add("selected"); else child.classList.remove("selected"); }); } }