@clr/angular 16.5.0 → 16.5.2
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 +18 -6
- package/data/datagrid/datagrid-detail-header.d.ts +4 -1
- package/data/datagrid/datagrid-filter.d.ts +4 -2
- package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +5 -2
- package/data/datagrid/datagrid.d.ts +1 -0
- package/data/datagrid/enums/column-changes.enum.d.ts +2 -1
- package/data/datagrid/providers/columns.service.d.ts +1 -0
- package/data/datagrid/providers/detail.service.d.ts +3 -0
- package/data/datagrid/render/main-renderer.d.ts +1 -1
- package/data/datagrid/utils/key-navigation-grid.controller.d.ts +1 -0
- package/esm2020/data/datagrid/datagrid-action-overflow.mjs +3 -1
- package/esm2020/data/datagrid/datagrid-detail-header.mjs +12 -6
- package/esm2020/data/datagrid/datagrid-detail.mjs +3 -3
- package/esm2020/data/datagrid/datagrid-filter.mjs +19 -12
- package/esm2020/data/datagrid/datagrid-row.mjs +3 -3
- package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +13 -5
- package/esm2020/data/datagrid/datagrid.mjs +25 -11
- package/esm2020/data/datagrid/enums/column-changes.enum.mjs +3 -2
- package/esm2020/data/datagrid/providers/columns.service.mjs +9 -3
- package/esm2020/data/datagrid/providers/detail.service.mjs +9 -2
- package/esm2020/data/datagrid/render/cell-renderer.mjs +1 -3
- package/esm2020/data/datagrid/render/main-renderer.mjs +21 -16
- package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +6 -3
- package/esm2020/data/stack-view/stack-block.mjs +4 -2
- package/esm2020/forms/combobox/option.mjs +5 -4
- package/esm2020/forms/common/abstract-container.mjs +5 -2
- package/esm2020/modal/modal.mjs +15 -5
- package/esm2020/timeline/timeline-step.mjs +3 -3
- package/esm2020/timeline/timeline.mjs +3 -3
- package/fesm2015/clr-angular.mjs +315 -243
- package/fesm2015/clr-angular.mjs.map +1 -1
- package/fesm2020/clr-angular.mjs +310 -238
- package/fesm2020/clr-angular.mjs.map +1 -1
- package/forms/combobox/option.d.ts +1 -1
- package/modal/modal.d.ts +3 -1
- package/package.json +2 -2
package/fesm2020/clr-angular.mjs
CHANGED
|
@@ -4751,7 +4751,10 @@ class ClrAbstractContainer {
|
|
|
4751
4751
|
this.subscriptions = [];
|
|
4752
4752
|
this.subscriptions.push(this.ifControlStateService.statusChanges.subscribe((state) => {
|
|
4753
4753
|
this.state = state;
|
|
4754
|
-
|
|
4754
|
+
// Make sure everything is updated before dispatching the values for helpers
|
|
4755
|
+
setTimeout(() => {
|
|
4756
|
+
this.updateHelpers();
|
|
4757
|
+
});
|
|
4755
4758
|
}));
|
|
4756
4759
|
this.subscriptions.push(this.ngControlService.controlChanges.subscribe(control => {
|
|
4757
4760
|
this.control = control;
|
|
@@ -6813,7 +6816,8 @@ class ClrOption {
|
|
|
6813
6816
|
this.optionProxy.id = this._id;
|
|
6814
6817
|
}
|
|
6815
6818
|
}
|
|
6816
|
-
onClick() {
|
|
6819
|
+
onClick(event) {
|
|
6820
|
+
event.stopPropagation();
|
|
6817
6821
|
if (this.optionSelectionService.multiselectable) {
|
|
6818
6822
|
this.optionSelectionService.toggle(this.value);
|
|
6819
6823
|
}
|
|
@@ -6828,7 +6832,7 @@ class ClrOption {
|
|
|
6828
6832
|
}
|
|
6829
6833
|
}
|
|
6830
6834
|
ClrOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrOption, deps: [{ token: i0.ElementRef }, { token: ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: OptionSelectionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
6831
|
-
ClrOption.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOption, selector: "clr-option", inputs: { optionId: ["id", "optionId"], value: ["clrValue", "value"] }, host: { listeners: { "click": "onClick()" }, properties: { "class.clr-combobox-option": "true", "attr.role": "\"option\"", "attr.tabindex": "-1", "attr.id": "optionId", "class.active": "this.selected", "class.clr-focus": "this.focusClass" } }, ngImport: i0, template: `
|
|
6835
|
+
ClrOption.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOption, selector: "clr-option", inputs: { optionId: ["id", "optionId"], value: ["clrValue", "value"] }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.clr-combobox-option": "true", "attr.role": "\"option\"", "attr.tabindex": "-1", "attr.id": "optionId", "class.active": "this.selected", "class.clr-focus": "this.focusClass" } }, ngImport: i0, template: `
|
|
6832
6836
|
<ng-content></ng-content>
|
|
6833
6837
|
<span *ngIf="selected" class="clr-sr-only">{{ commonStrings.keys.comboboxSelected }}</span>
|
|
6834
6838
|
`, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
@@ -6862,7 +6866,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
6862
6866
|
args: ['class.clr-focus']
|
|
6863
6867
|
}], onClick: [{
|
|
6864
6868
|
type: HostListener,
|
|
6865
|
-
args: ['click']
|
|
6869
|
+
args: ['click', ['$event']]
|
|
6866
6870
|
}] } });
|
|
6867
6871
|
|
|
6868
6872
|
/*
|
|
@@ -12058,6 +12062,191 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
12058
12062
|
type: Directive
|
|
12059
12063
|
}], ctorParameters: function () { return [{ type: FiltersProvider }]; } });
|
|
12060
12064
|
|
|
12065
|
+
/*
|
|
12066
|
+
* Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
|
|
12067
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
12068
|
+
* This software is released under MIT license.
|
|
12069
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
12070
|
+
*/
|
|
12071
|
+
function getTabableItems(el) {
|
|
12072
|
+
const tabableSelector = [
|
|
12073
|
+
'a[href]',
|
|
12074
|
+
'area[href]',
|
|
12075
|
+
'input:not([disabled])',
|
|
12076
|
+
'button:not([disabled])',
|
|
12077
|
+
'select:not([disabled])',
|
|
12078
|
+
'textarea:not([disabled])',
|
|
12079
|
+
'iframe',
|
|
12080
|
+
'object',
|
|
12081
|
+
'embed',
|
|
12082
|
+
'*[tabindex]',
|
|
12083
|
+
'*[contenteditable=true]',
|
|
12084
|
+
'[role=button]:not([disabled])',
|
|
12085
|
+
].join(',');
|
|
12086
|
+
return Array.from(el.querySelectorAll(tabableSelector));
|
|
12087
|
+
}
|
|
12088
|
+
class KeyNavigationGridController {
|
|
12089
|
+
constructor(zone) {
|
|
12090
|
+
this.zone = zone;
|
|
12091
|
+
this.skipItemFocus = false;
|
|
12092
|
+
this.listenersAdded = false;
|
|
12093
|
+
this.destroy$ = new Subject();
|
|
12094
|
+
this._activeCell = null;
|
|
12095
|
+
this.config = {
|
|
12096
|
+
keyGridRows: '[role=row]:not(.datagrid-placeholder)',
|
|
12097
|
+
keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
|
|
12098
|
+
keyGrid: '[role=grid]',
|
|
12099
|
+
};
|
|
12100
|
+
}
|
|
12101
|
+
get grid() {
|
|
12102
|
+
return this.host?.querySelector(this.config.keyGrid);
|
|
12103
|
+
}
|
|
12104
|
+
get rows() {
|
|
12105
|
+
return this.host?.querySelectorAll(this.config.keyGridRows);
|
|
12106
|
+
}
|
|
12107
|
+
get cells() {
|
|
12108
|
+
return this.host?.querySelectorAll(this.config.keyGridCells);
|
|
12109
|
+
}
|
|
12110
|
+
ngOnDestroy() {
|
|
12111
|
+
this.destroy$.next();
|
|
12112
|
+
this.destroy$.complete();
|
|
12113
|
+
}
|
|
12114
|
+
addListeners() {
|
|
12115
|
+
if (this.listenersAdded) {
|
|
12116
|
+
return;
|
|
12117
|
+
}
|
|
12118
|
+
this.zone.runOutsideAngular(() => {
|
|
12119
|
+
fromEvent(this.grid, 'mousedown')
|
|
12120
|
+
.pipe(takeUntil(this.destroy$))
|
|
12121
|
+
.subscribe((e) => {
|
|
12122
|
+
// 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
|
|
12123
|
+
if (e.buttons === 1 && !e.ctrlKey) {
|
|
12124
|
+
const activeCell = this.cells
|
|
12125
|
+
? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
|
|
12126
|
+
: null;
|
|
12127
|
+
if (activeCell) {
|
|
12128
|
+
this.setActiveCell(activeCell);
|
|
12129
|
+
}
|
|
12130
|
+
}
|
|
12131
|
+
});
|
|
12132
|
+
fromEvent(this.grid, 'wheel')
|
|
12133
|
+
.pipe(takeUntil(this.destroy$))
|
|
12134
|
+
.subscribe(() => {
|
|
12135
|
+
this.removeActiveCell();
|
|
12136
|
+
});
|
|
12137
|
+
fromEvent(this.grid, 'keydown')
|
|
12138
|
+
.pipe(takeUntil(this.destroy$))
|
|
12139
|
+
.subscribe((e) => {
|
|
12140
|
+
// Skip column resize events
|
|
12141
|
+
if (e.target.classList.contains('drag-handle') &&
|
|
12142
|
+
(e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
|
|
12143
|
+
return;
|
|
12144
|
+
}
|
|
12145
|
+
if (e.code === 'ArrowUp' ||
|
|
12146
|
+
e.code === 'ArrowDown' ||
|
|
12147
|
+
e.code === 'ArrowLeft' ||
|
|
12148
|
+
e.code === 'ArrowRight' ||
|
|
12149
|
+
e.code === 'End' ||
|
|
12150
|
+
e.code === 'Home' ||
|
|
12151
|
+
e.code === 'PageUp' ||
|
|
12152
|
+
e.code === 'PageDown') {
|
|
12153
|
+
const { x, y } = this.getNextItemCoordinate(e);
|
|
12154
|
+
const activeItem = this.rows
|
|
12155
|
+
? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
|
|
12156
|
+
: null;
|
|
12157
|
+
if (activeItem) {
|
|
12158
|
+
this.setActiveCell(activeItem);
|
|
12159
|
+
}
|
|
12160
|
+
e.preventDefault();
|
|
12161
|
+
}
|
|
12162
|
+
});
|
|
12163
|
+
});
|
|
12164
|
+
this.listenersAdded = true;
|
|
12165
|
+
}
|
|
12166
|
+
initializeKeyGrid(host) {
|
|
12167
|
+
this.host = host;
|
|
12168
|
+
this.addListeners();
|
|
12169
|
+
this.resetKeyGrid();
|
|
12170
|
+
}
|
|
12171
|
+
resetKeyGrid() {
|
|
12172
|
+
this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
|
|
12173
|
+
const firstCell = this.cells ? this.cells[0] : null;
|
|
12174
|
+
firstCell?.setAttribute('tabindex', '0');
|
|
12175
|
+
}
|
|
12176
|
+
removeActiveCell() {
|
|
12177
|
+
this._activeCell = null;
|
|
12178
|
+
}
|
|
12179
|
+
getActiveCell() {
|
|
12180
|
+
return this._activeCell;
|
|
12181
|
+
}
|
|
12182
|
+
setActiveCell(activeCell) {
|
|
12183
|
+
const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
|
|
12184
|
+
if (prior) {
|
|
12185
|
+
prior.setAttribute('tabindex', '-1');
|
|
12186
|
+
}
|
|
12187
|
+
activeCell.setAttribute('tabindex', '0');
|
|
12188
|
+
this._activeCell = activeCell;
|
|
12189
|
+
const items = getTabableItems(activeCell);
|
|
12190
|
+
const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
|
|
12191
|
+
if (!this.skipItemFocus) {
|
|
12192
|
+
item.focus();
|
|
12193
|
+
}
|
|
12194
|
+
}
|
|
12195
|
+
getNextItemCoordinate(e) {
|
|
12196
|
+
let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
|
|
12197
|
+
if (e.code === 'Tab') {
|
|
12198
|
+
currentCell = document.activeElement;
|
|
12199
|
+
}
|
|
12200
|
+
const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
|
|
12201
|
+
const numOfRows = this.rows ? this.rows.length - 1 : 0;
|
|
12202
|
+
const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
|
|
12203
|
+
let x = currentRow && currentCell
|
|
12204
|
+
? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
|
|
12205
|
+
: 0;
|
|
12206
|
+
let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
|
|
12207
|
+
const dir = this.host.dir;
|
|
12208
|
+
const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
|
|
12209
|
+
const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
|
|
12210
|
+
const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
|
|
12211
|
+
if (e.code === 'ArrowUp' && y !== 0) {
|
|
12212
|
+
y = y - 1;
|
|
12213
|
+
}
|
|
12214
|
+
else if (e.code === 'ArrowDown' && y < numOfRows) {
|
|
12215
|
+
y = y + 1;
|
|
12216
|
+
}
|
|
12217
|
+
else if (e.code === inlineStart && x !== 0) {
|
|
12218
|
+
x = x - 1;
|
|
12219
|
+
}
|
|
12220
|
+
else if (e.code === inlineEnd && x < numOfColumns) {
|
|
12221
|
+
x = x + 1;
|
|
12222
|
+
}
|
|
12223
|
+
else if (e.code === 'End') {
|
|
12224
|
+
x = numOfColumns;
|
|
12225
|
+
if (e.ctrlKey) {
|
|
12226
|
+
y = numOfRows;
|
|
12227
|
+
}
|
|
12228
|
+
}
|
|
12229
|
+
else if (e.code === 'Home') {
|
|
12230
|
+
x = 0;
|
|
12231
|
+
if (e.ctrlKey) {
|
|
12232
|
+
y = 0;
|
|
12233
|
+
}
|
|
12234
|
+
}
|
|
12235
|
+
else if (e.code === 'PageUp') {
|
|
12236
|
+
y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
|
|
12237
|
+
}
|
|
12238
|
+
else if (e.code === 'PageDown') {
|
|
12239
|
+
y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
|
|
12240
|
+
}
|
|
12241
|
+
return { x, y };
|
|
12242
|
+
}
|
|
12243
|
+
}
|
|
12244
|
+
KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
12245
|
+
KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
|
|
12246
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
|
|
12247
|
+
type: Injectable
|
|
12248
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
12249
|
+
|
|
12061
12250
|
/*
|
|
12062
12251
|
* Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
|
|
12063
12252
|
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
@@ -12070,12 +12259,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
12070
12259
|
* since it can be anything (not just a text input).
|
|
12071
12260
|
*/
|
|
12072
12261
|
class ClrDatagridFilter extends DatagridFilterRegistrar {
|
|
12073
|
-
constructor(_filters, commonStrings, smartToggleService, platformId, elementRef) {
|
|
12262
|
+
constructor(_filters, commonStrings, smartToggleService, platformId, elementRef, keyNavigation) {
|
|
12074
12263
|
super(_filters);
|
|
12075
12264
|
this.commonStrings = commonStrings;
|
|
12076
12265
|
this.smartToggleService = smartToggleService;
|
|
12077
12266
|
this.platformId = platformId;
|
|
12078
12267
|
this.elementRef = elementRef;
|
|
12268
|
+
this.keyNavigation = keyNavigation;
|
|
12079
12269
|
this.openChange = new EventEmitter(false);
|
|
12080
12270
|
this.ariaExpanded = false;
|
|
12081
12271
|
this.popoverId = uniqueIdFactory();
|
|
@@ -12104,6 +12294,9 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
|
|
|
12104
12294
|
if (!open && isPlatformBrowser(this.platformId)) {
|
|
12105
12295
|
this.anchor.nativeElement.focus();
|
|
12106
12296
|
}
|
|
12297
|
+
if (this.keyNavigation) {
|
|
12298
|
+
this.keyNavigation.skipItemFocus = open;
|
|
12299
|
+
}
|
|
12107
12300
|
// keep track of the state
|
|
12108
12301
|
this._open = open;
|
|
12109
12302
|
}
|
|
@@ -12137,7 +12330,7 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
|
|
|
12137
12330
|
});
|
|
12138
12331
|
}
|
|
12139
12332
|
}
|
|
12140
|
-
ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
12333
|
+
ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: KeyNavigationGridController, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
12141
12334
|
ClrDatagridFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: { open: ["clrDgFilterOpen", "open"], customFilter: ["clrDgFilter", "customFilter"] }, outputs: { openChange: "clrDgFilterOpenChange" }, providers: [{ provide: CustomFilter, useExisting: ClrDatagridFilter }], viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
|
|
12142
12335
|
<button
|
|
12143
12336
|
class="datagrid-filter-toggle"
|
|
@@ -12222,7 +12415,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
12222
12415
|
}], ctorParameters: function () { return [{ type: FiltersProvider }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: undefined, decorators: [{
|
|
12223
12416
|
type: Inject,
|
|
12224
12417
|
args: [PLATFORM_ID]
|
|
12225
|
-
}] }, { type: i0.ElementRef }
|
|
12418
|
+
}] }, { type: i0.ElementRef }, { type: KeyNavigationGridController, decorators: [{
|
|
12419
|
+
type: Optional
|
|
12420
|
+
}] }]; }, propDecorators: { openChange: [{
|
|
12226
12421
|
type: Output,
|
|
12227
12422
|
args: ['clrDgFilterOpenChange']
|
|
12228
12423
|
}], anchor: [{
|
|
@@ -12980,6 +13175,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
12980
13175
|
class DetailService {
|
|
12981
13176
|
constructor(modalStackService) {
|
|
12982
13177
|
this.modalStackService = modalStackService;
|
|
13178
|
+
this.preventScroll = false;
|
|
12983
13179
|
this.toggleState = false;
|
|
12984
13180
|
this._enabled = false;
|
|
12985
13181
|
this._state = new BehaviorSubject(this.toggleState);
|
|
@@ -12990,6 +13186,12 @@ class DetailService {
|
|
|
12990
13186
|
set enabled(state) {
|
|
12991
13187
|
this._enabled = state;
|
|
12992
13188
|
}
|
|
13189
|
+
get preventFocusScroll() {
|
|
13190
|
+
return this.preventScroll;
|
|
13191
|
+
}
|
|
13192
|
+
set preventFocusScroll(preventScroll) {
|
|
13193
|
+
this.preventScroll = preventScroll;
|
|
13194
|
+
}
|
|
12993
13195
|
get state() {
|
|
12994
13196
|
return this.cache;
|
|
12995
13197
|
}
|
|
@@ -13016,7 +13218,7 @@ class DetailService {
|
|
|
13016
13218
|
}
|
|
13017
13219
|
returnFocus() {
|
|
13018
13220
|
if (this.button) {
|
|
13019
|
-
this.button.focus();
|
|
13221
|
+
this.button.focus({ preventScroll: this.preventFocusScroll });
|
|
13020
13222
|
this.button = null;
|
|
13021
13223
|
}
|
|
13022
13224
|
}
|
|
@@ -15333,7 +15535,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
|
|
|
15333
15535
|
DatagridIfExpandService,
|
|
15334
15536
|
{ provide: IfExpandService, useExisting: DatagridIfExpandService },
|
|
15335
15537
|
{ provide: LoadingListener, useExisting: DatagridIfExpandService },
|
|
15336
|
-
], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\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]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", 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]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
|
|
15538
|
+
], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\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]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", 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]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
|
|
15337
15539
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
|
|
15338
15540
|
type: Component,
|
|
15339
15541
|
args: [{ selector: 'clr-dg-row', host: {
|
|
@@ -15345,7 +15547,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
15345
15547
|
DatagridIfExpandService,
|
|
15346
15548
|
{ provide: IfExpandService, useExisting: DatagridIfExpandService },
|
|
15347
15549
|
{ provide: LoadingListener, useExisting: DatagridIfExpandService },
|
|
15348
|
-
], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\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]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
|
|
15550
|
+
], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\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]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
|
|
15349
15551
|
}], ctorParameters: function () { return [{ type: Selection }, { type: RowActionService }, { type: ExpandableRowsCount }, { type: DatagridIfExpandService }, { type: DetailService }, { type: DisplayModeService }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: ClrCommonStringsService }, { type: Items }, { type: undefined, decorators: [{
|
|
15350
15552
|
type: Inject,
|
|
15351
15553
|
args: [DOCUMENT]
|
|
@@ -15403,10 +15605,11 @@ var DatagridColumnChanges;
|
|
|
15403
15605
|
(function (DatagridColumnChanges) {
|
|
15404
15606
|
DatagridColumnChanges[DatagridColumnChanges["WIDTH"] = 0] = "WIDTH";
|
|
15405
15607
|
DatagridColumnChanges[DatagridColumnChanges["HIDDEN"] = 1] = "HIDDEN";
|
|
15608
|
+
DatagridColumnChanges[DatagridColumnChanges["INITIALIZE"] = 2] = "INITIALIZE";
|
|
15406
15609
|
})(DatagridColumnChanges || (DatagridColumnChanges = {}));
|
|
15407
15610
|
const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
|
|
15408
15611
|
.map(key => DatagridColumnChanges[key])
|
|
15409
|
-
.filter(key => key === parseInt(key, 10)); // extracts only integer keys
|
|
15612
|
+
.filter(key => key === parseInt(key, 10) && key !== DatagridColumnChanges.INITIALIZE); // extracts only integer keys
|
|
15410
15613
|
|
|
15411
15614
|
/*
|
|
15412
15615
|
* Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
|
|
@@ -15417,6 +15620,7 @@ const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
|
|
|
15417
15620
|
class ColumnsService {
|
|
15418
15621
|
constructor() {
|
|
15419
15622
|
this.columns = [];
|
|
15623
|
+
this.columnsStateChange = new BehaviorSubject(null);
|
|
15420
15624
|
this._cache = [];
|
|
15421
15625
|
}
|
|
15422
15626
|
get columnStates() {
|
|
@@ -15438,7 +15642,9 @@ class ColumnsService {
|
|
|
15438
15642
|
resetToLastCache() {
|
|
15439
15643
|
this._cache.forEach((state, index) => {
|
|
15440
15644
|
// Just emit the exact value from the cache
|
|
15441
|
-
|
|
15645
|
+
const cachedState = { ...state, changes: ALL_COLUMN_CHANGES };
|
|
15646
|
+
this.columns[index].next(cachedState);
|
|
15647
|
+
this.columnsStateChange.next(cachedState);
|
|
15442
15648
|
});
|
|
15443
15649
|
this._cache = [];
|
|
15444
15650
|
}
|
|
@@ -15450,7 +15656,9 @@ class ColumnsService {
|
|
|
15450
15656
|
this.emitStateChange(this.columns[columnIndex], diff);
|
|
15451
15657
|
}
|
|
15452
15658
|
emitStateChange(column, diff) {
|
|
15453
|
-
|
|
15659
|
+
const changedState = { ...column.value, ...diff };
|
|
15660
|
+
column.next(changedState);
|
|
15661
|
+
this.columnsStateChange.next(changedState);
|
|
15454
15662
|
}
|
|
15455
15663
|
}
|
|
15456
15664
|
ColumnsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ColumnsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -15526,188 +15734,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
15526
15734
|
type: Injectable
|
|
15527
15735
|
}], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
|
|
15528
15736
|
|
|
15529
|
-
/*
|
|
15530
|
-
* Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
|
|
15531
|
-
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
15532
|
-
* This software is released under MIT license.
|
|
15533
|
-
* The full license information can be found in LICENSE in the root directory of this project.
|
|
15534
|
-
*/
|
|
15535
|
-
function getTabableItems(el) {
|
|
15536
|
-
const tabableSelector = [
|
|
15537
|
-
'a[href]',
|
|
15538
|
-
'area[href]',
|
|
15539
|
-
'input:not([disabled])',
|
|
15540
|
-
'button:not([disabled])',
|
|
15541
|
-
'select:not([disabled])',
|
|
15542
|
-
'textarea:not([disabled])',
|
|
15543
|
-
'iframe',
|
|
15544
|
-
'object',
|
|
15545
|
-
'embed',
|
|
15546
|
-
'*[tabindex]',
|
|
15547
|
-
'*[contenteditable=true]',
|
|
15548
|
-
'[role=button]:not([disabled])',
|
|
15549
|
-
].join(',');
|
|
15550
|
-
return Array.from(el.querySelectorAll(tabableSelector));
|
|
15551
|
-
}
|
|
15552
|
-
class KeyNavigationGridController {
|
|
15553
|
-
constructor(zone) {
|
|
15554
|
-
this.zone = zone;
|
|
15555
|
-
this.listenersAdded = false;
|
|
15556
|
-
this.destroy$ = new Subject();
|
|
15557
|
-
this._activeCell = null;
|
|
15558
|
-
this.config = {
|
|
15559
|
-
keyGridRows: '[role=row]:not(.datagrid-placeholder)',
|
|
15560
|
-
keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
|
|
15561
|
-
keyGrid: '[role=grid]',
|
|
15562
|
-
};
|
|
15563
|
-
}
|
|
15564
|
-
get grid() {
|
|
15565
|
-
return this.host?.querySelector(this.config.keyGrid);
|
|
15566
|
-
}
|
|
15567
|
-
get rows() {
|
|
15568
|
-
return this.host?.querySelectorAll(this.config.keyGridRows);
|
|
15569
|
-
}
|
|
15570
|
-
get cells() {
|
|
15571
|
-
return this.host?.querySelectorAll(this.config.keyGridCells);
|
|
15572
|
-
}
|
|
15573
|
-
ngOnDestroy() {
|
|
15574
|
-
this.destroy$.next();
|
|
15575
|
-
this.destroy$.complete();
|
|
15576
|
-
}
|
|
15577
|
-
addListeners() {
|
|
15578
|
-
if (this.listenersAdded) {
|
|
15579
|
-
return;
|
|
15580
|
-
}
|
|
15581
|
-
this.zone.runOutsideAngular(() => {
|
|
15582
|
-
fromEvent(this.grid, 'mousedown')
|
|
15583
|
-
.pipe(takeUntil(this.destroy$))
|
|
15584
|
-
.subscribe((e) => {
|
|
15585
|
-
// 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
|
|
15586
|
-
if (e.buttons === 1 && !e.ctrlKey) {
|
|
15587
|
-
const activeCell = this.cells
|
|
15588
|
-
? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
|
|
15589
|
-
: null;
|
|
15590
|
-
if (activeCell) {
|
|
15591
|
-
this.setActiveCell(activeCell);
|
|
15592
|
-
}
|
|
15593
|
-
}
|
|
15594
|
-
});
|
|
15595
|
-
fromEvent(this.grid, 'wheel')
|
|
15596
|
-
.pipe(takeUntil(this.destroy$))
|
|
15597
|
-
.subscribe(() => {
|
|
15598
|
-
this.removeActiveCell();
|
|
15599
|
-
});
|
|
15600
|
-
fromEvent(this.grid, 'keydown')
|
|
15601
|
-
.pipe(takeUntil(this.destroy$))
|
|
15602
|
-
.subscribe((e) => {
|
|
15603
|
-
// Skip column resize events
|
|
15604
|
-
if (e.target.classList.contains('drag-handle') &&
|
|
15605
|
-
(e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
|
|
15606
|
-
return;
|
|
15607
|
-
}
|
|
15608
|
-
if (e.code === 'ArrowUp' ||
|
|
15609
|
-
e.code === 'ArrowDown' ||
|
|
15610
|
-
e.code === 'ArrowLeft' ||
|
|
15611
|
-
e.code === 'ArrowRight' ||
|
|
15612
|
-
e.code === 'End' ||
|
|
15613
|
-
e.code === 'Home' ||
|
|
15614
|
-
e.code === 'PageUp' ||
|
|
15615
|
-
e.code === 'PageDown') {
|
|
15616
|
-
const { x, y } = this.getNextItemCoordinate(e);
|
|
15617
|
-
const activeItem = this.rows
|
|
15618
|
-
? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
|
|
15619
|
-
: null;
|
|
15620
|
-
if (activeItem) {
|
|
15621
|
-
this.setActiveCell(activeItem);
|
|
15622
|
-
}
|
|
15623
|
-
e.preventDefault();
|
|
15624
|
-
}
|
|
15625
|
-
});
|
|
15626
|
-
});
|
|
15627
|
-
this.listenersAdded = true;
|
|
15628
|
-
}
|
|
15629
|
-
initializeKeyGrid(host) {
|
|
15630
|
-
this.host = host;
|
|
15631
|
-
this.addListeners();
|
|
15632
|
-
this.resetKeyGrid();
|
|
15633
|
-
}
|
|
15634
|
-
resetKeyGrid() {
|
|
15635
|
-
this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
|
|
15636
|
-
const firstCell = this.cells ? this.cells[0] : null;
|
|
15637
|
-
firstCell?.setAttribute('tabindex', '0');
|
|
15638
|
-
}
|
|
15639
|
-
removeActiveCell() {
|
|
15640
|
-
this._activeCell = null;
|
|
15641
|
-
}
|
|
15642
|
-
getActiveCell() {
|
|
15643
|
-
return this._activeCell;
|
|
15644
|
-
}
|
|
15645
|
-
setActiveCell(activeCell) {
|
|
15646
|
-
const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
|
|
15647
|
-
if (prior) {
|
|
15648
|
-
prior.setAttribute('tabindex', '-1');
|
|
15649
|
-
}
|
|
15650
|
-
activeCell.setAttribute('tabindex', '0');
|
|
15651
|
-
const items = getTabableItems(activeCell);
|
|
15652
|
-
const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
|
|
15653
|
-
item.focus();
|
|
15654
|
-
this._activeCell = item;
|
|
15655
|
-
}
|
|
15656
|
-
getNextItemCoordinate(e) {
|
|
15657
|
-
let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
|
|
15658
|
-
if (e.code === 'Tab') {
|
|
15659
|
-
currentCell = document.activeElement;
|
|
15660
|
-
}
|
|
15661
|
-
const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
|
|
15662
|
-
const numOfRows = this.rows ? this.rows.length - 1 : 0;
|
|
15663
|
-
const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
|
|
15664
|
-
let x = currentRow && currentCell
|
|
15665
|
-
? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
|
|
15666
|
-
: 0;
|
|
15667
|
-
let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
|
|
15668
|
-
const dir = this.host.dir;
|
|
15669
|
-
const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
|
|
15670
|
-
const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
|
|
15671
|
-
const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
|
|
15672
|
-
if (e.code === 'ArrowUp' && y !== 0) {
|
|
15673
|
-
y = y - 1;
|
|
15674
|
-
}
|
|
15675
|
-
else if (e.code === 'ArrowDown' && y < numOfRows) {
|
|
15676
|
-
y = y + 1;
|
|
15677
|
-
}
|
|
15678
|
-
else if (e.code === inlineStart && x !== 0) {
|
|
15679
|
-
x = x - 1;
|
|
15680
|
-
}
|
|
15681
|
-
else if (e.code === inlineEnd && x < numOfColumns) {
|
|
15682
|
-
x = x + 1;
|
|
15683
|
-
}
|
|
15684
|
-
else if (e.code === 'End') {
|
|
15685
|
-
x = numOfColumns;
|
|
15686
|
-
if (e.ctrlKey) {
|
|
15687
|
-
y = numOfRows;
|
|
15688
|
-
}
|
|
15689
|
-
}
|
|
15690
|
-
else if (e.code === 'Home') {
|
|
15691
|
-
x = 0;
|
|
15692
|
-
if (e.ctrlKey) {
|
|
15693
|
-
y = 0;
|
|
15694
|
-
}
|
|
15695
|
-
}
|
|
15696
|
-
else if (e.code === 'PageUp') {
|
|
15697
|
-
y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
|
|
15698
|
-
}
|
|
15699
|
-
else if (e.code === 'PageDown') {
|
|
15700
|
-
y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
|
|
15701
|
-
}
|
|
15702
|
-
return { x, y };
|
|
15703
|
-
}
|
|
15704
|
-
}
|
|
15705
|
-
KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
15706
|
-
KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
|
|
15707
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
|
|
15708
|
-
type: Injectable
|
|
15709
|
-
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
15710
|
-
|
|
15711
15737
|
/*
|
|
15712
15738
|
* Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
|
|
15713
15739
|
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
@@ -15741,7 +15767,6 @@ class DatagridCellRenderer {
|
|
|
15741
15767
|
}
|
|
15742
15768
|
}
|
|
15743
15769
|
resetState(state) {
|
|
15744
|
-
state.changes = ALL_COLUMN_CHANGES;
|
|
15745
15770
|
this.setWidth(state);
|
|
15746
15771
|
this.setHidden(state);
|
|
15747
15772
|
}
|
|
@@ -15976,17 +16001,24 @@ class ClrDatagrid {
|
|
|
15976
16001
|
*/
|
|
15977
16002
|
if (row) {
|
|
15978
16003
|
this.detailService.open(row.item, row.detailButton.nativeElement);
|
|
16004
|
+
// always keep open when virtual scroll is available otherwise close it
|
|
15979
16005
|
}
|
|
15980
|
-
else if (!this.hasVirtualScroller
|
|
15981
|
-
|
|
16006
|
+
else if (!this.hasVirtualScroller) {
|
|
16007
|
+
// Using setTimeout to make sure the inner cycles in rows are done
|
|
16008
|
+
setTimeout(() => {
|
|
16009
|
+
this.detailService.close();
|
|
16010
|
+
});
|
|
15982
16011
|
}
|
|
15983
16012
|
}
|
|
15984
|
-
// retain active cell when navigating with PageUp and PageDown buttons in virtual scroller
|
|
15985
|
-
|
|
15986
|
-
|
|
15987
|
-
this.
|
|
15988
|
-
|
|
15989
|
-
|
|
16013
|
+
// retain active cell when navigating with Up/Down Arrows, PageUp and PageDown buttons in virtual scroller
|
|
16014
|
+
if (this.hasVirtualScroller) {
|
|
16015
|
+
const active = this.keyNavigation.getActiveCell();
|
|
16016
|
+
const isFocusInsideDatagrid = this.datagrid.nativeElement.contains(document.activeElement);
|
|
16017
|
+
if (active && isFocusInsideDatagrid) {
|
|
16018
|
+
this.zone.runOutsideAngular(() => {
|
|
16019
|
+
setTimeout(() => this.keyNavigation.setActiveCell(active));
|
|
16020
|
+
});
|
|
16021
|
+
}
|
|
15990
16022
|
}
|
|
15991
16023
|
}));
|
|
15992
16024
|
}
|
|
@@ -16068,6 +16100,13 @@ class ClrDatagrid {
|
|
|
16068
16100
|
ngOnDestroy() {
|
|
16069
16101
|
this._subscriptions.forEach((sub) => sub.unsubscribe());
|
|
16070
16102
|
}
|
|
16103
|
+
toggleAllSelected($event) {
|
|
16104
|
+
$event.preventDefault();
|
|
16105
|
+
if (this.hasVirtualScroller) {
|
|
16106
|
+
return;
|
|
16107
|
+
}
|
|
16108
|
+
this.allSelected = !this.allSelected;
|
|
16109
|
+
}
|
|
16071
16110
|
resize() {
|
|
16072
16111
|
this.organizer.resize();
|
|
16073
16112
|
}
|
|
@@ -16095,7 +16134,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
|
16095
16134
|
ColumnsService,
|
|
16096
16135
|
DisplayModeService,
|
|
16097
16136
|
KeyNavigationGridController,
|
|
16098
|
-
], 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: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { 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-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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)=\"
|
|
16137
|
+
], 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: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { 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-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!hasVirtualScroller\" 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 >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\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 >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\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 >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\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\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\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 </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", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["clrDgItem", "clrDgSelectable", "clrDgSelected", "clrDgExpanded", "clrDgDetailOpenLabel", "clrDgDetailCloseLabel", "clrDgRowSelectionLabel"], outputs: ["clrDgSelectedChange", "clrDgExpandedChange"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail" }, { kind: "directive", type: ActionableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }, { kind: "directive", type: ExpandableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }] });
|
|
16099
16138
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
|
|
16100
16139
|
type: Component,
|
|
16101
16140
|
args: [{ selector: 'clr-datagrid', providers: [
|
|
@@ -16117,7 +16156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
16117
16156
|
], host: {
|
|
16118
16157
|
'[class.datagrid-host]': 'true',
|
|
16119
16158
|
'[class.datagrid-detail-open]': 'detailService.isOpen',
|
|
16120
|
-
}, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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)=\"
|
|
16159
|
+
}, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!hasVirtualScroller\" 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 >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\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 >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\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 >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\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\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\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 </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" }]
|
|
16121
16160
|
}], 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: [{
|
|
16122
16161
|
type: Inject,
|
|
16123
16162
|
args: [DOCUMENT]
|
|
@@ -16286,6 +16325,7 @@ class ClrDatagridActionOverflow {
|
|
|
16286
16325
|
ClrDatagridActionOverflow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridActionOverflow, deps: [{ token: RowActionService }, { token: ClrCommonStringsService }, { token: PLATFORM_ID }, { token: i0.NgZone }, { token: ClrPopoverToggleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
16287
16326
|
ClrDatagridActionOverflow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridActionOverflow, selector: "clr-dg-action-overflow", inputs: { buttonLabel: ["clrDgActionOverflowButtonLabel", "buttonLabel"], open: ["clrDgActionOverflowOpen", "open"] }, outputs: { openChange: "clrDgActionOverflowOpenChange" }, viewQueries: [{ propertyName: "keyFocus", first: true, predicate: ClrKeyFocus, descendants: true }], hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
|
|
16288
16327
|
<button
|
|
16328
|
+
tabindex="-1"
|
|
16289
16329
|
class="datagrid-action-toggle"
|
|
16290
16330
|
type="button"
|
|
16291
16331
|
role="button"
|
|
@@ -16320,6 +16360,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
16320
16360
|
hostDirectives: [ClrPopoverHostDirective],
|
|
16321
16361
|
template: `
|
|
16322
16362
|
<button
|
|
16363
|
+
tabindex="-1"
|
|
16323
16364
|
class="datagrid-action-toggle"
|
|
16324
16365
|
type="button"
|
|
16325
16366
|
role="button"
|
|
@@ -16665,10 +16706,13 @@ class ClrDatagridDetailHeader {
|
|
|
16665
16706
|
get titleId() {
|
|
16666
16707
|
return `${this.detailService.id}-title`;
|
|
16667
16708
|
}
|
|
16709
|
+
ngAfterViewInit() {
|
|
16710
|
+
this.title.nativeElement.focus();
|
|
16711
|
+
}
|
|
16668
16712
|
}
|
|
16669
16713
|
ClrDatagridDetailHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridDetailHeader, deps: [{ token: DetailService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
16670
|
-
ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetailHeader, selector: "clr-dg-detail-header", host: { properties: { "class.datagrid-detail-header": "true" } }, ngImport: i0, template: `
|
|
16671
|
-
<div class="datagrid-detail-header-title"
|
|
16714
|
+
ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetailHeader, selector: "clr-dg-detail-header", host: { properties: { "class.datagrid-detail-header": "true" } }, viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }], ngImport: i0, template: `
|
|
16715
|
+
<div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
|
|
16672
16716
|
<ng-content></ng-content>
|
|
16673
16717
|
</div>
|
|
16674
16718
|
<div class="datagrid-detail-pane-close">
|
|
@@ -16690,7 +16734,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
16690
16734
|
'[class.datagrid-detail-header]': 'true',
|
|
16691
16735
|
},
|
|
16692
16736
|
template: `
|
|
16693
|
-
<div class="datagrid-detail-header-title"
|
|
16737
|
+
<div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
|
|
16694
16738
|
<ng-content></ng-content>
|
|
16695
16739
|
</div>
|
|
16696
16740
|
<div class="datagrid-detail-pane-close">
|
|
@@ -16705,7 +16749,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
16705
16749
|
</div>
|
|
16706
16750
|
`,
|
|
16707
16751
|
}]
|
|
16708
|
-
}], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }
|
|
16752
|
+
}], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { title: [{
|
|
16753
|
+
type: ViewChild,
|
|
16754
|
+
args: ['title']
|
|
16755
|
+
}] } });
|
|
16709
16756
|
|
|
16710
16757
|
/*
|
|
16711
16758
|
* Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
|
|
@@ -16726,7 +16773,7 @@ ClrDatagridDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", versio
|
|
|
16726
16773
|
ClrDatagridDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetail, selector: "clr-dg-detail", host: { properties: { "class.datagrid-detail-pane": "true" } }, queries: [{ propertyName: "header", first: true, predicate: ClrDatagridDetailHeader, descendants: true }], ngImport: i0, template: `
|
|
16727
16774
|
<div
|
|
16728
16775
|
cdkTrapFocus
|
|
16729
|
-
[cdkTrapFocusAutoCapture]="
|
|
16776
|
+
[cdkTrapFocusAutoCapture]="!header"
|
|
16730
16777
|
class="datagrid-detail-pane-content"
|
|
16731
16778
|
*ngIf="detailService.isOpen"
|
|
16732
16779
|
role="dialog"
|
|
@@ -16751,7 +16798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
16751
16798
|
template: `
|
|
16752
16799
|
<div
|
|
16753
16800
|
cdkTrapFocus
|
|
16754
|
-
[cdkTrapFocusAutoCapture]="
|
|
16801
|
+
[cdkTrapFocusAutoCapture]="!header"
|
|
16755
16802
|
class="datagrid-detail-pane-content"
|
|
16756
16803
|
*ngIf="detailService.isOpen"
|
|
16757
16804
|
role="dialog"
|
|
@@ -17603,7 +17650,7 @@ const defaultCdkFixedSizeVirtualScrollInputs = {
|
|
|
17603
17650
|
maxBufferPx: 400,
|
|
17604
17651
|
};
|
|
17605
17652
|
class ClrDatagridVirtualScrollDirective {
|
|
17606
|
-
constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, injector) {
|
|
17653
|
+
constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
|
|
17607
17654
|
this.changeDetectorRef = changeDetectorRef;
|
|
17608
17655
|
this.iterableDiffers = iterableDiffers;
|
|
17609
17656
|
this.items = items;
|
|
@@ -17614,6 +17661,7 @@ class ClrDatagridVirtualScrollDirective {
|
|
|
17614
17661
|
this.scrollDispatcher = scrollDispatcher;
|
|
17615
17662
|
this.viewportRuler = viewportRuler;
|
|
17616
17663
|
this.datagrid = datagrid;
|
|
17664
|
+
this.columnsService = columnsService;
|
|
17617
17665
|
this.injector = injector;
|
|
17618
17666
|
this.renderedRangeChange = new EventEmitter();
|
|
17619
17667
|
this._cdkFixedSizeVirtualScrollInputs = { ...defaultCdkFixedSizeVirtualScrollInputs };
|
|
@@ -17626,12 +17674,16 @@ class ClrDatagridVirtualScrollDirective {
|
|
|
17626
17674
|
}
|
|
17627
17675
|
});
|
|
17628
17676
|
});
|
|
17677
|
+
this.viewRepeater = new _RecycleViewRepeaterStrategy();
|
|
17629
17678
|
this.cdkVirtualForInputs = {
|
|
17630
17679
|
cdkVirtualForTrackBy: index => index,
|
|
17631
17680
|
};
|
|
17632
17681
|
this.items.smartenUp();
|
|
17633
17682
|
this.datagrid.hasVirtualScroller = true;
|
|
17683
|
+
this.datagrid.detailService.preventFocusScroll = true;
|
|
17634
17684
|
this.datagridElementRef = this.datagrid.el;
|
|
17685
|
+
// default
|
|
17686
|
+
this.cdkVirtualForTemplateCacheSize = 20;
|
|
17635
17687
|
this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
|
|
17636
17688
|
attributeFilter: ['class'],
|
|
17637
17689
|
attributeOldValue: true,
|
|
@@ -17691,7 +17743,7 @@ class ClrDatagridVirtualScrollDirective {
|
|
|
17691
17743
|
ngAfterViewInit() {
|
|
17692
17744
|
this.injector.runInContext(() => {
|
|
17693
17745
|
this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
|
|
17694
|
-
this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers,
|
|
17746
|
+
this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
|
|
17695
17747
|
this.virtualScrollViewport.ngOnInit();
|
|
17696
17748
|
});
|
|
17697
17749
|
this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
|
|
@@ -17706,6 +17758,8 @@ class ClrDatagridVirtualScrollDirective {
|
|
|
17706
17758
|
if (datagridState.filters) {
|
|
17707
17759
|
this.virtualScrollViewport.scrollToIndex(0);
|
|
17708
17760
|
}
|
|
17761
|
+
}), this.columnsService.columnsStateChange.subscribe(() => {
|
|
17762
|
+
this.viewRepeater.detach();
|
|
17709
17763
|
}));
|
|
17710
17764
|
}
|
|
17711
17765
|
ngDoCheck() {
|
|
@@ -17777,7 +17831,7 @@ class ClrDatagridVirtualScrollDirective {
|
|
|
17777
17831
|
return virtualScrollViewport;
|
|
17778
17832
|
}
|
|
17779
17833
|
}
|
|
17780
|
-
ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
|
|
17834
|
+
ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
|
|
17781
17835
|
ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[ClrVirtualScroll]", inputs: { cdkVirtualForOf: ["clrVirtualRowsOf", "cdkVirtualForOf"], cdkVirtualForTrackBy: ["clrVirtualRowsTrackBy", "cdkVirtualForTrackBy"], cdkVirtualForTemplate: ["clrVirtualRowsTemplate", "cdkVirtualForTemplate"], cdkVirtualForTemplateCacheSize: ["clrVirtualRowsTemplateCacheSize", "cdkVirtualForTemplateCacheSize"], itemSize: ["clrVirtualRowsItemSize", "itemSize"], minBufferPx: ["clrVirtualRowsMinBufferPx", "minBufferPx"], maxBufferPx: ["clrVirtualRowsMaxBufferPx", "maxBufferPx"] }, outputs: { renderedRangeChange: "renderedRangeChange" }, providers: [Items], ngImport: i0 });
|
|
17782
17836
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
|
|
17783
17837
|
type: Directive,
|
|
@@ -17787,7 +17841,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
17787
17841
|
}]
|
|
17788
17842
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
|
|
17789
17843
|
type: SkipSelf
|
|
17790
|
-
}] }, { type: i0.NgZone }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i2.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: i0.EnvironmentInjector }]; }, propDecorators: { renderedRangeChange: [{
|
|
17844
|
+
}] }, { type: i0.NgZone }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i2.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: ColumnsService }, { type: i0.EnvironmentInjector }]; }, propDecorators: { renderedRangeChange: [{
|
|
17791
17845
|
type: Output
|
|
17792
17846
|
}], cdkVirtualForOf: [{
|
|
17793
17847
|
type: Input,
|
|
@@ -18012,6 +18066,9 @@ class DatagridMainRenderer {
|
|
|
18012
18066
|
this.subscriptions.push(this.detailService.stateChange.subscribe(state => this.toggleDetailPane(state)));
|
|
18013
18067
|
this.subscriptions.push(this.items.change.subscribe(() => (this.shouldStabilizeColumns = true)));
|
|
18014
18068
|
}
|
|
18069
|
+
ngOnInit() {
|
|
18070
|
+
this.columnsService.columnsStateChange.subscribe(change => this.columnStateChanged(change));
|
|
18071
|
+
}
|
|
18015
18072
|
ngAfterContentInit() {
|
|
18016
18073
|
this.setupColumns();
|
|
18017
18074
|
this.subscriptions.push(this.headers.changes.subscribe(() => {
|
|
@@ -18021,7 +18078,6 @@ class DatagridMainRenderer {
|
|
|
18021
18078
|
this.columnsSizesStable = false;
|
|
18022
18079
|
this.stabilizeColumns();
|
|
18023
18080
|
}));
|
|
18024
|
-
this.listenForColumnChanges();
|
|
18025
18081
|
}
|
|
18026
18082
|
// Initialize and set Table width for horizontal scrolling here.
|
|
18027
18083
|
ngAfterViewInit() {
|
|
@@ -18063,7 +18119,10 @@ class DatagridMainRenderer {
|
|
|
18063
18119
|
setupColumns() {
|
|
18064
18120
|
this.headers.forEach((header, index) => header.setColumnState(index));
|
|
18065
18121
|
this.columnsService.columns.splice(this.headers.length); // Trim any old columns
|
|
18066
|
-
|
|
18122
|
+
// Sets columnIndex for each column
|
|
18123
|
+
this.columnsService.columns.forEach((column, index) => {
|
|
18124
|
+
this.columnsService.emitStateChange(column, { changes: [DatagridColumnChanges.INITIALIZE], columnIndex: index });
|
|
18125
|
+
});
|
|
18067
18126
|
}
|
|
18068
18127
|
shouldComputeHeight() {
|
|
18069
18128
|
if (!this._heightSet && this.page.size > 0) {
|
|
@@ -18120,6 +18179,10 @@ class DatagridMainRenderer {
|
|
|
18120
18179
|
});
|
|
18121
18180
|
}
|
|
18122
18181
|
columnStateChanged(state) {
|
|
18182
|
+
// eslint-disable-next-line eqeqeq
|
|
18183
|
+
if (!this.headers || state.columnIndex == null) {
|
|
18184
|
+
return;
|
|
18185
|
+
}
|
|
18123
18186
|
const columnIndex = state.columnIndex;
|
|
18124
18187
|
if (state.changes && state.changes.length) {
|
|
18125
18188
|
state.changes.forEach(change => {
|
|
@@ -18127,7 +18190,7 @@ class DatagridMainRenderer {
|
|
|
18127
18190
|
case DatagridColumnChanges.WIDTH:
|
|
18128
18191
|
this.headers.get(columnIndex).setWidth(state);
|
|
18129
18192
|
this.rows.forEach(row => {
|
|
18130
|
-
if (row.
|
|
18193
|
+
if (row?.cells.length === this.columnsService.columns.length) {
|
|
18131
18194
|
row.cells.get(columnIndex).setWidth(state);
|
|
18132
18195
|
}
|
|
18133
18196
|
});
|
|
@@ -18141,23 +18204,20 @@ class DatagridMainRenderer {
|
|
|
18141
18204
|
});
|
|
18142
18205
|
this.keyNavigation.resetKeyGrid();
|
|
18143
18206
|
break;
|
|
18207
|
+
case DatagridColumnChanges.INITIALIZE:
|
|
18208
|
+
if (state.hideable && state.hidden) {
|
|
18209
|
+
this.headers.get(columnIndex).setHidden(state);
|
|
18210
|
+
this.rows.forEach(row => {
|
|
18211
|
+
row.setCellsState();
|
|
18212
|
+
});
|
|
18213
|
+
}
|
|
18214
|
+
break;
|
|
18144
18215
|
default:
|
|
18145
18216
|
break;
|
|
18146
18217
|
}
|
|
18147
18218
|
});
|
|
18148
18219
|
}
|
|
18149
18220
|
}
|
|
18150
|
-
listenForColumnChanges() {
|
|
18151
|
-
this.columnsService.columns.forEach((column, index) => {
|
|
18152
|
-
this.columnsService.emitStateChange(column, { changes: [], columnIndex: index });
|
|
18153
|
-
});
|
|
18154
|
-
/*
|
|
18155
|
-
Merges all column subject so we can track them at once
|
|
18156
|
-
and receive only the changed column as result
|
|
18157
|
-
*/
|
|
18158
|
-
const columnChanges = merge(...this.columnsService.columns);
|
|
18159
|
-
this.subscriptions.push(columnChanges.subscribe(change => this.columnStateChanged(change)));
|
|
18160
|
-
}
|
|
18161
18221
|
/**
|
|
18162
18222
|
* Triggers a whole re-rendring cycle to set column sizes, if needed.
|
|
18163
18223
|
*/
|
|
@@ -18648,7 +18708,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
18648
18708
|
}] } });
|
|
18649
18709
|
function eventIsInputEvent(event) {
|
|
18650
18710
|
const targetElement = event?.target;
|
|
18651
|
-
return targetElement?.tagName
|
|
18711
|
+
return targetElement?.tagName
|
|
18712
|
+
? ['INPUT', 'TEXTAREA', 'BUTTON', 'A', 'SELECT', 'OPTION'].includes(targetElement.tagName)
|
|
18713
|
+
: false;
|
|
18652
18714
|
}
|
|
18653
18715
|
|
|
18654
18716
|
/*
|
|
@@ -23342,6 +23404,13 @@ class ClrModal {
|
|
|
23342
23404
|
this._openChanged.emit(true);
|
|
23343
23405
|
this.modalStackService.trackModalOpen(this);
|
|
23344
23406
|
}
|
|
23407
|
+
backdropClick() {
|
|
23408
|
+
if (this.staticBackdrop) {
|
|
23409
|
+
this.title.nativeElement.focus();
|
|
23410
|
+
return;
|
|
23411
|
+
}
|
|
23412
|
+
this.close();
|
|
23413
|
+
}
|
|
23345
23414
|
close() {
|
|
23346
23415
|
if (this.stopClose) {
|
|
23347
23416
|
this.altClose.emit(false);
|
|
@@ -23361,7 +23430,7 @@ class ClrModal {
|
|
|
23361
23430
|
}
|
|
23362
23431
|
}
|
|
23363
23432
|
ClrModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, deps: [{ token: ScrollingService }, { token: ClrCommonStringsService }, { token: ModalStackService }, { token: ClrModalConfigurationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
23364
|
-
ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"
|
|
23433
|
+
ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
|
|
23365
23434
|
trigger('fadeMove', [
|
|
23366
23435
|
transition('* => fadeDown', [
|
|
23367
23436
|
style({ opacity: 0, transform: 'translate(0, -25%)' }),
|
|
@@ -23396,8 +23465,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
23396
23465
|
transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
|
|
23397
23466
|
transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
|
|
23398
23467
|
]),
|
|
23399
|
-
], template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"
|
|
23400
|
-
}], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: {
|
|
23468
|
+
], template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
|
|
23469
|
+
}], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
|
|
23470
|
+
type: ViewChild,
|
|
23471
|
+
args: ['title']
|
|
23472
|
+
}], _open: [{
|
|
23401
23473
|
type: Input,
|
|
23402
23474
|
args: ['clrModalOpen']
|
|
23403
23475
|
}, {
|
|
@@ -24463,13 +24535,13 @@ class ClrTimeline {
|
|
|
24463
24535
|
}
|
|
24464
24536
|
}
|
|
24465
24537
|
ClrTimeline.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24466
|
-
ClrTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimeline, selector: "clr-timeline", inputs: { layout: ["clrLayout", "layout"] }, host: { properties: { "class.clr-timeline": "true", "class.clr-timeline-vertical": "this.isVertical" } }, providers: [TimelineIconAttributeService], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
|
|
24538
|
+
ClrTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimeline, selector: "clr-timeline", inputs: { layout: ["clrLayout", "layout"] }, host: { properties: { "class.clr-timeline": "true", "attr.role": "\"list\"", "class.clr-timeline-vertical": "this.isVertical" } }, providers: [TimelineIconAttributeService], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
|
|
24467
24539
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, decorators: [{
|
|
24468
24540
|
type: Component,
|
|
24469
24541
|
args: [{
|
|
24470
24542
|
selector: 'clr-timeline',
|
|
24471
24543
|
template: `<ng-content></ng-content>`,
|
|
24472
|
-
host: { '[class.clr-timeline]': 'true' },
|
|
24544
|
+
host: { '[class.clr-timeline]': 'true', '[attr.role]': '"list"' },
|
|
24473
24545
|
providers: [TimelineIconAttributeService],
|
|
24474
24546
|
}]
|
|
24475
24547
|
}], propDecorators: { layout: [{
|
|
@@ -24540,7 +24612,7 @@ class ClrTimelineStep {
|
|
|
24540
24612
|
}
|
|
24541
24613
|
}
|
|
24542
24614
|
ClrTimelineStep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimelineStep, deps: [{ token: TimelineIconAttributeService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
24543
|
-
ClrTimelineStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimelineStep, selector: "clr-timeline-step", inputs: { state: ["clrState", "state"] }, host: { properties: { "class.clr-timeline-step": "true" } }, queries: [{ propertyName: "stepTitle", first: true, predicate: ClrTimelineStepTitle, descendants: true, read: ElementRef }], ngImport: i0, template: `
|
|
24615
|
+
ClrTimelineStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimelineStep, selector: "clr-timeline-step", inputs: { state: ["clrState", "state"] }, host: { properties: { "class.clr-timeline-step": "true", "attr.role": "\"listitem\"" } }, queries: [{ propertyName: "stepTitle", first: true, predicate: ClrTimelineStepTitle, descendants: true, read: ElementRef }], ngImport: i0, template: `
|
|
24544
24616
|
<ng-content select="clr-timeline-step-header"></ng-content>
|
|
24545
24617
|
<span class="clr-sr-only">{{ stepTitleText }}</span>
|
|
24546
24618
|
<ng-container *ngIf="!isProcessing; else processing">
|
|
@@ -24584,7 +24656,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
|
|
|
24584
24656
|
<clr-spinner clrMedium [attr.aria-label]="iconAriaLabel"></clr-spinner>
|
|
24585
24657
|
</ng-template>
|
|
24586
24658
|
`,
|
|
24587
|
-
host: { '[class.clr-timeline-step]': 'true' },
|
|
24659
|
+
host: { '[class.clr-timeline-step]': 'true', '[attr.role]': '"listitem"' },
|
|
24588
24660
|
}]
|
|
24589
24661
|
}], ctorParameters: function () { return [{ type: TimelineIconAttributeService }, { type: undefined, decorators: [{
|
|
24590
24662
|
type: Inject,
|