neo.mjs 6.10.3 → 6.10.5

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 (86) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/form/model/SideNav.mjs +3 -3
  3. package/apps/form/view/SideNavList.mjs +8 -3
  4. package/apps/form/view/ViewportController.mjs +6 -7
  5. package/apps/portal/Overwrites.mjs +21 -0
  6. package/apps/portal/app.mjs +7 -0
  7. package/apps/portal/data/blog.json +743 -0
  8. package/apps/portal/index.html +15 -0
  9. package/apps/portal/model/BlogPost.mjs +59 -0
  10. package/apps/{learnneo → portal}/model/Content.mjs +3 -3
  11. package/apps/{learnneo → portal}/neo-config.json +1 -1
  12. package/apps/portal/store/BlogPosts.mjs +43 -0
  13. package/apps/{learnneo → portal}/store/Content.mjs +2 -5
  14. package/apps/portal/view/HeaderToolbar.mjs +65 -0
  15. package/apps/portal/view/Viewport.mjs +59 -0
  16. package/apps/portal/view/ViewportController.mjs +79 -0
  17. package/apps/portal/view/blog/Container.mjs +50 -0
  18. package/apps/portal/view/blog/List.mjs +173 -0
  19. package/apps/{newwebsite/view/Viewport.mjs → portal/view/home/MainContainer.mjs} +7 -8
  20. package/apps/{learnneo/view/home → portal/view/learn}/ContentTreeList.mjs +6 -6
  21. package/apps/{learnneo/view/home → portal/view/learn}/ContentView.mjs +3 -3
  22. package/apps/{learnneo/view → portal/view/learn}/LivePreview.mjs +32 -19
  23. package/apps/{learnneo/view/home → portal/view/learn}/MainContainer.mjs +27 -31
  24. package/apps/{learnneo/view/home → portal/view/learn}/MainContainerController.mjs +3 -3
  25. package/apps/{learnneo/view/home → portal/view/learn}/MainContainerModel.mjs +3 -3
  26. package/apps/website/Overwrites.mjs +16 -0
  27. package/apps/website/app.mjs +2 -1
  28. package/apps/website/view/blog/List.mjs +1 -1
  29. package/buildScripts/webpack/development/webpack.config.appworker.mjs +3 -1
  30. package/buildScripts/webpack/json/myApps.template.json +1 -1
  31. package/buildScripts/webpack/production/webpack.config.appworker.mjs +3 -1
  32. package/examples/ServiceWorker.mjs +2 -2
  33. package/package.json +2 -2
  34. package/resources/data/deck/learnneo/p/stylesheet.md +4 -1
  35. package/resources/design-tokens/json/component.json +22 -0
  36. package/resources/design-tokens/json/core.json +4 -0
  37. package/resources/design-tokens/json/semantic.json +8 -0
  38. package/resources/examples/data/formSideNav.json +19 -19
  39. package/resources/scss/src/apps/portal/blog/Container.scss +18 -0
  40. package/resources/scss/src/apps/portal/blog/List.scss +183 -0
  41. package/resources/scss/src/apps/{newwebsite/Viewport.scss → portal/home/MainContainer.scss} +1 -1
  42. package/resources/scss/src/tab/Strip.scss +1 -0
  43. package/resources/scss/src/tooltip/Base.scss +10 -6
  44. package/resources/scss/theme-dark/tooltip/Base.scss +10 -0
  45. package/resources/scss/theme-light/tooltip/Base.scss +10 -0
  46. package/resources/scss/theme-neo-light/button/Base.scss +24 -20
  47. package/resources/scss/theme-neo-light/design-tokens/Component.scss +6 -0
  48. package/resources/scss/theme-neo-light/design-tokens/Core.scss +2 -0
  49. package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +4 -2
  50. package/resources/scss/theme-neo-light/tab/header/Button.scss +8 -7
  51. package/resources/scss/theme-neo-light/tooltip/Base.scss +13 -0
  52. package/src/DefaultConfig.mjs +2 -2
  53. package/src/Main.mjs +1 -1
  54. package/src/component/Base.mjs +5 -0
  55. package/src/component/Toast.mjs +5 -2
  56. package/src/container/Base.mjs +14 -0
  57. package/src/controller/Application.mjs +2 -1
  58. package/src/controller/Base.mjs +14 -3
  59. package/src/controller/Component.mjs +1 -1
  60. package/src/core/Base.mjs +7 -5
  61. package/src/core/Observable.mjs +15 -15
  62. package/src/data/RecordFactory.mjs +3 -3
  63. package/src/form/Container.mjs +50 -0
  64. package/src/form/field/Text.mjs +2 -2
  65. package/src/form/field/TextArea.mjs +5 -0
  66. package/src/main/addon/WindowPosition.mjs +72 -34
  67. package/src/tab/Strip.mjs +21 -36
  68. package/src/tab/header/Button.mjs +5 -7
  69. package/src/worker/App.mjs +26 -1
  70. package/src/worker/Base.mjs +41 -29
  71. package/src/worker/Canvas.mjs +4 -4
  72. package/src/worker/Manager.mjs +4 -3
  73. package/src/worker/mixin/RemoteMethodAccess.mjs +20 -18
  74. package/apps/learnneo/app.mjs +0 -6
  75. package/apps/learnneo/index.html +0 -21
  76. package/apps/learnneo/view/Viewport.mjs +0 -52
  77. package/apps/learnneo/view/ViewportController.mjs +0 -19
  78. package/apps/learnneo/view/home/HeaderToolbar.mjs +0 -47
  79. package/apps/newwebsite/app.mjs +0 -6
  80. package/apps/newwebsite/index.html +0 -13
  81. package/apps/newwebsite/neo-config.json +0 -7
  82. /package/resources/scss/src/apps/{learnneo/home → portal}/HeaderToolbar.scss +0 -0
  83. /package/resources/scss/src/apps/{learnneo → portal}/Viewport.scss +0 -0
  84. /package/resources/scss/src/apps/{learnneo/home → portal/learn}/ContentTreeList.scss +0 -0
  85. /package/resources/scss/src/apps/{learnneo/home → portal/learn}/ContentView.scss +0 -0
  86. /package/resources/scss/src/apps/{learnneo/home → portal/learn}/MainContainer.scss +0 -0
@@ -1,7 +1,6 @@
1
1
  import Base from '../../core/Base.mjs';
2
2
 
3
3
  /**
4
- *
5
4
  * @class Neo.main.addon.WindowPosition
6
5
  * @extends Neo.core.Base
7
6
  * @singleton
@@ -13,14 +12,22 @@ class WindowPosition extends Base {
13
12
  * @protected
14
13
  */
15
14
  className: 'Neo.main.addon.WindowPosition',
15
+ /**
16
+ * @member {Boolean} adjustWindowPositions=false
17
+ */
18
+ adjustWindowPositions: false,
16
19
  /**
17
20
  * @member {String|null} intervalId=null
18
21
  */
19
22
  intervalId: null,
20
23
  /**
21
- * @member {Number} intervalTime=100
24
+ * @member {Number} intervalTime=20
22
25
  */
23
26
  intervalTime: 20,
27
+ /**
28
+ * @member {Boolean} observeResize_=false
29
+ */
30
+ observeResize_: false,
24
31
  /**
25
32
  * Remote method access for other workers
26
33
  * @member {Object} remote
@@ -29,6 +36,7 @@ class WindowPosition extends Base {
29
36
  remote: {
30
37
  app: [
31
38
  'registerWindow',
39
+ 'setConfigs',
32
40
  'setDock',
33
41
  'unregisterWindow'
34
42
  ]
@@ -53,6 +61,12 @@ class WindowPosition extends Base {
53
61
  windows: {}
54
62
  }
55
63
 
64
+ /**
65
+ * @member {Function|null} resizeListener=null
66
+ * @protected
67
+ */
68
+ resizeListener = null
69
+
56
70
  /**
57
71
  * @param {Object} config
58
72
  */
@@ -65,8 +79,23 @@ class WindowPosition extends Base {
65
79
  me.screenLeft = win.screenLeft;
66
80
  me.screenTop = win.screenTop;
67
81
 
68
- win.addEventListener('mouseout', me.onMouseOut.bind(me));
69
- win.addEventListener('resize', me.onResize.bind(me));
82
+ win.addEventListener('mouseout', me.onMouseOut.bind(me))
83
+ }
84
+
85
+ /**
86
+ * Triggered after the observeResize config got changed
87
+ * @param {Boolean} value
88
+ * @param {Boolean} oldValue
89
+ * @protected
90
+ */
91
+ afterSetObserveResize(value, oldValue) {
92
+ let me = this;
93
+
94
+ if (!me.resizeListener) {
95
+ me.resizeListener = me.onResize.bind(me)
96
+ }
97
+
98
+ window[value ? 'addEventListener' : 'removeEventListener']('resize', me.resizeListener)
70
99
  }
71
100
 
72
101
  /**
@@ -82,8 +111,8 @@ class WindowPosition extends Base {
82
111
  windowName: key,
83
112
  x : position.left,
84
113
  y : position.top
85
- });
86
- });
114
+ })
115
+ })
87
116
  }
88
117
 
89
118
  /**
@@ -100,7 +129,7 @@ class WindowPosition extends Base {
100
129
  if (me.screenLeft !== screenLeft || me.screenTop !== screenTop) {
101
130
  winData = Neo.Main.getWindowData();
102
131
 
103
- me.adjustPositions();
132
+ me.adjustWindowPositions && me.adjustPositions();
104
133
 
105
134
  Manager.sendMessage('app', {
106
135
  action: 'windowPositionChange',
@@ -111,7 +140,7 @@ class WindowPosition extends Base {
111
140
  });
112
141
 
113
142
  me.screenLeft = screenLeft;
114
- me.screenTop = screenTop;
143
+ me.screenTop = screenTop
115
144
  }
116
145
  }
117
146
 
@@ -124,7 +153,7 @@ class WindowPosition extends Base {
124
153
  */
125
154
  dockDirectionChange(oldValue, newValue) {
126
155
  return (oldValue === 'bottom' || oldValue === 'top') && (newValue === 'left' || newValue === 'right')
127
- || (newValue === 'bottom' || newValue === 'top') && (oldValue === 'left' || oldValue === 'right');
156
+ || (newValue === 'bottom' || newValue === 'top') && (oldValue === 'left' || oldValue === 'right')
128
157
  }
129
158
 
130
159
  /**
@@ -134,29 +163,26 @@ class WindowPosition extends Base {
134
163
  let win = window,
135
164
  left, top;
136
165
 
137
- switch (data.dock) {
166
+ switch(data.dock) {
138
167
  case 'bottom':
139
168
  left = win.screenLeft;
140
169
  top = win.outerHeight + win.screenTop - 50;
141
- break;
170
+ break
142
171
  case 'left':
143
172
  left = win.screenLeft - data.size;
144
173
  top = win.screenTop + 28;
145
- break;
174
+ break
146
175
  case 'right':
147
176
  left = win.outerWidth + win.screenLeft;
148
177
  top = win.screenTop + 28;
149
- break;
178
+ break
150
179
  case 'top':
151
180
  left = win.screenLeft;
152
181
  top = win.screenTop - data.size + 78;
153
- break;
182
+ break
154
183
  }
155
184
 
156
- return {
157
- left: left,
158
- top : top
159
- };
185
+ return {left, top}
160
186
  }
161
187
 
162
188
  /**
@@ -167,18 +193,18 @@ class WindowPosition extends Base {
167
193
 
168
194
  if (!event.toElement) {
169
195
  if (!me.intervalId) {
170
- me.intervalId = setInterval(me.checkMovement.bind(me), me.intervalTime);
196
+ me.intervalId = setInterval(me.checkMovement.bind(me), me.intervalTime)
171
197
  }
172
198
  } else if (me.intervalId) {
173
199
  clearInterval(me.intervalId);
174
- me.intervalId = null;
200
+ me.intervalId = null
175
201
  }
176
202
  }
177
203
 
178
204
  /**
179
205
  * @param {Object} event
180
206
  */
181
- onResize(event) {
207
+ onResize(event) { console.log('onResize');
182
208
  let me = this,
183
209
  win = window,
184
210
  height, width;
@@ -188,21 +214,23 @@ class WindowPosition extends Base {
188
214
  case 'bottom':
189
215
  case 'top':
190
216
  width = win.outerWidth;
191
- break;
217
+ break
192
218
  case 'left':
193
219
  case 'right':
194
220
  height = win.outerHeight - 28;
195
- break;
221
+ break
196
222
  }
197
223
 
198
- Neo.Main.windowResizeTo({
199
- height : height,
200
- width : width,
201
- windowName: key
202
- });
203
- });
224
+ if (me.adjustWindowPositions) {
225
+ Neo.Main.windowResizeTo({
226
+ height,
227
+ width,
228
+ windowName: key
229
+ });
204
230
 
205
- me.adjustPositions();
231
+ me.adjustPositions()
232
+ }
233
+ })
206
234
  }
207
235
 
208
236
  /**
@@ -212,7 +240,17 @@ class WindowPosition extends Base {
212
240
  * @param {Number} data.size
213
241
  */
214
242
  registerWindow(data) {
215
- this.windows[data.name] = data;
243
+ this.windows[data.name] = data
244
+ }
245
+
246
+ /**
247
+ * Set configs from within the app worker
248
+ * @param {Object} data
249
+ * @param {String} data.appName
250
+ */
251
+ setConfigs(data) {
252
+ delete data.appName;
253
+ this.set(data)
216
254
  }
217
255
 
218
256
  /**
@@ -239,14 +277,14 @@ class WindowPosition extends Base {
239
277
  height : dock === 'bottom' || dock === 'top' ? win.size : window.outerHeight - 28,
240
278
  width : dock === 'left' || dock === 'right' ? win.size : window.outerWidth,
241
279
  windowName: name
242
- });
280
+ })
243
281
  }
244
282
 
245
283
  Neo.Main.windowMoveTo({
246
284
  windowName: name,
247
285
  x : position.left,
248
286
  y : position.top
249
- });
287
+ })
250
288
  }
251
289
  }
252
290
 
@@ -255,7 +293,7 @@ class WindowPosition extends Base {
255
293
  * @param {String} data.name
256
294
  */
257
295
  unregisterWindow(data) {
258
- delete this.windows[data.name];
296
+ delete this.windows[data.name]
259
297
  }
260
298
  }
261
299
 
package/src/tab/Strip.mjs CHANGED
@@ -44,44 +44,28 @@ class Strip extends Component {
44
44
  * @protected
45
45
  */
46
46
  afterSetUseActiveTabIndicator(value, oldValue) {
47
- if (oldValue !== undefined) {
48
- let me = this;
49
-
50
- me.vdom.cn[0].removeDom = !value;
51
-
52
- if (me.mounted && value) {
53
- me.getActiveTabRectThenMove();
54
- } else {
55
- me.update();
56
- }
57
- }
47
+ this.vdom.cn[0].removeDom = !value;
48
+ this.update()
58
49
  }
59
50
 
60
51
  /**
52
+ * Gets the DomRect of the active tab, then moves the indicator
61
53
  * @param {Object|null} opts
62
54
  * @param {Number} opts.oldValue
63
55
  * @param {Number} opts.value
64
- * Gets the DomRect of the active tab, then moves the indicator
65
56
  */
66
57
  getActiveTabRectThenMove(opts) {
67
58
  let me = this,
68
- ids = [],
59
+ ids = [me.id],
69
60
  tabContainer = me.getTabContainer();
70
61
 
71
- if (me.vnode) {
72
- if (opts) {
73
- ids.push(tabContainer.getTabAtIndex(opts.value), tabContainer.getTabAtIndex(opts.oldValue));
74
- } else {
75
- ids.push(tabContainer.getTabAtIndex(tabContainer.activeIndex));
76
- }
77
-
78
- ids = ids.map(e => e?.id).filter(Boolean);
62
+ // We do not need a movement, in case there is no oldValue
63
+ if (me.useActiveTabIndicator && me.vnode && Neo.isNumber(opts?.oldValue)) {
64
+ ids.push(tabContainer.getTabAtIndex(opts.value).id, tabContainer.getTabAtIndex(opts.oldValue).id);
79
65
 
80
- if (me.useActiveTabIndicator) {
81
- me.getDomRect(ids).then(data => {
82
- me.moveActiveIndicator(data);
83
- });
84
- }
66
+ me.getDomRect(ids).then(data => {
67
+ me.moveActiveIndicator(data)
68
+ })
85
69
  }
86
70
  }
87
71
 
@@ -89,7 +73,7 @@ class Strip extends Component {
89
73
  *
90
74
  */
91
75
  getTabContainer() {
92
- return Neo.getComponent(this.tabContainerId);
76
+ return Neo.getComponent(this.tabContainerId)
93
77
  }
94
78
 
95
79
  /**
@@ -105,8 +89,9 @@ class Strip extends Component {
105
89
  * @param {Number} rects[0].y
106
90
  */
107
91
  moveActiveIndicator(rects) {
108
- let me = this,
109
- rect = rects[1] || rects[0],
92
+ let me = this,
93
+ tabStripRect = rects.shift(),
94
+ rect = rects[1] || rects[0],
110
95
  activeTabIndicator, tabContainer;
111
96
 
112
97
  if (me.useActiveTabIndicator) {
@@ -118,20 +103,20 @@ class Strip extends Component {
118
103
  case 'top':
119
104
  activeTabIndicator.style = {
120
105
  height: null,
121
- left : `${rect.left}px`,
106
+ left : `${rect.left - tabStripRect.left}px`,
122
107
  top : null,
123
108
  width : `${rect.width}px`
124
109
  };
125
- break;
110
+ break
126
111
  case 'left':
127
112
  case 'right':
128
113
  activeTabIndicator.style = {
129
114
  height: `${rect.height}px`,
130
115
  left : null,
131
- top : `${rect.top}px`,
116
+ top : `${rect.top - tabStripRect.top}px`,
132
117
  width : null
133
118
  };
134
- break;
119
+ break
135
120
  }
136
121
 
137
122
  // in case there is a dynamic change (oldValue), call this method again
@@ -140,7 +125,7 @@ class Strip extends Component {
140
125
  me.update();
141
126
 
142
127
  setTimeout(() => {
143
- me.moveActiveIndicator([rects[0]]);
128
+ me.moveActiveIndicator([tabStripRect, rects[0]])
144
129
  }, 50)
145
130
  } else {
146
131
  activeTabIndicator.style.opacity = 1;
@@ -148,8 +133,8 @@ class Strip extends Component {
148
133
 
149
134
  setTimeout(() => {
150
135
  activeTabIndicator.style.opacity = 0;
151
- me.update();
152
- }, 300);
136
+ me.update()
137
+ }, 300)
153
138
  }
154
139
  }
155
140
  }
@@ -71,26 +71,24 @@ class Button extends BaseButton {
71
71
  * @protected
72
72
  */
73
73
  afterSetUseActiveTabIndicator(value, oldValue) {
74
- this.updateUseActiveTabIndicator();
74
+ this.updateUseActiveTabIndicator()
75
75
  }
76
76
 
77
77
  /**
78
78
  * @param {Object} data
79
79
  */
80
80
  showRipple(data) {
81
- !this.pressed && super.showRipple(data);
81
+ !this.pressed && super.showRipple(data)
82
82
  }
83
83
 
84
84
  /**
85
85
  * @param {Boolean} silent=false
86
86
  */
87
87
  updateUseActiveTabIndicator(silent=false) {
88
- let me = this,
89
- vdom = me.vdom;
90
-
91
- vdom.cn[4].removeDom = !me.useActiveTabIndicator;
88
+ let me = this;
92
89
 
93
- me[silent ? '_vdom' : 'vdom'] = vdom;
90
+ me.vdom.cn[4].removeDom = !me.useActiveTabIndicator;
91
+ !silent && me.update()
94
92
  }
95
93
  }
96
94
 
@@ -29,6 +29,7 @@ class App extends Base {
29
29
  main: [
30
30
  'createNeoInstance',
31
31
  'destroyNeoInstance',
32
+ 'fireEvent',
32
33
  'setConfigs'
33
34
  ]
34
35
  },
@@ -189,6 +190,30 @@ class App extends Base {
189
190
  return false
190
191
  }
191
192
 
193
+ /**
194
+ * Fires a custom event based on core.Observable on any app realm based Neo instance from main
195
+ * @param {Object} data
196
+ * @param {String} data.id
197
+ * @param {String} data.name
198
+ */
199
+ fireEvent(data) {
200
+ let instance = Neo.get(data.id),
201
+ name;
202
+
203
+ if (instance) {
204
+ name = data.name;
205
+
206
+ delete data.id;
207
+ delete data.name;
208
+
209
+ instance.fire(name, data);
210
+
211
+ return true
212
+ }
213
+
214
+ return false
215
+ }
216
+
192
217
  /**
193
218
  * Only needed for the SharedWorkers context
194
219
  * @param {String} eventName
@@ -196,7 +221,7 @@ class App extends Base {
196
221
  */
197
222
  fireMainViewsEvent(eventName, data) {
198
223
  this.ports.forEach(port => {
199
- Neo.apps[port.appName].mainViewInstance.fire(eventName, data)
224
+ Neo.apps[port.appName].mainView.fire(eventName, data)
200
225
  })
201
226
  }
202
227
 
@@ -112,10 +112,8 @@ class Base extends CoreBase {
112
112
  onConnect(data) {
113
113
  // short delay to ensure app VCs are in place
114
114
  setTimeout(() => {
115
- this.fire('connect', {
116
- appName: data.appName
117
- });
118
- }, 10);
115
+ this.fire('connect', {appName: data.appName})
116
+ }, 10)
119
117
  }
120
118
 
121
119
  /**
@@ -129,9 +127,10 @@ class Base extends CoreBase {
129
127
  me.isConnected = true;
130
128
 
131
129
  me.ports.push({
132
- appName: null,
130
+ appName : null,
133
131
  id,
134
- port : e.ports[0]
132
+ port : e.ports[0],
133
+ windowId: null
135
134
  });
136
135
 
137
136
  me.ports[me.ports.length - 1].port.onmessage = me.onMessage.bind(me);
@@ -141,7 +140,7 @@ class Base extends CoreBase {
141
140
 
142
141
  me.sendMessage('main', {action: 'workerConstructed', port: id});
143
142
 
144
- me.afterConnect();
143
+ me.afterConnect()
145
144
  }
146
145
 
147
146
  /**
@@ -154,7 +153,7 @@ class Base extends CoreBase {
154
153
 
155
154
  if (!me.isSharedWorker) {
156
155
  me.sendMessage('main', {action: 'workerConstructed'});
157
- me.afterConnect();
156
+ me.afterConnect()
158
157
  }
159
158
  }
160
159
 
@@ -163,9 +162,7 @@ class Base extends CoreBase {
163
162
  * @param {Object} data
164
163
  */
165
164
  onDisconnect(data) {
166
- this.fire('disconnect', {
167
- appName: data.appName
168
- });
165
+ this.fire('disconnect', {appName: data.appName})
169
166
  }
170
167
 
171
168
  /**
@@ -186,12 +183,12 @@ class Base extends CoreBase {
186
183
  me['on' + Neo.capitalize(action)](data);
187
184
  } else if (promise = action === 'reply' && me.promises[replyId]) {
188
185
  if (data.reject) {
189
- promise.reject(data.data);
186
+ promise.reject(data.data)
190
187
  } else {
191
- promise.resolve(data.data);
188
+ promise.resolve(data.data)
192
189
  }
193
190
 
194
- delete me.promises[replyId];
191
+ delete me.promises[replyId]
195
192
  }
196
193
  }
197
194
 
@@ -199,9 +196,7 @@ class Base extends CoreBase {
199
196
  * @param {Object} msg
200
197
  */
201
198
  onPing(msg) {
202
- this.resolve(msg, {
203
- originMsg: msg
204
- });
199
+ this.resolve(msg, {originMsg: msg})
205
200
  }
206
201
 
207
202
  /**
@@ -217,8 +212,8 @@ class Base extends CoreBase {
217
212
  for (port of me.ports) {
218
213
  if (!port.appName) {
219
214
  port.appName = appName;
220
- me.onConnect({ appName });
221
- break;
215
+ me.onConnect({appName});
216
+ break
222
217
  }
223
218
  }
224
219
  }
@@ -228,7 +223,19 @@ class Base extends CoreBase {
228
223
  */
229
224
  onRegisterNeoConfig(msg) {
230
225
  Neo.config = Neo.config || {};
231
- Object.assign(Neo.config, msg.data);
226
+
227
+ let me = this,
228
+ {windowId} = msg.data,
229
+ port;
230
+
231
+ for (port of me.ports) {
232
+ if (!port.windowId) {
233
+ port.windowId = windowId;
234
+ break
235
+ }
236
+ }
237
+
238
+ Object.assign(Neo.config, msg.data)
232
239
  }
233
240
 
234
241
  /**
@@ -246,12 +253,12 @@ class Base extends CoreBase {
246
253
  let message = me.sendMessage(dest, opts, transfer),
247
254
  msgId = message.id;
248
255
 
249
- me.promises[msgId] = { reject, resolve };
250
- });
256
+ me.promises[msgId] = { reject, resolve }
257
+ })
251
258
  }
252
259
 
253
260
  /**
254
- * @param {String} dest app, data, main or vdom (excluding the current worker)
261
+ * @param {String} dest app, canvas, data, main or vdom (excluding the current worker)
255
262
  * @param {Object} opts configs for Neo.worker.Message
256
263
  * @param {Array} [transfer] An optional array of Transferable objects to transfer ownership of.
257
264
  * If the ownership of an object is transferred, it becomes unusable (neutered) in the context it was sent from
@@ -268,24 +275,29 @@ class Base extends CoreBase {
268
275
  if (me.channelPorts[dest]) {
269
276
  port = me.channelPorts[dest];
270
277
  } else if (!me.isSharedWorker) {
271
- port = globalThis;
278
+ port = globalThis
272
279
  } else {
273
280
  if (opts.port) {
274
- port = me.getPort({id: opts.port}).port;
275
- } else if (opts.appName) {
281
+ port = me.getPort({id: opts.port}).port
282
+ } else if (opts.windowId) {
283
+ portObject = me.getPort({windowId: opts.windowId});
284
+ port = portObject.port;
285
+
286
+ opts.port = portObject.id
287
+ } else if (opts.appName) {
276
288
  portObject = me.getPort({appName: opts.appName});
277
289
  port = portObject.port;
278
290
 
279
- opts.port = portObject.id;
291
+ opts.port = portObject.id
280
292
  } else {
281
- port = me.ports[0].port;
293
+ port = me.ports[0].port
282
294
  }
283
295
  }
284
296
 
285
297
  message = new Message(opts);
286
298
 
287
299
  port.postMessage(message, transfer);
288
- return message;
300
+ return message
289
301
  }
290
302
  }
291
303
 
@@ -45,7 +45,7 @@ class Canvas extends Base {
45
45
 
46
46
  me.sendMessage('app', {action: 'registerPort', transfer: port2}, [port2]);
47
47
 
48
- me.channelPorts.app = port1;
48
+ me.channelPorts.app = port1
49
49
  }
50
50
 
51
51
  /**
@@ -58,7 +58,7 @@ class Canvas extends Base {
58
58
  action : 'reply',
59
59
  replyId: data.id,
60
60
  success: true
61
- });
61
+ })
62
62
  }
63
63
 
64
64
  /**
@@ -75,8 +75,8 @@ class Canvas extends Base {
75
75
  /* webpackMode: "lazy" */
76
76
  `../../${path}/canvas.mjs`
77
77
  ).then(module => {
78
- module.onStart();
79
- });
78
+ module.onStart()
79
+ })
80
80
  }
81
81
  }
82
82
 
@@ -6,7 +6,8 @@ import Observable from '../core/Observable.mjs';
6
6
  import RemoteMethodAccess from './mixin/RemoteMethodAccess.mjs';
7
7
 
8
8
  const NeoConfig = Neo.config,
9
- devMode = NeoConfig.environment === 'development';
9
+ devMode = NeoConfig.environment === 'development',
10
+ windowId = new Date().getTime();
10
11
 
11
12
  /**
12
13
  * The worker manager lives inside the main thread and creates the App, Data & VDom worker.
@@ -207,8 +208,8 @@ class Manager extends Base {
207
208
 
208
209
  me.sendMessage(key, {
209
210
  action: 'registerNeoConfig',
210
- data : config
211
- });
211
+ data : {...config, windowId}
212
+ })
212
213
  }
213
214
  }
214
215