neo.mjs 5.1.13 → 5.1.15
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/model/SideNav.mjs +3 -0
- package/apps/form/view/FormContainerController.mjs +0 -14
- package/apps/form/view/SideNavList.mjs +37 -0
- package/apps/form/view/Viewport.mjs +12 -5
- package/apps/form/view/ViewportController.mjs +37 -0
- package/examples/ServiceWorker.mjs +2 -2
- package/package.json +1 -1
- package/resources/examples/data/formSideNav.json +13 -13
- package/resources/scss/src/apps/form/FormContainer.scss +1 -0
- package/resources/scss/src/apps/form/SideNavList.scss +31 -0
- package/src/DefaultConfig.mjs +2 -2
- package/src/Main.mjs +9 -0
- package/src/component/Base.mjs +19 -5
- package/src/form/field/Date.mjs +11 -0
- package/src/form/field/Text.mjs +15 -8
package/apps/ServiceWorker.mjs
CHANGED
@@ -26,20 +26,6 @@ class FormContainerController extends Component {
|
|
26
26
|
onPrevPageButtonClick(data) {
|
27
27
|
this.getModel().data.activeIndex--;
|
28
28
|
}
|
29
|
-
|
30
|
-
/**
|
31
|
-
* @param {Object} data
|
32
|
-
*/
|
33
|
-
onValidatePageButtonClick(data) {
|
34
|
-
let me = this,
|
35
|
-
activeIndex = me.getModel().data.activeIndex,
|
36
|
-
pagesContainer = me.getReference('pages-container'),
|
37
|
-
activeCard = pagesContainer.items[activeIndex];
|
38
|
-
|
39
|
-
console.log(`Current page: ${activeIndex + 1}`, activeCard.getValues());
|
40
|
-
|
41
|
-
activeCard.validate();
|
42
|
-
}
|
43
29
|
}
|
44
30
|
|
45
31
|
Neo.applyClassConfig(FormContainerController);
|
@@ -11,12 +11,49 @@ class SideNavList extends List {
|
|
11
11
|
* @protected
|
12
12
|
*/
|
13
13
|
className: 'Form.view.SideNavList',
|
14
|
+
/**
|
15
|
+
* @member {String[]} baseCls=['form-side-nav-list','neo-list']
|
16
|
+
* @protected
|
17
|
+
*/
|
18
|
+
baseCls: ['form-side-nav-list', 'neo-list'],
|
14
19
|
/**
|
15
20
|
* @member {Boolean} useHeaders=true
|
16
21
|
*/
|
17
22
|
useHeaders: true
|
18
23
|
}
|
19
24
|
|
25
|
+
/**
|
26
|
+
* @param {Object} record
|
27
|
+
* @param {Number} index
|
28
|
+
* @returns {Object|Object[]|String} Either a config object to assign to the item, a vdom cn array or a html string
|
29
|
+
*/
|
30
|
+
createItemContent(record, index) {
|
31
|
+
let itemText = record[this.displayField];
|
32
|
+
|
33
|
+
return record.isHeader ? itemText : [
|
34
|
+
{tag: 'i', cls: this.getIconCls(record)},
|
35
|
+
{html: itemText}
|
36
|
+
];
|
37
|
+
}
|
38
|
+
|
39
|
+
/**
|
40
|
+
* @param {Object} record
|
41
|
+
* @returns {String[]}
|
42
|
+
*/
|
43
|
+
getIconCls(record) {
|
44
|
+
let cls = ['neo-list-icon'];
|
45
|
+
|
46
|
+
if (record.isValid === true) {
|
47
|
+
return [...cls, 'neo-color-green', 'far', 'fa-circle-check'];
|
48
|
+
}
|
49
|
+
|
50
|
+
if (record.isValid === false) {
|
51
|
+
return [...cls, 'neo-color-red', 'far', 'fa-circle-xmark'];
|
52
|
+
}
|
53
|
+
|
54
|
+
return [...cls, 'neo-color-blue', 'far', 'fa-circle'];
|
55
|
+
}
|
56
|
+
|
20
57
|
/**
|
21
58
|
* Saves activeIndex & activeTitle into the closest view model
|
22
59
|
* @param {String[]} items
|
@@ -1,7 +1,8 @@
|
|
1
|
-
import BaseViewport
|
2
|
-
import FormContainer
|
3
|
-
import SideNavList
|
4
|
-
import
|
1
|
+
import BaseViewport from '../../../src/container/Viewport.mjs';
|
2
|
+
import FormContainer from './FormContainer.mjs';
|
3
|
+
import SideNavList from './SideNavList.mjs';
|
4
|
+
import ViewportController from './ViewportController.mjs';
|
5
|
+
import ViewportModel from './ViewportModel.mjs';
|
5
6
|
|
6
7
|
/**
|
7
8
|
* @class Form.view.Viewport
|
@@ -14,18 +15,24 @@ class Viewport extends BaseViewport {
|
|
14
15
|
* @protected
|
15
16
|
*/
|
16
17
|
className: 'Form.view.Viewport',
|
18
|
+
/**
|
19
|
+
* @member {Neo.controller.Component} controller=ViewportController
|
20
|
+
*/
|
21
|
+
controller: ViewportController,
|
17
22
|
/**
|
18
23
|
* @member {Object[]} items
|
19
24
|
*/
|
20
25
|
items: [{
|
21
26
|
ntype: 'container',
|
27
|
+
style: {margin: '0 1em'},
|
22
28
|
width: '300',
|
23
29
|
|
24
30
|
items: [{
|
25
31
|
flex: 'none',
|
26
32
|
vdom: {tag: 'h1', innerHTML: 'My Form Header'}
|
27
33
|
}, {
|
28
|
-
module: SideNavList,
|
34
|
+
module : SideNavList,
|
35
|
+
reference: 'side-nav',
|
29
36
|
|
30
37
|
bind: {
|
31
38
|
headerlessActiveIndex: data => data.activeIndex,
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import Component from '../../../src/controller/Component.mjs';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @class Form.view.ViewportController
|
5
|
+
* @extends Neo.controller.Component
|
6
|
+
*/
|
7
|
+
class ViewportController extends Component {
|
8
|
+
static config = {
|
9
|
+
/**
|
10
|
+
* @member {String} className='Form.view.ViewportController'
|
11
|
+
* @protected
|
12
|
+
*/
|
13
|
+
className: 'Form.view.ViewportController'
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* @param {Object} data
|
18
|
+
*/
|
19
|
+
onValidatePageButtonClick(data) {
|
20
|
+
let me = this,
|
21
|
+
model = me.getModel(),
|
22
|
+
activeIndex = model.data.activeIndex,
|
23
|
+
pagesContainer = me.getReference('pages-container'),
|
24
|
+
store = model.getStore('sideNav'),
|
25
|
+
activeCard = pagesContainer.items[activeIndex],
|
26
|
+
listIndex = me.getReference('side-nav').getActiveIndex(activeIndex),
|
27
|
+
isValid = activeCard.validate();
|
28
|
+
|
29
|
+
console.log(`Current page: ${activeIndex + 1}`, activeCard.getValues());
|
30
|
+
|
31
|
+
store.getAt(listIndex).isValid = isValid;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
Neo.applyClassConfig(ViewportController);
|
36
|
+
|
37
|
+
export default ViewportController;
|
package/package.json
CHANGED
@@ -2,18 +2,18 @@
|
|
2
2
|
"success": true,
|
3
3
|
|
4
4
|
"data": [
|
5
|
-
{"id": 1, "cardIndex": null, "isHeader": true, "name": "1. Basic data"},
|
6
|
-
{"id": 2, "cardIndex": 0, "isHeader": false, "name": "Page 1"},
|
7
|
-
{"id": 3, "cardIndex": 1, "isHeader": false, "name": "Page 2"},
|
8
|
-
{"id": 4, "cardIndex": 2, "isHeader": false, "name": "Page 3"},
|
9
|
-
{"id": 5, "cardIndex": null, "isHeader": true, "name": "2. Personal data"},
|
10
|
-
{"id": 6, "cardIndex": 3, "isHeader": false, "name": "Page 4"},
|
11
|
-
{"id": 7, "cardIndex": 4, "isHeader": false, "name": "Page 5"},
|
12
|
-
{"id": 8, "cardIndex": 5, "isHeader": false, "name": "Page 6"},
|
13
|
-
{"id": 9, "cardIndex": 6, "isHeader": false, "name": "Page 7"},
|
14
|
-
{"id": 10, "cardIndex": null, "isHeader": true, "name": "3. More data"},
|
15
|
-
{"id": 11, "cardIndex": 7, "isHeader": false, "name": "Page 8"},
|
16
|
-
{"id": 12, "cardIndex": 8, "isHeader": false, "name": "Page 9"},
|
17
|
-
{"id": 13, "cardIndex": 9, "isHeader": false, "name": "Page 10"}
|
5
|
+
{"id": 1, "cardIndex": null, "isHeader": true, "isValid": null, "name": "1. Basic data"},
|
6
|
+
{"id": 2, "cardIndex": 0, "isHeader": false, "isValid": null, "name": "Page 1"},
|
7
|
+
{"id": 3, "cardIndex": 1, "isHeader": false, "isValid": null, "name": "Page 2"},
|
8
|
+
{"id": 4, "cardIndex": 2, "isHeader": false, "isValid": null, "name": "Page 3"},
|
9
|
+
{"id": 5, "cardIndex": null, "isHeader": true, "isValid": null, "name": "2. Personal data"},
|
10
|
+
{"id": 6, "cardIndex": 3, "isHeader": false, "isValid": null, "name": "Page 4"},
|
11
|
+
{"id": 7, "cardIndex": 4, "isHeader": false, "isValid": null, "name": "Page 5"},
|
12
|
+
{"id": 8, "cardIndex": 5, "isHeader": false, "isValid": null, "name": "Page 6"},
|
13
|
+
{"id": 9, "cardIndex": 6, "isHeader": false, "isValid": null, "name": "Page 7"},
|
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"},
|
16
|
+
{"id": 12, "cardIndex": 8, "isHeader": false, "isValid": null, "name": "Page 9"},
|
17
|
+
{"id": 13, "cardIndex": 9, "isHeader": false, "isValid": null, "name": "Page 10"}
|
18
18
|
]
|
19
19
|
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
.form-side-nav-list.neo-list {
|
2
|
+
.neo-list-header {
|
3
|
+
font-weight : bold;
|
4
|
+
text-transform: uppercase;
|
5
|
+
}
|
6
|
+
|
7
|
+
.neo-list-item {
|
8
|
+
.neo-color-blue {
|
9
|
+
color: #1c60a0;
|
10
|
+
}
|
11
|
+
|
12
|
+
.neo-color-green {
|
13
|
+
color: darkgreen;
|
14
|
+
}
|
15
|
+
|
16
|
+
.neo-color-red {
|
17
|
+
color: brown;
|
18
|
+
}
|
19
|
+
|
20
|
+
.neo-list-icon {
|
21
|
+
margin-right: .5em;
|
22
|
+
}
|
23
|
+
|
24
|
+
&:not(.neo-list-header) {
|
25
|
+
align-items : center;
|
26
|
+
display : flex;
|
27
|
+
flex-direction: row;
|
28
|
+
margin-left : 18px;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
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.1.
|
240
|
+
* @default '5.1.15'
|
241
241
|
* @memberOf! module:Neo
|
242
242
|
* @name config.version
|
243
243
|
* @type String
|
244
244
|
*/
|
245
|
-
version: '5.1.
|
245
|
+
version: '5.1.15'
|
246
246
|
};
|
247
247
|
|
248
248
|
Object.assign(DefaultConfig, {
|
package/src/Main.mjs
CHANGED
@@ -49,6 +49,7 @@ class Main extends core.Base {
|
|
49
49
|
'alert',
|
50
50
|
'editRoute',
|
51
51
|
'getWindowData',
|
52
|
+
'redirectTo',
|
52
53
|
'setNeoConfig',
|
53
54
|
'setRoute',
|
54
55
|
'windowClose',
|
@@ -334,6 +335,14 @@ class Main extends core.Base {
|
|
334
335
|
}
|
335
336
|
}
|
336
337
|
|
338
|
+
/**
|
339
|
+
* @param {Object} data
|
340
|
+
* @param {String} data.url
|
341
|
+
*/
|
342
|
+
redirectTo(data) {
|
343
|
+
window.location.href = data.url;
|
344
|
+
}
|
345
|
+
|
337
346
|
/**
|
338
347
|
* Triggers the different DOM operation queues
|
339
348
|
* @protected
|
package/src/component/Base.mjs
CHANGED
@@ -1284,8 +1284,7 @@ class Base extends CoreBase {
|
|
1284
1284
|
|
1285
1285
|
if (me.hideMode !== 'visibility') {
|
1286
1286
|
let removeFn = function() {
|
1287
|
-
me.
|
1288
|
-
me.update();
|
1287
|
+
me.unmount();
|
1289
1288
|
}
|
1290
1289
|
|
1291
1290
|
if (timeout) {
|
@@ -1393,7 +1392,9 @@ class Base extends CoreBase {
|
|
1393
1392
|
parentIndex: me.parentIndex
|
1394
1393
|
});
|
1395
1394
|
|
1396
|
-
|
1395
|
+
delete me.vdom.removeDom;
|
1396
|
+
|
1397
|
+
await Neo.timeout(30);
|
1397
1398
|
|
1398
1399
|
me.mounted = true;
|
1399
1400
|
}
|
@@ -1627,7 +1628,8 @@ class Base extends CoreBase {
|
|
1627
1628
|
* @returns {Promise<*>}
|
1628
1629
|
*/
|
1629
1630
|
set(values={}, silent=false) {
|
1630
|
-
let me
|
1631
|
+
let me = this,
|
1632
|
+
needsRendering = values.hidden === false && values.hidden !== me.hidden;
|
1631
1633
|
|
1632
1634
|
me.silentVdomUpdate = true;
|
1633
1635
|
|
@@ -1638,6 +1640,11 @@ class Base extends CoreBase {
|
|
1638
1640
|
if (silent || !me.needsVdomUpdate) {
|
1639
1641
|
return Promise.resolve();
|
1640
1642
|
} else {
|
1643
|
+
if (needsRendering) {
|
1644
|
+
me.show();
|
1645
|
+
return Promise.resolve();
|
1646
|
+
}
|
1647
|
+
|
1641
1648
|
return me.promiseVdomUpdate();
|
1642
1649
|
}
|
1643
1650
|
}
|
@@ -1660,7 +1667,12 @@ class Base extends CoreBase {
|
|
1660
1667
|
|
1661
1668
|
if (me.hideMode !== 'visibility') {
|
1662
1669
|
delete me.vdom.removeDom;
|
1663
|
-
|
1670
|
+
|
1671
|
+
if (me.silentVdomUpdate) {
|
1672
|
+
me.needsVdomUpdate = true;
|
1673
|
+
} else {
|
1674
|
+
!me.mounted && me.render(true)
|
1675
|
+
}
|
1664
1676
|
} else {
|
1665
1677
|
let style = me.style;
|
1666
1678
|
delete style.visibility;
|
@@ -1759,6 +1771,8 @@ class Base extends CoreBase {
|
|
1759
1771
|
unmount() {
|
1760
1772
|
let me = this;
|
1761
1773
|
|
1774
|
+
me.vdom.removeDom = true;
|
1775
|
+
|
1762
1776
|
me.mounted = false;
|
1763
1777
|
|
1764
1778
|
Neo.currentWorker.promiseMessage('main', {
|
package/src/form/field/Date.mjs
CHANGED
@@ -90,6 +90,17 @@ class DateField extends Picker {
|
|
90
90
|
return this.dateSelector;
|
91
91
|
}
|
92
92
|
|
93
|
+
/**
|
94
|
+
* @returns {Boolean}
|
95
|
+
*/
|
96
|
+
hasContent() {
|
97
|
+
if (this.labelPosition === 'inline') {
|
98
|
+
return true;
|
99
|
+
}
|
100
|
+
|
101
|
+
return super.hasContent()
|
102
|
+
}
|
103
|
+
|
93
104
|
/**
|
94
105
|
* @param {Object} data
|
95
106
|
* @protected
|
package/src/form/field/Text.mjs
CHANGED
@@ -696,19 +696,17 @@ class Text extends Base {
|
|
696
696
|
* @protected
|
697
697
|
*/
|
698
698
|
afterSetValue(value, oldValue) {
|
699
|
-
let me
|
700
|
-
cls
|
701
|
-
|
702
|
-
|
703
|
-
originalValue = me.originalConfig.value,
|
704
|
-
isDirty = value !== originalValue && Neo.isEmpty(value) !== Neo.isEmpty(originalValue);
|
699
|
+
let me = this,
|
700
|
+
cls = me.cls,
|
701
|
+
originalValue = me.originalConfig.value,
|
702
|
+
isDirty = value !== originalValue && Neo.isEmpty(value) !== Neo.isEmpty(originalValue);
|
705
703
|
|
706
704
|
me.silentVdomUpdate = true;
|
707
705
|
|
708
706
|
me.getInputEl().value = value;
|
709
707
|
|
710
|
-
NeoArray[hasContent ? 'add' : 'remove'](cls, 'neo-has-content');
|
711
|
-
NeoArray[isDirty
|
708
|
+
NeoArray[me.hasContent() ? 'add' : 'remove'](cls, 'neo-has-content');
|
709
|
+
NeoArray[isDirty ? 'add' : 'remove'](cls, 'neo-is-dirty');
|
712
710
|
me.cls = cls;
|
713
711
|
|
714
712
|
me.validate(); // silent
|
@@ -998,6 +996,15 @@ class Text extends Base {
|
|
998
996
|
return this.id + '-trigger-' + type;
|
999
997
|
}
|
1000
998
|
|
999
|
+
/**
|
1000
|
+
* @returns {Boolean}
|
1001
|
+
*/
|
1002
|
+
hasContent() {
|
1003
|
+
let value = this.value;
|
1004
|
+
|
1005
|
+
return this.placeholderText?.length > 0 || value !== null && value.toString().length > 0
|
1006
|
+
}
|
1007
|
+
|
1001
1008
|
/**
|
1002
1009
|
* Finds a trigger by a given type config
|
1003
1010
|
* @param {String} type
|