neo.mjs 8.43.1 → 9.0.1

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 (48) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/colors/view/ViewportController.mjs +2 -6
  3. package/apps/portal/index.html +1 -1
  4. package/apps/portal/view/ViewportController.mjs +5 -6
  5. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  6. package/apps/portal/view/learn/ContentComponent.mjs +5 -5
  7. package/apps/portal/view/learn/MainContainerController.mjs +0 -23
  8. package/apps/sharedcovid/view/MainContainerController.mjs +4 -13
  9. package/examples/ServiceWorker.mjs +2 -2
  10. package/examples/button/base/MainContainer.mjs +9 -1
  11. package/examples/component/multiWindowCoronaGallery/ViewportController.mjs +4 -11
  12. package/examples/component/multiWindowHelix/ViewportController.mjs +1 -7
  13. package/package.json +5 -5
  14. package/src/DefaultConfig.mjs +2 -2
  15. package/src/button/Base.mjs +28 -7
  16. package/src/component/Base.mjs +43 -86
  17. package/src/component/wrapper/AmChart.mjs +4 -3
  18. package/src/container/Base.mjs +15 -3
  19. package/src/controller/Component.mjs +4 -106
  20. package/src/core/Base.mjs +15 -2
  21. package/src/core/Observable.mjs +9 -11
  22. package/src/data/Model.mjs +9 -0
  23. package/src/data/RecordFactory.mjs +1 -1
  24. package/src/form/field/Text.mjs +3 -1
  25. package/src/grid/Container.mjs +2 -4
  26. package/src/grid/View.mjs +37 -45
  27. package/src/grid/column/AnimatedChange.mjs +1 -1
  28. package/src/grid/column/Component.mjs +14 -5
  29. package/src/grid/header/Button.mjs +6 -17
  30. package/src/layout/Base.mjs +3 -2
  31. package/src/layout/Cube.mjs +41 -37
  32. package/src/main/DomEvents.mjs +26 -1
  33. package/src/manager/DomEvent.mjs +21 -22
  34. package/src/selection/Model.mjs +14 -11
  35. package/src/selection/grid/BaseModel.mjs +155 -2
  36. package/src/selection/grid/CellColumnModel.mjs +7 -11
  37. package/src/selection/grid/CellColumnRowModel.mjs +7 -11
  38. package/src/selection/grid/CellModel.mjs +5 -4
  39. package/src/selection/grid/CellRowModel.mjs +22 -30
  40. package/src/selection/grid/ColumnModel.mjs +7 -11
  41. package/src/selection/grid/RowModel.mjs +21 -35
  42. package/src/state/Provider.mjs +3 -8
  43. package/src/tab/Container.mjs +17 -1
  44. package/src/table/Container.mjs +38 -91
  45. package/src/table/View.mjs +51 -3
  46. package/src/table/header/Button.mjs +7 -18
  47. package/src/util/Function.mjs +3 -1
  48. package/src/util/VDom.mjs +4 -4
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.43.1'
23
+ * @member {String} version='9.0.1'
24
24
  */
25
- version: '8.43.1'
25
+ version: '9.0.1'
26
26
  }
27
27
 
28
28
  /**
@@ -89,14 +89,12 @@ class ViewportController extends Controller {
89
89
  {windowId} = data,
90
90
  url = await Neo.Main.getByPath({path: 'document.URL', windowId}),
91
91
  widgetName = new URL(url).searchParams.get('name'),
92
- widget = me.getReference(widgetName),
93
- widgetParent = widget.up();
92
+ widget = me.getReference(widgetName);
94
93
 
95
94
  me.connectedApps.push(widgetName);
96
95
 
97
96
  me.getReference(`detach-${widgetName}-button`).disabled = true;
98
97
 
99
- widgetParent.remove(widget, false);
100
98
  mainView.add(widget)
101
99
  }
102
100
  }
@@ -111,12 +109,10 @@ class ViewportController extends Controller {
111
109
  {appName, windowId} = data,
112
110
  url = await Neo.Main.getByPath({path: 'document.URL', windowId}),
113
111
  widgetName = new URL(url).searchParams.get('name'),
114
- widget = me.getReference(widgetName),
115
- widgetParent = widget.up();
112
+ widget = me.getReference(widgetName);
116
113
 
117
114
  // Closing a non-main app needs to move the widget back into its original position & re-enable the show button
118
115
  if (appName === 'ColorsWidget') {
119
- widgetParent.remove(widget, false);
120
116
  me.component.insert(me.widgetIndexMap[widgetName], widget);
121
117
 
122
118
  me.getReference(`detach-${widgetName}-button`).disabled = false
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-04-15",
19
+ "datePublished": "2025-05-05",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -98,9 +98,9 @@ class ViewportController extends Controller {
98
98
  Neo.main.addon.LocalStorage.readLocalStorageItem({
99
99
  key: 'mainContentLayout',
100
100
  windowId
101
- }).then(data => {
102
- if (data.value !== 'card') {
103
- me.mainContentLayout = data.value
101
+ }).then(({value}) => {
102
+ if (value && value !== 'card') {
103
+ me.mainContentLayout = value
104
104
  }
105
105
  })
106
106
  }
@@ -316,11 +316,10 @@ class ViewportController extends Controller {
316
316
 
317
317
  // enable "fast clicking" on main nav items => do not replace a cube layout with a new instance of cube
318
318
  if (container.layout.ntype !== 'layout-cube') {
319
- container.layout = {ntype: 'cube', activeIndex, fitContainer: true, hideInactiveCardsOnDestroy: true}
319
+ container.layout = {ntype: 'cube', activeIndex, fitContainer: true, hideInactiveCardsOnDestroy: true};
320
+ await me.timeout(200);
320
321
  }
321
322
 
322
- await me.timeout(200);
323
-
324
323
  container.layout.activeIndex = index;
325
324
 
326
325
  await me.timeout(1100);
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.43.1'
110
+ html : 'v9.0.1'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -321,15 +321,15 @@ class ContentComponent extends Component {
321
321
  /**
322
322
  * @param {Object} data
323
323
  */
324
- onClick(data) {
325
- let me = this,
326
- record = me.record;
324
+ onClick({altKey, metaKey, shiftKey}) {
325
+ let me = this,
326
+ {record} = me;
327
327
 
328
- if (data.altKey && data.shiftKey && !data.metaKey) {
328
+ if (altKey && !metaKey && shiftKey) {
329
329
  me.fire('edit', {component: me, record})
330
330
  }
331
331
  // Command/windows shift click = refresh
332
- else if (!data.altKey && data.shiftKey && data.metaKey) {
332
+ else if (!altKey && metaKey && shiftKey) {
333
333
  me.fire('refresh', {component: me, record})
334
334
  }
335
335
  }
@@ -50,29 +50,6 @@ class MainContainerController extends Controller {
50
50
  })
51
51
  }
52
52
 
53
- /**
54
- *
55
- */
56
- onConstructed() {
57
- super.onConstructed();
58
-
59
- let me = this;
60
-
61
- Neo.Main.getByPath({path: 'location.search'})
62
- .then(data => {
63
- me.setState({
64
- deck: getSearchParams(data).deck || 'learnneo'
65
- })
66
- });
67
-
68
- // todo: target file does not exist inside the repo
69
- /*fetch('../../../../resources/data/deck/EditorConfig.json')
70
- .then(response => response.json()
71
- .then(data =>
72
- me.setState('editorConfig', data)
73
- ))*/
74
- }
75
-
76
53
  /**
77
54
  * @param {Object} data
78
55
  * @returns {Promise<void>}
@@ -263,15 +263,13 @@ class MainContainerController extends ComponentController {
263
263
  onAppConnect(data) {
264
264
  let me = this,
265
265
  name = data.appName,
266
- parentView, style, toolbar, view;
267
-
268
- console.log('onAppConnect', name);
266
+ style, toolbar, view;
269
267
 
270
268
  switch(name) {
271
269
  case 'SharedCovidChart':
272
- view = me.getReference('controls-panel');
273
- parentView = view.parent;
274
- parentView.storeReferences();
270
+ view = me.getReference('controls-panel');
271
+
272
+ view.parent.storeReferences();
275
273
 
276
274
  toolbar = me.getReference('controls-panel-header');
277
275
  style = toolbar.style || {};
@@ -301,9 +299,6 @@ class MainContainerController extends ComponentController {
301
299
  if (view) {
302
300
  NeoArray.add(me.connectedApps, name);
303
301
 
304
- parentView = parentView ? parentView : view.isTab ? view.up('tab-container') : Neo.getComponent(view.parentId);
305
- parentView.remove(view, false);
306
-
307
302
  Neo.apps[name].on('render', () => {
308
303
  me.timeout(100).then(() => {
309
304
  me.getMainView(name).add(view)
@@ -323,8 +318,6 @@ class MainContainerController extends ComponentController {
323
318
  view = parentView.items[0],
324
319
  index, style, toolbar;
325
320
 
326
- console.log('onAppDisconnect', name);
327
-
328
321
  switch (name) {
329
322
  case 'SharedCovid':
330
323
  Neo.Main.windowClose({
@@ -342,8 +335,6 @@ class MainContainerController extends ComponentController {
342
335
  if (view) {
343
336
  NeoArray.remove(me.connectedApps, name);
344
337
 
345
- parentView.remove(view, false);
346
-
347
338
  switch (name) {
348
339
  case 'SharedCovidChart':
349
340
  toolbar = me.getReference('controls-panel-header');
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.43.1'
23
+ * @member {String} version='9.0.1'
24
24
  */
25
- version: '8.43.1'
25
+ version: '9.0.1'
26
26
  }
27
27
 
28
28
  /**
@@ -147,7 +147,7 @@ class MainContainer extends ConfigurationViewport {
147
147
  module : ComboBox,
148
148
  forceSelection: true,
149
149
  labelText : 'ui',
150
- listeners : {change: me.onConfigChange.bind(me, 'ui')},
150
+ listeners : {change: me.onConfigRecordChange.bind(me, 'ui')},
151
151
  style : {marginTop: '10px'},
152
152
  value : me.exampleComponent.ui,
153
153
 
@@ -241,6 +241,14 @@ class MainContainer extends ConfigurationViewport {
241
241
  }]*/
242
242
  })
243
243
  }
244
+
245
+ /**
246
+ * @param {String} config
247
+ * @param {Object} opts
248
+ */
249
+ onConfigRecordChange(config, opts) {
250
+ this.exampleComponent[config] = opts.value['id']
251
+ }
244
252
  }
245
253
 
246
254
  export default Neo.setupClass(MainContainer);
@@ -73,16 +73,13 @@ class ViewportController extends Controller {
73
73
  {appName} = data;
74
74
 
75
75
  if (appName === 'GalleryControls') {
76
- let controlsPanel = me.getReference('controls-panel'),
77
- {mainView} = Neo.apps[appName];
76
+ let {mainView} = Neo.apps[appName];
78
77
 
79
78
  me.connectedApps.push(appName);
80
79
 
81
- controlsPanel.parent.remove(controlsPanel, false);
82
-
83
80
  this.getReference('header-toolbar').hidden = true;
84
81
 
85
- mainView.add(controlsPanel)
82
+ mainView.add(me.getReference('controls-panel'))
86
83
  }
87
84
  }
88
85
 
@@ -96,16 +93,12 @@ class ViewportController extends Controller {
96
93
  {appName, windowId} = data;
97
94
 
98
95
  if (appName === 'GalleryControls') {
99
- let controlsPanel = me.getReference('controls-panel');
100
-
101
- controlsPanel.parent.remove(controlsPanel, false);
102
-
103
96
  me.getReference('header-toolbar').hidden = false;
104
97
 
105
- me.component.add(controlsPanel)
98
+ me.component.add(me.getReference('controls-panel'))
106
99
  }
107
100
  // Close popup windows when closing or reloading the main window
108
- else if (appName === 'Neo.examples.component.multiWindowCoronaGallery') {console.log('close', me.connectedApps);
101
+ else if (appName === 'Neo.examples.component.multiWindowCoronaGallery') {
109
102
  Neo.Main.windowClose({names: me.connectedApps, windowId})
110
103
  }
111
104
  }
@@ -78,8 +78,6 @@ class ViewportController extends Controller {
78
78
 
79
79
  me.connectedApps.push(appName);
80
80
 
81
- controlsPanel.parent.remove(controlsPanel, false);
82
-
83
81
  this.getReference('header-toolbar').hidden = true;
84
82
 
85
83
  mainView.add(controlsPanel)
@@ -96,13 +94,9 @@ class ViewportController extends Controller {
96
94
  {appName, windowId} = data;
97
95
 
98
96
  if (appName === 'HelixControls') {
99
- let controlsPanel = me.getReference('controls-panel');
100
-
101
- controlsPanel.parent.remove(controlsPanel, false);
102
-
103
97
  me.getReference('header-toolbar').hidden = false;
104
98
 
105
- me.component.add(controlsPanel)
99
+ me.component.add(me.getReference('controls-panel'))
106
100
  }
107
101
  // Close popup windows when closing or reloading the main window
108
102
  else if (appName === 'Neo.examples.component.multiWindowHelix') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.43.1",
3
+ "version": "9.0.1",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -56,16 +56,16 @@
56
56
  "envinfo": "^7.14.0",
57
57
  "fs-extra": "^11.3.0",
58
58
  "highlightjs-line-numbers.js": "^2.9.0",
59
- "inquirer": "^12.5.2",
60
- "marked": "^15.0.8",
59
+ "inquirer": "^12.6.0",
60
+ "marked": "^15.0.11",
61
61
  "monaco-editor": "0.50.0",
62
62
  "neo-jsdoc": "1.0.1",
63
63
  "neo-jsdoc-x": "1.0.5",
64
64
  "postcss": "^8.5.3",
65
- "sass": "^1.86.3",
65
+ "sass": "^1.87.0",
66
66
  "siesta-lite": "5.5.2",
67
67
  "url": "^0.11.4",
68
- "webpack": "^5.99.5",
68
+ "webpack": "^5.99.7",
69
69
  "webpack-cli": "^6.0.1",
70
70
  "webpack-dev-server": "^5.2.1",
71
71
  "webpack-hook-plugin": "^1.0.7",
@@ -263,12 +263,12 @@ const DefaultConfig = {
263
263
  useVdomWorker: true,
264
264
  /**
265
265
  * buildScripts/injectPackageVersion.mjs will update this value
266
- * @default '8.43.1'
266
+ * @default '9.0.1'
267
267
  * @memberOf! module:Neo
268
268
  * @name config.version
269
269
  * @type String
270
270
  */
271
- version: '8.43.1'
271
+ version: '9.0.1'
272
272
  };
273
273
 
274
274
  Object.assign(DefaultConfig, {
@@ -162,6 +162,12 @@ class Button extends Component {
162
162
  get rippleWrapper() {
163
163
  return this.getVdomRoot().cn[3]
164
164
  }
165
+ /**
166
+ * @member {Object} textNode
167
+ */
168
+ get textNode() {
169
+ return this.getVdomRoot().cn[1]
170
+ }
165
171
 
166
172
  /**
167
173
  * @param {Object} config
@@ -177,6 +183,20 @@ class Button extends Component {
177
183
  })
178
184
  }
179
185
 
186
+ /**
187
+ * Workaround fix for: https://github.com/neomjs/neo/issues/6659
188
+ * Todo: inspect this further (we do not want to add fixed ids for all child nodes)
189
+ * Triggered after the id config got changed
190
+ * @param {String} value
191
+ * @param {String} oldValue
192
+ * @protected
193
+ */
194
+ afterSetId(value, oldValue) {
195
+ super.afterSetId(value, oldValue);
196
+
197
+ this.textNode.id = value + '__text'
198
+ }
199
+
180
200
  /**
181
201
  * Triggered after the badgePosition config got changed
182
202
  * @param {String} value
@@ -350,10 +370,10 @@ class Button extends Component {
350
370
  * @protected
351
371
  */
352
372
  afterSetText(value, oldValue) {
353
- let me = this,
354
- isEmpty = !value || value === '',
355
- vdomRoot = me.getVdomRoot(),
356
- textNode = vdomRoot.cn[1];
373
+ let me = this,
374
+ isEmpty = !value || value === '',
375
+ vdomRoot = me.getVdomRoot(),
376
+ {textNode} = me;
357
377
 
358
378
  NeoArray.toggle(me._cls, 'no-text', isEmpty);
359
379
  NeoArray.toggle(vdomRoot.cls, 'no-text', isEmpty);
@@ -495,7 +515,8 @@ class Button extends Component {
495
515
  onClick(data) {
496
516
  let me = this;
497
517
 
498
- me.callback(me.handler, me.handlerScope || me, [data]);
518
+ me.bindCallback(me.handler, 'handler', me.handlerScope || me);
519
+ me.handler?.(data);
499
520
 
500
521
  me.menu && me.toggleMenu();
501
522
  me.route && me.changeRoute(); // only relevant for editRoute=true
@@ -517,9 +538,9 @@ class Button extends Component {
517
538
 
518
539
  rippleEl.style = Object.assign(rippleEl.style || {}, {
519
540
  animation: 'none',
520
- left : `${data.clientX - buttonRect.left - radius}px`,
521
541
  height : `${diameter}px`,
522
- top : `${data.clientY - buttonRect.top - radius}px`,
542
+ left : `${data.clientX - buttonRect.left - radius}px`,
543
+ top : `${data.clientY - buttonRect.top - radius}px`,
523
544
  width : `${diameter}px`
524
545
  });
525
546
 
@@ -616,8 +616,6 @@ class Component extends Base {
616
616
  let me = this;
617
617
 
618
618
  if (value?.[0] || oldValue?.[0]) {
619
- me.getController()?.parseDomListeners(me);
620
-
621
619
  DomEventManager.updateDomListeners(me, value, oldValue)
622
620
  }
623
621
  }
@@ -955,7 +953,7 @@ class Component extends Base {
955
953
  */
956
954
  afterSetStyle(value, oldValue) {
957
955
  if (!(!value && oldValue === undefined)) {
958
- this.updateStyle(value, oldValue)
956
+ this.updateStyle()
959
957
  }
960
958
  }
961
959
 
@@ -1029,7 +1027,9 @@ class Component extends Base {
1029
1027
  let me = this,
1030
1028
  cls = me.cls;
1031
1029
 
1032
- NeoArray.remove(cls, `neo-${me.ntype}-${oldValue}`);
1030
+ if (oldValue) {
1031
+ NeoArray.remove(cls, `neo-${me.ntype}-${oldValue}`)
1032
+ }
1033
1033
 
1034
1034
  if (value && value !== '') {
1035
1035
  NeoArray.add(cls, `neo-${me.ntype}-${value}`)
@@ -1135,15 +1135,7 @@ class Component extends Base {
1135
1135
  */
1136
1136
  afterSetWrapperStyle(value, oldValue) {
1137
1137
  if (!(!value && oldValue === undefined)) {
1138
- let me = this,
1139
- vdom = me.vdom;
1140
-
1141
- if (!vdom.id) {
1142
- vdom.style = value;
1143
- me.update()
1144
- } else {
1145
- me.updateStyle(value, oldValue, vdom.id)
1146
- }
1138
+ this.updateStyle()
1147
1139
  }
1148
1140
  }
1149
1141
 
@@ -1263,7 +1255,7 @@ class Component extends Base {
1263
1255
  oldValue?.destroy();
1264
1256
 
1265
1257
  if (value) {
1266
- return ClassSystemUtil.beforeSetInstance(value, null, {
1258
+ return ClassSystemUtil.beforeSetInstance(value, 'Neo.controller.Component', {
1267
1259
  component: this,
1268
1260
  windowId : this.windowId
1269
1261
  })
@@ -1319,31 +1311,6 @@ class Component extends Base {
1319
1311
  return value
1320
1312
  }
1321
1313
 
1322
- /**
1323
- * Triggered before the stateProvider config gets changed.
1324
- * Creates a state.Provider instance if needed.
1325
- * @param {Object} value
1326
- * @param {Object} oldValue
1327
- * @returns {Neo.state.Provider}
1328
- * @protected
1329
- */
1330
- beforeSetStateProvider(value, oldValue) {
1331
- oldValue?.destroy();
1332
-
1333
- if (value) {
1334
- let me = this,
1335
- defaultValues = {component: me};
1336
-
1337
- if (me.modelData) {
1338
- defaultValues.data = me.modelData
1339
- }
1340
-
1341
- return ClassSystemUtil.beforeSetInstance(value, 'Neo.state.Provider', defaultValues)
1342
- }
1343
-
1344
- return null
1345
- }
1346
-
1347
1314
  /**
1348
1315
  * Triggered before the plugins config gets changed.
1349
1316
  * @param {Object[]} value
@@ -1378,6 +1345,31 @@ class Component extends Base {
1378
1345
  return (Neo.isNumber(oldValue) && oldValue > 0) ? (oldValue - 1) : 0
1379
1346
  }
1380
1347
 
1348
+ /**
1349
+ * Triggered before the stateProvider config gets changed.
1350
+ * Creates a state.Provider instance if needed.
1351
+ * @param {Object} value
1352
+ * @param {Object} oldValue
1353
+ * @returns {Neo.state.Provider}
1354
+ * @protected
1355
+ */
1356
+ beforeSetStateProvider(value, oldValue) {
1357
+ oldValue?.destroy();
1358
+
1359
+ if (value) {
1360
+ let me = this,
1361
+ defaultValues = {component: me};
1362
+
1363
+ if (me.modelData) {
1364
+ defaultValues.data = me.modelData
1365
+ }
1366
+
1367
+ return ClassSystemUtil.beforeSetInstance(value, 'Neo.state.Provider', defaultValues)
1368
+ }
1369
+
1370
+ return null
1371
+ }
1372
+
1381
1373
  /**
1382
1374
  * Triggered before the updateDepth config gets changed.
1383
1375
  * @param {Number} value
@@ -1943,7 +1935,6 @@ class Component extends Base {
1943
1935
 
1944
1936
  let me = this;
1945
1937
 
1946
- me.getController() ?.parseConfig(me);
1947
1938
  me.getStateProvider()?.parseConfig(me)
1948
1939
  }
1949
1940
 
@@ -2603,55 +2594,21 @@ class Component extends Base {
2603
2594
  }
2604
2595
 
2605
2596
  /**
2606
- * Creates the style deltas for newValue & oldValue and applies them directly to the DOM.
2607
- * @param {Object|String} value
2608
- * @param {Object|String} oldValue
2609
- * @param {String} [id=this.id]
2610
- * @protected
2597
+ *
2611
2598
  */
2612
- updateStyle(value, oldValue, id=this.id) {
2613
- let me = this,
2614
- delta = Style.compareStyles(value, oldValue),
2615
- opts, vdom, vnode, vnodeStyle;
2616
-
2617
- if (delta) {
2618
- vdom = VDomUtil.find(me.vdom, id);
2619
- vnode = me.vnode && VNodeUtil.find(me.vnode, id);
2620
-
2621
- if (!me.hasUnmountedVdomChanges) {
2622
- me.hasUnmountedVdomChanges = !me.mounted && me.hasBeenMounted
2623
- }
2624
-
2625
- vdom.vdom.style = value; // keep the vdom in sync
2626
-
2627
- if (me.silentVdomUpdate) {
2628
- me.needsVdomUpdate = true
2629
- } else if (me.mounted) {
2630
- vnodeStyle = vnode.vnode.style;
2631
-
2632
- // keep the vnode in sync
2633
- // we need the iteration since vdom shortcuts (height, width,...) live within the vnode style
2634
- // using vnode.vnode.style = style would lose them.
2635
- Object.entries(delta).forEach(([key, value]) => {
2636
- if (value === null) {
2637
- delete vnode.vnode.style[key]
2638
- } else {
2639
- vnodeStyle[key] = value
2640
- }
2641
- });
2642
-
2643
- opts = {
2644
- action: 'updateDom',
2645
- deltas: [{id, style: delta}]
2646
- };
2647
-
2648
- if (currentWorker.isSharedWorker) {
2649
- opts.appName = me.appName
2650
- }
2599
+ updateStyle() {
2600
+ let me = this,
2601
+ {vdom} = me,
2602
+ vdomRoot = me.getVdomRoot();
2651
2603
 
2652
- currentWorker.sendMessage('main', opts)
2653
- }
2604
+ if (vdom !== vdomRoot) {
2605
+ vdom .style = me.wrapperStyle;
2606
+ vdomRoot.style = me.style
2607
+ } else {
2608
+ vdom.style = {...me.wrapperStyle, ...me.style}
2654
2609
  }
2610
+
2611
+ me.update()
2655
2612
  }
2656
2613
 
2657
2614
  /**
@@ -50,14 +50,15 @@ class AmChart extends Component {
50
50
  * @member {String} package='am4charts'
51
51
  */
52
52
  package: 'am4charts',
53
+ style: {
54
+ height: '100%'
55
+ },
53
56
  /**
54
57
  * @member {Object} _vdom
55
58
  */
56
59
  _vdom:
57
60
  {style: {position: 'relative'}, cn: [
58
- {style: {position: 'absolute', height: '100%', width: '100%'}, cn: [
59
- {style: {color:'red',height: '100%'}}
60
- ]}
61
+ {style: {position: 'absolute', height: '100%', width: '100%'}, cn: [{}]}
61
62
  ]}
62
63
  }
63
64
 
@@ -304,7 +304,7 @@ class Container extends Component {
304
304
  let me = this,
305
305
  config = {appName: me.appName, parentId: me.id, parentIndex: index, windowId: me.windowId},
306
306
  defaults = {...me.itemDefaults},
307
- lazyLoadItem, module;
307
+ lazyLoadItem, module, parent;
308
308
 
309
309
  if (defaults) {
310
310
  if (item.module) {
@@ -328,11 +328,23 @@ class Container extends Component {
328
328
  }
329
329
 
330
330
  case 'NeoInstance': {
331
+ parent = item.parent;
332
+
333
+ if (parent && parent !== me) {
334
+ parent.remove(item, false);
335
+ delete item.vdom.removeDom;
336
+
337
+ // Convenience logic, especially for moving components into different browser windows:
338
+ // A component might rely on references & handler methods inside the previous controller realm
339
+ if (!item.controller && !me.getController() && parent.getController()) {
340
+ item.controller = {parent: parent.getController()}
341
+ }
342
+ }
343
+
331
344
  item.set(config);
332
345
 
333
- // In case an item got created outside a VC or stateProvider based hierarchy, there might be bindings or string
346
+ // In case an item got created outside a stateProvider based hierarchy, there might be bindings or string
334
347
  // based listeners which still need to get resolved.
335
- item.getController() ?.parseConfig(item);
336
348
  item.getStateProvider()?.parseConfig(item);
337
349
  break
338
350
  }