@refinitiv-ui/efx-grid 6.0.119 → 6.0.121
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -1
- package/lib/column-dragging/es6/ColumnDragging.js +7 -4
- package/lib/core/dist/core.js +104 -10
- package/lib/core/dist/core.min.js +1 -1
- package/lib/core/es6/data/DataView.js +7 -5
- package/lib/core/es6/grid/Core.js +3 -3
- package/lib/core/es6/grid/components/Cell.d.ts +2 -0
- package/lib/core/es6/grid/components/Cell.js +89 -0
- package/lib/core/es6/grid/components/HScrollbar.d.ts +1 -1
- package/lib/core/es6/grid/components/HScrollbar.js +5 -2
- package/lib/filter-dialog/themes/base-checkbox.less +1 -1
- package/lib/filter-dialog/themes/base.less +8 -3
- package/lib/filter-dialog/themes/elemental/dark/checkbox-list.js +1 -1
- package/lib/filter-dialog/themes/elemental/dark/es5/all-elements.js +2 -2
- package/lib/filter-dialog/themes/elemental/dark/filter-dialog.js +1 -1
- package/lib/filter-dialog/themes/elemental/light/checkbox-list.js +1 -1
- package/lib/filter-dialog/themes/elemental/light/es5/all-elements.js +2 -2
- package/lib/filter-dialog/themes/elemental/light/filter-dialog.js +1 -1
- package/lib/filter-dialog/themes/halo/dark/checkbox-list.js +1 -1
- package/lib/filter-dialog/themes/halo/dark/es5/all-elements.js +2 -2
- package/lib/filter-dialog/themes/halo/dark/filter-dialog.js +1 -1
- package/lib/filter-dialog/themes/halo/light/checkbox-list.js +1 -1
- package/lib/filter-dialog/themes/halo/light/es5/all-elements.js +2 -2
- package/lib/filter-dialog/themes/halo/light/filter-dialog.js +1 -1
- package/lib/filter-dialog/themes/solar/charcoal/checkbox-list.js +1 -1
- package/lib/filter-dialog/themes/solar/charcoal/es5/all-elements.js +2 -2
- package/lib/filter-dialog/themes/solar/charcoal/filter-dialog.js +1 -1
- package/lib/filter-dialog/themes/solar/pearl/checkbox-list.js +1 -1
- package/lib/filter-dialog/themes/solar/pearl/es5/all-elements.js +2 -2
- package/lib/filter-dialog/themes/solar/pearl/filter-dialog.js +1 -1
- package/lib/grid/index.js +1 -1
- package/lib/rt-grid/dist/rt-grid.js +240 -104
- package/lib/rt-grid/dist/rt-grid.min.js +1 -1
- package/lib/rt-grid/es6/ColumnDefinition.js +7 -0
- package/lib/rt-grid/es6/Grid.js +108 -81
- package/lib/rt-grid/es6/RowDefinition.d.ts +1 -1
- package/lib/rt-grid/es6/RowDefinition.js +28 -17
- package/lib/tr-grid-auto-tooltip/es6/AutoTooltip.js +18 -15
- package/lib/tr-grid-checkbox/es6/Checkbox.js +4 -0
- package/lib/tr-grid-column-grouping/es6/ColumnGrouping.js +6 -1
- package/lib/tr-grid-filter-input/es6/FilterInput.js +1 -0
- package/lib/tr-grid-row-dragging/es6/RowDragging.d.ts +0 -2
- package/lib/tr-grid-row-dragging/es6/RowDragging.js +82 -77
- package/lib/tr-grid-row-selection/es6/RowSelection.js +155 -35
- package/lib/types/es6/Core/grid/components/Cell.d.ts +2 -0
- package/lib/types/es6/Core/grid/components/HScrollbar.d.ts +1 -1
- package/lib/types/es6/RealtimeGrid/RowDefinition.d.ts +1 -1
- package/lib/types/es6/RowDragging.d.ts +0 -2
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/versions.json +8 -8
- package/package.json +1 -1
@@ -547,6 +547,13 @@ ColumnDefinition.getDataType = function(field) {
|
|
547
547
|
return "";
|
548
548
|
};
|
549
549
|
/** @public
|
550
|
+
* @ignore
|
551
|
+
* @return {boolean|string|null}
|
552
|
+
*/
|
553
|
+
ColumnDefinition.prototype.getTooltipValue = function() {
|
554
|
+
return this._tooltip;
|
555
|
+
};
|
556
|
+
/** @public
|
550
557
|
* @return {string}
|
551
558
|
*/
|
552
559
|
ColumnDefinition.prototype.getTooltip = function() {
|
package/lib/rt-grid/es6/Grid.js
CHANGED
@@ -274,11 +274,11 @@ let _hasFieldOrId = function(colDef, str) {
|
|
274
274
|
};
|
275
275
|
|
276
276
|
/** Compare the difference in the 'id' property.
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
277
|
+
* @private
|
278
|
+
* @param {Object} obj1
|
279
|
+
* @param {Object} obj2
|
280
|
+
* @returns {boolean} If the id property of two objects is equal, the return will be true, otherwise it will be false.
|
281
|
+
*/
|
282
282
|
let _hasMatchingId = function(obj1, obj2) {
|
283
283
|
if(!obj1 || !obj2 || !obj1.id || !obj2.id) { // Handle nullable, if the object or id have null, it's means difference value
|
284
284
|
return false;
|
@@ -286,6 +286,25 @@ let _hasMatchingId = function(obj1, obj2) {
|
|
286
286
|
return obj1.id === obj2.id;
|
287
287
|
};
|
288
288
|
|
289
|
+
/** @private
|
290
|
+
* @param {Object} e
|
291
|
+
*/
|
292
|
+
let _preventDefault = function(e) {
|
293
|
+
if(e) {
|
294
|
+
e.preventDefault();
|
295
|
+
}
|
296
|
+
};
|
297
|
+
/** @private
|
298
|
+
* @param {number=} id
|
299
|
+
* @returns {number} Always return 0
|
300
|
+
*/
|
301
|
+
let _clearTimeout = function(id) {
|
302
|
+
if(id) {
|
303
|
+
clearTimeout(id);
|
304
|
+
}
|
305
|
+
return 0;
|
306
|
+
};
|
307
|
+
|
289
308
|
/** @constructor
|
290
309
|
* @extends {EventDispatcher}
|
291
310
|
* @param {(Element|null)=} placeholder
|
@@ -596,10 +615,6 @@ Grid.prototype._topSection = true;
|
|
596
615
|
* @private
|
597
616
|
*/
|
598
617
|
Grid.prototype._focusingArgs = null;
|
599
|
-
/** @type {number}
|
600
|
-
* @private
|
601
|
-
*/
|
602
|
-
Grid.prototype._scrolledRow = -1;
|
603
618
|
/** @type {boolean}
|
604
619
|
* @private
|
605
620
|
*/
|
@@ -614,10 +629,8 @@ Grid.prototype.dispose = function() {
|
|
614
629
|
clearInterval(this._autoLayoutTimer);
|
615
630
|
this._autoLayoutTimer = 0;
|
616
631
|
}
|
617
|
-
|
618
|
-
|
619
|
-
this._pollingTimerId = 0;
|
620
|
-
}
|
632
|
+
this._pollingTimerId = _clearTimeout(this._pollingTimerId);
|
633
|
+
|
621
634
|
this.removeAllColumns(); // Some conflators are reset
|
622
635
|
this.removeAllRows(); // Some conflators are reset
|
623
636
|
this._sorter.dispose();
|
@@ -640,9 +653,8 @@ Grid.prototype.dispose = function() {
|
|
640
653
|
}
|
641
654
|
|
642
655
|
if(this._focusingArgs) {
|
643
|
-
|
644
|
-
|
645
|
-
}
|
656
|
+
_clearTimeout(this._focusingArgs.id);
|
657
|
+
_clearTimeout(this._focusingArgs.timeoutId);
|
646
658
|
this._focusingArgs = null;
|
647
659
|
}
|
648
660
|
};
|
@@ -947,6 +959,7 @@ Grid.prototype.initialize = function(gridOption) {
|
|
947
959
|
this.addListener(gridOption, "beforeContentBinding");
|
948
960
|
this.addListener(gridOption, "firstRendered");
|
949
961
|
this.addListener(gridOption, "afterContentBinding");
|
962
|
+
this.addListener(gridOption, "tabNavigation");
|
950
963
|
|
951
964
|
if(gridOption["autoDateConversion"]) {
|
952
965
|
t._autoDateConversion = true;
|
@@ -3463,12 +3476,15 @@ Grid.prototype._renderColumnHeader = function(colIndex, arg) {
|
|
3463
3476
|
let colName = colDef.getName();
|
3464
3477
|
let colTooltip = colDef.getTooltip();
|
3465
3478
|
let headerAlignment = colDef.getHeaderAlignment();
|
3479
|
+
let tooltipValue = colDef.getTooltipValue();
|
3466
3480
|
|
3467
3481
|
for(let r = 0; r < rowCount; ++r) {
|
3468
3482
|
let tCell = tSection.getCell(colIndex, r, false);
|
3469
3483
|
// Default behaviors
|
3470
3484
|
tCell.setContent(colName);
|
3471
|
-
tCell.
|
3485
|
+
tCell.setTooltipInfo("columnDefault", tooltipValue);
|
3486
|
+
tCell.setTooltipInfo("columnTooltip", colTooltip);
|
3487
|
+
tCell.updateTooltip();
|
3472
3488
|
tCell.setStyle("textAlign", headerAlignment);
|
3473
3489
|
|
3474
3490
|
if(customRenderer) {
|
@@ -4096,6 +4112,8 @@ Grid.prototype._logData = function(rowDefs, options) {
|
|
4096
4112
|
|
4097
4113
|
/** @public
|
4098
4114
|
* @description Replace existing row by a new row. Row Id is always changed, after the row is replaced.
|
4115
|
+
* If the rowId of the new row is identical to that of the replacing row. Grid will do nothing because
|
4116
|
+
* similar rowIds indicate that they are the same row.
|
4099
4117
|
* @param {Grid~RowReference} rowRef Reference (i.e. row index, row id, or row definition) of the insert position
|
4100
4118
|
* @param {(RowDefinition~Options|string)=} rowOption
|
4101
4119
|
* @returns {RowDefinition} Returns null, if the row is not replaced. Otherwise, a newly created row is returned
|
@@ -4216,38 +4234,49 @@ Grid.prototype.getVScrollView = function () {
|
|
4216
4234
|
return this._grid.getVScrollView();
|
4217
4235
|
};
|
4218
4236
|
|
4219
|
-
/** @private
|
4220
|
-
* @param {Element} el
|
4221
|
-
* @return {boolean}
|
4222
|
-
*/
|
4223
|
-
function isFocusableContent(el) {
|
4224
|
-
if(el) {
|
4225
|
-
return (el.tagName !== "SPAN" && !el.disabled);
|
4226
|
-
}
|
4227
|
-
return false;
|
4228
|
-
}
|
4229
4237
|
/** @private
|
4230
4238
|
* @param {Object} cell
|
4239
|
+
* @param {Object} args
|
4231
4240
|
* @return {boolean}
|
4232
4241
|
*/
|
4233
|
-
function
|
4242
|
+
Grid.prototype._focusCell = function(cell, args) {
|
4234
4243
|
if(cell) {
|
4235
4244
|
let cellContent = cell.getContent();
|
4236
|
-
if(cellContent
|
4237
|
-
|
4238
|
-
|
4245
|
+
if(cellContent) {
|
4246
|
+
let nfe = null;
|
4247
|
+
if(this.hasListener("tabNavigation")) {
|
4248
|
+
let tabNavArg = {
|
4249
|
+
"shiftKey": args.shiftKey,
|
4250
|
+
"activeElement": args.activeElement,
|
4251
|
+
"cellContent": cellContent,
|
4252
|
+
"cell": cell,
|
4253
|
+
"colIndex": args.colIndex,
|
4254
|
+
"rowIndex": args.rowIndex,
|
4255
|
+
"field": args.fields ? args.fields[args.colIndex] : ""
|
4256
|
+
};
|
4257
|
+
this._dispatch("tabNavigation", tabNavArg);
|
4258
|
+
nfe = tabNavArg.nextFocusableElement;
|
4259
|
+
} else if(cellContent.tagName !== "SPAN") {
|
4260
|
+
nfe = cellContent;
|
4261
|
+
}
|
4262
|
+
|
4263
|
+
if(nfe && nfe !== args.activeElement && !nfe.disabled) {
|
4264
|
+
nfe.focus();
|
4265
|
+
return true;
|
4266
|
+
}
|
4239
4267
|
}
|
4240
4268
|
}
|
4241
4269
|
return false;
|
4242
|
-
}
|
4270
|
+
};
|
4243
4271
|
/** @private
|
4244
4272
|
*/
|
4245
4273
|
Grid.prototype._onVScroll = function() {
|
4246
4274
|
let args = this._focusingArgs;
|
4247
4275
|
if(args) {
|
4276
|
+
args.timeoutId = _clearTimeout(args.timeoutId);
|
4248
4277
|
this._focusingArgs = null;
|
4249
4278
|
let cell = this._grid.getCell("content", args.colIndex, args.rowIndex);
|
4250
|
-
if(!
|
4279
|
+
if(!this._focusCell(cell, args)) {
|
4251
4280
|
if(args.shiftKey) {
|
4252
4281
|
this._focusPrevCellContent(args);
|
4253
4282
|
} else {
|
@@ -4258,6 +4287,11 @@ Grid.prototype._onVScroll = function() {
|
|
4258
4287
|
};
|
4259
4288
|
/** @private
|
4260
4289
|
*/
|
4290
|
+
Grid.prototype._onScrollTimeout = function() {
|
4291
|
+
this._focusingArgs = null;
|
4292
|
+
};
|
4293
|
+
/** @private
|
4294
|
+
*/
|
4261
4295
|
Grid.prototype._selfScrollToRow = function() {
|
4262
4296
|
let args = this._focusingArgs;
|
4263
4297
|
if(args) {
|
@@ -4267,20 +4301,14 @@ Grid.prototype._selfScrollToRow = function() {
|
|
4267
4301
|
};
|
4268
4302
|
/** @private
|
4269
4303
|
* @param {Object} args
|
4270
|
-
* @param {number} colIndex
|
4271
|
-
* @param {number} rowIndex
|
4272
4304
|
*/
|
4273
|
-
Grid.prototype._requestScroll = function(args
|
4274
|
-
if(this._focusingArgs
|
4275
|
-
|
4305
|
+
Grid.prototype._requestScroll = function(args) {
|
4306
|
+
if(!this._focusingArgs) {
|
4307
|
+
this._focusingArgs = args;
|
4308
|
+
args.event = null; // The event is invalid after the scroll
|
4309
|
+
args.id = setTimeout(this._selfScrollToRow, 0); // Avoid event loop protection
|
4310
|
+
args.timeoutId = setTimeout(this._onScrollTimeout, 100); // To avoid a fail case where scroll cannot be performed
|
4276
4311
|
}
|
4277
|
-
|
4278
|
-
this._scrolledRow = args.rowIndex;
|
4279
|
-
this._focusingArgs = args;
|
4280
|
-
args.colIndex = colIndex;
|
4281
|
-
args.rowIndex = rowIndex;
|
4282
|
-
args.event = null; // The event is invalid after the scroll
|
4283
|
-
args.id = setTimeout(this._selfScrollToRow); // Avoid event loop protection
|
4284
4312
|
};
|
4285
4313
|
/** @private
|
4286
4314
|
* @param {Object} args
|
@@ -4304,28 +4332,27 @@ Grid.prototype._focusNextCellContent = function(args) {
|
|
4304
4332
|
startIdx = i;
|
4305
4333
|
}
|
4306
4334
|
}
|
4307
|
-
// If the current focus is on a valid content, starts on the next cell
|
4308
|
-
if(args.event && args.validContent) {
|
4309
|
-
startIdx++;
|
4310
|
-
}
|
4311
4335
|
|
4312
4336
|
let grid = this._grid;
|
4313
4337
|
let section = grid.getSection("content");
|
4314
4338
|
let viewInfo = grid.getVerticalViewInfo();
|
4315
4339
|
let lastFullRow = viewInfo.lastFullRow;
|
4316
4340
|
let rowCount = this.getRowCount();
|
4341
|
+
|
4342
|
+
args.fields = grid.getColumnFields();
|
4317
4343
|
for(let r = rowIndex; r < rowCount; r++) {
|
4344
|
+
args.rowIndex = r;
|
4318
4345
|
for(i = startIdx; i < len; i++) {
|
4319
4346
|
let c = focusableColIndices[i];
|
4347
|
+
args.colIndex = c;
|
4320
4348
|
if(r > lastFullRow) {
|
4321
|
-
|
4349
|
+
_preventDefault(args.event);
|
4350
|
+
this._requestScroll(args);
|
4322
4351
|
return;
|
4323
4352
|
} else {
|
4324
4353
|
let cell = section.getCell(c, r);
|
4325
|
-
if(
|
4326
|
-
|
4327
|
-
args.event.preventDefault();
|
4328
|
-
}
|
4354
|
+
if(this._focusCell(cell, args)) {
|
4355
|
+
_preventDefault(args.event);
|
4329
4356
|
return;
|
4330
4357
|
}
|
4331
4358
|
}
|
@@ -4333,9 +4360,8 @@ Grid.prototype._focusNextCellContent = function(args) {
|
|
4333
4360
|
startIdx = 0;
|
4334
4361
|
}
|
4335
4362
|
|
4336
|
-
|
4337
|
-
|
4338
|
-
}
|
4363
|
+
// The current focus on the last focusable content
|
4364
|
+
this._grid.getHiddenInput().focus();
|
4339
4365
|
};
|
4340
4366
|
/** @private
|
4341
4367
|
* @param {Object} args
|
@@ -4359,27 +4385,26 @@ Grid.prototype._focusPrevCellContent = function(args) {
|
|
4359
4385
|
startIdx = i;
|
4360
4386
|
}
|
4361
4387
|
}
|
4362
|
-
// If the current focus is on a valid content, starts on the next cell
|
4363
|
-
if(args.event && args.validContent) {
|
4364
|
-
--startIdx;
|
4365
|
-
}
|
4366
4388
|
|
4367
4389
|
let grid = this._grid;
|
4368
4390
|
let section = grid.getSection("content");
|
4369
4391
|
let viewInfo = grid.getVerticalViewInfo();
|
4370
4392
|
let firstFullRow = viewInfo.firstFullRow;
|
4393
|
+
|
4394
|
+
args.fields = this.getColumnFields();
|
4371
4395
|
for(let r = rowIndex; r >= 0; r--) {
|
4396
|
+
args.rowIndex = r;
|
4372
4397
|
for(i = startIdx; i >= 0; i--) {
|
4373
4398
|
let c = focusableColIndices[i];
|
4399
|
+
args.colIndex = c;
|
4374
4400
|
if(r < firstFullRow) {
|
4375
|
-
|
4401
|
+
_preventDefault(args.event);
|
4402
|
+
this._requestScroll(args);
|
4376
4403
|
return;
|
4377
4404
|
} else {
|
4378
4405
|
let cell = section.getCell(c, r);
|
4379
|
-
if(
|
4380
|
-
|
4381
|
-
args.event.preventDefault();
|
4382
|
-
}
|
4406
|
+
if(this._focusCell(cell, args)) {
|
4407
|
+
_preventDefault(args.event);
|
4383
4408
|
return;
|
4384
4409
|
}
|
4385
4410
|
}
|
@@ -4387,15 +4412,18 @@ Grid.prototype._focusPrevCellContent = function(args) {
|
|
4387
4412
|
startIdx = len - 1;
|
4388
4413
|
}
|
4389
4414
|
|
4390
|
-
|
4391
|
-
|
4392
|
-
}
|
4415
|
+
// The current focus on the last focusable content
|
4416
|
+
this._grid.getHiddenInput(true).focus();
|
4393
4417
|
};
|
4394
4418
|
|
4395
4419
|
/** @private
|
4396
4420
|
* @param {Object} e
|
4397
4421
|
*/
|
4398
4422
|
Grid.prototype._onTabNavigation = function(e) {
|
4423
|
+
if(this._focusingArgs) {
|
4424
|
+
return; // Cannot do another tab navigation while waiting for scrolling
|
4425
|
+
}
|
4426
|
+
|
4399
4427
|
let colDefs = this.getColumnDefinitions();
|
4400
4428
|
let colCount = colDefs.length;
|
4401
4429
|
|
@@ -4410,19 +4438,8 @@ Grid.prototype._onTabNavigation = function(e) {
|
|
4410
4438
|
return;
|
4411
4439
|
}
|
4412
4440
|
|
4413
|
-
this._scrolledRow = -1; // Reset the scroll loop protector
|
4414
4441
|
let keyEvt = e.event;
|
4415
4442
|
let pos = this.getRelativePosition(keyEvt);
|
4416
|
-
let validContent = true;
|
4417
|
-
let activeElement = e.activeElement;
|
4418
|
-
if(activeElement) {
|
4419
|
-
validContent = !activeElement.classList.contains("valigner");
|
4420
|
-
}
|
4421
|
-
|
4422
|
-
if(validContent) {
|
4423
|
-
let content = pos["cell"] ? pos["cell"].getContent() : null;
|
4424
|
-
validContent = isFocusableContent(content);
|
4425
|
-
}
|
4426
4443
|
let startingRowIndex = pos["rowIndex"];
|
4427
4444
|
if(e.onTheEdge) {
|
4428
4445
|
let viewInfo = this._grid.getVerticalViewInfo();
|
@@ -4434,7 +4451,7 @@ Grid.prototype._onTabNavigation = function(e) {
|
|
4434
4451
|
colIndex: pos["colIndex"],
|
4435
4452
|
rowIndex: startingRowIndex,
|
4436
4453
|
focusableColIndices: focusableColIndices,
|
4437
|
-
|
4454
|
+
activeElement: e.activeElement
|
4438
4455
|
};
|
4439
4456
|
|
4440
4457
|
if(keyEvt.shiftKey) {
|
@@ -4444,5 +4461,15 @@ Grid.prototype._onTabNavigation = function(e) {
|
|
4444
4461
|
}
|
4445
4462
|
};
|
4446
4463
|
|
4464
|
+
/** @public
|
4465
|
+
* @ignore
|
4466
|
+
* @return {!Object}
|
4467
|
+
*/
|
4468
|
+
Grid.prototype._getEventHandlers = function() {
|
4469
|
+
return {
|
4470
|
+
"tabNavigation": this._onTabNavigation
|
4471
|
+
};
|
4472
|
+
};
|
4473
|
+
|
4447
4474
|
export { Grid };
|
4448
4475
|
export default Grid;
|
@@ -108,7 +108,7 @@ declare class RowDefinition {
|
|
108
108
|
|
109
109
|
public resetUpdates(): void;
|
110
110
|
|
111
|
-
public registerToView(view: DataView|null,
|
111
|
+
public registerToView(view: DataView|null, destRowId?: string|null): void;
|
112
112
|
|
113
113
|
public static deregisterFromView(rowIds: (string)[]|null, rowDef: RowDefinition|null): (string)[]|null;
|
114
114
|
|
@@ -17,7 +17,7 @@ import { DataTable } from "../../core/es6/data/DataTable.js";
|
|
17
17
|
* @property {boolean=} hidden=true When this row is hidden
|
18
18
|
* @property {boolean=} realTime=true Realtime row, able to request for JET/RTK
|
19
19
|
* @property {Object=} info=null For storing any additional information to the row
|
20
|
-
* @property {string=} rowId Row identifier used for referencing the row
|
20
|
+
* @property {string=} rowId Row identifier used for referencing the row. The value cannot be in "_x_" format.
|
21
21
|
*/
|
22
22
|
|
23
23
|
/** @typedef {Object} RowDefinition~RowTypes
|
@@ -48,6 +48,12 @@ const ROW_TYPES = {
|
|
48
48
|
GROUP_MEMBER: "GROUP_MEMBER"
|
49
49
|
};
|
50
50
|
|
51
|
+
/** @type {RegExp}
|
52
|
+
* @private
|
53
|
+
* @const
|
54
|
+
*/
|
55
|
+
const ROW_ID_PATTERN = /^_[^_]+_$/;
|
56
|
+
|
51
57
|
/** @constructor
|
52
58
|
* @param {RowDefinition~Options=} rowOptions
|
53
59
|
*/
|
@@ -236,8 +242,12 @@ RowDefinition.prototype.initialize = function(rowOptions) {
|
|
236
242
|
if(!this._autoGenerated) {
|
237
243
|
let userRowId = rowOptions["rowId"];
|
238
244
|
if(userRowId && typeof userRowId === "string") {
|
239
|
-
|
240
|
-
|
245
|
+
if(userRowId.match(ROW_ID_PATTERN)) {
|
246
|
+
console.warn("Please change the rowId format to avoid duplicated rows' id causing unexpected behavior.");
|
247
|
+
} else {
|
248
|
+
this._rowId = this._dataId = userRowId;
|
249
|
+
this._userId = true;
|
250
|
+
}
|
241
251
|
}
|
242
252
|
}
|
243
253
|
|
@@ -991,14 +1001,20 @@ RowDefinition.prototype.resetUpdates = function() {
|
|
991
1001
|
|
992
1002
|
/** @public
|
993
1003
|
* @param {DataView} view
|
994
|
-
* @param {string=}
|
1004
|
+
* @param {string=} destRowId Destination position where the row will be placed BEFORE the specified position.
|
995
1005
|
*/
|
996
|
-
RowDefinition.prototype.registerToView = function(view,
|
1006
|
+
RowDefinition.prototype.registerToView = function(view, destRowId) {
|
997
1007
|
if(!view || this._view === view) {
|
998
1008
|
return; // Already in the view
|
999
1009
|
}
|
1000
1010
|
this._view = view;
|
1001
1011
|
|
1012
|
+
let rowId = this.getRowId();
|
1013
|
+
if(view.getRowData(rowId)) {
|
1014
|
+
console.warn("Duplicated rows' id.");
|
1015
|
+
return;
|
1016
|
+
}
|
1017
|
+
|
1002
1018
|
let rowData = null;
|
1003
1019
|
if(this._subSegment) {
|
1004
1020
|
rowData = this._view.getRowData(this.getRowId());
|
@@ -1013,32 +1029,27 @@ RowDefinition.prototype.registerToView = function(view, rowId) {
|
|
1013
1029
|
|
1014
1030
|
let parentRowId = "";
|
1015
1031
|
let isSegment = this._isChain || this._asSegment;
|
1016
|
-
if(
|
1017
|
-
parentRowId = view.getSegmentParentRowId(
|
1032
|
+
if(destRowId) {
|
1033
|
+
parentRowId = view.getSegmentParentRowId(destRowId);
|
1018
1034
|
if(parentRowId) {
|
1019
1035
|
if(isSegment) { // A chain or a segment cannot be put inside another segment
|
1020
|
-
|
1036
|
+
destRowId = _getEndOfSegmentRowId(view, destRowId);
|
1021
1037
|
} // else { // Normal row is inserted into a segment
|
1022
1038
|
}
|
1023
1039
|
}
|
1024
1040
|
|
1025
1041
|
let stalledSorting = _stallSorting(view, isSegment, false);
|
1026
|
-
|
1027
|
-
let newRowId = view.insertRow(rowId, rowData, this.getRowId());
|
1028
|
-
if(newRowId !== this._rowId) {
|
1029
|
-
this._rowId = newRowId; // In case there is some duplicate row id
|
1030
|
-
this._userId = false;
|
1031
|
-
}
|
1042
|
+
view.insertRow(destRowId, rowData, rowId);
|
1032
1043
|
|
1033
1044
|
if(isSegment) {
|
1034
|
-
view.setSegmentSeparator(
|
1045
|
+
view.setSegmentSeparator(rowId);
|
1035
1046
|
_stallSorting(view, false, stalledSorting);
|
1036
1047
|
if(this._collapsed != null) {
|
1037
|
-
view.collapseSegment(
|
1048
|
+
view.collapseSegment(rowId, this._collapsed);
|
1038
1049
|
this._collapsed = null;
|
1039
1050
|
}
|
1040
1051
|
} else if(!this._parent && parentRowId) { // Constituent cannot be added to another segment
|
1041
|
-
view.addSegmentChild(parentRowId,
|
1052
|
+
view.addSegmentChild(parentRowId, rowId, this._dataId);
|
1042
1053
|
}
|
1043
1054
|
};
|
1044
1055
|
/** @private
|
@@ -417,28 +417,31 @@ AutoTooltipPlugin.prototype._updateNonContentSection = function (section, colInd
|
|
417
417
|
var elem = cell.getContent();
|
418
418
|
if(!elem) { return false; }
|
419
419
|
|
420
|
-
|
421
|
-
|
420
|
+
var tooltipInfo = cell.getTooltipInfo();
|
421
|
+
if(tooltipInfo) {
|
422
|
+
if(tooltipInfo["userTooltip"] != null ||
|
423
|
+
tooltipInfo["groupHeaderDefault"] != null ||
|
424
|
+
tooltipInfo["columnDefault"] != null) {
|
425
|
+
|
426
|
+
cell.setTooltipInfo("clippedText", false);
|
427
|
+
cell.removeAttribute("ef-title");
|
428
|
+
continue;
|
429
|
+
}
|
430
|
+
}
|
422
431
|
|
432
|
+
// Set tooltip only if text's length is longer than column width.
|
423
433
|
var sw = elem.scrollWidth;
|
424
434
|
if(sw && sw > elem.offsetWidth) {
|
425
|
-
|
426
|
-
tooltip = cell.getTextContent(); // TODO: Allow custom tooltip text
|
427
|
-
cell._autoTooltip = true;
|
428
|
-
}
|
429
|
-
} else {
|
430
|
-
if(cell._autoTooltip) {
|
431
|
-
tooltip = "";
|
432
|
-
cell._autoTooltip = false;
|
433
|
-
}
|
434
|
-
}
|
435
|
+
cell.setTooltipInfo("clippedText", true);
|
435
436
|
|
436
|
-
|
437
|
-
|
438
|
-
cell.setAttribute("ef-title", tooltip);
|
437
|
+
var tooltip = cell.getTextContent();
|
438
|
+
cell.setTooltipInfo("clippedTextTooltip", tooltip);
|
439
|
+
cell.setAttribute("ef-title", tooltip);
|
439
440
|
} else {
|
441
|
+
cell.setTooltipInfo("clippedText", false);
|
440
442
|
cell.removeAttribute("ef-title");
|
441
443
|
}
|
444
|
+
cell.updateTooltip();
|
442
445
|
}
|
443
446
|
return true;
|
444
447
|
};
|
@@ -710,6 +710,9 @@ CheckboxPlugin.prototype._createCheckbox = function (sectionSettings, colIndex,
|
|
710
710
|
|
711
711
|
cell.setContent(chkbox);
|
712
712
|
let sectionType = sectionSettings.getType();
|
713
|
+
if(sectionType === "title") {
|
714
|
+
chkbox.setAttribute("aria-label", "all rows");
|
715
|
+
}
|
713
716
|
|
714
717
|
if(!this._coralCheckboxVer) { // Workaround for UIFR theme styling
|
715
718
|
let lbl = document.createElement("label");
|
@@ -1658,6 +1661,7 @@ CheckboxPlugin.prototype._onPostSectionDataBinding = function (e) {
|
|
1658
1661
|
if(!chkbox) {
|
1659
1662
|
chkbox = checkboxes[i] = this._createCheckbox(sectionSettings, this._displayColumn, rowIndex);
|
1660
1663
|
}
|
1664
|
+
chkbox.setAttribute("aria-label", "row " + rowIndex);
|
1661
1665
|
let rowId = dv.getRowId(rowIndex); // Slow
|
1662
1666
|
rowData = this._getRowFromId(dv, rowId);
|
1663
1667
|
if(hasBinding && chkbox) {
|
@@ -516,6 +516,9 @@ ColumnGroupingPlugin.prototype._applyGrouping = function () {
|
|
516
516
|
cell.removeClass("no-sort");
|
517
517
|
cell.removeClass("selected-group");
|
518
518
|
cell.removeAttribute("group-id");
|
519
|
+
cell.setTooltipInfo("groupHeaderDefault", false);
|
520
|
+
cell.setTooltipInfo("groupHeaderTooltip", null);
|
521
|
+
cell.updateTooltip();
|
519
522
|
}
|
520
523
|
}
|
521
524
|
}
|
@@ -909,7 +912,9 @@ ColumnGroupingPlugin.prototype._renderGroup = function(groupDef, section) {
|
|
909
912
|
if(cell) {
|
910
913
|
// Overide the defaults
|
911
914
|
cell.setStyle("text-align", groupDef["alignment"] || "");
|
912
|
-
cell.
|
915
|
+
cell.setTooltipInfo("groupHeaderDefault", groupDef["tooltip"]);
|
916
|
+
cell.setTooltipInfo("groupHeaderTooltip", ColumnGroupingPlugin._getTooltip(groupDef));
|
917
|
+
cell.updateTooltip();
|
913
918
|
cell.setContent(groupDef["name"] || groupDef["title"]);
|
914
919
|
|
915
920
|
// Additional cell settings must be removed in the _applyGrouping() method
|
@@ -532,6 +532,7 @@ FilterInputPlugin.prototype._createFilterUI = function (colOpt) {
|
|
532
532
|
elem.className = "filter-input";
|
533
533
|
elem.style.width = "100%";
|
534
534
|
elem.style.margin = "0";
|
535
|
+
elem.setAttribute("aria-label", "column filtering");
|
535
536
|
var placeholder = colOpt["placeholder"];
|
536
537
|
|
537
538
|
if (placeholder) {
|