{"version":3,"file":"ngx-t-forms-mscoa-error-display.component-BDPi6w2E.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-error-display/mscoa-error-display.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-error-display/mscoa-error-display.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  DestroyRef,\r\n  ViewEncapsulation,\r\n  computed,\r\n  effect,\r\n  inject,\r\n  input,\r\n  signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Subject, timer } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\nexport type ErrorDisplayType = 'error' | 'warning' | 'info' | 'success';\r\n\r\nexport interface ErrorDisplayContext {\r\n  segment?: string;\r\n  accountingBasis?: string;\r\n  [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Displays a list of error/warning/info/success messages inside the MSCOA chart UI.\r\n * Optionally auto-hides after a duration and can be dismissed.\r\n */\r\n@Component({\r\n  selector: 'lib-mscoa-error-display',\r\n  imports: [MatButtonModule, MatIconModule],\r\n  templateUrl: './mscoa-error-display.component.html',\r\n  styleUrls: ['./mscoa-error-display.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class MscoaErrorDisplayComponent {\r\n  /** Error messages to display. */\r\n  readonly errors = input<string[]>([]);\r\n  /** Visual variant. */\r\n  readonly type = input<ErrorDisplayType>('error');\r\n  /** Optional context (segment, accounting basis, etc.) for screen readers / parent inspection. */\r\n  readonly context = input<ErrorDisplayContext | undefined>(undefined);\r\n  /** Whether to render the leading icon. */\r\n  readonly showIcon = input<boolean>(true);\r\n  /** Compact visual density. */\r\n  readonly compact = input<boolean>(false);\r\n  /** When set, display auto-hides after this many ms. Keeps error styling. */\r\n  readonly duration = input<number | undefined>(undefined);\r\n  /** Whether to show the dismiss button. */\r\n  readonly showDismiss = input<boolean>(false);\r\n\r\n  protected readonly visible = signal<boolean>(true);\r\n\r\n  protected readonly iconName = computed<string>(() => {\r\n    switch (this.type()) {\r\n      case 'error':\r\n        return 'error';\r\n      case 'warning':\r\n        return 'warning';\r\n      case 'info':\r\n        return 'info';\r\n      case 'success':\r\n        return 'check_circle';\r\n      default:\r\n        return 'error';\r\n    }\r\n  });\r\n\r\n  protected readonly ariaLabel = computed<string>(() => {\r\n    const t = this.type();\r\n    const typeText =\r\n      t === 'error'\r\n        ? 'errors'\r\n        : t === 'warning'\r\n          ? 'warnings'\r\n          : t === 'success'\r\n            ? 'success messages'\r\n            : 'messages';\r\n    return `${this.errors().length} ${typeText}`;\r\n  });\r\n\r\n  readonly #destroyRef = inject(DestroyRef);\r\n  readonly #hideTimer$ = new Subject<void>();\r\n  #previousErrorsLength = 0;\r\n  #initialized = false;\r\n\r\n  constructor() {\r\n    // Replaces ngOnInit + ngOnChanges. Reacts to errors[] / duration changes.\r\n    effect(() => {\r\n      const length = this.errors()?.length ?? 0;\r\n      const duration = this.duration();\r\n      const wasInitialized = this.#initialized;\r\n      const previousLength = this.#previousErrorsLength;\r\n      this.#previousErrorsLength = length;\r\n      this.#initialized = true;\r\n\r\n      if (!wasInitialized) {\r\n        // Initial pass — mirror old ngOnInit behaviour.\r\n        if (duration != null && length > 0) {\r\n          this.#show();\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (duration != null) {\r\n        if (length > 0 && previousLength === 0) {\r\n          this.#show();\r\n        } else if (length === 0 && previousLength > 0) {\r\n          this.hide();\r\n        }\r\n      } else {\r\n        this.visible.set(true);\r\n      }\r\n    });\r\n\r\n    this.#destroyRef.onDestroy(() => {\r\n      this.#hideTimer$.next();\r\n      this.#hideTimer$.complete();\r\n    });\r\n  }\r\n\r\n  protected trackByIndex(index: number): number {\r\n    return index;\r\n  }\r\n\r\n  #show(): void {\r\n    this.#hideTimer$.next();\r\n    this.visible.set(true);\r\n    const duration = this.duration();\r\n    if (duration != null && duration > 0) {\r\n      timer(duration)\r\n        .pipe(takeUntil(this.#hideTimer$), takeUntilDestroyed(this.#destroyRef))\r\n        .subscribe(() => this.hide());\r\n    }\r\n  }\r\n\r\n  hide(): void {\r\n    this.#hideTimer$.next();\r\n    this.visible.set(false);\r\n  }\r\n\r\n  dismiss(): void {\r\n    this.hide();\r\n  }\r\n}\r\n","@if (visible() && errors() && errors().length > 0) {\r\n  <div\r\n    class=\"mscoa-error-display\"\r\n    [class.mscoa-error-display--error]=\"type() === 'error'\"\r\n    [class.mscoa-error-display--warning]=\"type() === 'warning'\"\r\n    [class.mscoa-error-display--info]=\"type() === 'info'\"\r\n    [class.mscoa-error-display--success]=\"type() === 'success'\"\r\n    [class.mscoa-error-display--compact]=\"compact()\"\r\n    role=\"alert\"\r\n    [attr.aria-live]=\"type() === 'error' ? 'assertive' : 'polite'\"\r\n    [attr.aria-label]=\"ariaLabel()\">\r\n\r\n    @if (showIcon()) {\r\n      <mat-icon\r\n        class=\"mscoa-error-display__icon\"\r\n        [class.mscoa-error-display__icon--error]=\"type() === 'error'\"\r\n        [class.mscoa-error-display__icon--warning]=\"type() === 'warning'\"\r\n        [class.mscoa-error-display__icon--info]=\"type() === 'info'\"\r\n        [class.mscoa-error-display__icon--success]=\"type() === 'success'\"\r\n        [attr.aria-hidden]=\"true\">\r\n        {{ iconName() }}\r\n      </mat-icon>\r\n    }\r\n\r\n    <div class=\"mscoa-error-display__content\">\r\n      @if (errors().length === 1) {\r\n        <p class=\"mscoa-error-display__message\">{{ errors()[0] }}</p>\r\n      } @else {\r\n        <ul class=\"mscoa-error-display__list\">\r\n          @for (error of errors(); track trackByIndex($index)) {\r\n            <li class=\"mscoa-error-display__item\">{{ error }}</li>\r\n          }\r\n        </ul>\r\n      }\r\n      <sub class=\"mscoa-error-display__hint\">\r\n        Hover over the account for the error message or scroll to bottom of input to see all errors.\r\n      </sub>\r\n    </div>\r\n\r\n    @if (showDismiss()) {\r\n      <button\r\n        class=\"mscoa-error-display__dismiss\"\r\n        (click)=\"dismiss()\"\r\n        [attr.aria-label]=\"'Dismiss'\"\r\n        mat-icon-button\r\n        type=\"button\">\r\n        <mat-icon aria-hidden=\"true\">close</mat-icon>\r\n      </button>\r\n    }\r\n  </div>\r\n}\r\n"],"names":["i2"],"mappings":"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"}