neo.mjs 9.16.0 → 10.0.0-alpha.1
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/ServiceWorker.mjs +2 -2
- package/apps/email/view/Viewport.mjs +2 -2
- package/apps/form/view/Viewport.mjs +1 -1
- package/apps/portal/index.html +1 -1
- package/apps/portal/view/examples/List.mjs +1 -1
- package/apps/portal/view/home/FooterContainer.mjs +1 -1
- package/apps/realworld2/view/HomeContainer.mjs +1 -1
- package/apps/route/view/center/CardAdministration.mjs +3 -3
- package/apps/route/view/center/CardAdministrationDenied.mjs +2 -2
- package/apps/route/view/center/CardContact.mjs +2 -2
- package/apps/route/view/center/CardHome.mjs +2 -2
- package/apps/route/view/center/CardSection1.mjs +2 -2
- package/apps/route/view/center/CardSection2.mjs +2 -2
- package/buildScripts/createApp.mjs +2 -2
- package/docs/app/view/classdetails/HeaderComponent.mjs +3 -3
- package/docs/app/view/classdetails/MembersList.mjs +43 -46
- package/docs/app/view/classdetails/SourceViewComponent.mjs +1 -1
- package/docs/app/view/classdetails/TutorialComponent.mjs +1 -1
- package/examples/component/toast/MainContainer.mjs +16 -16
- package/examples/component/wrapper/googleMaps/MarkerDialog.mjs +4 -4
- package/examples/fields/MainContainer.mjs +1 -1
- package/examples/panel/MainContainer.mjs +2 -2
- package/examples/tab/container/MainContainer.mjs +3 -3
- package/examples/tabs/MainContainer.mjs +2 -2
- package/examples/tabs/MainContainer2.mjs +3 -3
- package/examples/viewport/MainContainer.mjs +2 -2
- package/package.json +3 -3
- package/resources/data/deck/learnneo/pages/benefits/FourEnvironments.md +1 -1
- package/resources/data/deck/learnneo/pages/benefits/Introduction.md +4 -3
- package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +5 -5
- package/resources/data/deck/training/pages/2022-12-27T21-55-23-144Z.md +2 -2
- package/resources/data/deck/training/pages/2022-12-29T18-36-08-226Z.md +1 -1
- package/resources/data/deck/training/pages/2022-12-29T18-36-56-893Z.md +2 -2
- package/resources/data/deck/training/pages/2022-12-29T20-37-08-919Z.md +2 -2
- package/resources/data/deck/training/pages/2022-12-29T20-37-20-344Z.md +2 -2
- package/resources/data/deck/training/pages/2023-01-13T21-48-17-258Z.md +2 -2
- package/resources/data/deck/training/pages/2023-02-05T17-44-53-815Z.md +9 -9
- package/resources/data/deck/training/pages/2023-10-14T19-25-08-153Z.md +1 -1
- package/src/DefaultConfig.mjs +14 -2
- package/src/Main.mjs +14 -5
- package/src/button/Base.mjs +1 -1
- package/src/calendar/view/calendars/List.mjs +1 -1
- package/src/component/Base.mjs +11 -11
- package/src/component/Chip.mjs +1 -1
- package/src/component/Helix.mjs +3 -3
- package/src/component/Process.mjs +2 -2
- package/src/component/StatusBadge.mjs +2 -2
- package/src/component/Timer.mjs +1 -1
- package/src/component/Toast.mjs +2 -2
- package/src/container/Base.mjs +1 -1
- package/src/form/field/CheckBox.mjs +2 -2
- package/src/form/field/FileUpload.mjs +14 -14
- package/src/form/field/Range.mjs +1 -1
- package/src/form/field/Text.mjs +1 -1
- package/src/form/field/trigger/Base.mjs +2 -2
- package/src/form/field/trigger/SpinUpDown.mjs +2 -2
- package/src/grid/View.mjs +1 -1
- package/src/main/DeltaUpdates.mjs +382 -0
- package/src/main/DomAccess.mjs +13 -36
- package/src/main/render/DomApiRenderer.mjs +138 -0
- package/src/main/render/StringBasedRenderer.mjs +58 -0
- package/src/table/View.mjs +1 -1
- package/src/table/plugin/CellEditing.mjs +1 -1
- package/src/tree/Accordion.mjs +11 -11
- package/src/tree/List.mjs +12 -5
- package/src/vdom/Helper.mjs +174 -292
- package/src/vdom/VNode.mjs +47 -11
- package/src/vdom/domConstants.mjs +65 -0
- package/src/vdom/util/DomApiVnodeCreator.mjs +51 -0
- package/src/vdom/util/StringFromVnode.mjs +123 -0
- package/src/worker/mixin/RemoteMethodAccess.mjs +13 -1
- package/src/main/mixin/DeltaUpdates.mjs +0 -352
@@ -1,352 +0,0 @@
|
|
1
|
-
import Base from '../../core/Base.mjs';
|
2
|
-
|
3
|
-
/**
|
4
|
-
* Logic to apply the deltas generated by vdom.Helper to the real DOM
|
5
|
-
* @class Neo.main.mixin.DeltaUpdates
|
6
|
-
* @extends Neo.core.Base
|
7
|
-
* @singleton
|
8
|
-
*/
|
9
|
-
class DeltaUpdates extends Base {
|
10
|
-
static config = {
|
11
|
-
/**
|
12
|
-
* @member {String} className='Neo.main.mixin.DeltaUpdates'
|
13
|
-
* @protected
|
14
|
-
*/
|
15
|
-
className: 'Neo.main.mixin.DeltaUpdates'
|
16
|
-
}
|
17
|
-
|
18
|
-
/**
|
19
|
-
* @param {HTMLElement} node
|
20
|
-
* @param {String} nodeName
|
21
|
-
*/
|
22
|
-
du_changeNodeName(node, nodeName) {
|
23
|
-
let {attributes} = node,
|
24
|
-
clone = document.createElement(nodeName),
|
25
|
-
i = 0,
|
26
|
-
len = attributes.length,
|
27
|
-
attribute;
|
28
|
-
|
29
|
-
if (node) {
|
30
|
-
for (; i < len; i++) {
|
31
|
-
attribute = attributes.item(i);
|
32
|
-
clone.setAttribute(attribute.nodeName, attribute.nodeValue)
|
33
|
-
}
|
34
|
-
|
35
|
-
clone.innerHTML= node.innerHTML;
|
36
|
-
|
37
|
-
node.parentNode.replaceChild(clone, node)
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
/**
|
42
|
-
* @param {Object} delta
|
43
|
-
* @param {String} delta.id
|
44
|
-
*/
|
45
|
-
du_focusNode(delta) {
|
46
|
-
this.getElement(delta.id)?.focus()
|
47
|
-
}
|
48
|
-
|
49
|
-
/**
|
50
|
-
* node.children contains the "real" nodes (tags)
|
51
|
-
* node.childNodes contains texts & comments as nodes too
|
52
|
-
* since every vtype:'text' is wrapped inside a comment block (as an id),
|
53
|
-
* we need the amount of nodes which are not comments to get the "realIndex".
|
54
|
-
* insertAdjacentHTML() is faster than creating a node (template), but only available
|
55
|
-
* for children and not for childNodes.
|
56
|
-
* In case there are no comments (=> vtype: 'text' nodes), we stick to it for performance reasons.
|
57
|
-
*
|
58
|
-
* @param {Object} delta
|
59
|
-
* @param {String} delta.index
|
60
|
-
* @param {String} delta.outerHTML
|
61
|
-
* @param {String} delta.parentId
|
62
|
-
*/
|
63
|
-
du_insertNode(delta) {
|
64
|
-
let {index} = delta,
|
65
|
-
parentNode = this.getElementOrBody(delta.parentId),
|
66
|
-
countChildren = parentNode?.childNodes.length,
|
67
|
-
i = 0,
|
68
|
-
realIndex = index,
|
69
|
-
hasComments = false,
|
70
|
-
node;
|
71
|
-
|
72
|
-
if (parentNode) {
|
73
|
-
// console.log('insertNode', index, countChildren, delta.parentId);
|
74
|
-
|
75
|
-
if (countChildren <= 20 && parentNode.nodeName !== 'TBODY') {
|
76
|
-
for (; i < countChildren; i++) {
|
77
|
-
if (parentNode.childNodes[i].nodeType === 8) { // ignore comments
|
78
|
-
if (i < realIndex) {
|
79
|
-
realIndex++
|
80
|
-
}
|
81
|
-
|
82
|
-
hasComments = true
|
83
|
-
}
|
84
|
-
}
|
85
|
-
}
|
86
|
-
|
87
|
-
if (!hasComments) {
|
88
|
-
countChildren = parentNode.children.length;
|
89
|
-
|
90
|
-
if (index > 0 && index >= countChildren) {
|
91
|
-
parentNode.insertAdjacentHTML('beforeend', delta.outerHTML);
|
92
|
-
return
|
93
|
-
}
|
94
|
-
|
95
|
-
if (countChildren > 0 && countChildren > index) {
|
96
|
-
parentNode.children[index].insertAdjacentHTML('beforebegin', delta.outerHTML)
|
97
|
-
} else if (countChildren > 0) {
|
98
|
-
parentNode.children[countChildren - 1].insertAdjacentHTML('afterend', delta.outerHTML)
|
99
|
-
} else {
|
100
|
-
parentNode.insertAdjacentHTML('beforeend', delta.outerHTML)
|
101
|
-
}
|
102
|
-
} else {
|
103
|
-
node = this.htmlStringToElement(delta.outerHTML);
|
104
|
-
|
105
|
-
if (countChildren > 0 && countChildren > realIndex) {
|
106
|
-
parentNode.insertBefore(node, parentNode.childNodes[realIndex])
|
107
|
-
} else {
|
108
|
-
parentNode.appendChild(node)
|
109
|
-
}
|
110
|
-
}
|
111
|
-
}
|
112
|
-
}
|
113
|
-
|
114
|
-
/**
|
115
|
-
* @param {Object} delta
|
116
|
-
* @param {String} delta.id
|
117
|
-
* @param {String} delta.index
|
118
|
-
* @param {String} delta.parentId
|
119
|
-
*/
|
120
|
-
du_moveNode({id, index, parentId}) {
|
121
|
-
let node = this.getElement(id),
|
122
|
-
parentNode = this.getElement(parentId),
|
123
|
-
currentNode;
|
124
|
-
|
125
|
-
if (node && parentNode) {
|
126
|
-
if (index >= parentNode.children.length) {
|
127
|
-
parentNode.appendChild(node)
|
128
|
-
} else {
|
129
|
-
currentNode = parentNode.children[index];
|
130
|
-
|
131
|
-
if (node && currentNode.id !== id) {
|
132
|
-
// Check for a direct swap OP
|
133
|
-
if (node === currentNode.nextElementSibling) {
|
134
|
-
node.replaceWith(currentNode)
|
135
|
-
}
|
136
|
-
|
137
|
-
parentNode.insertBefore(node, currentNode)
|
138
|
-
}
|
139
|
-
}
|
140
|
-
}
|
141
|
-
}
|
142
|
-
|
143
|
-
/**
|
144
|
-
* @param {Object} delta
|
145
|
-
* @param {String} delta.parentId
|
146
|
-
*/
|
147
|
-
du_removeAll(delta) {
|
148
|
-
let node = this.getElement(delta.parentId);
|
149
|
-
|
150
|
-
if (node) {
|
151
|
-
node.innerHTML = ''
|
152
|
-
}
|
153
|
-
}
|
154
|
-
|
155
|
-
/**
|
156
|
-
* @param {Object} delta
|
157
|
-
* @param {String} delta.id
|
158
|
-
* @param {String} delta.parentId
|
159
|
-
*/
|
160
|
-
du_removeNode(delta) {
|
161
|
-
let node = this.getElement(delta.id),
|
162
|
-
reg, startTag;
|
163
|
-
|
164
|
-
if (!node) { // could be a vtype: text
|
165
|
-
node = delta.parentId && this.getElementOrBody(delta.parentId);
|
166
|
-
|
167
|
-
if (node) {
|
168
|
-
startTag = `<!-- ${delta.id} -->`;
|
169
|
-
reg = new RegExp(startTag + '[\\s\\S]*?<!-- \/neo-vtext -->');
|
170
|
-
|
171
|
-
node.innerHTML = node.innerHTML.replace(reg, '')
|
172
|
-
}
|
173
|
-
} else {
|
174
|
-
node.remove()
|
175
|
-
}
|
176
|
-
}
|
177
|
-
|
178
|
-
/**
|
179
|
-
* @param {Object} delta
|
180
|
-
* @param {String} delta.fromId
|
181
|
-
* @param {String} delta.parentId
|
182
|
-
* @param {String} delta.toId
|
183
|
-
*/
|
184
|
-
du_replaceChild(delta) {
|
185
|
-
let me = this,
|
186
|
-
node = me.getElement(delta.parentId);
|
187
|
-
|
188
|
-
node?.replaceChild(me.getElement(delta.toId), me.getElement(delta.fromId))
|
189
|
-
}
|
190
|
-
|
191
|
-
/**
|
192
|
-
* @param {Object} delta
|
193
|
-
* @param {String} [delta.id]
|
194
|
-
* @param {String} [delta.value
|
195
|
-
*/
|
196
|
-
du_setTextContent(delta) {
|
197
|
-
let me = this,
|
198
|
-
node = me.getElement(delta.id);
|
199
|
-
|
200
|
-
if (node) {
|
201
|
-
node.textContent = delta.value
|
202
|
-
}
|
203
|
-
}
|
204
|
-
|
205
|
-
/**
|
206
|
-
* @param {Object} delta
|
207
|
-
* @param {Object} [delta.attributes]
|
208
|
-
* @param {String} [delta.cls]
|
209
|
-
* @param {String} [delta.id]
|
210
|
-
* @param {String} [delta.innerHTML]
|
211
|
-
* @param {String} [delta.outerHTML]
|
212
|
-
* @param {Object} [delta.style]
|
213
|
-
*/
|
214
|
-
du_updateNode(delta) {
|
215
|
-
let me = this,
|
216
|
-
node = me.getElementOrBody(delta.id);
|
217
|
-
|
218
|
-
if (node) {
|
219
|
-
Object.entries(delta).forEach(([prop, value]) => {
|
220
|
-
switch(prop) {
|
221
|
-
case 'attributes':
|
222
|
-
Object.entries(value).forEach(([key, val]) => {
|
223
|
-
if (me.voidAttributes.includes(key)) {
|
224
|
-
node[key] = val === 'true' // vnode attribute values get converted into strings
|
225
|
-
} else if (val === null || val === '') {
|
226
|
-
if (key === 'value') {
|
227
|
-
node[key] = '' // input fields => pseudo attribute can not be removed
|
228
|
-
} else {
|
229
|
-
node.removeAttribute(key)
|
230
|
-
}
|
231
|
-
} else if (key === 'id') {
|
232
|
-
node[Neo.config.useDomIds ? 'id' : 'data-neo-id'] = val
|
233
|
-
} else if (key === 'spellcheck' && val === 'false') {
|
234
|
-
// see https://github.com/neomjs/neo/issues/1922
|
235
|
-
node[key] = false
|
236
|
-
} else {
|
237
|
-
if (key === 'value') {
|
238
|
-
node[key] = val
|
239
|
-
} else {
|
240
|
-
node.setAttribute(key, val)
|
241
|
-
}
|
242
|
-
}
|
243
|
-
});
|
244
|
-
break
|
245
|
-
case 'cls':
|
246
|
-
value.add && node.classList.add(...value.add);
|
247
|
-
value.remove && node.classList.remove(...value.remove);
|
248
|
-
break
|
249
|
-
case 'innerHTML':
|
250
|
-
node.innerHTML = value || '';
|
251
|
-
break
|
252
|
-
case 'nodeName':
|
253
|
-
me.du_changeNodeName(node, value);
|
254
|
-
break
|
255
|
-
case 'outerHTML':
|
256
|
-
node.outerHTML = value || '';
|
257
|
-
break
|
258
|
-
case 'style':
|
259
|
-
if (Neo.isObject(value)) {
|
260
|
-
Object.entries(value).forEach(([key, val]) => {
|
261
|
-
let important;
|
262
|
-
|
263
|
-
if (Neo.isString(val) && val.includes('!important')) {
|
264
|
-
val = val.replace('!important', '').trim();
|
265
|
-
important = 'important'
|
266
|
-
}
|
267
|
-
|
268
|
-
node.style.setProperty(Neo.decamel(key), val, important)
|
269
|
-
})
|
270
|
-
}
|
271
|
-
break
|
272
|
-
}
|
273
|
-
})
|
274
|
-
}
|
275
|
-
}
|
276
|
-
|
277
|
-
/**
|
278
|
-
* @param {Object} delta
|
279
|
-
* @param {String} delta.id
|
280
|
-
* @param {String} delta.parentId
|
281
|
-
* @param {String} delta.value
|
282
|
-
*/
|
283
|
-
du_updateVtext(delta) {
|
284
|
-
let me = this,
|
285
|
-
node = me.getElement(delta.parentId),
|
286
|
-
innerHTML = node.innerHTML,
|
287
|
-
startTag = `<!-- ${delta.id} -->`,
|
288
|
-
reg = new RegExp(startTag + '[\\s\\S]*?<!-- \/neo-vtext -->');
|
289
|
-
|
290
|
-
node.innerHTML = innerHTML.replace(reg, delta.value)
|
291
|
-
}
|
292
|
-
|
293
|
-
/**
|
294
|
-
* @param {String} html representing a single element
|
295
|
-
* @returns {ChildNode}
|
296
|
-
*/
|
297
|
-
htmlStringToElement(html) {
|
298
|
-
const template = document.createElement('template');
|
299
|
-
template.innerHTML = html;
|
300
|
-
return template.content
|
301
|
-
}
|
302
|
-
|
303
|
-
/**
|
304
|
-
* @param {Object} data
|
305
|
-
* @param {Object|Object[]} data.deltas
|
306
|
-
* @param {String} data.id
|
307
|
-
* @param {String} [data.origin='app']
|
308
|
-
*/
|
309
|
-
update(data) {
|
310
|
-
let me = this,
|
311
|
-
{deltas} = data,
|
312
|
-
i = 0,
|
313
|
-
len, map;
|
314
|
-
|
315
|
-
deltas = Array.isArray(deltas) ? deltas : [deltas];
|
316
|
-
len = deltas.length;
|
317
|
-
|
318
|
-
if (Neo.config.logDeltaUpdates && len > 0) {
|
319
|
-
me.countDeltas += len;
|
320
|
-
me.countUpdates++;
|
321
|
-
console.log('update ' + me.countUpdates, 'total deltas ', me.countDeltas, Neo.clone(data, true))
|
322
|
-
}
|
323
|
-
|
324
|
-
if (Neo.config.renderCountDeltas && len > 0) {
|
325
|
-
me.countDeltasPer250ms += len
|
326
|
-
}
|
327
|
-
|
328
|
-
map = {
|
329
|
-
focusNode : me.du_focusNode,
|
330
|
-
insertNode : me.du_insertNode,
|
331
|
-
moveNode : me.du_moveNode,
|
332
|
-
removeAll : me.du_removeAll,
|
333
|
-
removeNode : me.du_removeNode,
|
334
|
-
replaceChild : me.du_replaceChild,
|
335
|
-
setTextContent: me.du_setTextContent,
|
336
|
-
updateVtext : me.du_updateVtext,
|
337
|
-
default : me.du_updateNode
|
338
|
-
};
|
339
|
-
|
340
|
-
for (; i < len; i++) {
|
341
|
-
(map[deltas[i].action] || map['default']).call(me, deltas[i])
|
342
|
-
}
|
343
|
-
|
344
|
-
Neo.worker.Manager.sendMessage(data.origin || 'app', {
|
345
|
-
action : 'reply',
|
346
|
-
replyId: data.id,
|
347
|
-
success: true
|
348
|
-
})
|
349
|
-
}
|
350
|
-
}
|
351
|
-
|
352
|
-
export default Neo.setupClass(DeltaUpdates);
|