220 lines
6.9 KiB
TypeScript
220 lines
6.9 KiB
TypeScript
import { Sidebar } from './js/sidebar';
|
|
import './scss/app.scss'
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
initSearch();
|
|
initSidebar();
|
|
initToggle();
|
|
});
|
|
|
|
function initToggle() {
|
|
// get filter btns & set object sessionStorage
|
|
const btns = <NodeListOf<HTMLButtonElement>>document.querySelectorAll('.filter-trips-js');
|
|
let filterObject = new Map();
|
|
|
|
if(btns) {
|
|
Array.prototype.forEach.call(btns, (btn: HTMLButtonElement) => {
|
|
filterObject.set(btn.dataset.action, btn.ariaPressed);
|
|
|
|
btn.addEventListener('click', () => {
|
|
let filter = sessionStorage.getItem('tripsFilter');
|
|
if(filter) {
|
|
let filterMap = new Map(JSON.parse(filter));
|
|
for (let entry of filterMap.entries()) {
|
|
if(entry[0] === btn.dataset.action && entry[1] !== 'true') {
|
|
filterMap.set(entry[0],'true');
|
|
} else {
|
|
filterMap.set(entry[0],'false');
|
|
}
|
|
}
|
|
sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterMap.entries())));
|
|
}
|
|
resetFilteredElements();
|
|
if(btn.getAttribute('aria-pressed') === 'false'){
|
|
Array.prototype.forEach.call(btns, (b: HTMLButtonElement) => {
|
|
b.setAttribute('aria-pressed', 'false');
|
|
});
|
|
triggerFilterAction(btn.dataset.action);
|
|
} else {
|
|
btn.setAttribute('aria-pressed', 'false');
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
let filter = sessionStorage.getItem('tripsFilter');
|
|
if(filter) {
|
|
let filterMap = new Map(JSON.parse(filter));
|
|
for (let entry of filterMap.entries()) {
|
|
if(entry[1] === 'true') {
|
|
triggerFilterAction(entry[0]);
|
|
}
|
|
}
|
|
} else {
|
|
sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterObject.entries())));
|
|
}
|
|
}
|
|
|
|
function resetFilteredElements() {
|
|
const hiddenElements = document.querySelectorAll('.reset-js.hidden');
|
|
if(hiddenElements) {
|
|
Array.prototype.forEach.call(hiddenElements, (hiddenElement: HTMLButtonElement) => {
|
|
hiddenElement.classList.remove('hidden');
|
|
});
|
|
}
|
|
}
|
|
|
|
function triggerFilterAction(activeFilter: any) {
|
|
const activeBtn = document.querySelector('button[data-action="' + activeFilter + '"]');
|
|
if(activeBtn) {
|
|
activeBtn.setAttribute('aria-pressed', 'true');
|
|
|
|
filterAction(activeFilter);
|
|
}
|
|
}
|
|
|
|
function filterAction(activeFilter: string) {
|
|
switch(activeFilter) {
|
|
case 'filter-days': {
|
|
filterDays();
|
|
break;
|
|
}
|
|
case 'filter-coxs': {
|
|
filterCoxs();
|
|
break;
|
|
}
|
|
case 'filter-months': {
|
|
filterMonths(activeFilter)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function filterDays() {
|
|
const daysNoTrips = document.querySelectorAll('div[data-trips="0"]');
|
|
Array.prototype.forEach.call(daysNoTrips, (day: HTMLElement) => {
|
|
day.classList.toggle('hidden');
|
|
});
|
|
}
|
|
|
|
function filterCoxs() {
|
|
const noCoxNeeded = document.querySelectorAll('div[data-coxneeded="false"]');
|
|
Array.prototype.forEach.call(noCoxNeeded, (notNeeded: HTMLElement) => {
|
|
notNeeded.classList.toggle('hidden');
|
|
});
|
|
}
|
|
|
|
function filterMonths(action: string) {
|
|
const months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
|
|
const monthToggle = <HTMLButtonElement>document.querySelector('button[data-action="' + action + '"]');
|
|
if(monthToggle) {
|
|
const currentMonth = monthToggle.dataset.month;
|
|
|
|
if(currentMonth) {
|
|
const index = months.indexOf(currentMonth);
|
|
if (index > -1) { // only splice array when item is found
|
|
months.splice(index, 1); // 2nd parameter means remove one item only
|
|
}
|
|
|
|
Array.prototype.forEach.call(months, (month: HTMLElement) => {
|
|
const notThisMonth = document.querySelectorAll('div[data-month="' + month + '"]');
|
|
Array.prototype.forEach.call(notThisMonth, (notThisMonth: HTMLElement) => {
|
|
notThisMonth.classList.toggle('hidden');
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
function initSearch() {
|
|
const input = <HTMLInputElement>document.querySelector('#filter-js');
|
|
|
|
if(input) {
|
|
filterElements(input.value);
|
|
|
|
input.addEventListener('input', () => {
|
|
filterElements(input.value);
|
|
});
|
|
}
|
|
}
|
|
|
|
function filterElements(input: string) {
|
|
const elements = document.querySelectorAll('form[data-filterable="true"]');
|
|
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();
|
|
|
|
// bulk hide all elements
|
|
element.style.display = 'none';
|
|
|
|
// show if input matches
|
|
if(filterString?.includes(input.toLocaleLowerCase())) {
|
|
element.style.display = 'flex';
|
|
amountShownElements ++;
|
|
}
|
|
});
|
|
|
|
if(resultWrapper) {
|
|
resultWrapper.innerHTML = (amountShownElements === 0 ? 'Kein Ergebnis gefunden' : '<strong>' + amountShownElements + '</strong>' + (amountShownElements > 1 ? ' Ergebnisse' : ' Ergebnis') + ' gefunden');
|
|
}
|
|
}
|
|
|
|
function initSidebar() {
|
|
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);
|
|
}
|
|
|
|
sidebar.toggle();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function initTripSidebar(triggerElement: HTMLElement) {
|
|
const sidebarElement = <HTMLElement>document.querySelector('#sidebar');
|
|
if(sidebarElement && triggerElement.dataset.body && triggerElement.dataset.header) {
|
|
let body = <HTMLElement>document.querySelector(triggerElement.dataset.body);
|
|
let bodyElement = <HTMLElement>body.cloneNode(true);
|
|
let bodyContainerElement = <HTMLElement>sidebarElement.querySelector('.body-js');
|
|
|
|
/* Quickfix duplicate ids checkboxes */
|
|
const checkboxes = <NodeListOf<HTMLElement>>bodyElement.querySelectorAll('input[type="checkbox"]');
|
|
|
|
Array.prototype.forEach.call(checkboxes, (checkbox: HTMLElement) => {
|
|
if(checkbox) {
|
|
checkbox.parentElement?.setAttribute('for', checkbox.id + 'js');
|
|
checkbox.id += 'js';
|
|
}
|
|
});
|
|
|
|
if(bodyContainerElement) {
|
|
bodyContainerElement.innerHTML = '';
|
|
bodyContainerElement.append(bodyElement);
|
|
}
|
|
if(triggerElement.dataset.day) {
|
|
let hiddenElement = <HTMLInputElement>bodyElement.querySelector('.day-js');
|
|
if(hiddenElement) {
|
|
hiddenElement.value = triggerElement.dataset.day;
|
|
}
|
|
}
|
|
|
|
let headerElement = sidebarElement.querySelector('.header-js');
|
|
if(headerElement) {
|
|
headerElement.innerHTML = triggerElement.dataset.header;
|
|
}
|
|
}
|
|
}
|