neo.mjs 5.2.16 → 5.3.0

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.
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='5.2.16'
23
+ * @member {String} version='5.3.0'
24
24
  */
25
- version: '5.2.16'
25
+ version: '5.3.0'
26
26
  }
27
27
 
28
28
  /**
@@ -82,12 +82,12 @@ class FormContainer extends BaseFormContainer {
82
82
  cls : ['form-footer'],
83
83
  flex : 'none',
84
84
 
85
- items: ['->', {
85
+ items: [{
86
86
  bind : {disabled: data => data.activeIndex === 0},
87
87
  handler: 'onPrevPageButtonClick',
88
88
  iconCls: 'fas fa-chevron-left',
89
89
  text : 'Back'
90
- }, {
90
+ }, '->', {
91
91
  bind : {disabled: data => data.activeIndex === data.maxIndex},
92
92
  handler : 'onNextPageButtonClick',
93
93
  iconCls : 'fas fa-chevron-right',
@@ -29,7 +29,7 @@ class Viewport extends BaseViewport {
29
29
 
30
30
  items: [{
31
31
  flex: 'none',
32
- vdom: {tag: 'h1', innerHTML: 'My Form Header'}
32
+ vdom: {tag: 'h1', innerHTML: 'Nested Forms'}
33
33
  }, {
34
34
  module : SideNavList,
35
35
  reference: 'side-nav',
@@ -1,5 +1,5 @@
1
1
  import FormPageContainer from '../FormPageContainer.mjs';
2
- import TextField from '../../../../src/form/field/Text.mjs';
2
+ import TextArea from '../../../../src/form/field/TextArea.mjs';
3
3
 
4
4
  /**
5
5
  * @class Form.view.pages.Page6
@@ -16,18 +16,28 @@ class Page6 extends FormPageContainer {
16
16
  * @member {String} formGroup='page6'
17
17
  */
18
18
  formGroup: 'page6',
19
+ /**
20
+ * @member {Object} itemDefaults
21
+ */
22
+ itemDefaults: {
23
+ module: TextArea
24
+ },
19
25
  /**
20
26
  * @member {Object[]} items
21
27
  */
22
28
  items: [{
23
- module : TextField,
29
+ height : 200,
24
30
  labelText: 'Page 6 Field 1',
25
31
  name : 'field1',
26
- required : true
32
+ required : true,
33
+ value : 'Lorem ipsum'
27
34
  }, {
28
- module : TextField,
35
+ height : 300,
29
36
  labelText: 'Page 6 Field 2',
30
37
  name : 'field2'
38
+ }, {
39
+ labelText: 'Page 6 Field 3',
40
+ name : 'field3'
31
41
  }]
32
42
  }
33
43
  }
@@ -1,5 +1,5 @@
1
1
  import FormPageContainer from '../FormPageContainer.mjs';
2
- import TextField from '../../../../src/form/field/Text.mjs';
2
+ import NumberField from '../../../../src/form/field/Number.mjs';
3
3
 
4
4
  /**
5
5
  * @class Form.view.pages.Page8
@@ -16,14 +16,16 @@ class Page8 extends FormPageContainer {
16
16
  * @member {Object[]} items
17
17
  */
18
18
  items: [{
19
- module : TextField,
19
+ module : NumberField,
20
20
  labelText: 'Page 8 Field 1',
21
21
  name : 'page8field1',
22
22
  required : true
23
23
  }, {
24
- module : TextField,
24
+ module : NumberField,
25
25
  labelText: 'Page 8 Field 2',
26
- name : 'page8field2'
26
+ name : 'page8field2',
27
+ stepSize : 0.01,
28
+ value : 0.02
27
29
  }]
28
30
  }
29
31
  }
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='5.2.16'
23
+ * @member {String} version='5.3.0'
24
24
  */
25
- version: '5.2.16'
25
+ version: '5.3.0'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "5.2.16",
3
+ "version": "5.3.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -56,7 +56,7 @@
56
56
  "neo-jsdoc": "^1.0.1",
57
57
  "neo-jsdoc-x": "^1.0.5",
58
58
  "postcss": "^8.4.21",
59
- "sass": "^1.59.3",
59
+ "sass": "^1.60.0",
60
60
  "webpack": "^5.76.3",
61
61
  "webpack-cli": "^5.0.1",
62
62
  "webpack-dev-server": "4.13.1",
@@ -9,10 +9,10 @@
9
9
  {"id": 5, "cardIndex": null, "isHeader": true, "isValid": null, "name": "2. Personal data"},
10
10
  {"id": 6, "cardIndex": 3, "isHeader": false, "isValid": null, "name": "CheckBoxes"},
11
11
  {"id": 7, "cardIndex": 4, "isHeader": false, "isValid": null, "name": "Radios"},
12
- {"id": 8, "cardIndex": 5, "isHeader": false, "isValid": null, "name": "Page 6"},
12
+ {"id": 8, "cardIndex": 5, "isHeader": false, "isValid": null, "name": "TextAreas"},
13
13
  {"id": 9, "cardIndex": 6, "isHeader": false, "isValid": null, "name": "Fieldsets"},
14
14
  {"id": 10, "cardIndex": null, "isHeader": true, "isValid": null, "name": "3. More data"},
15
- {"id": 11, "cardIndex": 7, "isHeader": false, "isValid": null, "name": "Page 8"},
15
+ {"id": 11, "cardIndex": 7, "isHeader": false, "isValid": null, "name": "NumberFields"},
16
16
  {"id": 12, "cardIndex": 8, "isHeader": false, "isValid": null, "name": "Page 9"},
17
17
  {"id": 13, "cardIndex": 9, "isHeader": false, "isValid": null, "name": "Page 10"},
18
18
  {"id": 14, "cardIndex": null, "isHeader": true, "isValid": null, "name": "3. Optional data"},
@@ -1,11 +1,35 @@
1
1
  .neo-textarea {
2
- align-items: stretch;
2
+ align-items : stretch;
3
+ display : flex;
4
+ flex-direction: column;
3
5
 
4
6
  .neo-input-wrapper {
5
- height: fit-content;
7
+ flex: 1 0 auto;
8
+ }
9
+
10
+ .neo-label-wrapper {
11
+ height: 100%;
6
12
  }
7
13
 
8
14
  .neo-field-trigger {
9
15
  border-bottom: 1px solid var(--textfield-border-color);
10
16
  }
17
+
18
+ .neo-textfield-error {
19
+ height: 1.2em; // 1.5em - 0.3em => margin-top
20
+ }
21
+
22
+ &.label-inline {
23
+ display: flex;
24
+
25
+ .neo-label-wrapper {
26
+ height: 100%;
27
+ }
28
+ }
29
+
30
+ &:has(.neo-textfield-error) {
31
+ .neo-label-wrapper {
32
+ height: calc(100% - 1.5em);
33
+ }
34
+ }
11
35
  }
@@ -237,12 +237,12 @@ const DefaultConfig = {
237
237
  useVdomWorker: true,
238
238
  /**
239
239
  * buildScripts/injectPackageVersion.mjs will update this value
240
- * @default '5.2.16'
240
+ * @default '5.3.0'
241
241
  * @memberOf! module:Neo
242
242
  * @name config.version
243
243
  * @type String
244
244
  */
245
- version: '5.2.16'
245
+ version: '5.3.0'
246
246
  };
247
247
 
248
248
  Object.assign(DefaultConfig, {
@@ -69,6 +69,18 @@ class Container extends BaseContainer {
69
69
  return null;
70
70
  }
71
71
 
72
+ /**
73
+ * @param {Neo.form.field.Base} field
74
+ * @returns {String}
75
+ */
76
+ getFieldPath(field) {
77
+ let path = field.formGroup ? field.formGroup.split('.') : [];
78
+
79
+ path.push(field.name || field.id);
80
+
81
+ return path.join('.');
82
+ }
83
+
72
84
  /**
73
85
  * @returns {Promise<Neo.form.field.Base[]>} fields
74
86
  */
@@ -188,19 +200,29 @@ class Container extends BaseContainer {
188
200
  * @param {Object} values={}
189
201
  */
190
202
  async setValues(values={}) {
191
- let keys = Object.keys(values),
192
- fields = await this.getFields(),
193
- index;
203
+ let me = this,
204
+ fields = await me.getFields(),
205
+ isRadio, path, value;
194
206
 
195
207
  fields.forEach(item => {
196
- index = keys.indexOf(item.name);
197
-
198
- if (index < 0) {
199
- index = keys.indexOf(item.id);
200
- }
208
+ path = me.getFieldPath(item);
209
+ value = Neo.nsWithArrays(path, false, values);
201
210
 
202
- if (index > -1) {
203
- item.value = values[keys[index]];
211
+ if (Neo.typeOf(value) === 'Array') {
212
+ // form.field.CheckBox
213
+ if (value.includes(item.value)) {
214
+ item.checked = true;
215
+ }
216
+ } else if (value !== undefined) {
217
+ isRadio = Neo.form.field?.Radio && item instanceof Neo.form.field.Radio;
218
+
219
+ if (isRadio) {
220
+ if (item.value === value) {
221
+ item.checked = true;
222
+ }
223
+ } else {
224
+ item.value = value;
225
+ }
204
226
  }
205
227
  })
206
228
  }
@@ -229,30 +229,23 @@ class Number extends Text {
229
229
 
230
230
  /**
231
231
  * @param {Object} data
232
- * @override
232
+ * @param {Object[]} data.oldPath
233
+ * @protected
233
234
  */
234
- onInputValueChange(data) {
235
- let me = this,
236
- value = data.value,
237
- oldValue = me.value;
235
+ onFocusLeave(data) {
236
+ let me = this,
237
+ value = me.value;
238
238
 
239
- if (!value && !me.required) {
240
- super.onInputValueChange(data);
241
- } else {
242
- value = parseInt(value); // todo: support for other number types
243
-
244
- if (!Neo.isNumber(value)) {
245
- me._value = oldValue;
246
- } else {
247
- value = value - value % me.stepSize;
248
- value = Math.max(me.minValue, value);
249
- value = Math.min(me.maxValue, value);
239
+ if (value !== null) {
240
+ value = me.stepSizeDigits > 0 ? parseFloat(value) : parseInt(value);
241
+ value = value - value % me.stepSize;
242
+ value = Math.max(me.minValue, value);
243
+ value = Math.min(me.maxValue, value);
250
244
 
251
- data.value = value;
252
-
253
- super.onInputValueChange(data);
254
- }
245
+ me.value = value;
255
246
  }
247
+
248
+ super.onFocusLeave(data)
256
249
  }
257
250
 
258
251
  /**