@ngneers/controls 0.0.1-pre6 → 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 +10 -10
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-ng.mjs +12 -9
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-avatar.mjs +6 -6
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-base.mjs +9 -9
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/ngneers-controls-breadcrumb.mjs +7 -7
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button-group.mjs +3 -3
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button.mjs +6 -6
- package/fesm2022/ngneers-controls-button.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +4 -4
- package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +11 -11
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +4 -4
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-chip.mjs +4 -4
- 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 +3 -3
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-dialog.mjs +10 -10
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +21 -21
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-drawer.mjs +7 -7
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +7 -7
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +4 -4
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n.mjs +3 -3
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +108 -44
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +6 -6
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +5 -5
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-mask.mjs +3 -3
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +3 -3
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-item-view.mjs +6 -6
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +6 -6
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +10 -10
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
- package/fesm2022/ngneers-controls-message.mjs +3 -3
- package/fesm2022/ngneers-controls-message.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +4 -4
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-popover.mjs +11 -6
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +3 -3
- 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 +9 -9
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +4 -4
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +8 -7
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +3 -3
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-spinner.mjs +3 -3
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
- package/fesm2022/ngneers-controls-splitter.mjs +10 -10
- 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 +227 -293
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +10 -10
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tag.mjs +3 -3
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toast.mjs +10 -10
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +4 -4
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +44 -8
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils-ng.mjs +3 -3
- 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 +29 -11
- package/types/ngneers-controls-accordion.d.ts +6 -4
- package/types/ngneers-controls-api-ng.d.ts +5 -0
- package/types/ngneers-controls-api.d.ts +2 -2
- package/types/ngneers-controls-breadcrumb.d.ts +5 -3
- package/types/ngneers-controls-checkbox.d.ts +5 -3
- package/types/ngneers-controls-chip.d.ts +3 -1
- package/types/ngneers-controls-default-icons.d.ts +5 -0
- package/types/ngneers-controls-drawer.d.ts +3 -1
- package/types/ngneers-controls-filter.d.ts +1 -1
- package/types/ngneers-controls-icon.d.ts +23 -40
- package/types/ngneers-controls-input-field.d.ts +3 -1
- package/types/ngneers-controls-item-view.d.ts +4 -2
- package/types/ngneers-controls-menu.d.ts +3 -1
- package/types/ngneers-controls-message.d.ts +3 -1
- package/types/ngneers-controls-popover.d.ts +1 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
- package/types/ngneers-controls-select.d.ts +5 -10
- package/types/ngneers-controls-table.d.ts +29 -41
- 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 +4 -2
- package/types/ngneers-controls-toggle-button.d.ts +5 -3
- package/types/ngneers-controls-tooltip.d.ts +7 -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-edit-inplace.mjs","sources":["../../src/edit-inplace/edit-inplace-templates.ts","../../src/edit-inplace/edit-inplace.ts","../../src/edit-inplace/edit-inplace.html","../../src/edit-inplace/ngneers-controls-edit-inplace.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { DisplayTemplateType, EditTemplateType } from './types';\r\n\r\n@Directive()\r\nexport abstract class EditInplaceTemplates extends ValueControlBase<'editInplace', string> {\r\n // Display template\r\n private readonly _defaultDisplayTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.display>>('defaultDisplayTemplate');\r\n private readonly _userDisplayTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.display>>('display');\r\n /**\r\n * Set a custom template for the display.\r\n * Can also be set using an `<ng-template>` element with `#display` template reference variable.\r\n */\r\n public readonly templateDisplay = input<TemplateRef<typeof this.templateTypes.display> | null>(\r\n null\r\n );\r\n protected readonly displayTemplate = computed(\r\n () => this._userDisplayTemplate() ?? this.templateDisplay() ?? this._defaultDisplayTemplate()\r\n );\r\n\r\n // Edit template\r\n private readonly _defaultEditTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.edit>>('defaultEditTemplate');\r\n private readonly _userEditTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.edit>>('edit');\r\n /**\r\n * Set a custom template for the edit view.\r\n * Can also be set using an `<ng-template>` element with `#edit` template reference variable.\r\n */\r\n public readonly templateEdit = input<TemplateRef<typeof this.templateTypes.edit> | null>(null);\r\n protected readonly editTemplate = computed(\r\n () => this._userEditTemplate() ?? this.templateEdit() ?? this._defaultEditTemplate()\r\n );\r\n\r\n /**\r\n * Types for the drawer templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the display template.\r\n */\r\n display: DisplayTemplateType;\r\n /**\r\n * Type of the template variable for the edit template.\r\n */\r\n edit: EditTemplateType;\r\n }>();\r\n}\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n input,\r\n model,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnAutofocus } from '@ngneers/controls/directives';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInplace } from '@ngneers/controls/inplace';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { editInplaceControlTemplate } from '@ngneers/controls-themes/templates/edit-inplace';\r\n\r\nimport { EditInplaceTemplates } from './edit-inplace-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-edit-inplace',\r\n templateUrl: './edit-inplace.html',\r\n imports: [\r\n NgnPt,\r\n NgnInplace,\r\n NgnTemplate,\r\n NgnInput,\r\n NgnAutofocus,\r\n NgnButton,\r\n NgnIcon,\r\n NgnInputField,\r\n ],\r\n providers: [provideSelf(NgnEditInplace)],\r\n})\r\nexport class NgnEditInplace extends EditInplaceTemplates {\r\n protected readonly theme = this.injectThemeTemplate(editInplaceControlTemplate, {\r\n root: true,\r\n invalid: this.invalid(),\r\n readonly: this.readonly(),\r\n disabled: this.disabled(),\r\n });\r\n protected readonly i18n = inject(I18n).translations;\r\n\r\n protected readonly closeContent = this.switchToDisplay.bind(this);\r\n\r\n /**\r\n * Controls the visibility of the content.\r\n */\r\n public readonly editVisible = model<boolean>(false);\r\n /**\r\n * Whether the content is loaded lazily.\r\n * @default true\r\n */\r\n public readonly lazy = input(true, { transform: booleanAttribute });\r\n /**\r\n * Whether the content is cached when closed.\r\n * @default false\r\n */\r\n public readonly cache = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Switches to the edit view.\r\n */\r\n public switchToEdit() {\r\n this.editVisible.set(true);\r\n }\r\n\r\n /**\r\n * Switches to the display view.\r\n */\r\n public switchToDisplay() {\r\n this.editVisible.set(false);\r\n }\r\n\r\n /**\r\n * Toggles between the display and content views.\r\n */\r\n public toggle() {\r\n this.editVisible.update(v => !v);\r\n }\r\n\r\n protected focusOut(event: FocusEvent) {\r\n if (!this.editVisible()) {\r\n return;\r\n }\r\n if (\r\n event.relatedTarget instanceof HTMLElement &&\r\n this.element.nativeElement.contains(event.relatedTarget as HTMLElement)\r\n ) {\r\n return;\r\n }\r\n this.switchToDisplay();\r\n }\r\n}\r\n","<ngn-inplace\r\n [templateDisplay]=\"displayTemplate()\"\r\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\r\n [templateContent]=\"editTemplate()\"\r\n [templateContentContext]=\"{\r\n $implicit: {\r\n value: value(),\r\n update: value.set.bind(value),\r\n close: editVisible.set.bind(editVisible, false),\r\n },\r\n }\"\r\n [contentVisible]=\"editVisible()\"\r\n (contentVisibleChange)=\"editVisible.set($event)\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (contentVisibleChange)=\"!$event && touched.set(true)\"\r\n/>\r\n\r\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\r\n @if (!display.value) {\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\r\n i18n['editInplace_placeholder']()\r\n }}</span>\r\n } @else {\r\n <span>{{ display.value }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\r\n <ngn-input-field\r\n (focusout)=\"focusOut($event)\"\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [labelledBy]=\"labelledBy()\"\r\n >\r\n <input\r\n type=\"text\"\r\n ngnInput\r\n ngnAutofocus\r\n [value]=\"edit.value\"\r\n (valueChange)=\"edit.update($event ?? '')\"\r\n (keydown.enter)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-input'\"\r\n (blur)=\"touched.set(true)\"\r\n />\r\n <button\r\n ngnButton\r\n type=\"button\"\r\n kind=\"icon\"\r\n [inline]=\"true\"\r\n (click)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-close-button'\"\r\n >\r\n <ngn-icon defaultIcon=\"check\" />\r\n </button>\r\n </ngn-input-field>\r\n </div>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-edit-inplace.mjs","sources":["../../src/edit-inplace/edit-inplace-templates.ts","../../src/edit-inplace/edit-inplace.ts","../../src/edit-inplace/edit-inplace.html","../../src/edit-inplace/ngneers-controls-edit-inplace.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { DisplayTemplateType, EditTemplateType } from './types';\r\n\r\n@Directive()\r\nexport abstract class EditInplaceTemplates extends ValueControlBase<'editInplace', string> {\r\n // Display template\r\n private readonly _defaultDisplayTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.display>>('defaultDisplayTemplate');\r\n private readonly _userDisplayTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.display>>('display');\r\n /**\r\n * Set a custom template for the display.\r\n * Can also be set using an `<ng-template>` element with `#display` template reference variable.\r\n */\r\n public readonly templateDisplay = input<TemplateRef<typeof this.templateTypes.display> | null>(\r\n null\r\n );\r\n protected readonly displayTemplate = computed(\r\n () => this._userDisplayTemplate() ?? this.templateDisplay() ?? this._defaultDisplayTemplate()\r\n );\r\n\r\n // Edit template\r\n private readonly _defaultEditTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.edit>>('defaultEditTemplate');\r\n private readonly _userEditTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.edit>>('edit');\r\n /**\r\n * Set a custom template for the edit view.\r\n * Can also be set using an `<ng-template>` element with `#edit` template reference variable.\r\n */\r\n public readonly templateEdit = input<TemplateRef<typeof this.templateTypes.edit> | null>(null);\r\n protected readonly editTemplate = computed(\r\n () => this._userEditTemplate() ?? this.templateEdit() ?? this._defaultEditTemplate()\r\n );\r\n\r\n /**\r\n * Types for the drawer templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the display template.\r\n */\r\n display: DisplayTemplateType;\r\n /**\r\n * Type of the template variable for the edit template.\r\n */\r\n edit: EditTemplateType;\r\n }>();\r\n}\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n input,\r\n model,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnAutofocus } from '@ngneers/controls/directives';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInplace } from '@ngneers/controls/inplace';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { editInplaceControlTemplate } from '@ngneers/controls-themes/templates/edit-inplace';\r\n\r\nimport { EditInplaceTemplates } from './edit-inplace-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-edit-inplace',\r\n templateUrl: './edit-inplace.html',\r\n imports: [\r\n NgnPt,\r\n NgnInplace,\r\n NgnTemplate,\r\n NgnInput,\r\n NgnAutofocus,\r\n NgnButton,\r\n NgnIcon,\r\n NgnInputField,\r\n ],\r\n providers: [provideSelf(NgnEditInplace)],\r\n})\r\nexport class NgnEditInplace extends EditInplaceTemplates {\r\n protected readonly theme = this.injectThemeTemplate(editInplaceControlTemplate, {\r\n root: true,\r\n invalid: this.invalid(),\r\n readonly: this.readonly(),\r\n disabled: this.disabled(),\r\n });\r\n protected readonly i18n = inject(I18n).translations;\r\n\r\n protected readonly closeContent = this.switchToDisplay.bind(this);\r\n\r\n /**\r\n * Controls the visibility of the content.\r\n */\r\n public readonly editVisible = model<boolean>(false);\r\n /**\r\n * Whether the content is loaded lazily.\r\n * @default true\r\n */\r\n public readonly lazy = input(true, { transform: booleanAttribute });\r\n /**\r\n * Whether the content is cached when closed.\r\n * @default false\r\n */\r\n public readonly cache = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Switches to the edit view.\r\n */\r\n public switchToEdit() {\r\n this.editVisible.set(true);\r\n }\r\n\r\n /**\r\n * Switches to the display view.\r\n */\r\n public switchToDisplay() {\r\n this.editVisible.set(false);\r\n }\r\n\r\n /**\r\n * Toggles between the display and content views.\r\n */\r\n public toggle() {\r\n this.editVisible.update(v => !v);\r\n }\r\n\r\n protected focusOut(event: FocusEvent) {\r\n if (!this.editVisible()) {\r\n return;\r\n }\r\n if (\r\n event.relatedTarget instanceof HTMLElement &&\r\n this.element.nativeElement.contains(event.relatedTarget as HTMLElement)\r\n ) {\r\n return;\r\n }\r\n this.switchToDisplay();\r\n }\r\n}\r\n","<ngn-inplace\r\n [templateDisplay]=\"displayTemplate()\"\r\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\r\n [templateContent]=\"editTemplate()\"\r\n [templateContentContext]=\"{\r\n $implicit: {\r\n value: value(),\r\n update: value.set.bind(value),\r\n close: editVisible.set.bind(editVisible, false),\r\n },\r\n }\"\r\n [contentVisible]=\"editVisible()\"\r\n (contentVisibleChange)=\"editVisible.set($event)\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (contentVisibleChange)=\"!$event && touched.set(true)\"\r\n/>\r\n\r\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\r\n @if (!display.value) {\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\r\n i18n['editInplace_placeholder']()\r\n }}</span>\r\n } @else {\r\n <span>{{ display.value }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\r\n <ngn-input-field\r\n (focusout)=\"focusOut($event)\"\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [labelledBy]=\"labelledBy()\"\r\n >\r\n <input\r\n type=\"text\"\r\n ngnInput\r\n ngnAutofocus\r\n [value]=\"edit.value\"\r\n (valueChange)=\"edit.update($event ?? '')\"\r\n (keydown.enter)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-input'\"\r\n (blur)=\"touched.set(true)\"\r\n />\r\n <button\r\n ngnButton\r\n type=\"button\"\r\n kind=\"icon\"\r\n [inline]=\"true\"\r\n (click)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-close-button'\"\r\n >\r\n <ngn-icon defaultIcon=\"edit-confirm\" />\r\n </button>\r\n </ngn-input-field>\r\n </div>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -636,10 +636,10 @@ class NgnFilter extends ValueControlBase {
|
|
|
636
636
|
}
|
|
637
637
|
}
|
|
638
638
|
}
|
|
639
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
640
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.2", 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=\"xmark\" />\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=\"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: 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 });
|
|
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 });
|
|
641
641
|
}
|
|
642
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
642
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnFilter, decorators: [{
|
|
643
643
|
type: Component,
|
|
644
644
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-filter', imports: [
|
|
645
645
|
NgnPt,
|
|
@@ -653,7 +653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImpor
|
|
|
653
653
|
NgnButton,
|
|
654
654
|
], providers: [provideSelf(NgnFilter)], host: {
|
|
655
655
|
style: 'display: block;',
|
|
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=\"
|
|
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
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 }] }] } });
|
|
658
658
|
|
|
659
659
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-filter.mjs","sources":["../../src/filter/filter.ts","../../src/filter/filter.html","../../src/filter/ngneers-controls-filter.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n numberAttribute,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { executeFilter, getActiveFilterConditions, type NgnItem } from '@ngneers/controls/api';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnCalendar } from '@ngneers/controls/calendar';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { NgnPopover, type PopoverOptions } from '@ngneers/controls/popover';\r\nimport { NgnSelect } from '@ngneers/controls/select';\r\nimport { deepMerge, NgnError } from '@ngneers/controls/utils';\r\nimport { filterControlTemplate } from '@ngneers/controls-themes/templates/filter';\r\n\r\nimport type {\r\n NgnFilterCondition,\r\n NgnFilterConditionConfig,\r\n NgnFilterConfig,\r\n NgnFilterDataType,\r\n NgnFilterMode,\r\n NgnFilterOperatorId,\r\n} from './types';\r\nimport type { Anchor } from '@ngneers/controls/api/ng';\r\n\r\ntype ConditionInternal = {\r\n operator: NgnFilterOperatorId;\r\n rawValue: string | null;\r\n};\r\n\r\ntype OperatorDef = {\r\n id: NgnFilterOperatorId;\r\n labelKey: string;\r\n requiresValue: boolean;\r\n};\r\n\r\nfunction defaultOperatorsForType(dataType: NgnFilterDataType) {\r\n switch (dataType) {\r\n case 'string':\r\n return [\r\n { id: 'isEqual', labelKey: 'filter_operators_isEqual', requiresValue: true },\r\n { id: 'isNotEqual', labelKey: 'filter_operators_isNotEqual', requiresValue: true },\r\n { id: 'contains', labelKey: 'filter_operators_contains', requiresValue: true },\r\n { id: 'startsWith', labelKey: 'filter_operators_startsWith', requiresValue: true },\r\n { id: 'endsWith', labelKey: 'filter_operators_endsWith', requiresValue: true },\r\n { id: 'isEmpty', labelKey: 'filter_operators_isEmpty', requiresValue: false },\r\n { id: 'isNotEmpty', labelKey: 'filter_operators_isNotEmpty', requiresValue: false },\r\n ] as const satisfies OperatorDef[];\r\n case 'number':\r\n return [\r\n { id: 'isEqual', labelKey: 'filter_operators_isEqual', requiresValue: true },\r\n { id: 'isNotEqual', labelKey: 'filter_operators_isNotEqual', requiresValue: true },\r\n { id: 'greaterThan', labelKey: 'filter_operators_greaterThan', requiresValue: true },\r\n {\r\n id: 'greaterThanOrEqual',\r\n labelKey: 'filter_operators_greaterThanOrEqual',\r\n requiresValue: true,\r\n },\r\n { id: 'lessThan', labelKey: 'filter_operators_lessThan', requiresValue: true },\r\n {\r\n id: 'lessThanOrEqual',\r\n labelKey: 'filter_operators_lessThanOrEqual',\r\n requiresValue: true,\r\n },\r\n ] as const satisfies OperatorDef[];\r\n case 'date':\r\n case 'dateTime':\r\n return [\r\n { id: 'isEqual', labelKey: 'filter_operators_isEqual', requiresValue: true },\r\n { id: 'isNotEqual', labelKey: 'filter_operators_isNotEqual', requiresValue: true },\r\n { id: 'greaterThan', labelKey: 'filter_operators_after', requiresValue: true },\r\n { id: 'greaterThanOrEqual', labelKey: 'filter_operators_onOrAfter', requiresValue: true },\r\n { id: 'lessThan', labelKey: 'filter_operators_before', requiresValue: true },\r\n { id: 'lessThanOrEqual', labelKey: 'filter_operators_onOrBefore', requiresValue: true },\r\n ] as const satisfies OperatorDef[];\r\n case 'boolean':\r\n return [\r\n { id: 'isTrue', labelKey: 'filter_operators_isTrue', requiresValue: false },\r\n { id: 'isFalse', labelKey: 'filter_operators_isFalse', requiresValue: false },\r\n ] as const satisfies OperatorDef[];\r\n case 'custom':\r\n return [\r\n { id: 'custom', labelKey: 'filter_operators_custom', requiresValue: true },\r\n ] as const satisfies OperatorDef[];\r\n case 'list':\r\n return [\r\n { id: 'in', labelKey: 'filter_operators_in', requiresValue: true },\r\n ] as const satisfies OperatorDef[];\r\n }\r\n}\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-filter',\r\n templateUrl: './filter.html',\r\n imports: [\r\n NgnPt,\r\n NgTemplateOutlet,\r\n NgnCalendar,\r\n NgnInputField,\r\n NgnInput,\r\n NgnSelect,\r\n NgnPopover,\r\n NgnIcon,\r\n NgnButton,\r\n ],\r\n providers: [provideSelf(NgnFilter)],\r\n host: {\r\n style: 'display: block;',\r\n },\r\n})\r\nexport class NgnFilter<T = unknown> extends ValueControlBase<'filter', NgnFilterConfig | null> {\r\n protected readonly theme = this.injectThemeTemplate(filterControlTemplate, 'root');\r\n protected readonly i18n = inject(I18n).translations;\r\n protected readonly unsafeI18n = inject(I18n).unsafe;\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n /** Data to filter. */\r\n public readonly data = input<readonly T[]>([]);\r\n /** Datatype of the values in {@link data}. */\r\n public readonly dataType = input<NgnFilterDataType>('string');\r\n /** Allows multiple conditions and a match mode (any/all). */\r\n public readonly allowMultiple = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Options for `dataType=\"list\"`.\r\n * When provided, they are used as-is. When `null` or `undefined`, options are derived from {@link data}.\r\n */\r\n public readonly listOptions = input<readonly string[] | null | undefined>();\r\n\r\n /**\r\n * Controls how the filter is rendered.\r\n * - `inline`: renders the filter rows directly\r\n * - `input`: renders an input-like trigger that opens a popover (default)\r\n * - `headless`: renders only the popover and can be opened programmatically via {@link show}\r\n */\r\n public readonly mode = input<NgnFilterMode>('input');\r\n\r\n /**\r\n * Popover anchor used only in `headless` mode.\r\n * In `input` mode the anchor is the internal input-field.\r\n */\r\n public readonly anchor = input<Anchor | null>(null);\r\n\r\n /**\r\n * When true, the component will filter {@link data} locally and emit the filtered result.\r\n * When false, only the filter configuration is emitted (useful for server-side filtering).\r\n */\r\n public readonly filterLocally = input(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * When true (default), filters apply automatically as the user types/selects.\r\n * When false, the user must click \"Apply\" to commit the filter.\r\n */\r\n public readonly autoApply = input(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Debounce time in milliseconds for auto-apply mode.\r\n * Only relevant when {@link autoApply} is `true`.\r\n */\r\n public readonly autoApplyDebounce = input(300, { transform: numberAttribute });\r\n\r\n /** Options for the popover (when {@link mode} is not `inline`). */\r\n public readonly popoverOptions = input<PopoverOptions>({});\r\n protected readonly appliedPopoverOptions = computed(() =>\r\n deepMerge(\r\n <PopoverOptions>{\r\n sizeConstraints: {\r\n width: '360px',\r\n minHeight: '120px',\r\n maxHeight: '500px',\r\n },\r\n placement: 'bottom-start',\r\n },\r\n this.popoverOptions()\r\n )\r\n );\r\n\r\n /** Emits whenever the filter configuration changes. */\r\n public readonly filterChange = output<NgnFilterConfig | null>();\r\n /** Emits the filtered data whenever local filtering is enabled. */\r\n public readonly filterResultChange = output<readonly T[]>();\r\n\r\n private readonly _popover = viewChild(NgnPopover);\r\n\r\n /**\r\n * Internal working config that the template binds to.\r\n * In auto-apply mode, this syncs to value() via debounce.\r\n * In manual mode, only apply() commits this to value().\r\n */\r\n protected readonly workingConfig = signal<NgnFilterConfig | null>(null);\r\n\r\n /** Snapshot of value() taken when popover opens in manual mode, for cancel to restore. */\r\n private _snapshotConfig: NgnFilterConfig | null = null;\r\n\r\n /** Debounce timer handle for auto-apply. */\r\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n /** Whether there is an active filter applied. */\r\n protected readonly hasActiveFilter = computed(() => {\r\n const cfg = this.value();\r\n if (!cfg) return false;\r\n if (cfg.dataType === 'list') {\r\n const raw = cfg.conditions[0]?.rawValue;\r\n if (!raw) return false;\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n return Array.isArray(parsed) && parsed.length > 0;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n return this.activeConditionConfigs().length > 0;\r\n });\r\n\r\n private createCondition(operator: NgnFilterOperatorId): ConditionInternal {\r\n return { operator, rawValue: null };\r\n }\r\n\r\n private defaultConfig(): NgnFilterConfig {\r\n if (this.dataType() === 'list') {\r\n return {\r\n dataType: 'list',\r\n matchMode: 'all',\r\n conditions: <readonly NgnFilterConditionConfig[]>[{ operator: 'in', rawValue: null }],\r\n };\r\n }\r\n\r\n const firstOp = this.operatorDefs()[0]?.id ?? 'isEqual';\r\n return {\r\n dataType: this.dataType(),\r\n matchMode: 'all',\r\n conditions: <readonly NgnFilterConditionConfig[]>[\r\n {\r\n operator: firstOp,\r\n rawValue: null,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Config used for UI rendering.\r\n * Always reads from workingConfig (the live editing state).\r\n * Falls back to a default config when null.\r\n */\r\n protected readonly templateConfig = computed<NgnFilterConfig>(\r\n () => (this.workingConfig() ?? this.defaultConfig()) as NgnFilterConfig\r\n );\r\n\r\n protected readonly templateListSelection = computed<readonly string[]>(() => {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType !== 'list') {\r\n return [];\r\n }\r\n const raw = cfg.conditions[0]?.rawValue;\r\n if (!raw) {\r\n return [];\r\n }\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n return Array.isArray(parsed) ? parsed.map(v => String(v)) : [];\r\n } catch {\r\n return [];\r\n }\r\n });\r\n\r\n protected readonly operatorDefs = computed(() => {\r\n const dt = this.dataType();\r\n const defs = defaultOperatorsForType(dt);\r\n if (dt === 'custom' && defs.length === 1 && defs[0]?.id === 'custom') {\r\n return defs;\r\n }\r\n return defs;\r\n });\r\n\r\n protected readonly operatorOptions = computed(() => {\r\n const options = this.operatorDefs().map(\r\n op =>\r\n <NgnItem>{\r\n label: this.i18n[op.labelKey],\r\n value: op.id,\r\n testId: `filter-operator-${op.id}`,\r\n }\r\n );\r\n return options;\r\n });\r\n\r\n protected readonly autoListOptions = computed<readonly NgnItem[]>(() => {\r\n const seen = new Set<string>();\r\n const items: Array<NgnItem> = [];\r\n\r\n for (const raw of this.data()) {\r\n const s = String(raw);\r\n if (seen.has(s)) {\r\n continue;\r\n }\r\n seen.add(s);\r\n items.push({ label: s, value: s, testId: `filter-list-${s}` });\r\n }\r\n\r\n return items.sort((a, b) => {\r\n if (typeof a.label === 'string' && typeof b.label === 'string') {\r\n return a.label.localeCompare(b.label);\r\n }\r\n if (typeof a.label === 'function' && typeof b.label === 'function') {\r\n return a.label().localeCompare(b.label());\r\n }\r\n return 0;\r\n });\r\n });\r\n\r\n protected readonly resolvedListOptions = computed<readonly NgnItem[]>(() => {\r\n const listOptions = this.listOptions();\r\n return listOptions\r\n ? listOptions.map(\r\n (opt): NgnItem => ({\r\n label: opt,\r\n value: opt,\r\n testId: `filter-list-${opt}`,\r\n })\r\n )\r\n : this.autoListOptions();\r\n });\r\n\r\n protected readonly matchModeOptions: readonly NgnItem[] = [\r\n { label: this.i18n['filter_match_all'], value: 'all', testId: 'filter-match-all' },\r\n { label: this.i18n['filter_match_any'], value: 'any', testId: 'filter-match-any' },\r\n ];\r\n\r\n protected readonly inputType = computed(() => {\r\n switch (this.dataType()) {\r\n case 'number':\r\n return 'number';\r\n case 'date':\r\n return 'date';\r\n case 'dateTime':\r\n return 'datetime-local';\r\n default:\r\n return 'text';\r\n }\r\n });\r\n\r\n protected readonly isDateType = computed(\r\n () => this.dataType() === 'date' || this.dataType() === 'dateTime'\r\n );\r\n\r\n protected readonly isShowTime = computed(() => this.dataType() === 'dateTime');\r\n\r\n /** Parse a rawValue string to a Date for the calendar component. */\r\n protected parseRawDate(rawValue: string | null): Date | null {\r\n if (!rawValue) return null;\r\n const d = new Date(rawValue);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n }\r\n\r\n /** Convert a Date from the calendar to a rawValue string. */\r\n protected dateToRaw(date: Date | null): string | null {\r\n if (!date || Number.isNaN(date.getTime())) return null;\r\n if (this.dataType() === 'dateTime') {\r\n // Format as YYYY-MM-DDTHH:mm for datetime-local compatibility\r\n const pad = (n: number) => String(n).padStart(2, '0');\r\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\r\n }\r\n // Format as YYYY-MM-DD for date\r\n const pad = (n: number) => String(n).padStart(2, '0');\r\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\r\n }\r\n\r\n protected readonly summaryText = computed(() => {\r\n const currentValue = this.value();\r\n if (!currentValue) {\r\n return this.i18n['filter_noFilter']();\r\n }\r\n\r\n if (currentValue.dataType === 'list') {\r\n const selected = this.templateListSelection();\r\n if (selected.length === 0) {\r\n return this.i18n['filter_noFilter']();\r\n }\r\n if (selected.length === 1) {\r\n return selected[0] ?? this.i18n['filter_noFilter']();\r\n }\r\n return `${selected.length} ${this.i18n['filter_selected']()}`;\r\n }\r\n\r\n const active = this.activeConditionConfigs();\r\n if (active.length === 0) {\r\n return this.i18n['filter_noFilter']();\r\n }\r\n if (active.length === 1) {\r\n const c = active[0];\r\n\r\n const def = this.operatorDefs().find(d => d.id === c?.operator);\r\n const operatorLabel = def ? this.i18n._unsafe[def.labelKey]?.() : c?.operator;\r\n return c?.rawValue == null || c?.rawValue === ''\r\n ? operatorLabel\r\n : `${operatorLabel} \"${c.rawValue}\"`;\r\n }\r\n\r\n const matchLabel =\r\n currentValue.matchMode === 'all'\r\n ? this.i18n['filter_match_all']()\r\n : this.i18n['filter_match_any']();\r\n return `${active.length} ${this.i18n['filter_conditions']()} (${matchLabel})`;\r\n });\r\n\r\n protected readonly activeConditionConfigs = computed<readonly NgnFilterConditionConfig[]>(() => {\r\n const cfg = this.value();\r\n if (!cfg || cfg.dataType === 'list') {\r\n return [];\r\n }\r\n const defs = this.operatorDefs();\r\n const defById = new Map(defs.map(d => [d.id, d] as const));\r\n\r\n return cfg.conditions.filter(c => {\r\n const def = defById.get(c.operator);\r\n const requiresValue = def?.requiresValue ?? true;\r\n return !requiresValue || (c.rawValue != null && c.rawValue !== '');\r\n });\r\n });\r\n\r\n protected readonly activeConditions = computed<readonly NgnFilterCondition[]>(() => {\r\n const cfg = this.value();\r\n return cfg ? getActiveFilterConditions(cfg) : [];\r\n });\r\n\r\n protected readonly filteredData = computed<readonly T[]>(() => {\r\n if (!this.filterLocally()) {\r\n return this.data();\r\n }\r\n const cfg = this.value();\r\n if (!cfg) {\r\n return this.data();\r\n }\r\n return executeFilter(this.data(), cfg);\r\n });\r\n\r\n /** The current match mode label for the condition divider */\r\n protected readonly matchModeLabel = computed(() => {\r\n const cfg = this.templateConfig();\r\n return cfg.matchMode === 'all'\r\n ? this.i18n['filter_match_and']()\r\n : this.i18n['filter_match_or']();\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // Initialize workingConfig from initial value.\r\n this.workingConfig.set(this.value());\r\n\r\n effect(() => {\r\n this.filterChange.emit(this.value() ?? null);\r\n });\r\n\r\n effect(() => {\r\n if (!this.filterLocally()) {\r\n return;\r\n }\r\n this.filterResultChange.emit(this.filteredData());\r\n });\r\n\r\n effect(() => {\r\n if (!this.allowMultiple()) {\r\n const cfg = this.value();\r\n if (!cfg || cfg.dataType === 'list') {\r\n return;\r\n }\r\n if (cfg.conditions.length <= 1 && cfg.matchMode === 'all') {\r\n return;\r\n }\r\n this.value.set({\r\n ...cfg,\r\n matchMode: 'all',\r\n conditions: cfg.conditions.slice(0, 1),\r\n });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const defs = this.operatorDefs();\r\n const first = defs[0];\r\n if (!first) {\r\n throw new NgnError('filter', 'No operators available.');\r\n }\r\n const defIds = new Set(defs.map(d => d.id));\r\n\r\n const normalizeConditions = (\r\n conditions: readonly ConditionInternal[]\r\n ): readonly ConditionInternal[] => {\r\n let changed = false;\r\n const next = conditions.map(c => {\r\n if (defIds.has(c.operator)) {\r\n return c;\r\n }\r\n changed = true;\r\n return { ...c, operator: first.id, rawValue: null };\r\n });\r\n return changed ? next : conditions;\r\n };\r\n\r\n const cfg = this.value();\r\n if (!cfg || cfg.dataType === 'list') {\r\n return;\r\n }\r\n\r\n const current = cfg.conditions;\r\n const next = normalizeConditions(current);\r\n if (next !== current) {\r\n this.value.set({ ...cfg, conditions: next });\r\n }\r\n });\r\n\r\n this._destroyRef.onDestroy(() => {\r\n if (this._debounceTimer != null) {\r\n clearTimeout(this._debounceTimer);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Commits the working config to the actual value, with optional debounce.\r\n * Called after every working config change.\r\n */\r\n private commitWorkingConfig(): void {\r\n if (this.autoApply()) {\r\n if (this._debounceTimer != null) {\r\n clearTimeout(this._debounceTimer);\r\n }\r\n const debounceMs = this.autoApplyDebounce();\r\n if (debounceMs > 0) {\r\n this._debounceTimer = setTimeout(() => {\r\n this._debounceTimer = null;\r\n this.value.set(this.workingConfig());\r\n }, debounceMs);\r\n } else {\r\n this.value.set(this.workingConfig());\r\n }\r\n }\r\n // In manual mode, do nothing — wait for apply()\r\n }\r\n\r\n /** Updates the working config and optionally auto-applies. */\r\n private updateWorkingConfig(config: NgnFilterConfig | null): void {\r\n this.workingConfig.set(config);\r\n this.commitWorkingConfig();\r\n }\r\n\r\n protected toggleMatchMode(): void {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list' || !this.allowMultiple()) {\r\n return;\r\n }\r\n const newMode = cfg.matchMode === 'all' ? 'any' : 'all';\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: newMode,\r\n });\r\n }\r\n\r\n protected setMatchMode(value: unknown): void {\r\n if (value === 'all' || value === 'any') {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? value : 'all',\r\n });\r\n }\r\n }\r\n\r\n protected operatorRequiresValue(operator: NgnFilterOperatorId): boolean {\r\n const def = this.operatorDefs().find(d => d.id === operator);\r\n return def?.requiresValue ?? true;\r\n }\r\n\r\n protected setOperator(index: number, operator: NgnFilterOperatorId | null): void {\r\n if (!operator) {\r\n return;\r\n }\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const next = cfg.conditions.slice();\r\n const existing = next[index];\r\n if (!existing) {\r\n return;\r\n }\r\n next[index] = {\r\n ...existing,\r\n operator,\r\n rawValue: this.operatorRequiresValue(operator) ? existing.rawValue : null,\r\n };\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? cfg.matchMode : 'all',\r\n conditions: next,\r\n });\r\n }\r\n\r\n protected setRawValue(index: number, rawValue: string | null): void {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const next = cfg.conditions.slice();\r\n const existing = next[index];\r\n if (!existing) {\r\n return;\r\n }\r\n next[index] = { ...existing, rawValue };\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? cfg.matchMode : 'all',\r\n conditions: next,\r\n });\r\n }\r\n\r\n protected setDateValue(index: number, date: Date | null): void {\r\n this.setRawValue(index, this.dateToRaw(date));\r\n }\r\n\r\n protected addCondition(): void {\r\n if (!this.allowMultiple()) {\r\n return;\r\n }\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const firstOp = this.operatorDefs()[0]?.id ?? 'isEqual';\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: cfg.matchMode,\r\n conditions: [...cfg.conditions, this.createCondition(firstOp)],\r\n });\r\n }\r\n\r\n protected removeCondition(index: number): void {\r\n if (!this.allowMultiple()) {\r\n return;\r\n }\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const current = cfg.conditions;\r\n if (current.length <= 1) {\r\n return;\r\n }\r\n const next = current.slice();\r\n next.splice(index, 1);\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: cfg.matchMode,\r\n conditions: next,\r\n });\r\n }\r\n\r\n protected setListSelection(value: unknown): void {\r\n const arr = Array.isArray(value)\r\n ? value.map(v => String(v))\r\n : value == null\r\n ? []\r\n : [String(value)];\r\n\r\n this.updateWorkingConfig({\r\n dataType: 'list',\r\n matchMode: 'all',\r\n conditions: <readonly NgnFilterConditionConfig[]>[\r\n {\r\n operator: 'in',\r\n rawValue: arr.length > 0 ? JSON.stringify(arr) : null,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n /** Applies the working config (manual mode). */\r\n protected apply(): void {\r\n const cfg = this.workingConfig();\r\n this.value.set(cfg);\r\n // Update snapshot so next cancel restores to this applied state\r\n this._snapshotConfig = cfg ? JSON.parse(JSON.stringify(cfg)) : null;\r\n if (this.mode() !== 'inline') {\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Cancels changes and restores the snapshot (manual mode). */\r\n protected cancelChanges(): void {\r\n // Clear any pending debounce\r\n if (this._debounceTimer != null) {\r\n clearTimeout(this._debounceTimer);\r\n this._debounceTimer = null;\r\n }\r\n this.workingConfig.set(\r\n this._snapshotConfig ? JSON.parse(JSON.stringify(this._snapshotConfig)) : null\r\n );\r\n if (this.mode() !== 'inline') {\r\n this.hide();\r\n }\r\n }\r\n\r\n protected clear(): void {\r\n this.updateWorkingConfig(null);\r\n if (!this.autoApply()) {\r\n // In manual mode, also commit clear immediately\r\n this.value.set(null);\r\n this._snapshotConfig = null;\r\n }\r\n if (this.mode() !== 'inline') {\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Shows the filter popup. Only works when {@link mode} is not `inline`. */\r\n public show(): void {\r\n if (this.mode() === 'inline') {\r\n throw new NgnError('filter', 'Cannot open an inline filter.');\r\n }\r\n if (this.mode() === 'headless' && !this.anchor()) {\r\n throw new NgnError('filter', 'Headless mode requires an [anchor] input.');\r\n }\r\n const popover = this._popover();\r\n if (!popover) {\r\n throw new NgnError('filter', 'Popover is not available.');\r\n }\r\n\r\n // Snapshot current value for cancel\r\n const val = this.value();\r\n this._snapshotConfig = val ? JSON.parse(JSON.stringify(val)) : null;\r\n // Reset working config to current value\r\n this.workingConfig.set(val);\r\n\r\n popover.show();\r\n }\r\n\r\n /** Hides the filter popup. Only works when {@link mode} is not `inline`. */\r\n public hide(): void {\r\n if (this.mode() === 'inline') {\r\n throw new NgnError('filter', 'Cannot close an inline filter.');\r\n }\r\n this._popover()?.hide();\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter') {\r\n if (this.mode() !== 'inline') {\r\n this._popover()?.toggle();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n}\r\n","<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=\"xmark\" />\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=\"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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-filter.mjs","sources":["../../src/filter/filter.ts","../../src/filter/filter.html","../../src/filter/ngneers-controls-filter.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n numberAttribute,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { executeFilter, getActiveFilterConditions, type NgnItem } from '@ngneers/controls/api';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnCalendar } from '@ngneers/controls/calendar';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { NgnPopover, type PopoverOptions } from '@ngneers/controls/popover';\r\nimport { NgnSelect } from '@ngneers/controls/select';\r\nimport { deepMerge, NgnError } from '@ngneers/controls/utils';\r\nimport { filterControlTemplate } from '@ngneers/controls-themes/templates/filter';\r\n\r\nimport type {\r\n NgnFilterCondition,\r\n NgnFilterConditionConfig,\r\n NgnFilterConfig,\r\n NgnFilterDataType,\r\n NgnFilterMode,\r\n NgnFilterOperatorId,\r\n} from './types';\r\nimport type { Anchor } from '@ngneers/controls/api/ng';\r\n\r\ntype ConditionInternal = {\r\n operator: NgnFilterOperatorId;\r\n rawValue: string | null;\r\n};\r\n\r\ntype OperatorDef = {\r\n id: NgnFilterOperatorId;\r\n labelKey: string;\r\n requiresValue: boolean;\r\n};\r\n\r\nfunction defaultOperatorsForType(dataType: NgnFilterDataType) {\r\n switch (dataType) {\r\n case 'string':\r\n return [\r\n { id: 'isEqual', labelKey: 'filter_operators_isEqual', requiresValue: true },\r\n { id: 'isNotEqual', labelKey: 'filter_operators_isNotEqual', requiresValue: true },\r\n { id: 'contains', labelKey: 'filter_operators_contains', requiresValue: true },\r\n { id: 'startsWith', labelKey: 'filter_operators_startsWith', requiresValue: true },\r\n { id: 'endsWith', labelKey: 'filter_operators_endsWith', requiresValue: true },\r\n { id: 'isEmpty', labelKey: 'filter_operators_isEmpty', requiresValue: false },\r\n { id: 'isNotEmpty', labelKey: 'filter_operators_isNotEmpty', requiresValue: false },\r\n ] as const satisfies OperatorDef[];\r\n case 'number':\r\n return [\r\n { id: 'isEqual', labelKey: 'filter_operators_isEqual', requiresValue: true },\r\n { id: 'isNotEqual', labelKey: 'filter_operators_isNotEqual', requiresValue: true },\r\n { id: 'greaterThan', labelKey: 'filter_operators_greaterThan', requiresValue: true },\r\n {\r\n id: 'greaterThanOrEqual',\r\n labelKey: 'filter_operators_greaterThanOrEqual',\r\n requiresValue: true,\r\n },\r\n { id: 'lessThan', labelKey: 'filter_operators_lessThan', requiresValue: true },\r\n {\r\n id: 'lessThanOrEqual',\r\n labelKey: 'filter_operators_lessThanOrEqual',\r\n requiresValue: true,\r\n },\r\n ] as const satisfies OperatorDef[];\r\n case 'date':\r\n case 'dateTime':\r\n return [\r\n { id: 'isEqual', labelKey: 'filter_operators_isEqual', requiresValue: true },\r\n { id: 'isNotEqual', labelKey: 'filter_operators_isNotEqual', requiresValue: true },\r\n { id: 'greaterThan', labelKey: 'filter_operators_after', requiresValue: true },\r\n { id: 'greaterThanOrEqual', labelKey: 'filter_operators_onOrAfter', requiresValue: true },\r\n { id: 'lessThan', labelKey: 'filter_operators_before', requiresValue: true },\r\n { id: 'lessThanOrEqual', labelKey: 'filter_operators_onOrBefore', requiresValue: true },\r\n ] as const satisfies OperatorDef[];\r\n case 'boolean':\r\n return [\r\n { id: 'isTrue', labelKey: 'filter_operators_isTrue', requiresValue: false },\r\n { id: 'isFalse', labelKey: 'filter_operators_isFalse', requiresValue: false },\r\n ] as const satisfies OperatorDef[];\r\n case 'custom':\r\n return [\r\n { id: 'custom', labelKey: 'filter_operators_custom', requiresValue: true },\r\n ] as const satisfies OperatorDef[];\r\n case 'list':\r\n return [\r\n { id: 'in', labelKey: 'filter_operators_in', requiresValue: true },\r\n ] as const satisfies OperatorDef[];\r\n }\r\n}\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-filter',\r\n templateUrl: './filter.html',\r\n imports: [\r\n NgnPt,\r\n NgTemplateOutlet,\r\n NgnCalendar,\r\n NgnInputField,\r\n NgnInput,\r\n NgnSelect,\r\n NgnPopover,\r\n NgnIcon,\r\n NgnButton,\r\n ],\r\n providers: [provideSelf(NgnFilter)],\r\n host: {\r\n style: 'display: block;',\r\n },\r\n})\r\nexport class NgnFilter<T = unknown> extends ValueControlBase<'filter', NgnFilterConfig | null> {\r\n protected readonly theme = this.injectThemeTemplate(filterControlTemplate, 'root');\r\n protected readonly i18n = inject(I18n).translations;\r\n protected readonly unsafeI18n = inject(I18n).unsafe;\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n /** Data to filter. */\r\n public readonly data = input<readonly T[]>([]);\r\n /** Datatype of the values in {@link data}. */\r\n public readonly dataType = input<NgnFilterDataType>('string');\r\n /** Allows multiple conditions and a match mode (any/all). */\r\n public readonly allowMultiple = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Options for `dataType=\"list\"`.\r\n * When provided, they are used as-is. When `null` or `undefined`, options are derived from {@link data}.\r\n */\r\n public readonly listOptions = input<readonly string[] | null | undefined>();\r\n\r\n /**\r\n * Controls how the filter is rendered.\r\n * - `inline`: renders the filter rows directly\r\n * - `input`: renders an input-like trigger that opens a popover (default)\r\n * - `headless`: renders only the popover and can be opened programmatically via {@link show}\r\n */\r\n public readonly mode = input<NgnFilterMode>('input');\r\n\r\n /**\r\n * Popover anchor used only in `headless` mode.\r\n * In `input` mode the anchor is the internal input-field.\r\n */\r\n public readonly anchor = input<Anchor | null>(null);\r\n\r\n /**\r\n * When true, the component will filter {@link data} locally and emit the filtered result.\r\n * When false, only the filter configuration is emitted (useful for server-side filtering).\r\n */\r\n public readonly filterLocally = input(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * When true (default), filters apply automatically as the user types/selects.\r\n * When false, the user must click \"Apply\" to commit the filter.\r\n */\r\n public readonly autoApply = input(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Debounce time in milliseconds for auto-apply mode.\r\n * Only relevant when {@link autoApply} is `true`.\r\n */\r\n public readonly autoApplyDebounce = input(300, { transform: numberAttribute });\r\n\r\n /** Options for the popover (when {@link mode} is not `inline`). */\r\n public readonly popoverOptions = input<PopoverOptions>({});\r\n protected readonly appliedPopoverOptions = computed(() =>\r\n deepMerge(\r\n <PopoverOptions>{\r\n sizeConstraints: {\r\n width: '360px',\r\n minHeight: '120px',\r\n maxHeight: '500px',\r\n },\r\n placement: 'bottom-start',\r\n },\r\n this.popoverOptions()\r\n )\r\n );\r\n\r\n /** Emits whenever the filter configuration changes. */\r\n public readonly filterChange = output<NgnFilterConfig | null>();\r\n /** Emits the filtered data whenever local filtering is enabled. */\r\n public readonly filterResultChange = output<readonly T[]>();\r\n\r\n private readonly _popover = viewChild(NgnPopover);\r\n\r\n /**\r\n * Internal working config that the template binds to.\r\n * In auto-apply mode, this syncs to value() via debounce.\r\n * In manual mode, only apply() commits this to value().\r\n */\r\n protected readonly workingConfig = signal<NgnFilterConfig | null>(null);\r\n\r\n /** Snapshot of value() taken when popover opens in manual mode, for cancel to restore. */\r\n private _snapshotConfig: NgnFilterConfig | null = null;\r\n\r\n /** Debounce timer handle for auto-apply. */\r\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n /** Whether there is an active filter applied. */\r\n protected readonly hasActiveFilter = computed(() => {\r\n const cfg = this.value();\r\n if (!cfg) return false;\r\n if (cfg.dataType === 'list') {\r\n const raw = cfg.conditions[0]?.rawValue;\r\n if (!raw) return false;\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n return Array.isArray(parsed) && parsed.length > 0;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n return this.activeConditionConfigs().length > 0;\r\n });\r\n\r\n private createCondition(operator: NgnFilterOperatorId): ConditionInternal {\r\n return { operator, rawValue: null };\r\n }\r\n\r\n private defaultConfig(): NgnFilterConfig {\r\n if (this.dataType() === 'list') {\r\n return {\r\n dataType: 'list',\r\n matchMode: 'all',\r\n conditions: <readonly NgnFilterConditionConfig[]>[{ operator: 'in', rawValue: null }],\r\n };\r\n }\r\n\r\n const firstOp = this.operatorDefs()[0]?.id ?? 'isEqual';\r\n return {\r\n dataType: this.dataType(),\r\n matchMode: 'all',\r\n conditions: <readonly NgnFilterConditionConfig[]>[\r\n {\r\n operator: firstOp,\r\n rawValue: null,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Config used for UI rendering.\r\n * Always reads from workingConfig (the live editing state).\r\n * Falls back to a default config when null.\r\n */\r\n protected readonly templateConfig = computed<NgnFilterConfig>(\r\n () => (this.workingConfig() ?? this.defaultConfig()) as NgnFilterConfig\r\n );\r\n\r\n protected readonly templateListSelection = computed<readonly string[]>(() => {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType !== 'list') {\r\n return [];\r\n }\r\n const raw = cfg.conditions[0]?.rawValue;\r\n if (!raw) {\r\n return [];\r\n }\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n return Array.isArray(parsed) ? parsed.map(v => String(v)) : [];\r\n } catch {\r\n return [];\r\n }\r\n });\r\n\r\n protected readonly operatorDefs = computed(() => {\r\n const dt = this.dataType();\r\n const defs = defaultOperatorsForType(dt);\r\n if (dt === 'custom' && defs.length === 1 && defs[0]?.id === 'custom') {\r\n return defs;\r\n }\r\n return defs;\r\n });\r\n\r\n protected readonly operatorOptions = computed(() => {\r\n const options = this.operatorDefs().map(\r\n op =>\r\n <NgnItem>{\r\n label: this.i18n[op.labelKey],\r\n value: op.id,\r\n testId: `filter-operator-${op.id}`,\r\n }\r\n );\r\n return options;\r\n });\r\n\r\n protected readonly autoListOptions = computed<readonly NgnItem[]>(() => {\r\n const seen = new Set<string>();\r\n const items: Array<NgnItem> = [];\r\n\r\n for (const raw of this.data()) {\r\n const s = String(raw);\r\n if (seen.has(s)) {\r\n continue;\r\n }\r\n seen.add(s);\r\n items.push({ label: s, value: s, testId: `filter-list-${s}` });\r\n }\r\n\r\n return items.sort((a, b) => {\r\n if (typeof a.label === 'string' && typeof b.label === 'string') {\r\n return a.label.localeCompare(b.label);\r\n }\r\n if (typeof a.label === 'function' && typeof b.label === 'function') {\r\n return a.label().localeCompare(b.label());\r\n }\r\n return 0;\r\n });\r\n });\r\n\r\n protected readonly resolvedListOptions = computed<readonly NgnItem[]>(() => {\r\n const listOptions = this.listOptions();\r\n return listOptions\r\n ? listOptions.map(\r\n (opt): NgnItem => ({\r\n label: opt,\r\n value: opt,\r\n testId: `filter-list-${opt}`,\r\n })\r\n )\r\n : this.autoListOptions();\r\n });\r\n\r\n protected readonly matchModeOptions: readonly NgnItem[] = [\r\n { label: this.i18n['filter_match_all'], value: 'all', testId: 'filter-match-all' },\r\n { label: this.i18n['filter_match_any'], value: 'any', testId: 'filter-match-any' },\r\n ];\r\n\r\n protected readonly inputType = computed(() => {\r\n switch (this.dataType()) {\r\n case 'number':\r\n return 'number';\r\n case 'date':\r\n return 'date';\r\n case 'dateTime':\r\n return 'datetime-local';\r\n default:\r\n return 'text';\r\n }\r\n });\r\n\r\n protected readonly isDateType = computed(\r\n () => this.dataType() === 'date' || this.dataType() === 'dateTime'\r\n );\r\n\r\n protected readonly isShowTime = computed(() => this.dataType() === 'dateTime');\r\n\r\n /** Parse a rawValue string to a Date for the calendar component. */\r\n protected parseRawDate(rawValue: string | null): Date | null {\r\n if (!rawValue) return null;\r\n const d = new Date(rawValue);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n }\r\n\r\n /** Convert a Date from the calendar to a rawValue string. */\r\n protected dateToRaw(date: Date | null): string | null {\r\n if (!date || Number.isNaN(date.getTime())) return null;\r\n if (this.dataType() === 'dateTime') {\r\n // Format as YYYY-MM-DDTHH:mm for datetime-local compatibility\r\n const pad = (n: number) => String(n).padStart(2, '0');\r\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\r\n }\r\n // Format as YYYY-MM-DD for date\r\n const pad = (n: number) => String(n).padStart(2, '0');\r\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\r\n }\r\n\r\n protected readonly summaryText = computed(() => {\r\n const currentValue = this.value();\r\n if (!currentValue) {\r\n return this.i18n['filter_noFilter']();\r\n }\r\n\r\n if (currentValue.dataType === 'list') {\r\n const selected = this.templateListSelection();\r\n if (selected.length === 0) {\r\n return this.i18n['filter_noFilter']();\r\n }\r\n if (selected.length === 1) {\r\n return selected[0] ?? this.i18n['filter_noFilter']();\r\n }\r\n return `${selected.length} ${this.i18n['filter_selected']()}`;\r\n }\r\n\r\n const active = this.activeConditionConfigs();\r\n if (active.length === 0) {\r\n return this.i18n['filter_noFilter']();\r\n }\r\n if (active.length === 1) {\r\n const c = active[0];\r\n\r\n const def = this.operatorDefs().find(d => d.id === c?.operator);\r\n const operatorLabel = def ? this.i18n._unsafe[def.labelKey]?.() : c?.operator;\r\n return c?.rawValue == null || c?.rawValue === ''\r\n ? operatorLabel\r\n : `${operatorLabel} \"${c.rawValue}\"`;\r\n }\r\n\r\n const matchLabel =\r\n currentValue.matchMode === 'all'\r\n ? this.i18n['filter_match_all']()\r\n : this.i18n['filter_match_any']();\r\n return `${active.length} ${this.i18n['filter_conditions']()} (${matchLabel})`;\r\n });\r\n\r\n protected readonly activeConditionConfigs = computed<readonly NgnFilterConditionConfig[]>(() => {\r\n const cfg = this.value();\r\n if (!cfg || cfg.dataType === 'list') {\r\n return [];\r\n }\r\n const defs = this.operatorDefs();\r\n const defById = new Map(defs.map(d => [d.id, d] as const));\r\n\r\n return cfg.conditions.filter(c => {\r\n const def = defById.get(c.operator);\r\n const requiresValue = def?.requiresValue ?? true;\r\n return !requiresValue || (c.rawValue != null && c.rawValue !== '');\r\n });\r\n });\r\n\r\n protected readonly activeConditions = computed<readonly NgnFilterCondition[]>(() => {\r\n const cfg = this.value();\r\n return cfg ? getActiveFilterConditions(cfg) : [];\r\n });\r\n\r\n protected readonly filteredData = computed<readonly T[]>(() => {\r\n if (!this.filterLocally()) {\r\n return this.data();\r\n }\r\n const cfg = this.value();\r\n if (!cfg) {\r\n return this.data();\r\n }\r\n return executeFilter(this.data(), cfg);\r\n });\r\n\r\n /** The current match mode label for the condition divider */\r\n protected readonly matchModeLabel = computed(() => {\r\n const cfg = this.templateConfig();\r\n return cfg.matchMode === 'all'\r\n ? this.i18n['filter_match_and']()\r\n : this.i18n['filter_match_or']();\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // Initialize workingConfig from initial value.\r\n this.workingConfig.set(this.value());\r\n\r\n effect(() => {\r\n this.filterChange.emit(this.value() ?? null);\r\n });\r\n\r\n effect(() => {\r\n if (!this.filterLocally()) {\r\n return;\r\n }\r\n this.filterResultChange.emit(this.filteredData());\r\n });\r\n\r\n effect(() => {\r\n if (!this.allowMultiple()) {\r\n const cfg = this.value();\r\n if (!cfg || cfg.dataType === 'list') {\r\n return;\r\n }\r\n if (cfg.conditions.length <= 1 && cfg.matchMode === 'all') {\r\n return;\r\n }\r\n this.value.set({\r\n ...cfg,\r\n matchMode: 'all',\r\n conditions: cfg.conditions.slice(0, 1),\r\n });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const defs = this.operatorDefs();\r\n const first = defs[0];\r\n if (!first) {\r\n throw new NgnError('filter', 'No operators available.');\r\n }\r\n const defIds = new Set(defs.map(d => d.id));\r\n\r\n const normalizeConditions = (\r\n conditions: readonly ConditionInternal[]\r\n ): readonly ConditionInternal[] => {\r\n let changed = false;\r\n const next = conditions.map(c => {\r\n if (defIds.has(c.operator)) {\r\n return c;\r\n }\r\n changed = true;\r\n return { ...c, operator: first.id, rawValue: null };\r\n });\r\n return changed ? next : conditions;\r\n };\r\n\r\n const cfg = this.value();\r\n if (!cfg || cfg.dataType === 'list') {\r\n return;\r\n }\r\n\r\n const current = cfg.conditions;\r\n const next = normalizeConditions(current);\r\n if (next !== current) {\r\n this.value.set({ ...cfg, conditions: next });\r\n }\r\n });\r\n\r\n this._destroyRef.onDestroy(() => {\r\n if (this._debounceTimer != null) {\r\n clearTimeout(this._debounceTimer);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Commits the working config to the actual value, with optional debounce.\r\n * Called after every working config change.\r\n */\r\n private commitWorkingConfig(): void {\r\n if (this.autoApply()) {\r\n if (this._debounceTimer != null) {\r\n clearTimeout(this._debounceTimer);\r\n }\r\n const debounceMs = this.autoApplyDebounce();\r\n if (debounceMs > 0) {\r\n this._debounceTimer = setTimeout(() => {\r\n this._debounceTimer = null;\r\n this.value.set(this.workingConfig());\r\n }, debounceMs);\r\n } else {\r\n this.value.set(this.workingConfig());\r\n }\r\n }\r\n // In manual mode, do nothing — wait for apply()\r\n }\r\n\r\n /** Updates the working config and optionally auto-applies. */\r\n private updateWorkingConfig(config: NgnFilterConfig | null): void {\r\n this.workingConfig.set(config);\r\n this.commitWorkingConfig();\r\n }\r\n\r\n protected toggleMatchMode(): void {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list' || !this.allowMultiple()) {\r\n return;\r\n }\r\n const newMode = cfg.matchMode === 'all' ? 'any' : 'all';\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: newMode,\r\n });\r\n }\r\n\r\n protected setMatchMode(value: unknown): void {\r\n if (value === 'all' || value === 'any') {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? value : 'all',\r\n });\r\n }\r\n }\r\n\r\n protected operatorRequiresValue(operator: NgnFilterOperatorId): boolean {\r\n const def = this.operatorDefs().find(d => d.id === operator);\r\n return def?.requiresValue ?? true;\r\n }\r\n\r\n protected setOperator(index: number, operator: NgnFilterOperatorId | null): void {\r\n if (!operator) {\r\n return;\r\n }\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const next = cfg.conditions.slice();\r\n const existing = next[index];\r\n if (!existing) {\r\n return;\r\n }\r\n next[index] = {\r\n ...existing,\r\n operator,\r\n rawValue: this.operatorRequiresValue(operator) ? existing.rawValue : null,\r\n };\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? cfg.matchMode : 'all',\r\n conditions: next,\r\n });\r\n }\r\n\r\n protected setRawValue(index: number, rawValue: string | null): void {\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const next = cfg.conditions.slice();\r\n const existing = next[index];\r\n if (!existing) {\r\n return;\r\n }\r\n next[index] = { ...existing, rawValue };\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? cfg.matchMode : 'all',\r\n conditions: next,\r\n });\r\n }\r\n\r\n protected setDateValue(index: number, date: Date | null): void {\r\n this.setRawValue(index, this.dateToRaw(date));\r\n }\r\n\r\n protected addCondition(): void {\r\n if (!this.allowMultiple()) {\r\n return;\r\n }\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const firstOp = this.operatorDefs()[0]?.id ?? 'isEqual';\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: cfg.matchMode,\r\n conditions: [...cfg.conditions, this.createCondition(firstOp)],\r\n });\r\n }\r\n\r\n protected removeCondition(index: number): void {\r\n if (!this.allowMultiple()) {\r\n return;\r\n }\r\n const cfg = this.templateConfig();\r\n if (cfg.dataType === 'list') {\r\n return;\r\n }\r\n const current = cfg.conditions;\r\n if (current.length <= 1) {\r\n return;\r\n }\r\n const next = current.slice();\r\n next.splice(index, 1);\r\n this.updateWorkingConfig({\r\n ...cfg,\r\n matchMode: cfg.matchMode,\r\n conditions: next,\r\n });\r\n }\r\n\r\n protected setListSelection(value: unknown): void {\r\n const arr = Array.isArray(value)\r\n ? value.map(v => String(v))\r\n : value == null\r\n ? []\r\n : [String(value)];\r\n\r\n this.updateWorkingConfig({\r\n dataType: 'list',\r\n matchMode: 'all',\r\n conditions: <readonly NgnFilterConditionConfig[]>[\r\n {\r\n operator: 'in',\r\n rawValue: arr.length > 0 ? JSON.stringify(arr) : null,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n /** Applies the working config (manual mode). */\r\n protected apply(): void {\r\n const cfg = this.workingConfig();\r\n this.value.set(cfg);\r\n // Update snapshot so next cancel restores to this applied state\r\n this._snapshotConfig = cfg ? JSON.parse(JSON.stringify(cfg)) : null;\r\n if (this.mode() !== 'inline') {\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Cancels changes and restores the snapshot (manual mode). */\r\n protected cancelChanges(): void {\r\n // Clear any pending debounce\r\n if (this._debounceTimer != null) {\r\n clearTimeout(this._debounceTimer);\r\n this._debounceTimer = null;\r\n }\r\n this.workingConfig.set(\r\n this._snapshotConfig ? JSON.parse(JSON.stringify(this._snapshotConfig)) : null\r\n );\r\n if (this.mode() !== 'inline') {\r\n this.hide();\r\n }\r\n }\r\n\r\n protected clear(): void {\r\n this.updateWorkingConfig(null);\r\n if (!this.autoApply()) {\r\n // In manual mode, also commit clear immediately\r\n this.value.set(null);\r\n this._snapshotConfig = null;\r\n }\r\n if (this.mode() !== 'inline') {\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Shows the filter popup. Only works when {@link mode} is not `inline`. */\r\n public show(): void {\r\n if (this.mode() === 'inline') {\r\n throw new NgnError('filter', 'Cannot open an inline filter.');\r\n }\r\n if (this.mode() === 'headless' && !this.anchor()) {\r\n throw new NgnError('filter', 'Headless mode requires an [anchor] input.');\r\n }\r\n const popover = this._popover();\r\n if (!popover) {\r\n throw new NgnError('filter', 'Popover is not available.');\r\n }\r\n\r\n // Snapshot current value for cancel\r\n const val = this.value();\r\n this._snapshotConfig = val ? JSON.parse(JSON.stringify(val)) : null;\r\n // Reset working config to current value\r\n this.workingConfig.set(val);\r\n\r\n popover.show();\r\n }\r\n\r\n /** Hides the filter popup. Only works when {@link mode} is not `inline`. */\r\n public hide(): void {\r\n if (this.mode() === 'inline') {\r\n throw new NgnError('filter', 'Cannot close an inline filter.');\r\n }\r\n this._popover()?.hide();\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter') {\r\n if (this.mode() !== 'inline') {\r\n this._popover()?.toggle();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n}\r\n","<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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -42,10 +42,10 @@ class I18n extends BaseTranslateService {
|
|
|
42
42
|
unsafe(key) {
|
|
43
43
|
return this.translations._unsafe[key];
|
|
44
44
|
}
|
|
45
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
46
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
45
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: I18n, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
46
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: I18n });
|
|
47
47
|
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: I18n, decorators: [{
|
|
49
49
|
type: Injectable
|
|
50
50
|
}], ctorParameters: () => [] });
|
|
51
51
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-i18n.mjs","sources":["../../src/i18n/load-language.ts","../../src/i18n/types.ts","../../src/i18n/i18n.ts","../../src/i18n/ngneers-controls-i18n.ts"],"sourcesContent":["import { NgnError } from '@ngneers/controls/utils';\r\n\r\nimport type { SupportedLanguage, Translations } from './types';\r\n\r\nconst customLanguages: Record<string, (() => Promise<Translations>) | undefined> = {};\r\n\r\nexport function registerCustomLanguage(\r\n language: string,\r\n translations: () => Promise<Translations>\r\n): void {\r\n customLanguages[language] = translations;\r\n}\r\n\r\nexport function registerCustomLanguages(\r\n languages: Record<string, () => Promise<Translations>>\r\n): void {\r\n Object.entries(languages).forEach(([lang, translations]) => {\r\n registerCustomLanguage(lang, translations);\r\n });\r\n}\r\n\r\nexport async function loadLanguage(language: SupportedLanguage): Promise<Translations> {\r\n switch (language) {\r\n case 'en': {\r\n const m = await import('./translations/en');\r\n return m.default;\r\n }\r\n case 'de': {\r\n const m = await import('./translations/de');\r\n return m.default;\r\n }\r\n default:\r\n if (customLanguages[language]) {\r\n return customLanguages[language]();\r\n }\r\n return Promise.reject(new NgnError('i18n', `Unsupported language: ${language}`));\r\n }\r\n}\r\n","export const supportedLanguages = ['en', 'de'] as const;\r\nimport type En from './translations/en';\r\n\r\nexport type SupportedLanguage = (typeof supportedLanguages)[number];\r\n\r\nexport type Translations = typeof En;\r\n","import { Injectable, type Signal } from '@angular/core';\r\nimport { BaseTranslateService } from '@ngneers/signal-translate';\r\n\r\nimport { loadLanguage } from './load-language';\r\nimport { type SupportedLanguage, supportedLanguages, type Translations } from './types';\r\n\r\n@Injectable()\r\nexport class I18n extends BaseTranslateService<Translations> {\r\n constructor() {\r\n super(supportedLanguages, 'en');\r\n }\r\n\r\n protected loadTranslations(lang: string): Promise<Translations> {\r\n return loadLanguage(lang as SupportedLanguage);\r\n }\r\n\r\n public unsafe(key: string): Signal<string> {\r\n return this.translations._unsafe[key] as unknown as Signal<string>;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA,MAAM,eAAe,GAA8D,EAAE;AAE/E,SAAU,sBAAsB,CACpC,QAAgB,EAChB,YAAyC,EAAA;AAEzC,IAAA,eAAe,CAAC,QAAQ,CAAC,GAAG,YAAY;AAC1C;AAEM,SAAU,uBAAuB,CACrC,SAAsD,EAAA;AAEtD,IAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,KAAI;AACzD,QAAA,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC;AAC5C,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,YAAY,CAAC,QAA2B,EAAA;IAC5D,QAAQ,QAAQ;QACd,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,MAAM,OAAO,yCAAmB,CAAC;YAC3C,OAAO,CAAC,CAAC,OAAO;QAClB;QACA,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,MAAM,OAAO,yCAAmB,CAAC;YAC3C,OAAO,CAAC,CAAC,OAAO;QAClB;AACA,QAAA;AACE,YAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;AAC7B,gBAAA,OAAO,eAAe,CAAC,QAAQ,CAAC,EAAE;YACpC;AACA,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAC,CAAC;;AAEtF;;MCrCa,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI;;ACOvC,MAAO,IAAK,SAAQ,oBAAkC,CAAA;AAC1D,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC;IACjC;AAEU,IAAA,gBAAgB,CAAC,IAAY,EAAA;AACrC,QAAA,OAAO,YAAY,CAAC,IAAyB,CAAC;IAChD;AAEO,IAAA,MAAM,CAAC,GAAW,EAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAA8B;IACpE;
|
|
1
|
+
{"version":3,"file":"ngneers-controls-i18n.mjs","sources":["../../src/i18n/load-language.ts","../../src/i18n/types.ts","../../src/i18n/i18n.ts","../../src/i18n/ngneers-controls-i18n.ts"],"sourcesContent":["import { NgnError } from '@ngneers/controls/utils';\r\n\r\nimport type { SupportedLanguage, Translations } from './types';\r\n\r\nconst customLanguages: Record<string, (() => Promise<Translations>) | undefined> = {};\r\n\r\nexport function registerCustomLanguage(\r\n language: string,\r\n translations: () => Promise<Translations>\r\n): void {\r\n customLanguages[language] = translations;\r\n}\r\n\r\nexport function registerCustomLanguages(\r\n languages: Record<string, () => Promise<Translations>>\r\n): void {\r\n Object.entries(languages).forEach(([lang, translations]) => {\r\n registerCustomLanguage(lang, translations);\r\n });\r\n}\r\n\r\nexport async function loadLanguage(language: SupportedLanguage): Promise<Translations> {\r\n switch (language) {\r\n case 'en': {\r\n const m = await import('./translations/en');\r\n return m.default;\r\n }\r\n case 'de': {\r\n const m = await import('./translations/de');\r\n return m.default;\r\n }\r\n default:\r\n if (customLanguages[language]) {\r\n return customLanguages[language]();\r\n }\r\n return Promise.reject(new NgnError('i18n', `Unsupported language: ${language}`));\r\n }\r\n}\r\n","export const supportedLanguages = ['en', 'de'] as const;\r\nimport type En from './translations/en';\r\n\r\nexport type SupportedLanguage = (typeof supportedLanguages)[number];\r\n\r\nexport type Translations = typeof En;\r\n","import { Injectable, type Signal } from '@angular/core';\r\nimport { BaseTranslateService } from '@ngneers/signal-translate';\r\n\r\nimport { loadLanguage } from './load-language';\r\nimport { type SupportedLanguage, supportedLanguages, type Translations } from './types';\r\n\r\n@Injectable()\r\nexport class I18n extends BaseTranslateService<Translations> {\r\n constructor() {\r\n super(supportedLanguages, 'en');\r\n }\r\n\r\n protected loadTranslations(lang: string): Promise<Translations> {\r\n return loadLanguage(lang as SupportedLanguage);\r\n }\r\n\r\n public unsafe(key: string): Signal<string> {\r\n return this.translations._unsafe[key] as unknown as Signal<string>;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA,MAAM,eAAe,GAA8D,EAAE;AAE/E,SAAU,sBAAsB,CACpC,QAAgB,EAChB,YAAyC,EAAA;AAEzC,IAAA,eAAe,CAAC,QAAQ,CAAC,GAAG,YAAY;AAC1C;AAEM,SAAU,uBAAuB,CACrC,SAAsD,EAAA;AAEtD,IAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,KAAI;AACzD,QAAA,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC;AAC5C,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,YAAY,CAAC,QAA2B,EAAA;IAC5D,QAAQ,QAAQ;QACd,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,MAAM,OAAO,yCAAmB,CAAC;YAC3C,OAAO,CAAC,CAAC,OAAO;QAClB;QACA,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,MAAM,OAAO,yCAAmB,CAAC;YAC3C,OAAO,CAAC,CAAC,OAAO;QAClB;AACA,QAAA;AACE,YAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;AAC7B,gBAAA,OAAO,eAAe,CAAC,QAAQ,CAAC,EAAE;YACpC;AACA,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAC,CAAC;;AAEtF;;MCrCa,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI;;ACOvC,MAAO,IAAK,SAAQ,oBAAkC,CAAA;AAC1D,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC;IACjC;AAEU,IAAA,gBAAgB,CAAC,IAAY,EAAA;AACrC,QAAA,OAAO,YAAY,CAAC,IAAyB,CAAC;IAChD;AAEO,IAAA,MAAM,CAAC,GAAW,EAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAA8B;IACpE;wGAXW,IAAI,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAJ,IAAI,EAAA,CAAA;;4FAAJ,IAAI,EAAA,UAAA,EAAA,CAAA;kBADhB;;;ACND;;AAEG;;;;"}
|