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 +1 -1
- package/src/list/Base.mjs +82 -3
- package/src/selection/ListModel.mjs +1 -1
package/package.json
CHANGED
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
|
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
|
408
|
-
|
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
|