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.
- 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/portal/view/learn/ContentComponent.mjs +5 -5
- 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/UsingTheseTopics.md +65 -0
- package/resources/data/deck/learnneo/pages/benefits/ConfigSystem.md +1 -1
- package/resources/data/deck/learnneo/pages/benefits/FormsEngine.md +7 -7
- package/resources/data/deck/learnneo/pages/benefits/FourEnvironments.md +10 -11
- package/resources/data/deck/learnneo/pages/benefits/Introduction.md +38 -5
- package/resources/data/deck/learnneo/pages/benefits/MultiWindow.md +1 -1
- package/resources/data/deck/learnneo/pages/benefits/Speed.md +1 -1
- package/resources/data/deck/learnneo/pages/gettingstarted/ComponentModels.md +2 -2
- package/resources/data/deck/learnneo/pages/gettingstarted/Config.md +3 -3
- package/resources/data/deck/learnneo/pages/gettingstarted/DescribingTheUI.md +2 -2
- package/resources/data/deck/learnneo/pages/gettingstarted/Events.md +3 -3
- package/resources/data/deck/learnneo/pages/gettingstarted/Extending.md +2 -2
- package/resources/data/deck/learnneo/pages/gettingstarted/References.md +3 -3
- package/resources/data/deck/learnneo/pages/gettingstarted/Workspaces.md +3 -3
- package/resources/data/deck/learnneo/pages/guides/ComponentsAndContainers.md +6 -6
- package/resources/data/deck/learnneo/pages/guides/CustomComponents.md +1 -1
- package/resources/data/deck/learnneo/pages/guides/MainThreadAddonIntro.md +1 -1
- package/resources/data/deck/learnneo/pages/guides/StateProviders.md +6 -6
- package/resources/data/deck/learnneo/pages/guides/events/CustomEvents.md +8 -8
- package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +11 -11
- package/resources/data/deck/learnneo/pages/javascript/Classes.md +4 -4
- package/resources/data/deck/learnneo/pages/javascript/NewNode.md +2 -2
- package/resources/data/deck/learnneo/pages/javascript/Overrides.md +4 -4
- package/resources/data/deck/learnneo/pages/tutorials/Earthquakes.md +21 -21
- package/resources/data/deck/learnneo/pages/tutorials/TodoList.md +2 -2
- package/resources/data/deck/learnneo/tree.json +1 -1
- 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/resources/scss/src/apps/portal/learn/ContentComponent.scss +17 -13
- 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/resources/data/deck/learnneo/pages/Welcome.md +0 -64
- package/src/main/mixin/DeltaUpdates.mjs +0 -352
package/src/Main.mjs
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import Neo from './Neo.mjs';
|
2
2
|
import * as core from './core/_export.mjs';
|
3
|
-
import DomAccess from './main/DomAccess.mjs';
|
3
|
+
import DomAccess from './main/DomAccess.mjs'; // has to get imported before DeltaUpdates
|
4
|
+
import DeltaUpdates from './main/DeltaUpdates.mjs';
|
4
5
|
import DomEvents from './main/DomEvents.mjs';
|
5
6
|
import Observable from './core/Observable.mjs';
|
6
7
|
import WorkerManager from './worker/Manager.mjs';
|
@@ -336,8 +337,9 @@ class Main extends core.Base {
|
|
336
337
|
* @protected
|
337
338
|
*/
|
338
339
|
processQueue(queue, start) {
|
339
|
-
let me
|
340
|
-
|
340
|
+
let me = this,
|
341
|
+
{mode} = me,
|
342
|
+
limit = me.timeLimit,
|
341
343
|
operation;
|
342
344
|
|
343
345
|
while (operation = queue.shift()) {
|
@@ -345,7 +347,14 @@ class Main extends core.Base {
|
|
345
347
|
queue.unshift(operation);
|
346
348
|
return requestAnimationFrame(me.renderFrame.bind(me))
|
347
349
|
} else {
|
348
|
-
|
350
|
+
if (mode === 'read') {
|
351
|
+
DomAccess.read(operation)
|
352
|
+
} else if (mode === 'write') {
|
353
|
+
DeltaUpdates.insertNode(operation)
|
354
|
+
} else {
|
355
|
+
DeltaUpdates.update(operation)
|
356
|
+
}
|
357
|
+
|
349
358
|
WorkerManager.resolveDomOperationPromise(operation.replyId)
|
350
359
|
}
|
351
360
|
}
|
@@ -531,7 +540,7 @@ class Main extends core.Base {
|
|
531
540
|
}
|
532
541
|
|
533
542
|
/**
|
534
|
-
* Open a new popup window and return if
|
543
|
+
* Open a new popup window and return if successful
|
535
544
|
* @param {Object} data
|
536
545
|
* @param {String} data.url
|
537
546
|
* @param {String} data.windowFeatures
|
package/src/button/Base.mjs
CHANGED
@@ -77,7 +77,7 @@ class List extends ComponentList {
|
|
77
77
|
|
78
78
|
return [
|
79
79
|
checkBox.createVdomReference(),
|
80
|
-
{tag: 'i', cls: ['neo-edit-icon', 'fas fa-edit'], id: me.getEditIconId(index)}
|
80
|
+
{tag: 'i', cls: ['neo-edit-icon', 'fas', 'fa-edit'], id: me.getEditIconId(index)}
|
81
81
|
]
|
82
82
|
}
|
83
83
|
|
package/src/component/Base.mjs
CHANGED
@@ -1663,7 +1663,7 @@ class Component extends Base {
|
|
1663
1663
|
controller = me.getConfigInstanceByNtype('controller', ntype);
|
1664
1664
|
|
1665
1665
|
if (!ntype) {
|
1666
|
-
me[closestController] = controller
|
1666
|
+
me[closestController] = controller
|
1667
1667
|
}
|
1668
1668
|
|
1669
1669
|
return controller
|
@@ -1911,7 +1911,7 @@ class Component extends Base {
|
|
1911
1911
|
} else {
|
1912
1912
|
let style = me.style;
|
1913
1913
|
style.visibility = 'hidden';
|
1914
|
-
me.style = style
|
1914
|
+
me.style = style
|
1915
1915
|
}
|
1916
1916
|
|
1917
1917
|
me._hidden = true
|
@@ -2136,14 +2136,14 @@ class Component extends Base {
|
|
2136
2136
|
onFocusEnter(data) {
|
2137
2137
|
// If we are hidden, or unmounted while we still contain focus, we have to revert
|
2138
2138
|
// focus to where it came from if possible
|
2139
|
-
this.focusEnterData = data
|
2139
|
+
this.focusEnterData = data
|
2140
2140
|
}
|
2141
2141
|
|
2142
2142
|
/**
|
2143
2143
|
* @param {Object} data
|
2144
2144
|
*/
|
2145
2145
|
onFocusLeave(data) {
|
2146
|
-
this.focusEnterData = null
|
2146
|
+
this.focusEnterData = null
|
2147
2147
|
}
|
2148
2148
|
|
2149
2149
|
/**
|
@@ -2171,11 +2171,11 @@ class Component extends Base {
|
|
2171
2171
|
|
2172
2172
|
/**
|
2173
2173
|
* Gets called from the render() promise success handler
|
2174
|
-
* @param {Object}
|
2174
|
+
* @param {Object} vnode
|
2175
2175
|
* @param {Boolean} autoMount Mount the DOM after the vnode got created
|
2176
2176
|
* @protected
|
2177
2177
|
*/
|
2178
|
-
onRender(
|
2178
|
+
onRender(vnode, autoMount) {
|
2179
2179
|
let me = this,
|
2180
2180
|
{app} = me;
|
2181
2181
|
|
@@ -2189,9 +2189,9 @@ class Component extends Base {
|
|
2189
2189
|
app.fire('render')
|
2190
2190
|
}
|
2191
2191
|
|
2192
|
-
me.vnode =
|
2192
|
+
me.vnode = vnode;
|
2193
2193
|
|
2194
|
-
let childIds = ComponentManager.getChildIds(
|
2194
|
+
let childIds = ComponentManager.getChildIds(vnode),
|
2195
2195
|
i = 0,
|
2196
2196
|
len = childIds.length,
|
2197
2197
|
child;
|
@@ -2333,11 +2333,11 @@ class Component extends Base {
|
|
2333
2333
|
autoMount,
|
2334
2334
|
parentId : autoMount ? me.getMountedParentId() : undefined,
|
2335
2335
|
parentIndex: autoMount ? me.getMountedParentIndex() : undefined,
|
2336
|
-
|
2337
|
-
|
2336
|
+
vdom : ComponentManager.getVdomTree(me.vdom),
|
2337
|
+
windowId : me.windowId
|
2338
2338
|
});
|
2339
2339
|
|
2340
|
-
me.onRender(data, useVdomWorker ? autoMount : false);
|
2340
|
+
me.onRender(data.vnode, useVdomWorker ? autoMount : false);
|
2341
2341
|
me.isVdomUpdating = false;
|
2342
2342
|
|
2343
2343
|
autoMount && !useVdomWorker && me.mount();
|
package/src/component/Chip.mjs
CHANGED
package/src/component/Helix.mjs
CHANGED
@@ -701,8 +701,8 @@ class Helix extends Component {
|
|
701
701
|
|
702
702
|
if (me.showCloneInfo) {
|
703
703
|
itemVdom.cn.push({
|
704
|
-
cls
|
705
|
-
|
704
|
+
cls : ['contact-name'],
|
705
|
+
html: record.firstname + ' ' + record.lastname
|
706
706
|
})
|
707
707
|
}
|
708
708
|
|
@@ -711,7 +711,7 @@ class Helix extends Component {
|
|
711
711
|
autoMount : true,
|
712
712
|
parentId : group.id,
|
713
713
|
parentIndex: store.getCount(),
|
714
|
-
|
714
|
+
vdom : itemVdom
|
715
715
|
}).then(data => {
|
716
716
|
me.clonedItems.push(itemVdom);
|
717
717
|
|
@@ -173,8 +173,8 @@ class Process extends Base {
|
|
173
173
|
content = curItem.cn[3];
|
174
174
|
|
175
175
|
content.cn[0].cls.push(newItem.iconCls);
|
176
|
-
content.cn[1].
|
177
|
-
content.cn[2].
|
176
|
+
content.cn[1].html = newItem.title;
|
177
|
+
content.cn[2].html = newItem.text;
|
178
178
|
|
179
179
|
NeoArray.add(vdomRoot.cn, curItem)
|
180
180
|
})
|
@@ -329,7 +329,7 @@ class StatusBadge extends Base {
|
|
329
329
|
break;
|
330
330
|
}
|
331
331
|
|
332
|
-
labelNode.
|
332
|
+
labelNode.html = showLabel;
|
333
333
|
|
334
334
|
me.updateStateIconNode(showStateIcon);
|
335
335
|
me.updateSideIconNode(showSideIcon)
|
@@ -382,7 +382,7 @@ class StatusBadge extends Base {
|
|
382
382
|
updateLabelNode(value) {
|
383
383
|
let labelNode = this.getVdomRoot().cn[1];
|
384
384
|
|
385
|
-
labelNode.
|
385
|
+
labelNode.html = value;
|
386
386
|
labelNode.removeDom = !Boolean(value);
|
387
387
|
|
388
388
|
this.update()
|
package/src/component/Timer.mjs
CHANGED
package/src/component/Toast.mjs
CHANGED
@@ -175,7 +175,7 @@ class Toast extends Component {
|
|
175
175
|
afterSetMsg(value, oldValue) {
|
176
176
|
let vdom = this.getTextRootVdom().cn[1];
|
177
177
|
|
178
|
-
vdom.
|
178
|
+
vdom.html = value
|
179
179
|
}
|
180
180
|
|
181
181
|
/**
|
@@ -221,7 +221,7 @@ class Toast extends Component {
|
|
221
221
|
let vdom = this.getTextRootVdom().cn[0];
|
222
222
|
|
223
223
|
vdom.removeDom = Neo.isEmpty(value);
|
224
|
-
vdom.
|
224
|
+
vdom.html = value;
|
225
225
|
NeoArray[value ? 'add' : 'remove'](vdom.cls, 'neo-toast-has-title')
|
226
226
|
}
|
227
227
|
|
package/src/container/Base.mjs
CHANGED
@@ -324,7 +324,7 @@ class CheckBox extends Field {
|
|
324
324
|
value = `<span class="${me.labelIdCls.join(',')}">${me.labelId}</span>${me.labelIdSeparator + value}`
|
325
325
|
}
|
326
326
|
|
327
|
-
me.vdom.cn[0].cn[0].
|
327
|
+
me.vdom.cn[0].cn[0].html = value;
|
328
328
|
me.update()
|
329
329
|
}
|
330
330
|
|
@@ -397,7 +397,7 @@ class CheckBox extends Field {
|
|
397
397
|
showLabel = !!value; // hide the label, in case value === null || value === ''
|
398
398
|
|
399
399
|
if (showLabel) {
|
400
|
-
valueLabel.
|
400
|
+
valueLabel.html = value
|
401
401
|
}
|
402
402
|
|
403
403
|
valueLabel.removeDom = !showLabel;
|
@@ -410,13 +410,13 @@ class FileUpload extends Field {
|
|
410
410
|
escapedFileName = StringUtil.escapeHtml(file.name);
|
411
411
|
|
412
412
|
if (me.types && !types[type]) {
|
413
|
-
body.cn[0].
|
414
|
-
body.cn[1].
|
413
|
+
body.cn[0].html = escapedFileName;
|
414
|
+
body.cn[1].html = `${me.invalidFileFormat} (.${type}) ${me.formatSize(file.size)}`;
|
415
415
|
me.error = me.pleaseUseTheseTypes?.replace('{allowedFileTypes}', Object.keys(types).join(' .'))
|
416
416
|
}
|
417
417
|
else if (file.size > me.maxSize) {
|
418
|
-
body.cn[0].
|
419
|
-
body.cn[1].
|
418
|
+
body.cn[0].html = escapedFileName;
|
419
|
+
body.cn[1].html = me.formatSize(file.size);
|
420
420
|
me.error = me.fileSizeMoreThan?.replace('{allowedFileSize}', String(me._maxSize).toUpperCase());
|
421
421
|
}
|
422
422
|
// If it passes the type and maxSize check, upload it
|
@@ -448,7 +448,7 @@ class FileUpload extends Field {
|
|
448
448
|
await me.timeout(100);
|
449
449
|
me.focus(me.vdom.cn[2].id);
|
450
450
|
|
451
|
-
me.vdom.cn[1].cn[0].
|
451
|
+
me.vdom.cn[1].cn[0].html = StringUtil.escapeHtml(file.name);
|
452
452
|
me.update();
|
453
453
|
me.state = 'uploading';
|
454
454
|
|
@@ -492,7 +492,7 @@ class FileUpload extends Field {
|
|
492
492
|
|
493
493
|
(vdom.style || (vdom.style = {}))['--upload-progress'] = `${progress}turn`;
|
494
494
|
|
495
|
-
vdom.cn[1].cn[1].
|
495
|
+
vdom.cn[1].cn[1].html = `${this.uploading}... (${Math.round(progress * 100)}%)`;
|
496
496
|
|
497
497
|
this.uploadSize = loaded;
|
498
498
|
this.update();
|
@@ -673,7 +673,7 @@ class FileUpload extends Field {
|
|
673
673
|
|
674
674
|
me.documentId = document.id;
|
675
675
|
me.fileSize = me.formatSize(document.size);
|
676
|
-
me.vdom.cn[1].cn[0].
|
676
|
+
me.vdom.cn[1].cn[0].html = StringUtil.escapeHtml(document.fileName);
|
677
677
|
me.state = me.documentStatusMap[document.status];
|
678
678
|
}
|
679
679
|
}
|
@@ -704,15 +704,15 @@ class FileUpload extends Field {
|
|
704
704
|
isChangeEventNeeded = true;
|
705
705
|
break;
|
706
706
|
case 'upload-failed':
|
707
|
-
status.
|
707
|
+
status.html = `${me.uploadFailed}${isNaN(me.progress) ? '' : `... (${Math.round(me.progress * 100)}%)`}`;
|
708
708
|
isChangeEventNeeded = true;
|
709
709
|
break;
|
710
710
|
case 'processing':
|
711
|
-
status.
|
711
|
+
status.html = `${me.scanning}... (${me.formatSize(me.uploadSize)})`;
|
712
712
|
vdom.inert = true;
|
713
713
|
break;
|
714
714
|
case 'scan-failed':
|
715
|
-
status.
|
715
|
+
status.html = `${me.malwareFoundInFile}. \u2022 ${me.fileSize}`;
|
716
716
|
me.error = me.pleaseCheck;
|
717
717
|
isChangeEventNeeded = true;
|
718
718
|
break;
|
@@ -721,19 +721,19 @@ class FileUpload extends Field {
|
|
721
721
|
anchor.href = me.createUrl(me.downloadUrl, {
|
722
722
|
[me.documentIdParameter] : me.documentId
|
723
723
|
});
|
724
|
-
status.
|
724
|
+
status.html = me.fileSize;
|
725
725
|
isChangeEventNeeded = true;
|
726
726
|
break;
|
727
727
|
case 'not-downloadable':
|
728
|
-
status.
|
728
|
+
status.html = me.document ? me.fileSize : `${me.successfullyUploaded} \u2022 ${me.fileSize}`;
|
729
729
|
isChangeEventNeeded = true;
|
730
730
|
break;
|
731
731
|
case 'deleted':
|
732
|
-
status.
|
732
|
+
status.html = me.fileWasDeleted;
|
733
733
|
isChangeEventNeeded = true;
|
734
734
|
break;
|
735
735
|
case 'error':
|
736
|
-
status.
|
736
|
+
status.html = me.fileIsInAnErrorState;
|
737
737
|
me.error = me.pleaseCheck;
|
738
738
|
isChangeEventNeeded = true;
|
739
739
|
}
|
package/src/form/field/Range.mjs
CHANGED
package/src/form/field/Text.mjs
CHANGED
@@ -594,7 +594,7 @@ class Text extends Field {
|
|
594
594
|
value = `<span class="${me.labelIdCls.join(',')}">${me.labelId}</span>${me.labelIdSeparator + value}`
|
595
595
|
}
|
596
596
|
|
597
|
-
me.getLabelEl().
|
597
|
+
me.getLabelEl().html = value;
|
598
598
|
|
599
599
|
if (!me.hideLabel) {
|
600
600
|
if (me.labelPosition === 'inline') {
|
@@ -137,10 +137,10 @@ class Base extends Component {
|
|
137
137
|
afterSetIconCls(value, oldValue) {
|
138
138
|
let {cls} = this;
|
139
139
|
|
140
|
-
NeoArray.remove(cls, oldValue);
|
140
|
+
NeoArray.remove(cls, oldValue?.split(' '));
|
141
141
|
|
142
142
|
if (value && value !== '') {
|
143
|
-
NeoArray.add(cls, value)
|
143
|
+
NeoArray.add(cls, value?.split(' '))
|
144
144
|
}
|
145
145
|
|
146
146
|
this.cls = cls
|
@@ -44,8 +44,8 @@ class SpinUpDown extends Base {
|
|
44
44
|
let me = this;
|
45
45
|
|
46
46
|
me.vdom.cn = [
|
47
|
-
{cls: ['neo-spin-button', 'neo-up', me.spinButtonUpIconCls]},
|
48
|
-
{cls: ['neo-spin-button', 'neo-down', me.spinButtonDownIconCls]}
|
47
|
+
{cls: ['neo-spin-button', 'neo-up', ...me.spinButtonUpIconCls .split(' ')]},
|
48
|
+
{cls: ['neo-spin-button', 'neo-down', ...me.spinButtonDownIconCls.split(' ')]}
|
49
49
|
];
|
50
50
|
|
51
51
|
me.update();
|
package/src/grid/View.mjs
CHANGED