neo.mjs 4.4.2 → 4.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "4.4.2",
3
+ "version": "4.4.4",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
package/src/list/Base.mjs CHANGED
@@ -57,6 +57,12 @@ class Base extends Component {
57
57
  * @member {Object} dragZoneConfig=null
58
58
  */
59
59
  dragZoneConfig: null,
60
+ /**
61
+ * In case we are using list item headers and want to bind list item indexes to e.g. a card layout
62
+ * for e.g. a sidenav, this config comes in handy.
63
+ * @member {Number|null} headerlessActiveIndex_=null
64
+ */
65
+ headerlessActiveIndex_: null,
60
66
  /**
61
67
  * @member {Boolean} highlightFilterValue=true
62
68
  */
@@ -147,12 +153,15 @@ class Base extends Component {
147
153
  * @protected
148
154
  */
149
155
  afterSetActiveIndex(value, oldValue) {
150
- let selectionModel = this.selectionModel;
156
+ let me = this,
157
+ selectionModel = me.selectionModel;
151
158
 
152
159
  if (Neo.isNumber(value)) {
153
160
  selectionModel?.selectAt(value);
161
+ me.headerlessActiveIndex = me.getHeaderlessIndex(value);
154
162
  } else if (Neo.isNumber(oldValue)) {
155
163
  selectionModel.deselectAll();
164
+ me.headerlessActiveIndex = null;
156
165
  }
157
166
  }
158
167
 
@@ -209,6 +218,25 @@ class Base extends Component {
209
218
  }
210
219
  }
211
220
 
221
+ /**
222
+ * Triggered after the headerlessActiveIndex config got changed
223
+ * @param {Number} value
224
+ * @param {Number} oldValue
225
+ * @protected
226
+ */
227
+ afterSetHeaderlessActiveIndex(value, oldValue) {
228
+ let me = this,
229
+ activeIndex;
230
+
231
+ if (Neo.isNumber(value)) {
232
+ activeIndex = me.getActiveIndex(value);
233
+
234
+ me.activeIndex = activeIndex;
235
+ } else if (Neo.isNumber(oldValue)) {
236
+ me.activeIndex = null;
237
+ }
238
+ }
239
+
212
240
  /**
213
241
  * Triggered after the selectionModel config got changed
214
242
  * @param {Neo.selection.Model} value
@@ -404,10 +432,17 @@ class Base extends Component {
404
432
  * @param {Boolean} [silent=false]
405
433
  */
406
434
  createItems(silent=false) {
407
- let me = this,
408
- vdom = me.getVdomRoot(),
435
+ let me = this,
436
+ headerlessActiveIndex = me.headerlessActiveIndex,
437
+ vdom = me.getVdomRoot(),
409
438
  listItem;
410
439
 
440
+ // in case we set headerlessActiveIndex before the store was loaded, activeIndex can be null
441
+ // and the wanted selection is not initially there
442
+ if (Neo.isNumber(headerlessActiveIndex) && !Neo.isNumber(me.activeIndex)) {
443
+ me.afterSetHeaderlessActiveIndex(headerlessActiveIndex, null);
444
+ }
445
+
411
446
  if (!(me.animate && !me.getPlugin('animate'))) {
412
447
  vdom.cn = [];
413
448
 
@@ -448,6 +483,31 @@ class Base extends Component {
448
483
  });
449
484
  }
450
485
 
486
+ /**
487
+ * Transforms an index excluding list item headers into the real store index
488
+ * @param {Number} headerlessIndex
489
+ * @returns {Number}
490
+ */
491
+ getActiveIndex(headerlessIndex) {
492
+ let delta = 0,
493
+ i = 0,
494
+ records = this.store.items,
495
+ len = headerlessIndex;
496
+
497
+ if (records.length < 1) {
498
+ return null;
499
+ }
500
+
501
+ for (; i <= len; i++) {
502
+ if (records[i].isHeader) {
503
+ delta++;
504
+ len++;
505
+ }
506
+ }
507
+
508
+ return headerlessIndex + delta;
509
+ }
510
+
451
511
  /**
452
512
  * @param {Number|String} recordId
453
513
  * @returns {String}
@@ -456,6 +516,25 @@ class Base extends Component {
456
516
  return `${this.id}__${recordId}`;
457
517
  }
458
518
 
519
+ /**
520
+ * Returns the index of a list item excluding item headers
521
+ * @param {Number} index
522
+ * @returns {Number}
523
+ */
524
+ getHeaderlessIndex(index) {
525
+ let headerlessIndex = 0,
526
+ i = 0,
527
+ records = this.store.items;
528
+
529
+ for (; i < index; i++) {
530
+ if (!records[i].isHeader) {
531
+ headerlessIndex++;
532
+ }
533
+ }
534
+
535
+ return headerlessIndex;
536
+ }
537
+
459
538
  /**
460
539
  * @param {String} vnodeId
461
540
  * @returns {String|Number} itemId
@@ -147,7 +147,7 @@ class ListModel extends Model {
147
147
  */
148
148
  selectAt(index) {
149
149
  let view = this.view,
150
- recordKey = view.store.getKeyAt(index),
150
+ recordKey = view?.store.getKeyAt(index),
151
151
  itemId = recordKey && view.getItemId(recordKey);
152
152
 
153
153
  if (itemId) {