Prefs managing mostly done
This commit is contained in:
parent
81d02b82dc
commit
74851b9c4d
6 changed files with 344 additions and 51 deletions
|
|
@ -1,7 +1,17 @@
|
|||
/* Use data-el or data-field attribute.
|
||||
* Element with data-el="hum-ding" is accessible as this.elHumDing and fields with
|
||||
* data-field="long-dong" as this.fieldLongDong.
|
||||
*
|
||||
* All field values can be retrieved with fieldValues() and uses the data-field attribute
|
||||
* as LongDong as key.
|
||||
*/
|
||||
|
||||
export class CustomHTMLElement extends HTMLElement {
|
||||
constructor(useShadow) {// {{{
|
||||
super()
|
||||
|
||||
this._fields = new Map()
|
||||
|
||||
const workOn = useShadow ? this.attachShadow({ mode: 'open' }) : this
|
||||
workOn.appendChild(this.constructor.tmpl.content.cloneNode(true))
|
||||
workOn.querySelectorAll('*').forEach(el => {
|
||||
|
|
@ -9,6 +19,7 @@ export class CustomHTMLElement extends HTMLElement {
|
|||
if (field !== undefined) {
|
||||
const fieldName = this.toElementName('field', field)
|
||||
this[fieldName] = el
|
||||
this._fields.set(this.toElementName('', field), el)
|
||||
}
|
||||
|
||||
const name = el.dataset.el
|
||||
|
|
@ -19,39 +30,22 @@ export class CustomHTMLElement extends HTMLElement {
|
|||
}
|
||||
})
|
||||
}// }}}
|
||||
allFields() {// {{{
|
||||
return this._fields
|
||||
}// }}}
|
||||
fieldValues() {// {{{
|
||||
const state = {}
|
||||
for (const [name, field] of this._fields) {
|
||||
if (field.tagName.toLowerCase() == 'input' && field.getAttribute('type').toLowerCase() == 'checkbox')
|
||||
state[name] = field.checked
|
||||
else
|
||||
state[name] = field.value
|
||||
|
||||
}
|
||||
return state
|
||||
}// }}}
|
||||
toElementName(prefix, str) {// {{{
|
||||
str = prefix + '-' + str
|
||||
return str.replace(/-(id|[a-z])/g, match => match.toUpperCase().replace('-', ''))
|
||||
}// }}}
|
||||
}
|
||||
|
||||
export class StupidPreactCustomHTMLElement extends HTMLElement {
|
||||
constructor() {// {{{
|
||||
super()
|
||||
|
||||
// Stupid stuff because of Preact.
|
||||
this.clonedNodes = this.constructor.tmpl.content.cloneNode(true)
|
||||
this.clonedNodes.querySelectorAll('*').forEach(el => {
|
||||
const field = el.dataset.field
|
||||
if (field !== undefined) {
|
||||
const fieldName = this.toElementName('field', field)
|
||||
this[fieldName] = el
|
||||
}
|
||||
|
||||
const name = el.dataset.el
|
||||
if (name !== undefined) {
|
||||
const elName = this.toElementName('el', name)
|
||||
this[elName] = el
|
||||
el.classList.add('el-' + name)
|
||||
}
|
||||
})
|
||||
}// }}}
|
||||
toElementName(prefix, str) {// {{{
|
||||
str = prefix + '-' + str
|
||||
return str.replace(/-(id|[a-z])/g, match => match.toUpperCase().replace('-', ''))
|
||||
}// }}}
|
||||
connectedCallback() {// {{{
|
||||
// Stupid stuff because of Preact.
|
||||
this.appendChild(this.clonedNodes)
|
||||
}// }}}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue