{"version":3,"file":"qoollo-ngx-form-url-saver.mjs","sources":["../../../projects/form-url-saver-lib/src/lib/query-generation-strategies/separated-query-generation-strategy.ts","../../../projects/form-url-saver-lib/src/lib/query-generation-strategies/united-query-generation-strategy.ts","../../../projects/form-url-saver-lib/src/lib/form-value-handling-strategies/default-value-handling-strategy.ts","../../../projects/form-url-saver-lib/src/lib/form-value-handling-strategies/token.ts","../../../projects/form-url-saver-lib/src/lib/utils/is-date.ts","../../../projects/form-url-saver-lib/src/lib/query-generation-strategies/separated-complex-query-generation-strategy.ts","../../../projects/form-url-saver-lib/src/lib/form-url-saver.directive.ts","../../../projects/form-url-saver-lib/src/public-api.ts","../../../projects/form-url-saver-lib/src/qoollo-ngx-form-url-saver.ts"],"sourcesContent":["import { Params } from '@angular/router';\nimport { QueryGenerationStrategy } from './query-generation-strategy.interface';\nimport { ValueHandlingStrategy } from '../form-value-handling-strategies/value-handling-strategy.interface';\n\n\nexport class SeparatedQueryGenerationStrategy implements QueryGenerationStrategy {\n\n    public constructor(\n        private readonly formHandlingStrategy: ValueHandlingStrategy,\n    ) {}\n\n    public inferFormValueFromQuery(queryParams: Params, formValue: Record<string, unknown>): object {\n        const queryObject: Record<string, unknown> = {};\n\n        for (const key of Object.keys(formValue)) {\n            queryObject[key] = this.formHandlingStrategy.parse(queryParams[key], key);\n        }\n\n        return queryObject;\n    }\n\n\n    public convertFormValueToQueryObject(formValue: Record<string, unknown>): object {\n        const queryObject: Record<string, unknown> = {};\n\n        for (const key of Object.keys(formValue)) {\n            queryObject[key] = this.formHandlingStrategy.stringify(formValue[key], key);\n        }\n\n        return queryObject;\n    }\n\n    public createClearingObject(formValue: object): object {\n        const filtersObject: Record<string, null> = {};\n\n        for (const key of Object.keys(formValue)) {\n            filtersObject[key] = null;\n        }\n\n        return filtersObject;\n    }\n\n}\n","import { Params } from '@angular/router';\nimport { QueryGenerationStrategy } from './query-generation-strategy.interface';\nimport { ValueHandlingStrategy } from '../form-value-handling-strategies/value-handling-strategy.interface';\n\n\nexport class UnitedQueryGenerationStrategy implements QueryGenerationStrategy {\n\n\n    public constructor(\n        private readonly formHandlingStrategy: ValueHandlingStrategy,\n        private readonly queryKey: string,\n    ) {}\n\n    public inferFormValueFromQuery(queryParams: Params): object {\n        const query = queryParams[this.queryKey] as string;\n\n        if (!query) {\n            return {};\n        }\n\n        const formValue = this.formHandlingStrategy.parse(query);\n\n        return formValue as object;\n    }\n\n\n    public convertFormValueToQueryObject(formValue: Record<string, unknown>): object {\n        const serializedObject = this.formHandlingStrategy.stringify(formValue);\n\n        return {\n            [this.queryKey]: serializedObject,\n        };\n    }\n\n    public createClearingObject(): object {\n        return {\n            [this.queryKey]: null,\n        };\n    }\n\n}\n","import { ValueHandlingStrategy } from './value-handling-strategy.interface';\n\nexport class DefaultFormHandlingStrategy implements ValueHandlingStrategy{\n\n    public stringify(value: unknown) {\n        return JSON.stringify(value);\n    }\n\n    public parse(value?: string) {\n        if (!value) {\n            return undefined;\n        }\n\n        return JSON.parse(value);\n    }\n}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { DefaultFormHandlingStrategy } from './default-value-handling-strategy';\nimport { ValueHandlingStrategy } from './value-handling-strategy.interface';\n\nexport const FORM_VALUE_HANDLING_TOKEN = new InjectionToken<() => ValueHandlingStrategy>('ngx-form-url-saver')\n\nexport const NGX_FORM_URL_SAVER_STRATEGY_PROVIDER: Provider = {\n    provide: FORM_VALUE_HANDLING_TOKEN,\n    useFactory: () => new DefaultFormHandlingStrategy(),\n}\n","/**\n * Checks if the given value is a valid Date object.\n *\n * @param value - The value to check.\n * @returns True if the value is a Date object and represents a valid date, false otherwise.\n *\n * @example\n * ```typescript\n * isDate(new Date()); // true\n * isDate(\"2025-03-12\"); // false\n * isDate(new Date(\"invalid date\")); // false\n * ```\n */\nexport function isDate(value: unknown): value is Date {\n    return value instanceof Date && !isNaN(value.getTime());\n}\n","import { Params } from '@angular/router';\nimport { QueryGenerationStrategy } from './query-generation-strategy.interface';\nimport { DateTime } from 'luxon';\nimport { isDate } from '../utils/is-date';\n\nexport class SeparatedComplexQueryGenerationStrategy implements QueryGenerationStrategy {\n\n    private readonly COMPLEX_OBJECT_PREFIX = 'complex-';\n\n    public constructor(\n        private readonly useDateTime: boolean,\n    ) {}\n\n    public inferFormValueFromQuery(queryParams: Params, formValue: Record<string, unknown>): object {\n        const simpleQuery = this.readAllSimpleQuery(queryParams, formValue);\n\n        const complexQuery = this.readAllComplexQuery(queryParams);\n\n        return { ...simpleQuery, ...complexQuery };\n    }\n\n\n    public convertFormValueToQueryObject(formValue: Record<string, unknown>): object {\n        const queryObject: Record<string, unknown> = {};\n\n        for (const key of Object.keys(formValue)) {\n            if (this.isObject(formValue[key]) && !DateTime.isDateTime(formValue[key])) {\n                queryObject[this.createComplexKey(key)] = JSON.stringify(formValue[key]);\n            } else {\n                queryObject[key] = this.prepareValue(formValue[key]);\n            }\n        }\n\n        return queryObject;\n    }\n\n    public createClearingObject(formValue: Record<string, undefined>): object {\n        const filtersObject: Record<string, null> = {};\n\n        for (const key of Object.keys(formValue)) {\n            if (this.isObject(formValue[key])) {\n                filtersObject[this.createComplexKey(key)] = null;\n            } else {\n                filtersObject[key] = null;\n            }\n        }\n\n        return filtersObject;\n    }\n\n    private prepareValue(value: unknown) {\n        if (isDate(value) || DateTime.isDateTime(value)) {\n            return value.toJSON();\n        }\n\n        return value;\n    }\n\n    private readAllSimpleQuery(queryParams: Params, form: Record<string, unknown>) {\n        const simpleQueryObject: Record<string, unknown> = {};\n\n        for (const key of Object.keys(form)) {\n            const value: unknown = this.getNewValueByQueryKey(queryParams, key, form);\n            if (this.useDateTime && typeof value === 'string') {\n                const dateTimeValue = DateTime.fromISO(value);\n                simpleQueryObject[key] = dateTimeValue.isValid ? dateTimeValue : value;\n            } else {\n                simpleQueryObject[key] = value;\n            }\n        }\n\n        return simpleQueryObject;\n    }\n\n    public getNewValueByQueryKey(queryParams: Params, key: string, form: Record<string, unknown>) {\n        const queryParamValue: unknown = ['true', 'false'].includes(queryParams[key])\n            ? JSON.parse(queryParams[key])\n            : queryParams[key];\n\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        const currentValue: unknown = form[key];\n\n        if (queryParamValue === undefined || queryParamValue === null) {\n            return currentValue;\n        }\n\n        const queryValueMustBeConvertedToArray = Array.isArray(currentValue) && !Array.isArray(queryParamValue);\n\n        return queryValueMustBeConvertedToArray\n            ? [queryParamValue]\n            : queryParamValue;\n    }\n\n    private readAllComplexQuery(queryParams: Params) {\n        const complexQueryKeys = Object.keys(queryParams)\n            .filter(paramName => this.checkIfKeyIsComplex(paramName));\n\n        if (!complexQueryKeys.length) {\n            return {};\n        }\n\n        const newFormValue: Record<string, unknown> = {};\n\n        for (const complexKey of complexQueryKeys) {\n            const originKey = this.getOriginKey(complexKey);\n\n            try {\n                newFormValue[originKey] = JSON.parse(queryParams[complexKey]);\n            } catch (error: unknown) {}\n        }\n\n        return newFormValue;\n    }\n\n    // #region Working with complex keys for nested objects\n\n    private createComplexKey(objectKey: string) {\n        return this.COMPLEX_OBJECT_PREFIX + objectKey;\n    }\n\n    private getOriginKey(complexKey: string) {\n        return complexKey.replace(this.COMPLEX_OBJECT_PREFIX, '');\n    }\n\n    private checkIfKeyIsComplex(key: string) {\n        return key.includes(this.COMPLEX_OBJECT_PREFIX);\n    }\n\n    // #endregion\n\n    /**\n     * Checks whether the passed value is an object.\n     * Returns `false` for `date` or `array`.\n     *\n     * `Object.prototype.toString.call(new Date()) = [object Date]`\n     * `Object.prototype.toString.call(new Array()) = [object Array]`\n     */\n    private isObject(value: unknown): value is object {\n        return Object.prototype.toString.call(value) === '[object Object]';\n    }\n}\n","import { SeparatedQueryGenerationStrategy } from './query-generation-strategies/separated-query-generation-strategy';\nimport { UnitedQueryGenerationStrategy } from './query-generation-strategies/united-query-generation-strategy';\nimport { QueryGenerationStrategy } from './query-generation-strategies/query-generation-strategy.interface';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AfterViewInit, ChangeDetectorRef, Directive, forwardRef, Inject, Input, OnDestroy, Optional, Self } from '@angular/core';\nimport {\n    AsyncValidator,\n    AsyncValidatorFn,\n    ControlContainer,\n    FormGroupDirective,\n    NG_ASYNC_VALIDATORS,\n    NG_VALIDATORS,\n    UntypedFormGroup,\n    Validator,\n    ValidatorFn,\n} from '@angular/forms';\nimport { debounceTime, map, startWith, Subscription } from 'rxjs';\nimport { FORM_VALUE_HANDLING_TOKEN, NGX_FORM_URL_SAVER_STRATEGY_PROVIDER } from './form-value-handling-strategies/token';\nimport { ValueHandlingStrategy } from './form-value-handling-strategies/value-handling-strategy.interface';\nimport { SeparatedComplexQueryGenerationStrategy } from './query-generation-strategies/separated-complex-query-generation-strategy';\n\nconst formDirectiveProvider = {\n    provide: ControlContainer,\n    useExisting: forwardRef(() => FormUrlSaverDirective),\n};\n\n/**\n * @description\n * The directive is a descendant of Angular `FormGroupDirective`\n * and is used to automatically write the `FormGroup` value to the query parameters.\n *\n * {@link https://github.com/angular/angular/blob/main/packages/forms/src/directives/reactive_directives/form_group_directive.ts Angular FormGroupDirective}\n *\n * Allows you to set a delay (_debounce_) for query updates.\n *\n * Allows you to select the method (_strategy_) of writing query parameters.\n * 'united' - the form value will be completely written in one parameter\n * 'separated' - each form field will be written in its own query parameter.\n * 'complex' - each form field will be written in its own query parameter, while saving nested objects in the form is supported.\n *\n * It is possible to override the behavior of converting the form value to a string.\n * Default is JSON.stringify.\n * Use the ValueHandlingStrategy interface and FORM_VALUE_HANDLING_TOKEN\n *\n */\n@Directive({\n    selector: '[ngxFormUrlSaver]',\n    providers: [formDirectiveProvider, NGX_FORM_URL_SAVER_STRATEGY_PROVIDER],\n    standalone: true,\n})\nexport class FormUrlSaverDirective extends FormGroupDirective implements AfterViewInit, OnDestroy {\n\n    private readonly BASE_DEBOUNCE_TIME = 500;\n\n    @Input('ngxFormUrlSaver')\n    public override form: UntypedFormGroup = null!;\n\n    /**\n     * Query parameter update delay time\n     */\n    @Input()\n    public debounceTime = this.BASE_DEBOUNCE_TIME;\n\n    /**\n     * Strategy for creating query parameters.\n     *\n     * If 'united' is specified, the form value will be completely written using the key of one query parameter\n     *\n     * If 'separated' is specified, each form field will be written with a separate key corresponding to its name in the form\n     *\n     * If 'complex' is specified, each form field will be written in its own query parameter, while saving nested objects in the form is supported.\n     */\n    @Input()\n    public strategy: 'united' | 'separated' | 'complex' = 'complex';\n\n    /**\n     * The key by which the form value will be written if the 'united' strategy is selected.\n     */\n    @Input()\n    public queryKey = 'form';\n\n    @Input()\n    public useDateTime = false;\n\n    /**\n     * Map consisting of a path to an object in a form and a function that converts a value from an any data to another data structure.\n     * Data transform function called after `query strategy` parsed url in `ngAfterViewInit` lifecycle hook and updated parsed object\n     * then patch form with updated object\n     *\n     * ### Example:\n     * ```typescript\n     * form = new FormGroup({\n     *  date: new FormControl<string | null>(null),\n     * });\n     * // After url parsed by strategy and return object dataTransformMap will apply.\n     * dataTransformMap = new Map([\n     * // Apply to parsed object and transform value (apply data transform function) by path 'date'\n     *  ['date', (data: string) => data ? new Date(data) : data]\n     * ])\n     * // date will parsed by strategy as string\n     * urlQuery = '/?form={\"date\":\"2024-10-29T21:00:00.000Z\"}'\n     * ```\n     * ```html\n     * <form [ngxFormUrlSaver]=\"form\">\n     *  <!-- primeNg calendar -->\n     *  <p-calendar formControlName=\"date\" dateFormat=\"dd.mm.yy\"/>\n     * </form>\n     * ```\n     *\n     * @type {Map<string, function(any): any>}\n     * @param {string} key - path to form value nested object. Path look like 'path.to.object.key' or 'path' if root\n     * @param {function(any): any} value - converting function from any data to any data structure\n     */\n    @Input()\n    public dataTransformMap?: Map<string, (data: any) => any>;\n\n    private formValueChangedSubscription?: Subscription;\n\n    private queryStrategy!: QueryGenerationStrategy;\n\n    public constructor(\n        private readonly router: Router,\n        private readonly activatedRoute: ActivatedRoute,\n        private readonly cdr: ChangeDetectorRef,\n\n        @Inject(FORM_VALUE_HANDLING_TOKEN)\n        private readonly formHandlingStrategy: ValueHandlingStrategy,\n\n        /**\n         * Default Angular FormGroupDirective dependencies\n         */\n        @Optional() @Self() @Inject(NG_VALIDATORS)\n        private readonly _validators: Array<(Validator | ValidatorFn)>,\n        @Optional() @Self() @Inject(NG_ASYNC_VALIDATORS)\n        private readonly _asyncValidators: Array<(AsyncValidator | AsyncValidatorFn)>,\n    ) {\n        super(_validators, _asyncValidators);\n    }\n\n    // #region Lifecycle methods\n\n    public ngAfterViewInit(): void {\n        this.queryStrategy = this.createQueryGenerationStrategy();\n\n        this.fillFormFromQuery();\n\n        this.subscribeToFormValueChanges();\n\n        this.cdr.detectChanges();\n    }\n\n    public override ngOnDestroy(): void {\n        super.ngOnDestroy();\n\n        this.formValueChangedSubscription?.unsubscribe();\n\n        this.clearFormQuery();\n    }\n\n    // #endregion\n\n    private getUpdatedObjectByPath(object: Record<string, any>, path: string, parser: (data: unknown) => unknown): object {\n        const decomposedPath = path.split('.');\n        const base = decomposedPath[0];\n        let temp\n\n        if (base === undefined || !object) {\n            return { ...object };\n        }\n\n        temp = decomposedPath.length <= 1 ? parser(object[base]) : this.getUpdatedObjectByPath(object[base], decomposedPath.slice(1).join('.'), parser);\n\n        return {\n            ...object,\n            [base]: temp,\n        }\n    }\n\n    private fillFormFromQuery() {\n        const currentQueryParams = this.activatedRoute.snapshot.queryParams;\n        const inferredFormValue = this.queryStrategy.inferFormValueFromQuery(currentQueryParams, this.form.value);\n        let updatedObject = inferredFormValue;\n        this.dataTransformMap?.forEach((parser, path) => {\n            updatedObject = this.getUpdatedObjectByPath(updatedObject, path, parser);\n        });\n        this.form.patchValue(updatedObject);\n        this.subscribeToFormValueChanges();\n    }\n\n    private createQueryGenerationStrategy() {\n        const strategies = {\n            'united': new UnitedQueryGenerationStrategy(this.formHandlingStrategy, this.queryKey),\n            'separated': new SeparatedQueryGenerationStrategy(this.formHandlingStrategy),\n            'complex': new SeparatedComplexQueryGenerationStrategy(this.useDateTime)\n        }\n\n        return strategies[this.strategy];\n    }\n\n    private subscribeToFormValueChanges() {\n        this.formValueChangedSubscription = this.form.valueChanges.pipe(\n            startWith(this.form.value),\n            debounceTime(this.debounceTime),\n            map((value, index) => [value, index] as const),\n        ).subscribe(([value, index]) => {\n            void this.router.navigate([], {\n                queryParams: this.queryStrategy.convertFormValueToQueryObject(value),\n                queryParamsHandling: 'merge',\n                replaceUrl: index === 0,\n            });\n        });\n    }\n\n    private clearFormQuery() {\n        setTimeout(() => {\n            void this.router.navigate([], {\n                queryParams: this.queryStrategy.createClearingObject(this.form.value),\n                queryParamsHandling: 'merge',\n                replaceUrl: true,\n            });\n        }, 0);\n    }\n\n}\n","/*\n * Public API Surface of form-url-saver-lib\n */\n\nexport * from './lib/form-url-saver.directive';\n\nexport * from './lib/query-generation-strategies/query-generation-strategy.interface';\n\nexport * from './lib/form-value-handling-strategies/value-handling-strategy.interface';\nexport * from './lib/form-value-handling-strategies/default-value-handling-strategy';\nexport * from './lib/form-value-handling-strategies/token';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}