@ngneers/controls 0.0.1-pre5 → 0.0.1-pre6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +32 -32
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-ng.mjs +19 -19
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
  6. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-avatar.mjs +13 -13
  8. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
  9. package/fesm2022/ngneers-controls-base.mjs +89 -64
  10. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-breadcrumb.mjs +18 -18
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-button-group.mjs +8 -8
  14. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-button.mjs +15 -10
  16. package/fesm2022/ngneers-controls-button.mjs.map +1 -1
  17. package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs → ngneers-controls-calendar-time-Bzlv9Vkn.mjs} +9 -9
  18. package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs.map → ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map} +1 -1
  19. package/fesm2022/ngneers-controls-calendar.mjs +54 -54
  20. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
  22. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-chip.mjs +6 -6
  24. package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-defer.mjs +10 -10
  26. package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-dialog.mjs +37 -39
  28. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-directives.mjs +45 -39
  30. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-drawer.mjs +28 -28
  32. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -15
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-filter.mjs +192 -44
  36. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  37. package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
  38. package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
  39. package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
  40. package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
  41. package/fesm2022/ngneers-controls-i18n.mjs +5 -5
  42. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-icon.mjs +10 -10
  44. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-inplace.mjs +18 -18
  46. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
  47. package/fesm2022/ngneers-controls-input-field.mjs +14 -14
  48. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
  50. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-input.mjs +6 -6
  52. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  53. package/fesm2022/ngneers-controls-item-view.mjs +33 -33
  54. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-list-box.mjs +31 -31
  56. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-menu.mjs +32 -32
  58. package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-message.mjs +4 -4
  60. package/fesm2022/ngneers-controls-message.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-paginator.mjs +12 -12
  62. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-popover.mjs +13 -13
  64. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-progress.mjs +16 -16
  66. package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
  67. package/fesm2022/ngneers-controls-scroller.mjs +74 -39
  68. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-select-button.mjs +6 -6
  70. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-select.mjs +46 -46
  72. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-slider.mjs +11 -11
  74. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-spinner.mjs +7 -7
  76. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-splitter.mjs +141 -328
  78. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  80. package/fesm2022/ngneers-controls-table.mjs +1520 -80
  81. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  82. package/fesm2022/ngneers-controls-tabs.mjs +40 -39
  83. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  84. package/fesm2022/ngneers-controls-tag.mjs +4 -4
  85. package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
  86. package/fesm2022/ngneers-controls-toast.mjs +18 -18
  87. package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
  88. package/fesm2022/ngneers-controls-toggle-button.mjs +9 -9
  89. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  90. package/fesm2022/ngneers-controls-tooltip.mjs +36 -36
  91. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  92. package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
  93. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
  94. package/package.json +14 -10
  95. package/types/ngneers-controls-api-ng.d.ts +2 -2
  96. package/types/ngneers-controls-api-resize.d.ts +318 -0
  97. package/types/ngneers-controls-base.d.ts +8 -0
  98. package/types/ngneers-controls-breadcrumb.d.ts +1 -1
  99. package/types/ngneers-controls-button.d.ts +13 -8
  100. package/types/ngneers-controls-calendar.d.ts +5 -1
  101. package/types/ngneers-controls-checkbox.d.ts +1 -1
  102. package/types/ngneers-controls-directives.d.ts +7 -1
  103. package/types/ngneers-controls-drawer.d.ts +4 -0
  104. package/types/ngneers-controls-edit-inplace.d.ts +4 -0
  105. package/types/ngneers-controls-filter.d.ts +53 -4
  106. package/types/ngneers-controls-i18n.d.ts +4 -0
  107. package/types/ngneers-controls-icon.d.ts +1 -1
  108. package/types/ngneers-controls-input-field.d.ts +4 -0
  109. package/types/ngneers-controls-list-box.d.ts +5 -1
  110. package/types/ngneers-controls-menu.d.ts +1 -1
  111. package/types/ngneers-controls-paginator.d.ts +4 -0
  112. package/types/ngneers-controls-popover.d.ts +1 -1
  113. package/types/ngneers-controls-scroller.d.ts +12 -2
  114. package/types/ngneers-controls-select.d.ts +6 -2
  115. package/types/ngneers-controls-spinner.d.ts +1 -1
  116. package/types/ngneers-controls-splitter.d.ts +29 -59
  117. package/types/ngneers-controls-table.d.ts +392 -24
  118. package/types/ngneers-controls-toast.d.ts +1 -1
  119. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
  120. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
@@ -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 effect,\r\n inject,\r\n input,\r\n output,\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 { 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 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\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 /** 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: '250px',\r\n minHeight: '200px',\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 // Note: `value()` is the single source of truth.\r\n // It can be `null` (cleared). For rendering, use `templateConfig()` which falls back to defaults.\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: this.allowMultiple() ? 'all' : '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 * Falls back to a default config when the actual {@link value} is null.\r\n */\r\n protected readonly templateConfig = computed<NgnFilterConfig>(\r\n () => (this.value() ?? 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 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 constructor() {\r\n super();\r\n\r\n effect(() => {\r\n this.filterChange.emit(this.value() ?? null);\r\n });\r\n\r\n effect(() => {\r\n // When local filtering is disabled, do not emit or compute any result.\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 // Ensure all conditions use a valid operator\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\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.value.set({\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.value.set({\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.value.set({\r\n ...cfg,\r\n matchMode: this.allowMultiple() ? cfg.matchMode : 'all',\r\n conditions: next,\r\n });\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.value.set({\r\n ...cfg,\r\n matchMode: 'all',\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.value.set({\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.value.set({\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 protected clear(): void {\r\n this.value.set(null);\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 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 (valueChange)=\"setListSelection($event)\"\r\n />\r\n </div>\r\n } @else {\r\n @for (c of templateConfig().conditions; track $index; let i = $index) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row'\" [attr.data-testid]=\"'filter-row-' + i\">\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'operator'\"\r\n [options]=\"operatorOptions()\"\r\n [value]=\"c.operator\"\r\n (valueChange)=\"setOperator(i, $event)\"\r\n />\r\n @if (operatorRequiresValue(c.operator)) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'value'\">\r\n <input\r\n ngnInput\r\n [type]=\"inputType()\"\r\n [value]=\"c.rawValue || ''\"\r\n (valueChange)=\"setRawValue(i, $event)\"\r\n />\r\n </ngn-input-field>\r\n }\r\n\r\n @if (allowMultiple() && templateConfig().conditions.length > 1) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'row-actions'\">\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"'text'\"\r\n [color]=\"'error'\"\r\n (click)=\"removeCondition(i)\"\r\n >\r\n {{ i18n['filter_removeCondition']() + ' ' + (i + 1) }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #matchModeTemplate>\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <ngn-select\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'match'\"\r\n [options]=\"matchModeOptions\"\r\n [value]=\"templateConfig().matchMode\"\r\n (valueChange)=\"setMatchMode($event)\"\r\n data-testid=\"filter-match-mode\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n <div [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n @if (dataType() !== 'list' && allowMultiple()) {\r\n <button\r\n type=\"button\"\r\n ngnButton\r\n kind=\"secondary\"\r\n (click)=\"addCondition()\"\r\n data-testid=\"filter-add-rule\"\r\n >\r\n <span aria-hidden=\"true\">+</span>\r\n {{ i18n['filter_addCondition']() }}\r\n </button>\r\n }\r\n <button type=\"button\" ngnButton kind=\"secondary\" (click)=\"clear()\" data-testid=\"filter-clear\">\r\n {{ i18n['filter_clear']() }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #popoverTemplate let-anchor=\"anchor\">\r\n <ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"anchor\"\r\n [hasShrinkableContent]=\"true\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [id]=\"inputId() + '_popover'\"\r\n >\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n <ng-container [ngTemplateOutlet]=\"matchModeTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n </ng-template>\r\n </ngn-popover>\r\n</ng-template>\r\n\r\n@if (mode() === 'inline') {\r\n <div [ptInt]=\"this\" [ptClass]=\"'inline'\">\r\n <ng-container [ngTemplateOutlet]=\"matchModeTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"rowsTemplate\" />\r\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\r\n </div>\r\n} @else if (mode() === 'input') {\r\n <ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'input-field'\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n >\r\n <div role=\"button\" [ptInt]=\"this\" [ptClass]=\"'summary'\">{{ summaryText() }}</div>\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" defaultIcon=\"magnifying_glass\" />\r\n </ngn-input-field>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: field.element.nativeElement }\"\r\n />\r\n} @else {\r\n @if (anchor()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"popoverTemplate\"\r\n [ngTemplateOutletContext]=\"{ anchor: anchor() }\"\r\n />\r\n }\r\n}\r\n","/**\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=\"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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"}
@@ -43,10 +43,14 @@ var de = {
43
43
  addCondition: 'Bedingung hinzufügen',
44
44
  removeCondition: 'Bedingung entfernen',
45
45
  clear: 'Zurücksetzen',
46
+ apply: 'Anwenden',
47
+ cancel: 'Abbrechen',
46
48
  matchModeLabel: 'Match-Modus',
47
49
  match: {
48
- all: 'Alle',
49
- any: 'Beliebig',
50
+ all: 'Alle Bedingungen',
51
+ any: 'Beliebige Bedingung',
52
+ and: 'und',
53
+ or: 'oder',
50
54
  },
51
55
  selected: 'ausgewählt',
52
56
  conditions: 'Bedingungen',
@@ -67,8 +71,8 @@ var de = {
67
71
  onOrAfter: 'Am oder nach',
68
72
  before: 'Vor',
69
73
  onOrBefore: 'Am oder vor',
70
- isTrue: 'Ist wahr',
71
- isFalse: 'Ist falsch',
74
+ isTrue: 'Ja',
75
+ isFalse: 'Nein',
72
76
  custom: 'Benutzerdefiniert',
73
77
  },
74
78
  },
@@ -84,4 +88,4 @@ var de = {
84
88
  };
85
89
 
86
90
  export { de as default };
87
- //# sourceMappingURL=ngneers-controls-i18n-de-CdTPeBiR.mjs.map
91
+ //# sourceMappingURL=ngneers-controls-i18n-de-CF0xTWEX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-i18n-de-CF0xTWEX.mjs","sources":["../../src/i18n/translations/de.ts"],"sourcesContent":["export default {\r\n calendar: {\r\n today: 'Heute',\r\n selectYear: 'Jahr auswählen',\r\n weekdays: {\r\n monday: 'Montag',\r\n tuesday: 'Dienstag',\r\n wednesday: 'Mittwoch',\r\n thursday: 'Donnerstag',\r\n friday: 'Freitag',\r\n saturday: 'Samstag',\r\n sunday: 'Sonntag',\r\n },\r\n weekdaysShort: {\r\n monday: 'Mo',\r\n tuesday: 'Di',\r\n wednesday: 'Mi',\r\n thursday: 'Do',\r\n friday: 'Fr',\r\n saturday: 'Sa',\r\n sunday: 'So',\r\n },\r\n months: {\r\n january: 'Januar',\r\n february: 'Februar',\r\n march: 'März',\r\n april: 'April',\r\n may: 'Mai',\r\n june: 'Juni',\r\n july: 'Juli',\r\n august: 'August',\r\n september: 'September',\r\n october: 'Oktober',\r\n november: 'November',\r\n december: 'Dezember',\r\n },\r\n },\r\n editInplace: {\r\n placeholder: 'Klicken zum Bearbeiten',\r\n },\r\n filter: {\r\n noFilter: 'Kein Filter',\r\n addCondition: 'Bedingung hinzufügen',\r\n removeCondition: 'Bedingung entfernen',\r\n clear: 'Zurücksetzen',\r\n apply: 'Anwenden',\r\n cancel: 'Abbrechen',\r\n matchModeLabel: 'Match-Modus',\r\n match: {\r\n all: 'Alle Bedingungen',\r\n any: 'Beliebige Bedingung',\r\n and: 'und',\r\n or: 'oder',\r\n },\r\n selected: 'ausgewählt',\r\n conditions: 'Bedingungen',\r\n operators: {\r\n isEqual: 'Ist gleich',\r\n isNotEqual: 'Ist nicht gleich',\r\n contains: 'Enthält',\r\n startsWith: 'Beginnt mit',\r\n endsWith: 'Endet mit',\r\n in: 'Ist eines von',\r\n isEmpty: 'Ist leer',\r\n isNotEmpty: 'Ist nicht leer',\r\n greaterThan: 'Größer als',\r\n greaterThanOrEqual: 'Größer oder gleich',\r\n lessThan: 'Kleiner als',\r\n lessThanOrEqual: 'Kleiner oder gleich',\r\n after: 'Nach',\r\n onOrAfter: 'Am oder nach',\r\n before: 'Vor',\r\n onOrBefore: 'Am oder vor',\r\n isTrue: 'Ja',\r\n isFalse: 'Nein',\r\n custom: 'Benutzerdefiniert',\r\n },\r\n },\r\n splitter: {\r\n handleLabel: 'Ziehen zum Ändern der Größe',\r\n },\r\n inputField: {\r\n clearInput: 'Eingabe löschen',\r\n },\r\n drawer: {\r\n close: 'Schließen',\r\n },\r\n};\r\n"],"names":[],"mappings":"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"}
@@ -43,10 +43,14 @@ var en = {
43
43
  addCondition: 'Add condition',
44
44
  removeCondition: 'Remove condition',
45
45
  clear: 'Clear',
46
+ apply: 'Apply',
47
+ cancel: 'Cancel',
46
48
  matchModeLabel: 'Match mode',
47
49
  match: {
48
- all: 'All',
49
- any: 'Any',
50
+ all: 'Match all',
51
+ any: 'Match any',
52
+ and: 'and',
53
+ or: 'or',
50
54
  },
51
55
  selected: 'selected',
52
56
  conditions: 'conditions',
@@ -67,8 +71,8 @@ var en = {
67
71
  onOrAfter: 'On or after',
68
72
  before: 'Before',
69
73
  onOrBefore: 'On or before',
70
- isTrue: 'Is true',
71
- isFalse: 'Is false',
74
+ isTrue: 'Yes',
75
+ isFalse: 'No',
72
76
  custom: 'Custom',
73
77
  },
74
78
  },
@@ -84,4 +88,4 @@ var en = {
84
88
  };
85
89
 
86
90
  export { en as default };
87
- //# sourceMappingURL=ngneers-controls-i18n-en-Cfp2pOLY.mjs.map
91
+ //# sourceMappingURL=ngneers-controls-i18n-en-8B7xAjH2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-i18n-en-8B7xAjH2.mjs","sources":["../../src/i18n/translations/en.ts"],"sourcesContent":["export default {\r\n calendar: {\r\n today: 'Today',\r\n selectYear: 'Select year',\r\n weekdays: {\r\n monday: 'Monday',\r\n tuesday: 'Tuesday',\r\n wednesday: 'Wednesday',\r\n thursday: 'Thursday',\r\n friday: 'Friday',\r\n saturday: 'Saturday',\r\n sunday: 'Sunday',\r\n },\r\n weekdaysShort: {\r\n monday: 'Mo',\r\n tuesday: 'Tu',\r\n wednesday: 'We',\r\n thursday: 'Th',\r\n friday: 'Fr',\r\n saturday: 'Sa',\r\n sunday: 'Su',\r\n },\r\n months: {\r\n january: 'January',\r\n february: 'February',\r\n march: 'March',\r\n april: 'April',\r\n may: 'May',\r\n june: 'June',\r\n july: 'July',\r\n august: 'August',\r\n september: 'September',\r\n october: 'October',\r\n november: 'November',\r\n december: 'December',\r\n },\r\n },\r\n editInplace: {\r\n placeholder: 'Click to edit',\r\n },\r\n filter: {\r\n noFilter: 'No filter',\r\n addCondition: 'Add condition',\r\n removeCondition: 'Remove condition',\r\n clear: 'Clear',\r\n apply: 'Apply',\r\n cancel: 'Cancel',\r\n matchModeLabel: 'Match mode',\r\n match: {\r\n all: 'Match all',\r\n any: 'Match any',\r\n and: 'and',\r\n or: 'or',\r\n },\r\n selected: 'selected',\r\n conditions: 'conditions',\r\n operators: {\r\n isEqual: 'Is equal',\r\n isNotEqual: 'Is not equal',\r\n contains: 'Contains',\r\n startsWith: 'Starts with',\r\n endsWith: 'Ends with',\r\n in: 'Is one of',\r\n isEmpty: 'Is empty',\r\n isNotEmpty: 'Is not empty',\r\n greaterThan: 'Greater than',\r\n greaterThanOrEqual: 'Greater than or equal',\r\n lessThan: 'Less than',\r\n lessThanOrEqual: 'Less than or equal',\r\n after: 'After',\r\n onOrAfter: 'On or after',\r\n before: 'Before',\r\n onOrBefore: 'On or before',\r\n isTrue: 'Yes',\r\n isFalse: 'No',\r\n custom: 'Custom',\r\n },\r\n },\r\n splitter: {\r\n handleLabel: 'Drag to resize',\r\n },\r\n inputField: {\r\n clearInput: 'Clear input',\r\n },\r\n drawer: {\r\n close: 'Close',\r\n },\r\n};\r\n"],"names":[],"mappings":"AAAA,SAAe;AACb,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,UAAU,EAAE,aAAa;AACzB,QAAA,QAAQ,EAAE;AACR,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,SAAS,EAAE,WAAW;AACtB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA;AACD,QAAA,aAAa,EAAE;AACb,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,MAAM,EAAE,IAAI;AACb,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,SAAS,EAAE,WAAW;AACtB,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,QAAQ,EAAE,UAAU;AACrB,SAAA;AACF,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,WAAW,EAAE,eAAe;AAC7B,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,YAAY,EAAE,eAAe;AAC7B,QAAA,eAAe,EAAE,kBAAkB;AACnC,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,cAAc,EAAE,YAAY;AAC5B,QAAA,KAAK,EAAE;AACL,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,EAAE,EAAE,IAAI;AACT,SAAA;AACD,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,UAAU,EAAE,YAAY;AACxB,QAAA,SAAS,EAAE;AACT,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,UAAU,EAAE,cAAc;AAC1B,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,UAAU,EAAE,aAAa;AACzB,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,UAAU,EAAE,cAAc;AAC1B,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,kBAAkB,EAAE,uBAAuB;AAC3C,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,eAAe,EAAE,oBAAoB;AACrC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,SAAS,EAAE,aAAa;AACxB,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,UAAU,EAAE,cAAc;AAC1B,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,WAAW,EAAE,gBAAgB;AAC9B,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,UAAU,EAAE,aAAa;AAC1B,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,OAAO;AACf,KAAA;CACF;;;;"}
@@ -15,11 +15,11 @@ function registerCustomLanguages(languages) {
15
15
  async function loadLanguage(language) {
16
16
  switch (language) {
17
17
  case 'en': {
18
- const m = await import('./ngneers-controls-i18n-en-Cfp2pOLY.mjs');
18
+ const m = await import('./ngneers-controls-i18n-en-8B7xAjH2.mjs');
19
19
  return m.default;
20
20
  }
21
21
  case 'de': {
22
- const m = await import('./ngneers-controls-i18n-de-CdTPeBiR.mjs');
22
+ const m = await import('./ngneers-controls-i18n-de-CF0xTWEX.mjs');
23
23
  return m.default;
24
24
  }
25
25
  default:
@@ -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.1.0", ngImport: i0, type: I18n, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
46
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: I18n });
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: I18n, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
46
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: I18n });
47
47
  }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: I18n, decorators: [{
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", 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 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,CAAmB;IACzD;uGAXW,IAAI,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAJ,IAAI,EAAA,CAAA;;2FAAJ,IAAI,EAAA,UAAA,EAAA,CAAA;kBADhB;;;ACND;;AAEG;;;;"}
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;uGAXW,IAAI,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAJ,IAAI,EAAA,CAAA;;2FAAJ,IAAI,EAAA,UAAA,EAAA,CAAA;kBADhB;;;ACND;;AAEG;;;;"}
@@ -9,7 +9,7 @@ import { asyncComputed } from '@ngneers/controls/utils-ng';
9
9
  import { iconControlTemplate } from '@ngneers/controls-themes/templates/icon';
10
10
 
11
11
  class GlobalIconTemplate {
12
- _globalIconTemplate = signal(null, ...(ngDevMode ? [{ debugName: "_globalIconTemplate" }] : []));
12
+ _globalIconTemplate = signal(null, ...(ngDevMode ? [{ debugName: "_globalIconTemplate" }] : /* istanbul ignore next */ []));
13
13
  globalIconTemplate = this._globalIconTemplate.asReadonly();
14
14
  setGlobalIconTemplate(template) {
15
15
  this._globalIconTemplate.set(template);
@@ -17,10 +17,10 @@ class GlobalIconTemplate {
17
17
  ngOnDestroy() {
18
18
  this._globalIconTemplate.set(null);
19
19
  }
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: GlobalIconTemplate, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
21
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: GlobalIconTemplate, providedIn: 'root' });
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: GlobalIconTemplate, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
21
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: GlobalIconTemplate, providedIn: 'root' });
22
22
  }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: GlobalIconTemplate, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: GlobalIconTemplate, decorators: [{
24
24
  type: Injectable,
25
25
  args: [{ providedIn: 'root' }]
26
26
  }] });
@@ -50,8 +50,8 @@ class NgnIcon extends NgnBase {
50
50
  theme = this.injectThemeTemplate(iconControlTemplate, 'root');
51
51
  _globalIconTemplate = inject(GlobalIconTemplate).globalIconTemplate;
52
52
  _sanitizer = inject(DomSanitizer);
53
- defaultIcon = input(...(ngDevMode ? [undefined, { debugName: "defaultIcon" }] : []));
54
- icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
53
+ defaultIcon = input(...(ngDevMode ? [undefined, { debugName: "defaultIcon" }] : /* istanbul ignore next */ []));
54
+ icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
55
55
  templateType = templateTypesFn();
56
56
  defaultIconSvg = asyncComputed(async () => {
57
57
  const defaultIconKey = this.defaultIcon();
@@ -68,7 +68,7 @@ class NgnIcon extends NgnBase {
68
68
  return globalTemplate;
69
69
  }
70
70
  return this._defaultIconTemplate();
71
- }, ...(ngDevMode ? [{ debugName: "usedIconTemplate" }] : []));
71
+ }, ...(ngDevMode ? [{ debugName: "usedIconTemplate" }] : /* istanbul ignore next */ []));
72
72
  constructor() {
73
73
  super();
74
74
  afterRenderEffect(() => {
@@ -77,10 +77,10 @@ class NgnIcon extends NgnBase {
77
77
  }
78
78
  });
79
79
  }
80
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnIcon, isStandalone: true, selector: "ngn-icon", inputs: { defaultIcon: { classPropertyName: "defaultIcon", publicName: "defaultIcon", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "ngSkipHydration": "true" } }, providers: [provideSelf(NgnIcon)], viewQueries: [{ propertyName: "_defaultIconTemplate", first: true, predicate: ["defaultIconTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (icon()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n usedIconTemplate();\r\n context: {\r\n $implicit: {\r\n icon: icon(),\r\n },\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultIconTemplate [ngnTemplate]=\"templateType\" let-icon\r\n ><i [style.--fa-display]=\"'block'\" class=\"{{ icon.icon }}\"></i\r\n ></ng-template>\r\n} @else {\r\n <!-- imported svg icon -->\r\n @if (defaultIconSvg(); as defaultIcon) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\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: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
80
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.2", type: NgnIcon, isStandalone: true, selector: "ngn-icon", inputs: { defaultIcon: { classPropertyName: "defaultIcon", publicName: "defaultIcon", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "ngSkipHydration": "true" } }, providers: [provideSelf(NgnIcon)], viewQueries: [{ propertyName: "_defaultIconTemplate", first: true, predicate: ["defaultIconTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (icon()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n usedIconTemplate();\r\n context: {\r\n $implicit: {\r\n icon: icon(),\r\n },\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultIconTemplate [ngnTemplate]=\"templateType\" let-icon\r\n ><i [style.--fa-display]=\"'block'\" class=\"{{ icon.icon }}\"></i\r\n ></ng-template>\r\n} @else {\r\n <!-- imported svg icon -->\r\n @if (defaultIconSvg(); as defaultIcon) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\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: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
82
82
  }
83
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnIcon, decorators: [{
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnIcon, decorators: [{
84
84
  type: Component,
85
85
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-icon', imports: [NgnPt, NgTemplateOutlet, NgnTemplate], providers: [provideSelf(NgnIcon)], host: {
86
86
  ngSkipHydration: 'true',
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-icon.mjs","sources":["../../src/icon/global-icon-template.ts","../../src/icon/default-icons/ts/index.ts","../../src/icon/icon.ts","../../src/icon/icon.html","../../src/icon/ngneers-controls-icon.ts"],"sourcesContent":["import { Injectable, signal, TemplateRef, type OnDestroy } from '@angular/core';\r\n\r\nimport type { IconTemplateContext } from './types';\r\n\r\nexport type IconTemplateType = TemplateRef<IconTemplateContext>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class GlobalIconTemplate implements OnDestroy {\r\n private readonly _globalIconTemplate = signal<IconTemplateType | null>(null);\r\n\r\n public readonly globalIconTemplate = this._globalIconTemplate.asReadonly();\r\n\r\n public setGlobalIconTemplate(template: IconTemplateType) {\r\n this._globalIconTemplate.set(template);\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._globalIconTemplate.set(null);\r\n }\r\n}\r\n","export const DEFAULT_ICONS = {\n calendar: () => import('./calendar').then(module => module.default),\n check: () => import('./check').then(module => module.default),\n chevron_down: () => import('./chevron_down').then(module => module.default),\n chevron_left: () => import('./chevron_left').then(module => module.default),\n chevron_right: () => import('./chevron_right').then(module => module.default),\n chevron_up: () => import('./chevron_up').then(module => module.default),\n ellipsis: () => import('./ellipsis').then(module => module.default),\n filter: () => import('./filter').then(module => module.default),\n filter_solid: () => import('./filter_solid').then(module => module.default),\n magnifying_glass: () => import('./magnifying_glass').then(module => module.default),\n minus: () => import('./minus').then(module => module.default),\n sort: () => import('./sort').then(module => module.default),\n sort_down: () => import('./sort_down').then(module => module.default),\n sort_up: () => import('./sort_up').then(module => module.default),\n xmark: () => import('./xmark').then(module => module.default),\n};\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n TemplateRef,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { NgnTemplate, templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnError } from '@ngneers/controls/utils';\r\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\r\nimport { iconControlTemplate } from '@ngneers/controls-themes/templates/icon';\r\n\r\nimport { DEFAULT_ICONS } from './default-icons/ts';\r\nimport { GlobalIconTemplate } from './global-icon-template';\r\n\r\nimport type { DefaultIcon, IconTemplateContext } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-icon',\r\n templateUrl: './icon.html',\r\n imports: [NgnPt, NgTemplateOutlet, NgnTemplate],\r\n providers: [provideSelf(NgnIcon)],\r\n host: {\r\n ngSkipHydration: 'true',\r\n },\r\n})\r\nexport class NgnIcon extends NgnBase<'icon'> {\r\n protected readonly theme = this.injectThemeTemplate(iconControlTemplate, 'root');\r\n private readonly _globalIconTemplate = inject(GlobalIconTemplate).globalIconTemplate;\r\n private readonly _sanitizer = inject(DomSanitizer);\r\n\r\n public readonly defaultIcon = input<DefaultIcon>();\r\n public readonly icon = input<IconType>();\r\n\r\n protected readonly templateType = templateTypesFn<IconTemplateContext>();\r\n\r\n protected readonly defaultIconSvg = asyncComputed(async () => {\r\n const defaultIconKey = this.defaultIcon();\r\n if (!defaultIconKey) {\r\n return null;\r\n }\r\n const svg = DEFAULT_ICONS[defaultIconKey];\r\n return this._sanitizer.bypassSecurityTrustHtml(await svg()); // This is safe as we control the SVG content\r\n }, null);\r\n\r\n private readonly _defaultIconTemplate =\r\n viewChild.required<TemplateRef<IconTemplateContext>>('defaultIconTemplate');\r\n\r\n protected readonly usedIconTemplate = computed(() => {\r\n const globalTemplate = this._globalIconTemplate();\r\n if (globalTemplate) {\r\n return globalTemplate;\r\n }\r\n return this._defaultIconTemplate();\r\n });\r\n\r\n constructor() {\r\n super();\r\n afterRenderEffect(() => {\r\n if (!this.icon() && !this.defaultIcon()) {\r\n throw new NgnError(\r\n 'icon',\r\n 'Icon component requires either an icon or a default icon to be set.'\r\n );\r\n }\r\n });\r\n }\r\n}\r\n","@if (icon()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n usedIconTemplate();\r\n context: {\r\n $implicit: {\r\n icon: icon(),\r\n },\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultIconTemplate [ngnTemplate]=\"templateType\" let-icon\r\n ><i [style.--fa-display]=\"'block'\" class=\"{{ icon.icon }}\"></i\r\n ></ng-template>\r\n} @else {\r\n <!-- imported svg icon -->\r\n @if (defaultIconSvg(); as defaultIcon) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\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-icon.mjs","sources":["../../src/icon/global-icon-template.ts","../../src/icon/default-icons/ts/index.ts","../../src/icon/icon.ts","../../src/icon/icon.html","../../src/icon/ngneers-controls-icon.ts"],"sourcesContent":["import { Injectable, signal, TemplateRef, type OnDestroy } from '@angular/core';\r\n\r\nimport type { IconTemplateContext } from './types';\r\n\r\nexport type IconTemplateType = TemplateRef<IconTemplateContext>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class GlobalIconTemplate implements OnDestroy {\r\n private readonly _globalIconTemplate = signal<IconTemplateType | null>(null);\r\n\r\n public readonly globalIconTemplate = this._globalIconTemplate.asReadonly();\r\n\r\n public setGlobalIconTemplate(template: IconTemplateType) {\r\n this._globalIconTemplate.set(template);\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._globalIconTemplate.set(null);\r\n }\r\n}\r\n","export const DEFAULT_ICONS = {\n calendar: () => import('./calendar').then(module => module.default),\n check: () => import('./check').then(module => module.default),\n chevron_down: () => import('./chevron_down').then(module => module.default),\n chevron_left: () => import('./chevron_left').then(module => module.default),\n chevron_right: () => import('./chevron_right').then(module => module.default),\n chevron_up: () => import('./chevron_up').then(module => module.default),\n ellipsis: () => import('./ellipsis').then(module => module.default),\n filter: () => import('./filter').then(module => module.default),\n filter_solid: () => import('./filter_solid').then(module => module.default),\n magnifying_glass: () => import('./magnifying_glass').then(module => module.default),\n minus: () => import('./minus').then(module => module.default),\n sort: () => import('./sort').then(module => module.default),\n sort_down: () => import('./sort_down').then(module => module.default),\n sort_up: () => import('./sort_up').then(module => module.default),\n xmark: () => import('./xmark').then(module => module.default),\n};\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n TemplateRef,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { NgnTemplate, templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnError } from '@ngneers/controls/utils';\r\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\r\nimport { iconControlTemplate } from '@ngneers/controls-themes/templates/icon';\r\n\r\nimport { DEFAULT_ICONS } from './default-icons/ts';\r\nimport { GlobalIconTemplate } from './global-icon-template';\r\n\r\nimport type { DefaultIcon, IconTemplateContext } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-icon',\r\n templateUrl: './icon.html',\r\n imports: [NgnPt, NgTemplateOutlet, NgnTemplate],\r\n providers: [provideSelf(NgnIcon)],\r\n host: {\r\n ngSkipHydration: 'true',\r\n },\r\n})\r\nexport class NgnIcon extends NgnBase<'icon'> {\r\n protected readonly theme = this.injectThemeTemplate(iconControlTemplate, 'root');\r\n private readonly _globalIconTemplate = inject(GlobalIconTemplate).globalIconTemplate;\r\n private readonly _sanitizer = inject(DomSanitizer);\r\n\r\n public readonly defaultIcon = input<DefaultIcon>();\r\n public readonly icon = input<IconType>();\r\n\r\n protected readonly templateType = templateTypesFn<IconTemplateContext>();\r\n\r\n protected readonly defaultIconSvg = asyncComputed(async () => {\r\n const defaultIconKey = this.defaultIcon();\r\n if (!defaultIconKey) {\r\n return null;\r\n }\r\n const svg = DEFAULT_ICONS[defaultIconKey];\r\n return this._sanitizer.bypassSecurityTrustHtml(await svg()); // This is safe as we control the SVG content\r\n }, null);\r\n\r\n private readonly _defaultIconTemplate =\r\n viewChild.required<TemplateRef<IconTemplateContext>>('defaultIconTemplate');\r\n\r\n protected readonly usedIconTemplate = computed(() => {\r\n const globalTemplate = this._globalIconTemplate();\r\n if (globalTemplate) {\r\n return globalTemplate;\r\n }\r\n return this._defaultIconTemplate();\r\n });\r\n\r\n constructor() {\r\n super();\r\n afterRenderEffect(() => {\r\n if (!this.icon() && !this.defaultIcon()) {\r\n throw new NgnError(\r\n 'icon',\r\n 'Icon component requires either an icon or a default icon to be set.'\r\n );\r\n }\r\n });\r\n }\r\n}\r\n","@if (icon()) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n usedIconTemplate();\r\n context: {\r\n $implicit: {\r\n icon: icon(),\r\n },\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultIconTemplate [ngnTemplate]=\"templateType\" let-icon\r\n ><i [style.--fa-display]=\"'block'\" class=\"{{ icon.icon }}\"></i\r\n ></ng-template>\r\n} @else {\r\n <!-- imported svg icon -->\r\n @if (defaultIconSvg(); as defaultIcon) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\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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"}