neo.mjs 10.0.0-alpha.3 → 10.0.0-alpha.5

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 (109) hide show
  1. package/.github/CODING_GUIDELINES.md +1 -1
  2. package/README.md +52 -11
  3. package/ServiceWorker.mjs +2 -2
  4. package/apps/portal/index.html +1 -1
  5. package/apps/portal/view/blog/List.mjs +1 -1
  6. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  7. package/apps/portal/view/learn/ContentComponent.mjs +2 -1
  8. package/apps/portal/view/learn/MainContainerStateProvider.mjs +3 -6
  9. package/apps/realworld/view/HomeComponent.mjs +1 -1
  10. package/apps/realworld/view/user/ProfileComponent.mjs +1 -1
  11. package/apps/sharedcovid/view/MainContainerController.mjs +1 -1
  12. package/apps/shareddialog/view/MainContainerController.mjs +2 -2
  13. package/buildScripts/buildThemes.mjs +1 -1
  14. package/examples/grid/animatedRowSorting/Viewport.mjs +4 -4
  15. package/examples/grid/bigData/ControlsContainer.mjs +3 -3
  16. package/examples/grid/bigData/GridContainer.mjs +8 -8
  17. package/examples/grid/cellEditing/MainContainer.mjs +5 -5
  18. package/examples/grid/container/MainContainer.mjs +4 -4
  19. package/examples/grid/nestedRecordFields/Viewport.mjs +5 -5
  20. package/learn/README.md +83 -0
  21. package/learn/guides/ApplicationBootstrap.md +352 -0
  22. package/learn/guides/DeclarativeComponentTreesVsImperativeVdom.md +500 -0
  23. package/learn/guides/WorkingWithVDom.md +748 -0
  24. package/learn/tree.json +53 -0
  25. package/package.json +2 -2
  26. package/resources/scss/src/grid/{View.scss → Body.scss} +2 -2
  27. package/resources/scss/src/grid/VerticalScrollbar.scss +1 -1
  28. package/resources/scss/src/grid/plugin/AnimateRows.scss +1 -1
  29. package/resources/scss/src/grid/plugin/CellEditing.scss +1 -1
  30. package/resources/scss/theme-dark/grid/{View.scss → Body.scss} +1 -1
  31. package/resources/scss/theme-light/grid/{View.scss → Body.scss} +1 -1
  32. package/resources/scss/theme-neo-light/grid/{View.scss → Body.scss} +1 -1
  33. package/src/DefaultConfig.mjs +27 -14
  34. package/src/Main.mjs +1 -1
  35. package/src/Neo.mjs +16 -0
  36. package/src/button/Base.mjs +2 -2
  37. package/src/calendar/view/MainContainerStateProvider.mjs +1 -1
  38. package/src/grid/{View.mjs → Body.mjs} +17 -17
  39. package/src/grid/Container.mjs +58 -58
  40. package/src/grid/ScrollManager.mjs +56 -56
  41. package/src/grid/VerticalScrollbar.mjs +2 -2
  42. package/src/grid/_export.mjs +2 -2
  43. package/src/grid/column/AnimatedChange.mjs +5 -5
  44. package/src/grid/column/Base.mjs +1 -1
  45. package/src/grid/column/Component.mjs +6 -6
  46. package/src/grid/header/Button.mjs +1 -1
  47. package/src/grid/header/Toolbar.mjs +9 -9
  48. package/src/grid/plugin/AnimateRows.mjs +1 -2
  49. package/src/layout/Cube.mjs +2 -2
  50. package/src/main/DeltaUpdates.mjs +11 -10
  51. package/src/main/addon/Navigator.mjs +1 -1
  52. package/src/main/addon/WindowPosition.mjs +1 -1
  53. package/src/main/render/StringBasedRenderer.mjs +1 -1
  54. package/src/tab/header/Toolbar.mjs +1 -1
  55. package/src/table/header/Button.mjs +1 -1
  56. package/src/toolbar/Base.mjs +1 -1
  57. package/src/util/Style.mjs +2 -6
  58. package/src/util/VDom.mjs +1 -1
  59. package/src/util/VNode.mjs +1 -1
  60. package/src/vdom/Helper.mjs +96 -49
  61. package/src/vdom/VNode.mjs +38 -2
  62. package/src/worker/App.mjs +8 -19
  63. package/src/worker/Base.mjs +87 -5
  64. package/src/worker/Manager.mjs +90 -36
  65. package/resources/data/deck/learnneo/tree.json +0 -50
  66. package/resources/data/deck/whyneo.md +0 -80
  67. /package/{resources/data/deck/learnneo/pages → learn}/Glossary.md +0 -0
  68. /package/{resources/data/deck/learnneo/pages → learn}/UsingTheseTopics.md +0 -0
  69. /package/{resources/data/deck/learnneo/pages → learn}/benefits/ConfigSystem.md +0 -0
  70. /package/{resources/data/deck/learnneo/pages → learn}/benefits/Effort.md +0 -0
  71. /package/{resources/data/deck/learnneo/pages → learn}/benefits/Features.md +0 -0
  72. /package/{resources/data/deck/learnneo/pages → learn}/benefits/FormsEngine.md +0 -0
  73. /package/{resources/data/deck/learnneo/pages → learn}/benefits/FourEnvironments.md +0 -0
  74. /package/{resources/data/deck/learnneo/pages → learn}/benefits/Introduction.md +0 -0
  75. /package/{resources/data/deck/learnneo/pages → learn}/benefits/MultiWindow.md +0 -0
  76. /package/{resources/data/deck/learnneo/pages → learn}/benefits/OffTheMainThread.md +0 -0
  77. /package/{resources/data/deck/learnneo/pages → learn}/benefits/Quick.md +0 -0
  78. /package/{resources/data/deck/learnneo/pages → learn}/benefits/Speed.md +0 -0
  79. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/ComponentModels.md +0 -0
  80. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Config.md +0 -0
  81. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/DescribingTheUI.md +0 -0
  82. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Events.md +0 -0
  83. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Extending.md +0 -0
  84. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/References.md +0 -0
  85. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Setup.md +0 -0
  86. /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Workspaces.md +0 -0
  87. /package/{resources/data/deck/learnneo/pages → learn}/guides/ComponentsAndContainers.md +0 -0
  88. /package/{resources/data/deck/learnneo/pages → learn}/guides/CustomComponents.md +0 -0
  89. /package/{resources/data/deck/learnneo/pages → learn}/guides/Forms.md +0 -0
  90. /package/{resources/data/deck/learnneo/pages → learn}/guides/InstanceLifecycle.md +0 -0
  91. /package/{resources/data/deck/learnneo/pages → learn}/guides/Layouts.md +0 -0
  92. /package/{resources/data/deck/learnneo/pages → learn}/guides/MainThreadAddonExample.md +0 -0
  93. /package/{resources/data/deck/learnneo/pages → learn}/guides/MainThreadAddonIntro.md +0 -0
  94. /package/{resources/data/deck/learnneo/pages → learn}/guides/Mixins.md +0 -0
  95. /package/{resources/data/deck/learnneo/pages → learn}/guides/MultiWindow.md +0 -0
  96. /package/{resources/data/deck/learnneo/pages → learn}/guides/PortalApp.md +0 -0
  97. /package/{resources/data/deck/learnneo/pages → learn}/guides/StateProviders.md +0 -0
  98. /package/{resources/data/deck/learnneo/pages → learn}/guides/Tables.md +0 -0
  99. /package/{resources/data/deck/learnneo/pages → learn}/guides/events/CustomEvents.md +0 -0
  100. /package/{resources/data/deck/learnneo/pages → learn}/guides/events/DomEvents.md +0 -0
  101. /package/{resources/data/deck/learnneo/pages → learn}/javascript/ClassFeatures.md +0 -0
  102. /package/{resources/data/deck/learnneo/pages → learn}/javascript/Classes.md +0 -0
  103. /package/{resources/data/deck/learnneo/pages → learn}/javascript/NewNode.md +0 -0
  104. /package/{resources/data/deck/learnneo/pages → learn}/javascript/Overrides.md +0 -0
  105. /package/{resources/data/deck/learnneo/pages → learn}/javascript/Super.md +0 -0
  106. /package/{resources/data/deck/learnneo/pages → learn}/tutorials/Earthquakes.md +0 -0
  107. /package/{resources/data/deck/learnneo/pages → learn}/tutorials/RSP.md +0 -0
  108. /package/{resources/data/deck/learnneo/pages → learn}/tutorials/TodoList.md +0 -0
  109. /package/resources/data/{deck/learnneo/data/theBeatles.json → theBeatles.json} +0 -0
@@ -0,0 +1,53 @@
1
+ {"data": [
2
+ {"name": "Using These Topics", "parentId": null, "id": "UsingTheseTopics" },
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.OffTheMainThread"},
6
+ {"name": "4 Environments", "parentId": "Benefits", "id": "benefits.FourEnvironments"},
7
+ {"name": "Unified Config System", "parentId": "Benefits", "id": "benefits.ConfigSystem"},
8
+ {"name": "Extreme Speed", "parentId": "Benefits", "id": "benefits.Speed"},
9
+ {"name": "Multi-Window Applications", "parentId": "Benefits", "id": "benefits.MultiWindow"},
10
+ {"name": "Quick Application Development", "parentId": "Benefits", "id": "benefits.Quick"},
11
+ {"name": "Complexity and Effort", "parentId": "Benefits", "id": "benefits.Effort"},
12
+ {"name": "Forms Engine", "parentId": "Benefits", "id": "benefits.FormsEngine"},
13
+ {"name": "Features and Benefits Summary", "parentId": "Benefits", "id": "benefits.Features"},
14
+ {"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted", "collapsed": true},
15
+ {"name": "Setup", "parentId": "GettingStarted", "id": "gettingstarted.Setup"},
16
+ {"name": "Workspaces and Applications", "parentId": "GettingStarted", "id": "gettingstarted.Workspaces"},
17
+ {"name": "Describing a View", "parentId": "GettingStarted", "id": "gettingstarted.DescribingTheUI"},
18
+ {"name": "Events", "parentId": "GettingStarted", "id": "gettingstarted.Events"},
19
+ {"name": "Component References", "parentId": "GettingStarted", "id": "gettingstarted.References"},
20
+ {"name": "Extending Classes", "parentId": "GettingStarted", "id": "gettingstarted.Extending"},
21
+ {"name": "Config", "parentId": "GettingStarted", "id": "gettingstarted.Config"},
22
+ {"name": "Shared Bindable Data", "parentId": "GettingStarted", "id": "gettingstarted.ComponentModels"},
23
+ {"name": "Guides", "parentId": null, "isLeaf": false, "id": "InDepth", "collapsed": true},
24
+ {"name": "Application Bootstrap", "parentId": "InDepth", "id": "guides.ApplicationBootstrap"},
25
+ {"name": "Declarative Component Trees VS Imperative Vdom", "parentId": "InDepth", "id": "guides.DeclarativeComponentTreesVsImperativeVdom"},
26
+ {"name": "Working with VDom", "parentId": "InDepth", "id": "guides.WorkingWithVDom"},
27
+ {"name": "Instance Lifecycle", "parentId": "InDepth", "id": "guides.InstanceLifecycle", "hidden": true},
28
+ {"name": "User Input (Forms)", "parentId": "InDepth", "id": "guides.Forms", "hidden": true},
29
+ {"name": "Component and Container Basics", "parentId": "InDepth", "id": "guides.ComponentsAndContainers"},
30
+ {"name": "Layouts", "parentId": "InDepth", "isLeaf": false, "id": "guides.Layouts", "hidden": true},
31
+ {"name": "Shared Bindable Data (State Providers)", "parentId": "InDepth", "id": "guides.StateProviders"},
32
+ {"name": "Custom Components", "parentId": "InDepth", "id": "guides.CustomComponents", "hidden": true},
33
+ {"name": "Events", "parentId": "InDepth", "isLeaf": false, "id": "GuideEvents"},
34
+ {"name": "Custom Events", "parentId": "GuideEvents", "id": "guides.events.CustomEvents"},
35
+ {"name": "DOM Events", "parentId": "GuideEvents", "id": "guides.events.DomEvents"},
36
+ {"name": "Portal App", "parentId": "InDepth", "id": "guides.PortalApp"},
37
+ {"name": "Tables (Stores)", "parentId": "InDepth", "id": "guides.Tables", "hidden": true},
38
+ {"name": "Multi-Window Applications", "parentId": "InDepth", "id": "guides.MultiWindow", "hidden": true},
39
+ {"name": "Main Thread Addons", "parentId": "InDepth", "isLeaf": false, "id": "MainThreadAddons", "hidden": true},
40
+ {"name": "Introduction", "parentId": "MainThreadAddons", "id": "guides.MainThreadAddonIntro"},
41
+ {"name": "Example", "parentId": "MainThreadAddons", "id": "guides.MainThreadAddonExample"},
42
+ {"name": "Mixins", "parentId": "InDepth", "id": "guides.Mixins", "hidden": true},
43
+ {"name": "Tutorials", "parentId": null, "isLeaf": false, "id": "Tutorials", "collapsed": true},
44
+ {"name": "Rock Scissors Paper", "parentId": "Tutorials", "id": "tutorials.RSP", "hidden": true},
45
+ {"name": "Earthquakes", "parentId": "Tutorials", "id": "tutorials.Earthquakes"},
46
+ {"name": "Todo List", "parentId": "Tutorials", "id": "tutorials.TodoList"},
47
+ {"name": "JavaScript Classes", "parentId": null, "isLeaf": false, "id": "JavaScript", "hidden": true},
48
+ {"name": "Classes, Properties, and Methods", "parentId": "JavaScript", "id": "javascript.Classes"},
49
+ {"name": "Overriding Methods", "parentId": "JavaScript", "id": "javascript.Overrides"},
50
+ {"name": "Other JavaScript Class Features", "parentId": "JavaScript", "id": "javascript.ClassFeatures"},
51
+ {"name": "Super", "parentId": "JavaScript", "id": "javascript.Super"},
52
+ {"name": "New Node", "parentId": "JavaScript", "id": "javascript.NewNode"}
53
+ ]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name" : "neo.mjs",
3
- "version" : "10.0.0-alpha.3",
3
+ "version" : "10.0.0-alpha.5",
4
4
  "description" : "Neo.mjs: The multi-threaded UI framework for building ultra-fast, desktop-like web applications with uncompromised responsiveness, inherent security, and a transpilation-free dev mode.",
5
5
  "type" : "module",
6
6
  "repository" : {
@@ -94,7 +94,7 @@
94
94
  "postcss" : "^8.5.6",
95
95
  "sass" : "^1.89.2",
96
96
  "siesta-lite" : "5.5.2",
97
- "terser" : "^5.43.0",
97
+ "terser" : "^5.43.1",
98
98
  "url" : "^0.11.4",
99
99
  "webpack" : "^5.99.9",
100
100
  "webpack-cli" : "^6.0.1",
@@ -1,4 +1,4 @@
1
- .neo-grid-view-wrapper {
1
+ .neo-grid-body-wrapper {
2
2
  height : 100%;
3
3
  overflow-anchor: none;
4
4
  overflow-x : hidden;
@@ -11,7 +11,7 @@
11
11
  }
12
12
  }
13
13
 
14
- .neo-grid-view {
14
+ .neo-grid-body {
15
15
  height : 100%;
16
16
  overflow-x: visible;
17
17
 
@@ -14,7 +14,7 @@
14
14
  }
15
15
  }
16
16
 
17
- .neo-grid-wrapper:has(.neo-grid-view.neo-is-scrolling) {
17
+ .neo-grid-wrapper:has(.neo-grid-body.neo-is-scrolling) {
18
18
  .neo-grid-vertical-scrollbar {
19
19
  opacity: 1;
20
20
  }
@@ -1,4 +1,4 @@
1
- .neo-grid-view {
1
+ .neo-grid-body {
2
2
  &.neo-animate-rows {
3
3
  .neo-grid-row {
4
4
  transition:
@@ -1,4 +1,4 @@
1
- .neo-grid-view {
1
+ .neo-grid-body {
2
2
  .neo-grid-cell {
3
3
  &:has(.neo-grid-editor) {
4
4
  padding: 1px 4px 2px;
@@ -1,4 +1,4 @@
1
- :root .neo-theme-dark { // .neo-grid-view
1
+ :root .neo-theme-dark { // .neo-grid-body
2
2
  --grid-cell-background-color-hover : #54595c;
3
3
  --grid-cell-ismodified-color : orange;
4
4
  --grid-cell-ismodified-size : 10px;
@@ -1,6 +1,6 @@
1
1
  @use "sass:color";
2
2
 
3
- :root .neo-theme-light { // .neo-grid-view
3
+ :root .neo-theme-light { // .neo-grid-body
4
4
  --grid-cell-background-color-hover : #{color.adjust(#33343d, $lightness: 70%)};
5
5
  --grid-cell-ismodified-color : orange;
6
6
  --grid-cell-ismodified-size : 10px;
@@ -1,6 +1,6 @@
1
1
  @use "sass:color";
2
2
 
3
- :root .neo-theme-neo-light { // .neo-grid-view
3
+ :root .neo-theme-neo-light { // .neo-grid-body
4
4
  --grid-cell-background-color-hover : #{color.adjust(#33343d, $lightness: 70%)};
5
5
  --grid-cell-ismodified-color : orange;
6
6
  --grid-cell-ismodified-size : 10px;
@@ -200,6 +200,31 @@ const DefaultConfig = {
200
200
  * @type Boolean
201
201
  */
202
202
  useCanvasWorker: false,
203
+ /**
204
+ * `true` will enable the advanced, secure, and performant direct DOM API rendering strategy (recommended).
205
+ * In this mode, `Neo.vdom.Helper` will create and send structured VNode object graphs to the Main Thread.
206
+ * `Neo.main.DeltaUpdates` will then use `Neo.main.render.DomApiRenderer` to directly manipulate the DOM.
207
+ * Crucially, `Neo.main.render.DomApiRenderer` builds new **DOM subtrees** (from the received VNode object graphs)
208
+ * as detached DocumentFragments or elements, entirely outside the live DOM tree.
209
+ * These fully constructed fragments are then inserted into the live document in a **single, atomic operation**.
210
+ * This approach inherently minimizes costly browser reflows/repaints, drastically reduces Cross-Site Scripting (XSS) risks,
211
+ * and optimizes for surgical, atomic DOM updates for unparalleled performance.
212
+ *
213
+ * `false` will enable the legacy string-based rendering strategy.
214
+ * In this mode, `Neo.vdom.Helper` will generate complete HTML strings (`outerHTML`) for VNode subtrees.
215
+ * `Neo.main.DeltaUpdates` will then use `Neo.main.render.StringBasedRenderer` to insert these
216
+ * strings into the DOM using methods like `parentNode.insertAdjacentHTML()`.
217
+ * While performant for large insertions, this mode is generally less secure due to potential XSS vectors
218
+ * and relies on browser HTML parsing, which can be less efficient for granular updates.
219
+ *
220
+ * This configuration affects both the initial painting of your applications and the creation
221
+ * of new component trees at runtime.
222
+ * @default true
223
+ * @memberOf! module:Neo
224
+ * @name config.useDomApiRenderer
225
+ * @type Boolean
226
+ */
227
+ useDomApiRenderer: true,
203
228
  /**
204
229
  * Flag if vdom ids should get mapped into DOM element ids.
205
230
  * false will convert them into a "data-neo-id" attribute.
@@ -246,18 +271,6 @@ const DefaultConfig = {
246
271
  * @type Boolean
247
272
  */
248
273
  useSharedWorkers: false,
249
- /**
250
- * `true` will let the `vdom.Helper` create a String-based representation of the vnode tree.
251
- * Main will then use e.g.`parentNode.insertAdjacentHTML('beforeend', delta.outerHTML);`
252
- * This affects the initial painting of your apps, but also the creation of new component trees at run-time.
253
- * `false` will skip the creation of the String, and instead use DOM APIs to generate a fragment inside Main,
254
- * into which the vnode tree will get applied.
255
- * @default false
256
- * @memberOf! module:Neo
257
- * @name config.useStringBasedMounting
258
- * @type Boolean
259
- */
260
- useStringBasedMounting: false,
261
274
  /**
262
275
  * True will generate a new task worker, which can get filled with own expensive remote methods
263
276
  * @default false
@@ -276,12 +289,12 @@ const DefaultConfig = {
276
289
  useVdomWorker: true,
277
290
  /**
278
291
  * buildScripts/injectPackageVersion.mjs will update this value
279
- * @default '10.0.0-alpha.3'
292
+ * @default '10.0.0-alpha.5'
280
293
  * @memberOf! module:Neo
281
294
  * @name config.version
282
295
  * @type String
283
296
  */
284
- version: '10.0.0-alpha.3'
297
+ version: '10.0.0-alpha.5'
285
298
  };
286
299
 
287
300
  Object.assign(DefaultConfig, {
package/src/Main.mjs CHANGED
@@ -42,7 +42,7 @@ class Main extends core.Base {
42
42
  readQueue: [],
43
43
  /**
44
44
  * Remote method access for other workers
45
- * @member {Object} remote={app: [//...]}
45
+ * @member {Object} remote
46
46
  * @protected
47
47
  */
48
48
  remote: {
package/src/Neo.mjs CHANGED
@@ -436,6 +436,22 @@ Neo = globalThis.Neo = Object.assign({
436
436
  return Neo.create(className, config)
437
437
  },
438
438
 
439
+ /**
440
+ * Updates the global Neo.config object across all active workers and connected browser windows.
441
+ *
442
+ * This is the unified entry point for changing global framework configurations.
443
+ * The framework automatically handles the complex multi-threaded and multi-window
444
+ * synchronization (via App Workers and Shared Workers, if active), ensuring
445
+ * consistency across the entire application without boilerplate.
446
+ *
447
+ * You can pass a partial config object to update specific keys.
448
+ * For nested objects, Neo.mjs performs a deep merge to preserve existing properties.
449
+ *
450
+ * @memberOf module:Neo
451
+ * @function setGlobalConfig
452
+ * @param {Object} config The partial or full Neo.config object with changes to apply.
453
+ */
454
+
439
455
  /**
440
456
  * Internally used at the end of each class / module definition
441
457
  * @memberOf module:Neo
@@ -225,8 +225,8 @@ class Button extends Component {
225
225
  afterSetBadgeText(value, oldValue) {
226
226
  let {badgeNode} = this;
227
227
 
228
- badgeNode.html = value;
229
228
  badgeNode.removeDom = !Boolean(value);
229
+ badgeNode.text = value;
230
230
 
231
231
  this.update()
232
232
  }
@@ -380,7 +380,7 @@ class Button extends Component {
380
380
  textNode.removeDom = isEmpty;
381
381
 
382
382
  if (!isEmpty) {
383
- textNode.html = value
383
+ textNode.text = value
384
384
  }
385
385
 
386
386
  me.update()
@@ -154,7 +154,7 @@ class MainContainerStateProvider extends StateProvider {
154
154
 
155
155
  let {data} = this;
156
156
 
157
- switch(key) {
157
+ switch (key) {
158
158
  case 'locale': {
159
159
  data.intlFormat_time = new Intl.DateTimeFormat(value, data.timeFormat);
160
160
  break
@@ -6,21 +6,21 @@ import RowModel from '../selection/grid/RowModel.mjs';
6
6
  import VDomUtil from '../util/VDom.mjs';
7
7
 
8
8
  /**
9
- * @class Neo.grid.View
9
+ * @class Neo.grid.Body
10
10
  * @extends Neo.component.Base
11
11
  */
12
- class GridView extends Component {
12
+ class GridBody extends Component {
13
13
  static config = {
14
14
  /**
15
- * @member {String} className='Neo.grid.View'
15
+ * @member {String} className='Neo.grid.Body'
16
16
  * @protected
17
17
  */
18
- className: 'Neo.grid.View',
18
+ className: 'Neo.grid.Body',
19
19
  /**
20
- * @member {String} ntype='grid-view'
20
+ * @member {String} ntype='grid-body'
21
21
  * @protected
22
22
  */
23
- ntype: 'grid-view',
23
+ ntype: 'grid-body',
24
24
  /**
25
25
  * @member {Boolean} animatedRowSorting_=false
26
26
  */
@@ -36,23 +36,23 @@ class GridView extends Component {
36
36
  */
37
37
  availableRows_: 0,
38
38
  /**
39
- * Internal flag. Gets calculated after mounting grid.View rows
39
+ * Internal flag. Gets calculated after mounting grid.Body rows
40
40
  * @member {Number} availableWidth_=0
41
41
  */
42
42
  availableWidth_: 0,
43
43
  /**
44
- * @member {String[]} baseCls=['neo-grid-view']
44
+ * @member {String[]} baseCls=['neo-grid-body']
45
45
  * @protected
46
46
  */
47
- baseCls: ['neo-grid-view'],
47
+ baseCls: ['neo-grid-body'],
48
48
  /**
49
- * The amount of columns (cells) to paint before the first & after the last visible column,
49
+ * The number of columns (cells) to paint before the first and after the last visible column,
50
50
  * to enhance the scrolling performance
51
51
  * @member {Number} bufferColumnRange_=0
52
52
  */
53
53
  bufferColumnRange_: 0,
54
54
  /**
55
- * The amount of rows to paint before the first & after the last visible row,
55
+ * The number of rows to paint before the first and after the last visible row,
56
56
  * to enhance the scrolling performance
57
57
  * @member {Number} bufferRowRange_=3
58
58
  */
@@ -63,7 +63,7 @@ class GridView extends Component {
63
63
  */
64
64
  colspanField: 'colspan',
65
65
  /**
66
- * Internal flag. Gets calculated after mounting grid.View rows
66
+ * Internal flag. Gets calculated after mounting grid.Body rows
67
67
  * @member {Number} containerWidth_=0
68
68
  */
69
69
  containerWidth_: 0,
@@ -150,9 +150,9 @@ class GridView extends Component {
150
150
  */
151
151
  visibleRows: [0, 0],
152
152
  /**
153
- * @member {String[]} wrapperCls=[]
153
+ * @member {String[]} wrapperCls=['neo-grid-body-wrapper']
154
154
  */
155
- wrapperCls: ['neo-grid-view-wrapper'],
155
+ wrapperCls: ['neo-grid-body-wrapper'],
156
156
  /**
157
157
  * @member {Object} _vdom
158
158
  */
@@ -686,7 +686,7 @@ class GridView extends Component {
686
686
  dataField = me.getCellDataField(id),
687
687
  record = me.getRecord(id);
688
688
 
689
- me.parent.fire(eventName, {data, dataField, record, view: me})
689
+ me.parent.fire(eventName, {body: me, data, dataField, record})
690
690
  }
691
691
 
692
692
  /**
@@ -698,7 +698,7 @@ class GridView extends Component {
698
698
  id = data.currentTarget,
699
699
  record = me.getRecord(id);
700
700
 
701
- me.parent.fire(eventName, {data, record, view: me})
701
+ me.parent.fire(eventName, {body: me, data, record})
702
702
  }
703
703
 
704
704
  /**
@@ -1133,4 +1133,4 @@ class GridView extends Component {
1133
1133
  }
1134
1134
  }
1135
1135
 
1136
- export default Neo.setupClass(GridView);
1136
+ export default Neo.setupClass(GridBody);
@@ -1,7 +1,7 @@
1
1
  import BaseContainer from '../container/Base.mjs';
2
2
  import ClassSystemUtil from '../util/ClassSystem.mjs';
3
3
  import Collection from '../collection/Base.mjs';
4
- import GridView from './View.mjs';
4
+ import GridBody from './Body.mjs';
5
5
  import ScrollManager from './ScrollManager.mjs';
6
6
  import Store from '../data/Store.mjs';
7
7
  import VerticalScrollbar from './VerticalScrollbar.mjs';
@@ -52,6 +52,16 @@ class GridContainer extends BaseContainer {
52
52
  * @protected
53
53
  */
54
54
  baseCls: ['neo-grid-container'],
55
+ /**
56
+ * Configs for Neo.grid.Body
57
+ * @member {Object|null} [bodyConfig=null]
58
+ */
59
+ bodyConfig: null,
60
+ /**
61
+ * @member {String|null} bodyId_=null
62
+ * @protected
63
+ */
64
+ bodyId_: null,
55
65
  /**
56
66
  * true uses grid.plugin.CellEditing
57
67
  * @member {Boolean} cellEditing_=false
@@ -105,16 +115,6 @@ class GridContainer extends BaseContainer {
105
115
  * @member {Neo.data.Store} store_=null
106
116
  */
107
117
  store_: null,
108
- /**
109
- * Configs for Neo.grid.View
110
- * @member {Object|null} [viewConfig=null]
111
- */
112
- viewConfig: null,
113
- /**
114
- * @member {String|null} viewId_=null
115
- * @protected
116
- */
117
- viewId_: null,
118
118
  /**
119
119
  * @member {Array|null} items=null
120
120
  * @protected
@@ -142,19 +142,19 @@ class GridContainer extends BaseContainer {
142
142
  scrollManager = null
143
143
 
144
144
  /**
145
- * Convenience method to access the Neo.grid.header.Toolbar
146
- * @returns {Neo.grid.header.Toolbar|null}
145
+ * Convenience method to access the Neo.grid.Body
146
+ * @returns {Neo.grid.Body|null}
147
147
  */
148
- get headerToolbar() {
149
- return Neo.getComponent(this.headerToolbarId) || Neo.get(this.headerToolbarId)
148
+ get body() {
149
+ return Neo.getComponent(this.bodyId) || Neo.get(this.bodyId)
150
150
  }
151
151
 
152
152
  /**
153
- * Convenience method to access the Neo.grid.View
154
- * @returns {Neo.grid.View|null}
153
+ * Convenience method to access the Neo.grid.header.Toolbar
154
+ * @returns {Neo.grid.header.Toolbar|null}
155
155
  */
156
- get view() {
157
- return Neo.getComponent(this.viewId) || Neo.get(this.viewId)
156
+ get headerToolbar() {
157
+ return Neo.getComponent(this.headerToolbarId) || Neo.get(this.headerToolbarId)
158
158
  }
159
159
 
160
160
  /**
@@ -166,8 +166,8 @@ class GridContainer extends BaseContainer {
166
166
  let me = this,
167
167
  {appName, rowHeight, store, windowId} = me;
168
168
 
169
+ me.bodyId = Neo.getId('grid-body');
169
170
  me.headerToolbarId = Neo.getId('grid-header-toolbar');
170
- me.viewId = Neo.getId('grid-view');
171
171
 
172
172
  me.items = [{
173
173
  module : header.Toolbar,
@@ -176,13 +176,13 @@ class GridContainer extends BaseContainer {
176
176
  sortable : me.sortable,
177
177
  ...me.headerToolbarConfig
178
178
  }, {
179
- module : GridView,
179
+ module : GridBody,
180
180
  flex : 1,
181
181
  gridContainer: me,
182
- id : me.viewId,
182
+ id : me.bodyId,
183
183
  rowHeight,
184
184
  store,
185
- ...me.viewConfig
185
+ ...me.bodyConfig
186
186
  }];
187
187
 
188
188
  me.scrollbar = Neo.create({
@@ -218,7 +218,7 @@ class GridContainer extends BaseContainer {
218
218
 
219
219
  if (mounted) {
220
220
  ResizeObserver.register(resizeParams);
221
- await me.passSizeToView()
221
+ await me.passSizeToBody()
222
222
  } else {
223
223
  me.initialResizeEvent = true;
224
224
  ResizeObserver.unregister(resizeParams)
@@ -262,9 +262,9 @@ class GridContainer extends BaseContainer {
262
262
 
263
263
  await me.timeout(50);
264
264
 
265
- await me.passSizeToView();
265
+ await me.passSizeToBody();
266
266
 
267
- me.view?.createViewData()
267
+ me.body?.createViewData()
268
268
  }
269
269
  }
270
270
 
@@ -287,14 +287,14 @@ class GridContainer extends BaseContainer {
287
287
  */
288
288
  afterSetRowHeight(value, oldValue) {
289
289
  if (value > 0) {
290
- let {scrollbar, view} = this;
290
+ let {body, scrollbar} = this;
291
291
 
292
292
  if (scrollbar) {
293
293
  scrollbar.rowHeight = value
294
294
  }
295
295
 
296
- if (view) {
297
- view.rowHeight = value
296
+ if (body) {
297
+ body.rowHeight = value
298
298
  }
299
299
  }
300
300
  }
@@ -340,12 +340,22 @@ class GridContainer extends BaseContainer {
340
340
  value ?.on(listeners);
341
341
  oldValue?.un(listeners);
342
342
 
343
- // in case we dynamically change the store, the view needs to get the new reference
344
- if (me.view) {
345
- me.view.store = value
343
+ // in case we dynamically change the store, grid.Body needs to get the new reference
344
+ if (me.body) {
345
+ me.body.store = value
346
346
  }
347
347
  }
348
348
 
349
+ /**
350
+ * Triggered before the bodyId config gets changed.
351
+ * @param {String} value
352
+ * @param {String} oldValue
353
+ * @protected
354
+ */
355
+ beforeSetBodyId(value, oldValue) {
356
+ return value || oldValue
357
+ }
358
+
349
359
  /**
350
360
  * Triggered before the columns config gets changed.
351
361
  * @param {Object[]} value
@@ -384,16 +394,6 @@ class GridContainer extends BaseContainer {
384
394
  return value
385
395
  }
386
396
 
387
- /**
388
- * Triggered before the viewId config gets changed.
389
- * @param {String} value
390
- * @param {String} oldValue
391
- * @protected
392
- */
393
- beforeSetViewId(value, oldValue) {
394
- return value || oldValue
395
- }
396
-
397
397
  /**
398
398
  * In case you want to update multiple existing records in parallel,
399
399
  * using this method is faster than updating each record one by one.
@@ -401,19 +401,19 @@ class GridContainer extends BaseContainer {
401
401
  * @param {Object[]} records
402
402
  */
403
403
  bulkUpdateRecords(records) {
404
- let {store, view} = this,
404
+ let {body, store} = this,
405
405
  {keyProperty} = store;
406
406
 
407
- if (view) {
408
- view.silentVdomUpdate = true;
407
+ if (body) {
408
+ body.silentVdomUpdate = true;
409
409
 
410
410
  records.forEach(item => {
411
411
  store.get(item[keyProperty])?.set(item)
412
412
  });
413
413
 
414
- view.silentVdomUpdate = false;
414
+ body.silentVdomUpdate = false;
415
415
 
416
- view.update()
416
+ body.update()
417
417
  }
418
418
  }
419
419
 
@@ -527,9 +527,9 @@ class GridContainer extends BaseContainer {
527
527
  let me = this;
528
528
 
529
529
  me.scrollManager = Neo.create({
530
+ gridBody : me.body,
530
531
  module : ScrollManager,
531
- gridContainer: me,
532
- gridView : me.view
532
+ gridContainer: me
533
533
  })
534
534
  }
535
535
 
@@ -540,11 +540,11 @@ class GridContainer extends BaseContainer {
540
540
  let me = this;
541
541
 
542
542
  if (!me.initialResizeEvent) {
543
- await me.passSizeToView(true);
543
+ await me.passSizeToBody(true);
544
544
 
545
- me.view.updateMountedAndVisibleColumns();
545
+ me.body.updateMountedAndVisibleColumns();
546
546
 
547
- await me.headerToolbar.passSizeToView()
547
+ await me.headerToolbar.passSizeToBody()
548
548
  } else {
549
549
  me.initialResizeEvent = false
550
550
  }
@@ -561,7 +561,7 @@ class GridContainer extends BaseContainer {
561
561
 
562
562
  me.store.sort(opts);
563
563
  me.removeSortingCss(opts.property);
564
- opts.direction && me.view.onStoreLoad()
564
+ opts.direction && me.body.onStoreLoad()
565
565
  }
566
566
 
567
567
  /**
@@ -589,16 +589,16 @@ class GridContainer extends BaseContainer {
589
589
  * @param {Boolean} silent=false
590
590
  * @returns {Promise<void>}
591
591
  */
592
- async passSizeToView(silent=false) {
592
+ async passSizeToBody(silent=false) {
593
593
  let me = this,
594
594
  [containerRect, headerRect] = await me.getDomRect([me.id, me.headerToolbarId]);
595
595
 
596
596
  // delay for slow connections, where the container-sizing is not done yet
597
597
  if (containerRect.height === headerRect.height) {
598
598
  await me.timeout(100);
599
- await me.passSizeToView(silent)
599
+ await me.passSizeToBody(silent)
600
600
  } else {
601
- me.view[silent ? 'setSilent' : 'set']({
601
+ me.body[silent ? 'setSilent' : 'set']({
602
602
  availableHeight: containerRect.height - headerRect.height,
603
603
  containerWidth : containerRect.width
604
604
  })
@@ -624,8 +624,8 @@ class GridContainer extends BaseContainer {
624
624
  */
625
625
  scrollByColumns(index, step) {
626
626
  let me = this,
627
- {view} = me,
628
- {columnPositions, containerWidth, mountedColumns, visibleColumns} = view,
627
+ {body} = me,
628
+ {columnPositions, containerWidth, mountedColumns, visibleColumns} = body,
629
629
  countColumns = columnPositions.getCount(),
630
630
  newIndex = index + step,
631
631
  column, mounted, scrollLeft, visible;