neo.mjs 5.2.16 → 5.3.1
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/FormContainer.mjs +2 -2
- package/apps/form/view/FormContainerController.mjs +11 -0
- package/apps/form/view/Viewport.mjs +1 -1
- package/apps/form/view/pages/Page6.mjs +14 -4
- package/apps/form/view/pages/Page8.mjs +6 -4
- package/examples/ServiceWorker.mjs +2 -2
- package/package.json +2 -2
- package/resources/examples/data/formSideNav.json +2 -2
- package/resources/scss/src/form/field/TextArea.scss +26 -2
- package/src/DefaultConfig.mjs +2 -2
- package/src/form/Container.mjs +32 -10
- package/src/form/field/Base.mjs +18 -0
- package/src/form/field/Number.mjs +13 -20
- package/src/form/field/Text.mjs +2 -0
package/apps/ServiceWorker.mjs
CHANGED
@@ -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',
|
@@ -13,6 +13,17 @@ class FormContainerController extends Component {
|
|
13
13
|
className: 'Form.view.FormContainerController'
|
14
14
|
}
|
15
15
|
|
16
|
+
/**
|
17
|
+
*
|
18
|
+
*/
|
19
|
+
onComponentConstructed() {
|
20
|
+
super.onComponentConstructed();
|
21
|
+
|
22
|
+
this.component.on('fieldFocusLeave', data => {
|
23
|
+
console.log('fieldFocusLeave', data);
|
24
|
+
})
|
25
|
+
}
|
26
|
+
|
16
27
|
/**
|
17
28
|
* @param {Object} data
|
18
29
|
*/
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import FormPageContainer from '../FormPageContainer.mjs';
|
2
|
-
import
|
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
|
-
|
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
|
-
|
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
|
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 :
|
19
|
+
module : NumberField,
|
20
20
|
labelText: 'Page 8 Field 1',
|
21
21
|
name : 'page8field1',
|
22
22
|
required : true
|
23
23
|
}, {
|
24
|
-
module :
|
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
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "neo.mjs",
|
3
|
-
"version": "5.
|
3
|
+
"version": "5.3.1",
|
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
|
+
"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": "
|
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": "
|
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
|
-
|
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
|
}
|
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.3.1'
|
241
241
|
* @memberOf! module:Neo
|
242
242
|
* @name config.version
|
243
243
|
* @type String
|
244
244
|
*/
|
245
|
-
version: '5.
|
245
|
+
version: '5.3.1'
|
246
246
|
};
|
247
247
|
|
248
248
|
Object.assign(DefaultConfig, {
|
package/src/form/Container.mjs
CHANGED
@@ -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
|
192
|
-
fields = await
|
193
|
-
|
203
|
+
let me = this,
|
204
|
+
fields = await me.getFields(),
|
205
|
+
isRadio, path, value;
|
194
206
|
|
195
207
|
fields.forEach(item => {
|
196
|
-
|
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 (
|
203
|
-
|
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
|
}
|
package/src/form/field/Base.mjs
CHANGED
@@ -102,6 +102,24 @@ class Base extends Component {
|
|
102
102
|
return true;
|
103
103
|
}
|
104
104
|
|
105
|
+
/**
|
106
|
+
* @param {Object} data
|
107
|
+
* @param {Object[]} data.oldPath
|
108
|
+
* @protected
|
109
|
+
*/
|
110
|
+
onFocusLeave(data) {
|
111
|
+
super.onFocusLeave?.(data);
|
112
|
+
|
113
|
+
ComponentManager.getParents(this).forEach(parent => {
|
114
|
+
if (parent instanceof Neo.form.Container) {
|
115
|
+
parent.fire('fieldFocusLeave', {
|
116
|
+
...data,
|
117
|
+
field: this
|
118
|
+
})
|
119
|
+
}
|
120
|
+
})
|
121
|
+
}
|
122
|
+
|
105
123
|
/**
|
106
124
|
* Resets the field to a new value or null
|
107
125
|
* @param {*} value=null
|
@@ -229,30 +229,23 @@ class Number extends Text {
|
|
229
229
|
|
230
230
|
/**
|
231
231
|
* @param {Object} data
|
232
|
-
* @
|
232
|
+
* @param {Object[]} data.oldPath
|
233
|
+
* @protected
|
233
234
|
*/
|
234
|
-
|
235
|
-
let me
|
236
|
-
value
|
237
|
-
oldValue = me.value;
|
235
|
+
onFocusLeave(data) {
|
236
|
+
let me = this,
|
237
|
+
value = me.value;
|
238
238
|
|
239
|
-
if (
|
240
|
-
|
241
|
-
|
242
|
-
value =
|
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
|
-
|
252
|
-
|
253
|
-
super.onInputValueChange(data);
|
254
|
-
}
|
245
|
+
me.value = value;
|
255
246
|
}
|
247
|
+
|
248
|
+
super.onFocusLeave(data)
|
256
249
|
}
|
257
250
|
|
258
251
|
/**
|