[WIP] filter btns session storage
This commit is contained in:
parent
b4cd6f3231
commit
25a27b492c
117
frontend/main.ts
117
frontend/main.ts
@ -8,41 +8,105 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
});
|
||||
|
||||
function initToggle() {
|
||||
const toggle = <HTMLInputElement>document.querySelector('#filterdays-js');
|
||||
// get filter btns & set object sessionStorage
|
||||
const btns = <NodeListOf<HTMLButtonElement>>document.querySelectorAll('.filter-trips-js');
|
||||
let filterObject = new Map();
|
||||
|
||||
if(toggle) {
|
||||
toggle.addEventListener('click', () => {
|
||||
toggle.ariaPressed = (toggle.ariaPressed === 'true') ? 'false' : 'true';
|
||||
toggle.setAttribute('aria-pressed', toggle.ariaPressed);
|
||||
|
||||
const daysNoTrips = document.querySelectorAll('div[data-trips="0"]');
|
||||
Array.prototype.forEach.call(daysNoTrips, (day: HTMLElement) => {
|
||||
day.classList.toggle('hidden');
|
||||
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) {
|
||||
filterMap.set(entry[0],'true');
|
||||
} else {
|
||||
filterMap.set(entry[0],'false');
|
||||
}
|
||||
}
|
||||
sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterMap.entries())));
|
||||
}
|
||||
resetFilteredElements();
|
||||
console.log(btn.ariaPressed);
|
||||
if(btn.ariaPressed === 'false'){
|
||||
Array.prototype.forEach.call(btns, (b: HTMLButtonElement) => {
|
||||
b.setAttribute('aria-pressed', 'false');
|
||||
});
|
||||
triggerFilterAction(btn.dataset.action);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const coxToggle = <HTMLInputElement>document.querySelector('#filtertrips-js');
|
||||
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())));
|
||||
}
|
||||
}
|
||||
|
||||
if(coxToggle) {
|
||||
coxToggle.addEventListener('click', () => {
|
||||
coxToggle.ariaPressed = (coxToggle.ariaPressed === 'true') ? 'false' : 'true';
|
||||
coxToggle.setAttribute('aria-pressed', coxToggle.ariaPressed);
|
||||
|
||||
const noCoxNeeded = document.querySelectorAll('div[data-coxneeded="false"]');
|
||||
Array.prototype.forEach.call(noCoxNeeded, (notNeeded: HTMLElement) => {
|
||||
notNeeded.classList.toggle('hidden');
|
||||
});
|
||||
function resetFilteredElements() {
|
||||
const hiddenElements = document.querySelectorAll('.reset-js.hidden');
|
||||
if(hiddenElements) {
|
||||
Array.prototype.forEach.call(hiddenElements, (hiddenElement: HTMLButtonElement) => {
|
||||
hiddenElement.classList.remove('hidden');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const monthToggle = <HTMLInputElement>document.querySelector('#filtermonth-js');
|
||||
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) {
|
||||
monthToggle.addEventListener('click', () => {
|
||||
monthToggle.ariaPressed = (monthToggle.ariaPressed === 'true') ? 'false' : 'true';
|
||||
monthToggle.setAttribute('aria-pressed', monthToggle.ariaPressed);
|
||||
const currentMonth = monthToggle.dataset.month;
|
||||
|
||||
if(currentMonth) {
|
||||
@ -58,9 +122,8 @@ function initToggle() {
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function initSearch() {
|
||||
const input = <HTMLInputElement>document.querySelector('#filter-js');
|
||||
|
@ -12,15 +12,15 @@
|
||||
|
||||
{% if loggedin_user.is_cox %}
|
||||
<div class="sm:col-span-2 lg:col-span-3 grid md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-3">
|
||||
<button type="button" title="Toggle View" class="group btn btn-primary" id="filterdays-js" aria-pressed="false">
|
||||
<button type="button" title="Toggle View" class="group btn btn-primary filter-trips-js" data-action="filter-days" id="filterdays-js" aria-pressed="false">
|
||||
{% include "includes/funnel-icon" %}
|
||||
Tage mit Ausfahrten
|
||||
</button>
|
||||
<button type="button" title="Toggle View" class="group btn btn-primary" id="filtertrips-js" aria-pressed="false">
|
||||
<button type="button" title="Toggle View" class="group btn btn-primary filter-trips-js" data-action="filter-coxs" id="filtertrips-js" aria-pressed="false">
|
||||
{% include "includes/funnel-icon" %}
|
||||
Steuerleute gesucht
|
||||
</button>
|
||||
<button type="button" title="Toggle View" class="group btn btn-primary" id="filtermonth-js" aria-pressed="false" data-month="{{ now() | date(format='%m') }}">
|
||||
<button type="button" title="Toggle View" class="group btn btn-primary filter-trips-js" data-action="filter-months" id="filtermonth-js" aria-pressed="false" data-month="{{ now() | date(format='%m') }}">
|
||||
{% include "includes/funnel-icon" %}
|
||||
Aktuellen Monat anzeigen
|
||||
</button>
|
||||
@ -37,7 +37,7 @@
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<div class="bg-white p-3 rounded-md flex justify-between flex-col shadow" style="min-height: 10rem;" data-trips="{{ amount_trips }}" data-month="{{ day.day| date(format='%m') }}" data-coxneeded="{{ day_cox_needed }}">
|
||||
<div class="bg-white p-3 rounded-md flex justify-between flex-col shadow reset-js" style="min-height: 10rem;" data-trips="{{ amount_trips }}" data-month="{{ day.day| date(format='%m') }}" data-coxneeded="{{ day_cox_needed }}">
|
||||
<div>
|
||||
<h2 class="font-bold uppercase tracking-wide text-center text-primary-950 text-lg">{{ day.day| date(format="%d.%m.%Y") }}
|
||||
<small class="inline-block ml-1 text-xs text-gray-400">{{ day.day | date(format="%A", locale="de_AT") }}</small>
|
||||
@ -146,7 +146,7 @@
|
||||
{% if day.trips | length > 0 %}
|
||||
<div class="grid grid-cols-1 gap-3 divide-y mb-3">
|
||||
{% for trip in day.trips %}
|
||||
<div class="pt-2" data-coxneeded="false">
|
||||
<div class="pt-2 reset-js" data-coxneeded="false">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<strong class="text-primary-900">{{ trip.planned_starting_time }} Uhr</strong> <small
|
||||
@ -181,31 +181,30 @@
|
||||
{# --- START Sidebar Content --- #}
|
||||
<div class="hidden">
|
||||
<div id="trip{{ trip.trip_details_id }}">
|
||||
{% if trip.max_people > 0 %}
|
||||
{% set amount_cur_rower = trip.rower | length %}
|
||||
{{ macros::box(participants=trip.rower, empty_seats=trip.max_people - amount_cur_rower, bg='primary-100', color='black') }}
|
||||
|
||||
{# --- START Edit Form --- #}
|
||||
{% if trip.cox_id == loggedin_user.id %}
|
||||
<div class="bg-gray-100 p-3 mt-4 rounded-md">
|
||||
<h3 class="text-primary-950 font-bold uppercase tracking-wide mb-2">Ausfahrt bearbeiten</h3>
|
||||
<form action="/cox/trip/{{ trip.id }}" method="post" class="grid gap-3">
|
||||
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=trip.max_people) }}
|
||||
{{ macros::input(label='Anmerkungen', name='notes', type='input', required=true, value=trip.notes) }}
|
||||
<input value="Bearbeiten" class="btn btn-primary" type="submit" />
|
||||
</form>
|
||||
</div>
|
||||
{% if trip.rower | length == 0 %}
|
||||
<div class="text-right mt-6">
|
||||
<a href="/cox/remove/trip/{{ trip.id }}" class="inline-block btn btn-alert">
|
||||
{% include "includes/delete-icon" %}
|
||||
Termin löschen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if amount_cur_rower > 0 %}
|
||||
{{ macros::box(participants=trip.rower, empty_seats=trip.max_people - amount_cur_rower, bg='primary-100', color='black') }}
|
||||
{% endif %}
|
||||
{# --- START Edit Form --- #}
|
||||
{% if trip.cox_id == loggedin_user.id %}
|
||||
<div class="bg-gray-100 p-3 mt-4 rounded-md">
|
||||
<h3 class="text-primary-950 font-bold uppercase tracking-wide mb-2">Ausfahrt bearbeiten</h3>
|
||||
<form action="/cox/trip/{{ trip.id }}" method="post" class="grid gap-3">
|
||||
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=trip.max_people) }}
|
||||
{{ macros::input(label='Anmerkungen', name='notes', type='input', value=trip.notes) }}
|
||||
<input value="Bearbeiten" class="btn btn-primary" type="submit" />
|
||||
</form>
|
||||
</div>
|
||||
{% if trip.rower | length == 0 %}
|
||||
<div class="text-right mt-6">
|
||||
<a href="/cox/remove/trip/{{ trip.id }}" class="inline-block btn btn-alert">
|
||||
{% include "includes/delete-icon" %}
|
||||
Termin löschen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{# --- END Edit Form --- #}
|
||||
{% endif %}
|
||||
{# --- END Edit Form --- #}
|
||||
</div>
|
||||
</div>
|
||||
{# --- END Sidebar Content --- #}
|
||||
|
Loading…
Reference in New Issue
Block a user