+ ${labelTemplate}
+
+ ${this._inputTemplate()}
+
+ ${helpTemplate}
+
+ `;
+ }
+
+ */
+}
diff --git a/api/js/etemplate/Et2Textbox/test/Et2Number.test.ts b/api/js/etemplate/Et2Textbox/test/Et2Number.test.ts
index b981ad8498..adf1c9064b 100644
--- a/api/js/etemplate/Et2Textbox/test/Et2Number.test.ts
+++ b/api/js/etemplate/Et2Textbox/test/Et2Number.test.ts
@@ -65,6 +65,14 @@ describe("Number widget", () =>
assert.equal(element.value, "1", "Wrong number of decimals");
})
+ it("Min limit", () =>
+ {
+ element.value = 0;
+ element.min = 2;
+ element.value = "1.234";
+ assert.equal(element.value, "2", "Value allowed below minimum");
+ });
+
describe("Check number preferences", () =>
{
diff --git a/api/js/etemplate/Validators/Regex.ts b/api/js/etemplate/Validators/Regex.ts
index fc890e735b..dfbcf670a7 100644
--- a/api/js/etemplate/Validators/Regex.ts
+++ b/api/js/etemplate/Validators/Regex.ts
@@ -9,7 +9,6 @@ export class Regex extends Pattern
*/
static async getMessage(data)
{
- // TODO: This is a poor error message, it shows the REGEX
- return data.formControl.egw().lang("'%1' has an invalid format !!!", data.params);
+ return data.formControl.egw().lang("'%1' does not match the required pattern '%2'", data.modelValue, data.params);
}
}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 9837417da0..7703a3d3fc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
"colortranslator": "^1.9.2",
"core-js": "^3.29.1",
"dexie": "^3.2.4",
+ "imask": "^7.6.1",
"lit": "^2.7.5",
"lit-flatpickr": "^0.3.0",
"shortcut-buttons-flatpickr": "^0.4.0",
@@ -299,12 +300,13 @@
}
},
"node_modules/@75lb/deep-merge": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz",
- "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.2.tgz",
+ "integrity": "sha512-08K9ou5VNbheZFxM5tDWoqjA3ImC50DiuuJ2tj1yEPRfkp8lLLg6XAaJ4On+a0yAXor/8ay5gHnAIshRM44Kpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lodash.assignwith": "^4.2.0",
+ "lodash": "^4.17.21",
"typical": "^7.1.1"
},
"engines": {
@@ -2260,6 +2262,19 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.25.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz",
+ "integrity": "sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js-pure": "^3.30.2",
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/template": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
@@ -4179,12 +4194,6 @@
"integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==",
"dev": true
},
- "node_modules/@types/prop-types": {
- "version": "15.7.12",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
- "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
- "peer": true
- },
"node_modules/@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
@@ -4197,16 +4206,6 @@
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
"dev": true
},
- "node_modules/@types/react": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
- "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
- "peer": true,
- "dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.0.2"
- }
- },
"node_modules/@types/resolve": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@@ -6957,6 +6956,17 @@
"url": "https://opencollective.com/core-js"
}
},
+ "node_modules/core-js-pure": {
+ "version": "3.37.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz",
+ "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -7002,12 +7012,6 @@
"node": ">=14"
}
},
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "peer": true
- },
"node_modules/custom-element-jet-brains-integration": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/custom-element-jet-brains-integration/-/custom-element-jet-brains-integration-1.2.1.tgz",
@@ -9635,6 +9639,18 @@
"node": ">= 4"
}
},
+ "node_modules/imask": {
+ "version": "7.6.1",
+ "resolved": "https://registry.npmjs.org/imask/-/imask-7.6.1.tgz",
+ "integrity": "sha512-sJlIFM7eathUEMChTh9Mrfw/IgiWgJqBKq2VNbyXvBZ7ev/IlO6/KQTKlV/Fm+viQMLrFLG/zCuudrLIwgK2dg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime-corejs3": "^7.24.4"
+ },
+ "engines": {
+ "npm": ">=4.0.0"
+ }
+ },
"node_modules/immutable": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
@@ -10948,12 +10964,6 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "node_modules/lodash.assignwith": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz",
- "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==",
- "dev": true
- },
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -13082,8 +13092,7 @@
"node_modules/regenerator-runtime": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
- "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
- "dev": true
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
},
"node_modules/regenerator-transform": {
"version": "0.15.2",
@@ -13314,7 +13323,7 @@
"version": "2.79.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
"integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
- "devOptional": true,
+ "dev": true,
"bin": {
"rollup": "dist/bin/rollup"
},
diff --git a/package.json b/package.json
index ddd49d2e55..a6dad9b266 100644
--- a/package.json
+++ b/package.json
@@ -89,6 +89,7 @@
"colortranslator": "^1.9.2",
"core-js": "^3.29.1",
"dexie": "^3.2.4",
+ "imask": "^7.6.1",
"lit": "^2.7.5",
"lit-flatpickr": "^0.3.0",
"shortcut-buttons-flatpickr": "^0.4.0",