remote-party-finder/server/assets/listings.js

166 lines
4.3 KiB
JavaScript
Raw Normal View History

2021-10-04 19:14:40 +00:00
(function () {
2021-10-05 18:36:24 +00:00
let stateWasNull = false;
const state = {
2021-10-07 01:02:31 +00:00
allowed: [],
2021-10-10 17:29:55 +00:00
centre: 'All',
2021-10-05 18:36:24 +00:00
list: null,
2021-10-10 17:42:33 +00:00
lang: null,
2021-10-05 18:36:24 +00:00
};
function addJsClass() {
document.children[0].className = 'js';
2021-10-04 19:14:40 +00:00
}
2021-10-05 18:36:24 +00:00
function saveLoadState() {
let saved = localStorage.getItem('state');
if (saved !== null) {
try {
saved = JSON.parse(saved);
2021-10-07 01:02:31 +00:00
if (!Array.isArray(saved.allowed)) {
saved = {};
stateWasNull = true;
}
2021-10-05 18:36:24 +00:00
} catch (e) {
2021-10-07 01:02:31 +00:00
saved = {};
2021-10-05 18:36:24 +00:00
stateWasNull = true;
}
for (let key in saved) {
state[key] = saved[key];
}
} else {
stateWasNull = true;
}
window.addEventListener('pagehide', () => {
let copy = {};
for (let key in state) {
if (key === 'list') {
continue;
}
copy[key] = state[key];
}
localStorage.setItem('state', JSON.stringify(copy));
});
}
function reflectState() {
let category = document.getElementById('category-filter');
for (let option of category.options) {
if (stateWasNull) {
2021-10-07 01:02:31 +00:00
console.log('was null');
state.allowed.push(option.value);
2021-10-05 18:36:24 +00:00
}
2021-10-07 01:02:31 +00:00
option.selected = state.allowed.includes(option.value);
2021-10-05 18:36:24 +00:00
}
let dataCentre = document.getElementById('data-centre-filter');
dataCentre.value = state.centre;
2021-10-10 17:29:55 +00:00
let language = document.getElementById('language');
2021-10-10 17:42:33 +00:00
if (state.lang === null) {
state.lang = language.dataset.accept;
}
2022-05-08 21:41:03 +00:00
let cookie = document.cookie
.split(';')
.find(row => row.trim().startsWith('lang='));
if (cookie !== undefined) {
state.lang = decodeURIComponent(cookie.split('=')[1]);
}
2021-10-05 18:36:24 +00:00
}
function setUpList() {
let options = {
valueNames: [
'duty',
'creator',
'description',
{data: ['centre']},
],
};
return new List('container', options);
2021-10-04 22:01:11 +00:00
}
2021-10-05 18:36:24 +00:00
function refilter() {
function categoryFilter(item) {
2021-10-07 01:02:31 +00:00
let category = item.elm.dataset.pfCategory;
2021-10-05 18:36:24 +00:00
2021-10-07 01:02:31 +00:00
return category === 'unknown' || state.allowed.includes(category);
2021-10-05 18:36:24 +00:00
}
function dataCentreFilter(item) {
return state.centre === "All" || state.centre === item.values().centre;
}
state.list.filter(item => dataCentreFilter(item) && categoryFilter(item));
}
function setUpDataCentreFilter() {
let select = document.getElementById('data-centre-filter');
let dataCentres = {};
for (let elem of document.querySelectorAll('#listings > .listing')) {
let centre = elem.dataset['centre'];
if (!dataCentres.hasOwnProperty(centre)) {
dataCentres[centre] = 0;
}
dataCentres[centre] += 1;
}
for (let opt of select.options) {
let centre = opt.value;
let count = 0;
if (dataCentres.hasOwnProperty(centre)) {
count = dataCentres[centre];
}
if (centre === 'All') {
count = Object.values(dataCentres).reduce((a, b) => a + b, 0);
}
opt.innerText += ` (${count})`;
2021-10-04 19:14:40 +00:00
}
select.addEventListener('change', () => {
2021-10-05 18:36:24 +00:00
state.centre = select.value;
refilter();
});
}
2021-10-05 18:36:24 +00:00
function setUpCategoryFilter() {
let select = document.getElementById('category-filter');
select.addEventListener('change', () => {
2021-10-07 01:02:31 +00:00
let allowed = [];
for (let option of select.options) {
if (!option.selected) {
continue;
}
2021-10-07 01:02:31 +00:00
let category = option.value;
allowed.push(category);
2021-10-05 18:36:24 +00:00
}
2021-10-05 18:36:24 +00:00
state.allowed = allowed;
refilter();
2021-10-04 19:14:40 +00:00
});
}
addJsClass();
2021-10-05 18:36:24 +00:00
saveLoadState();
reflectState();
state.list = setUpList();
setUpDataCentreFilter();
setUpCategoryFilter();
refilter();
2021-10-04 19:14:40 +00:00
})();