@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.
- package/fesm2022/ngneers-controls-accordion.mjs +33 -33
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-ng.mjs +22 -19
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
- package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
- package/fesm2022/ngneers-controls-avatar.mjs +13 -13
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-base.mjs +89 -64
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/ngneers-controls-breadcrumb.mjs +19 -19
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button-group.mjs +8 -8
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button.mjs +15 -10
- package/fesm2022/ngneers-controls-button.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +9 -9
- package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +56 -56
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-chip.mjs +7 -7
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-default-icons.mjs +61 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +10 -10
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-dialog.mjs +38 -40
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +45 -39
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-drawer.mjs +29 -29
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +16 -16
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +192 -44
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
- package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
- package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
- package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +5 -5
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +111 -47
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +18 -18
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +16 -16
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +6 -6
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-item-view.mjs +33 -33
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +31 -31
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +33 -33
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
- package/fesm2022/ngneers-controls-message.mjs +4 -4
- package/fesm2022/ngneers-controls-message.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +13 -13
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-popover.mjs +21 -16
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +16 -16
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +54 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +74 -39
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +7 -7
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +48 -47
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +11 -11
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-spinner.mjs +7 -7
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
- package/fesm2022/ngneers-controls-splitter.mjs +141 -328
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +1456 -82
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +41 -40
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tag.mjs +4 -4
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toast.mjs +19 -19
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +10 -10
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +74 -38
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +1 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +34 -12
- package/types/ngneers-controls-accordion.d.ts +6 -4
- package/types/ngneers-controls-api-ng.d.ts +7 -2
- package/types/ngneers-controls-api-resize.d.ts +318 -0
- package/types/ngneers-controls-api.d.ts +2 -2
- package/types/ngneers-controls-base.d.ts +8 -0
- package/types/ngneers-controls-breadcrumb.d.ts +6 -4
- package/types/ngneers-controls-button.d.ts +13 -8
- package/types/ngneers-controls-calendar.d.ts +5 -1
- package/types/ngneers-controls-checkbox.d.ts +6 -4
- package/types/ngneers-controls-chip.d.ts +3 -1
- package/types/ngneers-controls-default-icons.d.ts +5 -0
- package/types/ngneers-controls-directives.d.ts +7 -1
- package/types/ngneers-controls-drawer.d.ts +7 -1
- package/types/ngneers-controls-edit-inplace.d.ts +4 -0
- package/types/ngneers-controls-filter.d.ts +52 -3
- package/types/ngneers-controls-i18n.d.ts +4 -0
- package/types/ngneers-controls-icon.d.ts +23 -40
- package/types/ngneers-controls-input-field.d.ts +7 -1
- package/types/ngneers-controls-item-view.d.ts +4 -2
- package/types/ngneers-controls-list-box.d.ts +5 -1
- package/types/ngneers-controls-menu.d.ts +4 -2
- package/types/ngneers-controls-message.d.ts +3 -1
- package/types/ngneers-controls-paginator.d.ts +4 -0
- package/types/ngneers-controls-popover.d.ts +2 -1
- package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
- package/types/ngneers-controls-scroller.d.ts +12 -2
- package/types/ngneers-controls-select.d.ts +11 -12
- package/types/ngneers-controls-spinner.d.ts +1 -1
- package/types/ngneers-controls-splitter.d.ts +29 -59
- package/types/ngneers-controls-table.d.ts +380 -24
- package/types/ngneers-controls-tabs.d.ts +4 -2
- package/types/ngneers-controls-tag.d.ts +3 -1
- package/types/ngneers-controls-toast.d.ts +5 -3
- package/types/ngneers-controls-toggle-button.d.ts +5 -3
- package/types/ngneers-controls-tooltip.d.ts +7 -1
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +0 -4
- 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: '
|
|
110
|
-
minHeight: '
|
|
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
|
-
|
|
121
|
-
|
|
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:
|
|
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
|
-
*
|
|
186
|
+
* Always reads from workingConfig (the live editing state).
|
|
187
|
+
* Falls back to a default config when null.
|
|
148
188
|
*/
|
|
149
|
-
templateConfig = computed(() => (this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
528
|
+
this.updateWorkingConfig({
|
|
414
529
|
...cfg,
|
|
415
|
-
matchMode:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|