neo.mjs 7.7.0 → 7.9.0
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/apps/ServiceWorker.mjs +2 -2
- package/apps/portal/index.html +1 -1
- package/apps/portal/neo-config.json +1 -0
- package/apps/portal/view/ViewportController.mjs +20 -4
- package/apps/portal/view/home/FooterContainer.mjs +1 -1
- package/apps/portal/view/learn/{ContentView.mjs → ContentComponent.mjs} +98 -38
- package/apps/portal/view/learn/CubeLayoutButton.mjs +77 -0
- package/apps/portal/view/learn/MainContainerController.mjs +2 -1
- package/apps/portal/view/learn/PageContainer.mjs +4 -4
- package/apps/shareddialog/view/DemoDialog.mjs +2 -10
- package/apps/shareddialog/view/MainContainerController.mjs +107 -105
- package/buildScripts/webpack/json/myApps.template.json +1 -1
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/table/nestedRecordFields/EditUserDialog.mjs +127 -0
- package/examples/table/nestedRecordFields/MainContainer.mjs +113 -0
- package/examples/table/nestedRecordFields/MainContainerModel.mjs +61 -0
- package/examples/table/nestedRecordFields/MainModel.mjs +41 -0
- package/examples/table/nestedRecordFields/MainStore.mjs +54 -0
- package/examples/table/nestedRecordFields/app.mjs +6 -0
- package/examples/table/nestedRecordFields/index.html +11 -0
- package/examples/table/nestedRecordFields/neo-config.json +6 -0
- package/package.json +4 -4
- package/resources/data/deck/learnneo/pages/Welcome.md +1 -1
- package/resources/data/deck/learnneo/pages/benefits/FormsEngine.md +1 -1
- package/resources/data/deck/learnneo/pages/guides/PortalApp.md +35 -0
- package/resources/data/deck/learnneo/tree.json +1 -0
- package/resources/scss/src/apps/portal/learn/PageContainer.scss +5 -0
- package/src/DefaultConfig.mjs +2 -2
- package/src/collection/Base.mjs +4 -3
- package/src/container/Base.mjs +12 -7
- package/src/data/Model.mjs +0 -7
- package/src/data/RecordFactory.mjs +82 -61
- package/src/data/Store.mjs +7 -0
- package/src/draggable/DragProxyComponent.mjs +10 -20
- package/src/form/field/CheckBox.mjs +12 -7
- package/src/form/field/ComboBox.mjs +8 -7
- package/src/grid/View.mjs +2 -2
- package/src/list/Base.mjs +1 -1
- package/src/main/addon/Navigator.mjs +34 -32
- package/src/main/addon/WindowPosition.mjs +9 -11
- package/src/model/Component.mjs +10 -1
- package/src/plugin/Resizable.mjs +12 -6
- package/src/tab/Container.mjs +5 -1
- package/src/table/View.mjs +31 -15
- package/src/table/header/Button.mjs +33 -18
- package/test/siesta/siesta.js +1 -0
- package/test/siesta/tests/ManagerInstance.mjs +35 -0
- package/apps/krausest/README.md +0 -3
- package/apps/krausest/TableCollection.mjs +0 -46
- package/apps/krausest/app.mjs +0 -8
- package/apps/krausest/css/currentStyle.css +0 -2
- package/apps/krausest/css/main.css +0 -26
- package/apps/krausest/index.html +0 -12
- package/apps/krausest/neo-config.json +0 -10
- package/apps/krausest/view/MainComponent.mjs +0 -122
- package/apps/krausest/view/MainComponentController.mjs +0 -33
- package/apps/krausest/view/TableComponent.mjs +0 -152
- /package/resources/scss/src/apps/portal/learn/{ContentView.scss → ContentComponent.scss} +0 -0
@@ -440,40 +440,42 @@ class Navigator extends Base {
|
|
440
440
|
subject = data.subject = DomAccess.getElement(data.id),
|
441
441
|
eventSource = data.eventSource = data.eventSource ? DomAccess.getElement(data.eventSource) : subject;
|
442
442
|
|
443
|
-
subject
|
443
|
+
if (subject) {
|
444
|
+
subject.$navigator = data;
|
444
445
|
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
// Ensure that only *one* of the child focusables is actually tabbable.
|
450
|
-
// We use arrow keys for internal navigation. TAB must move out.
|
451
|
-
me.fixItemFocusability(data);
|
452
|
-
|
453
|
-
// Finds a focusable item starting from a descendant el within one of our selector items
|
454
|
-
data.findFocusable = el => DomUtils.closest(el, el =>
|
455
|
-
// We're looking for an element that is focusable
|
456
|
-
DomUtils.isFocusable(el) &&
|
457
|
-
// And within our subject element
|
458
|
-
(subject.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_CONTAINED_BY) &&
|
459
|
-
// And within an element that matches our selector
|
460
|
-
el.closest(data.selector)
|
461
|
-
);
|
462
|
-
|
463
|
-
// TreeWalker so that we can easily move between navigable elements within the target.
|
464
|
-
data.treeWalker = document.createTreeWalker(subject, NodeFilter.SHOW_ELEMENT, node => me.navigateNodeFilter(node, data));
|
465
|
-
|
466
|
-
// We have to know when the DOM mutates in case the active item is removed.
|
467
|
-
(data.targetMutationMonitor = new MutationObserver(e => me.navigateTargetChildListChange(e, data))).observe(subject, {
|
468
|
-
childList : true,
|
469
|
-
subtree : true
|
470
|
-
});
|
446
|
+
if (!data.activeCls) {
|
447
|
+
data.activeCls = 'neo-navigator-active-item'
|
448
|
+
}
|
471
449
|
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
450
|
+
// Ensure that only *one* of the child focusables is actually tabbable.
|
451
|
+
// We use arrow keys for internal navigation. TAB must move out.
|
452
|
+
me.fixItemFocusability(data);
|
453
|
+
|
454
|
+
// Finds a focusable item starting from a descendant el within one of our selector items
|
455
|
+
data.findFocusable = el => DomUtils.closest(el, el =>
|
456
|
+
// We're looking for an element that is focusable
|
457
|
+
DomUtils.isFocusable(el) &&
|
458
|
+
// And within our subject element
|
459
|
+
(subject.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_CONTAINED_BY) &&
|
460
|
+
// And within an element that matches our selector
|
461
|
+
el.closest(data.selector)
|
462
|
+
);
|
463
|
+
|
464
|
+
// TreeWalker so that we can easily move between navigable elements within the target.
|
465
|
+
data.treeWalker = document.createTreeWalker(subject, NodeFilter.SHOW_ELEMENT, node => me.navigateNodeFilter(node, data));
|
466
|
+
|
467
|
+
// We have to know when the DOM mutates in case the active item is removed.
|
468
|
+
(data.targetMutationMonitor = new MutationObserver(e => me.navigateTargetChildListChange(e, data))).observe(subject, {
|
469
|
+
childList : true,
|
470
|
+
subtree : true
|
471
|
+
});
|
472
|
+
|
473
|
+
eventSource.addEventListener('keydown', data.l1 = e => me.navigateKeyDownHandler(e, data));
|
474
|
+
subject.addEventListener('mousedown', data.l2 = e => me.navigateMouseDownHandler(e, data));
|
475
|
+
subject.addEventListener('click', data.l3 = e => me.navigateClickHandler(e, data));
|
476
|
+
subject.addEventListener('focusin', data.l4 = e => me.navigateFocusInHandler(e, data));
|
477
|
+
subject.addEventListener('focusout', data.l5 = e => me.navigateFocusOutHandler(e, data))
|
478
|
+
}
|
477
479
|
}
|
478
480
|
|
479
481
|
/**
|
@@ -67,13 +67,13 @@ class WindowPosition extends Base {
|
|
67
67
|
construct(config) {
|
68
68
|
super.construct(config);
|
69
69
|
|
70
|
-
let me
|
71
|
-
|
70
|
+
let me = this,
|
71
|
+
{screenLeft, screenTop} = window;
|
72
72
|
|
73
|
-
me.screenLeft =
|
74
|
-
me.screenTop =
|
73
|
+
me.screenLeft = screenLeft;
|
74
|
+
me.screenTop = screenTop;
|
75
75
|
|
76
|
-
|
76
|
+
window.addEventListener('mouseout', me.onMouseOut.bind(me))
|
77
77
|
}
|
78
78
|
|
79
79
|
/**
|
@@ -96,15 +96,13 @@ class WindowPosition extends Base {
|
|
96
96
|
*
|
97
97
|
*/
|
98
98
|
adjustPositions() {
|
99
|
-
let position;
|
100
|
-
|
101
99
|
Object.entries(this.windows).forEach(([key, value]) => {
|
102
|
-
|
100
|
+
let {left, top} = this.getPosition(value);
|
103
101
|
|
104
102
|
Neo.Main.windowMoveTo({
|
105
103
|
windowName: key,
|
106
|
-
x :
|
107
|
-
y :
|
104
|
+
x : left,
|
105
|
+
y : top
|
108
106
|
})
|
109
107
|
})
|
110
108
|
}
|
@@ -199,7 +197,7 @@ class WindowPosition extends Base {
|
|
199
197
|
/**
|
200
198
|
* @param {Object} event
|
201
199
|
*/
|
202
|
-
onResize(event) {
|
200
|
+
onResize(event) {
|
203
201
|
let me = this,
|
204
202
|
win = window,
|
205
203
|
height, width;
|
package/src/model/Component.mjs
CHANGED
@@ -155,10 +155,19 @@ class Component extends Base {
|
|
155
155
|
*/
|
156
156
|
beforeSetStores(value, oldValue) {
|
157
157
|
if (value) {
|
158
|
-
let
|
158
|
+
let me = this,
|
159
|
+
controller = me.getController();
|
159
160
|
|
160
161
|
Object.entries(value).forEach(([key, storeValue]) => {
|
161
162
|
controller?.parseConfig(storeValue);
|
163
|
+
|
164
|
+
// support mapping string based listeners into the model instance
|
165
|
+
Object.entries(storeValue.listeners || {}).forEach(([listenerKey,listener]) => {
|
166
|
+
if (Neo.isString(listener) && Neo.isFunction(me[listener])) {
|
167
|
+
storeValue.listeners[listenerKey] = me[listener].bind(me)
|
168
|
+
}
|
169
|
+
})
|
170
|
+
|
162
171
|
value[key] = ClassSystemUtil.beforeSetInstance(storeValue)
|
163
172
|
})
|
164
173
|
}
|
package/src/plugin/Resizable.mjs
CHANGED
@@ -389,12 +389,12 @@ class Resizable extends Base {
|
|
389
389
|
* @param {Object} data
|
390
390
|
*/
|
391
391
|
onDragStart(data) {
|
392
|
-
let me
|
393
|
-
containerId
|
394
|
-
i
|
395
|
-
len
|
396
|
-
{appName, owner} = me,
|
397
|
-
style
|
392
|
+
let me = this,
|
393
|
+
containerId = me.boundaryContainerId,
|
394
|
+
i = 0,
|
395
|
+
len = data.path.length,
|
396
|
+
{appName, owner, windowId} = me,
|
397
|
+
style = owner.wrapperStyle, // todo: delegation target
|
398
398
|
target, vdom, vdomStyle;
|
399
399
|
|
400
400
|
me.isDragging = true;
|
@@ -429,11 +429,16 @@ class Resizable extends Base {
|
|
429
429
|
vdom = Neo.clone(owner.vdom, true);
|
430
430
|
vdomStyle = vdom.style;
|
431
431
|
|
432
|
+
delete vdom.height;
|
433
|
+
delete vdom.width;
|
434
|
+
|
432
435
|
delete vdomStyle.height;
|
433
436
|
delete vdomStyle.left;
|
434
437
|
delete vdomStyle.top;
|
435
438
|
delete vdomStyle.width;
|
436
439
|
|
440
|
+
vdomStyle.opacity = 0.7;
|
441
|
+
|
437
442
|
me.dragZone = Neo.create({
|
438
443
|
module : DragZone,
|
439
444
|
appName,
|
@@ -441,6 +446,7 @@ class Resizable extends Base {
|
|
441
446
|
dragElement : vdom,
|
442
447
|
moveInMainThread : false,
|
443
448
|
owner,
|
449
|
+
windowId,
|
444
450
|
...me.dragZoneConfig
|
445
451
|
})
|
446
452
|
} else {
|
package/src/tab/Container.mjs
CHANGED
@@ -57,6 +57,10 @@ class Container extends BaseContainer {
|
|
57
57
|
* @member {Object|null} headerToolbarDefaults=null
|
58
58
|
*/
|
59
59
|
headerToolbarDefaults: null,
|
60
|
+
/**
|
61
|
+
* @member {Object|null} layout=null
|
62
|
+
*/
|
63
|
+
layout: null,
|
60
64
|
/**
|
61
65
|
* True to not apply a background effect to the tab header container
|
62
66
|
* @member {Boolean} plain_=true
|
@@ -514,7 +518,7 @@ class Container extends BaseContainer {
|
|
514
518
|
*
|
515
519
|
*/
|
516
520
|
onConstructed() {
|
517
|
-
this.
|
521
|
+
this.layout = this.getLayoutConfig(); // silent update
|
518
522
|
super.onConstructed()
|
519
523
|
}
|
520
524
|
|
package/src/table/View.mjs
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import Component from '../component/Base.mjs';
|
2
|
+
import NeoArray from '../util/Array.mjs';
|
2
3
|
import VDomUtil from '../util/VDom.mjs';
|
3
4
|
|
4
5
|
/**
|
@@ -35,6 +36,10 @@ class View extends Component {
|
|
35
36
|
* @member {Object} recordVnodeMap={}
|
36
37
|
*/
|
37
38
|
recordVnodeMap: {},
|
39
|
+
/**
|
40
|
+
* @member {String} selectedRecordField='annotations.selected'
|
41
|
+
*/
|
42
|
+
selectedRecordField: 'annotations.selected',
|
38
43
|
/**
|
39
44
|
* @member {Neo.data.Store|null} store=null
|
40
45
|
*/
|
@@ -86,7 +91,7 @@ class View extends Component {
|
|
86
91
|
cellCls = ['neo-table-cell'],
|
87
92
|
colspan = record[me.colspanField],
|
88
93
|
{dataField} = column,
|
89
|
-
fieldValue =
|
94
|
+
fieldValue = Neo.ns(dataField, false, record),
|
90
95
|
hasStore = tableContainer.store?.model, // todo: remove as soon as all tables use stores (examples table)
|
91
96
|
{vdom} = me,
|
92
97
|
cellConfig, rendererOutput;
|
@@ -189,6 +194,10 @@ class View extends Component {
|
|
189
194
|
|
190
195
|
trCls = me.getTrClass(record, i);
|
191
196
|
|
197
|
+
if (selectedRows && Neo.ns(me.selectedRecordField, false, record)) {
|
198
|
+
NeoArray.add(selectedRows, id)
|
199
|
+
}
|
200
|
+
|
192
201
|
if (selectedRows?.includes(id)) {
|
193
202
|
trCls.push('neo-selected');
|
194
203
|
|
@@ -432,11 +441,12 @@ class View extends Component {
|
|
432
441
|
* @param {Object} opts.record
|
433
442
|
*/
|
434
443
|
onStoreRecordChange(opts) {
|
435
|
-
let me
|
436
|
-
fieldNames
|
437
|
-
needsUpdate
|
438
|
-
tableContainer
|
439
|
-
{
|
444
|
+
let me = this,
|
445
|
+
fieldNames = opts.fields.map(field => field.name),
|
446
|
+
needsUpdate = false,
|
447
|
+
tableContainer = me.parent,
|
448
|
+
{selectionModel} = tableContainer,
|
449
|
+
{vdom} = me,
|
440
450
|
cellId, cellNode, column, index, scope;
|
441
451
|
|
442
452
|
if (fieldNames.includes(me.colspanField)) {
|
@@ -444,17 +454,23 @@ class View extends Component {
|
|
444
454
|
me.createViewData(me.store.items)
|
445
455
|
} else {
|
446
456
|
opts.fields.forEach(field => {
|
447
|
-
|
448
|
-
|
457
|
+
if (field.name === me.selectedRecordField) {
|
458
|
+
if (selectionModel.ntype === 'selection-table-rowmodel') {
|
459
|
+
selectionModel[!field.value && selectionModel.singleSelect ? 'deselect' : 'select'](me.getRowId(opts.record))
|
460
|
+
}
|
461
|
+
} else {
|
462
|
+
cellId = me.getCellId(opts.record, field.name);
|
463
|
+
cellNode = VDomUtil.findVdomChild(vdom, cellId);
|
449
464
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
465
|
+
// the vdom might not exist yet => nothing to do in this case
|
466
|
+
if (cellNode?.vdom) {
|
467
|
+
column = me.getColumn(field.name);
|
468
|
+
index = cellNode.index;
|
469
|
+
needsUpdate = true;
|
470
|
+
scope = column.rendererScope || tableContainer;
|
456
471
|
|
457
|
-
|
472
|
+
cellNode.parentNode.cn[index] = me.applyRendererOutput({cellId, column, record: opts.record, index, tableContainer})
|
473
|
+
}
|
458
474
|
}
|
459
475
|
})
|
460
476
|
}
|
@@ -1,6 +1,7 @@
|
|
1
|
-
import BaseButton
|
2
|
-
import NeoArray
|
3
|
-
import TextField
|
1
|
+
import BaseButton from '../../button/Base.mjs';
|
2
|
+
import NeoArray from '../../util/Array.mjs';
|
3
|
+
import TextField from '../../form/field/Text.mjs';
|
4
|
+
import {resolveCallback} from '../../util/Function.mjs';
|
4
5
|
|
5
6
|
/**
|
6
7
|
* @class Neo.table.header.Button
|
@@ -75,6 +76,10 @@ class Button extends BaseButton {
|
|
75
76
|
* @protected
|
76
77
|
*/
|
77
78
|
isSorted_: null,
|
79
|
+
/**
|
80
|
+
* @member {Function|String|null} renderer_='cellRenderer'
|
81
|
+
*/
|
82
|
+
renderer_: 'cellRenderer',
|
78
83
|
/**
|
79
84
|
* Scope to execute the column renderer.
|
80
85
|
* Defaults to the matching table.Container
|
@@ -261,7 +266,31 @@ class Button extends BaseButton {
|
|
261
266
|
* @protected
|
262
267
|
*/
|
263
268
|
beforeSetCellAlign(value, oldValue) {
|
264
|
-
return this.beforeSetEnumValue(value, oldValue, 'cellAlign', 'cellAlignValues')
|
269
|
+
return this.beforeSetEnumValue(value, oldValue, 'cellAlign', 'cellAlignValues')
|
270
|
+
}
|
271
|
+
|
272
|
+
/**
|
273
|
+
* Triggered before the renderer config gets changed
|
274
|
+
* @param {Function|String|null} value
|
275
|
+
* @param {Function|String|null} oldValue
|
276
|
+
* @protected
|
277
|
+
*/
|
278
|
+
beforeSetRenderer(value, oldValue) {
|
279
|
+
return resolveCallback(value, this).fn
|
280
|
+
}
|
281
|
+
|
282
|
+
/**
|
283
|
+
* @param {Object} data
|
284
|
+
* @param {Neo.button.Base} data.column
|
285
|
+
* @param {String} data.dataField
|
286
|
+
* @param {Number} data.index
|
287
|
+
* @param {Object} data.record
|
288
|
+
* @param {Neo.table.Container} data.tableContainer
|
289
|
+
* @param {Number|String} data.value
|
290
|
+
* @returns {*}
|
291
|
+
*/
|
292
|
+
cellRenderer(data) {
|
293
|
+
return data.value
|
265
294
|
}
|
266
295
|
|
267
296
|
/**
|
@@ -461,20 +490,6 @@ class Button extends BaseButton {
|
|
461
490
|
me.cls = cls;
|
462
491
|
me._isSorted = null
|
463
492
|
}
|
464
|
-
|
465
|
-
/**
|
466
|
-
* @param {Object} data
|
467
|
-
* @param {Neo.button.Base} data.column
|
468
|
-
* @param {String} data.dataField
|
469
|
-
* @param {Number} data.index
|
470
|
-
* @param {Object} data.record
|
471
|
-
* @param {Neo.table.Container} data.tableContainer
|
472
|
-
* @param {Number|String} data.value
|
473
|
-
* @returns {*}
|
474
|
-
*/
|
475
|
-
renderer(data) {
|
476
|
-
return data.value
|
477
|
-
}
|
478
493
|
}
|
479
494
|
|
480
495
|
export default Neo.setupClass(Button);
|
package/test/siesta/siesta.js
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
import Neo from '../../../src/Neo.mjs';
|
2
|
+
import * as core from '../../../src/core/_export.mjs';
|
3
|
+
import InstanceManager from '../../../src/manager/Instance.mjs';
|
4
|
+
|
5
|
+
let startCount;
|
6
|
+
|
7
|
+
StartTest(t => {
|
8
|
+
t.it('Module imports', t => {
|
9
|
+
t.ok(Neo, 'Neo is imported as a JS module');
|
10
|
+
t.ok(InstanceManager, 'InstanceManager is imported as a JS module');
|
11
|
+
});
|
12
|
+
|
13
|
+
t.it('Adding & removing items', t => {
|
14
|
+
startCount = InstanceManager.getCount();
|
15
|
+
|
16
|
+
t.diag("Create 3 Neo instances");
|
17
|
+
|
18
|
+
const
|
19
|
+
item1 = Neo.create('Neo.core.Base'),
|
20
|
+
item2 = Neo.create('Neo.core.Base'),
|
21
|
+
item3 = Neo.create('Neo.core.Base');
|
22
|
+
|
23
|
+
t.is(InstanceManager.getCount() - startCount, 3, '3 instances got added');
|
24
|
+
|
25
|
+
t.is(InstanceManager.findFirst(item2), item2, 'Found item via reference');
|
26
|
+
|
27
|
+
t.is(InstanceManager.findFirst({id: item3.id}), item3, 'Found item via id');
|
28
|
+
|
29
|
+
item1.destroy();
|
30
|
+
item2.destroy();
|
31
|
+
item3.destroy()
|
32
|
+
|
33
|
+
t.is(InstanceManager.getCount(), startCount, '3 instances got removed');
|
34
|
+
});
|
35
|
+
});
|
package/apps/krausest/README.md
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
import BaseCollection from '../../src/collection/Base.mjs';
|
2
|
-
|
3
|
-
function _random(max) {
|
4
|
-
return Math.round(Math.random()*1000)%max;
|
5
|
-
}
|
6
|
-
|
7
|
-
/**
|
8
|
-
* @class NeoApp.TableCollection
|
9
|
-
* @extends Neo.collection.Base
|
10
|
-
*/
|
11
|
-
class TableCollection extends BaseCollection {
|
12
|
-
static config = {
|
13
|
-
/**
|
14
|
-
* @member {String} className='NeoApp.TableCollection'
|
15
|
-
* @protected
|
16
|
-
*/
|
17
|
-
className: 'NeoApp.TableCollection',
|
18
|
-
/**
|
19
|
-
* @member {Number} idCounter=1
|
20
|
-
*/
|
21
|
-
idCounter: 1
|
22
|
-
}
|
23
|
-
|
24
|
-
/**
|
25
|
-
* @param {Number} count
|
26
|
-
* @returns {Object[]}
|
27
|
-
*/
|
28
|
-
buildData(count=1000) {
|
29
|
-
let adjectives = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive', 'fancy'],
|
30
|
-
colours = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange'],
|
31
|
-
nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard'],
|
32
|
-
data = [],
|
33
|
-
i = 0;
|
34
|
-
|
35
|
-
for (; i < count; i++) {
|
36
|
-
data.push({
|
37
|
-
id : this.idCounter++,
|
38
|
-
label: adjectives[_random(adjectives.length)] + ' ' + colours[_random(colours.length)] + ' ' + nouns[_random(nouns.length)]
|
39
|
-
});
|
40
|
-
}
|
41
|
-
|
42
|
-
return data;
|
43
|
-
}
|
44
|
-
}
|
45
|
-
|
46
|
-
export default Neo.setupClass(TableCollection);;
|
package/apps/krausest/app.mjs
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
padding: 10px 0 0 0;
|
3
|
-
margin: 0;
|
4
|
-
overflow-y: scroll;
|
5
|
-
}
|
6
|
-
#duration {
|
7
|
-
padding-top: 0px;
|
8
|
-
}
|
9
|
-
.jumbotron {
|
10
|
-
padding-top:10px;
|
11
|
-
padding-bottom:10px;
|
12
|
-
}
|
13
|
-
.test-data a {
|
14
|
-
display: block;
|
15
|
-
}
|
16
|
-
.preloadicon {
|
17
|
-
position: absolute;
|
18
|
-
top:-20px;
|
19
|
-
left:-20px;
|
20
|
-
}
|
21
|
-
.col-sm-6.smallpad {
|
22
|
-
padding: 5px;
|
23
|
-
}
|
24
|
-
.jumbotron .row h1 {
|
25
|
-
font-size: 40px;
|
26
|
-
}
|
package/apps/krausest/index.html
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8"/>
|
5
|
-
<title>neo.mjs-"keyed"</title>
|
6
|
-
<link href="./css/currentStyle.css" rel="stylesheet"/>
|
7
|
-
</head>
|
8
|
-
<body>
|
9
|
-
<div id="main"></div>
|
10
|
-
<script src="../../src/MicroLoader.mjs" type="module"></script>
|
11
|
-
</body>
|
12
|
-
</html>
|
@@ -1,122 +0,0 @@
|
|
1
|
-
import Base from '../../../src/component/Base.mjs';
|
2
|
-
import MainComponentController from './MainComponentController.mjs';
|
3
|
-
import TableComponent from './TableComponent.mjs';
|
4
|
-
import VdomUtil from '../../../src/util/VDom.mjs';
|
5
|
-
|
6
|
-
/**
|
7
|
-
* @class NeoApp.view.MainComponent
|
8
|
-
* @extends Neo.component.Base
|
9
|
-
*/
|
10
|
-
class MainComponent extends Base {
|
11
|
-
static config = {
|
12
|
-
/**
|
13
|
-
* @member {String} className='NeoApp.view.MainComponent'
|
14
|
-
* @protected
|
15
|
-
*/
|
16
|
-
className: 'NeoApp.view.MainComponent',
|
17
|
-
/**
|
18
|
-
* True automatically mounts a component after being rendered.
|
19
|
-
* @member {Boolean} autoMount=true
|
20
|
-
*/
|
21
|
-
autoMount: true,
|
22
|
-
/**
|
23
|
-
* @member {String[]} baseCls=['container']
|
24
|
-
*/
|
25
|
-
baseCls: ['container'],
|
26
|
-
/**
|
27
|
-
* @member {Neo.controller.Component} controller=MainComponentController
|
28
|
-
*/
|
29
|
-
controller: MainComponentController,
|
30
|
-
/**
|
31
|
-
* @member {Object[]} domListeners
|
32
|
-
* @protected
|
33
|
-
*/
|
34
|
-
domListeners: [{
|
35
|
-
click : 'onButtonClick',
|
36
|
-
delegate: '.btn'
|
37
|
-
}],
|
38
|
-
/**
|
39
|
-
* @member {NeoApp.view.TableComponent|null} table=null
|
40
|
-
*/
|
41
|
-
table: null,
|
42
|
-
/**
|
43
|
-
* @member {Object} _vdom
|
44
|
-
*/
|
45
|
-
_vdom:
|
46
|
-
{cls: ['container'], cn: [
|
47
|
-
{cls: ['jumbotron'], cn: [
|
48
|
-
{cls: ['row'], cn: [
|
49
|
-
{cls: ['col-md-6'], cn: [
|
50
|
-
{cls: ['row'], cn: [
|
51
|
-
{tag: 'h1', html: 'neo.mjs'}
|
52
|
-
]}
|
53
|
-
]},
|
54
|
-
{cls: ['col-md-6'], cn: [
|
55
|
-
{cls: ['row'], flag: 'row', cn: []}
|
56
|
-
]}
|
57
|
-
]}
|
58
|
-
]},
|
59
|
-
{tag: 'span', cls: ['preloadicon', 'glyphicon', 'glyphicon-remove'], 'aria-hidden': true}
|
60
|
-
]}
|
61
|
-
}
|
62
|
-
|
63
|
-
/**
|
64
|
-
* @param {Object} config
|
65
|
-
*/
|
66
|
-
construct(config) {
|
67
|
-
super.construct(config);
|
68
|
-
|
69
|
-
this.createColumns(); // silent vdom update
|
70
|
-
this.createTable();
|
71
|
-
}
|
72
|
-
|
73
|
-
/**
|
74
|
-
*
|
75
|
-
*/
|
76
|
-
createColumns() {
|
77
|
-
let me = this,
|
78
|
-
vdom = me.vdom,
|
79
|
-
row = VdomUtil.getByFlag(vdom, 'row'),
|
80
|
-
i = 0,
|
81
|
-
item,
|
82
|
-
|
83
|
-
map = [
|
84
|
-
{id: 'run', html: 'Create 1,000 rows'},
|
85
|
-
{id: 'runlots', html: 'Create 10,000 rows'},
|
86
|
-
{id: 'add', html: 'Append 1,000 rows'},
|
87
|
-
{id: 'update', html: 'Update every 10th row'},
|
88
|
-
{id: 'clear', html: 'Clear'},
|
89
|
-
{id: 'swaprows', html: 'Swap Rows'}
|
90
|
-
];
|
91
|
-
|
92
|
-
for (; i < 6; i++) {
|
93
|
-
item = map[i];
|
94
|
-
|
95
|
-
row.cn.push(
|
96
|
-
{cls: ['col-sm-6 smallpad'], cn: [
|
97
|
-
{tag: 'button', type: 'button', cls: ['btn', 'btn-primary', 'btn-block'], id: item.id, html: item.html}
|
98
|
-
]}
|
99
|
-
);
|
100
|
-
}
|
101
|
-
}
|
102
|
-
|
103
|
-
/**
|
104
|
-
*
|
105
|
-
*/
|
106
|
-
createTable() {
|
107
|
-
let me = this;
|
108
|
-
|
109
|
-
me.table = Neo.create({
|
110
|
-
module : TableComponent,
|
111
|
-
appName : me.appName,
|
112
|
-
parentId : me.id,
|
113
|
-
reference: 'table'
|
114
|
-
});
|
115
|
-
|
116
|
-
me.vdom.cn.splice(1, 0, me.table.vdom);
|
117
|
-
|
118
|
-
me.update();
|
119
|
-
}
|
120
|
-
}
|
121
|
-
|
122
|
-
export default Neo.setupClass(MainComponent);
|