@ngneers/controls 0.0.1-pre5 → 0.0.1-pre7

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 (168) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +33 -33
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-ng.mjs +22 -19
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
  6. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-avatar.mjs +13 -13
  8. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
  9. package/fesm2022/ngneers-controls-base.mjs +89 -64
  10. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-breadcrumb.mjs +19 -19
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-button-group.mjs +8 -8
  14. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-button.mjs +15 -10
  16. package/fesm2022/ngneers-controls-button.mjs.map +1 -1
  17. package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +9 -9
  18. package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
  19. package/fesm2022/ngneers-controls-calendar.mjs +56 -56
  20. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
  22. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-chip.mjs +7 -7
  24. package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-default-icons.mjs +61 -0
  26. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
  27. package/fesm2022/ngneers-controls-defer.mjs +10 -10
  28. package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-dialog.mjs +38 -40
  30. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-directives.mjs +45 -39
  32. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-drawer.mjs +29 -29
  34. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-edit-inplace.mjs +16 -16
  36. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  37. package/fesm2022/ngneers-controls-filter.mjs +192 -44
  38. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  39. package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
  40. package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
  41. package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
  42. package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
  43. package/fesm2022/ngneers-controls-i18n.mjs +5 -5
  44. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-icon.mjs +111 -47
  46. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  47. package/fesm2022/ngneers-controls-inplace.mjs +18 -18
  48. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-input-field.mjs +16 -16
  50. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
  52. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
  53. package/fesm2022/ngneers-controls-input.mjs +6 -6
  54. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-item-view.mjs +33 -33
  56. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-list-box.mjs +31 -31
  58. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-menu.mjs +33 -33
  60. package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-message.mjs +4 -4
  62. package/fesm2022/ngneers-controls-message.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-paginator.mjs +13 -13
  64. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-popover.mjs +21 -16
  66. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  67. package/fesm2022/ngneers-controls-progress.mjs +16 -16
  68. package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-scroll-shadow.mjs +54 -0
  70. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
  71. package/fesm2022/ngneers-controls-scroller.mjs +74 -39
  72. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-select-button.mjs +7 -7
  74. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-select.mjs +48 -47
  76. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-slider.mjs +11 -11
  78. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-spinner.mjs +7 -7
  80. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
  81. package/fesm2022/ngneers-controls-splitter.mjs +141 -328
  82. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  83. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  84. package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
  85. package/fesm2022/ngneers-controls-table.mjs +1456 -82
  86. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  87. package/fesm2022/ngneers-controls-tabs.mjs +41 -40
  88. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  89. package/fesm2022/ngneers-controls-tag.mjs +4 -4
  90. package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
  91. package/fesm2022/ngneers-controls-toast.mjs +19 -19
  92. package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
  93. package/fesm2022/ngneers-controls-toggle-button.mjs +10 -10
  94. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  95. package/fesm2022/ngneers-controls-tooltip.mjs +74 -38
  96. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  97. package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
  98. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
  99. package/fesm2022/ngneers-controls-utils.mjs +1 -1
  100. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  101. package/package.json +34 -12
  102. package/types/ngneers-controls-accordion.d.ts +6 -4
  103. package/types/ngneers-controls-api-ng.d.ts +7 -2
  104. package/types/ngneers-controls-api-resize.d.ts +318 -0
  105. package/types/ngneers-controls-api.d.ts +2 -2
  106. package/types/ngneers-controls-base.d.ts +8 -0
  107. package/types/ngneers-controls-breadcrumb.d.ts +6 -4
  108. package/types/ngneers-controls-button.d.ts +13 -8
  109. package/types/ngneers-controls-calendar.d.ts +5 -1
  110. package/types/ngneers-controls-checkbox.d.ts +6 -4
  111. package/types/ngneers-controls-chip.d.ts +3 -1
  112. package/types/ngneers-controls-default-icons.d.ts +5 -0
  113. package/types/ngneers-controls-directives.d.ts +7 -1
  114. package/types/ngneers-controls-drawer.d.ts +7 -1
  115. package/types/ngneers-controls-edit-inplace.d.ts +4 -0
  116. package/types/ngneers-controls-filter.d.ts +52 -3
  117. package/types/ngneers-controls-i18n.d.ts +4 -0
  118. package/types/ngneers-controls-icon.d.ts +23 -40
  119. package/types/ngneers-controls-input-field.d.ts +7 -1
  120. package/types/ngneers-controls-item-view.d.ts +4 -2
  121. package/types/ngneers-controls-list-box.d.ts +5 -1
  122. package/types/ngneers-controls-menu.d.ts +4 -2
  123. package/types/ngneers-controls-message.d.ts +3 -1
  124. package/types/ngneers-controls-paginator.d.ts +4 -0
  125. package/types/ngneers-controls-popover.d.ts +2 -1
  126. package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
  127. package/types/ngneers-controls-scroller.d.ts +12 -2
  128. package/types/ngneers-controls-select.d.ts +11 -12
  129. package/types/ngneers-controls-spinner.d.ts +1 -1
  130. package/types/ngneers-controls-splitter.d.ts +29 -59
  131. package/types/ngneers-controls-table.d.ts +380 -24
  132. package/types/ngneers-controls-tabs.d.ts +4 -2
  133. package/types/ngneers-controls-tag.d.ts +3 -1
  134. package/types/ngneers-controls-toast.d.ts +5 -3
  135. package/types/ngneers-controls-toggle-button.d.ts +5 -3
  136. package/types/ngneers-controls-tooltip.d.ts +7 -1
  137. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
  138. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
  139. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +0 -4
  140. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +0 -1
  141. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +0 -4
  142. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +0 -1
  143. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +0 -4
  144. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +0 -1
  145. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +0 -4
  146. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +0 -1
  147. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +0 -4
  148. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +0 -1
  149. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +0 -4
  150. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +0 -1
  151. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +0 -4
  152. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +0 -1
  153. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +0 -4
  154. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +0 -1
  155. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +0 -4
  156. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +0 -1
  157. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +0 -4
  158. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +0 -1
  159. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +0 -4
  160. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +0 -1
  161. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +0 -4
  162. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +0 -1
  163. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +0 -4
  164. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +0 -1
  165. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +0 -4
  166. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +0 -1
  167. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +0 -4
  168. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +0 -1
@@ -1,9 +1,10 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, input, booleanAttribute, computed, output, viewChild, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { inject, DestroyRef, input, booleanAttribute, numberAttribute, computed, output, viewChild, signal, effect, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import { getActiveFilterConditions, executeFilter } from '@ngneers/controls/api';
5
5
  import { ValueControlBase, NgnPt, provideSelf } from '@ngneers/controls/base';
6
6
  import { NgnButton } from '@ngneers/controls/button';
7
+ import { NgnCalendar } from '@ngneers/controls/calendar';
7
8
  import { I18n } from '@ngneers/controls/i18n';
8
9
  import { NgnIcon } from '@ngneers/controls/icon';
9
10
  import { NgnInput } from '@ngneers/controls/input';
@@ -74,51 +75,89 @@ class NgnFilter extends ValueControlBase {
74
75
  theme = this.injectThemeTemplate(filterControlTemplate, 'root');
75
76
  i18n = inject(I18n).translations;
76
77
  unsafeI18n = inject(I18n).unsafe;
78
+ _destroyRef = inject(DestroyRef);
77
79
  /** Data to filter. */
78
- data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
80
+ data = input([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
79
81
  /** Datatype of the values in {@link data}. */
80
- dataType = input('string', ...(ngDevMode ? [{ debugName: "dataType" }] : []));
82
+ dataType = input('string', ...(ngDevMode ? [{ debugName: "dataType" }] : /* istanbul ignore next */ []));
81
83
  /** Allows multiple conditions and a match mode (any/all). */
82
- allowMultiple = input(false, { ...(ngDevMode ? { debugName: "allowMultiple" } : {}), transform: booleanAttribute });
84
+ allowMultiple = input(false, { ...(ngDevMode ? { debugName: "allowMultiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
83
85
  /**
84
86
  * Options for `dataType="list"`.
85
87
  * When provided, they are used as-is. When `null` or `undefined`, options are derived from {@link data}.
86
88
  */
87
- listOptions = input(...(ngDevMode ? [undefined, { debugName: "listOptions" }] : []));
89
+ listOptions = input(...(ngDevMode ? [undefined, { debugName: "listOptions" }] : /* istanbul ignore next */ []));
88
90
  /**
89
91
  * Controls how the filter is rendered.
90
92
  * - `inline`: renders the filter rows directly
91
93
  * - `input`: renders an input-like trigger that opens a popover (default)
92
94
  * - `headless`: renders only the popover and can be opened programmatically via {@link show}
93
95
  */
94
- mode = input('input', ...(ngDevMode ? [{ debugName: "mode" }] : []));
96
+ mode = input('input', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
95
97
  /**
96
98
  * Popover anchor used only in `headless` mode.
97
99
  * In `input` mode the anchor is the internal input-field.
98
100
  */
99
- anchor = input(null, ...(ngDevMode ? [{ debugName: "anchor" }] : []));
101
+ anchor = input(null, ...(ngDevMode ? [{ debugName: "anchor" }] : /* istanbul ignore next */ []));
100
102
  /**
101
103
  * When true, the component will filter {@link data} locally and emit the filtered result.
102
104
  * When false, only the filter configuration is emitted (useful for server-side filtering).
103
105
  */
104
- filterLocally = input(true, { ...(ngDevMode ? { debugName: "filterLocally" } : {}), transform: booleanAttribute });
106
+ filterLocally = input(true, { ...(ngDevMode ? { debugName: "filterLocally" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
107
+ /**
108
+ * When true (default), filters apply automatically as the user types/selects.
109
+ * When false, the user must click "Apply" to commit the filter.
110
+ */
111
+ autoApply = input(true, { ...(ngDevMode ? { debugName: "autoApply" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
112
+ /**
113
+ * Debounce time in milliseconds for auto-apply mode.
114
+ * Only relevant when {@link autoApply} is `true`.
115
+ */
116
+ autoApplyDebounce = input(300, { ...(ngDevMode ? { debugName: "autoApplyDebounce" } : /* istanbul ignore next */ {}), transform: numberAttribute });
105
117
  /** Options for the popover (when {@link mode} is not `inline`). */
106
- popoverOptions = input({}, ...(ngDevMode ? [{ debugName: "popoverOptions" }] : []));
118
+ popoverOptions = input({}, ...(ngDevMode ? [{ debugName: "popoverOptions" }] : /* istanbul ignore next */ []));
107
119
  appliedPopoverOptions = computed(() => deepMerge({
108
120
  sizeConstraints: {
109
- width: '250px',
110
- minHeight: '200px',
121
+ width: '360px',
122
+ minHeight: '120px',
111
123
  maxHeight: '500px',
112
124
  },
113
125
  placement: 'bottom-start',
114
- }, this.popoverOptions()), ...(ngDevMode ? [{ debugName: "appliedPopoverOptions" }] : []));
126
+ }, this.popoverOptions()), ...(ngDevMode ? [{ debugName: "appliedPopoverOptions" }] : /* istanbul ignore next */ []));
115
127
  /** Emits whenever the filter configuration changes. */
116
128
  filterChange = output();
117
129
  /** Emits the filtered data whenever local filtering is enabled. */
118
130
  filterResultChange = output();
119
- _popover = viewChild(NgnPopover, ...(ngDevMode ? [{ debugName: "_popover" }] : []));
120
- // Note: `value()` is the single source of truth.
121
- // It can be `null` (cleared). For rendering, use `templateConfig()` which falls back to defaults.
131
+ _popover = viewChild(NgnPopover, ...(ngDevMode ? [{ debugName: "_popover" }] : /* istanbul ignore next */ []));
132
+ /**
133
+ * Internal working config that the template binds to.
134
+ * In auto-apply mode, this syncs to value() via debounce.
135
+ * In manual mode, only apply() commits this to value().
136
+ */
137
+ workingConfig = signal(null, ...(ngDevMode ? [{ debugName: "workingConfig" }] : /* istanbul ignore next */ []));
138
+ /** Snapshot of value() taken when popover opens in manual mode, for cancel to restore. */
139
+ _snapshotConfig = null;
140
+ /** Debounce timer handle for auto-apply. */
141
+ _debounceTimer = null;
142
+ /** Whether there is an active filter applied. */
143
+ hasActiveFilter = computed(() => {
144
+ const cfg = this.value();
145
+ if (!cfg)
146
+ return false;
147
+ if (cfg.dataType === 'list') {
148
+ const raw = cfg.conditions[0]?.rawValue;
149
+ if (!raw)
150
+ return false;
151
+ try {
152
+ const parsed = JSON.parse(raw);
153
+ return Array.isArray(parsed) && parsed.length > 0;
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ }
159
+ return this.activeConditionConfigs().length > 0;
160
+ }, ...(ngDevMode ? [{ debugName: "hasActiveFilter" }] : /* istanbul ignore next */ []));
122
161
  createCondition(operator) {
123
162
  return { operator, rawValue: null };
124
163
  }
@@ -133,7 +172,7 @@ class NgnFilter extends ValueControlBase {
133
172
  const firstOp = this.operatorDefs()[0]?.id ?? 'isEqual';
134
173
  return {
135
174
  dataType: this.dataType(),
136
- matchMode: this.allowMultiple() ? 'all' : 'all',
175
+ matchMode: 'all',
137
176
  conditions: [
138
177
  {
139
178
  operator: firstOp,
@@ -144,9 +183,10 @@ class NgnFilter extends ValueControlBase {
144
183
  }
145
184
  /**
146
185
  * Config used for UI rendering.
147
- * Falls back to a default config when the actual {@link value} is null.
186
+ * Always reads from workingConfig (the live editing state).
187
+ * Falls back to a default config when null.
148
188
  */
149
- templateConfig = computed(() => (this.value() ?? this.defaultConfig()), ...(ngDevMode ? [{ debugName: "templateConfig" }] : []));
189
+ templateConfig = computed(() => (this.workingConfig() ?? this.defaultConfig()), ...(ngDevMode ? [{ debugName: "templateConfig" }] : /* istanbul ignore next */ []));
150
190
  templateListSelection = computed(() => {
151
191
  const cfg = this.templateConfig();
152
192
  if (cfg.dataType !== 'list') {
@@ -163,7 +203,7 @@ class NgnFilter extends ValueControlBase {
163
203
  catch {
164
204
  return [];
165
205
  }
166
- }, ...(ngDevMode ? [{ debugName: "templateListSelection" }] : []));
206
+ }, ...(ngDevMode ? [{ debugName: "templateListSelection" }] : /* istanbul ignore next */ []));
167
207
  operatorDefs = computed(() => {
168
208
  const dt = this.dataType();
169
209
  const defs = defaultOperatorsForType(dt);
@@ -171,7 +211,7 @@ class NgnFilter extends ValueControlBase {
171
211
  return defs;
172
212
  }
173
213
  return defs;
174
- }, ...(ngDevMode ? [{ debugName: "operatorDefs" }] : []));
214
+ }, ...(ngDevMode ? [{ debugName: "operatorDefs" }] : /* istanbul ignore next */ []));
175
215
  operatorOptions = computed(() => {
176
216
  const options = this.operatorDefs().map(op => ({
177
217
  label: this.i18n[op.labelKey],
@@ -179,7 +219,7 @@ class NgnFilter extends ValueControlBase {
179
219
  testId: `filter-operator-${op.id}`,
180
220
  }));
181
221
  return options;
182
- }, ...(ngDevMode ? [{ debugName: "operatorOptions" }] : []));
222
+ }, ...(ngDevMode ? [{ debugName: "operatorOptions" }] : /* istanbul ignore next */ []));
183
223
  autoListOptions = computed(() => {
184
224
  const seen = new Set();
185
225
  const items = [];
@@ -200,7 +240,7 @@ class NgnFilter extends ValueControlBase {
200
240
  }
201
241
  return 0;
202
242
  });
203
- }, ...(ngDevMode ? [{ debugName: "autoListOptions" }] : []));
243
+ }, ...(ngDevMode ? [{ debugName: "autoListOptions" }] : /* istanbul ignore next */ []));
204
244
  resolvedListOptions = computed(() => {
205
245
  const listOptions = this.listOptions();
206
246
  return listOptions
@@ -210,7 +250,7 @@ class NgnFilter extends ValueControlBase {
210
250
  testId: `filter-list-${opt}`,
211
251
  }))
212
252
  : this.autoListOptions();
213
- }, ...(ngDevMode ? [{ debugName: "resolvedListOptions" }] : []));
253
+ }, ...(ngDevMode ? [{ debugName: "resolvedListOptions" }] : /* istanbul ignore next */ []));
214
254
  matchModeOptions = [
215
255
  { label: this.i18n['filter_match_all'], value: 'all', testId: 'filter-match-all' },
216
256
  { label: this.i18n['filter_match_any'], value: 'any', testId: 'filter-match-any' },
@@ -226,7 +266,29 @@ class NgnFilter extends ValueControlBase {
226
266
  default:
227
267
  return 'text';
228
268
  }
229
- }, ...(ngDevMode ? [{ debugName: "inputType" }] : []));
269
+ }, ...(ngDevMode ? [{ debugName: "inputType" }] : /* istanbul ignore next */ []));
270
+ isDateType = computed(() => this.dataType() === 'date' || this.dataType() === 'dateTime', ...(ngDevMode ? [{ debugName: "isDateType" }] : /* istanbul ignore next */ []));
271
+ isShowTime = computed(() => this.dataType() === 'dateTime', ...(ngDevMode ? [{ debugName: "isShowTime" }] : /* istanbul ignore next */ []));
272
+ /** Parse a rawValue string to a Date for the calendar component. */
273
+ parseRawDate(rawValue) {
274
+ if (!rawValue)
275
+ return null;
276
+ const d = new Date(rawValue);
277
+ return Number.isNaN(d.getTime()) ? null : d;
278
+ }
279
+ /** Convert a Date from the calendar to a rawValue string. */
280
+ dateToRaw(date) {
281
+ if (!date || Number.isNaN(date.getTime()))
282
+ return null;
283
+ if (this.dataType() === 'dateTime') {
284
+ // Format as YYYY-MM-DDTHH:mm for datetime-local compatibility
285
+ const pad = (n) => String(n).padStart(2, '0');
286
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;
287
+ }
288
+ // Format as YYYY-MM-DD for date
289
+ const pad = (n) => String(n).padStart(2, '0');
290
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
291
+ }
230
292
  summaryText = computed(() => {
231
293
  const currentValue = this.value();
232
294
  if (!currentValue) {
@@ -252,13 +314,13 @@ class NgnFilter extends ValueControlBase {
252
314
  const operatorLabel = def ? this.i18n._unsafe[def.labelKey]?.() : c?.operator;
253
315
  return c?.rawValue == null || c?.rawValue === ''
254
316
  ? operatorLabel
255
- : `${operatorLabel} ${c.rawValue}`;
317
+ : `${operatorLabel} "${c.rawValue}"`;
256
318
  }
257
319
  const matchLabel = currentValue.matchMode === 'all'
258
320
  ? this.i18n['filter_match_all']()
259
321
  : this.i18n['filter_match_any']();
260
322
  return `${active.length} ${this.i18n['filter_conditions']()} (${matchLabel})`;
261
- }, ...(ngDevMode ? [{ debugName: "summaryText" }] : []));
323
+ }, ...(ngDevMode ? [{ debugName: "summaryText" }] : /* istanbul ignore next */ []));
262
324
  activeConditionConfigs = computed(() => {
263
325
  const cfg = this.value();
264
326
  if (!cfg || cfg.dataType === 'list') {
@@ -271,11 +333,11 @@ class NgnFilter extends ValueControlBase {
271
333
  const requiresValue = def?.requiresValue ?? true;
272
334
  return !requiresValue || (c.rawValue != null && c.rawValue !== '');
273
335
  });
274
- }, ...(ngDevMode ? [{ debugName: "activeConditionConfigs" }] : []));
336
+ }, ...(ngDevMode ? [{ debugName: "activeConditionConfigs" }] : /* istanbul ignore next */ []));
275
337
  activeConditions = computed(() => {
276
338
  const cfg = this.value();
277
339
  return cfg ? getActiveFilterConditions(cfg) : [];
278
- }, ...(ngDevMode ? [{ debugName: "activeConditions" }] : []));
340
+ }, ...(ngDevMode ? [{ debugName: "activeConditions" }] : /* istanbul ignore next */ []));
279
341
  filteredData = computed(() => {
280
342
  if (!this.filterLocally()) {
281
343
  return this.data();
@@ -285,14 +347,22 @@ class NgnFilter extends ValueControlBase {
285
347
  return this.data();
286
348
  }
287
349
  return executeFilter(this.data(), cfg);
288
- }, ...(ngDevMode ? [{ debugName: "filteredData" }] : []));
350
+ }, ...(ngDevMode ? [{ debugName: "filteredData" }] : /* istanbul ignore next */ []));
351
+ /** The current match mode label for the condition divider */
352
+ matchModeLabel = computed(() => {
353
+ const cfg = this.templateConfig();
354
+ return cfg.matchMode === 'all'
355
+ ? this.i18n['filter_match_and']()
356
+ : this.i18n['filter_match_or']();
357
+ }, ...(ngDevMode ? [{ debugName: "matchModeLabel" }] : /* istanbul ignore next */ []));
289
358
  constructor() {
290
359
  super();
360
+ // Initialize workingConfig from initial value.
361
+ this.workingConfig.set(this.value());
291
362
  effect(() => {
292
363
  this.filterChange.emit(this.value() ?? null);
293
364
  });
294
365
  effect(() => {
295
- // When local filtering is disabled, do not emit or compute any result.
296
366
  if (!this.filterLocally()) {
297
367
  return;
298
368
  }
@@ -320,7 +390,6 @@ class NgnFilter extends ValueControlBase {
320
390
  if (!first) {
321
391
  throw new NgnError('filter', 'No operators available.');
322
392
  }
323
- // Ensure all conditions use a valid operator
324
393
  const defIds = new Set(defs.map(d => d.id));
325
394
  const normalizeConditions = (conditions) => {
326
395
  let changed = false;
@@ -343,6 +412,49 @@ class NgnFilter extends ValueControlBase {
343
412
  this.value.set({ ...cfg, conditions: next });
344
413
  }
345
414
  });
415
+ this._destroyRef.onDestroy(() => {
416
+ if (this._debounceTimer != null) {
417
+ clearTimeout(this._debounceTimer);
418
+ }
419
+ });
420
+ }
421
+ /**
422
+ * Commits the working config to the actual value, with optional debounce.
423
+ * Called after every working config change.
424
+ */
425
+ commitWorkingConfig() {
426
+ if (this.autoApply()) {
427
+ if (this._debounceTimer != null) {
428
+ clearTimeout(this._debounceTimer);
429
+ }
430
+ const debounceMs = this.autoApplyDebounce();
431
+ if (debounceMs > 0) {
432
+ this._debounceTimer = setTimeout(() => {
433
+ this._debounceTimer = null;
434
+ this.value.set(this.workingConfig());
435
+ }, debounceMs);
436
+ }
437
+ else {
438
+ this.value.set(this.workingConfig());
439
+ }
440
+ }
441
+ // In manual mode, do nothing — wait for apply()
442
+ }
443
+ /** Updates the working config and optionally auto-applies. */
444
+ updateWorkingConfig(config) {
445
+ this.workingConfig.set(config);
446
+ this.commitWorkingConfig();
447
+ }
448
+ toggleMatchMode() {
449
+ const cfg = this.templateConfig();
450
+ if (cfg.dataType === 'list' || !this.allowMultiple()) {
451
+ return;
452
+ }
453
+ const newMode = cfg.matchMode === 'all' ? 'any' : 'all';
454
+ this.updateWorkingConfig({
455
+ ...cfg,
456
+ matchMode: newMode,
457
+ });
346
458
  }
347
459
  setMatchMode(value) {
348
460
  if (value === 'all' || value === 'any') {
@@ -350,7 +462,7 @@ class NgnFilter extends ValueControlBase {
350
462
  if (cfg.dataType === 'list') {
351
463
  return;
352
464
  }
353
- this.value.set({
465
+ this.updateWorkingConfig({
354
466
  ...cfg,
355
467
  matchMode: this.allowMultiple() ? value : 'all',
356
468
  });
@@ -378,7 +490,7 @@ class NgnFilter extends ValueControlBase {
378
490
  operator,
379
491
  rawValue: this.operatorRequiresValue(operator) ? existing.rawValue : null,
380
492
  };
381
- this.value.set({
493
+ this.updateWorkingConfig({
382
494
  ...cfg,
383
495
  matchMode: this.allowMultiple() ? cfg.matchMode : 'all',
384
496
  conditions: next,
@@ -395,12 +507,15 @@ class NgnFilter extends ValueControlBase {
395
507
  return;
396
508
  }
397
509
  next[index] = { ...existing, rawValue };
398
- this.value.set({
510
+ this.updateWorkingConfig({
399
511
  ...cfg,
400
512
  matchMode: this.allowMultiple() ? cfg.matchMode : 'all',
401
513
  conditions: next,
402
514
  });
403
515
  }
516
+ setDateValue(index, date) {
517
+ this.setRawValue(index, this.dateToRaw(date));
518
+ }
404
519
  addCondition() {
405
520
  if (!this.allowMultiple()) {
406
521
  return;
@@ -410,9 +525,9 @@ class NgnFilter extends ValueControlBase {
410
525
  return;
411
526
  }
412
527
  const firstOp = this.operatorDefs()[0]?.id ?? 'isEqual';
413
- this.value.set({
528
+ this.updateWorkingConfig({
414
529
  ...cfg,
415
- matchMode: 'all',
530
+ matchMode: cfg.matchMode,
416
531
  conditions: [...cfg.conditions, this.createCondition(firstOp)],
417
532
  });
418
533
  }
@@ -430,7 +545,7 @@ class NgnFilter extends ValueControlBase {
430
545
  }
431
546
  const next = current.slice();
432
547
  next.splice(index, 1);
433
- this.value.set({
548
+ this.updateWorkingConfig({
434
549
  ...cfg,
435
550
  matchMode: cfg.matchMode,
436
551
  conditions: next,
@@ -442,7 +557,7 @@ class NgnFilter extends ValueControlBase {
442
557
  : value == null
443
558
  ? []
444
559
  : [String(value)];
445
- this.value.set({
560
+ this.updateWorkingConfig({
446
561
  dataType: 'list',
447
562
  matchMode: 'all',
448
563
  conditions: [
@@ -453,8 +568,35 @@ class NgnFilter extends ValueControlBase {
453
568
  ],
454
569
  });
455
570
  }
571
+ /** Applies the working config (manual mode). */
572
+ apply() {
573
+ const cfg = this.workingConfig();
574
+ this.value.set(cfg);
575
+ // Update snapshot so next cancel restores to this applied state
576
+ this._snapshotConfig = cfg ? JSON.parse(JSON.stringify(cfg)) : null;
577
+ if (this.mode() !== 'inline') {
578
+ this.hide();
579
+ }
580
+ }
581
+ /** Cancels changes and restores the snapshot (manual mode). */
582
+ cancelChanges() {
583
+ // Clear any pending debounce
584
+ if (this._debounceTimer != null) {
585
+ clearTimeout(this._debounceTimer);
586
+ this._debounceTimer = null;
587
+ }
588
+ this.workingConfig.set(this._snapshotConfig ? JSON.parse(JSON.stringify(this._snapshotConfig)) : null);
589
+ if (this.mode() !== 'inline') {
590
+ this.hide();
591
+ }
592
+ }
456
593
  clear() {
457
- this.value.set(null);
594
+ this.updateWorkingConfig(null);
595
+ if (!this.autoApply()) {
596
+ // In manual mode, also commit clear immediately
597
+ this.value.set(null);
598
+ this._snapshotConfig = null;
599
+ }
458
600
  if (this.mode() !== 'inline') {
459
601
  this.hide();
460
602
  }
@@ -471,6 +613,11 @@ class NgnFilter extends ValueControlBase {
471
613
  if (!popover) {
472
614
  throw new NgnError('filter', 'Popover is not available.');
473
615
  }
616
+ // Snapshot current value for cancel
617
+ const val = this.value();
618
+ this._snapshotConfig = val ? JSON.parse(JSON.stringify(val)) : null;
619
+ // Reset working config to current value
620
+ this.workingConfig.set(val);
474
621
  popover.show();
475
622
  }
476
623
  /** Hides the filter popup. Only works when {@link mode} is not `inline`. */
@@ -489,14 +636,15 @@ class NgnFilter extends ValueControlBase {
489
636
  }
490
637
  }
491
638
  }
492
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnFilter, deps: [], target: i0.ɵɵFactoryTarget.Component });
493
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnFilter, isStandalone: true, selector: "ngn-filter", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, dataType: { classPropertyName: "dataType", publicName: "dataType", isSignal: true, isRequired: false, transformFunction: null }, allowMultiple: { classPropertyName: "allowMultiple", publicName: "allowMultiple", isSignal: true, isRequired: false, transformFunction: null }, listOptions: { classPropertyName: "listOptions", publicName: "listOptions", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: false, transformFunction: null }, filterLocally: { classPropertyName: "filterLocally", publicName: "filterLocally", isSignal: true, isRequired: false, transformFunction: null }, popoverOptions: { classPropertyName: "popoverOptions", publicName: "popoverOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filterChange: "filterChange", filterResultChange: "filterResultChange" }, host: { styleAttribute: "display: block;" }, providers: [provideSelf(NgnFilter)], viewQueries: [{ propertyName: "_popover", first: true, predicate: NgnPopover, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #rowsTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'rows'\">\r\n @if (dataType() === 'list') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" data-testid=\"filter-row-list\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [multiple]=\"true\"\r\n [options]=\"resolvedListOptions()\"\r\n [value]=\"$any(templateListSelection())\"\r\n (valueChange)=\"setListSelection($event)\"\r\n />\r\n </div>\r\n } @else {\r\n @for (c of templateConfig().conditions; track $index; let i = $index) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" [attr.data-testid]=\"'filter-row-' + i\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'operator'\"\r\n [options]=\"operatorOptions()\"\r\n [value]=\"c.operator\"\r\n (valueChange)=\"setOperator(i, $event)\"\r\n />\r\n @if (operatorRequiresValue(c.operator)) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'value'\">\r\n <input\r\n ngnInput\r\n [type]=\"inputType()\"\r\n [value]=\"c.rawValue || ''\"\r\n (valueChange)=\"setRawValue(i, $event)\"\r\n />\r\n </ngn-input-field>\r\n }\r\n\r\n @if (allowMultiple() && templateConfig().conditions.length > 1) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row-actions'\">\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"'text'\"\r\n [color]=\"'error'\"\r\n (click)=\"removeCondition(i)\"\r\n >\r\n {{ i18n['filter_removeCondition']() + ' ' + (i + 1) }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #matchModeTemplate>\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'match'\"\r\n [options]=\"matchModeOptions\"\r\n [value]=\"templateConfig().matchMode\"\r\n (valueChange)=\"setMatchMode($event)\"\r\n data-testid=\"filter-match-mode\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"addCondition()\"\r\n data-testid=\"filter-add-rule\"\r\n >\r\n <span aria-hidden=\"true\">+</span>\r\n {{ i18n['filter_addCondition']() }}\r\n </button>\r\n }\r\n <button type=\"button\" ngnButton kind=\"secondary\" (click)=\"clear()\" data-testid=\"filter-clear\">\r\n {{ i18n['filter_clear']() }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #popoverTemplate let-anchor=\"anchor\">\r\n <ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"anchor\"\r\n [hasShrinkableContent]=\"true\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [id]=\"inputId() + '_popover'\"\r\n >\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n <ng-container [ngTemplateOutlet]=\"matchModeTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n </ng-template>\r\n </ngn-popover>\r\n</ng-template>\r\n\r\n@if (mode() === 'inline') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'inline'\">\r\n <ng-container [ngTemplateOutlet]=\"matchModeTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n} @else if (mode() === 'input') {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'input-field'\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n >\r\n <div role=\"button\" [ptInt]=\"this\" [ptClass]=\"'summary'\">{{ summaryText() }}</div>\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" defaultIcon=\"magnifying_glass\" />\r\n </ngn-input-field>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: field.element.nativeElement }\"\r\n />\r\n} @else {\r\n @if (anchor()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: anchor() }\"\r\n />\r\n }\r\n}\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgnInputField, selector: "ngn-input-field", inputs: ["label", "labelledBy", "labelKind", "inputId", "showClearButton", "iconClearButton", "tabindex", "invalid", "readonly", "disabled"] }, { kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"], exportAs: ["ngnInput"] }, { kind: "component", type: NgnSelect, selector: "ngn-select", inputs: ["popoverOptions", "options", "filter", "filterText", "filterIcon", "dropdownIcon", "virtual", "itemHeight", "editable", "editableAutoFilter", "multiple", "scrollToSelectedItemOnOpen", "tabindex", "checkbox"] }, { kind: "component", type: NgnPopover, selector: "ngn-popover", inputs: ["open", "anchor", "options", "hasShrinkableContent", "closeBy"], outputs: ["closed", "closing", "openChange"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"], exportAs: ["ngnButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
639
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnFilter, deps: [], target: i0.ɵɵFactoryTarget.Component });
640
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: NgnFilter, isStandalone: true, selector: "ngn-filter", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, dataType: { classPropertyName: "dataType", publicName: "dataType", isSignal: true, isRequired: false, transformFunction: null }, allowMultiple: { classPropertyName: "allowMultiple", publicName: "allowMultiple", isSignal: true, isRequired: false, transformFunction: null }, listOptions: { classPropertyName: "listOptions", publicName: "listOptions", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: false, transformFunction: null }, filterLocally: { classPropertyName: "filterLocally", publicName: "filterLocally", isSignal: true, isRequired: false, transformFunction: null }, autoApply: { classPropertyName: "autoApply", publicName: "autoApply", isSignal: true, isRequired: false, transformFunction: null }, autoApplyDebounce: { classPropertyName: "autoApplyDebounce", publicName: "autoApplyDebounce", isSignal: true, isRequired: false, transformFunction: null }, popoverOptions: { classPropertyName: "popoverOptions", publicName: "popoverOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filterChange: "filterChange", filterResultChange: "filterResultChange" }, host: { styleAttribute: "display: block;" }, providers: [provideSelf(NgnFilter)], viewQueries: [{ propertyName: "_popover", first: true, predicate: NgnPopover, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #rowsTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'rows'\">\r\n @if (dataType() === 'list') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" data-testid=\"filter-row-list\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [multiple]=\"true\"\r\n [options]=\"resolvedListOptions()\"\r\n [value]=\"$any(templateListSelection())\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n (valueChange)=\"setListSelection($event)\"\r\n />\r\n </div>\r\n } @else {\r\n @for (c of templateConfig().conditions; track $index; let i = $index; let last = $last) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" [attr.data-testid]=\"'filter-row-' + i\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"operatorRequiresValue(c.operator) ? 'operator' : 'value'\"\r\n [options]=\"operatorOptions()\"\r\n [value]=\"c.operator\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n (valueChange)=\"setOperator(i, $event)\"\r\n />\r\n @if (operatorRequiresValue(c.operator)) {\r\n @if (isDateType()) {\r\n <ngn-calendar\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [showTime]=\"isShowTime()\"\r\n [value]=\"parseRawDate(c.rawValue)\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n (valueChange)=\"setDateValue(i, $event)\"\r\n />\r\n } @else {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n >\r\n <input\r\n ngnInput\r\n [type]=\"inputType()\"\r\n [value]=\"c.rawValue || ''\"\r\n [disabled]=\"disabled()\"\r\n [readOnly]=\"readonly()\"\r\n (valueChange)=\"setRawValue(i, $event)\"\r\n />\r\n </ngn-input-field>\r\n }\r\n }\r\n\r\n @if (allowMultiple() && templateConfig().conditions.length > 1) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"icon\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'remove-btn'\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (click)=\"removeCondition(i)\"\r\n [attr.aria-label]=\"i18n['filter_removeCondition']() + ' ' + (i + 1)\"\r\n data-testid=\"filter-remove-condition\"\r\n >\r\n <ngn-icon defaultIcon=\"filter-remove\" />\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (allowMultiple() && !last && templateConfig().conditions.length > 1) {\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'condition-divider'\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"!disabled() && !readonly() && toggleMatchMode()\"\r\n (keydown.enter)=\"!disabled() && !readonly() && toggleMatchMode()\"\r\n (keydown.space)=\"\r\n !disabled() && !readonly() && toggleMatchMode(); $event.preventDefault()\r\n \"\r\n [attr.aria-disabled]=\"disabled() || readonly()\"\r\n data-testid=\"filter-match-mode\"\r\n >\r\n {{ matchModeLabel() }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n @if (!disabled() && !readonly()) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"addCondition()\"\r\n data-testid=\"filter-add-rule\"\r\n >\r\n <span aria-hidden=\"true\">+</span>\r\n {{ i18n['filter_addCondition']() }}\r\n </button>\r\n }\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer-actions'\">\r\n @if (!autoApply()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"cancelChanges()\"\r\n data-testid=\"filter-cancel\"\r\n >\r\n {{ i18n['filter_cancel']() }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"primary\"\r\n (click)=\"apply()\"\r\n data-testid=\"filter-apply\"\r\n >\r\n {{ i18n['filter_apply']() }}\r\n </button>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"clear()\"\r\n data-testid=\"filter-clear\"\r\n >\r\n {{ i18n['filter_clear']() }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #popoverTemplate let-anchor=\"anchor\">\r\n <ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"anchor\"\r\n [hasShrinkableContent]=\"true\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [id]=\"inputId() + '_popover'\"\r\n >\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n </ng-template>\r\n </ngn-popover>\r\n</ng-template>\r\n\r\n@if (mode() === 'inline') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'inline'\">\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n} @else if (mode() === 'input') {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'input-field'\"\r\n (click)=\"!disabled() && !readonly() && show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n >\r\n <div role=\"button\" [ptInt]=\"this\" [ptClass]=\"'summary'\">{{ summaryText() }}</div>\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" defaultIcon=\"search\" />\r\n </ngn-input-field>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: field.element.nativeElement }\"\r\n />\r\n} @else {\r\n @if (anchor()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: anchor() }\"\r\n />\r\n }\r\n}\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgnCalendar, selector: "ngn-calendar", inputs: ["firstDayOfWeek", "showTime", "showSeconds", "inline"] }, { kind: "component", type: NgnInputField, selector: "ngn-input-field", inputs: ["label", "labelledBy", "labelKind", "inputId", "showClearButton", "iconClearButton", "tabindex", "invalid", "readonly", "disabled"] }, { kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"], exportAs: ["ngnInput"] }, { kind: "component", type: NgnSelect, selector: "ngn-select", inputs: ["popoverOptions", "options", "filter", "filterText", "filterIcon", "dropdownIcon", "virtual", "itemHeight", "editable", "editableAutoFilter", "multiple", "scrollToSelectedItemOnOpen", "tabindex", "checkbox"] }, { kind: "component", type: NgnPopover, selector: "ngn-popover", inputs: ["open", "anchor", "options", "hasShrinkableContent", "closeBy"], outputs: ["closed", "closing", "openChange"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"], exportAs: ["ngnButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
494
641
  }
495
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnFilter, decorators: [{
642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnFilter, decorators: [{
496
643
  type: Component,
497
644
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-filter', imports: [
498
645
  NgnPt,
499
646
  NgTemplateOutlet,
647
+ NgnCalendar,
500
648
  NgnInputField,
501
649
  NgnInput,
502
650
  NgnSelect,
@@ -505,8 +653,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
505
653
  NgnButton,
506
654
  ], providers: [provideSelf(NgnFilter)], host: {
507
655
  style: 'display: block;',
508
- }, template: "<ng-template #rowsTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'rows'\">\r\n @if (dataType() === 'list') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" data-testid=\"filter-row-list\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [multiple]=\"true\"\r\n [options]=\"resolvedListOptions()\"\r\n [value]=\"$any(templateListSelection())\"\r\n (valueChange)=\"setListSelection($event)\"\r\n />\r\n </div>\r\n } @else {\r\n @for (c of templateConfig().conditions; track $index; let i = $index) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" [attr.data-testid]=\"'filter-row-' + i\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'operator'\"\r\n [options]=\"operatorOptions()\"\r\n [value]=\"c.operator\"\r\n (valueChange)=\"setOperator(i, $event)\"\r\n />\r\n @if (operatorRequiresValue(c.operator)) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'value'\">\r\n <input\r\n ngnInput\r\n [type]=\"inputType()\"\r\n [value]=\"c.rawValue || ''\"\r\n (valueChange)=\"setRawValue(i, $event)\"\r\n />\r\n </ngn-input-field>\r\n }\r\n\r\n @if (allowMultiple() && templateConfig().conditions.length > 1) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row-actions'\">\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"'text'\"\r\n [color]=\"'error'\"\r\n (click)=\"removeCondition(i)\"\r\n >\r\n {{ i18n['filter_removeCondition']() + ' ' + (i + 1) }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #matchModeTemplate>\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'match'\"\r\n [options]=\"matchModeOptions\"\r\n [value]=\"templateConfig().matchMode\"\r\n (valueChange)=\"setMatchMode($event)\"\r\n data-testid=\"filter-match-mode\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"addCondition()\"\r\n data-testid=\"filter-add-rule\"\r\n >\r\n <span aria-hidden=\"true\">+</span>\r\n {{ i18n['filter_addCondition']() }}\r\n </button>\r\n }\r\n <button type=\"button\" ngnButton kind=\"secondary\" (click)=\"clear()\" data-testid=\"filter-clear\">\r\n {{ i18n['filter_clear']() }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #popoverTemplate let-anchor=\"anchor\">\r\n <ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"anchor\"\r\n [hasShrinkableContent]=\"true\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [id]=\"inputId() + '_popover'\"\r\n >\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n <ng-container [ngTemplateOutlet]=\"matchModeTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n </ng-template>\r\n </ngn-popover>\r\n</ng-template>\r\n\r\n@if (mode() === 'inline') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'inline'\">\r\n <ng-container [ngTemplateOutlet]=\"matchModeTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n} @else if (mode() === 'input') {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'input-field'\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n >\r\n <div role=\"button\" [ptInt]=\"this\" [ptClass]=\"'summary'\">{{ summaryText() }}</div>\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" defaultIcon=\"magnifying_glass\" />\r\n </ngn-input-field>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: field.element.nativeElement }\"\r\n />\r\n} @else {\r\n @if (anchor()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: anchor() }\"\r\n />\r\n }\r\n}\r\n" }]
509
- }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], dataType: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataType", required: false }] }], allowMultiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowMultiple", required: false }] }], listOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "listOptions", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], anchor: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchor", required: false }] }], filterLocally: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLocally", required: false }] }], popoverOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "popoverOptions", required: false }] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }], filterResultChange: [{ type: i0.Output, args: ["filterResultChange"] }], _popover: [{ type: i0.ViewChild, args: [i0.forwardRef(() => NgnPopover), { isSignal: true }] }] } });
656
+ }, template: "<ng-template #rowsTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'rows'\">\r\n @if (dataType() === 'list') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" data-testid=\"filter-row-list\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [multiple]=\"true\"\r\n [options]=\"resolvedListOptions()\"\r\n [value]=\"$any(templateListSelection())\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n (valueChange)=\"setListSelection($event)\"\r\n />\r\n </div>\r\n } @else {\r\n @for (c of templateConfig().conditions; track $index; let i = $index; let last = $last) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" [attr.data-testid]=\"'filter-row-' + i\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"operatorRequiresValue(c.operator) ? 'operator' : 'value'\"\r\n [options]=\"operatorOptions()\"\r\n [value]=\"c.operator\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n (valueChange)=\"setOperator(i, $event)\"\r\n />\r\n @if (operatorRequiresValue(c.operator)) {\r\n @if (isDateType()) {\r\n <ngn-calendar\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [showTime]=\"isShowTime()\"\r\n [value]=\"parseRawDate(c.rawValue)\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n (valueChange)=\"setDateValue(i, $event)\"\r\n />\r\n } @else {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'value'\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n >\r\n <input\r\n ngnInput\r\n [type]=\"inputType()\"\r\n [value]=\"c.rawValue || ''\"\r\n [disabled]=\"disabled()\"\r\n [readOnly]=\"readonly()\"\r\n (valueChange)=\"setRawValue(i, $event)\"\r\n />\r\n </ngn-input-field>\r\n }\r\n }\r\n\r\n @if (allowMultiple() && templateConfig().conditions.length > 1) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"icon\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'remove-btn'\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (click)=\"removeCondition(i)\"\r\n [attr.aria-label]=\"i18n['filter_removeCondition']() + ' ' + (i + 1)\"\r\n data-testid=\"filter-remove-condition\"\r\n >\r\n <ngn-icon defaultIcon=\"filter-remove\" />\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (allowMultiple() && !last && templateConfig().conditions.length > 1) {\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'condition-divider'\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"!disabled() && !readonly() && toggleMatchMode()\"\r\n (keydown.enter)=\"!disabled() && !readonly() && toggleMatchMode()\"\r\n (keydown.space)=\"\r\n !disabled() && !readonly() && toggleMatchMode(); $event.preventDefault()\r\n \"\r\n [attr.aria-disabled]=\"disabled() || readonly()\"\r\n data-testid=\"filter-match-mode\"\r\n >\r\n {{ matchModeLabel() }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n @if (!disabled() && !readonly()) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"addCondition()\"\r\n data-testid=\"filter-add-rule\"\r\n >\r\n <span aria-hidden=\"true\">+</span>\r\n {{ i18n['filter_addCondition']() }}\r\n </button>\r\n }\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer-actions'\">\r\n @if (!autoApply()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"cancelChanges()\"\r\n data-testid=\"filter-cancel\"\r\n >\r\n {{ i18n['filter_cancel']() }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"primary\"\r\n (click)=\"apply()\"\r\n data-testid=\"filter-apply\"\r\n >\r\n {{ i18n['filter_apply']() }}\r\n </button>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"clear()\"\r\n data-testid=\"filter-clear\"\r\n >\r\n {{ i18n['filter_clear']() }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #popoverTemplate let-anchor=\"anchor\">\r\n <ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"anchor\"\r\n [hasShrinkableContent]=\"true\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [id]=\"inputId() + '_popover'\"\r\n >\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n </ng-template>\r\n </ngn-popover>\r\n</ng-template>\r\n\r\n@if (mode() === 'inline') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'inline'\">\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n} @else if (mode() === 'input') {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'input-field'\"\r\n (click)=\"!disabled() && !readonly() && show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n >\r\n <div role=\"button\" [ptInt]=\"this\" [ptClass]=\"'summary'\">{{ summaryText() }}</div>\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" defaultIcon=\"search\" />\r\n </ngn-input-field>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: field.element.nativeElement }\"\r\n />\r\n} @else {\r\n @if (anchor()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: anchor() }\"\r\n />\r\n }\r\n}\r\n" }]
657
+ }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], dataType: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataType", required: false }] }], allowMultiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowMultiple", required: false }] }], listOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "listOptions", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], anchor: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchor", required: false }] }], filterLocally: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLocally", required: false }] }], autoApply: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoApply", required: false }] }], autoApplyDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoApplyDebounce", required: false }] }], popoverOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "popoverOptions", required: false }] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }], filterResultChange: [{ type: i0.Output, args: ["filterResultChange"] }], _popover: [{ type: i0.ViewChild, args: [i0.forwardRef(() => NgnPopover), { isSignal: true }] }] } });
510
658
 
511
659
  /**
512
660
  * Generated bundle index. Do not edit.