neo.mjs 5.1.17 → 5.2.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.1.17'
23
+ * @member {String} version='5.2.0'
24
24
  */
25
- version: '5.1.17'
25
+ version: '5.2.0'
26
26
  }
27
27
 
28
28
  /**
@@ -16,30 +16,59 @@ class ViewportController extends Component {
16
16
  /**
17
17
  * @param {Object} data
18
18
  */
19
- onValidateAllPagesButtonClick(data) {
20
- let me = this,
21
- form = me.getReference('main-form'),
22
- isValid = form.validate();
19
+ async onValidateAllPagesButtonClick(data) {
20
+ let me = this,
21
+ form = me.getReference('main-form'),
22
+ isValid = await form.validate(),
23
+ formValues = await form.getValues();
23
24
 
24
- console.log('Form values', form.getValues());
25
+ console.log({isValid, formValues});
26
+
27
+ await me.updateRecordValidityState()
25
28
  }
26
29
 
27
30
  /**
28
31
  * @param {Object} data
29
32
  */
30
- onValidatePageButtonClick(data) {
33
+ async onValidatePageButtonClick(data) {
34
+ let me = this,
35
+ activeIndex = me.getModel().data.activeIndex,
36
+ activeCard = me.getReference('pages-container').items[activeIndex],
37
+ formValues = await activeCard.getValues();
38
+
39
+ await activeCard.validate();
40
+ await me.updateRecordValidityState(activeIndex)
41
+
42
+ console.log(`Current page: ${activeIndex + 1}`, formValues);
43
+ }
44
+
45
+ /**
46
+ * Not passing a pageIndex validates all pages
47
+ * @param {Number|null} [pageIndex]
48
+ * @returns {Promise<void>}
49
+ */
50
+ async updateRecordValidityState(pageIndex=null) {
31
51
  let me = this,
32
52
  model = me.getModel(),
33
- activeIndex = model.data.activeIndex,
34
53
  pagesContainer = me.getReference('pages-container'),
54
+ sideNav = me.getReference('side-nav'),
35
55
  store = model.getStore('sideNav'),
36
- activeCard = pagesContainer.items[activeIndex],
37
- listIndex = me.getReference('side-nav').getActiveIndex(activeIndex),
38
- isValid = activeCard.validate();
56
+ i = 0,
57
+ len = pagesContainer.items.length,
58
+ isValid, listIndex, page;
59
+
60
+ if (Neo.isNumber(pageIndex)) {
61
+ i = pageIndex;
62
+ len = pageIndex + 1;
63
+ }
39
64
 
40
- console.log(`Current page: ${activeIndex + 1}`, activeCard.getValues());
65
+ for (; i < len; i++) {
66
+ page = pagesContainer.items[i];
67
+ listIndex = sideNav.getActiveIndex(i);
68
+ isValid = await page.isValid();
41
69
 
42
- store.getAt(listIndex).isValid = isValid;
70
+ store.getAt(listIndex).isValid = isValid;
71
+ }
43
72
  }
44
73
  }
45
74
 
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='5.1.17'
23
+ * @member {String} version='5.2.0'
24
24
  */
25
- version: '5.1.17'
25
+ version: '5.2.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.1.17",
3
+ "version": "5.2.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -40,6 +40,7 @@
40
40
  .neo-label-wrapper {
41
41
  .neo-center-border, .neo-left-border, .neo-right-border {
42
42
  border-bottom-color: v(textfield-border-color-hovered);
43
+ border-top-color : v(textfield-border-color-hovered);
43
44
  }
44
45
 
45
46
  .neo-left-border, .neo-right-border {
@@ -237,12 +237,12 @@ const DefaultConfig = {
237
237
  useVdomWorker: true,
238
238
  /**
239
239
  * buildScripts/injectPackageVersion.mjs will update this value
240
- * @default '5.1.17'
240
+ * @default '5.2.0'
241
241
  * @memberOf! module:Neo
242
242
  * @name config.version
243
243
  * @type String
244
244
  */
245
- version: '5.1.17'
245
+ version: '5.2.0'
246
246
  };
247
247
 
248
248
  Object.assign(DefaultConfig, {
@@ -31,30 +31,30 @@ class Container extends BaseContainer {
31
31
  }
32
32
 
33
33
  /**
34
+ * @param {Neo.container.Base} parent
35
+ * @param {Object[]} modules
34
36
  * @returns {Object[]}
35
37
  */
36
- findNotLoadedModules(container=this) {
37
- let modules = [];
38
-
39
- container.items.forEach(item => {
40
- if (Neo.typeOf(item.module) === 'Function') {
41
- modules.push(item)
38
+ findNotLoadedModules(parent=this, modules=[]) {
39
+ parent.items.forEach(item => {
40
+ if (Neo.typeOf(item.module) === 'Function' && !item.isLoading) {
41
+ modules.push({item, parent});
42
42
  } else {
43
- item.items && this.findNotLoadedModules(item);
43
+ item.items && this.findNotLoadedModules(item, modules);
44
44
  }
45
45
  });
46
46
 
47
- console.log(modules);
48
-
49
47
  return modules;
50
48
  }
51
49
 
52
50
  /**
53
- * Either pass a field id or name
51
+ * Either pass a field name or id
54
52
  * @param {String} name
55
- * @returns {Neo.form.field.Base|null} fields
53
+ * @returns {Promise<Neo.form.field.Base|null>} fields
56
54
  */
57
- getField(name) {
55
+ async getField(name) {
56
+ await this.loadModules();
57
+
58
58
  let fields = ComponentManager.getChildComponents(this),
59
59
  field;
60
60
 
@@ -70,12 +70,12 @@ class Container extends BaseContainer {
70
70
  }
71
71
 
72
72
  /**
73
- * @returns {Neo.form.field.Base[]} fields
73
+ * @returns {Promise<Neo.form.field.Base[]>} fields
74
74
  */
75
- getFields() {
75
+ async getFields() {
76
76
  let fields = [];
77
77
 
78
- this.findNotLoadedModules();
78
+ await this.loadModules();
79
79
 
80
80
  ComponentManager.getChildComponents(this).forEach(item => {
81
81
  item instanceof BaseField && fields.push(item);
@@ -85,12 +85,13 @@ class Container extends BaseContainer {
85
85
  }
86
86
 
87
87
  /**
88
- * @returns {Object}
88
+ * @returns {Promise<Object>}
89
89
  */
90
- getSubmitValues() {
91
- let values = {};
90
+ async getSubmitValues() {
91
+ let fields = await this.getFields(),
92
+ values = {};
92
93
 
93
- this.getFields().forEach(item => {
94
+ fields.forEach(item => {
94
95
  values[item.name || item.id] = item.getSubmitValue();
95
96
  });
96
97
 
@@ -98,12 +99,13 @@ class Container extends BaseContainer {
98
99
  }
99
100
 
100
101
  /**
101
- * @returns {Object}
102
+ * @returns {Promise<Object>}
102
103
  */
103
- getValues() {
104
- let values = {};
104
+ async getValues() {
105
+ let fields = await this.getFields(),
106
+ values = {};
105
107
 
106
- this.getFields().forEach(item => {
108
+ fields.forEach(item => {
107
109
  values[item.name || item.id] = item.value;
108
110
  });
109
111
 
@@ -112,10 +114,10 @@ class Container extends BaseContainer {
112
114
 
113
115
  /**
114
116
  * Returns true in case no form field isValid() call returns false
115
- * @returns {Boolean}
117
+ * @returns {Promise<Boolean>}
116
118
  */
117
- isValid() {
118
- let fields = this.getFields(),
119
+ async isValid() {
120
+ let fields = await this.getFields(),
119
121
  i = 0,
120
122
  len = fields.length;
121
123
 
@@ -128,16 +130,35 @@ class Container extends BaseContainer {
128
130
  return true;
129
131
  }
130
132
 
133
+ /**
134
+ * Loads all not loaded items inside card layouts
135
+ * @returns {Promise<Neo.component.Base[]>}
136
+ */
137
+ async loadModules() {
138
+ let me = this,
139
+ modules = me.findNotLoadedModules(),
140
+ promises = [];
141
+
142
+ modules.forEach(module => {
143
+ promises.push(module.parent.layout.loadModule(module.item));
144
+ });
145
+
146
+ modules = await Promise.all(promises);
147
+
148
+ return modules;
149
+ }
150
+
131
151
  /**
132
152
  * Resets field values by field name or field id.
133
153
  * Fields not included with a value will get reset to null.
134
154
  * @param {Object} [values]
135
155
  */
136
- reset(values={}) {
137
- let keys = values ? Object.keys(values) : [],
156
+ async reset(values={}) {
157
+ let keys = values ? Object.keys(values) : [],
158
+ fields = await this.getFields(),
138
159
  index;
139
160
 
140
- this.getFields().forEach(item => {
161
+ fields.forEach(item => {
141
162
  index = keys.indexOf(item.name);
142
163
 
143
164
  if (index < 0) {
@@ -145,18 +166,19 @@ class Container extends BaseContainer {
145
166
  }
146
167
 
147
168
  item.reset(index > -1 ? values[keys[index]] : null);
148
- });
169
+ })
149
170
  }
150
171
 
151
172
  /**
152
173
  * Set field values by field name or field id
153
174
  * @param {Object} values={}
154
175
  */
155
- setValues(values={}) {
156
- let keys = Object.keys(values),
176
+ async setValues(values={}) {
177
+ let keys = Object.keys(values),
178
+ fields = await this.getFields(),
157
179
  index;
158
180
 
159
- this.getFields().forEach(item => {
181
+ fields.forEach(item => {
160
182
  index = keys.indexOf(item.name);
161
183
 
162
184
  if (index < 0) {
@@ -166,19 +188,20 @@ class Container extends BaseContainer {
166
188
  if (index > -1) {
167
189
  item.value = values[keys[index]];
168
190
  }
169
- });
191
+ })
170
192
  }
171
193
 
172
194
  /**
173
195
  * Updates the invalid state for all fields which have validate() implemented.
174
196
  * This can be useful for create-entity forms which show up "clean" until pressing a submit button.
175
- * @returns {Boolean}
197
+ * @returns {Promise<Boolean>}
176
198
  */
177
- validate() {
199
+ async validate() {
178
200
  let isValid = true,
201
+ fields = await this.getFields(),
179
202
  validField;
180
203
 
181
- this.getFields().forEach(item => {
204
+ fields.forEach(item => {
182
205
  validField = item.validate?.(false);
183
206
 
184
207
  if (!validField) {
@@ -1088,11 +1088,13 @@ class Text extends Base {
1088
1088
  onFocusLeave(data) {
1089
1089
  let me = this,
1090
1090
  centerBorderEl = me.getCenterBorderEl(), // labelPosition: 'inline'
1091
- cls = me.cls;
1091
+ cls;
1092
1092
 
1093
1093
  if (!me.readOnly) {
1094
1094
  me.validate(); // silent
1095
1095
 
1096
+ cls = me.cls; // has to get set after validate()
1097
+
1096
1098
  NeoArray.remove(cls, 'neo-focus');
1097
1099
  me.cls = cls;
1098
1100
 
@@ -184,6 +184,8 @@ class Card extends Base {
184
184
  index = items.indexOf(item);
185
185
  }
186
186
 
187
+ item.isLoading = true; // prevent the item from getting queued multiple times inside form.Container
188
+
187
189
  module = await module();
188
190
  module = module.default;
189
191
  proto = module.prototype;
@@ -193,6 +195,7 @@ class Card extends Base {
193
195
  item.wrapperCls = [...wrapperCls, sCfg.itemCls];
194
196
  item.module = module;
195
197
 
198
+ delete item.isLoading;
196
199
  delete item.vdom;
197
200
 
198
201
  items[index] = item = Neo.create(item);