valtech-components 4.0.56 → 4.0.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/organisms/login/login.component.mjs +188 -24
- package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +62 -2
- package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +12 -6
- package/esm2022/lib/components/organisms/organization-view/types.mjs +1 -1
- package/esm2022/lib/services/auth/auth.service.mjs +20 -1
- package/esm2022/lib/services/auth/types.mjs +1 -1
- package/esm2022/lib/services/i18n/default-content.mjs +29 -1
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +305 -30
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/login/login.component.d.ts +17 -0
- package/lib/components/organisms/organization-view/organization-view.component.d.ts +12 -1
- package/lib/components/organisms/organization-view/types.d.ts +7 -0
- package/lib/services/auth/auth.service.d.ts +12 -1
- package/lib/services/auth/types.d.ts +28 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -47,6 +47,15 @@ export declare class LoginComponent implements OnInit, OnDestroy {
|
|
|
47
47
|
private _verifyFormSectionName;
|
|
48
48
|
private _mfaVerifyFormState;
|
|
49
49
|
private _mfaMethod;
|
|
50
|
+
/** Método MFA pendiente — expuesto al template para gatear el link de backup (solo TOTP). */
|
|
51
|
+
readonly mfaMethod: import("@angular/core").Signal<"EMAIL" | "SMS" | "TOTP">;
|
|
52
|
+
/** A: el user togglea a "código de respaldo" (8 chars alfanuméricos) cuando perdió el 2º factor. */
|
|
53
|
+
readonly mfaUseBackupCode: import("@angular/core").WritableSignal<boolean>;
|
|
54
|
+
isMFAResetModalOpen: boolean;
|
|
55
|
+
private _mfaResetStep;
|
|
56
|
+
readonly mfaResetStep: import("@angular/core").Signal<"confirm" | "request">;
|
|
57
|
+
private _mfaResetFormState;
|
|
58
|
+
private _mfaResetEmail;
|
|
50
59
|
private _forgotPasswordFormState;
|
|
51
60
|
private _resetPasswordFormState;
|
|
52
61
|
private _resetFormSectionName;
|
|
@@ -54,6 +63,8 @@ export declare class LoginComponent implements OnInit, OnDestroy {
|
|
|
54
63
|
readonly registerFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
55
64
|
readonly verifyFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
56
65
|
readonly mfaVerifyFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
66
|
+
readonly mfaResetRequestFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
67
|
+
readonly mfaResetConfirmFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
57
68
|
readonly forgotPasswordFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
58
69
|
readonly resetPasswordFormProps: import("@angular/core").Signal<FormMetadata>;
|
|
59
70
|
loginHandler(event: FormSubmit): void;
|
|
@@ -67,6 +78,12 @@ export declare class LoginComponent implements OnInit, OnDestroy {
|
|
|
67
78
|
resendCode(): void;
|
|
68
79
|
openMFAVerifyModal(): void;
|
|
69
80
|
closeMFAVerifyModal(): void;
|
|
81
|
+
/** A: alterna entre el código TOTP (6 díg) y un código de respaldo (8 chars). */
|
|
82
|
+
toggleMFABackupCode(): void;
|
|
83
|
+
openMFAResetModal(): void;
|
|
84
|
+
closeMFAResetModal(): void;
|
|
85
|
+
mfaResetRequestHandler(event: FormSubmit): void;
|
|
86
|
+
mfaResetConfirmHandler(event: FormSubmit): void;
|
|
70
87
|
verifyMFAHandler(event: FormSubmit): void;
|
|
71
88
|
onMFAVerifyDismissed(): void;
|
|
72
89
|
openForgotPasswordModal(): void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EmptyStateMetadata } from '../../molecules/empty-state/types';
|
|
2
2
|
import { ButtonMetadata } from '../../types';
|
|
3
|
+
import { ButtonGroupMetadata } from '../../molecules/button-group/types';
|
|
3
4
|
import { AuthService } from '../../../services/auth/auth.service';
|
|
4
5
|
import { OrgRole, Organization } from '../../../services/org/types';
|
|
5
6
|
import { MemberDetail } from '../member-detail-modal/types';
|
|
@@ -50,7 +51,7 @@ export declare class OrganizationViewComponent {
|
|
|
50
51
|
* `resolvedConfig` mergea con los defaults — `@Input` gana sobre route data.
|
|
51
52
|
*/
|
|
52
53
|
config?: OrganizationViewConfig;
|
|
53
|
-
readonly resolvedConfig: import("@angular/core").Signal<Required<Omit<OrganizationViewConfig, "onOrgEdited" | "onMemberInvited" | "onOwnershipTransferred" | "onLeftOrg" | "onOrgDeleted">> & Pick<OrganizationViewConfig, "onOrgEdited" | "onMemberInvited" | "onOwnershipTransferred" | "onLeftOrg" | "onOrgDeleted">>;
|
|
54
|
+
readonly resolvedConfig: import("@angular/core").Signal<Required<Omit<OrganizationViewConfig, "onOrgCreated" | "onOrgEdited" | "onMemberInvited" | "onOwnershipTransferred" | "onLeftOrg" | "onOrgDeleted">> & Pick<OrganizationViewConfig, "onOrgCreated" | "onOrgEdited" | "onMemberInvited" | "onOwnershipTransferred" | "onLeftOrg" | "onOrgDeleted">>;
|
|
54
55
|
/** Namespace i18n resuelto (capturado para llamadas no-reactivas). */
|
|
55
56
|
private get ns();
|
|
56
57
|
readonly org: import("@angular/core").WritableSignal<Organization>;
|
|
@@ -59,6 +60,7 @@ export declare class OrganizationViewComponent {
|
|
|
59
60
|
readonly loading: import("@angular/core").WritableSignal<boolean>;
|
|
60
61
|
readonly leaving: import("@angular/core").WritableSignal<boolean>;
|
|
61
62
|
readonly permissionsOpen: import("@angular/core").WritableSignal<boolean>;
|
|
63
|
+
readonly createOrgModalOpen: import("@angular/core").WritableSignal<boolean>;
|
|
62
64
|
private readonly orgLoadError;
|
|
63
65
|
readonly orgErrorState: import("@angular/core").Signal<EmptyStateMetadata>;
|
|
64
66
|
readonly members: import("@angular/core").WritableSignal<MemberDetail[]>;
|
|
@@ -89,12 +91,21 @@ export declare class OrganizationViewComponent {
|
|
|
89
91
|
readonly openImportButtonProps: import("@angular/core").Signal<Partial<ButtonMetadata>>;
|
|
90
92
|
readonly openApiKeysButtonProps: import("@angular/core").Signal<Partial<ButtonMetadata>>;
|
|
91
93
|
readonly deleteButtonProps: import("@angular/core").Signal<Partial<ButtonMetadata>>;
|
|
94
|
+
readonly newOrgCtaProps: import("@angular/core").Signal<{
|
|
95
|
+
title: string;
|
|
96
|
+
description: string;
|
|
97
|
+
padding: string;
|
|
98
|
+
borderRadius: string;
|
|
99
|
+
actions: ButtonGroupMetadata;
|
|
100
|
+
}>;
|
|
92
101
|
/** Guarda para detectar el primer disparo del effect (evita doble carga). */
|
|
93
102
|
private lastLoadedOrgId;
|
|
94
103
|
constructor();
|
|
95
104
|
onEdit(): void;
|
|
96
105
|
onLeave(): Promise<void>;
|
|
97
106
|
onDelete(): Promise<void>;
|
|
107
|
+
onNewOrg(): void;
|
|
108
|
+
onOrgCreated(newOrg: Organization): void;
|
|
98
109
|
onOpenInvite(): void;
|
|
99
110
|
onOpenImport(): void;
|
|
100
111
|
onOpenApiKeys(): void;
|
|
@@ -28,6 +28,11 @@ export interface OrganizationViewConfig {
|
|
|
28
28
|
* además permiso `users:*` (gating RBAC interno vía `*valHasPermission`).
|
|
29
29
|
*/
|
|
30
30
|
showInvite?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Muestra la CTA card "Nueva organización" que abre `val-create-org-modal`.
|
|
33
|
+
* Default `false` (opt-in).
|
|
34
|
+
*/
|
|
35
|
+
showNewOrgCta?: boolean;
|
|
31
36
|
/**
|
|
32
37
|
* Muestra la sección "Transferir propiedad". Default `true`. El render real exige
|
|
33
38
|
* además ser owner (gating RBAC interno vía `isOwner()`).
|
|
@@ -71,4 +76,6 @@ export interface OrganizationViewConfig {
|
|
|
71
76
|
onLeftOrg?: () => void;
|
|
72
77
|
/** Hook tras eliminar la organización. */
|
|
73
78
|
onOrgDeleted?: () => void;
|
|
79
|
+
/** Hook tras crear una nueva organización desde esta vista. */
|
|
80
|
+
onOrgCreated?: (org: import('../../../services/org/types').Organization) => void;
|
|
74
81
|
}
|
|
@@ -6,7 +6,7 @@ import { AuthStateService } from './auth-state.service';
|
|
|
6
6
|
import { TokenService } from './token.service';
|
|
7
7
|
import { AuthStorageService } from './storage.service';
|
|
8
8
|
import { AuthSyncService } from './sync.service';
|
|
9
|
-
import { SigninRequest, SigninResponse, SignupRequest, SignupResponse, VerifyEmailRequest, VerifyEmailResponse, ResendCodeRequest, ResendCodeResponse, MFAVerifyResponse, RefreshResponse, GetPermissionsResponse, GetProfileResponse, UpdateProfileRequest, UpdateProfileResponse, MFASetupResponse, MFAConfirmResponse, MFADisableRequest, MFADisableResponse, ForgotPasswordRequest, ForgotPasswordResponse, ResetPasswordRequest, ResetPasswordResponse, ActivateAccountRequest, ActivateAccountResponse, ChangePasswordResponse, DeleteAccountResponse, SendDeleteAccountCodeResponse, SwitchOrgResponse, MFAMethod, AuthError, ValtechAuthConfig, EnableNotificationsResult, NotificationPermissionState, RegisterDeviceResult, TOTPSetupResponse, TOTPVerifySetupResponse, TOTPDisableResponse, RegenerateBackupCodesResponse, BackupCodesCountResponse, OAuthProvider, LinkedProvider, HasPasswordResponse, UpdateHandleResponse, CheckHandleResponse, UpdateAvatarRequest, UpdateAvatarResponse, InitiateEmailChangeResponse, ConfirmEmailChangeStep1Response, ConfirmEmailChangeStep2Response } from './types';
|
|
9
|
+
import { SigninRequest, SigninResponse, SignupRequest, SignupResponse, VerifyEmailRequest, VerifyEmailResponse, ResendCodeRequest, ResendCodeResponse, MFAVerifyResponse, RefreshResponse, GetPermissionsResponse, GetProfileResponse, UpdateProfileRequest, UpdateProfileResponse, MFASetupResponse, MFAConfirmResponse, MFADisableRequest, MFADisableResponse, ForgotPasswordRequest, ForgotPasswordResponse, ResetPasswordRequest, ResetPasswordResponse, MFAResetRequestRequest, MFAResetRequestResponse, MFAResetConfirmRequest, MFAResetConfirmResponse, ActivateAccountRequest, ActivateAccountResponse, ChangePasswordResponse, DeleteAccountResponse, SendDeleteAccountCodeResponse, SwitchOrgResponse, MFAMethod, AuthError, ValtechAuthConfig, EnableNotificationsResult, NotificationPermissionState, RegisterDeviceResult, TOTPSetupResponse, TOTPVerifySetupResponse, TOTPDisableResponse, RegenerateBackupCodesResponse, BackupCodesCountResponse, OAuthProvider, LinkedProvider, HasPasswordResponse, UpdateHandleResponse, CheckHandleResponse, UpdateAvatarRequest, UpdateAvatarResponse, InitiateEmailChangeResponse, ConfirmEmailChangeStep1Response, ConfirmEmailChangeStep2Response } from './types';
|
|
10
10
|
import { OAuthService } from './oauth.service';
|
|
11
11
|
import { FirebaseService, MessagingService } from '../firebase';
|
|
12
12
|
import { I18nService } from '../i18n';
|
|
@@ -288,6 +288,17 @@ export declare class AuthService implements OnDestroy {
|
|
|
288
288
|
* Resetea la contraseña usando el código enviado por email.
|
|
289
289
|
*/
|
|
290
290
|
resetPassword(request: ResetPasswordRequest): Observable<ResetPasswordResponse>;
|
|
291
|
+
/**
|
|
292
|
+
* Inicia el reset de MFA por email cuando el user perdió su 2º factor
|
|
293
|
+
* (TOTP + backup codes). Envía un código de 6 dígitos al email verificado.
|
|
294
|
+
* Response siempre genérica (anti-enumeración).
|
|
295
|
+
*/
|
|
296
|
+
requestMFAReset(request: MFAResetRequestRequest): Observable<MFAResetRequestResponse>;
|
|
297
|
+
/**
|
|
298
|
+
* Confirma el reset de MFA con el código recibido por email → deshabilita MFA.
|
|
299
|
+
* Tras esto el user inicia sesión normalmente (sin 2º factor) y re-enrola.
|
|
300
|
+
*/
|
|
301
|
+
confirmMFAReset(request: MFAResetConfirmRequest): Observable<MFAResetConfirmResponse>;
|
|
291
302
|
/**
|
|
292
303
|
* Activa una cuenta pre-aprovisionada por una organización (ADR-023): define
|
|
293
304
|
* la contraseña con el token del enlace de email. En éxito el backend devuelve
|
|
@@ -450,6 +450,34 @@ export interface ResetPasswordResponse {
|
|
|
450
450
|
operationId: string;
|
|
451
451
|
success: boolean;
|
|
452
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* Request para iniciar reset de MFA por email (user perdió su 2º factor).
|
|
455
|
+
*/
|
|
456
|
+
export interface MFAResetRequestRequest {
|
|
457
|
+
email: string;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Response de MFA reset request (siempre igual por seguridad — anti-enumeración).
|
|
461
|
+
*/
|
|
462
|
+
export interface MFAResetRequestResponse {
|
|
463
|
+
operationId: string;
|
|
464
|
+
message: string;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Request para confirmar el reset de MFA con el código recibido por email.
|
|
468
|
+
*/
|
|
469
|
+
export interface MFAResetConfirmRequest {
|
|
470
|
+
email: string;
|
|
471
|
+
code: string;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Response de MFA reset confirm.
|
|
475
|
+
*/
|
|
476
|
+
export interface MFAResetConfirmResponse {
|
|
477
|
+
operationId: string;
|
|
478
|
+
success: boolean;
|
|
479
|
+
message: string;
|
|
480
|
+
}
|
|
453
481
|
/**
|
|
454
482
|
* Request para cambiar contraseña (usuario autenticado).
|
|
455
483
|
*/
|
package/lib/version.d.ts
CHANGED