neo.mjs 6.15.4 → 6.15.6
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/FormContainerController.mjs +1 -1
- package/apps/form/view/ViewportController.mjs +2 -2
- package/apps/portal/view/home/MainContainer.mjs +2 -2
- package/apps/portal/view/learn/ContentView.mjs +1 -1
- package/apps/portal/view/learn/LivePreview.mjs +0 -27
- package/apps/realworld2/view/user/LoginFormContainer.mjs +1 -1
- package/docs/app/view/MainContainer.mjs +1 -11
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/component/timer/MainContainerController.mjs +2 -2
- package/examples/component/toast/MainContainerController.mjs +2 -2
- package/examples/date/selectorContainer/MainContainer.mjs +215 -0
- package/examples/date/selectorContainer/app.mjs +6 -0
- package/examples/date/selectorContainer/index.html +11 -0
- package/examples/date/selectorContainer/neo-config.json +6 -0
- package/package.json +5 -5
- package/resources/data/deck/learnneo/pages/TestLivePreview.md +1 -2
- package/resources/data/deck/learnneo/pages/Welcome.md +68 -0
- package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Threaded.md +2 -0
- package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Window.md +3 -3
- package/resources/data/deck/learnneo/pages/WhyNeo-Speed.md +36 -12
- package/resources/data/deck/learnneo/tree.json +5 -4
- package/resources/scss/src/apps/portal/learn/PageContainer.scss +4 -3
- package/resources/scss/src/date/SelectorContainer.scss +120 -0
- package/resources/scss/theme-dark/date/SelectorContainer.scss +24 -0
- package/resources/scss/theme-light/date/SelectorContainer.scss +24 -0
- package/resources/scss/theme-neo-light/date/SelectorContainer.scss +24 -0
- package/src/DefaultConfig.mjs +2 -2
- package/src/Neo.mjs +5 -5
- package/src/component/Base.mjs +1 -1
- package/src/container/Base.mjs +42 -17
- package/src/controller/Component.mjs +5 -4
- package/src/core/Observable.mjs +30 -5
- package/src/core/Util.mjs +1 -1
- package/src/date/DayViewComponent.mjs +251 -0
- package/src/date/SelectorContainer.mjs +352 -0
- package/src/date/SelectorContainerModel.mjs +33 -0
- package/src/form/Container.mjs +10 -2
- package/src/form/field/Base.mjs +10 -2
- package/src/form/field/CheckBox.mjs +13 -5
- package/src/form/field/ComboBox.mjs +21 -15
- package/src/form/field/Date.mjs +2 -2
- package/src/form/field/Text.mjs +18 -17
- package/src/main/addon/IntersectionObserver.mjs +27 -20
- package/src/tab/Container.mjs +56 -55
- package/test/components/app.mjs +1 -0
- package/test/components/files/component/Base.mjs +88 -0
- package/test/components/siesta.js +1 -0
- package/docs/app/model/Tutorial.mjs +0 -41
- package/docs/app/store/Tutorials.mjs +0 -28
- package/docs/app/view/TutorialsTreeList.mjs +0 -51
- package/docs/tutorials/01_Concept.html +0 -45
- package/docs/tutorials/01_Concept.json +0 -123
- package/docs/tutorials/01_Concept.md +0 -55
- package/docs/tutorials/02_ClassSystem.html +0 -171
- package/docs/tutorials/02_ClassSystem.md +0 -187
- package/docs/tutorials/03_ComponentLifecycle.html +0 -28
- package/docs/tutorials/03_ComponentLifecycle.md +0 -23
- package/docs/tutorials/04_VdomVnode.html +0 -161
- package/docs/tutorials/05_RemoteMethodAccess.html +0 -82
- package/docs/tutorials/06_EcmaScript6Plus.html +0 -10
- package/docs/tutorials/07_WebWorkers.html +0 -9
- package/docs/tutorials/08_DomEvents.html +0 -7
- package/docs/tutorials/09_TodoList_version1.html +0 -503
- package/docs/tutorials/11_CreateApp.html +0 -94
- package/docs/tutorials/tutorials.json +0 -100
- package/resources/scss/src/apps/docs/TutorialsTreeList.scss +0 -7
@@ -1,4 +1,5 @@
|
|
1
1
|
{"data": [
|
2
|
+
{"name": "Welcome!", "parentId": null, "isLeaf": true, "id": "Welcome" },
|
2
3
|
{"name": "Why Neo.mjs?", "parentId": null, "isLeaf": false, "id": "WhyNeo"},
|
3
4
|
{"name": "Introduction ", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Intro"},
|
4
5
|
{"name": "Multi-Threaded", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Multi-Threaded"},
|
@@ -6,7 +7,7 @@
|
|
6
7
|
{"name": "Quick Application Development", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Quick"},
|
7
8
|
{"name": "Multi-Window Applications", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Multi-Window"},
|
8
9
|
{"name": "Complexity and Effort", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Effort"},
|
9
|
-
{"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted"},
|
10
|
+
{"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted", "collapsed": true},
|
10
11
|
{"name": "Setup", "parentId": "GettingStarted", "isLeaf": true, "id": "Setup", "hidden": false},
|
11
12
|
{"name": "Workspaces and Applications", "parentId": "GettingStarted", "isLeaf": true, "id": "2023-10-14T19-25-08-153Z"},
|
12
13
|
{"name": "Describing a View", "parentId": "GettingStarted", "isLeaf": true, "id": "DescribingTheUI"},
|
@@ -15,11 +16,11 @@
|
|
15
16
|
{"name": "Extending Classes", "parentId": "GettingStarted", "isLeaf": true, "id": "Extending"},
|
16
17
|
{"name": "Config", "parentId": "GettingStarted", "isLeaf": true, "id": "Config"},
|
17
18
|
{"name": "Shared Bindable Data", "parentId": "GettingStarted", "isLeaf": true, "id": "ComponentModels"},
|
18
|
-
{"name": "Tutorials", "parentId": null, "isLeaf": false, "expanded": false, "id": "Tutorials"},
|
19
|
+
{"name": "Tutorials", "parentId": null, "isLeaf": false, "expanded": false, "id": "Tutorials", "collapsed": true},
|
19
20
|
{"name": "Rock Scissors Paper", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "RSP", "hidden": true},
|
20
21
|
{"name": "Earthquakes", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "Earthquakes"},
|
21
22
|
{"name": "Todo List", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "TodoList"},
|
22
|
-
{"name": "Guides", "parentId": null, "isLeaf": false, "expanded": false, "id": "InDepth"},
|
23
|
+
{"name": "Guides", "parentId": null, "isLeaf": false, "expanded": false, "id": "InDepth", "collapsed": true},
|
23
24
|
{"name": "Config", "parentId": "InDepth", "isLeaf": false, "id": "Config"},
|
24
25
|
{"name": "Instance Lifecycle", "parentId": "InDepth", "isLeaf": false, "id": "InstanceLifecycle"},
|
25
26
|
{"name": "User Input (Forms)", "parentId": "InDepth", "isLeaf": false, "id": "Forms"},
|
@@ -40,7 +41,7 @@
|
|
40
41
|
{"name": "Other JavaScript Class Features", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T20-20-37-336Z"},
|
41
42
|
{"name": "Super", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T21-58-25-809Z"},
|
42
43
|
{"name": "New Node", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-31T13-59-37-550Z"},
|
43
|
-
{"name": "Appendix", "parentId": null, "id": "appendix"},
|
44
|
+
{"name": "Appendix", "parentId": null, "id": "appendix", "collapsed": true},
|
44
45
|
{"name": "Stylesheet", "parentId": "appendix", "isLeaf": true, "id": "stylesheet"},
|
45
46
|
{"name": "Test", "parentId": "appendix", "isLeaf": true, "id": "TestLivePreview"}
|
46
47
|
]}
|
@@ -0,0 +1,120 @@
|
|
1
|
+
.neo-dateselector.neo-container {
|
2
|
+
background-color: var(--dateselector-background-color);
|
3
|
+
color : var(--dateselector-color);
|
4
|
+
font-size : 16px; // todo: em-based once table headers are em based
|
5
|
+
font-weight : 400;
|
6
|
+
user-select : none;
|
7
|
+
|
8
|
+
&.neo-hide-inner-borders {
|
9
|
+
.neo-day-view {
|
10
|
+
.neo-row {
|
11
|
+
border: none !important;
|
12
|
+
|
13
|
+
.neo-cell {
|
14
|
+
border: none !important;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
.neo-header-toolbar {
|
21
|
+
background-color: var(--dateselector-header-background-color);
|
22
|
+
border : 1px solid var(--dateselector-border-color);
|
23
|
+
border-bottom : var(--dateselector-header-border-bottom);
|
24
|
+
min-height : 30px;
|
25
|
+
}
|
26
|
+
|
27
|
+
.neo-day-view {
|
28
|
+
border : 1px solid var(--dateselector-border-color);
|
29
|
+
border-top : var(--dateselector-content-border-top);
|
30
|
+
display : flex;
|
31
|
+
flex : 1;
|
32
|
+
flex-direction: column;
|
33
|
+
font-size : 12px;
|
34
|
+
|
35
|
+
.neo-row {
|
36
|
+
border-bottom: 1px solid var(--dateselector-border-color);
|
37
|
+
display : flex;
|
38
|
+
flex : 1;
|
39
|
+
|
40
|
+
&.neo-header-row {
|
41
|
+
border-bottom: var(--dateselector-header-cell-border-bottom) !important;
|
42
|
+
flex : none;
|
43
|
+
height : 30px;
|
44
|
+
|
45
|
+
.neo-cell {
|
46
|
+
background-color: var(--dateselector-header-cell-background-color);
|
47
|
+
color : var(--dateselector-header-cell-color);
|
48
|
+
cursor : default;
|
49
|
+
pointer-events : none;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
&:last-child {
|
54
|
+
border-bottom: 0;
|
55
|
+
}
|
56
|
+
|
57
|
+
.neo-cell {
|
58
|
+
align-items : center;
|
59
|
+
background-color: var(--dateselector-cell-background-color);
|
60
|
+
border-right : 1px solid var(--dateselector-border-color);
|
61
|
+
color : var(--dateselector-cell-color);
|
62
|
+
cursor : pointer;
|
63
|
+
display : flex;
|
64
|
+
flex : 1;
|
65
|
+
padding : 2px;
|
66
|
+
justify-content : center;
|
67
|
+
|
68
|
+
&:focus {
|
69
|
+
outline: 0;
|
70
|
+
}
|
71
|
+
|
72
|
+
&:last-child {
|
73
|
+
border-right: 0;
|
74
|
+
}
|
75
|
+
|
76
|
+
&.neo-disabled {
|
77
|
+
background-color: var(--dateselector-cell-background-color-disabled);
|
78
|
+
color : var(--dateselector-cell-color-disabled);
|
79
|
+
opacity : var(--dateselector-cell-opacity-disabled);
|
80
|
+
}
|
81
|
+
|
82
|
+
&.neo-disabled {
|
83
|
+
cursor : default;
|
84
|
+
pointer-events: none;
|
85
|
+
}
|
86
|
+
|
87
|
+
&.neo-selected {
|
88
|
+
.neo-cell-content {
|
89
|
+
background-color: var(--dateselector-cell-today-border-color);
|
90
|
+
border : 1px solid var(--dateselector-header-cell-background-color);
|
91
|
+
border-radius : 50%;
|
92
|
+
color : var(--dateselector-cell-color-selected);
|
93
|
+
|
94
|
+
&:before {
|
95
|
+
content : '';
|
96
|
+
display : inline-block;
|
97
|
+
padding-top: 100%;
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
.neo-cell-content {
|
103
|
+
align-items : center;
|
104
|
+
display : flex;
|
105
|
+
flex-basis : 0.1px;
|
106
|
+
flex-grow : 0.2;
|
107
|
+
justify-content: center;
|
108
|
+
min-height : 22px;
|
109
|
+
min-width : 22px;
|
110
|
+
pointer-events : none;
|
111
|
+
|
112
|
+
&.neo-today {
|
113
|
+
border : 1px solid var(--dateselector-cell-today-border-color);
|
114
|
+
border-radius: 50%;
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
:root .neo-theme-dark { // .neo-dateselector
|
2
|
+
--dateselector-background-color : #323232;
|
3
|
+
--dateselector-border-color : #3c3f41;
|
4
|
+
--dateselector-cell-background-color : #323232;
|
5
|
+
--dateselector-cell-background-color-disabled: #323232;
|
6
|
+
--dateselector-cell-color : #bbb;
|
7
|
+
--dateselector-cell-color-disabled : #555;
|
8
|
+
--dateselector-cell-color-selected : #fff;
|
9
|
+
--dateselector-cell-opacity-disabled : 1;
|
10
|
+
--dateselector-cell-today-border-color : #5d83a7;
|
11
|
+
--dateselector-color : #bbb;
|
12
|
+
--dateselector-content-border-top : none;
|
13
|
+
--dateselector-header-background-color : #323232;
|
14
|
+
--dateselector-header-border-bottom : none;
|
15
|
+
--dateselector-header-cell-background-color : #33343d;
|
16
|
+
--dateselector-header-cell-border-bottom : none;
|
17
|
+
--dateselector-header-cell-color : #bbb;
|
18
|
+
--dateselector-header-month-text-color : #ccc;
|
19
|
+
--dateselector-header-year-text-color : #bbb;
|
20
|
+
--dateselector-nav-button-background-color : #323232;
|
21
|
+
--dateselector-nav-button-color : #bbb;
|
22
|
+
--dateselector-nav-button-color-hover : #ddd;
|
23
|
+
--dateselector-nav-button-inner-border : none;
|
24
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
:root .neo-theme-light { // .neo-dateselector
|
2
|
+
--dateselector-background-color : #323232;
|
3
|
+
--dateselector-border-color : #ddd;
|
4
|
+
--dateselector-cell-background-color : #fff;
|
5
|
+
--dateselector-cell-background-color-disabled: #fff;
|
6
|
+
--dateselector-cell-color : #000;
|
7
|
+
--dateselector-cell-color-disabled : #999;
|
8
|
+
--dateselector-cell-color-selected : #fff;
|
9
|
+
--dateselector-cell-opacity-disabled : 1;
|
10
|
+
--dateselector-cell-today-border-color : #5d83a7;
|
11
|
+
--dateselector-color : #000;
|
12
|
+
--dateselector-content-border-top : none;
|
13
|
+
--dateselector-header-background-color : #fff;
|
14
|
+
--dateselector-header-border-bottom : none;
|
15
|
+
--dateselector-header-cell-background-color : #5d83a7;
|
16
|
+
--dateselector-header-cell-border-bottom : none;
|
17
|
+
--dateselector-header-cell-color : #fff;
|
18
|
+
--dateselector-header-month-text-color : #000;
|
19
|
+
--dateselector-header-year-text-color : #1c60a0;
|
20
|
+
--dateselector-nav-button-background-color : #fff;
|
21
|
+
--dateselector-nav-button-color : #bbb;
|
22
|
+
--dateselector-nav-button-color-hover : #1c60a0;
|
23
|
+
--dateselector-nav-button-inner-border : none;
|
24
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
:root .neo-theme-neo-light { // .neo-dateselector
|
2
|
+
--dateselector-background-color : #323232;
|
3
|
+
--dateselector-border-color : #ddd;
|
4
|
+
--dateselector-cell-background-color : #fff;
|
5
|
+
--dateselector-cell-background-color-disabled: #fff;
|
6
|
+
--dateselector-cell-color : #000;
|
7
|
+
--dateselector-cell-color-disabled : #999;
|
8
|
+
--dateselector-cell-color-selected : #fff;
|
9
|
+
--dateselector-cell-opacity-disabled : 1;
|
10
|
+
--dateselector-cell-today-border-color : #5d83a7;
|
11
|
+
--dateselector-color : #000;
|
12
|
+
--dateselector-content-border-top : none;
|
13
|
+
--dateselector-header-background-color : #fff;
|
14
|
+
--dateselector-header-border-bottom : none;
|
15
|
+
--dateselector-header-cell-background-color : #5d83a7;
|
16
|
+
--dateselector-header-cell-border-bottom : none;
|
17
|
+
--dateselector-header-cell-color : #fff;
|
18
|
+
--dateselector-header-month-text-color : #000;
|
19
|
+
--dateselector-header-year-text-color : #1c60a0;
|
20
|
+
--dateselector-nav-button-background-color : #fff;
|
21
|
+
--dateselector-nav-button-color : #bbb;
|
22
|
+
--dateselector-nav-button-color-hover : #1c60a0;
|
23
|
+
--dateselector-nav-button-inner-border : none;
|
24
|
+
}
|
package/src/DefaultConfig.mjs
CHANGED
@@ -260,12 +260,12 @@ const DefaultConfig = {
|
|
260
260
|
useVdomWorker: true,
|
261
261
|
/**
|
262
262
|
* buildScripts/injectPackageVersion.mjs will update this value
|
263
|
-
* @default '6.15.
|
263
|
+
* @default '6.15.6'
|
264
264
|
* @memberOf! module:Neo
|
265
265
|
* @name config.version
|
266
266
|
* @type String
|
267
267
|
*/
|
268
|
-
version: '6.15.
|
268
|
+
version: '6.15.6'
|
269
269
|
};
|
270
270
|
|
271
271
|
Object.assign(DefaultConfig, {
|
package/src/Neo.mjs
CHANGED
@@ -635,23 +635,23 @@ function autoGenerateGetSet(proto, key) {
|
|
635
635
|
|
636
636
|
if (Array.isArray(value)) {
|
637
637
|
if (key !== 'items') {
|
638
|
-
value = [...value]
|
638
|
+
value = [...value]
|
639
639
|
}
|
640
640
|
} else if (value instanceof Date) {
|
641
|
-
value = new Date(value.valueOf())
|
641
|
+
value = new Date(value.valueOf())
|
642
642
|
}
|
643
643
|
|
644
644
|
if (hasNewKey) {
|
645
645
|
me[key] = value; // we do want to trigger the setter => beforeSet, afterSet
|
646
646
|
value = me['_' + key]; // return the value parsed by the setter
|
647
|
-
delete me[configSymbol][key]
|
647
|
+
delete me[configSymbol][key]
|
648
648
|
}
|
649
649
|
|
650
650
|
if (typeof me[beforeGet] === 'function') {
|
651
|
-
value = me[beforeGet](value)
|
651
|
+
value = me[beforeGet](value)
|
652
652
|
}
|
653
653
|
|
654
|
-
return value
|
654
|
+
return value
|
655
655
|
},
|
656
656
|
|
657
657
|
set(value) {
|
package/src/component/Base.mjs
CHANGED
package/src/container/Base.mjs
CHANGED
@@ -123,7 +123,7 @@ class Base extends Component {
|
|
123
123
|
|
124
124
|
if (value && me.items) {
|
125
125
|
me.items.forEach(item => {
|
126
|
-
if (Neo.
|
126
|
+
if (!Neo.isString(item)) {
|
127
127
|
item.appName = value
|
128
128
|
}
|
129
129
|
})
|
@@ -221,7 +221,7 @@ class Base extends Component {
|
|
221
221
|
let me = this;
|
222
222
|
|
223
223
|
value && me.items?.forEach(item => {
|
224
|
-
if (Neo.
|
224
|
+
if (!Neo.isString(item)) {
|
225
225
|
item.windowId = value
|
226
226
|
}
|
227
227
|
})
|
@@ -392,18 +392,15 @@ class Base extends Component {
|
|
392
392
|
* @returns {Neo.layout.Base}
|
393
393
|
*/
|
394
394
|
createLayout(value) {
|
395
|
-
let me = this;
|
396
|
-
|
397
395
|
if (value) {
|
396
|
+
let me = this,
|
397
|
+
{appName, id, windowId} = me;
|
398
|
+
|
398
399
|
if (value instanceof LayoutBase && value.isLayout) {
|
399
|
-
value
|
400
|
-
value.containerId = me.id;
|
401
|
-
value.windowId = me.windowId;
|
400
|
+
Object.assign(value, {appName, containerId: id, windowId})
|
402
401
|
} else {
|
403
402
|
value = me.parseLayoutClass(value);
|
404
|
-
value
|
405
|
-
value.containerId = me.id;
|
406
|
-
value.windowId = me.windowId;
|
403
|
+
Object.assign(value, {appName, containerId: id, windowId});
|
407
404
|
value = Neo.ntype(value)
|
408
405
|
}
|
409
406
|
}
|
@@ -424,6 +421,38 @@ class Base extends Component {
|
|
424
421
|
super.destroy(updateParentVdom, silent)
|
425
422
|
}
|
426
423
|
|
424
|
+
/**
|
425
|
+
* An alternative for `getReference()` which is useful before a component tree got created.
|
426
|
+
* `getReference()` relies on child items being registered inside `manager.Component`,
|
427
|
+
* while this method simply walks down the items array.
|
428
|
+
*
|
429
|
+
* However, classes / modules inside the items tree can not get parsed further.
|
430
|
+
* @param {String} reference
|
431
|
+
* @param {Object[]} items=this.items
|
432
|
+
* @returns {Object|Neo.component.Base|null}
|
433
|
+
*/
|
434
|
+
getItem(reference, items=this.items) {
|
435
|
+
let i = 0,
|
436
|
+
len = items.length,
|
437
|
+
item,
|
438
|
+
childItem;
|
439
|
+
|
440
|
+
for (; i < len; i++) {
|
441
|
+
item = items[i];
|
442
|
+
if (item.reference === reference) {
|
443
|
+
return item
|
444
|
+
} else if (item.items) {
|
445
|
+
childItem = this.getItem(reference, item.items);
|
446
|
+
|
447
|
+
if (childItem) {
|
448
|
+
return childItem
|
449
|
+
}
|
450
|
+
}
|
451
|
+
}
|
452
|
+
|
453
|
+
return null
|
454
|
+
}
|
455
|
+
|
427
456
|
/**
|
428
457
|
* Specify a different vdom items root if needed (useful in case this container uses a wrapper node).
|
429
458
|
* @returns {Object} The new vdom items root
|
@@ -567,16 +596,12 @@ class Base extends Component {
|
|
567
596
|
*/
|
568
597
|
parseLayoutClass(config) {
|
569
598
|
if (Neo.isObject(config)) {
|
570
|
-
if (config.ntype.
|
571
|
-
config.ntype =
|
572
|
-
}
|
573
|
-
} else if (config.indexOf('layout-') < 0) {
|
574
|
-
config = {
|
575
|
-
ntype: 'layout-' + config
|
599
|
+
if (!config.ntype.startsWith('layout-')) {
|
600
|
+
config.ntype = `layout-${config.ntype}`
|
576
601
|
}
|
577
602
|
} else {
|
578
603
|
config = {
|
579
|
-
ntype: config
|
604
|
+
ntype: config.startsWith('layout-') ? config : `layout-${config}`
|
580
605
|
}
|
581
606
|
}
|
582
607
|
|
@@ -71,7 +71,8 @@ class Component extends Base {
|
|
71
71
|
|
72
72
|
/**
|
73
73
|
* @param {String} handlerName
|
74
|
-
* @
|
74
|
+
* @param {Neo.component.Base} component
|
75
|
+
* @returns {Neo.controller.Component|Boolean|null}
|
75
76
|
*/
|
76
77
|
getHandlerScope(handlerName, component) {
|
77
78
|
let me = this,
|
@@ -83,15 +84,15 @@ class Component extends Base {
|
|
83
84
|
const handlerCb = component.resolveCallback(handlerName, component);
|
84
85
|
|
85
86
|
// Handler fn is resolved in the Component or its own parent chain.
|
86
|
-
// Return a status indicating that we do not need an
|
87
|
+
// Return a status indicating that we do not need an early binding
|
87
88
|
if (handlerCb.fn) {
|
88
|
-
return true
|
89
|
+
return true
|
89
90
|
}
|
90
91
|
}
|
91
92
|
|
92
93
|
return Neo.isFunction(me[handlerName]) ?
|
93
94
|
me : parent ?
|
94
|
-
parent.getHandlerScope(handlerName) : null
|
95
|
+
parent.getHandlerScope(handlerName) : null
|
95
96
|
}
|
96
97
|
|
97
98
|
/**
|
package/src/core/Observable.mjs
CHANGED
@@ -241,12 +241,35 @@ class Observable extends Base {
|
|
241
241
|
}
|
242
242
|
|
243
243
|
/**
|
244
|
+
* There are different syntax's how you can use this method.
|
245
|
+
* Using the eventId:
|
246
|
+
* ```
|
247
|
+
* this.removeListener('change', 'neo-event-7');
|
248
|
+
* ```
|
249
|
+
* Passing the handler method:
|
250
|
+
* ```
|
251
|
+
* this.removeListener('change', this.onChange, this);
|
252
|
+
* ```
|
253
|
+
* Passing an object:
|
254
|
+
* ```
|
255
|
+
* me.field.un({
|
256
|
+
* change : me.onFieldChange,
|
257
|
+
* changeClearToOriginalValue: me.onFieldChange,
|
258
|
+
* scope : me
|
259
|
+
* });
|
260
|
+
* ```
|
244
261
|
* @param {Object|String} name
|
245
|
-
* @param {String} [eventId]
|
262
|
+
* @param {Function|String} [eventId]
|
263
|
+
* @param {Neo.core.Base} [scope]
|
246
264
|
*/
|
247
|
-
removeListener(name, eventId) {
|
265
|
+
removeListener(name, eventId, scope) {
|
248
266
|
let me = this,
|
249
|
-
i, len, listener, listeners, match
|
267
|
+
i, len, listener, listeners, match;
|
268
|
+
|
269
|
+
if (Neo.isFunction(eventId)) {
|
270
|
+
me.removeListener({[name]: eventId, scope});
|
271
|
+
return
|
272
|
+
}
|
250
273
|
|
251
274
|
if (Neo.isObject(name)) {
|
252
275
|
if (name.scope) {
|
@@ -316,9 +339,11 @@ class Observable extends Base {
|
|
316
339
|
fn = fn.slice(3);
|
317
340
|
while (!scope[fn] && (scope = scope.parent));
|
318
341
|
}
|
319
|
-
|
342
|
+
|
343
|
+
fn = scope[fn]
|
320
344
|
}
|
321
|
-
|
345
|
+
|
346
|
+
return {fn, scope}
|
322
347
|
}
|
323
348
|
|
324
349
|
/**
|
package/src/core/Util.mjs
CHANGED