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.
Files changed (79) hide show
  1. package/README.md +2 -2
  2. package/apps/ServiceWorker.mjs +2 -2
  3. package/apps/portal/index.html +1 -1
  4. package/apps/portal/model/Content.mjs +3 -2
  5. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  6. package/apps/portal/view/home/parts/Features.mjs +5 -5
  7. package/examples/ServiceWorker.mjs +2 -2
  8. package/examples/todoList/version2/MainContainer.mjs +38 -48
  9. package/examples/todoList/version2/TodoList.mjs +6 -39
  10. package/examples/todoList/version2/TodoListModel.mjs +1 -1
  11. package/package.json +7 -7
  12. package/resources/data/deck/learnneo/pages/Welcome.md +0 -4
  13. package/resources/data/deck/learnneo/pages/guides/Forms.md +1 -0
  14. package/resources/data/deck/learnneo/pages/guides/InstanceLifecycle.md +1 -0
  15. package/resources/data/deck/learnneo/pages/guides/Layouts.md +1 -0
  16. package/resources/data/deck/learnneo/pages/guides/Mixins.md +1 -0
  17. package/resources/data/deck/learnneo/pages/guides/MultiWindow.md +1 -0
  18. package/resources/data/deck/learnneo/pages/guides/Tables.md +1 -0
  19. package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +263 -0
  20. package/resources/data/deck/learnneo/pages/{TodoList.md → tutorials/TodoList.md} +23 -33
  21. package/resources/data/deck/learnneo/tree.json +45 -48
  22. package/resources/scss/src/component/Splitter.scss +10 -1
  23. package/resources/scss/theme-dark/component/Splitter.scss +6 -3
  24. package/resources/scss/theme-light/component/Splitter.scss +6 -3
  25. package/resources/scss/theme-neo-light/component/Splitter.scss +6 -20
  26. package/src/DefaultConfig.mjs +2 -2
  27. package/src/code/LivePreview.mjs +28 -1
  28. package/src/collection/Base.mjs +1 -0
  29. package/src/component/Splitter.mjs +22 -4
  30. package/src/controller/Component.mjs +10 -10
  31. package/src/core/Observable.mjs +4 -27
  32. package/src/draggable/DragZone.mjs +6 -5
  33. package/src/grid/View.mjs +82 -0
  34. package/src/list/Base.mjs +16 -0
  35. package/src/main/addon/DragDrop.mjs +3 -2
  36. package/src/manager/DomEvent.mjs +30 -18
  37. package/src/table/View.mjs +82 -0
  38. package/src/util/Function.mjs +24 -0
  39. package/resources/data/deck/learnneo/pages/2023-10-08T20-37-30-658Z.md +0 -0
  40. package/resources/data/deck/learnneo/pages/2023-10-08T22-22-11-013Z.md +0 -0
  41. package/resources/data/deck/learnneo/pages/Earthquakes-01-goals.md +0 -32
  42. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-01-generate-a-workspace.md +0 -47
  43. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-02-generate-the-starter-app.md +0 -150
  44. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-03-debugging.md +0 -136
  45. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-04-fetch-data.md +0 -146
  46. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-05-refactor-the-table.md +0 -146
  47. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-06-use-a-view-model.md +0 -301
  48. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-07-use-the-google-maps-addon.md +0 -175
  49. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-08-events.md +0 -38
  50. package/resources/data/deck/learnneo/pages/TestLivePreview.md +0 -32
  51. package/resources/data/deck/learnneo/pages/WhatAboutHTML.md +0 -1
  52. package/resources/data/deck/learnneo/pages/stylesheet.md +0 -57
  53. /package/resources/data/deck/learnneo/pages/{WhyNeo-Effort.md → benefits/Effort.md} +0 -0
  54. /package/resources/data/deck/learnneo/pages/{WhyNeo-Features.md → benefits/Features.md} +0 -0
  55. /package/resources/data/deck/learnneo/pages/{WhyNeo-Intro.md → benefits/Introduction.md} +0 -0
  56. /package/resources/data/deck/learnneo/pages/{WhyNeo-Multi-Window.md → benefits/Multi-Window.md} +0 -0
  57. /package/resources/data/deck/learnneo/pages/{WhyNeo-Quick.md → benefits/Quick.md} +0 -0
  58. /package/resources/data/deck/learnneo/pages/{WhyNeo-Speed.md → benefits/Speed.md} +0 -0
  59. /package/resources/data/deck/learnneo/pages/{ComponentModels.md → gettingstarted/ComponentModels.md} +0 -0
  60. /package/resources/data/deck/learnneo/pages/{Config.md → gettingstarted/Config.md} +0 -0
  61. /package/resources/data/deck/learnneo/pages/{DescribingTheUI.md → gettingstarted/DescribingTheUI.md} +0 -0
  62. /package/resources/data/deck/learnneo/pages/{Events.md → gettingstarted/Events.md} +0 -0
  63. /package/resources/data/deck/learnneo/pages/{Extending.md → gettingstarted/Extending.md} +0 -0
  64. /package/resources/data/deck/learnneo/pages/{References.md → gettingstarted/References.md} +0 -0
  65. /package/resources/data/deck/learnneo/pages/{Setup.md → gettingstarted/Setup.md} +0 -0
  66. /package/resources/data/deck/learnneo/pages/{2023-10-14T19-25-08-153Z.md → gettingstarted/Workspaces.md} +0 -0
  67. /package/resources/data/deck/learnneo/pages/{ComponentsAndContainers.md → guides/ComponentsAndContainers.md} +0 -0
  68. /package/resources/data/deck/learnneo/pages/{CustomComponents.md → guides/CustomComponents.md} +0 -0
  69. /package/resources/data/deck/learnneo/pages/{MainThreadAddonExample.md → guides/MainThreadAddonExample.md} +0 -0
  70. /package/resources/data/deck/learnneo/pages/{MainThreadAddonIntro.md → guides/MainThreadAddonIntro.md} +0 -0
  71. /package/resources/data/deck/learnneo/pages/{GuideViewModels.md → guides/ViewModels.md} +0 -0
  72. /package/resources/data/deck/learnneo/pages/{GuideEvents.md → guides/events/CustomEvents.md} +0 -0
  73. /package/resources/data/deck/learnneo/pages/{2023-10-08T20-20-37-336Z.md → javascript/ClassFeatures.md} +0 -0
  74. /package/resources/data/deck/learnneo/pages/{2023-10-07T19-18-28-517Z.md → javascript/Classes.md} +0 -0
  75. /package/resources/data/deck/learnneo/pages/{2023-10-31T13-59-37-550Z.md → javascript/NewNode.md} +0 -0
  76. /package/resources/data/deck/learnneo/pages/{2023-10-08T20-20-07-934Z.md → javascript/Overrides.md} +0 -0
  77. /package/resources/data/deck/learnneo/pages/{2023-10-08T21-58-25-809Z.md → javascript/Super.md} +0 -0
  78. /package/resources/data/deck/learnneo/pages/{Earthquakes.md → tutorials/Earthquakes.md} +0 -0
  79. /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
- // custom configs
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
- store : me.store,
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 : 'addItemField'
195
+ reference : 'add-item-field'
209
196
  }, '->', {
210
- handler : me.onAddButtonClick,
211
- handlerScope: me,
212
- scope : me,
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
- onAddButtonClick() {
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.down({reference: 'addItemField'}),
222
- data;
216
+ field = me.getReference('add-item-field');
223
217
 
224
218
  if (field.value) {
225
219
  me.idCounter++;
226
220
 
227
- data = me.store.data;
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": "Welcome!", "parentId": null, "isLeaf": true, "id": "Welcome" },
3
- {"name": "Benefits", "parentId": null, "isLeaf": false, "id": "WhyNeo"},
4
- {"name": "Introduction ", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Intro"},
5
- {"name": "Off the Main Thread", "parentId": "WhyNeo", "isLeaf": true, "id": "benefits.Multi-Threading"},
6
- {"name": "Extreme Speed", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Speed"},
7
- {"name": "Multi-Window Applications", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Multi-Window"},
8
- {"name": "Quick Application Development", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Quick"},
9
- {"name": "Complexity and Effort", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Effort"},
10
- {"name": "Forms Engine", "parentId": "WhyNeo", "isLeaf": true, "id": "benefits.FormsEngine"},
11
- {"name": "Features and Benefits Summary", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Features"},
12
- {"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted", "collapsed": true},
13
- {"name": "Setup", "parentId": "GettingStarted", "isLeaf": true, "id": "Setup"},
14
- {"name": "Workspaces and Applications", "parentId": "GettingStarted", "isLeaf": true, "id": "2023-10-14T19-25-08-153Z"},
15
- {"name": "Describing a View", "parentId": "GettingStarted", "isLeaf": true, "id": "DescribingTheUI"},
16
- {"name": "Events", "parentId": "GettingStarted", "isLeaf": true, "id": "Events"},
17
- {"name": "Component References", "parentId": "GettingStarted", "isLeaf": true, "id": "References"},
18
- {"name": "Extending Classes", "parentId": "GettingStarted", "isLeaf": true, "id": "Extending"},
19
- {"name": "Config", "parentId": "GettingStarted", "isLeaf": true, "id": "Config"},
20
- {"name": "Shared Bindable Data", "parentId": "GettingStarted", "isLeaf": true, "id": "ComponentModels"},
21
- {"name": "Tutorials", "parentId": null, "isLeaf": false, "expanded": false, "id": "Tutorials", "collapsed": true},
22
- {"name": "Rock Scissors Paper", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "RSP", "hidden": true},
23
- {"name": "Earthquakes", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "Earthquakes", "collapsed": true},
24
- {"name": "Todo List", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "TodoList"},
25
- {"name": "Guides", "parentId": null, "isLeaf": false, "expanded": false, "id": "InDepth", "collapsed": true},
26
- {"name": "Config", "parentId": "InDepth", "isLeaf": false, "id": "Config"},
27
- {"name": "Instance Lifecycle", "parentId": "InDepth", "isLeaf": false, "id": "InstanceLifecycle", "hidden": true},
28
- {"name": "User Input (Forms)", "parentId": "InDepth", "isLeaf": false, "id": "Forms", "hidden": true},
29
- {"name": "Component and Container Basics", "parentId": "InDepth", "isLeaf": true, "id": "ComponentsAndContainers"},
30
- {"name": "Layouts", "parentId": "InDepth", "isLeaf": false, "id": "Layouts", "hidden": true},
31
- {"name": "View Models", "parentId": "InDepth", "isLeaf": true, "id": "GuideViewModels"},
32
- {"name": "Custom Components", "parentId": "InDepth", "isLeaf": true, "id": "CustomComponents", "hidden": true},
33
- {"name": "Events", "parentId": "InDepth", "isLeaf": true, "expanded": false, "id": "GuideEvents"},
34
- {"name": "Tables (Stores)", "parentId": "InDepth", "isLeaf": false, "id": "Tables", "hidden": true},
35
- {"name": "Shared Bindable Data (Component Models)", "parentId": "InDepth", "isLeaf": false, "id": "InDepthComponentModels", "hidden": true},
36
- {"name": "Multi-Window Applications", "parentId": "InDepth", "isLeaf": false, "id": "MultiWindow", "hidden": true},
37
- {"name": "Main Thread Addons", "parentId": "InDepth", "isLeaf": false, "id": "MainThreadAddons", "hidden": true},
38
- {"name": "Introduction", "parentId": "MainThreadAddons", "isLeaf": true, "id": "MainThreadAddonIntro"},
39
- {"name": "Example", "parentId": "MainThreadAddons", "isLeaf": true, "id": "MainThreadAddonExample"},
40
- {"name": "Mixins", "parentId": "InDepth", "isLeaf": false, "id": "Mixins", "hidden": true},
41
- {"name": "JavaScript Classes", "parentId": null, "isLeaf": false, "id": "JavaScriptClasses", "hidden": true},
42
- {"name": "Classes, Properties, and Methods", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-07T19-18-28-517Z"},
43
- {"name": "Overriding Methods", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T20-20-07-934Z"},
44
- {"name": "Other JavaScript Class Features", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T20-20-37-336Z"},
45
- {"name": "Super", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T21-58-25-809Z"},
46
- {"name": "New Node", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-31T13-59-37-550Z"},
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 : 1px solid #323232;
4
- --splitter-hover-color : #64B5F6;
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 : 1px solid #ddd;
4
- --splitter-hover-color : #5d83a7
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 : 1px solid #ddd;
4
- --splitter-hover-color : #5d83a7;
5
-
6
- .neo-splitter {
7
- opacity: 1;
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
  }
@@ -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.5'
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.5'
270
+ version: '7.1.0'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
@@ -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]
@@ -76,6 +76,7 @@ class Base extends CoreBase {
76
76
  /**
77
77
  * A map containing the key & reference of each collection item for faster access
78
78
  * @member {Map} map_=null
79
+ * @protected
79
80
  */
80
81
  map_: null,
81
82
  /**
@@ -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 = this,
202
- style = me.style || {},
203
- vertical = me.direction === '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 : me.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 from './Base.mjs';
2
- import Logger from '../util/Logger.mjs';
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 = component.resolveCallback(handlerName, component);
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
- if (!scope) {
242
- Logger.logError('Unknown domEvent handler for', eventHandler, component)
243
- } else {
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
  }
@@ -1,4 +1,5 @@
1
- import Base from './Base.mjs';
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 = this.resolveCallback(fn, scope);
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 = me.resolveCallback(handler.fn, handler.scope || me);
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 = this,
309
- {owner} = me,
310
- {cls} = owner,
311
- rect = me.getDragElementRect(data),
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: me.appName,
317
+ appName,
318
+ windowId,
318
319
  ...me.getMainThreadConfigs()
319
320
  });
320
321