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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | 2x 2x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x | import {BaseInput} from './index'
import type Community from '../index'
import type {LogicalObject} from '../../types'
export type NumberSpec = {}
export class InputNumber extends BaseInput {
type: 'number' = 'number'
e: HTMLInputElement
default: string | number
source: number
parsed = {min: -Infinity, max: Infinity}
min: string | number
default_min: boolean
min_ref: number
min_indicator?: HTMLElement
max: string | number
default_max: boolean
max_ref: number
max_indicator?: HTMLElement
step?: number
current_default: number
previous: number
off_default?: boolean
value: () => number
ref: boolean
range: [number, number]
depends: LogicalObject
constructor(e: HTMLElement, site: Community) {
super(e, site)
this.listen = this.listen.bind(this)
e.addEventListener('change', this.listen)
this.update = this.update.bind(this)
const up = e.parentElement.parentElement.querySelector('.number-up')
const down = e.parentElement.parentElement.querySelector('.number-down')
Iif (down) {
down.addEventListener('click', () => {
this.set(Math.max(this.parsed.min, this.value() - 1))
})
}
Iif (up) {
up.addEventListener('click', () => {
this.set(Math.min(this.parsed.max, this.value() + 1))
})
}
}
get() {
this.set(this.e.value)
}
set(v: string | number, check?: boolean) {
if (!v) v = null
Iif ('string' === typeof v) v = parseFloat(v)
if (isFinite(v) && v !== this.source) {
this.previous = parseFloat(this.e.value)
Iif (check) {
if (isFinite(this.parsed.min) && v < this.parsed.min) {
v = this.parsed.min
} else Iif (isFinite(this.parsed.max) && v > this.parsed.max) {
v = this.parsed.max
}
}
this.off_default = v !== this.current_default
this.source = v
this.e.value = v + ''
this.current_index = v - this.parsed.min
Iif ('range' === this.e.type) {
;(this.e.nextElementSibling.firstElementChild as HTMLElement).innerText = this.e.value
}
this.site.request_queue(this.id)
}
}
listen() {
this.set(this.e.value, true)
}
async update() {
const view = this.site.dataviews[this.view],
variable = this.site.valueOf(this.variable || view.y) as string
// if (!view.time_range) view.time_range = {time: []}
let d = view.get ? view.get.dataset() : (this.site.valueOf(this.dataset) as string),
min = (this.site.valueOf(this.min) || view.time) as string | number | undefined,
max = (this.site.valueOf(this.max) || view.time) as string | number | undefined
Iif ('string' === typeof min && this.site.patterns.minmax.test(min))
min = (this.site.inputs[this.min] as InputNumber).min
Iif ('string' === typeof max && this.site.patterns.minmax.test(max))
max = (this.site.inputs[this.max] as InputNumber).max
this.parsed.min = isNaN(this.min_ref)
? 'undefined' === typeof min
? view.time_range.time[0]
: 'number' === typeof min
? min
: min in this.site.data.variables
? this.site.data.variables[min].info[d || this.site.data.variables[min].datasets[0]].min
: parseFloat(min)
: this.min_ref
this.parsed.max = isNaN(this.max_ref)
? 'undefined' === typeof max
? view.time_range.time[1]
: 'number' === typeof max
? max
: max in this.site.data.variables
? this.site.data.variables[max].info[d || this.site.data.variables[max].datasets[0]].max
: parseFloat(max)
: this.min_ref
if (this.default_min) {
this.current_default = this.parsed.min
} else Iif (this.default_max) {
this.current_default = this.parsed.max
}
if (this.ref && variable in this.site.data.variables) {
this.range[0] = isNaN(this.min_ref) ? Math.max(view.time_range.time[0], this.parsed.min) : this.min_ref
this.e.min = this.range[0] + ''
this.range[1] = isNaN(this.max_ref) ? Math.min(view.time_range.time[1], this.parsed.max) : this.max_ref
this.e.max = this.range[1] + ''
Iif (!this.depends[view.y]) {
this.depends[view.y] = true
this.site.add_dependency(view.y, {type: 'update', id: this.id})
}
Iif (this.source > this.parsed.max || this.source < this.parsed.min) this.reset()
// this.variable = await this.site.data.get_variable(variable, this.view)
} else {
this.e.min = this.parsed.min + ''
Iif (this.parsed.min > this.source || (!this.source && this.default_min)) this.set(this.parsed.min)
this.e.max = this.parsed.max + ''
Iif (this.parsed.max < this.source || (!this.source && this.default_max)) this.set(this.parsed.max)
}
}
}
|