{"version":3,"file":"ngx-url-modal.mjs","sources":["../../../projects/ngx-url-modal/src/lib/utils/is-function.ts","../../../projects/ngx-url-modal/src/lib/core/static-context.ts","../../../projects/ngx-url-modal/src/lib/core/url-modal.ts","../../../projects/ngx-url-modal/src/lib/core/url-modal-query-parser.ts","../../../projects/ngx-url-modal/src/lib/dialog-provider-token.ts","../../../projects/ngx-url-modal/src/lib/services/url-modal.service.ts","../../../projects/ngx-url-modal/src/lib/core/base-modal.ts","../../../projects/ngx-url-modal/src/lib/core/url-context.ts","../../../projects/ngx-url-modal/src/lib/ngx-url-modal.module.ts","../../../projects/ngx-url-modal/src/lib/providers/mat-dialog-provider.ts","../../../projects/ngx-url-modal/src/public-api.ts","../../../projects/ngx-url-modal/src/ngx-url-modal.ts"],"sourcesContent":["import { AnyFunction } from './types/any-function';\r\n\r\nexport const isFunction = <T>(value: AnyFunction | T): value is AnyFunction => value instanceof Function;\r\n","import { ComputeParams } from '../utils/types/compute-params';\r\nimport { DialogConfig } from '../models/dialog-provider';\r\nimport { isFunction } from '../utils/is-function';\r\n\r\n/**\r\n * Represents static context of Url modal\r\n */\r\nexport class StaticContext<\r\n    StaticContextParams,\r\n    ModalContextParams extends object,\r\n    ComputedDialogConfig extends ComputeParams<DialogConfig<StaticContextParams, ModalContextParams>>\r\n    = ComputeParams<DialogConfig<StaticContextParams, ModalContextParams>>,\r\n> {\r\n\r\n    constructor(\r\n        public readonly baseConfig: DialogConfig<StaticContextParams, ModalContextParams>,\r\n    ) { }\r\n\r\n    /**\r\n     * Computes static context from computed url context. As result - full Url Modal cofig\r\n     */\r\n    public computeParams(modalParams: Partial<ModalContextParams>): ComputedDialogConfig {\r\n        const result: Record<string, unknown> = {};\r\n\r\n        const data = { ...this.baseConfig.data, ...modalParams };\r\n        const fullConfig = { ...this.baseConfig, data };\r\n\r\n        for (const [name, value] of Object.entries(fullConfig)) {\r\n            const paramValue = isFunction(value) ? value(data) : value;\r\n            result[name] = paramValue;\r\n        }\r\n        return result as ComputedDialogConfig;\r\n    }\r\n\r\n}\r\n","import { ComputeUrlParams } from '../utils/types/compute-url-params';\r\nimport { DialogConfig, DialogProvider, DialogRef } from '../models/dialog-provider';\r\nimport { StaticContext } from './static-context';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { Type } from '@angular/core';\r\nimport { UrlContext } from './url-context';\r\nimport { UrlModalEvent, UrlModalEventType } from '../models/url-modal-event';\r\nimport { BaseModal } from './base-modal';\r\n\r\n/**\r\n * Representation of modal that can be used with URL query params\r\n * @param Data - type of data that returns from modal\r\n * @param ModalContextParams - data that modal component used for correct work = modal config.\r\n * Extracted from modal component type\r\n * @param UrlContextParams - data that can be write to URL or compute from URL. Part of `ModalContext`\r\n * Extracted from `UrlParamsContext` after calling `addUrlContext`\r\n * @param StaticContextParams - difference between `ModalContext` and `UrlContext`.\r\n * That is parameters that required in modal but not provided from `UrlContext`.\r\n * Extracted after calling `addStaticContext`\r\n *\r\n * ## Examples of usage\r\n * ### Initialization\r\n * **You must to call `addUrlContext` after constructing.**\r\n * 1. Base initialization. You must to call `addUrlContext` after constructing.\r\n * ```ts\r\n * const modal = new UrlModal(Component, dialog).addUrlContext(context)\r\n * ```\r\n * 2. Adding static context\r\n * ```ts\r\n * const modal = new UrlModal(Component, dialog).addUrlContext(context).addStaticContext(staticContext)\r\n * ```\r\n *\r\n * ### Open/Close. Events\r\n * You can open/close modal like default modal with `.open()` `.close()` methods.\r\n * To subscribe to events you should use `.on()` method with callback. Or subsctibe to `events$`\r\n *\r\n * ```ts\r\n *  modal.on('open', onOpen);\r\n *  modal.on('close', onClose);\r\n *\r\n *  modal.open({id: '1'});\r\n *  modal.close(closedValue);\r\n * ```\r\n *\r\n */\r\nexport class UrlModal<\r\n    Data = unknown,\r\n    ModalContextParams extends object = object,\r\n    UrlContextParams extends object = object,\r\n    StaticContextParams = keyof ComputeUrlParams<UrlContextParams> extends\r\n    never ? ModalContextParams : Omit<ModalContextParams, keyof ComputeUrlParams<UrlContextParams>>,\r\n> {\r\n\r\n    private readonly _events$ = new Subject<UrlModalEvent<Data>>();\r\n\r\n\r\n    /**\r\n     * All events from modal\r\n     */\r\n    public readonly events$ = this._events$.asObservable();\r\n\r\n    private ref: DialogRef<Data> | undefined = undefined;\r\n\r\n    private _closeSub: Subscription | undefined = undefined;\r\n\r\n    public urlContext?: UrlContext<UrlContextParams>;\r\n\r\n    private staticContext?: StaticContext<StaticContextParams, ModalContextParams>;\r\n\r\n    private readonly handlers: Record<UrlModalEventType, Array<(data?: Data) => void>> = {\r\n        open: [],\r\n        close: [],\r\n    };\r\n\r\n    public get isOpened() {\r\n        return Boolean(this.ref);\r\n    }\r\n\r\n\r\n    constructor(\r\n        private readonly component: Type<BaseModal<ModalContextParams>>,\r\n        private readonly dialog: DialogProvider,\r\n    ) {\r\n\r\n    }\r\n\r\n    /**\r\n     * Add url context to modal. Must be called after consturctor call\r\n     * @returns this\r\n     */\r\n    public addUrlContext<\r\n        Context extends object,\r\n        CompContext extends Partial<ModalContextParams>,\r\n    >(\r\n        context: UrlContext<Context, CompContext>,\r\n    ): UrlModal<Data, ModalContextParams, Context> {\r\n        this.urlContext = context as unknown as UrlContext<UrlContextParams>;\r\n        return this as UrlModal<Data, ModalContextParams, Context>;\r\n    }\r\n\r\n    /**\r\n     * Add static context (config) to modal. Can't be used without url context\r\n     * @returns this\r\n     */\r\n    public addStaticContext(\r\n        context: DialogConfig<StaticContextParams>\r\n            | Omit<Record<string, (param: ModalContextParams) => unknown>, 'data'>,\r\n    ) {\r\n        this.staticContext = new StaticContext(context);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Open modal with params from url context\r\n     */\r\n    public open(params: Partial<ComputeUrlParams<UrlContextParams>>) {\r\n        if (this.isOpened) {\r\n            return this;\r\n        }\r\n\r\n        this.urlContext?.addParams(params);\r\n\r\n        if (this.urlContext && !this.urlContext.readyToExecute) {\r\n            // TODO: change to snackbar in dev mode\r\n            // eslint-disable-next-line no-console\r\n            console.error(\r\n                `Tries to open modal without all params. Params:\r\n                 ${JSON.stringify(params)}, expected: ${JSON.stringify(this.urlContext.paramsDeclaration)}`,\r\n            );\r\n            return this;\r\n        }\r\n\r\n        const urlData = this.urlContext?.computeParams() ?? {};\r\n        const fullConfig = this.staticContext?.computeParams(urlData) ?? {};\r\n\r\n        this.ref = this.dialog.open(this.component, {\r\n            ...fullConfig,\r\n        });\r\n\r\n        this._closeSub = this.ref.onClose.subscribe((result?: Data) => {\r\n            const event = { type: 'close', data: result } as const;\r\n            this.fireEvent(event);\r\n            this.clear();\r\n        });\r\n\r\n        this.fireEvent({ type: 'open' });\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Closes modal and destroy modal ref\r\n     */\r\n    public close(data?: Data): Data | undefined {\r\n        if (!this.isOpened) {\r\n            return undefined;\r\n        }\r\n\r\n        this.ref?.close(data);\r\n        return data;\r\n    }\r\n\r\n    /**\r\n     * Cleas all modal resources\r\n     */\r\n    public clear() {\r\n        this.ref?.destroy();\r\n        this.ref = undefined;\r\n        this._closeSub?.unsubscribe();\r\n        this._closeSub = undefined;\r\n    }\r\n\r\n    /**\r\n     * Add handler on any modal event\r\n     */\r\n    public on(event: 'close', handler: (data?: Data) => void): this;\r\n    public on(event: 'open', handler: () => void): this;\r\n    public on(event: UrlModalEventType, handler: (data?: Data) => void): this {\r\n        this.handlers[event].push(handler);\r\n        return this;\r\n    }\r\n\r\n    private fireEvent(event: UrlModalEvent<Data>) {\r\n        const handlers = this.handlers[event.type];\r\n        for (const handler of handlers) {\r\n            handler(event.data);\r\n        }\r\n\r\n        this._events$.next(event);\r\n    }\r\n\r\n}\r\n","import { Params } from '@angular/router';\r\nimport { UrlModal } from './url-modal';\r\n\r\n/**\r\n * Class for creating new url params when modals opened or closed\r\n * @readonly\r\n * @param _modalQueryName Query name for opened modals\r\n * @param _modals Map with all registered url modals\r\n */\r\nexport class UrlModalsQueryParser {\r\n\r\n    constructor(\r\n        private readonly _modalQueryName: string,\r\n        private readonly _modals: ReadonlyMap<string, Readonly<UrlModal>>,\r\n    ) { }\r\n\r\n    /**\r\n     * Create params for modal opening\r\n     */\r\n    public createModalOpenParams(currentParams: Params, modalName: string): Params {\r\n        const modal = this._modals.get(modalName);\r\n\r\n        if (!modal) {\r\n            return currentParams;\r\n        }\r\n\r\n        const openedModals = currentParams[this._modalQueryName] as string[] | string | undefined;\r\n        let modalQuery: string[] = [];\r\n\r\n        if (openedModals) {\r\n            if (openedModals.includes(modalName)) {\r\n                return currentParams;\r\n            }\r\n            modalQuery = typeof openedModals === 'string' ? [openedModals] : [...openedModals];\r\n        }\r\n\r\n        modalQuery.push(modalName);\r\n        const queryParams = {\r\n            ...currentParams,\r\n            ...modal.urlContext?.urlParams,\r\n            modal: this.flatQuery(modalQuery),\r\n        };\r\n        return queryParams;\r\n    }\r\n\r\n    /**\r\n     * Create params for modal closing\r\n     */\r\n    public createModalCloseParams(currentParams: Params, modalName: string): Params {\r\n        const modalsQuery = currentParams[this._modalQueryName] as string[] | string | undefined;\r\n        const newModals: string[] = [];\r\n\r\n        if (!modalsQuery?.includes(modalName)) {\r\n            return currentParams;\r\n        }\r\n\r\n        if (typeof modalsQuery !== 'string') {\r\n            newModals.push(...modalsQuery.filter(name => name !== modalName));\r\n        }\r\n\r\n        const queryParams = { ...currentParams } as Params;\r\n        queryParams[this._modalQueryName] = this.flatQuery(newModals);\r\n\r\n        return this.removeModalParamFromParams(queryParams, modalName);\r\n    }\r\n\r\n    private removeModalParamFromParams(queryParams: Params, modalName: string) {\r\n        const modal = this._modals.get(modalName);\r\n\r\n        if (!modal) {\r\n            return queryParams;\r\n        }\r\n\r\n        const params = { ...queryParams };\r\n        for (const paramKey of Object.keys(modal.urlContext?.urlParams ?? {})) {\r\n            const required = this.isParamRequiredInOtherModals(modalName, paramKey);\r\n\r\n            if (!required && paramKey in queryParams) {\r\n                params[paramKey] = undefined;\r\n            }\r\n        }\r\n\r\n        return params;\r\n    }\r\n\r\n    /**\r\n     * If length = 0, returns undefined;\r\n     * If length = 1, returns first element;\r\n     * Returns array otherwise;\r\n     */\r\n    private flatQuery(modals: string[]): string[] | string | undefined {\r\n        if (modals.length === 0) {\r\n            return undefined;\r\n        }\r\n\r\n        return modals.length === 1 ? modals[0] : modals;\r\n    }\r\n\r\n    private isParamRequiredInOtherModals(skipModalName: string, paramName: string) {\r\n        const otherModals = Array.from(this._modals.entries())\r\n            .filter(([name]) => name !== skipModalName)\r\n            .map(([, modal]) => modal);\r\n\r\n        return otherModals.some(modal => modal.isOpened\r\n            && modal.urlContext\r\n            && paramName in modal.urlContext.urlParams);\r\n    }\r\n\r\n}\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { DialogProvider } from \"./models/dialog-provider\";\r\nimport { BaseModal, UrlContext, UrlModalService } from \"../public-api\";\r\n\r\nexport const DIALOG_PROVIDER_TOKEN = new InjectionToken<DialogProvider>('Dialog provider token');\r\n","import { ActivatedRoute, NavigationExtras, Router } from '@angular/router';\r\nimport { filter, firstValueFrom, Subscription } from 'rxjs';\r\nimport { Inject, Injectable, OnDestroy, Type } from '@angular/core';\r\nimport { UrlModal } from '../core/url-modal';\r\nimport { UrlModalEventType } from '../models/url-modal-event';\r\nimport { UrlModalsQueryParser } from '../core/url-modal-query-parser';\r\nimport { BaseModal } from '../core/base-modal';\r\nimport { DialogProvider } from '../models/dialog-provider';\r\nimport { DIALOG_PROVIDER_TOKEN } from '../dialog-provider-token';\r\n\r\ninterface NavigationTask<T = unknown> {\r\n    type: 'close' | 'open';\r\n    modal: UrlModal;\r\n    taskParams: Promise<NavigationExtras | undefined>;\r\n    taskPromise: Promise<UrlModal<T>>;\r\n    resolveTask(modal: UrlModal): void;\r\n}\r\n\r\n/**\r\n * Service for controling URL modals.\r\n * Allows:\r\n * 1. Register Url modals and page, that modals bind to.\r\n * 2. Open and close Url modals\r\n * 3. Subscribe to modals events\r\n *\r\n * ## Usage\r\n * 1. You should provide service to any component. Providing exactly to component very important\r\n * because service has resources that should be cleared after page disposed. Or you can control it manually\r\n * calling `clear()` method\r\n * 2. Create you modal component. It must be extended from `BaseModal<T>`, where T - is data, that will be\r\n * injected to component via config.\r\n * 3. Register your modal by name and component.\r\n * 4. Configure your modal by context. @see UrlModal `addStaticContext` `addUrlContext`\r\n * 5. Register page after registration of all modals by `ActivatedRoute`\r\n * 6. Enjoy!\r\n *\r\n * ```ts\r\n * @Component(\r\n *     providers: [UrlModalService]\r\n * )\r\n * class MyPage implements OnInit {\r\n *\r\n *    constructor(\r\n *        private modals: UrlModalService,\r\n *        private route: ActivatedRoute,\r\n *    ) {}\r\n *\r\n *    public ngOnInit() {\r\n *        const staticContext = {};\r\n *        const urlContext = new UrlParamsContext().declareParam('id');\r\n *        this.modals.registerModal('modal', MyModal)\r\n *            .addUrlContext(urlContext)\r\n *            .addStaticContext(staticContext);\r\n *\r\n *        this.modals.registerPage(this.route);\r\n *    }\r\n *\r\n * }\r\n *\r\n * ```\r\n * ## Order of executing\r\n * All manual open/close events executs in order of there calling. E.g.\r\n * ```ts\r\n * service.open('modal1');\r\n * service.open('modal2');\r\n * service.close('modal2');\r\n * service.close('modal1');\r\n * ```\r\n *\r\n * Execution order - modal1 opens, modal2 opens, modal2 closes, modal1 closes.\r\n */\r\n@Injectable()\r\nexport class UrlModalService implements OnDestroy {\r\n\r\n    private _pageRoute: ActivatedRoute | undefined;\r\n\r\n    private readonly _modals = new Map<string, UrlModal>();\r\n\r\n    private readonly _modalQueryName = 'modal';\r\n\r\n    private readonly _queryParser = new UrlModalsQueryParser(\r\n        this._modalQueryName,\r\n        this._modals,\r\n    );\r\n\r\n    private readonly _navigationTasks: NavigationTask[] = [];\r\n\r\n    private _taskInterval: number | undefined;\r\n\r\n    private _executingTask: Promise<boolean> | undefined;\r\n\r\n    private readonly _noPageRouteText = 'Provide page by `registerPage` method before calling any modal`s actions';\r\n\r\n    private _queryParamsSub: Subscription | undefined;\r\n\r\n    constructor(\r\n        @Inject(DIALOG_PROVIDER_TOKEN)\r\n        private readonly _dialog: DialogProvider,\r\n        private readonly _router: Router,\r\n    ) { }\r\n\r\n    /**\r\n     * Page registering. Must be called after modal registration\r\n     * **Note** If this method will be called before modals registration,\r\n     * there are no guarantee that modal opens by url after initiation\r\n     * @returns this\r\n     */\r\n    public registerPage(route: ActivatedRoute) {\r\n        this._pageRoute = route;\r\n\r\n        this._queryParamsSub = route.queryParams.subscribe(query => {\r\n            const modalsNames = query[this._modalQueryName] as string[] | string | undefined;\r\n            if (!modalsNames) {\r\n                return;\r\n            }\r\n\r\n            for (const [name, modal] of this._modals.entries()) {\r\n                if (modalsNames.includes(name)) {\r\n                    modal.open(query);\r\n                } else if (modal.isOpened) {\r\n                    modal.close();\r\n                }\r\n            }\r\n        });\r\n\r\n        this._taskInterval = setInterval(() => this.processTask(), 1) as unknown as number;\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Modal registering. Create new `UrlModal` and store it in service.\r\n     * @returns new UrlModal that should be configured\r\n     */\r\n    public registerModal<\r\n        ReturnData extends object,\r\n        ConfigType extends object = object,\r\n    >(\r\n        modalName: string,\r\n        component: Type<BaseModal<ConfigType>>,\r\n    ) {\r\n        if (this._modals.has(modalName)) {\r\n            throw new Error('Don`t register modal with same name twice');\r\n        }\r\n\r\n        const modal = new UrlModal<ReturnData, ConfigType>(component, this._dialog);\r\n        this._modals.set(modalName, modal as UrlModal);\r\n\r\n        modal.on('open', () => {\r\n            this.createNavigationTask('open', modalName, modal as UrlModal);\r\n        });\r\n\r\n        modal.on('close', () => {\r\n            this.createNavigationTask('close', modalName, modal as UrlModal);\r\n        });\r\n\r\n        return modal;\r\n    }\r\n\r\n    /**\r\n     * Manual open modal with params\r\n     */\r\n    public open<T extends Record<string, string | undefined>>(modalName: string, params: T) {\r\n        if (!this._pageRoute) {\r\n            throw new Error(this._noPageRouteText);\r\n        }\r\n\r\n        const modal = this._modals.get(modalName);\r\n        if (!modal) {\r\n            return undefined;\r\n        }\r\n\r\n        modal.open(params);\r\n        const task = this.createNavigationTask('open', modalName, modal);\r\n\r\n        return task.taskPromise;\r\n    }\r\n\r\n    /**\r\n     * Manual close modal with data\r\n     */\r\n    public close<Data>(modalName: string, data?: Data): Promise<UrlModal<Data>> | undefined {\r\n        if (!this._pageRoute) {\r\n            throw new Error(this._noPageRouteText);\r\n        }\r\n\r\n        const modal = this._modals.get(modalName) as UrlModal<Data>;\r\n        if (!Boolean(modal)) {\r\n            return undefined;\r\n        }\r\n\r\n        modal.close(data);\r\n        const task = this.createNavigationTask('close', modalName, modal);\r\n\r\n        return task.taskPromise;\r\n    }\r\n\r\n    /**\r\n     * Subscribe to any modal event\r\n     * @returns Observable with modal events\r\n     */\r\n    public on<Data>(modalName: string, event: UrlModalEventType) {\r\n        const modal = this._modals.get(modalName) as UrlModal<Data>;\r\n        if (!Boolean(modal)) {\r\n            return undefined;\r\n        }\r\n\r\n        return modal.events$.pipe(\r\n            filter(({ type }) => type === event),\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Clears all resources\r\n     */\r\n    public clear() {\r\n        for (const modal of this._modals.values()) {\r\n            modal.clear();\r\n        }\r\n        clearInterval(this._taskInterval);\r\n        this._modals.clear();\r\n        this._queryParamsSub?.unsubscribe();\r\n    }\r\n\r\n    public ngOnDestroy() {\r\n        this.clear();\r\n    }\r\n\r\n    private async createOpenParams(modalName: string): Promise<NavigationExtras> {\r\n        if (!this._pageRoute) {\r\n            throw new Error(this._noPageRouteText);\r\n        }\r\n\r\n        const currentParams = await firstValueFrom(this._pageRoute.queryParams);\r\n\r\n        const queryParams = this._queryParser.createModalOpenParams(currentParams, modalName);\r\n\r\n        return { queryParams };\r\n    }\r\n\r\n    private async createCloseParams(modalName: string): Promise<NavigationExtras> {\r\n        if (!this._pageRoute) {\r\n            throw new Error(this._noPageRouteText);\r\n        }\r\n\r\n        const currentParams = await firstValueFrom(this._pageRoute.queryParams);\r\n\r\n        const queryParams = this._queryParser.createModalCloseParams(currentParams, modalName);\r\n\r\n        return { queryParams };\r\n    }\r\n\r\n    private async processTask() {\r\n        if (this._executingTask || this._navigationTasks.length === 0) {\r\n            return;\r\n        }\r\n\r\n        const task = this._navigationTasks.shift();\r\n\r\n        if (!task) {\r\n            return;\r\n        }\r\n\r\n        const params = await task.taskParams;\r\n\r\n        if (params) {\r\n            this._executingTask = this._router.navigate([], params);\r\n            await this._executingTask;\r\n            this._executingTask = undefined;\r\n            task.resolveTask(task.modal);\r\n        }\r\n    }\r\n\r\n    private createNavigationTask<T>(type: 'close' | 'open', modalName: string, modal: UrlModal<T>): NavigationTask<T> {\r\n        const taskParams = type === 'close' ? this.createCloseParams(modalName) : this.createOpenParams(modalName);\r\n\r\n        let resolveTask: (modal: UrlModal) => void = () => { };\r\n        const taskPromise = new Promise<UrlModal>(resolve => {\r\n            resolveTask = resolve;\r\n        });\r\n\r\n        const task = {\r\n            type,\r\n            taskParams,\r\n            modal,\r\n            taskPromise,\r\n            resolveTask,\r\n        } as NavigationTask<T>;\r\n\r\n        this._navigationTasks.push(task as NavigationTask);\r\n\r\n        return task;\r\n\r\n    }\r\n\r\n}\r\n","import { DialogConfig } from '../models/dialog-provider';\r\n\r\n/**\r\n * BaseModal implements some helpful methods\r\n */\r\nexport abstract class BaseModal<ConfigType> {\r\n\r\n        constructor(\r\n            public readonly configData?: ConfigType\r\n        ) {}\r\n\r\n}\r\n","import { AnyFunction } from '../utils/types/any-function';\r\nimport { ComputeUrlParams } from '../utils/types/compute-url-params';\r\nimport { isFunction } from '../utils/is-function';\r\nimport { TakeByType } from '../utils/types/take-by-type';\r\nimport { UrlParamDeclaration } from '../models/url-params-declaration';\r\n\r\ntype DefaultDeclaration = Record<string, AnyFunction | UrlParamDeclaration>;\r\n\r\n/**\r\n * Class for providing parametres declarations. Used for declaring and handling URL query params\r\n *\r\n * Can declare two types of parametres: `default` and `computed`.\r\n * 1. `Default` parameters is string only. It can be optional or not.\r\n * 2. `Computed` parameters can be created by function depends on `default` parameters or another `computed` parameters.\r\n */\r\nexport class UrlContext<\r\n    ParamsDeclaration extends object,\r\n    ComputedParams = ComputeUrlParams<ParamsDeclaration>,\r\n> {\r\n\r\n    /**\r\n     * All required (not optional in declaration) parameters are filled.\r\n     */\r\n    public get readyToExecute() {\r\n        const declarations = this.paramsDeclaration as DefaultDeclaration;\r\n        const allRequiredParamsExists = Object.entries(declarations).every(([name, declaration]) => {\r\n            if (isFunction(declaration)) {\r\n                return true;\r\n            }\r\n\r\n            const existsInParams = name in this._params;\r\n            return declaration.optional || existsInParams;\r\n        });\r\n\r\n        return allRequiredParamsExists;\r\n    }\r\n\r\n    /**\r\n     * Params that can be write in URl.\r\n     */\r\n    public get urlParams(): Partial<ComputedParams> {\r\n        const filteredParams = Object.entries(this._params)\r\n            .filter(([, value]) => typeof value === 'string');\r\n        return Object.fromEntries(filteredParams) as Partial<ComputedParams>;\r\n    }\r\n\r\n    private _params: Partial<ComputedParams> = {};\r\n\r\n    constructor(\r\n        public readonly paramsDeclaration: ParamsDeclaration = {} as ParamsDeclaration,\r\n    ) { }\r\n\r\n    /**\r\n     * Set value to `default` parameter by name. Skip if parameter with provided name wasn't previously declared\r\n     */\r\n    public addParam<\r\n        ParamName extends TakeByType<ComputedParams, string>,\r\n        Value extends ComputedParams[ParamName],\r\n    >(\r\n        paramName: ParamName,\r\n        value: Value,\r\n    ) {\r\n        if (!(paramName in this.paramsDeclaration)) {\r\n            return this;\r\n        }\r\n\r\n        const params: Partial<ComputedParams> = {};\r\n        params[paramName] = value;\r\n        this._params = { ...this._params, ...params };\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Set values to `default` parameters by names. Skip if parameter with provided name wasn't previously declared\r\n     */\r\n    public addParams(params: Partial<ComputedParams>) {\r\n        for (const [name, param] of Object.entries(params)) {\r\n            if (name in this.paramsDeclaration) {\r\n                const computedParamName = name as keyof ComputedParams;\r\n                this._params[computedParamName] = param as ComputedParams[keyof ComputedParams];\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Executed all computed params functions. Store calls results.\r\n     */\r\n    public computeParams(): ComputedParams | undefined {\r\n        if (!this.readyToExecute) {\r\n            return undefined;\r\n        }\r\n\r\n        const params = { ...this._params };\r\n        const declaration = this.paramsDeclaration as DefaultDeclaration;\r\n\r\n        for (const paramName of Object.keys(declaration)) {\r\n            const selectFunc = declaration[paramName];\r\n            if (!isFunction(selectFunc)) {\r\n                continue;\r\n            }\r\n\r\n            const selectedValue = selectFunc(params);\r\n            (params as Record<string, unknown>)[paramName] = selectedValue;\r\n        }\r\n\r\n        return params as ComputedParams;\r\n    }\r\n\r\n    /**\r\n     * Declare default parameter\r\n     * @returns\r\n     * **WARN** returns new `UrlParamsContext` and not modify current\r\n     */\r\n    public declareParam<ParamName extends string>(param: ParamName, optional = true) {\r\n        const newDeclaration = { [param]: { optional } } as Record<ParamName, UrlParamDeclaration>;\r\n        const declaration = Object.assign(newDeclaration, this.paramsDeclaration);\r\n        return new UrlContext(declaration);\r\n    }\r\n\r\n    /**\r\n     * Declare computed parameter\r\n     * @param param Parameter name\r\n     * @param selectFunction function that will be executed after `computeParams` calling.\r\n     * @returns\r\n     * **WARN** returns new `UrlParamsContext` and not modify current\r\n     */\r\n    public declareComputedParam<\r\n        ParamName extends string,\r\n        ParamType,\r\n    >(\r\n        param: ParamName,\r\n        selectFunction: (params: ComputedParams) => ParamType,\r\n    ) {\r\n        const newDeclaration = { [param]: selectFunction } as Record<ParamName, typeof selectFunction>;\r\n        const declaration = Object.assign(newDeclaration, this.paramsDeclaration);\r\n        return new UrlContext(declaration);\r\n    }\r\n\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { DIALOG_PROVIDER_TOKEN } from \"./dialog-provider-token\";\r\nimport { MatDialogProvider } from \"../public-api\";\r\nimport { Dialog } from \"@angular/cdk/dialog\";\r\n\r\n@NgModule({\r\n    providers: [{ provide: DIALOG_PROVIDER_TOKEN, deps: [Dialog], useFactory: (dialog: Dialog) => new MatDialogProvider(dialog) }]\r\n})\r\nexport class NgxUrlModalModule {\r\n\r\n}\r\n","import { Injectable, Type } from \"@angular/core\";\r\nimport { DialogConfig, DialogProvider, DialogRef } from \"../models/dialog-provider\";\r\nimport { BaseModal } from \"../core/base-modal\";\r\nimport { Dialog, DialogRef as MatDialogRef } from \"@angular/cdk/dialog\";\r\n\r\n@Injectable()\r\nexport class MatDialogProvider implements DialogProvider {\r\n\r\n    constructor(\r\n        private readonly dialog: Dialog,\r\n    ) {\r\n    }\r\n\r\n    public open<\r\n        Data,\r\n        Config extends DialogConfig<Data>,\r\n        Component extends BaseModal<Data>,\r\n        ReturnData\r\n    >(component: Type<Component>, config: Config): DialogRef<ReturnData> {\r\n        const ref = this.dialog.open<ReturnData, Data, Component>(component, config);\r\n        return new MatDialogRefProvider(ref);\r\n    }\r\n\r\n}\r\n\r\nclass MatDialogRefProvider<T, Component> implements DialogRef<T> {\r\n\r\n    onClose = this.ref.closed;\r\n\r\n    constructor(\r\n        private readonly ref: MatDialogRef<T, Component>\r\n    ) { }\r\n\r\n    public close(data?: T | undefined): void {\r\n        this.ref.close(data);\r\n    }\r\n\r\n    public destroy(): void {\r\n    }\r\n\r\n}\r\n","/*\r\n * Public API Surface of ngx-url-modal\r\n */\r\n\r\nexport * from './lib/services/url-modal.service';\r\nexport * from './lib/core/base-modal';\r\nexport * from './lib/core/url-context';\r\nexport * from './lib/ngx-url-modal.module';\r\nexport * from './lib/providers/mat-dialog-provider';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}