neo.mjs 10.3.3 → 10.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ServiceWorker.mjs CHANGED
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='10.3.3'
23
+ * @member {String} version='10.3.4'
24
24
  */
25
- version: '10.3.3'
25
+ version: '10.3.4'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-08-04",
19
+ "datePublished": "2025-08-09",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -16,7 +16,7 @@
16
16
  "date" : "Jul 28, 2025",
17
17
  "id" : 67,
18
18
  "image" : "DesigningFunctionalComponents.png",
19
- "name" : "Designing Functional Components for a Multi-Threaded WorldDesigning Functional Components for a Multi-Threaded World",
19
+ "name" : "Designing Functional Components for a Multi-Threaded World",
20
20
  "provider" : "Medium",
21
21
  "publisher" : "ITNEXT",
22
22
  "selectedInto": [],
@@ -108,7 +108,7 @@ class FooterContainer extends Container {
108
108
  }, {
109
109
  module: Component,
110
110
  cls : ['neo-version'],
111
- text : 'v10.3.3'
111
+ text : 'v10.3.4'
112
112
  }]
113
113
  }],
114
114
  /**
@@ -150,7 +150,7 @@ if (programOpts.info) {
150
150
  }
151
151
  }
152
152
 
153
- if (parsedocs === 'yes') {
153
+ if (parsedocs === 'yes' && fs.existsSync(path.join(cwd, 'docs/app'))) {
154
154
  childProcess = spawnSync(npmCmd, ['run', 'generate-docs-json'], cpOpts);
155
155
  childProcess.status && process.exit(childProcess.status);
156
156
  }
@@ -121,7 +121,7 @@ export default env => {
121
121
  createStartingPoint(key.substr(1), 'apps');
122
122
  });
123
123
 
124
- if (fs.existsSync(path.join(cwd, 'docs'))) {
124
+ if (fs.existsSync(path.join(cwd, 'docs/app'))) {
125
125
  createStartingPoint('Docs', '');
126
126
  }
127
127
 
@@ -133,7 +133,7 @@ export default async function(env) {
133
133
  await createStartingPoint(key.substr(1), 'apps');
134
134
  }
135
135
 
136
- if (fs.existsSync(path.join(cwd, 'docs'))) {
136
+ if (fs.existsSync(path.join(cwd, 'docs/app'))) {
137
137
  await createStartingPoint('Docs', '');
138
138
  }
139
139
 
@@ -36,10 +36,11 @@ export default defineComponent({
36
36
 
37
37
  // This event listener is for the main container to toggle the active state
38
38
  useEvent('click', (event) => {
39
+ console.log(event.component);
39
40
  // Stop the event from bubbling up to avoid toggling the active state
40
41
  // when the button is clicked. The button has its own handler.
41
42
  if (event.target.id === 'details-button') {
42
- event.stopPropagation()
43
+ return false
43
44
  } else {
44
45
  setIsActive(prev => !prev)
45
46
  }
@@ -84,7 +84,7 @@ Any run-time value change is reactive and will update the UI.
84
84
  For functional components, or when you need to dynamically generate UI structures, you can drop down a level of
85
85
  abstraction and work directly with **JSON Blueprints**. This is the "native language" of the Neo.mjs rendering engine.
86
86
 
87
- The component's `render()` method returns a structured JSON object that describes the VDOM tree.
87
+ The component's `createVdom()` method returns a structured JSON object that describes the VDOM tree.
88
88
 
89
89
  We've seen this movie before. In the world of APIs, the verbose, heavyweight, and human-readable XML standard was
90
90
  inevitably supplanted by the lighter, simpler, and more machine-friendly JSON. We believe the same evolution is happening
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "10.3.3",
3
+ "version": "10.3.4",
4
4
  "description": "Neo.mjs: The multi-threaded UI framework for building ultra-fast, desktop-like web applications with uncompromised responsiveness, inherent security, and a transpilation-free dev mode.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -299,12 +299,12 @@ const DefaultConfig = {
299
299
  useVdomWorker: true,
300
300
  /**
301
301
  * buildScripts/injectPackageVersion.mjs will update this value
302
- * @default '10.3.3'
302
+ * @default '10.3.4'
303
303
  * @memberOf! module:Neo
304
304
  * @name config.version
305
305
  * @type String
306
306
  */
307
- version: '10.3.3'
307
+ version: '10.3.4'
308
308
  };
309
309
 
310
310
  Object.assign(DefaultConfig, {
package/src/grid/Body.mjs CHANGED
@@ -958,40 +958,42 @@ class GridBody extends Component {
958
958
  * @param {Object} data.record
959
959
  */
960
960
  onStoreRecordChange({fields, record}) {
961
- let me = this,
962
- fieldNames = fields.map(field => field.name),
963
- needsUpdate = false,
964
- rowIndex = me.store.indexOf(record),
965
- {selectionModel} = me,
961
+ let me = this,
962
+ fieldNames = fields.map(field => field.name),
963
+ needsUpdate = false,
964
+ rowIndex = me.store.indexOf(record),
965
+ {mountedRows, selectionModel} = me,
966
966
  column, needsCellUpdate, recordId;
967
967
 
968
968
  if (fieldNames.includes(me.colspanField)) {
969
969
  me.vdom.cn[rowIndex] = me.createRow({record, rowIndex});
970
970
  me.update()
971
971
  } else {
972
- for (column of me.parent.columns.items) {
973
- if (
974
- column instanceof Neo.grid.column.Component &&
975
- Neo.typeOf(column.component === 'Function') &&
976
- !fieldNames.includes(column.dataField)
977
- ) {
978
- needsCellUpdate = me.updateCellNode(record, column.dataField);
979
- needsUpdate = needsUpdate || needsCellUpdate
972
+ if (rowIndex >= mountedRows[0] && rowIndex <= mountedRows[1]) {
973
+ for (column of me.parent.columns.items) {
974
+ if (
975
+ column instanceof Neo.grid.column.Component &&
976
+ Neo.typeOf(column.component === 'Function') &&
977
+ !fieldNames.includes(column.dataField)
978
+ ) {
979
+ needsCellUpdate = me.updateCellNode(record, column.dataField);
980
+ needsUpdate = needsUpdate || needsCellUpdate
981
+ }
980
982
  }
981
- }
982
983
 
983
- fields.forEach(field => {
984
- if (field.name === me.selectedRecordField) {
985
- if (selectionModel.ntype === 'selection-grid-rowmodel') {
986
- recordId = record[me.store.getKeyProperty()];
984
+ fields.forEach(field => {
985
+ if (field.name === me.selectedRecordField) {
986
+ if (selectionModel.ntype === 'selection-grid-rowmodel') {
987
+ recordId = record[me.store.getKeyProperty()];
987
988
 
988
- selectionModel[field.value ? 'selectRow' : 'deselectRow'](recordId)
989
+ selectionModel[field.value ? 'selectRow' : 'deselectRow'](recordId)
990
+ }
991
+ } else {
992
+ needsCellUpdate = me.updateCellNode(record, field.name);
993
+ needsUpdate = needsUpdate || needsCellUpdate
989
994
  }
990
- } else {
991
- needsCellUpdate = me.updateCellNode(record, field.name);
992
- needsUpdate = needsUpdate || needsCellUpdate
993
- }
994
- })
995
+ })
996
+ }
995
997
  }
996
998
 
997
999
  needsUpdate && me.update()