@tekus/design-system 5.33.0 → 5.34.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 (94) hide show
  1. package/fesm2022/tekus-design-system-components-action-group.mjs +3 -3
  2. package/fesm2022/tekus-design-system-components-action-group.mjs.map +1 -1
  3. package/fesm2022/tekus-design-system-components-autocomplete.mjs +3 -3
  4. package/fesm2022/tekus-design-system-components-autocomplete.mjs.map +1 -1
  5. package/fesm2022/tekus-design-system-components-badge.mjs +3 -3
  6. package/fesm2022/tekus-design-system-components-badge.mjs.map +1 -1
  7. package/fesm2022/tekus-design-system-components-bread-crumps.mjs +3 -3
  8. package/fesm2022/tekus-design-system-components-bread-crumps.mjs.map +1 -1
  9. package/fesm2022/tekus-design-system-components-button.mjs +3 -3
  10. package/fesm2022/tekus-design-system-components-button.mjs.map +1 -1
  11. package/fesm2022/tekus-design-system-components-card-list.mjs +3 -3
  12. package/fesm2022/tekus-design-system-components-card-list.mjs.map +1 -1
  13. package/fesm2022/tekus-design-system-components-card.mjs +3 -3
  14. package/fesm2022/tekus-design-system-components-card.mjs.map +1 -1
  15. package/fesm2022/tekus-design-system-components-checkbox.mjs +3 -3
  16. package/fesm2022/tekus-design-system-components-checkbox.mjs.map +1 -1
  17. package/fesm2022/tekus-design-system-components-chip.mjs +51 -0
  18. package/fesm2022/tekus-design-system-components-chip.mjs.map +1 -0
  19. package/fesm2022/tekus-design-system-components-color-picker.mjs +9 -9
  20. package/fesm2022/tekus-design-system-components-color-picker.mjs.map +1 -1
  21. package/fesm2022/tekus-design-system-components-date-picker.mjs +3 -3
  22. package/fesm2022/tekus-design-system-components-date-picker.mjs.map +1 -1
  23. package/fesm2022/tekus-design-system-components-drawer.mjs +19 -9
  24. package/fesm2022/tekus-design-system-components-drawer.mjs.map +1 -1
  25. package/fesm2022/tekus-design-system-components-dropdown.mjs +3 -3
  26. package/fesm2022/tekus-design-system-components-dropdown.mjs.map +1 -1
  27. package/fesm2022/tekus-design-system-components-fallback-view.mjs +3 -3
  28. package/fesm2022/tekus-design-system-components-fallback-view.mjs.map +1 -1
  29. package/fesm2022/tekus-design-system-components-icon.mjs +3 -3
  30. package/fesm2022/tekus-design-system-components-icon.mjs.map +1 -1
  31. package/fesm2022/tekus-design-system-components-input-number.mjs +3 -3
  32. package/fesm2022/tekus-design-system-components-input-number.mjs.map +1 -1
  33. package/fesm2022/tekus-design-system-components-input-text.mjs +3 -3
  34. package/fesm2022/tekus-design-system-components-input-text.mjs.map +1 -1
  35. package/fesm2022/tekus-design-system-components-menu.mjs +3 -3
  36. package/fesm2022/tekus-design-system-components-menu.mjs.map +1 -1
  37. package/fesm2022/tekus-design-system-components-message.mjs +3 -3
  38. package/fesm2022/tekus-design-system-components-message.mjs.map +1 -1
  39. package/fesm2022/tekus-design-system-components-modal.mjs +6 -6
  40. package/fesm2022/tekus-design-system-components-modal.mjs.map +1 -1
  41. package/fesm2022/tekus-design-system-components-multiselect.mjs +18 -8
  42. package/fesm2022/tekus-design-system-components-multiselect.mjs.map +1 -1
  43. package/fesm2022/tekus-design-system-components-pagination.mjs +3 -3
  44. package/fesm2022/tekus-design-system-components-pagination.mjs.map +1 -1
  45. package/fesm2022/tekus-design-system-components-panel-menu.mjs +3 -3
  46. package/fesm2022/tekus-design-system-components-panel-menu.mjs.map +1 -1
  47. package/fesm2022/tekus-design-system-components-panel.mjs +3 -3
  48. package/fesm2022/tekus-design-system-components-panel.mjs.map +1 -1
  49. package/fesm2022/tekus-design-system-components-progress-bar.mjs +3 -3
  50. package/fesm2022/tekus-design-system-components-progress-bar.mjs.map +1 -1
  51. package/fesm2022/tekus-design-system-components-radio-button.mjs +3 -3
  52. package/fesm2022/tekus-design-system-components-radio-button.mjs.map +1 -1
  53. package/fesm2022/tekus-design-system-components-select.mjs +9 -9
  54. package/fesm2022/tekus-design-system-components-select.mjs.map +1 -1
  55. package/fesm2022/tekus-design-system-components-sidebar-layout.mjs +6 -6
  56. package/fesm2022/tekus-design-system-components-sidebar-layout.mjs.map +1 -1
  57. package/fesm2022/tekus-design-system-components-status-bar.mjs +3 -3
  58. package/fesm2022/tekus-design-system-components-status-bar.mjs.map +1 -1
  59. package/fesm2022/tekus-design-system-components-stepper.mjs +3 -3
  60. package/fesm2022/tekus-design-system-components-stepper.mjs.map +1 -1
  61. package/fesm2022/tekus-design-system-components-table.mjs +76 -8
  62. package/fesm2022/tekus-design-system-components-table.mjs.map +1 -1
  63. package/fesm2022/tekus-design-system-components-tabs.mjs +3 -3
  64. package/fesm2022/tekus-design-system-components-tabs.mjs.map +1 -1
  65. package/fesm2022/tekus-design-system-components-tag.mjs +3 -3
  66. package/fesm2022/tekus-design-system-components-tag.mjs.map +1 -1
  67. package/fesm2022/tekus-design-system-components-textarea.mjs +3 -3
  68. package/fesm2022/tekus-design-system-components-textarea.mjs.map +1 -1
  69. package/fesm2022/tekus-design-system-components-time-ago.mjs +3 -3
  70. package/fesm2022/tekus-design-system-components-time-ago.mjs.map +1 -1
  71. package/fesm2022/tekus-design-system-components-time-picker.mjs +3 -3
  72. package/fesm2022/tekus-design-system-components-time-picker.mjs.map +1 -1
  73. package/fesm2022/tekus-design-system-components-toast.mjs +3 -3
  74. package/fesm2022/tekus-design-system-components-toast.mjs.map +1 -1
  75. package/fesm2022/tekus-design-system-components-toggle.mjs +3 -3
  76. package/fesm2022/tekus-design-system-components-toggle.mjs.map +1 -1
  77. package/fesm2022/tekus-design-system-components-toolbar.mjs +369 -113
  78. package/fesm2022/tekus-design-system-components-toolbar.mjs.map +1 -1
  79. package/fesm2022/tekus-design-system-components-tooltip.mjs +3 -3
  80. package/fesm2022/tekus-design-system-components-tooltip.mjs.map +1 -1
  81. package/fesm2022/tekus-design-system-components-topbar.mjs +3 -3
  82. package/fesm2022/tekus-design-system-components-topbar.mjs.map +1 -1
  83. package/fesm2022/tekus-design-system-core-types.mjs +32 -3
  84. package/fesm2022/tekus-design-system-core-types.mjs.map +1 -1
  85. package/fesm2022/tekus-design-system-core.mjs +32 -3
  86. package/fesm2022/tekus-design-system-core.mjs.map +1 -1
  87. package/fesm2022/tekus-design-system-directives-gird-item.mjs +3 -3
  88. package/fesm2022/tekus-design-system-directives-gird-item.mjs.map +1 -1
  89. package/package.json +7 -2
  90. package/types/tekus-design-system-components-chip.d.ts +36 -0
  91. package/types/tekus-design-system-components-drawer.d.ts +14 -3
  92. package/types/tekus-design-system-components-multiselect.d.ts +11 -1
  93. package/types/tekus-design-system-components-table.d.ts +6 -2
  94. package/types/tekus-design-system-components-toolbar.d.ts +185 -98
@@ -1,135 +1,269 @@
1
1
  import * as i0 from '@angular/core';
2
- import { model, signal, input, output, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { combineLatest, distinctUntilChanged, switchMap, EMPTY, timer } from 'rxjs';
2
+ import { inject, model, input, output, signal, viewChild, computed, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { toSignal, toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { BreakpointObserver } from '@angular/cdk/layout';
5
+ import { map, combineLatest, distinctUntilChanged, switchMap, EMPTY, timer } from 'rxjs';
6
+ import * as i1 from 'primeng/popover';
7
+ import { PopoverModule } from 'primeng/popover';
5
8
  import { ButtonComponent } from '@tekus/design-system/components/button';
6
- import { SelectComponent } from '@tekus/design-system/components/select';
7
9
  import { InputTextComponent } from '@tekus/design-system/components/input-text';
10
+ import { CheckboxComponent } from '@tekus/design-system/components/checkbox';
11
+ import { ActionGroupComponent } from '@tekus/design-system/components/action-group';
12
+ import { IconComponent } from '@tekus/design-system/components/icon';
13
+ import { DropdownComponent } from '@tekus/design-system/components/dropdown';
14
+ import { MultiselectComponent } from '@tekus/design-system/components/multiselect';
15
+ import { ChipComponent } from '@tekus/design-system/components/chip';
16
+ import { DrawerComponent } from '@tekus/design-system/components/drawer';
8
17
 
9
18
  class ToolbarComponent {
10
- /**
11
- * @method constructor
12
- * @description
13
- * Initializes the automatic reload logic using a declarative RxJS approach.
14
- */
15
19
  constructor() {
20
+ this.breakpointObserver = inject(BreakpointObserver);
21
+ /** Responsive flag using BreakpointObserver */
22
+ this.isMobile = toSignal(this.breakpointObserver.observe('(max-width: 768px)').pipe(map(r => r.matches)), { initialValue: false });
16
23
  /**
17
- * @property {ModelSignal<string>} searchModel
18
- * @description
19
24
  * Two-way bindable signal for the search input value.
20
- * Supports [(searchModel)]="variable" syntax for two-way binding.
21
- * @default ''
22
25
  */
23
26
  this.searchModel = model('', ...(ngDevMode ? [{ debugName: "searchModel" }] : /* istanbul ignore next */ []));
24
27
  /**
25
- * @property {ModelSignal<Record<string, string> | null>} filterModel
26
- * @description
27
- * Two-way bindable signal for the filter select value.
28
- * Supports [(filterModel)]="variable" syntax for two-way binding.
29
- * @default null
28
+ * Label/placeholder text displayed inside the search input.
29
+ * @default 'Buscar'
30
30
  */
31
- this.filterModel = model(null, ...(ngDevMode ? [{ debugName: "filterModel" }] : /* istanbul ignore next */ []));
31
+ this.searchFloatLabel = input('Buscar', ...(ngDevMode ? [{ debugName: "searchFloatLabel" }] : /* istanbul ignore next */ []));
32
32
  /**
33
- * @property {WritableSignal<boolean>} showSearchInput
34
- * @description
35
- * Controls the visibility of the search input. Toggles when the search button is clicked.
36
- * @default false
33
+ * Controls the visibility of the search input field.
34
+ * @default true
37
35
  */
38
- this.showSearchInput = signal(false, ...(ngDevMode ? [{ debugName: "showSearchInput" }] : /* istanbul ignore next */ []));
36
+ this.searchVisible = input(true, ...(ngDevMode ? [{ debugName: "searchVisible" }] : /* istanbul ignore next */ []));
39
37
  /**
40
- * @property {WritableSignal<boolean>} showFilterSelect
41
- * @description
42
- * Controls the visibility of the filter select. Toggles when the filter button is clicked.
38
+ * Two-way bindable signal for the layout view toggle ('table' or 'cards').
39
+ * @default 'table'
40
+ */
41
+ this.view = model('table', ...(ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []));
42
+ /**
43
+ * Controls the visibility of the layout view toggle button.
43
44
  * @default false
44
45
  */
45
- this.showFilterSelect = signal(false, ...(ngDevMode ? [{ debugName: "showFilterSelect" }] : /* istanbul ignore next */ []));
46
+ this.viewToggleVisible = input(false, ...(ngDevMode ? [{ debugName: "viewToggleVisible" }] : /* istanbul ignore next */ []));
46
47
  /**
47
- * @property {InputSignal<Array<{ label: string; value: string }>>} filterOptions
48
- * @description
49
- * Array of options available in the filter select dropdown.
50
- * Each option is an object with `label` (displayed text) and `value` (internal identifier).
51
- *
52
- * @default
53
- * [
54
- * { label: 'Option 1', value: 'option1' },
55
- * { label: 'Option 2', value: 'option2' },
56
- * { label: 'Option 3', value: 'option3' }
57
- * ]
48
+ * Dynamic list of filters and their available selection options.
49
+ * @default []
58
50
  */
51
+ this.filters = input([], ...(ngDevMode ? [{ debugName: "filters" }] : /* istanbul ignore next */ []));
52
+ /** Backwards compatibility: Writable model signal for the selected option in a single filter select (deprecated) */
53
+ this.filterModel = model(null, ...(ngDevMode ? [{ debugName: "filterModel" }] : /* istanbul ignore next */ []));
54
+ /** Backwards compatibility: Input for dropdown options (deprecated) */
55
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
56
  this.filterOptions = input([
60
57
  { label: 'Option 1', value: 'option1' },
61
58
  { label: 'Option 2', value: 'option2' },
62
59
  { label: 'Option 3', value: 'option3' },
63
60
  ], ...(ngDevMode ? [{ debugName: "filterOptions" }] : /* istanbul ignore next */ []));
61
+ /** Backwards compatibility: Input for the option label key (deprecated) */
62
+ this.filterOptionLabel = input('label', ...(ngDevMode ? [{ debugName: "filterOptionLabel" }] : /* istanbul ignore next */ []));
63
+ /** Backwards compatibility: Input for the label of the single select dropdown (deprecated) */
64
+ this.filterFloatLabel = input('Filtrar', ...(ngDevMode ? [{ debugName: "filterFloatLabel" }] : /* istanbul ignore next */ []));
65
+ /** Backwards compatibility: Controls whether filter button is shown (deprecated) */
66
+ this.filterVisible = input(true, ...(ngDevMode ? [{ debugName: "filterVisible" }] : /* istanbul ignore next */ []));
64
67
  /**
65
- * @property {InputSignal<string>} filterOptionLabel
66
- * @description
67
- * Property name used to display the label in the select dropdown options.
68
- * This corresponds to the key in each option object that contains the display text.
69
- *
70
- * @default 'label'
68
+ * Two-way bindable signal for currently selected filter values.
69
+ * Format: { [filterKey]: MultiSelectOption[] }
70
+ * @default {}
71
71
  */
72
- this.filterOptionLabel = input('label', ...(ngDevMode ? [{ debugName: "filterOptionLabel" }] : /* istanbul ignore next */ []));
72
+ this.filterValues = model({}, ...(ngDevMode ? [{ debugName: "filterValues" }] : /* istanbul ignore next */ []));
73
73
  /**
74
- * @property {InputSignal<string>} filterFloatLabel
75
- * @description
76
- * Label text displayed above the filter select input using the FloatLabel wrapper.
77
- * This is the placeholder/label that floats when the select is focused or has a value.
78
- *
79
- * @default 'Filtrar'
74
+ * Label/text for the clear button.
75
+ * @default 'Limpiar'
80
76
  */
81
- this.filterFloatLabel = input('Filtrar', ...(ngDevMode ? [{ debugName: "filterFloatLabel" }] : /* istanbul ignore next */ []));
77
+ this.clearLabel = input('Limpiar', ...(ngDevMode ? [{ debugName: "clearLabel" }] : /* istanbul ignore next */ []));
82
78
  /**
83
- * @property {InputSignal<string>} searchFloatLabel
84
- * @description
85
- * Label text displayed above the search input using the FloatLabel wrapper.
86
- * This is the placeholder/label that floats when the search input is focused or has a value.
87
- *
88
- * @default 'Buscar'
79
+ * Label/text for the delete action button.
80
+ * @default 'Eliminar'
89
81
  */
90
- this.searchFloatLabel = input('Buscar', ...(ngDevMode ? [{ debugName: "searchFloatLabel" }] : /* istanbul ignore next */ []));
82
+ this.deleteLabel = input('Eliminar', ...(ngDevMode ? [{ debugName: "deleteLabel" }] : /* istanbul ignore next */ []));
91
83
  /**
92
- * @property {InputSignal<boolean>} searchVisible
93
- * @description
94
- * Controls the visibility of the search button.
95
- * @default true
84
+ * Label/text for the filters header.
85
+ * @default 'Filtros'
96
86
  */
97
- this.searchVisible = input(true, ...(ngDevMode ? [{ debugName: "searchVisible" }] : /* istanbul ignore next */ []));
87
+ this.filterLabel = input('Filtros', ...(ngDevMode ? [{ debugName: "filterLabel" }] : /* istanbul ignore next */ []));
88
+ /** Label for selected item singular form (e.g. 'seleccionado') */
89
+ this.selectedLabel = input('seleccionado', ...(ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []));
90
+ /** Label for selected item plural form (e.g. 'seleccionados') */
91
+ this.selectedPluralLabel = input('seleccionados', ...(ngDevMode ? [{ debugName: "selectedPluralLabel" }] : /* istanbul ignore next */ []));
92
+ /** Label/text for the apply button in overlays (e.g. 'Aplicar') */
93
+ this.applyLabel = input('Aplicar', ...(ngDevMode ? [{ debugName: "applyLabel" }] : /* istanbul ignore next */ []));
94
+ /** Tooltip text for the reload action button (e.g. 'Actualizar') */
95
+ this.reloadTooltip = input('Actualizar', ...(ngDevMode ? [{ debugName: "reloadTooltip" }] : /* istanbul ignore next */ []));
96
+ /** Tooltip text for the sort action button (e.g. 'Ordenar') */
97
+ this.sortTooltip = input('Ordenar', ...(ngDevMode ? [{ debugName: "sortTooltip" }] : /* istanbul ignore next */ []));
98
+ /** Tooltip text for view cards layout button (e.g. 'Vista tarjeta') */
99
+ this.viewCardsTooltip = input('Vista tarjeta', ...(ngDevMode ? [{ debugName: "viewCardsTooltip" }] : /* istanbul ignore next */ []));
100
+ /** Tooltip text for view table layout button (e.g. 'Vista tabla') */
101
+ this.viewTableTooltip = input('Vista tabla', ...(ngDevMode ? [{ debugName: "viewTableTooltip" }] : /* istanbul ignore next */ []));
98
102
  /**
99
- * @property {InputSignal<boolean>} filterVisible
100
- * @description
101
- * Controls the visibility of the filter button.
102
- * @default true
103
+ * Available list of sorting options.
104
+ * @default []
103
105
  */
104
- this.filterVisible = input(true, ...(ngDevMode ? [{ debugName: "filterVisible" }] : /* istanbul ignore next */ []));
106
+ this.sortOptions = input([], ...(ngDevMode ? [{ debugName: "sortOptions" }] : /* istanbul ignore next */ []));
107
+ /**
108
+ * Label/text for the sorting header.
109
+ * @default 'Ordenar por'
110
+ */
111
+ this.sortLabel = input('Ordenar por', ...(ngDevMode ? [{ debugName: "sortLabel" }] : /* istanbul ignore next */ []));
112
+ /**
113
+ * Two-way bindable signal for the active sort option value.
114
+ * @default null
115
+ */
116
+ this.sortValue = model(null, ...(ngDevMode ? [{ debugName: "sortValue" }] : /* istanbul ignore next */ []));
105
117
  /**
106
- * @property {InputSignal<boolean>} reloadVisible
107
- * @description
108
118
  * Controls the visibility of the reload button.
109
119
  * @default false
110
120
  */
111
121
  this.reloadVisible = input(false, ...(ngDevMode ? [{ debugName: "reloadVisible" }] : /* istanbul ignore next */ []));
112
122
  /**
113
- * @property {InputSignal<number | null>} reloadInterval
114
- * @description
115
123
  * Sets the interval for automatic reload in milliseconds.
116
124
  * If null, automatic reload is disabled.
117
125
  * @default null
118
126
  */
119
127
  this.reloadInterval = input(null, ...(ngDevMode ? [{ debugName: "reloadInterval" }] : /* istanbul ignore next */ []));
120
128
  /**
121
- * @property {InputSignal<boolean>} loading
122
- * @description
123
129
  * Controls the loading state of the reload button, triggering a rotation animation.
124
130
  * @default false
125
131
  */
126
132
  this.loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
127
133
  /**
128
- * @property {OutputEmitter<void>} reload
129
- * @description
134
+ * Secondary or mass actions collapsed into the tk-action-group dropdown.
135
+ * @default []
136
+ */
137
+ this.globalActions = input([], ...(ngDevMode ? [{ debugName: "globalActions" }] : /* istanbul ignore next */ []));
138
+ /**
139
+ * Number of items selected in the list.
140
+ * @default 0
141
+ */
142
+ this.selectionCount = input(0, ...(ngDevMode ? [{ debugName: "selectionCount" }] : /* istanbul ignore next */ []));
143
+ /**
144
+ * Two-way bindable signal for checking/unchecking the select-all checkbox.
145
+ * @default false
146
+ */
147
+ this.allSelected = model(false, ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
148
+ /**
149
+ * Two-way bindable signal for the indeterminate state of the select-all checkbox.
150
+ * @default false
151
+ */
152
+ this.indeterminate = model(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
153
+ /**
154
+ * Actions available when one or more items are selected.
155
+ * @default []
156
+ */
157
+ this.selectionActions = input([], ...(ngDevMode ? [{ debugName: "selectionActions" }] : /* istanbul ignore next */ []));
158
+ /**
159
+ * Maximum number of selection action buttons visible directly before grouping the rest.
160
+ * @default 1
161
+ */
162
+ this.maxVisibleSelectionActions = input(1, ...(ngDevMode ? [{ debugName: "maxVisibleSelectionActions" }] : /* istanbul ignore next */ []));
163
+ /**
130
164
  * Emits an event when the reload button is clicked or the automatic interval is reached.
131
165
  */
132
166
  this.reload = output();
167
+ /**
168
+ * Emits when filters are applied.
169
+ */
170
+ this.appliedFilters = output();
171
+ /**
172
+ * Emits when sorting changes.
173
+ */
174
+ this.appliedSort = output();
175
+ /** Temporary filter values held before the user clicks "Aplicar" */
176
+ this.tempFilterValues = signal({}, ...(ngDevMode ? [{ debugName: "tempFilterValues" }] : /* istanbul ignore next */ []));
177
+ /** Temporary sort value held before the user clicks "Aplicar" in mobile drawer */
178
+ this.tempSortValue = signal(null, ...(ngDevMode ? [{ debugName: "tempSortValue" }] : /* istanbul ignore next */ []));
179
+ /** Controls visibility of mobile drawers */
180
+ this.showFilterDrawer = signal(false, ...(ngDevMode ? [{ debugName: "showFilterDrawer" }] : /* istanbul ignore next */ []));
181
+ this.showSortDrawer = signal(false, ...(ngDevMode ? [{ debugName: "showSortDrawer" }] : /* istanbul ignore next */ []));
182
+ this.filterPopover = viewChild('filterPopover', ...(ngDevMode ? [{ debugName: "filterPopover" }] : /* istanbul ignore next */ []));
183
+ this.sortPopover = viewChild('sortPopover', ...(ngDevMode ? [{ debugName: "sortPopover" }] : /* istanbul ignore next */ []));
184
+ /** Computes whether any filters are currently active */
185
+ this.hasActiveFilters = computed(() => {
186
+ const values = this.filterValues();
187
+ return Object.values(values).some(arr => arr && arr.length > 0);
188
+ }, ...(ngDevMode ? [{ debugName: "hasActiveFilters" }] : /* istanbul ignore next */ []));
189
+ /** Computes whether sorting is active */
190
+ this.hasActiveSort = computed(() => {
191
+ return this.sortValue() !== null && this.sortValue() !== '';
192
+ }, ...(ngDevMode ? [{ debugName: "hasActiveSort" }] : /* istanbul ignore next */ []));
193
+ /** Reload button visibility: only visible if reload is allowed AND filters or sorting is active */
194
+ this.shouldShowReload = computed(() => {
195
+ return this.reloadVisible();
196
+ }, ...(ngDevMode ? [{ debugName: "shouldShowReload" }] : /* istanbul ignore next */ []));
197
+ /** Computes the final filters configuration, adapting old filterOptions format to the new filters schema */
198
+ this.derivedFilters = computed(() => {
199
+ const customFilters = this.filters();
200
+ if (customFilters && customFilters.length > 0) {
201
+ return customFilters;
202
+ }
203
+ const oldOptions = this.filterOptions();
204
+ if (oldOptions && oldOptions.length > 0) {
205
+ return [
206
+ {
207
+ key: 'default_filter',
208
+ label: this.filterFloatLabel() || 'Filtrar',
209
+ options: oldOptions.map(opt => ({
210
+ name: opt[this.filterOptionLabel()] || opt['label'] || opt['value'],
211
+ code: opt['value']
212
+ }))
213
+ }
214
+ ];
215
+ }
216
+ return [];
217
+ }, ...(ngDevMode ? [{ debugName: "derivedFilters" }] : /* istanbul ignore next */ []));
218
+ /** Active chips representing individual filter selections */
219
+ this.activeChips = computed(() => {
220
+ const values = this.filterValues();
221
+ const configs = this.derivedFilters();
222
+ const chips = [];
223
+ for (const config of configs) {
224
+ const selected = values[config.key] || [];
225
+ for (const item of selected) {
226
+ chips.push({
227
+ filterKey: config.key,
228
+ code: item.code,
229
+ label: item.name,
230
+ });
231
+ }
232
+ }
233
+ return chips;
234
+ }, ...(ngDevMode ? [{ debugName: "activeChips" }] : /* istanbul ignore next */ []));
235
+ /** Visibility of the active filters bar (below tools) */
236
+ this.shouldShowActiveFiltersBar = computed(() => {
237
+ return this.hasActiveFilters();
238
+ }, ...(ngDevMode ? [{ debugName: "shouldShowActiveFiltersBar" }] : /* istanbul ignore next */ []));
239
+ /** Visible selection actions as buttons */
240
+ this.visibleSelectionActions = computed(() => {
241
+ return this.selectionActions()
242
+ .slice(0, this.maxVisibleSelectionActions())
243
+ .map(action => {
244
+ if (action.severity === 'danger') {
245
+ return { ...action, label: this.deleteLabel() };
246
+ }
247
+ return action;
248
+ });
249
+ }, ...(ngDevMode ? [{ debugName: "visibleSelectionActions" }] : /* istanbul ignore next */ []));
250
+ /** Overflow selection actions as menu items for dropdown */
251
+ this.overflowSelectionActions = computed(() => {
252
+ const list = this.selectionActions();
253
+ const max = this.maxVisibleSelectionActions();
254
+ if (list.length <= max) {
255
+ return [];
256
+ }
257
+ return list.slice(max).map(action => {
258
+ const label = action.severity === 'danger' ? this.deleteLabel() : action.label;
259
+ return {
260
+ label: label,
261
+ icon: action.icon,
262
+ command: () => action.action(),
263
+ disabled: action.disabled ?? false,
264
+ };
265
+ });
266
+ }, ...(ngDevMode ? [{ debugName: "overflowSelectionActions" }] : /* istanbul ignore next */ []));
133
267
  combineLatest([
134
268
  toObservable(this.reloadInterval).pipe(distinctUntilChanged()),
135
269
  toObservable(this.loading).pipe(distinctUntilChanged()),
@@ -141,50 +275,172 @@ class ToolbarComponent {
141
275
  return timer(interval, interval);
142
276
  }), takeUntilDestroyed())
143
277
  .subscribe(() => this.onReload());
278
+ effect(() => {
279
+ const modelVal = this.filterModel();
280
+ if (modelVal?.['value']) {
281
+ const matchedOpt = this.filterOptions().find(opt => opt['value'] === modelVal['value']);
282
+ if (matchedOpt) {
283
+ const labelKey = this.filterOptionLabel();
284
+ const label = matchedOpt[labelKey] || matchedOpt['label'] || matchedOpt['value'];
285
+ untracked(() => {
286
+ const current = this.filterValues();
287
+ const currentSelections = current['default_filter'] || [];
288
+ if (currentSelections.length !== 1 || currentSelections[0].code !== matchedOpt['value']) {
289
+ this.filterValues.set({
290
+ ...current,
291
+ default_filter: [{ name: label, code: matchedOpt['value'] }]
292
+ });
293
+ }
294
+ });
295
+ }
296
+ }
297
+ else if (!modelVal) {
298
+ untracked(() => {
299
+ const current = this.filterValues();
300
+ if (current['default_filter'] && current['default_filter'].length > 0) {
301
+ const updated = { ...current };
302
+ delete updated['default_filter'];
303
+ this.filterValues.set(updated);
304
+ }
305
+ });
306
+ }
307
+ });
308
+ // Sync filterValues (new) -> filterModel (old single-select)
309
+ effect(() => {
310
+ const values = this.filterValues();
311
+ const defaultFilterSelections = values['default_filter'];
312
+ if (defaultFilterSelections && defaultFilterSelections.length > 0) {
313
+ const lastSelected = defaultFilterSelections[defaultFilterSelections.length - 1];
314
+ const matchedOpt = this.filterOptions().find(opt => opt['value'] === lastSelected.code);
315
+ if (matchedOpt) {
316
+ untracked(() => {
317
+ if (this.filterModel()?.['value'] !== matchedOpt['value']) {
318
+ this.filterModel.set(matchedOpt);
319
+ }
320
+ });
321
+ }
322
+ }
323
+ else {
324
+ untracked(() => {
325
+ if (this.filterModel() !== null) {
326
+ this.filterModel.set(null);
327
+ }
328
+ });
329
+ }
330
+ });
331
+ }
332
+ /** Toggles filters overlay and initializes temporary state */
333
+ openFilters(event) {
334
+ const currentValues = this.filterValues();
335
+ // Copy current filter selections into temporary state
336
+ const copy = {};
337
+ for (const key of Object.keys(currentValues)) {
338
+ copy[key] = [...(currentValues[key] || [])];
339
+ }
340
+ this.tempFilterValues.set(copy);
341
+ if (this.isMobile()) {
342
+ this.showFilterDrawer.set(true);
343
+ }
344
+ else {
345
+ this.filterPopover()?.toggle(event);
346
+ }
347
+ }
348
+ /** Updates temporary filter values for a specific filter key */
349
+ onTempFilterChange(key, value) {
350
+ this.tempFilterValues.update(prev => ({ ...prev, [key]: value }));
351
+ }
352
+ /** Saves temporary filter selections and triggers apply */
353
+ applyFilters() {
354
+ const temp = this.tempFilterValues();
355
+ this.filterValues.set({ ...temp });
356
+ this.appliedFilters.emit({ ...temp });
357
+ if (this.isMobile()) {
358
+ this.showFilterDrawer.set(false);
359
+ }
360
+ else {
361
+ this.filterPopover()?.hide();
362
+ }
363
+ }
364
+ /** Clears temporary filters inside popover/drawer */
365
+ clearTempFilters() {
366
+ const cleared = {};
367
+ for (const filter of this.derivedFilters()) {
368
+ cleared[filter.key] = [];
369
+ }
370
+ this.tempFilterValues.set(cleared);
371
+ }
372
+ /** Clears all applied filters */
373
+ clearAllFilters() {
374
+ const cleared = {};
375
+ this.filterValues.set(cleared);
376
+ this.appliedFilters.emit(cleared);
377
+ }
378
+ /** Removes a single filter chip */
379
+ removeChip(chip) {
380
+ const currentValues = { ...this.filterValues() };
381
+ const list = currentValues[chip.filterKey] || [];
382
+ currentValues[chip.filterKey] = list.filter(item => item.code !== chip.code);
383
+ this.filterValues.set(currentValues);
384
+ this.appliedFilters.emit(currentValues);
385
+ }
386
+ /** Toggles sorting overlay */
387
+ openSort(event) {
388
+ if (this.isMobile()) {
389
+ this.tempSortValue.set(this.sortValue());
390
+ this.showSortDrawer.set(true);
391
+ }
392
+ else {
393
+ this.sortPopover()?.toggle(event);
394
+ }
395
+ }
396
+ /** Selects a sort option (toggles if already selected) and hides overlay */
397
+ selectSortOption(value, isMobileDrawer = false) {
398
+ const newValue = this.sortValue() === value ? null : value;
399
+ this.sortValue.set(newValue);
400
+ this.appliedSort.emit(newValue);
401
+ if (isMobileDrawer) {
402
+ this.showSortDrawer.set(false);
403
+ }
404
+ else {
405
+ this.sortPopover()?.hide();
406
+ }
144
407
  }
145
- /**
146
- * @method toggleSearchInput
147
- * @description
148
- * Toggles the visibility of the search input field.
149
- */
150
- toggleSearchInput() {
151
- this.showSearchInput.update(value => !value);
152
- this.searchModel.set('');
408
+ /** Toggles temporary sorting selection on mobile drawer */
409
+ toggleSortOptionMobile(value) {
410
+ this.tempSortValue.update(prev => prev === value ? null : value);
153
411
  }
154
- /**
155
- * @method toggleFilterSelect
156
- * @description
157
- * Toggles the visibility of the filter select dropdown.
158
- */
159
- toggleFilterSelect() {
160
- this.showFilterSelect.update(value => !value);
161
- this.filterModel.set(null);
412
+ /** Applies selected sorting on mobile */
413
+ applySortMobile() {
414
+ const val = this.tempSortValue();
415
+ this.sortValue.set(val);
416
+ this.appliedSort.emit(val);
417
+ this.showSortDrawer.set(false);
162
418
  }
163
- /**
164
- * @method onSelectedOption
165
- * @description
166
- * Handles filter select changes and updates the filterModel signal.
167
- *
168
- * @param value - Selected option value from tk-select
169
- */
170
- onSelectedOption(value) {
171
- this.filterModel.set(value);
419
+ /** Toggle layout view */
420
+ toggleView() {
421
+ this.view.set(this.view() === 'table' ? 'cards' : 'table');
172
422
  }
173
- /**
174
- * @method onReload
175
- * @description
176
- * Emits the reload event.
177
- */
178
423
  onReload() {
179
424
  this.reload.emit();
180
425
  }
181
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.3", ngImport: i0, type: ToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
182
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.3", type: ToolbarComponent, isStandalone: true, selector: "tk-toolbar", inputs: { searchModel: { classPropertyName: "searchModel", publicName: "searchModel", isSignal: true, isRequired: false, transformFunction: null }, filterModel: { classPropertyName: "filterModel", publicName: "filterModel", isSignal: true, isRequired: false, transformFunction: null }, filterOptions: { classPropertyName: "filterOptions", publicName: "filterOptions", isSignal: true, isRequired: false, transformFunction: null }, filterOptionLabel: { classPropertyName: "filterOptionLabel", publicName: "filterOptionLabel", isSignal: true, isRequired: false, transformFunction: null }, filterFloatLabel: { classPropertyName: "filterFloatLabel", publicName: "filterFloatLabel", isSignal: true, isRequired: false, transformFunction: null }, searchFloatLabel: { classPropertyName: "searchFloatLabel", publicName: "searchFloatLabel", isSignal: true, isRequired: false, transformFunction: null }, searchVisible: { classPropertyName: "searchVisible", publicName: "searchVisible", isSignal: true, isRequired: false, transformFunction: null }, filterVisible: { classPropertyName: "filterVisible", publicName: "filterVisible", isSignal: true, isRequired: false, transformFunction: null }, reloadVisible: { classPropertyName: "reloadVisible", publicName: "reloadVisible", isSignal: true, isRequired: false, transformFunction: null }, reloadInterval: { classPropertyName: "reloadInterval", publicName: "reloadInterval", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchModel: "searchModelChange", filterModel: "filterModelChange", reload: "reload" }, ngImport: i0, template: "<div class=\"toolbar\">\n @if (showSearchInput() && searchVisible()) {\n <div class=\"toolbar__input-container\">\n <tk-input-text\n [label]=\"searchFloatLabel()\"\n icon=\"magnifying-glass\"\n [clearable]=\"true\"\n [value]=\"searchModel()\"\n (valueChange)=\"searchModel.set($event)\">\n </tk-input-text>\n </div>\n }\n @if (showFilterSelect() && filterVisible()) {\n <div class=\"toolbar__input-container\">\n <tk-select\n [options]=\"filterOptions()\"\n [optionLabel]=\"filterOptionLabel()\"\n [label]=\"filterFloatLabel()\"\n (modelChange)=\"onSelectedOption($event ?? null)\">\n </tk-select>\n </div>\n }\n <div class=\"toolbar__buttons\">\n @if (searchVisible()) {\n <tk-button\n [icon]=\"'magnifying-glass'\"\n severity=\"secondary\"\n [variant]=\"!showSearchInput() ? 'outlined' : undefined\"\n (clicked)=\"toggleSearchInput()\">\n </tk-button>\n }\n @if (filterVisible()) {\n <tk-button\n [icon]=\"'filter'\"\n severity=\"secondary\"\n [variant]=\"!showFilterSelect() ? 'outlined' : undefined\"\n (clicked)=\"toggleFilterSelect()\">\n </tk-button>\n }\n @if (reloadVisible()) {\n <tk-button\n class=\"toolbar__reload-btn\"\n [class.toolbar__reload-btn--animating]=\"\n reloadInterval() && reloadInterval()! > 0 && !loading()\n \"\n [class.toolbar__reload-btn--spinning]=\"loading()\"\n [style.--reload-interval]=\"(reloadInterval() ?? 0) + 'ms'\"\n [icon]=\"'arrows-rotate'\"\n severity=\"secondary\"\n variant=\"outlined\"\n (clicked)=\"onReload()\">\n </tk-button>\n }\n </div>\n</div>\n", styles: [".toolbar{display:flex;justify-content:end;flex-wrap:wrap;gap:var(--tk-spacing-base-50, .5rem);row-gap:var(--tk-spacing-base-150, 1.5rem)}.toolbar__input-container{width:15rem}.toolbar__buttons{display:flex;gap:var(--tk-spacing-base-50, .5rem);margin-top:var(--tk-spacing-base-50, .5rem)}.toolbar__reload-btn{border-radius:var(--tk-borderRadius-s, 8px)!important;position:relative}.toolbar__reload-btn--animating:before{content:\"\";position:absolute;inset:-2px;background:conic-gradient(var(--tk-color-base-sky-300, #92bada) var(--progress, 0%),transparent var(--progress, 0%));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;padding:2px;border-radius:inherit;animation:draw-border var(--reload-interval, 5s) infinite linear;pointer-events:none}.toolbar__reload-btn--spinning ::ng-deep tk-icon{display:inline-block;animation:spin 1s infinite linear}@media(max-width:768px){.toolbar{justify-content:flex-start}}@property --progress{syntax: \"<percentage>\"; inherits: false; initial-value: 0%;}@keyframes draw-border{0%{--progress: 0%}to{--progress: 100%}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host ::ng-deep .tk-input-bottom{display:none}:host ::ng-deep .p-button-outlined{border:1px solid transparent!important}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "tk-button", inputs: ["label", "disabled", "type", "severity", "variant", "link", "icon", "iconPosition", "tooltipText", "size"], outputs: ["clicked"] }, { kind: "component", type: InputTextComponent, selector: "tk-input-text", inputs: ["value", "control", "label", "type", "id", "icon", "clearable", "errorMessage", "hint", "maxLength"], outputs: ["valueChange"] }, { kind: "component", type: SelectComponent, selector: "tk-select", inputs: ["id", "control", "options", "dataSource", "optionLabel", "label", "showClear", "disabled", "errorMessage", "hint", "filter", "placeholder", "loading", "fetchParams", "sortField", "sortOrder", "model", "emptyMessage", "emptyFilterMessage"], outputs: ["dataSourceChange", "modelChange", "filterChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
426
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
427
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: ToolbarComponent, isStandalone: true, selector: "tk-toolbar", inputs: { searchModel: { classPropertyName: "searchModel", publicName: "searchModel", isSignal: true, isRequired: false, transformFunction: null }, searchFloatLabel: { classPropertyName: "searchFloatLabel", publicName: "searchFloatLabel", isSignal: true, isRequired: false, transformFunction: null }, searchVisible: { classPropertyName: "searchVisible", publicName: "searchVisible", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, viewToggleVisible: { classPropertyName: "viewToggleVisible", publicName: "viewToggleVisible", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, filterModel: { classPropertyName: "filterModel", publicName: "filterModel", isSignal: true, isRequired: false, transformFunction: null }, filterOptions: { classPropertyName: "filterOptions", publicName: "filterOptions", isSignal: true, isRequired: false, transformFunction: null }, filterOptionLabel: { classPropertyName: "filterOptionLabel", publicName: "filterOptionLabel", isSignal: true, isRequired: false, transformFunction: null }, filterFloatLabel: { classPropertyName: "filterFloatLabel", publicName: "filterFloatLabel", isSignal: true, isRequired: false, transformFunction: null }, filterVisible: { classPropertyName: "filterVisible", publicName: "filterVisible", isSignal: true, isRequired: false, transformFunction: null }, filterValues: { classPropertyName: "filterValues", publicName: "filterValues", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, deleteLabel: { classPropertyName: "deleteLabel", publicName: "deleteLabel", isSignal: true, isRequired: false, transformFunction: null }, filterLabel: { classPropertyName: "filterLabel", publicName: "filterLabel", isSignal: true, isRequired: false, transformFunction: null }, selectedLabel: { classPropertyName: "selectedLabel", publicName: "selectedLabel", isSignal: true, isRequired: false, transformFunction: null }, selectedPluralLabel: { classPropertyName: "selectedPluralLabel", publicName: "selectedPluralLabel", isSignal: true, isRequired: false, transformFunction: null }, applyLabel: { classPropertyName: "applyLabel", publicName: "applyLabel", isSignal: true, isRequired: false, transformFunction: null }, reloadTooltip: { classPropertyName: "reloadTooltip", publicName: "reloadTooltip", isSignal: true, isRequired: false, transformFunction: null }, sortTooltip: { classPropertyName: "sortTooltip", publicName: "sortTooltip", isSignal: true, isRequired: false, transformFunction: null }, viewCardsTooltip: { classPropertyName: "viewCardsTooltip", publicName: "viewCardsTooltip", isSignal: true, isRequired: false, transformFunction: null }, viewTableTooltip: { classPropertyName: "viewTableTooltip", publicName: "viewTableTooltip", isSignal: true, isRequired: false, transformFunction: null }, sortOptions: { classPropertyName: "sortOptions", publicName: "sortOptions", isSignal: true, isRequired: false, transformFunction: null }, sortLabel: { classPropertyName: "sortLabel", publicName: "sortLabel", isSignal: true, isRequired: false, transformFunction: null }, sortValue: { classPropertyName: "sortValue", publicName: "sortValue", isSignal: true, isRequired: false, transformFunction: null }, reloadVisible: { classPropertyName: "reloadVisible", publicName: "reloadVisible", isSignal: true, isRequired: false, transformFunction: null }, reloadInterval: { classPropertyName: "reloadInterval", publicName: "reloadInterval", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, globalActions: { classPropertyName: "globalActions", publicName: "globalActions", isSignal: true, isRequired: false, transformFunction: null }, selectionCount: { classPropertyName: "selectionCount", publicName: "selectionCount", isSignal: true, isRequired: false, transformFunction: null }, allSelected: { classPropertyName: "allSelected", publicName: "allSelected", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, selectionActions: { classPropertyName: "selectionActions", publicName: "selectionActions", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleSelectionActions: { classPropertyName: "maxVisibleSelectionActions", publicName: "maxVisibleSelectionActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchModel: "searchModelChange", view: "viewChange", filterModel: "filterModelChange", filterValues: "filterValuesChange", sortValue: "sortValueChange", allSelected: "allSelectedChange", indeterminate: "indeterminateChange", reload: "reload", appliedFilters: "appliedFilters", appliedSort: "appliedSort" }, viewQueries: [{ propertyName: "filterPopover", first: true, predicate: ["filterPopover"], descendants: true, isSignal: true }, { propertyName: "sortPopover", first: true, predicate: ["sortPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"tk-toolbar-container\">\n <!-- 1. Selection Status Bar (Desktop replacement) -->\n @if (selectionCount() > 0 && !isMobile()) {\n <div class=\"tk-toolbar-selection-bar\" data-testid=\"selection-bar-desktop\">\n <div class=\"tk-toolbar-selection-bar__left\">\n <tk-checkbox\n [binary]=\"true\"\n [(model)]=\"allSelected\"\n [indeterminate]=\"indeterminate()\">\n </tk-checkbox>\n <span class=\"tk-toolbar-selection-bar__count\">\n {{ selectionCount() }} {{ selectionCount() === 1 ? selectedLabel() : selectedPluralLabel() }}\n </span>\n </div>\n <div class=\"tk-toolbar-selection-bar__right\">\n @for (action of visibleSelectionActions(); track action.label) {\n <tk-button\n [label]=\"action.label\"\n [icon]=\"action.icon\"\n [severity]=\"action.severity ?? 'secondary'\"\n [variant]=\"action.variant !== undefined ? action.variant : (action.severity === 'danger' ? undefined : 'text')\"\n [disabled]=\"action.disabled ?? false\"\n (clicked)=\"action.action()\">\n </tk-button>\n }\n @if (overflowSelectionActions().length > 0) {\n <tk-dropdown\n icon=\"ellipsis-vertical\"\n [model]=\"overflowSelectionActions()\">\n </tk-dropdown>\n }\n </div>\n </div>\n } @else {\n <!-- 2. Main Tools Bar -->\n <div class=\"tk-toolbar\" data-testid=\"main-toolbar\">\n <!-- Left part: search input (always visible if searchVisible is true) -->\n @if (searchVisible()) {\n <div class=\"tk-toolbar__search\">\n <tk-input-text\n [label]=\"searchFloatLabel()\"\n icon=\"magnifying-glass\"\n [clearable]=\"true\"\n [value]=\"searchModel()\"\n (valueChange)=\"searchModel.set($event)\">\n </tk-input-text>\n </div>\n }\n\n <!-- Right part: actions -->\n <div class=\"tk-toolbar__actions\">\n @if (viewToggleVisible()) {\n <tk-button\n [icon]=\"view() === 'table' ? 'table' : 'table-list'\"\n severity=\"secondary\"\n variant=\"text\"\n [tooltipText]=\"view() === 'table' ? viewCardsTooltip() : viewTableTooltip()\"\n (clicked)=\"toggleView()\">\n </tk-button>\n }\n\n @if (derivedFilters().length > 0 && filterVisible()) {\n <tk-button\n #filterBtn\n [icon]=\"'filter'\"\n [severity]=\"hasActiveFilters() ? 'primary' : 'secondary'\"\n [variant]=\"hasActiveFilters() ? undefined : 'text'\"\n [tooltipText]=\"filterLabel()\"\n (click)=\"openFilters($event)\"\n (keydown.enter)=\"openFilters($event)\"\n (keydown.space)=\"openFilters($event)\">\n </tk-button>\n }\n\n @if (sortOptions().length > 0) {\n <tk-button\n #sortBtn\n [icon]=\"'arrow-down-wide-short'\"\n [severity]=\"hasActiveSort() ? 'primary' : 'secondary'\"\n [variant]=\"hasActiveSort() ? undefined : 'text'\"\n [tooltipText]=\"sortTooltip()\"\n (click)=\"openSort($event)\"\n (keydown.enter)=\"openSort($event)\"\n (keydown.space)=\"openSort($event)\">\n </tk-button>\n }\n\n @if (shouldShowReload()) {\n <tk-button\n class=\"tk-toolbar__reload-btn\"\n [class.tk-toolbar__reload-btn--animating]=\"\n reloadInterval() && reloadInterval()! > 0 && !loading()\n \"\n [class.tk-toolbar__reload-btn--spinning]=\"loading()\"\n [style.--reload-interval]=\"(reloadInterval() ?? 0) + 'ms'\"\n [icon]=\"'arrows-rotate'\"\n severity=\"secondary\"\n variant=\"text\"\n [tooltipText]=\"reloadTooltip()\"\n (clicked)=\"onReload()\">\n </tk-button>\n }\n\n @if (globalActions().length > 0) {\n <tk-action-group\n [actions]=\"globalActions()\"\n [maxVisible]=\"0\">\n </tk-action-group>\n }\n </div>\n </div>\n }\n\n @if (shouldShowActiveFiltersBar()) {\n <div class=\"tk-toolbar-chips-bar\" data-testid=\"chips-bar\">\n <div class=\"tk-toolbar-chips-bar__scroll\">\n @for (chip of activeChips(); track chip.filterKey + '-' + chip.code) {\n <tk-chip\n [label]=\"chip.label\"\n [removable]=\"true\"\n (removed)=\"removeChip(chip)\">\n </tk-chip>\n }\n </div>\n <tk-button\n [link]=\"true\"\n [label]=\"clearLabel()\"\n class=\"tk-toolbar-chips-bar__clear-btn\"\n (clicked)=\"clearAllFilters()\">\n </tk-button>\n </div>\n }\n\n <!-- 4. Selection Status Bar (Mobile floating panel) -->\n @if (selectionCount() > 0 && isMobile()) {\n <div class=\"tk-toolbar-selection-bar tk-toolbar-selection-bar--mobile\" data-testid=\"selection-bar-mobile\">\n <div class=\"tk-toolbar-selection-bar__left\">\n <tk-checkbox\n [binary]=\"true\"\n [(model)]=\"allSelected\"\n [indeterminate]=\"indeterminate()\">\n </tk-checkbox>\n <span class=\"tk-toolbar-selection-bar__count\">\n {{ selectionCount() }} {{ selectionCount() === 1 ? selectedLabel() : selectedPluralLabel() }}\n </span>\n </div>\n <div class=\"tk-toolbar-selection-bar__right\">\n @for (action of visibleSelectionActions(); track action.label) {\n <tk-button\n [label]=\"action.label\"\n [icon]=\"action.icon\"\n [severity]=\"action.severity ?? 'secondary'\"\n [variant]=\"action.variant !== undefined ? action.variant : (action.severity === 'danger' ? undefined : 'text')\"\n [disabled]=\"action.disabled ?? false\"\n (clicked)=\"action.action()\">\n </tk-button>\n }\n @if (overflowSelectionActions().length > 0) {\n <tk-dropdown\n icon=\"ellipsis-vertical\"\n [model]=\"overflowSelectionActions()\">\n </tk-dropdown>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- 5. Desktop Popovers -->\n@if (derivedFilters().length > 0 && filterVisible() && !isMobile()) {\n <p-popover #filterPopover styleClass=\"tk-toolbar-popover\">\n <div class=\"tk-toolbar-overlay\" data-testid=\"filter-popover\">\n <div class=\"tk-toolbar-overlay__header\">\n <span class=\"tk-toolbar-overlay__title\">{{ filterLabel() }}</span>\n <button type=\"button\" class=\"tk-toolbar-overlay__close\" (click)=\"filterPopover.hide()\">\n <tk-icon icon=\"xmark\" size=\"lg\"></tk-icon>\n </button>\n </div>\n <div class=\"tk-toolbar-overlay__body\">\n @for (filter of derivedFilters(); track filter.key) {\n <div class=\"tk-toolbar-overlay__field\">\n <tk-multiselect\n [id]=\"'filter-' + filter.key\"\n [options]=\"filter.options\"\n [labelText]=\"filter.label\"\n [model]=\"tempFilterValues()[filter.key] || []\"\n (modelChange)=\"onTempFilterChange(filter.key, $event || [])\"\n appendTo=\"body\"\n panelStyleClass=\"tk-toolbar-multiselect-panel\">\n </tk-multiselect>\n </div>\n }\n </div>\n <div class=\"tk-toolbar-overlay__footer\">\n <tk-button\n [label]=\"clearLabel()\"\n severity=\"secondary\"\n variant=\"outlined\"\n (clicked)=\"clearTempFilters()\">\n </tk-button>\n <tk-button\n [label]=\"applyLabel()\"\n severity=\"primary\"\n (clicked)=\"applyFilters()\">\n </tk-button>\n </div>\n </div>\n </p-popover>\n}\n\n@if (sortOptions().length > 0 && !isMobile()) {\n <p-popover #sortPopover styleClass=\"tk-toolbar-popover\">\n <div class=\"tk-toolbar-overlay tk-toolbar-overlay--sort\" data-testid=\"sort-popover\">\n <div class=\"tk-toolbar-overlay__header\">\n <span class=\"tk-toolbar-overlay__title\">{{ sortLabel() }}</span>\n <button type=\"button\" class=\"tk-toolbar-overlay__close\" (click)=\"sortPopover.hide()\">\n <tk-icon icon=\"xmark\" size=\"lg\"></tk-icon>\n </button>\n </div>\n <div class=\"tk-toolbar-overlay__body\">\n <div class=\"tk-toolbar-sort-options\">\n @for (option of sortOptions(); track option.value) {\n <button \n type=\"button\"\n class=\"tk-toolbar-sort-option\" \n [class.tk-toolbar-sort-option--active]=\"sortValue() === option.value\"\n (click)=\"selectSortOption(option.value)\">\n <span>{{ option.label }}</span>\n </button>\n }\n </div>\n </div>\n </div>\n </p-popover>\n}\n\n<!-- 6. Mobile Drawers -->\n@if (derivedFilters().length > 0 && filterVisible() && isMobile()) {\n <tk-drawer\n [(isOpened)]=\"showFilterDrawer\"\n [title]=\"filterLabel()\"\n direction=\"bottom\"\n [dismissible]=\"true\">\n <div class=\"tk-toolbar-overlay__body\">\n @for (filter of derivedFilters(); track filter.key) {\n <div class=\"tk-toolbar-overlay__field\">\n <tk-multiselect\n [id]=\"'filter-mob-' + filter.key\"\n [options]=\"filter.options\"\n [labelText]=\"filter.label\"\n [model]=\"tempFilterValues()[filter.key] || []\"\n (modelChange)=\"onTempFilterChange(filter.key, $event || [])\"\n appendTo=\"body\"\n panelStyleClass=\"tk-toolbar-multiselect-panel\">\n </tk-multiselect>\n </div>\n }\n </div>\n <div class=\"tk-toolbar-overlay__footer\">\n <tk-button\n [label]=\"clearLabel()\"\n severity=\"secondary\"\n variant=\"outlined\"\n (clicked)=\"clearTempFilters()\">\n </tk-button>\n <tk-button\n [label]=\"applyLabel()\"\n severity=\"primary\"\n (clicked)=\"applyFilters()\">\n </tk-button>\n </div>\n </tk-drawer>\n}\n\n@if (sortOptions().length > 0 && isMobile()) {\n <tk-drawer\n [(isOpened)]=\"showSortDrawer\"\n [title]=\"sortLabel()\"\n direction=\"bottom\"\n [dismissible]=\"true\">\n <div class=\"tk-toolbar-overlay__body\">\n <div class=\"tk-toolbar-sort-options\">\n @for (option of sortOptions(); track option.value) {\n <button \n type=\"button\"\n class=\"tk-toolbar-sort-option\" \n [class.tk-toolbar-sort-option--active]=\"tempSortValue() === option.value\"\n (click)=\"toggleSortOptionMobile(option.value)\">\n <span>{{ option.label }}</span>\n </button>\n }\n </div>\n </div>\n <div class=\"tk-toolbar-overlay__footer\">\n <tk-button\n [label]=\"applyLabel()\"\n severity=\"primary\"\n (clicked)=\"applySortMobile()\">\n </tk-button>\n </div>\n </tk-drawer>\n}\n", styles: [".tk-toolbar-container{display:flex;flex-direction:column;gap:var(--tk-spacing-base-50, .5rem);width:100%}.tk-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:var(--tk-spacing-base-100, 1rem);width:100%}.tk-toolbar__search{width:15rem;max-width:100%}@media(max-width:768px){.tk-toolbar__search{width:100%}}.tk-toolbar__actions{display:flex;align-items:center;gap:var(--tk-spacing-base-50, .5rem)}.tk-toolbar__actions>tk-button{width:2.5rem;height:2.5rem}.tk-toolbar__actions>tk-button ::ng-deep .p-button{width:100%;height:100%;padding:0;display:flex;align-items:center;justify-content:center}.tk-toolbar__reload-btn{border-radius:var(--tk-borderRadius-s, 8px);position:relative}.tk-toolbar__reload-btn--animating:before{content:\"\";position:absolute;inset:0;z-index:1;background:conic-gradient(var(--tk-color-base-sky-300, #92bada) var(--progress, 0%),transparent var(--progress, 0%));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;padding:3px;border-radius:inherit;animation:draw-border var(--reload-interval, 5s) infinite linear;pointer-events:none}.tk-toolbar__reload-btn--spinning ::ng-deep tk-icon{display:inline-block;animation:spin 1s infinite linear}.tk-toolbar-selection-bar{display:flex;justify-content:space-between;align-items:center;width:100%;background-color:var(--tk-color-base-surface-50, #f8fafc);border:1px solid var(--tk-color-base-surface-200, #e2e8f0);border-radius:var(--tk-borderRadius-s, 8px);padding:var(--tk-spacing-base-75, .75rem) var(--tk-spacing-base-100, 1rem);box-sizing:border-box}.tk-toolbar-selection-bar__left{display:flex;align-items:center;gap:var(--tk-spacing-base-75, .75rem)}.tk-toolbar-selection-bar__count{font-size:1rem;font-weight:var(--tk-font-weight-600, 600);color:var(--tk-color-base-surface-900, #0f172a)}.tk-toolbar-selection-bar__right{display:flex;align-items:center;gap:var(--tk-spacing-base-50, .5rem)}.tk-toolbar-selection-bar--mobile{position:fixed;bottom:0;left:0;width:100%;max-width:none;transform:none;z-index:1000;background-color:var(--tk-color-base-surface-0, #ffffff);box-shadow:0 -4px 6px -1px #0000000d,0 -2px 4px -1px #00000008;border-radius:0;border:none;border-top:1px solid var(--tk-color-base-surface-200, #e2e8f0);padding:var(--tk-spacing-base-75, .75rem) var(--tk-spacing-base-100, 1rem)}.tk-toolbar-chips-bar{width:100%;border-top:none;padding-top:var(--tk-spacing-base-50, .5rem);display:flex;justify-content:space-between;align-items:center;gap:var(--tk-spacing-base-100, 1rem)}.tk-toolbar-chips-bar__scroll{display:flex;align-items:center;flex-wrap:wrap;gap:var(--tk-spacing-base-50, .5rem);flex-grow:1}.tk-toolbar-chips-bar__clear-btn{flex-shrink:0}.tk-toolbar-overlay{display:flex;flex-direction:column;width:20rem;max-width:100%;padding:var(--tk-spacing-base-100, 1rem);box-sizing:border-box}.tk-toolbar-overlay--sort{width:15rem;padding:var(--tk-spacing-base-50, .5rem)!important}.tk-toolbar-overlay--sort .tk-toolbar-overlay__header{padding:var(--tk-spacing-base-50, .5rem) var(--tk-spacing-base-50, .5rem) var(--tk-spacing-base-25, .25rem) var(--tk-spacing-base-50, .5rem)!important}.tk-toolbar-overlay--sort .tk-toolbar-overlay__body{padding:0!important;margin-bottom:0!important}.tk-toolbar-overlay__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:0;padding:0 0 var(--tk-spacing-base-50, .5rem) 0}.tk-toolbar-overlay__title{font-size:1rem;font-weight:var(--tk-font-weight-600, 600);color:var(--tk-color-base-surface-900, #0f172a)}.tk-toolbar-overlay__close{background:none;border:none;padding:var(--tk-spacing-base-25, .25rem);color:var(--tk-color-base-surface-500, #64748b);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--tk-borderRadius-s, 8px);transition:background-color .2s}.tk-toolbar-overlay__close:hover{background-color:var(--tk-color-base-surface-100, #f1f5f9);color:var(--tk-color-base-surface-900, #0f172a)}.tk-toolbar-overlay__body{display:flex;flex-direction:column;gap:var(--tk-spacing-base-100, 1rem);padding-top:var(--tk-spacing-base-125, 1.25rem);margin-bottom:var(--tk-spacing-base-150, 1.5rem);max-height:24rem;overflow-y:auto}.tk-toolbar-overlay__field{display:flex;flex-direction:column;gap:var(--tk-spacing-base-25, .25rem)}.tk-toolbar-overlay__footer{display:flex;justify-content:flex-end;gap:var(--tk-spacing-base-50, .5rem);padding-top:var(--tk-spacing-base-100, 1rem)}.tk-toolbar-sort-options{display:flex;flex-direction:column;width:100%}.tk-toolbar-sort-option{display:flex;justify-content:space-between;align-items:center;padding:var(--tk-spacing-base-50, .5rem) var(--tk-spacing-base-50, .5rem);cursor:pointer;border-radius:var(--tk-borderRadius-s, 8px);font-size:.875rem;color:var(--tk-color-base-surface-700, #334155);transition:background-color .2s,color .2s;background:none;border:none;width:100%;font-family:inherit;text-align:left}.tk-toolbar-sort-option:hover{background-color:var(--tk-color-primary-muted, #e9e6f4);color:var(--tk-color-base-primary-500, #16006f)}.tk-toolbar-sort-option--active{font-weight:var(--tk-font-weight-600, 600);color:var(--tk-color-base-primary-500, #16006f);background-color:var(--tk-color-primary-muted, #e9e6f4)}@media(max-width:768px){.tk-toolbar{flex-direction:column;align-items:stretch;gap:var(--tk-spacing-base-50, .5rem)}.tk-toolbar__search{width:100%}.tk-toolbar__actions{width:100%;justify-content:flex-end;margin-left:0}}@property --progress{syntax: \"<percentage>\"; inherits: false; initial-value: 0%;}@keyframes draw-border{0%{--progress: 0%}to{--progress: 100%}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host ::ng-deep .tk-input-bottom{display:none}:host ::ng-deep .p-popover{border-radius:var(--tk-borderRadius-m, 12px);box-shadow:0 10px 15px -3px #0000001a;border:1px solid var(--tk-color-base-surface-200, #e2e8f0);overflow:hidden}:host ::ng-deep .tk-toolbar-popover .p-popover-content{padding:0!important}:host ::ng-deep tk-drawer .tk-toolbar-overlay__body{padding-top:var(--tk-spacing-base-75, .75rem)!important;margin-bottom:0!important}:host ::ng-deep tk-drawer .tk-toolbar-overlay__footer{padding-top:var(--tk-spacing-base-75, .75rem)!important}::ng-deep .tk-toolbar-multiselect-panel .p-multiselect-option span{color:var(--tk-color-primary-default, #16006f);display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .tk-toolbar-multiselect-panel .p-multiselect-option-selected{background-color:var(--tk-color-primary-muted, #b7b0d2)}::ng-deep .tk-toolbar-multiselect-panel .p-multiselect-filter{border:none;border-radius:0;box-shadow:none;border-bottom:1px solid var(--tk-surface-300, #d2d2d2)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "tk-button", inputs: ["label", "disabled", "type", "severity", "variant", "link", "icon", "iconPosition", "tooltipText", "size"], outputs: ["clicked"] }, { kind: "component", type: InputTextComponent, selector: "tk-input-text", inputs: ["value", "control", "label", "type", "id", "icon", "clearable", "errorMessage", "hint", "maxLength"], outputs: ["valueChange"] }, { kind: "component", type: CheckboxComponent, selector: "tk-checkbox", inputs: ["model", "value", "label", "name", "inputId", "binary", "control", "errorMessage", "indeterminate", "disabled"], outputs: ["modelChange", "indeterminateChange", "disabledChange"] }, { kind: "component", type: ActionGroupComponent, selector: "tk-action-group", inputs: ["actions", "maxVisible", "disabled"] }, { kind: "component", type: IconComponent, selector: "tk-icon", inputs: ["icon", "styleIcon", "color", "size", "disabled"] }, { kind: "component", type: DropdownComponent, selector: "tk-dropdown", inputs: ["model", "icon", "label", "iconPosition", "size", "disabled", "tooltip", "tooltipPosition"] }, { kind: "component", type: MultiselectComponent, selector: "tk-multiselect", inputs: ["model", "dataSource", "options", "labelText", "display", "maxSelectedLabels", "selectedItemsLabel", "emptyFilterMessage", "filter", "filterPlaceHolder", "appendTo", "panelStyleClass", "id", "styleClass", "errorMessage", "hint", "loading", "emptyMessage", "fetchParams", "sortField", "sortOrder", "disabled"], outputs: ["modelChange", "dataSourceChange", "selectionChange", "filterChange"] }, { kind: "component", type: ChipComponent, selector: "tk-chip", inputs: ["label", "icon", "removable", "removeIcon"], outputs: ["removed"] }, { kind: "component", type: DrawerComponent, selector: "tk-drawer", inputs: ["dialogRef", "title", "content", "headerAction", "tag", "subtle", "hasTabs", "size", "direction", "closable", "dismissible", "data", "interceptor", "isOpened"], outputs: ["isOpenedChange", "closed"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i1.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
183
428
  }
184
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.3", ngImport: i0, type: ToolbarComponent, decorators: [{
429
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ToolbarComponent, decorators: [{
185
430
  type: Component,
186
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'tk-toolbar', imports: [ButtonComponent, InputTextComponent, SelectComponent], template: "<div class=\"toolbar\">\n @if (showSearchInput() && searchVisible()) {\n <div class=\"toolbar__input-container\">\n <tk-input-text\n [label]=\"searchFloatLabel()\"\n icon=\"magnifying-glass\"\n [clearable]=\"true\"\n [value]=\"searchModel()\"\n (valueChange)=\"searchModel.set($event)\">\n </tk-input-text>\n </div>\n }\n @if (showFilterSelect() && filterVisible()) {\n <div class=\"toolbar__input-container\">\n <tk-select\n [options]=\"filterOptions()\"\n [optionLabel]=\"filterOptionLabel()\"\n [label]=\"filterFloatLabel()\"\n (modelChange)=\"onSelectedOption($event ?? null)\">\n </tk-select>\n </div>\n }\n <div class=\"toolbar__buttons\">\n @if (searchVisible()) {\n <tk-button\n [icon]=\"'magnifying-glass'\"\n severity=\"secondary\"\n [variant]=\"!showSearchInput() ? 'outlined' : undefined\"\n (clicked)=\"toggleSearchInput()\">\n </tk-button>\n }\n @if (filterVisible()) {\n <tk-button\n [icon]=\"'filter'\"\n severity=\"secondary\"\n [variant]=\"!showFilterSelect() ? 'outlined' : undefined\"\n (clicked)=\"toggleFilterSelect()\">\n </tk-button>\n }\n @if (reloadVisible()) {\n <tk-button\n class=\"toolbar__reload-btn\"\n [class.toolbar__reload-btn--animating]=\"\n reloadInterval() && reloadInterval()! > 0 && !loading()\n \"\n [class.toolbar__reload-btn--spinning]=\"loading()\"\n [style.--reload-interval]=\"(reloadInterval() ?? 0) + 'ms'\"\n [icon]=\"'arrows-rotate'\"\n severity=\"secondary\"\n variant=\"outlined\"\n (clicked)=\"onReload()\">\n </tk-button>\n }\n </div>\n</div>\n", styles: [".toolbar{display:flex;justify-content:end;flex-wrap:wrap;gap:var(--tk-spacing-base-50, .5rem);row-gap:var(--tk-spacing-base-150, 1.5rem)}.toolbar__input-container{width:15rem}.toolbar__buttons{display:flex;gap:var(--tk-spacing-base-50, .5rem);margin-top:var(--tk-spacing-base-50, .5rem)}.toolbar__reload-btn{border-radius:var(--tk-borderRadius-s, 8px)!important;position:relative}.toolbar__reload-btn--animating:before{content:\"\";position:absolute;inset:-2px;background:conic-gradient(var(--tk-color-base-sky-300, #92bada) var(--progress, 0%),transparent var(--progress, 0%));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;padding:2px;border-radius:inherit;animation:draw-border var(--reload-interval, 5s) infinite linear;pointer-events:none}.toolbar__reload-btn--spinning ::ng-deep tk-icon{display:inline-block;animation:spin 1s infinite linear}@media(max-width:768px){.toolbar{justify-content:flex-start}}@property --progress{syntax: \"<percentage>\"; inherits: false; initial-value: 0%;}@keyframes draw-border{0%{--progress: 0%}to{--progress: 100%}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host ::ng-deep .tk-input-bottom{display:none}:host ::ng-deep .p-button-outlined{border:1px solid transparent!important}\n"] }]
187
- }], ctorParameters: () => [], propDecorators: { searchModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchModel", required: false }] }, { type: i0.Output, args: ["searchModelChange"] }], filterModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterModel", required: false }] }, { type: i0.Output, args: ["filterModelChange"] }], filterOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterOptions", required: false }] }], filterOptionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterOptionLabel", required: false }] }], filterFloatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterFloatLabel", required: false }] }], searchFloatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchFloatLabel", required: false }] }], searchVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchVisible", required: false }] }], filterVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterVisible", required: false }] }], reloadVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "reloadVisible", required: false }] }], reloadInterval: [{ type: i0.Input, args: [{ isSignal: true, alias: "reloadInterval", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], reload: [{ type: i0.Output, args: ["reload"] }] } });
431
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'tk-toolbar', imports: [
432
+ ButtonComponent,
433
+ InputTextComponent,
434
+ CheckboxComponent,
435
+ ActionGroupComponent,
436
+ IconComponent,
437
+ DropdownComponent,
438
+ MultiselectComponent,
439
+ ChipComponent,
440
+ DrawerComponent,
441
+ PopoverModule,
442
+ ], template: "<div class=\"tk-toolbar-container\">\n <!-- 1. Selection Status Bar (Desktop replacement) -->\n @if (selectionCount() > 0 && !isMobile()) {\n <div class=\"tk-toolbar-selection-bar\" data-testid=\"selection-bar-desktop\">\n <div class=\"tk-toolbar-selection-bar__left\">\n <tk-checkbox\n [binary]=\"true\"\n [(model)]=\"allSelected\"\n [indeterminate]=\"indeterminate()\">\n </tk-checkbox>\n <span class=\"tk-toolbar-selection-bar__count\">\n {{ selectionCount() }} {{ selectionCount() === 1 ? selectedLabel() : selectedPluralLabel() }}\n </span>\n </div>\n <div class=\"tk-toolbar-selection-bar__right\">\n @for (action of visibleSelectionActions(); track action.label) {\n <tk-button\n [label]=\"action.label\"\n [icon]=\"action.icon\"\n [severity]=\"action.severity ?? 'secondary'\"\n [variant]=\"action.variant !== undefined ? action.variant : (action.severity === 'danger' ? undefined : 'text')\"\n [disabled]=\"action.disabled ?? false\"\n (clicked)=\"action.action()\">\n </tk-button>\n }\n @if (overflowSelectionActions().length > 0) {\n <tk-dropdown\n icon=\"ellipsis-vertical\"\n [model]=\"overflowSelectionActions()\">\n </tk-dropdown>\n }\n </div>\n </div>\n } @else {\n <!-- 2. Main Tools Bar -->\n <div class=\"tk-toolbar\" data-testid=\"main-toolbar\">\n <!-- Left part: search input (always visible if searchVisible is true) -->\n @if (searchVisible()) {\n <div class=\"tk-toolbar__search\">\n <tk-input-text\n [label]=\"searchFloatLabel()\"\n icon=\"magnifying-glass\"\n [clearable]=\"true\"\n [value]=\"searchModel()\"\n (valueChange)=\"searchModel.set($event)\">\n </tk-input-text>\n </div>\n }\n\n <!-- Right part: actions -->\n <div class=\"tk-toolbar__actions\">\n @if (viewToggleVisible()) {\n <tk-button\n [icon]=\"view() === 'table' ? 'table' : 'table-list'\"\n severity=\"secondary\"\n variant=\"text\"\n [tooltipText]=\"view() === 'table' ? viewCardsTooltip() : viewTableTooltip()\"\n (clicked)=\"toggleView()\">\n </tk-button>\n }\n\n @if (derivedFilters().length > 0 && filterVisible()) {\n <tk-button\n #filterBtn\n [icon]=\"'filter'\"\n [severity]=\"hasActiveFilters() ? 'primary' : 'secondary'\"\n [variant]=\"hasActiveFilters() ? undefined : 'text'\"\n [tooltipText]=\"filterLabel()\"\n (click)=\"openFilters($event)\"\n (keydown.enter)=\"openFilters($event)\"\n (keydown.space)=\"openFilters($event)\">\n </tk-button>\n }\n\n @if (sortOptions().length > 0) {\n <tk-button\n #sortBtn\n [icon]=\"'arrow-down-wide-short'\"\n [severity]=\"hasActiveSort() ? 'primary' : 'secondary'\"\n [variant]=\"hasActiveSort() ? undefined : 'text'\"\n [tooltipText]=\"sortTooltip()\"\n (click)=\"openSort($event)\"\n (keydown.enter)=\"openSort($event)\"\n (keydown.space)=\"openSort($event)\">\n </tk-button>\n }\n\n @if (shouldShowReload()) {\n <tk-button\n class=\"tk-toolbar__reload-btn\"\n [class.tk-toolbar__reload-btn--animating]=\"\n reloadInterval() && reloadInterval()! > 0 && !loading()\n \"\n [class.tk-toolbar__reload-btn--spinning]=\"loading()\"\n [style.--reload-interval]=\"(reloadInterval() ?? 0) + 'ms'\"\n [icon]=\"'arrows-rotate'\"\n severity=\"secondary\"\n variant=\"text\"\n [tooltipText]=\"reloadTooltip()\"\n (clicked)=\"onReload()\">\n </tk-button>\n }\n\n @if (globalActions().length > 0) {\n <tk-action-group\n [actions]=\"globalActions()\"\n [maxVisible]=\"0\">\n </tk-action-group>\n }\n </div>\n </div>\n }\n\n @if (shouldShowActiveFiltersBar()) {\n <div class=\"tk-toolbar-chips-bar\" data-testid=\"chips-bar\">\n <div class=\"tk-toolbar-chips-bar__scroll\">\n @for (chip of activeChips(); track chip.filterKey + '-' + chip.code) {\n <tk-chip\n [label]=\"chip.label\"\n [removable]=\"true\"\n (removed)=\"removeChip(chip)\">\n </tk-chip>\n }\n </div>\n <tk-button\n [link]=\"true\"\n [label]=\"clearLabel()\"\n class=\"tk-toolbar-chips-bar__clear-btn\"\n (clicked)=\"clearAllFilters()\">\n </tk-button>\n </div>\n }\n\n <!-- 4. Selection Status Bar (Mobile floating panel) -->\n @if (selectionCount() > 0 && isMobile()) {\n <div class=\"tk-toolbar-selection-bar tk-toolbar-selection-bar--mobile\" data-testid=\"selection-bar-mobile\">\n <div class=\"tk-toolbar-selection-bar__left\">\n <tk-checkbox\n [binary]=\"true\"\n [(model)]=\"allSelected\"\n [indeterminate]=\"indeterminate()\">\n </tk-checkbox>\n <span class=\"tk-toolbar-selection-bar__count\">\n {{ selectionCount() }} {{ selectionCount() === 1 ? selectedLabel() : selectedPluralLabel() }}\n </span>\n </div>\n <div class=\"tk-toolbar-selection-bar__right\">\n @for (action of visibleSelectionActions(); track action.label) {\n <tk-button\n [label]=\"action.label\"\n [icon]=\"action.icon\"\n [severity]=\"action.severity ?? 'secondary'\"\n [variant]=\"action.variant !== undefined ? action.variant : (action.severity === 'danger' ? undefined : 'text')\"\n [disabled]=\"action.disabled ?? false\"\n (clicked)=\"action.action()\">\n </tk-button>\n }\n @if (overflowSelectionActions().length > 0) {\n <tk-dropdown\n icon=\"ellipsis-vertical\"\n [model]=\"overflowSelectionActions()\">\n </tk-dropdown>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- 5. Desktop Popovers -->\n@if (derivedFilters().length > 0 && filterVisible() && !isMobile()) {\n <p-popover #filterPopover styleClass=\"tk-toolbar-popover\">\n <div class=\"tk-toolbar-overlay\" data-testid=\"filter-popover\">\n <div class=\"tk-toolbar-overlay__header\">\n <span class=\"tk-toolbar-overlay__title\">{{ filterLabel() }}</span>\n <button type=\"button\" class=\"tk-toolbar-overlay__close\" (click)=\"filterPopover.hide()\">\n <tk-icon icon=\"xmark\" size=\"lg\"></tk-icon>\n </button>\n </div>\n <div class=\"tk-toolbar-overlay__body\">\n @for (filter of derivedFilters(); track filter.key) {\n <div class=\"tk-toolbar-overlay__field\">\n <tk-multiselect\n [id]=\"'filter-' + filter.key\"\n [options]=\"filter.options\"\n [labelText]=\"filter.label\"\n [model]=\"tempFilterValues()[filter.key] || []\"\n (modelChange)=\"onTempFilterChange(filter.key, $event || [])\"\n appendTo=\"body\"\n panelStyleClass=\"tk-toolbar-multiselect-panel\">\n </tk-multiselect>\n </div>\n }\n </div>\n <div class=\"tk-toolbar-overlay__footer\">\n <tk-button\n [label]=\"clearLabel()\"\n severity=\"secondary\"\n variant=\"outlined\"\n (clicked)=\"clearTempFilters()\">\n </tk-button>\n <tk-button\n [label]=\"applyLabel()\"\n severity=\"primary\"\n (clicked)=\"applyFilters()\">\n </tk-button>\n </div>\n </div>\n </p-popover>\n}\n\n@if (sortOptions().length > 0 && !isMobile()) {\n <p-popover #sortPopover styleClass=\"tk-toolbar-popover\">\n <div class=\"tk-toolbar-overlay tk-toolbar-overlay--sort\" data-testid=\"sort-popover\">\n <div class=\"tk-toolbar-overlay__header\">\n <span class=\"tk-toolbar-overlay__title\">{{ sortLabel() }}</span>\n <button type=\"button\" class=\"tk-toolbar-overlay__close\" (click)=\"sortPopover.hide()\">\n <tk-icon icon=\"xmark\" size=\"lg\"></tk-icon>\n </button>\n </div>\n <div class=\"tk-toolbar-overlay__body\">\n <div class=\"tk-toolbar-sort-options\">\n @for (option of sortOptions(); track option.value) {\n <button \n type=\"button\"\n class=\"tk-toolbar-sort-option\" \n [class.tk-toolbar-sort-option--active]=\"sortValue() === option.value\"\n (click)=\"selectSortOption(option.value)\">\n <span>{{ option.label }}</span>\n </button>\n }\n </div>\n </div>\n </div>\n </p-popover>\n}\n\n<!-- 6. Mobile Drawers -->\n@if (derivedFilters().length > 0 && filterVisible() && isMobile()) {\n <tk-drawer\n [(isOpened)]=\"showFilterDrawer\"\n [title]=\"filterLabel()\"\n direction=\"bottom\"\n [dismissible]=\"true\">\n <div class=\"tk-toolbar-overlay__body\">\n @for (filter of derivedFilters(); track filter.key) {\n <div class=\"tk-toolbar-overlay__field\">\n <tk-multiselect\n [id]=\"'filter-mob-' + filter.key\"\n [options]=\"filter.options\"\n [labelText]=\"filter.label\"\n [model]=\"tempFilterValues()[filter.key] || []\"\n (modelChange)=\"onTempFilterChange(filter.key, $event || [])\"\n appendTo=\"body\"\n panelStyleClass=\"tk-toolbar-multiselect-panel\">\n </tk-multiselect>\n </div>\n }\n </div>\n <div class=\"tk-toolbar-overlay__footer\">\n <tk-button\n [label]=\"clearLabel()\"\n severity=\"secondary\"\n variant=\"outlined\"\n (clicked)=\"clearTempFilters()\">\n </tk-button>\n <tk-button\n [label]=\"applyLabel()\"\n severity=\"primary\"\n (clicked)=\"applyFilters()\">\n </tk-button>\n </div>\n </tk-drawer>\n}\n\n@if (sortOptions().length > 0 && isMobile()) {\n <tk-drawer\n [(isOpened)]=\"showSortDrawer\"\n [title]=\"sortLabel()\"\n direction=\"bottom\"\n [dismissible]=\"true\">\n <div class=\"tk-toolbar-overlay__body\">\n <div class=\"tk-toolbar-sort-options\">\n @for (option of sortOptions(); track option.value) {\n <button \n type=\"button\"\n class=\"tk-toolbar-sort-option\" \n [class.tk-toolbar-sort-option--active]=\"tempSortValue() === option.value\"\n (click)=\"toggleSortOptionMobile(option.value)\">\n <span>{{ option.label }}</span>\n </button>\n }\n </div>\n </div>\n <div class=\"tk-toolbar-overlay__footer\">\n <tk-button\n [label]=\"applyLabel()\"\n severity=\"primary\"\n (clicked)=\"applySortMobile()\">\n </tk-button>\n </div>\n </tk-drawer>\n}\n", styles: [".tk-toolbar-container{display:flex;flex-direction:column;gap:var(--tk-spacing-base-50, .5rem);width:100%}.tk-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:var(--tk-spacing-base-100, 1rem);width:100%}.tk-toolbar__search{width:15rem;max-width:100%}@media(max-width:768px){.tk-toolbar__search{width:100%}}.tk-toolbar__actions{display:flex;align-items:center;gap:var(--tk-spacing-base-50, .5rem)}.tk-toolbar__actions>tk-button{width:2.5rem;height:2.5rem}.tk-toolbar__actions>tk-button ::ng-deep .p-button{width:100%;height:100%;padding:0;display:flex;align-items:center;justify-content:center}.tk-toolbar__reload-btn{border-radius:var(--tk-borderRadius-s, 8px);position:relative}.tk-toolbar__reload-btn--animating:before{content:\"\";position:absolute;inset:0;z-index:1;background:conic-gradient(var(--tk-color-base-sky-300, #92bada) var(--progress, 0%),transparent var(--progress, 0%));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;padding:3px;border-radius:inherit;animation:draw-border var(--reload-interval, 5s) infinite linear;pointer-events:none}.tk-toolbar__reload-btn--spinning ::ng-deep tk-icon{display:inline-block;animation:spin 1s infinite linear}.tk-toolbar-selection-bar{display:flex;justify-content:space-between;align-items:center;width:100%;background-color:var(--tk-color-base-surface-50, #f8fafc);border:1px solid var(--tk-color-base-surface-200, #e2e8f0);border-radius:var(--tk-borderRadius-s, 8px);padding:var(--tk-spacing-base-75, .75rem) var(--tk-spacing-base-100, 1rem);box-sizing:border-box}.tk-toolbar-selection-bar__left{display:flex;align-items:center;gap:var(--tk-spacing-base-75, .75rem)}.tk-toolbar-selection-bar__count{font-size:1rem;font-weight:var(--tk-font-weight-600, 600);color:var(--tk-color-base-surface-900, #0f172a)}.tk-toolbar-selection-bar__right{display:flex;align-items:center;gap:var(--tk-spacing-base-50, .5rem)}.tk-toolbar-selection-bar--mobile{position:fixed;bottom:0;left:0;width:100%;max-width:none;transform:none;z-index:1000;background-color:var(--tk-color-base-surface-0, #ffffff);box-shadow:0 -4px 6px -1px #0000000d,0 -2px 4px -1px #00000008;border-radius:0;border:none;border-top:1px solid var(--tk-color-base-surface-200, #e2e8f0);padding:var(--tk-spacing-base-75, .75rem) var(--tk-spacing-base-100, 1rem)}.tk-toolbar-chips-bar{width:100%;border-top:none;padding-top:var(--tk-spacing-base-50, .5rem);display:flex;justify-content:space-between;align-items:center;gap:var(--tk-spacing-base-100, 1rem)}.tk-toolbar-chips-bar__scroll{display:flex;align-items:center;flex-wrap:wrap;gap:var(--tk-spacing-base-50, .5rem);flex-grow:1}.tk-toolbar-chips-bar__clear-btn{flex-shrink:0}.tk-toolbar-overlay{display:flex;flex-direction:column;width:20rem;max-width:100%;padding:var(--tk-spacing-base-100, 1rem);box-sizing:border-box}.tk-toolbar-overlay--sort{width:15rem;padding:var(--tk-spacing-base-50, .5rem)!important}.tk-toolbar-overlay--sort .tk-toolbar-overlay__header{padding:var(--tk-spacing-base-50, .5rem) var(--tk-spacing-base-50, .5rem) var(--tk-spacing-base-25, .25rem) var(--tk-spacing-base-50, .5rem)!important}.tk-toolbar-overlay--sort .tk-toolbar-overlay__body{padding:0!important;margin-bottom:0!important}.tk-toolbar-overlay__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:0;padding:0 0 var(--tk-spacing-base-50, .5rem) 0}.tk-toolbar-overlay__title{font-size:1rem;font-weight:var(--tk-font-weight-600, 600);color:var(--tk-color-base-surface-900, #0f172a)}.tk-toolbar-overlay__close{background:none;border:none;padding:var(--tk-spacing-base-25, .25rem);color:var(--tk-color-base-surface-500, #64748b);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--tk-borderRadius-s, 8px);transition:background-color .2s}.tk-toolbar-overlay__close:hover{background-color:var(--tk-color-base-surface-100, #f1f5f9);color:var(--tk-color-base-surface-900, #0f172a)}.tk-toolbar-overlay__body{display:flex;flex-direction:column;gap:var(--tk-spacing-base-100, 1rem);padding-top:var(--tk-spacing-base-125, 1.25rem);margin-bottom:var(--tk-spacing-base-150, 1.5rem);max-height:24rem;overflow-y:auto}.tk-toolbar-overlay__field{display:flex;flex-direction:column;gap:var(--tk-spacing-base-25, .25rem)}.tk-toolbar-overlay__footer{display:flex;justify-content:flex-end;gap:var(--tk-spacing-base-50, .5rem);padding-top:var(--tk-spacing-base-100, 1rem)}.tk-toolbar-sort-options{display:flex;flex-direction:column;width:100%}.tk-toolbar-sort-option{display:flex;justify-content:space-between;align-items:center;padding:var(--tk-spacing-base-50, .5rem) var(--tk-spacing-base-50, .5rem);cursor:pointer;border-radius:var(--tk-borderRadius-s, 8px);font-size:.875rem;color:var(--tk-color-base-surface-700, #334155);transition:background-color .2s,color .2s;background:none;border:none;width:100%;font-family:inherit;text-align:left}.tk-toolbar-sort-option:hover{background-color:var(--tk-color-primary-muted, #e9e6f4);color:var(--tk-color-base-primary-500, #16006f)}.tk-toolbar-sort-option--active{font-weight:var(--tk-font-weight-600, 600);color:var(--tk-color-base-primary-500, #16006f);background-color:var(--tk-color-primary-muted, #e9e6f4)}@media(max-width:768px){.tk-toolbar{flex-direction:column;align-items:stretch;gap:var(--tk-spacing-base-50, .5rem)}.tk-toolbar__search{width:100%}.tk-toolbar__actions{width:100%;justify-content:flex-end;margin-left:0}}@property --progress{syntax: \"<percentage>\"; inherits: false; initial-value: 0%;}@keyframes draw-border{0%{--progress: 0%}to{--progress: 100%}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host ::ng-deep .tk-input-bottom{display:none}:host ::ng-deep .p-popover{border-radius:var(--tk-borderRadius-m, 12px);box-shadow:0 10px 15px -3px #0000001a;border:1px solid var(--tk-color-base-surface-200, #e2e8f0);overflow:hidden}:host ::ng-deep .tk-toolbar-popover .p-popover-content{padding:0!important}:host ::ng-deep tk-drawer .tk-toolbar-overlay__body{padding-top:var(--tk-spacing-base-75, .75rem)!important;margin-bottom:0!important}:host ::ng-deep tk-drawer .tk-toolbar-overlay__footer{padding-top:var(--tk-spacing-base-75, .75rem)!important}::ng-deep .tk-toolbar-multiselect-panel .p-multiselect-option span{color:var(--tk-color-primary-default, #16006f);display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .tk-toolbar-multiselect-panel .p-multiselect-option-selected{background-color:var(--tk-color-primary-muted, #b7b0d2)}::ng-deep .tk-toolbar-multiselect-panel .p-multiselect-filter{border:none;border-radius:0;box-shadow:none;border-bottom:1px solid var(--tk-surface-300, #d2d2d2)}\n"] }]
443
+ }], ctorParameters: () => [], propDecorators: { searchModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchModel", required: false }] }, { type: i0.Output, args: ["searchModelChange"] }], searchFloatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchFloatLabel", required: false }] }], searchVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchVisible", required: false }] }], view: [{ type: i0.Input, args: [{ isSignal: true, alias: "view", required: false }] }, { type: i0.Output, args: ["viewChange"] }], viewToggleVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewToggleVisible", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }], filterModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterModel", required: false }] }, { type: i0.Output, args: ["filterModelChange"] }], filterOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterOptions", required: false }] }], filterOptionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterOptionLabel", required: false }] }], filterFloatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterFloatLabel", required: false }] }], filterVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterVisible", required: false }] }], filterValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterValues", required: false }] }, { type: i0.Output, args: ["filterValuesChange"] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], deleteLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "deleteLabel", required: false }] }], filterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLabel", required: false }] }], selectedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedLabel", required: false }] }], selectedPluralLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedPluralLabel", required: false }] }], applyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "applyLabel", required: false }] }], reloadTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "reloadTooltip", required: false }] }], sortTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortTooltip", required: false }] }], viewCardsTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewCardsTooltip", required: false }] }], viewTableTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewTableTooltip", required: false }] }], sortOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortOptions", required: false }] }], sortLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortLabel", required: false }] }], sortValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortValue", required: false }] }, { type: i0.Output, args: ["sortValueChange"] }], reloadVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "reloadVisible", required: false }] }], reloadInterval: [{ type: i0.Input, args: [{ isSignal: true, alias: "reloadInterval", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], globalActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "globalActions", required: false }] }], selectionCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionCount", required: false }] }], allSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "allSelected", required: false }] }, { type: i0.Output, args: ["allSelectedChange"] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }, { type: i0.Output, args: ["indeterminateChange"] }], selectionActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionActions", required: false }] }], maxVisibleSelectionActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleSelectionActions", required: false }] }], reload: [{ type: i0.Output, args: ["reload"] }], appliedFilters: [{ type: i0.Output, args: ["appliedFilters"] }], appliedSort: [{ type: i0.Output, args: ["appliedSort"] }], filterPopover: [{ type: i0.ViewChild, args: ['filterPopover', { isSignal: true }] }], sortPopover: [{ type: i0.ViewChild, args: ['sortPopover', { isSignal: true }] }] } });
188
444
 
189
445
  /**
190
446
  * Generated bundle index. Do not edit.