@refinitiv-ui/efx-grid 6.0.153 → 6.0.155
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/lib/core/dist/core.js +158 -59
- package/lib/core/dist/core.min.js +1 -1
- package/lib/core/es6/data/DataTable.d.ts +2 -2
- package/lib/core/es6/data/DataTable.js +48 -55
- package/lib/core/es6/data/DataView.d.ts +1 -1
- package/lib/core/es6/data/DataView.js +14 -2
- package/lib/core/es6/data/Segment.d.ts +4 -0
- package/lib/core/es6/data/Segment.js +78 -1
- package/lib/core/es6/data/SegmentCollection.d.ts +2 -0
- package/lib/core/es6/data/SegmentCollection.js +17 -0
- package/lib/core/es6/grid/Core.js +1 -1
- package/lib/grid/index.js +1 -1
- package/lib/rt-grid/dist/rt-grid.js +669 -349
- package/lib/rt-grid/dist/rt-grid.min.js +1 -1
- package/lib/rt-grid/es6/Grid.js +9 -8
- package/lib/types/es6/Core/data/DataTable.d.ts +2 -2
- package/lib/types/es6/Core/data/DataView.d.ts +1 -1
- package/lib/types/es6/Core/data/Segment.d.ts +4 -0
- package/lib/types/es6/Core/data/SegmentCollection.d.ts +2 -0
- package/package.json +1 -1
@@ -9145,7 +9145,7 @@ DataCache.constructTable = function (dataset, opt_options, opt_rowIds) {
|
|
9145
9145
|
*/
|
9146
9146
|
let Segment = function(rid, sharedObj) {
|
9147
9147
|
this._rid = rid;
|
9148
|
-
this.
|
9148
|
+
this._childIds = [];
|
9149
9149
|
this._shared = sharedObj;
|
9150
9150
|
if(sharedObj.defaultCollapsing) {
|
9151
9151
|
this._collapsed = true;
|
@@ -9176,14 +9176,6 @@ Segment._subSegSortLogic = function(a, b) {
|
|
9176
9176
|
|
9177
9177
|
return 0;
|
9178
9178
|
};
|
9179
|
-
/** @private
|
9180
|
-
* @function
|
9181
|
-
* @param {Segment} segment
|
9182
|
-
* @param {number} idx
|
9183
|
-
*/
|
9184
|
-
Segment._assignSubSegmentOrder = function(segment, idx) {
|
9185
|
-
segment.setOrder(idx + 1);
|
9186
|
-
};
|
9187
9179
|
|
9188
9180
|
/** @type {Object}
|
9189
9181
|
* @private
|
@@ -9194,14 +9186,14 @@ Segment.prototype._shared = null;
|
|
9194
9186
|
* @private
|
9195
9187
|
*/
|
9196
9188
|
Segment.prototype._rid;
|
9197
|
-
/** @type {!
|
9189
|
+
/** @type {!Array.<string>}
|
9198
9190
|
* @private
|
9199
9191
|
*/
|
9200
|
-
Segment.prototype.
|
9201
|
-
/** @type {
|
9192
|
+
Segment.prototype._childIds;
|
9193
|
+
/** @type {Object}
|
9202
9194
|
* @private
|
9203
9195
|
*/
|
9204
|
-
Segment.prototype.
|
9196
|
+
Segment.prototype._childDataIds = null;
|
9205
9197
|
/** @type {boolean}
|
9206
9198
|
* @private
|
9207
9199
|
*/
|
@@ -9210,6 +9202,14 @@ Segment.prototype._collapsed = false;
|
|
9210
9202
|
* @private
|
9211
9203
|
*/
|
9212
9204
|
Segment.prototype._order = 0;
|
9205
|
+
/** @type {number}
|
9206
|
+
* @private
|
9207
|
+
*/
|
9208
|
+
Segment.prototype._offsetOrder = 0;
|
9209
|
+
/** @type {number}
|
9210
|
+
* @private
|
9211
|
+
*/
|
9212
|
+
Segment.prototype._depth = 0;
|
9213
9213
|
/** @type {boolean}
|
9214
9214
|
* @private
|
9215
9215
|
*/
|
@@ -9219,10 +9219,10 @@ Segment.prototype._disposed = false;
|
|
9219
9219
|
* @private
|
9220
9220
|
*/
|
9221
9221
|
Segment.prototype._subSegDef = null;
|
9222
|
-
/** @type {
|
9222
|
+
/** @type {boolean}
|
9223
9223
|
* @private
|
9224
9224
|
*/
|
9225
|
-
Segment.prototype.
|
9225
|
+
Segment.prototype._subSegment = false; // This indicates that the segment is autogenerated (subsegment)
|
9226
9226
|
/** @type {Object.<string, Segment>}
|
9227
9227
|
* @private
|
9228
9228
|
*/
|
@@ -9230,7 +9230,7 @@ Segment.prototype._subSegMap = null; // For immediate sub-segment children
|
|
9230
9230
|
/** @type {Array.<string>}
|
9231
9231
|
* @private
|
9232
9232
|
*/
|
9233
|
-
Segment.prototype._subSegNames = null; // For immediate sub-segment child names
|
9233
|
+
Segment.prototype._subSegNames = null; // For immediate sub-segment child names/ids
|
9234
9234
|
/** @type {string}
|
9235
9235
|
* @private
|
9236
9236
|
*/
|
@@ -9239,10 +9239,6 @@ Segment.prototype._subSegName = "";
|
|
9239
9239
|
* @private
|
9240
9240
|
*/
|
9241
9241
|
Segment.prototype._subSegVal;
|
9242
|
-
/** @type {Segment}
|
9243
|
-
* @private
|
9244
|
-
*/
|
9245
|
-
Segment.prototype._subSegParent = null;
|
9246
9242
|
|
9247
9243
|
|
9248
9244
|
/** @public
|
@@ -9264,14 +9260,13 @@ Segment.prototype.dispose = function() {
|
|
9264
9260
|
this._subSegMap = this._subSegNames = null;
|
9265
9261
|
}
|
9266
9262
|
if(this._collapsed) {
|
9267
|
-
|
9268
|
-
this._shared.dirtyCollapsingState = true;
|
9269
|
-
}
|
9263
|
+
this.markCollapsingStateDirty();
|
9270
9264
|
}
|
9271
9265
|
|
9272
|
-
this.
|
9266
|
+
this._childDataIds = null;
|
9267
|
+
this._childIds.length = 0;
|
9273
9268
|
this._shared = null;
|
9274
|
-
this.
|
9269
|
+
this._subSegDef = this._subSegVal = null;
|
9275
9270
|
};
|
9276
9271
|
/** @public
|
9277
9272
|
* @return {string}
|
@@ -9283,10 +9278,17 @@ Segment.prototype.getId = function() {
|
|
9283
9278
|
* @return {string}
|
9284
9279
|
*/
|
9285
9280
|
Segment.prototype.getParentId = function() {
|
9286
|
-
|
9287
|
-
|
9281
|
+
return this._shared.childToSegment[this._rid] || "";
|
9282
|
+
};
|
9283
|
+
/** @public
|
9284
|
+
* @return {Segment}
|
9285
|
+
*/
|
9286
|
+
Segment.prototype.getParent = function() {
|
9287
|
+
let parentId = this.getParentId();
|
9288
|
+
if(parentId) {
|
9289
|
+
return this._shared.segments[parentId] || null;
|
9288
9290
|
}
|
9289
|
-
return
|
9291
|
+
return null;
|
9290
9292
|
};
|
9291
9293
|
/** @public
|
9292
9294
|
* @param {Array.<string>=} out_ary
|
@@ -9314,21 +9316,43 @@ Segment.prototype.getSubSegmentIds = function(out_ary) {
|
|
9314
9316
|
/** @public
|
9315
9317
|
* @param {string} rid
|
9316
9318
|
* @param {string=} dataId Row id for retrieving data
|
9317
|
-
* @return {boolean}
|
9319
|
+
* @return {boolean} Returns true only a new child is added
|
9318
9320
|
*/
|
9319
9321
|
Segment.prototype.addChild = function(rid, dataId) {
|
9320
|
-
if(rid) {
|
9322
|
+
if(!rid) {
|
9323
|
+
return false;
|
9324
|
+
}
|
9325
|
+
let prevSegmentId = this._shared.childToSegment[rid];
|
9326
|
+
if(prevSegmentId) {
|
9327
|
+
if(prevSegmentId !== this._rid) {
|
9328
|
+
let prevSegment = this._shared.segments[prevSegmentId];
|
9329
|
+
if(prevSegment && !prevSegment.hasSubSegments()) { // Children of a classified segment always stick the root segment
|
9330
|
+
prevSegment.removeChild(rid);
|
9331
|
+
}
|
9332
|
+
this._shared.childToSegment[rid] = this._rid;
|
9333
|
+
}
|
9334
|
+
} else {
|
9321
9335
|
this._shared.childToSegment[rid] = this._rid;
|
9322
|
-
|
9323
|
-
|
9324
|
-
|
9325
|
-
|
9326
|
-
|
9336
|
+
}
|
9337
|
+
|
9338
|
+
if(dataId != null) { // Update data id
|
9339
|
+
if(dataId && dataId !== rid) {
|
9340
|
+
if(!this._childDataIds) {
|
9341
|
+
this._childDataIds = {};
|
9327
9342
|
}
|
9328
|
-
this.
|
9329
|
-
|
9330
|
-
|
9343
|
+
this._childDataIds[rid] = dataId;
|
9344
|
+
} else if(this._childDataIds) {
|
9345
|
+
delete this._childDataIds[rid];
|
9346
|
+
}
|
9347
|
+
}
|
9348
|
+
|
9349
|
+
let at = this._childIds.indexOf(rid);
|
9350
|
+
if(at < 0) {
|
9351
|
+
if(this._collapsed) {
|
9352
|
+
this._shared.dirtyCollapsingState = true; // TODO: Check if we need to update this only when new child is added
|
9331
9353
|
}
|
9354
|
+
this._childIds.push(rid);
|
9355
|
+
return true;
|
9332
9356
|
}
|
9333
9357
|
return false;
|
9334
9358
|
};
|
@@ -9338,8 +9362,15 @@ Segment.prototype.addChild = function(rid, dataId) {
|
|
9338
9362
|
* @return {boolean}
|
9339
9363
|
*/
|
9340
9364
|
Segment.prototype.addChildren = function(rids, dataIds) {
|
9365
|
+
if(!rids) {
|
9366
|
+
return false;
|
9367
|
+
}
|
9341
9368
|
let rowIds = Array.isArray(rids) ? rids : [rids];
|
9342
9369
|
let rowCount = rowIds.length;
|
9370
|
+
if(!rowCount) {
|
9371
|
+
return false;
|
9372
|
+
}
|
9373
|
+
|
9343
9374
|
let dirty = 0;
|
9344
9375
|
let i;
|
9345
9376
|
if(dataIds != null) {
|
@@ -9359,27 +9390,35 @@ Segment.prototype.addChildren = function(rids, dataIds) {
|
|
9359
9390
|
* @return {boolean}
|
9360
9391
|
*/
|
9361
9392
|
Segment.prototype.containsChild = function(rid) {
|
9362
|
-
return this.
|
9393
|
+
return this._childIds.indexOf(rid) >= 0;
|
9394
|
+
};
|
9395
|
+
/** @public
|
9396
|
+
* @param {string} rid
|
9397
|
+
* @return {number}
|
9398
|
+
*/
|
9399
|
+
Segment.prototype.getChildIndex = function(rid) {
|
9400
|
+
return this._childIds.indexOf(rid);
|
9363
9401
|
};
|
9364
9402
|
/** @public
|
9365
9403
|
* @param {string} rid
|
9366
9404
|
* @return {boolean}
|
9367
9405
|
*/
|
9368
9406
|
Segment.prototype.removeChild = function(rid) {
|
9369
|
-
if(this.
|
9407
|
+
if(this._subSegment) {
|
9370
9408
|
return false; // Sub segments are not allowed to remove its children
|
9371
9409
|
}
|
9372
|
-
if(!this.
|
9410
|
+
if(!this._childIds.length) {
|
9373
9411
|
return false;
|
9374
9412
|
}
|
9375
|
-
|
9413
|
+
let at = this._childIds.indexOf(rid);
|
9414
|
+
if(at < 0) {
|
9376
9415
|
return false; // The specified rid is not a child of this segment
|
9377
9416
|
}
|
9378
9417
|
|
9379
|
-
|
9380
|
-
|
9381
|
-
|
9382
|
-
|
9418
|
+
if(this._shared.childToSegment[rid] === this._rid) {
|
9419
|
+
delete this._shared.childToSegment[rid];
|
9420
|
+
}
|
9421
|
+
this._childIds.splice(at, 1); // Slow
|
9383
9422
|
|
9384
9423
|
if(this._collapsed) {
|
9385
9424
|
this._shared.dirtyCollapsingState = true;
|
@@ -9391,10 +9430,10 @@ Segment.prototype.removeChild = function(rid) {
|
|
9391
9430
|
* @return {boolean}
|
9392
9431
|
*/
|
9393
9432
|
Segment.prototype.removeChildren = function(rids) {
|
9394
|
-
if(this.
|
9433
|
+
if(this._subSegment) {
|
9395
9434
|
return false; // Sub segments are not allowed to remove its children
|
9396
9435
|
}
|
9397
|
-
if(!this.
|
9436
|
+
if(!this._childIds.length) {
|
9398
9437
|
return false;
|
9399
9438
|
}
|
9400
9439
|
let rowIds = Array.isArray(rids) ? rids : [rids];
|
@@ -9409,21 +9448,24 @@ Segment.prototype.removeChildren = function(rids) {
|
|
9409
9448
|
* @return {boolean}
|
9410
9449
|
*/
|
9411
9450
|
Segment.prototype.removeAllChildren = function() {
|
9412
|
-
if(this.
|
9451
|
+
if(this._subSegment) {
|
9413
9452
|
return false; // Sub segments are not allowed to remove its children
|
9414
9453
|
}
|
9415
|
-
|
9454
|
+
let childCount = this._childIds.length;
|
9455
|
+
if(!this._childIds.length) {
|
9416
9456
|
return false;
|
9417
9457
|
}
|
9458
|
+
let segmentId = this._rid;
|
9418
9459
|
let objMap = this._shared.childToSegment;
|
9419
|
-
let chdr = this.
|
9420
|
-
for(let
|
9421
|
-
|
9422
|
-
|
9460
|
+
let chdr = this._childIds;
|
9461
|
+
for(let i = 0; i < childCount; ++i) {
|
9462
|
+
let rid = chdr[i];
|
9463
|
+
if(objMap[rid] === segmentId) {
|
9464
|
+
delete objMap[rid];
|
9423
9465
|
}
|
9424
9466
|
}
|
9425
|
-
this.
|
9426
|
-
this.
|
9467
|
+
this._childIds.length = 0;
|
9468
|
+
this._childDataIds = null;
|
9427
9469
|
|
9428
9470
|
if(this._collapsed) {
|
9429
9471
|
this._shared.dirtyCollapsingState = true;
|
@@ -9434,24 +9476,41 @@ Segment.prototype.removeAllChildren = function() {
|
|
9434
9476
|
* @return {!Array.<string>}
|
9435
9477
|
*/
|
9436
9478
|
Segment.prototype.getChildIds = function() {
|
9437
|
-
return this.
|
9479
|
+
return this._childIds; // WARNING: Returns private members
|
9438
9480
|
};
|
9439
9481
|
/** @public
|
9440
9482
|
* @return {!Object}
|
9441
9483
|
*/
|
9442
9484
|
Segment.prototype.getChildren = function() {
|
9443
|
-
|
9485
|
+
let obj = {};
|
9486
|
+
let chdr = this._childIds;
|
9487
|
+
let childCount = chdr.length;
|
9488
|
+
let dataIds = this._childDataIds || {};
|
9489
|
+
for(let i = 0; i < childCount; ++i) {
|
9490
|
+
let rid = chdr[i];
|
9491
|
+
obj[rid] = dataIds[rid] || rid;
|
9492
|
+
}
|
9493
|
+
return obj;
|
9444
9494
|
};
|
9445
9495
|
/** @public
|
9446
9496
|
* @return {number}
|
9447
9497
|
*/
|
9448
9498
|
Segment.prototype.getChildCount = function() {
|
9449
|
-
return this.
|
9499
|
+
return this._childIds.length;
|
9500
|
+
};
|
9501
|
+
/** When a segment is not empty, the visibility of its content need to be updated.
|
9502
|
+
* @public
|
9503
|
+
*/
|
9504
|
+
Segment.prototype.markCollapsingStateDirty = function() {
|
9505
|
+
// A segment can have a child and/or autogenerated segment (subsegment) to not be considered as empty.
|
9506
|
+
if(this._childIds.length || this._subSegDef) {
|
9507
|
+
this._shared.dirtyCollapsingState = true;
|
9508
|
+
}
|
9450
9509
|
};
|
9451
9510
|
|
9452
9511
|
|
9453
9512
|
/** @public
|
9454
|
-
* @return {Array.<string>}
|
9513
|
+
* @return {Array.<string>}
|
9455
9514
|
*/
|
9456
9515
|
Segment.prototype.getClassification = function() {
|
9457
9516
|
if(this._subSegDef) {
|
@@ -9464,8 +9523,8 @@ Segment.prototype.getClassification = function() {
|
|
9464
9523
|
* @return {boolean}
|
9465
9524
|
*/
|
9466
9525
|
Segment.prototype.setClassification = function(fields) {
|
9467
|
-
if(this.
|
9468
|
-
return false; //
|
9526
|
+
if(this._subSegment) {
|
9527
|
+
return false; // subsegment cannot be classified
|
9469
9528
|
}
|
9470
9529
|
let classifiers = null;
|
9471
9530
|
if(this._subSegDef) {
|
@@ -9508,9 +9567,8 @@ Segment.prototype.setClassification = function(fields) {
|
|
9508
9567
|
return true;
|
9509
9568
|
} else if(classifiers) { // Remove existing ones
|
9510
9569
|
this._subSegDef.classifiers = null;
|
9511
|
-
this._subSegDef.subSegments = null;
|
9512
9570
|
// this._subSegDef.classifierChanged = true;
|
9513
|
-
this._subSegDef = null; // WARNING: All
|
9571
|
+
this._subSegDef = null; // WARNING: All subsegments remain existing
|
9514
9572
|
return true;
|
9515
9573
|
}
|
9516
9574
|
return false;
|
@@ -9527,7 +9585,7 @@ Segment.prototype.classify = function(rows) {
|
|
9527
9585
|
let segmentCount = segmentNames ? segmentNames.length : 0;
|
9528
9586
|
|
9529
9587
|
if(!segmentCount) {
|
9530
|
-
if(this.
|
9588
|
+
if(this._depth >= classifierCount) {
|
9531
9589
|
return false; // Current segment level is beyond existing classification level and this segment should already be removed
|
9532
9590
|
}
|
9533
9591
|
}
|
@@ -9537,7 +9595,7 @@ Segment.prototype.classify = function(rows) {
|
|
9537
9595
|
sharedObj.dirtyCollapsingState = true;
|
9538
9596
|
}
|
9539
9597
|
|
9540
|
-
// Prepare existing
|
9598
|
+
// Prepare existing subsegments for checking change in its members
|
9541
9599
|
let i;
|
9542
9600
|
let segmentName = "";
|
9543
9601
|
let nonExistenceGroups = {};
|
@@ -9551,9 +9609,8 @@ Segment.prototype.classify = function(rows) {
|
|
9551
9609
|
nonExistenceGroups[segmentName] = 1;
|
9552
9610
|
|
9553
9611
|
segment = segmentMap[segmentName];
|
9554
|
-
if(segment.
|
9555
|
-
segment.
|
9556
|
-
segment._childCount = 0;
|
9612
|
+
if(segment._childIds.length) { // Quick cleaning up
|
9613
|
+
segment._childIds.length = 0;
|
9557
9614
|
}
|
9558
9615
|
if(segment._collapsed) {
|
9559
9616
|
sharedObj.dirtyCollapsingState = true;
|
@@ -9561,20 +9618,23 @@ Segment.prototype.classify = function(rows) {
|
|
9561
9618
|
}
|
9562
9619
|
}
|
9563
9620
|
|
9564
|
-
// Loop through row children and assign them to their corresponding
|
9565
|
-
let
|
9621
|
+
// Loop through row children and assign them to their corresponding subsegment
|
9622
|
+
let rootSegment = !this._subSegment;
|
9623
|
+
let dataIds = this._childDataIds || {};
|
9566
9624
|
let rid;
|
9567
|
-
let
|
9568
|
-
|
9625
|
+
let chdr = this._childIds;
|
9626
|
+
let childCount = chdr.length;
|
9627
|
+
if(this._depth < classifierCount && rows) {
|
9569
9628
|
if(!segmentMap) {
|
9570
9629
|
segmentMap = this._subSegMap = {};
|
9571
9630
|
segmentNames = this._subSegNames = [];
|
9572
9631
|
}
|
9573
9632
|
|
9574
|
-
let classifier = classifiers[this.
|
9633
|
+
let classifier = classifiers[this._depth];
|
9575
9634
|
|
9576
|
-
for(
|
9577
|
-
|
9635
|
+
for(i = 0; i < childCount; ++i) {
|
9636
|
+
rid = chdr[i];
|
9637
|
+
let dataId = dataIds[rid] || rid;
|
9578
9638
|
let record = rows[dataId];
|
9579
9639
|
let val = record ? record[classifier] : null; // WARNING: row could already be removed
|
9580
9640
|
|
@@ -9591,31 +9651,34 @@ Segment.prototype.classify = function(rows) {
|
|
9591
9651
|
|
9592
9652
|
segment = segmentMap[segmentName];
|
9593
9653
|
if(!segment) { // New group is detected
|
9594
|
-
|
9654
|
+
let subSegId = this._rid + "/" + segmentName;
|
9655
|
+
segment = new Segment(subSegId, sharedObj);
|
9595
9656
|
segment._subSegDef = this._subSegDef;
|
9596
|
-
segment.
|
9657
|
+
segment._subSegment = true; // this indicates that the segment is autogenerated (subsegment)
|
9658
|
+
segment._depth = this._depth + 1;
|
9597
9659
|
segment._subSegName = segmentName;
|
9598
9660
|
segment._subSegVal = val;
|
9599
|
-
|
9661
|
+
sharedObj.childToSegment[subSegId] = this._rid; // WARNING: this will mix autogenerated rows with actual rows
|
9600
9662
|
|
9601
9663
|
segmentMap[segmentName] = segment;
|
9602
9664
|
segmentNames.push(segmentName);
|
9603
9665
|
|
9604
9666
|
this._dispatch("subSegmentAdded", {
|
9605
|
-
"rid":
|
9667
|
+
"rid": subSegId,
|
9606
9668
|
"segment": segment
|
9607
9669
|
});
|
9608
9670
|
}
|
9609
9671
|
|
9610
9672
|
segment.addChild(rid, dataId);
|
9611
9673
|
}
|
9612
|
-
} else if(
|
9613
|
-
for(
|
9674
|
+
} else if(rootSegment) { // In case of no classification
|
9675
|
+
for(i = 0; i < childCount; ++i) {
|
9676
|
+
rid = chdr[i];
|
9614
9677
|
sharedObj.childToSegment[rid] = this._rid; // Relocate child in case of it has been moved to a non existence group
|
9615
9678
|
}
|
9616
9679
|
}
|
9617
9680
|
|
9618
|
-
// Remove all
|
9681
|
+
// Remove all subsegments with no members
|
9619
9682
|
if(removalCount > 0) {
|
9620
9683
|
if(removalCount >= segmentNames.length) {
|
9621
9684
|
segmentNames.length = 0;
|
@@ -9643,7 +9706,7 @@ Segment.prototype.classify = function(rows) {
|
|
9643
9706
|
}
|
9644
9707
|
}
|
9645
9708
|
|
9646
|
-
// Sort and classify existing
|
9709
|
+
// Sort and classify existing subsegments
|
9647
9710
|
segmentCount = segmentNames ? segmentNames.length : 0;
|
9648
9711
|
if(segmentCount) {
|
9649
9712
|
segmentNames.sort(Segment._subSegSortLogic);
|
@@ -9653,22 +9716,17 @@ Segment.prototype.classify = function(rows) {
|
|
9653
9716
|
}
|
9654
9717
|
}
|
9655
9718
|
|
9656
|
-
// Collecting all
|
9657
|
-
if(
|
9658
|
-
if(
|
9659
|
-
|
9660
|
-
let subSegments = this._subSegDef.subSegments = [];
|
9661
|
-
this.getAllSubSegments(subSegments);
|
9662
|
-
subSegments.forEach(Segment._assignSubSegmentOrder);
|
9663
|
-
} else {
|
9664
|
-
this._subSegDef.subSegments = null;
|
9665
|
-
}
|
9666
|
-
// this._subSegDef.classifierChanged = false;
|
9719
|
+
// Collecting all subsegments including all descendants and reassigning segment order.
|
9720
|
+
if(rootSegment && this._subSegDef) {
|
9721
|
+
if(segmentCount) {
|
9722
|
+
this.calcSubSegmentOrder(0);
|
9667
9723
|
}
|
9724
|
+
// this._subSegDef.classifierChanged = false;
|
9668
9725
|
}
|
9669
9726
|
return true;
|
9670
9727
|
};
|
9671
|
-
/**
|
9728
|
+
/** SubSegment implies being classified
|
9729
|
+
* @public
|
9672
9730
|
* @return {boolean}
|
9673
9731
|
*/
|
9674
9732
|
Segment.prototype.hasSubSegments = function() {
|
@@ -9677,21 +9735,37 @@ Segment.prototype.hasSubSegments = function() {
|
|
9677
9735
|
}
|
9678
9736
|
return false;
|
9679
9737
|
};
|
9680
|
-
/**
|
9738
|
+
/** SubSegment implies autogenerated segment
|
9739
|
+
* @public
|
9681
9740
|
* @return {boolean}
|
9682
9741
|
*/
|
9683
9742
|
Segment.prototype.isSubSegment = function() {
|
9684
|
-
return this.
|
9743
|
+
return this._subSegment;
|
9744
|
+
};
|
9745
|
+
/** @public
|
9746
|
+
* @return {boolean}
|
9747
|
+
*/
|
9748
|
+
Segment.prototype.isRootSegment = function() {
|
9749
|
+
return this._shared.childToSegment[this._rid] ? false : true;
|
9685
9750
|
};
|
9686
9751
|
/** @public
|
9687
9752
|
* @return {Segment}
|
9688
9753
|
*/
|
9689
9754
|
Segment.prototype.getFirstAncestor = function() {
|
9690
|
-
|
9691
|
-
|
9692
|
-
|
9755
|
+
let ancestor = null;
|
9756
|
+
if(this._subSegment && this._subSegDef) { // Quick way to get root
|
9757
|
+
ancestor = this._subSegDef.root;
|
9758
|
+
} else { // Slow
|
9759
|
+
ancestor = this.getParent();
|
9760
|
+
if(ancestor) {
|
9761
|
+
let parentSeg = ancestor.getParent();
|
9762
|
+
while(parentSeg) { // This could cause infinite loop
|
9763
|
+
ancestor = parentSeg;
|
9764
|
+
parentSeg = ancestor.getParent();
|
9765
|
+
}
|
9766
|
+
}
|
9693
9767
|
}
|
9694
|
-
return null;
|
9768
|
+
return ancestor || null;
|
9695
9769
|
};
|
9696
9770
|
/** @public
|
9697
9771
|
* @param {Array.<Segment>=} out_ary
|
@@ -9713,13 +9787,75 @@ Segment.prototype.getAllSubSegments = function(out_ary) {
|
|
9713
9787
|
}
|
9714
9788
|
return out_ary || null;
|
9715
9789
|
};
|
9790
|
+
/** This method sets order, last order, and depth to entire tree structure in the segment, including the segment itself
|
9791
|
+
* @public
|
9792
|
+
* @param {number} counter
|
9793
|
+
* @return {number}
|
9794
|
+
*/
|
9795
|
+
Segment.prototype.updateTreeStructure = function(counter) {
|
9796
|
+
if(!counter) {
|
9797
|
+
counter = 0;
|
9798
|
+
if(!this._subSegment) { // Subsegment's depth cannot be reset back to 0
|
9799
|
+
this._depth = 0; // WARNING: this assumes counter at 0 is the root segment
|
9800
|
+
}
|
9801
|
+
}
|
9802
|
+
if(this.hasSubSegments()) {
|
9803
|
+
return this.setLastOrder(counter); // Sub segments has already been calculated
|
9804
|
+
}
|
9805
|
+
let segmentSeparators = this._shared.segments;
|
9806
|
+
let childCount = this._childIds.length;
|
9807
|
+
let prevSeg = null;
|
9808
|
+
for(let i = 0; i < childCount; ++i) {
|
9809
|
+
let rid = this._childIds[i];
|
9810
|
+
let segment = segmentSeparators[rid];
|
9811
|
+
let segmentId = (segment) ? segment.getId() : "Uncategorized";
|
9812
|
+
if(prevSeg !== segmentId) {
|
9813
|
+
++counter; // 0 become 1
|
9814
|
+
prevSeg = segmentId;
|
9815
|
+
}
|
9816
|
+
if(segment) {
|
9817
|
+
segment._depth = this._depth + 1;
|
9818
|
+
segment.setOrder(counter);
|
9819
|
+
counter = segment.updateTreeStructure(counter);
|
9820
|
+
}
|
9821
|
+
}
|
9822
|
+
|
9823
|
+
return this.setLastOrder(counter);
|
9824
|
+
};
|
9825
|
+
/** @public
|
9826
|
+
* @param {number} counter
|
9827
|
+
* @return {number}
|
9828
|
+
*/
|
9829
|
+
Segment.prototype.calcSubSegmentOrder = function(counter) {
|
9830
|
+
if(!this.hasSubSegments()) {
|
9831
|
+
return this.setLastOrder(counter);
|
9832
|
+
}
|
9833
|
+
|
9834
|
+
let segmentMap = this._subSegMap;
|
9835
|
+
let childCount = this._subSegNames.length;
|
9836
|
+
let prevSeg = null;
|
9837
|
+
for(let i = 0; i < childCount; ++i) {
|
9838
|
+
let segmentName = this._subSegNames[i];
|
9839
|
+
let segment = segmentMap[segmentName];
|
9840
|
+
let segmentId = (segment) ? segment.getId() : "Uncategorized";
|
9841
|
+
if(prevSeg !== segmentId) {
|
9842
|
+
++counter; // 0 become 1
|
9843
|
+
prevSeg = segmentId;
|
9844
|
+
}
|
9845
|
+
if(segment) {
|
9846
|
+
segment.setOrder(counter);
|
9847
|
+
counter = segment.calcSubSegmentOrder(counter);
|
9848
|
+
}
|
9849
|
+
}
|
9850
|
+
return this.setLastOrder(counter);
|
9851
|
+
};
|
9716
9852
|
/** @public
|
9717
9853
|
* @return {number}
|
9718
9854
|
*/
|
9719
9855
|
Segment.prototype.getSegmentLevel = function() {
|
9720
|
-
return this.
|
9856
|
+
return this._depth;
|
9721
9857
|
};
|
9722
|
-
/** This method will be called on
|
9858
|
+
/** This method will be called on subsegments only
|
9723
9859
|
* @public
|
9724
9860
|
* @param {Object=} rows
|
9725
9861
|
* @param {Object=} clsSource
|
@@ -9744,7 +9880,7 @@ Segment.prototype.setRowData = function(rows, clsSource) {
|
|
9744
9880
|
let segment = this;
|
9745
9881
|
while(segment && segment.isSubSegment()) {
|
9746
9882
|
segment.getSubSegmentName(row);
|
9747
|
-
segment = segment.
|
9883
|
+
segment = segment.getParent();
|
9748
9884
|
}
|
9749
9885
|
};
|
9750
9886
|
/** @public
|
@@ -9752,15 +9888,92 @@ Segment.prototype.setRowData = function(rows, clsSource) {
|
|
9752
9888
|
* @return {string}
|
9753
9889
|
*/
|
9754
9890
|
Segment.prototype.getSubSegmentName = function(row) {
|
9755
|
-
if(row && this.
|
9891
|
+
if(row && this._subSegment) {
|
9756
9892
|
let classifiers = this.getClassification();
|
9757
|
-
let field = classifiers[this.
|
9893
|
+
let field = classifiers[this._depth - 1];
|
9758
9894
|
if(field) {
|
9759
9895
|
row[field] = this._subSegName;
|
9760
9896
|
}
|
9761
9897
|
}
|
9762
9898
|
return this._subSegName;
|
9763
9899
|
};
|
9900
|
+
/**
|
9901
|
+
* @private
|
9902
|
+
* @param {!Segment} segment
|
9903
|
+
* @returns {string}
|
9904
|
+
*/
|
9905
|
+
let _toSegmentId = function(segment) {
|
9906
|
+
return segment.getId();
|
9907
|
+
};
|
9908
|
+
/**
|
9909
|
+
* @public
|
9910
|
+
* @param {!Function} comparer
|
9911
|
+
* @returns {boolean} Returns true if there is any change
|
9912
|
+
*/
|
9913
|
+
Segment.prototype.sortSegments = function(comparer) {
|
9914
|
+
if(!comparer || this.hasSubSegments()) {
|
9915
|
+
return false;
|
9916
|
+
}
|
9917
|
+
|
9918
|
+
let segmentList = [];
|
9919
|
+
let rids = [];
|
9920
|
+
let childIds = this._childIds;
|
9921
|
+
let childCount = childIds.length;
|
9922
|
+
let segments = this._shared.segments;
|
9923
|
+
for(let i = 0; i < childCount; ++i) {
|
9924
|
+
let childId = childIds[i];
|
9925
|
+
let childSegment = segments[childId];
|
9926
|
+
if(childSegment) {
|
9927
|
+
segmentList.push(childSegment);
|
9928
|
+
} else {
|
9929
|
+
rids.push(childId);
|
9930
|
+
}
|
9931
|
+
}
|
9932
|
+
if(segmentList.length < 2) {
|
9933
|
+
return false;
|
9934
|
+
}
|
9935
|
+
segmentList.sort(comparer);
|
9936
|
+
this._childIds = rids.concat(segmentList.map(_toSegmentId));
|
9937
|
+
return true;
|
9938
|
+
};
|
9939
|
+
/** Get segment id and ids of children, including nested segments, but excluding sub segments
|
9940
|
+
* @public
|
9941
|
+
* @param {Array.<string>} ary
|
9942
|
+
* @return {!Array.<string>}
|
9943
|
+
*/
|
9944
|
+
Segment.prototype.getFlattenTreeIds = function(ary) {
|
9945
|
+
if(!ary) {
|
9946
|
+
ary = [];
|
9947
|
+
}
|
9948
|
+
|
9949
|
+
if(!this._subSegment) { // Sub segments are excluded from tree
|
9950
|
+
ary.push(this._rid);
|
9951
|
+
}
|
9952
|
+
let i;
|
9953
|
+
let segmentNames = this._subSegNames;
|
9954
|
+
if(segmentNames) { // Classified segment
|
9955
|
+
let segmentCount = segmentNames.length;
|
9956
|
+
let segmentMap = this._subSegMap;
|
9957
|
+
for(i = 0; i < segmentCount; ++i) {
|
9958
|
+
segmentMap[segmentNames[i]].getFlattenTreeIds(ary);
|
9959
|
+
}
|
9960
|
+
} else {
|
9961
|
+
let childIds = this._childIds;
|
9962
|
+
let childCount = childIds.length;
|
9963
|
+
let segments = this._shared.segments;
|
9964
|
+
for(i = 0; i < childCount; ++i) {
|
9965
|
+
let childId = childIds[i];
|
9966
|
+
let childSegment = segments[childId];
|
9967
|
+
if(childSegment) {
|
9968
|
+
childSegment.getFlattenTreeIds(ary);
|
9969
|
+
} else {
|
9970
|
+
ary.push(childId);
|
9971
|
+
}
|
9972
|
+
}
|
9973
|
+
}
|
9974
|
+
|
9975
|
+
return ary;
|
9976
|
+
};
|
9764
9977
|
|
9765
9978
|
/** @public
|
9766
9979
|
* @param {boolean=} bool
|
@@ -9770,9 +9983,7 @@ Segment.prototype.collapse = function(bool) {
|
|
9770
9983
|
bool = (bool !== false);
|
9771
9984
|
if(this._collapsed !== bool) {
|
9772
9985
|
this._collapsed = bool;
|
9773
|
-
|
9774
|
-
this._shared.dirtyCollapsingState = true;
|
9775
|
-
}
|
9986
|
+
this.markCollapsingStateDirty();
|
9776
9987
|
return true;
|
9777
9988
|
}
|
9778
9989
|
return false;
|
@@ -9790,82 +10001,87 @@ Segment.prototype.expand = function(bool) {
|
|
9790
10001
|
Segment.prototype.isCollapsed = function() {
|
9791
10002
|
return this._collapsed;
|
9792
10003
|
};
|
9793
|
-
/**
|
10004
|
+
/** Get all collapsing state from all children (subsegments and child segments), excluding the segment itself
|
10005
|
+
* @public
|
9794
10006
|
* @param {Object=} objMap
|
9795
10007
|
* @param {boolean=} parentState=false Collapsing state from parent segment
|
9796
10008
|
* @return {boolean}
|
9797
10009
|
*/
|
9798
10010
|
Segment.prototype.getCollapsingStates = function(objMap, parentState) {
|
9799
|
-
let
|
9800
|
-
|
9801
|
-
|
9802
|
-
|
9803
|
-
|
9804
|
-
|
9805
|
-
|
10011
|
+
let childList = this._subSegNames;
|
10012
|
+
let segmentMap = this._subSegMap;
|
10013
|
+
let subSegment = true; // Normal segments can have subsegments without being subsegment themselve
|
10014
|
+
if(!childList && this._shared) { // Ensure that segment has not been disposed
|
10015
|
+
childList = this._childIds;
|
10016
|
+
segmentMap = this._shared.segments;
|
10017
|
+
subSegment = false;
|
10018
|
+
}
|
10019
|
+
let childCount = childList ? childList.length : 0;
|
10020
|
+
if(!childCount) {
|
10021
|
+
return false;
|
9806
10022
|
}
|
9807
10023
|
|
10024
|
+
let dirty = false;
|
10025
|
+
let childCollapsed = (parentState || this._collapsed) ? true : false;
|
10026
|
+
|
9808
10027
|
if(!objMap) {
|
9809
10028
|
objMap = {};
|
9810
10029
|
}
|
9811
|
-
let
|
9812
|
-
|
9813
|
-
|
9814
|
-
|
10030
|
+
for(let i = 0; i < childCount; ++i) {
|
10031
|
+
let rid = "";
|
10032
|
+
let segment = null;
|
10033
|
+
if(subSegment) {
|
10034
|
+
segment = segmentMap[childList[i]]; // Use segment name to retrieve subsegment
|
10035
|
+
rid = segment.getId();
|
10036
|
+
} else {
|
10037
|
+
rid = childList[i];
|
10038
|
+
segment = segmentMap[rid]; // Use row id to retrieve segment from shared map
|
10039
|
+
}
|
10040
|
+
if(childCollapsed) {
|
10041
|
+
objMap[rid] = childCollapsed; // Collapsing states for all children is registered here
|
9815
10042
|
dirty = true;
|
9816
10043
|
}
|
9817
|
-
|
9818
|
-
if(this._childCount) {
|
9819
|
-
let collapsed = parentState || this._collapsed;
|
9820
|
-
if(segmentNames) {
|
9821
|
-
let segmentMap = this._subSegMap;
|
9822
|
-
let segmentCount = segmentNames.length;
|
9823
|
-
for(let i = 0; i < segmentCount; ++i) {
|
9824
|
-
let segment = segmentMap[segmentNames[i]];
|
9825
|
-
objMap[segment.getId()] = !!parentState;
|
9826
|
-
if(segment.getCollapsingStates(objMap, collapsed)) {
|
9827
|
-
dirty = true;
|
9828
|
-
}
|
9829
|
-
}
|
9830
|
-
} else if(collapsed) {
|
9831
|
-
let chdr = this._children;
|
9832
|
-
for(let rid in chdr) {
|
9833
|
-
objMap[rid] = collapsed;
|
9834
|
-
}
|
10044
|
+
if(segment && segment.getCollapsingStates(objMap, childCollapsed)) {
|
9835
10045
|
dirty = true;
|
9836
10046
|
}
|
9837
10047
|
}
|
9838
10048
|
return dirty;
|
9839
10049
|
};
|
9840
10050
|
|
10051
|
+
/** @private
|
10052
|
+
* @return {number}
|
10053
|
+
*/
|
10054
|
+
Segment.prototype._getOrder = function() {
|
10055
|
+
return this._order * 10000;
|
10056
|
+
};
|
10057
|
+
/** @private
|
10058
|
+
* @return {number}
|
10059
|
+
*/
|
10060
|
+
Segment.prototype._getLastOrder = function() {
|
10061
|
+
return this._getOrder() + this._offsetOrder;
|
10062
|
+
};
|
9841
10063
|
/** @public
|
9842
10064
|
* @return {number}
|
9843
10065
|
*/
|
9844
10066
|
Segment.prototype.getOrder = function() {
|
9845
|
-
|
9846
|
-
|
9847
|
-
|
9848
|
-
|
9849
|
-
return ancestor.getOrder() + this._order;
|
9850
|
-
}
|
10067
|
+
let ancestor = this.getFirstAncestor();
|
10068
|
+
if(ancestor) {
|
10069
|
+
// WARNING: this._order cannot be greater than 9999
|
10070
|
+
return ancestor._getOrder() + this._order;
|
9851
10071
|
}
|
9852
|
-
return this.
|
10072
|
+
return this._getOrder();
|
9853
10073
|
};
|
9854
10074
|
/** Get the last (highest) order from the entire tree regardless of the current position segment in the hierachy
|
9855
10075
|
* @public
|
9856
10076
|
* @return {number}
|
9857
10077
|
*/
|
9858
10078
|
Segment.prototype.getLastOrder = function() {
|
9859
|
-
|
9860
|
-
|
9861
|
-
|
9862
|
-
|
9863
|
-
if(lastSegment) {
|
9864
|
-
return lastSegment.getOrder();
|
9865
|
-
}
|
9866
|
-
}
|
10079
|
+
let ancestor = this.getFirstAncestor();
|
10080
|
+
if(ancestor) {
|
10081
|
+
// WARNING: this._order cannot be greater than 9999
|
10082
|
+
return ancestor._getLastOrder();
|
9867
10083
|
}
|
9868
|
-
return this.
|
10084
|
+
return this._getLastOrder();
|
9869
10085
|
};
|
9870
10086
|
/** @public
|
9871
10087
|
* @param {number} val
|
@@ -9873,6 +10089,13 @@ Segment.prototype.getLastOrder = function() {
|
|
9873
10089
|
Segment.prototype.setOrder = function(val) {
|
9874
10090
|
this._order = val;
|
9875
10091
|
};
|
10092
|
+
/** @public
|
10093
|
+
* @param {number} val
|
10094
|
+
* @returns {number} Returns the number set
|
10095
|
+
*/
|
10096
|
+
Segment.prototype.setLastOrder = function(val) {
|
10097
|
+
return (this._offsetOrder = val);
|
10098
|
+
};
|
9876
10099
|
|
9877
10100
|
/** @private
|
9878
10101
|
* @type {Array.<string>}
|
@@ -9880,9 +10103,10 @@ Segment.prototype.setOrder = function(val) {
|
|
9880
10103
|
Segment._tabs = null;
|
9881
10104
|
/** @public
|
9882
10105
|
* @param {Array.<string>=} lines
|
10106
|
+
* @param {number=} tabLevel
|
9883
10107
|
* @return {!Array.<string>} lines
|
9884
10108
|
*/
|
9885
|
-
Segment.prototype.log = function(lines) {
|
10109
|
+
Segment.prototype.log = function(lines, tabLevel) {
|
9886
10110
|
if(!lines) {
|
9887
10111
|
lines = [];
|
9888
10112
|
}
|
@@ -9897,23 +10121,43 @@ Segment.prototype.log = function(lines) {
|
|
9897
10121
|
tabCh += " ";
|
9898
10122
|
}
|
9899
10123
|
}
|
10124
|
+
if(!tabLevel) {
|
10125
|
+
tabLevel = 0;
|
10126
|
+
}
|
10127
|
+
|
9900
10128
|
let collapsedCh = this._collapsed ? "+ " : "- ";
|
9901
|
-
lines.push(tabs[
|
10129
|
+
lines.push(tabs[tabLevel] + collapsedCh + this._rid);
|
9902
10130
|
|
9903
|
-
let
|
9904
|
-
|
9905
|
-
|
9906
|
-
|
9907
|
-
|
9908
|
-
|
10131
|
+
let childLevel = tabLevel + 1;
|
10132
|
+
let childIndent = tabs[childLevel];
|
10133
|
+
|
10134
|
+
let childList = this._subSegNames;
|
10135
|
+
let segmentMap = this._subSegMap;
|
10136
|
+
let subSegment = true; // Normal segments can have subsegments without being subsegment themselve
|
10137
|
+
if(!childList && this._shared) { // Ensure that segment has not been disposed
|
10138
|
+
childList = this._childIds;
|
10139
|
+
segmentMap = this._shared.segments;
|
10140
|
+
subSegment = false;
|
10141
|
+
}
|
10142
|
+
let childCount = childList ? childList.length : 0;
|
10143
|
+
|
10144
|
+
for(i = 0; i < childCount; ++i) {
|
10145
|
+
let rid = "";
|
10146
|
+
let segment = null;
|
10147
|
+
if(subSegment) {
|
10148
|
+
segment = segmentMap[childList[i]]; // Use segment name to retrieve subsegment
|
10149
|
+
rid = segment.getId();
|
10150
|
+
} else {
|
10151
|
+
rid = childList[i];
|
10152
|
+
segment = segmentMap[rid]; // Use row id to retrieve segment from shared map
|
9909
10153
|
}
|
9910
|
-
|
9911
|
-
|
9912
|
-
|
9913
|
-
|
10154
|
+
|
10155
|
+
if(segment) {
|
10156
|
+
segment.log(lines, childLevel);
|
10157
|
+
} else {
|
10158
|
+
lines.push(childIndent + "- " + rid);
|
9914
10159
|
}
|
9915
10160
|
}
|
9916
|
-
|
9917
10161
|
return lines;
|
9918
10162
|
};
|
9919
10163
|
|
@@ -9938,6 +10182,7 @@ let SegmentCollection = function() {
|
|
9938
10182
|
this._removalList = [];
|
9939
10183
|
|
9940
10184
|
this._shared = {
|
10185
|
+
segments: this._segments,
|
9941
10186
|
childToSegment: {}, // child Id to segment Id
|
9942
10187
|
dirtyCollapsingState: false,
|
9943
10188
|
defaultCollapsing: false
|
@@ -9998,10 +10243,6 @@ SegmentCollection.prototype.dispose = function() {
|
|
9998
10243
|
*/
|
9999
10244
|
SegmentCollection.prototype.addSegment = function(rid, childRids) {
|
10000
10245
|
if(rid && !this._segments[rid]) {
|
10001
|
-
if(this.getParentRowId(rid)) {
|
10002
|
-
console.log("child of a segment cannot be set as a segment separator");
|
10003
|
-
return false;
|
10004
|
-
}
|
10005
10246
|
let segment = this._segments[rid] = new data_Segment(rid, this._shared);
|
10006
10247
|
segment.addEventListener("subSegmentAdded", this._onSubSegmentAdded);
|
10007
10248
|
segment.addEventListener("subSegmentRemoved", this._onSubSegmentRemoved);
|
@@ -10048,33 +10289,41 @@ SegmentCollection.prototype.getParentRowId = function(rid) {
|
|
10048
10289
|
*/
|
10049
10290
|
SegmentCollection.prototype.removeSegment = function(rid) {
|
10050
10291
|
let segment = this._segments[rid];
|
10051
|
-
if(segment) {
|
10052
|
-
|
10053
|
-
|
10054
|
-
|
10055
|
-
|
10056
|
-
|
10057
|
-
|
10058
|
-
|
10059
|
-
|
10060
|
-
|
10061
|
-
|
10062
|
-
|
10063
|
-
|
10064
|
-
|
10065
|
-
|
10066
|
-
|
10067
|
-
|
10292
|
+
if(!segment) {
|
10293
|
+
return false;
|
10294
|
+
}
|
10295
|
+
|
10296
|
+
if(this._segmentCount <= 1) {
|
10297
|
+
return this.removeAllSegments();
|
10298
|
+
}
|
10299
|
+
let subSegment = segment.isSubSegment();
|
10300
|
+
if(subSegment) {
|
10301
|
+
this._removalList.push(segment.getId());
|
10302
|
+
}
|
10303
|
+
let subSegIds = segment.getSubSegmentIds();
|
10304
|
+
if(subSegIds) {
|
10305
|
+
let len = subSegIds.length;
|
10306
|
+
for(let i = 0; i < len; ++i) {
|
10307
|
+
let subSegId = subSegIds[i];
|
10308
|
+
if(this._segments[subSegId]) {
|
10309
|
+
this._removalList.push(subSegId);
|
10310
|
+
delete this._segments[subSegId]; // Slow
|
10311
|
+
--this._segmentCount;
|
10068
10312
|
}
|
10069
10313
|
}
|
10070
|
-
segment.removeAllChildren(); // This is important for updating childToSegment
|
10071
|
-
segment.dispose();
|
10072
|
-
|
10073
|
-
delete this._segments[rid]; // Slow
|
10074
|
-
--this._segmentCount;
|
10075
|
-
return true;
|
10076
10314
|
}
|
10077
|
-
|
10315
|
+
if(!subSegment) {
|
10316
|
+
let parentSeg = segment.getParent();
|
10317
|
+
if(parentSeg) { // Move existing children to its parent
|
10318
|
+
parentSeg.addChildren(segment.getChildIds()); // WARNING: passing private member
|
10319
|
+
}
|
10320
|
+
}
|
10321
|
+
segment.removeAllChildren(); // This is important for updating childToSegment
|
10322
|
+
segment.dispose();
|
10323
|
+
|
10324
|
+
delete this._segments[rid]; // Slow
|
10325
|
+
--this._segmentCount;
|
10326
|
+
return true;
|
10078
10327
|
};
|
10079
10328
|
/** @public
|
10080
10329
|
* @return {boolean} Returns true if there is any change. Otherwise, returns false
|
@@ -10087,6 +10336,7 @@ SegmentCollection.prototype.removeAllSegments = function() {
|
|
10087
10336
|
this._segments = {};
|
10088
10337
|
this._segmentCount = 0;
|
10089
10338
|
this._segmentList = null;
|
10339
|
+
this._shared.segments = this._segments;
|
10090
10340
|
this._shared.childToSegment = {};
|
10091
10341
|
|
10092
10342
|
this._classification = this._classifierChanged = false;
|
@@ -10131,6 +10381,23 @@ SegmentCollection.prototype.getSegments = function() {
|
|
10131
10381
|
SegmentCollection.prototype.getSegmentIds = function() {
|
10132
10382
|
return Object.keys(this._segments);
|
10133
10383
|
};
|
10384
|
+
/** @public
|
10385
|
+
* @param {!Function} comparer
|
10386
|
+
* @return {!Array.<Segment>}
|
10387
|
+
*/
|
10388
|
+
SegmentCollection.prototype.sortSegments = function(comparer) {
|
10389
|
+
let rootSegments = [];
|
10390
|
+
let segmentSeparators = this._segments;
|
10391
|
+
for(let rid in segmentSeparators) {
|
10392
|
+
let segment = segmentSeparators[rid];
|
10393
|
+
segment.sortSegments(comparer);
|
10394
|
+
if(segment.isRootSegment()) {
|
10395
|
+
rootSegments.push(segment);
|
10396
|
+
}
|
10397
|
+
}
|
10398
|
+
rootSegments.sort(comparer);
|
10399
|
+
return rootSegments;
|
10400
|
+
};
|
10134
10401
|
|
10135
10402
|
|
10136
10403
|
/** @public
|
@@ -10212,7 +10479,7 @@ SegmentCollection.prototype.getCollapsedRows = function() {
|
|
10212
10479
|
collapsedRids = {};
|
10213
10480
|
for(let rid in segmentSeparators) {
|
10214
10481
|
let segment = segmentSeparators[rid];
|
10215
|
-
if(
|
10482
|
+
if(segment.isRootSegment()) {
|
10216
10483
|
if(segment.getCollapsingStates(collapsedRids)) {
|
10217
10484
|
++count;
|
10218
10485
|
}
|
@@ -10224,6 +10491,31 @@ SegmentCollection.prototype.getCollapsedRows = function() {
|
|
10224
10491
|
return this._collapsedRids;
|
10225
10492
|
};
|
10226
10493
|
|
10494
|
+
/** Invalidate segment order cache, if the given row id is a segment separator
|
10495
|
+
* @private
|
10496
|
+
* @param {string|Array.<string>} segmentIds
|
10497
|
+
* @returns {boolean} Returns true if there is any change
|
10498
|
+
*/
|
10499
|
+
SegmentCollection.prototype._invalidateSegmentOrder = function(segmentIds) {
|
10500
|
+
if(this._segmentList) {
|
10501
|
+
if(typeof segmentIds === "string") {
|
10502
|
+
if(this._segments[segmentIds]) {
|
10503
|
+
this._segmentList = null;
|
10504
|
+
return true;
|
10505
|
+
}
|
10506
|
+
} else if(Array.isArray(segmentIds)) {
|
10507
|
+
let len = segmentIds.length;
|
10508
|
+
for(let i = 0; i < len; ++i) {
|
10509
|
+
let segmentId = segmentIds[i];
|
10510
|
+
if(this._segments[segmentId]) {
|
10511
|
+
this._segmentList = null;
|
10512
|
+
return true;
|
10513
|
+
}
|
10514
|
+
}
|
10515
|
+
}
|
10516
|
+
}
|
10517
|
+
return false;
|
10518
|
+
};
|
10227
10519
|
/** @public
|
10228
10520
|
* @param {string} segmentId
|
10229
10521
|
* @param {string} rid
|
@@ -10233,6 +10525,8 @@ SegmentCollection.prototype.getCollapsedRows = function() {
|
|
10233
10525
|
SegmentCollection.prototype.addSegmentChild = function(segmentId, rid, dataId) {
|
10234
10526
|
let segment = this._segments[segmentId];
|
10235
10527
|
if(segment && !segment.isSubSegment()) {
|
10528
|
+
// If a segment becomes a child of other segment, then the segment order needs to be recalculated
|
10529
|
+
this._invalidateSegmentOrder(rid);
|
10236
10530
|
return segment.addChild(rid, dataId);
|
10237
10531
|
}
|
10238
10532
|
return false;
|
@@ -10246,11 +10540,14 @@ SegmentCollection.prototype.addSegmentChild = function(segmentId, rid, dataId) {
|
|
10246
10540
|
SegmentCollection.prototype.addSegmentChildren = function(segmentId, rids, dataIds) {
|
10247
10541
|
let segment = this._segments[segmentId];
|
10248
10542
|
if(segment && !segment.isSubSegment()) {
|
10543
|
+
// If a segment becomes a child of other segment, then the segment order needs to be recalculated
|
10544
|
+
this._invalidateSegmentOrder(rids);
|
10249
10545
|
return segment.addChildren(rids, dataIds);
|
10250
10546
|
}
|
10251
10547
|
return false;
|
10252
10548
|
};
|
10253
|
-
/**
|
10549
|
+
/** This only works for immediate children of the specified segment
|
10550
|
+
* @public
|
10254
10551
|
* @param {string} segmentId
|
10255
10552
|
* @param {string} rid
|
10256
10553
|
* @return {boolean} Returns true if there is any change. Otherwise, returns false
|
@@ -10270,6 +10567,7 @@ SegmentCollection.prototype.containsSegmentChild = function(segmentId, rid) {
|
|
10270
10567
|
SegmentCollection.prototype.removeSegmentChild = function(segmentId, rid) {
|
10271
10568
|
let segment = this._segments[segmentId];
|
10272
10569
|
if(segment) {
|
10570
|
+
this._invalidateSegmentOrder(rid);
|
10273
10571
|
return segment.removeChild(rid);
|
10274
10572
|
}
|
10275
10573
|
return false;
|
@@ -10282,6 +10580,7 @@ SegmentCollection.prototype.removeSegmentChild = function(segmentId, rid) {
|
|
10282
10580
|
SegmentCollection.prototype.removeSegmentChildren = function(segmentId, rids) {
|
10283
10581
|
let segment = this._segments[segmentId];
|
10284
10582
|
if(segment) {
|
10583
|
+
this._invalidateSegmentOrder(rids);
|
10285
10584
|
return segment.removeChildren(rids);
|
10286
10585
|
}
|
10287
10586
|
return false;
|
@@ -10301,6 +10600,7 @@ SegmentCollection.prototype.removeAllSegmentChildren = function() {
|
|
10301
10600
|
}
|
10302
10601
|
|
10303
10602
|
if(dirty) {
|
10603
|
+
this._segmentList = null; // WARNING: not optimized
|
10304
10604
|
this.classify(null);
|
10305
10605
|
}
|
10306
10606
|
|
@@ -10359,10 +10659,14 @@ SegmentCollection.prototype.fillSegments = function(rids) {
|
|
10359
10659
|
};
|
10360
10660
|
/** @public
|
10361
10661
|
* @param {Array.<string>} rids
|
10662
|
+
* @param {boolean=} useCache=false If this is true, skip the calculation when there is already a cache for segment order
|
10362
10663
|
*/
|
10363
|
-
SegmentCollection.prototype.calcSegmentOrder = function(rids) {
|
10664
|
+
SegmentCollection.prototype.calcSegmentOrder = function(rids, useCache) {
|
10364
10665
|
let segmentList = this._segmentList;
|
10365
10666
|
if(segmentList) {
|
10667
|
+
if(useCache) {
|
10668
|
+
return; // Use previous cache for segment order
|
10669
|
+
}
|
10366
10670
|
segmentList.length = 0;
|
10367
10671
|
} else {
|
10368
10672
|
segmentList = this._segmentList = [];
|
@@ -10376,9 +10680,10 @@ SegmentCollection.prototype.calcSegmentOrder = function(rids) {
|
|
10376
10680
|
let rid = rids[i];
|
10377
10681
|
let segment = segmentSeparators[rid];
|
10378
10682
|
if(segment) {
|
10379
|
-
if(
|
10683
|
+
if(segment.isRootSegment()) {
|
10380
10684
|
this._segmentList.push(segment);
|
10381
10685
|
segment.setOrder(++order); // WARNING: Segments and sub segments start with 1
|
10686
|
+
segment.updateTreeStructure(0);
|
10382
10687
|
}
|
10383
10688
|
if(--segmentCount <= 0) {
|
10384
10689
|
break;
|
@@ -10402,7 +10707,7 @@ SegmentCollection.prototype.getSegmentValues = function(rids, partial) {
|
|
10402
10707
|
let prevSegment = null;
|
10403
10708
|
let segmentValues = new Array(rowCount);
|
10404
10709
|
let segmentVal = 0;
|
10405
|
-
let highestVal =
|
10710
|
+
let highestVal = 0;
|
10406
10711
|
let offset = 0;
|
10407
10712
|
for(let r = 0; r < rowCount; ++r) {
|
10408
10713
|
let rid = rids[r];
|
@@ -10410,7 +10715,7 @@ SegmentCollection.prototype.getSegmentValues = function(rids, partial) {
|
|
10410
10715
|
if(curSegment) { // segment separator
|
10411
10716
|
segmentVal = curSegment.getOrder() * 100;
|
10412
10717
|
offset = 0;
|
10413
|
-
if(
|
10718
|
+
if(curSegment.isRootSegment()) {
|
10414
10719
|
if(prevSegment !== curSegment) {
|
10415
10720
|
prevSegment = curSegment;
|
10416
10721
|
highestVal = curSegment.getLastOrder() * 100;
|
@@ -10422,12 +10727,14 @@ SegmentCollection.prototype.getSegmentValues = function(rids, partial) {
|
|
10422
10727
|
curSegment = segmentSeparators[parentId];
|
10423
10728
|
segmentVal = curSegment.getOrder() * 100;
|
10424
10729
|
offset = 1;
|
10425
|
-
if(partial) {
|
10730
|
+
if(partial) { // This fixes the out of order sub segment
|
10426
10731
|
highestVal = curSegment.getLastOrder() * 100;
|
10427
10732
|
}
|
10428
10733
|
} else { // row outside of segments
|
10429
10734
|
if(highestVal) {
|
10430
|
-
segmentVal
|
10735
|
+
if(segmentVal < highestVal) {
|
10736
|
+
segmentVal = highestVal;
|
10737
|
+
}
|
10431
10738
|
offset = 10;
|
10432
10739
|
} else {
|
10433
10740
|
segmentVal = offset = 0;
|
@@ -10451,7 +10758,10 @@ SegmentCollection.prototype.logStructure = function() {
|
|
10451
10758
|
let segmentCount = segmentList.length;
|
10452
10759
|
let lines = [];
|
10453
10760
|
for(let i = 0; i < segmentCount; ++i) {
|
10454
|
-
segmentList[i]
|
10761
|
+
let segment = segmentList[i];
|
10762
|
+
if(segment.isRootSegment()) {
|
10763
|
+
segment.log(lines);
|
10764
|
+
}
|
10455
10765
|
}
|
10456
10766
|
|
10457
10767
|
return lines.join("\n");
|
@@ -10461,10 +10771,14 @@ SegmentCollection.prototype.logStructure = function() {
|
|
10461
10771
|
*/
|
10462
10772
|
SegmentCollection.prototype.logRowIdMap = function() {
|
10463
10773
|
let lines = [];
|
10774
|
+
let segmentSeparators = this._segments;
|
10464
10775
|
let childToSegmentId = this._shared.childToSegment;
|
10465
10776
|
for(let rid in childToSegmentId) {
|
10466
10777
|
let segmentId = childToSegmentId[rid];
|
10467
|
-
|
10778
|
+
let segment = segmentSeparators[segmentId];
|
10779
|
+
if(!segment || !segment.isSubSegment()) {
|
10780
|
+
lines.push(rid + " > " + segmentId);
|
10781
|
+
}
|
10468
10782
|
}
|
10469
10783
|
|
10470
10784
|
return lines.join("\n");
|
@@ -11491,7 +11805,7 @@ DataTable.prototype.getSortingLogics = function() {
|
|
11491
11805
|
};
|
11492
11806
|
/** @public
|
11493
11807
|
* @param {string|Array.<string>} cid Column id
|
11494
|
-
* @param {string|number|Array.<string|number
|
11808
|
+
* @param {(string|number|Array.<string|number>)=} sortOrders "a"|"d"|"n"
|
11495
11809
|
* @param {DataTable.SortLogic=} customComparer
|
11496
11810
|
* @param {*=} contextObj Context object that will be provided as the forth parameter of the given comparer method
|
11497
11811
|
* @return {boolean} Return true if there is any change, otherwise false
|
@@ -11596,64 +11910,65 @@ DataTable.prototype._initSegmentCollection = function() {
|
|
11596
11910
|
this._segments.addEventListener("subSegmentChanged", this._onSubSegmentChanged);
|
11597
11911
|
}
|
11598
11912
|
};
|
11599
|
-
/**
|
11913
|
+
/** Add or remove all segments from the given row ids
|
11600
11914
|
* @public
|
11601
11915
|
* @param {Array.<string>} rids
|
11602
11916
|
* @param {boolean=} enabled
|
11603
11917
|
* @return {boolean} Return true if there is any change
|
11604
11918
|
*/
|
11605
11919
|
DataTable.prototype.setSegmentSeparators = function(rids, enabled) {
|
11606
|
-
|
11607
|
-
|
11608
|
-
|
11609
|
-
|
11610
|
-
|
11611
|
-
|
11612
|
-
|
11613
|
-
|
11614
|
-
|
11615
|
-
|
11616
|
-
|
11617
|
-
|
11618
|
-
|
11920
|
+
if (!rids) {
|
11921
|
+
return false;
|
11922
|
+
}
|
11923
|
+
let adding = (enabled !== false);
|
11924
|
+
let segmentAdded = 0;
|
11925
|
+
let segmentRemoved = 0;
|
11926
|
+
|
11927
|
+
let len = rids.length;
|
11928
|
+
for (let i = 0; i < len; i++) {
|
11929
|
+
let rid = rids[i];
|
11930
|
+
if(adding) {
|
11931
|
+
this._initSegmentCollection();
|
11932
|
+
if(this._autoSegmentFilling) {
|
11933
|
+
let parentId = this._segments.getParentRowId(rid);
|
11934
|
+
if(parentId) {
|
11935
|
+
this._segments.removeSegmentChild(parentId, rid);
|
11619
11936
|
}
|
11620
|
-
|
11621
|
-
|
11622
|
-
|
11623
|
-
|
11624
|
-
|
11625
|
-
|
11626
|
-
|
11627
|
-
|
11628
|
-
|
11937
|
+
}
|
11938
|
+
segmentAdded |= this._segments.addSegment(rid);
|
11939
|
+
} else if (this._segments) { // Removing
|
11940
|
+
let segment = this._segments.getSegment(rid);
|
11941
|
+
if(segment) {
|
11942
|
+
if(this._segments.removeSegment(rid)) {
|
11943
|
+
segmentRemoved = 1;
|
11944
|
+
if(!this._segments.getSegmentCount()) {
|
11945
|
+
this._segments = null;
|
11629
11946
|
}
|
11630
11947
|
}
|
11631
11948
|
}
|
11632
|
-
|
11633
|
-
}
|
11634
|
-
if (enabled !== false && segmentChanged) {
|
11635
|
-
this._segments.calcSegmentOrder(this._rids);
|
11636
|
-
change = true;
|
11637
|
-
}
|
11638
|
-
if(change) {
|
11639
|
-
this.dispatchGlobalChange();
|
11640
11949
|
}
|
11641
11950
|
}
|
11642
|
-
|
11643
|
-
|
11951
|
+
if (segmentAdded) {
|
11952
|
+
this._segments.calcSegmentOrder(this._rids);
|
11953
|
+
}
|
11954
|
+
let changed = segmentAdded || segmentRemoved;
|
11955
|
+
if(changed && this._needFiring()) {
|
11956
|
+
this.dispatchGlobalChange();
|
11957
|
+
}
|
11958
|
+
return changed ? true : false;
|
11644
11959
|
};
|
11645
11960
|
|
11646
11961
|
/**
|
11647
11962
|
* @public
|
11648
11963
|
* @param {string} rid
|
11649
|
-
* @param {
|
11964
|
+
* @param {*=} options=null Segment options. If the value is false, segment separator will be stripped off from the given rid
|
11650
11965
|
* @return {boolean} Return true if there is any change
|
11651
11966
|
*/
|
11652
|
-
DataTable.prototype.setSegmentSeparator = function(rid,
|
11967
|
+
DataTable.prototype.setSegmentSeparator = function(rid, options) {
|
11653
11968
|
let change = false;
|
11654
11969
|
let memberCount = 0;
|
11655
11970
|
if(rid && typeof rid === "string") {
|
11656
|
-
if(
|
11971
|
+
if(options !== false) {
|
11657
11972
|
this._initSegmentCollection();
|
11658
11973
|
if(this._autoSegmentFilling) {
|
11659
11974
|
let parentId = this._segments.getParentRowId(rid);
|
@@ -11661,11 +11976,12 @@ DataTable.prototype.setSegmentSeparator = function(rid, enabled) {
|
|
11661
11976
|
this._segments.removeSegmentChild(parentId, rid);
|
11662
11977
|
}
|
11663
11978
|
}
|
11664
|
-
|
11979
|
+
let children = (options && options["children"]) ? options["children"] : null;
|
11980
|
+
if(this._segments.addSegment(rid, children)) {
|
11665
11981
|
this._segments.calcSegmentOrder(this._rids);
|
11666
11982
|
change = true;
|
11667
11983
|
}
|
11668
|
-
} else if(this._segments) { //
|
11984
|
+
} else if(this._segments) { // Remove the separator
|
11669
11985
|
let segment = this._segments.getSegment(rid);
|
11670
11986
|
if(segment) {
|
11671
11987
|
memberCount = segment.getChildCount();
|
@@ -11860,6 +12176,20 @@ DataTable.prototype.fillSegments = function() {
|
|
11860
12176
|
}
|
11861
12177
|
return false;
|
11862
12178
|
};
|
12179
|
+
/** @private
|
12180
|
+
* @param {boolean=} adding This indicates that segment is changed by adding a new child
|
12181
|
+
*/
|
12182
|
+
DataTable.prototype._onSegmentChildChanged = function(adding) {
|
12183
|
+
if(this._segments) {
|
12184
|
+
this._segments.calcSegmentOrder(this._rids, true);
|
12185
|
+
}
|
12186
|
+
if(adding !== false) {
|
12187
|
+
this._sort(null);
|
12188
|
+
}
|
12189
|
+
this._dispatchPositionChange(); // Force rerendering, even if there is no position change
|
12190
|
+
|
12191
|
+
this.requestClassifying();
|
12192
|
+
};
|
11863
12193
|
/** @public
|
11864
12194
|
* @param {string} segmentId Row id
|
11865
12195
|
* @param {string} rid Row id
|
@@ -11870,10 +12200,7 @@ DataTable.prototype.addSegmentChild = function(segmentId, rid, dataId) {
|
|
11870
12200
|
if(this._segments) {
|
11871
12201
|
let dirty = this._segments.addSegmentChild(segmentId, rid, dataId);
|
11872
12202
|
if(dirty) {
|
11873
|
-
this.
|
11874
|
-
this._dispatchPositionChange(); // Force rerendering, even if there is no position change
|
11875
|
-
|
11876
|
-
this.requestClassifying();
|
12203
|
+
this._onSegmentChildChanged();
|
11877
12204
|
return true;
|
11878
12205
|
}
|
11879
12206
|
}
|
@@ -11889,17 +12216,15 @@ DataTable.prototype.addSegmentChildren = function(segmentId, rids, dataIds) {
|
|
11889
12216
|
if(this._segments) {
|
11890
12217
|
let dirty = this._segments.addSegmentChildren(segmentId, rids, dataIds);
|
11891
12218
|
if(dirty) {
|
11892
|
-
this.
|
11893
|
-
this._dispatchPositionChange(); // Force rerendering, even if there is no position change
|
11894
|
-
|
11895
|
-
this.requestClassifying();
|
12219
|
+
this._onSegmentChildChanged();
|
11896
12220
|
return true;
|
11897
12221
|
}
|
11898
12222
|
}
|
11899
12223
|
return false;
|
11900
12224
|
};
|
11901
12225
|
|
11902
|
-
/**
|
12226
|
+
/** Deprecated. Remove all existing children and add new children according to the give array
|
12227
|
+
* @public
|
11903
12228
|
* @param {Array.<Object>} segmentArr Segment array that contain "segmentId", "rowIds" to set segment children
|
11904
12229
|
* @return {boolean} Return true if there is any change
|
11905
12230
|
*/
|
@@ -11907,20 +12232,16 @@ DataTable.prototype.setSegmentChildren = function(segmentArr) {
|
|
11907
12232
|
if(!this._segments) {
|
11908
12233
|
return false;
|
11909
12234
|
}
|
11910
|
-
this.removeAllSegmentChildren();
|
12235
|
+
let dirty = this._segments.removeAllSegmentChildren();
|
11911
12236
|
let len = segmentArr.length;
|
11912
|
-
let dirty;
|
11913
12237
|
for (let i = 0; i < len; i++) {
|
11914
12238
|
let obj = segmentArr[i];
|
11915
|
-
if(this._segments.addSegmentChildren(obj
|
12239
|
+
if(this._segments.addSegmentChildren(obj["segmentId"], obj["rowIds"])) {
|
11916
12240
|
dirty = true;
|
11917
12241
|
}
|
11918
12242
|
}
|
11919
12243
|
if(dirty) {
|
11920
|
-
this.
|
11921
|
-
this._dispatchPositionChange(); // Force rerendering, even if there is no position change
|
11922
|
-
|
11923
|
-
this.requestClassifying();
|
12244
|
+
this._onSegmentChildChanged();
|
11924
12245
|
return true;
|
11925
12246
|
}
|
11926
12247
|
|
@@ -11935,8 +12256,7 @@ DataTable.prototype.removeSegmentChild = function(segmentId, rid) {
|
|
11935
12256
|
if(this._segments) {
|
11936
12257
|
let dirty = this._segments.removeSegmentChild(segmentId, rid);
|
11937
12258
|
if(dirty) {
|
11938
|
-
this.
|
11939
|
-
this.requestClassifying();
|
12259
|
+
this._onSegmentChildChanged(false);
|
11940
12260
|
}
|
11941
12261
|
return dirty;
|
11942
12262
|
}
|
@@ -11951,8 +12271,7 @@ DataTable.prototype.removeSegmentChildren = function(segmentId, rids) {
|
|
11951
12271
|
if(this._segments) {
|
11952
12272
|
let dirty = this._segments.removeSegmentChildren(segmentId, rids);
|
11953
12273
|
if(dirty) {
|
11954
|
-
this.
|
11955
|
-
this.requestClassifying();
|
12274
|
+
this._onSegmentChildChanged(false);
|
11956
12275
|
}
|
11957
12276
|
return dirty;
|
11958
12277
|
}
|
@@ -11965,7 +12284,7 @@ DataTable.prototype.removeAllSegmentChildren = function() {
|
|
11965
12284
|
if(this._segments) {
|
11966
12285
|
let dirty = this._segments.removeAllSegmentChildren(); // This immediately remove all sub segments
|
11967
12286
|
if (dirty) {
|
11968
|
-
this.
|
12287
|
+
this._onSegmentChildChanged(false);
|
11969
12288
|
}
|
11970
12289
|
return dirty;
|
11971
12290
|
}
|
@@ -11996,50 +12315,51 @@ DataTable.prototype.getSegmentChildIds = function(segmentId) {
|
|
11996
12315
|
}
|
11997
12316
|
return null;
|
11998
12317
|
};
|
12318
|
+
/**
|
12319
|
+
* @private
|
12320
|
+
* @param {(Array|number)} sortOrder
|
12321
|
+
* @param {*} context
|
12322
|
+
*/
|
12323
|
+
DataTable.prototype._setSegmentSortContext = function (sortOrder, context) {
|
12324
|
+
this._segmentSortOrder = sortOrder;
|
12325
|
+
this._segmentSortContext = context;
|
12326
|
+
};
|
11999
12327
|
/** Sort all of existing segments by multiple sort logics
|
12000
12328
|
* @public
|
12001
12329
|
* @param {Function|Array.<Function>|Object} sortLogics
|
12002
|
-
* @param {Array.<number>=} sortOrders
|
12330
|
+
* @param {Array.<number|string>=} sortOrders
|
12003
12331
|
* @param {Array.<string>=} cids
|
12004
12332
|
* @return {boolean}
|
12005
12333
|
*/
|
12006
12334
|
DataTable.prototype.sortSeparators = function (sortLogics, sortOrders, cids) {
|
12007
|
-
let dirty = false;
|
12008
12335
|
if(!this._segments){
|
12009
12336
|
return false;
|
12010
12337
|
}
|
12011
12338
|
if(typeof sortLogics === "function"){
|
12339
|
+
this._setSegmentSortContext(DataTable._getSortOrder(sortOrders), cids);
|
12012
12340
|
return this.sortSegments(sortLogics);
|
12013
12341
|
}
|
12342
|
+
if(!cids) {
|
12343
|
+
return false;
|
12344
|
+
}
|
12014
12345
|
let sortingDefs = DataTable._buildSortContext(
|
12015
12346
|
[],
|
12016
12347
|
cids,
|
12017
12348
|
sortOrders,
|
12018
|
-
sortLogics
|
12349
|
+
sortLogics || this._compMap
|
12019
12350
|
);
|
12020
|
-
let defCount = sortingDefs
|
12021
|
-
|
12022
|
-
return dirty;
|
12023
|
-
}
|
12024
|
-
|
12025
|
-
let sortOrder = 0;
|
12026
|
-
let sortLogic, sortContext;
|
12351
|
+
let defCount = sortingDefs.length;
|
12352
|
+
let sortLogic = null;
|
12027
12353
|
if(defCount > 1) {
|
12028
12354
|
sortLogic = DataTable._multiColumnSeparatorCompareLogic;
|
12029
|
-
|
12030
|
-
|
12031
|
-
} else { // Single level sorting
|
12355
|
+
this._setSegmentSortContext(1, sortingDefs);
|
12356
|
+
} else if(defCount === 1) { // Single level sorting
|
12032
12357
|
sortLogic = DataTable._singleColumnSeparatorCompareLogic;
|
12033
|
-
|
12034
|
-
|
12358
|
+
this._setSegmentSortContext(sortingDefs[0][3], sortingDefs[0]); // sortOrder and context
|
12359
|
+
} else {
|
12360
|
+
return false;
|
12035
12361
|
}
|
12036
|
-
this.
|
12037
|
-
this._segmentSortContext = sortContext;
|
12038
|
-
dirty = this.sortSegments(sortLogic);
|
12039
|
-
this._segmentSortOrder = 0;
|
12040
|
-
this._segmentSortContext = null;
|
12041
|
-
|
12042
|
-
return dirty;
|
12362
|
+
return this.sortSegments(sortLogic);
|
12043
12363
|
};
|
12044
12364
|
/** Sort all of existing segments by given compare function
|
12045
12365
|
* @public
|
@@ -12054,40 +12374,33 @@ DataTable.prototype.sortSegments = function (compare) {
|
|
12054
12374
|
this._segments.calcSegmentOrder(this._rids);
|
12055
12375
|
return false;
|
12056
12376
|
}
|
12057
|
-
let rids = this._rids;
|
12058
|
-
let segments = this._segments;
|
12059
|
-
let segmentCount = segments.getSegmentCount();
|
12060
|
-
let segmentList = [];
|
12061
|
-
let origOrder = [];
|
12062
|
-
let itemCount = 0;
|
12063
|
-
let rowCount = rids.length;
|
12064
|
-
let rid = "";
|
12065
|
-
let segment = null;
|
12066
|
-
let i;
|
12067
|
-
for(i = 0; i < rowCount; ++i) {
|
12068
|
-
rid = rids[i];
|
12069
|
-
segment = segments.getSegment(rid);
|
12070
|
-
if(segment) {
|
12071
|
-
origOrder.push(i);
|
12072
|
-
segmentList.push(segment);
|
12073
|
-
if(++itemCount >= segmentCount) {
|
12074
|
-
break;
|
12075
|
-
}
|
12076
|
-
}
|
12077
|
-
}
|
12078
12377
|
|
12079
12378
|
this._userSegmentComparer = compare;
|
12080
|
-
|
12379
|
+
|
12380
|
+
let segments = this._segments;
|
12381
|
+
let rootSegments = segments.sortSegments(this._bySegmentSeparator);
|
12382
|
+
|
12081
12383
|
this._userSegmentComparer = null;
|
12384
|
+
this._setSegmentSortContext(0, null);
|
12385
|
+
|
12386
|
+
let rids = this._rids;
|
12387
|
+
let origRids = rids.slice();
|
12388
|
+
let rowCount = rids.length;
|
12389
|
+
rids.length = 0;
|
12082
12390
|
|
12391
|
+
let segmentCount = 0;
|
12083
12392
|
let dirty = false;
|
12084
|
-
for(i = 0; i <
|
12085
|
-
let
|
12086
|
-
|
12087
|
-
segment
|
12088
|
-
|
12089
|
-
|
12090
|
-
|
12393
|
+
for(let i = 0; i < rowCount; ++i) {
|
12394
|
+
let rid = origRids[i];
|
12395
|
+
let segment = segments.getSegment(rid);
|
12396
|
+
if(segment) {
|
12397
|
+
if(segment.isRootSegment()) {
|
12398
|
+
rootSegments[segmentCount++].getFlattenTreeIds(rids);
|
12399
|
+
}
|
12400
|
+
} else if(!segments.getParentRowId(rid)) {
|
12401
|
+
rids.push(rid);
|
12402
|
+
}
|
12403
|
+
if(rid !== rids[i]) {
|
12091
12404
|
dirty = true;
|
12092
12405
|
}
|
12093
12406
|
}
|
@@ -12096,9 +12409,8 @@ DataTable.prototype.sortSegments = function (compare) {
|
|
12096
12409
|
this._segments.calcSegmentOrder(rids);
|
12097
12410
|
this._sort(null);
|
12098
12411
|
this._dispatchPositionChange();
|
12099
|
-
return true;
|
12100
12412
|
}
|
12101
|
-
return
|
12413
|
+
return dirty;
|
12102
12414
|
};
|
12103
12415
|
/** Sort all of existing segments by given compare function
|
12104
12416
|
* @private
|
@@ -12381,7 +12693,7 @@ DataTable._positionChangeArg = {"globalChange": true, "positionChangeOnly": true
|
|
12381
12693
|
* @function
|
12382
12694
|
* @public
|
12383
12695
|
* @ignore
|
12384
|
-
* @param {Array.<Array>} out_defs Output object. Array is used to optimize property accessing time.
|
12696
|
+
* @param {!Array.<Array>} out_defs Output object. Array is used to optimize property accessing time.
|
12385
12697
|
* @param {string|Array.<string>} cids
|
12386
12698
|
* @param {string|number|Array.<string|number>=} sortOrders
|
12387
12699
|
* @param {Function|Array.<Function>|Object.<string, DataTable.SortLogic>=} logics
|
@@ -31600,13 +31912,13 @@ DataView.prototype.setSegmentSeparators = function(rowIds, enabled) {
|
|
31600
31912
|
}
|
31601
31913
|
return false;
|
31602
31914
|
};
|
31603
|
-
/** Set visible row as segment separator (hidden or filtered rows cannot be a segment separator)
|
31915
|
+
/** Set visible row as a segment separator (hidden or filtered rows cannot be a segment separator)
|
31604
31916
|
* @public
|
31605
31917
|
* @param {string|number} rowRef Row id or row index
|
31606
|
-
* @param {
|
31918
|
+
* @param {*=} options=null Segment options. If the value is false, segment separator will be stripped off from the given rid
|
31607
31919
|
* @return {boolean} Return true if there is any change
|
31608
31920
|
*/
|
31609
|
-
DataView.prototype.setSegmentSeparator = function(rowRef,
|
31921
|
+
DataView.prototype.setSegmentSeparator = function(rowRef, options) {
|
31610
31922
|
let rowId = "";
|
31611
31923
|
if(typeof rowRef === "number") {
|
31612
31924
|
rowId = this.getRowId(rowRef);
|
@@ -31615,12 +31927,11 @@ DataView.prototype.setSegmentSeparator = function(rowRef, enabled) {
|
|
31615
31927
|
}
|
31616
31928
|
|
31617
31929
|
if(rowId) {
|
31618
|
-
|
31619
|
-
if(enabled) {
|
31930
|
+
if(options !== false) { // undefined, null, object, or true value
|
31620
31931
|
this.synchronizeRowOrder();
|
31621
31932
|
}
|
31622
31933
|
// TODO: Force expanding of segment before unsetting segment separator
|
31623
|
-
return this._dt.setSegmentSeparator(rowId,
|
31934
|
+
return this._dt.setSegmentSeparator(rowId, options);
|
31624
31935
|
}
|
31625
31936
|
return false;
|
31626
31937
|
};
|
@@ -31853,10 +32164,22 @@ DataView.prototype.getSegmentChildIds = function(segmentRef) {
|
|
31853
32164
|
/** Sort all of existing segments by multiple sort logics
|
31854
32165
|
* @public
|
31855
32166
|
* @param {Function|Array.<Function>|Object} sortLogics
|
31856
|
-
* @param {Array.<number
|
31857
|
-
* @param {Array.<string
|
32167
|
+
* @param {(number|Array.<number>)=} sortOrders
|
32168
|
+
* @param {(string|Array.<string>)=} cids
|
31858
32169
|
*/
|
31859
32170
|
DataView.prototype.sortSeparators = function (sortLogics, sortOrders, cids) {
|
32171
|
+
let sortingDefs = this._sortingDefs;
|
32172
|
+
if(sortingDefs.length) {
|
32173
|
+
if(!cids) {
|
32174
|
+
cids = sortingDefs[0][0]; // field
|
32175
|
+
}
|
32176
|
+
if(!sortOrders) {
|
32177
|
+
sortOrders = sortingDefs[0][3];
|
32178
|
+
}
|
32179
|
+
} else if(!sortLogics) {
|
32180
|
+
return;
|
32181
|
+
}
|
32182
|
+
|
31860
32183
|
this._dt.sortSeparators(sortLogics, sortOrders, cids);
|
31861
32184
|
};
|
31862
32185
|
/** Sort all of existing segments by given compare function
|
@@ -34807,7 +35130,6 @@ VirtualizedLayoutGrid.prototype.setWidth = function (px) {
|
|
34807
35130
|
};
|
34808
35131
|
/** @override */
|
34809
35132
|
VirtualizedLayoutGrid.prototype.setHeight = function (px) {
|
34810
|
-
console.log("unsupported");
|
34811
35133
|
return false;
|
34812
35134
|
};
|
34813
35135
|
/** {@link ElementWrapper#show}
|
@@ -34986,7 +35308,6 @@ VirtualizedLayoutGrid.prototype.getMinimumRowHeight = function (index) {
|
|
34986
35308
|
};
|
34987
35309
|
/** @inheritDoc */
|
34988
35310
|
VirtualizedLayoutGrid.prototype.setMinimumRowHeight = function (index, val) {
|
34989
|
-
console.log("unsupported");
|
34990
35311
|
return false;
|
34991
35312
|
};
|
34992
35313
|
|
@@ -35062,7 +35383,6 @@ VirtualizedLayoutGrid.prototype.getRowScalability = function (indexY) {
|
|
35062
35383
|
};
|
35063
35384
|
/** @inheritDoc */
|
35064
35385
|
VirtualizedLayoutGrid.prototype.setRowScalability = function (index, val) {
|
35065
|
-
console.log("unsupported");
|
35066
35386
|
return false;
|
35067
35387
|
};
|
35068
35388
|
|
@@ -35208,17 +35528,15 @@ VirtualizedLayoutGrid.prototype.getRowHighlight = function () {
|
|
35208
35528
|
/** @inheritDoc */
|
35209
35529
|
VirtualizedLayoutGrid.prototype.setRowHighlight = function (rowIndex) {
|
35210
35530
|
let prevIndex = this._grid.getRowHighlight();
|
35211
|
-
if (prevIndex >= 0) { prevIndex += this._firstIndex; }
|
35212
35531
|
this._grid.setRowHighlight(rowIndex - this._firstIndex);
|
35213
|
-
//Check row highligh is in view
|
35214
|
-
rowIndex = this._grid.getRowHighlight();
|
35215
|
-
if (rowIndex >= 0) { rowIndex += this._firstIndex; }
|
35216
35532
|
|
35217
35533
|
if (this._hasListener("rowHighlighted")) {
|
35218
|
-
|
35219
|
-
|
35220
|
-
|
35221
|
-
|
35534
|
+
rowIndex = this._grid.getRowHighlight();
|
35535
|
+
|
35536
|
+
this._dispatch("rowHighlighted", {
|
35537
|
+
"prevRowIndex": (prevIndex >= 0) ? prevIndex + this._firstIndex : prevIndex,
|
35538
|
+
"rowIndex": (rowIndex >= 0) ? rowIndex + this._firstIndex : rowIndex
|
35539
|
+
});
|
35222
35540
|
}
|
35223
35541
|
};
|
35224
35542
|
|
@@ -35969,6 +36287,7 @@ let _createHiddenInput = function () {
|
|
35969
36287
|
styleObj.width = styleObj.height = styleObj.padding = styleObj.border = "0";
|
35970
36288
|
hiddenInput.value = "0";
|
35971
36289
|
hiddenInput.role = "grid";
|
36290
|
+
hiddenInput.readOnly = true;
|
35972
36291
|
return hiddenInput;
|
35973
36292
|
};
|
35974
36293
|
/** @private
|
@@ -36515,7 +36834,7 @@ Core.prototype._hasPendingRowChange = false;
|
|
36515
36834
|
* @return {string}
|
36516
36835
|
*/
|
36517
36836
|
Core.getVersion = function () {
|
36518
|
-
return "5.1.
|
36837
|
+
return "5.1.140";
|
36519
36838
|
};
|
36520
36839
|
/** {@link ElementWrapper#dispose}
|
36521
36840
|
* @override
|
@@ -48877,16 +49196,17 @@ Grid_Grid.prototype._onFormulaDataRequired = function(e) {
|
|
48877
49196
|
* @param {Object} e
|
48878
49197
|
*/
|
48879
49198
|
Grid_Grid.prototype._onDataComposed = function(e) {
|
48880
|
-
let
|
48881
|
-
if(!
|
49199
|
+
let changes = e["changes"];
|
49200
|
+
if(!changes) {
|
48882
49201
|
if(e["initialChanges"]) {
|
48883
|
-
|
49202
|
+
changes = e["changes"] = e["initialChanges"]; // Need to keep e["changes"] for backward compatibility.
|
48884
49203
|
} else {
|
48885
49204
|
return; // Cannot do data composition if there is no change in data
|
48886
49205
|
}
|
48887
49206
|
}
|
48888
49207
|
|
48889
|
-
|
49208
|
+
let rowData = e["rowData"];
|
49209
|
+
if(!rowData) {
|
48890
49210
|
return; // Row could already be removed or global change event is sent
|
48891
49211
|
}
|
48892
49212
|
|
@@ -48904,9 +49224,9 @@ Grid_Grid.prototype._onDataComposed = function(e) {
|
|
48904
49224
|
}
|
48905
49225
|
|
48906
49226
|
if(this._autoDateConversion) { // auto data conversion
|
48907
|
-
let
|
48908
|
-
for(field in
|
48909
|
-
colDef = this._getColumnDefinition(field);
|
49227
|
+
let dataType;
|
49228
|
+
for(let field in changes) {
|
49229
|
+
let colDef = this._getColumnDefinition(field);
|
48910
49230
|
if(colDef) {
|
48911
49231
|
dataType = colDef.getDataType();
|
48912
49232
|
} else {
|
@@ -48914,7 +49234,7 @@ Grid_Grid.prototype._onDataComposed = function(e) {
|
|
48914
49234
|
}
|
48915
49235
|
|
48916
49236
|
if(dataType === "datetime") {
|
48917
|
-
value =
|
49237
|
+
let value = rowData[field];
|
48918
49238
|
rowDef.setData(field + "_RAW", value);
|
48919
49239
|
value = DateTime.toDateObject(value);
|
48920
49240
|
rowDef.setData(field, value); // TODO: Check if this trigger data change multiple times
|