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

/**
* 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: {}
}