rowt/frontend/main.ts

771 lines
23 KiB
TypeScript
Raw Normal View History

2023-09-23 21:05:08 +02:00
import Choices from "choices.js";
2024-03-04 13:28:42 +01:00
import { Sidebar } from "./js/sidebar";
import "./scss/app.scss";
2023-09-23 21:05:08 +02:00
export interface choiceMap {
[details: string]: Choices;
}
let choiceObjects: choiceMap = {};
2024-03-03 20:03:20 +01:00
let boat_in_ottensheim = true;
2024-03-30 01:36:37 +01:00
let boat_reserved_today= true;
2024-03-04 13:28:42 +01:00
document.addEventListener("DOMContentLoaded", function () {
2023-11-04 20:16:20 +01:00
changeTheme();
initcolorTheme();
initSearch();
2023-04-06 13:15:40 +02:00
initSidebar();
2023-04-07 12:37:33 +02:00
initToggle();
replaceStrings();
2023-09-23 21:05:08 +02:00
initChoices();
initBoatActions();
2023-09-23 21:51:00 +02:00
selectBoatChange();
2024-03-04 13:28:42 +01:00
addRelationMagic(<HTMLElement>document.querySelector("body"));
2023-09-27 13:58:22 +02:00
reloadPage();
2024-03-04 13:28:42 +01:00
setCurrentdate(<HTMLInputElement>document.querySelector("#departure"));
});
2023-11-04 20:16:20 +01:00
function changeTheme() {
2024-03-04 13:28:42 +01:00
let toggleBtn = <HTMLElement>document.querySelector("#theme-toggle-js");
2023-11-04 20:16:20 +01:00
2024-03-04 13:28:42 +01:00
if (toggleBtn) {
toggleBtn.addEventListener("click", function () {
if (toggleBtn.dataset.theme === "light") {
setTheme("dark", true);
2023-11-04 20:16:20 +01:00
} else {
2024-03-04 13:28:42 +01:00
setTheme("light", true);
2023-11-04 20:16:20 +01:00
}
});
2024-03-04 13:28:42 +01:00
}
2023-11-04 20:16:20 +01:00
}
/***
2024-03-04 13:28:42 +01:00
* init javascript
* 1) detect native color scheme or use set theme in local storage
* 2) detect view (desktop or responsive) if on mobile device with touch screen
* 3) set base font size to 112.5% -> 18px
*/
2023-11-04 20:16:20 +01:00
function initcolorTheme() {
colorThemeWatcher();
2024-03-04 13:28:42 +01:00
let theme = localStorage.getItem("theme");
if (theme == null || theme === "auto") {
if (
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
setTheme("dark", false);
} else {
setTheme("light", false);
}
2023-11-04 20:16:20 +01:00
} else {
2024-03-04 13:28:42 +01:00
setTheme(theme);
2023-11-04 20:16:20 +01:00
}
}
/***
2024-03-04 13:28:42 +01:00
* Listener operating system native color configuration
*/
2023-11-04 20:16:20 +01:00
function colorThemeWatcher() {
try {
2024-03-04 13:28:42 +01:00
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", (e) => {
setTheme(e.matches ? "dark" : "light");
2023-11-04 20:16:20 +01:00
});
} catch {
2024-03-04 13:28:42 +01:00
console.warn("color theme watcher not supported");
2023-11-04 20:16:20 +01:00
}
}
/**
2024-03-04 13:28:42 +01:00
* Define color scheme, colors without losing the base font size configuration
* and add data-theme to html tag
* @param theme
*/
2023-11-04 20:16:20 +01:00
function setTheme(theme: string, setLocalStorage = true) {
2024-03-04 13:28:42 +01:00
let toggleBtn = document.querySelector("#theme-toggle-js");
2023-11-04 20:16:20 +01:00
2023-11-04 20:51:03 +01:00
if (setLocalStorage) {
2024-03-04 13:28:42 +01:00
localStorage.setItem("theme", theme);
2023-11-04 20:51:03 +01:00
}
2024-03-04 13:28:42 +01:00
if (toggleBtn) toggleBtn.setAttribute("data-theme", theme);
if (
document.documentElement.classList.contains("dark") &&
theme === "light"
) {
document.documentElement.classList.remove("dark");
} else if (theme === "dark") {
document.documentElement.classList.add("dark");
2023-11-04 20:16:20 +01:00
}
}
2023-09-27 14:46:34 +02:00
function setCurrentdate(input: HTMLInputElement) {
2024-03-04 13:28:42 +01:00
if (input) {
const now = new Date();
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}T${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
input.value = formattedDateTime;
2023-09-27 14:46:34 +02:00
}
}
2024-03-04 13:28:42 +01:00
interface ChoiceBoatEvent extends Event {
2023-10-30 15:37:01 +01:00
detail: {
2024-03-04 13:28:42 +01:00
value: string;
label: string;
2023-10-30 15:37:01 +01:00
customProperties: {
2024-03-04 13:28:42 +01:00
amount_seats: number;
owner: number;
default_destination: string;
boat_in_ottensheim: boolean;
2024-03-30 01:36:37 +01:00
boat_reserved_today: boolean;
2024-03-04 13:28:42 +01:00
};
2023-10-30 15:37:01 +01:00
};
}
2023-09-23 21:51:00 +02:00
function selectBoatChange() {
2024-03-04 13:28:42 +01:00
const boatSelect = <HTMLSelectElement>document.querySelector("#boat_id");
2023-09-24 10:32:38 +02:00
2024-03-04 13:28:42 +01:00
if (boatSelect) {
2023-09-27 13:52:15 +02:00
const boatChoice = new Choices(boatSelect, {
2024-03-04 13:28:42 +01:00
loadingText: "Wird geladen...",
noResultsText: "Keine Ergebnisse gefunden",
noChoicesText: "Keine Ergebnisse gefunden",
itemSelectText: "Zum Auswählen klicken",
2023-09-27 13:52:15 +02:00
} as any);
2023-09-24 10:32:38 +02:00
2024-03-04 13:28:42 +01:00
boatSelect.addEventListener(
"addItem",
function (e) {
2024-03-30 01:36:37 +01:00
2024-03-04 13:28:42 +01:00
const event = e as ChoiceBoatEvent;
2024-03-30 01:36:37 +01:00
boat_reserved_today = event.detail.customProperties.boat_reserved_today;
if (boat_reserved_today){
2024-04-02 20:59:09 +02:00
alert(event.detail.label.trim()+' wurde heute reserviert. Bitte kontrolliere, dass du die Reservierung nicht störst.');
2024-03-30 01:36:37 +01:00
}
2024-03-04 13:28:42 +01:00
boat_in_ottensheim = event.detail.customProperties.boat_in_ottensheim;
2024-03-03 20:03:20 +01:00
2024-03-04 13:28:42 +01:00
const amount_seats = event.detail.customProperties.amount_seats;
setMaxAmountRowers("newrower", amount_seats);
2023-09-28 16:07:52 +02:00
2024-03-04 13:28:42 +01:00
const destination = <HTMLSelectElement>(
document.querySelector("#destination")
);
destination.value = event.detail.customProperties.default_destination;
2024-03-04 13:28:42 +01:00
if (event.detail.customProperties.owner) {
choiceObjects["newrower"].setChoiceByValue(
event.detail.customProperties.owner + "",
);
}
2024-03-04 13:28:42 +01:00
const inputElement = document.getElementById(
"departure",
) as HTMLInputElement;
2023-10-30 15:19:43 +01:00
const now = new Date();
2024-03-04 13:28:42 +01:00
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}T${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
2023-10-30 15:19:43 +01:00
inputElement.value = formattedDateTime;
2023-11-12 13:33:39 +01:00
2024-03-04 13:28:42 +01:00
const distinput = <HTMLInputElement>(
document.querySelector("#distance_in_km")
);
distinput.value = "";
2023-11-12 13:33:39 +01:00
2024-03-04 13:28:42 +01:00
const destinput = <HTMLInputElement>(
document.querySelector("#destination")
);
destinput.dispatchEvent(new Event("input"));
},
false,
);
2023-09-24 10:32:38 +02:00
2023-10-30 09:21:35 +01:00
choiceObjects[boatSelect.id] = boatChoice;
2023-10-30 15:19:43 +01:00
choiceObjects["boat_id"] = boatChoice;
2023-09-27 13:52:15 +02:00
}
2023-09-23 21:51:00 +02:00
}
2023-09-27 13:58:22 +02:00
function reloadPage() {
2024-03-04 13:28:42 +01:00
if (!window.location.href.includes("ergo")) {
let pageTitle = document.title;
2024-03-04 13:28:42 +01:00
let attentionMessage = "Riemen- und Dollenbruch";
2023-09-27 13:58:22 +02:00
2024-03-04 13:28:42 +01:00
document.addEventListener("visibilitychange", function () {
let isPageActive = !document.hidden;
2023-09-27 13:58:22 +02:00
2024-03-04 13:28:42 +01:00
if (!isPageActive) {
document.title = attentionMessage;
} else {
document.title = pageTitle;
location.reload();
}
});
}
2023-09-27 13:58:22 +02:00
}
2023-10-30 13:39:58 +01:00
function setMaxAmountRowers(name: string, rowers: number) {
2024-03-04 13:28:42 +01:00
if (choiceObjects[name]) {
2023-10-30 15:37:01 +01:00
choiceObjects[name].removeActiveItems(-1);
2023-10-30 15:19:43 +01:00
//let curSelection = choiceObjects[name].getValue(true);
//let amount_to_delete = (<any>curSelection).length - rowers;
//if (amount_to_delete > 0){
// let to_delete = (<any>curSelection).slice(-amount_to_delete);
// for (let del of to_delete) {
// choiceObjects[name].removeActiveItemsByValue(del);
// }
//}
2023-09-28 16:18:47 +02:00
2024-03-04 13:28:42 +01:00
let input = <HTMLElement>document.querySelector("#" + name);
if (input) {
2023-10-30 13:39:58 +01:00
choiceObjects[name].config.maxItemCount = rowers;
2023-09-28 16:18:47 +02:00
if (rowers === 0) {
2024-03-04 13:28:42 +01:00
choiceObjects[name].disable();
input.parentElement?.parentElement?.parentElement?.classList.add(
"hidden",
);
input.parentElement?.parentElement?.parentElement?.classList.add(
"md:block",
);
input.parentElement?.parentElement?.parentElement?.classList.add(
"opacity-50",
);
} else {
2023-10-30 13:39:58 +01:00
choiceObjects[name].enable();
2024-03-04 13:28:42 +01:00
input.parentElement?.parentElement?.parentElement?.classList.remove(
"hidden",
);
input.parentElement?.parentElement?.parentElement?.classList.remove(
"md:block",
);
input.parentElement?.parentElement?.parentElement?.classList.remove(
"opacity-50",
);
2023-09-28 16:18:47 +02:00
}
}
2023-09-28 16:07:52 +02:00
//let only_steering = <HTMLSelectElement>document.querySelector('#shipmaster_only_steering');
//if(only_steering) {
// if(isShipmasterSteering == 'true') {
// only_steering.removeAttribute('disabled');
// only_steering.setAttribute('checked', 'true');
// only_steering.parentElement?.parentElement?.parentElement?.classList.remove('hidden');
// only_steering.parentElement?.parentElement?.parentElement?.classList.remove('md:block');
// only_steering.parentElement?.parentElement?.parentElement?.classList.remove('opacity-50');
// } else {
// only_steering.setAttribute('disabled', 'disabled');
// only_steering.removeAttribute('checked');
// only_steering.parentElement?.parentElement?.parentElement?.classList.add('hidden');
// only_steering.parentElement?.parentElement?.parentElement?.classList.add('md:block');
2024-03-04 13:28:42 +01:00
// only_steering.parentElement?.parentElement?.parentElement?.classList.add('opacity-50');
// }
//}
2024-03-04 13:28:42 +01:00
let shipmaster = <HTMLElement>(
document.querySelector("#shipmaster-" + name + "js")
);
let steering_person = <HTMLElement>(
document.querySelector("#steering_person-" + name + "js")
);
if (rowers == 1) {
if (shipmaster.parentNode) {
(<HTMLElement>shipmaster.parentNode).classList.add("hidden");
}
shipmaster.removeAttribute("required");
if (steering_person.parentNode) {
(<HTMLElement>steering_person.parentNode).classList.add("hidden");
}
steering_person.removeAttribute("required");
} else {
if (shipmaster.parentNode) {
(<HTMLElement>shipmaster.parentNode).classList.remove("hidden");
}
shipmaster.setAttribute("required", "required");
if (steering_person.parentNode) {
(<HTMLElement>steering_person.parentNode).classList.remove("hidden");
}
steering_person.setAttribute("required", "required");
2023-09-28 16:07:52 +02:00
}
2023-09-28 17:31:20 +02:00
}
}
2023-09-23 21:05:08 +02:00
function initBoatActions() {
2024-03-04 13:28:42 +01:00
const boatSelects = document.querySelectorAll(
'.boats-js[data-onclick="true"]',
);
if (boatSelects) {
2023-09-23 21:05:08 +02:00
Array.prototype.forEach.call(boatSelects, (select: HTMLInputElement) => {
2024-03-04 13:28:42 +01:00
select.addEventListener("click", function () {
if (select.dataset.seats) {
2023-09-28 16:07:52 +02:00
if (select.dataset.id) {
2024-03-04 13:28:42 +01:00
choiceObjects["boat_id"].setChoiceByValue(select.dataset.id);
2023-09-28 16:07:52 +02:00
}
2023-09-28 16:07:52 +02:00
window.scrollTo(0, 0);
2023-09-23 21:05:08 +02:00
}
});
});
}
}
function initChoices() {
const selects = document.querySelectorAll('select[data-init="true"]');
2024-03-04 13:28:42 +01:00
if (selects) {
2023-09-23 21:05:08 +02:00
Array.prototype.forEach.call(selects, (select: HTMLInputElement) => {
initNewChoice(select);
});
}
}
2024-03-04 13:28:42 +01:00
interface ChoiceEvent extends Event {
2023-10-30 09:21:35 +01:00
detail: {
2024-03-04 13:28:42 +01:00
value: string;
label: string;
2023-10-30 09:21:35 +01:00
customProperties: {
2024-03-04 13:28:42 +01:00
is_cox: boolean;
steers: boolean;
cox_on_boat: boolean;
is_racing: boolean;
};
2023-10-30 09:21:35 +01:00
};
}
2023-09-23 21:05:08 +02:00
function initNewChoice(select: HTMLInputElement) {
2023-10-30 19:13:34 +01:00
let seats = 0;
if (select.dataset && select.dataset.seats) {
seats = +select.dataset.seats;
}
2023-10-31 22:16:14 +01:00
2024-03-04 13:28:42 +01:00
let shipmaster = <HTMLElement>(
document.querySelector("#shipmaster-" + select.id + "js")
);
let steering_person = <HTMLElement>(
document.querySelector("#steering_person-" + select.id + "js")
);
if (seats == 1) {
if (shipmaster.parentNode) {
(<HTMLElement>shipmaster.parentNode).classList.add("hidden");
2023-10-31 22:16:14 +01:00
}
2024-03-04 13:28:42 +01:00
shipmaster.removeAttribute("required");
if (steering_person.parentNode) {
(<HTMLElement>steering_person.parentNode).classList.add("hidden");
}
steering_person.removeAttribute("required");
} else {
if (shipmaster.parentNode) {
(<HTMLElement>shipmaster.parentNode).classList.remove("hidden");
}
shipmaster.setAttribute("required", "required");
if (steering_person.parentNode) {
(<HTMLElement>steering_person.parentNode).classList.remove("hidden");
}
steering_person.setAttribute("required", "required");
}
2023-09-23 21:05:08 +02:00
const choice = new Choices(select, {
removeItemButton: true,
2024-03-04 13:28:42 +01:00
loadingText: "Wird geladen...",
noResultsText: "Keine Ergebnisse gefunden",
noChoicesText: "Keine Ergebnisse gefunden",
itemSelectText: "Zum Auswählen klicken",
placeholderValue: "Ruderer auswählen",
maxItemCount: seats,
2023-09-23 21:05:08 +02:00
maxItemText: (maxItemCount) => {
return `Nur ${maxItemCount} Ruderer können hinzugefügt werden`;
},
2024-03-04 13:28:42 +01:00
callbackOnInit: function () {
this._currentState.items.forEach(function (obj) {
if (boat_in_ottensheim && obj.customProperties) {
if (obj.customProperties.is_racing) {
const coxSelect = <HTMLSelectElement>(
document.querySelector("#shipmaster-" + select.id + "js")
);
var new_option = new Option(obj.label, obj.value);
if (obj.customProperties.cox_on_boat) {
new_option.selected = true;
}
coxSelect.add(new_option);
}
}
if (obj.customProperties && obj.customProperties.is_cox) {
const coxSelect = <HTMLSelectElement>(
document.querySelector("#shipmaster-" + select.id + "js")
);
var new_option = new Option(obj.label, obj.value);
if (obj.customProperties.cox_on_boat) {
new_option.selected = true;
}
coxSelect.add(new_option);
}
const steeringSelect = <HTMLSelectElement>(
document.querySelector("#steering_person-" + select.id + "js")
);
if (steeringSelect) {
var new_option = new Option(obj.label, obj.value);
if (obj.customProperties && obj.customProperties.steers) {
new_option.selected = true;
}
steeringSelect.add(new_option);
}
});
},
2023-09-23 21:05:08 +02:00
});
2023-10-30 13:39:58 +01:00
choiceObjects[select.id] = choice;
2023-09-23 21:05:08 +02:00
2024-03-04 13:28:42 +01:00
select.addEventListener(
"addItem",
function (e) {
const event = e as ChoiceEvent;
const user_id = event.detail.value;
const name = event.detail.label;
if (boat_in_ottensheim && event.detail.customProperties.is_racing) {
if (event.detail.customProperties.is_racing) {
const coxSelect = <HTMLSelectElement>(
document.querySelector("#shipmaster-" + select.id + "js")
);
if (coxSelect) {
coxSelect.add(new Option(name, user_id));
}
}
}
if (event.detail.customProperties.is_cox) {
const coxSelect = <HTMLSelectElement>(
document.querySelector("#shipmaster-" + select.id + "js")
);
if (coxSelect) {
coxSelect.add(new Option(name, user_id));
}
}
const steeringSelect = <HTMLSelectElement>(
document.querySelector("#steering_person-" + select.id + "js")
);
if (steeringSelect) {
steeringSelect.add(new Option(name, user_id));
}
},
false,
);
select.addEventListener(
"removeItem",
function (e) {
const event = e as ChoiceEvent;
const user_id = event.detail.value;
const coxSelect = <HTMLSelectElement>(
document.querySelector("#shipmaster-" + select.id + "js")
);
if (coxSelect) {
for (var i = 0; i < coxSelect.length; i++) {
if (coxSelect.options[i].value == user_id) coxSelect.remove(i);
}
}
const steeringSelect = <HTMLSelectElement>(
document.querySelector("#steering_person-" + select.id + "js")
);
if (steeringSelect) {
for (var i = 0; i < steeringSelect.length; i++) {
if (steeringSelect.options[i].value == user_id)
steeringSelect.remove(i);
}
}
},
false,
);
2023-09-23 21:05:08 +02:00
choiceObjects[select.id] = choice;
}
2023-04-07 12:37:33 +02:00
function initToggle() {
2023-04-10 22:42:00 +02:00
// get filter btns & set object sessionStorage
2024-03-04 13:28:42 +01:00
const btns = <NodeListOf<HTMLButtonElement>>(
document.querySelectorAll(".filter-trips-js")
);
2023-04-10 22:42:00 +02:00
let filterObject = new Map();
2023-04-07 12:37:33 +02:00
2024-03-04 13:28:42 +01:00
if (btns) {
2023-04-10 22:42:00 +02:00
Array.prototype.forEach.call(btns, (btn: HTMLButtonElement) => {
filterObject.set(btn.dataset.action, btn.ariaPressed);
2024-03-04 13:28:42 +01:00
btn.addEventListener("click", () => {
let filter = sessionStorage.getItem("tripsFilter");
if (filter) {
2023-04-10 22:42:00 +02:00
let filterMap = new Map(JSON.parse(filter));
for (let entry of filterMap.entries()) {
2024-03-04 13:28:42 +01:00
if (entry[0] === btn.dataset.action && entry[1] !== "true") {
filterMap.set(entry[0], "true");
2023-04-10 22:42:00 +02:00
} else {
2024-03-04 13:28:42 +01:00
filterMap.set(entry[0], "false");
2023-04-10 22:42:00 +02:00
}
}
2024-03-04 13:28:42 +01:00
sessionStorage.setItem(
"tripsFilter",
JSON.stringify(Array.from(filterMap.entries())),
);
2023-04-10 22:42:00 +02:00
}
resetFilteredElements();
2024-03-04 13:28:42 +01:00
if (btn.getAttribute("aria-pressed") === "false") {
2023-04-10 22:42:00 +02:00
Array.prototype.forEach.call(btns, (b: HTMLButtonElement) => {
2024-03-04 13:28:42 +01:00
b.setAttribute("aria-pressed", "false");
2023-04-10 22:42:00 +02:00
});
triggerFilterAction(btn.dataset.action);
2023-04-10 22:46:35 +02:00
} else {
2024-03-04 13:28:42 +01:00
btn.setAttribute("aria-pressed", "false");
2023-04-10 22:42:00 +02:00
}
2023-04-07 12:37:33 +02:00
});
2024-03-04 13:28:42 +01:00
});
2023-04-10 22:42:00 +02:00
}
2024-03-04 13:28:42 +01:00
let filter = sessionStorage.getItem("tripsFilter");
if (filter) {
2023-04-10 22:42:00 +02:00
let filterMap = new Map(JSON.parse(filter));
for (let entry of filterMap.entries()) {
2024-03-04 13:28:42 +01:00
if (entry[1] === "true") {
2023-04-10 22:42:00 +02:00
triggerFilterAction(entry[0]);
}
}
} else {
2024-03-04 13:28:42 +01:00
sessionStorage.setItem(
"tripsFilter",
JSON.stringify(Array.from(filterObject.entries())),
);
2023-04-10 22:42:00 +02:00
}
}
function resetFilteredElements() {
2024-03-04 13:28:42 +01:00
const hiddenElements = document.querySelectorAll(".reset-js.hidden");
if (hiddenElements) {
Array.prototype.forEach.call(
hiddenElements,
(hiddenElement: HTMLButtonElement) => {
hiddenElement.classList.remove("hidden");
},
);
2023-04-07 12:37:33 +02:00
}
2023-04-10 22:42:00 +02:00
}
2023-04-07 12:37:33 +02:00
2023-04-10 22:42:00 +02:00
function triggerFilterAction(activeFilter: any) {
2024-03-04 13:28:42 +01:00
const activeBtn = document.querySelector(
'button[data-action="' + activeFilter + '"]',
);
if (activeBtn) {
activeBtn.setAttribute("aria-pressed", "true");
2023-04-07 12:37:33 +02:00
2023-04-10 22:42:00 +02:00
filterAction(activeFilter);
2024-03-04 13:28:42 +01:00
}
2023-04-10 22:42:00 +02:00
}
2023-04-07 12:37:33 +02:00
2023-04-10 22:42:00 +02:00
function filterAction(activeFilter: string) {
2024-03-04 13:28:42 +01:00
switch (activeFilter) {
case "filter-days": {
2023-04-10 22:42:00 +02:00
filterDays();
break;
}
2024-03-04 13:28:42 +01:00
case "filter-coxs": {
2023-04-10 22:42:00 +02:00
filterCoxs();
break;
}
2023-04-07 12:37:33 +02:00
}
2023-04-10 22:42:00 +02:00
}
2023-04-10 22:42:00 +02:00
function filterDays() {
const daysNoTrips = document.querySelectorAll('div[data-trips="0"]');
Array.prototype.forEach.call(daysNoTrips, (day: HTMLElement) => {
2024-03-04 13:28:42 +01:00
day.classList.toggle("hidden");
2023-04-10 22:42:00 +02:00
});
}
2023-04-10 22:42:00 +02:00
function filterCoxs() {
const noCoxNeeded = document.querySelectorAll('div[data-coxneeded="false"]');
Array.prototype.forEach.call(noCoxNeeded, (notNeeded: HTMLElement) => {
2024-03-04 13:28:42 +01:00
notNeeded.classList.toggle("hidden");
2023-04-10 22:42:00 +02:00
});
}
2023-04-07 12:37:33 +02:00
function initSearch() {
2024-03-04 13:28:42 +01:00
const input = <HTMLInputElement>document.querySelector("#filter-js");
2024-03-04 13:28:42 +01:00
if (input) {
filterElements(input.value);
2024-03-04 13:28:42 +01:00
input.addEventListener("input", () => {
filterElements(input.value);
});
}
}
function filterElements(input: string) {
2023-09-27 15:36:07 +02:00
const elements = document.querySelectorAll('div[data-filterable="true"]');
2024-03-04 13:28:42 +01:00
let resultWrapper = <HTMLElement>document.querySelector("#filter-result-js"),
amountShownElements = 0;
Array.prototype.forEach.call(elements, (element: HTMLElement) => {
// set both strings (input & dataset filter) to lowercase to not be case sensitive
let filterString = element.dataset.filter?.toLocaleLowerCase();
2024-03-04 13:28:42 +01:00
// bulk hide all elements
2024-03-04 13:28:42 +01:00
element.style.display = "none";
// show if input matches
2024-03-04 13:28:42 +01:00
if (filterString?.includes(input.toLocaleLowerCase())) {
element.style.display = "flex";
amountShownElements++;
}
});
2024-03-04 13:28:42 +01:00
if (resultWrapper) {
resultWrapper.innerHTML =
amountShownElements === 0
? "Kein Ergebnis gefunden"
: "<strong>" +
amountShownElements +
"</strong>" +
(amountShownElements > 1 ? " Ergebnisse" : " Ergebnis") +
" gefunden";
}
}
2023-04-06 13:15:40 +02:00
function initSidebar() {
2024-03-04 13:28:42 +01:00
const sidebarTrigger = <NodeListOf<HTMLElement>>(
document.querySelectorAll("[data-trigger]")
);
if (sidebarTrigger) {
Array.prototype.forEach.call(
sidebarTrigger,
(triggerElement: HTMLElement) => {
if (triggerElement.dataset.trigger) {
const sidebar = new Sidebar(triggerElement.dataset.trigger);
triggerElement.addEventListener("click", (e) => {
e.preventDefault();
if (triggerElement.dataset.trigger === "sidebar") {
initTripSidebar(triggerElement);
}
2024-03-04 13:28:42 +01:00
sidebar.toggle();
});
}
},
);
2023-04-06 13:15:40 +02:00
}
}
function initTripSidebar(triggerElement: HTMLElement) {
2024-03-04 13:28:42 +01:00
const sidebarElement = <HTMLElement>document.querySelector("#sidebar");
if (
sidebarElement &&
triggerElement.dataset.body &&
triggerElement.dataset.header
) {
2023-04-08 09:17:46 +02:00
let body = <HTMLElement>document.querySelector(triggerElement.dataset.body);
let bodyElement = <HTMLElement>body.cloneNode(true);
2024-03-04 13:28:42 +01:00
let bodyContainerElement = <HTMLElement>(
sidebarElement.querySelector(".body-js")
);
2023-09-23 21:05:08 +02:00
/* Quickfix duplicate ids checkboxes */
2024-03-04 13:28:42 +01:00
const checkboxes = <NodeListOf<HTMLElement>>(
bodyElement.querySelectorAll('input[type="checkbox"]')
);
Array.prototype.forEach.call(checkboxes, (checkbox: HTMLElement) => {
2024-03-04 13:28:42 +01:00
if (checkbox) {
checkbox.parentElement?.setAttribute("for", checkbox.id + "js");
checkbox.id += "js";
}
});
2024-03-04 13:28:42 +01:00
const prefixedContent = <NodeListOf<HTMLElement>>(
bodyElement.querySelectorAll(".change-id-js")
);
2023-09-05 23:03:18 +02:00
Array.prototype.forEach.call(prefixedContent, (content: HTMLElement) => {
2024-03-04 13:28:42 +01:00
if (content) {
content.id += "js";
2023-09-05 23:03:18 +02:00
2024-03-04 13:28:42 +01:00
if (content.dataset.relation) {
content.dataset.relation += "js";
2023-09-05 23:03:18 +02:00
}
}
});
2024-03-04 13:28:42 +01:00
if (bodyContainerElement) {
bodyContainerElement.innerHTML = "";
2023-04-08 09:17:46 +02:00
bodyContainerElement.append(bodyElement);
2023-09-05 23:03:18 +02:00
addRelationMagic(bodyElement);
}
2024-03-04 13:28:42 +01:00
if (triggerElement.dataset.day) {
let hiddenElement = <HTMLInputElement>(
bodyElement.querySelector(".day-js")
);
if (hiddenElement) {
hiddenElement.value = triggerElement.dataset.day;
}
}
2024-03-04 13:28:42 +01:00
let headerElement = sidebarElement.querySelector(".header-js");
if (headerElement) {
headerElement.innerHTML = triggerElement.dataset.header;
}
2024-03-04 13:28:42 +01:00
const selects = bodyElement.querySelectorAll("select[multiple]");
if (selects) {
Array.prototype.forEach.call(selects, (select: HTMLInputElement) => {
2023-10-30 13:39:58 +01:00
initNewChoice(select);
2024-03-04 13:28:42 +01:00
});
}
}
2024-03-04 13:28:42 +01:00
const defaultDateTimes = <NodeListOf<HTMLInputElement>>(
document.querySelectorAll(".current-date-time")
);
defaultDateTimes.forEach((defaultDateTime) => {
setCurrentdate(defaultDateTime);
});
}
2023-09-05 23:03:18 +02:00
function addRelationMagic(bodyElement: HTMLElement) {
2024-03-04 13:28:42 +01:00
const fields = bodyElement.querySelectorAll(".set-distance-js");
2023-09-23 22:31:19 +02:00
2024-03-04 13:28:42 +01:00
if (fields) {
2023-09-05 23:03:18 +02:00
Array.prototype.forEach.call(fields, (field: HTMLInputElement) => {
2024-03-04 13:28:42 +01:00
if (field.dataset.relation) {
const relatedField = <HTMLInputElement>(
bodyElement.querySelector("#" + field.dataset.relation)
);
if (relatedField) {
field.addEventListener("input", (e) => {
e.preventDefault();
const dataList = <HTMLDataListElement>(
document.querySelector("#destinations")
);
if (dataList) {
var option = Array.prototype.find.call(
dataList.options,
function (option) {
2023-09-05 23:03:18 +02:00
return option.value === field.value;
2024-03-04 13:28:42 +01:00
},
);
// Get distance
const distance = option.getAttribute("distance");
if (distance) relatedField.value = distance;
}
2023-09-05 23:03:18 +02:00
});
}
}
});
}
}
function replaceStrings() {
2024-03-04 13:28:42 +01:00
const weekdays = document.querySelectorAll(".weekday-js");
Array.prototype.forEach.call(weekdays, (weekday: HTMLElement) => {
2024-03-04 13:28:42 +01:00
weekday.innerHTML = weekday.innerHTML.replace("Freitag", "Markttag");
});
}