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
@@ -2,6 +2,7 @@ import Component from '../../../src/component/Base.mjs';
2
2
  import ComponentController from '../../../src/controller/Component.mjs';
3
3
  import ComponentManager from '../../../src/manager/Component.mjs';
4
4
  import DemoDialog from './DemoDialog.mjs';
5
+ import DragProxyComponent from '../../../src/draggable/DragProxyComponent.mjs';
5
6
  import NeoArray from '../../../src/util/Array.mjs';
6
7
  import Rectangle from '../../../src/util/Rectangle.mjs';
7
8
 
@@ -16,63 +17,53 @@ class MainContainerController extends ComponentController {
16
17
  * @protected
17
18
  */
18
19
  className: 'SharedDialog.view.MainContainerController',
19
- /**
20
- * @member {String[]} connectedApps=[]
21
- */
22
- connectedApps: [],
23
- /**
24
- * @member {String} currentTheme='neo-theme-light'
25
- */
26
- currentTheme: 'neo-theme-light',
27
- /**
28
- * @member {String} dockedWindowAppName='SharedDialog2'
29
- */
30
- dockedWindowAppName: 'SharedDialog2',
31
- /**
32
- * @member {Number|null} dockedWindowId=null
33
- */
34
- dockedWindowId: null,
35
- /**
36
- * @member {Neo.component.Base|null} dockedWindowProxy=null
37
- */
38
- dockedWindowProxy: null,
39
20
  /**
40
21
  * Valid values: bottom, left, right, top
41
22
  * @member {String} dockedWindowSide_='right'
42
23
  */
43
24
  dockedWindowSide_: 'right',
44
- /**
45
- * @member {Number} dockedWindowSize=500
46
- */
47
- dockedWindowSize: 620,
48
- /**
49
- * @member {Object} dialogRect=null
50
- */
51
- dialogRect: null,
52
- /**
53
- * @member {Object} dragStartWindowRect=null
54
- */
55
- dragStartWindowRect: null,
56
- /**
57
- * @member {Number|null} targetWindowSize=0
58
- */
59
- targetWindowSize: 0
60
25
  }
61
26
 
62
27
  /**
63
- * The App worker will receive connect & disconnect events inside the SharedWorkers context
28
+ * @member {String[]} connectedApps=[]
64
29
  */
65
- onConstructed() {
66
- super.onConstructed();
67
-
68
- let me = this;
69
-
70
- Neo.currentWorker.on({
71
- connect : me.onAppConnect,
72
- disconnect: me.onAppDisconnect,
73
- scope : me
74
- })
75
- }
30
+ connectedApps = []
31
+ /**
32
+ * @member {String} currentTheme='neo-theme-light'
33
+ */
34
+ currentTheme = 'neo-theme-light'
35
+ /**
36
+ * @member {String} dockedWindowAppName='SharedDialog2'
37
+ */
38
+ dockedWindowAppName = 'SharedDialog2'
39
+ /**
40
+ * @member {Number|null} dockedWindowId=null
41
+ */
42
+ dockedWindowId = null
43
+ /**
44
+ * @member {Neo.component.Base|null} dockedWindowProxy=null
45
+ */
46
+ dockedWindowProxy = null
47
+ /**
48
+ * @member {Number} dockedWindowSize=500
49
+ */
50
+ dockedWindowSize = 620
51
+ /**
52
+ * @member {Object} dialogRect=null
53
+ */
54
+ dialogRect = null
55
+ /**
56
+ * @member {Object} dragStartWindowRect=null
57
+ */
58
+ dragStartWindowRect = null
59
+ /**
60
+ * @member {String|null} previousTheme=null
61
+ */
62
+ previousTheme = null
63
+ /**
64
+ * @member {Number|null} targetWindowSize=0
65
+ */
66
+ targetWindowSize = 0
76
67
 
77
68
  /**
78
69
  * Triggered after the dockedWindowSide config got changed
@@ -103,7 +94,7 @@ class MainContainerController extends ComponentController {
103
94
  animateTargetId : data.component.id,
104
95
  appName,
105
96
  boundaryContainerId: null,
106
- cls : [me.currentTheme, 'neo-dialog', 'neo-panel', 'neo-container'],
97
+ cls : [me.currentTheme],
107
98
  height : 200,
108
99
  width : 300,
109
100
  windowId,
@@ -128,7 +119,7 @@ class MainContainerController extends ComponentController {
128
119
 
129
120
  if (me.dockedWindowProxy) {
130
121
  me.dockedWindowProxy.destroy(true);
131
- me.dockedWindowProxy = null;
122
+ me.dockedWindowProxy = null
132
123
  }
133
124
  }
134
125
 
@@ -177,9 +168,9 @@ class MainContainerController extends ComponentController {
177
168
  }
178
169
 
179
170
  /**
180
- * @param {Boolean} enable
171
+ * @param {Boolean} enable=true
181
172
  */
182
- enableOpenDialogButtons(enable) {
173
+ enableOpenDialogButtons(enable=true) {
183
174
  this.getOpenDialogButtons().forEach(button => {
184
175
  button.disabled = !enable
185
176
  })
@@ -196,9 +187,7 @@ class MainContainerController extends ComponentController {
196
187
  *
197
188
  */
198
189
  getOpenDialogButtons() {
199
- return ComponentManager.find({
200
- flag: 'open-dialog-button'
201
- })
190
+ return ComponentManager.find({flag: 'open-dialog-button'})
202
191
  }
203
192
 
204
193
  /**
@@ -221,9 +210,8 @@ class MainContainerController extends ComponentController {
221
210
  * @return {{left: String, top: String}}
222
211
  */
223
212
  getProxyPosition(proxyRect, side, fullyIncludeIntoWindow=false) {
224
- let me = this,
225
- dragStartWindowRect = me.dragStartWindowRect,
226
- targetWindowSize = me.targetWindowSize,
213
+ let me = this,
214
+ {dragStartWindowRect, targetWindowSize} = me,
227
215
  left, top;
228
216
 
229
217
  switch(side) {
@@ -312,16 +300,16 @@ class MainContainerController extends ComponentController {
312
300
  * @param {Number} data.windowId
313
301
  */
314
302
  onAppConnect(data) {
315
- let me = this,
316
- name = data.appName;
303
+ let me = this,
304
+ {appName, windowId} = data;
317
305
 
318
- NeoArray.add(me.connectedApps, name);
306
+ NeoArray.add(me.connectedApps, appName);
319
307
 
320
- if (name !== 'SharedDialog' && me.currentTheme !== 'neo-theme-light') {
321
- me.switchThemeForApp(name, me.currentTheme)
308
+ if (appName !== 'SharedDialog' && me.currentTheme !== 'neo-theme-light') {
309
+ me.switchThemeForApp(windowId)
322
310
  }
323
311
 
324
- if (name === me.dockedWindowAppName) {
312
+ if (appName === me.dockedWindowAppName) {
325
313
  me.dockedWindowId = data.windowId;
326
314
  me.getOpenDockedWindowButton().disabled = true
327
315
  }
@@ -334,29 +322,46 @@ class MainContainerController extends ComponentController {
334
322
  * @param {String} data.appName
335
323
  */
336
324
  onAppDisconnect(data) {
337
- let me = this,
338
- name = data.appName;
325
+ let me = this,
326
+ {connectedApps, dialog, windowId} = me,
327
+ name = data.appName;
339
328
 
340
329
  if (name === 'SharedDialog') {
341
330
  // we want to close all popup windows, which equals to all connected apps minus the main app
342
- NeoArray.remove(me.connectedApps, 'SharedDialog');
331
+ NeoArray.remove(connectedApps, 'SharedDialog');
343
332
 
344
333
  Neo.Main.windowClose({
345
- names: me.connectedApps
334
+ names: connectedApps,
335
+ windowId
346
336
  })
347
- } else {
348
- NeoArray.remove(me.connectedApps, name);
337
+ } if (name === me.dockedWindowAppName) {
338
+ NeoArray.remove(connectedApps, name);
349
339
 
350
- Neo.main.addon.WindowPosition.unregisterWindow({
351
- name: name
352
- })
353
- }
340
+ Neo.main.addon.WindowPosition.unregisterWindow({name, windowId});
341
+
342
+ if (dialog && dialog.windowId !== windowId) {
343
+ me.enableOpenDialogButtons()
344
+ }
354
345
 
355
- if (name === me.dockedWindowAppName) {
356
346
  me.getOpenDockedWindowButton().disabled = false
357
347
  }
358
348
  }
359
349
 
350
+ /**
351
+ * The App worker will receive connect & disconnect events inside the SharedWorkers context
352
+ */
353
+ onConstructed() {
354
+ super.onConstructed();
355
+
356
+ let me = this;
357
+
358
+ Neo.currentWorker.on({
359
+ connect : me.onAppConnect,
360
+ disconnect: me.onAppDisconnect,
361
+ scope : me
362
+ })
363
+ }
364
+
360
365
  /**
361
366
  * @param {Object} data
362
367
  */
@@ -368,7 +373,8 @@ class MainContainerController extends ComponentController {
368
373
  *
369
374
  */
370
375
  onDialogClose() {
371
- this.enableOpenDialogButtons(true)
376
+ this.enableOpenDialogButtons(true);
377
+ this.dialog = null
372
378
  }
373
379
 
374
380
  /**
@@ -383,11 +389,10 @@ class MainContainerController extends ComponentController {
383
389
  */
384
390
  onDragEnd(data) {
385
391
  if (this.hasDockedWindow()) {
386
- let me = this,
387
- dialog = me.dialog,
388
- dragStartWindowRect = me.dragStartWindowRect,
389
- proxyRect = Rectangle.moveTo(me.dialogRect, data.clientX - data.offsetX, data.clientY - data.offsetY),
390
- side = me.dockedWindowSide;
392
+ let me = this,
393
+ {dialog, dragStartWindowRect} = me,
394
+ proxyRect = Rectangle.moveTo(me.dialogRect, data.clientX - data.offsetX, data.clientY - data.offsetY),
395
+ side = me.dockedWindowSide;
391
396
 
392
397
  if (dialog.appName === me.dockedWindowAppName) {
393
398
  side = me.getOppositeSide(me.dockedWindowSide)
@@ -409,7 +414,7 @@ class MainContainerController extends ComponentController {
409
414
  onDragMove(data) {
410
415
  if (this.hasDockedWindow()) {
411
416
  let me = this,
412
- {dialogRect, dragStartWindowRect, dockedWindowAppName, dockedWindowId} = me,
417
+ {dialogRect, dragStartWindowRect, dockedWindowAppName, dockedWindowId} = me,
413
418
  proxyRect = Rectangle.moveTo(dialogRect, data.clientX - data.offsetX, data.clientY - data.offsetY),
414
419
  side = me.dockedWindowSide,
415
420
  proxyPosition, vdom;
@@ -437,14 +442,12 @@ class MainContainerController extends ComponentController {
437
442
  });
438
443
 
439
444
  me.dockedWindowProxy = Neo.create({
440
- module : Component,
441
- appName : dockedWindowAppName,
442
- autoMount : true,
443
- autoRender: true,
444
- cls : ['neo-dialog', 'neo-panel', 'neo-dragproxy'],
445
- parentId : 'document.body',
446
- vdom : vdom,
447
- windowId : dockedWindowId
445
+ module : DragProxyComponent,
446
+ appName : dockedWindowAppName,
447
+ cls : ['neo-dialog', 'neo-panel', 'neo-container'],
448
+ moveInMainThread: false,
449
+ vdom : vdom,
450
+ windowId : dockedWindowId
448
451
  });
449
452
 
450
453
  // The other window has most likely not loaded The dialog JS module yet,
@@ -472,7 +475,7 @@ class MainContainerController extends ComponentController {
472
475
  onDragStart(data) {
473
476
  if (this.hasDockedWindow()) {
474
477
  let me = this,
475
- appName = me.component.appName,
478
+ {appName} = me.component,
476
479
  dockedHorizontal = me.dockedWindowSide === 'left' || me.dockedWindowSide === 'right';
477
480
 
478
481
  me.dialogRect = data.dragElementRect;
@@ -583,35 +586,34 @@ class MainContainerController extends ComponentController {
583
586
  theme = 'neo-theme-light';
584
587
  }
585
588
 
589
+ me.previousTheme = me.currentTheme;
590
+ me.currentTheme = theme;
591
+
586
592
  me.connectedApps.forEach(appName => {
587
- me.switchThemeForApp(appName, theme)
593
+ me.switchThemeForApp(Neo.apps[appName].windowId)
588
594
  });
589
595
 
590
- button.set({
591
- iconCls: iconCls,
592
- text : buttonText
593
- });
596
+ button.set({iconCls, text: buttonText});
594
597
 
595
598
  if (dialog) {
596
599
  cls = dialog.cls;
597
600
 
598
- NeoArray.removeAdd(cls, me.currentTheme, theme);
601
+ NeoArray.removeAdd(cls, me.previousTheme, me.currentTheme);
599
602
 
600
603
  dialog.cls = cls
601
604
  }
602
-
603
- me.currentTheme = theme
604
605
  }
605
606
 
606
607
  /**
607
- * @param {String} appName
608
- * @param {String} theme
608
+ * @param {Number} windowId
609
609
  */
610
- switchThemeForApp(appName, theme) {
610
+ switchThemeForApp(windowId) {
611
+ let {currentTheme, previousTheme} = this;
612
+
611
613
  Neo.main.DomAccess.setBodyCls({
612
- appName: appName,
613
- add : [theme],
614
- remove : [this.currentTheme]
614
+ add : [currentTheme],
615
+ remove : previousTheme ? [previousTheme]: [],
616
+ windowId
615
617
  })
616
618
  }
617
619
 
@@ -4,10 +4,10 @@
4
4
  "Covid",
5
5
  "Docs",
6
6
  "Form",
7
- "Krausest",
8
7
  "Portal",
9
8
  "RealWorld",
10
9
  "RealWorld2",
10
+ "Route",
11
11
  "SharedCovid",
12
12
  "SharedDialog"
13
13
  ]
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='7.7.0'
23
+ * @member {String} version='7.9.0'
24
24
  */
25
- version: '7.7.0'
25
+ version: '7.9.0'
26
26
  }
27
27
 
28
28
  /**
@@ -0,0 +1,127 @@
1
+ import CheckBox from '../../../src/form/field/CheckBox.mjs';
2
+ import CountryField from '../../../src/form/field/Country.mjs';
3
+ import Dialog from '../../../src/dialog/Base.mjs';
4
+ import TextField from '../../../src/form/field/Text.mjs';
5
+
6
+ /**
7
+ * @class Neo.examples.table.nestedRecordFields.EditUserDialog
8
+ * @extends Neo.dialog.Base
9
+ */
10
+ class EditUserDialog extends Dialog {
11
+ static config = {
12
+ /**
13
+ * @member {String} className='Neo.examples.model.dialog.EditUserDialog'
14
+ * @protected
15
+ */
16
+ className: 'Neo.examples.model.dialog.EditUserDialog',
17
+ /**
18
+ * @member {String} closeAction='hide'
19
+ */
20
+ closeAction: 'hide',
21
+ /**
22
+ * @member {Object} containerConfig={style:{padding:'1em'}}
23
+ */
24
+ containerConfig: {
25
+ style: {
26
+ padding: '1em'
27
+ }
28
+ },
29
+ /**
30
+ * @member {Boolean} modal=true
31
+ */
32
+ modal: true,
33
+ /**
34
+ * @member {Record|null} record_=null
35
+ */
36
+ record_: null,
37
+ /**
38
+ * @member {String} title='Edit User'
39
+ */
40
+ title: 'Edit User',
41
+ /**
42
+ * @member {Object} itemDefaults
43
+ */
44
+ itemDefaults: {
45
+ flex : 'none',
46
+ labelWidth: 110
47
+ },
48
+ /**
49
+ * @member {Object[]} items
50
+ */
51
+ items: [{
52
+ module : TextField,
53
+ labelText: 'Firstname',
54
+ listeners: {change: 'up.onFirstnameFieldChange'},
55
+ reference: 'firstname-field'
56
+ }, {
57
+ module : TextField,
58
+ labelText: 'Lastname',
59
+ listeners: {change: 'up.onLastnameFieldChange'},
60
+ reference: 'lastname-field'
61
+ }, {
62
+ module : CountryField,
63
+ bind : {store: 'stores.countries'},
64
+ labelText : 'Country',
65
+ listeners : {change: 'up.onCountryFieldChange'},
66
+ reference : 'country-field',
67
+ valueField: 'code'
68
+ }, {
69
+ module : CheckBox,
70
+ labelText: 'Selected',
71
+ listeners: {change: 'up.onSelectedFieldChange'},
72
+ reference: 'selected-field',
73
+ style : {marginTop: '1em'}
74
+ }]
75
+ }
76
+
77
+ /**
78
+ * Triggered after the record config got changed
79
+ * @param {Record|null} value
80
+ * @param {Record|null} oldValue
81
+ * @protected
82
+ */
83
+ async afterSetRecord(value, oldValue) {
84
+ if (value) {
85
+ let me = this,
86
+ {record} = me;
87
+
88
+ // ensure the store has its data
89
+ await me.timeout(20);
90
+
91
+ me.getItem('country-field') .value = record.country;
92
+ me.getItem('firstname-field').value = record.user.firstname;
93
+ me.getItem('lastname-field') .value = record.user.lastname;
94
+ me.getItem('selected-field') .checked = record.annotations.selected
95
+ }
96
+ }
97
+
98
+ /**
99
+ * @param {Object} data
100
+ */
101
+ onCountryFieldChange(data) {
102
+ this.record.country = data.value.code
103
+ }
104
+
105
+ /**
106
+ * @param {Object} data
107
+ */
108
+ onFirstnameFieldChange(data) {
109
+ this.record.user.firstname = data.value
110
+ }
111
+
112
+ /**
113
+ * @param {Object} data
114
+ */
115
+ onLastnameFieldChange(data) {
116
+ this.record.user.lastname = data.value
117
+ }
118
+
119
+ /**
120
+ * @param {Object} data
121
+ */
122
+ onSelectedFieldChange(data) {
123
+ this.record.annotations.selected = data.value
124
+ }
125
+ }
126
+
127
+ export default Neo.setupClass(EditUserDialog);
@@ -0,0 +1,113 @@
1
+ import Button from '../../../src/button/Base.mjs';
2
+ import MainContainerModel from './MainContainerModel.mjs';
3
+ import TableContainer from '../../../src/table/Container.mjs';
4
+ import Viewport from '../../../src/container/Viewport.mjs';
5
+
6
+ /**
7
+ * @class Neo.examples.table.nestedRecordFields.MainContainer
8
+ * @extends Neo.container.Viewport
9
+ */
10
+ class MainContainer extends Viewport {
11
+ static config = {
12
+ /**
13
+ * @member {String} className='Neo.examples.table.nestedRecordFields.MainContainer'
14
+ * @protected
15
+ */
16
+ className: 'Neo.examples.table.nestedRecordFields.MainContainer',
17
+ /**
18
+ * @member {Object|String} layout='fit'
19
+ */
20
+ layout: 'fit',
21
+ /**
22
+ * @member {Neo.model.Component} model=MainContainerModel
23
+ */
24
+ model: MainContainerModel,
25
+ /**
26
+ * @member {Object} style={padding:'20px'}
27
+ */
28
+ style: {padding: '20px'},
29
+ /**
30
+ * @member {Object[]} items
31
+ */
32
+ items: [{
33
+ module: TableContainer,
34
+ bind : {store : 'stores.mainStore'},
35
+
36
+ columns: [
37
+ {dataField: 'user.firstname', text: 'Firstname'},
38
+ {dataField: 'user.lastname', text: 'Lastname'},
39
+ {dataField: 'githubId', text: 'Github Id'},
40
+ {dataField: 'country', text: 'Country', renderer: 'up.countryRenderer'},
41
+ {dataField: 'edit', text: 'Edit Action', renderer: 'up.editRenderer'}
42
+ ]
43
+ }]
44
+ }
45
+
46
+ /**
47
+ * @member {Neo.dialog.Base|null} dialog=null
48
+ */
49
+ dialog = null
50
+
51
+ /**
52
+ * @param {Object} data
53
+ */
54
+ countryRenderer({record}) {
55
+ let countryStore = this.getModel().getStore('countries');
56
+
57
+ if (countryStore.getCount() > 0) {
58
+ return countryStore.get(record.country).name
59
+ }
60
+
61
+ return ''
62
+ }
63
+
64
+ /**
65
+ * @param {Object} data
66
+ */
67
+ editButtonHandler(data) {
68
+ let me = this,
69
+ button = data.component,
70
+ {appName, dialog, windowId} = me,
71
+ {record} = button;
72
+
73
+ if (!dialog) {
74
+ import('./EditUserDialog.mjs').then(module => {
75
+ me.dialog = Neo.create({
76
+ module : module.default,
77
+ animateTargetId: button.id,
78
+ appName,
79
+ model : {parent: me.getModel()},
80
+ record,
81
+ windowId
82
+ })
83
+ })
84
+ } else {
85
+ dialog.animateTargetId = button.id;
86
+ dialog.record = record;
87
+
88
+ dialog.show()
89
+ }
90
+ }
91
+
92
+ /**
93
+ * @param {Object} data
94
+ */
95
+ editRenderer({column, index, record, tableContainer}) {
96
+ let me = this,
97
+ {appName, windowId} = me,
98
+ widgetId = `${column.id}-widget-${index}`,
99
+ button = (column.widgetMap || (column.widgetMap = {}))[widgetId] || (column.widgetMap[widgetId] = Neo.create({
100
+ module : Button,
101
+ appName,
102
+ handler : 'up.editButtonHandler',
103
+ parentId: tableContainer.id,
104
+ record,
105
+ text : 'Edit',
106
+ windowId
107
+ }));
108
+
109
+ return button.vdom
110
+ }
111
+ }
112
+
113
+ export default Neo.setupClass(MainContainer);
@@ -0,0 +1,61 @@
1
+ import MainStore from './MainStore.mjs';
2
+ import Model from '../../../src/model/Component.mjs';
3
+ import Store from '../../../src/data/Store.mjs';
4
+
5
+ const countrySymbol = Symbol.for('country');
6
+
7
+ /**
8
+ * @class Neo.examples.table.nestedRecordFields.MainContainerModel
9
+ * @extends Neo.model.Component
10
+ */
11
+ class MainContainerModel extends Model {
12
+ static config = {
13
+ /**
14
+ * @member {String} className='Neo.examples.table.nestedRecordFields.MainContainerModel'
15
+ * @protected
16
+ */
17
+ className: 'Neo.examples.table.nestedRecordFields.MainContainerModel',
18
+ /**
19
+ * @member {Object} stores
20
+ */
21
+ stores: {
22
+ countries: {
23
+ module : Store,
24
+ autoLoad : true,
25
+ keyProperty: 'code',
26
+ listeners : {load: 'onCountryStoreLoad'},
27
+ url : '../../../resources/examples/data/countries.json',
28
+
29
+ model: {
30
+ fields: [
31
+ {name: 'code'},
32
+ {name: 'name'}
33
+ ]},
34
+ },
35
+ mainStore: MainStore
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param {Record[]} items
41
+ */
42
+ onCountryStoreLoad(items) {
43
+ let me = this,
44
+ mainStore = me.getStore('mainStore'),
45
+ country;
46
+
47
+ // if the main table store is already loaded, the country field renderer had no data
48
+ if (mainStore.getCount() > 0) {
49
+ mainStore.items.forEach(record => {
50
+ country = record.country;
51
+
52
+ // hack resetting the current value to get a new record change
53
+ record[countrySymbol] = null;
54
+
55
+ record.country = country
56
+ })
57
+ }
58
+ }
59
+ }
60
+
61
+ export default Neo.setupClass(MainContainerModel);