@refinitiv-ui/efx-grid 6.0.49 → 6.0.50
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/core/dist/core.js +183 -88
- package/lib/core/dist/core.min.js +1 -1
- package/lib/core/es6/data/DataView.d.ts +2 -0
- package/lib/core/es6/data/DataView.js +174 -82
- package/lib/core/es6/data/Segment.d.ts +2 -0
- package/lib/core/es6/data/Segment.js +6 -0
- package/lib/core/es6/grid/Core.js +2 -5
- package/lib/core/es6/grid/plugins/SortableTitlePlugin.js +1 -1
- package/lib/grid/index.js +1 -1
- package/lib/rt-grid/dist/rt-grid.js +354 -105
- package/lib/rt-grid/dist/rt-grid.min.js +1 -1
- package/lib/rt-grid/es6/Grid.js +15 -0
- package/lib/tr-grid-printer/es6/GridPrinter.js +5 -5
- package/lib/tr-grid-util/es6/CoralItems.js +2 -2
- package/lib/tr-grid-util/es6/ElfDate.js +1 -1
- package/lib/tr-grid-util/es6/ElfUtil.js +2 -2
- package/lib/tr-grid-util/es6/ExpanderIcon.js +1 -1
- package/lib/tr-grid-util/es6/GridPlugin.js +1 -1
- package/lib/tr-grid-util/es6/Icon.js +3 -3
- package/lib/tr-grid-util/es6/MultiTableManager.js +3 -3
- package/lib/tr-grid-util/es6/jet/MockQuotes2.js +5 -1
- package/lib/versions.json +2 -0
- package/package.json +1 -1
@@ -276,6 +276,8 @@ declare class DataView extends EventDispatcher {
|
|
276
276
|
|
277
277
|
public sortSegments(compare: ((...params: any[]) => any)|null): void;
|
278
278
|
|
279
|
+
public enableEmptySegmentFiltering(enabled?: boolean|null): void;
|
280
|
+
|
279
281
|
public setSegmentClassification(segmentRef: string|number|null, fields: string|(string)[]|null): boolean;
|
280
282
|
|
281
283
|
public getWrapSize(): number;
|
@@ -68,6 +68,8 @@ var DataView = function(source) {
|
|
68
68
|
t._onRefreshTimeout = t._onRefreshTimeout.bind(t);
|
69
69
|
t._updateWrapCount = t._updateWrapCount.bind(t);
|
70
70
|
|
71
|
+
t._byRemovalMap = t._byRemovalMap.bind(t);
|
72
|
+
|
71
73
|
t._rids = [];
|
72
74
|
t._sortingDefs = [];
|
73
75
|
t._columnStats = {};
|
@@ -121,6 +123,15 @@ DataView.prototype._hiddenRids = null;
|
|
121
123
|
* @type {Object.<string, boolean>}
|
122
124
|
*/
|
123
125
|
DataView.prototype._collapsedRids = null; // for segmentation
|
126
|
+
/** @private
|
127
|
+
* @type {Object.<string, number>}
|
128
|
+
*/
|
129
|
+
DataView.prototype._excludedRids = null;
|
130
|
+
/** @private
|
131
|
+
* @type {boolean}
|
132
|
+
*/
|
133
|
+
DataView.prototype._emptySegmentFiltering = false;
|
134
|
+
|
124
135
|
/** @private
|
125
136
|
* @type {Object.<string, number>}
|
126
137
|
*/
|
@@ -817,8 +828,6 @@ DataView.prototype.hideRow = function(rId, hidden) {
|
|
817
828
|
*/
|
818
829
|
DataView.prototype.hideRows = function(rowRefs, hidden) {
|
819
830
|
hidden = hidden !== false;
|
820
|
-
var dirty = false;
|
821
|
-
var rids = this._toRowIds(rowRefs);
|
822
831
|
var hiddenRids = this._hiddenRids;
|
823
832
|
|
824
833
|
if(hidden){
|
@@ -829,11 +838,19 @@ DataView.prototype.hideRows = function(rowRefs, hidden) {
|
|
829
838
|
return; // All rows are visible
|
830
839
|
}
|
831
840
|
|
841
|
+
var rids = this._toRowIds(rowRefs);
|
842
|
+
var dirty = false;
|
843
|
+
|
832
844
|
for(var i = rids.length; --i >= 0;) {
|
833
845
|
var rid = rids[i];
|
834
846
|
if(rid) { // undefined, null, and an empty string value are not a valid row id
|
835
|
-
if(
|
836
|
-
hiddenRids[rid]
|
847
|
+
if(hidden) {
|
848
|
+
if(!hiddenRids[rid]) {
|
849
|
+
hiddenRids[rid] = true;
|
850
|
+
dirty = true;
|
851
|
+
}
|
852
|
+
} else if(hiddenRids[rid]) {
|
853
|
+
delete hiddenRids[rid];
|
837
854
|
dirty = true;
|
838
855
|
}
|
839
856
|
}
|
@@ -842,11 +859,9 @@ DataView.prototype.hideRows = function(rowRefs, hidden) {
|
|
842
859
|
if(dirty) {
|
843
860
|
if(!hidden) {
|
844
861
|
var hasHiddenRow = false;
|
845
|
-
for(var key in hiddenRids) {
|
846
|
-
|
847
|
-
|
848
|
-
break;
|
849
|
-
}
|
862
|
+
for(var key in hiddenRids) { // eslint-disable-line
|
863
|
+
hasHiddenRow = true;
|
864
|
+
break;
|
850
865
|
}
|
851
866
|
if(!hasHiddenRow) {
|
852
867
|
hiddenRids = this._hiddenRids = null;
|
@@ -854,6 +869,7 @@ DataView.prototype.hideRows = function(rowRefs, hidden) {
|
|
854
869
|
}
|
855
870
|
this._refreshAndNotify(); // Very slow
|
856
871
|
}
|
872
|
+
|
857
873
|
};
|
858
874
|
/**
|
859
875
|
* Show/hide rows in the data view
|
@@ -935,23 +951,14 @@ DataView.prototype.filterOut = function(cid, value) {
|
|
935
951
|
*/
|
936
952
|
DataView.prototype.filterInOnce = function(cid, value, opt_filteringOut) {
|
937
953
|
var checker = this._getFilterLogic(cid, value);
|
938
|
-
if(!checker) { return; }
|
939
|
-
|
940
|
-
var filteringOut = (opt_filteringOut === true);
|
941
|
-
var rids = this._rids;
|
942
|
-
var dt = this._dt;
|
943
954
|
var removalMap = {};
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
removalMap[rid] = true;
|
951
|
-
++totalRem;
|
952
|
-
}
|
955
|
+
if(!this._getRemovalMap(
|
956
|
+
removalMap,
|
957
|
+
checker,
|
958
|
+
(opt_filteringOut === true)
|
959
|
+
)) {
|
960
|
+
return;
|
953
961
|
}
|
954
|
-
if(totalRem <= 0) { return; }
|
955
962
|
|
956
963
|
var firstChange = this._removeRowIds(removalMap);
|
957
964
|
|
@@ -974,13 +981,13 @@ DataView.prototype.filterOutOnce = function(cid, value) {
|
|
974
981
|
this.filterInOnce(cid, value, true);
|
975
982
|
};
|
976
983
|
/** @private
|
977
|
-
* @param {!Object
|
984
|
+
* @param {!Object} removalMap
|
978
985
|
* @return {number}
|
979
986
|
*/
|
980
987
|
DataView.prototype._removeRowIds = function(removalMap) {
|
981
|
-
var firstChange =
|
988
|
+
var firstChange = DataView._removeArrayItems(this._rids, removalMap);
|
982
989
|
if(this._groupView) {
|
983
|
-
firstChange =
|
990
|
+
firstChange = DataView._removeArrayItems(this._groupView, removalMap);
|
984
991
|
}
|
985
992
|
|
986
993
|
if(this._groupMembers) {
|
@@ -991,6 +998,7 @@ DataView.prototype._removeRowIds = function(removalMap) {
|
|
991
998
|
}
|
992
999
|
}
|
993
1000
|
return firstChange;
|
1001
|
+
|
994
1002
|
};
|
995
1003
|
/** @public
|
996
1004
|
* @fires DataView#pageCountChanged
|
@@ -2558,7 +2566,19 @@ DataView.prototype.sortSeparators = function (sortLogics, sortOrders, cids) {
|
|
2558
2566
|
DataView.prototype.sortSegments = function (compare) {
|
2559
2567
|
this._dt.sortSegments(compare);
|
2560
2568
|
};
|
2561
|
-
|
2569
|
+
/** Automatically hide empty segment when all of its member are filtered out. An empty segment will not be hidden, if there is no active filter. Collapsed segment does not count as filtering.
|
2570
|
+
* @public
|
2571
|
+
* @param {boolean=} enabled
|
2572
|
+
*/
|
2573
|
+
DataView.prototype.enableEmptySegmentFiltering = function (enabled) {
|
2574
|
+
enabled = enabled !== false;
|
2575
|
+
if(this._emptySegmentFiltering !== enabled) {
|
2576
|
+
this._emptySegmentFiltering = enabled;
|
2577
|
+
if(this._userFilter) {
|
2578
|
+
this._refreshAndNotify();
|
2579
|
+
}
|
2580
|
+
}
|
2581
|
+
};
|
2562
2582
|
/**
|
2563
2583
|
* @public
|
2564
2584
|
* @param {string|number} segmentRef Row id or row index
|
@@ -2718,26 +2738,35 @@ DataView.prototype._updateRowIds = function(opt_rowIds) {
|
|
2718
2738
|
// Perform the following sequences: parent view cloning >> row hiding >> row filtering >> row grouping >> sorting >> paging
|
2719
2739
|
this._rids = opt_rowIds || this._parent.getAllRowIds(); // Get all data ids
|
2720
2740
|
|
2721
|
-
|
2722
|
-
|
2723
|
-
}
|
2741
|
+
this._dispatch("beforeFiltering", {});
|
2742
|
+
|
2743
|
+
this._excludedRids = {};
|
2744
|
+
var exclusionCount = 0;
|
2745
|
+
exclusionCount += DataView._copyObjectKeys(this._excludedRids, this._hiddenRids);
|
2746
|
+
|
2747
|
+
// Segment separators should not be filtered out (hidden)
|
2724
2748
|
var segments = this._dt._getSegmentSeparators();
|
2749
|
+
var filterExceptions = segments ? segments.getSegments() : null;
|
2750
|
+
var userRemoval = this._getRemovalMap(this._excludedRids, this._userFilter, this._filteringOut, filterExceptions);
|
2751
|
+
exclusionCount += userRemoval;
|
2752
|
+
|
2725
2753
|
this._collapsedRids = null;
|
2726
|
-
var filterExceptions = null;
|
2727
2754
|
if(segments) {
|
2728
|
-
|
2729
|
-
|
2730
|
-
if(collapsedRows) {
|
2731
|
-
this._removeArrayItems(this._rids, collapsedRows);
|
2755
|
+
if(userRemoval && this._emptySegmentFiltering) {
|
2756
|
+
exclusionCount += this._getEmptySegments(this._excludedRids, filterExceptions);
|
2732
2757
|
}
|
2758
|
+
this._collapsedRids = segments.getCollapsedRows();
|
2759
|
+
// Children of collapsed segments must be filtered out (hidden)
|
2760
|
+
exclusionCount += DataView._copyObjectKeys(this._excludedRids, this._collapsedRids);
|
2733
2761
|
}
|
2734
2762
|
|
2735
|
-
this.
|
2736
|
-
|
2737
|
-
|
2738
|
-
if(
|
2739
|
-
this.
|
2763
|
+
if(this._groupLevel > 0 && !opt_rowIds) { // WARNING: The line below is quite slow
|
2764
|
+
exclusionCount += this._getRemovalMap(this._excludedRids, this._groupFilterLogic, false); // Filter In
|
2765
|
+
}
|
2766
|
+
if(exclusionCount) {
|
2767
|
+
this._rids = this._rids.filter(this._byRemovalMap);
|
2740
2768
|
}
|
2769
|
+
this._excludedRids = null;
|
2741
2770
|
|
2742
2771
|
if(this._groupMembers) { // Has grouping
|
2743
2772
|
this._populateGroups(); // View will be properly re-populate inside _populateGroups()
|
@@ -3009,9 +3038,9 @@ DataView.prototype._onRowUpdated = function(e) { // onUpdate
|
|
3009
3038
|
|
3010
3039
|
if(this._groupLevel > 0) {
|
3011
3040
|
if(processingFlag === 1) { // The row is moved to the other group
|
3012
|
-
if(
|
3041
|
+
if(DataView._removeArrayItem(this._rids, rid) >= 0) {
|
3013
3042
|
if(this._groupView) {
|
3014
|
-
|
3043
|
+
DataView._removeArrayItem(this._groupView, rid);
|
3015
3044
|
}
|
3016
3045
|
}
|
3017
3046
|
if(this._shared.multiGroupRow) {
|
@@ -3211,34 +3240,31 @@ DataView.prototype._getRowIndex = function(rids, opt_nextRid, opt_fallback) {
|
|
3211
3240
|
* @returns {number}
|
3212
3241
|
*/
|
3213
3242
|
DataView.prototype._removeDataRow = function(rid) {
|
3214
|
-
var at =
|
3243
|
+
var at = DataView._removeArrayItem(this._rids, rid);
|
3215
3244
|
if(this._groupView && at >= 0) {
|
3216
|
-
at =
|
3245
|
+
at = DataView._removeArrayItem(this._groupView, rid);
|
3217
3246
|
}
|
3218
3247
|
return at;
|
3219
3248
|
};
|
3220
3249
|
/** @private
|
3221
|
-
* @param {Array} ary
|
3250
|
+
* @param {!Array} ary
|
3222
3251
|
* @param {*} item
|
3223
3252
|
* @return {number} Index of the removed item
|
3224
3253
|
*/
|
3225
|
-
DataView.
|
3226
|
-
var
|
3227
|
-
|
3228
|
-
|
3229
|
-
ary.splice(i, 1);
|
3230
|
-
return i;
|
3231
|
-
}
|
3254
|
+
DataView._removeArrayItem = function(ary, item) {
|
3255
|
+
var at = ary.indexOf(item);
|
3256
|
+
if(at >= 0) {
|
3257
|
+
ary.splice(at, 1);
|
3232
3258
|
}
|
3233
|
-
return
|
3259
|
+
return at;
|
3234
3260
|
};
|
3235
3261
|
/** Remove multiple array items
|
3236
3262
|
* @private
|
3237
3263
|
* @param {Array.<string>} ary
|
3238
|
-
* @param {Object
|
3264
|
+
* @param {Object} items
|
3239
3265
|
* @return {number} First item index that is being removed. NaN if no item is removed
|
3240
3266
|
*/
|
3241
|
-
DataView.
|
3267
|
+
DataView._removeArrayItems = function(ary, items) {
|
3242
3268
|
var f = NaN;
|
3243
3269
|
var c = 0;
|
3244
3270
|
for(var i = ary.length; --i >= 0;) {
|
@@ -3256,6 +3282,24 @@ DataView.prototype._removeArrayItems = function(ary, items) {
|
|
3256
3282
|
}
|
3257
3283
|
return f;
|
3258
3284
|
};
|
3285
|
+
/** @private
|
3286
|
+
* @param {Object} baseObj
|
3287
|
+
* @param {Object} masterObj
|
3288
|
+
* @returns {number}
|
3289
|
+
*/
|
3290
|
+
DataView._copyObjectKeys = function(baseObj, masterObj) {
|
3291
|
+
if(masterObj) {
|
3292
|
+
var count = 0;
|
3293
|
+
|
3294
|
+
for(var key in masterObj) {
|
3295
|
+
baseObj[key] = 1;
|
3296
|
+
++count; // WARNING: duplicated key can be counted more than once
|
3297
|
+
}
|
3298
|
+
return count;
|
3299
|
+
}
|
3300
|
+
return 0;
|
3301
|
+
};
|
3302
|
+
|
3259
3303
|
/** @private
|
3260
3304
|
* @param {string|null} rid
|
3261
3305
|
* @param {Object} rowData
|
@@ -3290,9 +3334,6 @@ DataView.prototype.isRowFiltered = function(rid, rowData) {
|
|
3290
3334
|
return true;
|
3291
3335
|
}
|
3292
3336
|
}
|
3293
|
-
if(this.isSegmentSeparator(rid)) {
|
3294
|
-
return false; // Segment separator cannot be filtered
|
3295
|
-
}
|
3296
3337
|
if(this._collapsedRids) {
|
3297
3338
|
if(this._collapsedRids[rid]) {
|
3298
3339
|
return true;
|
@@ -3334,41 +3375,92 @@ DataView.prototype._sort = function() {
|
|
3334
3375
|
};
|
3335
3376
|
|
3336
3377
|
/** @private
|
3378
|
+
* @param {string} rid
|
3379
|
+
* @returns {boolean}
|
3380
|
+
*/
|
3381
|
+
DataView.prototype._byRemovalMap = function(rid) {
|
3382
|
+
return !this._excludedRids[rid];
|
3383
|
+
};
|
3384
|
+
/** @private
|
3385
|
+
* @param {Object} removalMap
|
3337
3386
|
* @param {Function} checker
|
3338
3387
|
* @param {boolean} filteringOut
|
3339
3388
|
* @param {Object=} exceptions
|
3389
|
+
* @returns {number} Number of rids that would be filtered out
|
3340
3390
|
*/
|
3341
|
-
DataView.prototype.
|
3391
|
+
DataView.prototype._getRemovalMap = function(removalMap, checker, filteringOut, exceptions) {
|
3342
3392
|
if(!checker) {
|
3343
|
-
return;
|
3393
|
+
return 0;
|
3344
3394
|
}
|
3345
3395
|
|
3346
3396
|
var rids = this._rids; // Make local variable to speed up the process
|
3347
|
-
var len = rids.length;
|
3348
3397
|
var dt = this._dt;
|
3349
|
-
var
|
3350
|
-
|
3351
|
-
|
3352
|
-
|
3353
|
-
|
3354
|
-
|
3398
|
+
var count = 0;
|
3399
|
+
var rid, i, values;
|
3400
|
+
var len = rids.length;
|
3401
|
+
|
3402
|
+
if(exceptions) {
|
3403
|
+
for(i = len; --i >= 0;) {
|
3404
|
+
rid = rids[i];
|
3405
|
+
if(!exceptions[rid]) {
|
3406
|
+
values = dt.getRowData(rid);
|
3407
|
+
if (values) {
|
3408
|
+
if(checker(rid, values) === filteringOut) {
|
3409
|
+
removalMap[rid] = 1;
|
3410
|
+
++count;
|
3411
|
+
}
|
3412
|
+
} else {
|
3413
|
+
removalMap[rid] = 1;
|
3414
|
+
++count;
|
3415
|
+
}
|
3416
|
+
}
|
3417
|
+
}
|
3418
|
+
} else {
|
3419
|
+
for(i = len; --i >= 0;) {
|
3420
|
+
rid = rids[i];
|
3421
|
+
values = dt.getRowData(rid);
|
3355
3422
|
if (values) {
|
3356
|
-
|
3423
|
+
if(checker(rid, values) === filteringOut) {
|
3424
|
+
removalMap[rid] = 1;
|
3425
|
+
++count;
|
3426
|
+
}
|
3357
3427
|
} else {
|
3358
|
-
|
3428
|
+
removalMap[rid] = 1;
|
3429
|
+
++count;
|
3359
3430
|
}
|
3360
3431
|
}
|
3361
|
-
if(removed) {
|
3362
|
-
++spliceCount;
|
3363
|
-
} else if(spliceCount > 0) {
|
3364
|
-
rids.splice(i + 1, spliceCount);
|
3365
|
-
spliceCount = 0;
|
3366
|
-
}
|
3367
3432
|
}
|
3368
|
-
|
3369
|
-
|
3433
|
+
return count;
|
3434
|
+
};
|
3435
|
+
/** @private
|
3436
|
+
* @param {Object} removalMap
|
3437
|
+
* @param {Object} segmentRids
|
3438
|
+
* @returns {number} Number of rids that would be filtered out
|
3439
|
+
*/
|
3440
|
+
DataView.prototype._getEmptySegments = function(removalMap, segmentRids) {
|
3441
|
+
var segments = this._dt._getSegmentSeparators();
|
3442
|
+
var count = 0;
|
3443
|
+
for(var segmentId in segmentRids) {
|
3444
|
+
var segment = segments.getSegment(segmentId);
|
3445
|
+
if(segment) {
|
3446
|
+
var chdr = segment.getChildren();
|
3447
|
+
var emptySegment = true;
|
3448
|
+
for(var childId in chdr) {
|
3449
|
+
if(!removalMap[childId]) {
|
3450
|
+
emptySegment = false;
|
3451
|
+
break;
|
3452
|
+
}
|
3453
|
+
}
|
3454
|
+
if(emptySegment) {
|
3455
|
+
removalMap[segmentId] = 1;
|
3456
|
+
++count;
|
3457
|
+
}
|
3458
|
+
}
|
3370
3459
|
}
|
3460
|
+
|
3461
|
+
return count;
|
3371
3462
|
};
|
3463
|
+
|
3372
3464
|
/** @private
|
3373
3465
|
* @param {string|Function|undefined} cid
|
3374
3466
|
* @param {*} value
|
@@ -3647,13 +3739,13 @@ DataView.prototype._removeGroupMember = function (groupIndex, groupId) {
|
|
3647
3739
|
};
|
3648
3740
|
/** @private
|
3649
3741
|
* @param {string} cid
|
3650
|
-
* @param {Object
|
3742
|
+
* @param {Object} values
|
3651
3743
|
* @return {Array.<string>}
|
3652
3744
|
*/
|
3653
3745
|
DataView.prototype._defaultGroupCriteria = function(cid, values) {
|
3654
3746
|
var val = values[cid];
|
3655
3747
|
if(Array.isArray(val)) {
|
3656
|
-
return val.map(function(data) {
|
3748
|
+
return val.map(function(data) { // TODO: this is very slow
|
3657
3749
|
return data + "";
|
3658
3750
|
});
|
3659
3751
|
} else {
|
@@ -3662,11 +3754,11 @@ DataView.prototype._defaultGroupCriteria = function(cid, values) {
|
|
3662
3754
|
};
|
3663
3755
|
/** @private
|
3664
3756
|
* @param {string|null} rid
|
3665
|
-
* @param {Object
|
3757
|
+
* @param {Object} values
|
3666
3758
|
* @return {boolean}
|
3667
3759
|
*/
|
3668
3760
|
DataView.prototype._groupFilterLogic = function(rid, values) {
|
3669
|
-
var gids = this._groupCriteria[this._groupLevel - 1](values);
|
3761
|
+
var gids = this._groupCriteria[this._groupLevel - 1](values); // TODO: this is very slow
|
3670
3762
|
return gids.indexOf(this._groupId) >= 0;
|
3671
3763
|
};
|
3672
3764
|
|
@@ -292,6 +292,12 @@ Segment.prototype.getChildIds = function() {
|
|
292
292
|
return this._childCount ? Object.keys(this._children) : [];
|
293
293
|
};
|
294
294
|
/** @public
|
295
|
+
* @return {!Object}
|
296
|
+
*/
|
297
|
+
Segment.prototype.getChildren = function() {
|
298
|
+
return this._children;
|
299
|
+
};
|
300
|
+
/** @public
|
295
301
|
* @return {number}
|
296
302
|
*/
|
297
303
|
Segment.prototype.getChildCount = function() {
|
@@ -562,7 +562,7 @@ Core.prototype._batches = null;
|
|
562
562
|
* @return {string}
|
563
563
|
*/
|
564
564
|
Core.getVersion = function () {
|
565
|
-
return "5.1.
|
565
|
+
return "5.1.69";
|
566
566
|
};
|
567
567
|
/** {@link ElementWrapper#dispose}
|
568
568
|
* @override
|
@@ -4956,13 +4956,10 @@ Core.prototype._onSectionDataChanged = function (e) {
|
|
4956
4956
|
for (var r = fromR; r < toR; ++r) {
|
4957
4957
|
if(hasDataView) {
|
4958
4958
|
var rowData = rowDataCollection[r];
|
4959
|
-
if(!rowData) { // This is a header row
|
4960
|
-
continue;
|
4961
|
-
}
|
4962
4959
|
|
4963
4960
|
e["rowData"] = rowData;
|
4964
4961
|
e["rowId"] = rids[r];
|
4965
|
-
e["dataValue"] = rowData[cid];
|
4962
|
+
e["dataValue"] = rowData ? rowData[cid] : null;
|
4966
4963
|
}
|
4967
4964
|
e["rowIndex"] = r;
|
4968
4965
|
e["cell"] = section["getCell"](c, r, false); // Accessing cell by using bracket allows extenal object to mock Section
|
package/lib/grid/index.js
CHANGED