neo.mjs 4.0.78 → 4.0.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "4.0.78",
3
+ "version": "4.0.79",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -50,12 +50,12 @@
50
50
  "envinfo": "^7.8.1",
51
51
  "fs-extra": "^10.1.0",
52
52
  "highlightjs-line-numbers.js": "^2.8.0",
53
- "inquirer": "^9.0.1",
53
+ "inquirer": "^9.0.2",
54
54
  "neo-jsdoc": "^1.0.1",
55
55
  "neo-jsdoc-x": "^1.0.4",
56
56
  "postcss": "^8.4.14",
57
- "sass": "^1.53.0",
58
- "webpack": "^5.73.0",
57
+ "sass": "^1.54.0",
58
+ "webpack": "^5.74.0",
59
59
  "webpack-cli": "^4.10.0",
60
60
  "webpack-dev-server": "4.9.3",
61
61
  "webpack-hook-plugin": "^1.0.7",
@@ -54,6 +54,7 @@
54
54
  }
55
55
 
56
56
  &.label-inline {
57
+ display : block;
57
58
  font-size: 14px;
58
59
  position : relative;
59
60
 
@@ -191,6 +192,12 @@
191
192
  }
192
193
  }
193
194
 
195
+ .neo-textfield-error {
196
+ color : v(textfield-border-color-invalid);
197
+ font-size : 11px;
198
+ margin-top: .3em;
199
+ }
200
+
194
201
  .neo-textfield-input {
195
202
  background-color: v(textfield-input-background-color);
196
203
  border : 1px solid v(textfield-border-color);
@@ -261,7 +261,7 @@ class Select extends Picker {
261
261
 
262
262
  if (record) {
263
263
  me.record = record;
264
- return record[me.displayField];
264
+ return record[displayField];
265
265
  }
266
266
  }
267
267
 
@@ -77,6 +77,10 @@ class Text extends Base {
77
77
  * @member {String[]} cls=['neo-textfield']
78
78
  */
79
79
  cls: ['neo-textfield'],
80
+ /**
81
+ * @member {String|null} error_=null
82
+ */
83
+ error_: null,
80
84
  /**
81
85
  * @member {Boolean} hideLabel_=false
82
86
  */
@@ -136,7 +140,8 @@ class Text extends Base {
136
140
  _vdom:
137
141
  {cn: [
138
142
  {tag: 'label', cls: ['neo-textfield-label'], style: {}},
139
- {tag: 'input', cls: ['neo-textfield-input'], flag: 'neo-real-input', style: {}}
143
+ {tag: 'input', cls: ['neo-textfield-input'], flag: 'neo-real-input', style: {}},
144
+ {cls: ['neo-textfield-error'], removeDom: true}
140
145
  ]}
141
146
  }}
142
147
 
@@ -224,6 +229,16 @@ class Text extends Base {
224
229
  });
225
230
  }
226
231
 
232
+ /**
233
+ * Triggered after the error config got changed
234
+ * @param {String|null} value
235
+ * @param {String|null} oldValue
236
+ * @protected
237
+ */
238
+ afterSetError(value, oldValue) {
239
+ this.updateValidationIndicators(false);
240
+ }
241
+
227
242
  /**
228
243
  * Triggered after the hideLabel config got changed
229
244
  * @param {Boolean} value
@@ -262,12 +277,12 @@ class Text extends Base {
262
277
 
263
278
  /**
264
279
  * Triggered after the inputPattern config got changed
265
- * @param {RegExp|null} value
280
+ * @param {RegExp|null} value
266
281
  * @param {RegExp|null} oldValue
267
282
  * @protected
268
283
  */
269
284
  afterSetInputPattern(value, oldValue) {
270
-
285
+
271
286
  }
272
287
 
273
288
  /**
@@ -550,7 +565,7 @@ class Text extends Base {
550
565
 
551
566
  me.getInputEl().value = value;
552
567
 
553
- if (!!value !== !!oldValue) { // change from empty to non empty
568
+ if (!!value !== !!oldValue) { // change from empty to non-empty
554
569
  NeoArray[value && value.toString().length > 0 ? 'add' : 'remove'](me._cls, 'neo-has-content');
555
570
  }
556
571
 
@@ -831,18 +846,23 @@ class Text extends Base {
831
846
  */
832
847
  isValid() {
833
848
  let me = this,
849
+ maxLength = me.maxLength,
850
+ minLength = me.minLength,
834
851
  value = me.value,
835
852
  valueLength = value?.toString().length;
836
853
 
837
854
  if (me.required && (!value || valueLength < 1)) {
855
+ me._error = 'Required';
838
856
  return false;
839
857
  }
840
858
 
841
- if (Neo.isNumber(me.maxLength) && valueLength > me.maxLength) {
859
+ if (Neo.isNumber(maxLength) && valueLength > maxLength) {
860
+ me._error = `Max length violation: ${valueLength} / ${maxLength}`;
842
861
  return false;
843
862
  }
844
863
 
845
- if (Neo.isNumber(me.minLength) && valueLength < me.minLength) {
864
+ if (Neo.isNumber(minLength) && valueLength < minLength) {
865
+ me._error = `Min length violation: ${valueLength} / ${minLength}`;
846
866
  return false;
847
867
  }
848
868
 
@@ -925,7 +945,7 @@ class Text extends Base {
925
945
  vnode.vnode.attributes.value = value;
926
946
  }
927
947
 
928
- if (me.inputPattern && !me.inputPattern.test(value) ) {
948
+ if (me.inputPattern && !me.inputPattern.test(value) ) {
929
949
  me.afterSetValue(oldValue, value);
930
950
  } else if (value !== oldValue) {
931
951
  me.value = value;
@@ -1041,10 +1061,18 @@ class Text extends Base {
1041
1061
  */
1042
1062
  updateValidationIndicators(silent=true) {
1043
1063
  let me = this,
1044
- vdom = me.vdom;
1064
+ vdom = me.vdom,
1065
+ errorNode, isValid;
1045
1066
 
1046
1067
  if (!(me.validBeforeMount && !me.mounted)) {
1047
- NeoArray[!me.isValid() ? 'add' : 'remove'](me._cls, 'neo-invalid');
1068
+ isValid = me.isValid();
1069
+
1070
+ NeoArray[!isValid ? 'add' : 'remove'](me._cls, 'neo-invalid');
1071
+
1072
+ errorNode = VDomUtil.findVdomChild(this.vdom, {cls: 'neo-textfield-error'}).vdom;
1073
+
1074
+ errorNode.html = me.error;
1075
+ errorNode.removeDom = isValid;
1048
1076
 
1049
1077
  if (!silent) {
1050
1078
  me.vdom = vdom;