neo.mjs 4.4.2 → 4.4.3

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/list/Base.mjs +70 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "4.4.2",
3
+ "version": "4.4.3",
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
@@ -448,6 +476,25 @@ class Base extends Component {
448
476
  });
449
477
  }
450
478
 
479
+ /**
480
+ * Transforms an index excluding list item headers into the real store index
481
+ * @param {Number} headerlessIndex
482
+ * @returns {Number}
483
+ */
484
+ getActiveIndex(headerlessIndex) {
485
+ let delta = 0,
486
+ i = 0,
487
+ records = this.store.items;
488
+
489
+ for (; i <= headerlessIndex; i++) {
490
+ if (records[i].isHeader) {
491
+ delta++;
492
+ }
493
+ }
494
+
495
+ return headerlessIndex + delta;
496
+ }
497
+
451
498
  /**
452
499
  * @param {Number|String} recordId
453
500
  * @returns {String}
@@ -456,6 +503,28 @@ class Base extends Component {
456
503
  return `${this.id}__${recordId}`;
457
504
  }
458
505
 
506
+ /**
507
+ * Returns the index of a list item excluding item headers
508
+ * @param {Number} index
509
+ * @returns {Number}
510
+ */
511
+ getHeaderlessIndex(index) {
512
+ let headerlessIndex = 0,
513
+ i = 0,
514
+ records = this.store.items,
515
+ len = records.length;
516
+
517
+ for (; i < len; i++) {
518
+ if (!records[i].isHeader) {
519
+ headerlessIndex++;
520
+
521
+ if (headerlessIndex === index) {
522
+ return i;
523
+ }
524
+ }
525
+ }
526
+ }
527
+
459
528
  /**
460
529
  * @param {String} vnodeId
461
530
  * @returns {String|Number} itemId