neo.mjs 8.40.0 → 8.41.1

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.40.0'
23
+ * @member {String} version='8.41.1'
24
24
  */
25
- version: '8.40.0'
25
+ version: '8.41.1'
26
26
  }
27
27
 
28
28
  /**
@@ -42,6 +42,7 @@ class Table extends Container {
42
42
  minWidth : 40,
43
43
  text : '#',
44
44
  renderer : Util.indexRenderer,
45
+ sortable : false,
45
46
  width : 40
46
47
  }, {
47
48
  cellAlign : 'left',
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-04-05",
19
+ "datePublished": "2025-04-08",
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.40.0'
110
+ html : 'v8.41.1'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -42,6 +42,7 @@ class Table extends Container {
42
42
  minWidth : 40,
43
43
  text : '#',
44
44
  renderer : Util.indexRenderer,
45
+ sortable : false,
45
46
  width : 40
46
47
  }, {
47
48
  cellAlign : 'left',
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.40.0'
23
+ * @member {String} version='8.41.1'
24
24
  */
25
- version: '8.40.0'
25
+ version: '8.41.1'
26
26
  }
27
27
 
28
28
  /**
@@ -1,5 +1,4 @@
1
1
  import ComponentController from '../../../src/controller/Component.mjs';
2
- import NeoArray from '../../../src/util/Array.mjs';
3
2
 
4
3
  /**
5
4
  * @class Neo.examples.calendar.basic.MainContainerController
@@ -22,7 +21,7 @@ class MainContainerController extends ComponentController {
22
21
  button = data.component,
23
22
  component = me.component,
24
23
  headerToolbar = me.getReference('headerToolbar'),
25
- buttonText, cls, headerColor, iconCls, style, theme;
24
+ buttonText, headerColor, iconCls, style, theme;
26
25
 
27
26
  if (button.text === 'Theme Light') {
28
27
  buttonText = 'Theme Dark';
@@ -36,16 +35,7 @@ class MainContainerController extends ComponentController {
36
35
  theme = 'neo-theme-dark'
37
36
  }
38
37
 
39
- cls = [...component.cls];
40
-
41
- component.cls.forEach(item => {
42
- if (item.includes('neo-theme')) {
43
- NeoArray.remove(cls, item)
44
- }
45
- });
46
-
47
- NeoArray.add(cls, theme);
48
- component.cls = cls;
38
+ component.theme = theme;
49
39
 
50
40
  button.set({
51
41
  iconCls,
@@ -37,6 +37,7 @@ class TableContainer extends BaseTableContainer {
37
37
  minWidth : 40,
38
38
  text : '#',
39
39
  renderer : Util.indexRenderer,
40
+ sortable : false,
40
41
  width : 40
41
42
  }, {
42
43
  cellAlign : 'left',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.40.0",
3
+ "version": "8.41.1",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -57,7 +57,7 @@
57
57
  "fs-extra": "^11.3.0",
58
58
  "highlightjs-line-numbers.js": "^2.9.0",
59
59
  "inquirer": "^12.5.2",
60
- "marked": "^15.0.7",
60
+ "marked": "^15.0.8",
61
61
  "monaco-editor": "0.50.0",
62
62
  "neo-jsdoc": "1.0.1",
63
63
  "neo-jsdoc-x": "1.0.5",
@@ -65,7 +65,7 @@
65
65
  "sass": "^1.86.3",
66
66
  "siesta-lite": "5.5.2",
67
67
  "url": "^0.11.4",
68
- "webpack": "^5.98.0",
68
+ "webpack": "^5.99.3",
69
69
  "webpack-cli": "^6.0.1",
70
70
  "webpack-dev-server": "^5.2.1",
71
71
  "webpack-hook-plugin": "^1.0.7",
@@ -263,12 +263,12 @@ const DefaultConfig = {
263
263
  useVdomWorker: true,
264
264
  /**
265
265
  * buildScripts/injectPackageVersion.mjs will update this value
266
- * @default '8.40.0'
266
+ * @default '8.41.1'
267
267
  * @memberOf! module:Neo
268
268
  * @name config.version
269
269
  * @type String
270
270
  */
271
- version: '8.40.0'
271
+ version: '8.41.1'
272
272
  };
273
273
 
274
274
  Object.assign(DefaultConfig, {
@@ -289,6 +289,26 @@ class MainContainer extends Container {
289
289
  }
290
290
  }
291
291
 
292
+ /**
293
+ * Triggered after the theme config got changed
294
+ * @param {String} value
295
+ * @param {String} oldValue
296
+ * @protected
297
+ */
298
+ afterSetTheme(value, oldValue) {
299
+ super.afterSetTheme(value, oldValue);
300
+
301
+ let me = this;
302
+
303
+ if (me._editCalendarContainer) {
304
+ me._editCalendarContainer.theme = value
305
+ }
306
+
307
+ if (me._editEventContainer) {
308
+ me._editEventContainer.theme = value
309
+ }
310
+ }
311
+
292
312
  /**
293
313
  * Triggered after the useSettingsContainer config got changed
294
314
  * @param {Boolean} value
@@ -330,6 +350,7 @@ class MainContainer extends Container {
330
350
  appName : me.appName,
331
351
  owner : me,
332
352
  stateProvider: {parent: me.getStateProvider()},
353
+ theme : me.theme,
333
354
  width : 250,
334
355
  windowId : me.windowId,
335
356
  ...me.editCalendarContainerConfig
@@ -353,6 +374,7 @@ class MainContainer extends Container {
353
374
  appName : me.appName,
354
375
  owner : me,
355
376
  stateProvider: {parent: me.getStateProvider()},
377
+ theme : me.theme,
356
378
  width : 250,
357
379
  windowId : me.windowId,
358
380
  ...me.editEventContainerConfig
@@ -448,7 +470,7 @@ class MainContainer extends Container {
448
470
  appName : me.appName,
449
471
  flex : 'none',
450
472
  height : me.sideBarWidth,
451
- listeners: {change: me.onDateSelectorChange, scope: me},
473
+ listeners: {dateChange: me.onDateSelectorChange, scope: me},
452
474
  parentId : me.id, // we need the parentId to access the model inside the ctor
453
475
  value : null,
454
476
 
@@ -599,8 +621,8 @@ class MainContainer extends Container {
599
621
  * @param {String} data.oldValue
600
622
  * @param {String} data.value
601
623
  */
602
- onDateSelectorChange(data) {
603
- data.oldValue !== undefined && this.setState('currentDate', new Date(`${data.value}T00:00:00.000Z`))
624
+ onDateSelectorChange({value}) {
625
+ this.setState('currentDate', value)
604
626
  }
605
627
 
606
628
  /**
@@ -225,7 +225,7 @@ class EventDragZone extends DragZone {
225
225
  endDate = me.newEndDate;
226
226
  startDate = me.newStartDate || record.startDate
227
227
  } else {
228
- startDate = new Date(VDomUtil.find(owner.vdom, me.proxyParentId).vdom.flag + 'T00:00:00.000Z');
228
+ startDate = new Date(VDomUtil.find(owner.vdom, me.proxyParentId).vdom.flag + 'T12:00:00.000Z');
229
229
  startDate.setHours(me.axisStartTime);
230
230
  startDate.setMinutes(me.currentInterval * me.intervalSize);
231
231
 
@@ -188,7 +188,7 @@ class DragDrop extends Base {
188
188
  intervalHeight = columnRect.height / intervals,
189
189
  position = Math.min(columnRect.height, data.clientY - columnRect.top),
190
190
  currentInterval = Math.floor(position / intervalHeight),
191
- startDate = new Date(VDomUtil.find(owner.vdom, data.path[0].id).vdom.flag + 'T00:00:00.000Z'),
191
+ startDate = new Date(VDomUtil.find(owner.vdom, data.path[0].id).vdom.flag + 'T12:00:00.000Z'),
192
192
  dragElement, endDate, eventDragZone, eventId, record;
193
193
 
194
194
  me.isDragging = true;
@@ -1582,11 +1582,11 @@ class Component extends Base {
1582
1582
  me.isVdomUpdating = false;
1583
1583
  reject?.()
1584
1584
  }).then(data => {
1585
- me.isVdomUpdating = false;
1586
-
1587
- // checking if the component got destroyed before the update cycle is done
1585
+ // Checking if the component got destroyed before the update cycle is done
1588
1586
  if (me.id) {
1589
- me.vnode = data.vnode;
1587
+ // It is crucial to delegate the vnode tree before resolving the cycle
1588
+ me.vnode = data.vnode;
1589
+ me.isVdomUpdating = false;
1590
1590
 
1591
1591
  deltas = data.deltas;
1592
1592
 
@@ -199,6 +199,14 @@ class DateSelector extends Component {
199
199
  me.updateHeaderYear(0, true);
200
200
  me.recreateDayViewContent(false, false)
201
201
  }
202
+
203
+ if (oldValue !== undefined) {
204
+ me.fire('dateChange', {
205
+ component: me,
206
+ oldValue,
207
+ value
208
+ })
209
+ }
202
210
  }
203
211
 
204
212
  /**
@@ -221,7 +229,7 @@ class DateSelector extends Component {
221
229
  if (value === false) {
222
230
  let me = this;
223
231
 
224
- if (me.cachedUpdate && me.cachedUpdate !== new Date(`${me.value}T00:00:00.000Z`)) {
232
+ if (me.cachedUpdate && me.cachedUpdate !== new Date(`${me.value}T12:00:00.000Z`)) {
225
233
  me.afterSetValue(me.value, DateUtil.convertToyyyymmdd(me.cachedUpdate))
226
234
  }
227
235
 
@@ -347,7 +355,7 @@ class DateSelector extends Component {
347
355
 
348
356
  if (value) {
349
357
  if (!me.isUpdating) {
350
- me.currentDate = new Date(`${value}T00:00:00.000Z`);
358
+ me.currentDate = new Date(`${value}T12:00:00.000Z`);
351
359
 
352
360
  me.fire('change', {
353
361
  component: me,
@@ -608,9 +616,9 @@ class DateSelector extends Component {
608
616
  currentMonth = currentDate.getMonth(),
609
617
  currentYear = currentDate.getFullYear(),
610
618
  date = me.currentDate, // cloned
611
- maxDate = me.maxValue && new Date(`${me.maxValue}T00:00:00.000Z`),
612
- minDate = me.minValue && new Date(`${me.minValue}T00:00:00.000Z`),
613
- valueDate = new Date(`${me.value}T00:00:00.000Z`),
619
+ maxDate = me.maxValue && new Date(`${me.maxValue}T12:00:00.000Z`),
620
+ minDate = me.minValue && new Date(`${me.minValue}T12:00:00.000Z`),
621
+ valueDate = new Date(`${me.value}T12:00:00.000Z`),
614
622
  valueMonth = valueDate.getMonth(),
615
623
  valueYear = valueDate.getFullYear(),
616
624
  daysInMonth = DateUtil.getDaysInMonth(currentDate),
@@ -303,7 +303,7 @@ class Container extends Component {
303
303
  createItem(item, index) {
304
304
  let me = this,
305
305
  config = {appName: me.appName, parentId: me.id, parentIndex: index, windowId: me.windowId},
306
- defaults = {...me.itemDefaults},
306
+ defaults = {theme: me.theme, ...me.itemDefaults},
307
307
  lazyLoadItem, module;
308
308
 
309
309
  if (defaults) {
@@ -132,9 +132,9 @@ class DayViewComponent extends Base {
132
132
  currentMonth = currentDate.getMonth(),
133
133
  currentYear = currentDate.getFullYear(),
134
134
  date = me.currentDate, // cloned
135
- maxDate = me.maxValue && new Date(`${me.maxValue}T00:00:00.000Z`),
136
- minDate = me.minValue && new Date(`${me.minValue}T00:00:00.000Z`),
137
- valueDate = new Date(`${me.value}T00:00:00.000Z`),
135
+ maxDate = me.maxValue && new Date(`${me.maxValue}T12:00:00.000Z`),
136
+ minDate = me.minValue && new Date(`${me.minValue}T12:00:00.000Z`),
137
+ valueDate = new Date(`${me.value}T12:00:00.000Z`),
138
138
  valueMonth = valueDate.getMonth(),
139
139
  valueYear = valueDate.getFullYear(),
140
140
  daysInMonth = DateUtil.getDaysInMonth(currentDate),
@@ -233,7 +233,7 @@ class SelectorContainer extends Container {
233
233
 
234
234
  if (value) {
235
235
  if (!me.isUpdating) {
236
- me.currentDate = new Date(`${value}T00:00:00.000Z`);
236
+ me.currentDate = new Date(`${value}T12:00:00.000Z`);
237
237
 
238
238
  me.fire('change', {
239
239
  component: me,
@@ -256,7 +256,7 @@ class SortZone extends DragZone {
256
256
  indexMap : indexMap,
257
257
  ownerStyle : {height: ownerStyle.height, width: ownerStyle.width},
258
258
  reversedLayoutDirection: layout.direction === 'column-reverse' || layout.direction === 'row-reverse',
259
- sortDirection : layout.direction.includes('row') ? 'horizontal' : 'vertical',
259
+ sortDirection : layout.direction?.includes('column') ? 'vertical' : 'horizontal',
260
260
  startIndex : index
261
261
  });
262
262
 
@@ -409,7 +409,7 @@ class Container extends BaseContainer {
409
409
  fields.forEach(field => {
410
410
  validField = field.validate?.(false);
411
411
 
412
- if (!validField) {
412
+ if (validField === false) {
413
413
  isValid = false
414
414
  }
415
415
  });
@@ -34,7 +34,7 @@ class Field extends Component {
34
34
  */
35
35
  formGroup_: null,
36
36
  /**
37
- * @member {String|null} keys={}
37
+ * @member {Object|null} keys={}
38
38
  */
39
39
  keys: {},
40
40
  /**
@@ -194,7 +194,7 @@ class DateField extends Picker {
194
194
  let value = this.value;
195
195
 
196
196
  if(this.submitDateObject && value) {
197
- return new Date(`${value}T00:00:00.000Z`);
197
+ return new Date(`${value}T12:00:00.000Z`);
198
198
  } else if(this.isoDate && value) {
199
199
  return new Date(value).toISOString();
200
200
  }
@@ -83,6 +83,7 @@ class Component extends Column {
83
83
  }
84
84
 
85
85
  componentConfig = me.applyRecordConfigs(componentConfig, record);
86
+ componentConfig = {...componentConfig};
86
87
 
87
88
  if (component) {
88
89
  delete componentConfig.className;
@@ -155,6 +155,12 @@ class Toolbar extends BaseToolbar {
155
155
 
156
156
  me.itemDefaults.showHeaderFilter = me.showHeaderFilters;
157
157
 
158
+ me.items.forEach(item => {
159
+ if (!Object.hasOwn(item, 'sortable')) {
160
+ item.sortable = me.sortable
161
+ }
162
+ });
163
+
158
164
  super.createItems();
159
165
 
160
166
  let {items} = me,
@@ -170,7 +176,6 @@ class Toolbar extends BaseToolbar {
170
176
  if (item.minWidth) {style.minWidth = item.minWidth + 'px'}
171
177
  if (item.width) {style.width = item.width + 'px'}
172
178
 
173
- item.sortable = me.sortable;
174
179
  item.wrapperStyle = style
175
180
  });
176
181
 
@@ -128,6 +128,12 @@ class Toolbar extends BaseToolbar {
128
128
 
129
129
  me.itemDefaults.showHeaderFilter = me.showHeaderFilters;
130
130
 
131
+ me.items.forEach(item => {
132
+ if (!Object.hasOwn(item, 'sortable')) {
133
+ item.sortable = me.sortable
134
+ }
135
+ });
136
+
131
137
  super.createItems();
132
138
 
133
139
  let dockLeftWidth = 0,
@@ -156,7 +162,6 @@ class Toolbar extends BaseToolbar {
156
162
  item.vdom.cls = [] // remove the button cls from the th tag
157
163
  }
158
164
 
159
- item.sortable = me.sortable;
160
165
  item.wrapperStyle = style;
161
166
 
162
167
  // inverse loop direction
@@ -1,2 +0,0 @@
1
- # Development in progress
2
- Currently, scheduled for the v4.x release