{"version":3,"file":"ibenvandeveire-ngx-utils.mjs","sources":["../../../../../libs/angular/utils/src/lib/directives/focus-click/focus-click.directive.ts","../../../../../libs/angular/utils/src/lib/directives/index.ts","../../../../../libs/angular/utils/src/lib/services/broadcast-channel/broadcast-channel.service.ts","../../../../../libs/angular/utils/src/lib/services/storage-service/storage.service.ts","../../../../../libs/angular/utils/src/lib/services/media-query/mediaquery.service.ts","../../../../../libs/angular/utils/src/lib/pipes/btw/btw.pipe.ts","../../../../../libs/angular/utils/src/lib/pipes/has-observers/has-observers.pipe.ts","../../../../../libs/angular/utils/src/lib/pipes/iban/iban.pipe.ts","../../../../../libs/angular/utils/src/lib/tokens/replace-elements.token.ts","../../../../../libs/angular/utils/src/lib/pipes/replace-elements/replace-elements.pipe.ts","../../../../../libs/angular/utils/src/lib/pipes/transform/transform.pipe.ts","../../../../../libs/angular/utils/src/lib/pipes/index.ts","../../../../../libs/angular/utils/src/lib/abstracts/query-param-form-sync/query-param-form-sync.component.abstract.ts","../../../../../libs/angular/utils/src/lib/providers/replace-elements/replace-elements.provider.ts","../../../../../libs/angular/utils/src/lib/utils/simple-changes/simple-changes.util.ts","../../../../../libs/angular/utils/src/lib/mocks/broadcast-channel.service.mock.ts","../../../../../libs/angular/utils/src/lib/mocks/storage.service.mock.ts","../../../../../libs/angular/utils/src/index.ts","../../../../../libs/angular/utils/src/ibenvandeveire-ngx-utils.ts"],"sourcesContent":["import { Directive, HostListener, OutputEmitterRef, input, output } from '@angular/core';\n\n@Directive({\n\tselector: '[focusClick]',\n\tstandalone: true,\n\thost: {\n\t\t'[attr.tabIndex]': '0',\n\t},\n})\nexport class FocusClickDirective {\n\t// Allow the button to ignore click events when set to true\n\tpublic readonly disabled = input<boolean>(false);\n\n\t// Allow the function passed by the host to be executed\n\t// when the emit() method gets called\n\t/**\n\t * This directive replaces the default `click` directive and allows the user to execute\n\t * the `click` event by clicking the mouse **and**  by using the `enter` key on focus.\n\t *\n\t * A tabindex of `0` gets added to the host.\n\t *\n\t * @memberof FocusClickDirective\n\t */\n\tpublic readonly focusClick: OutputEmitterRef<void | Event> = output<void | Event>();\n\n\t// Add eventhandler to the click event\n\t@HostListener('click', ['$event'])\n\tpublic isClicked(event: Event): void {\n\t\tif (!this.disabled()) {\n\t\t\tthis.focusClick.emit(event);\n\t\t}\n\t}\n\n\t// Add eventhandler to keydown event When enter is pressed and the event\n\t// isn't blocked, execute the click function of the host\n\t@HostListener('keydown.enter')\n\tpublic isEntered(): void {\n\t\tif (!this.disabled()) {\n\t\t\tthis.focusClick.emit();\n\t\t}\n\t}\n}\n","import { FocusClickDirective } from './focus-click/focus-click.directive';\n\nexport const Directives = [FocusClickDirective];\n\nexport { FocusClickDirective } from './focus-click/focus-click.directive';\n","import { Injectable, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { EMPTY, fromEvent, Observable } from 'rxjs';\n\n/**\n * A service that wraps the BroadCastChannel API and provides an Observable based implementation to the channel messages.\n *\n * For more information:\n * https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n */\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class NgxBroadcastChannelService {\n\tprotected readonly windowService = inject(NgxWindowService);\n\n\t/**\n\t * A record holding all the broadcast channels\n\t */\n\tprotected broadcastChannel: Record<string, BroadcastChannel> = {};\n\n\t/**\n\t * initChannel\n\t *\n\t * The initChannel method initializes a new BroadcastChannel instance.\n\t *\n\t * @param args{ConstructorParameters<typeof BroadcastChannel>} - The arguments to pass to the BroadcastChannel constructor.\n\t */\n\tpublic initChannel(...args: ConstructorParameters<typeof BroadcastChannel>): void {\n\t\t// Iben: Only run when in browser\n\t\tthis.windowService.runInBrowser(() => {\n\t\t\tconst [channelName] = args;\n\n\t\t\tif (!channelName) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'NgxUtils: There was an attempt to initialize a BroadcastChannel without providing a name.'\n\t\t\t\t);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.broadcastChannel[channelName]) {\n\t\t\t\tthis.broadcastChannel[channelName] = new BroadcastChannel(...args);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * closeChannel\n\t *\n\t * The closeChannel method closes a selected BroadcastChannel instance.\n\t *\n\t * @param channelName{string} - The name of the Broadcast Channel.\n\t */\n\tpublic closeChannel(channelName: string): void {\n\t\tif (!channelName || !this.broadcastChannel[channelName]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.broadcastChannel[channelName].close();\n\t\tdelete this.broadcastChannel[channelName];\n\t}\n\n\t/**\n\t * postMessage\n\t *\n\t * The postMessage method sends a message to a selected BroadcastChannel instance.\n\t *\n\t * @param channelName{string} - The name of the Broadcast Channel.\n\t * @param message{any} - The payload to send through the channel.\n\t */\n\tpublic postMessage<MessageType = any>(channelName: string, message: MessageType): void {\n\t\tif (!channelName || !this.broadcastChannel[channelName]) {\n\t\t\tconsole.error(\n\t\t\t\t'NgxUtils: There was an attempt to post a message to a channel without providing a name or the selected channel does not exist. The included message was:',\n\t\t\t\tmessage\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.broadcastChannel[channelName].postMessage(message);\n\t}\n\n\t/**\n\t * selectChannelMessages\n\t *\n\t * The selectChannelMessages method subscribes to the `message` (bc.onmessage) event of a selected BroadcastChannel instance.\n\t *\n\t * @param channelName{string} - The name of the Broadcast Channel.\n\t * @returns Observable<MessageEvent> - The message event of the channel wrapped in an observable.\n\t */\n\tpublic selectChannelMessages<MessageType = any>(\n\t\tchannelName: string\n\t): Observable<MessageEvent<MessageType>> {\n\t\tif (!channelName || !this.broadcastChannel[channelName]) {\n\t\t\tconsole.error(\n\t\t\t\t\"NgxUtils: There was an attempt to select a BroadcastChannel's messages without providing a name or the selected channel does not exist.\"\n\t\t\t);\n\n\t\t\treturn EMPTY;\n\t\t}\n\n\t\treturn fromEvent<MessageEvent<MessageType>>(this.broadcastChannel[channelName], 'message');\n\t}\n\n\t/**\n\t * selectChannelMessageErrors\n\t *\n\t * The selectChannelMessageErrors method subscribes to the `messageerror` (bc.onmessageerror) event of a selected BroadcastChannel instance.\n\t *\n\t * @param channelName{string} - The name of the Broadcast Channel.\n\t * @returns Observable<MessageEvent> - The messageerror event of the channel wrapped in an observable.\n\t */\n\tpublic selectChannelMessageErrors<MessageType = any>(\n\t\tchannelName: string\n\t): Observable<MessageEvent<MessageType>> {\n\t\tif (!channelName || !this.broadcastChannel[channelName]) {\n\t\t\tconsole.error(\n\t\t\t\t\"NgxUtils: There was an attempt to select a BroadcastChannel's message errors without providing a name or the selected channel does not exist.\"\n\t\t\t);\n\n\t\t\treturn EMPTY;\n\t\t}\n\n\t\treturn fromEvent<MessageEvent<MessageType>>(\n\t\t\tthis.broadcastChannel[channelName],\n\t\t\t'messageerror'\n\t\t);\n\t}\n}\n","import { Injectable, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { BehaviorSubject, NEVER, Observable, Subject } from 'rxjs';\n\nimport {\n\tNgxStorage,\n\tNgxStorageClearEvent,\n\tNgxStorageEvent,\n\tNgxStorageRecord,\n\tNgxStorageRemoveEvent,\n\tNgxStorageSetEvent,\n\tNgxStorageType,\n} from '../../types';\n\n/**\n * A service that provides a SSR-proof Observable based approach to the session- and localStorage.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxStorageService {\n\tprotected readonly windowService = inject(NgxWindowService);\n\n\t/**\n\t * A record to hold the properties in the sessionStorage\n\t */\n\tprotected readonly sessionStorageRecord: NgxStorageRecord = {};\n\t/**\n\t * A record to hold the properties in the localStorage\n\t */\n\tprotected readonly localStorageRecord: NgxStorageRecord = {};\n\t/**\n\t * A subject to hold the events of the storage\n\t */\n\tprotected readonly storageEventSubject: Subject<NgxStorageEvent> = new Subject();\n\n\t/**\n\t * An observable that emits whenever the session- or the localStorage was updated\n\t */\n\tpublic readonly storageEvents$: Observable<NgxStorageEvent> =\n\t\tthis.storageEventSubject.asObservable();\n\n\tconstructor() {\n\t\tconst windowService = this.windowService;\n\n\t\t// Iben: Get the initial values of the session and the local storage\n\t\twindowService.runInBrowser(() => {\n\t\t\tthis.setupStorage(sessionStorage, this.sessionStorageRecord);\n\t\t\tthis.setupStorage(localStorage, this.localStorageRecord);\n\t\t});\n\t}\n\n\t/**\n\t * A localStorage implementation using observables\n\t */\n\tpublic get localStorage(): NgxStorage {\n\t\treturn {\n\t\t\tgetItem: <DataType = any>(key: string) => this.getItem<DataType>(key, localStorage),\n\t\t\tgetItemObservable: <DataType = any>(key: string) =>\n\t\t\t\tthis.getItemObservable<DataType>(key, this.localStorageRecord),\n\t\t\tremoveItem: (key: string) =>\n\t\t\t\tthis.removeItem(key, localStorage, this.localStorageRecord, 'local'),\n\t\t\tsetItem: <DataType = any>(key: string, item: DataType) =>\n\t\t\t\tthis.setItem(key, item, localStorage, this.localStorageRecord, 'local'),\n\t\t\tclear: () => this.clearStorage(localStorage, this.localStorageRecord, 'local'),\n\t\t};\n\t}\n\n\t/**\n\t * A sessionStorage implementation using observables\n\t */\n\tpublic get sessionStorage(): NgxStorage {\n\t\treturn {\n\t\t\tgetItem: <DataType = any>(key: string) => this.getItem<DataType>(key, sessionStorage),\n\t\t\tgetItemObservable: <DataType = any>(key: string) =>\n\t\t\t\tthis.getItemObservable<DataType>(key, this.sessionStorageRecord),\n\t\t\tremoveItem: (key: string) =>\n\t\t\t\tthis.removeItem(key, sessionStorage, this.sessionStorageRecord, 'session'),\n\t\t\tsetItem: <DataType = any>(key: string, item: DataType) =>\n\t\t\t\tthis.setItem(key, item, sessionStorage, this.sessionStorageRecord, 'session'),\n\t\t\tclear: () => this.clearStorage(sessionStorage, this.sessionStorageRecord, 'session'),\n\t\t};\n\t}\n\n\tprotected getItem<DataType = any>(key: string, storage: Storage): DataType {\n\t\treturn this.parseValue(storage.getItem(key));\n\t}\n\n\t/**\n\t * Returns an observable version of the storage value\n\t *\n\t * @param key - The key of the storage value\n\t * @param record  - The storage record\n\t */\n\tprotected getItemObservable<DataType>(\n\t\tkey: string,\n\t\trecord: NgxStorageRecord\n\t): Observable<DataType> {\n\t\t// Iben: Return NEVER when not in browser\n\t\tif (!this.windowService.isBrowser()) {\n\t\t\treturn NEVER;\n\t\t}\n\n\t\t// Iben: If the subject already exists, we return the observable\n\t\tif (record[key]) {\n\t\t\treturn record[key].asObservable();\n\t\t}\n\n\t\t// Iben: If no subject exits, we create a new one\n\t\trecord[key] = new BehaviorSubject<DataType>(undefined);\n\n\t\t// Iben: Return the observable\n\t\treturn this.getItemObservable<DataType>(key, record);\n\t}\n\n\t/**\n\t * Sets an item in the storage\n\t *\n\t * @param key - The key of the item\n\t * @param item - The item in the storage\n\t * @param storage - The storage in which we want to save the item\n\t * @param record - The corresponding storage record\n\t */\n\tprotected setItem<DataType = any>(\n\t\tkey: string,\n\t\titem: DataType,\n\t\tstorage: Storage,\n\t\trecord: NgxStorageRecord,\n\t\ttype: NgxStorageType\n\t): NgxStorageSetEvent | undefined {\n\t\t// Iben: Early exit when we're in the browser\n\t\tif (!this.windowService.isBrowser()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Iben: Check if there's already a subject for this item. If not, we create one\n\t\tlet subject = record[key];\n\n\t\tif (!subject) {\n\t\t\tsubject = new BehaviorSubject<DataType>(undefined);\n\t\t\tstorage[key] = subject;\n\t\t}\n\n\t\t// Iben: Store the current value of the subject\n\t\tconst oldValue = subject.getValue();\n\n\t\t// Iben: Set the item in the storage\n\t\tstorage.setItem(key, typeof item === 'string' ? item : JSON.stringify(item));\n\n\t\t// Iben: Update the subject in the record\n\t\tsubject.next(item);\n\n\t\t// Iben: Create the storage event\n\t\tconst event: NgxStorageSetEvent = {\n\t\t\tkey,\n\t\t\tnewValue: item,\n\t\t\toldValue,\n\t\t\tstorage: type,\n\t\t\ttype: 'set',\n\t\t};\n\n\t\t// Iben: Emit the storage event\n\t\tthis.storageEventSubject.next(event);\n\n\t\t// Iben: Return the storage event\n\t\treturn event;\n\t}\n\n\t/**\n\t * Remove an item from the storage and emit a remove event\n\t *\n\t * @param  key - The key of the item\n\t * @param storage - The storage we wish to remove the item from\n\t * @param record - The record with the subject\n\t * @param type - The type of storage\n\t */\n\tprotected removeItem(\n\t\tkey: string,\n\t\tstorage: Storage,\n\t\trecord: NgxStorageRecord,\n\t\ttype: NgxStorageType\n\t): NgxStorageRemoveEvent | undefined {\n\t\t// Iben: Early exit when we're not in the browser\n\t\tif (!this.windowService.isBrowser()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Iben: Get the old item\n\t\tconst oldValue = this.parseValue(storage.getItem(key));\n\n\t\t// Iben: Remove the item from the storage\n\t\tstorage.removeItem(key);\n\n\t\t// Iben Update the subject if it exists\n\t\trecord[key]?.next(undefined);\n\n\t\t// Iben: Create the event and return and emit it\n\t\tconst event: NgxStorageRemoveEvent = {\n\t\t\toldValue,\n\t\t\tstorage: type,\n\t\t\tkey,\n\t\t\ttype: 'remove',\n\t\t};\n\n\t\tthis.storageEventSubject.next(event);\n\t\treturn event;\n\t}\n\n\t/**\n\t * Clears the storage, completes all subjects and emits a clear event\n\t *\n\t * @param storage - The storage we wish to clear\n\t * @param record - The record with the subjects\n\t * @param type - The type of storage\n\t */\n\tprotected clearStorage(\n\t\tstorage: Storage,\n\t\trecord: NgxStorageRecord,\n\t\ttype: NgxStorageType\n\t): NgxStorageClearEvent | undefined {\n\t\t// Iben: Early exit when we're not in the browser\n\t\tif (!this.windowService.isBrowser()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Iben: Clear the storage\n\t\tstorage.clear();\n\n\t\t// Iben: Clear the record and complete all subjects\n\t\tObject.entries(record).forEach(([key, subject]) => {\n\t\t\tsubject.next(undefined);\n\t\t\tsubject.complete();\n\n\t\t\trecord[key] = undefined;\n\t\t});\n\n\t\t// Iben: Create and emit event\n\t\tconst event: NgxStorageClearEvent = {\n\t\t\ttype: 'clear',\n\t\t\tstorage: type,\n\t\t};\n\n\t\tthis.storageEventSubject.next(event);\n\n\t\treturn event;\n\t}\n\n\t/**\n\t * Grabs the existing storage and updates the record\n\t *\n\t * @private\n\t * @param {Storage} storage - The current state of the storage\n\t * @param {NgxStorageRecord} record\n\t * @memberof NgxStorageService\n\t */\n\tprotected setupStorage(storage: Storage, record: NgxStorageRecord) {\n\t\tObject.entries(storage).forEach(([key, value]) => {\n\t\t\trecord[key] = new BehaviorSubject(this.parseValue(value));\n\t\t});\n\t}\n\n\t/**\n\t * Parses a string value from the storage to an actual value\n\t *\n\t * @param value - The provided string value\n\t */\n\tprotected parseValue(value: string): any {\n\t\t// Iben: If the value does not exist, return the value\n\t\tif (!value) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Iben: If the value is either true or false, return a boolean version of the value\n\t\tif (value === 'true' || value === 'false') {\n\t\t\treturn value === 'true';\n\t\t}\n\n\t\t// Iben: If the value is a number, return the parsed number\n\t\tif (value.match(/^[0-9]*[,.]{0,1}[0-9]*$/)) {\n\t\t\treturn Number(value);\n\t\t}\n\n\t\t// Iben: If the value is an object, return the parsed object\n\t\tif (value.match(/{(.*:.*[,]{0,1})*}/)) {\n\t\t\treturn JSON.parse(value);\n\t\t}\n\n\t\t// Iben: Return the string value as is\n\t\treturn value;\n\t}\n}\n","import { Injectable, OnDestroy, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { filter, map, Observable, ReplaySubject } from 'rxjs';\n\n/**\n * @deprecated This service will be deprecated in the next major release. Please use the NgxMediaQueryService from `@ibenvandeveire/ngx-layout` instead.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxMediaQueryService implements OnDestroy {\n\tprivate readonly windowService = inject(NgxWindowService);\n\n\t/**\n\t * A map of media queries that are registered with the service.\n\t */\n\tprivate readonly queryListMap: Map<string, MediaQueryList> = new Map();\n\n\t/**\n\t * A map of the registered media queries with their id.\n\t */\n\tprivate readonly queryIdMap: Map<string, string> = new Map();\n\n\t/*\n\t * A map of listeners that are registered with the service.\n\t * They are saved to be able to remove them when the service is destroyed.\n\t */\n\tprivate readonly mediaQueryListenerMap: Map<\n\t\tstring,\n\t\t(queryChangedEvent: MediaQueryListEvent) => void\n\t> = new Map();\n\n\t/**\n\t * A subject that emits the id of the media query that has changed.\n\t */\n\tprivate readonly queryChangedSubject: ReplaySubject<string> = new ReplaySubject();\n\n\t/**\n\t * Register a list of media queries that need to be tracked by the service.\n\t *\n\t * @param queries - A list of media queries that should be registered with the service.\n\t */\n\tpublic registerMediaQueries(...queries: [id: string, query: string][]): void {\n\t\tthis.windowService.runInBrowser(({ browserWindow }) => {\n\t\t\tfor (const [id, query] of queries) {\n\t\t\t\t// Wouter: Warn if the id has already been registered.\n\t\t\t\tif (this.queryIdMap.get(id)) {\n\t\t\t\t\treturn console.warn(\n\t\t\t\t\t\t`NgxMediaQueryService: Media query with id '${id}' already exists and is defined by '${this.queryIdMap.get(\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t)}'`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Wouter: If the query has already been registered, throw an error to prevent duplicate subscriptions\n\t\t\t\tif ([...this.queryIdMap].some(([_, value]) => value === query)) {\n\t\t\t\t\tconst duplicateQuery = [...this.queryIdMap].find(\n\t\t\t\t\t\t([_, value]) => value === query\n\t\t\t\t\t);\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`NgxMediaQueryService: Query of ['${id}', ${query}] already exists and is defined by ['${duplicateQuery[0]}', ${duplicateQuery[1]}]`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Wouter: save the id and query\n\t\t\t\tthis.queryIdMap.set(id, query);\n\n\t\t\t\t// Wouter: For each query, create a MediaQueryList object\n\t\t\t\tconst matchedQuery = browserWindow.matchMedia(query);\n\n\t\t\t\t// Wouter: Save the query\n\t\t\t\tthis.queryListMap.set(id, matchedQuery);\n\n\t\t\t\t// Wouter: Emit the id of the query that has changed\n\t\t\t\tthis.queryChangedSubject.next(id);\n\n\t\t\t\t// Wouter: Create a listener for the query. This is done separately to be\n\t\t\t\t// able to remove the listener when the service is destroyed\n\t\t\t\tconst listener = (queryChangedEvent: MediaQueryListEvent) => {\n\t\t\t\t\tthis.queryListMap.set(id, queryChangedEvent.currentTarget as MediaQueryList);\n\n\t\t\t\t\t// Wouter: Emit the id of the query that has changed\n\t\t\t\t\tthis.queryChangedSubject.next(id);\n\t\t\t\t};\n\n\t\t\t\t// Wouter: Register the listener to the query\n\t\t\t\tmatchedQuery.addEventListener('change', listener);\n\n\t\t\t\t// Wouter: Save the listener\n\t\t\t\tthis.mediaQueryListenerMap.set(id, listener);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Pass the id of the query whose changes need to be listened to.\n\t *\n\t * @param id - The id of the media query that should be checked.\n\t * @returns An observable that emits a boolean value whenever the requested media query changes.\n\t */\n\tpublic getMatchingQuery$(id: string): Observable<boolean> {\n\t\t// Wouter: Throw an error if the query has not been registered\n\t\tif (!this.queryIdMap.has(id)) {\n\t\t\tthrow new Error(\n\t\t\t\t`NgxMediaQueryService: No media query with id '${id}' has been registered. Please register the media query first using the 'registerMediaQueries' method.`\n\t\t\t);\n\t\t}\n\n\t\treturn this.queryChangedSubject.asObservable().pipe(\n\t\t\t// Wouter: Filter the query that has changed.\n\t\t\t// This will make sure only the [id] streams are triggered.\n\t\t\tfilter((queryId) => queryId === id),\n\t\t\tmap(() => this.queryListMap.get(id).matches)\n\t\t);\n\t}\n\n\t/**\n\t * Unregister all media query subscriptions from the service.\n\t */\n\tpublic ngOnDestroy(): void {\n\t\tthis.windowService.runInBrowser(() => {\n\t\t\t// Wouter: Remove all eventListeners\n\t\t\tfor (const [id, query] of this.queryListMap) {\n\t\t\t\tquery.removeEventListener('change', this.mediaQueryListenerMap.get(id));\n\t\t\t}\n\n\t\t\t// Wouter: Complete subscriptions\n\t\t\tthis.queryChangedSubject.next(null);\n\t\t\tthis.queryChangedSubject.complete();\n\n\t\t\t// Wouter: Clear maps\n\t\t\tthis.queryListMap.clear();\n\t\t\tthis.mediaQueryListenerMap.clear();\n\t\t});\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'btw',\n\tstandalone: true,\n})\nexport class BtwPipe implements PipeTransform {\n\t/**\n\t * Converts a BTW number to the correct format\n\t *\n\t * @param value - The value we wish to convert\n\t */\n\tpublic transform(value: string): string {\n\t\tif (!value) {\n\t\t\t// Denis: if the value is falsy, return it without transform.\n\t\t\treturn value;\n\t\t}\n\n\t\tconst addCharAtIndex = (original: string, char: string, index: number): string => {\n\t\t\treturn original.slice(0, index) + char + original.slice(index);\n\t\t};\n\n\t\t// Iben: Convert to string if it's a number\n\t\tvalue = value.toString();\n\n\t\tif (value.replace(/\\./g, '').length === 9) {\n\t\t\tvalue = '0' + value;\n\t\t}\n\n\t\t// Iben: Format: xxxx.xxx.xxx\n\t\tif (value.charAt(4) !== '.') {\n\t\t\tvalue = addCharAtIndex(value, '.', 4);\n\t\t}\n\n\t\tif (value.charAt(8) !== '.') {\n\t\t\tvalue = addCharAtIndex(value, '.', 8);\n\t\t}\n\n\t\treturn value;\n\t}\n}\n","import { Pipe, PipeTransform, EventEmitter } from '@angular/core';\n\n@Pipe({\n\tname: 'hasObservers',\n\tstandalone: true,\n})\nexport class HasObserversPipe implements PipeTransform {\n\tpublic transform(output: EventEmitter<unknown>): boolean {\n\t\treturn output && output.observers.length > 0;\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'IBAN',\n\tstandalone: true,\n})\nexport class IbanPipe implements PipeTransform {\n\tpublic transform(value = ''): string {\n\t\tvalue = value.replace(/\\s/g, ''); // replace all spaces\n\n\t\tlet reformat = value.replace(/(.{4})/g, function (match) {\n\t\t\treturn match + ' '; // reformat into groups of 4 succeeded with a space\n\t\t});\n\n\t\treformat = reformat.trim(); // remove trailing space\n\n\t\treturn reformat;\n\t}\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { NgxReplaceElementsConfiguration } from '../types';\n\n/** The configuration token for the NgxReplaceElementsPipe */\nexport const NgxReplaceElementsConfigurationToken =\n\tnew InjectionToken<NgxReplaceElementsConfiguration>('NgxReplaceElementsConfigurationToken');\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nimport { NgxReplaceElementsConfigurationToken } from '../../tokens';\nimport { NgxReplaceElementsConfiguration, NgxReplaceElementsItem } from '../../types';\n\n/**\n * A pipe that allows to replace text elements with a WebComponent\n */\n@Pipe({\n\tname: 'ngxReplaceElements',\n\tstandalone: true,\n})\nexport class NgxReplaceElementsPipe implements PipeTransform {\n\tprivate readonly configuration = inject<NgxReplaceElementsConfiguration>(NgxReplaceElementsConfigurationToken);\n\tprivate readonly sanitizer = inject(DomSanitizer);\n\n\t/**\n\t * Replaces all matches of a specific selector with provided WebComponents\n\t *\n\t * @param value - The original string value\n\t * @param items - The items we wish to replace\n\t */\n\ttransform(value: string, items: NgxReplaceElementsItem[]): SafeHtml {\n\t\t// Iben: If the value isn't a string we early exit and warn the user\n\t\tif (typeof value !== 'string') {\n\t\t\tconsole.warn(\n\t\t\t\t'NgxReplaceElements: A non string-value was provided to the NgxReplaceElementsPipe'\n\t\t\t);\n\t\t\treturn '';\n\t\t}\n\n\t\t// Iben: If no items were provided to replace, we just return the value\n\t\tif (!items || items.length === 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Iben: set up a new instance of the DOMParser and parse the value as text/html.\n\t\t// This will return a Document which we can work with to find/replace elements.\n\t\tconst parser: DOMParser = new DOMParser();\n\t\tconst body: Document = parser.parseFromString(value, 'text/html');\n\n\t\t// Iben: Loop over all items we wish to replace\n\t\titems.forEach((item) => {\n\t\t\t// Iben: Get the selector and the element we want to replace the target with\n\t\t\tconst { selector, element, includeInnerHtml } = this.configuration[item.elementId];\n\n\t\t\t// Iben: Select the target\n\t\t\tconst target: HTMLElement = body.querySelector(selector.replace('{{id}}', item.id));\n\n\t\t\t// Iben: If no target was found, early exit\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Iben: Create a new element within the Document based on the provided selector.\n\t\t\t// The selector can be any native or custom web component (not an Angular component).\n\t\t\t// Keep in mind that the element will need to have a lowercase input prop for the reference.\n\t\t\tconst replacement: HTMLElement = body.createElement(element);\n\n\t\t\t// Iben: If the item included data, we set these attributes\n\t\t\tif (item.data) {\n\t\t\t\tObject.entries(item.data).forEach(([key, value]) => {\n\t\t\t\t\treplacement.setAttribute(key, value);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Iben: Copy the innerHtml of the target element to the new element if needed.\n      if (includeInnerHtml) {\n\t\t\treplacement.innerHTML = target.innerHTML;\n\t\t}\n\n\t\t\t// Iben: Replace the target with the new element within the Document.\n\t\t\ttarget.replaceWith(replacement);\n\t\t});\n\n\t\t// Iben: sanitize the document and mark it as trusted HTML before returning it to the template.\n\t\treturn this.sanitizer.bypassSecurityTrustHtml(body.documentElement.innerHTML);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * A pipe to pass a transformer function to. By using this setup, we can use functions without causing rerender issues\n */\n@Pipe({\n\tname: 'transform',\n\tstandalone: true,\n})\nexport class TransformPipe implements PipeTransform {\n\t/**\n\t * Transforms a value based on a provided transform function\n\t *\n\t * @param value - The provided value we wish to transform\n\t * @param transformer - A provided transform function\n\t */\n\tpublic transform<TransformerType = any>(value: any, transformer: Function): TransformerType {\n\t\t// Iben: If no transformer is passed, we return the original value\n\t\tif (!transformer) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Iben: Transform the value and return\n\t\treturn transformer(value);\n\t}\n}\n","import { BtwPipe } from './btw/btw.pipe';\nimport { HasObserversPipe } from './has-observers/has-observers.pipe';\nimport { IbanPipe } from './iban/iban.pipe';\nimport { NgxReplaceElementsPipe } from './replace-elements/replace-elements.pipe';\nimport { TransformPipe } from './transform/transform.pipe';\n\nexport const Pipes = [BtwPipe, HasObserversPipe, IbanPipe, TransformPipe, NgxReplaceElementsPipe];\n\nexport { BtwPipe } from './btw/btw.pipe';\nexport { HasObserversPipe } from './has-observers/has-observers.pipe';\nexport { IbanPipe } from './iban/iban.pipe';\nexport { TransformPipe } from './transform/transform.pipe';\nexport { NgxReplaceElementsPipe } from './replace-elements/replace-elements.pipe';\n","import { Directive, OnDestroy, OnInit, inject } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Observable, Subject, filter, take, takeUntil, tap } from 'rxjs';\n\nexport type StringifiedQueryParamsType<QueryParamsType> = {\n\t[key in keyof QueryParamsType]: string;\n};\n\n@Directive()\nexport abstract class NgxQueryParamFormSyncComponent<\n\t\tQueryParamsType,\n\t\tFormType extends AbstractControl,\n\t>\n\timplements OnInit, OnDestroy\n{\n\tprotected readonly route = inject(ActivatedRoute);\n\tprotected readonly router = inject(Router);\n\n\tprotected readonly destroyed$: Subject<void> = new Subject();\n\n\t/**\n\t * The form in which we will save the queryParam data\n\t */\n\tpublic form: FormType;\n\n\t/**\n\t * The query params we wish to form\n\t */\n\tprotected queryParams$: Observable<StringifiedQueryParamsType<QueryParamsType>> = this.route\n\t\t.queryParams as Observable<StringifiedQueryParamsType<QueryParamsType>>;\n\n\tpublic ngOnInit(): void {\n\t\t//Iben: Warn the user if one of the two methods isn't provided\n\t\tif (\n\t\t\t(!this.scrambleParams && this.unscrambleParams) ||\n\t\t\t(this.scrambleParams && !this.unscrambleParams)\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`NgxUtils: NgxQueryParamFormSyncComponent detected the use of the parameter scrambling but is missing an implementation for the ${\n\t\t\t\t\tthis.scrambleParams ? 'unscrambleParams' : 'scrambleParams'\n\t\t\t\t} method. Please provide this method in order for this flow to work correctly.`\n\t\t\t);\n\t\t}\n\n\t\t// Iben: Setup the form for the data\n\t\tthis.form = this.initForm();\n\n\t\t// Iben: Listen to the form changes\n\t\tthis.form.valueChanges\n\t\t\t.pipe(\n\t\t\t\ttap((data) => {\n\t\t\t\t\t// Iben: Update the route params\n\t\t\t\t\tthis.setDataInRoute(data);\n\n\t\t\t\t\t// Iben: Handle the route data changes\n\t\t\t\t\tif (this.handleDataChanges) {\n\t\t\t\t\t\tthis.handleDataChanges(data);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroyed$)\n\t\t\t)\n\t\t\t.subscribe();\n\n\t\t// Iben: Listen to the initial query param update so we can set the data in the form if we navigate to a link with the params\n\t\tthis.queryParams$\n\t\t\t.pipe(\n\t\t\t\ttake(1),\n\t\t\t\tfilter(Boolean),\n\t\t\t\ttap((data) => {\n\t\t\t\t\t// Iben: Convert the route data properties to the actual data\n\t\t\t\t\tlet value: QueryParamsType = Object.keys(data || {}).reduce(\n\t\t\t\t\t\t(previous, current) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...previous,\n\t\t\t\t\t\t\t\t[current]: data[current] ? JSON.parse(data[current]) : undefined,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{}\n\t\t\t\t\t) as QueryParamsType;\n\n\t\t\t\t\t// Iben: In case the unscrambleParams method is provided, we unscramble the data\n\t\t\t\t\tif (this.unscrambleParams) {\n\t\t\t\t\t\tvalue = this.unscrambleParams(value);\n\t\t\t\t\t}\n\n\t\t\t\t\t//Iben: If the entire object is empty, we early exit and do not set the form\n\t\t\t\t\tif (Object.keys(value).length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Iben: Set the current form value\n\t\t\t\t\tthis.form.setValue(value);\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroyed$)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tpublic ngOnDestroy(): void {\n\t\tthis.destroyed$.next();\n\t\tthis.destroyed$.complete();\n\n\t\tthis.clearData();\n\t}\n\n\t/**\n\t * Clears the data in the form\n\t */\n\tpublic clearData(): void {\n\t\tthis.form.reset();\n\t}\n\n\t/**\n\t * Sets the provided data in the route, so the filtered view can be shared by url\n\t *\n\t * @param  data - The provided data\n\t */\n\tprivate setDataInRoute(data: QueryParamsType): void {\n\t\t// Iben: If no data was provided, we simply unset the current params\n\t\tif (Object.keys(data || {}).length === 0) {\n\t\t\tthis.router.navigate([], {\n\t\t\t\trelativeTo: this.route,\n\t\t\t\tqueryParams: {},\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Iben: In case a scrambleParams function was provided, we scramble the params first\n\t\tconst parsedData = this.scrambleParams ? this.scrambleParams(data) : data;\n\n\t\t// Iben: Stringify all properties of the data\n\t\tconst queryParams = Object.keys(parsedData || {}).reduce((previous, current) => {\n\t\t\treturn {\n\t\t\t\t...previous,\n\t\t\t\t[current]: JSON.stringify(parsedData[current]),\n\t\t\t};\n\t\t}, {});\n\n\t\t// Iben: Add the queryParams to the route\n\t\tthis.router.navigate([], {\n\t\t\trelativeTo: this.route,\n\t\t\tqueryParamsHandling: 'merge',\n\t\t\tqueryParams,\n\t\t});\n\t}\n\n\t/**\n\t * A method that that will provide a form that will be used to store the current data\n\t */\n\tprotected abstract initForm(): FormType;\n\n\t/**\n\t * An optional method that will handle what happens when the data have been updated. Do NOT subscribe to an Observable in this method.\n\t *\n\t * This method is useful in case you wish to save your currently selected data to a global state.\n\t *\n\t * @param data - The data provided by the form\n\t */\n\tprotected abstract handleDataChanges?(data: QueryParamsType): void;\n\n\t/**\n\t * An optional method to scramble the parameters if needed, so no data gets added into the route that shouldn't be shared\n\t *\n\t * @param params - The provided params we wish to set in the route\n\t */\n\tprotected scrambleParams?(params: QueryParamsType): QueryParamsType;\n\t/**\n\t * An optional method to unscramble the parameters if needed, so no data gets added into the route that shouldn't be shared\n\t *\n\t * @param params - The provided params we wish to patch in the form\n\t */\n\tprotected unscrambleParams?(params: QueryParamsType): QueryParamsType;\n}\n","import { Provider } from '@angular/core';\n\nimport { NgxReplaceElementsConfigurationToken } from '../../tokens';\nimport { NgxReplaceElementsConfiguration } from '../../types';\n\n/**\n * Provides the configuration for the NgxReplaceElements directive\n *\n * @param configuration - The required configuration\n */\nexport const provideNgxReplaceElementsConfiguration = (\n\tconfiguration: NgxReplaceElementsConfiguration\n): Provider => {\n\treturn {\n\t\tprovide: NgxReplaceElementsConfigurationToken,\n\t\tuseValue: configuration,\n\t};\n};\n","import { SimpleChange } from '@angular/core';\n\n/**\n * Method checks if given value has changed\n * @param {SimpleChange} value: value to check\n * @returns {boolean} whether or not if the given input has changed\n */\nexport const simpleChangeHasChanged = (value: SimpleChange): boolean => {\n\treturn value && JSON.stringify(value.previousValue) !== JSON.stringify(value.currentValue);\n};\n","/**\n * Returns a mock version of the `NgxBroadcastChannelService`\n *\n * @param testFunction - The test function we wish to use\n */\nexport const NgxBroadcastChannelServiceMock = (testFunction: Function) => ({\n\tinitChannel: testFunction,\n\tcloseChannel: testFunction,\n\tpostMessage: testFunction,\n\tselectChannelMessages: testFunction,\n\tselectChannelMessageErrors: testFunction,\n});\n","import { Subject } from 'rxjs';\n\n/**\n * Returns a mock version of the `NgxStorageServiceMock`.\n *\n * @param testFunction - The test function we wish to use.\n */\nexport const NgxStorageServiceMock = (testFunction: Function) => ({\n\tstorageEvents$: new Subject(),\n\tlocalStorage: {\n\t\tgetItem: testFunction,\n\t\tgetItemObservable: testFunction,\n\t\tremoveItem: testFunction,\n\t\tsetItem: testFunction,\n\t\tclear: testFunction,\n\t},\n\tsessionStorage: {\n\t\tgetItem: testFunction,\n\t\tgetItemObservable: testFunction,\n\t\tremoveItem: testFunction,\n\t\tsetItem: testFunction,\n\t\tclear: testFunction,\n\t},\n});\n","/*\n * Public API Surface of utils\n */\n\nexport * from './lib/directives';\nexport * from './lib/services';\nexport * from './lib/pipes';\nexport * from './lib/types';\nexport * from './lib/abstracts';\nexport * from './lib/providers';\nexport * from './lib/tokens';\nexport * from './lib/utils';\nexport * from './lib/mocks';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}