neo.mjs 8.37.0 → 8.39.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.37.0'
23
+ * @member {String} version='8.39.0'
24
24
  */
25
- version: '8.37.0'
25
+ version: '8.39.0'
26
26
  }
27
27
 
28
28
  /**
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.37.0'
110
+ html : 'v8.39.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.37.0'
23
+ * @member {String} version='8.39.0'
24
24
  */
25
- version: '8.37.0'
25
+ version: '8.39.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.37.0",
3
+ "version": "8.39.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -263,12 +263,12 @@ const DefaultConfig = {
263
263
  useVdomWorker: true,
264
264
  /**
265
265
  * buildScripts/injectPackageVersion.mjs will update this value
266
- * @default '8.37.0'
266
+ * @default '8.39.0'
267
267
  * @memberOf! module:Neo
268
268
  * @name config.version
269
269
  * @type String
270
270
  */
271
- version: '8.37.0'
271
+ version: '8.39.0'
272
272
  };
273
273
 
274
274
  Object.assign(DefaultConfig, {
@@ -1,6 +1,5 @@
1
- import Base from '../core/Base.mjs';
2
- import Logger from '../util/Logger.mjs';
3
- import Model from './Model.mjs';
1
+ import Base from '../core/Base.mjs';
2
+ import Model from './Model.mjs';
4
3
 
5
4
  const
6
5
  dataSymbol = Symbol.for('data'),
@@ -83,9 +82,9 @@ class RecordFactory extends Base {
83
82
  },
84
83
  set(value) {
85
84
  instance.setRecordFields({
86
- fields: {[fieldPath]: instance.parseRecordValue(this, field, value)},
85
+ fields: {[fieldPath]: instance.parseRecordValue({record: this, field, value})},
87
86
  model,
88
- record: this,
87
+ record: this
89
88
  })
90
89
  }
91
90
  }
@@ -152,10 +151,11 @@ class RecordFactory extends Base {
152
151
  if (model.trackModifiedFields) {
153
152
  me[originalDataSymbol] = {};
154
153
  me.setOriginal(config)
154
+ } else {
155
+ me[isModifiedSymbol] = false
155
156
  }
156
157
 
157
158
  me.setSilent(config); // We do not want to fire change events when constructing
158
- me[isModifiedSymbol] = false
159
159
  }
160
160
 
161
161
  /**
@@ -165,15 +165,10 @@ class RecordFactory extends Base {
165
165
  isModifiedField(fieldName) {
166
166
  let me = this;
167
167
 
168
- // Check if the field getter does exist
169
- if (!Object.hasOwn(me.__proto__, fieldName)) {
170
- Logger.logError('The record does not contain the field', fieldName, me)
171
- }
172
-
173
168
  if (model.trackModifiedFields) {
174
169
  let dataScope, originalDataScope;
175
170
 
176
- if (model.hasNestedFields && fieldName.includes('.')) {
171
+ if (model.hasNestedFields && fieldName?.includes('.')) {
177
172
  let nsArray = fieldName.split('.');
178
173
 
179
174
  fieldName = nsArray.pop();
@@ -184,6 +179,14 @@ class RecordFactory extends Base {
184
179
  originalDataScope = me[originalDataSymbol]
185
180
  }
186
181
 
182
+ // Check if the field exists
183
+ if (
184
+ !model.getField(fieldName) && // Check for leaf fields (could be excluded inside the real data)
185
+ !Object.hasOwn(dataScope, fieldName) // Check the data tree
186
+ ) {
187
+ console.error('The record does not contain the field', fieldName, me)
188
+ }
189
+
187
190
  return !Neo.isEqual(dataScope[fieldName], originalDataScope[fieldName])
188
191
  }
189
192
 
@@ -272,16 +275,17 @@ class RecordFactory extends Base {
272
275
  }
273
276
 
274
277
  /**
275
- * todo: parse value for more field types
276
- * @param {Object} record
277
- * @param {Object} field
278
- * @param {*} value=null
279
- * @param {Object} recordConfig=null
278
+ * @param {Object} data
279
+ * @param {Object} data.record
280
+ * @param {Object} data.field
281
+ * @param {*} [data.value=null]
282
+ * @param {Object} [data.recordConfig=null]
283
+ * @param {Boolean} [data.useOriginalData=false]
280
284
  * @returns {*}
281
285
  */
282
- parseRecordValue(record, field, value=null, recordConfig=null) {
286
+ parseRecordValue({record, field, value=null, recordConfig=null, useOriginalData=false}) {
283
287
  if (field.calculate) {
284
- return field.calculate(record, field, recordConfig)
288
+ return field.calculate(record[useOriginalData ? originalDataSymbol : dataSymbol], field)
285
289
  }
286
290
 
287
291
  if (field.convert) {
@@ -411,7 +415,7 @@ class RecordFactory extends Base {
411
415
  })
412
416
  } else if (fieldExists) {
413
417
  oldValue = record[key];
414
- value = me.parseRecordValue(record, model.getField(key), value);
418
+ value = me.parseRecordValue({record, field: model.getField(key), value});
415
419
 
416
420
  if (!Neo.isEqual(oldValue, value)) {
417
421
  me.setRecordData({fieldName: key, model, record, useOriginalData, value});
@@ -430,7 +434,7 @@ class RecordFactory extends Base {
430
434
  if (hasChangedFields) {
431
435
  calculatedFieldsMap.forEach((value, key) => {
432
436
  oldValue = record[key];
433
- value = me.parseRecordValue(record, model.getField(key));
437
+ value = me.parseRecordValue({record, field: model.getField(key), useOriginalData});
434
438
 
435
439
  if (!Neo.isEqual(oldValue, value)) {
436
440
  me.setRecordData({fieldName: key, model, record, useOriginalData, value});
package/src/grid/View.mjs CHANGED
@@ -431,9 +431,21 @@ class GridView extends Component {
431
431
  cellCls = ['neo-grid-cell'],
432
432
  colspan = record[me.colspanField],
433
433
  {dataField} = column,
434
+ {model} = store,
434
435
  fieldValue = record[dataField],
435
436
  cellConfig, rendererOutput;
436
437
 
438
+ if (!model.getField(dataField)) {
439
+ let nsArray = dataField.split('.'),
440
+ fieldName = nsArray.pop();
441
+
442
+ fieldValue = Neo.ns(nsArray, false, record[Symbol.for('data')])?.[fieldName]
443
+ }
444
+
445
+ if (fieldValue === null || fieldValue === undefined) {
446
+ fieldValue = ''
447
+ }
448
+
437
449
  rendererOutput = column.renderer.call(column.rendererScope || column, {
438
450
  column,
439
451
  columnIndex,
@@ -74,10 +74,6 @@ class Column extends Base {
74
74
  * @returns {*}
75
75
  */
76
76
  cellRenderer({value}) {
77
- if (value === null || value === undefined) {
78
- return ''
79
- }
80
-
81
77
  return value
82
78
  }
83
79
  }
@@ -128,11 +128,19 @@ class View extends Component {
128
128
  cellCls = ['neo-table-cell'],
129
129
  colspan = record[me.colspanField],
130
130
  {dataField} = column,
131
+ {model} = me.store,
131
132
  fieldValue = record[dataField],
132
- hasStore = tableContainer.store?.model, // todo: remove as soon as all tables use stores (examples table)
133
+ hasStore = !!model, // todo: remove as soon as all tables use stores (examples table)
133
134
  {vdom} = me,
134
135
  cellConfig, rendererOutput;
135
136
 
137
+ if (!model?.getField(dataField)) {
138
+ let nsArray = dataField.split('.'),
139
+ fieldName = nsArray.pop();
140
+
141
+ fieldValue = Neo.ns(nsArray, false, record[Symbol.for('data')])?.[fieldName]
142
+ }
143
+
136
144
  if (fieldValue === null || fieldValue === undefined) {
137
145
  fieldValue = ''
138
146
  }
@@ -8,7 +8,8 @@ import RemoteMethodAccess from './mixin/RemoteMethodAccess.mjs';
8
8
  const NeoConfig = Neo.config,
9
9
  devMode = NeoConfig.environment === 'development';
10
10
 
11
- navigator.serviceWorker.addEventListener('controllerchange', function() {
11
+ // Using ?. since SWs do not exist for http (only https)
12
+ navigator.serviceWorker?.addEventListener('controllerchange', function() {
12
13
  window.location.reload()
13
14
  }, {once: true});
14
15