Files
old-holivud2/app/assets/javascripts/collapse_state.js
2020-05-31 22:38:19 +02:00

65 lines
1.8 KiB
JavaScript

if (typeof(Storage) !== "undefined") {
class CollapseState {
static get _KEY() { return "collapseState"; }
set(id, value) {
const state = this._state;
state[id] = value;
window.localStorage.setItem(CollapseState._KEY, JSON.stringify(state));
}
get(id) {
const state = this._state;
return state[id];
}
get _state() {
if (window.localStorage.getItem(CollapseState._KEY) === null) {
window.localStorage.setItem(CollapseState._KEY, JSON.stringify({}));
}
const data = window.localStorage.getItem(CollapseState._KEY);
return JSON.parse(data);
}
}
// EVENT HANDLER - Store state when element is hidden
$(document).on("hidden.bs.collapse", (event) => {
const state = new CollapseState();
state.set(event.target.id, "hide");
});
// EVENT HANDLER - Store state when element is shown
$(document).on("shown.bs.collapse", (event) => {
const state = new CollapseState();
state.set(event.target.id, "show");
});
// Set initial state of elements from storage
$(document).on("turbolinks:load", function() {
const state = new CollapseState();
const collapsibles = document.querySelectorAll("[data-toggle=collapse][data-behavior=stateful]");
collapsibles.forEach( (collapsible) => {
const targetSelector = collapsible.dataset.target.toString().replace("#", "");
const target = document.getElementById(targetSelector);
const value = state.get(target.id);
switch (value) {
case "show":
collapsible.classList.remove("collapsed");
target.classList.add("show");
break;
case "hide":
collapsible.classList.add("collapsed");
target.classList.remove("show");
break;
}
})
});
} else {
console.log("No Web Storage support..");
}