@ramonbsales/noah-angular 1.0.0 → 1.1.1

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.
@@ -0,0 +1,754 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnInit, OnChanges, EventEmitter, SimpleChanges, Injector, OnDestroy, InjectionToken } from '@angular/core';
3
+ import { ControlValueAccessor, NgControl, FormControl, FormGroup } from '@angular/forms';
4
+ import * as rxjs from 'rxjs';
5
+ import { Observable } from 'rxjs';
6
+ import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
7
+
8
+ declare class SharedComponentsService {
9
+ constructor();
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<SharedComponentsService, never>;
11
+ static ɵprov: i0.ɵɵInjectableDeclaration<SharedComponentsService>;
12
+ }
13
+
14
+ declare class SharedComponentsComponent {
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<SharedComponentsComponent, never>;
16
+ static ɵcmp: i0.ɵɵComponentDeclaration<SharedComponentsComponent, "lib-shared-components", never, {}, {}, never, never, true, never>;
17
+ }
18
+
19
+ declare class DropdownComponent implements OnInit, OnChanges, ControlValueAccessor {
20
+ label: string;
21
+ placeholder: string;
22
+ options: {
23
+ value: any;
24
+ label: any;
25
+ }[];
26
+ disabled: boolean;
27
+ required: boolean;
28
+ errorMessage: string;
29
+ selectedOption: any;
30
+ hideLabel: boolean;
31
+ valueChange: EventEmitter<any>;
32
+ private internalValue;
33
+ isOpen: boolean;
34
+ private onChange;
35
+ private onTouched;
36
+ constructor();
37
+ ngOnInit(): void;
38
+ ngOnChanges(changes: SimpleChanges): void;
39
+ selectOption(option: {
40
+ value: any;
41
+ label: any;
42
+ }): void;
43
+ toggleDropdown(): void;
44
+ getSelectedLabel(): string;
45
+ hasValue(): boolean;
46
+ writeValue(value: any): void;
47
+ registerOnChange(fn: (value: any) => void): void;
48
+ registerOnTouched(fn: () => void): void;
49
+ setDisabledState(isDisabled: boolean): void;
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<DropdownComponent, never>;
51
+ static ɵcmp: i0.ɵɵComponentDeclaration<DropdownComponent, "lib-dropdown", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "options": { "alias": "options"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; "errorMessage": { "alias": "errorMessage"; "required": false; }; "selectedOption": { "alias": "selectedOption"; "required": false; }; "hideLabel": { "alias": "hideLabel"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
52
+ }
53
+
54
+ type InputType = 'text' | 'number' | 'date' | 'email' | 'password';
55
+ declare class InputComponent implements OnInit, ControlValueAccessor {
56
+ private injector;
57
+ label: string;
58
+ placeholder: string;
59
+ type: InputType;
60
+ customErrorMessages: {
61
+ [key: string]: string;
62
+ };
63
+ get isRequired(): boolean;
64
+ get isDisabled(): boolean;
65
+ value: any;
66
+ isFocused: boolean;
67
+ control?: NgControl;
68
+ private onChange;
69
+ private onTouched;
70
+ private defaultErrorMessages;
71
+ constructor(injector: Injector);
72
+ ngOnInit(): void;
73
+ onFocus(): void;
74
+ onBlur(): void;
75
+ onInput(event: Event): void;
76
+ get showError(): boolean;
77
+ get showRequiredAsterisk(): boolean;
78
+ get errorMessage(): string;
79
+ private interpolateErrorMessage;
80
+ private validateField;
81
+ hasValue(): boolean;
82
+ writeValue(value: any): void;
83
+ registerOnChange(fn: (value: any) => void): void;
84
+ registerOnTouched(fn: () => void): void;
85
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, never>;
86
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "lib-input", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "type": { "alias": "type"; "required": false; }; "customErrorMessages": { "alias": "customErrorMessages"; "required": false; }; }, {}, never, never, true, never>;
87
+ }
88
+
89
+ declare class ButtonComponent {
90
+ title: string;
91
+ backgroundColor: string;
92
+ color: string;
93
+ borderColor: string;
94
+ minWidth: string;
95
+ disabled: boolean;
96
+ loading: boolean;
97
+ loadingText: string;
98
+ onClickEvent: EventEmitter<void>;
99
+ onClick(): void;
100
+ static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, never>;
101
+ static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "lib-button", never, { "title": { "alias": "title"; "required": false; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; }; "color": { "alias": "color"; "required": false; }; "borderColor": { "alias": "borderColor"; "required": false; }; "minWidth": { "alias": "minWidth"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "loadingText": { "alias": "loadingText"; "required": false; }; }, { "onClickEvent": "onClickEvent"; }, never, never, true, never>;
102
+ }
103
+
104
+ declare class CheckboxComponent {
105
+ /** Array de opções: [{ label: string, value: any }] */
106
+ options: Array<{
107
+ label: string;
108
+ value: any;
109
+ }>;
110
+ /** Se true, permite múltipla seleção */
111
+ multiple: boolean;
112
+ /** FormControl do Reactive Forms */
113
+ control?: FormControl;
114
+ /** Emite valor selecionado ao pai (opcional) */
115
+ selectedChange: EventEmitter<any>;
116
+ get disabled(): boolean;
117
+ get selected(): any[] | any;
118
+ isChecked(value: any): boolean;
119
+ onOptionChange(event: Event, value: any): void;
120
+ get showError(): boolean;
121
+ get errorMessage(): string | null;
122
+ static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxComponent, never>;
123
+ static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxComponent, "lib-checkbox", never, { "options": { "alias": "options"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "control": { "alias": "control"; "required": false; }; }, { "selectedChange": "selectedChange"; }, never, never, true, never>;
124
+ }
125
+
126
+ declare class ToggleComponent implements ControlValueAccessor {
127
+ title: string;
128
+ enableTitle: boolean;
129
+ value: boolean;
130
+ onChange: (value: boolean) => void;
131
+ onTouched: () => void;
132
+ writeValue(value: boolean): void;
133
+ registerOnChange(fn: any): void;
134
+ registerOnTouched(fn: any): void;
135
+ toggle(): void;
136
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToggleComponent, never>;
137
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToggleComponent, "lib-toggle", never, { "title": { "alias": "title"; "required": false; }; "enableTitle": { "alias": "enableTitle"; "required": false; }; }, {}, never, never, true, never>;
138
+ }
139
+
140
+ declare class BreadcrumbComponent {
141
+ items: Array<{
142
+ label: string;
143
+ url?: string;
144
+ }>;
145
+ static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbComponent, never>;
146
+ static ɵcmp: i0.ɵɵComponentDeclaration<BreadcrumbComponent, "lib-breadcrumb", never, { "items": { "alias": "items"; "required": false; }; }, {}, never, never, true, never>;
147
+ }
148
+
149
+ interface TableAction {
150
+ title: string;
151
+ callback: (row: any) => void;
152
+ icon?: string;
153
+ }
154
+ interface TableColumn {
155
+ title: string;
156
+ prop: string;
157
+ sortable?: boolean;
158
+ width?: string;
159
+ actions?: TableAction[];
160
+ }
161
+ declare class TableComponent {
162
+ columns: TableColumn[];
163
+ data: any[];
164
+ columnTypes: {
165
+ [key: string]: 'string' | 'date' | 'time' | 'tag';
166
+ };
167
+ page: number;
168
+ pageSize: number;
169
+ totalItems: number;
170
+ pageSizeOptions: {
171
+ value: number;
172
+ label: string;
173
+ }[];
174
+ pageChange: EventEmitter<number>;
175
+ pageSizeChange: EventEmitter<number>;
176
+ get hasActions(): boolean;
177
+ get actionsList(): TableAction[];
178
+ onPageSizeChange(newSize: number): void;
179
+ get totalPages(): number;
180
+ get currentPage(): number;
181
+ goToPage(page: number): void;
182
+ getPages(): (number | string)[];
183
+ toNumber(val: any): number;
184
+ static ɵfac: i0.ɵɵFactoryDeclaration<TableComponent, never>;
185
+ static ɵcmp: i0.ɵɵComponentDeclaration<TableComponent, "lib-table", never, { "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "columnTypes": { "alias": "columnTypes"; "required": false; }; "page": { "alias": "page"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "totalItems": { "alias": "totalItems"; "required": false; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, never>;
186
+ }
187
+
188
+ /**
189
+ * Interface para itens do menu lateral
190
+ */
191
+ interface SidebarMenuItem {
192
+ id: string;
193
+ label: string;
194
+ icon: string;
195
+ route?: string;
196
+ action?: () => void;
197
+ children?: SidebarMenuItem[];
198
+ isExpanded?: boolean;
199
+ isActive?: boolean;
200
+ disabled?: boolean;
201
+ badge?: string | number;
202
+ divider?: boolean;
203
+ }
204
+ /**
205
+ * Configurações do sidebar
206
+ */
207
+ interface SidebarConfig {
208
+ width?: string;
209
+ collapsedWidth?: string;
210
+ position?: 'left' | 'right';
211
+ collapsible?: boolean;
212
+ autoCollapse?: boolean;
213
+ overlay?: boolean;
214
+ logo?: {
215
+ src: string;
216
+ alt: string;
217
+ route?: string;
218
+ };
219
+ theme?: 'light' | 'dark';
220
+ customCssClass?: string;
221
+ }
222
+ /**
223
+ * Estado do sidebar
224
+ */
225
+ interface SidebarState {
226
+ isCollapsed: boolean;
227
+ isMobile: boolean;
228
+ isOverlayOpen: boolean;
229
+ activeItemId?: string;
230
+ }
231
+ /**
232
+ * Eventos emitidos pelo sidebar
233
+ */
234
+ interface SidebarEvents {
235
+ itemClick: SidebarMenuItem;
236
+ toggle: boolean;
237
+ overlayToggle: boolean;
238
+ logoClick: void;
239
+ }
240
+
241
+ declare class SidebarComponent implements OnInit, OnDestroy {
242
+ private destroy$;
243
+ private router;
244
+ config: Partial<SidebarConfig>;
245
+ menuItems: SidebarMenuItem[];
246
+ isCollapsed: boolean;
247
+ itemClick: EventEmitter<SidebarMenuItem>;
248
+ toggle: EventEmitter<boolean>;
249
+ overlayToggle: EventEmitter<boolean>;
250
+ logoClick: EventEmitter<void>;
251
+ private state$;
252
+ defaultConfig: Required<SidebarConfig>;
253
+ get currentState(): SidebarState;
254
+ get finalConfig(): Required<SidebarConfig>;
255
+ get sidebarWidth(): string;
256
+ ngOnInit(): void;
257
+ ngOnDestroy(): void;
258
+ /**
259
+ * Detecta mudanças de tela
260
+ */
261
+ onResize(event: any): void;
262
+ /**
263
+ * Inicializa o estado do sidebar
264
+ */
265
+ private initializeState;
266
+ /**
267
+ * Verifica se está em modo mobile
268
+ */
269
+ private checkMobileState;
270
+ /**
271
+ * Detecta rota ativa
272
+ */
273
+ private detectActiveRoute;
274
+ /**
275
+ * Encontra item ativo baseado na URL
276
+ */
277
+ private findActiveItem;
278
+ /**
279
+ * Atualiza o estado
280
+ */
281
+ private updateState;
282
+ /**
283
+ * Toggle do sidebar
284
+ */
285
+ toggleSidebar(): void;
286
+ /**
287
+ * Toggle do overlay (mobile)
288
+ */
289
+ toggleOverlay(): void;
290
+ /**
291
+ * Clique no item do menu
292
+ */
293
+ onItemClick(item: SidebarMenuItem, event: Event): void;
294
+ /**
295
+ * Toggle expansão de item com filhos
296
+ */
297
+ toggleItemExpansion(item: SidebarMenuItem): void;
298
+ /**
299
+ * Clique no logo
300
+ */
301
+ onLogoClick(): void;
302
+ /**
303
+ * Fecha overlay ao clicar fora (mobile)
304
+ */
305
+ closeOverlay(): void;
306
+ /**
307
+ * Verifica se item está ativo
308
+ */
309
+ isItemActive(item: SidebarMenuItem): boolean;
310
+ /**
311
+ * Verifica se item tem filhos ativos
312
+ */
313
+ hasActiveChild(item: SidebarMenuItem): boolean;
314
+ /**
315
+ * TrackBy function para performance
316
+ */
317
+ trackByItemId(index: number, item: SidebarMenuItem): string;
318
+ static ɵfac: i0.ɵɵFactoryDeclaration<SidebarComponent, never>;
319
+ static ɵcmp: i0.ɵɵComponentDeclaration<SidebarComponent, "lib-sidebar", never, { "config": { "alias": "config"; "required": false; }; "menuItems": { "alias": "menuItems"; "required": false; }; "isCollapsed": { "alias": "isCollapsed"; "required": false; }; }, { "itemClick": "itemClick"; "toggle": "toggle"; "overlayToggle": "overlayToggle"; "logoClick": "logoClick"; }, never, ["[slot=footer]"], true, never>;
320
+ }
321
+
322
+ /**
323
+ * Tipos e interfaces para autenticação
324
+ */
325
+ interface LoginCredentials {
326
+ email: string;
327
+ password: string;
328
+ }
329
+ interface LoginResponse {
330
+ success: boolean;
331
+ accessToken?: string;
332
+ user?: UserInfo;
333
+ expiresIn?: number;
334
+ message?: string;
335
+ errors?: string[];
336
+ }
337
+ interface UserInfo {
338
+ id: string;
339
+ nome: string;
340
+ email: string;
341
+ perfil: string;
342
+ permissoes: string[];
343
+ avatar?: string;
344
+ lastLogin?: Date;
345
+ }
346
+ interface LogoutResponse {
347
+ success: boolean;
348
+ message?: string;
349
+ }
350
+ interface RefreshTokenResponse {
351
+ success: boolean;
352
+ accessToken?: string;
353
+ expiresIn?: number;
354
+ message?: string;
355
+ }
356
+ /**
357
+ * Estados do processo de login
358
+ */
359
+ declare enum LoginStatus {
360
+ IDLE = "IDLE",
361
+ LOADING = "LOADING",
362
+ SUCCESS = "SUCCESS",
363
+ ERROR = "ERROR"
364
+ }
365
+ /**
366
+ * Configurações opcionais para o login
367
+ */
368
+ interface LoginOptions {
369
+ title?: string;
370
+ subtitle?: string;
371
+ logoUrl?: string;
372
+ backgroundUrl?: string;
373
+ footerText?: string;
374
+ redirectUrl?: string;
375
+ showForgotPassword?: boolean;
376
+ showRegisterLink?: boolean;
377
+ passwordMinLength?: number;
378
+ links?: {
379
+ forgotPassword?: string;
380
+ register?: string;
381
+ termsOfService?: string;
382
+ privacyPolicy?: string;
383
+ };
384
+ theme?: 'light' | 'dark' | 'auto';
385
+ primaryColor?: string;
386
+ }
387
+ /**
388
+ * Interface que a aplicação deve implementar para comunicação com o backend
389
+ */
390
+ interface AuthProvider {
391
+ /**
392
+ * Realiza login no backend
393
+ */
394
+ login(credentials: LoginCredentials): Promise<LoginResponse>;
395
+ /**
396
+ * Realiza logout no backend
397
+ */
398
+ logout(): Promise<LogoutResponse>;
399
+ /**
400
+ * Renova o access token (opcional - se não implementado, usa apenas frontend)
401
+ */
402
+ refreshToken?(): Promise<RefreshTokenResponse>;
403
+ /**
404
+ * Verifica se o token ainda é válido no backend (opcional)
405
+ */
406
+ validateToken?(token: string): Promise<boolean>;
407
+ }
408
+ /**
409
+ * Dados de erro de validação de formulário
410
+ */
411
+ interface LoginValidationErrors {
412
+ email?: string[];
413
+ password?: string[];
414
+ general?: string[];
415
+ }
416
+ /**
417
+ * Estado completo do login para uso reativo
418
+ */
419
+ interface LoginState {
420
+ status: LoginStatus;
421
+ user: UserInfo | null;
422
+ isAuthenticated: boolean;
423
+ errors: LoginValidationErrors;
424
+ lastAttempt: Date | null;
425
+ }
426
+
427
+ type StorageType = 'localStorage' | 'sessionStorage';
428
+ interface StorageOptions {
429
+ encrypt?: boolean;
430
+ compress?: boolean;
431
+ }
432
+ declare class LocalStorageService {
433
+ private storageAvailable;
434
+ get storageAvailable$(): Observable<boolean>;
435
+ /**
436
+ * Salva item no storage com validação básica
437
+ */
438
+ setItem<T>(key: string, value: T, storageType?: StorageType, options?: StorageOptions): Promise<boolean>;
439
+ /**
440
+ * Recupera item do storage com tipo seguro
441
+ */
442
+ getItem<T>(key: string, storageType?: StorageType, options?: StorageOptions): Promise<T | null>;
443
+ /**
444
+ * Remove item específico
445
+ */
446
+ removeItem(key: string, storageType?: StorageType): boolean;
447
+ /**
448
+ * Limpa todo o storage
449
+ */
450
+ clear(storageType?: StorageType): boolean;
451
+ /**
452
+ * Verifica se item existe
453
+ */
454
+ hasItem(key: string, storageType?: StorageType): boolean;
455
+ /**
456
+ * Salva item com expiração
457
+ */
458
+ setItemWithExpiry<T>(key: string, value: T, expiryInMinutes: number, storageType?: StorageType): Promise<boolean>;
459
+ /**
460
+ * Recupera item com verificação de expiração
461
+ */
462
+ getItemWithExpiry<T>(key: string, storageType?: StorageType): Promise<T | null>;
463
+ /**
464
+ * Obtém todas as chaves do storage
465
+ */
466
+ getAllKeys(storageType?: StorageType): string[];
467
+ /**
468
+ * Obtém tamanho ocupado do storage em bytes (aproximado)
469
+ */
470
+ getStorageSize(storageType?: StorageType): number;
471
+ /**
472
+ * Monitor de eventos de storage
473
+ */
474
+ monitorStorageEvents(): Observable<StorageEvent>;
475
+ /**
476
+ * Limpa itens expirados do storage
477
+ */
478
+ cleanExpiredItems(storageType?: StorageType): Promise<number>;
479
+ /**
480
+ * Backup de todos os dados do storage
481
+ */
482
+ backup(storageType?: StorageType): {
483
+ [key: string]: any;
484
+ };
485
+ /**
486
+ * Restaura backup para o storage
487
+ */
488
+ restore(backup: {
489
+ [key: string]: any;
490
+ }, storageType?: StorageType): boolean;
491
+ /**
492
+ * MÉTODOS PRIVADOS SIMPLIFICADOS
493
+ */
494
+ private isStorageAvailable;
495
+ private getStorage;
496
+ private sanitizeKey;
497
+ private validateKey;
498
+ private safeJsonStringify;
499
+ private safeJsonParse;
500
+ private encryptData;
501
+ private decryptData;
502
+ private validateStorageEvent;
503
+ private lastEventTime;
504
+ static ɵfac: i0.ɵɵFactoryDeclaration<LocalStorageService, never>;
505
+ static ɵprov: i0.ɵɵInjectableDeclaration<LocalStorageService>;
506
+ }
507
+
508
+ declare class AuthStorageService {
509
+ private storage;
510
+ private readonly TOKEN_KEY;
511
+ private readonly USER_DATA_KEY;
512
+ private isAuthenticated$;
513
+ get authState$(): Observable<boolean>;
514
+ constructor(storage: LocalStorageService);
515
+ private initAuthState;
516
+ /**
517
+ * Salva Access Token COM CRIPTOGRAFIA (backend fará todas as validações)
518
+ */
519
+ setToken(token: string, expiryInMinutes?: number): Promise<boolean>;
520
+ /**
521
+ * Recupera Access Token COM DESCRIPTOGRAFIA e validação de expiração
522
+ */
523
+ getToken(): Promise<string | null>;
524
+ /**
525
+ * Salva dados do usuário COM CRIPTOGRAFIA e validação básica
526
+ */
527
+ setUserData(userData: any): Promise<boolean>;
528
+ /**
529
+ * Recupera dados do usuário COM DESCRIPTOGRAFIA
530
+ */
531
+ getUserData<T = any>(): Promise<T | null>;
532
+ /**
533
+ * Verifica apenas se possui token (backend validará se é válido)
534
+ */
535
+ hasToken(): Promise<boolean>;
536
+ /**
537
+ * Verifica se está "aparentemente" autenticado (token existe)
538
+ */
539
+ isAuthenticated(): Promise<boolean>;
540
+ /**
541
+ * Limpa APENAS dados do cliente (não afeta refresh token no servidor)
542
+ */
543
+ clearAuthData(): void;
544
+ /**
545
+ * Decodifica payload do JWT (SEM validação - apenas para UI)
546
+ * IMPORTANTE: Use apenas para exibição, nunca para lógica de segurança
547
+ *
548
+ * ⚠️ ATENÇÃO: Agora requer token como parâmetro ou uso assíncrono
549
+ */
550
+ decodeTokenPayload(token?: string): any;
551
+ /**
552
+ * Versão síncrona DESATUALIZADA (tokens agora são criptografados)
553
+ * ⚠️ AVISO: Esta versão não funciona mais com tokens criptografados
554
+ * Use getToken() async para acessar tokens de forma segura
555
+ */
556
+ private getTokenSync;
557
+ /**
558
+ * Verifica se token está próximo de expirar (para UI)
559
+ * ⚠️ ATENÇÃO: Agora é assíncrono devido à criptografia
560
+ */
561
+ isTokenExpiringSoon(minutesThreshold?: number): Promise<boolean>;
562
+ /**
563
+ * Método utilitário: Obtém e decodifica token em uma operação
564
+ * Ideal para componentes que precisam dos dados do token para UI
565
+ */
566
+ getDecodedTokenData(): Promise<any>;
567
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthStorageService, never>;
568
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthStorageService>;
569
+ }
570
+
571
+ /**
572
+ * Token de injeção para o AuthProvider
573
+ */
574
+ declare const AUTH_PROVIDER: InjectionToken<AuthProvider>;
575
+ declare class LoginService {
576
+ private authStorage;
577
+ private authProvider?;
578
+ private readonly DEFAULT_OPTIONS;
579
+ private loginState$;
580
+ private currentOptions;
581
+ constructor(authStorage: AuthStorageService, authProvider?: AuthProvider | undefined);
582
+ /**
583
+ * Observable do estado completo do login
584
+ */
585
+ get state$(): Observable<LoginState>;
586
+ /**
587
+ * Observable apenas do status de loading
588
+ */
589
+ get isLoading$(): Observable<boolean>;
590
+ /**
591
+ * Observable apenas do status de autenticação
592
+ */
593
+ get isAuthenticated$(): Observable<boolean>;
594
+ /**
595
+ * Observable apenas dos erros
596
+ */
597
+ get errors$(): Observable<LoginValidationErrors>;
598
+ /**
599
+ * Observable do usuário atual
600
+ */
601
+ get currentUser$(): Observable<UserInfo | null>;
602
+ /**
603
+ * Configura opções do serviço de login
604
+ */
605
+ configure(options: Partial<LoginOptions>): void;
606
+ /**
607
+ * Realiza login com as credenciais fornecidas
608
+ */
609
+ login(credentials: LoginCredentials): Promise<LoginResponse>;
610
+ /**
611
+ * Realiza logout
612
+ */
613
+ logout(): Promise<LogoutResponse>;
614
+ /**
615
+ * Verifica se o usuário atual está autenticado
616
+ */
617
+ checkAuthenticationStatus(): Promise<boolean>;
618
+ /**
619
+ * Obtém informações do usuário atual
620
+ */
621
+ getCurrentUser(): Promise<UserInfo | null>;
622
+ /**
623
+ * Verifica se token está expirando em breve
624
+ * ⚠️ ATENÇÃO: Agora é assíncrono devido à criptografia
625
+ */
626
+ isTokenExpiringSoon(minutesThreshold?: number): Promise<boolean>;
627
+ /**
628
+ * Limpa erros do estado atual
629
+ */
630
+ clearErrors(): void;
631
+ /**
632
+ * Reseta estado do login
633
+ */
634
+ resetLoginState(): Promise<void>;
635
+ /**
636
+ * Inicializa o serviço
637
+ */
638
+ private initializeService;
639
+ /**
640
+ * Atualiza estado reativo
641
+ */
642
+ private updateState;
643
+ /**
644
+ * Valida credenciais do formulário
645
+ */
646
+ private validateCredentials;
647
+ /**
648
+ * Trata login bem-sucedido
649
+ */
650
+ private handleSuccessfulLogin;
651
+ /**
652
+ * Trata falha de login
653
+ */
654
+ private handleFailedLogin;
655
+ /**
656
+ * Simula resposta de login para desenvolvimento/demo
657
+ */
658
+ private simulateLogin;
659
+ static ɵfac: i0.ɵɵFactoryDeclaration<LoginService, [null, { optional: true; }]>;
660
+ static ɵprov: i0.ɵɵInjectableDeclaration<LoginService>;
661
+ }
662
+
663
+ declare class LoginComponent implements OnInit, OnDestroy {
664
+ private loginService;
665
+ private destroy$;
666
+ private fb;
667
+ options: Partial<LoginOptions>;
668
+ showHeader: boolean;
669
+ showFooter: boolean;
670
+ logoUrl?: string;
671
+ backgroundImageUrl?: string;
672
+ customCssClass?: string;
673
+ loginSuccess: EventEmitter<LoginResponse>;
674
+ loginError: EventEmitter<string>;
675
+ formChange: EventEmitter<LoginCredentials>;
676
+ loginForm: FormGroup;
677
+ loginState$: rxjs.Observable<LoginState>;
678
+ isLoading$: rxjs.Observable<boolean>;
679
+ errors$: rxjs.Observable<any>;
680
+ showPassword: boolean;
681
+ LoginStatus: typeof LoginStatus;
682
+ constructor(loginService: LoginService);
683
+ /**
684
+ * Inicializa os observables
685
+ */
686
+ private initializeObservables;
687
+ ngOnInit(): void;
688
+ ngOnDestroy(): void;
689
+ /**
690
+ * Cria o formulário reativo
691
+ */
692
+ private createForm;
693
+ /**
694
+ * Manipula mudanças de estado do login
695
+ */
696
+ private handleStateChange;
697
+ /**
698
+ * Submete o formulário de login
699
+ */
700
+ onSubmit(): Promise<void>;
701
+ /**
702
+ * Alterna visibilidade da senha
703
+ */
704
+ togglePasswordVisibility(): void;
705
+ /**
706
+ * Marca todos os campos como tocados para mostrar erros
707
+ */
708
+ private markFormGroupTouched;
709
+ /**
710
+ * Verifica se campo tem erro específico
711
+ */
712
+ hasFieldError(fieldName: string, errorType: string): boolean;
713
+ /**
714
+ * Obtém mensagem de erro do campo
715
+ */
716
+ getFieldErrorMessage(fieldName: string): string;
717
+ /**
718
+ * Obtém label do campo
719
+ */
720
+ private getFieldLabel;
721
+ /**
722
+ * Reseta o formulário
723
+ */
724
+ resetForm(): void;
725
+ /**
726
+ * Tenta fazer login com credenciais de demonstração
727
+ */
728
+ loginWithDemo(userType: 'admin' | 'professor' | 'aluno'): Promise<void>;
729
+ /**
730
+ * Manipula esqueci minha senha
731
+ */
732
+ onForgotPassword(): void;
733
+ /**
734
+ * Manipula criação de conta
735
+ */
736
+ onCreateAccount(): void;
737
+ static ɵfac: i0.ɵɵFactoryDeclaration<LoginComponent, never>;
738
+ static ɵcmp: i0.ɵɵComponentDeclaration<LoginComponent, "lib-login", never, { "options": { "alias": "options"; "required": false; }; "showHeader": { "alias": "showHeader"; "required": false; }; "showFooter": { "alias": "showFooter"; "required": false; }; "logoUrl": { "alias": "logoUrl"; "required": false; }; "backgroundImageUrl": { "alias": "backgroundImageUrl"; "required": false; }; "customCssClass": { "alias": "customCssClass"; "required": false; }; }, { "loginSuccess": "loginSuccess"; "loginError": "loginError"; "formChange": "formChange"; }, never, never, true, never>;
739
+ }
740
+
741
+ /**
742
+ * Interceptor HTTP para autenticação automática
743
+ * Adiciona o Access Token nas requisições e trata erros 401
744
+ */
745
+ declare class AuthInterceptor implements HttpInterceptor {
746
+ private authStorage;
747
+ constructor(authStorage: AuthStorageService);
748
+ intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
749
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthInterceptor, never>;
750
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthInterceptor>;
751
+ }
752
+
753
+ export { AUTH_PROVIDER, AuthInterceptor, AuthStorageService, BreadcrumbComponent, ButtonComponent, CheckboxComponent, DropdownComponent, InputComponent, LocalStorageService, LoginComponent, LoginService, LoginStatus, SharedComponentsComponent, SharedComponentsService, SidebarComponent, TableComponent, ToggleComponent };
754
+ export type { AuthProvider, InputType, LoginCredentials, LoginOptions, LoginResponse, LoginState, LoginValidationErrors, LogoutResponse, RefreshTokenResponse, SidebarConfig, SidebarEvents, SidebarMenuItem, SidebarState, StorageOptions, StorageType, TableAction, TableColumn, UserInfo };