{"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 { Component, DoCheck, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NgModel } from '@angular/forms';\r\n\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\ntype ErrorMessageType = {\r\n    id: string;\r\n    message: string;\r\n};\r\n\r\n/**\r\n * @description Componente que exibe as mensagens de erro de validação associadas a um controle de formulário.\r\n * Observa as alterações de estado do controle e renderiza as mensagens mapeadas em `errorMessages`.\r\n * Compativel com `AbstractControl` do Reactive Forms e `NgModel` do Template-Driven Forms.\r\n *\r\n * @example\r\n * ```html\r\n * <s-control-errors\r\n *   [control]=\"form.get('email')\"\r\n *   [errorMessages]=\"{ required: 'E-mail obrigatório', email: 'E-mail inválido' }\"\r\n * />\r\n * ```\r\n *\r\n * @category Feedback\r\n */\r\n@Component({\r\n    selector: 's-control-errors',\r\n    templateUrl: './control-errors.component.html',\r\n    standalone: true,\r\n})\r\nexport class ControlErrorsComponent implements OnDestroy, OnChanges, DoCheck {\r\n    public static readonly nextIdSeed = 0;\r\n    private static readonly RANDOM_ID_END_INDEX = 9;\r\n    private static readonly BASE_36 = 36;\r\n\r\n    private static _nextId = ControlErrorsComponent.nextIdSeed;\r\n\r\n    public static getNextId(): number {\r\n        return this._nextId++;\r\n    }\r\n\r\n    /**\r\n     * @description Identificador único do componente. Gerado automaticamente se não informado.\r\n     * Usado para associação acessível com o campo correspondente.\r\n     */\r\n    @Input()\r\n    public id = `s-control-errors-${ControlErrorsComponent.getNextId()}`;\r\n\r\n    /**\r\n     * @description Controle do formulário cujos erros serão exibidos.\r\n     * Aceita `AbstractControl` (Reactive Forms) ou `NgModel` (Template-Driven Forms). Campo obrigatório.\r\n     */\r\n    @Input({ required: true })\r\n    public control!: AbstractControl | NgModel;\r\n\r\n    /**\r\n     * @description Mapa de chaves de erro para mensagens de texto exibidas ao usuário.\r\n     * Cada chave corresponde a um erro que pode estar presente em `control.errors`.\r\n     *\r\n     * @example\r\n     * ```ts\r\n     * { required: 'Campo obrigatório', minlength: 'Mínimo 8 caracteres' }\r\n     * ```\r\n     */\r\n    @Input()\r\n    public errorMessages: any = {};\r\n\r\n    /**\r\n     * @description Referência ao formulário pai. Utilizado em cenários de validação customizada\r\n     * que dependem do estado geral do formulário.\r\n     */\r\n    @Input()\r\n    public form: any;\r\n\r\n    errorMessagesList: ErrorMessageType[] = [];\r\n\r\n    private readonly onDestroy$ = new Subject<void>();\r\n\r\n    /**\r\n     * Assinatura barata do último estado verificado (dirty + chaves de erro).\r\n     * Permite reagir a `markAsDirty()` chamado sem alteração de valor (ex: validação\r\n     * disparada manualmente no submit) sem recalcular `errorMessagesList` em todo ciclo\r\n     * de change detection — só quando esse estado de fato muda.\r\n     */\r\n    private lastCheckedSignature = '';\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['control'] && changes['control'].firstChange) {\r\n            this.control?.valueChanges?.pipe(takeUntil(this.onDestroy$)).subscribe(() => this.setErrorMessagesList());\r\n        }\r\n    }\r\n\r\n    ngDoCheck(): void {\r\n        const signature = this.getControlSignature();\r\n\r\n        if (signature !== this.lastCheckedSignature) {\r\n            this.lastCheckedSignature = signature;\r\n            this.setErrorMessagesList();\r\n        }\r\n    }\r\n\r\n    private getControlSignature(): string {\r\n        const dirty = !!this.control?.dirty;\r\n        const errorKeys = Object.keys(this.control?.errors || {});\r\n\r\n        return `${dirty}|${errorKeys.join(',')}`;\r\n    }\r\n\r\n    setErrorMessagesList() {\r\n        if (!this.control?.dirty) {\r\n            this.errorMessagesList = [];\r\n\r\n            return;\r\n        }\r\n\r\n        this.errorMessagesList = Object.keys(this.control.errors || {}).map((error) => ({\r\n            id: `${Date.now()}-${Math.random().toString(ControlErrorsComponent.BASE_36).substring(2, ControlErrorsComponent.RANDOM_ID_END_INDEX)}`,\r\n            message: this.errorMessages?.[error],\r\n        }));\r\n    }\r\n\r\n    ngOnDestroy(): void {\r\n        this.onDestroy$.next();\r\n        this.onDestroy$.complete();\r\n    }\r\n}\r\n","@for (errorMessage of errorMessagesList; track errorMessage.id) {\n    @if (errorMessage) {\n        <div \n            class=\"text-criticality-red mt-[5px] text-xs\" \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';\r\n\r\nimport { ControlErrorsComponent } from './control-errors.component';\r\n\r\n@NgModule({\r\n    imports: [ControlErrorsComponent],\r\n    exports: [ControlErrorsComponent],\r\n})\r\nexport class ControlErrorsModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}