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)) } } |