@clr/angular 18.2.2 → 18.4.0

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.
Files changed (112) hide show
  1. package/fesm2022/clr-angular-accordion.mjs +28 -28
  2. package/fesm2022/clr-angular-accordion.mjs.map +1 -1
  3. package/fesm2022/clr-angular-button.mjs +27 -27
  4. package/fesm2022/clr-angular-button.mjs.map +1 -1
  5. package/fesm2022/clr-angular-card.mjs +417 -0
  6. package/fesm2022/clr-angular-card.mjs.map +1 -0
  7. package/fesm2022/clr-angular-collapsible-panel.mjs +6 -6
  8. package/fesm2022/clr-angular-collapsible-panel.mjs.map +1 -1
  9. package/fesm2022/clr-angular-data-datagrid.mjs +1578 -415
  10. package/fesm2022/clr-angular-data-datagrid.mjs.map +1 -1
  11. package/fesm2022/clr-angular-data-stack-view.mjs +23 -23
  12. package/fesm2022/clr-angular-data-stack-view.mjs.map +1 -1
  13. package/fesm2022/clr-angular-data-tree-view.mjs +283 -48
  14. package/fesm2022/clr-angular-data-tree-view.mjs.map +1 -1
  15. package/fesm2022/clr-angular-data.mjs +4 -4
  16. package/fesm2022/clr-angular-data.mjs.map +1 -1
  17. package/fesm2022/clr-angular-emphasis-alert.mjs +26 -26
  18. package/fesm2022/clr-angular-emphasis-alert.mjs.map +1 -1
  19. package/fesm2022/clr-angular-emphasis-badge.mjs +3 -3
  20. package/fesm2022/clr-angular-emphasis-badge.mjs.map +1 -1
  21. package/fesm2022/clr-angular-emphasis-label.mjs +3 -3
  22. package/fesm2022/clr-angular-emphasis-label.mjs.map +1 -1
  23. package/fesm2022/clr-angular-emphasis.mjs +4 -4
  24. package/fesm2022/clr-angular-emphasis.mjs.map +1 -1
  25. package/fesm2022/clr-angular-forms-checkbox.mjs +23 -14
  26. package/fesm2022/clr-angular-forms-checkbox.mjs.map +1 -1
  27. package/fesm2022/clr-angular-forms-combobox.mjs +35 -35
  28. package/fesm2022/clr-angular-forms-combobox.mjs.map +1 -1
  29. package/fesm2022/clr-angular-forms-common.mjs +69 -69
  30. package/fesm2022/clr-angular-forms-common.mjs.map +1 -1
  31. package/fesm2022/clr-angular-forms-datalist.mjs +17 -17
  32. package/fesm2022/clr-angular-forms-datalist.mjs.map +1 -1
  33. package/fesm2022/clr-angular-forms-datepicker.mjs +73 -73
  34. package/fesm2022/clr-angular-forms-datepicker.mjs.map +1 -1
  35. package/fesm2022/clr-angular-forms-file-input.mjs +36 -36
  36. package/fesm2022/clr-angular-forms-file-input.mjs.map +1 -1
  37. package/fesm2022/clr-angular-forms-input.mjs +10 -10
  38. package/fesm2022/clr-angular-forms-input.mjs.map +1 -1
  39. package/fesm2022/clr-angular-forms-number-input.mjs +12 -12
  40. package/fesm2022/clr-angular-forms-number-input.mjs.map +1 -1
  41. package/fesm2022/clr-angular-forms-password.mjs +11 -11
  42. package/fesm2022/clr-angular-forms-password.mjs.map +1 -1
  43. package/fesm2022/clr-angular-forms-radio.mjs +17 -24
  44. package/fesm2022/clr-angular-forms-radio.mjs.map +1 -1
  45. package/fesm2022/clr-angular-forms-range.mjs +10 -10
  46. package/fesm2022/clr-angular-forms-range.mjs.map +1 -1
  47. package/fesm2022/clr-angular-forms-select.mjs +10 -10
  48. package/fesm2022/clr-angular-forms-select.mjs.map +1 -1
  49. package/fesm2022/clr-angular-forms-textarea.mjs +10 -10
  50. package/fesm2022/clr-angular-forms-textarea.mjs.map +1 -1
  51. package/fesm2022/clr-angular-forms.mjs +4 -4
  52. package/fesm2022/clr-angular-forms.mjs.map +1 -1
  53. package/fesm2022/clr-angular-icon.mjs +101 -47
  54. package/fesm2022/clr-angular-icon.mjs.map +1 -1
  55. package/fesm2022/clr-angular-layout-breadcrumbs.mjs +10 -10
  56. package/fesm2022/clr-angular-layout-breadcrumbs.mjs.map +1 -1
  57. package/fesm2022/clr-angular-layout-main-container.mjs +7 -7
  58. package/fesm2022/clr-angular-layout-main-container.mjs.map +1 -1
  59. package/fesm2022/clr-angular-layout-nav.mjs +22 -22
  60. package/fesm2022/clr-angular-layout-nav.mjs.map +1 -1
  61. package/fesm2022/clr-angular-layout-tabs.mjs +35 -35
  62. package/fesm2022/clr-angular-layout-tabs.mjs.map +1 -1
  63. package/fesm2022/clr-angular-layout-vertical-nav.mjs +31 -31
  64. package/fesm2022/clr-angular-layout-vertical-nav.mjs.map +1 -1
  65. package/fesm2022/clr-angular-layout.mjs +4 -4
  66. package/fesm2022/clr-angular-layout.mjs.map +1 -1
  67. package/fesm2022/clr-angular-modal.mjs +29 -27
  68. package/fesm2022/clr-angular-modal.mjs.map +1 -1
  69. package/fesm2022/clr-angular-popover-common.mjs +70 -35
  70. package/fesm2022/clr-angular-popover-common.mjs.map +1 -1
  71. package/fesm2022/clr-angular-popover-dropdown.mjs +63 -26
  72. package/fesm2022/clr-angular-popover-dropdown.mjs.map +1 -1
  73. package/fesm2022/clr-angular-popover-signpost.mjs +27 -25
  74. package/fesm2022/clr-angular-popover-signpost.mjs.map +1 -1
  75. package/fesm2022/clr-angular-popover-tooltip.mjs +19 -19
  76. package/fesm2022/clr-angular-popover-tooltip.mjs.map +1 -1
  77. package/fesm2022/clr-angular-popover.mjs +4 -4
  78. package/fesm2022/clr-angular-popover.mjs.map +1 -1
  79. package/fesm2022/clr-angular-progress-progress-bars.mjs +7 -7
  80. package/fesm2022/clr-angular-progress-progress-bars.mjs.map +1 -1
  81. package/fesm2022/clr-angular-progress-spinner.mjs +7 -7
  82. package/fesm2022/clr-angular-progress-spinner.mjs.map +1 -1
  83. package/fesm2022/clr-angular-stepper.mjs +31 -31
  84. package/fesm2022/clr-angular-stepper.mjs.map +1 -1
  85. package/fesm2022/clr-angular-timeline.mjs +24 -24
  86. package/fesm2022/clr-angular-timeline.mjs.map +1 -1
  87. package/fesm2022/clr-angular-utils-conditional.mjs +16 -16
  88. package/fesm2022/clr-angular-utils-conditional.mjs.map +1 -1
  89. package/fesm2022/clr-angular-utils-loading.mjs +7 -7
  90. package/fesm2022/clr-angular-utils-loading.mjs.map +1 -1
  91. package/fesm2022/clr-angular-utils.mjs +149 -150
  92. package/fesm2022/clr-angular-utils.mjs.map +1 -1
  93. package/fesm2022/clr-angular-wizard.mjs +51 -51
  94. package/fesm2022/clr-angular-wizard.mjs.map +1 -1
  95. package/fesm2022/clr-angular.mjs +9 -4
  96. package/fesm2022/clr-angular.mjs.map +1 -1
  97. package/package.json +9 -5
  98. package/types/clr-angular-card.d.ts +110 -0
  99. package/types/clr-angular-data-datagrid.d.ts +427 -57
  100. package/types/clr-angular-data-tree-view.d.ts +126 -88
  101. package/types/clr-angular-forms-checkbox.d.ts +3 -0
  102. package/types/clr-angular-forms-datepicker.d.ts +1 -1
  103. package/types/clr-angular-forms-file-input.d.ts +1 -1
  104. package/types/clr-angular-forms-radio.d.ts +1 -2
  105. package/types/clr-angular-icon.d.ts +22 -2
  106. package/types/clr-angular-popover-common.d.ts +6 -0
  107. package/types/clr-angular-popover-dropdown.d.ts +33 -4
  108. package/types/clr-angular-utils.d.ts +61 -20
  109. package/types/clr-angular.d.ts +8 -6
  110. package/schematics/vitest.config.d.ts +0 -2
  111. package/schematics/vitest.config.js +0 -17
  112. package/schematics/vitest.config.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnDestroy, OnInit, OnChanges, EventEmitter, ElementRef, ViewContainerRef, ChangeDetectorRef, SimpleChanges, DoCheck, TemplateRef, IterableDiffers, TrackByFunction, QueryList, AfterContentInit, AfterViewInit, Renderer2, NgZone, EnvironmentInjector, EmbeddedViewRef, AfterViewChecked, Type } from '@angular/core';
3
- import * as i39 from '@clr/angular/utils';
4
- import { ClrCommonStringsService, IfExpandService, ClrLoadingState, ClrExpandableAnimationDirective, DomAdapter, WillyWonka, OompaLoompa } from '@clr/angular/utils';
5
- import { Observable, Subject, BehaviorSubject, ReplaySubject } from 'rxjs';
2
+ import { TemplateRef, OnDestroy, OnInit, OnChanges, EventEmitter, ElementRef, ViewContainerRef, ChangeDetectorRef, SimpleChanges, DoCheck, IterableDiffers, TrackByFunction, QueryList, AfterContentInit, AfterViewInit, Renderer2, NgZone, EnvironmentInjector, Injector, AfterViewChecked, EmbeddedViewRef, Type } from '@angular/core';
3
+ import * as i41 from '@clr/angular/utils';
4
+ import { ClrCommonStringsService, IfExpandService, ClrLoadingState, ClrExpandableAnimationDirective, FocusableItem, DomAdapter, WillyWonka, OompaLoompa } from '@clr/angular/utils';
5
+ import { Observable, BehaviorSubject, Subject, ReplaySubject } from 'rxjs';
6
6
  import { ModalStackService } from '@clr/angular/modal';
7
7
  import * as i1 from '@clr/angular/popover/common';
8
8
  import { ClrPopoverPosition, ClrPopoverService, ClrPopoverType } from '@clr/angular/popover/common';
9
- import * as i38 from '@angular/common';
9
+ import * as i40 from '@angular/common';
10
10
  import { NgForOfContext } from '@angular/common';
11
11
  import * as _clr_angular_data_datagrid from '@clr/angular/data/datagrid';
12
12
  import { ClrSignpost } from '@clr/angular/popover/signpost';
@@ -14,16 +14,18 @@ import { Directionality } from '@angular/cdk/bidi';
14
14
  import { ListRange } from '@angular/cdk/collections';
15
15
  import { CdkVirtualForOfContext, ScrollDispatcher, ViewportRuler, CdkVirtualForOf, CdkFixedSizeVirtualScroll } from '@angular/cdk/scrolling';
16
16
  import * as _angular_cdk_overlay from '@angular/cdk/overlay';
17
+ import * as i51 from '@clr/angular/popover/dropdown';
18
+ import { ClrDropdown, DropdownFocusHandler, RootDropdownService, ClrDropdownItem } from '@clr/angular/popover/dropdown';
17
19
  import { ClrControlLabel } from '@clr/angular/forms/common';
18
- import * as i40 from '@clr/angular/icon';
19
- import * as i41 from '@clr/angular/forms/input';
20
- import * as i42 from '@clr/angular/forms/radio';
21
- import * as i43 from '@clr/angular/forms/checkbox';
22
- import * as i44 from '@clr/angular/forms/number-input';
23
- import * as i45 from '@clr/angular/forms/select';
24
- import * as i46 from '@angular/forms';
20
+ import * as i42 from '@clr/angular/icon';
21
+ import * as i43 from '@clr/angular/forms/input';
22
+ import * as i44 from '@clr/angular/forms/radio';
23
+ import * as i45 from '@clr/angular/forms/checkbox';
24
+ import * as i46 from '@clr/angular/forms/number-input';
25
+ import * as i47 from '@clr/angular/forms/select';
26
+ import * as i48 from '@angular/forms';
25
27
  import { ControlValueAccessor } from '@angular/forms';
26
- import * as i47 from '@clr/angular/progress/spinner';
28
+ import * as i49 from '@clr/angular/progress/spinner';
27
29
 
28
30
  /**
29
31
  * Enumeration representing the sorting order of a datagrid column. It is a constant Enum,
@@ -43,6 +45,27 @@ declare enum ClrDatagridAriaSortOrder {
43
45
  DESC = "descending"
44
46
  }
45
47
 
48
+ declare enum DatagridColumnChanges {
49
+ WIDTH = 0,
50
+ HIDDEN = 1,
51
+ INITIALIZE = 2,
52
+ PINNED = 3
53
+ }
54
+
55
+ interface ColumnState {
56
+ columnIndex?: number;
57
+ changes?: DatagridColumnChanges[];
58
+ width?: number;
59
+ strictWidth?: number;
60
+ hideable?: boolean;
61
+ hidden?: boolean;
62
+ pinned?: boolean;
63
+ titleTemplateRef?: TemplateRef<any>;
64
+ }
65
+ interface ColumnStateDiff extends ColumnState {
66
+ changes: DatagridColumnChanges[];
67
+ }
68
+
46
69
  interface ClrDatagridComparatorInterface<T> {
47
70
  compare(a: T, b: T): number;
48
71
  }
@@ -55,9 +78,75 @@ interface ClrDatagridFilterInterface<T, S = any> {
55
78
  equals?(other: ClrDatagridFilterInterface<T, any>): boolean;
56
79
  }
57
80
 
81
+ /**
82
+ * The part of a filter that the actions menu needs. Declared here rather than importing
83
+ * ClrDatagridFilter, which would close an import cycle back through this service.
84
+ */
85
+ interface ColumnFilterHandle {
86
+ readonly active: boolean;
87
+ /**
88
+ * The id of the popover the filter renders its content into, for the menu item that opens it to
89
+ * point `aria-controls` at. Optional because it only exists once the filter has an element to
90
+ * label - a handle can register before then.
91
+ */
92
+ readonly popoverId?: string;
93
+ }
94
+ /**
95
+ * Lets `clr-dg-column-actions` and the filter of the same column find each other without either
96
+ * importing the other, and without depending on the order they are declared in.
97
+ *
98
+ * It is provided by `ClrDatagridColumn`, so every filter flavour resolves the same instance - a
99
+ * projected `clr-dg-filter` is a content child of the column, and the `clr-dg-string-filter` and
100
+ * `clr-dg-numeric-filter` the column creates for `clrDgField` live in its view.
101
+ */
102
+ declare class ColumnActionsService {
103
+ /**
104
+ * Whether the filter keeps its own toggle in the column header. An actions menu turns this off and
105
+ * opens the filter itself, so the header keeps a single control per column - unless
106
+ * `clrDgKeepFilterInHeader` asks to keep the toggle.
107
+ *
108
+ * A signal rather than a plain flag because the menu and the filter are siblings: either can be
109
+ * created first, and the filter has to react whenever the answer changes.
110
+ */
111
+ readonly filterInHeader: i0.WritableSignal<boolean>;
112
+ /**
113
+ * Whether the column has an actions menu at all, whatever it does with the filter. While it does,
114
+ * the column drops its own pin toggle, because the menu offers Pin Column instead.
115
+ */
116
+ readonly menuPresent: i0.WritableSignal<boolean>;
117
+ /** The filter rendered for this column, if it has one. */
118
+ readonly filter: i0.WritableSignal<ColumnFilterHandle>;
119
+ static ɵfac: i0.ɵɵFactoryDeclaration<ColumnActionsService, never>;
120
+ static ɵprov: i0.ɵɵInjectableDeclaration<ColumnActionsService>;
121
+ }
122
+
123
+ declare class ColumnsService {
124
+ columns: BehaviorSubject<ColumnState>[];
125
+ columnsStateChange: BehaviorSubject<ColumnState>;
126
+ private _cache;
127
+ get columnStates(): ColumnState[];
128
+ get hasHideableColumns(): boolean;
129
+ get visibleColumns(): ColumnState[];
130
+ get hasPinnedColumns(): boolean;
131
+ /**
132
+ * Tells whether the column at the given index is pinned (static). Columns and cells are
133
+ * matched by their declaration index, so this is what the header, the rows and a column aligned
134
+ * row detail use to decide which views belong in the static container.
135
+ */
136
+ isPinned(columnIndex: number): boolean;
137
+ cache(): void;
138
+ hasCache(): boolean;
139
+ resetToLastCache(): void;
140
+ emitStateChangeAt(columnIndex: number, diff: ColumnStateDiff): void;
141
+ emitStateChange(column: BehaviorSubject<ColumnState>, diff: ColumnStateDiff): void;
142
+ static ɵfac: i0.ɵɵFactoryDeclaration<ColumnsService, never>;
143
+ static ɵprov: i0.ɵɵInjectableDeclaration<ColumnsService>;
144
+ }
145
+
58
146
  declare class DetailService {
59
147
  private readonly modalStackService;
60
148
  id: string;
149
+ detailWidth: number;
61
150
  private preventScroll;
62
151
  private toggleState;
63
152
  private cache;
@@ -256,18 +345,29 @@ declare class ClrDatagridColumn<T = any> extends DatagridFilterRegistrar<T, ClrD
256
345
  private vcr;
257
346
  private detailService;
258
347
  private changeDetectorRef;
259
- private commonStrings;
348
+ protected commonStrings: ClrCommonStringsService;
349
+ private columnsService;
350
+ private columnState;
260
351
  filterStringPlaceholder: string;
261
352
  filterNumberMaxPlaceholder: string;
262
353
  filterNumberMinPlaceholder: string;
263
354
  disableUnsort: boolean;
355
+ /**
356
+ * Lets the user pin and unpin the column from within the datagrid. It only offers the control - the
357
+ * pinned state itself stays on `clrDgPinned`.
358
+ * The control is a pin toggle in the column header, or Pin Column in the column's
359
+ * `clr-dg-column-actions` when it has one - never both, so the header keeps one control per action.
360
+ */
361
+ pinnable: boolean;
264
362
  sortOrderChange: EventEmitter<ClrDatagridSortOrder>;
363
+ pinnedChange: EventEmitter<boolean>;
265
364
  filterValueChange: EventEmitter<any>;
266
365
  titleContainer: ElementRef<HTMLElement>;
267
366
  /**
268
367
  * A custom filter for this column that can be provided in the projected content
269
368
  */
270
369
  customFilter: boolean;
370
+ protected readonly columnActions: ColumnActionsService;
271
371
  private _colType;
272
372
  private _field;
273
373
  /**
@@ -286,10 +386,24 @@ declare class ClrDatagridColumn<T = any> extends DatagridFilterRegistrar<T, ClrD
286
386
  */
287
387
  private subscriptions;
288
388
  private _showSeparator;
289
- constructor(el: ElementRef<HTMLElement>, _sort: Sort<T>, filters: FiltersProvider<T>, vcr: ViewContainerRef, detailService: DetailService, changeDetectorRef: ChangeDetectorRef, commonStrings: ClrCommonStringsService);
389
+ private _pinned;
390
+ constructor(el: ElementRef<HTMLElement>, _sort: Sort<T>, filters: FiltersProvider<T>, vcr: ViewContainerRef, detailService: DetailService, changeDetectorRef: ChangeDetectorRef, commonStrings: ClrCommonStringsService, columnsService: ColumnsService, columnState: BehaviorSubject<ColumnState>);
290
391
  get isHidden(): boolean;
392
+ /**
393
+ * Whether the column is currently rendered as pinned. This can differ from the `pinned` input
394
+ * while the detail pane is open, because pinning is suspended for as long as it shows a single
395
+ * column.
396
+ */
397
+ get isPinned(): boolean;
291
398
  get showSeparator(): boolean;
292
399
  set showSeparator(value: boolean);
400
+ /**
401
+ * Pins the column to the left of the datagrid, so it stays visible while the remaining
402
+ * columns are scrolled horizontally. Pinned columns keep their declaration order and are
403
+ * rendered before the scrollable ones, right after the built-in row controls.
404
+ */
405
+ get pinned(): boolean;
406
+ set pinned(value: boolean);
293
407
  get colType(): "string" | "number";
294
408
  set colType(value: 'string' | 'number');
295
409
  get field(): string;
@@ -325,12 +439,26 @@ declare class ClrDatagridColumn<T = any> extends DatagridFilterRegistrar<T, ClrD
325
439
  * Sorts the datagrid based on this column
326
440
  */
327
441
  sort(reverse?: boolean): void;
442
+ /**
443
+ * Returns the datagrid to its unsorted state. Both the tri-state title button and the sort actions
444
+ * in `clr-dg-column-actions` go through here, so the two cannot drift apart.
445
+ */
446
+ clearSort(): void;
447
+ /**
448
+ * Pins or unpins the column. Going through the `pinned` setter keeps the rendering in sync, and the
449
+ * output lets the application follow a change it did not initiate - without it a one-way
450
+ * [clrDgPinned] binding would write the old value straight back.
451
+ */
452
+ togglePinned(): void;
453
+ protected onPinToggleClick(event: MouseEvent): void;
328
454
  private listenForDetailPaneChanges;
329
455
  private setFilterToggleAriaLabel;
330
456
  private listenForSortingChanges;
331
457
  private setupDefaultFilter;
332
- static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridColumn<any>, never>;
333
- static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridColumn<any>, "clr-dg-column", never, { "filterStringPlaceholder": { "alias": "clrFilterStringPlaceholder"; "required": false; }; "filterNumberMaxPlaceholder": { "alias": "clrFilterNumberMaxPlaceholder"; "required": false; }; "filterNumberMinPlaceholder": { "alias": "clrFilterNumberMinPlaceholder"; "required": false; }; "disableUnsort": { "alias": "clrDgDisableUnsort"; "required": false; }; "colType": { "alias": "clrDgColType"; "required": false; }; "field": { "alias": "clrDgField"; "required": false; }; "sortBy": { "alias": "clrDgSortBy"; "required": false; }; "sortOrder": { "alias": "clrDgSortOrder"; "required": false; }; "updateFilterValue": { "alias": "clrFilterValue"; "required": false; }; }, { "sortOrderChange": "clrDgSortOrderChange"; "filterValueChange": "clrFilterValueChange"; }, ["projectedFilter"], ["clr-dg-filter, clr-dg-string-filter, clr-dg-numeric-filter", "*"], false, [{ directive: typeof i1.ClrPopoverHostDirective; inputs: {}; outputs: {}; }]>;
458
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridColumn<any>, [null, null, null, null, null, null, null, null, { optional: true; }]>;
459
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridColumn<any>, "clr-dg-column", never, { "filterStringPlaceholder": { "alias": "clrFilterStringPlaceholder"; "required": false; }; "filterNumberMaxPlaceholder": { "alias": "clrFilterNumberMaxPlaceholder"; "required": false; }; "filterNumberMinPlaceholder": { "alias": "clrFilterNumberMinPlaceholder"; "required": false; }; "disableUnsort": { "alias": "clrDgDisableUnsort"; "required": false; }; "pinnable": { "alias": "clrDgPinnable"; "required": false; }; "pinned": { "alias": "clrDgPinned"; "required": false; }; "colType": { "alias": "clrDgColType"; "required": false; }; "field": { "alias": "clrDgField"; "required": false; }; "sortBy": { "alias": "clrDgSortBy"; "required": false; }; "sortOrder": { "alias": "clrDgSortOrder"; "required": false; }; "updateFilterValue": { "alias": "clrFilterValue"; "required": false; }; }, { "sortOrderChange": "clrDgSortOrderChange"; "pinnedChange": "clrDgPinnedChange"; "filterValueChange": "clrFilterValueChange"; }, ["projectedFilter"], ["clr-dg-filter, clr-dg-string-filter, clr-dg-numeric-filter", "*", "clr-dg-column-actions"], false, [{ directive: typeof i1.ClrPopoverHostDirective; inputs: {}; outputs: {}; }]>;
460
+ static ngAcceptInputType_pinnable: unknown;
461
+ static ngAcceptInputType_pinned: unknown;
334
462
  }
335
463
 
336
464
  type ClrDatagridItemsIdentityFunction<T> = (item: T) => any;
@@ -663,6 +791,7 @@ declare class ClrDatagridRow<T = any> implements AfterContentInit, AfterViewInit
663
791
  el: ElementRef<HTMLElement>;
664
792
  commonStrings: ClrCommonStringsService;
665
793
  private items;
794
+ private columnsService;
666
795
  private document;
667
796
  selectedChanged: EventEmitter<boolean>;
668
797
  expandedChange: EventEmitter<boolean>;
@@ -692,6 +821,7 @@ declare class ClrDatagridRow<T = any> implements AfterContentInit, AfterViewInit
692
821
  expandAnimation: ClrExpandableAnimationDirective;
693
822
  detailButton: ElementRef<HTMLButtonElement>;
694
823
  _stickyCells: ViewContainerRef;
824
+ _pinnedCells: ViewContainerRef;
695
825
  _scrollableCells: ViewContainerRef;
696
826
  _calculatedCells: ViewContainerRef;
697
827
  _fixedCellTemplate: TemplateRef<any>;
@@ -702,8 +832,15 @@ declare class ClrDatagridRow<T = any> implements AfterContentInit, AfterViewInit
702
832
  private _rowSelectionLabel;
703
833
  private wrappedInjector;
704
834
  private subscriptions;
835
+ /**
836
+ * The placeholder cells we create from `fixedCellTemplate` for the calculate pass. Unlike the
837
+ * cell views, which belong to their `WrappedCell`, these are created here on every pass, so
838
+ * they are ours to destroy. Detaching them from the container only unlinks them - the views
839
+ * themselves would stay alive and keep the whole row, and the datagrid with it, in memory.
840
+ */
841
+ private fixedCellViews;
705
842
  private _selectable;
706
- constructor(selection: Selection<T>, rowActionService: RowActionService, globalExpandable: ExpandableRowsCount, expand: DatagridIfExpandService, detailService: DetailService, displayMode: DisplayModeService, vcr: ViewContainerRef, renderer: Renderer2, el: ElementRef<HTMLElement>, commonStrings: ClrCommonStringsService, items: Items, document: any);
843
+ constructor(selection: Selection<T>, rowActionService: RowActionService, globalExpandable: ExpandableRowsCount, expand: DatagridIfExpandService, detailService: DetailService, displayMode: DisplayModeService, vcr: ViewContainerRef, renderer: Renderer2, el: ElementRef<HTMLElement>, commonStrings: ClrCommonStringsService, items: Items, columnsService: ColumnsService, document: any);
707
844
  /**
708
845
  * Model of the row, to use for selection
709
846
  */
@@ -744,6 +881,14 @@ declare class ClrDatagridRow<T = any> implements AfterContentInit, AfterViewInit
744
881
  * @deprecated related to clrDgRowSelection, which is deprecated
745
882
  */
746
883
  protected selectRow(selected: boolean, $event: any): void;
884
+ private destroyFixedCellViews;
885
+ /**
886
+ * Projects the cells into the display containers. Cells of pinned columns go into their static
887
+ * container so they stay visible during horizontal scroll; the rest stay scrollable. Cells are
888
+ * matched with their column by declaration index, and iterating in that order keeps both groups
889
+ * aligned with the header.
890
+ */
891
+ private insertCellViews;
747
892
  private rangeSelect;
748
893
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridRow<any>, never>;
749
894
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridRow<any>, "clr-dg-row", never, { "detailDisabled": { "alias": "clrDgDetailDisabled"; "required": false; }; "detailHidden": { "alias": "clrDgDetailHidden"; "required": false; }; "skeletonLoading": { "alias": "clrDgSkeletonLoading"; "required": false; }; "item": { "alias": "clrDgItem"; "required": false; }; "clrDgSelectable": { "alias": "clrDgSelectable"; "required": false; }; "selected": { "alias": "clrDgSelected"; "required": false; }; "expanded": { "alias": "clrDgExpanded"; "required": false; }; "clrDgDetailOpenLabel": { "alias": "clrDgDetailOpenLabel"; "required": false; }; "clrDgDetailCloseLabel": { "alias": "clrDgDetailCloseLabel"; "required": false; }; "clrDgRowSelectionLabel": { "alias": "clrDgRowSelectionLabel"; "required": false; }; }, { "selectedChanged": "clrDgSelectedChange"; "expandedChange": "clrDgExpandedChange"; }, ["dgCells"], ["clr-dg-action-overflow", "clr-dg-cell", "clr-dg-row-detail"], false, never>;
@@ -785,6 +930,14 @@ declare class ClrDatagridVirtualScrollDirective<T> implements AfterViewInit, DoC
785
930
  private cdkVirtualFor;
786
931
  private subscriptions;
787
932
  private topIndex;
933
+ /**
934
+ * Injectors for the CDK virtual scroll instances we create by hand, in the order they have to be
935
+ * destroyed. Destroying them is what runs the CDK teardown: their `ngOnDestroy` and, importantly,
936
+ * the `DestroyRef` cleanup `CdkVirtualScrollViewport` registers for the effect it creates on the
937
+ * application injector. Leaving them alive keeps that effect registered, which retains the
938
+ * viewport and the entire datagrid view tree for as long as the application lives.
939
+ */
940
+ private readonly cdkInjectors;
788
941
  private mutationChanges;
789
942
  private cdkVirtualForInputs;
790
943
  private _totalItems;
@@ -820,6 +973,18 @@ declare class ClrDatagridVirtualScrollDirective<T> implements AfterViewInit, DoC
820
973
  private updateAriaRowCount;
821
974
  private updateAriaRowIndexes;
822
975
  private createVirtualScrollViewportForDatagrid;
976
+ private createCdkVirtualScrollViewport;
977
+ /**
978
+ * `Directionality`, `ScrollDispatcher` and `ViewportRuler` belong to the application, not to us.
979
+ * Angular registers every value an injector hands out that has an `ngOnDestroy` - `useValue`
980
+ * providers included - and calls it from `injector.destroy()`, so putting them in an injector we
981
+ * destroy would end scroll, resize and text-direction notification for the whole application the
982
+ * first time a virtual scroll datagrid goes away. They live in this parent, which nothing destroys,
983
+ * so the viewport still resolves the very instances our host injector gave us - including a
984
+ * `Directionality` overridden by an ancestor `[dir]`.
985
+ */
986
+ private createApplicationInjector;
987
+ private createCdkVirtualForOfDirective;
823
988
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridVirtualScrollDirective<any>, never>;
824
989
  static ɵdir: i0.ɵɵDirectiveDeclaration<ClrDatagridVirtualScrollDirective<any>, "[clrVirtualScroll],[ClrVirtualScroll]", never, { "persistItems": { "alias": "clrVirtualPersistItems"; "required": false; }; "cdkVirtualForOf": { "alias": "clrVirtualRowsOf"; "required": false; }; "cdkVirtualForTrackBy": { "alias": "clrVirtualRowsTrackBy"; "required": false; }; "cdkVirtualForTemplate": { "alias": "clrVirtualRowsTemplate"; "required": false; }; "cdkVirtualForTemplateCacheSize": { "alias": "clrVirtualRowsTemplateCacheSize"; "required": false; }; "itemSize": { "alias": "clrVirtualRowsItemSize"; "required": false; }; "minBufferPx": { "alias": "clrVirtualRowsMinBufferPx"; "required": false; }; "maxBufferPx": { "alias": "clrVirtualRowsMaxBufferPx"; "required": false; }; "dataRange": { "alias": "clrVirtualDataRange"; "required": false; }; }, { "renderedRangeChange": "renderedRangeChange"; }, never, never, false, never>;
825
990
  }
@@ -902,6 +1067,7 @@ declare class ClrDatagrid<T = any> implements AfterContentInit, AfterViewInit, O
902
1067
  commonStrings: ClrCommonStringsService;
903
1068
  keyNavigation: KeyNavigationGridController;
904
1069
  private zone;
1070
+ private columnsService;
905
1071
  loadingMoreItems: boolean;
906
1072
  clrDgSingleSelectionAriaLabel: string;
907
1073
  clrDgSingleActionableAriaLabel: string;
@@ -947,6 +1113,7 @@ declare class ClrDatagrid<T = any> implements AfterContentInit, AfterViewInit, O
947
1113
  rowsWrapper: ElementRef<HTMLElement>;
948
1114
  scrollableColumns: ViewContainerRef;
949
1115
  _projectedDisplayColumns: ViewContainerRef;
1116
+ _projectedStickyColumns: ViewContainerRef;
950
1117
  _projectedCalculationColumns: ViewContainerRef;
951
1118
  _displayedRows: ViewContainerRef;
952
1119
  _calculationRows: ViewContainerRef;
@@ -956,15 +1123,28 @@ declare class ClrDatagrid<T = any> implements AfterContentInit, AfterViewInit, O
956
1123
  activeCellCoords: CellCoordinates;
957
1124
  SELECTION_TYPE: typeof SelectionType;
958
1125
  private selectAllCheckbox;
1126
+ private rowControls;
959
1127
  /**
960
1128
  * Subscriptions to all the services and queries changes
961
1129
  */
962
1130
  private _subscriptions;
963
1131
  private _virtualScrollSubscriptions;
1132
+ /**
1133
+ * The placeholder columns we create from `fixedColumnTemplate` for the calculate pass. Unlike
1134
+ * the column views, which belong to their `WrappedColumn`, these are created here on every
1135
+ * pass, so they are ours to destroy. Detaching them from the container only unlinks them - the
1136
+ * views themselves would stay alive and keep the whole datagrid in memory.
1137
+ */
1138
+ private fixedColumnViews;
964
1139
  private cachedRowsHeight;
965
1140
  private cachedContentHeight;
966
1141
  private resizeObserver;
967
- constructor(organizer: DatagridRenderOrganizer, items: Items<T>, expandableRows: ExpandableRowsCount, selection: Selection<T>, rowActionService: RowActionService, stateProvider: StateProvider<T>, displayMode: DisplayModeService, renderer: Renderer2, detailService: DetailService, document: any, el: ElementRef<HTMLElement>, page: Page, commonStrings: ClrCommonStringsService, keyNavigation: KeyNavigationGridController, zone: NgZone);
1142
+ /**
1143
+ * Watches the row controls for anything that changes their width without going through a render
1144
+ * cycle - a density change, or an application restyling them.
1145
+ */
1146
+ private rowControlsObserver;
1147
+ constructor(organizer: DatagridRenderOrganizer, items: Items<T>, expandableRows: ExpandableRowsCount, selection: Selection<T>, rowActionService: RowActionService, stateProvider: StateProvider<T>, displayMode: DisplayModeService, renderer: Renderer2, detailService: DetailService, document: any, el: ElementRef<HTMLElement>, page: Page, commonStrings: ClrCommonStringsService, keyNavigation: KeyNavigationGridController, zone: NgZone, columnsService: ColumnsService);
968
1148
  /**
969
1149
  * Freezes the datagrid while data is loading
970
1150
  */
@@ -998,6 +1178,7 @@ declare class ClrDatagrid<T = any> implements AfterContentInit, AfterViewInit, O
998
1178
  get allSelected(): boolean;
999
1179
  set allSelected(value: boolean);
1000
1180
  get virtualScroll(): ClrDatagridVirtualScrollDirective<any>;
1181
+ protected get isDetailOverlay(): boolean;
1001
1182
  ngAfterContentInit(): void;
1002
1183
  /**
1003
1184
  * Our setup happens in the view of some of our components, so we wait for it to be done before starting
@@ -1016,7 +1197,29 @@ declare class ClrDatagrid<T = any> implements AfterContentInit, AfterViewInit, O
1016
1197
  * Public method to re-trigger the computation of displayed items manually
1017
1198
  */
1018
1199
  dataChanged(): void;
1200
+ private destroyFixedColumnViews;
1019
1201
  private toggleVirtualScrollSubscriptions;
1202
+ /**
1203
+ * Publishes the width of the row controls - the static container holding the select, action and
1204
+ * caret cells - as a custom property, which is where the pinned columns read the offset they
1205
+ * became static at. They are static right after the controls rather than at the edge of the datagrid,
1206
+ * and `position: sticky` always measures its offsets from that edge, so the distance between the
1207
+ * two has to be measured and handed to the stylesheet.
1208
+ *
1209
+ * The header and the rows get their own value: the header renders one caret column for both
1210
+ * kinds of caret where a row renders one cell per caret, so the two containers are not
1211
+ * necessarily the same width.
1212
+ *
1213
+ * Nothing reads this property unless a column is pinned - `.datagrid-pinned-cells` is the only
1214
+ * consumer, and it is `display: none` while empty - so the measurement is skipped entirely
1215
+ * otherwise. It matters on a datagrid with many rows: `getBoundingClientRect()` forces the
1216
+ * browser to resolve any pending layout first, and on a large datagrid that resolution is not
1217
+ * cheap. Both boxes are read before either write for the same reason - writing the custom
1218
+ * property is itself layout-affecting (`.datagrid-pinned-cells` reads it back for its own
1219
+ * position and width), so reading again in between would force that resolution twice.
1220
+ */
1221
+ private updateRowControlsWidth;
1222
+ private setRowControlsWidth;
1020
1223
  private handleResizeChanges;
1021
1224
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagrid<any>, never>;
1022
1225
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagrid<any>, "clr-datagrid", never, { "loadingMoreItems": { "alias": "clrLoadingMoreItems"; "required": false; }; "clrDgSingleSelectionAriaLabel": { "alias": "clrDgSingleSelectionAriaLabel"; "required": false; }; "clrDgSingleActionableAriaLabel": { "alias": "clrDgSingleActionableAriaLabel"; "required": false; }; "clrDetailExpandableAriaLabel": { "alias": "clrDetailExpandableAriaLabel"; "required": false; }; "clrDgDisablePageFocus": { "alias": "clrDgDisablePageFocus"; "required": false; }; "customSelectAllEnabled": { "alias": "clrDgCustomSelectAllEnabled"; "required": false; }; "selectAllDisabled": { "alias": "clrDgSelectAllDisabled"; "required": false; }; "loading": { "alias": "clrDgLoading"; "required": false; }; "selectionType": { "alias": "clrDgSelectionType"; "required": false; }; "selected": { "alias": "clrDgSelected"; "required": false; }; "clrDgPreserveSelection": { "alias": "clrDgPreserveSelection"; "required": false; }; "rowSelectionMode": { "alias": "clrDgRowSelection"; "required": false; }; "identityFn": { "alias": "clrDgItemsIdentityFn"; "required": false; }; }, { "selectedChanged": "clrDgSelectedChange"; "refresh": "clrDgRefresh"; "customSelectAll": "clrDgCustomSelectAll"; }, ["iterator", "placeholder", "_virtualScroll", "columns", "rows"], ["clr-dg-action-bar", "clr-dg-placeholder", "clr-dg-footer", "[clrIfDetail],clr-dg-detail"], false, never>;
@@ -1051,39 +1254,177 @@ declare class ClrDatagridActionOverflow implements OnDestroy {
1051
1254
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridActionOverflow, "clr-dg-action-overflow", never, { "buttonLabel": { "alias": "clrDgActionOverflowButtonLabel"; "required": false; }; "open": { "alias": "clrDgActionOverflowOpen"; "required": false; }; }, { "openChange": "clrDgActionOverflowOpenChange"; }, never, ["*"], false, [{ directive: typeof i1.ClrPopoverHostDirective; inputs: {}; outputs: {}; }]>;
1052
1255
  }
1053
1256
 
1054
- declare enum DatagridColumnChanges {
1055
- WIDTH = 0,
1056
- HIDDEN = 1,
1057
- INITIALIZE = 2
1058
- }
1059
-
1060
- interface ColumnState {
1061
- columnIndex?: number;
1062
- changes?: DatagridColumnChanges[];
1063
- width?: number;
1064
- strictWidth?: number;
1065
- hideable?: boolean;
1066
- hidden?: boolean;
1067
- titleTemplateRef?: TemplateRef<any>;
1068
- }
1069
- interface ColumnStateDiff extends ColumnState {
1070
- changes: DatagridColumnChanges[];
1257
+ /**
1258
+ * Groups the actions of a single column behind one menu in the column header. It only gathers
1259
+ * controls that already exist on the column - the behavior itself stays on `ClrDatagridColumn`,
1260
+ * so the menu and the header controls can never drift apart.
1261
+ *
1262
+ * Each item is rendered only when the column can actually perform it, so the menu never offers a
1263
+ * dead option - that covers both what the column can never do, such as sorting when it is not
1264
+ * sortable, and what it cannot do right now, such as clearing a sort while nothing is sorted.
1265
+ * Anything projected into the component is appended after the built-in items.
1266
+ *
1267
+ * A column that has a filter gets a filter action automatically, and the filter drops its own toggle
1268
+ * for as long as this menu is present - the header keeps one control per column rather than two. The
1269
+ * trigger also takes over showing that the column is filtered, which the toggle used to do.
1270
+ * `clrDgKeepFilterInHeader` opts back into the toggle, and then the menu drops the filter action in
1271
+ * exchange: a column offers one way to reach its filter, never both at once.
1272
+ *
1273
+ * Projected items can be `clrDgColumnAction`s, plain `clrDropdownItem`s, or a nested `clr-dropdown`.
1274
+ * They join the arrow key order after the built-in items as long as they are projected directly -
1275
+ * an item wrapped in an element of its own is not found. A nested dropdown's own items stay in its
1276
+ * own menu.
1277
+ *
1278
+ * The component is the dropdown itself rather than wrapping one, so that a projected item can reach
1279
+ * it: injection resolves from where a node is declared, and an item declared outside this component
1280
+ * would sit outside the injector of any `clr-dropdown` in its template.
1281
+ */
1282
+ declare class ClrDatagridColumnActions extends ClrDropdown implements AfterViewInit, OnDestroy {
1283
+ protected column: ClrDatagridColumn;
1284
+ protected commonStrings: ClrCommonStringsService;
1285
+ private columnActions;
1286
+ private columnPopover;
1287
+ private changeDetectorRef;
1288
+ private injector;
1289
+ private filters;
1290
+ protected readonly ClrDatagridSortOrder: typeof ClrDatagridSortOrder;
1291
+ private _keepFilterInHeader;
1292
+ private _menuPopoverContent;
1293
+ private trigger;
1294
+ private subs;
1295
+ private projectedItemsSubscription;
1296
+ private readonly columnActionsFocusHandler;
1297
+ constructor(column: ClrDatagridColumn, commonStrings: ClrCommonStringsService, columnActions: ColumnActionsService, columnPopover: ClrPopoverService, changeDetectorRef: ChangeDetectorRef, injector: Injector, filters: FiltersProvider, parent: ClrDropdown, popoverService: ClrPopoverService, focusHandler: DropdownFocusHandler, dropdownService: RootDropdownService);
1298
+ /**
1299
+ * Keeps the filter's own toggle in the column header instead of moving it into this menu, and the
1300
+ * menu drops its filter action in exchange - a column offers one way to reach its filter at a
1301
+ * time, never two.
1302
+ */
1303
+ get keepFilterInHeader(): boolean;
1304
+ set keepFilterInHeader(value: boolean);
1305
+ /**
1306
+ * The menu is a live view of the column, so the label has to be read at render time rather than
1307
+ * cached - the column title can change, and so can the sort state it reports.
1308
+ */
1309
+ protected get triggerLabel(): string;
1310
+ protected get sortOrder(): ClrDatagridSortOrder;
1311
+ protected get canClearSort(): boolean;
1312
+ protected get hasFilter(): boolean;
1313
+ /**
1314
+ * Hiding the filter toggle also hides the only sign that a column is filtered, so the trigger and
1315
+ * the filter action carry that state instead.
1316
+ */
1317
+ protected get filterActive(): boolean;
1318
+ /**
1319
+ * Whether the filter this menu opens is open, for the filter action to report the same way the
1320
+ * toggle it replaced did. Read from the column's popover service rather than from the filter,
1321
+ * because that service is what the action opens.
1322
+ */
1323
+ protected get filterOpen(): boolean;
1324
+ /**
1325
+ * The popover the filter action opens, so it can point at what it controls - again the same thing
1326
+ * the replaced toggle pointed at.
1327
+ */
1328
+ protected get filterPopoverId(): string | null;
1329
+ /**
1330
+ * The items projected into the menu. The menu's own content query cannot see them, so they are
1331
+ * handed to the focus handler from here.
1332
+ *
1333
+ * Only direct children are queried, not descendants: a nested `clr-dropdown` is one item here - its
1334
+ * focus handler - and the items inside it belong to its own menu, not to this one.
1335
+ */
1336
+ private set projectedItems(value);
1337
+ private set menuPopoverContent(value);
1338
+ ngAfterViewInit(): void;
1339
+ ngOnDestroy(): void;
1340
+ /**
1341
+ * Returns focus to the trigger before closing, the same order `clrDropdownItem` uses - moving focus
1342
+ * first means it lands correctly even when the action opens a modal.
1343
+ */
1344
+ closeMenu(): void;
1345
+ /**
1346
+ * Re-anchors the open menu to the trigger, for an action that moves the column it belongs to
1347
+ * instead of closing the menu behind it.
1348
+ *
1349
+ * Deferred to after the next render rather than run straight away, because the action that asked
1350
+ * for this has only just been clicked - the column is relocated by the change detection that
1351
+ * follows, so measuring the trigger now would re-anchor the menu to where it already is.
1352
+ */
1353
+ repositionMenu(): void;
1354
+ /**
1355
+ * Moves focus to one of the projected actions, keeping the menu's keyboard handling in step with
1356
+ * it.
1357
+ *
1358
+ * Called by `clrDgColumnAction` when the item takes focus, so that focusing an item by any means -
1359
+ * including a plain `focus()` from outside, after an action rebuilt the menu - leaves space and
1360
+ * enter acting on that same item rather than on whatever the menu focused when it opened.
1361
+ */
1362
+ focusAction(item: FocusableItem): void;
1363
+ /**
1364
+ * The menu states a direction rather than cycling through them, so asking for the direction the
1365
+ * column already has is a no-op.
1366
+ *
1367
+ * The guard is needed because `Sort.toggle()` reads `forceReverse: false` as "toggle" rather than
1368
+ * "ascending" - `forceReverse || !this._reverse` falls through to the toggle for a falsy value - so
1369
+ * `sort(false)` on an already ascending column would flip it to descending. The tri-state title
1370
+ * button never hits that path, because it always calls `sort()` without an argument.
1371
+ */
1372
+ protected sort(descending: boolean): void;
1373
+ /**
1374
+ * Pins or unpins the column, then re-anchors this menu to the trigger.
1375
+ *
1376
+ * Pinning moves the column between the datagrid's static and scrollable containers, and the
1377
+ * trigger this menu is anchored to travels with it - far enough that the menu would otherwise be
1378
+ * left hanging next to where the column used to be. The menu stays open on purpose, so the action
1379
+ * it now offers is the one that undoes the pin the user just applied.
1380
+ *
1381
+ * The columns are relocated on the render cycle the pinned state change schedules, not while this
1382
+ * runs, so the overlay can only be re-anchored once that has happened - which `repositionMenu`
1383
+ * takes care of.
1384
+ */
1385
+ protected togglePinned(): void;
1386
+ /**
1387
+ * Opens the filter of this column, anchored to the "Filter Column" menu item itself (`#trigger`
1388
+ * above), so the popover positions off the item that was actually clicked rather than the kebab.
1389
+ *
1390
+ * The popover is driven through the column's ClrPopoverService rather than through
1391
+ * `ClrDatagridFilter.open`, because that is the one thing every filter flavour has in common - a
1392
+ * projected clr-dg-filter, and the string and numeric filters the column builds for clrDgField,
1393
+ * all share this service. Setting `origin` is all it takes to re-anchor it: `clrPopoverOrigin` is
1394
+ * itself only an assignment to that property, and with the toggle gone nothing else claims it.
1395
+ *
1396
+ * `parent` links the filter's popover to this menu's, so that scrolling while both are open closes
1397
+ * or repositions them together rather than leaving one behind. It is cleared again once the filter
1398
+ * closes, in the `openChange` subscription below, so it never outlives the menu session that set it.
1399
+ */
1400
+ protected openFilter(event: Event): void;
1401
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridColumnActions, [null, null, null, { skipSelf: true; }, null, null, { optional: true; }, { optional: true; skipSelf: true; }, null, null, null]>;
1402
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridColumnActions, "clr-dg-column-actions", never, { "keepFilterInHeader": { "alias": "clrDgKeepFilterInHeader"; "required": false; }; }, {}, ["projectedItems"], ["*"], false, never>;
1403
+ static ngAcceptInputType_keepFilterInHeader: unknown;
1071
1404
  }
1072
1405
 
1073
- declare class ColumnsService {
1074
- columns: BehaviorSubject<ColumnState>[];
1075
- columnsStateChange: BehaviorSubject<ColumnState>;
1076
- private _cache;
1077
- get columnStates(): ColumnState[];
1078
- get hasHideableColumns(): boolean;
1079
- get visibleColumns(): ColumnState[];
1080
- cache(): void;
1081
- hasCache(): boolean;
1082
- resetToLastCache(): void;
1083
- emitStateChangeAt(columnIndex: number, diff: ColumnStateDiff): void;
1084
- emitStateChange(column: BehaviorSubject<ColumnState>, diff: ColumnStateDiff): void;
1085
- static ɵfac: i0.ɵɵFactoryDeclaration<ColumnsService, never>;
1086
- static ɵprov: i0.ɵɵInjectableDeclaration<ColumnsService>;
1406
+ /**
1407
+ * An application provided item in a `clr-dg-column-actions` menu. It is the dropdown item - same
1408
+ * inputs, styling and arrow key order - with what a column action needs on top: it closes the menu
1409
+ * when picked, or re-anchors it after an action that leaves it open.
1410
+ */
1411
+ declare class ClrDatagridColumnAction extends ClrDropdownItem {
1412
+ private columnActions;
1413
+ /**
1414
+ * Whether activating this item should close the menu.
1415
+ */
1416
+ canClosePopover: boolean;
1417
+ constructor(columnActions: ClrDatagridColumnActions, item: FocusableItem, dropdownService: RootDropdownService, el: ElementRef, renderer: Renderer2);
1418
+ protected onColumnActionClick(): void;
1419
+ /**
1420
+ * Focus can arrive from anywhere - the arrow keys, or a plain `focus()` from an application that
1421
+ * moved the column this action belongs to and rebuilt the menu. Reporting it keeps space and enter
1422
+ * acting on this item rather than on whatever the menu focused when it opened.
1423
+ */
1424
+ protected onFocus(): void;
1425
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridColumnAction, never>;
1426
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ClrDatagridColumnAction, "[clrDgColumnAction]", never, { "canClosePopover": { "alias": "clrCanClosePopover"; "required": false; }; }, {}, never, never, false, never>;
1427
+ static ngAcceptInputType_canClosePopover: unknown;
1087
1428
  }
1088
1429
 
1089
1430
  declare class ClrDatagridColumnToggle implements OnDestroy {
@@ -1208,11 +1549,15 @@ declare class ClrDatagridDetail {
1208
1549
  ariaLabel: string;
1209
1550
  header: ClrDatagridDetailHeader;
1210
1551
  constructor(detailService: DetailService, commonStrings: ClrCommonStringsService);
1552
+ get detailWidth(): number;
1553
+ set detailWidth(value: number | null | undefined);
1554
+ get isCustomWidth(): boolean;
1555
+ get width(): number | null;
1211
1556
  get labelledBy(): string;
1212
1557
  get label(): string;
1213
1558
  close(): void;
1214
1559
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridDetail, never>;
1215
- static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridDetail, "clr-dg-detail", never, { "ariaLabelledBy": { "alias": "clrDetailAriaLabelledBy"; "required": false; }; "ariaLabel": { "alias": "clrDetailAriaLabel"; "required": false; }; }, {}, ["header"], ["*"], false, never>;
1560
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridDetail, "clr-dg-detail", never, { "ariaLabelledBy": { "alias": "clrDetailAriaLabelledBy"; "required": false; }; "ariaLabel": { "alias": "clrDetailAriaLabel"; "required": false; }; "detailWidth": { "alias": "clrDetailWidth"; "required": false; }; }, {}, ["header"], ["*"], false, never>;
1216
1561
  }
1217
1562
 
1218
1563
  declare class ClrDatagridDetailBody {
@@ -1269,6 +1614,7 @@ declare class ClrDatagridFilter<T = any> extends DatagridFilterRegistrar<T, ClrD
1269
1614
  commonStrings: ClrCommonStringsService;
1270
1615
  private popoverService;
1271
1616
  private keyNavigation;
1617
+ protected columnActions: ColumnActionsService;
1272
1618
  openChange: EventEmitter<boolean>;
1273
1619
  ariaExpanded: boolean;
1274
1620
  popoverId: string;
@@ -1276,7 +1622,7 @@ declare class ClrDatagridFilter<T = any> extends DatagridFilterRegistrar<T, ClrD
1276
1622
  popoverType: ClrPopoverType;
1277
1623
  anchor: ElementRef<HTMLButtonElement>;
1278
1624
  private subs;
1279
- constructor(_filters: FiltersProvider<T>, commonStrings: ClrCommonStringsService, popoverService: ClrPopoverService, keyNavigation: KeyNavigationGridController);
1625
+ constructor(_filters: FiltersProvider<T>, commonStrings: ClrCommonStringsService, popoverService: ClrPopoverService, keyNavigation: KeyNavigationGridController, columnActions: ColumnActionsService);
1280
1626
  get open(): boolean;
1281
1627
  set open(open: boolean);
1282
1628
  set customFilter(filter: ClrDatagridFilterInterface<T> | RegisteredFilter<T, ClrDatagridFilterInterface<T>>);
@@ -1285,7 +1631,7 @@ declare class ClrDatagridFilter<T = any> extends DatagridFilterRegistrar<T, ClrD
1285
1631
  */
1286
1632
  get active(): boolean;
1287
1633
  ngOnDestroy(): void;
1288
- static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridFilter<any>, [null, null, null, { optional: true; }]>;
1634
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridFilter<any>, [null, null, null, { optional: true; }, { optional: true; }]>;
1289
1635
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridFilter<any>, "clr-dg-filter", never, { "open": { "alias": "clrDgFilterOpen"; "required": false; }; "customFilter": { "alias": "clrDgFilter"; "required": false; }; }, { "openChange": "clrDgFilterOpenChange"; }, never, ["*"], false, never>;
1290
1636
  static ngAcceptInputType_open: unknown;
1291
1637
  }
@@ -1320,24 +1666,46 @@ declare class ClrIfDetail implements OnInit, OnDestroy {
1320
1666
  * Generic bland container serving various purposes for Datagrid.
1321
1667
  * For instance, it can help span a text over multiple rows in detail view.
1322
1668
  */
1323
- declare class ClrDatagridRowDetail implements AfterContentInit, OnDestroy {
1669
+ declare class ClrDatagridRowDetail implements AfterContentInit, AfterViewInit, AfterViewChecked, OnDestroy {
1324
1670
  selection: Selection;
1325
1671
  rowActionService: RowActionService;
1326
1672
  expand: DatagridIfExpandService;
1327
1673
  expandableRows: ExpandableRowsCount;
1328
1674
  commonStrings: ClrCommonStringsService;
1675
+ private columnsService;
1676
+ private displayMode;
1329
1677
  _beginningOfExpandableContentAriaText: string;
1330
1678
  _endOfExpandableContentAriaText: string;
1331
1679
  replacedRow: boolean;
1680
+ /**
1681
+ * Whether the detail lays its cells out in the same columns as the row, which it does when it
1682
+ * holds one cell per column and at least one of those columns is pinned. The cells of the pinned
1683
+ * columns are then static alongside the ones in the row above.
1684
+ */
1685
+ columnAligned: boolean;
1332
1686
  SELECTION_TYPE: typeof SelectionType;
1333
1687
  cells: QueryList<ClrDatagridCell>;
1688
+ private _pinnedCells;
1689
+ private _scrollableCells;
1690
+ private _plainCells;
1334
1691
  private subscriptions;
1335
- constructor(selection: Selection, rowActionService: RowActionService, expand: DatagridIfExpandService, expandableRows: ExpandableRowsCount, commonStrings: ClrCommonStringsService);
1692
+ private cellsMoved;
1693
+ private lastLayout;
1694
+ private hadCells;
1695
+ constructor(selection: Selection, rowActionService: RowActionService, expand: DatagridIfExpandService, expandableRows: ExpandableRowsCount, commonStrings: ClrCommonStringsService, columnsService: ColumnsService, displayMode: DisplayModeService);
1336
1696
  set replace(value: boolean);
1337
1697
  get beginningOfExpandableContentAriaText(): string;
1338
1698
  get endOfExpandableContentAriaText(): string;
1339
1699
  ngAfterContentInit(): void;
1700
+ ngAfterViewInit(): void;
1701
+ ngAfterViewChecked(): void;
1340
1702
  ngOnDestroy(): void;
1703
+ /**
1704
+ * Moves the cells into the containers that lay them out in the same columns as the row, or back
1705
+ * out of them once that stops making sense.
1706
+ */
1707
+ private syncColumnAlignment;
1708
+ private moveCell;
1341
1709
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridRowDetail, never>;
1342
1710
  static ɵcmp: i0.ɵɵComponentDeclaration<ClrDatagridRowDetail, "clr-dg-row-detail", never, { "_beginningOfExpandableContentAriaText": { "alias": "clrRowDetailBeginningAriaText"; "required": false; }; "_endOfExpandableContentAriaText": { "alias": "clrRowDetailEndAriaText"; "required": false; }; "replace": { "alias": "clrDgReplace"; "required": false; }; }, {}, ["cells"], ["*"], false, never>;
1343
1711
  }
@@ -1708,6 +2076,7 @@ declare class DatagridCellRenderer implements OnDestroy {
1708
2076
  resetState(state: ColumnState): void;
1709
2077
  setWidth(state: ColumnState): void;
1710
2078
  setHidden(state: ColumnState): void;
2079
+ setPinned(state: ColumnState): void;
1711
2080
  private clearWidth;
1712
2081
  static ɵfac: i0.ɵɵFactoryDeclaration<DatagridCellRenderer, never>;
1713
2082
  static ɵdir: i0.ɵɵDirectiveDeclaration<DatagridCellRenderer, "clr-dg-cell", never, {}, {}, never, never, false, never>;
@@ -1733,6 +2102,7 @@ declare class DatagridHeaderRenderer implements OnDestroy {
1733
2102
  setColumnState(index: number): void;
1734
2103
  setWidth(state: ColumnState): void;
1735
2104
  setHidden(state: ColumnState): void;
2105
+ setPinned(state: ColumnState): void;
1736
2106
  private clearWidth;
1737
2107
  private detectStrictWidth;
1738
2108
  private computeWidth;
@@ -1835,9 +2205,9 @@ declare const CLR_DATAGRID_DIRECTIVES: Type<any>[];
1835
2205
  declare class ClrDatagridModule {
1836
2206
  constructor();
1837
2207
  static ɵfac: i0.ɵɵFactoryDeclaration<ClrDatagridModule, never>;
1838
- static ɵmod: i0.ɵɵNgModuleDeclaration<ClrDatagridModule, [typeof ClrDatagrid, typeof ClrDatagridActionBar, typeof ClrDatagridActionOverflow, typeof ClrDatagridCell, typeof ClrDatagridColumn, typeof ClrDatagridColumnSeparator, typeof ClrDatagridDetail, typeof ClrDatagridDetailBody, typeof ClrDatagridDetailHeader, typeof ClrDatagridFilter, typeof ClrDatagridFooter, typeof ClrDatagridHideableColumn, typeof ClrDatagridItems, typeof ClrDatagridPageSize, typeof ClrDatagridPagination, typeof ClrDatagridPlaceholder, typeof ClrDatagridRow, typeof ClrDatagridRowDetail, typeof ClrDatagridSelectionCellDirective, typeof ClrDatagridVirtualScrollDirective, typeof ClrIfDetail, typeof DatagridDetailRegisterer, typeof WrappedCell, typeof WrappedColumn, typeof WrappedRow, typeof DatagridCellRenderer, typeof DatagridHeaderRenderer, typeof DatagridMainRenderer, typeof DatagridRowDetailRenderer, typeof DatagridRowRenderer, typeof ActionableOompaLoompa, typeof DatagridWillyWonka, typeof ExpandableOompaLoompa, typeof DatagridNumericFilter, typeof DatagridStringFilter, typeof ClrDatagridColumnToggle, typeof ClrDatagridColumnToggleButton], [typeof i38.CommonModule, typeof i39.CdkDragModule, typeof i39.CdkTrapFocusModule, typeof i40.ClrIcon, typeof i41.ClrInputModule, typeof i42.ClrRadioModule, typeof i43.ClrCheckboxModule, typeof i44.ClrNumberInputModule, typeof i45.ClrSelectModule, typeof i46.FormsModule, typeof i39.ClrLoadingModule, typeof i39.ClrConditionalModule, typeof i39.ClrOutsideClickModule, typeof i39.ClrExpandableAnimationModule, typeof i47.ClrSpinnerModule, typeof i1.ClrPopoverModuleNext, typeof i39.ClrKeyFocusModule, typeof ClrDatagridSingleSelectionValueAccessor, typeof i39.ClrIfExpanded], [typeof ClrDatagrid, typeof ClrDatagridActionBar, typeof ClrDatagridActionOverflow, typeof ClrDatagridCell, typeof ClrDatagridColumn, typeof ClrDatagridColumnSeparator, typeof ClrDatagridDetail, typeof ClrDatagridDetailBody, typeof ClrDatagridDetailHeader, typeof ClrDatagridFilter, typeof ClrDatagridFooter, typeof ClrDatagridHideableColumn, typeof ClrDatagridItems, typeof ClrDatagridPageSize, typeof ClrDatagridPagination, typeof ClrDatagridPlaceholder, typeof ClrDatagridRow, typeof ClrDatagridRowDetail, typeof ClrDatagridSelectionCellDirective, typeof ClrDatagridVirtualScrollDirective, typeof ClrIfDetail, typeof DatagridDetailRegisterer, typeof WrappedCell, typeof WrappedColumn, typeof WrappedRow, typeof DatagridCellRenderer, typeof DatagridHeaderRenderer, typeof DatagridMainRenderer, typeof DatagridRowDetailRenderer, typeof DatagridRowRenderer, typeof ActionableOompaLoompa, typeof DatagridWillyWonka, typeof ExpandableOompaLoompa, typeof DatagridNumericFilter, typeof DatagridStringFilter, typeof ClrDatagridSingleSelectionValueAccessor, typeof i39.ClrIfExpanded]>;
2208
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ClrDatagridModule, [typeof ClrDatagrid, typeof ClrDatagridActionBar, typeof ClrDatagridActionOverflow, typeof ClrDatagridCell, typeof ClrDatagridColumn, typeof ClrDatagridColumnAction, typeof ClrDatagridColumnActions, typeof ClrDatagridColumnSeparator, typeof ClrDatagridDetail, typeof ClrDatagridDetailBody, typeof ClrDatagridDetailHeader, typeof ClrDatagridFilter, typeof ClrDatagridFooter, typeof ClrDatagridHideableColumn, typeof ClrDatagridItems, typeof ClrDatagridPageSize, typeof ClrDatagridPagination, typeof ClrDatagridPlaceholder, typeof ClrDatagridRow, typeof ClrDatagridRowDetail, typeof ClrDatagridSelectionCellDirective, typeof ClrDatagridVirtualScrollDirective, typeof ClrIfDetail, typeof DatagridDetailRegisterer, typeof WrappedCell, typeof WrappedColumn, typeof WrappedRow, typeof DatagridCellRenderer, typeof DatagridHeaderRenderer, typeof DatagridMainRenderer, typeof DatagridRowDetailRenderer, typeof DatagridRowRenderer, typeof ActionableOompaLoompa, typeof DatagridWillyWonka, typeof ExpandableOompaLoompa, typeof DatagridNumericFilter, typeof DatagridStringFilter, typeof ClrDatagridColumnToggle, typeof ClrDatagridColumnToggleButton], [typeof i40.CommonModule, typeof i41.CdkDragModule, typeof i41.CdkTrapFocusModule, typeof i42.ClrIcon, typeof i43.ClrInputModule, typeof i44.ClrRadioModule, typeof i45.ClrCheckboxModule, typeof i46.ClrNumberInputModule, typeof i47.ClrSelectModule, typeof i48.FormsModule, typeof i41.ClrLoadingModule, typeof i41.ClrConditionalModule, typeof i41.ClrOutsideClickModule, typeof i41.ClrExpandableAnimationModule, typeof i49.ClrSpinnerModule, typeof i1.ClrPopoverModuleNext, typeof i51.ClrDropdownModule, typeof i41.ClrKeyFocusModule, typeof ClrDatagridSingleSelectionValueAccessor, typeof i41.ClrIfExpanded], [typeof ClrDatagrid, typeof ClrDatagridActionBar, typeof ClrDatagridActionOverflow, typeof ClrDatagridCell, typeof ClrDatagridColumn, typeof ClrDatagridColumnAction, typeof ClrDatagridColumnActions, typeof ClrDatagridColumnSeparator, typeof ClrDatagridDetail, typeof ClrDatagridDetailBody, typeof ClrDatagridDetailHeader, typeof ClrDatagridFilter, typeof ClrDatagridFooter, typeof ClrDatagridHideableColumn, typeof ClrDatagridItems, typeof ClrDatagridPageSize, typeof ClrDatagridPagination, typeof ClrDatagridPlaceholder, typeof ClrDatagridRow, typeof ClrDatagridRowDetail, typeof ClrDatagridSelectionCellDirective, typeof ClrDatagridVirtualScrollDirective, typeof ClrIfDetail, typeof DatagridDetailRegisterer, typeof WrappedCell, typeof WrappedColumn, typeof WrappedRow, typeof DatagridCellRenderer, typeof DatagridHeaderRenderer, typeof DatagridMainRenderer, typeof DatagridRowDetailRenderer, typeof DatagridRowRenderer, typeof ActionableOompaLoompa, typeof DatagridWillyWonka, typeof ExpandableOompaLoompa, typeof DatagridNumericFilter, typeof DatagridStringFilter, typeof ClrDatagridSingleSelectionValueAccessor, typeof i41.ClrIfExpanded]>;
1839
2209
  static ɵinj: i0.ɵɵInjectorDeclaration<ClrDatagridModule>;
1840
2210
  }
1841
2211
 
1842
- export { ActionableOompaLoompa, CLR_DATAGRID_DIRECTIVES, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridAriaSortOrder, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSelectionCellDirective, ClrDatagridSingleSelectionValueAccessor, ClrDatagridSortOrder, ClrDatagridVirtualScrollDirective, ClrIfDetail, DatagridCellRenderer, DatagridDetailRegisterer, DatagridHeaderRenderer, DatagridMainRenderer, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridRowDetailRenderer, DatagridRowRenderer, DatagridStringFilter, DatagridWillyWonka, ExpandableOompaLoompa, Selection, SelectionType, WrappedCell, WrappedColumn, WrappedRow, selectionTypeAttribute };
2212
+ export { ActionableOompaLoompa, CLR_DATAGRID_DIRECTIVES, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridAriaSortOrder, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnAction, ClrDatagridColumnActions, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSelectionCellDirective, ClrDatagridSingleSelectionValueAccessor, ClrDatagridSortOrder, ClrDatagridVirtualScrollDirective, ClrIfDetail, DatagridCellRenderer, DatagridDetailRegisterer, DatagridHeaderRenderer, DatagridMainRenderer, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridRowDetailRenderer, DatagridRowRenderer, DatagridStringFilter, DatagridWillyWonka, ExpandableOompaLoompa, Selection, SelectionType, WrappedCell, WrappedColumn, WrappedRow, selectionTypeAttribute };
1843
2213
  export type { ClrDatagridComparatorInterface, ClrDatagridFilterInterface, ClrDatagridItemsIdentityFunction, ClrDatagridNumericFilterInterface, ClrDatagridStateInterface, ClrDatagridStringFilterInterface, ClrDatagridVirtualScrollRangeInterface };