{"version":3,"file":"seniorsistemas-angular-components-control-errors.mjs","sources":["../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.component.ts","../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.component.html","../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.module.ts","../../projects/angular-components/control-errors/src/seniorsistemas-angular-components-control-errors.ts"],"sourcesContent":["import { AbstractControl, NgModel } from '@angular/forms';\nimport { Component, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\n\ntype ErrorMessageType = {\n    id: string;\n    message: string;\n};\n\n/**\n * @description Componente que exibe as mensagens de erro de validação associadas a um controle de formulário.\n * Observa as alterações de estado do controle e renderiza as mensagens mapeadas em `errorMessages`.\n * Compativel com `AbstractControl` do Reactive Forms e `NgModel` do Template-Driven Forms.\n *\n * @example\n * ```html\n * <s-control-errors\n *   [control]=\"form.get('email')\"\n *   [errorMessages]=\"{ required: 'E-mail obrigatório', email: 'E-mail inválido' }\"\n * />\n * ```\n *\n * @category Feedback\n */\n@Component({\n    selector: 's-control-errors',\n    templateUrl: './control-errors.component.html',\n    styleUrls: ['./control-errors.component.scss'],\n})\nexport class ControlErrorsComponent implements OnDestroy, OnChanges {\n    public static readonly nextIdSeed = 0;\n    private static readonly RANDOM_ID_END_INDEX = 9;\n    private static readonly BASE_36 = 36;\n\n    private static _nextId = ControlErrorsComponent.nextIdSeed;\n\n    public static getNextId(): number {\n        return this._nextId++;\n    }\n\n    /**\n     * @description Identificador único do componente. Gerado automaticamente se não informado.\n     * Usado para associação acessível com o campo correspondente.\n     */\n    @Input()\n    public id = `s-control-errors-${ControlErrorsComponent.getNextId()}`;\n\n    /**\n     * @description Controle do formulário cujos erros serão exibidos.\n     * Aceita `AbstractControl` (Reactive Forms) ou `NgModel` (Template-Driven Forms). Campo obrigatório.\n     */\n    @Input({ required: true })\n    public control!: AbstractControl | NgModel;\n\n    /**\n     * @description Mapa de chaves de erro para mensagens de texto exibidas ao usuário.\n     * Cada chave corresponde a um erro que pode estar presente em `control.errors`.\n     *\n     * @example\n     * ```ts\n     * { required: 'Campo obrigatório', minlength: 'Mínimo 8 caracteres' }\n     * ```\n     */\n    @Input()\n    public errorMessages: any = {};\n\n    /**\n     * @description Referência ao formulário pai. Utilizado em cenários de validação customizada\n     * que dependem do estado geral do formulário.\n     */\n    @Input()\n    public form: any;\n\n    errorMessagesList: ErrorMessageType[] = [];\n\n    private readonly onDestroy$ = new Subject<void>();\n\n    ngOnChanges(changes: SimpleChanges): void {\n        if (changes['control'] && changes['control'].firstChange) {\n            this.control?.valueChanges?.pipe(takeUntil(this.onDestroy$)).subscribe(() => this.setErrorMessagesList());\n        }\n    }\n\n    setErrorMessagesList() {\n        if (!this.control?.dirty) {\n            this.errorMessagesList = [];\n        }\n\n        this.errorMessagesList = Object.keys(this.control.errors || {}).map((error) => ({\n            id: `${Date.now()}-${Math.random().toString(ControlErrorsComponent.BASE_36).substring(2, ControlErrorsComponent.RANDOM_ID_END_INDEX)}`,\n            message: this.errorMessages?.[error],\n        }));\n    }\n\n    ngOnDestroy(): void {\n        this.onDestroy$.next();\n        this.onDestroy$.complete();\n    }\n}\n\n","@for (errorMessage of errorMessagesList; track errorMessage.id) {\n    @if (errorMessage) {\n        <div \n            class=\"error-message\" \n            role=\"alert\" \n            aria-live=\"assertive\" \n            aria-atomic=\"true\"\n        >\n            {{ errorMessage.message }}\n        </div>\n    }\n}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\n\nimport { ControlErrorsComponent } from \"./control-errors.component\";\n\n@NgModule({\n    imports: [CommonModule, FormsModule, ReactiveFormsModule],\n    declarations: [ControlErrorsComponent],\n    exports: [ControlErrorsComponent],\n})\nexport class ControlErrorsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}