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
@@ -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
|
-
*
|
28
|
+
* @member {String[]} connectedApps=[]
|
64
29
|
*/
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
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
|
225
|
-
dragStartWindowRect = me
|
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
|
316
|
-
|
303
|
+
let me = this,
|
304
|
+
{appName, windowId} = data;
|
317
305
|
|
318
|
-
NeoArray.add(me.connectedApps,
|
306
|
+
NeoArray.add(me.connectedApps, appName);
|
319
307
|
|
320
|
-
if (
|
321
|
-
me.switchThemeForApp(
|
308
|
+
if (appName !== 'SharedDialog' && me.currentTheme !== 'neo-theme-light') {
|
309
|
+
me.switchThemeForApp(windowId)
|
322
310
|
}
|
323
311
|
|
324
|
-
if (
|
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
|
338
|
-
|
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(
|
331
|
+
NeoArray.remove(connectedApps, 'SharedDialog');
|
343
332
|
|
344
333
|
Neo.Main.windowClose({
|
345
|
-
names:
|
334
|
+
names: connectedApps,
|
335
|
+
windowId
|
346
336
|
})
|
347
|
-
}
|
348
|
-
NeoArray.remove(
|
337
|
+
} if (name === me.dockedWindowAppName) {
|
338
|
+
NeoArray.remove(connectedApps, name);
|
349
339
|
|
350
|
-
Neo.main.addon.WindowPosition.unregisterWindow({
|
351
|
-
|
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
|
387
|
-
dialog
|
388
|
-
|
389
|
-
|
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
|
-
|
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
|
441
|
-
appName
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
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
|
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
|
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.
|
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 {
|
608
|
-
* @param {String} theme
|
608
|
+
* @param {Number} windowId
|
609
609
|
*/
|
610
|
-
switchThemeForApp(
|
610
|
+
switchThemeForApp(windowId) {
|
611
|
+
let {currentTheme, previousTheme} = this;
|
612
|
+
|
611
613
|
Neo.main.DomAccess.setBodyCls({
|
612
|
-
|
613
|
-
|
614
|
-
|
614
|
+
add : [currentTheme],
|
615
|
+
remove : previousTheme ? [previousTheme]: [],
|
616
|
+
windowId
|
615
617
|
})
|
616
618
|
}
|
617
619
|
|
@@ -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);
|