{"version":3,"file":"qualcomm-ui-angular-core-forms.mjs","sources":["../../src/forms/form-utils.ts","../../src/forms/use-forbidden-form-control-warning.ts","../../src/forms/qualcomm-ui-angular-core-forms.ts"],"sourcesContent":["// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\n/*\n * Form + Signals interop.\n * https://www.angularspace.com/brewing-bootleg-reactive-forms-signals-from-rxjs/\n */\nimport type {Signal} from \"@angular/core\"\nimport {toSignal} from \"@angular/core/rxjs-interop\"\nimport {\n  type AbstractControl,\n  type ControlEvent,\n  type FormControlStatus,\n  PristineChangeEvent,\n  StatusChangeEvent,\n  TouchedChangeEvent,\n  ValueChangeEvent,\n} from \"@angular/forms\"\nimport {\n  combineLatest,\n  defer,\n  distinctUntilChanged,\n  filter,\n  map,\n  type Observable,\n  startWith,\n} from \"rxjs\"\n\nfunction valueEvents$<T>(form: AbstractControl<T>) {\n  return form.events.pipe(\n    filter(\n      (event: ControlEvent): event is ValueChangeEvent<typeof form.value> =>\n        event instanceof ValueChangeEvent,\n    ),\n  )\n}\n\nfunction statusEvents$<T>(form: AbstractControl<T>) {\n  return form.events.pipe(\n    filter(\n      (event: ControlEvent): event is StatusChangeEvent =>\n        event instanceof StatusChangeEvent,\n    ),\n  )\n}\n\nfunction touchedEvents$<T>(form: AbstractControl<T>) {\n  return form.events.pipe(\n    filter(\n      (event: ControlEvent): event is TouchedChangeEvent =>\n        event instanceof TouchedChangeEvent,\n    ),\n  )\n}\n\nfunction pristineEvents$<T>(form: AbstractControl<T>) {\n  return form.events.pipe(\n    filter(\n      (event: ControlEvent): event is PristineChangeEvent =>\n        event instanceof PristineChangeEvent,\n    ),\n  )\n}\n\nfunction isValueEvent<T>(\n  event: ControlEvent | T,\n): event is ValueChangeEvent<T> {\n  return event instanceof ValueChangeEvent\n}\nfunction isStatusEvent<T>(event: ControlEvent | T): event is StatusChangeEvent {\n  return event instanceof StatusChangeEvent\n}\nfunction isPristineEvent<T>(\n  event: ControlEvent | T,\n): event is PristineChangeEvent {\n  return event instanceof PristineChangeEvent\n}\nfunction isTouchedEvent<T>(\n  event: ControlEvent | T,\n): event is TouchedChangeEvent {\n  return event instanceof TouchedChangeEvent\n}\n\nexport type FormEventData<T> = {\n  dirty: boolean\n  invalid: boolean\n  pending: boolean\n  pristine: boolean\n  status: FormControlStatus\n  touched: boolean\n  untouched: boolean\n  valid: boolean\n  value: T\n}\n\nexport function allEventsObservable<T>(\n  form: AbstractControl<T>,\n): Observable<FormEventData<T>> {\n  return defer(() =>\n    combineLatest([\n      valueEvents$(form).pipe(\n        startWith(form.value),\n        map((value) => (isValueEvent(value) ? value.value : value)),\n        distinctUntilChanged(\n          (previous, current) =>\n            JSON.stringify(previous) === JSON.stringify(current),\n        ),\n      ),\n      statusEvents$(form).pipe(startWith(form.status)),\n      touchedEvents$(form).pipe(startWith(form.touched)),\n      pristineEvents$(form).pipe(startWith(form.pristine)),\n    ]).pipe(\n      map(([valueParam, statusParam, touchedParam, pristineParam]) => {\n        // Original values (plus value)\n        const stat: FormControlStatus | StatusChangeEvent = isStatusEvent(\n          statusParam,\n        )\n          ? statusParam.status\n          : statusParam\n        const touch: boolean | TouchedChangeEvent = isTouchedEvent(touchedParam)\n          ? touchedParam.touched\n          : touchedParam\n        const prist: boolean | PristineChangeEvent = isPristineEvent(\n          pristineParam,\n        )\n          ? pristineParam.pristine\n          : pristineParam\n\n        const validDerived = stat === \"VALID\"\n        const invalidDerived = stat === \"INVALID\"\n        const pendingDerived = stat === \"PENDING\"\n        const dirtyDerived = !prist\n        const untouchedDerived = !touch\n\n        return {\n          dirty: dirtyDerived,\n          invalid: invalidDerived,\n          pending: pendingDerived,\n          pristine: prist,\n          status: stat,\n          touched: touch,\n          untouched: untouchedDerived,\n          valid: validDerived,\n          value: valueParam,\n        } satisfies FormEventData<T>\n      }),\n    ),\n  ) as Observable<FormEventData<T>>\n}\n\nexport function allEventsSignal<T>(\n  form: AbstractControl<T>,\n): Signal<FormEventData<T>> {\n  return toSignal(allEventsObservable(form), {\n    initialValue: {\n      dirty: form.dirty,\n      invalid: form.invalid,\n      pending: form.pending,\n      pristine: form.pristine,\n      status: form.status,\n      touched: form.touched,\n      untouched: form.untouched,\n      valid: form.valid,\n      value: form.value,\n    },\n  })\n}\n","// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\nimport {afterNextRender, inject} from \"@angular/core\"\nimport {NgControl} from \"@angular/forms\"\n\ntype WarningOptions =\n  | {\n      /**\n       * The name of the directive that emits the warning.\n       */\n      directive: string\n      /**\n       * The directive to bind to instead of {@link directive}.\n       */\n      rootDirective?: string\n    }\n  | {\n      onError: () => void\n    }\n\nexport const consoleBoldStyle = \"font-weight: bold; white-space: nowrap;\"\n\nexport function useForbiddenFormControlWarning(\n  options: WarningOptions = {directive: \"\", rootDirective: \"\"},\n) {\n  const ngControl: NgControl | null = inject(NgControl, {\n    optional: true,\n    self: true,\n  })\n\n  return afterNextRender({\n    read: () => {\n      if (ngControl) {\n        if (\"onError\" in options) {\n          options.onError()\n        } else {\n          console.error(\n            `An Angular form control binding was detected on a %c${options.directive}%c directive. This will not work as intended. Bind your form control to the ${options.rootDirective ? `parent %c${options.rootDirective}%c directive` : \"root directive\"} instead.`,\n            consoleBoldStyle,\n            \"\",\n            consoleBoldStyle,\n            \"\",\n          )\n        }\n      }\n    },\n  })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}