neo.mjs 8.36.0 → 8.38.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.38.0'
24
24
  */
25
- version: '8.36.0'
25
+ version: '8.38.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.38.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.38.0'
24
24
  */
25
- version: '8.36.0'
25
+ version: '8.38.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.38.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.38.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.38.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({record: this, field, value})},
87
+ model,
88
+ record: this
89
+ })
103
90
  }
104
91
  }
105
92
  };
@@ -165,10 +152,11 @@ class RecordFactory extends Base {
165
152
  if (model.trackModifiedFields) {
166
153
  me[originalDataSymbol] = {};
167
154
  me.setOriginal(config)
155
+ } else {
156
+ me[isModifiedSymbol] = false
168
157
  }
169
158
 
170
159
  me.setSilent(config); // We do not want to fire change events when constructing
171
- me[isModifiedSymbol] = false
172
160
  }
173
161
 
174
162
  /**
@@ -285,16 +273,17 @@ class RecordFactory extends Base {
285
273
  }
286
274
 
287
275
  /**
288
- * todo: parse value for more field types
289
- * @param {Object} record
290
- * @param {Object} field
291
- * @param {*} value
292
- * @param {Object} recordConfig=null
276
+ * @param {Object} data
277
+ * @param {Object} data.record
278
+ * @param {Object} data.field
279
+ * @param {*} [data.value=null]
280
+ * @param {Object} [data.recordConfig=null]
281
+ * @param {Boolean} [data.useOriginalData=false]
293
282
  * @returns {*}
294
283
  */
295
- parseRecordValue(record, field, value, recordConfig=null) {
284
+ parseRecordValue({record, field, value=null, recordConfig=null, useOriginalData=false}) {
296
285
  if (field.calculate) {
297
- return field.calculate(record, field, recordConfig)
286
+ return field.calculate(record[useOriginalData ? originalDataSymbol : dataSymbol], field)
298
287
  }
299
288
 
300
289
  if (field.convert) {
@@ -400,8 +389,9 @@ class RecordFactory extends Base {
400
389
  * @param {Boolean} data.useOriginalData=false true will apply changes to the originalData symbol
401
390
  */
402
391
  setRecordFields({changedFields=[], fields, model, record, silent=false, useOriginalData=false}) {
403
- let {fieldsMap, trackModifiedFields} = model,
404
- fieldExists, oldValue;
392
+ let me = this,
393
+ {calculatedFieldsMap, fieldsMap, trackModifiedFields} = model,
394
+ fieldExists, hasChangedFields, oldValue;
405
395
 
406
396
  if (!trackModifiedFields && useOriginalData) {
407
397
  return
@@ -412,7 +402,7 @@ class RecordFactory extends Base {
412
402
 
413
403
  if (Neo.isObject(value) && !fieldExists) {
414
404
  Object.entries(value).forEach(([childKey, childValue]) => {
415
- this.setRecordFields({
405
+ me.setRecordFields({
416
406
  changedFields,
417
407
  fields: {[`${key}.${childKey}`]: childValue},
418
408
  model,
@@ -423,10 +413,10 @@ class RecordFactory extends Base {
423
413
  })
424
414
  } else if (fieldExists) {
425
415
  oldValue = record[key];
426
- value = instance.parseRecordValue(record, model.getField(key), value);
416
+ value = me.parseRecordValue({record, field: model.getField(key), value});
427
417
 
428
418
  if (!Neo.isEqual(oldValue, value)) {
429
- instance.setRecordData({fieldName: key, model, record, useOriginalData, value});
419
+ me.setRecordData({fieldName: key, model, record, useOriginalData, value});
430
420
 
431
421
  if (!trackModifiedFields && !useOriginalData) {
432
422
  record[isModifiedSymbol] = true
@@ -437,8 +427,23 @@ class RecordFactory extends Base {
437
427
  }
438
428
  });
439
429
 
440
- if (!silent && !useOriginalData && Object.keys(changedFields).length > 0) {
441
- Neo.get(model.storeId)?.onRecordChange({fields: changedFields, model, record})
430
+ hasChangedFields = Object.keys(changedFields).length > 0;
431
+
432
+ if (hasChangedFields) {
433
+ calculatedFieldsMap.forEach((value, key) => {
434
+ oldValue = record[key];
435
+ value = me.parseRecordValue({record, field: model.getField(key), useOriginalData});
436
+
437
+ if (!Neo.isEqual(oldValue, value)) {
438
+ me.setRecordData({fieldName: key, model, record, useOriginalData, value});
439
+
440
+ changedFields.push({name: key, oldValue, value})
441
+ }
442
+ })
443
+ }
444
+
445
+ if (!silent && !useOriginalData && hasChangedFields) {
446
+ me.onRecordChange({fields: changedFields, model, record})
442
447
  }
443
448
  }
444
449
  }