neo.mjs 9.15.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.
Files changed (98) hide show
  1. package/ServiceWorker.mjs +2 -2
  2. package/apps/email/view/Viewport.mjs +2 -2
  3. package/apps/form/view/Viewport.mjs +1 -1
  4. package/apps/portal/index.html +1 -1
  5. package/apps/portal/view/examples/List.mjs +1 -1
  6. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  7. package/apps/portal/view/learn/ContentComponent.mjs +5 -5
  8. package/apps/realworld2/view/HomeContainer.mjs +1 -1
  9. package/apps/route/view/center/CardAdministration.mjs +3 -3
  10. package/apps/route/view/center/CardAdministrationDenied.mjs +2 -2
  11. package/apps/route/view/center/CardContact.mjs +2 -2
  12. package/apps/route/view/center/CardHome.mjs +2 -2
  13. package/apps/route/view/center/CardSection1.mjs +2 -2
  14. package/apps/route/view/center/CardSection2.mjs +2 -2
  15. package/buildScripts/createApp.mjs +2 -2
  16. package/docs/app/view/classdetails/HeaderComponent.mjs +3 -3
  17. package/docs/app/view/classdetails/MembersList.mjs +43 -46
  18. package/docs/app/view/classdetails/SourceViewComponent.mjs +1 -1
  19. package/docs/app/view/classdetails/TutorialComponent.mjs +1 -1
  20. package/examples/component/toast/MainContainer.mjs +16 -16
  21. package/examples/component/wrapper/googleMaps/MarkerDialog.mjs +4 -4
  22. package/examples/fields/MainContainer.mjs +1 -1
  23. package/examples/panel/MainContainer.mjs +2 -2
  24. package/examples/tab/container/MainContainer.mjs +3 -3
  25. package/examples/tabs/MainContainer.mjs +2 -2
  26. package/examples/tabs/MainContainer2.mjs +3 -3
  27. package/examples/viewport/MainContainer.mjs +2 -2
  28. package/package.json +3 -3
  29. package/resources/data/deck/learnneo/pages/UsingTheseTopics.md +65 -0
  30. package/resources/data/deck/learnneo/pages/benefits/ConfigSystem.md +1 -1
  31. package/resources/data/deck/learnneo/pages/benefits/FormsEngine.md +7 -7
  32. package/resources/data/deck/learnneo/pages/benefits/FourEnvironments.md +10 -11
  33. package/resources/data/deck/learnneo/pages/benefits/Introduction.md +38 -5
  34. package/resources/data/deck/learnneo/pages/benefits/MultiWindow.md +1 -1
  35. package/resources/data/deck/learnneo/pages/benefits/Speed.md +1 -1
  36. package/resources/data/deck/learnneo/pages/gettingstarted/ComponentModels.md +2 -2
  37. package/resources/data/deck/learnneo/pages/gettingstarted/Config.md +3 -3
  38. package/resources/data/deck/learnneo/pages/gettingstarted/DescribingTheUI.md +2 -2
  39. package/resources/data/deck/learnneo/pages/gettingstarted/Events.md +3 -3
  40. package/resources/data/deck/learnneo/pages/gettingstarted/Extending.md +2 -2
  41. package/resources/data/deck/learnneo/pages/gettingstarted/References.md +3 -3
  42. package/resources/data/deck/learnneo/pages/gettingstarted/Workspaces.md +3 -3
  43. package/resources/data/deck/learnneo/pages/guides/ComponentsAndContainers.md +6 -6
  44. package/resources/data/deck/learnneo/pages/guides/CustomComponents.md +1 -1
  45. package/resources/data/deck/learnneo/pages/guides/MainThreadAddonIntro.md +1 -1
  46. package/resources/data/deck/learnneo/pages/guides/StateProviders.md +6 -6
  47. package/resources/data/deck/learnneo/pages/guides/events/CustomEvents.md +8 -8
  48. package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +11 -11
  49. package/resources/data/deck/learnneo/pages/javascript/Classes.md +4 -4
  50. package/resources/data/deck/learnneo/pages/javascript/NewNode.md +2 -2
  51. package/resources/data/deck/learnneo/pages/javascript/Overrides.md +4 -4
  52. package/resources/data/deck/learnneo/pages/tutorials/Earthquakes.md +21 -21
  53. package/resources/data/deck/learnneo/pages/tutorials/TodoList.md +2 -2
  54. package/resources/data/deck/learnneo/tree.json +1 -1
  55. package/resources/data/deck/training/pages/2022-12-27T21-55-23-144Z.md +2 -2
  56. package/resources/data/deck/training/pages/2022-12-29T18-36-08-226Z.md +1 -1
  57. package/resources/data/deck/training/pages/2022-12-29T18-36-56-893Z.md +2 -2
  58. package/resources/data/deck/training/pages/2022-12-29T20-37-08-919Z.md +2 -2
  59. package/resources/data/deck/training/pages/2022-12-29T20-37-20-344Z.md +2 -2
  60. package/resources/data/deck/training/pages/2023-01-13T21-48-17-258Z.md +2 -2
  61. package/resources/data/deck/training/pages/2023-02-05T17-44-53-815Z.md +9 -9
  62. package/resources/data/deck/training/pages/2023-10-14T19-25-08-153Z.md +1 -1
  63. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +17 -13
  64. package/src/DefaultConfig.mjs +14 -2
  65. package/src/Main.mjs +14 -5
  66. package/src/button/Base.mjs +1 -1
  67. package/src/calendar/view/calendars/List.mjs +1 -1
  68. package/src/component/Base.mjs +11 -11
  69. package/src/component/Chip.mjs +1 -1
  70. package/src/component/Helix.mjs +3 -3
  71. package/src/component/Process.mjs +2 -2
  72. package/src/component/StatusBadge.mjs +2 -2
  73. package/src/component/Timer.mjs +1 -1
  74. package/src/component/Toast.mjs +2 -2
  75. package/src/container/Base.mjs +1 -1
  76. package/src/form/field/CheckBox.mjs +2 -2
  77. package/src/form/field/FileUpload.mjs +14 -14
  78. package/src/form/field/Range.mjs +1 -1
  79. package/src/form/field/Text.mjs +1 -1
  80. package/src/form/field/trigger/Base.mjs +2 -2
  81. package/src/form/field/trigger/SpinUpDown.mjs +2 -2
  82. package/src/grid/View.mjs +1 -1
  83. package/src/main/DeltaUpdates.mjs +382 -0
  84. package/src/main/DomAccess.mjs +13 -36
  85. package/src/main/render/DomApiRenderer.mjs +138 -0
  86. package/src/main/render/StringBasedRenderer.mjs +58 -0
  87. package/src/table/View.mjs +1 -1
  88. package/src/table/plugin/CellEditing.mjs +1 -1
  89. package/src/tree/Accordion.mjs +11 -11
  90. package/src/tree/List.mjs +12 -5
  91. package/src/vdom/Helper.mjs +174 -292
  92. package/src/vdom/VNode.mjs +47 -11
  93. package/src/vdom/domConstants.mjs +65 -0
  94. package/src/vdom/util/DomApiVnodeCreator.mjs +51 -0
  95. package/src/vdom/util/StringFromVnode.mjs +123 -0
  96. package/src/worker/mixin/RemoteMethodAccess.mjs +13 -1
  97. package/resources/data/deck/learnneo/pages/Welcome.md +0 -64
  98. 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);