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.
- package/apps/ServiceWorker.mjs +2 -2
- package/apps/form/view/ViewportController.mjs +41 -12
- package/examples/ServiceWorker.mjs +2 -2
- package/package.json +1 -1
- package/resources/scss/src/form/field/Text.scss +1 -0
- package/src/DefaultConfig.mjs +2 -2
- package/src/form/Container.mjs +60 -37
- package/src/form/field/Text.mjs +3 -1
- package/src/layout/Card.mjs +3 -0
package/apps/ServiceWorker.mjs
CHANGED
@@ -16,30 +16,59 @@ class ViewportController extends Component {
|
|
16
16
|
/**
|
17
17
|
* @param {Object} data
|
18
18
|
*/
|
19
|
-
onValidateAllPagesButtonClick(data) {
|
20
|
-
let me
|
21
|
-
form
|
22
|
-
isValid
|
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(
|
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
|
-
|
37
|
-
|
38
|
-
isValid
|
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
|
-
|
65
|
+
for (; i < len; i++) {
|
66
|
+
page = pagesContainer.items[i];
|
67
|
+
listIndex = sideNav.getActiveIndex(i);
|
68
|
+
isValid = await page.isValid();
|
41
69
|
|
42
|
-
|
70
|
+
store.getAt(listIndex).isValid = isValid;
|
71
|
+
}
|
43
72
|
}
|
44
73
|
}
|
45
74
|
|
package/package.json
CHANGED
package/src/DefaultConfig.mjs
CHANGED
@@ -237,12 +237,12 @@ const DefaultConfig = {
|
|
237
237
|
useVdomWorker: true,
|
238
238
|
/**
|
239
239
|
* buildScripts/injectPackageVersion.mjs will update this value
|
240
|
-
* @default '5.
|
240
|
+
* @default '5.2.0'
|
241
241
|
* @memberOf! module:Neo
|
242
242
|
* @name config.version
|
243
243
|
* @type String
|
244
244
|
*/
|
245
|
-
version: '5.
|
245
|
+
version: '5.2.0'
|
246
246
|
};
|
247
247
|
|
248
248
|
Object.assign(DefaultConfig, {
|
package/src/form/Container.mjs
CHANGED
@@ -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(
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
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.
|
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
|
90
|
+
async getSubmitValues() {
|
91
|
+
let fields = await this.getFields(),
|
92
|
+
values = {};
|
92
93
|
|
93
|
-
|
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
|
104
|
+
async getValues() {
|
105
|
+
let fields = await this.getFields(),
|
106
|
+
values = {};
|
105
107
|
|
106
|
-
|
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
|
156
|
+
async reset(values={}) {
|
157
|
+
let keys = values ? Object.keys(values) : [],
|
158
|
+
fields = await this.getFields(),
|
138
159
|
index;
|
139
160
|
|
140
|
-
|
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
|
176
|
+
async setValues(values={}) {
|
177
|
+
let keys = Object.keys(values),
|
178
|
+
fields = await this.getFields(),
|
157
179
|
index;
|
158
180
|
|
159
|
-
|
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
|
-
|
204
|
+
fields.forEach(item => {
|
182
205
|
validField = item.validate?.(false);
|
183
206
|
|
184
207
|
if (!validField) {
|
package/src/form/field/Text.mjs
CHANGED
@@ -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
|
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
|
|
package/src/layout/Card.mjs
CHANGED
@@ -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);
|