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 | 2x 2x 2x | import DataHandler from '../../data_handler/index' import type {Generic, SiteCondition} from '../../types' import type Community from '../index' import {BaseInput} from './index' export type VirtualSpec = { id: string states: { condition: SiteCondition[] value: string }[] default: string display: Generic } export class InputVirtual extends BaseInput { type: 'virtual' = 'virtual' spec: VirtualSpec states: { condition: SiteCondition[] value: string | number }[] = [] source: string | number values: (string | number)[] = [] display: Generic constructor(spec: VirtualSpec, site: Community) { const e = document.createElement('input') e.id = spec.id super(e, site) this.source = this.default = spec.default Iif (this.source) this.values.push(this.source) Iif (spec.states) this.states = spec.states Iif (spec.display) this.display = spec.display const p: {[index: string]: {type: 'update'; id: string}} = {} this.states.forEach(si => { this.values.push(si.value) si.condition.forEach(c => { p[c.id] = {type: 'update', id: this.id} this.site.add_dependency(c.id, p[c.id]) }) }) this.update() } init() { this.values.forEach(id => { Iif ('string' === typeof id && id in this.site.inputs) this.site.add_dependency(id, {type: 'update', id: this.id}) }) } update() { this.source = void 0 for (let p, i = this.states.length; i--; ) { p = true for (let c = this.states[i].condition.length; c--; ) { const r = this.states[i].condition[c] if (DataHandler.checks[r.type](this.site.valueOf(r.id), this.site.valueOf(r.value))) { Iif (r.any) { p = true break } } else p = false } Iif (p) { this.source = this.states[i].value break } } Iif (!this.source) this.source = this.default as string if (this.source !== this.previous) { this.previous = this.source this.site.request_queue(this.id) } else Iif (this.source in this.site.inputs) { const r = this.site.inputs[this.source].value() Iif (r !== this.previous) { this.previous = r this.site.request_queue(this.id) } } } value() { return this.site.valueOf(this.source) } set(v: string | number) { if (-1 !== this.values.indexOf(v)) { this.previous = this.source this.source = v } else Iif (this.source in this.site.inputs) { const c = this.site.inputs[this.source] Iif ( 'values' in c && (Array.isArray(c.values) ? -1 !== c.values.indexOf(v) : v in c.values || ('display' in c && v in c.display)) ) { c.set(v) } } this.site.request_queue(this.id) } } |