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.
Files changed (58) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/index.html +1 -1
  3. package/apps/portal/neo-config.json +1 -0
  4. package/apps/portal/view/ViewportController.mjs +20 -4
  5. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  6. package/apps/portal/view/learn/{ContentView.mjs → ContentComponent.mjs} +98 -38
  7. package/apps/portal/view/learn/CubeLayoutButton.mjs +77 -0
  8. package/apps/portal/view/learn/MainContainerController.mjs +2 -1
  9. package/apps/portal/view/learn/PageContainer.mjs +4 -4
  10. package/apps/shareddialog/view/DemoDialog.mjs +2 -10
  11. package/apps/shareddialog/view/MainContainerController.mjs +107 -105
  12. package/buildScripts/webpack/json/myApps.template.json +1 -1
  13. package/examples/ServiceWorker.mjs +2 -2
  14. package/examples/table/nestedRecordFields/EditUserDialog.mjs +127 -0
  15. package/examples/table/nestedRecordFields/MainContainer.mjs +113 -0
  16. package/examples/table/nestedRecordFields/MainContainerModel.mjs +61 -0
  17. package/examples/table/nestedRecordFields/MainModel.mjs +41 -0
  18. package/examples/table/nestedRecordFields/MainStore.mjs +54 -0
  19. package/examples/table/nestedRecordFields/app.mjs +6 -0
  20. package/examples/table/nestedRecordFields/index.html +11 -0
  21. package/examples/table/nestedRecordFields/neo-config.json +6 -0
  22. package/package.json +4 -4
  23. package/resources/data/deck/learnneo/pages/Welcome.md +1 -1
  24. package/resources/data/deck/learnneo/pages/benefits/FormsEngine.md +1 -1
  25. package/resources/data/deck/learnneo/pages/guides/PortalApp.md +35 -0
  26. package/resources/data/deck/learnneo/tree.json +1 -0
  27. package/resources/scss/src/apps/portal/learn/PageContainer.scss +5 -0
  28. package/src/DefaultConfig.mjs +2 -2
  29. package/src/collection/Base.mjs +4 -3
  30. package/src/container/Base.mjs +12 -7
  31. package/src/data/Model.mjs +0 -7
  32. package/src/data/RecordFactory.mjs +82 -61
  33. package/src/data/Store.mjs +7 -0
  34. package/src/draggable/DragProxyComponent.mjs +10 -20
  35. package/src/form/field/CheckBox.mjs +12 -7
  36. package/src/form/field/ComboBox.mjs +8 -7
  37. package/src/grid/View.mjs +2 -2
  38. package/src/list/Base.mjs +1 -1
  39. package/src/main/addon/Navigator.mjs +34 -32
  40. package/src/main/addon/WindowPosition.mjs +9 -11
  41. package/src/model/Component.mjs +10 -1
  42. package/src/plugin/Resizable.mjs +12 -6
  43. package/src/tab/Container.mjs +5 -1
  44. package/src/table/View.mjs +31 -15
  45. package/src/table/header/Button.mjs +33 -18
  46. package/test/siesta/siesta.js +1 -0
  47. package/test/siesta/tests/ManagerInstance.mjs +35 -0
  48. package/apps/krausest/README.md +0 -3
  49. package/apps/krausest/TableCollection.mjs +0 -46
  50. package/apps/krausest/app.mjs +0 -8
  51. package/apps/krausest/css/currentStyle.css +0 -2
  52. package/apps/krausest/css/main.css +0 -26
  53. package/apps/krausest/index.html +0 -12
  54. package/apps/krausest/neo-config.json +0 -10
  55. package/apps/krausest/view/MainComponent.mjs +0 -122
  56. package/apps/krausest/view/MainComponentController.mjs +0 -33
  57. package/apps/krausest/view/TableComponent.mjs +0 -152
  58. /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.$navigator = data;
443
+ if (subject) {
444
+ subject.$navigator = data;
444
445
 
445
- if (!data.activeCls) {
446
- data.activeCls = 'neo-navigator-active-item'
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
- eventSource.addEventListener('keydown', data.l1 = e => me.navigateKeyDownHandler(e, data));
473
- subject.addEventListener('mousedown', data.l2 = e => me.navigateMouseDownHandler(e, data));
474
- subject.addEventListener('click', data.l3 = e => me.navigateClickHandler(e, data));
475
- subject.addEventListener('focusin', data.l4 = e => me.navigateFocusInHandler(e, data));
476
- subject.addEventListener('focusout', data.l5 = e => me.navigateFocusOutHandler(e, data));
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 = this,
71
- win = window;
70
+ let me = this,
71
+ {screenLeft, screenTop} = window;
72
72
 
73
- me.screenLeft = win.screenLeft;
74
- me.screenTop = win.screenTop;
73
+ me.screenLeft = screenLeft;
74
+ me.screenTop = screenTop;
75
75
 
76
- win.addEventListener('mouseout', me.onMouseOut.bind(me))
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
- position = this.getPosition(value);
100
+ let {left, top} = this.getPosition(value);
103
101
 
104
102
  Neo.Main.windowMoveTo({
105
103
  windowName: key,
106
- x : position.left,
107
- y : position.top
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) { console.log('onResize');
200
+ onResize(event) {
203
201
  let me = this,
204
202
  win = window,
205
203
  height, width;
@@ -155,10 +155,19 @@ class Component extends Base {
155
155
  */
156
156
  beforeSetStores(value, oldValue) {
157
157
  if (value) {
158
- let controller = this.component.getController();
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
  }
@@ -389,12 +389,12 @@ class Resizable extends Base {
389
389
  * @param {Object} data
390
390
  */
391
391
  onDragStart(data) {
392
- let me = this,
393
- containerId = me.boundaryContainerId,
394
- i = 0,
395
- len = data.path.length,
396
- {appName, owner} = me,
397
- style = owner.wrapperStyle, // todo: delegation target
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 {
@@ -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._layout = this.getLayoutConfig(); // silent update
521
+ this.layout = this.getLayoutConfig(); // silent update
518
522
  super.onConstructed()
519
523
  }
520
524
 
@@ -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 = record[dataField],
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 = this,
436
- fieldNames = opts.fields.map(field => field.name),
437
- needsUpdate = false,
438
- tableContainer = me.parent,
439
- {vdom} = me,
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
- cellId = me.getCellId(opts.record, field.name);
448
- cellNode = VDomUtil.findVdomChild(vdom, cellId);
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
- // the vdom might not exist yet => nothing to do in this case
451
- if (cellNode?.vdom) {
452
- column = me.getColumn(field.name);
453
- index = cellNode.index;
454
- needsUpdate = true;
455
- scope = column.rendererScope || tableContainer;
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
- cellNode.parentNode.cn[index] = me.applyRendererOutput({cellId, column, record: opts.record, index, tableContainer})
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 from '../../button/Base.mjs';
2
- import NeoArray from '../../util/Array.mjs';
3
- import TextField from '../../form/field/Text.mjs';
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);
@@ -20,6 +20,7 @@ project.plan(
20
20
  'tests/ClassConfigsAndFields.mjs',
21
21
  'tests/ClassSystem.mjs',
22
22
  'tests/CollectionBase.mjs',
23
+ 'tests/ManagerInstance.mjs',
23
24
  'tests/Rectangle.mjs',
24
25
  'tests/VdomHelper.mjs',
25
26
  'tests/VdomCalendar.mjs',
@@ -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
+ });
@@ -1,3 +0,0 @@
1
- neo.mjs based demo implementation for:
2
-
3
- https://github.com/krausest/js-framework-benchmark
@@ -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);;
@@ -1,8 +0,0 @@
1
- import MainComponent from './view/MainComponent.mjs';
2
-
3
- export const onStart = () => Neo.app({
4
- appPath : 'apps/neoapp/',
5
- mainView: MainComponent,
6
- name : 'NeoApp',
7
- parentId: 'main'
8
- });
@@ -1,2 +0,0 @@
1
- @import url("https://stackpath.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css");
2
- @import url("./main.css");
@@ -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
- }
@@ -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,10 +0,0 @@
1
- {
2
- "appPath": "apps/krausest/app.mjs",
3
- "basePath": "../../",
4
- "environment": "development",
5
- "mainPath": "./Main.mjs",
6
- "mainThreadAddons": ["CloneNode"],
7
- "themes": [],
8
- "useFontAwesome": false,
9
- "useTouchEvents": false
10
- }
@@ -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);