@clr/angular 13.2.0 → 13.3.1
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/clarity.api.md +4 -3
- package/data/datagrid/datagrid.d.ts +5 -1
- package/data/datagrid/utils/key-navigation-grid.controller.d.ts +27 -0
- package/esm2020/data/datagrid/datagrid-placeholder.mjs +3 -3
- package/esm2020/data/datagrid/datagrid.mjs +26 -12
- package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +172 -0
- package/esm2020/forms/combobox/combobox.mjs +3 -3
- package/esm2020/forms/password/password-container.mjs +3 -11
- package/esm2020/layout/nav/nav-level.mjs +2 -2
- package/fesm2015/clr-angular.mjs +196 -21
- package/fesm2015/clr-angular.mjs.map +1 -1
- package/fesm2020/clr-angular.mjs +191 -21
- package/fesm2020/clr-angular.mjs.map +1 -1
- package/package.json +1 -1
package/fesm2015/clr-angular.mjs
CHANGED
|
@@ -6430,11 +6430,7 @@ ClrPasswordContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
|
|
|
6430
6430
|
class="clr-input-group-icon-action"
|
|
6431
6431
|
type="button"
|
|
6432
6432
|
>
|
|
6433
|
-
<cds-icon
|
|
6434
|
-
status="info"
|
|
6435
|
-
[attr.shape]="show ? 'eye-hide' : 'eye'"
|
|
6436
|
-
[attr.title]="show ? commonStrings.keys.hide : commonStrings.keys.show"
|
|
6437
|
-
></cds-icon>
|
|
6433
|
+
<cds-icon status="info" [attr.shape]="show ? 'eye-hide' : 'eye'"></cds-icon>
|
|
6438
6434
|
<span class="clr-sr-only">{{
|
|
6439
6435
|
show ? commonStrings.keys.passwordHide : commonStrings.keys.passwordShow
|
|
6440
6436
|
}}</span>
|
|
@@ -6478,11 +6474,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
6478
6474
|
class="clr-input-group-icon-action"
|
|
6479
6475
|
type="button"
|
|
6480
6476
|
>
|
|
6481
|
-
<cds-icon
|
|
6482
|
-
status="info"
|
|
6483
|
-
[attr.shape]="show ? 'eye-hide' : 'eye'"
|
|
6484
|
-
[attr.title]="show ? commonStrings.keys.hide : commonStrings.keys.show"
|
|
6485
|
-
></cds-icon>
|
|
6477
|
+
<cds-icon status="info" [attr.shape]="show ? 'eye-hide' : 'eye'"></cds-icon>
|
|
6486
6478
|
<span class="clr-sr-only">{{
|
|
6487
6479
|
show ? commonStrings.keys.passwordHide : commonStrings.keys.passwordShow
|
|
6488
6480
|
}}</span>
|
|
@@ -9105,7 +9097,7 @@ ClrCombobox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "
|
|
|
9105
9097
|
ClrPopoverToggleService,
|
|
9106
9098
|
ClrPopoverEventsService,
|
|
9107
9099
|
ClrPopoverPositionService,
|
|
9108
|
-
], queries: [{ propertyName: "optionSelected", first: true, predicate: ClrOptionSelected, descendants: true }], viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textboxInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n* Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n* This software is released under MIT license.\n* The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n >\n </ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n [id]=\"inputId()\"\n
|
|
9100
|
+
], queries: [{ propertyName: "optionSelected", first: true, predicate: ClrOptionSelected, descendants: true }], viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textboxInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n* Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n* This software is released under MIT license.\n* The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n >\n </ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\" role=\"combobox\">\n <input\n #textboxInput\n type=\"text\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\" size=\"12\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\n", components: [{ type: ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }], directives: [{ type: ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: CdsIconCustomTag, selector: "cds-icon" }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: ClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { type: ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] });
|
|
9109
9101
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrCombobox, decorators: [{
|
|
9110
9102
|
type: Component,
|
|
9111
9103
|
args: [{ selector: 'clr-combobox', providers: [
|
|
@@ -9124,7 +9116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
9124
9116
|
'[class.aria-required]': 'true',
|
|
9125
9117
|
'[class.clr-combobox]': 'true',
|
|
9126
9118
|
'[class.clr-combobox-disabled]': 'control?.disabled',
|
|
9127
|
-
}, template: "<!--\n* Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n* This software is released under MIT license.\n* The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n >\n </ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n [id]=\"inputId()\"\n
|
|
9119
|
+
}, template: "<!--\n* Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n* This software is released under MIT license.\n* The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n >\n </ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\" role=\"combobox\">\n <input\n #textboxInput\n type=\"text\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\" size=\"12\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\n" }]
|
|
9128
9120
|
}], ctorParameters: function () {
|
|
9129
9121
|
return [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
|
|
9130
9122
|
type: Self
|
|
@@ -13211,7 +13203,7 @@ ClrDatagridPlaceholder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", v
|
|
|
13211
13203
|
ClrDatagridPlaceholder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder", host: { properties: { "class.datagrid-placeholder-container": "true" } }, ngImport: i0, template: `
|
|
13212
13204
|
<div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
|
|
13213
13205
|
<div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
|
|
13214
|
-
<span role="gridcell"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13206
|
+
<span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13215
13207
|
</div>
|
|
13216
13208
|
`, isInline: true, directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
13217
13209
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrDatagridPlaceholder, decorators: [{
|
|
@@ -13221,7 +13213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
13221
13213
|
template: `
|
|
13222
13214
|
<div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
|
|
13223
13215
|
<div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
|
|
13224
|
-
<span role="gridcell"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13216
|
+
<span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13225
13217
|
</div>
|
|
13226
13218
|
`,
|
|
13227
13219
|
host: { '[class.datagrid-placeholder-container]': 'true' },
|
|
@@ -14371,13 +14363,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
14371
14363
|
type: Injectable
|
|
14372
14364
|
}] });
|
|
14373
14365
|
|
|
14366
|
+
/*
|
|
14367
|
+
* Copyright (c) 2016-2022 VMware, Inc. All Rights Reserved.
|
|
14368
|
+
* This software is released under MIT license.
|
|
14369
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
14370
|
+
*/
|
|
14371
|
+
function getTabableItems(el) {
|
|
14372
|
+
const tabableSelector = [
|
|
14373
|
+
'a[href]',
|
|
14374
|
+
'area[href]',
|
|
14375
|
+
'input:not([disabled])',
|
|
14376
|
+
'button:not([disabled])',
|
|
14377
|
+
'select:not([disabled])',
|
|
14378
|
+
'textarea:not([disabled])',
|
|
14379
|
+
'iframe',
|
|
14380
|
+
'object',
|
|
14381
|
+
'embed',
|
|
14382
|
+
'*[tabindex]',
|
|
14383
|
+
'*[contenteditable=true]',
|
|
14384
|
+
'[role=button]:not([disabled])',
|
|
14385
|
+
].join(',');
|
|
14386
|
+
return Array.from(el.querySelectorAll(tabableSelector));
|
|
14387
|
+
}
|
|
14388
|
+
class KeyNavigationGridController {
|
|
14389
|
+
constructor(zone) {
|
|
14390
|
+
this.zone = zone;
|
|
14391
|
+
this.listenersAdded = false;
|
|
14392
|
+
this.destroy$ = new Subject();
|
|
14393
|
+
this.config = {
|
|
14394
|
+
keyGridRows: '[role=row]:not(.datagrid-placeholder)',
|
|
14395
|
+
keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
|
|
14396
|
+
keyGrid: '[role=grid]',
|
|
14397
|
+
};
|
|
14398
|
+
}
|
|
14399
|
+
get grid() {
|
|
14400
|
+
var _a;
|
|
14401
|
+
return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
|
|
14402
|
+
}
|
|
14403
|
+
get rows() {
|
|
14404
|
+
var _a;
|
|
14405
|
+
return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
|
|
14406
|
+
}
|
|
14407
|
+
get cells() {
|
|
14408
|
+
var _a;
|
|
14409
|
+
return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
|
|
14410
|
+
}
|
|
14411
|
+
ngOnDestroy() {
|
|
14412
|
+
this.destroy$.next();
|
|
14413
|
+
this.destroy$.complete();
|
|
14414
|
+
}
|
|
14415
|
+
addListeners() {
|
|
14416
|
+
if (this.listenersAdded) {
|
|
14417
|
+
return;
|
|
14418
|
+
}
|
|
14419
|
+
this.zone.runOutsideAngular(() => {
|
|
14420
|
+
fromEvent(this.grid, 'mousedown')
|
|
14421
|
+
.pipe(takeUntil(this.destroy$))
|
|
14422
|
+
.subscribe((e) => {
|
|
14423
|
+
// preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
|
|
14424
|
+
if (e.buttons === 1 && !e.ctrlKey) {
|
|
14425
|
+
const activeCell = this.cells
|
|
14426
|
+
? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
|
|
14427
|
+
: null;
|
|
14428
|
+
if (activeCell) {
|
|
14429
|
+
this.setActiveCell(activeCell);
|
|
14430
|
+
}
|
|
14431
|
+
}
|
|
14432
|
+
});
|
|
14433
|
+
fromEvent(this.grid, 'keydown')
|
|
14434
|
+
.pipe(takeUntil(this.destroy$))
|
|
14435
|
+
.subscribe((e) => {
|
|
14436
|
+
// Skip column resize events
|
|
14437
|
+
if (e.target.classList.contains('drag-handle') &&
|
|
14438
|
+
(e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
|
|
14439
|
+
return;
|
|
14440
|
+
}
|
|
14441
|
+
if (e.code === 'ArrowUp' ||
|
|
14442
|
+
e.code === 'ArrowDown' ||
|
|
14443
|
+
e.code === 'ArrowLeft' ||
|
|
14444
|
+
e.code === 'ArrowRight' ||
|
|
14445
|
+
e.code === 'End' ||
|
|
14446
|
+
e.code === 'Home' ||
|
|
14447
|
+
e.code === 'PageUp' ||
|
|
14448
|
+
e.code === 'PageDown') {
|
|
14449
|
+
const { x, y } = this.getNextItemCoordinate(e);
|
|
14450
|
+
const activeItem = this.rows
|
|
14451
|
+
? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
|
|
14452
|
+
: null;
|
|
14453
|
+
if (activeItem) {
|
|
14454
|
+
this.setActiveCell(activeItem);
|
|
14455
|
+
}
|
|
14456
|
+
e.preventDefault();
|
|
14457
|
+
}
|
|
14458
|
+
});
|
|
14459
|
+
});
|
|
14460
|
+
this.listenersAdded = true;
|
|
14461
|
+
}
|
|
14462
|
+
initializeKeyGrid(host) {
|
|
14463
|
+
this.host = host;
|
|
14464
|
+
this.addListeners();
|
|
14465
|
+
this.resetKeyGrid();
|
|
14466
|
+
}
|
|
14467
|
+
resetKeyGrid() {
|
|
14468
|
+
var _a;
|
|
14469
|
+
(_a = this.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
|
|
14470
|
+
const firstCell = this.cells ? this.cells[0] : null;
|
|
14471
|
+
firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
|
|
14472
|
+
}
|
|
14473
|
+
setActiveCell(activeCell) {
|
|
14474
|
+
const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
|
|
14475
|
+
if (prior) {
|
|
14476
|
+
prior.setAttribute('tabindex', '-1');
|
|
14477
|
+
}
|
|
14478
|
+
activeCell.setAttribute('tabindex', '0');
|
|
14479
|
+
const items = getTabableItems(activeCell);
|
|
14480
|
+
const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
|
|
14481
|
+
item.focus();
|
|
14482
|
+
}
|
|
14483
|
+
getNextItemCoordinate(e) {
|
|
14484
|
+
var _a;
|
|
14485
|
+
let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
|
|
14486
|
+
if (e.code === 'Tab') {
|
|
14487
|
+
currentCell = document.activeElement;
|
|
14488
|
+
}
|
|
14489
|
+
const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
|
|
14490
|
+
const numOfRows = this.rows ? this.rows.length - 1 : 0;
|
|
14491
|
+
const numOfColumns = this.cells ? this.cells.length / this.rows.length - 1 : 0;
|
|
14492
|
+
let x = currentRow && currentCell
|
|
14493
|
+
? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
|
|
14494
|
+
: 0;
|
|
14495
|
+
let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
|
|
14496
|
+
const dir = this.host.dir;
|
|
14497
|
+
const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
|
|
14498
|
+
const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
|
|
14499
|
+
const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
|
|
14500
|
+
if (e.code === 'ArrowUp' && y !== 0) {
|
|
14501
|
+
y = y - 1;
|
|
14502
|
+
}
|
|
14503
|
+
else if (e.code === 'ArrowDown' && y < numOfRows) {
|
|
14504
|
+
y = y + 1;
|
|
14505
|
+
}
|
|
14506
|
+
else if (e.code === inlineStart && x !== 0) {
|
|
14507
|
+
x = x - 1;
|
|
14508
|
+
}
|
|
14509
|
+
else if (e.code === inlineEnd && x < numOfColumns) {
|
|
14510
|
+
x = x + 1;
|
|
14511
|
+
}
|
|
14512
|
+
else if (e.code === 'End') {
|
|
14513
|
+
x = numOfColumns;
|
|
14514
|
+
if (e.ctrlKey) {
|
|
14515
|
+
y = numOfRows;
|
|
14516
|
+
}
|
|
14517
|
+
}
|
|
14518
|
+
else if (e.code === 'Home') {
|
|
14519
|
+
x = 0;
|
|
14520
|
+
if (e.ctrlKey) {
|
|
14521
|
+
y = 0;
|
|
14522
|
+
}
|
|
14523
|
+
}
|
|
14524
|
+
else if (e.code === 'PageUp') {
|
|
14525
|
+
y = y - itemsPerPage > 0 ? y - itemsPerPage : 0;
|
|
14526
|
+
}
|
|
14527
|
+
else if (e.code === 'PageDown') {
|
|
14528
|
+
y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
|
|
14529
|
+
}
|
|
14530
|
+
return { x, y };
|
|
14531
|
+
}
|
|
14532
|
+
}
|
|
14533
|
+
KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
14534
|
+
KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: KeyNavigationGridController });
|
|
14535
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: KeyNavigationGridController, decorators: [{
|
|
14536
|
+
type: Injectable
|
|
14537
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
14538
|
+
|
|
14374
14539
|
/*
|
|
14375
14540
|
* Copyright (c) 2016-2022 VMware, Inc. All Rights Reserved.
|
|
14376
14541
|
* This software is released under MIT license.
|
|
14377
14542
|
* The full license information can be found in LICENSE in the root directory of this project.
|
|
14378
14543
|
*/
|
|
14379
14544
|
class ClrDatagrid {
|
|
14380
|
-
constructor(organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, detailService, datagridId, el, page, commonStrings) {
|
|
14545
|
+
constructor(organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, detailService, datagridId, el, page, commonStrings, columnsService, keyNavigation) {
|
|
14381
14546
|
this.organizer = organizer;
|
|
14382
14547
|
this.items = items;
|
|
14383
14548
|
this.expandableRows = expandableRows;
|
|
@@ -14390,6 +14555,8 @@ class ClrDatagrid {
|
|
|
14390
14555
|
this.el = el;
|
|
14391
14556
|
this.page = page;
|
|
14392
14557
|
this.commonStrings = commonStrings;
|
|
14558
|
+
this.columnsService = columnsService;
|
|
14559
|
+
this.keyNavigation = keyNavigation;
|
|
14393
14560
|
/* reference to the enum so that template can access */
|
|
14394
14561
|
this.SELECTION_TYPE = SelectionType;
|
|
14395
14562
|
/**
|
|
@@ -14515,6 +14682,7 @@ class ClrDatagrid {
|
|
|
14515
14682
|
* Our setup happens in the view of some of our components, so we wait for it to be done before starting
|
|
14516
14683
|
*/
|
|
14517
14684
|
ngAfterViewInit() {
|
|
14685
|
+
this.keyNavigation.initializeKeyGrid(this.el.nativeElement);
|
|
14518
14686
|
// TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
|
|
14519
14687
|
this.refresh.emit(this.stateProvider.state);
|
|
14520
14688
|
this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
|
|
@@ -14524,11 +14692,16 @@ class ClrDatagrid {
|
|
|
14524
14692
|
else if (this.selection.selectionType === SelectionType.Multi) {
|
|
14525
14693
|
this.selectedChanged.emit(s);
|
|
14526
14694
|
}
|
|
14527
|
-
}),
|
|
14695
|
+
}),
|
|
14696
|
+
// Reinitialize arrow key navigation on page changes
|
|
14697
|
+
this.page.change.subscribe(() => {
|
|
14698
|
+
this.keyNavigation.resetKeyGrid();
|
|
14528
14699
|
if (!this.clrDgDisablePageFocus) {
|
|
14529
14700
|
this.datagridTable.nativeElement.focus();
|
|
14530
14701
|
}
|
|
14531
14702
|
}),
|
|
14703
|
+
// Reinitialize arrow key navigation on hide/unhide columns
|
|
14704
|
+
combineLatest(this.columnsService.columns).subscribe(() => { var _a; return (_a = this.keyNavigation) === null || _a === void 0 ? void 0 : _a.resetKeyGrid(); }),
|
|
14532
14705
|
// A subscription that listens for displayMode changes on the datagrid
|
|
14533
14706
|
this.displayMode.view.subscribe(viewChange => {
|
|
14534
14707
|
// Remove any projected columns from the projectedDisplayColumns container
|
|
@@ -14576,7 +14749,7 @@ class ClrDatagrid {
|
|
|
14576
14749
|
this.organizer.resize();
|
|
14577
14750
|
}
|
|
14578
14751
|
}
|
|
14579
|
-
ClrDatagrid.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrDatagrid, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: ExpandableRowsCount }, { token: Selection }, { token: RowActionService }, { token: StateProvider }, { token: DisplayModeService }, { token: i0.Renderer2 }, { token: DetailService }, { token: UNIQUE_ID }, { token: i0.ElementRef }, { token: Page }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
14752
|
+
ClrDatagrid.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrDatagrid, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: ExpandableRowsCount }, { token: Selection }, { token: RowActionService }, { token: StateProvider }, { token: DisplayModeService }, { token: i0.Renderer2 }, { token: DetailService }, { token: UNIQUE_ID }, { token: i0.ElementRef }, { token: Page }, { token: ClrCommonStringsService }, { token: ColumnsService }, { token: KeyNavigationGridController }], target: i0.ɵɵFactoryTarget.Component });
|
|
14580
14753
|
ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: ClrDatagrid, selector: "clr-datagrid", inputs: { loading: ["clrDgLoading", "loading"], selected: ["clrDgSelected", "selected"], singleSelected: ["clrDgSingleSelected", "singleSelected"], clrDgSingleSelectionAriaLabel: "clrDgSingleSelectionAriaLabel", clrDgSingleActionableAriaLabel: "clrDgSingleActionableAriaLabel", clrDetailExpandableAriaLabel: "clrDetailExpandableAriaLabel", clrDgDisablePageFocus: "clrDgDisablePageFocus", clrDgPreserveSelection: "clrDgPreserveSelection", rowSelectionMode: ["clrDgRowSelection", "rowSelectionMode"] }, outputs: { refresh: "clrDgRefresh", selectedChanged: "clrDgSelectedChange", singleSelectedChanged: "clrDgSingleSelectedChange" }, host: { properties: { "class.datagrid-host": "true", "class.datagrid-detail-open": "detailService.isOpen" } }, providers: [
|
|
14581
14754
|
Selection,
|
|
14582
14755
|
Sort,
|
|
@@ -14593,7 +14766,8 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "
|
|
|
14593
14766
|
TableSizeService,
|
|
14594
14767
|
ColumnsService,
|
|
14595
14768
|
DisplayModeService,
|
|
14596
|
-
|
|
14769
|
+
KeyNavigationGridController,
|
|
14770
|
+
], queries: [{ propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n [attr.aria-label]=\"clrDgSingleSelectionAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n [attr.aria-label]=\"clrDgSingleActionableAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n [attr.aria-label]=\"clrDetailExpandableAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container #displayedRows></ng-container>\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", components: [{ type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: ClrLabel, selector: "label", inputs: ["for"] }] });
|
|
14597
14771
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrDatagrid, decorators: [{
|
|
14598
14772
|
type: Component,
|
|
14599
14773
|
args: [{ selector: 'clr-datagrid', providers: [
|
|
@@ -14612,15 +14786,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
14612
14786
|
TableSizeService,
|
|
14613
14787
|
ColumnsService,
|
|
14614
14788
|
DisplayModeService,
|
|
14789
|
+
KeyNavigationGridController,
|
|
14615
14790
|
], host: {
|
|
14616
14791
|
'[class.datagrid-host]': 'true',
|
|
14617
14792
|
'[class.datagrid-detail-open]': 'detailService.isOpen',
|
|
14618
|
-
}, template: "<!--\n ~ Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n [attr.aria-label]=\"clrDgSingleSelectionAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n [attr.aria-label]=\"clrDgSingleActionableAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n [attr.aria-label]=\"clrDetailExpandableAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container #displayedRows></ng-container>\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
|
|
14793
|
+
}, template: "<!--\n ~ Copyright (c) 2016-2021 VMware, Inc. All Rights Reserved.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n [attr.aria-label]=\"clrDgSingleSelectionAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n [attr.aria-label]=\"clrDgSingleActionableAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n [attr.aria-label]=\"clrDetailExpandableAriaLabel\"\n >\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container #displayedRows></ng-container>\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
|
|
14619
14794
|
}], ctorParameters: function () {
|
|
14620
14795
|
return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
|
|
14621
14796
|
type: Inject,
|
|
14622
14797
|
args: [UNIQUE_ID]
|
|
14623
|
-
}] }, { type: i0.ElementRef }, { type: Page }, { type: ClrCommonStringsService }];
|
|
14798
|
+
}] }, { type: i0.ElementRef }, { type: Page }, { type: ClrCommonStringsService }, { type: ColumnsService }, { type: KeyNavigationGridController }];
|
|
14624
14799
|
}, propDecorators: { loading: [{
|
|
14625
14800
|
type: Input,
|
|
14626
14801
|
args: ['clrDgLoading']
|
|
@@ -21001,7 +21176,7 @@ class ClrNavLevel extends FocusTrap {
|
|
|
21001
21176
|
if (current === navHost) {
|
|
21002
21177
|
return;
|
|
21003
21178
|
}
|
|
21004
|
-
else if (current.classList.contains('nav-link')) {
|
|
21179
|
+
else if (current.classList.contains('nav-link') && this._document.body.clientWidth < LARGE_BREAKPOINT) {
|
|
21005
21180
|
this.close();
|
|
21006
21181
|
return;
|
|
21007
21182
|
}
|