You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.8 KiB
150 lines
3.8 KiB
/**
|
|
* 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<string>}
|
|
*/
|
|
this.keys = (object ? Object.keys(object) : []);
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
this.objects = (object ? object : {});
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {Array<string>} 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<string,any>} attrs
|
|
* @param {Object} intoContainer
|
|
* @param {Function<string, any, Object>} 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-<extension-name>)
|
|
*/
|
|
extensions: {}
|
|
}
|
|
|