neo.mjs 7.0.5 → 7.1.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/README.md +2 -2
- package/apps/ServiceWorker.mjs +2 -2
- package/apps/portal/index.html +1 -1
- package/apps/portal/model/Content.mjs +3 -2
- package/apps/portal/view/home/FooterContainer.mjs +1 -1
- package/apps/portal/view/home/parts/Features.mjs +5 -5
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/todoList/version2/MainContainer.mjs +38 -48
- package/examples/todoList/version2/TodoList.mjs +6 -39
- package/examples/todoList/version2/TodoListModel.mjs +1 -1
- package/package.json +7 -7
- package/resources/data/deck/learnneo/pages/Welcome.md +0 -4
- package/resources/data/deck/learnneo/pages/guides/Forms.md +1 -0
- package/resources/data/deck/learnneo/pages/guides/InstanceLifecycle.md +1 -0
- package/resources/data/deck/learnneo/pages/guides/Layouts.md +1 -0
- package/resources/data/deck/learnneo/pages/guides/Mixins.md +1 -0
- package/resources/data/deck/learnneo/pages/guides/MultiWindow.md +1 -0
- package/resources/data/deck/learnneo/pages/guides/Tables.md +1 -0
- package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +263 -0
- package/resources/data/deck/learnneo/pages/{TodoList.md → tutorials/TodoList.md} +23 -33
- package/resources/data/deck/learnneo/tree.json +45 -48
- package/resources/scss/src/component/Splitter.scss +10 -1
- package/resources/scss/theme-dark/component/Splitter.scss +6 -3
- package/resources/scss/theme-light/component/Splitter.scss +6 -3
- package/resources/scss/theme-neo-light/component/Splitter.scss +6 -20
- package/src/DefaultConfig.mjs +2 -2
- package/src/code/LivePreview.mjs +28 -1
- package/src/collection/Base.mjs +1 -0
- package/src/component/Splitter.mjs +22 -4
- package/src/controller/Component.mjs +10 -10
- package/src/core/Observable.mjs +4 -27
- package/src/draggable/DragZone.mjs +6 -5
- package/src/grid/View.mjs +82 -0
- package/src/list/Base.mjs +16 -0
- package/src/main/addon/DragDrop.mjs +3 -2
- package/src/manager/DomEvent.mjs +30 -18
- package/src/table/View.mjs +82 -0
- package/src/util/Function.mjs +24 -0
- package/resources/data/deck/learnneo/pages/2023-10-08T20-37-30-658Z.md +0 -0
- package/resources/data/deck/learnneo/pages/2023-10-08T22-22-11-013Z.md +0 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-01-goals.md +0 -32
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-01-generate-a-workspace.md +0 -47
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-02-generate-the-starter-app.md +0 -150
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-03-debugging.md +0 -136
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-04-fetch-data.md +0 -146
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-05-refactor-the-table.md +0 -146
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-06-use-a-view-model.md +0 -301
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-07-use-the-google-maps-addon.md +0 -175
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-08-events.md +0 -38
- package/resources/data/deck/learnneo/pages/TestLivePreview.md +0 -32
- package/resources/data/deck/learnneo/pages/WhatAboutHTML.md +0 -1
- package/resources/data/deck/learnneo/pages/stylesheet.md +0 -57
- /package/resources/data/deck/learnneo/pages/{WhyNeo-Effort.md → benefits/Effort.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{WhyNeo-Features.md → benefits/Features.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{WhyNeo-Intro.md → benefits/Introduction.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{WhyNeo-Multi-Window.md → benefits/Multi-Window.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{WhyNeo-Quick.md → benefits/Quick.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{WhyNeo-Speed.md → benefits/Speed.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{ComponentModels.md → gettingstarted/ComponentModels.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{Config.md → gettingstarted/Config.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{DescribingTheUI.md → gettingstarted/DescribingTheUI.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{Events.md → gettingstarted/Events.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{Extending.md → gettingstarted/Extending.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{References.md → gettingstarted/References.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{Setup.md → gettingstarted/Setup.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{2023-10-14T19-25-08-153Z.md → gettingstarted/Workspaces.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{ComponentsAndContainers.md → guides/ComponentsAndContainers.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{CustomComponents.md → guides/CustomComponents.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{MainThreadAddonExample.md → guides/MainThreadAddonExample.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{MainThreadAddonIntro.md → guides/MainThreadAddonIntro.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{GuideViewModels.md → guides/ViewModels.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{GuideEvents.md → guides/events/CustomEvents.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{2023-10-08T20-20-37-336Z.md → javascript/ClassFeatures.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{2023-10-07T19-18-28-517Z.md → javascript/Classes.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{2023-10-31T13-59-37-550Z.md → javascript/NewNode.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{2023-10-08T20-20-07-934Z.md → javascript/Overrides.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{2023-10-08T21-58-25-809Z.md → javascript/Super.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{Earthquakes.md → tutorials/Earthquakes.md} +0 -0
- /package/resources/data/deck/learnneo/pages/{RSP.md → tutorials/RSP.md} +0 -0
@@ -175,64 +175,54 @@ class MainContainer extends Container {
|
|
175
175
|
className: 'Neo.examples.todoList.version2.MainContainer',
|
176
176
|
style : {padding: '20px'},
|
177
177
|
|
178
|
-
|
179
|
-
idCounter: 3,
|
180
|
-
store : null
|
181
|
-
}
|
182
|
-
|
183
|
-
construct(config) {
|
184
|
-
super.construct(config);
|
185
|
-
|
186
|
-
let me = this;
|
187
|
-
|
188
|
-
me.store = Neo.create({
|
189
|
-
module: TodoListStore
|
190
|
-
});
|
191
|
-
|
192
|
-
me.items = [{
|
178
|
+
items: [{
|
193
179
|
module : List,
|
194
180
|
displayField : 'text',
|
195
181
|
flex : 1,
|
196
|
-
|
182
|
+
reference : 'todo-list',
|
183
|
+
store : TodoListStore,
|
197
184
|
style : {padding: '5px'},
|
198
185
|
useCheckBoxes: true
|
199
186
|
}, {
|
200
187
|
module: Toolbar,
|
201
|
-
flex : 'none',
|
202
188
|
dock : 'bottom',
|
189
|
+
flex : 'none',
|
203
190
|
items : [{
|
204
191
|
module : TextField,
|
205
192
|
flex : 1,
|
206
193
|
labelPosition: 'inline',
|
207
194
|
labelText : 'Item Text',
|
208
|
-
reference : '
|
195
|
+
reference : 'add-item-field'
|
209
196
|
}, '->', {
|
210
|
-
handler
|
211
|
-
|
212
|
-
|
213
|
-
style : {height: '27px', marginLeft: '1em'},
|
214
|
-
text : 'Add Item'
|
197
|
+
handler: 'up.onAddButtonClick',
|
198
|
+
style : {height: '27px', marginLeft: '1em'},
|
199
|
+
text : 'Add Item'
|
215
200
|
}]
|
216
|
-
}]
|
201
|
+
}]
|
217
202
|
}
|
218
203
|
|
219
|
-
|
204
|
+
idCounter = 0
|
205
|
+
|
206
|
+
/**
|
207
|
+
*
|
208
|
+
*/
|
209
|
+
onConstructed() {
|
210
|
+
super.onConstructed();
|
211
|
+
this.idCounter = this.getReference('todo-list').store.getCount()
|
212
|
+
}
|
213
|
+
|
214
|
+
onAddButtonClick(data) {
|
220
215
|
let me = this,
|
221
|
-
field = me.
|
222
|
-
data;
|
216
|
+
field = me.getReference('add-item-field');
|
223
217
|
|
224
218
|
if (field.value) {
|
225
219
|
me.idCounter++;
|
226
220
|
|
227
|
-
|
228
|
-
|
229
|
-
data.push({
|
221
|
+
me.getReference('todo-list').store.add({
|
230
222
|
id : me.idCounter,
|
231
223
|
done: false,
|
232
224
|
text: field.value
|
233
|
-
})
|
234
|
-
|
235
|
-
me.store.data = data
|
225
|
+
})
|
236
226
|
}
|
237
227
|
}
|
238
228
|
}
|
@@ -1,50 +1,47 @@
|
|
1
1
|
{"data": [
|
2
|
-
{"name":
|
3
|
-
{"name": "Benefits", "parentId": null, "isLeaf": false, "id": "
|
4
|
-
{"name": "Introduction ", "parentId": "
|
5
|
-
{"name": "Off the Main Thread", "parentId": "
|
6
|
-
{"name": "Extreme Speed", "parentId": "
|
7
|
-
{"name": "Multi-Window Applications", "parentId": "
|
8
|
-
{"name": "Quick Application Development", "parentId": "
|
9
|
-
{"name": "Complexity and Effort", "parentId": "
|
10
|
-
{"name": "Forms Engine", "parentId": "
|
11
|
-
{"name": "Features and Benefits Summary", "parentId": "
|
12
|
-
{"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted", "collapsed":
|
13
|
-
{"name": "Setup", "parentId": "GettingStarted",
|
14
|
-
{"name": "Workspaces and Applications", "parentId": "GettingStarted",
|
15
|
-
{"name": "Describing a View", "parentId": "GettingStarted",
|
16
|
-
{"name": "Events", "parentId": "GettingStarted",
|
17
|
-
{"name": "Component References", "parentId": "GettingStarted",
|
18
|
-
{"name": "Extending Classes", "parentId": "GettingStarted",
|
19
|
-
{"name": "Config", "parentId": "GettingStarted",
|
20
|
-
{"name": "Shared Bindable Data", "parentId": "GettingStarted",
|
21
|
-
{"name": "Tutorials", "parentId": null, "isLeaf": false, "
|
22
|
-
{"name": "Rock Scissors Paper", "parentId": "Tutorials",
|
23
|
-
{"name": "Earthquakes", "parentId": "Tutorials",
|
24
|
-
{"name": "Todo List", "parentId": "Tutorials",
|
25
|
-
{"name": "Guides", "parentId": null, "isLeaf": false, "
|
26
|
-
{"name": "
|
27
|
-
{"name": "
|
28
|
-
{"name": "
|
29
|
-
{"name": "
|
30
|
-
{"name": "
|
31
|
-
{"name": "
|
32
|
-
{"name": "
|
33
|
-
|
34
|
-
|
35
|
-
{"name": "
|
36
|
-
{"name": "Multi-Window Applications", "parentId": "InDepth",
|
37
|
-
{"name": "Main Thread Addons", "parentId": "InDepth", "isLeaf": false, "id": "MainThreadAddons", "hidden":
|
38
|
-
{"name": "Introduction", "parentId": "MainThreadAddons",
|
39
|
-
{"name": "Example", "parentId": "MainThreadAddons",
|
40
|
-
{"name": "Mixins", "parentId": "InDepth",
|
41
|
-
{"name": "JavaScript Classes", "parentId": null, "isLeaf": false, "id": "
|
42
|
-
{"name": "Classes, Properties, and Methods", "parentId": "
|
43
|
-
{"name": "Overriding Methods", "parentId": "
|
44
|
-
{"name": "Other JavaScript Class Features", "parentId": "
|
45
|
-
{"name": "Super", "parentId": "
|
46
|
-
{"name": "New Node", "parentId": "
|
47
|
-
{"name": "Appendix", "parentId": null, "id": "appendix", "hidden": true, "collapsed": true},
|
48
|
-
{"name": "Stylesheet", "parentId": "appendix", "isLeaf": true, "id": "stylesheet"},
|
49
|
-
{"name": "Test", "parentId": "appendix", "isLeaf": true, "id": "TestLivePreview"}
|
2
|
+
{"name": "Welcome!", "parentId": null, "id": "Welcome" },
|
3
|
+
{"name": "Benefits", "parentId": null, "isLeaf": false, "id": "Benefits"},
|
4
|
+
{"name": "Introduction ", "parentId": "Benefits", "id": "benefits.Introduction"},
|
5
|
+
{"name": "Off the Main Thread", "parentId": "Benefits", "id": "benefits.Multi-Threading"},
|
6
|
+
{"name": "Extreme Speed", "parentId": "Benefits", "id": "benefits.Speed"},
|
7
|
+
{"name": "Multi-Window Applications", "parentId": "Benefits", "id": "benefits.Multi-Window"},
|
8
|
+
{"name": "Quick Application Development", "parentId": "Benefits", "id": "benefits.Quick"},
|
9
|
+
{"name": "Complexity and Effort", "parentId": "Benefits", "id": "benefits.Effort"},
|
10
|
+
{"name": "Forms Engine", "parentId": "Benefits", "id": "benefits.FormsEngine"},
|
11
|
+
{"name": "Features and Benefits Summary", "parentId": "Benefits", "id": "benefits.Features"},
|
12
|
+
{"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted", "collapsed": true},
|
13
|
+
{"name": "Setup", "parentId": "GettingStarted", "id": "gettingstarted.Setup"},
|
14
|
+
{"name": "Workspaces and Applications", "parentId": "GettingStarted", "id": "gettingstarted.Workspaces"},
|
15
|
+
{"name": "Describing a View", "parentId": "GettingStarted", "id": "gettingstarted.DescribingTheUI"},
|
16
|
+
{"name": "Events", "parentId": "GettingStarted", "id": "gettingstarted.Events"},
|
17
|
+
{"name": "Component References", "parentId": "GettingStarted", "id": "gettingstarted.References"},
|
18
|
+
{"name": "Extending Classes", "parentId": "GettingStarted", "id": "gettingstarted.Extending"},
|
19
|
+
{"name": "Config", "parentId": "GettingStarted", "id": "gettingstarted.Config"},
|
20
|
+
{"name": "Shared Bindable Data", "parentId": "GettingStarted", "id": "gettingstarted.ComponentModels"},
|
21
|
+
{"name": "Tutorials", "parentId": null, "isLeaf": false, "id": "Tutorials", "collapsed": true},
|
22
|
+
{"name": "Rock Scissors Paper", "parentId": "Tutorials", "id": "tutorials.RSP", "hidden": true},
|
23
|
+
{"name": "Earthquakes", "parentId": "Tutorials", "id": "tutorials.Earthquakes"},
|
24
|
+
{"name": "Todo List", "parentId": "Tutorials", "id": "tutorials.TodoList"},
|
25
|
+
{"name": "Guides", "parentId": null, "isLeaf": false, "id": "InDepth", "collapsed": true},
|
26
|
+
{"name": "Instance Lifecycle", "parentId": "InDepth", "id": "guides.InstanceLifecycle", "hidden": true},
|
27
|
+
{"name": "User Input (Forms)", "parentId": "InDepth", "id": "guides.Forms", "hidden": true},
|
28
|
+
{"name": "Component and Container Basics", "parentId": "InDepth", "id": "guides.ComponentsAndContainers"},
|
29
|
+
{"name": "Layouts", "parentId": "InDepth", "isLeaf": false, "id": "guides.Layouts", "hidden": true},
|
30
|
+
{"name": "Shared Bindable Data (Component Models)", "parentId": "InDepth", "id": "guides.ViewModels"},
|
31
|
+
{"name": "Custom Components", "parentId": "InDepth", "id": "guides.CustomComponents", "hidden": true},
|
32
|
+
{"name": "Events", "parentId": "InDepth", "isLeaf": false, "id": "GuideEvents"},
|
33
|
+
{"name": "Custom Events", "parentId": "GuideEvents", "id": "guides.events.CustomEvents"},
|
34
|
+
{"name": "DOM Events", "parentId": "GuideEvents", "id": "guides.events.DomEvents"},
|
35
|
+
{"name": "Tables (Stores)", "parentId": "InDepth", "id": "guides.Tables", "hidden": true},
|
36
|
+
{"name": "Multi-Window Applications", "parentId": "InDepth", "id": "guides.MultiWindow", "hidden": true},
|
37
|
+
{"name": "Main Thread Addons", "parentId": "InDepth", "isLeaf": false, "id": "MainThreadAddons", "hidden": true},
|
38
|
+
{"name": "Introduction", "parentId": "MainThreadAddons", "id": "guides.MainThreadAddonIntro"},
|
39
|
+
{"name": "Example", "parentId": "MainThreadAddons", "id": "guides.MainThreadAddonExample"},
|
40
|
+
{"name": "Mixins", "parentId": "InDepth", "id": "guides.Mixins", "hidden": true},
|
41
|
+
{"name": "JavaScript Classes", "parentId": null, "isLeaf": false, "id": "JavaScript", "hidden": true},
|
42
|
+
{"name": "Classes, Properties, and Methods", "parentId": "JavaScript", "id": "javascript.Classes"},
|
43
|
+
{"name": "Overriding Methods", "parentId": "JavaScript", "id": "javascript.Overrides"},
|
44
|
+
{"name": "Other JavaScript Class Features", "parentId": "JavaScript", "id": "javascript.ClassFeatures"},
|
45
|
+
{"name": "Super", "parentId": "JavaScript", "id": "javascript.Super"},
|
46
|
+
{"name": "New Node", "parentId": "JavaScript", "id": "javascript.NewNode"}
|
50
47
|
]}
|
@@ -1,9 +1,10 @@
|
|
1
1
|
.neo-splitter {
|
2
2
|
background-color: var(--splitter-background-color);
|
3
3
|
border : var(--splitter-border);
|
4
|
+
border-radius : var(--splitter-border-radius);
|
4
5
|
transition : background-color 0.3s ease-in-out, border-color 0.3s ease-in-out;
|
5
6
|
|
6
|
-
&:hover {
|
7
|
+
&:active, &:hover {
|
7
8
|
background-color: var(--splitter-hover-color);
|
8
9
|
border-color : var(--splitter-hover-color);
|
9
10
|
}
|
@@ -12,12 +13,14 @@
|
|
12
13
|
border-left : none;
|
13
14
|
border-right: none;
|
14
15
|
cursor : ns-resize;
|
16
|
+
margin : var(--splitter-margin-horizontal);
|
15
17
|
}
|
16
18
|
|
17
19
|
&.neo-vertical {
|
18
20
|
border-bottom: none;
|
19
21
|
border-top : none;
|
20
22
|
cursor : ew-resize;
|
23
|
+
margin : var(--splitter-margin-vertical);
|
21
24
|
}
|
22
25
|
}
|
23
26
|
|
@@ -25,5 +28,11 @@
|
|
25
28
|
&.neo-splitter {
|
26
29
|
background-color: var(--splitter-hover-color);
|
27
30
|
border-color : var(--splitter-hover-color);
|
31
|
+
|
32
|
+
&.neo-horizontal, &.neo-vertical {
|
33
|
+
// getBoundingClientRect() already adds margins to positions,
|
34
|
+
// so it would get added twice unless we nullify it.
|
35
|
+
margin: 0;
|
36
|
+
}
|
28
37
|
}
|
29
38
|
}
|
@@ -1,5 +1,8 @@
|
|
1
1
|
:root .neo-theme-dark { // .neo-splitter
|
2
|
-
--splitter-background-color: #3c3f41;
|
3
|
-
--splitter-border
|
4
|
-
--splitter-
|
2
|
+
--splitter-background-color : #3c3f41;
|
3
|
+
--splitter-border : 1px solid #323232;
|
4
|
+
--splitter-border-radius : 0;
|
5
|
+
--splitter-hover-color : #64B5F6;
|
6
|
+
--splitter-margin-horizontal: 0;
|
7
|
+
--splitter-margin-vertical : 0;
|
5
8
|
}
|
@@ -1,5 +1,8 @@
|
|
1
1
|
:root .neo-theme-light { // .neo-splitter
|
2
|
-
--splitter-background-color: #f2f2f2;
|
3
|
-
--splitter-border
|
4
|
-
--splitter-
|
2
|
+
--splitter-background-color : #f2f2f2;
|
3
|
+
--splitter-border : 1px solid #ddd;
|
4
|
+
--splitter-border-radius : 0;
|
5
|
+
--splitter-hover-color : #5d83a7;
|
6
|
+
--splitter-margin-horizontal: 0;
|
7
|
+
--splitter-margin-vertical : 0;
|
5
8
|
}
|
@@ -1,22 +1,8 @@
|
|
1
1
|
:root .neo-theme-neo-light { // .neo-splitter
|
2
|
-
--splitter-background-color: #f2f2f2;
|
3
|
-
--splitter-border
|
4
|
-
--splitter-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
margin: 8px 2px;
|
9
|
-
border-radius: 100px;
|
10
|
-
border: unset !important;
|
11
|
-
|
12
|
-
&:hover, &:active {
|
13
|
-
background-color: #5595F5 !important;
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
.neo-dragproxy {
|
18
|
-
&.neo-splitter {
|
19
|
-
background-color: #5595F5 !important;
|
20
|
-
}
|
21
|
-
}
|
2
|
+
--splitter-background-color : #f2f2f2;
|
3
|
+
--splitter-border : none;
|
4
|
+
--splitter-border-radius : 5px;
|
5
|
+
--splitter-hover-color : #5595F5;
|
6
|
+
--splitter-margin-horizontal: 2px 8px;
|
7
|
+
--splitter-margin-vertical : 8px 2px;
|
22
8
|
}
|
package/src/DefaultConfig.mjs
CHANGED
@@ -262,12 +262,12 @@ const DefaultConfig = {
|
|
262
262
|
useVdomWorker: true,
|
263
263
|
/**
|
264
264
|
* buildScripts/injectPackageVersion.mjs will update this value
|
265
|
-
* @default '7.0
|
265
|
+
* @default '7.1.0'
|
266
266
|
* @memberOf! module:Neo
|
267
267
|
* @name config.version
|
268
268
|
* @type String
|
269
269
|
*/
|
270
|
-
version: '7.0
|
270
|
+
version: '7.1.0'
|
271
271
|
};
|
272
272
|
|
273
273
|
Object.assign(DefaultConfig, {
|
package/src/code/LivePreview.mjs
CHANGED
@@ -4,6 +4,7 @@ import TabContainer from '../tab/Container.mjs';
|
|
4
4
|
|
5
5
|
const
|
6
6
|
classDeclarationRegex = /class\s+([a-zA-Z$_][a-zA-Z0-9$_]*)\s*(?:extends\s+[a-zA-Z$_][a-zA-Z0-9$_]*)?\s*{[\s\S]*?}/g,
|
7
|
+
classNameRegex = /className\s*:\s*['"]([^'"]+)['"]/g,
|
7
8
|
exportRegex = /export\s+(?:default\s+)?(?:const|let|var|class|function|async\s+function|generator\s+function|async\s+generator\s+function|(\{[\s\S]*?\}))/g,
|
8
9
|
importRegex = /import\s+([\w-]+)\s+from\s+['"]([^'"]+)['"]/;
|
9
10
|
|
@@ -294,6 +295,18 @@ class LivePreview extends Container {
|
|
294
295
|
|
295
296
|
container.removeAll();
|
296
297
|
|
298
|
+
// We must ensure that classes inside the editor won't get cached, since this disables run-time changes
|
299
|
+
// See: https://github.com/neomjs/neo/issues/5863
|
300
|
+
me.findClassNames(codeString).forEach(item => {
|
301
|
+
let nsArray = item.split('.'),
|
302
|
+
className = nsArray.pop(),
|
303
|
+
ns = Neo.ns(nsArray);
|
304
|
+
|
305
|
+
if (ns) {
|
306
|
+
delete ns[className]
|
307
|
+
}
|
308
|
+
});
|
309
|
+
|
297
310
|
try {
|
298
311
|
new Function('container', codeString)(container);
|
299
312
|
} catch (error) {
|
@@ -304,6 +317,21 @@ class LivePreview extends Container {
|
|
304
317
|
}
|
305
318
|
}
|
306
319
|
|
320
|
+
/**
|
321
|
+
* @param {String} sourceCode
|
322
|
+
* @returns {String[]}
|
323
|
+
*/
|
324
|
+
findClassNames(sourceCode) {
|
325
|
+
let classNames = [],
|
326
|
+
match;
|
327
|
+
|
328
|
+
while ((match = classNameRegex.exec(sourceCode)) !== null) {
|
329
|
+
classNames.push(match[1])
|
330
|
+
}
|
331
|
+
|
332
|
+
return classNames
|
333
|
+
}
|
334
|
+
|
307
335
|
/**
|
308
336
|
* @param {String} sourceCode
|
309
337
|
* @returns {String|null}
|
@@ -312,7 +340,6 @@ class LivePreview extends Container {
|
|
312
340
|
let lastClassName = null,
|
313
341
|
match;
|
314
342
|
|
315
|
-
// Iterate through all matches of the regular expression
|
316
343
|
while ((match = classDeclarationRegex.exec(sourceCode)) !== null) {
|
317
344
|
// Update the last class name found
|
318
345
|
lastClassName = match[1]
|
package/src/collection/Base.mjs
CHANGED
@@ -117,6 +117,22 @@ class Splitter extends Component {
|
|
117
117
|
this[this.direction === 'vertical' ? 'width' : 'height'] = value
|
118
118
|
}
|
119
119
|
|
120
|
+
/**
|
121
|
+
* Triggered after the windowId config got changed
|
122
|
+
* @param {Number|null} value
|
123
|
+
* @param {Number|null} oldValue
|
124
|
+
* @protected
|
125
|
+
*/
|
126
|
+
afterSetWindowId(value, oldValue) {
|
127
|
+
super.afterSetWindowId(value, oldValue);
|
128
|
+
|
129
|
+
let {dragZone} = this;
|
130
|
+
|
131
|
+
if (dragZone) {
|
132
|
+
dragZone.windowId = value
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
120
136
|
/**
|
121
137
|
* Triggered before the direction config gets changed
|
122
138
|
* @param {String} value
|
@@ -198,16 +214,17 @@ class Splitter extends Component {
|
|
198
214
|
* @param data
|
199
215
|
*/
|
200
216
|
onDragStart(data) {
|
201
|
-
let me
|
202
|
-
style
|
203
|
-
vertical
|
217
|
+
let me = this,
|
218
|
+
style = me.style || {},
|
219
|
+
vertical = me.direction === 'vertical',
|
220
|
+
{appName, windowId} = me;
|
204
221
|
|
205
222
|
me.parent.disabled = true;
|
206
223
|
|
207
224
|
if (!me.dragZone) {
|
208
225
|
me.dragZone = Neo.create({
|
209
226
|
module : DragZone,
|
210
|
-
appName
|
227
|
+
appName,
|
211
228
|
bodyCursorStyle : vertical ? 'ew-resize !important' : 'ns-resize !important',
|
212
229
|
boundaryContainerId: me.parentId,
|
213
230
|
dragElement : me.vdom,
|
@@ -215,6 +232,7 @@ class Splitter extends Component {
|
|
215
232
|
moveVertical : !vertical,
|
216
233
|
owner : me,
|
217
234
|
useProxyWrapper : false,
|
235
|
+
windowId,
|
218
236
|
...me.dragZoneConfig
|
219
237
|
})
|
220
238
|
} else {
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import Base
|
2
|
-
import
|
1
|
+
import Base from './Base.mjs';
|
2
|
+
import {resolveCallback} from '../util/Function.mjs';
|
3
|
+
import Logger from '../util/Logger.mjs';
|
3
4
|
|
4
5
|
/**
|
5
6
|
* @class Neo.controller.Component
|
@@ -71,7 +72,7 @@ class Component extends Base {
|
|
71
72
|
|
72
73
|
/**
|
73
74
|
* @param {String} handlerName
|
74
|
-
* @param {Neo.component.Base} component
|
75
|
+
* @param {Neo.component.Base} [component]
|
75
76
|
* @returns {Neo.controller.Component|Boolean|null}
|
76
77
|
*/
|
77
78
|
getHandlerScope(handlerName, component) {
|
@@ -81,7 +82,7 @@ class Component extends Base {
|
|
81
82
|
if (component) {
|
82
83
|
// Look for ths function *name* first in the Component itself.
|
83
84
|
// If we find it, return true so calling code knows not to continue to search.
|
84
|
-
const handlerCb =
|
85
|
+
const handlerCb = resolveCallback(handlerName, component);
|
85
86
|
|
86
87
|
// Handler fn is resolved in the Component or its own parent chain.
|
87
88
|
// Return a status indicating that we do not need an early binding
|
@@ -91,8 +92,7 @@ class Component extends Base {
|
|
91
92
|
}
|
92
93
|
|
93
94
|
return Neo.isFunction(me[handlerName]) ?
|
94
|
-
me : parent
|
95
|
-
parent.getHandlerScope(handlerName) : null
|
95
|
+
me : parent?.getHandlerScope(handlerName) || null
|
96
96
|
}
|
97
97
|
|
98
98
|
/**
|
@@ -114,7 +114,7 @@ class Component extends Base {
|
|
114
114
|
{parent} = me;
|
115
115
|
|
116
116
|
if (parent) {
|
117
|
-
return parent
|
117
|
+
return parent
|
118
118
|
}
|
119
119
|
|
120
120
|
return me.component.parent?.getController() || null
|
@@ -238,9 +238,9 @@ class Component extends Base {
|
|
238
238
|
if (eventHandler) {
|
239
239
|
scope = me.getHandlerScope(eventHandler);
|
240
240
|
|
241
|
-
|
242
|
-
|
243
|
-
|
241
|
+
// There can be string based listeners like 'up.onClick', which will resolved inside manager.DomEvents
|
242
|
+
// => Do nothing in case there is no match inside the controller hierarchy.
|
243
|
+
if (scope) {
|
244
244
|
domListener[key] = scope[eventHandler].bind(scope)
|
245
245
|
}
|
246
246
|
}
|
package/src/core/Observable.mjs
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
import Base
|
1
|
+
import Base from './Base.mjs';
|
2
|
+
import {resolveCallback} from '../util/Function.mjs';
|
2
3
|
|
3
4
|
/**
|
4
5
|
* @class Neo.core.Observable
|
@@ -136,7 +137,7 @@ class Observable extends Base {
|
|
136
137
|
*/
|
137
138
|
callback(fn, scope=this, args) {
|
138
139
|
if (fn) {
|
139
|
-
const handler =
|
140
|
+
const handler = resolveCallback(fn, scope);
|
140
141
|
handler.fn.apply(handler.scope, args)
|
141
142
|
}
|
142
143
|
}
|
@@ -172,7 +173,7 @@ class Observable extends Base {
|
|
172
173
|
|
173
174
|
// Resolve function name on the scope (or me), or, if it starts with 'up.'
|
174
175
|
// look in the ownership hierarchy from me.
|
175
|
-
const cb =
|
176
|
+
const cb = resolveCallback(handler.fn, handler.scope || me);
|
176
177
|
|
177
178
|
// remove the listener if the scope no longer exists
|
178
179
|
if (cb.scope && !cb.scope.id) {
|
@@ -338,30 +339,6 @@ class Observable extends Base {
|
|
338
339
|
|
339
340
|
// }
|
340
341
|
|
341
|
-
/**
|
342
|
-
* Locate a callable function by name in the passed scope.
|
343
|
-
*
|
344
|
-
* If the name starts with 'up.', the parent Component chain is searched.
|
345
|
-
*
|
346
|
-
* This is used by Observable.fire and by 'handler' function calls to resolve
|
347
|
-
* string function names in the Component's own hierarchy.
|
348
|
-
* @param {Function|String} fn A function, or the name of a function to find in the passed scope object/
|
349
|
-
* @param {Object} scope The scope to find the function in if it is specified as a string.
|
350
|
-
* @returns {Object}
|
351
|
-
*/
|
352
|
-
resolveCallback(fn, scope=this) {
|
353
|
-
if (typeof fn === 'string') {
|
354
|
-
if (!scope[fn] && fn.startsWith('up.')) {
|
355
|
-
fn = fn.slice(3);
|
356
|
-
while (!scope[fn] && (scope = scope.parent));
|
357
|
-
}
|
358
|
-
|
359
|
-
fn = scope[fn]
|
360
|
-
}
|
361
|
-
|
362
|
-
return {fn, scope}
|
363
|
-
}
|
364
|
-
|
365
342
|
/**
|
366
343
|
* Alias for removeListener
|
367
344
|
* @param {Object|String} name
|
@@ -305,16 +305,17 @@ class DragZone extends Base {
|
|
305
305
|
* @param {Object} data
|
306
306
|
*/
|
307
307
|
dragStart(data) {
|
308
|
-
let me
|
309
|
-
{owner} = me,
|
310
|
-
{cls}
|
311
|
-
rect
|
308
|
+
let me = this,
|
309
|
+
{appName, owner, windowId} = me,
|
310
|
+
{cls} = owner,
|
311
|
+
rect = me.getDragElementRect(data),
|
312
312
|
offsetX, offsetY;
|
313
313
|
|
314
314
|
me.setData();
|
315
315
|
|
316
316
|
Neo.main.addon.DragDrop.setConfigs({
|
317
|
-
appName
|
317
|
+
appName,
|
318
|
+
windowId,
|
318
319
|
...me.getMainThreadConfigs()
|
319
320
|
});
|
320
321
|
|