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.
- package/.github/CODING_GUIDELINES.md +1 -1
- package/README.md +52 -11
- package/ServiceWorker.mjs +2 -2
- package/apps/portal/index.html +1 -1
- package/apps/portal/view/blog/List.mjs +1 -1
- package/apps/portal/view/home/FooterContainer.mjs +1 -1
- package/apps/portal/view/learn/ContentComponent.mjs +2 -1
- package/apps/portal/view/learn/MainContainerStateProvider.mjs +3 -6
- package/apps/realworld/view/HomeComponent.mjs +1 -1
- package/apps/realworld/view/user/ProfileComponent.mjs +1 -1
- package/apps/sharedcovid/view/MainContainerController.mjs +1 -1
- package/apps/shareddialog/view/MainContainerController.mjs +2 -2
- package/buildScripts/buildThemes.mjs +1 -1
- package/examples/grid/animatedRowSorting/Viewport.mjs +4 -4
- package/examples/grid/bigData/ControlsContainer.mjs +3 -3
- package/examples/grid/bigData/GridContainer.mjs +8 -8
- package/examples/grid/cellEditing/MainContainer.mjs +5 -5
- package/examples/grid/container/MainContainer.mjs +4 -4
- package/examples/grid/nestedRecordFields/Viewport.mjs +5 -5
- package/learn/README.md +83 -0
- package/learn/guides/ApplicationBootstrap.md +352 -0
- package/learn/guides/DeclarativeComponentTreesVsImperativeVdom.md +500 -0
- package/learn/guides/WorkingWithVDom.md +748 -0
- package/learn/tree.json +53 -0
- package/package.json +2 -2
- package/resources/scss/src/grid/{View.scss → Body.scss} +2 -2
- package/resources/scss/src/grid/VerticalScrollbar.scss +1 -1
- package/resources/scss/src/grid/plugin/AnimateRows.scss +1 -1
- package/resources/scss/src/grid/plugin/CellEditing.scss +1 -1
- package/resources/scss/theme-dark/grid/{View.scss → Body.scss} +1 -1
- package/resources/scss/theme-light/grid/{View.scss → Body.scss} +1 -1
- package/resources/scss/theme-neo-light/grid/{View.scss → Body.scss} +1 -1
- package/src/DefaultConfig.mjs +27 -14
- package/src/Main.mjs +1 -1
- package/src/Neo.mjs +16 -0
- package/src/button/Base.mjs +2 -2
- package/src/calendar/view/MainContainerStateProvider.mjs +1 -1
- package/src/grid/{View.mjs → Body.mjs} +17 -17
- package/src/grid/Container.mjs +58 -58
- package/src/grid/ScrollManager.mjs +56 -56
- package/src/grid/VerticalScrollbar.mjs +2 -2
- package/src/grid/_export.mjs +2 -2
- package/src/grid/column/AnimatedChange.mjs +5 -5
- package/src/grid/column/Base.mjs +1 -1
- package/src/grid/column/Component.mjs +6 -6
- package/src/grid/header/Button.mjs +1 -1
- package/src/grid/header/Toolbar.mjs +9 -9
- package/src/grid/plugin/AnimateRows.mjs +1 -2
- package/src/layout/Cube.mjs +2 -2
- package/src/main/DeltaUpdates.mjs +11 -10
- package/src/main/addon/Navigator.mjs +1 -1
- package/src/main/addon/WindowPosition.mjs +1 -1
- package/src/main/render/StringBasedRenderer.mjs +1 -1
- package/src/tab/header/Toolbar.mjs +1 -1
- package/src/table/header/Button.mjs +1 -1
- package/src/toolbar/Base.mjs +1 -1
- package/src/util/Style.mjs +2 -6
- package/src/util/VDom.mjs +1 -1
- package/src/util/VNode.mjs +1 -1
- package/src/vdom/Helper.mjs +96 -49
- package/src/vdom/VNode.mjs +38 -2
- package/src/worker/App.mjs +8 -19
- package/src/worker/Base.mjs +87 -5
- package/src/worker/Manager.mjs +90 -36
- package/resources/data/deck/learnneo/tree.json +0 -50
- package/resources/data/deck/whyneo.md +0 -80
- /package/{resources/data/deck/learnneo/pages → learn}/Glossary.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/UsingTheseTopics.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/ConfigSystem.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/Effort.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/Features.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/FormsEngine.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/FourEnvironments.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/Introduction.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/MultiWindow.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/OffTheMainThread.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/Quick.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/benefits/Speed.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/ComponentModels.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Config.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/DescribingTheUI.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Events.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Extending.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/References.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Setup.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/gettingstarted/Workspaces.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/ComponentsAndContainers.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/CustomComponents.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/Forms.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/InstanceLifecycle.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/Layouts.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/MainThreadAddonExample.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/MainThreadAddonIntro.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/Mixins.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/MultiWindow.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/PortalApp.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/StateProviders.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/Tables.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/events/CustomEvents.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/guides/events/DomEvents.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/javascript/ClassFeatures.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/javascript/Classes.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/javascript/NewNode.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/javascript/Overrides.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/javascript/Super.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/tutorials/Earthquakes.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/tutorials/RSP.md +0 -0
- /package/{resources/data/deck/learnneo/pages → learn}/tutorials/TodoList.md +0 -0
- /package/resources/data/{deck/learnneo/data/theBeatles.json → theBeatles.json} +0 -0
package/learn/tree.json
ADDED
@@ -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
|
+
"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.
|
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,6 +1,6 @@
|
|
1
1
|
@use "sass:color";
|
2
2
|
|
3
|
-
:root .neo-theme-light { // .neo-grid-
|
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-
|
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;
|
package/src/DefaultConfig.mjs
CHANGED
@@ -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.
|
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.
|
297
|
+
version: '10.0.0-alpha.5'
|
285
298
|
};
|
286
299
|
|
287
300
|
Object.assign(DefaultConfig, {
|
package/src/Main.mjs
CHANGED
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
|
package/src/button/Base.mjs
CHANGED
@@ -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.
|
383
|
+
textNode.text = value
|
384
384
|
}
|
385
385
|
|
386
386
|
me.update()
|
@@ -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.
|
9
|
+
* @class Neo.grid.Body
|
10
10
|
* @extends Neo.component.Base
|
11
11
|
*/
|
12
|
-
class
|
12
|
+
class GridBody extends Component {
|
13
13
|
static config = {
|
14
14
|
/**
|
15
|
-
* @member {String} className='Neo.grid.
|
15
|
+
* @member {String} className='Neo.grid.Body'
|
16
16
|
* @protected
|
17
17
|
*/
|
18
|
-
className: 'Neo.grid.
|
18
|
+
className: 'Neo.grid.Body',
|
19
19
|
/**
|
20
|
-
* @member {String} ntype='grid-
|
20
|
+
* @member {String} ntype='grid-body'
|
21
21
|
* @protected
|
22
22
|
*/
|
23
|
-
ntype: 'grid-
|
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.
|
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-
|
44
|
+
* @member {String[]} baseCls=['neo-grid-body']
|
45
45
|
* @protected
|
46
46
|
*/
|
47
|
-
baseCls: ['neo-grid-
|
47
|
+
baseCls: ['neo-grid-body'],
|
48
48
|
/**
|
49
|
-
* The
|
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
|
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.
|
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-
|
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
|
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
|
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(
|
1136
|
+
export default Neo.setupClass(GridBody);
|
package/src/grid/Container.mjs
CHANGED
@@ -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
|
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.
|
146
|
-
* @returns {Neo.grid.
|
145
|
+
* Convenience method to access the Neo.grid.Body
|
146
|
+
* @returns {Neo.grid.Body|null}
|
147
147
|
*/
|
148
|
-
get
|
149
|
-
return Neo.getComponent(this.
|
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.
|
154
|
-
* @returns {Neo.grid.
|
153
|
+
* Convenience method to access the Neo.grid.header.Toolbar
|
154
|
+
* @returns {Neo.grid.header.Toolbar|null}
|
155
155
|
*/
|
156
|
-
get
|
157
|
-
return Neo.getComponent(this.
|
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 :
|
179
|
+
module : GridBody,
|
180
180
|
flex : 1,
|
181
181
|
gridContainer: me,
|
182
|
-
id : me.
|
182
|
+
id : me.bodyId,
|
183
183
|
rowHeight,
|
184
184
|
store,
|
185
|
-
...me.
|
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.
|
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.
|
265
|
+
await me.passSizeToBody();
|
266
266
|
|
267
|
-
me.
|
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 {
|
290
|
+
let {body, scrollbar} = this;
|
291
291
|
|
292
292
|
if (scrollbar) {
|
293
293
|
scrollbar.rowHeight = value
|
294
294
|
}
|
295
295
|
|
296
|
-
if (
|
297
|
-
|
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,
|
344
|
-
if (me.
|
345
|
-
me.
|
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 {
|
404
|
+
let {body, store} = this,
|
405
405
|
{keyProperty} = store;
|
406
406
|
|
407
|
-
if (
|
408
|
-
|
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
|
-
|
414
|
+
body.silentVdomUpdate = false;
|
415
415
|
|
416
|
-
|
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.
|
543
|
+
await me.passSizeToBody(true);
|
544
544
|
|
545
|
-
me.
|
545
|
+
me.body.updateMountedAndVisibleColumns();
|
546
546
|
|
547
|
-
await me.headerToolbar.
|
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.
|
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
|
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.
|
599
|
+
await me.passSizeToBody(silent)
|
600
600
|
} else {
|
601
|
-
me.
|
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
|
-
{
|
628
|
-
{columnPositions, containerWidth, mountedColumns, visibleColumns} =
|
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;
|