EventMapper/assets/scripts/KaplayMap/ui.js

322 lines
11 KiB
JavaScript
Raw Normal View History

2024-06-03 03:54:02 +00:00
import {
getMinutesDifference,
getRelativeTime,
} from "../modules/relative_time.js";
import localization from "./localization.js";
2024-06-02 05:39:23 +00:00
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");
2024-06-03 03:54:02 +00:00
this.uiElements.floorsHeading = this.ui.querySelector(
"#floors .widget-heading"
);
2024-06-02 05:39:23 +00:00
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");
2024-06-03 03:54:02 +00:00
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");
2024-06-02 05:39:23 +00:00
this.uiElements.eventList =
this.uiElements.events.querySelector("#event-list");
this.uiElements.eventsMinimized =
this.uiElements.eventsContainer.querySelector("#events-minimized");
2024-06-03 03:54:02 +00:00
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");
2024-06-02 05:39:23 +00:00
// 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;
}
});
}
2024-06-03 03:54:02 +00:00
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();
}
2024-06-02 05:39:23 +00:00
__initEvents() {
2024-06-03 03:54:02 +00:00
this.uiElements.eventsBackButton.addEventListener("click", () => {
this.floormanager.setCurrentRoom("");
});
this.uiElements.eventsMinimizedBackButton.addEventListener("click", () => {
this.floormanager.setCurrentRoom("", false);
});
this.uiElements.minimizeButton.addEventListener("click", () => {
2024-06-02 05:39:23 +00:00
this.uiElements.eventsContainer.classList.add("minimized");
});
2024-06-03 03:54:02 +00:00
this.uiElements.maximizeButton.addEventListener("click", () => {
2024-06-02 05:39:23 +00:00
this.uiElements.eventsContainer.classList.remove("minimized");
});
}
__updateEvents() {
2024-06-03 03:54:02 +00:00
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 = "";
}
2024-06-02 05:39:23 +00:00
// Remove all children
this.uiElements.eventList.replaceChildren();
// Put them back
2024-06-03 03:54:02 +00:00
const currentDate = new Date();
2024-06-02 05:39:23 +00:00
this.eventmanager.events.forEach((event, id) => {
2024-06-03 03:54:02 +00:00
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;
}
2024-06-02 05:39:23 +00:00
const eventListContainer = document.createElement("details");
eventListContainer.classList.add("event-list-container");
eventListContainer.id = "event-" + id;
const eventListContainerSummary = document.createElement("summary");
2024-06-03 03:54:02 +00:00
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);
2024-06-02 05:39:23 +00:00
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() {
2024-06-03 03:54:02 +00:00
const currentLocalization = localization.get(this.floormanager.lang);
2024-06-02 05:39:23 +00:00
// Remove all children
this.uiElements.floorButtons.replaceChildren();
2024-06-03 03:54:02 +00:00
this.uiElements.floorsHeading.textContent =
currentLocalization.floors_header;
2024-06-02 05:39:23 +00:00
// 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() {
2024-06-03 03:54:02 +00:00
const currentLocalization = localization.get(this.floormanager.lang);
this.uiElements.floorsHeading.textContent =
currentLocalization.floors_header;
2024-06-02 05:39:23 +00:00
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");
});
}
}