{"version":3,"file":"ngspot-ng-superclass-material.mjs","sources":["../../../../../packages/ng-superclass-material/package/src/lib/form-component-material-superclass.ts","../../../../../packages/ng-superclass-material/package/src/lib/tests/tel-input.model.ts","../../../../../packages/ng-superclass-material/package/src/lib/tests/tel-input-super.component.ts","../../../../../packages/ng-superclass-material/package/src/ngspot-ng-superclass-material.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\n/* eslint-disable @angular-eslint/directive-class-suffix */\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { Directive, DoCheck, HostBinding, inject, Input } from '@angular/core';\r\nimport { FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport {\r\n  MatFormFieldControl,\r\n  MAT_FORM_FIELD,\r\n} from '@angular/material/form-field';\r\n\r\nimport { FormComponentSuperclass } from '@ngspot/ng-superclass';\r\n\r\n/**\r\n * The superclass cannot implement certain methods of MatFormFieldControl.\r\n * These methods must be implemented in the consuming component.\r\n */\r\ntype LimitedMatFormFieldControl<T> = Omit<\r\n  MatFormFieldControl<T>,\r\n  'setDescribedByIds' | 'onContainerClick'\r\n>;\r\n\r\n/**\r\n * Class provides default implementation for the most of MatFormFieldControl interface\r\n * Couple methods can't have a default implementation since it would completely\r\n * depend on the custom component. Feel free to override any of the methods/properties\r\n * based on the needs of your custom component.\r\n */\r\n@Directive()\r\nexport abstract class FormComponentMaterialSuperclass<\r\n    OuterType,\r\n    InnerType = OuterType\r\n  >\r\n  extends FormComponentSuperclass<OuterType, InnerType>\r\n  implements DoCheck, LimitedMatFormFieldControl<OuterType>\r\n{\r\n  private defaultErrorStateMatcher = inject(ErrorStateMatcher);\r\n  formField = inject(MAT_FORM_FIELD, { optional: true });\r\n\r\n  @Input()\r\n  errorStateMatcher: ErrorStateMatcher;\r\n\r\n  // #region Props of MatFormFieldControl\r\n  @Input()\r\n  get placeholder() {\r\n    return this._placeholder;\r\n  }\r\n  set placeholder(val) {\r\n    this._placeholder = val;\r\n    this.stateChanges.next();\r\n  }\r\n  private _placeholder: string;\r\n\r\n  get empty(): boolean {\r\n    return !this.value;\r\n  }\r\n\r\n  @HostBinding('class.floating')\r\n  get shouldLabelFloat() {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  @Input()\r\n  get required(): boolean {\r\n    return this._required;\r\n  }\r\n  set required(req: boolean | string) {\r\n    this._required = coerceBooleanProperty(req);\r\n    this.stateChanges.next();\r\n  }\r\n  private _required = false;\r\n\r\n  errorState = false;\r\n\r\n  @Input('aria-describedby')\r\n  userAriaDescribedBy: string;\r\n\r\n  parentForm = inject(NgForm, { optional: true });\r\n  parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n  // #endregion\r\n\r\n  ngDoCheck() {\r\n    // We need to re-evaluate this on every change detection cycle, because there are some\r\n    // error triggers that we can't subscribe to (e.g. parent form submissions). This means\r\n    // that whatever logic is in here has to be super lean or we risk destroying the performance.\r\n    this.updateErrorState();\r\n  }\r\n\r\n  private updateErrorState() {\r\n    const control = this.ngControl ? this.ngControl.control : null;\r\n    if (!control) {\r\n      return;\r\n    }\r\n    const oldState = this.errorState;\r\n    const parent = this.parentFormGroup ?? this.parentForm;\r\n    const matcher = this.errorStateMatcher ?? this.defaultErrorStateMatcher;\r\n    const newState = matcher.isErrorState(control, parent);\r\n\r\n    if (newState !== oldState) {\r\n      this.errorState = newState;\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n}\r\n","export class MyTel {\r\n  constructor(\r\n    public area: string,\r\n    public exchange: string,\r\n    public subscriber: string\r\n  ) {}\r\n}\r\n","import { Component, inject, ViewChild } from '@angular/core';\r\nimport {\r\n  AbstractControl,\r\n  FormBuilder,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\n\r\nimport { map, Observable } from 'rxjs';\r\n\r\nimport { FormComponentMaterialSuperclass } from '../form-component-material-superclass';\r\n\r\nimport { MyTel } from './tel-input.model';\r\n\r\n@Component({\r\n  selector: 'ngs-tel-input',\r\n  standalone: true,\r\n  imports: [ReactiveFormsModule],\r\n  template: `\r\n    <div\r\n      role=\"group\"\r\n      class=\"example-tel-input-container\"\r\n      [formGroup]=\"viewModel\"\r\n      [attr.aria-labelledby]=\"formField?.getLabelId()\"\r\n    >\r\n      <input\r\n        #area\r\n        class=\"example-tel-input-element\"\r\n        formControlName=\"area\"\r\n        size=\"3\"\r\n        maxLength=\"3\"\r\n        aria-label=\"Area code\"\r\n      />\r\n      <span class=\"example-tel-input-spacer\">&ndash;</span>\r\n      <input\r\n        #exchange\r\n        class=\"example-tel-input-element\"\r\n        formControlName=\"exchange\"\r\n        maxLength=\"3\"\r\n        size=\"3\"\r\n        aria-label=\"Exchange code\"\r\n        (keyup.backspace)=\"autoFocusPrev(viewModel.controls.exchange, area)\"\r\n      />\r\n      <span class=\"example-tel-input-spacer\">&ndash;</span>\r\n      <input\r\n        #subscriber\r\n        class=\"example-tel-input-element\"\r\n        formControlName=\"subscriber\"\r\n        maxLength=\"4\"\r\n        size=\"4\"\r\n        aria-label=\"Subscriber number\"\r\n        (keyup.backspace)=\"\r\n          autoFocusPrev(viewModel.controls.subscriber, exchange)\r\n        \"\r\n      />\r\n    </div>\r\n  `,\r\n  styleUrls: ['./tel-input.scss'],\r\n  providers: [\r\n    { provide: MatFormFieldControl, useExisting: MyTelInputComponent },\r\n  ],\r\n})\r\nexport class MyTelInputComponent\r\n  extends FormComponentMaterialSuperclass<MyTel>\r\n  implements MatFormFieldControl<MyTel>\r\n{\r\n  private _formBuilder = inject(FormBuilder);\r\n\r\n  override viewModel = this._formBuilder.group({\r\n    area: [\r\n      '',\r\n      [Validators.required, Validators.minLength(3), Validators.maxLength(3)],\r\n    ],\r\n    exchange: [\r\n      '',\r\n      [Validators.required, Validators.minLength(3), Validators.maxLength(3)],\r\n    ],\r\n    subscriber: [\r\n      '',\r\n      [Validators.required, Validators.minLength(4), Validators.maxLength(4)],\r\n    ],\r\n  });\r\n\r\n  @ViewChild('area') areaInput: HTMLInputElement;\r\n  @ViewChild('exchange') exchangeInput: HTMLInputElement;\r\n  @ViewChild('subscriber') subscriberInput: HTMLInputElement;\r\n\r\n  override get empty() {\r\n    const {\r\n      value: { area, exchange, subscriber },\r\n    } = this.viewModel;\r\n\r\n    return !area && !exchange && !subscriber;\r\n  }\r\n\r\n  override outerToInner = (values$: Observable<MyTel>) =>\r\n    values$.pipe(map((value) => value ?? new MyTel('', '', '')));\r\n\r\n  autoFocusPrev(control: AbstractControl, prevElement: HTMLInputElement): void {\r\n    if (control.value.length < 1) {\r\n      this.focusMonitor.focusVia(prevElement, 'program');\r\n    }\r\n  }\r\n\r\n  setDescribedByIds(ids: string[]) {\r\n    const controlElement = this.hostEl.querySelector(\r\n      '.example-tel-input-container'\r\n    );\r\n    controlElement?.setAttribute('aria-describedby', ids.join(' '));\r\n  }\r\n\r\n  onContainerClick() {\r\n    if (this.viewModel.controls.subscriber.valid) {\r\n      this.focusMonitor.focusVia(this.subscriberInput, 'program');\r\n    } else if (this.viewModel.controls.exchange.valid) {\r\n      this.focusMonitor.focusVia(this.subscriberInput, 'program');\r\n    } else if (this.viewModel.controls.area.valid) {\r\n      this.focusMonitor.focusVia(this.exchangeInput, 'program');\r\n    } else {\r\n      this.focusMonitor.focusVia(this.areaInput, 'program');\r\n    }\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}