{"version":3,"file":"marcura-dadesk-ui-form.mjs","sources":["../../src/models/form-tools.ts","../../src/services/form.service.ts","../../src/directives/form-control-focus.directive.ts","../../src/models/abstract-control-wrapper.ts","../../src/models/form.ts","../../src/models/form-array.ts","../../src/models/submittable-form.ts","../../src/validators/username.validator.ts","../../src/form.module.ts","../../src/marcura-dadesk-ui-form.ts"],"sourcesContent":["import {\n  AbstractControl,\n  AsyncValidatorFn,\n  FormArray,\n  FormControl,\n  FormControlStatus,\n  FormGroup,\n  ValidatorFn,\n} from '@angular/forms';\nimport {Rx, warmUp} from '@marcura/dadesk-ui-common';\nimport {Is} from '@marcura/marcura-common';\nimport {Observable} from 'rxjs';\nimport {distinctUntilChanged, map, shareReplay, startWith} from 'rxjs/operators';\n\ntype ControlChangeStateFn<TValue> = (value: TValue) => void;\n\n/**\n * A utility class for working with Angular forms. Provides static methods to handle form control states,\n * values, and validators.\n */\nexport class FormTools {\n  public static isDisabled(status: FormControlStatus): boolean {\n    return status === 'DISABLED';\n  }\n  public static isEnabled(status: FormControlStatus): boolean {\n    return status !== 'DISABLED';\n  }\n  public static isValid(status: FormControlStatus): boolean {\n    return status === 'VALID';\n  }\n  public static isInvalid(status: FormControlStatus): boolean {\n    return status === 'INVALID';\n  }\n  public static isPending(status: FormControlStatus): boolean {\n    return status === 'PENDING';\n  }\n\n  public static getValue$<TValue>(control: FormControl<TValue>): Observable<TValue>;\n  public static getValue$<TValue>(control: AbstractControl<TValue>): Observable<TValue>;\n  public static getValue$<TValue>(control: AbstractControl): Observable<TValue>;\n  public static getValue$<TValue>(control: AbstractControl | AbstractControl<TValue>): Observable<TValue> {\n    return warmUp(\n      (control.valueChanges as Observable<TValue>).pipe(\n        startWith(control.value),\n        distinctUntilChanged(),\n        shareReplay(1)\n      )\n    );\n  }\n\n  public static getIsEmpty$(...controls: FormControl<any>[]): Observable<boolean> {\n    return Rx.allAreTrue(\n      controls.map((control) =>\n        FormTools.getValue$(control).pipe(map((x) => Is.falsy(x) || (Is.array(x) && x.length === 0)))\n      )\n    );\n  }\n\n  public static getStatus$(control: AbstractControl): Observable<FormControlStatus> {\n    return warmUp(control.statusChanges.pipe(startWith(control.status), distinctUntilChanged(), shareReplay(1)));\n  }\n\n  public static getIsDisabled$(control: AbstractControl): Observable<boolean> {\n    return FormTools.getStatus$(control).pipe(map(FormTools.isDisabled));\n  }\n\n  public static getIsEnabled$(control: AbstractControl): Observable<boolean> {\n    return FormTools.getStatus$(control).pipe(map(FormTools.isEnabled));\n  }\n\n  public static getIsInvalid$(control: AbstractControl): Observable<boolean> {\n    return FormTools.getStatus$(control).pipe(map(FormTools.isInvalid));\n  }\n\n  public static getIsValid$(control: AbstractControl): Observable<boolean> {\n    return FormTools.getStatus$(control).pipe(map(FormTools.isValid));\n  }\n\n  public static getIsPending$(control: AbstractControl): Observable<boolean> {\n    return FormTools.getStatus$(control).pipe(map(FormTools.isPending));\n  }\n\n  public static revalidate(control: AbstractControl, emitEvent: boolean = true): void {\n    if (control instanceof FormGroup || control instanceof FormArray) {\n      Object.values(control.controls).forEach((item) => FormTools.revalidate(item, emitEvent));\n    }\n\n    control.markAsTouched();\n    control.updateValueAndValidity({emitEvent});\n\n    if (control.errors) {\n      control.markAsDirty();\n    }\n  }\n\n  public static setValidators(\n    control: AbstractControl,\n    validators: ValidatorFn | (ValidatorFn | null | undefined)[] | null | undefined\n  ): void {\n    control.setValidators(Is.array(validators) ? validators.filter(Is.defined) : validators ?? null);\n    control.updateValueAndValidity();\n  }\n\n  public static setAsyncValidators(\n    control: AbstractControl,\n    validators: AsyncValidatorFn | (AsyncValidatorFn | null | undefined)[] | null | undefined\n  ): void {\n    control.setAsyncValidators(Is.array(validators) ? validators.filter(Is.defined) : validators ?? null);\n    control.updateValueAndValidity();\n  }\n\n  public static setEnabled(control: AbstractControl): ControlChangeStateFn<boolean> {\n    return (value) => {\n      if (value) {\n        if (control.disabled) {\n          control.enable();\n        }\n      } else {\n        if (control.enabled) {\n          control.disable();\n        }\n      }\n    };\n  }\n\n  public static setDisabled(control: AbstractControl): ControlChangeStateFn<boolean> {\n    return (value) => FormTools.setEnabled(control)(!value);\n  }\n\n  public static setTouched(control: AbstractControl): ControlChangeStateFn<boolean> {\n    return (value) => {\n      if (value) {\n        if (control.untouched) {\n          control.markAsTouched();\n        }\n      } else {\n        if (control.touched) {\n          control.markAsUntouched();\n        }\n      }\n    };\n  }\n\n  public static setUntouched(control: AbstractControl): ControlChangeStateFn<boolean> {\n    return (value) => FormTools.setTouched(control)(!value);\n  }\n\n  public static setPristine(control: AbstractControl): ControlChangeStateFn<boolean> {\n    return (value) => {\n      if (value) {\n        if (control.dirty) {\n          control.markAsPristine();\n        }\n      } else {\n        if (control.pristine) {\n          control.markAsDirty();\n        }\n      }\n    };\n  }\n\n  public static setDirty(control: AbstractControl): ControlChangeStateFn<boolean> {\n    return (value) => FormTools.setPristine(control)(!value);\n  }\n}\n","import {Injectable} from '@angular/core';\nimport {AbstractControl, FormGroup} from '@angular/forms';\nimport {firstValueFrom} from '@marcura/dadesk-ui-common';\nimport {Observable, Subject} from 'rxjs';\nimport {distinctUntilChanged, filter} from 'rxjs/operators';\n\nimport {Form} from '../models/form';\nimport {FormTools} from '../models/form-tools';\n\n/**\n * Service to handle form-related operations such as validation and focus management.\n */\n@Injectable()\nexport class FormService {\n  private readonly _focusRequested: Subject<AbstractControl> = new Subject<AbstractControl>();\n  public readonly focusRequested: Observable<AbstractControl> = this._focusRequested;\n\n  public constructor() {}\n\n  /**\n   * Requests to focus on the specified control.\n   */\n  public readonly requestFocus = (control: AbstractControl): void => {\n    this._focusRequested.next(control);\n  };\n\n  /**\n   * Validates the form and returns whether it is valid. If any invalid control found, it automatically scrolls to it.\n   */\n  public async validate<TForm extends Form>(form: TForm, scrollToInvalid: boolean = true): Promise<boolean> {\n    FormTools.revalidate(form.ngControl);\n\n    const isValid: boolean = await this._isValid(form);\n    if (!isValid) {\n      if (scrollToInvalid) {\n        const invalidControl: AbstractControl | null = this.getInvalidControl(form.ngControl);\n        if (invalidControl) {\n          this.requestFocus(invalidControl);\n        }\n      }\n      return false;\n    }\n    return true;\n  }\n\n  public getInvalidControl(formGroup: FormGroup): AbstractControl | null {\n    const names: string[] = Object.keys(formGroup.controls);\n    for (const name of names) {\n      const control: AbstractControl = formGroup.controls[name];\n      if (control instanceof FormGroup) {\n        const invalidChild: AbstractControl | null = this.getInvalidControl(control);\n        if (invalidChild) {\n          return invalidChild;\n        }\n      } else if (control.invalid) {\n        return control;\n      }\n    }\n    return null;\n  }\n\n  private async _isValid(form: Form): Promise<boolean> {\n    let isValid: boolean;\n\n    if (form.ngControl.status === 'PENDING') {\n      await firstValueFrom(\n        form.ngControl.statusChanges.pipe(\n          distinctUntilChanged(),\n          filter((status) => status !== 'PENDING')\n        )\n      );\n    }\n\n    if (form.ngControl.disabled) {\n      form.setEnabled();\n      isValid = form.ngControl.valid;\n      form.setDisabled();\n    } else {\n      isValid = form.ngControl.valid;\n    }\n\n    return isValid;\n  }\n}\n","import {Directive, ElementRef, Input, OnDestroy} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {Observer} from '@marcura/dadesk-ui-common';\nimport {filter} from 'rxjs/operators';\n\nimport {FormService} from '../services/form.service';\n\n@Directive({\n  selector: '[[formControl]]',\n})\n/**\n * Directive to handle focus requests for a form control.\n *\n * This directive listens for focus requests from the `FormService` and focuses the associated form control element\n * when a request is received. It also ensures the form control's value and validity are updated.\n */\nexport class FormControlFocusDirective implements OnDestroy {\n  private readonly _observer: Observer = new Observer();\n\n  @Input()\n  public formControl!: AbstractControl;\n\n  public constructor(private readonly _elementRef: ElementRef, private readonly _formService: FormService) {\n    this._observer.listen(\n      this._formService.focusRequested.pipe(filter((control) => control === this.formControl)),\n      this._onFocusRequested\n    );\n  }\n\n  public ngOnDestroy(): void {\n    this._observer.destroy();\n  }\n\n  private readonly _onFocusRequested = (): void => {\n    this._elementRef.nativeElement.scrollIntoView({block: 'center', behavior: 'smooth'});\n    this.formControl.updateValueAndValidity();\n  };\n}\n","import {AbstractControl} from '@angular/forms';\nimport {Destroyable, IDestroyable, LazyProperty, Observer, Snapshot} from '@marcura/dadesk-ui-common';\nimport {map, Observable, Observer as RxObserver, Subscription} from 'rxjs';\n\nexport abstract class AbstractControlWrapper<T extends AbstractControl> extends Destroyable {\n  public readonly observer: Observer = new Observer();\n\n  private readonly _isDisabled: LazyProperty<Snapshot<boolean>> = new LazyProperty(() =>\n    this.observer.add(\n      Snapshot.from(this.ngControl.disabled, this.ngControl.statusChanges.pipe(map(() => this.ngControl.disabled)))\n    )\n  );\n  public get isDisabled$(): Snapshot<boolean> {\n    return this._isDisabled.value;\n  }\n\n  private readonly _isEnabled: LazyProperty<Snapshot<boolean>> = new LazyProperty(() =>\n    this.observer.add(\n      Snapshot.from(this.ngControl.enabled, this.ngControl.statusChanges.pipe(map(() => this.ngControl.enabled)))\n    )\n  );\n  public get isEnabled$(): Snapshot<boolean> {\n    return this._isEnabled.value;\n  }\n\n  private readonly _isValid: LazyProperty<Snapshot<boolean>> = new LazyProperty(() =>\n    this.observer.add(\n      Snapshot.from(this.ngControl.valid, this.ngControl.statusChanges.pipe(map(() => this.ngControl.valid)))\n    )\n  );\n  public get isValid$(): Snapshot<boolean> {\n    return this._isValid.value;\n  }\n\n  private readonly _isInvalid: LazyProperty<Snapshot<boolean>> = new LazyProperty(() =>\n    this.observer.add(\n      Snapshot.from(this.ngControl.invalid, this.ngControl.statusChanges.pipe(map(() => this.ngControl.invalid)))\n    )\n  );\n  public get isInvalid$(): Snapshot<boolean> {\n    return this._isInvalid.value;\n  }\n\n  private readonly _isPending: LazyProperty<Snapshot<boolean>> = new LazyProperty(() =>\n    this.observer.add(\n      Snapshot.from(this.ngControl.pending, this.ngControl.statusChanges.pipe(map(() => this.ngControl.pending)))\n    )\n  );\n  public get isPending$(): Snapshot<boolean> {\n    return this._isPending.value;\n  }\n\n  public constructor(\n    /**\n     * The native Angular form control that this form class is based on\n     */\n    public readonly ngControl: T\n  ) {\n    super();\n  }\n\n  /**\n   * Adds a destroyable object to the list of destroyables, to be destroyed when the `destroy` method is called.\n   * It's an alias for calling `this.observer.add(destroyable)`.\n   *\n   * @param destroyable - The destroyable object to add.\n   * @returns The added destroyable object.\n   * @throws {Error} If the destroyable object is already added.\n   */\n  public addDestroyable<TDestroyable extends IDestroyable>(destroyable: TDestroyable): TDestroyable {\n    return this.observer.add(destroyable);\n  }\n\n  /**\n   * Destroys the object, internal observer and all registered destroyable objects.\n   */\n  public override destroy(): void {\n    if (!this.isDestroyed) {\n      this.observer.destroy();\n    }\n    super.destroy();\n  }\n\n  /**\n   * Listens to an observable and unsubscribes when the form is destroyed.\n   */\n  public listen<TValue>(\n    observable: Observable<TValue>,\n    observer?: Partial<RxObserver<TValue>> | ((value: TValue) => void)\n  ): Subscription {\n    return this.observer.listen(observable, observer);\n  }\n\n  /**\n   * Unsubscribes a previously registered subscription in internal observer.\n   */\n  public unlisten(subscription: Subscription): void {\n    this.observer.unsubscribe(subscription);\n  }\n}\n","import {\n  AbstractControl,\n  AbstractControlOptions,\n  AsyncValidatorFn,\n  FormControl,\n  FormControlOptions,\n  FormGroup as NgFormGroup,\n  ValidatorFn,\n} from '@angular/forms';\nimport {Assert, Is} from '@marcura/marcura-common';\nimport {BehaviorSubject, Observable} from 'rxjs';\n\nimport {AbstractControlWrapper} from './abstract-control-wrapper';\nimport {AbstractFormArray} from './form-array';\n\ntype ValidatorOrOptsArg = ValidatorFn | ValidatorFn[] | AbstractControlOptions | null;\ntype AsyncValidatorArg = AsyncValidatorFn | AsyncValidatorFn[] | null;\n\n/**\n * The `Form` class is a comprehensive utility for managing form controls and their states.\n * It provides methods to add, remove, attach, and detach controls, as well as to enable or disable them.\n * The class also offers observables to track the state of the form and its controls.\n *\n * * In general, we have two main states of Control:\n * - `registered`: control is known to the form, but may be not attached to the Angular FormGroup\n * - `attached`: control is attached to the Angular FormGroup\n *\n * So this way we have a Control's lifecycle like below:\n * - creation\n * - registration\n * - attachment\n *\n * With optional phases of:\n * - detachment\n * - unregistration\n *\n * Once control is detached it can be attached again without knowing its' name, because it's still registered.\n *\n * We have shortcuts performing more than one operation, which will be mostly used in common scenarios i.e.:\n *\n * `createControl()` = creation + register() + attach():\n * ```ts\n * public readonly name: FormControl<string> = this.createControl('name', '');\n * ```\n *\n * - `addControl()` = register() + attach()\n *\n * ```ts\n * public readonly age: FormControl<number | null> = this.addControl('age', new FormControl());\n * ```\n *\n * But, if needed, we can perform each operation separately. I.e. we can register a control without attaching it to the form:\n * ```ts\n * public readonly document: FormControl<string> = this.registerControl('document', nonNullControl(''));\n * ```\n *\n * For adding subforms and form arrays, we have dedicated methods:\n * - `addForm()`\n * - `addArray()`\n *\n * This class provides also `setChildEnabled()` and `setChildDisabled()` methods,\n * which should be used to enable/disable controls with attaching/detaching\n * them at the same time without a risk of accidental enabling of them while\n * enabling the whole form.\n *\n * @example\n * ```ts\n * export class PersonForm extends Form {\n *   public readonly name: FormControl<string> = this.createControl('name', '', Validators.required);\n *   public readonly age: FormControl<number> = this.createControl('age', 0, Validators.min(0));\n *   public readonly document: FormControl<string> = this.createControl('document', '');\n *   public readonly address: AddressForm = this.addForm('address', new AddressForm());\n *   public readonly books: FormArray<BookForm> = this.addArray('books', new FormArray());\n *\n *   public readonly saveWorker: Worker = this.observer.add(new Worker());\n *   public readonly schema$: State<PersonSchema | null> = this.observer.add(new State<PersonSchema | null>(null));\n *   public readonly isSubmitDisabled$: Snapshot<boolean> = this.observer.add(\n *     Snapshot.from(false, Rx.atLeastOneIsTrue([this.isPending$, this.isDisabled$]))\n *   );\n *\n *   public constructor() {\n *     super();\n *     this.listen(this.saveWorker.isWorking$, this.setDisabled);\n *\n *     this.listen(FormTools.getValue$(this.age).pipe(map((age) => age >= 18)), (hasDocument) => {\n *       this.setChildEnabled(this.document)(hasDocument);\n *       FormTools.setValidators(this.document, hasDocument ? [Validators.required, Validators.minLength(3)] : null);\n *     });\n *\n *     this.listen(this.schema$, (schema) => {\n *       this.name.setValue(schema?.name ?? '');\n *       this.age.setValue(schema?.age ?? 0);\n *       this.document.setValue(schema?.document ?? '');\n *       this.address.schema.set(schema?.address ?? null);\n *       this.books.updateItemsByValues({\n *         values: schema?.books ?? [],\n *         hasValue: (form, value) => form.schema.get()?.id === value.id,\n *         create: (value) => new BookForm(value),\n *         update: (form, value) => form.schema.set(value),\n *         destroy: (form) => form.destroy(),\n *       });\n *     });\n *   }\n *\n *   public toSchema(): PersonSchema {\n *     return {\n *       id: this.schema$.get()?.id,\n *       name: this.name.value,\n *       age: this.age.value,\n *       document: this.document.value,\n *       address: this.address.toSchema(),\n *       books: this.books.items.map((form) => form.toSchema()),\n *     };\n *   }\n *\n *   public addBook(): void {\n *     this.books.push(new BookForm());\n *   }\n *\n *   public removeBook(book: BookForm): void {\n *     this.books.removeItem(book);\n *   }\n * }\n * ```\n */\nexport class Form extends AbstractControlWrapper<NgFormGroup> {\n  private readonly _registeredControls: BehaviorSubject<Record<string, AbstractControl>> = new BehaviorSubject({});\n  private readonly _registeredControlsReversed: Map<AbstractControl, string> = new Map();\n\n  /**\n   * An observable that emits when the collection of registered controls in the form is changed.\n   */\n  public readonly controls$: Observable<Record<string, AbstractControl>> = this._registeredControls;\n\n  public constructor(opts?: AbstractControlOptions) {\n    super(new NgFormGroup({}, opts));\n\n    this.listen(this._registeredControls, (controls) => {\n      this._registeredControlsReversed.clear();\n      Object.entries(controls).forEach(([name, control]) => this._registeredControlsReversed.set(control, name));\n    });\n  }\n\n  /**\n   * Destroys the form and all its controls.\n   */\n  public override destroy(): void {\n    super.destroy();\n    this._registeredControls.complete();\n  }\n\n  /**\n   * Returns all the controls registered in the form, including those detached from the Angular FormGroup.\n   */\n  public getAllControls(): Record<string, AbstractControl> {\n    return {...this._registeredControls.value};\n  }\n\n  public getControlByName(name: string): AbstractControl {\n    return Assert.defined(this._registeredControls.value[name]);\n  }\n\n  public getNameByControl(control: AbstractControl): string {\n    return Assert.defined(this._registeredControlsReversed.get(control));\n  }\n\n  /**\n   * Adds a control to the form and attaches it to the underlying Angular FormGroup.\n   */\n  public addControl<TControl extends AbstractControl>(name: string, control: TControl): TControl {\n    this.register(name, control);\n    this.attach(control);\n    return control;\n  }\n\n  /**\n   * Creates a new FormControl and adds it to the form (and attaches to Angular FormGroup).\n   */\n  public createControl<T>(\n    name: string,\n    value: AbstractControl<T> | T,\n    validatorOrOpts?: ValidatorOrOptsArg,\n    asyncValidator?: AsyncValidatorArg\n  ): FormControl<T> {\n    const options: FormControlOptions =\n      Is.defined(validatorOrOpts) && (Is.array(validatorOrOpts) || typeof validatorOrOpts === 'function')\n        ? {validators: validatorOrOpts}\n        : validatorOrOpts ?? {};\n    const control: FormControl = new FormControl(\n      value,\n      {\n        ...options,\n        nonNullable: true,\n      },\n      asyncValidator\n    );\n    return this.addControl(name, control);\n  }\n\n  /**\n   * Adds a subform extending Form class to the form and attaches it's native\n   * NgFormGroup to the current Angular FormGroup.\n   */\n  public addForm<TForm extends Form>(name: string, form: TForm): TForm {\n    this.register(name, form);\n    this.attach(form.ngControl);\n    return form;\n  }\n\n  /**\n   * Adds a FormArray or FormControlArray class to the form and attaches it's native\n   * NgFormArray to the current Angular FormGroup.\n   */\n  public addArray<TForm extends AbstractFormArray<any, any>>(name: string, form: TForm): TForm {\n    this.register(name, form);\n    this.attach(form.ngControl);\n    return form;\n  }\n\n  /**\n   * Checks if the control is registered to the form (this does not mean it is attached to the Angular FormGroup).\n   */\n  public isRegistered(control: AbstractControl): boolean {\n    return this._registeredControlsReversed.has(control);\n  }\n\n  /**\n   * Registers a control in the Form, so it will be associated with its' name.\n   */\n  public register<TControl extends AbstractControl | AbstractControlWrapper<AbstractControl>>(\n    name: string,\n    control: TControl\n  ): TControl {\n    const ngControl: AbstractControl = control instanceof AbstractControlWrapper ? control.ngControl : control;\n    if (this.isRegistered(ngControl)) {\n      throw new Error(`${Form.name}.register(): control is already registered.`);\n    }\n    if (control instanceof AbstractControlWrapper && !this.observer.has(control)) {\n      this.observer.add(control);\n    }\n    this._registeredControls.next({...this._registeredControls.value, [name]: ngControl});\n    return control;\n  }\n\n  /**\n   * Unregisters a control from the Form, so it won't be known for this Form anymore.\n   */\n  public unregister<TControl extends AbstractControl | AbstractControlWrapper<AbstractControl>>(\n    name: string,\n    control: TControl\n  ): TControl {\n    const ngControl: AbstractControl = control instanceof AbstractControlWrapper ? control.ngControl : control;\n    if (!this.isRegistered(ngControl)) {\n      throw new Error(`${Form.name}.unregister(): control is not registered.`);\n    }\n    if (this.isAttached(ngControl)) {\n      this.detach(ngControl);\n    }\n    if (control instanceof AbstractControlWrapper && this.observer.has(control)) {\n      this.observer.remove(control);\n    }\n    const next: Record<string, AbstractControl> = {...this._registeredControls.value};\n    delete next[name];\n    this._registeredControls.next(next);\n    return control;\n  }\n\n  /**\n   * Checks if the control is attached to the underlying Angular FormGroup.\n   */\n  public isAttached(control: AbstractControl): boolean {\n    // NgFormGroup.get() returns Control even is it's disabled, (while .contains() returns false if it's disabled)\n    return Is.defined(this.ngControl.get(this.getNameByControl(control)));\n  }\n\n  /**\n   * Attaches a control to the Angular FormGroup.\n   */\n  public attach(control: AbstractControl): this {\n    if (!this.isRegistered(control)) {\n      throw new Error(`${Form.name}.attach(): control is not registered in ${this.constructor.name}.`);\n    }\n    if (!this.isAttached(control)) {\n      this.ngControl.addControl(this.getNameByControl(control), control);\n    }\n    return this;\n  }\n\n  /**\n   * Detaches a control from the Angular FormGroup (but keeps it registered in the form, so it can be\n   * attached later again). Detaching control means it won't be included in Angular's validation process.\n   */\n  public detach(control: AbstractControl): this {\n    if (!this.isRegistered(control)) {\n      throw new Error(`${Form.name}.detach(): control is not registered in ${this.constructor.name}.`);\n    }\n    if (this.isAttached(control)) {\n      this.ngControl.removeControl(this.getNameByControl(control));\n    }\n    return this;\n  }\n\n  public readonly setEnabled = (value: boolean = true): void => {\n    if (value) {\n      if (this.ngControl.disabled) {\n        this.ngControl.enable();\n      }\n    } else {\n      if (this.ngControl.enabled) {\n        this.ngControl.disable();\n      }\n    }\n  };\n\n  public readonly setDisabled = (value: boolean = true): void => {\n    return this.setEnabled(!value);\n  };\n\n  /**\n   * It will enable & attach (or disable & dettach) a child control based on the given value.\n   */\n  public readonly setChildEnabled = <TControl extends AbstractControl>(\n    control: TControl | AbstractControlWrapper<TControl>\n  ): ((value: boolean) => void) => {\n    if (control instanceof AbstractControlWrapper) {\n      return this.setChildEnabled(control.ngControl);\n    }\n    return (value) => {\n      if (value) {\n        if (control.disabled) {\n          control.enable();\n        }\n        this.attach(control);\n      } else {\n        if (control.enabled) {\n          control.disable();\n        }\n        this.detach(control);\n      }\n    };\n  };\n\n  /**\n   * It will disable & dettach (or enable & attach) a child control based on the given value.\n   */\n  public readonly setChildDisabled = <TControl extends AbstractControl>(\n    control: TControl | AbstractControlWrapper<TControl>\n  ): ((value: boolean) => void) => {\n    return (value) => this.setChildEnabled(control)(!value);\n  };\n}\n","import {\n  AbstractControl,\n  AbstractControlOptions,\n  AsyncValidatorFn,\n  FormArray as NgFormArray,\n  FormGroup,\n  ValidatorFn,\n} from '@angular/forms';\nimport {isDestroyable, Rx} from '@marcura/dadesk-ui-common';\nimport {BehaviorSubject, merge, Observable} from 'rxjs';\nimport {switchMap} from 'rxjs/operators';\n\nimport {AbstractControlWrapper} from './abstract-control-wrapper';\nimport {Form} from './form';\n\nexport abstract class AbstractFormArray<TItem, TControl extends AbstractControl> extends AbstractControlWrapper<\n  NgFormArray<TControl>\n> {\n  private readonly _items: BehaviorSubject<TItem[]> = new BehaviorSubject<TItem[]>([]);\n\n  /**\n   * An observable that emits when the collection of items is changed.\n   */\n  public readonly items$: Observable<TItem[]> = this._items;\n\n  /**\n   * An array of items that are currently in the form array.\n   */\n  public get items(): TItem[] {\n    return this._items.value;\n  }\n\n  public constructor(\n    items?: TItem[],\n    validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n    asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n  ) {\n    super(new NgFormArray<any>([], validatorOrOpts, asyncValidator));\n\n    this.setItems(items || []);\n  }\n\n  public override destroy(): void {\n    super.destroy();\n    this.items.forEach((item) => {\n      if (isDestroyable(item)) {\n        item.destroy();\n      }\n    });\n  }\n\n  protected abstract _getControl(item: TItem): TControl;\n\n  public has(item: TItem): boolean {\n    return this._items.value.includes(item);\n  }\n\n  public push(item: TItem): TItem {\n    this.ngControl.push(this._getControl(item));\n    this._items.next([...this._items.value, item]);\n    return item;\n  }\n\n  public insert(index: number, item: TItem): TItem {\n    this.ngControl.insert(index, this._getControl(item));\n    const nextItems: TItem[] = [...this._items.value];\n    nextItems.splice(index, 0, item);\n    this._items.next(nextItems);\n    return item;\n  }\n\n  /**\n   * Sets the whole collection of new items in the form array.\n   */\n  public setItems(items: TItem[]): void {\n    this._removeAllItems();\n    items.forEach((item) => this.ngControl.push(this._getControl(item)));\n    this._items.next([...items]);\n  }\n\n  /**\n   * This method updates the items in the array by mapping the provided values to existing items\n   * or creating new items if they do not exist. It then sets the updated items and destroys any\n   * items that are no longer needed.\n   */\n  public updateItemsByValues<TValue>(params: {\n    values: TValue[];\n    hasValue: (item: TItem, value: TValue) => boolean;\n    create: (value: TValue) => TItem;\n    update: (item: TItem, value: TValue) => void;\n    destroy: (item: TItem) => void;\n  }): void {\n    const existingItems: TItem[] = this._items.value;\n    const updatedItems: TItem[] = params.values.map((value) => {\n      const existingItem: TItem | undefined = existingItems.find((item) => params.hasValue(item, value));\n      if (existingItem) {\n        params.update(existingItem, value);\n        return existingItem;\n      }\n      return params.create(value);\n    });\n    this.setItems(updatedItems);\n    existingItems.forEach((existingItem) => {\n      const itemWasRemoved: boolean = params.values.find((value) => params.hasValue(existingItem, value)) === undefined;\n      if (itemWasRemoved) {\n        params.destroy(existingItem);\n      }\n    });\n  }\n\n  public removeAt(index: number): void {\n    this.ngControl.removeAt(index);\n    const nextItems: TItem[] = [...this._items.value];\n    nextItems.splice(index, 1);\n    this._items.next(nextItems);\n  }\n\n  public removeItem(item: TItem): TItem {\n    const index: number = this._items.value.indexOf(item);\n    if (index > -1) {\n      this.removeAt(index);\n    }\n    return item;\n  }\n\n  public removeAllItems(): void {\n    this._removeAllItems();\n    this._items.next([]);\n  }\n\n  /**\n   * Merges the observables returned by the `selectValue` function for each item in the array.\n   *\n   * @template TValue - The type of the value emitted by the observables.\n   * @param selectValue - A function that takes an item and returns an observable of type `TValue`.\n   * @returns An observable that emits the values from the merged observables.\n   */\n  public merge<TValue>(selectValue: (item: TItem) => Observable<TValue>): Observable<TValue> {\n    return this.items$.pipe(switchMap((items) => merge(...items.map(selectValue))));\n  }\n\n  /**\n   * Combines the items in the array using the provided projection function.\n   *\n   * @template TValue - The type of the values emitted by the projection function.\n   * @param project - A function that takes an item of type `TItem` and returns an `Observable` of type `TValue`.\n   * @returns An `Observable` that emits an array of `TValue` items.\n   */\n  public combine<TValue>(project: (item: TItem) => Observable<TValue>): Observable<TValue[]> {\n    return this.items$.pipe(switchMap((item) => Rx.combineLatestIncludingEmpty(item.map(project))));\n  }\n\n  private _removeAllItems(): void {\n    const length: number = this.ngControl.controls.length;\n    for (let i: number = 0; i < length; i++) {\n      this.ngControl.removeAt(0);\n    }\n  }\n}\n\n/**\n * A specialized form array class that extends `AbstractFormArray`.\n * This class is designed to handle an array of form groups of type `TForm`.\n *\n * @template TForm - The type of form contained within the array.\n *\n * @example\n * ```typescript\n * class MyForm extends Form {\n *   public readonly name: FormControl<string> = this.createControl('');\n * }\n *\n * const formArray: FormArray<MyForm> = new FormArray<MyForm>();\n * formArray.items$.subscribe((items) => console.log(items));\n * formArray.push(new MyForm());\n * formArray.removeAt(0);\n * ```\n */\nexport class FormArray<TForm extends Form> extends AbstractFormArray<TForm, FormGroup> {\n  protected _getControl(item: TForm): FormGroup {\n    return item.ngControl;\n  }\n}\n\n/**\n * This class is designed to handle an array of form controls of type `TControl`.\n *\n * @template TControl - The type of form control that this array will manage.\n *\n * @example\n * ```typescript\n * const formArray: FormControlArray<FormControl<number>> = new FormControlArray<FormControl<number>>();\n * formArray.items$.subscribe((items) => console.log(items));\n * formArray.push(new FormControl(123));\n * formArray.removeAt(0);\n * ```\n */\nexport class FormControlArray<TControl extends AbstractControl> extends AbstractFormArray<TControl, TControl> {\n  protected _getControl(item: TControl): TControl {\n    return item;\n  }\n}\n","import {AbstractControlOptions} from '@angular/forms';\nimport {Worker} from '@marcura/dadesk-ui-common';\nimport {distinctUntilChanged} from 'rxjs/operators';\n\nimport {Form} from './form';\n\n/**\n * Represents a form that can be submitted and includes a worker to handle asynchronous tasks.\n * Extends the base `Form` class.\n */\nexport class SubmittableForm extends Form {\n  public readonly worker: Worker = this.observer.add(new Worker());\n\n  public constructor(opts?: AbstractControlOptions) {\n    super(opts);\n    this.listen(this.worker.isWorking$.pipe(distinctUntilChanged()), this.setDisabled);\n  }\n}\n","import {AbstractControl, ValidatorFn} from '@angular/forms';\n\n/**\n * Special characters allowed in usernames.\n * **IMPORTANT**: If these characters are modified, verify that the escaping logic in\n * {@link getUsernamePattern} handles them correctly.\n */\nexport const usernameCharacters: string = \"@^$.!`-#+'~_\";\n\n/**\n * Minimum required length for usernames.\n * Use with `Validators.minLength(minUsernameLength)`.\n */\nexport const minUsernameLength: number = 3;\n\n/**\n * Maximum allowed length for usernames.\n * Use with `Validators.maxLength(maxUsernameLength)`.\n */\nexport const maxUsernameLength: number = 25;\n\n/**\n * RegExp pattern for validating that username starts with a lowercase letter.\n * Useful for apps that want to validate the first character separately.\n *\n * @example\n * ```typescript\n * import { usernameFirstCharPattern } from '@marcura/dadesk-ui-form';\n *\n * if (!usernameFirstCharPattern.test(username)) {\n *   return 'Username must start with a lowercase letter';\n * }\n * ```\n */\nexport const usernameFirstCharPattern: RegExp = /^[a-z]/;\n\n/**\n * Formatted username special characters for display in UI hints/messages.\n * Each character from {@link usernameCharacters} is separated by a non-breaking space for better readability.\n *\n * @example\n * ```typescript\n * import { formattedUsernameCharacters } from '@marcura/dadesk-ui-form';\n *\n * const hint = `Allowed characters: ${formattedUsernameCharacters}`;\n * // Result: \"Allowed characters: @ ^ $ . ! ` - # + ' ~ _\"\n * ```\n */\nexport const formattedUsernameCharacters: string = usernameCharacters.split('').join('\\u00A0');\n\n/**\n * Creates a RegExp pattern for validating username characters.\n * Uses the {@link usernameCharacters} constant for allowed special characters.\n *\n * **IMPORTANT**: The escaping logic must be kept in sync with {@link usernameCharacters}\n * to include all characters that require escaping in the regex pattern.\n *\n * @param includeFirstLetterCheck - If true, pattern requires username to start with a lowercase letter.\n *                                   If false, pattern only validates that all characters are allowed.\n *                                   Default: true\n * @returns RegExp pattern for username validation\n *\n * @example\n * ```typescript\n * // With first letter check (default behavior)\n * const patternWithStart = getUsernamePattern();\n * patternWithStart.test('john_doe'); // true\n * patternWithStart.test('John_doe'); // false (uppercase not allowed)\n * patternWithStart.test('_john');    // false (must start with letter)\n *\n * // Without first letter check (for apps that validate first character separately)\n * const patternCharsOnly = getUsernamePattern(false);\n * patternCharsOnly.test('john_doe'); // true\n * patternCharsOnly.test('_john');    // true (first char check not enforced)\n * patternCharsOnly.test('John');     // false (uppercase still not allowed)\n * ```\n */\nexport function getUsernamePattern(includeFirstLetterCheck: boolean = true): RegExp {\n  const escapedCharacters: string = usernameCharacters.replace(/[-\\\\^$.]/g, '\\\\$&');\n  if (includeFirstLetterCheck) {\n    return new RegExp(`^[a-z][a-z0-9${escapedCharacters}]*$`);\n  }\n  return new RegExp(`^[a-z0-9${escapedCharacters}]+$`);\n}\n\n/**\n * Validates that username starts with a lowercase letter.\n *\n * This validator only checks the first character. It's designed to be used together with\n * {@link usernameFormatValidator} (with `includeFirstLetterCheck = false`) when you need\n * separate error messages for different validation rules.\n *\n * @param validationErrorName - The key name for the validation error in the control's errors object\n * @returns A validator function that returns validation errors or null if valid\n *\n * @example\n * ```typescript\n * import {\n *   usernameFirstCharValidator,\n *   usernameFormatValidator,\n *   minUsernameLength,\n *   maxUsernameLength\n * } from '@marcura/dadesk-ui-form';\n * import { Validators } from '@angular/forms';\n *\n * // Separate validators for specific error messages\n * public readonly username: FormControl<string> = this.createControl(\n *   'username',\n *   '',\n *   [\n *     Validators.required,\n *     Validators.minLength(minUsernameLength),\n *     Validators.maxLength(maxUsernameLength),\n *     usernameFirstCharValidator('usernameStartChar'),      // Check first character\n *     usernameFormatValidator('usernameInvalidChars', false)  // Check all characters\n *   ]\n * );\n *\n * // Now you can show specific error messages:\n * // - errors.usernameStartChar: \"Username must start with a lowercase letter\"\n * // - errors.usernameInvalidChars: \"Username contains invalid characters\"\n * ```\n */\nexport function usernameFirstCharValidator(validationErrorName: string): ValidatorFn {\n  return (control) => {\n    if (!control.value || typeof control.value !== 'string') {\n      return null;\n    }\n    return usernameFirstCharPattern.test(control.value) ? null : {[validationErrorName]: true};\n  };\n}\n\n/**\n * Validates username format for new user creation.\n *\n * This validator checks if the username contains valid characters. By default, it also validates\n * that the username starts with a lowercase letter. Length validation should be performed\n * separately using `Validators.minLength()` and `Validators.maxLength()`.\n *\n * Requirements (with default includeFirstLetterCheck = true):\n * - Must start with a lowercase letter (a-z)\n * - Can contain: lowercase letters (a-z), numbers (0-9), and special characters defined in {@link usernameCharacters}\n * - Special characters allowed: {@link usernameCharacters}\n * - Recommended length: {@link minUsernameLength} to {@link maxUsernameLength} characters (validated separately)\n *\n * @param validationErrorName - The key name for the validation error in the control's errors object\n * @param includeFirstLetterCheck - If true, validates that username starts with a lowercase letter.\n *                                   If false, only validates character set (useful when validating first char separately).\n *                                   Default: true\n * @returns A validator function that returns validation errors or null if valid\n *\n * @example\n * Basic usage with all-in-one validation:\n * ```typescript\n * import {\n *   usernameFormatValidator,\n *   minUsernameLength,\n *   maxUsernameLength,\n *   formattedUsernameCharacters\n * } from '@marcura/dadesk-ui-form';\n * import { Validators } from '@angular/forms';\n *\n * // In your form class\n * public readonly username: FormControl<string> = this.createControl(\n *   'username',\n *   '',\n *   [\n *     Validators.required,\n *     Validators.minLength(minUsernameLength),\n *     Validators.maxLength(maxUsernameLength),\n *     usernameFormatValidator('usernameInvalidCharacters')\n *   ]\n * );\n *\n * // In your component for displaying hints\n * public readonly usernameHint: string =\n *   `Username must be ${minUsernameLength}-${maxUsernameLength} characters, ` +\n *   `start with a letter, and may contain: a-z, 0-9, ${formattedUsernameCharacters}`;\n * ```\n *\n * @example\n * Using separate validators for refined error messages:\n * ```typescript\n * import {\n *   usernameFirstCharValidator,\n *   usernameFormatValidator,\n *   minUsernameLength,\n *   maxUsernameLength\n * } from '@marcura/dadesk-ui-form';\n * import { Validators } from '@angular/forms';\n *\n * // In your form class - validate first char separately for specific error message\n * public readonly username: FormControl<string> = this.createControl(\n *   'username',\n *   '',\n *   [\n *     Validators.required,\n *     Validators.minLength(minUsernameLength),\n *     Validators.maxLength(maxUsernameLength),\n *     usernameFirstCharValidator('usernameStartChar'),         // Separate first char check\n *     usernameFormatValidator('usernameInvalidChars', false)   // Character set check only\n *   ]\n * );\n * ```\n */\nexport function usernameFormatValidator(\n  validationErrorName: string,\n  includeFirstLetterCheck: boolean = true\n): ValidatorFn {\n  const usernamePattern: RegExp = getUsernamePattern(includeFirstLetterCheck);\n  return (control) => {\n    if (!control.value || typeof control.value !== 'string') {\n      return null;\n    }\n    return usernamePattern.test(control.value)\n      ? null\n      : {[validationErrorName]: {characters: formattedUsernameCharacters}};\n  };\n}\n","import {CommonModule as Common} from '@angular/common';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {DuiCommonModule} from '@marcura/dadesk-ui-common';\n\nimport {FormControlFocusDirective} from './directives/form-control-focus.directive';\nimport {FormService} from './services/form.service';\n\nconst components: any[] = [];\nconst directives: any[] = [FormControlFocusDirective];\nconst pipes: any[] = [];\nconst services: any[] = [FormService];\n\n@NgModule({\n  declarations: [...components, ...directives, ...pipes],\n  imports: [Common, ReactiveFormsModule, DuiCommonModule],\n  exports: [...components, ...directives, ...pipes],\n})\nexport class DuiFormModule {\n  public static forRoot(): ModuleWithProviders<DuiFormModule> {\n    return {\n      ngModule: DuiFormModule,\n      providers: [...services],\n    };\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["FormArray","i1.FormService","map","NgFormGroup","NgFormArray","Common"],"mappings":"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"}