diff --git a/code/html/src/schedule.mjs b/code/html/src/schedule.mjs
index 10d874b0..7258b642 100644
--- a/code/html/src/schedule.mjs
+++ b/code/html/src/schedule.mjs
@@ -1,6 +1,6 @@
-import { showPanelByName } from './core.mjs';
import { addFromTemplate, addFromTemplateWithSchema } from './template.mjs';
import { addEnumerables, groupSettingsOnAddElem, variableListeners } from './settings.mjs';
+import { reportValidityForInputOrSelect } from './validate.mjs';
/** @param {function(HTMLElement): void} callback */
function withSchedules(callback) {
@@ -37,12 +37,7 @@ function onValidate(value) {
(elem.querySelectorAll(`input[name=${key}]`));
if (id < elems.length) {
- showPanelByName("sch");
-
- const target = elems[id];
- target.focus();
- target.setCustomValidity(message);
- target.reportValidity();
+ reportValidityForInputOrSelect(elems[id], message);
}
});
}
diff --git a/code/html/src/settings.mjs b/code/html/src/settings.mjs
index 612ec25d..63fe1120 100644
--- a/code/html/src/settings.mjs
+++ b/code/html/src/settings.mjs
@@ -11,7 +11,7 @@ import {
listenAppConnected,
} from './connection.mjs';
-import { validateForms } from './validate.mjs';
+import { validateForms, resetCustomValidity } from './validate.mjs';
/**
* @param {HTMLElement} elem
@@ -1308,6 +1308,8 @@ export function onElementChange(event) {
return;
}
+ resetCustomValidity(target);
+
if (!checkAndSetElementChanged(target)) {
return;
}
diff --git a/code/html/src/validate.mjs b/code/html/src/validate.mjs
index d7f7c845..763026f5 100644
--- a/code/html/src/validate.mjs
+++ b/code/html/src/validate.mjs
@@ -9,6 +9,8 @@ const DIFFERENT_PASSWORD = "Passwords are different!";
const EMPTY_PASSWORD = "Password cannot be empty!";
const INVALID_PASSWORD = "Invalid password!";
+const CUSTOM_VALIDITY = "customValidity";
+
/**
* @param {string} value
* @returns {boolean}
@@ -36,7 +38,6 @@ export function validatePassword(value) {
* @typedef {[HTMLInputElement, HTMLInputElement]} PasswordInputPair
*/
-
/**
* @param {import('./settings.mjs').InputOrSelect} elem
* @param {function(HTMLElement): void} callback
@@ -52,14 +53,30 @@ function findPanel(elem, callback) {
/**
* @param {import('./settings.mjs').InputOrSelect} elem
+ * @param {string} message
*/
-function reportValidityForInputOrSelect(elem) {
+export function reportValidityForInputOrSelect(elem, message = "") {
findPanel(elem, (panel) => {
showPanel(panel);
+
+ if (message.length != 0) {
+ elem.setCustomValidity(message);
+ elem.dataset[CUSTOM_VALIDITY] = message;
+ }
+
+ elem.focus();
elem.reportValidity();
});
}
+/**
+ * @param {import('./settings.mjs').InputOrSelect} elem
+ */
+export function resetCustomValidity(elem) {
+ delete elem.dataset[CUSTOM_VALIDITY];
+ elem.setCustomValidity("");
+}
+
/**
* @param {import('./settings.mjs').InputOrSelect} elem
* @returns {boolean}