@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/fesm2020/clr-angular.mjs
CHANGED
|
@@ -6381,11 +6381,7 @@ ClrPasswordContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
|
|
|
6381
6381
|
class="clr-input-group-icon-action"
|
|
6382
6382
|
type="button"
|
|
6383
6383
|
>
|
|
6384
|
-
<cds-icon
|
|
6385
|
-
status="info"
|
|
6386
|
-
[attr.shape]="show ? 'eye-hide' : 'eye'"
|
|
6387
|
-
[attr.title]="show ? commonStrings.keys.hide : commonStrings.keys.show"
|
|
6388
|
-
></cds-icon>
|
|
6384
|
+
<cds-icon status="info" [attr.shape]="show ? 'eye-hide' : 'eye'"></cds-icon>
|
|
6389
6385
|
<span class="clr-sr-only">{{
|
|
6390
6386
|
show ? commonStrings.keys.passwordHide : commonStrings.keys.passwordShow
|
|
6391
6387
|
}}</span>
|
|
@@ -6429,11 +6425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
6429
6425
|
class="clr-input-group-icon-action"
|
|
6430
6426
|
type="button"
|
|
6431
6427
|
>
|
|
6432
|
-
<cds-icon
|
|
6433
|
-
status="info"
|
|
6434
|
-
[attr.shape]="show ? 'eye-hide' : 'eye'"
|
|
6435
|
-
[attr.title]="show ? commonStrings.keys.hide : commonStrings.keys.show"
|
|
6436
|
-
></cds-icon>
|
|
6428
|
+
<cds-icon status="info" [attr.shape]="show ? 'eye-hide' : 'eye'"></cds-icon>
|
|
6437
6429
|
<span class="clr-sr-only">{{
|
|
6438
6430
|
show ? commonStrings.keys.passwordHide : commonStrings.keys.passwordShow
|
|
6439
6431
|
}}</span>
|
|
@@ -9022,7 +9014,7 @@ ClrCombobox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "
|
|
|
9022
9014
|
ClrPopoverToggleService,
|
|
9023
9015
|
ClrPopoverEventsService,
|
|
9024
9016
|
ClrPopoverPositionService,
|
|
9025
|
-
], 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
|
|
9017
|
+
], 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"] }] });
|
|
9026
9018
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrCombobox, decorators: [{
|
|
9027
9019
|
type: Component,
|
|
9028
9020
|
args: [{ selector: 'clr-combobox', providers: [
|
|
@@ -9041,7 +9033,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
9041
9033
|
'[class.aria-required]': 'true',
|
|
9042
9034
|
'[class.clr-combobox]': 'true',
|
|
9043
9035
|
'[class.clr-combobox-disabled]': 'control?.disabled',
|
|
9044
|
-
}, 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
|
|
9036
|
+
}, 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" }]
|
|
9045
9037
|
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
|
|
9046
9038
|
type: Self
|
|
9047
9039
|
}, {
|
|
@@ -13108,7 +13100,7 @@ ClrDatagridPlaceholder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", v
|
|
|
13108
13100
|
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: `
|
|
13109
13101
|
<div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
|
|
13110
13102
|
<div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
|
|
13111
|
-
<span role="gridcell"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13103
|
+
<span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13112
13104
|
</div>
|
|
13113
13105
|
`, isInline: true, directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
13114
13106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrDatagridPlaceholder, decorators: [{
|
|
@@ -13118,7 +13110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
13118
13110
|
template: `
|
|
13119
13111
|
<div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
|
|
13120
13112
|
<div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
|
|
13121
|
-
<span role="gridcell"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13113
|
+
<span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
|
|
13122
13114
|
</div>
|
|
13123
13115
|
`,
|
|
13124
13116
|
host: { '[class.datagrid-placeholder-container]': 'true' },
|
|
@@ -14266,13 +14258,181 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
14266
14258
|
type: Injectable
|
|
14267
14259
|
}] });
|
|
14268
14260
|
|
|
14261
|
+
/*
|
|
14262
|
+
* Copyright (c) 2016-2022 VMware, Inc. All Rights Reserved.
|
|
14263
|
+
* This software is released under MIT license.
|
|
14264
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
14265
|
+
*/
|
|
14266
|
+
function getTabableItems(el) {
|
|
14267
|
+
const tabableSelector = [
|
|
14268
|
+
'a[href]',
|
|
14269
|
+
'area[href]',
|
|
14270
|
+
'input:not([disabled])',
|
|
14271
|
+
'button:not([disabled])',
|
|
14272
|
+
'select:not([disabled])',
|
|
14273
|
+
'textarea:not([disabled])',
|
|
14274
|
+
'iframe',
|
|
14275
|
+
'object',
|
|
14276
|
+
'embed',
|
|
14277
|
+
'*[tabindex]',
|
|
14278
|
+
'*[contenteditable=true]',
|
|
14279
|
+
'[role=button]:not([disabled])',
|
|
14280
|
+
].join(',');
|
|
14281
|
+
return Array.from(el.querySelectorAll(tabableSelector));
|
|
14282
|
+
}
|
|
14283
|
+
class KeyNavigationGridController {
|
|
14284
|
+
constructor(zone) {
|
|
14285
|
+
this.zone = zone;
|
|
14286
|
+
this.listenersAdded = false;
|
|
14287
|
+
this.destroy$ = new Subject();
|
|
14288
|
+
this.config = {
|
|
14289
|
+
keyGridRows: '[role=row]:not(.datagrid-placeholder)',
|
|
14290
|
+
keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
|
|
14291
|
+
keyGrid: '[role=grid]',
|
|
14292
|
+
};
|
|
14293
|
+
}
|
|
14294
|
+
get grid() {
|
|
14295
|
+
return this.host?.querySelector(this.config.keyGrid);
|
|
14296
|
+
}
|
|
14297
|
+
get rows() {
|
|
14298
|
+
return this.host?.querySelectorAll(this.config.keyGridRows);
|
|
14299
|
+
}
|
|
14300
|
+
get cells() {
|
|
14301
|
+
return this.host?.querySelectorAll(this.config.keyGridCells);
|
|
14302
|
+
}
|
|
14303
|
+
ngOnDestroy() {
|
|
14304
|
+
this.destroy$.next();
|
|
14305
|
+
this.destroy$.complete();
|
|
14306
|
+
}
|
|
14307
|
+
addListeners() {
|
|
14308
|
+
if (this.listenersAdded) {
|
|
14309
|
+
return;
|
|
14310
|
+
}
|
|
14311
|
+
this.zone.runOutsideAngular(() => {
|
|
14312
|
+
fromEvent(this.grid, 'mousedown')
|
|
14313
|
+
.pipe(takeUntil(this.destroy$))
|
|
14314
|
+
.subscribe((e) => {
|
|
14315
|
+
// 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
|
|
14316
|
+
if (e.buttons === 1 && !e.ctrlKey) {
|
|
14317
|
+
const activeCell = this.cells
|
|
14318
|
+
? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
|
|
14319
|
+
: null;
|
|
14320
|
+
if (activeCell) {
|
|
14321
|
+
this.setActiveCell(activeCell);
|
|
14322
|
+
}
|
|
14323
|
+
}
|
|
14324
|
+
});
|
|
14325
|
+
fromEvent(this.grid, 'keydown')
|
|
14326
|
+
.pipe(takeUntil(this.destroy$))
|
|
14327
|
+
.subscribe((e) => {
|
|
14328
|
+
// Skip column resize events
|
|
14329
|
+
if (e.target.classList.contains('drag-handle') &&
|
|
14330
|
+
(e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
|
|
14331
|
+
return;
|
|
14332
|
+
}
|
|
14333
|
+
if (e.code === 'ArrowUp' ||
|
|
14334
|
+
e.code === 'ArrowDown' ||
|
|
14335
|
+
e.code === 'ArrowLeft' ||
|
|
14336
|
+
e.code === 'ArrowRight' ||
|
|
14337
|
+
e.code === 'End' ||
|
|
14338
|
+
e.code === 'Home' ||
|
|
14339
|
+
e.code === 'PageUp' ||
|
|
14340
|
+
e.code === 'PageDown') {
|
|
14341
|
+
const { x, y } = this.getNextItemCoordinate(e);
|
|
14342
|
+
const activeItem = this.rows
|
|
14343
|
+
? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
|
|
14344
|
+
: null;
|
|
14345
|
+
if (activeItem) {
|
|
14346
|
+
this.setActiveCell(activeItem);
|
|
14347
|
+
}
|
|
14348
|
+
e.preventDefault();
|
|
14349
|
+
}
|
|
14350
|
+
});
|
|
14351
|
+
});
|
|
14352
|
+
this.listenersAdded = true;
|
|
14353
|
+
}
|
|
14354
|
+
initializeKeyGrid(host) {
|
|
14355
|
+
this.host = host;
|
|
14356
|
+
this.addListeners();
|
|
14357
|
+
this.resetKeyGrid();
|
|
14358
|
+
}
|
|
14359
|
+
resetKeyGrid() {
|
|
14360
|
+
this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
|
|
14361
|
+
const firstCell = this.cells ? this.cells[0] : null;
|
|
14362
|
+
firstCell?.setAttribute('tabindex', '0');
|
|
14363
|
+
}
|
|
14364
|
+
setActiveCell(activeCell) {
|
|
14365
|
+
const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
|
|
14366
|
+
if (prior) {
|
|
14367
|
+
prior.setAttribute('tabindex', '-1');
|
|
14368
|
+
}
|
|
14369
|
+
activeCell.setAttribute('tabindex', '0');
|
|
14370
|
+
const items = getTabableItems(activeCell);
|
|
14371
|
+
const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
|
|
14372
|
+
item.focus();
|
|
14373
|
+
}
|
|
14374
|
+
getNextItemCoordinate(e) {
|
|
14375
|
+
let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
|
|
14376
|
+
if (e.code === 'Tab') {
|
|
14377
|
+
currentCell = document.activeElement;
|
|
14378
|
+
}
|
|
14379
|
+
const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
|
|
14380
|
+
const numOfRows = this.rows ? this.rows.length - 1 : 0;
|
|
14381
|
+
const numOfColumns = this.cells ? this.cells.length / this.rows.length - 1 : 0;
|
|
14382
|
+
let x = currentRow && currentCell
|
|
14383
|
+
? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
|
|
14384
|
+
: 0;
|
|
14385
|
+
let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
|
|
14386
|
+
const dir = this.host.dir;
|
|
14387
|
+
const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
|
|
14388
|
+
const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
|
|
14389
|
+
const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
|
|
14390
|
+
if (e.code === 'ArrowUp' && y !== 0) {
|
|
14391
|
+
y = y - 1;
|
|
14392
|
+
}
|
|
14393
|
+
else if (e.code === 'ArrowDown' && y < numOfRows) {
|
|
14394
|
+
y = y + 1;
|
|
14395
|
+
}
|
|
14396
|
+
else if (e.code === inlineStart && x !== 0) {
|
|
14397
|
+
x = x - 1;
|
|
14398
|
+
}
|
|
14399
|
+
else if (e.code === inlineEnd && x < numOfColumns) {
|
|
14400
|
+
x = x + 1;
|
|
14401
|
+
}
|
|
14402
|
+
else if (e.code === 'End') {
|
|
14403
|
+
x = numOfColumns;
|
|
14404
|
+
if (e.ctrlKey) {
|
|
14405
|
+
y = numOfRows;
|
|
14406
|
+
}
|
|
14407
|
+
}
|
|
14408
|
+
else if (e.code === 'Home') {
|
|
14409
|
+
x = 0;
|
|
14410
|
+
if (e.ctrlKey) {
|
|
14411
|
+
y = 0;
|
|
14412
|
+
}
|
|
14413
|
+
}
|
|
14414
|
+
else if (e.code === 'PageUp') {
|
|
14415
|
+
y = y - itemsPerPage > 0 ? y - itemsPerPage : 0;
|
|
14416
|
+
}
|
|
14417
|
+
else if (e.code === 'PageDown') {
|
|
14418
|
+
y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
|
|
14419
|
+
}
|
|
14420
|
+
return { x, y };
|
|
14421
|
+
}
|
|
14422
|
+
}
|
|
14423
|
+
KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
14424
|
+
KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: KeyNavigationGridController });
|
|
14425
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: KeyNavigationGridController, decorators: [{
|
|
14426
|
+
type: Injectable
|
|
14427
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
14428
|
+
|
|
14269
14429
|
/*
|
|
14270
14430
|
* Copyright (c) 2016-2022 VMware, Inc. All Rights Reserved.
|
|
14271
14431
|
* This software is released under MIT license.
|
|
14272
14432
|
* The full license information can be found in LICENSE in the root directory of this project.
|
|
14273
14433
|
*/
|
|
14274
14434
|
class ClrDatagrid {
|
|
14275
|
-
constructor(organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, detailService, datagridId, el, page, commonStrings) {
|
|
14435
|
+
constructor(organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, detailService, datagridId, el, page, commonStrings, columnsService, keyNavigation) {
|
|
14276
14436
|
this.organizer = organizer;
|
|
14277
14437
|
this.items = items;
|
|
14278
14438
|
this.expandableRows = expandableRows;
|
|
@@ -14285,6 +14445,8 @@ class ClrDatagrid {
|
|
|
14285
14445
|
this.el = el;
|
|
14286
14446
|
this.page = page;
|
|
14287
14447
|
this.commonStrings = commonStrings;
|
|
14448
|
+
this.columnsService = columnsService;
|
|
14449
|
+
this.keyNavigation = keyNavigation;
|
|
14288
14450
|
/* reference to the enum so that template can access */
|
|
14289
14451
|
this.SELECTION_TYPE = SelectionType;
|
|
14290
14452
|
/**
|
|
@@ -14410,6 +14572,7 @@ class ClrDatagrid {
|
|
|
14410
14572
|
* Our setup happens in the view of some of our components, so we wait for it to be done before starting
|
|
14411
14573
|
*/
|
|
14412
14574
|
ngAfterViewInit() {
|
|
14575
|
+
this.keyNavigation.initializeKeyGrid(this.el.nativeElement);
|
|
14413
14576
|
// TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
|
|
14414
14577
|
this.refresh.emit(this.stateProvider.state);
|
|
14415
14578
|
this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
|
|
@@ -14419,11 +14582,16 @@ class ClrDatagrid {
|
|
|
14419
14582
|
else if (this.selection.selectionType === SelectionType.Multi) {
|
|
14420
14583
|
this.selectedChanged.emit(s);
|
|
14421
14584
|
}
|
|
14422
|
-
}),
|
|
14585
|
+
}),
|
|
14586
|
+
// Reinitialize arrow key navigation on page changes
|
|
14587
|
+
this.page.change.subscribe(() => {
|
|
14588
|
+
this.keyNavigation.resetKeyGrid();
|
|
14423
14589
|
if (!this.clrDgDisablePageFocus) {
|
|
14424
14590
|
this.datagridTable.nativeElement.focus();
|
|
14425
14591
|
}
|
|
14426
14592
|
}),
|
|
14593
|
+
// Reinitialize arrow key navigation on hide/unhide columns
|
|
14594
|
+
combineLatest(this.columnsService.columns).subscribe(() => this.keyNavigation?.resetKeyGrid()),
|
|
14427
14595
|
// A subscription that listens for displayMode changes on the datagrid
|
|
14428
14596
|
this.displayMode.view.subscribe(viewChange => {
|
|
14429
14597
|
// Remove any projected columns from the projectedDisplayColumns container
|
|
@@ -14471,7 +14639,7 @@ class ClrDatagrid {
|
|
|
14471
14639
|
this.organizer.resize();
|
|
14472
14640
|
}
|
|
14473
14641
|
}
|
|
14474
|
-
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 });
|
|
14642
|
+
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 });
|
|
14475
14643
|
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: [
|
|
14476
14644
|
Selection,
|
|
14477
14645
|
Sort,
|
|
@@ -14488,7 +14656,8 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "
|
|
|
14488
14656
|
TableSizeService,
|
|
14489
14657
|
ColumnsService,
|
|
14490
14658
|
DisplayModeService,
|
|
14491
|
-
|
|
14659
|
+
KeyNavigationGridController,
|
|
14660
|
+
], 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"] }] });
|
|
14492
14661
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ClrDatagrid, decorators: [{
|
|
14493
14662
|
type: Component,
|
|
14494
14663
|
args: [{ selector: 'clr-datagrid', providers: [
|
|
@@ -14507,14 +14676,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
|
|
|
14507
14676
|
TableSizeService,
|
|
14508
14677
|
ColumnsService,
|
|
14509
14678
|
DisplayModeService,
|
|
14679
|
+
KeyNavigationGridController,
|
|
14510
14680
|
], host: {
|
|
14511
14681
|
'[class.datagrid-host]': 'true',
|
|
14512
14682
|
'[class.datagrid-detail-open]': 'detailService.isOpen',
|
|
14513
|
-
}, 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" }]
|
|
14683
|
+
}, 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" }]
|
|
14514
14684
|
}], ctorParameters: function () { return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
|
|
14515
14685
|
type: Inject,
|
|
14516
14686
|
args: [UNIQUE_ID]
|
|
14517
|
-
}] }, { type: i0.ElementRef }, { type: Page }, { type: ClrCommonStringsService }]; }, propDecorators: { loading: [{
|
|
14687
|
+
}] }, { type: i0.ElementRef }, { type: Page }, { type: ClrCommonStringsService }, { type: ColumnsService }, { type: KeyNavigationGridController }]; }, propDecorators: { loading: [{
|
|
14518
14688
|
type: Input,
|
|
14519
14689
|
args: ['clrDgLoading']
|
|
14520
14690
|
}], refresh: [{
|
|
@@ -20874,7 +21044,7 @@ class ClrNavLevel extends FocusTrap {
|
|
|
20874
21044
|
if (current === navHost) {
|
|
20875
21045
|
return;
|
|
20876
21046
|
}
|
|
20877
|
-
else if (current.classList.contains('nav-link')) {
|
|
21047
|
+
else if (current.classList.contains('nav-link') && this._document.body.clientWidth < LARGE_BREAKPOINT) {
|
|
20878
21048
|
this.close();
|
|
20879
21049
|
return;
|
|
20880
21050
|
}
|