neo.mjs 7.0.6 → 7.2.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 (103) hide show
  1. package/README.md +2 -2
  2. package/apps/ServiceWorker.mjs +2 -2
  3. package/apps/portal/index.html +1 -1
  4. package/apps/portal/model/Content.mjs +3 -2
  5. package/apps/portal/model/Example.mjs +46 -0
  6. package/apps/portal/resources/data/examples_devmode.json +173 -0
  7. package/apps/portal/resources/data/examples_dist_dev.json +164 -0
  8. package/apps/portal/resources/data/examples_dist_prod.json +164 -0
  9. package/apps/portal/store/Examples.mjs +33 -0
  10. package/apps/portal/view/HeaderToolbar.mjs +3 -0
  11. package/apps/portal/view/Viewport.mjs +3 -2
  12. package/apps/portal/view/ViewportController.mjs +32 -14
  13. package/apps/portal/view/about/Container.mjs +2 -2
  14. package/apps/portal/view/blog/List.mjs +3 -3
  15. package/apps/portal/view/examples/List.mjs +122 -0
  16. package/apps/portal/view/examples/TabContainer.mjs +79 -0
  17. package/apps/portal/view/examples/TabContainerController.mjs +41 -0
  18. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  19. package/apps/portal/view/home/parts/Features.mjs +5 -5
  20. package/apps/shareddialog/view/MainContainerController.mjs +37 -30
  21. package/examples/ServiceWorker.mjs +2 -2
  22. package/examples/todoList/version2/MainContainer.mjs +38 -48
  23. package/examples/todoList/version2/TodoList.mjs +6 -39
  24. package/examples/todoList/version2/TodoListModel.mjs +2 -2
  25. package/package.json +7 -7
  26. package/resources/data/deck/learnneo/pages/Welcome.md +0 -4
  27. package/resources/data/deck/learnneo/pages/guides/Forms.md +1 -0
  28. package/resources/data/deck/learnneo/pages/guides/InstanceLifecycle.md +1 -0
  29. package/resources/data/deck/learnneo/pages/guides/Layouts.md +1 -0
  30. package/resources/data/deck/learnneo/pages/guides/Mixins.md +1 -0
  31. package/resources/data/deck/learnneo/pages/guides/MultiWindow.md +1 -0
  32. package/resources/data/deck/learnneo/pages/guides/Tables.md +1 -0
  33. package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +263 -0
  34. package/resources/data/deck/learnneo/pages/{TodoList.md → tutorials/TodoList.md} +23 -33
  35. package/resources/data/deck/learnneo/tree.json +45 -48
  36. package/resources/scss/src/apps/portal/about/MemberContainer.scss +5 -4
  37. package/resources/scss/src/apps/portal/blog/Container.scss +2 -0
  38. package/resources/scss/src/apps/portal/examples/List.scss +157 -0
  39. package/resources/scss/src/apps/portal/examples/TabContainer.scss +36 -0
  40. package/resources/scss/src/button/Base.scss +4 -0
  41. package/resources/scss/src/calendar/view/calendars/ColorsList.scss +4 -0
  42. package/resources/scss/src/calendar/view/calendars/List.scss +2 -1
  43. package/resources/scss/src/dialog/Base.scss +2 -2
  44. package/resources/scss/src/list/Base.scss +3 -3
  45. package/resources/scss/theme-neo-light/button/Base.scss +3 -3
  46. package/src/DefaultConfig.mjs +2 -2
  47. package/src/calendar/view/MainContainer.mjs +7 -5
  48. package/src/calendar/view/calendars/EditContainer.mjs +3 -2
  49. package/src/calendar/view/calendars/List.mjs +1 -0
  50. package/src/calendar/view/week/Component.mjs +5 -3
  51. package/src/calendar/view/week/plugin/DragDrop.mjs +4 -3
  52. package/src/code/LivePreview.mjs +28 -1
  53. package/src/collection/Base.mjs +1 -0
  54. package/src/controller/Component.mjs +10 -10
  55. package/src/core/Observable.mjs +4 -27
  56. package/src/grid/View.mjs +82 -0
  57. package/src/layout/Cube.mjs +44 -38
  58. package/src/list/Base.mjs +16 -0
  59. package/src/main/addon/DragDrop.mjs +3 -2
  60. package/src/manager/DomEvent.mjs +30 -18
  61. package/src/table/View.mjs +82 -0
  62. package/src/util/Function.mjs +24 -0
  63. package/resources/data/deck/learnneo/pages/2023-10-08T20-37-30-658Z.md +0 -0
  64. package/resources/data/deck/learnneo/pages/2023-10-08T22-22-11-013Z.md +0 -0
  65. package/resources/data/deck/learnneo/pages/Earthquakes-01-goals.md +0 -32
  66. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-01-generate-a-workspace.md +0 -47
  67. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-02-generate-the-starter-app.md +0 -150
  68. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-03-debugging.md +0 -136
  69. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-04-fetch-data.md +0 -146
  70. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-05-refactor-the-table.md +0 -146
  71. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-06-use-a-view-model.md +0 -301
  72. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-07-use-the-google-maps-addon.md +0 -175
  73. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-08-events.md +0 -38
  74. package/resources/data/deck/learnneo/pages/TestLivePreview.md +0 -32
  75. package/resources/data/deck/learnneo/pages/WhatAboutHTML.md +0 -1
  76. package/resources/data/deck/learnneo/pages/stylesheet.md +0 -57
  77. /package/resources/data/deck/learnneo/pages/{WhyNeo-Effort.md → benefits/Effort.md} +0 -0
  78. /package/resources/data/deck/learnneo/pages/{WhyNeo-Features.md → benefits/Features.md} +0 -0
  79. /package/resources/data/deck/learnneo/pages/{WhyNeo-Intro.md → benefits/Introduction.md} +0 -0
  80. /package/resources/data/deck/learnneo/pages/{WhyNeo-Multi-Window.md → benefits/Multi-Window.md} +0 -0
  81. /package/resources/data/deck/learnneo/pages/{WhyNeo-Quick.md → benefits/Quick.md} +0 -0
  82. /package/resources/data/deck/learnneo/pages/{WhyNeo-Speed.md → benefits/Speed.md} +0 -0
  83. /package/resources/data/deck/learnneo/pages/{ComponentModels.md → gettingstarted/ComponentModels.md} +0 -0
  84. /package/resources/data/deck/learnneo/pages/{Config.md → gettingstarted/Config.md} +0 -0
  85. /package/resources/data/deck/learnneo/pages/{DescribingTheUI.md → gettingstarted/DescribingTheUI.md} +0 -0
  86. /package/resources/data/deck/learnneo/pages/{Events.md → gettingstarted/Events.md} +0 -0
  87. /package/resources/data/deck/learnneo/pages/{Extending.md → gettingstarted/Extending.md} +0 -0
  88. /package/resources/data/deck/learnneo/pages/{References.md → gettingstarted/References.md} +0 -0
  89. /package/resources/data/deck/learnneo/pages/{Setup.md → gettingstarted/Setup.md} +0 -0
  90. /package/resources/data/deck/learnneo/pages/{2023-10-14T19-25-08-153Z.md → gettingstarted/Workspaces.md} +0 -0
  91. /package/resources/data/deck/learnneo/pages/{ComponentsAndContainers.md → guides/ComponentsAndContainers.md} +0 -0
  92. /package/resources/data/deck/learnneo/pages/{CustomComponents.md → guides/CustomComponents.md} +0 -0
  93. /package/resources/data/deck/learnneo/pages/{MainThreadAddonExample.md → guides/MainThreadAddonExample.md} +0 -0
  94. /package/resources/data/deck/learnneo/pages/{MainThreadAddonIntro.md → guides/MainThreadAddonIntro.md} +0 -0
  95. /package/resources/data/deck/learnneo/pages/{GuideViewModels.md → guides/ViewModels.md} +0 -0
  96. /package/resources/data/deck/learnneo/pages/{GuideEvents.md → guides/events/CustomEvents.md} +0 -0
  97. /package/resources/data/deck/learnneo/pages/{2023-10-08T20-20-37-336Z.md → javascript/ClassFeatures.md} +0 -0
  98. /package/resources/data/deck/learnneo/pages/{2023-10-07T19-18-28-517Z.md → javascript/Classes.md} +0 -0
  99. /package/resources/data/deck/learnneo/pages/{2023-10-31T13-59-37-550Z.md → javascript/NewNode.md} +0 -0
  100. /package/resources/data/deck/learnneo/pages/{2023-10-08T20-20-07-934Z.md → javascript/Overrides.md} +0 -0
  101. /package/resources/data/deck/learnneo/pages/{2023-10-08T21-58-25-809Z.md → javascript/Super.md} +0 -0
  102. /package/resources/data/deck/learnneo/pages/{Earthquakes.md → tutorials/Earthquakes.md} +0 -0
  103. /package/resources/data/deck/learnneo/pages/{RSP.md → tutorials/RSP.md} +0 -0
@@ -49,9 +49,10 @@ class Viewport extends BaseViewport {
49
49
  {module: () => import('./home/MainContainer.mjs')},
50
50
  {module: () => import('./learn/MainContainer.mjs')},
51
51
  {module: () => import('./blog/Container.mjs')},
52
- {module: () => import('../../../docs/app/view/MainContainer.mjs')},
53
52
  {module: () => import('./services/Component.mjs')},
54
- {module: () => import('./about/Container.mjs')}
53
+ {module: () => import('./examples/TabContainer.mjs')},
54
+ {module: () => import('./about/Container.mjs')},
55
+ {module: () => import('../../../docs/app/view/MainContainer.mjs')}
55
56
  ]
56
57
  }],
57
58
  /**
@@ -43,13 +43,15 @@ class ViewportController extends Controller {
43
43
  * @member {Object} routes
44
44
  */
45
45
  routes: {
46
- '/about-us' : 'onAboutUsRoute',
47
- '/blog' : 'onBlogRoute',
48
- '/docs' : 'onDocsRoute',
49
- '/home' : 'onHomeRoute',
50
- '/learn' : 'onLearnRoute',
51
- '/learn/{itemId}': 'onLearnRoute',
52
- '/services' : 'onServicesRoute',
46
+ '/about-us' : 'onAboutUsRoute',
47
+ '/blog' : 'onBlogRoute',
48
+ '/docs' : 'onDocsRoute',
49
+ '/examples' : 'onExamplesRoute',
50
+ '/examples/{itemId}': 'onExamplesRoute',
51
+ '/home' : 'onHomeRoute',
52
+ '/learn' : 'onLearnRoute',
53
+ '/learn/{itemId}' : 'onLearnRoute',
54
+ '/services' : 'onServicesRoute'
53
55
  },
54
56
  /**
55
57
  * Values are: large, medium, small, xSmall
@@ -230,7 +232,16 @@ class ViewportController extends Controller {
230
232
  * @param {Object} oldValue
231
233
  */
232
234
  onDocsRoute(params, value, oldValue) {
233
- this.setMainContentIndex(3)
235
+ this.setMainContentIndex(6)
236
+ }
237
+
238
+ /**
239
+ * @param {Object} params
240
+ * @param {Object} value
241
+ * @param {Object} oldValue
242
+ */
243
+ onExamplesRoute(params, value, oldValue) {
244
+ this.setMainContentIndex(4)
234
245
  }
235
246
 
236
247
  /**
@@ -257,7 +268,7 @@ class ViewportController extends Controller {
257
268
  * @param {Object} oldValue
258
269
  */
259
270
  onServicesRoute(params, value, oldValue) {
260
- this.setMainContentIndex(4)
271
+ this.setMainContentIndex(3)
261
272
  }
262
273
 
263
274
  /**
@@ -272,12 +283,19 @@ class ViewportController extends Controller {
272
283
 
273
284
  if (index !== activeIndex) {
274
285
  me.activeIndex = index;
275
- me.#transitionId++;
276
-
277
- transitionId = me.#transitionId;
278
286
 
279
- // skip the initial layout-switch, since we do not need a transition
280
- if (mainContentLayout === 'mixed' && Neo.isNumber(activeIndex)) {
287
+ if (
288
+ mainContentLayout === 'mixed' &&
289
+ // skip the initial layout-switch, since we do not need a transition
290
+ Neo.isNumber(activeIndex) &&
291
+ // also skip the layout switch in case the index >= 6, since a cube only has 6 faces
292
+ index < 6 &&
293
+ // also skip the layout switch in case we navigate back from a non-cube item
294
+ activeIndex < 6
295
+ ) {
296
+ me.#transitionId++;
297
+
298
+ transitionId = me.#transitionId;
281
299
  updateLayout = false;
282
300
 
283
301
  // enable "fast clicking" on main nav items => do not replace a cube layout with a new instance of cube
@@ -58,9 +58,9 @@ class Container extends Base {
58
58
  teamRole : 'Training'
59
59
  }],
60
60
  /**
61
- * @member {Object} layout={ntype:'vbox',align:'start'}
61
+ * @member {Object} layout={ntype:'vbox',align:'center'}
62
62
  */
63
- layout: {ntype: 'vbox', align: 'start'}
63
+ layout: {ntype: 'vbox', align: 'center'}
64
64
  }
65
65
  }
66
66
 
@@ -28,9 +28,9 @@ class List extends BaseList {
28
28
  /**
29
29
  * Specify the amount of delayed observe() calls, in case the IntersectionObserver does not find targets.
30
30
  * This can happen when moving the component inside the DOM (e.g. cube layout)
31
- * @member {Number} intersectionObserverReconnects=5
31
+ * @member {Number} intersectionObserverReconnects=10
32
32
  */
33
- intersectionObserverReconnects: 5,
33
+ intersectionObserverReconnects: 10,
34
34
  /**
35
35
  * Specify how many blog item images to preload when intersecting
36
36
  * @member {Number} preloadImages=5
@@ -249,7 +249,7 @@ class List extends BaseList {
249
249
  len = me.intersectionObserverReconnects,
250
250
  data;
251
251
 
252
- await me.timeout(50);
252
+ await me.timeout(150);
253
253
 
254
254
  data = await Neo.main.addon.IntersectionObserver.register({
255
255
  ...opts,
@@ -0,0 +1,122 @@
1
+ import BaseList from '../../../../src/list/Base.mjs';
2
+ import Examples from '../../store/Examples.mjs';
3
+
4
+ /**
5
+ * @class Portal.view.examples.List
6
+ * @extends Neo.list.Base
7
+ */
8
+ class List extends BaseList {
9
+ /**
10
+ * A regex to enforce a maxLength (word break)
11
+ * @member {RegExp} nameRegEx
12
+ * @protected
13
+ * @static
14
+ */
15
+ static nameRegEx = /^(.{65}[^\s]*).*/
16
+
17
+ static config = {
18
+ /**
19
+ * @member {String} className='Portal.view.examples.List'
20
+ * @protected
21
+ */
22
+ className: 'Portal.view.examples.List',
23
+ /**
24
+ * @member {String[]} baseCls=['portal-examples-list','neo-list']
25
+ */
26
+ baseCls: ['portal-examples-list', 'neo-list'],
27
+ /**
28
+ * @member {Neo.data.Store} store=Examples
29
+ */
30
+ store: Examples,
31
+ /**
32
+ * @member {String|null} storeUrl_=null
33
+ */
34
+ storeUrl_: null,
35
+ /**
36
+ * @member {Boolean} useWrapperNode=true
37
+ */
38
+ useWrapperNode: true,
39
+ /**
40
+ * @member {Object} _vdom
41
+ */
42
+ _vdom:
43
+ {cn: [
44
+ {tag: 'ul', cn: []}
45
+ ]}
46
+ }
47
+
48
+ /**
49
+ * Triggered before the store config gets changed.
50
+ * @param {Object|Neo.data.Store} value
51
+ * @param {Object|Neo.data.Store} oldValue
52
+ * @returns {Neo.data.Store}
53
+ * @protected
54
+ */
55
+ beforeSetStore(value, oldValue) {
56
+ if (value) {
57
+ if (value.isClass) {
58
+ value = {
59
+ module: value,
60
+ url : this.storeUrl
61
+ };
62
+ } else if (Neo.isObject(value)) {
63
+ value.url = this.storeUrl;
64
+ }
65
+ }
66
+
67
+ return super.beforeSetStore(value, oldValue);
68
+ }
69
+
70
+ /**
71
+ * @param {Object} record
72
+ */
73
+ createItemContent(record) {
74
+ let basePath;
75
+
76
+ if (Neo.config.isGitHubPages) {
77
+ basePath = '../../../../resources_pub/website/examples';
78
+
79
+ if (Neo.config.environment !== 'development') {
80
+ basePath = '../../' + basePath
81
+ }
82
+ } else {
83
+ basePath = 'https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/website/examples'
84
+ }
85
+
86
+ return [
87
+ {cls: ['content', 'neo-relative'], cn: [
88
+ {cls: ['neo-full-size', 'preview-image'], style: {
89
+ backgroundImage: `url('${basePath}/${record.image}'), linear-gradient(#777, #333)`}
90
+ },
91
+ {cls: ['neo-absolute', 'neo-item-bottom-position'], cn: [
92
+ {tag: 'a', cls: ['neo-title'], href: record.url, target: '_blank', cn: [
93
+ {html: record.name.replace(List.nameRegEx, "$1")}
94
+ ]},
95
+ {cls: ['neo-top-20'], cn: [
96
+ {tag: 'a', cls: ['fab fa-github', 'neo-github-image'], href: record.sourceUrl, target: '_blank'},
97
+ {cls: ['neo-inner-content'], cn: [
98
+ {cls: ['neo-inner-details'], html: record.browsers.join(', ')},
99
+ {cls: ['neo-inner-details'], html: record.environments.join(', ')}
100
+ ]}
101
+ ]}
102
+ ]}
103
+ ]}
104
+ ]
105
+ }
106
+
107
+ /**
108
+ * @returns {Object}
109
+ */
110
+ getVdomRoot() {
111
+ return this.vdom.cn[0]
112
+ }
113
+
114
+ /**
115
+ * @returns {Object}
116
+ */
117
+ getVnodeRoot() {
118
+ return this.vnode.childNodes[0]
119
+ }
120
+ }
121
+
122
+ export default Neo.setupClass(List);
@@ -0,0 +1,79 @@
1
+ import Container from '../../../../src/tab/Container.mjs';
2
+ import List from './List.mjs';
3
+ import TabContainerController from './TabContainerController.mjs';
4
+
5
+ /**
6
+ * @class Portal.view.examples.TabContainer
7
+ * @extends Neo.tab.Container
8
+ */
9
+ class TabContainer extends Container {
10
+ static config = {
11
+ /**
12
+ * @member {String} className='Portal.view.examples.TabContainer'
13
+ * @protected
14
+ */
15
+ className: 'Portal.view.examples.TabContainer',
16
+ /**
17
+ * @member {Number|null} activeIndex=null
18
+ */
19
+ activeIndex: null,
20
+ /**
21
+ * @member {String[]} baseCls=['portal-examples-tab-container','neo-tab-container']
22
+ */
23
+ baseCls: ['portal-examples-tab-container', 'neo-tab-container'],
24
+ /**
25
+ * @member {Neo.controller.Component} controller=TabContainerController
26
+ */
27
+ controller: TabContainerController,
28
+ /**
29
+ * @member {Object} headerToolbarDefaults
30
+ */
31
+ headerToolbarDefaults: {
32
+ cls: ['portal-examples-tab-header-toolbar']
33
+ },
34
+ /**
35
+ * @member {Object} itemDefaults
36
+ */
37
+ itemDefaults: {
38
+ module: List
39
+ },
40
+ /**
41
+ * @member {Object[]} items
42
+ */
43
+ items: [{
44
+ reference : 'examples-devmode-list',
45
+ storeUrl : '../../apps/portal/resources/data/examples_devmode.json',
46
+ tabButtonConfig: {
47
+ iconCls: 'fa fa-chess-knight',
48
+ route : '/examples/devmode',
49
+ text : 'DevMode'
50
+ }
51
+ }, {
52
+ reference : 'examples-dist-dev-list',
53
+ storeUrl : '../../apps/portal/resources/data/examples_dist_dev.json',
54
+ tabButtonConfig: {
55
+ iconCls: 'fa fa-chess-queen',
56
+ route : '/examples/dist_dev',
57
+ text : 'dist/dev'
58
+ }
59
+ }, {
60
+ reference : 'examples-dist-prod-list',
61
+ storeUrl : '../../apps/portal/resources/data/examples_dist_prod.json',
62
+ tabButtonConfig: {
63
+ iconCls: 'fa fa-chess-king',
64
+ route : '/examples/dist_prod',
65
+ text : 'dist/prod'
66
+ }
67
+ }],
68
+ /**
69
+ * @member {Boolean} sortable=true
70
+ */
71
+ sortable: true,
72
+ /**
73
+ * @member {String} tabBarPosition='left'
74
+ */
75
+ tabBarPosition: 'left',
76
+ }
77
+ }
78
+
79
+ export default Neo.setupClass(TabContainer);
@@ -0,0 +1,41 @@
1
+ import Component from '../../../../src/controller/Component.mjs';
2
+
3
+ /**
4
+ * @class Portal.view.examples.TabContainerController
5
+ * @extends Neo.controller.Component
6
+ */
7
+ class TabContainerController extends Component {
8
+ static config = {
9
+ /**
10
+ * @member {String} className='Portal.view.examples.TabContainerController'
11
+ * @protected
12
+ */
13
+ className: 'Portal.view.examples.TabContainerController',
14
+ /**
15
+ * @member {Object} routes
16
+ */
17
+ routes: {
18
+ '/examples' : 'onExamplesRoute',
19
+ '/examples/{itemId}': 'onExamplesRoute'
20
+ }
21
+ }
22
+
23
+ /**
24
+ * @param {Object} params
25
+ * @param {Object} value
26
+ * @param {Object} oldValue
27
+ */
28
+ onExamplesRoute(params, value, oldValue) {
29
+ let me = this,
30
+ itemId = params?.itemId || 'dist_prod',
31
+ store = me.getReference(`examples-${itemId.replace('_', '-')}-list`).store;
32
+
33
+ if (store?.getCount() < 1) {
34
+ store.load()
35
+ }
36
+
37
+ me.component.activeIndex = itemId === 'dist_prod' ? 2 : itemId === 'dist_dev' ? 1 : 0
38
+ }
39
+ }
40
+
41
+ export default Neo.setupClass(TabContainerController);
@@ -111,7 +111,7 @@ class FooterContainer extends Container {
111
111
  }, {
112
112
  module: Component,
113
113
  cls : ['neo-version'],
114
- html : 'v7.0.6'
114
+ html : 'v7.2.0'
115
115
  }]
116
116
  }],
117
117
  /**
@@ -42,7 +42,7 @@ class Features extends BaseContainer {
42
42
  ]
43
43
  }, {
44
44
  header: 'Multi-Window Apps',
45
- route : '#/learn/WhyNeo-Multi-Window',
45
+ route : '#/learn/benefits.Multi-Window',
46
46
 
47
47
  content: [
48
48
  'No need for a Native Shell (e.g. Electron)',
@@ -52,7 +52,7 @@ class Features extends BaseContainer {
52
52
  ]
53
53
  }, {
54
54
  header: 'Modern JS in your Browser',
55
- route : '#/learn/WhyNeo-Quick',
55
+ route : '#/learn/benefits.Quick',
56
56
 
57
57
  content: [
58
58
  'The Dev-Mode runs without the need for Transpilations or Compilations',
@@ -62,7 +62,7 @@ class Features extends BaseContainer {
62
62
  ]
63
63
  }, {
64
64
  header: 'Powerful Component-Library',
65
- route : '#/learn/WhyNeo-Quick',
65
+ route : '#/learn/benefits.Quick',
66
66
 
67
67
  content: [
68
68
  'Declarative Component-Trees',
@@ -72,7 +72,7 @@ class Features extends BaseContainer {
72
72
  ]
73
73
  }, {
74
74
  header: 'Elegant State Management',
75
- route : '#/learn/WhyNeo-Speed',
75
+ route : '#/learn/benefits.Speed',
76
76
 
77
77
  content: [
78
78
  'Multiple communicating State-Providers',
@@ -81,7 +81,7 @@ class Features extends BaseContainer {
81
81
  ]
82
82
  }, {
83
83
  header: 'Core Features',
84
- route : '#/learn/WhyNeo-Speed',
84
+ route : '#/learn/benefits.Speed',
85
85
 
86
86
  content: [
87
87
  'RPC Layer (cross-realm, including Backends)',
@@ -28,6 +28,10 @@ class MainContainerController extends ComponentController {
28
28
  * @member {String} dockedWindowAppName='SharedDialog2'
29
29
  */
30
30
  dockedWindowAppName: 'SharedDialog2',
31
+ /**
32
+ * @member {Number|null} dockedWindowId=null
33
+ */
34
+ dockedWindowId: null,
31
35
  /**
32
36
  * @member {Neo.component.Base|null} dockedWindowProxy=null
33
37
  */
@@ -40,7 +44,7 @@ class MainContainerController extends ComponentController {
40
44
  /**
41
45
  * @member {Number} dockedWindowSize=500
42
46
  */
43
- dockedWindowSize: 500,
47
+ dockedWindowSize: 620,
44
48
  /**
45
49
  * @member {Object} dialogRect=null
46
50
  */
@@ -67,7 +71,7 @@ class MainContainerController extends ComponentController {
67
71
  connect : me.onAppConnect,
68
72
  disconnect: me.onAppDisconnect,
69
73
  scope : me
70
- });
74
+ })
71
75
  }
72
76
 
73
77
  /**
@@ -81,7 +85,7 @@ class MainContainerController extends ComponentController {
81
85
  Neo.main.addon.WindowPosition.setDock({
82
86
  name: this.dockedWindowAppName,
83
87
  dock: value
84
- });
88
+ })
85
89
  }
86
90
  }
87
91
 
@@ -90,15 +94,17 @@ class MainContainerController extends ComponentController {
90
94
  * @param {String} appName
91
95
  */
92
96
  createDialog(data, appName) {
93
- let me = this;
97
+ let me = this,
98
+ {windowId} = me;
94
99
 
95
100
  me.enableOpenDialogButtons(false);
96
101
 
97
102
  me.dialog = Neo.create(DemoDialog, {
98
103
  animateTargetId : data.component.id,
99
- appName : appName,
104
+ appName,
100
105
  boundaryContainerId: null,
101
106
  cls : [me.currentTheme, 'neo-dialog', 'neo-panel', 'neo-container'],
107
+ windowId,
102
108
 
103
109
  dragZoneConfig: {
104
110
  alwaysFireDragMove: true
@@ -109,7 +115,7 @@ class MainContainerController extends ComponentController {
109
115
  dragZoneCreated: me.onDragZoneCreated,
110
116
  scope : me
111
117
  }
112
- });
118
+ })
113
119
  }
114
120
 
115
121
  /**
@@ -164,7 +170,7 @@ class MainContainerController extends ComponentController {
164
170
  me.mountDialogInOtherWindow({
165
171
  fullyIncludeIntoWindow: true,
166
172
  proxyRect : proxyRect
167
- });
173
+ })
168
174
  }
169
175
  }
170
176
 
@@ -173,15 +179,15 @@ class MainContainerController extends ComponentController {
173
179
  */
174
180
  enableOpenDialogButtons(enable) {
175
181
  this.getOpenDialogButtons().forEach(button => {
176
- button.disabled = !enable;
177
- });
182
+ button.disabled = !enable
183
+ })
178
184
  }
179
185
 
180
186
  /**
181
187
  * @return {Neo.button.Base}
182
188
  */
183
189
  getOpenDockedWindowButton() {
184
- return this.component.down({iconCls: 'far fa-window-restore'});
190
+ return this.component.down({iconCls: 'far fa-window-restore'})
185
191
  }
186
192
 
187
193
  /**
@@ -190,7 +196,7 @@ class MainContainerController extends ComponentController {
190
196
  getOpenDialogButtons() {
191
197
  return ComponentManager.find({
192
198
  flag: 'open-dialog-button'
193
- });
199
+ })
194
200
  }
195
201
 
196
202
  /**
@@ -203,7 +209,7 @@ class MainContainerController extends ComponentController {
203
209
  left : 'right',
204
210
  right : 'left',
205
211
  top : 'bottom'
206
- }[side];
212
+ }[side]
207
213
  }
208
214
 
209
215
  /**
@@ -237,17 +243,14 @@ class MainContainerController extends ComponentController {
237
243
  break;
238
244
  }
239
245
 
240
- return {
241
- left: left,
242
- top : top
243
- };
246
+ return {left, top}
244
247
  }
245
248
 
246
249
  /**
247
250
  * @return {Boolean}
248
251
  */
249
252
  hasDockedWindow() {
250
- return this.connectedApps.includes(this.dockedWindowAppName);
253
+ return this.connectedApps.includes(this.dockedWindowAppName)
251
254
  }
252
255
 
253
256
  /**
@@ -277,6 +280,8 @@ class MainContainerController extends ComponentController {
277
280
  me.timeout(70).then(() => {
278
281
  dialog.appName = dialog.appName === dragEndWindowAppName ? appName : dragEndWindowAppName;
279
282
 
283
+ // todo: windowI
284
+
280
285
  me.getOpenDialogButtons().forEach(button => {
281
286
  if (button.appName === dialog.appName) {
282
287
  dialog.animateTargetId = button.id
@@ -299,6 +304,7 @@ class MainContainerController extends ComponentController {
299
304
  /**
300
305
  * @param {Object} data
301
306
  * @param {String} data.appName
307
+ * @param {Number} data.windowId
302
308
  */
303
309
  onAppConnect(data) {
304
310
  let me = this,
@@ -311,6 +317,7 @@ class MainContainerController extends ComponentController {
311
317
  }
312
318
 
313
319
  if (name === me.dockedWindowAppName) {
320
+ me.dockedWindowId = data.windowId;
314
321
  me.getOpenDockedWindowButton().disabled = true
315
322
  }
316
323
 
@@ -385,9 +392,8 @@ class MainContainerController extends ComponentController {
385
392
 
386
393
  if (Rectangle.leavesSide(dragStartWindowRect, proxyRect, side)) {
387
394
  if (Rectangle.excludes(dragStartWindowRect, proxyRect)) {
388
- me.mountDialogInOtherWindow({
389
- proxyRect: proxyRect
390
- })
395
+ console.log('mountDialogInOtherWindow');
396
+ me.mountDialogInOtherWindow({proxyRect})
391
397
  } else {
392
398
  me.dropDialogBetweenWindows(proxyRect)
393
399
  }
@@ -400,18 +406,17 @@ class MainContainerController extends ComponentController {
400
406
  */
401
407
  onDragMove(data) {
402
408
  if (this.hasDockedWindow()) {
403
- let me = this,
404
- dialogRect = me.dialogRect,
405
- dockedWindowAppName = me.dockedWindowAppName,
406
- dragStartWindowRect = me.dragStartWindowRect,
407
- proxyRect = Rectangle.moveTo(dialogRect, data.clientX - data.offsetX, data.clientY - data.offsetY),
408
- side = me.dockedWindowSide,
409
+ let me = this,
410
+ {dialogRect, dragStartWindowRect, dockedWindowAppName, dockedWindowId} = me,
411
+ proxyRect = Rectangle.moveTo(dialogRect, data.clientX - data.offsetX, data.clientY - data.offsetY),
412
+ side = me.dockedWindowSide,
409
413
  proxyPosition, vdom;
410
414
 
411
415
  // in case we trigger the drag:start inside the docked window,
412
416
  // we can keep the same logic with just flipping the side.
413
417
  if (me.dialog.appName === dockedWindowAppName) {
414
418
  dockedWindowAppName = me.component.appName;
419
+ dockedWindowId = me.component.windowId;
415
420
  side = me.getOppositeSide(me.dockedWindowSide);
416
421
  }
417
422
 
@@ -434,14 +439,16 @@ class MainContainerController extends ComponentController {
434
439
  appName : dockedWindowAppName,
435
440
  autoMount : true,
436
441
  autoRender: true,
437
- cls : ['neo-dialog-wrapper'],
442
+ cls : ['neo-dialog', 'neo-dragproxy'],
438
443
  parentId : 'document.body',
439
- vdom : vdom
444
+ vdom : vdom,
445
+ windowId : dockedWindowId
440
446
  });
441
-
447
+ console.log(me.windowId, dockedWindowId);
442
448
  // The other window has most likely not loaded The dialog JS module yet,
443
449
  // but the drag proxy is using some CSS rules of it.
444
- Neo.currentWorker.insertThemeFiles(dockedWindowAppName, Neo.dialog.Base.prototype)
450
+ Neo.currentWorker.insertThemeFiles(dockedWindowId, Neo.dialog.Base.prototype);
451
+ Neo.currentWorker.insertThemeFiles(dockedWindowId, Neo.draggable.DragProxyComponent.prototype)
445
452
  } else {
446
453
  me.updateDockedWindowProxyStyle({
447
454
  ...proxyPosition,
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='7.0.6'
23
+ * @member {String} version='7.2.0'
24
24
  */
25
- version: '7.0.6'
25
+ version: '7.2.0'
26
26
  }
27
27
 
28
28
  /**