@ngneers/controls 0.0.1-pre1 → 0.0.1-pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/fesm2022/ngneers-controls-accordion.mjs +194 -0
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api-ng.mjs +668 -0
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api.mjs +256 -227
- package/fesm2022/ngneers-controls-api.mjs.map +1 -1
- package/fesm2022/ngneers-controls-avatar.mjs +70 -0
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +397 -0
- package/fesm2022/ngneers-controls-base.mjs.map +1 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs +74 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button-group.mjs +51 -0
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button.mjs +62 -0
- package/fesm2022/ngneers-controls-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs +63 -0
- package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar.mjs +468 -0
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-checkbox.mjs +58 -0
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
- package/fesm2022/ngneers-controls-chip.mjs +52 -0
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +43 -0
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-dialog.mjs +329 -33
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +443 -0
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
- package/fesm2022/ngneers-controls-drawer.mjs +232 -0
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs +120 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-filter.mjs +516 -0
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs +87 -0
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs +87 -0
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +57 -0
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon.mjs +60 -18
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +107 -0
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-field.mjs +141 -0
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-mask.mjs +282 -0
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input.mjs +69 -0
- package/fesm2022/ngneers-controls-input.mjs.map +1 -0
- package/fesm2022/ngneers-controls-item-view.mjs +441 -0
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
- package/fesm2022/ngneers-controls-list-box.mjs +157 -53
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +332 -0
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-message.mjs +29 -0
- package/fesm2022/ngneers-controls-message.mjs.map +1 -0
- package/fesm2022/ngneers-controls-paginator.mjs +111 -0
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
- package/fesm2022/ngneers-controls-popover.mjs +129 -40
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +82 -0
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +155 -78
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +55 -0
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-select.mjs +313 -103
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +155 -0
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
- package/fesm2022/ngneers-controls-spinner.mjs +169 -0
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
- package/fesm2022/ngneers-controls-splitter.mjs +717 -0
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +39 -0
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
- package/fesm2022/ngneers-controls-table.mjs +379 -0
- package/fesm2022/ngneers-controls-table.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tabs.mjs +287 -0
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tag.mjs +29 -0
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toast.mjs +184 -0
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs +65 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tooltip.mjs +454 -0
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs +227 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils.mjs +217 -60
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/fesm2022/ngneers-controls.mjs.map +1 -1
- package/package.json +167 -32
- package/types/ngneers-controls-accordion.d.ts +114 -0
- package/types/ngneers-controls-api-ng.d.ts +291 -0
- package/types/ngneers-controls-api.d.ts +99 -0
- package/types/ngneers-controls-avatar.d.ts +50 -0
- package/types/ngneers-controls-base.d.ts +166 -0
- package/types/ngneers-controls-breadcrumb.d.ts +86 -0
- package/types/ngneers-controls-button-group.d.ts +30 -0
- package/types/ngneers-controls-button.d.ts +34 -0
- package/types/ngneers-controls-calendar.d.ts +275 -0
- package/types/ngneers-controls-checkbox.d.ts +38 -0
- package/types/ngneers-controls-chip.d.ts +37 -0
- package/types/ngneers-controls-defer.d.ts +22 -0
- package/types/ngneers-controls-dialog.d.ts +218 -0
- package/types/ngneers-controls-directives.d.ts +146 -0
- package/types/ngneers-controls-drawer.d.ts +220 -0
- package/types/ngneers-controls-edit-inplace.d.ts +182 -0
- package/types/ngneers-controls-filter.d.ts +304 -0
- package/types/ngneers-controls-i18n.d.ts +108 -0
- package/types/ngneers-controls-icon.d.ts +74 -0
- package/types/ngneers-controls-inplace.d.ts +95 -0
- package/types/ngneers-controls-input-field.d.ts +159 -0
- package/types/ngneers-controls-input-mask.d.ts +83 -0
- package/types/ngneers-controls-input.d.ts +27 -0
- package/types/ngneers-controls-item-view.d.ts +211 -0
- package/types/ngneers-controls-list-box.d.ts +216 -0
- package/types/ngneers-controls-menu.d.ts +178 -0
- package/types/ngneers-controls-message.d.ts +19 -0
- package/types/ngneers-controls-paginator.d.ts +162 -0
- package/types/ngneers-controls-popover.d.ts +101 -0
- package/types/ngneers-controls-progress.d.ts +44 -0
- package/types/ngneers-controls-scroller.d.ts +137 -0
- package/types/ngneers-controls-select-button.d.ts +37 -0
- package/types/ngneers-controls-select.d.ts +314 -0
- package/types/ngneers-controls-slider.d.ts +53 -0
- package/types/ngneers-controls-spinner.d.ts +105 -0
- package/types/ngneers-controls-splitter.d.ts +391 -0
- package/types/ngneers-controls-switch.d.ts +18 -0
- package/types/ngneers-controls-table.d.ts +157 -0
- package/types/ngneers-controls-tabs.d.ts +106 -0
- package/types/ngneers-controls-tag.d.ts +19 -0
- package/types/ngneers-controls-toast.d.ts +70 -0
- package/types/ngneers-controls-toggle-button.d.ts +46 -0
- package/types/ngneers-controls-tooltip.d.ts +188 -0
- package/types/ngneers-controls-utils-ng.d.ts +57 -0
- package/types/ngneers-controls-utils.d.ts +130 -0
- package/api/index.d.ts +0 -134
- package/custom-types/index.d.ts +0 -7
- package/dialog/index.d.ts +0 -43
- package/fesm2022/ngneers-controls-custom-types.mjs +0 -4
- package/fesm2022/ngneers-controls-custom-types.mjs.map +0 -1
- package/fesm2022/ngneers-controls-form-field.mjs +0 -33
- package/fesm2022/ngneers-controls-form-field.mjs.map +0 -1
- package/fesm2022/ngneers-controls-lazy-cacher.mjs +0 -30
- package/fesm2022/ngneers-controls-lazy-cacher.mjs.map +0 -1
- package/fesm2022/ngneers-controls-text-field.mjs +0 -23
- package/fesm2022/ngneers-controls-text-field.mjs.map +0 -1
- package/form-field/index.d.ts +0 -19
- package/icon/index.d.ts +0 -30
- package/lazy-cacher/index.d.ts +0 -14
- package/list-box/index.d.ts +0 -58
- package/popover/index.d.ts +0 -41
- package/scroller/index.d.ts +0 -95
- package/select/index.d.ts +0 -86
- package/text-field/index.d.ts +0 -10
- package/utils/index.d.ts +0 -36
- /package/{index.d.ts → types/ngneers-controls.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngneers-controls-api-ng.mjs","sources":["../../src/api/ng/config/config.ts","../../src/api/ng/closable.ts","../../src/api/ng/components.ts","../../src/api/ng/dom.ts","../../src/api/ng/kinds.ts","../../src/api/ng/platform.ts","../../src/api/ng/positioning.ts","../../src/api/ng/theme-service.ts","../../src/api/ng/provider.ts","../../src/api/ng/template.ts","../../src/api/ng/ngneers-controls-api-ng.ts"],"sourcesContent":["import { inject, InjectionToken, provideAppInitializer, type Provider } from '@angular/core';\r\nimport { registerCustomLanguages, type Translations } from '@ngneers/controls/i18n';\r\nimport { type DeepPartial, Logger, type LogLevel } from '@ngneers/controls/utils';\r\n\r\nimport type { TooltipOptions } from './tooltip';\r\nimport type { NgnStateStorage } from '@ngneers/controls/utils-ng';\r\nimport type { StyleScope, Theme } from '@ngneers/controls-themes';\r\n\r\nexport const NGN_CONFIG = new InjectionToken<NgnConfig>('NGN_CONFIG');\r\n\r\nexport type NgnConfig = {\r\n readonly logLevel: LogLevel;\r\n readonly customTranslations?: Record<string, () => Promise<Translations>>;\r\n readonly disableAnimations: boolean;\r\n readonly theme: {\r\n readonly preset: Theme | null;\r\n readonly lazyLoaded: boolean;\r\n readonly styleScope: StyleScope | null;\r\n readonly cssLayer: string | null;\r\n readonly namePrefix: string;\r\n };\r\n readonly defaults: {\r\n readonly stateStorage: NgnStateStorage;\r\n readonly splitter: {\r\n readonly stateStorage: NgnStateStorage;\r\n };\r\n readonly tooltip: TooltipOptions;\r\n };\r\n};\r\n\r\nexport type NgnConfigInit = DeepPartial<\r\n NgnConfig,\r\n 'theme.preset.*' | 'theme.styleScope.*' | 'customTranslations.*'\r\n>;\r\n\r\nexport const defaultNgnConfig: NgnConfig = {\r\n logLevel: 'info',\r\n disableAnimations: false,\r\n theme: {\r\n preset: null,\r\n lazyLoaded: false,\r\n styleScope: null,\r\n cssLayer: 'ngn-controls',\r\n namePrefix: 'ngn-',\r\n },\r\n defaults: {\r\n stateStorage: 'session',\r\n splitter: {\r\n stateStorage: 'session',\r\n },\r\n tooltip: {\r\n placement: 'bottom',\r\n offset: 4,\r\n showDelay: '0.5s',\r\n hideDelay: '0.1s',\r\n showArrow: true,\r\n showOnHover: true,\r\n showOnFocus: true,\r\n hideOnTooltipHover: false,\r\n hideOnClick: true,\r\n },\r\n },\r\n};\r\n\r\nexport function provideNgnConfig(config?: NgnConfigInit): Provider {\r\n return [\r\n {\r\n provide: NGN_CONFIG,\r\n useValue: {\r\n logLevel: config?.logLevel ?? defaultNgnConfig.logLevel,\r\n customTranslations: config?.customTranslations,\r\n disableAnimations: config?.disableAnimations ?? defaultNgnConfig.disableAnimations,\r\n theme: {\r\n preset: config?.theme?.preset ?? defaultNgnConfig.theme.preset,\r\n lazyLoaded: config?.theme?.lazyLoaded ?? defaultNgnConfig.theme.lazyLoaded,\r\n styleScope: config?.theme?.styleScope ?? defaultNgnConfig.theme.styleScope,\r\n cssLayer:\r\n config?.theme?.cssLayer === undefined\r\n ? defaultNgnConfig.theme.cssLayer\r\n : config?.theme?.cssLayer,\r\n namePrefix: config?.theme?.namePrefix ?? defaultNgnConfig.theme.namePrefix,\r\n },\r\n defaults: {\r\n stateStorage: config?.defaults?.stateStorage ?? defaultNgnConfig.defaults.stateStorage,\r\n splitter: {\r\n stateStorage:\r\n config?.defaults?.splitter?.stateStorage ??\r\n config?.defaults?.stateStorage ??\r\n defaultNgnConfig.defaults.splitter.stateStorage,\r\n },\r\n tooltip: {\r\n placement:\r\n config?.defaults?.tooltip?.placement ?? defaultNgnConfig.defaults.tooltip.placement,\r\n offset: config?.defaults?.tooltip?.offset ?? defaultNgnConfig.defaults.tooltip.offset,\r\n showDelay:\r\n config?.defaults?.tooltip?.showDelay ?? defaultNgnConfig.defaults.tooltip.showDelay,\r\n hideDelay:\r\n config?.defaults?.tooltip?.hideDelay ?? defaultNgnConfig.defaults.tooltip.hideDelay,\r\n showArrow:\r\n config?.defaults?.tooltip?.showArrow ?? defaultNgnConfig.defaults.tooltip.showArrow,\r\n showOnHover:\r\n config?.defaults?.tooltip?.showOnHover ??\r\n defaultNgnConfig.defaults.tooltip.showOnHover,\r\n showOnFocus:\r\n config?.defaults?.tooltip?.showOnFocus ??\r\n defaultNgnConfig.defaults.tooltip.showOnFocus,\r\n hideOnTooltipHover:\r\n config?.defaults?.tooltip?.hideOnTooltipHover ??\r\n defaultNgnConfig.defaults.tooltip.hideOnTooltipHover,\r\n hideOnClick:\r\n config?.defaults?.tooltip?.hideOnClick ??\r\n defaultNgnConfig.defaults.tooltip.hideOnClick,\r\n },\r\n },\r\n } satisfies NgnConfig,\r\n },\r\n provideAppInitializer(() => {\r\n const config = inject(NGN_CONFIG);\r\n if (config?.customTranslations) {\r\n registerCustomLanguages(config.customTranslations);\r\n }\r\n Logger.logLevel = config.logLevel ?? Logger.logLevel;\r\n }),\r\n ];\r\n}\r\n","import { type ModelSignal, OutputEmitterRef } from '@angular/core';\r\n\r\nexport type PopoverCloseBy = 'any' | 'none';\r\nexport type CloseBy = PopoverCloseBy | 'escape';\r\n\r\nexport function toPopoverCloseBy(closeBy: CloseBy): 'auto' | 'manual' {\r\n switch (closeBy) {\r\n case 'any':\r\n return 'auto';\r\n case 'escape':\r\n case 'none':\r\n return 'manual';\r\n }\r\n}\r\n\r\nexport function toModalCloseBy(closeBy: CloseBy): 'any' | 'closerequest' | 'none' {\r\n switch (closeBy) {\r\n case 'any':\r\n return 'any';\r\n case 'escape':\r\n return 'closerequest';\r\n case 'none':\r\n return 'none';\r\n }\r\n}\r\n\r\nexport interface Openable {\r\n show(): void;\r\n hide(): void;\r\n toggle(): void;\r\n open: ModelSignal<boolean>;\r\n closed: OutputEmitterRef<void>;\r\n}\r\n","import { ComponentRef, type InputSignal, type InputSignalWithTransform } from '@angular/core';\r\n\r\ntype ComponentFromRef<T extends ComponentRef<any>> = T extends ComponentRef<infer C> ? C : never;\r\ntype InputsFromComponent<T> = {\r\n [K in keyof T]: T[K] extends InputSignal<infer V>\r\n ? V\r\n : T[K] extends InputSignalWithTransform<infer V, infer _>\r\n ? V\r\n : never;\r\n};\r\n\r\nexport function setComponentInput<\r\n T extends ComponentRef<C>,\r\n C,\r\n Input extends InputsFromComponent<ComponentFromRef<T>>,\r\n I extends keyof Input & string,\r\n>(componentRef: T, inputName: I, value: Input[I]): void {\r\n componentRef.setInput(inputName, value);\r\n}\r\n","import {\r\n afterRenderEffect,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n runInInjectionContext,\r\n signal,\r\n type Signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { deepCopy } from '@ngneers/controls/utils';\r\nimport { signalWithPrevious } from '@ngneers/controls/utils-ng';\r\nimport { fromEvent, Observable, Subject, Subscription } from 'rxjs';\r\n\r\nexport type Size = { width: number; height: number };\r\n\r\ntype ElementArray =\r\n | Signal<ReadonlyArray<HTMLElement | ElementRef<HTMLElement>>>\r\n | ReadonlyArray<HTMLElement | ElementRef<HTMLElement>>;\r\ntype ElementSingle =\r\n | Signal<HTMLElement | ElementRef<HTMLElement> | undefined>\r\n | HTMLElement\r\n | Document\r\n | ElementRef<HTMLElement>;\r\n\r\nfunction getElement(el: ElementSingle): HTMLElement | Document | undefined {\r\n const rawElement = typeof el === 'function' ? el() : el;\r\n const element = rawElement instanceof ElementRef ? rawElement.nativeElement : rawElement;\r\n return element;\r\n}\r\n\r\nexport function elementSizeSignal(element: ElementSingle, active?: Signal<boolean>): Signal<Size> {\r\n const val = elementsSizesSignalInt(element, active);\r\n return computed(() => val()[0] ?? { width: 0, height: 0 });\r\n}\r\n\r\nexport function elementsSizesSignal(\r\n element: ElementArray,\r\n active?: Signal<boolean>\r\n): Signal<readonly Size[]> {\r\n return elementsSizesSignalInt(element, active);\r\n}\r\n\r\nfunction elementsSizesSignalInt(\r\n element: ElementArray | ElementSingle,\r\n active?: Signal<boolean>\r\n): Signal<readonly Size[]> {\r\n const sizeSignal = signal<readonly Size[]>([], {\r\n equal: (a, b) => JSON.stringify(a) === JSON.stringify(b),\r\n });\r\n\r\n let elements: HTMLElement[];\r\n afterRenderEffect(() => {\r\n resizeObserver.disconnect();\r\n if (active && !active()) {\r\n return;\r\n }\r\n const rawElement = typeof element === 'function' ? element() : element;\r\n const arrayElement = Array.isArray(rawElement) ? rawElement : rawElement ? [rawElement] : [];\r\n elements = arrayElement.map(el => (el instanceof ElementRef ? el.nativeElement : el));\r\n\r\n if (!elements.length) {\r\n return;\r\n }\r\n sizeSignal.set(\r\n elements.map(el => {\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n })\r\n );\r\n elements.forEach(el => {\r\n resizeObserver.observe(el, { box: 'border-box' });\r\n });\r\n });\r\n const destroyRef = inject(DestroyRef);\r\n if (typeof ResizeObserver === 'undefined') {\r\n return sizeSignal; // ResizeObserver is not supported, return initial size\r\n }\r\n const resizeObserver = new ResizeObserver(entries => {\r\n entries.forEach(entry => {\r\n const index = elements.findIndex(el => el === entry.target);\r\n sizeSignal.update(s => {\r\n const copy = deepCopy(s);\r\n const borderBoxSize = entry.borderBoxSize[0];\r\n if (!borderBoxSize) {\r\n return s;\r\n }\r\n copy[index] = {\r\n width: borderBoxSize.inlineSize,\r\n height: borderBoxSize.blockSize,\r\n };\r\n return copy;\r\n });\r\n });\r\n });\r\n destroyRef.onDestroy(() => {\r\n resizeObserver.disconnect();\r\n });\r\n return sizeSignal;\r\n}\r\n\r\nconst ABORT_SIGNAL_SYMBOL = Symbol('AbortSignal');\r\nexport function abortSignalOnDestroy(options?: { injector?: Injector }): AbortSignal {\r\n const destroyRef = options?.injector?.get(DestroyRef) ?? inject(DestroyRef);\r\n if (ABORT_SIGNAL_SYMBOL in destroyRef) {\r\n return destroyRef[ABORT_SIGNAL_SYMBOL] as AbortSignal;\r\n }\r\n const abortController = new AbortController();\r\n destroyRef.onDestroy(() => {\r\n abortController.abort();\r\n });\r\n (destroyRef as any)[ABORT_SIGNAL_SYMBOL] = abortController.signal;\r\n return abortController.signal;\r\n}\r\n\r\n/**\r\n * Creates an Observable that emits the latest event of the specified type from the given DOM element.\r\n *\r\n * ⚠️ Cannot be used to cancel or call preventDefault on the event, as the event is emitted after the event handler phase.\r\n * @param element The target DOM element or ElementRef. Either can be provided directly or via a Signal.\r\n * @param eventName The name of the event to listen for.\r\n * @param injector Optional injector to use for lifecycle management. If not provided, the current injector is used.\r\n * @returns An Observable that emits the latest event of the specified type. Does not complete until the injector is destroyed.\r\n */\r\nexport function domEventObservable<EventName extends keyof GlobalEventHandlersEventMap>(\r\n element: ElementSingle,\r\n eventName: EventName,\r\n injector?: Injector\r\n): Observable<GlobalEventHandlersEventMap[EventName]> {\r\n const inj = injector ?? inject(Injector);\r\n\r\n const result = new Subject<GlobalEventHandlersEventMap[EventName]>();\r\n const destroyRef = inj.get(DestroyRef);\r\n\r\n let subscription: Subscription | undefined;\r\n runInInjectionContext(inj, () => {\r\n afterRenderEffect(() => {\r\n subscription?.unsubscribe();\r\n const el = getElement(element);\r\n if (!el) {\r\n return;\r\n }\r\n subscription = fromEvent(el, eventName)\r\n .pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(e => result.next(e as GlobalEventHandlersEventMap[EventName]));\r\n });\r\n });\r\n return result.asObservable().pipe(takeUntilDestroyed(destroyRef));\r\n}\r\n\r\n/**\r\n * Creates a Signal that emits the latest event of the specified type from the given DOM element.\r\n *\r\n * ⚠️ Cannot be used to cancel or call preventDefault on the event, as the event is emitted after the event handler phase.\r\n * @param element The target DOM element or ElementRef. Either can be provided directly or via a Signal.\r\n * @param eventName The name of the event to listen for.\r\n * @param injector Optional injector to use for lifecycle management. If not provided, the current injector is used.\r\n * @returns A Signal that emits the latest event of the specified type or null if no event has occurred.\r\n */\r\nexport function domEventSignal<EventName extends keyof GlobalEventHandlersEventMap>(\r\n element: ElementSingle,\r\n eventName: EventName,\r\n injector?: Injector\r\n): Signal<GlobalEventHandlersEventMap[EventName] | null> {\r\n const inj = injector ?? inject(Injector);\r\n const res = runInInjectionContext(inj, () => {\r\n const sig = signal<GlobalEventHandlersEventMap[EventName] | null>(null);\r\n domEventObservable(element, eventName, inj).subscribe(value => {\r\n sig.set(value as GlobalEventHandlersEventMap[EventName]);\r\n });\r\n return sig;\r\n });\r\n return res;\r\n}\r\n\r\n/**\r\n * Attaches an event handler to a DOM element that is automatically removed when the injector is destroyed.\r\n * @param element The target DOM element or ElementRef. Either can be provided directly or via a Signal.\r\n * @param eventName The name of the event to listen for.\r\n * @param handler The function to handle the event.\r\n * @param injector Optional injector to use for lifecycle management. If not provided, the current injector is used.\r\n */\r\nexport function domEventHandler<EventName extends keyof GlobalEventHandlersEventMap>(\r\n element: ElementSingle,\r\n eventName: EventName,\r\n handler: (event: GlobalEventHandlersEventMap[EventName]) => void,\r\n injector?: Injector\r\n): void {\r\n const inj = injector ?? inject(Injector);\r\n const destroyRef = inj.get(DestroyRef);\r\n runInInjectionContext(inj, () => {\r\n const destroyed = signal(false);\r\n destroyRef.onDestroy(() => {\r\n destroyed.set(true);\r\n });\r\n const elSig = computed(() => (destroyed() ? null : getElement(element)));\r\n const elSigWithPrev = signalWithPrevious(elSig);\r\n\r\n effect(() => {\r\n const element = elSigWithPrev();\r\n const previousElement = element.previous;\r\n if (previousElement) {\r\n previousElement.removeEventListener(\r\n eventName,\r\n handler as EventListenerOrEventListenerObject\r\n );\r\n }\r\n if (element.current) {\r\n element.current.addEventListener(eventName, handler as EventListenerOrEventListenerObject);\r\n }\r\n });\r\n });\r\n}\r\n","import { inject } from '@angular/core';\r\n\r\nimport { NGN_CONFIG } from './config';\r\n\r\nimport type { CustomColor, CustomKind } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * Retrieves the available kinds for a given control from the theme configuration.\r\n * Does **not** return custom kinds defined by the user in `NgnCustomTypes`.\r\n * @param controlName The name of the control to get kinds for.\r\n * @returns A tuple of available kinds for the specified control.\r\n * @todo make reactive (signal)\r\n */\r\nexport function injectThemeControlKinds<T extends string>(controlName: T): CustomKind<T>[] {\r\n const val = inject(NGN_CONFIG).theme.preset?.meta.kinds?.[controlName] ?? [];\r\n return val as CustomKind<T>[];\r\n}\r\n\r\n/**\r\n * Retrieves the available colors from the theme configuration.\r\n * Does **not** return custom colors defined by the user in `NgnCustomTypes`.\r\n * @returns A tuple of available colors.\r\n * @todo make reactive (signal)\r\n */\r\nexport function injectThemeColors(controlName?: string): CustomColor[] {\r\n const theme = inject(NGN_CONFIG).theme;\r\n if (controlName) {\r\n const classNames = theme.preset?.parts.find(x => x.scope === controlName)?.controlTemplate\r\n ?.classNames;\r\n const hasColor = classNames?.includes('color-*');\r\n if (!hasColor) {\r\n return [];\r\n }\r\n }\r\n const val = theme.preset?.meta.colors ?? [];\r\n return val as CustomColor[];\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n computed,\r\n DOCUMENT,\r\n inject,\r\n Injectable,\r\n PLATFORM_ID,\r\n type Signal,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { elementSizeSignal, type Size } from './dom';\r\n\r\nexport type DeviceType = 'mobile' | 'desktop' | 'tablet';\r\n\r\n@Injectable()\r\nexport class Platform {\r\n private readonly _deviceType = signal<DeviceType>('desktop');\r\n\r\n public readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n public readonly windowSize: Signal<Size> = this.isBrowser\r\n ? elementSizeSignal(document.body)\r\n : signal({ width: 0, height: 0 });\r\n public readonly width = computed(() => this.windowSize().width);\r\n public readonly height = computed(() => this.windowSize().height);\r\n\r\n constructor() {\r\n const doc = inject(DOCUMENT);\r\n const win = doc.defaultView;\r\n if (!win) {\r\n return;\r\n }\r\n if (typeof win.matchMedia !== 'function') {\r\n return;\r\n }\r\n const hasMouse = win.matchMedia('(any-hover: hover)').matches;\r\n if (hasMouse) {\r\n this._deviceType.set('desktop');\r\n return;\r\n }\r\n const isSmallScreen =\r\n window.matchMedia('(max-width: 768px)').matches ||\r\n window.matchMedia('(max-height: 768px)').matches;\r\n if (isSmallScreen) {\r\n this._deviceType.set('mobile');\r\n } else {\r\n this._deviceType.set('tablet');\r\n }\r\n }\r\n\r\n public readonly isTouchDevice = computed(() => {\r\n return this._deviceType() === 'mobile' || this._deviceType() === 'tablet';\r\n });\r\n}\r\n","import { DestroyRef, inject, Injector } from '@angular/core';\r\nimport {\r\n type Alignment,\r\n autoUpdate,\r\n computePosition,\r\n type ComputePositionReturn,\r\n flip,\r\n type Middleware,\r\n offset,\r\n type Placement,\r\n type ReferenceElement,\r\n shift,\r\n type Side,\r\n size,\r\n type Strategy,\r\n} from '@floating-ui/dom';\r\n\r\nexport type Point = {\r\n x: number;\r\n y: number;\r\n};\r\n\r\nexport type Anchor = HTMLElement | Point;\r\n\r\nexport type PositioningSizeConstraints = {\r\n /**\r\n * The minimum width of the floating element. When a string is provided, it is used as the CSS min-width value.\r\n */\r\n minWidth?: string;\r\n /**\r\n * The width of the floating element. When a number is provided, it is relative to the width of the reference element.\r\n * When a string is provided, it is used as the CSS width value.\r\n */\r\n width?: number | string;\r\n /**\r\n * The maximum width of the floating element. When a number is provided, it is relative to the width of the reference element.\r\n * When a string is provided, it is used as the CSS max-width value.\r\n */\r\n maxWidth?: number | string;\r\n /**\r\n * The height of the floating element. When a string is provided, it is used as the CSS height value.\r\n */\r\n height?: string;\r\n /**\r\n * The maximum height of the floating element. When a string is provided, it is used as the CSS max-height value.\r\n */\r\n maxHeight?: string;\r\n /**\r\n * The minimum height of the floating element. When a string is provided, it is used as the CSS min-height value.\r\n */\r\n minHeight?: string;\r\n};\r\n\r\nexport type PositioningOptions = {\r\n injector?: Injector;\r\n placement?: Placement;\r\n flip?: boolean;\r\n resize?: boolean;\r\n shift?: boolean;\r\n offset?: number;\r\n stopped?: boolean;\r\n sizeConstraints?: PositioningSizeConstraints;\r\n strategy?: Strategy;\r\n middleware?: Middleware[];\r\n disableSettingStyles?: boolean;\r\n hasShrinkableContent?: boolean;\r\n onPositionChange?: (position: ComputePositionReturn) => void;\r\n};\r\n\r\nexport type AutoPositioningHandle = {\r\n stop: () => void;\r\n start: () => void;\r\n isRunning: () => boolean;\r\n};\r\n\r\nfunction filterNonNullishKeys<T extends Record<string, unknown>>(obj: T): Partial<T> {\r\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => value != null)) as Partial<T>;\r\n}\r\n\r\nfunction mergeWithDefaults(options: PositioningOptions): PositioningOptions {\r\n return {\r\n placement: 'bottom',\r\n flip: true,\r\n resize: true,\r\n shift: true,\r\n offset: 4,\r\n stopped: false,\r\n ...filterNonNullishKeys(options),\r\n };\r\n}\r\n\r\nexport function positionElement(\r\n anchor: Anchor,\r\n floatingEl: HTMLElement,\r\n options: PositioningOptions = {}\r\n) {\r\n options = mergeWithDefaults(options);\r\n\r\n const referenceElement = toReferenceElement(anchor);\r\n\r\n const flipMiddleware = options.flip\r\n ? flip(options.shift ? { crossAxis: 'alignment', fallbackAxisSideDirection: 'end' } : undefined)\r\n : undefined;\r\n const shiftMiddleware = options.shift ? shift() : undefined;\r\n\r\n if (options.sizeConstraints) {\r\n if (options.sizeConstraints.width || options.sizeConstraints.maxWidth) {\r\n const refWidth = referenceElement.getBoundingClientRect().width;\r\n if (options.sizeConstraints.width) {\r\n if (typeof options.sizeConstraints.width === 'string') {\r\n floatingEl.style.width = options.sizeConstraints.width;\r\n } else {\r\n const widthConstraints = options.sizeConstraints.width * refWidth;\r\n floatingEl.style.width = `min(100%, ${widthConstraints}px)`;\r\n }\r\n }\r\n if (options.sizeConstraints.maxWidth) {\r\n if (typeof options.sizeConstraints.maxWidth === 'string') {\r\n floatingEl.style.maxWidth = options.sizeConstraints.maxWidth;\r\n } else {\r\n const maxWidthConstraints = options.sizeConstraints.maxWidth * refWidth;\r\n floatingEl.style.maxWidth = `min(100%, ${maxWidthConstraints}px)`;\r\n }\r\n }\r\n }\r\n if (options.sizeConstraints.height || options.sizeConstraints.maxHeight) {\r\n if (options.sizeConstraints.height) {\r\n floatingEl.style.height = options.sizeConstraints.height;\r\n }\r\n if (options.sizeConstraints.maxHeight) {\r\n floatingEl.style.maxHeight = options.sizeConstraints.maxHeight;\r\n }\r\n }\r\n if (options.sizeConstraints.minWidth) {\r\n floatingEl.style.minWidth = options.sizeConstraints.minWidth;\r\n }\r\n }\r\n\r\n computePosition(referenceElement, floatingEl, {\r\n placement: options.placement,\r\n strategy: options.strategy,\r\n middleware: [\r\n options.offset ? offset(options.offset) : undefined,\r\n options.resize\r\n ? size({\r\n apply({ availableHeight }) {\r\n const maxHeightConstraint = options.sizeConstraints?.maxHeight;\r\n const maxHeightInPx = maxHeightConstraint?.replace(/px$/, '');\r\n const maxHeight = maxHeightInPx\r\n ? Math.min(availableHeight, parseInt(maxHeightInPx))\r\n : availableHeight;\r\n if (options.hasShrinkableContent) {\r\n Object.assign(floatingEl.style, {\r\n height: `${maxHeight - 1}px`,\r\n });\r\n }\r\n },\r\n })\r\n : undefined,\r\n ...(options.placement?.includes('-')\r\n ? [flipMiddleware, shiftMiddleware]\r\n : [shiftMiddleware, flipMiddleware]),\r\n ...(options.middleware || []),\r\n ].filter(Boolean),\r\n }).then(pos => {\r\n if (!options.disableSettingStyles) {\r\n const flipped = pos.middlewareData.flip?.index;\r\n const flippedToLREnd =\r\n flipped &&\r\n (pos.placement.startsWith('left-') || pos.placement.startsWith('right-')) &&\r\n pos.placement.endsWith('-end');\r\n const flippedToTop = flipped && pos.placement.startsWith('top');\r\n\r\n Object.assign(floatingEl.style, {\r\n left: `${pos.x}px`,\r\n top: `${pos.y}px`,\r\n justifyContent: flippedToLREnd || flippedToTop ? 'flex-end' : 'flex-start',\r\n });\r\n }\r\n options.onPositionChange?.(pos);\r\n });\r\n}\r\n\r\nfunction toReferenceElement(anchor: Anchor): ReferenceElement {\r\n const referenceElement: ReferenceElement =\r\n anchor instanceof HTMLElement\r\n ? anchor\r\n : {\r\n getBoundingClientRect: () => ({\r\n x: anchor.x,\r\n y: anchor.y,\r\n width: 1,\r\n height: 1,\r\n top: anchor.y,\r\n right: anchor.x + 1,\r\n bottom: anchor.y + 1,\r\n left: anchor.x,\r\n }),\r\n };\r\n return referenceElement;\r\n}\r\n\r\nexport function autoPositionElement(\r\n anchor: Anchor,\r\n floatingEl: HTMLElement,\r\n options: PositioningOptions = {}\r\n): AutoPositioningHandle {\r\n options = mergeWithDefaults(options);\r\n\r\n let cleanup: (() => void) | undefined;\r\n const destroyRef = options.injector?.get(DestroyRef) ?? inject(DestroyRef);\r\n\r\n function startAutoUpdate() {\r\n cleanup = autoUpdate(toReferenceElement(anchor), floatingEl, () => {\r\n positionElement(anchor, floatingEl, options);\r\n });\r\n return cleanup;\r\n }\r\n\r\n destroyRef.onDestroy(() => {\r\n cleanup?.();\r\n cleanup = undefined;\r\n });\r\n return {\r\n start: () => {\r\n cleanup?.();\r\n startAutoUpdate();\r\n },\r\n stop: () => {\r\n cleanup?.();\r\n cleanup = undefined;\r\n },\r\n isRunning: () => !!cleanup,\r\n };\r\n}\r\n\r\nexport function splitPlacement(placement: Placement): [Side, Alignment | undefined] {\r\n return placement.split('-') as [Side, Alignment | undefined];\r\n}\r\n","import {\r\n DOCUMENT,\r\n inject,\r\n Injectable,\r\n Injector,\r\n type OnDestroy,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { Logger } from '@ngneers/controls/utils';\r\nimport {\r\n applyGlobalStyles,\r\n applyTheme,\r\n type ControlName,\r\n type ControlTemplate,\r\n getClassName,\r\n type Theme,\r\n type ThemeClasses,\r\n type ThemeTemplate,\r\n} from '@ngneers/controls-themes';\r\nimport { globalStyles } from '@ngneers/controls-themes/base/global';\r\nimport { skip } from 'rxjs';\r\n\r\nimport { NGN_CONFIG, type NgnConfig } from './config';\r\n\r\nexport type AppliedThemeClassCfg<T extends ControlName> =\r\n | keyof ThemeClasses<ThemeTemplate[T]>\r\n | Partial<Record<keyof ThemeClasses<ThemeTemplate[T]>, boolean | (() => boolean)>>;\r\n\r\nexport type ControlTemplateInfo<T extends ControlTemplate<string, string[]>> = {\r\n scope: string;\r\n class: (className: T['classNames'][number]) => string;\r\n classes: (classes: {\r\n [K in T['classNames'][number]]?: boolean;\r\n }) => string;\r\n};\r\n\r\nexport function themeTemplateToTemplateInfo<T extends ControlTemplate<string, string[]>>(\r\n config: NgnConfig,\r\n template: T,\r\n options?: { unstyled?: () => boolean }\r\n): ControlTemplateInfo<T> {\r\n return {\r\n scope: template.scope,\r\n class: (className: T['classNames'][number]) =>\r\n getClassName(config.theme.namePrefix, template.scope, className, options?.unstyled?.()),\r\n classes: (classes: {\r\n [K in T['classNames'][number]]?: boolean;\r\n }): string => {\r\n let result = '';\r\n for (const className in classes) {\r\n if ((classes as any)[className]) {\r\n if (result) result += ' ';\r\n result += getClassName(\r\n config.theme.namePrefix,\r\n template.scope,\r\n className,\r\n options?.unstyled?.()\r\n );\r\n }\r\n }\r\n return result;\r\n },\r\n };\r\n}\r\n\r\nexport function injectThemeTemplate<T extends ControlTemplate<string, string[]>>(\r\n template: T,\r\n options?: { injector?: Injector; unstyled?: () => boolean }\r\n): ControlTemplateInfo<T> {\r\n const config = options?.injector?.get(NGN_CONFIG) ?? inject(NGN_CONFIG);\r\n const themeService = options?.injector?.get(ThemeService) ?? inject(ThemeService);\r\n themeService.loadScope(template.scope);\r\n return themeTemplateToTemplateInfo(config, template, { unstyled: options?.unstyled });\r\n}\r\n\r\nexport function injectTheme<T extends ControlName>(\r\n controlName: T,\r\n options?: { injector?: Injector }\r\n): ControlTemplate<T, string[]> {\r\n const themeService = options?.injector?.get(ThemeService) ?? inject(ThemeService);\r\n const theme = themeService.activeTheme();\r\n if (!theme) {\r\n throw new Error(\r\n `No active theme is set. Cannot inject theme for control \"${controlName}\". Please provide a theme in the configuration or set lazyLoaded to true if you plan to load themes dynamically.`\r\n );\r\n }\r\n const template = theme.parts.find(part => part.scope === controlName)?.controlTemplate as\r\n | ControlTemplate<T, string[]>\r\n | undefined;\r\n if (!template) {\r\n throw new Error(\r\n `The active theme \"${theme.name}\" does not contain a template for control \"${controlName}\".`\r\n );\r\n }\r\n return template;\r\n}\r\n\r\nexport function getAppliedClasses<T extends ControlName>(\r\n klass: AppliedThemeClassCfg<T>,\r\n themeTemplateInfo: Omit<ControlTemplateInfo<ControlTemplate<T, string[]>>, 'class' | 'classes'>\r\n): Array<{ class: string; name: string }> {\r\n function suffixes() {\r\n if (typeof klass === 'string') {\r\n return [klass];\r\n } else if (typeof klass === 'object' && klass !== null) {\r\n return Object.entries(klass)\r\n .filter(([_, value]) => (typeof value === 'function' ? value() : value))\r\n .map(([key, _]) => key);\r\n }\r\n return [];\r\n }\r\n const classes = suffixes().map(suffix => ({\r\n class: (themeTemplateInfo as ControlTemplateInfo<ControlTemplate<T, string[]>>).class(suffix),\r\n name: suffix,\r\n }));\r\n return classes;\r\n}\r\n\r\n@Injectable()\r\nexport class ThemeService implements OnDestroy {\r\n private readonly _config = inject(NGN_CONFIG);\r\n private readonly _loadedScopes = new Set<string>();\r\n private readonly _document = inject(DOCUMENT);\r\n\r\n public readonly activeTheme = signal(this._config.theme?.preset);\r\n\r\n constructor() {\r\n if (!this._config.theme?.preset && !this._config.theme?.lazyLoaded) {\r\n console.warn(\r\n 'No active theme found. Please provide a theme in the configuration or set lazyLoaded to true if you plan to load themes dynamically.'\r\n );\r\n }\r\n\r\n if (this._config.disableAnimations) {\r\n const style = this._document.createElement('style');\r\n style.setAttribute('ngn-style', '');\r\n // we set the durations instead of setting animation/transition to none,\r\n // so that the animation starts/ends are still applied & the events are still fired\r\n style.innerHTML = `.ngn-control, .ngn-control * {\r\n animation-duration: 0s !important;\r\n transition-duration: 0s !important;\r\n }`;\r\n this._document.head.appendChild(style);\r\n Logger.debug('Animations have been disabled via configuration.');\r\n }\r\n\r\n toObservable(this.activeTheme)\r\n .pipe(takeUntilDestroyed(), skip(1))\r\n .subscribe(this.onThemeChange.bind(this));\r\n }\r\n\r\n public loadScope(scope: string): void {\r\n if (this._loadedScopes.has(scope)) {\r\n Logger.debug(`Theme scope \"${scope}\" is already loaded.`);\r\n return;\r\n }\r\n\r\n const activeTheme = untracked(() => this.activeTheme());\r\n if (!activeTheme) {\r\n Logger.debug(\r\n `No active theme set. Cannot load theme scope \"${scope}\". Scope will be loaded when the theme is set.`\r\n );\r\n return;\r\n } else {\r\n Logger.debug(`Loading theme scope \"${scope}\" for active theme \"${activeTheme.name}\".`);\r\n this.applyTheme(activeTheme, [scope]);\r\n }\r\n\r\n this._loadedScopes.add(scope);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n Logger.debug('ThemeService is being destroyed. Unloading all theme scopes...');\r\n this.unloadAllScopes();\r\n this._loadedScopes.clear();\r\n }\r\n\r\n private onThemeChange(newTheme: Theme | null): void {\r\n if (!newTheme) {\r\n Logger.warn('The active theme has been set to null.');\r\n this.unloadAllScopes();\r\n return;\r\n }\r\n\r\n Logger.debug(`Active theme changed to \"${newTheme.name}\". Reloading scopes...`);\r\n this._loadedScopes.forEach(scope => {\r\n Logger.debug(`Reloading theme scope \"${scope}\" for active theme \"${newTheme.name}\".`);\r\n this.applyTheme(newTheme, [scope]);\r\n });\r\n }\r\n\r\n private unloadAllScopes(): void {\r\n Logger.warn('Unloading all theme scopes is not implemented yet. This is a placeholder method.');\r\n }\r\n\r\n private applyTheme(theme: Theme, scopes: string[]): void {\r\n applyTheme(theme, scopes, {\r\n document: this._document,\r\n layer: this._config.theme.cssLayer ?? undefined,\r\n styleScope: this._config.theme.styleScope ?? undefined,\r\n namePrefix: this._config.theme.namePrefix,\r\n });\r\n applyGlobalStyles(globalStyles, {\r\n document: this._document,\r\n layer: this._config.theme.cssLayer ?? undefined,\r\n styleScope: this._config.theme.styleScope ?? undefined,\r\n namePrefix: this._config.theme.namePrefix,\r\n });\r\n }\r\n}\r\n","import { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnGlobal } from '@ngneers/controls/utils-ng';\r\n\r\nimport { type NgnConfigInit, provideNgnConfig } from './config';\r\nimport { Platform } from './platform';\r\nimport { ThemeService } from './theme-service';\r\n\r\nimport type { Provider } from '@angular/core';\r\n\r\nexport type NgnFeature = {\r\n providers: Provider[];\r\n};\r\n\r\nexport function provideNgnControls(config?: NgnConfigInit, ...features: NgnFeature[]): Provider[] {\r\n return [\r\n NgnGlobal,\r\n ThemeService,\r\n I18n,\r\n Platform,\r\n provideNgnConfig(config),\r\n ...features.map(f => f.providers).flat(),\r\n ];\r\n}\r\n","import { Directive, input } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[ngnTemplate]',\r\n})\r\nexport class NgnTemplate<T> {\r\n public readonly ngnTemplate = input.required<T>();\r\n\r\n public static ngTemplateContextGuard<T>(dir: NgnTemplate<T>, ctx: unknown): ctx is T {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * A noop with return type T.\r\n * This function is used to define typed properties to use in a template.\r\n */\r\nexport function templateTypesFn<T extends Record<string, Record<string, any>>>() {\r\n return {} as T & { $implicit: { [K in keyof T]: Partial<T[K]> } };\r\n}\r\n\r\n/**\r\n * A noop with return type `{ $implicit: Implicit } & Named`.\r\n * This function is used to define a typed property to use in a template.\r\n */\r\nexport function templateTypeFn<Implicit, Named extends Record<string, any> = object>() {\r\n return {} as ([Implicit] extends [undefined] ? unknown : { $implicit: Implicit }) & Named;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +1,250 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { signal, inject, DestroyRef, ElementRef, Directive, input, Component } from '@angular/core';
|
|
3
|
-
import { fuzzyMatch, notNullish, generateElementId, NgnGlobal } from '@ngneers/controls/utils';
|
|
4
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
|
-
import { flip, shift, computePosition, offset, size, autoUpdate } from '@floating-ui/dom';
|
|
1
|
+
import { fuzzyMatch, objectEntries, NgnError, notNullish } from '@ngneers/controls/utils';
|
|
6
2
|
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
function stringMatches(value, query, filterFn) {
|
|
4
|
+
switch (filterFn) {
|
|
5
|
+
case 'contains':
|
|
6
|
+
return value.includes(query);
|
|
7
|
+
case 'startsWith':
|
|
8
|
+
return value.startsWith(query);
|
|
9
|
+
case 'endsWith':
|
|
10
|
+
return value.endsWith(query);
|
|
11
|
+
case 'equals':
|
|
12
|
+
return value === query;
|
|
13
|
+
case 'fuzzy':
|
|
14
|
+
return fuzzyMatch(value, query);
|
|
15
15
|
}
|
|
16
|
-
const resizeObserver = new ResizeObserver(entries => {
|
|
17
|
-
const firstEntry = entries[0];
|
|
18
|
-
sizeSignal.set({
|
|
19
|
-
width: firstEntry.contentRect.width,
|
|
20
|
-
height: firstEntry.contentRect.height,
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
resizeObserver.observe(element);
|
|
24
|
-
destroyRef.onDestroy(() => {
|
|
25
|
-
resizeObserver.disconnect();
|
|
26
|
-
});
|
|
27
|
-
return sizeSignal;
|
|
28
16
|
}
|
|
29
17
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
function normalizeString(value) {
|
|
19
|
+
return (value ?? '').toString().toLowerCase();
|
|
20
|
+
}
|
|
21
|
+
function asNumber(value) {
|
|
22
|
+
if (typeof value === 'number' && !Number.isNaN(value)) {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
26
|
+
const parsed = Number(value);
|
|
27
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function asDateMs(value) {
|
|
32
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) {
|
|
33
|
+
return value.getTime();
|
|
34
|
+
}
|
|
35
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
36
|
+
const d = new Date(value);
|
|
37
|
+
return Number.isNaN(d.getTime()) ? null : d.getTime();
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function operatorRequiresValue(operator) {
|
|
42
|
+
switch (operator) {
|
|
43
|
+
case 'isEmpty':
|
|
44
|
+
case 'isNotEmpty':
|
|
45
|
+
case 'isTrue':
|
|
46
|
+
case 'isFalse':
|
|
47
|
+
return false;
|
|
48
|
+
default:
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function parseFilterRawValue(raw, dataType) {
|
|
53
|
+
if (raw == null || raw === '') {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
switch (dataType) {
|
|
57
|
+
case 'string':
|
|
58
|
+
return raw;
|
|
59
|
+
case 'list':
|
|
60
|
+
return raw;
|
|
61
|
+
case 'number':
|
|
62
|
+
return asNumber(raw);
|
|
63
|
+
case 'date':
|
|
64
|
+
case 'dateTime': {
|
|
65
|
+
const d = new Date(raw);
|
|
66
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
67
|
+
}
|
|
68
|
+
case 'boolean':
|
|
69
|
+
return raw === 'true';
|
|
70
|
+
case 'custom':
|
|
71
|
+
return raw;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function getActiveFilterConditions(config) {
|
|
75
|
+
const dt = config.dataType;
|
|
76
|
+
return config.conditions
|
|
77
|
+
.map(c => {
|
|
78
|
+
const requiresValue = operatorRequiresValue(c.operator);
|
|
79
|
+
const parsed = c.operator === 'in' && (dt === 'string' || dt === 'list')
|
|
80
|
+
? (() => {
|
|
81
|
+
if (!c.rawValue) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const v = JSON.parse(c.rawValue);
|
|
86
|
+
return Array.isArray(v) ? v.map(x => String(x)) : null;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
})()
|
|
92
|
+
: parseFilterRawValue(c.rawValue, dt);
|
|
93
|
+
if (requiresValue && (parsed == null || parsed === '')) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
if (c.operator === 'in' && Array.isArray(parsed) && parsed.length === 0) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return { operator: c.operator, value: parsed };
|
|
100
|
+
})
|
|
101
|
+
.filter((x) => x != null);
|
|
102
|
+
}
|
|
103
|
+
function matchesValue(value, dataType, condition) {
|
|
104
|
+
switch (dataType) {
|
|
105
|
+
case 'string': {
|
|
106
|
+
const left = normalizeString(value);
|
|
107
|
+
switch (condition.operator) {
|
|
108
|
+
case 'isEqual':
|
|
109
|
+
return left === normalizeString(condition.value);
|
|
110
|
+
case 'isNotEqual':
|
|
111
|
+
return left !== normalizeString(condition.value);
|
|
112
|
+
case 'contains':
|
|
113
|
+
return stringMatches(left, normalizeString(condition.value), 'contains');
|
|
114
|
+
case 'startsWith':
|
|
115
|
+
return stringMatches(left, normalizeString(condition.value), 'startsWith');
|
|
116
|
+
case 'endsWith':
|
|
117
|
+
return stringMatches(left, normalizeString(condition.value), 'endsWith');
|
|
118
|
+
case 'in': {
|
|
119
|
+
const arr = Array.isArray(condition.value) ? condition.value : [];
|
|
120
|
+
return arr.map(normalizeString).includes(left);
|
|
121
|
+
}
|
|
122
|
+
case 'isEmpty':
|
|
123
|
+
return left.length === 0;
|
|
124
|
+
case 'isNotEmpty':
|
|
125
|
+
return left.length > 0;
|
|
126
|
+
default:
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
case 'list': {
|
|
131
|
+
const left = normalizeString(value);
|
|
132
|
+
switch (condition.operator) {
|
|
133
|
+
case 'in': {
|
|
134
|
+
const arr = Array.isArray(condition.value) ? condition.value : [];
|
|
135
|
+
return arr.map(normalizeString).includes(left);
|
|
136
|
+
}
|
|
137
|
+
case 'isEmpty':
|
|
138
|
+
return left.length === 0;
|
|
139
|
+
case 'isNotEmpty':
|
|
140
|
+
return left.length > 0;
|
|
141
|
+
case 'isEqual':
|
|
142
|
+
return left === normalizeString(condition.value);
|
|
143
|
+
case 'isNotEqual':
|
|
144
|
+
return left !== normalizeString(condition.value);
|
|
145
|
+
case 'contains':
|
|
146
|
+
return stringMatches(left, normalizeString(condition.value), 'contains');
|
|
147
|
+
case 'startsWith':
|
|
148
|
+
return stringMatches(left, normalizeString(condition.value), 'startsWith');
|
|
149
|
+
case 'endsWith':
|
|
150
|
+
return stringMatches(left, normalizeString(condition.value), 'endsWith');
|
|
151
|
+
default:
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
case 'number': {
|
|
156
|
+
const left = asNumber(value);
|
|
157
|
+
const right = asNumber(condition.value);
|
|
158
|
+
if (left == null) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
switch (condition.operator) {
|
|
162
|
+
case 'isEqual':
|
|
163
|
+
return right != null && left === right;
|
|
164
|
+
case 'isNotEqual':
|
|
165
|
+
return right != null && left !== right;
|
|
166
|
+
case 'greaterThan':
|
|
167
|
+
return right != null && left > right;
|
|
168
|
+
case 'greaterThanOrEqual':
|
|
169
|
+
return right != null && left >= right;
|
|
170
|
+
case 'lessThan':
|
|
171
|
+
return right != null && left < right;
|
|
172
|
+
case 'lessThanOrEqual':
|
|
173
|
+
return right != null && left <= right;
|
|
174
|
+
default:
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
case 'date':
|
|
179
|
+
case 'dateTime': {
|
|
180
|
+
const left = asDateMs(value);
|
|
181
|
+
const right = asDateMs(condition.value);
|
|
182
|
+
if (left == null || right == null) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
switch (condition.operator) {
|
|
186
|
+
case 'isEqual':
|
|
187
|
+
return left === right;
|
|
188
|
+
case 'isNotEqual':
|
|
189
|
+
return left !== right;
|
|
190
|
+
case 'greaterThan':
|
|
191
|
+
return left > right;
|
|
192
|
+
case 'greaterThanOrEqual':
|
|
193
|
+
return left >= right;
|
|
194
|
+
case 'lessThan':
|
|
195
|
+
return left < right;
|
|
196
|
+
case 'lessThanOrEqual':
|
|
197
|
+
return left <= right;
|
|
198
|
+
default:
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
case 'boolean': {
|
|
203
|
+
const b = !!value;
|
|
204
|
+
if (condition.operator === 'isTrue') {
|
|
205
|
+
return b === true;
|
|
206
|
+
}
|
|
207
|
+
if (condition.operator === 'isFalse') {
|
|
208
|
+
return b === false;
|
|
209
|
+
}
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
case 'custom': {
|
|
213
|
+
// Default behavior for custom: treat as string contains
|
|
214
|
+
const left = normalizeString(value);
|
|
215
|
+
const right = normalizeString(condition.value);
|
|
216
|
+
return stringMatches(left, right, 'contains');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function executeFilter(data, config, selector = (item) => item) {
|
|
221
|
+
const active = getActiveFilterConditions(config);
|
|
222
|
+
if (active.length === 0) {
|
|
223
|
+
return data;
|
|
224
|
+
}
|
|
225
|
+
const mode = config.matchMode;
|
|
226
|
+
const dt = config.dataType;
|
|
227
|
+
return data.filter(item => {
|
|
228
|
+
const value = selector(item);
|
|
229
|
+
const evals = active.map(cond => matchesValue(value, dt, cond));
|
|
230
|
+
return mode === 'any' ? evals.some(Boolean) : evals.every(Boolean);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
function executeMultiFilter(data, configs) {
|
|
234
|
+
let result = data;
|
|
235
|
+
for (const [key, config] of objectEntries(configs).filter(x => !!x[1])) {
|
|
236
|
+
const forcedAll = { ...config, matchMode: 'all' };
|
|
237
|
+
result = executeFilter(result, forcedAll, (item) => item[key]);
|
|
238
|
+
}
|
|
239
|
+
return result;
|
|
35
240
|
}
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: GetElementRef, decorators: [{
|
|
37
|
-
type: Directive,
|
|
38
|
-
args: [{ selector: '[ngnElementRef]', exportAs: 'ngnElementRef' }]
|
|
39
|
-
}] });
|
|
40
241
|
|
|
41
242
|
async function filterItem(item, filterText, options) {
|
|
42
243
|
const text = options.caseSensitive ? filterText : filterText.toLowerCase();
|
|
43
|
-
const
|
|
244
|
+
const filterFieldsCallbackResultRaw = options.filterFieldsCallback?.(item);
|
|
245
|
+
const filterFieldsCallbackResult = typeof filterFieldsCallbackResultRaw === 'function'
|
|
246
|
+
? filterFieldsCallbackResultRaw()
|
|
247
|
+
: filterFieldsCallbackResultRaw;
|
|
44
248
|
const fields = Array.isArray(filterFieldsCallbackResult)
|
|
45
249
|
? filterFieldsCallbackResult
|
|
46
250
|
: [filterFieldsCallbackResult];
|
|
@@ -69,25 +273,19 @@ async function filterItem(item, filterText, options) {
|
|
|
69
273
|
}
|
|
70
274
|
return null;
|
|
71
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* @todo fix only one word needing to match
|
|
278
|
+
*/
|
|
72
279
|
async function itemMatches(words, filterOptions, itemString, item) {
|
|
73
280
|
const results = await Promise.all(words.map(async (word) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return itemString.endsWith(word);
|
|
81
|
-
case 'equals':
|
|
82
|
-
return itemString === word;
|
|
83
|
-
case 'fuzzy':
|
|
84
|
-
return fuzzyMatch(itemString, word);
|
|
85
|
-
default:
|
|
86
|
-
if (typeof filterOptions.filterFn !== 'function') {
|
|
87
|
-
throw new Error(`Invalid filter function: ${filterOptions.filterFn}. Expected a function or one of the predefined filter functions.`);
|
|
88
|
-
}
|
|
89
|
-
return await filterOptions.filterFn(word, item);
|
|
281
|
+
const fn = filterOptions.filterFn ?? 'contains';
|
|
282
|
+
if (typeof fn === 'string') {
|
|
283
|
+
return stringMatches(itemString, word, fn);
|
|
284
|
+
}
|
|
285
|
+
if (typeof fn !== 'function') {
|
|
286
|
+
throw new NgnError('filtering', `Invalid filter function: ${String(fn)}. Expected a function or one of the predefined filter functions.`);
|
|
90
287
|
}
|
|
288
|
+
return await fn(word, item);
|
|
91
289
|
}));
|
|
92
290
|
return results.some(result => result);
|
|
93
291
|
}
|
|
@@ -98,83 +296,10 @@ async function filterOptions(options, filterText, filterOptions) {
|
|
|
98
296
|
return (await Promise.all(options.map(async (option) => await filterItem(option, filterText, filterOptions)))).filter(notNullish);
|
|
99
297
|
}
|
|
100
298
|
|
|
101
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
|
-
function valueControlBaseProvider(type) {
|
|
103
|
-
return {
|
|
104
|
-
provide: NG_VALUE_ACCESSOR,
|
|
105
|
-
useExisting: type,
|
|
106
|
-
multi: true,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
class ValueControlBase {
|
|
110
|
-
label = input(null);
|
|
111
|
-
inputId = input(generateElementId());
|
|
112
|
-
value = signal(null);
|
|
113
|
-
writeValue(value) {
|
|
114
|
-
this.value.set(value ?? null);
|
|
115
|
-
}
|
|
116
|
-
_onChange = () => { };
|
|
117
|
-
registerOnChange(fn) {
|
|
118
|
-
this._onChange = fn;
|
|
119
|
-
}
|
|
120
|
-
_onTouched = () => { };
|
|
121
|
-
registerOnTouched(fn) {
|
|
122
|
-
this._onTouched = fn;
|
|
123
|
-
}
|
|
124
|
-
onTouched() {
|
|
125
|
-
this._onTouched();
|
|
126
|
-
}
|
|
127
|
-
onChange(value) {
|
|
128
|
-
this._onChange(value ?? null);
|
|
129
|
-
}
|
|
130
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ValueControlBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
131
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.0.5", type: ValueControlBase, isStandalone: true, selector: "ng-component", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: '', isInline: true });
|
|
132
|
-
}
|
|
133
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: ValueControlBase, decorators: [{
|
|
134
|
-
type: Component,
|
|
135
|
-
args: [{
|
|
136
|
-
template: '',
|
|
137
|
-
imports: [],
|
|
138
|
-
}]
|
|
139
|
-
}] });
|
|
140
|
-
|
|
141
|
-
function provideNgnControls() {
|
|
142
|
-
return [NgnGlobal];
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
class NgnTemplate {
|
|
146
|
-
ngnTemplate = input.required();
|
|
147
|
-
static ngTemplateContextGuard(dir, ctx) {
|
|
148
|
-
return true;
|
|
149
|
-
}
|
|
150
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: NgnTemplate, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
151
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.0.5", type: NgnTemplate, isStandalone: true, selector: "ng-template[ngnTemplate]", inputs: { ngnTemplate: { classPropertyName: "ngnTemplate", publicName: "ngnTemplate", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
|
|
152
|
-
}
|
|
153
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: NgnTemplate, decorators: [{
|
|
154
|
-
type: Directive,
|
|
155
|
-
args: [{
|
|
156
|
-
selector: 'ng-template[ngnTemplate]',
|
|
157
|
-
}]
|
|
158
|
-
}] });
|
|
159
|
-
/**
|
|
160
|
-
* A noop with return type T.
|
|
161
|
-
* This function is used to define typed properties to use in a template.
|
|
162
|
-
*/
|
|
163
|
-
function templateTypesFn() {
|
|
164
|
-
return {};
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* A noop with return type `{ $implicit: Implicit } & Named`.
|
|
168
|
-
* This function is used to define a typed property to use in a template.
|
|
169
|
-
*/
|
|
170
|
-
function templateTypeFn() {
|
|
171
|
-
return {};
|
|
172
|
-
}
|
|
173
|
-
|
|
174
299
|
function transformToNgnItem(item, fields) {
|
|
175
|
-
const rawItems = fields.
|
|
300
|
+
const rawItems = fields.children ? item[fields.children] : undefined;
|
|
176
301
|
if (rawItems && !Array.isArray(rawItems)) {
|
|
177
|
-
throw new
|
|
302
|
+
throw new NgnError('transformToNgnItem', `Expected children to be an array, but got ${typeof rawItems} for item: ${JSON.stringify(item)}`);
|
|
178
303
|
}
|
|
179
304
|
const items = rawItems?.length
|
|
180
305
|
? transformToNgnItems(rawItems, fields)
|
|
@@ -187,8 +312,11 @@ function transformToNgnItem(item, fields) {
|
|
|
187
312
|
items: items,
|
|
188
313
|
};
|
|
189
314
|
}
|
|
315
|
+
function transformToNgnItemPrimitive(item) {
|
|
316
|
+
return transformToNgnItem({ var: item }, { label: 'var', value: 'var' });
|
|
317
|
+
}
|
|
190
318
|
function transformToNgnItems(items, fields) {
|
|
191
|
-
return items.map(item => transformToNgnItem(item, fields));
|
|
319
|
+
return items.map((item) => transformToNgnItem(item, fields));
|
|
192
320
|
}
|
|
193
321
|
function mapToItems(items) {
|
|
194
322
|
return items
|
|
@@ -211,108 +339,9 @@ function flatItems(items) {
|
|
|
211
339
|
.flat();
|
|
212
340
|
}
|
|
213
341
|
|
|
214
|
-
function mergeWithDefaults(options) {
|
|
215
|
-
return {
|
|
216
|
-
placement: 'bottom',
|
|
217
|
-
flip: true,
|
|
218
|
-
resize: true,
|
|
219
|
-
shift: true,
|
|
220
|
-
offset: 4,
|
|
221
|
-
stopped: false,
|
|
222
|
-
...options,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
function positionElement(referenceEl, floatingEl, options = {}) {
|
|
226
|
-
options = mergeWithDefaults(options);
|
|
227
|
-
const flipMiddleware = options.flip
|
|
228
|
-
? flip(options.shift ? { crossAxis: 'alignment', fallbackAxisSideDirection: 'end' } : undefined)
|
|
229
|
-
: undefined;
|
|
230
|
-
const shiftMiddleware = options.shift ? shift() : undefined;
|
|
231
|
-
if (options.sizeConstraints) {
|
|
232
|
-
if (options.sizeConstraints.width || options.sizeConstraints.maxWidth) {
|
|
233
|
-
const refWidth = referenceEl.offsetWidth;
|
|
234
|
-
if (options.sizeConstraints.width) {
|
|
235
|
-
if (typeof options.sizeConstraints.width === 'string') {
|
|
236
|
-
floatingEl.style.width = options.sizeConstraints.width;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
const widthConstraints = options.sizeConstraints.width * refWidth;
|
|
240
|
-
floatingEl.style.width = `min(100%, ${widthConstraints}px)`;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
if (options.sizeConstraints.maxWidth) {
|
|
244
|
-
if (typeof options.sizeConstraints.maxWidth === 'string') {
|
|
245
|
-
floatingEl.style.maxWidth = options.sizeConstraints.maxWidth;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
const maxWidthConstraints = options.sizeConstraints.maxWidth * refWidth;
|
|
249
|
-
floatingEl.style.maxWidth = `min(100%, ${maxWidthConstraints}px)`;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
if (options.sizeConstraints.height || options.sizeConstraints.maxHeight) {
|
|
254
|
-
if (options.sizeConstraints.height) {
|
|
255
|
-
floatingEl.style.height = options.sizeConstraints.height;
|
|
256
|
-
}
|
|
257
|
-
if (options.sizeConstraints.maxHeight) {
|
|
258
|
-
floatingEl.style.maxHeight = options.sizeConstraints.maxHeight;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
computePosition(referenceEl, floatingEl, {
|
|
263
|
-
placement: options.placement,
|
|
264
|
-
middleware: [
|
|
265
|
-
options.offset ? offset(options.offset) : undefined,
|
|
266
|
-
...(options.placement?.includes('-')
|
|
267
|
-
? [flipMiddleware, shiftMiddleware]
|
|
268
|
-
: [shiftMiddleware, flipMiddleware]),
|
|
269
|
-
options.resize
|
|
270
|
-
? size({
|
|
271
|
-
apply({ availableHeight }) {
|
|
272
|
-
Object.assign(floatingEl.style, {
|
|
273
|
-
maxHeight: `${Math.min(Number(options.sizeConstraints?.maxHeight ?? availableHeight), availableHeight)}px`,
|
|
274
|
-
});
|
|
275
|
-
},
|
|
276
|
-
})
|
|
277
|
-
: undefined,
|
|
278
|
-
].filter(Boolean),
|
|
279
|
-
}).then(({ x, y }) => {
|
|
280
|
-
Object.assign(floatingEl.style, {
|
|
281
|
-
left: `${x}px`,
|
|
282
|
-
top: `${y}px`,
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
function autoPositionElement(referenceEl, floatingEl, options = {}) {
|
|
287
|
-
options = mergeWithDefaults(options);
|
|
288
|
-
let cleanup;
|
|
289
|
-
const destroyRef = options.injector?.get(DestroyRef) ?? inject(DestroyRef);
|
|
290
|
-
function startAutoUpdate() {
|
|
291
|
-
cleanup = autoUpdate(referenceEl, floatingEl, () => {
|
|
292
|
-
positionElement(referenceEl, floatingEl, options);
|
|
293
|
-
});
|
|
294
|
-
return cleanup;
|
|
295
|
-
}
|
|
296
|
-
destroyRef.onDestroy(() => {
|
|
297
|
-
cleanup?.();
|
|
298
|
-
cleanup = undefined;
|
|
299
|
-
});
|
|
300
|
-
return {
|
|
301
|
-
start: () => {
|
|
302
|
-
cleanup?.();
|
|
303
|
-
startAutoUpdate();
|
|
304
|
-
},
|
|
305
|
-
stop: () => {
|
|
306
|
-
cleanup?.();
|
|
307
|
-
cleanup = undefined;
|
|
308
|
-
},
|
|
309
|
-
isRunning: () => !!cleanup,
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
|
|
313
342
|
/**
|
|
314
343
|
* Generated bundle index. Do not edit.
|
|
315
344
|
*/
|
|
316
345
|
|
|
317
|
-
export {
|
|
346
|
+
export { executeFilter, executeMultiFilter, filterOptions, flatItems, getActiveFilterConditions, mapToItems, parseFilterRawValue, stringMatches, transformToNgnItem, transformToNgnItemPrimitive, transformToNgnItems };
|
|
318
347
|
//# sourceMappingURL=ngneers-controls-api.mjs.map
|