/** * This file is part of the jps-like-websites lib * URL: https://git.labos.goip.de/chris/jpc-like-websites * @copyright by its creator Christian Martin */ /** * */ class ObjectAccessObject { /** * * @param {Object} object */ constructor(object = null) { /** * @type {Array} */ this.keys = (object ? Object.keys(object) : []); /** * @type {Object} */ this.objects = (object ? object : {}); } /** * * @param {Array} keyArr * @param {Object} refObject * @returns */ fillByArrayReference(keyArr, refObject) { this.keys = keyArr; refObject = keyArr.reduce((a, c) => Object.assign(a, { [c]: refObject[c] }), {}); return this; } /** * * @param {string} key * @param {*} value * @returns {ObjectAccessObject} */ add(key, value) { this.objects[key, value]; this.keys.push(key); return this; } /** * * @param {string} key * @returns {*} */ remove(key) { let tmp = this.objects[key]; delete this.objects[key]; return tmp; } } /** * */ const helperFun = { /** * Iterates over the keys of attrs, * extracts the corresponding value * and applies the callback (cb) on it in the order (key, value, targetContainer) * @extends StyleAndScriptStoringComponent * @param {map} attrs * @param {Object} intoContainer * @param {Function} cb * @returns {Object} the filled container */ fillAttrsInContainerByCb: function (attrs, intoContainer, cb) { let keys = Object.keys(attrs); for (let i = 0; i < keys.length; i++) { cb(keys[i], attrs[keys[i]], intoContainer); } return intoContainer; }, /** * * @param {HTMLElement} element * @returns {string} */ getHigherCompSelector: function (element) { let dac = "data-autocompel"; let hcompel = element.closest('[data-compel-ishcompel="true"]'); return `[${dac}="${hcompel.getAttribute(dac)}"]`; }, /** * * @param {string} selector * @returns {boolean} [ensureHidden=false] for true element is now hidden and false it is not hidden. */ toggleSelectorElementVisibility: function (selector, ensureHidden = false) { /** * @type {HTMLElement} */ let el = document.querySelector(selector); let name = el.getAttribute("data-autocompel"); console.log("De-/hiding", name, selector); return helperFun.toggleElementVisibility(el, ensureHidden); }, /** * (De-) hides the given element. * On ensureHidden=true it will be hidden regardless of the current state. * * @param {HTMLElement} element * @param {boolean} ensureHidden * @returns {boolean} */ toggleElementVisibility: function (element, ensureHidden = false) { element.classList.toggle("compel-mech-hidden"); let isNowHidden = false; if (element.hasAttribute("hidden")) { element.removeAttribute("hidden"); element.style["display"] = "flex"; isNowHidden = false; } else { element.setAttribute("hidden", "hidden"); element.style.removeProperty("display"); isNowHidden = true; } if (ensureHidden && !isNowHidden) { return helperFun.toggleSelectorElementVisibility(selector) } else { return isNowHidden; } }, /** * Contains helperFun functions from the installed/loaded extensions * (jpclwe-) */ extensions: {} }