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
@@ -24,15 +24,15 @@ class ScrollManager extends Base {
|
|
24
24
|
}
|
25
25
|
|
26
26
|
/**
|
27
|
-
* @member {Neo.grid.
|
27
|
+
* @member {Neo.grid.Body|null} gridBody=null
|
28
28
|
* @protected
|
29
29
|
*/
|
30
|
-
|
30
|
+
gridBody = null
|
31
31
|
/**
|
32
|
-
* @member {Neo.grid.
|
32
|
+
* @member {Neo.grid.Container|null} gridContainer=null
|
33
33
|
* @protected
|
34
34
|
*/
|
35
|
-
|
35
|
+
gridContainer = null
|
36
36
|
/**
|
37
37
|
* Storing touchmove position for mobile envs
|
38
38
|
* @member {Number} lastTouchX=0
|
@@ -52,7 +52,7 @@ class ScrollManager extends Base {
|
|
52
52
|
scrollTimeoutId = null
|
53
53
|
/**
|
54
54
|
* Flag for identifying the ownership of a touchmove operation
|
55
|
-
* @member {'
|
55
|
+
* @member {'body'|'container'|null} touchMoveOwner=null
|
56
56
|
* @protected
|
57
57
|
*/
|
58
58
|
touchMoveOwner = null
|
@@ -65,19 +65,59 @@ class ScrollManager extends Base {
|
|
65
65
|
|
66
66
|
let me = this;
|
67
67
|
|
68
|
-
me.
|
69
|
-
scroll: me.
|
70
|
-
scope : me
|
71
|
-
});
|
72
|
-
|
73
|
-
me.gridView.addDomListeners({
|
74
|
-
scroll : me.onViewScroll,
|
68
|
+
me.gridBody.addDomListeners({
|
69
|
+
scroll : me.onBodyScroll,
|
75
70
|
touchcancel: me.onTouchCancel,
|
76
71
|
touchend : me.onTouchEnd,
|
77
72
|
scope : me
|
73
|
+
});
|
74
|
+
|
75
|
+
me.gridContainer.addDomListeners({
|
76
|
+
scroll: me.onContainerScroll,
|
77
|
+
scope : me
|
78
78
|
})
|
79
79
|
}
|
80
80
|
|
81
|
+
/**
|
82
|
+
* Only triggers for vertical scrolling
|
83
|
+
* @param {Object} data
|
84
|
+
* @protected
|
85
|
+
*/
|
86
|
+
onBodyScroll({scrollTop, touches}) {
|
87
|
+
let me = this,
|
88
|
+
body = me.gridBody,
|
89
|
+
deltaX, lastTouchX;
|
90
|
+
|
91
|
+
me.scrollTop = scrollTop;
|
92
|
+
|
93
|
+
me.scrollTimeoutId && clearTimeout(me.scrollTimeoutId);
|
94
|
+
|
95
|
+
me.scrollTimeoutId = setTimeout(() => {
|
96
|
+
body.isScrolling = false
|
97
|
+
}, 100);
|
98
|
+
|
99
|
+
body.set({isScrolling: true, scrollTop});
|
100
|
+
|
101
|
+
if (touches) {
|
102
|
+
if (me.touchMoveOwner !== 'container') {
|
103
|
+
me.touchMoveOwner = 'body'
|
104
|
+
}
|
105
|
+
|
106
|
+
if (me.touchMoveOwner === 'body') {
|
107
|
+
lastTouchX = touches.lastTouch.clientX - touches.firstTouch.clientX;
|
108
|
+
deltaX = me.lastTouchX - lastTouchX;
|
109
|
+
|
110
|
+
deltaX !== 0 && Neo.main.DomAccess.scrollTo({
|
111
|
+
direction: 'left',
|
112
|
+
id : me.gridContainer.id,
|
113
|
+
value : me.scrollLeft + deltaX
|
114
|
+
})
|
115
|
+
|
116
|
+
me.lastTouchX = lastTouchX
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
81
121
|
/**
|
82
122
|
* @param {Object} data
|
83
123
|
* @param {Number} data.scrollLeft
|
@@ -86,18 +126,18 @@ class ScrollManager extends Base {
|
|
86
126
|
*/
|
87
127
|
onContainerScroll({scrollLeft, target, touches}) {
|
88
128
|
let me = this,
|
89
|
-
|
129
|
+
body = me.gridBody,
|
90
130
|
deltaY, lastTouchY;
|
91
131
|
|
92
132
|
// We must ignore events for grid-scrollbar
|
93
133
|
if (target.id.includes('grid-container')) {
|
94
134
|
me .scrollLeft = scrollLeft;
|
95
|
-
|
135
|
+
body.scrollLeft = scrollLeft;
|
96
136
|
|
97
137
|
me.gridContainer.headerToolbar.scrollLeft = scrollLeft;
|
98
138
|
|
99
139
|
if (touches && !me.gridContainer.headerToolbar.cls.includes('neo-is-dragging')) {
|
100
|
-
if (me.touchMoveOwner !== '
|
140
|
+
if (me.touchMoveOwner !== 'body') {
|
101
141
|
me.touchMoveOwner = 'container'
|
102
142
|
}
|
103
143
|
|
@@ -107,7 +147,7 @@ class ScrollManager extends Base {
|
|
107
147
|
|
108
148
|
deltaY !== 0 && Neo.main.DomAccess.scrollTo({
|
109
149
|
direction: 'top',
|
110
|
-
id :
|
150
|
+
id : body.vdom.id,
|
111
151
|
value : me.scrollTop + deltaY
|
112
152
|
})
|
113
153
|
|
@@ -134,46 +174,6 @@ class ScrollManager extends Base {
|
|
134
174
|
me.lastTouchX = 0;
|
135
175
|
me.lastTouchY = 0
|
136
176
|
}
|
137
|
-
|
138
|
-
/**
|
139
|
-
* Only triggers for vertical scrolling
|
140
|
-
* @param {Object} data
|
141
|
-
* @protected
|
142
|
-
*/
|
143
|
-
onViewScroll({scrollTop, touches}) {
|
144
|
-
let me = this,
|
145
|
-
view = me.gridView,
|
146
|
-
deltaX, lastTouchX;
|
147
|
-
|
148
|
-
me.scrollTop = scrollTop;
|
149
|
-
|
150
|
-
me.scrollTimeoutId && clearTimeout(me.scrollTimeoutId);
|
151
|
-
|
152
|
-
me.scrollTimeoutId = setTimeout(() => {
|
153
|
-
view.isScrolling = false
|
154
|
-
}, 100);
|
155
|
-
|
156
|
-
view.set({isScrolling: true, scrollTop});
|
157
|
-
|
158
|
-
if (touches) {
|
159
|
-
if (me.touchMoveOwner !== 'container') {
|
160
|
-
me.touchMoveOwner = 'view'
|
161
|
-
}
|
162
|
-
|
163
|
-
if (me.touchMoveOwner === 'view') {
|
164
|
-
lastTouchX = touches.lastTouch.clientX - touches.firstTouch.clientX;
|
165
|
-
deltaX = me.lastTouchX - lastTouchX;
|
166
|
-
|
167
|
-
deltaX !== 0 && Neo.main.DomAccess.scrollTo({
|
168
|
-
direction: 'left',
|
169
|
-
id : me.gridContainer.id,
|
170
|
-
value : me.scrollLeft + deltaX
|
171
|
-
})
|
172
|
-
|
173
|
-
me.lastTouchX = lastTouchX
|
174
|
-
}
|
175
|
-
}
|
176
|
-
}
|
177
177
|
}
|
178
178
|
|
179
179
|
export default Neo.setupClass(ScrollManager);
|
@@ -53,9 +53,9 @@ class VerticalScrollbar extends Component {
|
|
53
53
|
|
54
54
|
if (mounted) {
|
55
55
|
ScrollSync.register({
|
56
|
-
fromId: me.parent.
|
56
|
+
fromId: me.parent.body.vdom.id,
|
57
57
|
toId : me.id,
|
58
|
-
twoWay: !Neo.config.hasTouchEvents, // Syncing the scroller back to the
|
58
|
+
twoWay: !Neo.config.hasTouchEvents, // Syncing the scroller back to the body affects mobile scrolling
|
59
59
|
...params
|
60
60
|
})
|
61
61
|
} else {
|
package/src/grid/_export.mjs
CHANGED
@@ -55,7 +55,7 @@ class AnimatedChange extends Column {
|
|
55
55
|
*/
|
56
56
|
async onRecordChange({fields, record}) {
|
57
57
|
let me = this,
|
58
|
-
{
|
58
|
+
{body} = me.parent,
|
59
59
|
cellId, field, node;
|
60
60
|
|
61
61
|
for (field of fields) {
|
@@ -63,16 +63,16 @@ class AnimatedChange extends Column {
|
|
63
63
|
// Wait for the next animation frame
|
64
64
|
await me.timeout(20);
|
65
65
|
|
66
|
-
cellId =
|
67
|
-
node = VdomUtil.find(
|
66
|
+
cellId = body.getCellId(me.parent.store.indexOf(record), me.dataField);
|
67
|
+
node = VdomUtil.find(body.vdom, cellId)?.vdom;
|
68
68
|
|
69
69
|
if (node) {
|
70
70
|
NeoArray.add(node.cls, me.getAnimationCls(record));
|
71
71
|
|
72
|
-
// This will trigger a 2nd
|
72
|
+
// This will trigger a 2nd body update, after grid.Body: onStoreRecordChange()
|
73
73
|
// It is crucial to restart the keyframe based animation
|
74
74
|
// => The previous update call will remove the last animationCls
|
75
|
-
|
75
|
+
body.update()
|
76
76
|
}
|
77
77
|
|
78
78
|
break
|
package/src/grid/column/Base.mjs
CHANGED
@@ -26,7 +26,7 @@ class Column extends Base {
|
|
26
26
|
renderer_: 'cellRenderer',
|
27
27
|
/**
|
28
28
|
* Scope to execute the column renderer.
|
29
|
-
* Defaults to the grid.
|
29
|
+
* Defaults to the grid.Body.
|
30
30
|
* You can pass the strings 'this' or 'me'
|
31
31
|
* @member {Neo.core.Base|String|null} rendererScope=null
|
32
32
|
*/
|
@@ -76,7 +76,7 @@ class Component extends Column {
|
|
76
76
|
*/
|
77
77
|
cellRenderer(data) {
|
78
78
|
let {gridContainer, record, rowIndex} = data,
|
79
|
-
{appName,
|
79
|
+
{appName, body, windowId} = gridContainer,
|
80
80
|
me = this,
|
81
81
|
{recordProperty} = me,
|
82
82
|
id = me.getComponentId(rowIndex),
|
@@ -104,7 +104,7 @@ class Component extends Column {
|
|
104
104
|
...componentConfig,
|
105
105
|
appName,
|
106
106
|
id,
|
107
|
-
parentComponent :
|
107
|
+
parentComponent : body,
|
108
108
|
[recordProperty]: record,
|
109
109
|
windowId
|
110
110
|
});
|
@@ -118,10 +118,10 @@ class Component extends Column {
|
|
118
118
|
}
|
119
119
|
|
120
120
|
if (me.useBindings) {
|
121
|
-
|
121
|
+
body.getStateProvider()?.parseConfig(component)
|
122
122
|
}
|
123
123
|
|
124
|
-
|
124
|
+
body.updateDepth = -1;
|
125
125
|
|
126
126
|
return component.createVdomReference()
|
127
127
|
}
|
@@ -132,9 +132,9 @@ class Component extends Column {
|
|
132
132
|
*/
|
133
133
|
getComponentId(rowIndex) {
|
134
134
|
let me = this,
|
135
|
-
{
|
135
|
+
{body} = me.parent;
|
136
136
|
|
137
|
-
return `${me.id}-component-${rowIndex % (
|
137
|
+
return `${me.id}-component-${rowIndex % (body.availableRows + 2 * body.bufferRowRange)}`
|
138
138
|
}
|
139
139
|
}
|
140
140
|
|
@@ -89,7 +89,7 @@ class Toolbar extends BaseToolbar {
|
|
89
89
|
*/
|
90
90
|
afterSetMounted(value, oldValue) {
|
91
91
|
super.afterSetMounted(value, oldValue);
|
92
|
-
value && this.
|
92
|
+
value && this.passSizeToBody()
|
93
93
|
}
|
94
94
|
|
95
95
|
/**
|
@@ -181,7 +181,7 @@ class Toolbar extends BaseToolbar {
|
|
181
181
|
|
182
182
|
me.promiseUpdate().then(() => {
|
183
183
|
// To prevent duplicate calls, we need to check the mounted state before the update call
|
184
|
-
mounted && me.
|
184
|
+
mounted && me.passSizeToBody()
|
185
185
|
})
|
186
186
|
}
|
187
187
|
|
@@ -203,10 +203,10 @@ class Toolbar extends BaseToolbar {
|
|
203
203
|
* @param {Boolean} silent=false
|
204
204
|
* @returns {Promise<void>}
|
205
205
|
*/
|
206
|
-
async
|
206
|
+
async passSizeToBody(silent=false) {
|
207
207
|
let me = this,
|
208
208
|
{items} = me,
|
209
|
-
{
|
209
|
+
{body} = me.parent,
|
210
210
|
rects = await me.getDomRect(items.map(item => item.id)),
|
211
211
|
lastItem = rects[rects.length - 1],
|
212
212
|
columnPositions = rects.map((item, index) => ({dataField: items[index].dataField, width: item.width, x: item.x - rects[0].x})),
|
@@ -225,16 +225,16 @@ class Toolbar extends BaseToolbar {
|
|
225
225
|
// Delay for slow connections, where the container-sizing is not done yet
|
226
226
|
if (!layoutFinished) {
|
227
227
|
await me.timeout(100);
|
228
|
-
await me.
|
228
|
+
await me.passSizeToBody(silent)
|
229
229
|
} else {
|
230
|
-
|
231
|
-
|
230
|
+
body.columnPositions.clear();
|
231
|
+
body.columnPositions.add(columnPositions);
|
232
232
|
|
233
|
-
|
233
|
+
body[silent ? 'setSilent' : 'set']({
|
234
234
|
availableWidth: lastItem.x + lastItem.width - rects[0].x
|
235
235
|
});
|
236
236
|
|
237
|
-
!silent &&
|
237
|
+
!silent && body.updateMountedAndVisibleColumns()
|
238
238
|
}
|
239
239
|
}
|
240
240
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import Base from '../../plugin/Base.mjs';
|
2
|
-
import CssUtil from '../../util/Css.mjs';
|
3
2
|
import NeoArray from '../../util/Array.mjs';
|
4
3
|
|
5
4
|
/**
|
@@ -151,7 +150,7 @@ class AnimateRows extends Base {
|
|
151
150
|
|
152
151
|
for (rowIndex=mountedRows[0]; rowIndex < mountedRows[1]; rowIndex++) {
|
153
152
|
record = owner.store.getAt(rowIndex);
|
154
|
-
id = owner.getRowId(
|
153
|
+
id = owner.getRowId(rowIndex)
|
155
154
|
mapItem = map[id];
|
156
155
|
|
157
156
|
if (mapItem) {
|
package/src/layout/Cube.mjs
CHANGED
@@ -258,7 +258,7 @@ class Cube extends Card {
|
|
258
258
|
if (index < 6) {
|
259
259
|
wrapperCls = NeoArray.union(wrapperCls, 'neo-face', Object.keys(Cube.faces)[index]);
|
260
260
|
|
261
|
-
switch(index) {
|
261
|
+
switch (index) {
|
262
262
|
case 0:
|
263
263
|
case 1:
|
264
264
|
wrapperCls = NeoArray.union(wrapperCls, 'neo-face-z');
|
@@ -341,7 +341,7 @@ class Cube extends Card {
|
|
341
341
|
if (index < 6) {
|
342
342
|
NeoArray.remove(wrapperCls, ['neo-face', Object.keys(Cube.faces)[index]]);
|
343
343
|
|
344
|
-
switch(index) {
|
344
|
+
switch (index) {
|
345
345
|
case 0:
|
346
346
|
case 1:
|
347
347
|
NeoArray.remove(wrapperCls, 'neo-face-z');
|
@@ -54,7 +54,6 @@ class DeltaUpdates extends Base {
|
|
54
54
|
* @private
|
55
55
|
*/
|
56
56
|
#renderer = null
|
57
|
-
|
58
57
|
/**
|
59
58
|
* Private property to signal that the renderer module has been loaded.
|
60
59
|
* This will be a Promise that resolves when the module is ready.
|
@@ -87,10 +86,10 @@ class DeltaUpdates extends Base {
|
|
87
86
|
try {
|
88
87
|
let module;
|
89
88
|
|
90
|
-
if (NeoConfig.
|
91
|
-
module = await import('./render/StringBasedRenderer.mjs')
|
92
|
-
} else {
|
89
|
+
if (NeoConfig.useDomApiRenderer) {
|
93
90
|
module = await import('./render/DomApiRenderer.mjs')
|
91
|
+
} else {
|
92
|
+
module = await import('./render/StringBasedRenderer.mjs')
|
94
93
|
}
|
95
94
|
|
96
95
|
me.#renderer = module.default
|
@@ -175,7 +174,7 @@ class DeltaUpdates extends Base {
|
|
175
174
|
* - `insertAdjacentHTML()` is generally faster than creating a node via template,
|
176
175
|
* but it's only available for manipulating children (elements), not `childNodes` (all nodes).
|
177
176
|
* - For performance, in cases where there are no comment nodes (i.e., no wrapped text nodes),
|
178
|
-
* the method prioritizes `insertAdjacentHTML()` when `
|
177
|
+
* the method prioritizes `insertAdjacentHTML()` when `useDomApiRenderer` is false.
|
179
178
|
*
|
180
179
|
* @param {Object} delta
|
181
180
|
* @param {Boolean} delta.hasLeadingTextChildren Flag to honor leading comments, which require special treatment.
|
@@ -185,8 +184,10 @@ class DeltaUpdates extends Base {
|
|
185
184
|
* @param {Neo.vdom.VNode} [delta.vnode] The VNode representation of the new node (for direct DOM API mounting).
|
186
185
|
*/
|
187
186
|
insertNode({hasLeadingTextChildren, index, outerHTML, parentId, vnode}) {
|
187
|
+
let me = this;
|
188
|
+
|
188
189
|
// This method is synchronous and *expects* the renderer to be loaded
|
189
|
-
if (!
|
190
|
+
if (!me.#renderer) {
|
190
191
|
console.error('DeltaUpdates renderer not ready during insertNode!');
|
191
192
|
return
|
192
193
|
}
|
@@ -194,10 +195,10 @@ class DeltaUpdates extends Base {
|
|
194
195
|
const parentNode = DomAccess.getElementOrBody(parentId);
|
195
196
|
|
196
197
|
if (parentNode) {
|
197
|
-
if (
|
198
|
-
|
198
|
+
if (NeoConfig.useDomApiRenderer) {
|
199
|
+
me.#renderer.createDomTree({index, isRoot: true, parentNode, vnode})
|
199
200
|
} else {
|
200
|
-
|
201
|
+
me.#renderer.insertNodeAsString({hasLeadingTextChildren, index, outerHTML, parentNode})
|
201
202
|
}
|
202
203
|
}
|
203
204
|
}
|
@@ -331,7 +332,7 @@ class DeltaUpdates extends Base {
|
|
331
332
|
|
332
333
|
if (node) {
|
333
334
|
Object.entries(delta).forEach(([prop, value]) => {
|
334
|
-
switch(prop) {
|
335
|
+
switch (prop) {
|
335
336
|
case 'attributes':
|
336
337
|
Object.entries(value).forEach(([key, val]) => {
|
337
338
|
if (voidAttributes.has(key)) {
|
@@ -212,7 +212,7 @@ class Navigator extends Base {
|
|
212
212
|
let {key, target} = keyEvent,
|
213
213
|
newActiveElement;
|
214
214
|
|
215
|
-
switch(key) {
|
215
|
+
switch (key) {
|
216
216
|
// Move to the previous navigable item
|
217
217
|
case data.previousKey:
|
218
218
|
newActiveElement = me.navigateGetAdjacent(-1, data);
|
@@ -11,7 +11,7 @@ const StringBasedRenderer = {
|
|
11
11
|
|
12
12
|
/**
|
13
13
|
* Handles string-based insertion of a new node into the DOM.
|
14
|
-
* This method is called by `insertNode()` when `NeoConfig.
|
14
|
+
* This method is called by `insertNode()` when `NeoConfig.useDomApiRenderer` is false.
|
15
15
|
*
|
16
16
|
* @param {Object} data
|
17
17
|
* @param {Boolean} data.hasLeadingTextChildren Flag to honor leading comments.
|
package/src/toolbar/Base.mjs
CHANGED
package/src/util/Style.mjs
CHANGED
@@ -36,19 +36,15 @@ class Style extends Base {
|
|
36
36
|
return null
|
37
37
|
} else if (!oldStyle) {
|
38
38
|
return Neo.clone(newStyle)
|
39
|
-
} else if (!newStyle) {
|
40
|
-
Object.keys(oldStyle).forEach(function(style) {
|
41
|
-
styles[style] = null
|
42
|
-
});
|
43
39
|
} else {
|
44
|
-
Object.keys(newStyle).forEach(style => {
|
40
|
+
newStyle && Object.keys(newStyle).forEach(style => {
|
45
41
|
if (!oldStyle.hasOwnProperty(style) || oldStyle[style] !== newStyle[style]) {
|
46
42
|
styles[style] = newStyle[style]
|
47
43
|
}
|
48
44
|
});
|
49
45
|
|
50
46
|
Object.keys(oldStyle).forEach(style => {
|
51
|
-
if (!newStyle.hasOwnProperty(style)) {
|
47
|
+
if (!newStyle || !newStyle.hasOwnProperty(style)) {
|
52
48
|
styles[style] = null
|
53
49
|
}
|
54
50
|
});
|
package/src/util/VDom.mjs
CHANGED
package/src/util/VNode.mjs
CHANGED
@@ -43,7 +43,7 @@ class VNode extends Base {
|
|
43
43
|
|
44
44
|
optsArray.forEach(([key, value]) => {
|
45
45
|
if (vnode.hasOwnProperty(key)) {
|
46
|
-
switch(key) {
|
46
|
+
switch (key) {
|
47
47
|
case 'attributes':
|
48
48
|
if (Neo.isObject(value) && Neo.isObject(vnode[key])) {
|
49
49
|
Object.entries(value).forEach(([attrKey, attrValue]) => {
|