@koobiq/components 20.0.0 → 20.1.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 (192) hide show
  1. package/accordion/accordion-trigger.component.scss +0 -18
  2. package/accordion/accordion.component.scss +9 -2
  3. package/actions-panel/index.d.ts +1 -0
  4. package/alert/_alert-theme.scss +0 -4
  5. package/alert/alert-tokens.scss +4 -4
  6. package/app-switcher/app-switcher-dropdown-app.scss +2 -0
  7. package/breadcrumbs/breadcrumbs.scss +4 -0
  8. package/breadcrumbs/index.d.ts +2 -1
  9. package/button/button-group.scss +42 -2
  10. package/button-toggle/button-toggle.scss +23 -0
  11. package/button-toggle/index.d.ts +3 -1
  12. package/checkbox/checkbox.scss +5 -4
  13. package/clamped-text/index.d.ts +1 -0
  14. package/core/index.d.ts +402 -13
  15. package/core/styles/common/_animation.scss +4 -0
  16. package/core/styles/theming/_components-theming.scss +1 -1
  17. package/core/styles/theming/_scrollbar-theme.scss +4 -0
  18. package/datepicker/_datepicker-theme.scss +1 -1
  19. package/datepicker/datepicker-toggle.scss +3 -3
  20. package/dl/index.d.ts +1 -0
  21. package/dropdown/dropdown.scss +2 -2
  22. package/fesm2022/koobiq-components-accordion.mjs +4 -4
  23. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  24. package/fesm2022/koobiq-components-actions-panel.mjs +14 -5
  25. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  26. package/fesm2022/koobiq-components-alert.mjs +2 -2
  27. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  28. package/fesm2022/koobiq-components-app-switcher.mjs +6 -6
  29. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  30. package/fesm2022/koobiq-components-breadcrumbs.mjs +6 -4
  31. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  32. package/fesm2022/koobiq-components-button-toggle.mjs +9 -6
  33. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  34. package/fesm2022/koobiq-components-button.mjs +4 -4
  35. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-checkbox.mjs +2 -2
  37. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-clamped-text.mjs +4 -0
  39. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  40. package/fesm2022/koobiq-components-code-block.mjs +4 -0
  41. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-core.mjs +449 -112
  43. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  44. package/fesm2022/koobiq-components-datepicker.mjs +5 -5
  45. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-dl.mjs +3 -2
  47. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  48. package/fesm2022/koobiq-components-dropdown.mjs +8 -13
  49. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-file-upload.mjs +33 -22
  51. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-filter-bar.mjs +974 -758
  53. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-flag.mjs +66 -0
  55. package/fesm2022/koobiq-components-flag.mjs.map +1 -0
  56. package/fesm2022/koobiq-components-form-field.mjs +2 -2
  57. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-icon.mjs +2 -2
  59. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-inline-edit.mjs +27 -6
  61. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  62. package/fesm2022/koobiq-components-list.mjs +39 -20
  63. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-loader-overlay.mjs +2 -2
  65. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  66. package/fesm2022/koobiq-components-modal.mjs +9 -5
  67. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-navbar.mjs +10 -9
  69. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-notification-center.mjs +178 -19
  71. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-overflow-items.mjs +12 -4
  73. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-popover.mjs +4 -4
  75. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-progress-bar.mjs +2 -2
  77. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-progress-spinner.mjs +2 -2
  79. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-radio.mjs +3 -7
  81. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-select.mjs +38 -16
  83. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-sidebar.mjs +4 -0
  85. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-sidepanel.mjs +3 -3
  87. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-skeleton.mjs +2 -2
  89. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-split-button.mjs +2 -2
  91. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-splitter.mjs +6 -2
  93. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-table.mjs +8 -6
  95. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-tabs.mjs +19 -7
  97. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-tags.mjs +7 -0
  99. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-textarea.mjs +7 -14
  101. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-time-range.mjs +4 -4
  103. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  104. package/fesm2022/koobiq-components-timezone.mjs +6 -0
  105. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  106. package/fesm2022/koobiq-components-title.mjs +132 -14
  107. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  108. package/fesm2022/koobiq-components-toast.mjs +1 -1
  109. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-toggle.mjs +2 -2
  111. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-tooltip.mjs +50 -2
  113. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-tree-select.mjs +44 -11
  115. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  116. package/fesm2022/koobiq-components-tree.mjs +67 -41
  117. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-username.mjs +16 -3
  119. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  120. package/file-upload/file-upload-tokens.scss +1 -0
  121. package/file-upload/index.d.ts +10 -7
  122. package/filter-bar/_filter-bar-theme.scss +86 -0
  123. package/filter-bar/filter-bar-tokens.scss +6 -0
  124. package/filter-bar/filter-bar.scss +10 -4
  125. package/filter-bar/filter-refresher.scss +1 -1
  126. package/filter-bar/filters.scss +23 -19
  127. package/filter-bar/index.d.ts +707 -338
  128. package/filter-bar/pipes/base-pipe.scss +14 -35
  129. package/filter-bar/pipes/pipe-date.scss +20 -14
  130. package/filter-bar/pipes/pipe-multi-tree-select.scss +5 -3
  131. package/filter-bar/pipes/pipe-multiselect.scss +5 -3
  132. package/filter-bar/pipes/pipe-readonly.scss +4 -13
  133. package/filter-bar/pipes/pipe-select.scss +3 -1
  134. package/filter-bar/pipes/pipe-tree-select.scss +3 -1
  135. package/flag/flag.scss +53 -0
  136. package/flag/index.d.ts +44 -0
  137. package/icon/icon-item-tokens.scss +1 -1
  138. package/inline-edit/index.d.ts +5 -0
  139. package/inline-edit/inline-edit.scss +7 -7
  140. package/link/link-tokens.scss +2 -2
  141. package/list/index.d.ts +11 -2
  142. package/loader-overlay/loader-overlay-tokens.scss +1 -1
  143. package/modal/_modal-animation.scss +6 -6
  144. package/modal/_modal-theme.scss +5 -0
  145. package/modal/index.d.ts +3 -1
  146. package/modal/modal.scss +15 -0
  147. package/navbar/index.d.ts +1 -0
  148. package/navbar/navbar-item.scss +9 -0
  149. package/notification-center/_notification-center-theme.scss +2 -1
  150. package/notification-center/index.d.ts +88 -3
  151. package/notification-center/notification-center.scss +42 -4
  152. package/notification-center/notification-item.scss +3 -2
  153. package/overflow-items/index.d.ts +1 -0
  154. package/package.json +7 -3
  155. package/prebuilt-themes/dark-theme.css +1 -1
  156. package/prebuilt-themes/light-theme.css +1 -1
  157. package/prebuilt-themes/theme.css +1 -1
  158. package/progress-bar/progress-bar.scss +4 -0
  159. package/progress-spinner/progress-spinner.scss +5 -1
  160. package/radio/index.d.ts +1 -5
  161. package/radio/radio.scss +18 -4
  162. package/schematics/collection.json +5 -0
  163. package/schematics/migrations/filter-bar-signals/README.md +66 -0
  164. package/schematics/migrations/filter-bar-signals/data.js +72 -0
  165. package/schematics/migrations/filter-bar-signals/index.js +316 -0
  166. package/schematics/migrations/filter-bar-signals/schema.json +20 -0
  167. package/schematics/migrations.json +5 -0
  168. package/schematics/ng-add/index.js +1 -1
  169. package/select/index.d.ts +10 -2
  170. package/sidebar/index.d.ts +1 -0
  171. package/skeleton/skeleton.scss +4 -0
  172. package/split-button/_split-button-theme.scss +2 -2
  173. package/splitter/_splitter-theme.scss +2 -2
  174. package/splitter/index.d.ts +1 -0
  175. package/table/_table-theme.scss +4 -0
  176. package/table/index.d.ts +3 -2
  177. package/tabs/index.d.ts +2 -0
  178. package/tabs/tab-header.scss +1 -0
  179. package/tabs/tabs-tokens.scss +1 -1
  180. package/textarea/index.d.ts +0 -1
  181. package/time-range/time-range.scss +0 -8
  182. package/timepicker/timepicker.scss +2 -2
  183. package/timezone/index.d.ts +1 -0
  184. package/title/index.d.ts +92 -2
  185. package/tooltip/index.d.ts +51 -3
  186. package/tree/_tree-theme.scss +2 -7
  187. package/tree/index.d.ts +19 -4
  188. package/tree/toggle.scss +5 -0
  189. package/tree/tree-option.scss +0 -4
  190. package/tree-select/_tree-select-theme.scss +1 -1
  191. package/tree-select/index.d.ts +9 -2
  192. package/username/index.d.ts +20 -2
@@ -1,20 +1,118 @@
1
- import * as i0 from '@angular/core';
2
- import { TemplateRef, InjectionToken, Provider, OnInit, ElementRef, DestroyRef, ChangeDetectorRef, EventEmitter, AfterContentInit, AfterViewInit, OnDestroy } from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
+ import { AfterViewInit, ChangeDetectorRef, DestroyRef, ElementRef, TemplateRef, InjectionToken, ModelSignal, Signal, OutputEmitterRef, Type, Provider, OnInit, AfterContentInit } from '@angular/core';
3
3
  import * as _koobiq_components_core from '@koobiq/components/core';
4
- import { PopUpPlacements, KbqComponentColors, PopUpSizes, KbqOption, KbqPseudoCheckboxState } from '@koobiq/components/core';
5
- import { Observable, BehaviorSubject, Subject } from 'rxjs';
4
+ import { PopUpPlacements, KbqComponentColors, PopUpSizes, KbqOption, DateAdapter, DateFormatter, KbqPseudoCheckboxState } from '@koobiq/components/core';
5
+ import { Subject, BehaviorSubject, Observable } from 'rxjs';
6
6
  import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';
7
- import { UntypedFormControl, FormControl, FormGroup } from '@angular/forms';
7
+ import { FormControl, FormGroup } from '@angular/forms';
8
8
  import { KbqButtonStyles, KbqButton } from '@koobiq/components/button';
9
9
  import { KbqDropdownTrigger } from '@koobiq/components/dropdown';
10
10
  import { KbqPopoverTrigger } from '@koobiq/components/popover';
11
11
  import { KbqSelect } from '@koobiq/components/select';
12
- import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
13
12
  import { KbqListSelection } from '@koobiq/components/list';
14
- import { FlatTreeControl, KbqTreeFlattener, KbqTreeFlatDataSource, KbqTreeOption } from '@koobiq/components/tree';
13
+ import { FlatTreeControl, KbqTreeFlattener, KbqTreeFlatDataSource, KbqTreeSelection, KbqTreeOption } from '@koobiq/components/tree';
15
14
  import { KbqTreeSelect } from '@koobiq/components/tree-select';
16
15
 
17
- /**default configuration of filter-bar */
16
+ /** Injection Token for providing configuration of filter-bar */
17
+ declare const KBQ_PIPE_DATA: InjectionToken<unknown>;
18
+ /** function to get unique identifier of an element */
19
+ declare function getId(item: KbqPipeTemplate): KbqPipeType | string | number;
20
+ declare abstract class KbqBasePipe<V> implements AfterViewInit {
21
+ /** changes of state */
22
+ readonly stateChanges: Subject<void>;
23
+ /** pipe data. Provided from subclass */
24
+ readonly data: KbqPipeData<V>;
25
+ /** KbqFilterBar instance
26
+ * @docs-private */
27
+ protected readonly filterBar: KbqFilterBarHost | null;
28
+ /** @docs-private */
29
+ protected readonly changeDetectorRef: ChangeDetectorRef;
30
+ /** @docs-private */
31
+ protected readonly destroyRef: DestroyRef;
32
+ /** @docs-private */
33
+ protected readonly focusMonitor: FocusMonitor;
34
+ /** @docs-private */
35
+ protected readonly elementRef: ElementRef<HTMLElement>;
36
+ private readonly inputModalityDetector;
37
+ private readonly document;
38
+ /** Last known focus origin within the pipe. Used to preserve the keyboard focus ring on restore. */
39
+ private focusOrigin;
40
+ /**
41
+ * Whether this pipe has been destroyed. Guards deferred (`setTimeout`) work that could otherwise
42
+ * read view queries or mutate `data` after the pipe was removed or the filter switched.
43
+ * @docs-private
44
+ */
45
+ protected destroyed: boolean;
46
+ /** values to select from the pipe template */
47
+ protected values: any;
48
+ /** TemplateRef for selecting an option */
49
+ protected valueTemplate?: TemplateRef<any> | string;
50
+ /**
51
+ * Whether the current platform is a Mac.
52
+ *
53
+ * @docs-private
54
+ */
55
+ isMac: boolean;
56
+ /** Data for the pipe.
57
+ * @docs-private */
58
+ $implicit: unknown;
59
+ /** Whether the current pipe is empty. Used for apply style modifier */
60
+ get isEmpty(): boolean;
61
+ /** Whether the current pipe is removable or cleanable. Used for apply style modifier */
62
+ get showRemoveButton(): boolean;
63
+ /** localized data
64
+ * @docs-private */
65
+ get localeData(): KbqFilterBarConfiguration;
66
+ constructor();
67
+ ngAfterViewInit(): void;
68
+ /** templateRef checker utility */
69
+ isTemplateRef(value: unknown): boolean;
70
+ /** updates values for selection and value template */
71
+ updateTemplates: (templates: KbqPipeTemplate[] | null) => void;
72
+ /** removes pipe from filter-bar and triggers changes */
73
+ onRemove(): void;
74
+ /** clears the pipe and triggers changes */
75
+ onClear(): void;
76
+ /**
77
+ * Restores focus to the pipe's trigger button after a value is chosen or the panel closes.
78
+ * Focuses via {@link FocusMonitor} with the captured origin so a keyboard-driven interaction
79
+ * keeps its focus ring, while a mouse-driven one does not.
80
+ *
81
+ * @docs-private
82
+ */
83
+ protected restoreTriggerFocus(): void;
84
+ /** @docs-private */
85
+ abstract open(): void;
86
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqBasePipe<any>, never>;
87
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqBasePipe<any>, never, never, {}, {}, never, never, true, never>;
88
+ }
89
+ declare class KbqPipeMinWidth {
90
+ /** KbqFilterBar instance */
91
+ protected readonly filterBar: KbqFilterBarHost | null;
92
+ /** @docs-private */
93
+ protected readonly elementRef: ElementRef<HTMLElement>;
94
+ /** @docs-private */
95
+ protected readonly changeDetectorRef: ChangeDetectorRef;
96
+ /** @docs-private */
97
+ protected minWidth: string;
98
+ /** maximal symbols for apply fit-content to min-width */
99
+ maxSymbolsForFitContent: number;
100
+ /** current length of text */
101
+ get textLength(): number;
102
+ constructor();
103
+ update: () => void;
104
+ /** Schedules a deferred min-width recompute and returns the effect-cleanup that cancels it. */
105
+ private scheduleMinWidthUpdate;
106
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeMinWidth, never>;
107
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqPipeMinWidth, "[kbqPipeMinWidth]", never, {}, {}, never, never, true, never>;
108
+ }
109
+
110
+ /**
111
+ * Default localized strings for the filter-bar, used when no `KBQ_LOCALE_SERVICE` (nor an explicit
112
+ * `KBQ_FILTER_BAR_CONFIGURATION`) is provided. These are the Russian (`ru-RU`) strings, matching the
113
+ * library-wide default-locale convention (every `KBQ_*_DEFAULT_CONFIGURATION` resolves to `ruRULocaleData`).
114
+ * Provide `KBQ_LOCALE_SERVICE` at the application root to localize the filter-bar for other locales.
115
+ */
18
116
  declare const KBQ_FILTER_BAR_DEFAULT_CONFIGURATION: {
19
117
  reset: {
20
118
  buttonName: string;
@@ -39,9 +137,15 @@ declare const KBQ_FILTER_BAR_DEFAULT_CONFIGURATION: {
39
137
  errorHint: string;
40
138
  saveButton: string;
41
139
  cancelButton: string;
140
+ actionsTooltip: string;
42
141
  };
43
142
  add: {
44
143
  tooltip: string;
144
+ addedAnnouncement: string;
145
+ };
146
+ refresher: {
147
+ refresh: string;
148
+ settings: string;
45
149
  };
46
150
  pipe: {
47
151
  clearButtonTooltip: string;
@@ -58,10 +162,110 @@ declare const KBQ_FILTER_BAR_DEFAULT_CONFIGURATION: {
58
162
  backToPeriodSelection: string;
59
163
  };
60
164
  };
165
+ /** Shape of the localized strings consumed by the filter-bar and its pipes. */
166
+ type KbqFilterBarConfiguration = typeof KBQ_FILTER_BAR_DEFAULT_CONFIGURATION;
61
167
  /** Injection Token for providing configuration of filter-bar */
62
- declare const KBQ_FILTER_BAR_CONFIGURATION: InjectionToken<unknown>;
168
+ declare const KBQ_FILTER_BAR_CONFIGURATION: InjectionToken<{
169
+ reset: {
170
+ buttonName: string;
171
+ };
172
+ search: {
173
+ tooltip: string;
174
+ placeholder: string;
175
+ };
176
+ filters: {
177
+ defaultName: string;
178
+ saveNewFilterTooltip: string;
179
+ searchPlaceholder: string;
180
+ searchEmptyResult: string;
181
+ saveAsNewFilter: string;
182
+ saveChanges: string;
183
+ saveAsNew: string;
184
+ change: string;
185
+ resetChanges: string;
186
+ remove: string;
187
+ name: string;
188
+ error: string;
189
+ errorHint: string;
190
+ saveButton: string;
191
+ cancelButton: string;
192
+ actionsTooltip: string;
193
+ };
194
+ add: {
195
+ tooltip: string;
196
+ addedAnnouncement: string;
197
+ };
198
+ refresher: {
199
+ refresh: string;
200
+ settings: string;
201
+ };
202
+ pipe: {
203
+ clearButtonTooltip: string;
204
+ removeButtonTooltip: string;
205
+ applyButton: string;
206
+ emptySearchResult: string;
207
+ selectAll: string;
208
+ };
209
+ datePipe: {
210
+ customPeriod: string;
211
+ customPeriodFrom: string;
212
+ customPeriodTo: string;
213
+ customPeriodErrorHint: string;
214
+ backToPeriodSelection: string;
215
+ };
216
+ }>;
217
+ /**
218
+ * Contract a pipe (or filter-bar sub-component) depends on instead of the concrete `KbqFilterBar`.
219
+ * `KbqFilterBar` provides itself as {@link KBQ_FILTER_BAR_HOST}, so a pipe can be unit-tested against a
220
+ * lightweight mock of this seam rather than a full bar. Members mirror the current `KbqFilterBar` surface;
221
+ * they are expected to slim down once the state model moves to signals.
222
+ */
223
+ interface KbqFilterBarHost {
224
+ /** Localized strings and configuration for the filter-bar and its pipes. */
225
+ configuration: KbqFilterBarConfiguration;
226
+ /** Currently selected filter. A two-way-bindable `model()`: read via `filter()`, write via `filter.set()`. */
227
+ readonly filter: ModelSignal<KbqFilter | null>;
228
+ /** Templates used when adding a pipe (also hold the option lists). Read via `pipeTemplates()`. */
229
+ readonly pipeTemplates: Signal<KbqPipeTemplate[]>;
230
+ /** Whether selecting all options counts as selecting nothing. */
231
+ readonly selectedAllEqualsSelectedNothing: Signal<boolean>;
232
+ /** Whether the current filter is saved. */
233
+ readonly isSaved: Signal<boolean>;
234
+ /** Whether the current filter is changed. */
235
+ readonly isChanged: Signal<boolean>;
236
+ /** Whether the current filter is both saved and changed. */
237
+ readonly isSavedAndChanged: Signal<boolean>;
238
+ /** Whether the current filter is readonly. */
239
+ readonly isReadOnly: Signal<boolean>;
240
+ /**
241
+ * Emits whenever a pipe value changes.
242
+ * (The two-way-bound `filter` value is emitted by the `filter` model's `filterChange` output.)
243
+ */
244
+ readonly onChangePipe: OutputEmitterRef<KbqPipe>;
245
+ /** Emits whenever a pipe is cleared. */
246
+ readonly onClearPipe: OutputEmitterRef<KbqPipe>;
247
+ /** Emits whenever a select/multiselect pipe closes. */
248
+ readonly onClosePipe: OutputEmitterRef<KbqPipe>;
249
+ /** Internal filter changes. */
250
+ readonly internalFilterChanges: BehaviorSubject<KbqFilter | null>;
251
+ /** Internal pipe-template changes. */
252
+ readonly internalTemplatesChanges: BehaviorSubject<KbqPipeTemplate[] | null>;
253
+ /** Requests opening a pipe after it is added. */
254
+ readonly openPipe: BehaviorSubject<string | number | null>;
255
+ /** Emits when the filter is reset. */
256
+ readonly onResetFilter: BehaviorSubject<boolean>;
257
+ /** Removes a pipe from the current filter and emits the change. */
258
+ removePipe(pipe: KbqPipe): void;
259
+ /** Clears the current filter's "changed" flag. */
260
+ resetFilterChangedState(): void;
261
+ }
262
+ /**
263
+ * Injection token exposing the {@link KbqFilterBarHost} seam. `KbqFilterBar` provides itself via
264
+ * `useExisting`, so pipes `inject(KBQ_FILTER_BAR_HOST)` instead of depending on the concrete bar.
265
+ */
266
+ declare const KBQ_FILTER_BAR_HOST: InjectionToken<KbqFilterBarHost>;
63
267
  /** Injection Token for providing pipes in filter-bar */
64
- declare const KBQ_FILTER_BAR_PIPES: InjectionToken<any>;
268
+ declare const KBQ_FILTER_BAR_PIPES: InjectionToken<Map<KbqPipeType, Type<KbqBasePipe<unknown>>>>;
65
269
  /** Utility provider for `KBQ_FILTER_BAR_PIPES`. */
66
270
  declare const kbqFilterBarPipesProvider: () => Provider;
67
271
  /** list of pipe types available out of the box */
@@ -75,9 +279,9 @@ declare enum KbqPipeTypes {
75
279
  Date = "date",
76
280
  Datetime = "datetime"
77
281
  }
78
- type KbqPipeType = `${KbqPipeTypes}` | string;
282
+ type KbqPipeType = `${KbqPipeTypes}` | (string & {});
79
283
  /** list of pipes available out of the box. */
80
- declare const defaultFilterBarPipes: [string, unknown][];
284
+ declare const defaultFilterBarPipes: [KbqPipeType, Type<KbqBasePipe<unknown>>][];
81
285
  interface KbqDateTimeValue {
82
286
  name?: string;
83
287
  start?: string;
@@ -86,6 +290,8 @@ interface KbqDateTimeValue {
86
290
  interface KbqSelectValue {
87
291
  name: string;
88
292
  value: unknown;
293
+ /** Optional stable identifier used by the select/multi-select pipe comparators. */
294
+ id?: string | number;
89
295
  }
90
296
  interface KbqFilter {
91
297
  name: string;
@@ -154,19 +360,92 @@ interface KbqTreeSelectNode {
154
360
  * Build the file structure tree. The `value` is the Json object, or a sub-tree of a Json object.
155
361
  * The return value is the list of extends `KbqTreeSelectNode`.
156
362
  */
157
- declare function kbqBuildTree<T extends KbqTreeSelectNode>(value: any, level: number): T[];
363
+ declare function kbqBuildTree<T extends KbqTreeSelectNode>(value: Record<string, unknown>, level: number): T[];
158
364
 
159
365
  declare class KbqFilterReset {
160
- /** KbqFilterBar instance */
366
+ /** KbqFilterBar host seam */
161
367
  private readonly filterBar;
162
368
  /** Event that is generated whenever the user reset a filter. */
163
- readonly onResetFilter: i0.OutputEmitterRef<KbqFilter | null>;
369
+ readonly onResetFilter: _angular_core.OutputEmitterRef<KbqFilter | null>;
164
370
  /** localized data
165
371
  * @docs-private */
166
- get localeData(): any;
372
+ get localeData(): string;
167
373
  protected resetFilter(): void;
168
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqFilterReset, never>;
169
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqFilterReset, "kbq-filter-reset", never, {}, { "onResetFilter": "onResetFilter"; }, never, ["*"], true, never>;
374
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilterReset, never>;
375
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqFilterReset, "kbq-filter-reset", never, {}, { "onResetFilter": "onResetFilter"; }, never, ["*"], true, never>;
376
+ }
377
+
378
+ /**
379
+ * The "save / rename filter" popover, extracted from `KbqFilters` (SRP). Owns the save form state, the
380
+ * name control, validation/error display and the save/rename flow. It declares the popover's header,
381
+ * content and footer templates and pushes them imperatively onto the trigger it is given (via the
382
+ * `popoverTrigger` input), so there is no cross-component template binding on the parent (which would
383
+ * otherwise risk `ExpressionChangedAfterItHasBeenCheckedError`). `KbqFilters` keeps the trigger (on its
384
+ * main button), focus management and the public `filterSavedSuccessfully`/`filterSavedUnsuccessfully` API,
385
+ * delegating to this component.
386
+ *
387
+ * @docs-private
388
+ */
389
+ declare class KbqFilterSavePopover implements AfterViewInit {
390
+ private readonly changeDetectorRef;
391
+ /** Popover trigger owned by the parent (`KbqFilters` main button). */
392
+ readonly popoverTrigger: _angular_core.InputSignal<KbqPopoverTrigger>;
393
+ /** Filter bar, used for the save payload, the current filter and localized strings. */
394
+ readonly filterBar: _angular_core.InputSignal<KbqFilterBar>;
395
+ /** Emits when the user saves/renames a filter. */
396
+ readonly save: _angular_core.OutputEmitterRef<KbqSaveFilterEvent>;
397
+ /** Emits when the popover closes; the boolean requests focus restoration by the parent. */
398
+ readonly closed: _angular_core.OutputEmitterRef<boolean>;
399
+ /** @docs-private */
400
+ readonly headerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
401
+ /** @docs-private */
402
+ readonly contentTemplate: _angular_core.Signal<TemplateRef<unknown>>;
403
+ /** @docs-private */
404
+ readonly footerTemplate: _angular_core.Signal<TemplateRef<unknown>>;
405
+ private readonly newFilterName;
406
+ private readonly saveFilterButton;
407
+ /** new filter name for saving */
408
+ filterName: FormControl<string | null>;
409
+ /** true if saving a new filter, false if saving changes in filter */
410
+ saveNewFilter: boolean;
411
+ showFilterSavingError: boolean;
412
+ filterSavingErrorText: string;
413
+ isSaving: boolean;
414
+ /** localized data
415
+ * @docs-private */
416
+ get localeData(): {
417
+ defaultName: string;
418
+ saveNewFilterTooltip: string;
419
+ searchPlaceholder: string;
420
+ searchEmptyResult: string;
421
+ saveAsNewFilter: string;
422
+ saveChanges: string;
423
+ saveAsNew: string;
424
+ change: string;
425
+ resetChanges: string;
426
+ remove: string;
427
+ name: string;
428
+ error: string;
429
+ errorHint: string;
430
+ saveButton: string;
431
+ cancelButton: string;
432
+ actionsTooltip: string;
433
+ };
434
+ /** header of popover. Depends on the mode */
435
+ get popoverHeader(): string;
436
+ ngAfterViewInit(): void;
437
+ openSaveAsNewFilterPopover(): void;
438
+ openChangeFilterNamePopover(): void;
439
+ saveAsNew(event?: Event): void;
440
+ showError(error?: KbqSaveFilterError): void;
441
+ close: (restoreFocus?: boolean) => void;
442
+ /** Hide the popover on a successful save. Focus restoration is handled by the parent. */
443
+ savedSuccessfully(): void;
444
+ /** Release the saving state after a failed save (the error itself is shown by the host via `showError`). */
445
+ savedUnsuccessfully(): void;
446
+ private preparePopover;
447
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilterSavePopover, never>;
448
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqFilterSavePopover, "kbq-filter-save-popover", never, { "popoverTrigger": { "alias": "popoverTrigger"; "required": true; "isSignal": true; }; "filterBar": { "alias": "filterBar"; "required": true; "isSignal": true; }; }, { "save": "save"; "closed": "closed"; }, never, never, true, never>;
170
449
  }
171
450
 
172
451
  declare class KbqFilters implements OnInit {
@@ -187,79 +466,89 @@ declare class KbqFilters implements OnInit {
187
466
  /** @docs-private */
188
467
  private readonly changeDetectorRef;
189
468
  /** @docs-private */
190
- protected readonly mainButton: i0.Signal<KbqButton>;
469
+ protected readonly mainButton: _angular_core.Signal<KbqButton>;
470
+ /** @docs-private */
471
+ protected readonly saveNewFilterButton: _angular_core.Signal<KbqButton>;
191
472
  /** @docs-private */
192
- protected readonly saveNewFilterButton: i0.Signal<KbqButton>;
473
+ protected readonly filterActionsButton: _angular_core.Signal<KbqButton>;
193
474
  /** @docs-private */
194
- protected readonly filterActionsButton: i0.Signal<KbqButton>;
475
+ protected readonly popover: _angular_core.Signal<KbqPopoverTrigger>;
195
476
  /** @docs-private */
196
- protected readonly popover: i0.Signal<KbqPopoverTrigger>;
477
+ protected readonly dropdown: _angular_core.Signal<KbqDropdownTrigger>;
197
478
  /** @docs-private */
198
- protected readonly dropdown: i0.Signal<KbqDropdownTrigger>;
479
+ protected readonly filterActionsDropdown: _angular_core.Signal<KbqDropdownTrigger | undefined>;
199
480
  /** @docs-private */
200
- protected readonly filterActionsDropdown: i0.Signal<KbqDropdownTrigger | undefined>;
481
+ protected readonly savePopover: _angular_core.Signal<KbqFilterSavePopover>;
201
482
  private readonly search;
202
- private readonly newFilterName;
203
- private readonly saveFilterButton;
204
483
  /** control for search filter */
205
- searchControl: UntypedFormControl;
484
+ readonly searchControl: FormControl<string | null>;
206
485
  /** filtered by search filters */
207
486
  filteredOptions: Observable<KbqFilter[]>;
208
487
  /** @docs-private */
209
- popoverSize: PopUpSizes;
488
+ protected readonly popoverSize = PopUpSizes.Medium;
210
489
  /** @docs-private */
211
- popoverOffset: number;
212
- /** new filter name for saving */
213
- filterName: FormControl<string | null>;
214
- /** true if saving a new filter, false if saving changes in filter */
215
- saveNewFilter: boolean;
216
- showFilterSavingError: boolean;
217
- filterSavingErrorText: string;
218
- isSaving: boolean;
219
- readonly filters: i0.InputSignal<KbqFilter[]>;
490
+ protected readonly popoverOffset: number;
491
+ readonly filters: _angular_core.InputSignal<KbqFilter[]>;
220
492
  /** Event that is generated whenever the user selects a filter. */
221
- readonly onSelectFilter: i0.OutputEmitterRef<KbqFilter>;
222
- /** Event that is generated whenever the user save a filter. */
223
- readonly onSave: i0.OutputEmitterRef<KbqSaveFilterEvent>;
493
+ readonly onSelectFilter: _angular_core.OutputEmitterRef<KbqFilter>;
494
+ /**
495
+ * Event that is generated whenever the user save a filter.
496
+ *
497
+ * The emitted `filter` shares its pipe objects with the live filter by design (so the rendered pipes keep
498
+ * their identity across a save instead of being destroyed and recreated). Consumers that persist
499
+ * `event.filter` as an immutable record should snapshot it first (e.g. via `KbqFilterBar.saveFilterState`
500
+ * or a structural copy) — otherwise later in-place pipe edits will mutate the stored reference.
501
+ */
502
+ readonly onSave: _angular_core.OutputEmitterRef<KbqSaveFilterEvent>;
224
503
  /** Event that is generated whenever the user change a filter. */
225
- readonly onChangeFilter: i0.OutputEmitterRef<KbqSaveFilterEvent>;
504
+ readonly onChangeFilter: _angular_core.OutputEmitterRef<KbqSaveFilterEvent>;
226
505
  /** Event that is generated whenever the user remove a filter. */
227
- readonly onRemoveFilter: i0.OutputEmitterRef<KbqFilter>;
506
+ readonly onRemoveFilter: _angular_core.OutputEmitterRef<KbqFilter>;
228
507
  /** Event that is generated whenever the user reset a filter changes. */
229
- readonly onResetFilterChanges: i0.OutputEmitterRef<KbqFilter | null>;
230
- /** header of popover. Depends on the mode */
231
- get popoverHeader(): string;
508
+ readonly onResetFilterChanges: _angular_core.OutputEmitterRef<KbqFilter | null>;
232
509
  /** Component state. true if opened dropdown or popup */
233
510
  get opened(): boolean;
234
511
  /** Component state. true if opened dropdown or popup of filterActions */
235
512
  get filterActionsOpened(): boolean;
236
- /** Selected filter */
513
+ /** Selected filter. Kept as a plain getter facade over the bar's `filter` model. */
237
514
  get filter(): KbqFilter | null;
238
515
  /** Component state. True if 'filters' input contains no elements. */
239
516
  get isEmpty(): boolean;
240
517
  /** localized data
241
518
  * @docs-private */
242
- get localeData(): any;
519
+ get localeData(): {
520
+ defaultName: string;
521
+ saveNewFilterTooltip: string;
522
+ searchPlaceholder: string;
523
+ searchEmptyResult: string;
524
+ saveAsNewFilter: string;
525
+ saveChanges: string;
526
+ saveAsNew: string;
527
+ change: string;
528
+ resetChanges: string;
529
+ remove: string;
530
+ name: string;
531
+ error: string;
532
+ errorHint: string;
533
+ saveButton: string;
534
+ cancelButton: string;
535
+ actionsTooltip: string;
536
+ };
243
537
  /** Current focus origin state.
244
538
  * @docs-private */
245
539
  get focusOrigin(): FocusOrigin;
246
540
  private _focusOrigin;
247
541
  private focusedElementBeforeOpen;
248
- constructor();
249
542
  ngOnInit(): void;
250
543
  /** @docs-private */
251
544
  focusedElementBeforeIs(button: KbqButton): boolean;
252
545
  selectFilter(filter: KbqFilter): void;
253
546
  saveChanges(): void;
254
- saveAsNew(event?: Event): void;
255
- showError(error?: KbqSaveFilterError): void;
256
547
  restoreFocus(): void;
257
- preparePopover(): void;
258
- openSaveAsNewFilterPopover(): void;
259
- openChangeFilterNamePopover(): void;
260
548
  /** @docs-private */
261
549
  saveFocusedElement(button?: KbqButton): void;
262
- closePopover: (restoreFocus?: boolean) => void;
550
+ /** Restore focus when the save popover reports it closed. @docs-private */
551
+ onSavePopoverClosed(restoreFocus: boolean): void;
263
552
  /** @docs-private */
264
553
  stopEventPropagation(event: Event): void;
265
554
  /** @docs-private */
@@ -273,64 +562,140 @@ declare class KbqFilters implements OnInit {
273
562
  filterSavedSuccessfully(): void;
274
563
  /** Shows an error. Use this method in the onSave or onChangeFilter events if saving data failed. */
275
564
  filterSavedUnsuccessfully(error?: KbqSaveFilterError): void;
565
+ /** @docs-private */
566
+ get filterName(): FormControl<string | null>;
567
+ /** @docs-private */
568
+ get saveNewFilter(): boolean;
569
+ /** @docs-private */
570
+ set saveNewFilter(value: boolean);
571
+ /** @docs-private */
572
+ get isSaving(): boolean;
573
+ /** @docs-private */
574
+ set isSaving(value: boolean);
575
+ /** @docs-private */
576
+ get showFilterSavingError(): boolean;
577
+ /** @docs-private */
578
+ set showFilterSavingError(value: boolean);
579
+ /** @docs-private */
580
+ get filterSavingErrorText(): string;
581
+ /** header of popover. Depends on the mode
582
+ * @docs-private */
583
+ get popoverHeader(): string;
584
+ /** @docs-private */
585
+ openSaveAsNewFilterPopover(): void;
586
+ /** @docs-private */
587
+ openChangeFilterNamePopover(): void;
588
+ /** @docs-private */
589
+ saveAsNew(event?: Event): void;
590
+ /** @docs-private */
591
+ showError(error?: KbqSaveFilterError): void;
592
+ /** @docs-private */
593
+ closePopover(restoreFocus?: boolean): void;
276
594
  private getFilteredOptions;
277
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqFilters, never>;
278
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqFilters, "kbq-filters", ["kbqFilters"], { "filters": { "alias": "filters"; "required": false; "isSignal": true; }; }, { "onSelectFilter": "onSelectFilter"; "onSave": "onSave"; "onChangeFilter": "onChangeFilter"; "onRemoveFilter": "onRemoveFilter"; "onResetFilterChanges": "onResetFilterChanges"; }, never, ["*"], true, never>;
595
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilters, never>;
596
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqFilters, "kbq-filters", ["kbqFilters"], { "filters": { "alias": "filters"; "required": true; "isSignal": true; }; }, { "onSelectFilter": "onSelectFilter"; "onSave": "onSave"; "onChangeFilter": "onChangeFilter"; "onRemoveFilter": "onRemoveFilter"; "onResetFilterChanges": "onResetFilterChanges"; }, never, ["*"], true, never>;
279
597
  }
280
598
 
281
- declare class KbqFilterBar {
599
+ declare class KbqFilterBar implements KbqFilterBarHost {
282
600
  /** @docs-private */
283
601
  protected readonly changeDetectorRef: ChangeDetectorRef;
284
602
  /** @docs-private */
285
603
  protected readonly localeService: _koobiq_components_core.KbqLocaleService | null;
286
- readonly externalConfiguration: unknown;
287
- configuration: any;
288
- /** @docs-private */
289
- readonly filters: i0.Signal<KbqFilters | undefined>;
290
- /** @docs-private */
291
- readonly filterReset: i0.Signal<KbqFilterReset | undefined>;
604
+ readonly externalConfiguration: {
605
+ reset: {
606
+ buttonName: string;
607
+ };
608
+ search: {
609
+ tooltip: string;
610
+ placeholder: string;
611
+ };
612
+ filters: {
613
+ defaultName: string;
614
+ saveNewFilterTooltip: string;
615
+ searchPlaceholder: string;
616
+ searchEmptyResult: string;
617
+ saveAsNewFilter: string;
618
+ saveChanges: string;
619
+ saveAsNew: string;
620
+ change: string;
621
+ resetChanges: string;
622
+ remove: string;
623
+ name: string;
624
+ error: string;
625
+ errorHint: string;
626
+ saveButton: string;
627
+ cancelButton: string;
628
+ actionsTooltip: string;
629
+ };
630
+ add: {
631
+ tooltip: string;
632
+ addedAnnouncement: string;
633
+ };
634
+ refresher: {
635
+ refresh: string;
636
+ settings: string;
637
+ };
638
+ pipe: {
639
+ clearButtonTooltip: string;
640
+ removeButtonTooltip: string;
641
+ applyButton: string;
642
+ emptySearchResult: string;
643
+ selectAll: string;
644
+ };
645
+ datePipe: {
646
+ customPeriod: string;
647
+ customPeriodFrom: string;
648
+ customPeriodTo: string;
649
+ customPeriodErrorHint: string;
650
+ backToPeriodSelection: string;
651
+ };
652
+ } | null;
653
+ /** Localized strings and configuration for the filter-bar and its pipes. */
654
+ configuration: KbqFilterBarConfiguration;
655
+ /** @docs-private */
656
+ readonly filters: _angular_core.Signal<KbqFilters | undefined>;
657
+ /** @docs-private */
658
+ readonly filterReset: _angular_core.Signal<KbqFilterReset | undefined>;
292
659
  /**
293
660
  * This is special logic that unselect all items when all selected because "all selected = nothing selected".
294
661
  * Default is true
295
662
  * */
296
- readonly selectedAllEqualsSelectedNothing: i0.InputSignalWithTransform<boolean, unknown>;
297
- /** Filter that is currently selected */
298
- get filter(): KbqFilter | null;
299
- set filter(value: KbqFilter | null);
300
- private _filter;
301
- /** An array of templates that are used when adding a pipe. Also contains lists of options to select (values). */
302
- get pipeTemplates(): KbqPipeTemplate[];
303
- set pipeTemplates(value: KbqPipeTemplate[]);
304
- private _templates;
663
+ readonly selectedAllEqualsSelectedNothing: _angular_core.InputSignalWithTransform<boolean, unknown>;
305
664
  /**
306
- * Event that emits whenever the raw value of the filter changes. This is here primarily
307
- * to facilitate the two-way binding for the `filter` input.
308
- * @docs-private
665
+ * Filter that is currently selected. A two-way-bindable `model()`: derived state (`isSaved`/`isChanged`/…)
666
+ * is exposed via `computed()` off it and change detection is driven by signal reactivity. `model()`
667
+ * auto-provides the `filterChange` output for `[(filter)]` two-way binding.
309
668
  */
310
- readonly filterChange: i0.OutputEmitterRef<KbqFilter | null>;
669
+ readonly filter: _angular_core.ModelSignal<KbqFilter | null>;
670
+ /** An array of templates that are used when adding a pipe. Also contains lists of options to select (values). */
671
+ readonly pipeTemplates: _angular_core.InputSignal<KbqPipeTemplate[]>;
311
672
  /** Event that emits whenever the value of the pipe changes. */
312
- readonly onChangePipe: EventEmitter<KbqPipe>;
673
+ readonly onChangePipe: _angular_core.OutputEmitterRef<KbqPipe>;
313
674
  /** Event that emits whenever the pipe deleted. */
314
- readonly onRemovePipe: i0.OutputEmitterRef<KbqPipe>;
675
+ readonly onRemovePipe: _angular_core.OutputEmitterRef<KbqPipe>;
315
676
  /** Event that emits whenever the pipe cleared. */
316
- readonly onClearPipe: i0.OutputEmitterRef<KbqPipe>;
677
+ readonly onClearPipe: _angular_core.OutputEmitterRef<KbqPipe>;
317
678
  /** Event that emits whenever the select or multiselect pipe closed. */
318
- readonly onClosePipe: i0.OutputEmitterRef<KbqPipe>;
319
- /** Whether the current filter is saved and changed */
320
- get isSavedAndChanged(): boolean;
679
+ readonly onClosePipe: _angular_core.OutputEmitterRef<KbqPipe>;
321
680
  /** Whether the current filter is saved */
322
- get isSaved(): boolean;
681
+ readonly isSaved: _angular_core.Signal<boolean>;
323
682
  /** Whether the current filter is changed */
324
- get isChanged(): boolean;
683
+ readonly isChanged: _angular_core.Signal<boolean>;
684
+ /** Whether the current filter is saved and changed */
685
+ readonly isSavedAndChanged: _angular_core.Signal<boolean>;
325
686
  /** Whether the current filter is readonly */
326
- get isReadOnly(): boolean;
687
+ readonly isReadOnly: _angular_core.Signal<boolean>;
327
688
  /** Whether the current filter is disabled */
328
- get isDisabled(): boolean;
689
+ readonly isDisabled: _angular_core.Signal<boolean>;
329
690
  private savedFilter;
691
+ /**
692
+ * All changes.
693
+ * @deprecated noop. Reactivity is driven by the `filter` signal now; this never emits and will be
694
+ * removed in the next major.
695
+ */
696
+ readonly changes: BehaviorSubject<void>;
330
697
  /** Event that emits whenever the filter is reset. */
331
698
  readonly onResetFilter: BehaviorSubject<boolean>;
332
- /** all changes */
333
- readonly changes: BehaviorSubject<void>;
334
699
  /** internal filter changes */
335
700
  readonly internalFilterChanges: BehaviorSubject<KbqFilter | null>;
336
701
  /** internal changes in templates */
@@ -341,48 +706,118 @@ declare class KbqFilterBar {
341
706
  constructor();
342
707
  /** Remove pipe from current filter and emit event */
343
708
  removePipe(pipe: KbqPipe): void;
344
- /** Save current state of filter */
709
+ /**
710
+ * Save current state of filter.
711
+ *
712
+ * Deep-clones the filter via `structuredClone`, so any pipe `value` payload handed to save/restore must be
713
+ * structured-cloneable (plain data — no functions, DOM nodes, class instances or `TemplateRef`s), otherwise
714
+ * `structuredClone` throws `DataCloneError`. All built-in pipes produce cloneable values.
715
+ */
345
716
  saveFilterState(filter?: KbqFilter): void;
346
- /** Restore previously saved filter state */
717
+ /**
718
+ * Restore previously saved filter state.
719
+ *
720
+ * @see `saveFilterState` — pipe `value` payloads must be structured-cloneable.
721
+ */
347
722
  restoreFilterState(filter?: KbqFilter): void;
348
723
  /** Set the filter state "changed" to false */
349
724
  resetFilterChangedState(): void;
350
725
  private updateLocaleParams;
351
726
  private initDefaultParams;
352
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqFilterBar, never>;
353
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqFilterBar, "kbq-filter-bar, [kbq-filter-bar]", never, { "selectedAllEqualsSelectedNothing": { "alias": "selectedAllEqualsSelectedNothing"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; }; "pipeTemplates": { "alias": "pipeTemplates"; "required": false; }; }, { "filterChange": "filterChange"; "onChangePipe": "onChangePipe"; "onRemovePipe": "onRemovePipe"; "onClearPipe": "onClearPipe"; "onClosePipe": "onClosePipe"; }, ["filters", "filterReset"], ["kbq-filters", "*", "kbq-pipe-add", "kbq-filter-reset", "kbq-search-expandable", "kbq-filter-refresher, [kbq-filter-refresher]"], true, never>;
727
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilterBar, never>;
728
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqFilterBar, "kbq-filter-bar, [kbq-filter-bar]", never, { "selectedAllEqualsSelectedNothing": { "alias": "selectedAllEqualsSelectedNothing"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "pipeTemplates": { "alias": "pipeTemplates"; "required": false; "isSignal": true; }; }, { "filter": "filterChange"; "onChangePipe": "onChangePipe"; "onRemovePipe": "onRemovePipe"; "onClearPipe": "onClearPipe"; "onClosePipe": "onClosePipe"; }, ["filters", "filterReset"], ["kbq-filters", "*", "kbq-pipe-add", "kbq-filter-reset", "kbq-search-expandable", "kbq-filter-refresher, [kbq-filter-refresher]"], true, never>;
354
729
  }
355
730
 
356
731
  declare class KbqFilterBarButton {
357
732
  private readonly button;
358
- /** KbqFilterBar instance */
733
+ /** KbqFilterBar host seam */
359
734
  private readonly filterBar;
360
735
  /** KbqFilters instance */
361
736
  protected readonly filters: KbqFilters;
362
737
  constructor();
363
738
  /** @docs-private */
364
739
  saveFocusedElement(): void;
365
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqFilterBarButton, never>;
366
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqFilterBarButton, "[kbqFilterBarButton]", never, {}, {}, never, never, true, never>;
740
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilterBarButton, never>;
741
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqFilterBarButton, "[kbqFilterBarButton]", never, {}, {}, never, never, true, never>;
367
742
  }
368
743
 
369
- declare class KbqFilterBarRefresher {
370
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqFilterBarRefresher, never>;
371
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqFilterBarRefresher, "kbq-filter-refresher, [kbq-filter-refresher]", never, {}, {}, never, never, true, never>;
744
+ declare class KbqFilterRefresher {
745
+ /** KbqFilterBar host seam */
746
+ private readonly filterBar;
747
+ /** localized data
748
+ * @docs-private */
749
+ protected get localeData(): {
750
+ reset: {
751
+ buttonName: string;
752
+ };
753
+ search: {
754
+ tooltip: string;
755
+ placeholder: string;
756
+ };
757
+ filters: {
758
+ defaultName: string;
759
+ saveNewFilterTooltip: string;
760
+ searchPlaceholder: string;
761
+ searchEmptyResult: string;
762
+ saveAsNewFilter: string;
763
+ saveChanges: string;
764
+ saveAsNew: string;
765
+ change: string;
766
+ resetChanges: string;
767
+ remove: string;
768
+ name: string;
769
+ error: string;
770
+ errorHint: string;
771
+ saveButton: string;
772
+ cancelButton: string;
773
+ actionsTooltip: string;
774
+ };
775
+ add: {
776
+ tooltip: string;
777
+ addedAnnouncement: string;
778
+ };
779
+ refresher: {
780
+ refresh: string;
781
+ settings: string;
782
+ };
783
+ pipe: {
784
+ clearButtonTooltip: string;
785
+ removeButtonTooltip: string;
786
+ applyButton: string;
787
+ emptySearchResult: string;
788
+ selectAll: string;
789
+ };
790
+ datePipe: {
791
+ customPeriod: string;
792
+ customPeriodFrom: string;
793
+ customPeriodTo: string;
794
+ customPeriodErrorHint: string;
795
+ backToPeriodSelection: string;
796
+ };
797
+ };
798
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilterRefresher, never>;
799
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqFilterRefresher, "kbq-filter-refresher, [kbq-filter-refresher]", never, {}, {}, never, never, true, never>;
372
800
  }
373
801
 
374
802
  declare class KbqPipeAdd {
375
803
  /** KbqFilterBar instance */
376
- protected readonly filterBar: KbqFilterBar;
804
+ protected readonly filterBar: KbqFilterBarHost;
377
805
  /** @docs-private */
378
- readonly select: i0.Signal<KbqSelect>;
806
+ readonly select: _angular_core.Signal<KbqSelect>;
379
807
  /** Event that is generated after add pipe. */
380
- readonly onAddPipe: i0.OutputEmitterRef<KbqPipeTemplate>;
808
+ readonly onAddPipe: _angular_core.OutputEmitterRef<KbqPipeTemplate>;
381
809
  /** template of filter */
382
- readonly filterTemplate: i0.InputSignal<KbqFilter>;
383
- /** already added pipes. Used to open an already added pipe. */
384
- addedPipes: (string | number)[];
385
- constructor();
810
+ readonly filterTemplate: _angular_core.InputSignal<KbqFilter>;
811
+ /**
812
+ * Ids of the pipes already added to the current filter. Used to open an already-added pipe.
813
+ * Derived from the `filter` signal so it stays in sync without the retired `changes` bus.
814
+ */
815
+ readonly addedPipes: _angular_core.Signal<(string | number | (string & {}))[]>;
816
+ /**
817
+ * Visually-hidden live-region text announcing a newly-added pipe to assistive tech (WCAG 4.1.3).
818
+ * @docs-private
819
+ */
820
+ protected readonly announcement: _angular_core.WritableSignal<string>;
386
821
  addPipeFromTemplate(option: KbqOption): void;
387
822
  /**
388
823
  * Function to compare the option values with the selected values. The first argument
@@ -390,135 +825,45 @@ declare class KbqPipeAdd {
390
825
  * should be returned.
391
826
  */
392
827
  compareWith(o1: KbqPipe, o2: string): boolean;
393
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeAdd, never>;
394
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeAdd, "kbq-pipe-add", never, { "filterTemplate": { "alias": "filterTemplate"; "required": false; "isSignal": true; }; }, { "onAddPipe": "onAddPipe"; }, never, never, true, never>;
828
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeAdd, never>;
829
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeAdd, "kbq-pipe-add", never, { "filterTemplate": { "alias": "filterTemplate"; "required": false; "isSignal": true; }; }, { "onAddPipe": "onAddPipe"; }, never, never, true, never>;
395
830
  }
396
831
 
397
832
  declare class KbqPipeDirective<T extends KbqPipe> implements AfterContentInit {
398
833
  private injector;
399
834
  private pipes;
400
835
  private viewContainerRef;
401
- readonly pipe: i0.InputSignal<T>;
836
+ readonly pipe: _angular_core.InputSignal<T>;
402
837
  ngAfterContentInit(): void;
403
838
  private getInjector;
404
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeDirective<any>, never>;
405
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqPipeDirective<any>, "[kbqPipe]", never, { "pipe": { "alias": "kbqPipe"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
406
- }
407
-
408
- /** Injection Token for providing configuration of filter-bar */
409
- declare const KBQ_PIPE_DATA: InjectionToken<unknown>;
410
- /** function to get unique identifier of an element */
411
- declare function getId(item: KbqPipeTemplate): KbqPipeType | string | number;
412
- declare abstract class KbqBasePipe<V> implements AfterViewInit {
413
- /** changes of state */
414
- readonly stateChanges: Subject<void>;
415
- /** pipe data. Provided from subclass */
416
- readonly data: KbqPipeData<V>;
417
- /** KbqFilterBar instance
418
- * @docs-private */
419
- protected readonly filterBar: KbqFilterBar | null;
420
- /** @docs-private */
421
- protected readonly changeDetectorRef: ChangeDetectorRef;
422
- /** @docs-private */
423
- protected readonly destroyRef: DestroyRef;
424
- /** values to select from the pipe template */
425
- protected values: any;
426
- /** TemplateRef for selecting an option */
427
- protected valueTemplate?: TemplateRef<any> | string;
428
- /**
429
- * Whether the current platform is a Mac.
430
- *
431
- * @docs-private
432
- */
433
- isMac: boolean;
434
- /** Data for the pipe.
435
- * @docs-private */
436
- $implicit: unknown;
437
- /** Whether the current pipe is empty. Used for apply style modifier */
438
- get isEmpty(): boolean;
439
- /** Whether the current pipe is removable or cleanable. Used for apply style modifier */
440
- get showRemoveButton(): boolean;
441
- /** localized data
442
- * @docs-private */
443
- get localeData(): any;
444
- constructor();
445
- ngAfterViewInit(): void;
446
- /** templateRef checker utility */
447
- isTemplateRef(value: unknown): boolean;
448
- /** updates values for selection and value template */
449
- updateTemplates: (templates: KbqPipeTemplate[] | null) => void;
450
- /** removes pipe from filter-bar and triggers changes */
451
- onRemove(): void;
452
- /** clears the pipe and triggers changes */
453
- onClear(): void;
454
- /** @docs-private */
455
- abstract open(): void;
456
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqBasePipe<any>, never>;
457
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqBasePipe<any>, never, never, {}, {}, never, never, true, never>;
458
- }
459
- declare class KbqPipeMinWidth {
460
- /** KbqFilterBar instance */
461
- protected readonly filterBar: KbqFilterBar | null;
462
- /** @docs-private */
463
- protected readonly elementRef: ElementRef<HTMLElement>;
464
- /** @docs-private */
465
- protected readonly changeDetectorRef: ChangeDetectorRef;
466
- /** @docs-private */
467
- protected minWidth: string;
468
- /** maximal symbols for apply fit-content to min-width */
469
- maxSymbolsForFitContent: number;
470
- /** current length of text */
471
- get textLength(): number;
472
- constructor();
473
- update: () => void;
474
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeMinWidth, never>;
475
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqPipeMinWidth, "[kbqPipeMinWidth]", never, {}, {}, never, never, true, never>;
839
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeDirective<any>, never>;
840
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqPipeDirective<any>, "[kbqPipe]", never, { "pipe": { "alias": "kbqPipe"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
476
841
  }
477
842
 
478
843
  declare class KbqPipeButton {
479
844
  /** KbqPipe instance */
480
845
  protected readonly pipe: KbqBasePipe<any>;
481
846
  /** KbqFilterBar instance */
482
- protected readonly filterBar: KbqFilterBar;
847
+ protected readonly filterBar: KbqFilterBarHost;
483
848
  /** @docs-private */
484
849
  protected readonly changeDetectorRef: ChangeDetectorRef;
485
850
  /** enables/disables read-only state */
486
- readonly readonly: i0.InputSignalWithTransform<boolean, unknown>;
851
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
487
852
  /** localized data
488
853
  * @docs-private */
489
- get localeData(): any;
490
- constructor();
491
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeButton, never>;
492
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeButton, "kbq-pipe-button", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
493
- }
494
-
495
- declare class KbqPipeTitleDirective extends KbqTooltipTrigger implements AfterViewInit, OnDestroy {
496
- private componentInstance;
497
- get isOverflown(): boolean;
498
- readonly viewValue: i0.InputSignal<TemplateRef<any>>;
499
- get parent(): HTMLElement;
500
- get child(): HTMLElement;
501
- readonly resizeStream: Subject<Event>;
502
- private readonly debounceInterval;
503
- private resizeSubscription;
504
- private mutationSubscription;
505
- private focusMonitorSubscription;
506
- private childContainer;
507
- private parentContainer;
854
+ get localeData(): {
855
+ clearButtonTooltip: string;
856
+ removeButtonTooltip: string;
857
+ applyButton: string;
858
+ emptySearchResult: string;
859
+ selectAll: string;
860
+ };
508
861
  constructor();
509
- ngAfterViewInit(): void;
510
- ngOnDestroy(): void;
511
- handleElementEnter(): void;
512
- hideTooltip(): void;
513
- private listenToMutationObserver;
514
- private createMutationObserver;
515
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeTitleDirective, never>;
516
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqPipeTitleDirective, "[kbqPipeTitle]", ["kbqPipeTitle"], { "viewValue": { "alias": "kbqPipeTitle"; "required": false; "isSignal": true; }; }, {}, ["parentContainer", "childContainer"], never, true, never>;
862
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeButton, never>;
863
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeButton, "kbq-pipe-button", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
517
864
  }
518
865
 
519
- declare class KbqPipeState<T> implements OnInit {
520
- /** @docs-private */
521
- private readonly destroyRef;
866
+ declare class KbqPipeState<T> {
522
867
  /** @docs-private */
523
868
  private readonly button;
524
869
  /** @docs-private */
@@ -526,25 +871,29 @@ declare class KbqPipeState<T> implements OnInit {
526
871
  /** KbqFilterBar instance
527
872
  * @docs-private */
528
873
  private readonly filterBar;
529
- /** calculates and updates styles of button from pipe state */
530
- get state(): T | null;
531
- set state(pipe: T | null);
532
- private _state;
533
- ngOnInit(): void;
874
+ /** Pipe state used to calculate/update the button style. */
875
+ readonly state: _angular_core.InputSignal<T | null>;
876
+ constructor();
534
877
  private updateState;
535
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeState<any>, never>;
536
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqPipeState<any>, "[kbqPipeState]", never, { "state": { "alias": "kbqPipeState"; "required": false; }; }, {}, never, never, true, never>;
878
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeState<any>, never>;
879
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqPipeState<any>, "[kbqPipeState]", never, { "state": { "alias": "kbqPipeState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
537
880
  }
538
881
 
539
882
  declare class KbqFilterBarModule {
540
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqFilterBarModule, never>;
541
- static ɵmod: i0.ɵɵNgModuleDeclaration<KbqFilterBarModule, never, [typeof KbqFilterBar, typeof KbqFilters, typeof KbqFilterBarRefresher, typeof KbqFilterBarButton, typeof KbqFilterReset, typeof KbqPipeAdd, typeof KbqPipeDirective, typeof KbqPipeButton, typeof KbqPipeTitleDirective, typeof KbqPipeState], [typeof KbqFilterBar, typeof KbqFilters, typeof KbqFilterBarRefresher, typeof KbqFilterBarButton, typeof KbqFilterReset, typeof KbqPipeAdd, typeof KbqPipeDirective, typeof KbqPipeButton, typeof KbqPipeTitleDirective, typeof KbqPipeState]>;
542
- static ɵinj: i0.ɵɵInjectorDeclaration<KbqFilterBarModule>;
883
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFilterBarModule, never>;
884
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<KbqFilterBarModule, never, [typeof KbqFilterBar, typeof KbqFilters, typeof KbqFilterRefresher, typeof KbqFilterBarButton, typeof KbqFilterReset, typeof KbqPipeAdd, typeof KbqPipeDirective, typeof KbqPipeButton, typeof KbqPipeState], [typeof KbqFilterBar, typeof KbqFilters, typeof KbqFilterRefresher, typeof KbqFilterBarButton, typeof KbqFilterReset, typeof KbqPipeAdd, typeof KbqPipeDirective, typeof KbqPipeButton, typeof KbqPipeState]>;
885
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<KbqFilterBarModule>;
543
886
  }
544
887
 
545
- declare class KbqPipeDateComponent<D> extends KbqBasePipe<KbqDateTimeValue> implements AfterViewInit {
546
- private readonly adapter;
547
- private readonly formatter;
888
+ /**
889
+ * Shared implementation for the `date` and `datetime` pipes. The two pipes differ only in how a range
890
+ * is formatted and in their default start/end values, exposed here as the {@link formatRange},
891
+ * {@link getDefaultStart} and {@link getDefaultEnd} hooks. Everything else — the period list / custom
892
+ * period flow, calendar handling and form group — is common.
893
+ */
894
+ declare abstract class KbqPipeDateBaseComponent<D> extends KbqBasePipe<KbqDateTimeValue> implements AfterViewInit {
895
+ protected readonly adapter: DateAdapter<any>;
896
+ protected readonly formatter: DateFormatter<any>;
548
897
  /** @docs-private */
549
898
  protected readonly placements: typeof PopUpPlacements;
550
899
  /** @docs-private */
@@ -559,63 +908,12 @@ declare class KbqPipeDateComponent<D> extends KbqBasePipe<KbqDateTimeValue> impl
559
908
  protected showStartCalendar: boolean;
560
909
  /** @docs-private */
561
910
  protected showEndCalendar: boolean;
562
- /** formatted value for period */
563
- get formattedValue(): string;
564
- /** Whether the current pipe is disabled. */
565
- get disabled(): boolean;
566
- /** parsed start */
567
- get start(): D;
568
- /** default object for start */
569
- get defaultStart(): D;
570
- /** parsed end */
571
- get end(): D;
572
- /** default object for end */
573
- get defaultEnd(): D;
574
- /** Whether the current pipe is empty. */
575
- get isEmpty(): boolean;
576
- /** @docs-private */
577
- readonly popover: i0.Signal<KbqPopoverTrigger>;
578
- /** @docs-private */
579
- listSelection: i0.Signal<KbqListSelection>;
580
- /** @docs-private */
581
- returnButton: i0.Signal<KbqButton>;
582
- ngAfterViewInit(): void;
583
- /** keydown handler
584
- * @docs-private */
585
- onKeydown($event: KeyboardEvent): void;
586
- onApplyPeriod(): void;
587
- onSelect(item: KbqDateTimeValue): void;
588
- showPeriod(): void;
589
- showList(): void;
590
- /** opens popover */
591
- open(): void;
592
- onSelectStartDate(value: D): void;
593
- onSelectEndDate(value: D): void;
594
- onFocusStartInput(): void;
595
- onFocusEndInput(): void;
596
- hideCalendars(): void;
597
- private initFormGroup;
598
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeDateComponent<any>, never>;
599
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeDateComponent<any>, "kbq-pipe-date", never, {}, {}, never, never, true, never>;
600
- }
601
-
602
- declare class KbqPipeDatetimeComponent<D> extends KbqBasePipe<KbqDateTimeValue> implements AfterViewInit {
603
- private readonly adapter;
604
- private readonly formatter;
605
- /** @docs-private */
606
- protected readonly placements: typeof PopUpPlacements;
607
911
  /** @docs-private */
608
- protected readonly styles: typeof KbqButtonStyles;
609
- /** @docs-private */
610
- protected readonly colors: typeof KbqComponentColors;
611
- /** Whether the current state is list of periods. When false will displayed control for set custom period */
612
- protected isListMode: boolean;
613
- /** @docs-private */
614
- protected formGroup: FormGroup;
912
+ readonly popover: _angular_core.Signal<KbqPopoverTrigger>;
615
913
  /** @docs-private */
616
- protected showStartCalendar: boolean;
914
+ readonly listSelection: _angular_core.Signal<KbqListSelection | undefined>;
617
915
  /** @docs-private */
618
- protected showEndCalendar: boolean;
916
+ readonly returnButton: _angular_core.Signal<KbqButton>;
619
917
  /** formatted value for period */
620
918
  get formattedValue(): string;
621
919
  /** Whether the current pipe is disabled. */
@@ -630,17 +928,10 @@ declare class KbqPipeDatetimeComponent<D> extends KbqBasePipe<KbqDateTimeValue>
630
928
  get defaultEnd(): D;
631
929
  /** Whether the current pipe is empty. */
632
930
  get isEmpty(): boolean;
633
- /** @docs-private */
634
- readonly popover: i0.Signal<KbqPopoverTrigger>;
635
- /** @docs-private */
636
- listSelection: i0.Signal<KbqListSelection>;
637
- /** @docs-private */
638
- returnButton: i0.Signal<KbqButton>;
639
931
  ngAfterViewInit(): void;
640
932
  /** keydown handler
641
933
  * @docs-private */
642
934
  onKeydown($event: KeyboardEvent): void;
643
- /** @docs-private */
644
935
  onApplyPeriod(): void;
645
936
  onSelect(item: KbqDateTimeValue): void;
646
937
  showPeriod(): void;
@@ -652,20 +943,42 @@ declare class KbqPipeDatetimeComponent<D> extends KbqBasePipe<KbqDateTimeValue>
652
943
  onFocusStartInput(): void;
653
944
  onFocusEndInput(): void;
654
945
  hideCalendars(): void;
946
+ /** Formats the selected range for display. */
947
+ protected abstract formatRange(start: D, end: D): string;
948
+ /** Default start value used when the pipe has no stored `start`. */
949
+ protected abstract getDefaultStart(): D;
950
+ /** Default end value used when the pipe has no stored `start`. */
951
+ protected abstract getDefaultEnd(): D;
655
952
  private initFormGroup;
656
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeDatetimeComponent<any>, never>;
657
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeDatetimeComponent<any>, "kbq-pipe-datetime", never, {}, {}, never, never, true, never>;
953
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeDateBaseComponent<any>, never>;
954
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqPipeDateBaseComponent<any>, never, never, {}, {}, never, never, true, never>;
955
+ }
956
+
957
+ declare class KbqPipeDateComponent<D> extends KbqPipeDateBaseComponent<D> {
958
+ protected formatRange(start: D, end: D): string;
959
+ protected getDefaultStart(): D;
960
+ protected getDefaultEnd(): D;
961
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeDateComponent<any>, never>;
962
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeDateComponent<any>, "kbq-pipe-date", never, {}, {}, never, never, true, never>;
963
+ }
964
+
965
+ declare class KbqPipeDatetimeComponent<D> extends KbqPipeDateBaseComponent<D> {
966
+ protected formatRange(start: D, end: D): string;
967
+ protected getDefaultStart(): D;
968
+ protected getDefaultEnd(): D;
969
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeDatetimeComponent<any>, never>;
970
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeDatetimeComponent<any>, "kbq-pipe-datetime", never, {}, {}, never, never, true, never>;
658
971
  }
659
972
 
660
973
  declare class KbqPipeMultiSelectComponent extends KbqBasePipe<KbqSelectValue[]> implements AfterViewInit, OnInit {
661
974
  /** control for search options */
662
- searchControl: UntypedFormControl;
975
+ readonly searchControl: FormControl<string | null>;
663
976
  /** filtered by search options */
664
- filteredOptions: Observable<any[]>;
977
+ filteredOptions: Observable<KbqSelectValue[]>;
665
978
  /** @docs-private */
666
- readonly select: i0.Signal<KbqSelect>;
979
+ readonly select: _angular_core.Signal<KbqSelect>;
667
980
  /** @docs-private */
668
- readonly options: i0.Signal<readonly KbqOption[]>;
981
+ readonly options: _angular_core.Signal<readonly KbqOption[]>;
669
982
  /** selected value */
670
983
  get selected(): KbqSelectValue[] | null;
671
984
  /** Whether the current pipe is empty. */
@@ -679,7 +992,7 @@ declare class KbqPipeMultiSelectComponent extends KbqBasePipe<KbqSelectValue[]>
679
992
  get selectedAllEqualsSelectedNothing(): boolean;
680
993
  private get visibleOptions();
681
994
  private selectionAllInProgress;
682
- private internalSelected;
995
+ private readonly multiSelect;
683
996
  /** @docs-private */
684
997
  ngOnInit(): void;
685
998
  ngAfterViewInit(): void;
@@ -691,34 +1004,108 @@ declare class KbqPipeMultiSelectComponent extends KbqBasePipe<KbqSelectValue[]>
691
1004
  toggleSelectionAllByEnterKey(): void;
692
1005
  /** @docs-private */
693
1006
  toggleSelectionAll(emitEvent?: boolean): void;
694
- /** Comparator of selected options */
695
- compareByValue: (o1: any, o2: any) => boolean;
1007
+ /** Comparator of selected options. Two null/absent values never match (aligned with the select pipe). */
1008
+ compareByValue: (o1: Pick<KbqSelectValue, "id"> | null, o2: Pick<KbqSelectValue, "id"> | null) => boolean;
696
1009
  /** handler for select all options in select */
697
1010
  selectAllHandler: (event: KeyboardEvent) => void;
698
1011
  /** @docs-private */
699
1012
  onClose(): void;
700
1013
  /** opens select */
701
1014
  open(): void;
702
- private updateInternalSelected;
703
- private emitChangePipeEvent;
704
1015
  private getFilteredOptions;
705
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeMultiSelectComponent, never>;
706
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeMultiSelectComponent, "kbq-pipe-multi-select", never, {}, {}, never, never, true, never>;
1016
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeMultiSelectComponent, never>;
1017
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeMultiSelectComponent, "kbq-pipe-multi-select", never, {}, {}, never, never, true, never>;
1018
+ }
1019
+
1020
+ /**
1021
+ * Shared scaffolding for the tree-based select pipes (`kbq-pipe-tree-select`,
1022
+ * `kbq-pipe-multi-tree-select`): the flat-tree control / flattener / data source, the node accessors,
1023
+ * search-driven filtering and open handling. Subclasses provide the value-specific pieces (`selected`,
1024
+ * `isEmpty`, `onSelect`, `updateTemplates`).
1025
+ *
1026
+ * The `internalTemplatesChanges` subscription is intentionally left in each subclass constructor: it must
1027
+ * be set up after the subclass's `updateTemplates` field initializer runs, so the initial `BehaviorSubject`
1028
+ * replay dispatches to the subclass override (which writes `dataSource.data`) rather than the base one.
1029
+ */
1030
+ declare abstract class KbqTreeSelectPipeBase<V> extends KbqBasePipe<V> implements OnInit, AfterViewInit {
1031
+ /** control for search options */
1032
+ readonly searchControl: FormControl<string | null>;
1033
+ treeControl: FlatTreeControl<KbqTreeSelectFlatNode>;
1034
+ treeFlattener: KbqTreeFlattener<KbqTreeSelectNode, KbqTreeSelectFlatNode>;
1035
+ dataSource: KbqTreeFlatDataSource<KbqTreeSelectNode, KbqTreeSelectFlatNode>;
1036
+ /** @docs-private */
1037
+ readonly select: _angular_core.Signal<KbqTreeSelect>;
1038
+ constructor();
1039
+ ngOnInit(): void;
1040
+ ngAfterViewInit(): void;
1041
+ /** tree-node predicate: whether the node has children */
1042
+ hasChild(_: number, nodeData: KbqTreeSelectFlatNode): boolean;
1043
+ /** opens the tree-select panel */
1044
+ open(): void;
1045
+ /** @docs-private */
1046
+ onOpen(): void;
1047
+ protected transformer: (node: KbqTreeSelectNode, level: number, parent: KbqTreeSelectFlatNode | null) => KbqTreeSelectFlatNode;
1048
+ protected getLevel: (node: KbqTreeSelectFlatNode) => number;
1049
+ protected isExpandable: (node: KbqTreeSelectFlatNode) => boolean;
1050
+ protected getChildren: (node: KbqTreeSelectNode) => KbqTreeSelectNode[] | null;
1051
+ protected getValue: (node: KbqTreeSelectFlatNode) => unknown;
1052
+ protected getViewValue: (node: KbqTreeSelectFlatNode) => string;
1053
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTreeSelectPipeBase<any>, never>;
1054
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqTreeSelectPipeBase<any>, never, never, {}, {}, never, never, true, never>;
1055
+ }
1056
+
1057
+ declare class KbqPipeMultiTreeSelectComponent extends KbqTreeSelectPipeBase<KbqSelectValue[]> implements OnInit {
1058
+ /** @docs-private */
1059
+ readonly tree: _angular_core.Signal<KbqTreeSelection>;
1060
+ /** selected value */
1061
+ get selected(): KbqSelectValue[] | null;
1062
+ /** Whether the current pipe is empty. */
1063
+ get isEmpty(): boolean;
1064
+ get selectAllCheckboxState(): KbqPseudoCheckboxState;
1065
+ get numberOfSelectedLeaves(): number;
1066
+ /** true if all options selected */
1067
+ get allOptionsSelected(): boolean;
1068
+ get selectedAllEqualsSelectedNothing(): boolean;
1069
+ /** true if all visible options selected */
1070
+ get allVisibleOptionsSelected(): boolean;
1071
+ private readonly multiSelect;
1072
+ constructor();
1073
+ ngOnInit(): void;
1074
+ isNodeSelectAll(_: number, nodeData: KbqTreeSelectFlatNode): boolean;
1075
+ onSelect({ value: option }: {
1076
+ value: any;
1077
+ }): void;
1078
+ searchKeydownHandler(): void;
1079
+ toggleSelectAllNode(emitEvent?: boolean): void;
1080
+ /**
1081
+ * Populates the tree data source from the pipe template. The shared `values`/`valueTemplate`
1082
+ * assignment is already performed by the base subscription, so this override only does the
1083
+ * tree-specific work and avoids a redundant double assignment.
1084
+ */
1085
+ updateTemplates: (templates: KbqPipeTemplate[] | null) => void;
1086
+ onClear(): void;
1087
+ /** @docs-private */
1088
+ onClose(): void;
1089
+ /** handler for select all options in select */
1090
+ selectAllHandler: (event: KeyboardEvent) => void;
1091
+ private toggleParents;
1092
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeMultiTreeSelectComponent, never>;
1093
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeMultiTreeSelectComponent, "kbq-pipe-multi-tree-select", never, {}, {}, never, never, true, never>;
707
1094
  }
708
1095
 
709
1096
  declare class KbqPipeReadonlyComponent extends KbqBasePipe<string | null> {
710
1097
  open(): void;
711
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeReadonlyComponent, never>;
712
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeReadonlyComponent, "kbq-pipe-readonly", never, {}, {}, never, never, true, never>;
1098
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeReadonlyComponent, never>;
1099
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeReadonlyComponent, "kbq-pipe-readonly", never, {}, {}, never, never, true, never>;
713
1100
  }
714
1101
 
715
1102
  declare class KbqPipeSelectComponent extends KbqBasePipe<KbqSelectValue> implements AfterViewInit, OnInit {
716
1103
  /** control for search options */
717
- searchControl: UntypedFormControl;
1104
+ readonly searchControl: FormControl<string | null>;
718
1105
  /** filtered by search options */
719
- filteredOptions: Observable<any[]>;
1106
+ filteredOptions: Observable<KbqSelectValue[]>;
720
1107
  /** @docs-private */
721
- readonly select: i0.Signal<KbqSelect>;
1108
+ readonly select: _angular_core.Signal<KbqSelect>;
722
1109
  /** selected value */
723
1110
  get selected(): KbqSelectValue | null;
724
1111
  /** Whether the current pipe is empty. */
@@ -728,18 +1115,18 @@ declare class KbqPipeSelectComponent extends KbqBasePipe<KbqSelectValue> impleme
728
1115
  ngAfterViewInit(): void;
729
1116
  onSelect(item: KbqSelectValue): void;
730
1117
  /** Comparator of selected options */
731
- compareByValue: (o1: any, o2: any) => boolean;
1118
+ compareByValue: (o1: Pick<KbqSelectValue, "id"> | null, o2: Pick<KbqSelectValue, "id"> | null) => boolean;
732
1119
  /** opens select */
733
1120
  open(): void;
734
1121
  private getFilteredOptions;
735
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeSelectComponent, never>;
736
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeSelectComponent, "kbq-pipe-select", never, {}, {}, never, never, true, never>;
1122
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeSelectComponent, never>;
1123
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeSelectComponent, "kbq-pipe-select", never, {}, {}, never, never, true, never>;
737
1124
  }
738
1125
 
739
1126
  declare class KbqPipeTextComponent extends KbqBasePipe<string | null> implements AfterViewInit, OnInit {
740
1127
  readonly placements: typeof PopUpPlacements;
741
1128
  /** @docs-private */
742
- readonly popover: i0.Signal<KbqPopoverTrigger>;
1129
+ readonly popover: _angular_core.Signal<KbqPopoverTrigger>;
743
1130
  /** Whether the current pipe is disabled. */
744
1131
  get disabled(): boolean;
745
1132
  /** textarea control */
@@ -753,44 +1140,26 @@ declare class KbqPipeTextComponent extends KbqBasePipe<string | null> implements
753
1140
  onClear(): void;
754
1141
  /** opens popover */
755
1142
  open(): void;
756
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeTextComponent, never>;
757
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeTextComponent, "kbq-pipe-text", never, {}, {}, never, never, true, never>;
1143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeTextComponent, never>;
1144
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeTextComponent, "kbq-pipe-text", never, {}, {}, never, never, true, never>;
758
1145
  }
759
1146
 
760
- declare class KbqPipeTreeSelectComponent extends KbqBasePipe<KbqSelectValue> implements OnInit, AfterViewInit {
761
- /** control for search options */
762
- searchControl: UntypedFormControl;
763
- /** filtered by search options */
764
- filteredOptions: Observable<any[]>;
765
- treeControl: FlatTreeControl<KbqTreeSelectFlatNode>;
766
- treeFlattener: KbqTreeFlattener<KbqTreeSelectNode, KbqTreeSelectFlatNode>;
767
- dataSource: KbqTreeFlatDataSource<KbqTreeSelectNode, KbqTreeSelectFlatNode>;
768
- template: any;
769
- /** @docs-private */
770
- readonly select: i0.Signal<KbqTreeSelect>;
1147
+ declare class KbqPipeTreeSelectComponent extends KbqTreeSelectPipeBase<KbqSelectValue> {
771
1148
  /** selected value */
772
1149
  get selected(): KbqSelectValue | null;
773
1150
  /** Whether the current pipe is empty. */
774
1151
  get isEmpty(): boolean;
775
1152
  constructor();
776
- ngOnInit(): void;
777
- ngAfterViewInit(): void;
778
- hasChild(_: number, nodeData: any): any;
779
1153
  onSelect(item: KbqTreeOption): void;
780
- /** updates values for selection and value template */
1154
+ /**
1155
+ * Populates the tree data source from the pipe template. The shared `values`/`valueTemplate`
1156
+ * assignment is already performed by the base subscription, so this override only does the
1157
+ * tree-specific work and avoids a redundant double assignment.
1158
+ */
781
1159
  updateTemplates: (templates: KbqPipeTemplate[] | null) => void;
782
- /** opens select */
783
- open(): void;
784
- onOpen(): void;
785
- private transformer;
786
- private getLevel;
787
- private isExpandable;
788
- private getChildren;
789
- private getValue;
790
- private getViewValue;
791
- static ɵfac: i0.ɵɵFactoryDeclaration<KbqPipeTreeSelectComponent, never>;
792
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqPipeTreeSelectComponent, "kbq-pipe-tree-select", never, {}, {}, never, never, true, never>;
1160
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqPipeTreeSelectComponent, never>;
1161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqPipeTreeSelectComponent, "kbq-pipe-tree-select", never, {}, {}, never, never, true, never>;
793
1162
  }
794
1163
 
795
- export { KBQ_FILTER_BAR_CONFIGURATION, KBQ_FILTER_BAR_DEFAULT_CONFIGURATION, KBQ_FILTER_BAR_PIPES, KBQ_PIPE_DATA, KbqBasePipe, KbqFilterBar, KbqFilterBarButton, KbqFilterBarModule, KbqFilterBarRefresher, KbqFilterReset, KbqFilters, KbqPipeAdd, KbqPipeButton, KbqPipeDateComponent, KbqPipeDatetimeComponent, KbqPipeDirective, KbqPipeMinWidth, KbqPipeMultiSelectComponent, KbqPipeReadonlyComponent, KbqPipeSelectComponent, KbqPipeState, KbqPipeTextComponent, KbqPipeTitleDirective, KbqPipeTreeSelectComponent, KbqPipeTypes, KbqSaveFilterStatuses, KbqTreeSelectFlatNode, defaultFilterBarPipes, getId, kbqBuildTree, kbqFilterBarPipesProvider };
796
- export type { KbqDateTimeValue, KbqFilter, KbqPipe, KbqPipeData, KbqPipeTemplate, KbqPipeType, KbqSaveFilterError, KbqSaveFilterEvent, KbqSelectValue, KbqTreeSelectNode };
1164
+ export { KBQ_FILTER_BAR_CONFIGURATION, KBQ_FILTER_BAR_DEFAULT_CONFIGURATION, KBQ_FILTER_BAR_HOST, KBQ_FILTER_BAR_PIPES, KBQ_PIPE_DATA, KbqBasePipe, KbqFilterBar, KbqFilterBarButton, KbqFilterBarModule, KbqFilterRefresher as KbqFilterBarRefresher, KbqFilterRefresher, KbqFilterReset, KbqFilterSavePopover, KbqFilters, KbqPipeAdd, KbqPipeButton, KbqPipeDateBaseComponent, KbqPipeDateComponent, KbqPipeDatetimeComponent, KbqPipeDirective, KbqPipeMinWidth, KbqPipeMultiSelectComponent, KbqPipeMultiTreeSelectComponent, KbqPipeReadonlyComponent, KbqPipeSelectComponent, KbqPipeState, KbqPipeTextComponent, KbqPipeTreeSelectComponent, KbqPipeTypes, KbqSaveFilterStatuses, KbqTreeSelectFlatNode, KbqTreeSelectPipeBase, defaultFilterBarPipes, getId, kbqBuildTree, kbqFilterBarPipesProvider };
1165
+ export type { KbqDateTimeValue, KbqFilter, KbqFilterBarConfiguration, KbqFilterBarHost, KbqPipe, KbqPipeData, KbqPipeTemplate, KbqPipeType, KbqSaveFilterError, KbqSaveFilterEvent, KbqSelectValue, KbqTreeSelectNode };