neo.mjs 8.31.1 → 8.33.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 (65) hide show
  1. package/.github/LLM_PROMPTS.md +463 -0
  2. package/README.md +138 -55
  3. package/apps/ServiceWorker.mjs +2 -2
  4. package/apps/finance/app.mjs +6 -0
  5. package/apps/finance/index.html +12 -0
  6. package/apps/finance/model/Company.mjs +37 -0
  7. package/apps/finance/neo-config.json +7 -0
  8. package/apps/finance/resources/data/companies.json +103 -0
  9. package/apps/finance/resources/images/neo_logo_favicon.svg +16 -0
  10. package/apps/finance/store/Companies.mjs +37 -0
  11. package/apps/finance/view/GridContainer.mjs +58 -0
  12. package/apps/finance/view/Viewport.mjs +43 -0
  13. package/apps/finance/view/ViewportController.mjs +35 -0
  14. package/apps/finance/view/ViewportStateProvider.mjs +32 -0
  15. package/apps/portal/index.html +1 -1
  16. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  17. package/apps/portal/view/home/MainContainer.mjs +1 -1
  18. package/apps/portal/view/home/parts/Colors.mjs +4 -8
  19. package/apps/portal/view/home/parts/Helix.mjs +5 -1
  20. package/buildScripts/buildAll.mjs +1 -1
  21. package/buildScripts/buildThemes.mjs +1 -1
  22. package/buildScripts/createApp.mjs +1 -1
  23. package/buildScripts/createAppMinimal.mjs +1 -1
  24. package/buildScripts/docs/jsdocx.mjs +1 -1
  25. package/buildScripts/injectPackageVersion.mjs +1 -1
  26. package/buildScripts/watchThemes.mjs +1 -1
  27. package/buildScripts/webpack/buildThreads.mjs +1 -1
  28. package/buildScripts/webpack/development/webpack.config.appworker.mjs +1 -1
  29. package/buildScripts/webpack/development/webpack.config.main.mjs +1 -1
  30. package/buildScripts/webpack/development/webpack.config.worker.mjs +1 -1
  31. package/buildScripts/webpack/production/webpack.config.appworker.mjs +1 -1
  32. package/buildScripts/webpack/production/webpack.config.main.mjs +1 -1
  33. package/buildScripts/webpack/production/webpack.config.worker.mjs +1 -1
  34. package/examples/README.md +5 -14
  35. package/examples/ServiceWorker.mjs +2 -2
  36. package/package.json +3 -3
  37. package/resources/scss/src/grid/plugin/AnimateRows.scss +10 -0
  38. package/src/DefaultConfig.mjs +2 -2
  39. package/src/calendar/view/SettingsContainer.mjs +3 -5
  40. package/src/calendar/view/week/Component.mjs +3 -5
  41. package/src/component/Base.mjs +3 -6
  42. package/src/component/Helix.mjs +2 -3
  43. package/src/component/MagicMoveText.mjs +13 -6
  44. package/src/controller/Component.mjs +3 -5
  45. package/src/data/Store.mjs +1 -1
  46. package/src/dialog/Base.mjs +3 -4
  47. package/src/grid/Container.mjs +6 -6
  48. package/src/grid/View.mjs +1 -7
  49. package/src/grid/column/AnimatedChange.mjs +8 -5
  50. package/src/grid/column/Base.mjs +6 -2
  51. package/src/grid/column/Currency.mjs +72 -0
  52. package/src/grid/column/_export.mjs +2 -1
  53. package/src/grid/plugin/AnimateRows.mjs +9 -31
  54. package/src/list/Base.mjs +1 -3
  55. package/src/list/plugin/Animate.mjs +3 -3
  56. package/src/main/addon/ServiceWorker.mjs +29 -19
  57. package/src/manager/Component.mjs +1 -3
  58. package/src/plugin/Base.mjs +23 -3
  59. package/src/selection/HelixModel.mjs +3 -6
  60. package/src/tab/Container.mjs +3 -4
  61. package/src/table/Container.mjs +6 -7
  62. package/src/util/Css.mjs +6 -6
  63. package/src/worker/App.mjs +0 -11
  64. package/src/worker/Manager.mjs +4 -0
  65. package/src/worker/ServiceBase.mjs +40 -30
@@ -0,0 +1,32 @@
1
+ import CompanyStore from '../store/Companies.mjs';
2
+ import StateProvider from '../../../src/state/Provider.mjs';
3
+
4
+ /**
5
+ * @class Finance.view.ViewportStateProvider
6
+ * @extends Neo.state.Provider
7
+ */
8
+ class ViewportStateProvider extends StateProvider {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Finance.view.ViewportStateProvider'
12
+ * @protected
13
+ */
14
+ className: 'Finance.view.ViewportStateProvider',
15
+ /**
16
+ * @member {Object} data
17
+ */
18
+ data: {},
19
+ /**
20
+ * @member {Object} stores
21
+ */
22
+ stores: {
23
+ companies: {
24
+ module : CompanyStore,
25
+ autoLoad : true,
26
+ listeners: {load: 'onCompaniesStoreLoad'}
27
+ }
28
+ }
29
+ }
30
+ }
31
+
32
+ export default Neo.setupClass(ViewportStateProvider);
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-03-10",
19
+ "datePublished": "2025-03-25",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.31.1'
110
+ html : 'v8.33.0'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -51,8 +51,8 @@ class MainContainer extends Container {
51
51
  items: [
52
52
  {ntype: 'component', cls: ['portal-home-progress']},
53
53
  MainNeo,
54
- Helix,
55
54
  Colors,
55
+ Helix,
56
56
  How,
57
57
  Features,
58
58
  AfterMath
@@ -42,18 +42,14 @@ class Colors extends FeatureSection {
42
42
  * @member {String} paragraph
43
43
  */
44
44
  paragraph: [
45
- 'This is similar to the Helix demo — it\'s an extremely fast multi-window app. Click the start button ',
46
- 'to see the view reflect changes in the data. And the app is multi-window: the table and charts can be ',
47
- 'undocked into their own windows. In fact, the entire demo can be undocked.'
45
+ 'Click the start button to see the view reflect changes in the data. And the app is multi-window: the table ',
46
+ 'and charts can be undocked into their own windows. In fact, the entire demo can be undocked. ',
47
+ 'All windows share the same data - less traffic and costs.'
48
48
  ].join(''),
49
49
  /**
50
50
  * @member {String} subHeadline='Socket Data'
51
51
  */
52
- subHeadline: 'Shared Socket Data',
53
- /**
54
- * @member {String} textContainerPosition='end'
55
- */
56
- textContainerPosition: 'end'
52
+ subHeadline: 'Shared Socket Data'
57
53
  }
58
54
  }
59
55
 
@@ -51,7 +51,11 @@ class Helix extends FeatureSection {
51
51
  /**
52
52
  * @member {String} subHeadline='40,000 Updates /s'
53
53
  */
54
- subHeadline: '40,000 Updates /s'
54
+ subHeadline: '40,000 Updates /s',
55
+ /**
56
+ * @member {String} textContainerPosition='end'
57
+ */
58
+ textContainerPosition: 'end'
55
59
  }
56
60
  }
57
61
 
@@ -14,7 +14,7 @@ const __dirname = path.resolve(),
14
14
  requireJson = path => JSON.parse(fs.readFileSync((path))),
15
15
  packageJson = requireJson(path.join(__dirname, 'package.json')),
16
16
  program = new Command(),
17
- neoPath = path.resolve(packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/'),
17
+ neoPath = path.resolve(packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/'),
18
18
  webpackPath = path.resolve(neoPath, 'buildScripts/webpack'),
19
19
  programName = `${packageJson.name} buildAll`,
20
20
  questions = [];
@@ -14,7 +14,7 @@ const
14
14
  cwd = process.cwd(),
15
15
  requireJson = path => JSON.parse(fs.readFileSync((path))),
16
16
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
17
- insideNeo = packageJson.name === 'neo.mjs',
17
+ insideNeo = packageJson.name.includes('neo.mjs'),
18
18
  neoPath = path.resolve(insideNeo ? './' : './node_modules/neo.mjs/'),
19
19
  programName = `${packageJson.name} buildThemes`,
20
20
  program = new Command(),
@@ -12,7 +12,7 @@ const
12
12
  cwd = process.cwd(),
13
13
  requireJson = path => JSON.parse(fs.readFileSync((path))),
14
14
  packageJson = requireJson(path.join(__dirname, 'package.json')),
15
- insideNeo = packageJson.name === 'neo.mjs',
15
+ insideNeo = packageJson.name.includes('neo.mjs'),
16
16
  neoPath = insideNeo ? './' : './node_modules/neo.mjs/',
17
17
  addonChoices = fs.readdirSync(path.join(neoPath, '/src/main/addon')).map(item => item.slice(0, -4)),
18
18
  program = new Command(),
@@ -11,7 +11,7 @@ const __dirname = path.resolve(),
11
11
  cwd = process.cwd(),
12
12
  requireJson = path => JSON.parse(fs.readFileSync((path))),
13
13
  packageJson = requireJson(path.join(__dirname, 'package.json')),
14
- insideNeo = packageJson.name === 'neo.mjs',
14
+ insideNeo = packageJson.name.includes('neo.mjs'),
15
15
  neoPath = insideNeo ? './' : './node_modules/neo.mjs/',
16
16
  addonChoices = fs.readdirSync(path.join(neoPath, '/src/main/addon')).map(item => item.slice(0, -4)),
17
17
  program = new Command(),
@@ -8,7 +8,7 @@ const __dirname = path.resolve(),
8
8
  cwd = process.cwd(),
9
9
  requireJson = path => JSON.parse(fs.readFileSync((path))),
10
10
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
11
- insideNeo = packageJson.name === 'neo.mjs',
11
+ insideNeo = packageJson.name.includes('neo.mjs'),
12
12
  neoPath = insideNeo ? '' : 'node_modules/neo.mjs/',
13
13
  appNames = [],
14
14
  options = {
@@ -11,7 +11,7 @@ const
11
11
  cwd = process.cwd(),
12
12
  requireJson = path => JSON.parse(fs.readFileSync((path))),
13
13
  packageJson = requireJson(path.join(__dirname, 'package.json')),
14
- insideNeo = packageJson.name === 'neo.mjs',
14
+ insideNeo = packageJson.name.includes('neo.mjs'),
15
15
  neoPath = insideNeo ? './' : './node_modules/neo.mjs/',
16
16
  programName = `${packageJson.name} inject-package-version`;
17
17
 
@@ -8,7 +8,7 @@ import * as sass from 'sass';
8
8
  let cwd = process.cwd(),
9
9
  requireJson = path => JSON.parse(fs.readFileSync((path))),
10
10
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
11
- neoPath = packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/',
11
+ neoPath = packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/',
12
12
  mixinPath = path.resolve(neoPath, 'resources/scss/mixins/_all.scss'),
13
13
  scssPath = path.resolve(cwd, 'resources/scss');
14
14
 
@@ -11,7 +11,7 @@ const __dirname = path.resolve(),
11
11
  cpOpts = {env: process.env, cwd: cwd, stdio: 'inherit', shell: true},
12
12
  requireJson = path => JSON.parse(fs.readFileSync((path))),
13
13
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
14
- neoPath = packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/',
14
+ neoPath = packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/',
15
15
  program = new Command(),
16
16
  webpackPath = path.resolve(neoPath, 'buildScripts/webpack'),
17
17
  programName = `${packageJson.name} buildThreads`,
@@ -7,7 +7,7 @@ const cwd = process.cwd(),
7
7
  cpOpts = {env: process.env, cwd: cwd, stdio: 'inherit', shell: true},
8
8
  requireJson = path => JSON.parse(fs.readFileSync((path))),
9
9
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
10
- neoPath = packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/',
10
+ neoPath = packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/',
11
11
  buildTarget = requireJson(path.resolve(neoPath, 'buildScripts/webpack/development/buildTarget.json')),
12
12
  filenameConfig = requireJson(path.resolve(neoPath, 'buildScripts/webpack/json/build.json')),
13
13
  plugins = [],
@@ -6,7 +6,7 @@ import WebpackHookPlugin from 'webpack-hook-plugin';
6
6
  const cwd = process.cwd(),
7
7
  requireJson = path => JSON.parse(fs.readFileSync((path))),
8
8
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
9
- insideNeo = packageJson.name === 'neo.mjs',
9
+ insideNeo = packageJson.name.includes('neo.mjs'),
10
10
  neoPath = insideNeo ? './' : './node_modules/neo.mjs/',
11
11
  buildTarget = requireJson(path.resolve(neoPath, 'buildScripts/webpack/development/buildTarget.json')),
12
12
  filenameConfig = requireJson(path.resolve(neoPath, 'buildScripts/webpack/json/build.json')),
@@ -5,7 +5,7 @@ import webpack from 'webpack';
5
5
  const cwd = process.cwd(),
6
6
  requireJson = path => JSON.parse(fs.readFileSync((path))),
7
7
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
8
- neoPath = packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/',
8
+ neoPath = packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/',
9
9
  buildTarget = requireJson(path.resolve(neoPath, 'buildScripts/webpack/development/buildTarget.json')),
10
10
  filenameConfig = requireJson(path.resolve(neoPath, 'buildScripts/webpack/json/build.json')),
11
11
  entry = {};
@@ -7,7 +7,7 @@ const cwd = process.cwd(),
7
7
  cpOpts = {env: process.env, cwd: cwd, stdio: 'inherit', shell: true},
8
8
  requireJson = path => JSON.parse(fs.readFileSync((path))),
9
9
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
10
- neoPath = packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/',
10
+ neoPath = packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/',
11
11
  buildTarget = requireJson(path.resolve(neoPath, 'buildScripts/webpack/production/buildTarget.json')),
12
12
  filenameConfig = requireJson(path.resolve(neoPath, 'buildScripts/webpack/json/build.json')),
13
13
  plugins = [],
@@ -6,7 +6,7 @@ import WebpackHookPlugin from 'webpack-hook-plugin';
6
6
  const cwd = process.cwd(),
7
7
  requireJson = path => JSON.parse(fs.readFileSync((path))),
8
8
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
9
- insideNeo = packageJson.name === 'neo.mjs',
9
+ insideNeo = packageJson.name.includes('neo.mjs'),
10
10
  neoPath = insideNeo ? './' : './node_modules/neo.mjs/',
11
11
  buildTarget = requireJson(path.resolve(neoPath, 'buildScripts/webpack/production/buildTarget.json')),
12
12
  filenameConfig = requireJson(path.resolve(neoPath, 'buildScripts/webpack/json/build.json')),
@@ -5,7 +5,7 @@ import webpack from 'webpack';
5
5
  const cwd = process.cwd(),
6
6
  requireJson = path => JSON.parse(fs.readFileSync((path))),
7
7
  packageJson = requireJson(path.resolve(cwd, 'package.json')),
8
- neoPath = packageJson.name === 'neo.mjs' ? './' : './node_modules/neo.mjs/',
8
+ neoPath = packageJson.name.includes('neo.mjs') ? './' : './node_modules/neo.mjs/',
9
9
  buildTarget = requireJson(path.resolve(neoPath, 'buildScripts/webpack/production/buildTarget.json')),
10
10
  filenameConfig = requireJson(path.resolve(neoPath, 'buildScripts/webpack/json/build.json')),
11
11
  entry = {};
@@ -1,17 +1,8 @@
1
1
  # Client Requirements
2
2
 
3
- Running the examples locally **without** a webpack build requires browsers to be able to start webworkers from
4
- Javascript Modules (.mjs files). This feature got released in Google Chrome v80 (February 4th, 2020),
5
- other browsers are not there yet (see sticky <a href="https://github.com/neomjs/neo/issues">issues</a>)
3
+ Running the examples locally works fine in all environments inside all major browsers at this point:
4
+ Chromium, Safari & Firefox
6
5
 
7
- - localhost/neo/examples/component/helix/
8
-
9
- More details on JS Modules (and their use within workers) here:
10
- https://v8.dev/features/modules
11
-
12
- Without the Chrome flag (or for other browsers like Firefox or Safari), you can run the examples using the webpack build
13
- version (which converts JS modules into plain JS files)
14
- - localhost/neo/dist/development/examples/component/helix/
15
6
 
16
7
  # Local Web-Server Requirements
17
8
 
@@ -19,13 +10,14 @@ Why do I need a local web-server?
19
10
 
20
11
  In short: it is possible to run the framework without a local web-server, but this would be a huge security issue.
21
12
  You can start Chrome using a flag (--allow-file-access-from-files), but this will allow the browser to access any
22
- file on your hard drive. To avoid this, a local web-server (like XAMPP) is the way to go.
13
+ file on your hard drive. To avoid this, a local web-server is the way to go.
23
14
 
24
15
  **Webpack Dev Server**
25
16
  `npm run server-start`
26
17
 
27
18
  **All Servers**
28
- Ensure your server has a mime-type configured for Javascript Modules (.mjs) files. This should be set to the same as normal javascript (.js) files, normally 'application/-javascript'.
19
+ Ensure your server has a mime-type configured for Javascript Modules (.mjs) files. This should be set to the same as
20
+ normal javascript (.js) files, normally 'application/-javascript'.
29
21
 
30
22
  **JetBrains IDE**
31
23
  - Go to Preferences -> Build, Execution, Deployment -> Debugger
@@ -33,4 +25,3 @@ Ensure your server has a mime-type configured for Javascript Modules (.mjs) file
33
25
 
34
26
  <br><br>
35
27
  Copyright (c) 2015 - today, <a href="https://www.linkedin.com/in/tobiasuhlig/">Tobias Uhlig</a>
36
- & <a href="https://www.linkedin.com/in/richwaters/">Rich Waters</a>
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.31.1'
23
+ * @member {String} version='8.33.0'
24
24
  */
25
- version: '8.31.1'
25
+ version: '8.33.0'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.31.1",
3
+ "version": "8.33.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -56,13 +56,13 @@
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.4.3",
59
+ "inquirer": "^12.5.0",
60
60
  "marked": "^15.0.7",
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.85.1",
65
+ "sass": "^1.86.0",
66
66
  "siesta-lite": "5.5.2",
67
67
  "url": "^0.11.4",
68
68
  "webpack": "^5.98.0",
@@ -0,0 +1,10 @@
1
+ .neo-grid-view {
2
+ &.neo-animate-rows {
3
+ .neo-grid-row {
4
+ transition:
5
+ background-color var(--neo-duration) var(--neo-easing),
6
+ opacity var(--neo-duration) var(--neo-easing),
7
+ transform var(--neo-duration) var(--neo-easing);
8
+ }
9
+ }
10
+ }
@@ -263,12 +263,12 @@ const DefaultConfig = {
263
263
  useVdomWorker: true,
264
264
  /**
265
265
  * buildScripts/injectPackageVersion.mjs will update this value
266
- * @default '8.31.1'
266
+ * @default '8.33.0'
267
267
  * @memberOf! module:Neo
268
268
  * @name config.version
269
269
  * @type String
270
270
  */
271
- version: '8.31.1'
271
+ version: '8.33.0'
272
272
  };
273
273
 
274
274
  Object.assign(DefaultConfig, {
@@ -159,16 +159,14 @@ class SettingsContainer extends Container {
159
159
  onCardIndexChange(data) {
160
160
  let me = this,
161
161
  container = data.item,
162
- mainContainer = me.getMainContainer(),
163
- listenerId;
162
+ mainContainer = me.getMainContainer();
164
163
 
165
164
  if (mainContainer) {
166
165
  if (Neo.isFunction(container.createContent) && container.items.length < 1) {
167
166
  if (Neo.typeOf(mainContainer[`${container.flag}Component`]) !== 'NeoInstance') {
168
- listenerId = mainContainer.on('cardLoaded', () => {
169
- mainContainer.un('cardLoaded', listenerId);
167
+ mainContainer.on('cardLoaded', () => {
170
168
  me.timeout(30).then(() => {container.createContent()})
171
- })
169
+ }, me, {once: true})
172
170
  } else {
173
171
  me.timeout(30).then(() => {container.createContent()})
174
172
  }
@@ -359,21 +359,19 @@ class Component extends BaseComponent {
359
359
  import('./plugin/DragDrop.mjs'),
360
360
  import('./plugin/EventResizable.mjs')
361
361
  ]).then(modules => {
362
- let me = this,
363
- {appName, windowId} = me,
364
- plugins = me.plugins || [];
362
+ let me = this,
363
+ {appName} = me,
364
+ plugins = me.plugins || [];
365
365
 
366
366
  plugins.push({
367
367
  module : modules[0].default,
368
368
  appName,
369
- windowId,
370
369
  ...me.pluginDragDropConfig
371
370
  }, {
372
371
  module : modules[1].default,
373
372
  appName,
374
373
  delegationCls: 'neo-event',
375
374
  directions : ['b', 't'],
376
- windowId,
377
375
  ...me.pluginEventResizableConfig
378
376
  });
379
377
 
@@ -2662,8 +2662,7 @@ class Component extends Base {
2662
2662
  */
2663
2663
  updateVdom(resolve, reject) {
2664
2664
  let me = this,
2665
- {app, mounted, parentId, vnode} = me,
2666
- listenerId;
2665
+ {app, mounted, parentId, vnode} = me;
2667
2666
 
2668
2667
  if (me.isVdomUpdating || me.silentVdomUpdate) {
2669
2668
  resolve && me.resolveUpdateCache.push(resolve);
@@ -2672,13 +2671,11 @@ class Component extends Base {
2672
2671
  if (!mounted && me.isConstructed && !me.hasRenderingListener && app?.rendering === true) {
2673
2672
  me.hasRenderingListener = true;
2674
2673
 
2675
- listenerId = app.on('mounted', () => {
2676
- app.un('mounted', listenerId);
2677
-
2674
+ app.on('mounted', () => {
2678
2675
  me.timeout(50).then(() => {
2679
2676
  me.vnode && me.updateVdom(resolve, reject)
2680
2677
  })
2681
- })
2678
+ }, me, {once: true})
2682
2679
  } else {
2683
2680
  if (resolve && (!mounted || !vnode)) {
2684
2681
  me.resolveUpdateCache.push(resolve)
@@ -546,12 +546,11 @@ class Helix extends Component {
546
546
  angle, item, matrixItems, transformStyle, vdomItem, c, s, x, y, z;
547
547
 
548
548
  if (!me.mounted) {
549
- const listenerId = me.on('mounted', () => {
550
- me.un('mounted', listenerId);
549
+ me.on('mounted', () => {
551
550
  me.timeout(100).then(() => {
552
551
  me.createItems(startIndex)
553
552
  })
554
- })
553
+ }, me, {once: true})
555
554
  } else {
556
555
  for (; i < len; i++) {
557
556
  item = me.store.items[i];
@@ -219,14 +219,21 @@ class MagicMoveText extends Component {
219
219
 
220
220
  let me = this;
221
221
 
222
- value && me.getDomRect().then(rect => {
223
- me.contentHeight = rect.height;
224
- me.contentWidth = rect.width;
222
+ if (value) {
223
+ me.getDomRect().then(rect => {
224
+ me.contentHeight = rect.height;
225
+ me.contentWidth = rect.width;
226
+ })
227
+ } else {
228
+ me.measureCache = {};
229
+ me.previousChars = []
230
+ }
225
231
 
226
- me.autoCycle && me.startAutoCycle(value)
227
- });
232
+ if(oldValue !== undefined) {
233
+ me.addResizeObserver(value);
228
234
 
229
- oldValue !== undefined && me.addResizeObserver(value)
235
+ me.autoCycle && me.startAutoCycle(value)
236
+ }
230
237
  }
231
238
 
232
239
  /**
@@ -45,18 +45,16 @@ class Component extends Base {
45
45
  super.construct(config);
46
46
 
47
47
  let me = this,
48
- {component} = me,
49
- listenerId;
48
+ {component} = me;
50
49
 
51
50
  me.references = {};
52
51
 
53
52
  if (component.isConstructed) {
54
53
  me.onComponentConstructed()
55
54
  } else {
56
- listenerId = component.on('constructed', () => {
57
- component.un('constructed', listenerId);
55
+ component.on('constructed', () => {
58
56
  me.onComponentConstructed()
59
- })
57
+ }, me, {once: true})
60
58
  }
61
59
  }
62
60
 
@@ -430,7 +430,7 @@ class Store extends Base {
430
430
 
431
431
  // Being constructed does not mean that related afterSetStore() methods got executed
432
432
  // => break the sync flow to ensure potential listeners got applied
433
- Promise.resolve().then(() => {
433
+ me.timeout(1).then(() => {
434
434
  if (me.getCount() > 0) {
435
435
  me.fire('load', me.items)
436
436
  } else if (me.autoLoad) {
@@ -286,15 +286,14 @@ class Dialog extends Panel {
286
286
  afterSetResizable(value, oldValue) {
287
287
  if (value && !this.getPlugin('resizable')) {
288
288
  import('../plugin/Resizable.mjs').then(module => {
289
- let me = this,
290
- {appName, windowId} = me,
291
- plugins = me.plugins || [];
289
+ let me = this,
290
+ {appName} = me,
291
+ plugins = me.plugins || [];
292
292
 
293
293
  plugins.push({
294
294
  module : module.default,
295
295
  appName,
296
296
  delegationCls: 'neo-dialog',
297
- windowId,
298
297
  ...me.resizablePluginConfig
299
298
  });
300
299
 
@@ -22,6 +22,7 @@ class GridContainer extends BaseContainer {
22
22
  animatedChange: column.AnimatedChange,
23
23
  column : column.Base,
24
24
  component : column.Component,
25
+ currency : column.Currency,
25
26
  index : column.Index,
26
27
  progress : column.Progress
27
28
  }
@@ -232,14 +233,13 @@ class GridContainer extends BaseContainer {
232
233
  afterSetCellEditing(value, oldValue) {
233
234
  if (value) {
234
235
  import('./plugin/CellEditing.mjs').then(module => {
235
- let me = this,
236
- {appName, windowId} = me,
237
- plugins = me.plugins || [];
236
+ let me = this,
237
+ {appName} = me,
238
+ plugins = me.plugins || [];
238
239
 
239
240
  plugins.push({
240
- module : module.default,
241
- appName,
242
- windowId
241
+ module: module.default,
242
+ appName
243
243
  });
244
244
 
245
245
  me.plugins = plugins
package/src/grid/View.mjs CHANGED
@@ -226,9 +226,7 @@ class GridView extends Component {
226
226
  plugins = me.plugins || [];
227
227
 
228
228
  plugins.push({
229
- module : module.default,
230
- appName : me.appName,
231
- windowId: me.windowId,
229
+ module: module.default,
232
230
  ...me.pluginAnimateRowsConfig
233
231
  });
234
232
 
@@ -436,10 +434,6 @@ class GridView extends Component {
436
434
  fieldValue = record[dataField],
437
435
  cellConfig, rendererOutput;
438
436
 
439
- if (fieldValue === null || fieldValue === undefined) {
440
- fieldValue = ''
441
- }
442
-
443
437
  rendererOutput = column.renderer.call(column.rendererScope || column, {
444
438
  column,
445
439
  columnIndex,
@@ -66,12 +66,15 @@ class AnimatedChange extends Column {
66
66
  cellId = view.getCellId(record, me.dataField);
67
67
  node = VdomUtil.find(view.vdom, cellId)?.vdom;
68
68
 
69
- NeoArray.add(node.cls, me.getAnimationCls(record));
69
+ if (node) {
70
+ NeoArray.add(node.cls, me.getAnimationCls(record));
71
+
72
+ // This will trigger a 2nd view update, after grid.View: onStoreRecordChange()
73
+ // It is crucial to restart the keyframe based animation
74
+ // => The previous update call will remove the last animationCls
75
+ view.update()
76
+ }
70
77
 
71
- // This will trigger a 2nd view update, after grid.View: onStoreRecordChange()
72
- // It is crucial to restart the keyframe based animation
73
- // => The previous update call will remove the last animationCls
74
- view.update();
75
78
  break
76
79
  }
77
80
  }
@@ -73,8 +73,12 @@ class Column extends Base {
73
73
  * @param {Number|String} data.value
74
74
  * @returns {*}
75
75
  */
76
- cellRenderer(data) {
77
- return data.value
76
+ cellRenderer({value}) {
77
+ if (value === null || value === undefined) {
78
+ return ''
79
+ }
80
+
81
+ return value
78
82
  }
79
83
  }
80
84