Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | 2x 2x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 3x 3x 7x 7x 7x 7x 7x 7x 49x 49x 7x 7x 14x 14x 14x | import {tooltip_trigger} from '../utils'
import type {LogicalObject, SiteRule, SiteSpec} from '../../types'
import type Community from '../index'
import type {InputButton} from './button'
import type {InputButtonGroup} from './buttongroup'
import type {InputCheckbox} from './checkbox'
import type {InputCombobox} from './combobox'
import type {InputNumber} from './number'
import type {InputRadio} from './radio'
import type {InputSelect} from './select'
import type {InputVirtual} from './virtual'
import type {InputSwitch} from './switch'
import type {InputText} from './text'
type InputTypes =
| 'number'
| 'radio'
| 'switch'
| 'checkbox'
| 'button'
| 'text'
| 'buttongroup'
| 'select'
| 'combobox'
| 'virtual'
export type SiteInputs =
| InputCombobox
| InputSelect
| InputNumber
| InputButton
| InputVirtual
| InputRadio
| InputText
| InputSwitch
| InputCheckbox
| InputButtonGroup
export type RegisteredInputs = {[index: string]: SiteInputs}
export abstract class BaseInput {
type: InputTypes
input = true
site: Community
e: HTMLElement
wrapper: HTMLElement
id: string
settings: {[index: string]: any} = {}
default: string | string[] | number
source: boolean | string | number | (string | number)[]
optionSource: string
subset: string
selection_subset: string
depends: string | LogicalObject
variable: string
dataset: string
view: string
note: string
current_index: number | number[] = -1
previous: boolean | string | number | (string | number)[] = ''
state = 'initial'
setting?: string
deferred?: boolean
rule?: SiteRule
constructor(e: HTMLElement, site: Community) {
this.e = e
this.site = site
this.default = e.dataset.default
this.optionSource = e.dataset.optionsource
this.subset = e.dataset.subset || 'all'
this.selection_subset = e.dataset.selectionsubset || this.subset
this.depends = e.dataset.depends
this.variable = e.dataset.variable
this.dataset = e.dataset.dataset
this.view = e.dataset.view
this.id = e.id || this.optionSource || 'ui' + site.page.elementCount++
this.note = e.getAttribute('aria-description') || ''
this.type = e.dataset.autotype as InputTypes
if (this.type in site.spec) {
const spec = site.spec[this.type as keyof SiteSpec] as SiteInputs
if (this.id in spec) this.settings = (spec as any)[this.id]
}
if (e.parentElement)
this.wrapper = e.parentElement.classList.contains('wrapper') ? e.parentElement : e.parentElement.parentElement
if (this.wrapper) {
Iif (this.note) this.wrapper.classList.add('has-note')
this.wrapper.setAttribute('data-of', this.id)
;['div', 'span', 'label', 'fieldset', 'legend', 'input', 'button'].forEach(type => {
const c = this.wrapper.querySelectorAll(type)
if (c.length) c.forEach(ci => ci.setAttribute('data-of', this.id))
})
}
Iif (this.note) {
const trigger = tooltip_trigger.bind(this)
this.wrapper.addEventListener('mouseover', trigger)
const p = 'DIV' !== e.tagName ? e : e.querySelector('input')
Iif (p) {
p.addEventListener('focus', trigger)
p.addEventListener('blur', this.site.page.tooltip_clear)
}
}
Iif (site.patterns.number.test(this.default)) this.default = +this.default
}
value() {
Iif (Array.isArray(this.source)) return this.source
const v = this.site.valueOf(this.source)
return 'undefined' === typeof v ? this.site.valueOf(this.default) : v
}
set(v: any) {
this.source = v
}
reset() {
this.set(this.site.valueOf(this.default))
}
}
|