Skip to content
25 changes: 22 additions & 3 deletions dashboard/src/components/shared/ConfigItemRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@
>
<v-slider
v-if="itemMeta?.slider"
:model-value="toNumber(numericTemp ?? modelValue)"
@update:model-value="val => { numericTemp = val; emitUpdate(toNumber(val)) }"
:model-value="toValidNumber(numericTemp ?? modelValue)"
@update:model-value="val => { numericTemp = val; emitUpdate(toValidNumber(val)) }"
@end="numericTemp = null"
:min="itemMeta?.slider?.min ?? 0"
:max="itemMeta?.slider?.max ?? 100"
Expand All @@ -161,7 +161,7 @@
<v-text-field
:model-value="numericTemp ?? modelValue"
@update:model-value="val => (numericTemp = val)"
@blur="() => { if (numericTemp != null) { emitUpdate(toNumber(numericTemp)) } numericTemp = null }"
@blur="handleNumericBlur"
density="compact"
variant="outlined"
class="config-field"
Expand Down Expand Up @@ -278,6 +278,25 @@ function emitUpdate(val) {
emit('update:modelValue', val)
}

function toValidNumber(val) {
if (val === null || val === undefined || val === '') {
return 0
}
if (typeof val === 'number') {
return isNaN(val) ? 0 : val
}
const n = Number(val)
return Number.isFinite(n) ? n : 0
}

function handleNumericBlur() {
const hasValidInput = numericTemp.value !== null && numericTemp.value !== undefined && numericTemp.value !== ''
if (hasValidInput) {
emitUpdate(toValidNumber(numericTemp.value))
}
numericTemp.value = null
}

function toNumber(val) {
const n = parseFloat(val)
return isNaN(n) ? 0 : n
Expand Down