import { EmptyStateMetadata } from '../../molecules/empty-state/types'; import { ButtonMetadata } from '../../types'; import { AuthService } from '../../../services/auth/auth.service'; import { OrgRole, Organization } from '../../../services/org/types'; import { MemberDetail } from '../member-detail-modal/types'; import { OrganizationViewConfig } from './types'; import * as i0 from "@angular/core"; /** * `val-organization-view` — vista Gestión de organización full-feature * autocontenida (organism). Promovida desde `showcase` bajo el proceso de * ADR-021. Reúne: * - **Información** — nombre, descripción, plan y tipo de la org activa; editar * vía modal `val-edit-org-modal` (solo si `canEditOrg()`). * - **Miembros** — lista paginada (`val-member-card`) enriquecida con perfiles * públicos (Firestore); ver detalle vía `val-member-detail-modal`. * - **Roles y permisos** — sección explicativa con CTA a la ruta de permisos. * - **Invitar** — CTA que abre `val-invite-member-modal` (gateada por `users:*`). * - **Transferir propiedad** — `val-transfer-ownership-modal` (solo owner). * - **Salir de la organización** — `OrgService.leaveOrg` con confirmación * destructiva. * * **RBAC interno** (decisión CTO, ADR-021): el gating fino se resuelve dentro de * la vista vía `AuthService.hasPermission()` + `*valHasPermission` + computeds * `isOwner()`/`canManageMembers()`/`canEditOrg()`. NO se expone como config. * * **Auto-reload en org-switch**: un `effect` reactiona a `activeOrgId()` y recarga * org + miembros cuando el usuario cambia de organización activa mientras la vista * está montada. El effect cubre también la carga inicial (sin doble carga). * * NO renderiza ion-content — vive dentro de val-page-wrapper. `ActivatedRoute` se * inyecta `{ optional: true }` solo para leer el route data de config (no-op * embebido). Auto-registra sus defaults i18n (es/en) si el consumer no proveyó el * namespace (default `Settings.Organization`). */ export declare class OrganizationViewComponent { private nav; private i18n; readonly auth: AuthService; private orgService; private toast; private errors; private modalService; private firestore; private confirmDialog; private route; readonly isDebug: boolean; /** * Config vía @Input (object-first). Si no se pasa, se cae al route data * `organizationConfig` (poblado por `provideValtechOrganizationRoutes`). * `resolvedConfig` mergea con los defaults — `@Input` gana sobre route data. */ config?: OrganizationViewConfig; readonly resolvedConfig: import("@angular/core").Signal> & Pick>; /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */ private get ns(); readonly org: import("@angular/core").WritableSignal; /** Logo de org que falló al cargar → oculta el bloque (cae a la card sin logo). */ readonly logoFailed: import("@angular/core").WritableSignal; readonly loading: import("@angular/core").WritableSignal; readonly leaving: import("@angular/core").WritableSignal; readonly permissionsOpen: import("@angular/core").WritableSignal; private readonly orgLoadError; readonly orgErrorState: import("@angular/core").Signal; readonly members: import("@angular/core").WritableSignal; readonly membersLoading: import("@angular/core").WritableSignal; private readonly membersLoadError; readonly membersErrorState: import("@angular/core").Signal; readonly membersNextToken: import("@angular/core").WritableSignal; readonly loadingMoreMembers: import("@angular/core").WritableSignal; readonly showAllMembers: import("@angular/core").WritableSignal; readonly visibleMembers: import("@angular/core").Signal; readonly transferring: import("@angular/core").WritableSignal; readonly availableRoles: import("@angular/core").WritableSignal; readonly activeOrgId: import("@angular/core").Signal; readonly userId: import("@angular/core").Signal; readonly isOwner: import("@angular/core").Signal; readonly canEditOrg: import("@angular/core").Signal; readonly canManageMembers: import("@angular/core").Signal; readonly pageTitle: import("@angular/core").Signal; readonly pageDescription: import("@angular/core").Signal; readonly planLabel: import("@angular/core").Signal; readonly editButtonProps: import("@angular/core").Signal>; readonly leaveButtonProps: import("@angular/core").Signal>; readonly transferableMembers: import("@angular/core").Signal; readonly viewPermissionsButtonProps: import("@angular/core").Signal>; readonly transferButtonProps: import("@angular/core").Signal>; readonly openInviteButtonProps: import("@angular/core").Signal>; readonly openImportButtonProps: import("@angular/core").Signal>; readonly openApiKeysButtonProps: import("@angular/core").Signal>; /** Guarda para detectar el primer disparo del effect (evita doble carga). */ private lastLoadedOrgId; constructor(); onEdit(): void; onLeave(): Promise; onOpenInvite(): void; onOpenImport(): void; onOpenApiKeys(): void; onOrgInfo(): void; onApiKeysInfo(): void; onViewPermissions(): void; onOpenTransfer(): void; onTransfer(newOwnerId: string): Promise; private loadOrg; loadMembers(): Promise; loadMoreMembers(): void; private enrichWithProfiles; loadRoles(): void; roleLabel(roleIdOrName: string): string; private mergeRoleDisplayNames; onViewMember(member: MemberDetail): void; protected tt(key: string): string; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }