import { EventEmitter, TemplateRef } from '@angular/core'; import { ComponentState } from '../../types'; import { RequestReviewDecision, RequestReviewItem, RequestReviewPanelMetadata } from './types'; import * as i0 from "@angular/core"; /** * val-request-review-panel — cola de revisión del factory (ADR-062). * * Es **presentacional**: no carga datos, no conoce el backend ni el dominio. El * consumer le pasa la cola ya normalizada y escucha `(decision)`. * * ## Por qué el cuerpo va proyectado y no configurado * * El ADR original proponía describir el cuerpo con arrays de nombres de campo * (`fields.display: ['taxId', 'tagsRequested']`). Al implementarlo con los dos * consumidores reales delante quedó claro que eso reinventa un motor de * templating peor que Angular: Chesed necesita una lista de documentos con * iconos y `target="_blank"`, Okhelia un enlace a la receta y un input de * comentario. Ninguna lista de strings expresa eso sin agregarle un flag al * componente por cada caso nuevo. * * Entonces el panel es dueño de lo que **de verdad** se repite — la cáscara, el * chrome de la card, y la mecánica de decisión — y el cuerpo de cada ítem lo * escribe cada vertical en un `ng-template` con su propio HTML. * * ```html * * * * Ver receta * * ``` * * ## Rechazo con motivo * * El flujo de dos pasos (Rechazar → escribir motivo → Confirmar) es del panel, * no del consumer, y está activo por defecto. Rechazar de un click deja al * solicitante sin saber qué corregir; era el único de los dos paneles que lo * tenía bien resuelto y ahora lo heredan los dos. */ export declare class RequestReviewPanelComponent { private i18n; readonly props: import("@angular/core").InputSignal; /** * Cuerpo de cada card. El contexto trae el ítem como `$implicit` y también * como `item`, para que el consumer pueda usar `let-item` o `let-x="item"`. */ itemBody?: TemplateRef<{ $implicit: RequestReviewItem; item: RequestReviewItem; }>; decision: EventEmitter; /** ID del ítem cuyo formulario de rechazo está abierto. */ private readonly _rejectingId; readonly rejectingId: import("@angular/core").Signal; private readonly _reason; readonly reason: import("@angular/core").Signal; readonly cfg: import("@angular/core").Signal; readonly skeletonRows: import("@angular/core").Signal; /** Hay una decisión en vuelo: toda la cola se congela. */ readonly isBusy: import("@angular/core").Signal; constructor(); protected t(key: string): string; /** El ítem en vuelo muestra WORKING; los demás quedan deshabilitados. */ private stateFor; protected approveState(item: RequestReviewItem): ComponentState; /** * Confirmar el rechazo exige motivo cuando `requireRejectReason` está activo * (el default). Es el freno que evita la notificación de rechazo vacía. */ protected confirmRejectState(item: RequestReviewItem): ComponentState; protected onReasonInput(event: Event): void; protected startReject(item: RequestReviewItem): void; protected cancelReject(): void; protected confirmReject(item: RequestReviewItem): void; protected approve(item: RequestReviewItem): void; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }