diff --git a/code/html/src/sensor.mjs b/code/html/src/sensor.mjs index 8103c202..c3b8c663 100644 --- a/code/html/src/sensor.mjs +++ b/code/html/src/sensor.mjs @@ -12,6 +12,7 @@ import { prepareEnumerableTarget, resetGroupElement, setChangedElement, + setIgnoredElement, setOriginalFromValue, setSelectValue, variableListeners, @@ -428,6 +429,7 @@ function initMagnitudesExpected(id) { expected.name += info.key; expected.id = expected.name; expected.dataset["id"] = info.id.toString(); + setIgnoredElement(expected); const [message] = /** @type {NodeListOf} */ (template.querySelectorAll(`span.emon-expected-${info.prefix}`)); diff --git a/code/html/src/settings.mjs b/code/html/src/settings.mjs index 44bc66a4..94557df2 100644 --- a/code/html/src/settings.mjs +++ b/code/html/src/settings.mjs @@ -54,7 +54,7 @@ export function resetChangedElement(elem) { * @param {HTMLElement} elem */ function resetGroupPending(elem) { - elem.dataset["settingsGroupPending"] = ""; + delete elem.dataset["settingsGroupPending"]; } // Right now, group additions happen from: @@ -137,16 +137,34 @@ export function resetGroupElement(elem) { /** * @param {HTMLElement} elem + * @returns {boolean} */ export function isGroupElement(elem) { return elem.dataset[SETTINGS_GROUP_ELEMENT] !== undefined; } +const SETTINGS_IGNORED_ELEMENT = "settingsIgnore"; + /** * @param {HTMLElement} elem */ -function isIgnoredElement(elem) { - return elem.dataset["settingsIgnore"] !== undefined; +export function setIgnoredElement(elem) { + elem.dataset[SETTINGS_IGNORED_ELEMENT] = "true"; +} + +/** + * @param {HTMLElement} elem + */ +export function resetIgnoredElement(elem) { + delete elem.dataset[SETTINGS_IGNORED_ELEMENT]; +} + +/** + * @param {HTMLElement} elem + * @returns {boolean} + */ +export function isIgnoredElement(elem) { + return elem.dataset[SETTINGS_IGNORED_ELEMENT] !== undefined; } /** @@ -432,6 +450,22 @@ function groupSettingsCleanup(container, keys) { * @typedef {{[k: string]: DataValue}} SetRequest */ +/** + * @param {string | number |boolean} value + * @returns {DataValue} + */ +function maybeAdjustDataValue(value) { + if (typeof value === "boolean") { + return value ? 1 : 0; + } + + if (typeof value === "number" && isNaN(value)) { + return "nan"; + } + + return value; +} + /** * specific 'key' string to remove from the device settings storage * @typedef {string} DelRequest @@ -478,6 +512,10 @@ export function getData(forms, {cleanup = true, assumeChanged = false} = {}) { continue; } + if (elem instanceof HTMLInputElement && elem.readOnly) { + continue; + } + const name = elem.dataset["settingsRealName"] || elem.name; if (!name) { continue; @@ -506,11 +544,8 @@ export function getData(forms, {cleanup = true, assumeChanged = false} = {}) { const data_name = group_element ? group_name : name; - // TODO small value optimization, so booleans always take 1 byte in the resulting json - const data_value = (typeof value === "boolean") - ? (value ? 1 : 0) : value; - - data[data_name] = data_value; + // fixing outgoing data, when it is necessary + data[data_name] = maybeAdjustDataValue(value); } } } diff --git a/code/html/src/template-sns.html b/code/html/src/template-sns.html index b757ba78..08418e75 100644 --- a/code/html/src/template-sns.html +++ b/code/html/src/template-sns.html @@ -28,7 +28,7 @@
- + diff --git a/code/html/src/validate.mjs b/code/html/src/validate.mjs index ed4f3ed4..d7f7c845 100644 --- a/code/html/src/validate.mjs +++ b/code/html/src/validate.mjs @@ -1,4 +1,4 @@ -import { isChangedElement, getElements } from './settings.mjs'; +import { isChangedElement, isIgnoredElement, getElements } from './settings.mjs'; import { showPanel } from './core.mjs'; import { formPassPair, @@ -126,7 +126,7 @@ export function validateFormsPasswords(forms, {strict = true, assumeChanged = fa export function validateFormsReportValidity(forms) { const elems = forms .flatMap((form) => getElements(form)) - .filter(isChangedElement) + .filter((x) => isChangedElement(x) && !isIgnoredElement(x)) if (!elems.length) { return false;