neo.mjs 8.36.0 → 8.37.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.
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.36.0'
23
+ * @member {String} version='8.37.0'
24
24
  */
25
- version: '8.36.0'
25
+ version: '8.37.0'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-04-01",
19
+ "datePublished": "2025-04-03",
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.36.0'
110
+ html : 'v8.37.0'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.36.0'
23
+ * @member {String} version='8.37.0'
24
24
  */
25
- version: '8.36.0'
25
+ version: '8.37.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.36.0",
3
+ "version": "8.37.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -62,7 +62,7 @@
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.1",
65
+ "sass": "^1.86.3",
66
66
  "siesta-lite": "5.5.2",
67
67
  "url": "^0.11.4",
68
68
  "webpack": "^5.98.0",
@@ -684,15 +684,15 @@ class Table extends Base {
684
684
  columns: [{
685
685
  dataField: "timestamp",
686
686
  text: "Date",
687
- renderer: (data) => data.value.toLocaleDateString(undefined, {weekday: "long", year: "numeric", month: "long", day: "numeric"}),
687
+ renderer: (data) => data.value.toLocaleDateString(undefined, {weekday: "long", year: "numeric", month: "long", day: "numeric"})
688
688
  }, {
689
689
  dataField: "location",
690
- text: "Location",
690
+ text: "Location"
691
691
  }, {
692
692
  dataField: "magnitude",
693
693
  text: "Magnitude",
694
694
  align: "right",
695
- renderer: (data) => data.value.toLocaleString(),
695
+ renderer: (data) => data.value.toLocaleString()
696
696
  }],
697
697
  }
698
698
  }
@@ -263,12 +263,12 @@ const DefaultConfig = {
263
263
  useVdomWorker: true,
264
264
  /**
265
265
  * buildScripts/injectPackageVersion.mjs will update this value
266
- * @default '8.36.0'
266
+ * @default '8.37.0'
267
267
  * @memberOf! module:Neo
268
268
  * @name config.version
269
269
  * @type String
270
270
  */
271
- version: '8.36.0'
271
+ version: '8.37.0'
272
272
  };
273
273
 
274
274
  Object.assign(DefaultConfig, {
@@ -40,6 +40,13 @@ class Model extends Base {
40
40
  }
41
41
 
42
42
  /**
43
+ * Internally storing all fields, which have a calculate property
44
+ * @member {Map} calculatedFieldsMap=new Map()
45
+ * @protected
46
+ */
47
+ calculatedFieldsMap = new Map()
48
+ /**
49
+ * Internally storing all fields inside a flat map => nested fields included
43
50
  * @member {Map} fieldsMap=new Map()
44
51
  * @protected
45
52
  */
@@ -85,11 +92,12 @@ class Model extends Base {
85
92
  * @param {String} path=''
86
93
  */
87
94
  updateFieldsMap(fields, isRoot=true, path='') {
88
- let me = this,
89
- {fieldsMap} = me,
95
+ let me = this,
96
+ {calculatedFieldsMap, fieldsMap} = me,
90
97
  fieldName;
91
98
 
92
99
  if (isRoot) {
100
+ calculatedFieldsMap.clear();
93
101
  fieldsMap.clear();
94
102
  me.hasNestedFields = false
95
103
  }
@@ -97,12 +105,15 @@ class Model extends Base {
97
105
  fields.forEach(field => {
98
106
  fieldName = path + field.name
99
107
 
100
- // Assuming that nested fields contain the full path as the name, we do not need a prefix.
101
108
  if (field.fields) {
102
109
  me.hasNestedFields = true;
103
110
  me.updateFieldsMap(field.fields, false, field.name + '.')
104
111
  } else {
105
- fieldsMap.set(fieldName, field)
112
+ fieldsMap.set(fieldName, field);
113
+
114
+ if (field.calculate) {
115
+ calculatedFieldsMap.set(fieldName, field)
116
+ }
106
117
  }
107
118
  })
108
119
  }
@@ -82,24 +82,11 @@ class RecordFactory extends Base {
82
82
  return this[dataSymbol][fieldName]
83
83
  },
84
84
  set(value) {
85
- let me = this,
86
- oldValue = me[dataSymbol][fieldName];
87
-
88
- value = instance.parseRecordValue(me, field, value);
89
-
90
- if (!Neo.isEqual(value, oldValue)) {
91
- instance.setRecordData({fieldName: fieldPath, model, record: me, value});
92
-
93
- if (!model.trackModifiedFields) {
94
- me[isModifiedSymbol] = true
95
- }
96
-
97
- instance.onRecordChange({
98
- fields: [{name: fieldPath, oldValue, value}],
99
- model,
100
- record: me
101
- })
102
- }
85
+ instance.setRecordFields({
86
+ fields: {[fieldPath]: instance.parseRecordValue(this, field, value)},
87
+ model,
88
+ record: this,
89
+ })
103
90
  }
104
91
  }
105
92
  };
@@ -288,11 +275,11 @@ class RecordFactory extends Base {
288
275
  * todo: parse value for more field types
289
276
  * @param {Object} record
290
277
  * @param {Object} field
291
- * @param {*} value
278
+ * @param {*} value=null
292
279
  * @param {Object} recordConfig=null
293
280
  * @returns {*}
294
281
  */
295
- parseRecordValue(record, field, value, recordConfig=null) {
282
+ parseRecordValue(record, field, value=null, recordConfig=null) {
296
283
  if (field.calculate) {
297
284
  return field.calculate(record, field, recordConfig)
298
285
  }
@@ -400,8 +387,9 @@ class RecordFactory extends Base {
400
387
  * @param {Boolean} data.useOriginalData=false true will apply changes to the originalData symbol
401
388
  */
402
389
  setRecordFields({changedFields=[], fields, model, record, silent=false, useOriginalData=false}) {
403
- let {fieldsMap, trackModifiedFields} = model,
404
- fieldExists, oldValue;
390
+ let me = this,
391
+ {calculatedFieldsMap, fieldsMap, trackModifiedFields} = model,
392
+ fieldExists, hasChangedFields, oldValue;
405
393
 
406
394
  if (!trackModifiedFields && useOriginalData) {
407
395
  return
@@ -412,7 +400,7 @@ class RecordFactory extends Base {
412
400
 
413
401
  if (Neo.isObject(value) && !fieldExists) {
414
402
  Object.entries(value).forEach(([childKey, childValue]) => {
415
- this.setRecordFields({
403
+ me.setRecordFields({
416
404
  changedFields,
417
405
  fields: {[`${key}.${childKey}`]: childValue},
418
406
  model,
@@ -423,10 +411,10 @@ class RecordFactory extends Base {
423
411
  })
424
412
  } else if (fieldExists) {
425
413
  oldValue = record[key];
426
- value = instance.parseRecordValue(record, model.getField(key), value);
414
+ value = me.parseRecordValue(record, model.getField(key), value);
427
415
 
428
416
  if (!Neo.isEqual(oldValue, value)) {
429
- instance.setRecordData({fieldName: key, model, record, useOriginalData, value});
417
+ me.setRecordData({fieldName: key, model, record, useOriginalData, value});
430
418
 
431
419
  if (!trackModifiedFields && !useOriginalData) {
432
420
  record[isModifiedSymbol] = true
@@ -437,8 +425,23 @@ class RecordFactory extends Base {
437
425
  }
438
426
  });
439
427
 
440
- if (!silent && !useOriginalData && Object.keys(changedFields).length > 0) {
441
- Neo.get(model.storeId)?.onRecordChange({fields: changedFields, model, record})
428
+ hasChangedFields = Object.keys(changedFields).length > 0;
429
+
430
+ if (hasChangedFields) {
431
+ calculatedFieldsMap.forEach((value, key) => {
432
+ oldValue = record[key];
433
+ value = me.parseRecordValue(record, model.getField(key));
434
+
435
+ if (!Neo.isEqual(oldValue, value)) {
436
+ me.setRecordData({fieldName: key, model, record, useOriginalData, value});
437
+
438
+ changedFields.push({name: key, oldValue, value})
439
+ }
440
+ })
441
+ }
442
+
443
+ if (!silent && !useOriginalData && hasChangedFields) {
444
+ me.onRecordChange({fields: changedFields, model, record})
442
445
  }
443
446
  }
444
447
  }