@flusys/ng-auth 1.1.1-beta → 1.2.0-rc.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.
- package/README.md +90 -753
- package/fesm2022/flusys-ng-auth.mjs +6469 -4221
- package/fesm2022/flusys-ng-auth.mjs.map +1 -1
- package/package.json +11 -11
- package/types/flusys-ng-auth.d.ts +544 -905
|
@@ -1,26 +1,19 @@
|
|
|
1
|
-
import { IMessageResponse, ApiResourceService,
|
|
1
|
+
import { ISingleResponse, IMessageResponse, ApiResourceService, ICompanyApiProvider, IListResponse, ICompanyBasicInfo, IAuthStateProvider, IUserPermissionProvider, IUserBranchPermission as IUserBranchPermission$1, IUserProvider, IUserBasicInfo, ILogicNode, RouterTabItem, BaseFormComponent, IFormField, ITableAction, ITableColumn, IProfileRoleInfo, IProfileActionInfo } from '@flusys/ng-shared';
|
|
2
2
|
import * as rxjs from 'rxjs';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import * as _angular_core from '@angular/core';
|
|
5
|
-
import { Signal, Provider,
|
|
6
|
-
import { HttpClient, HttpRequest, HttpHandlerFn, HttpEvent } from '@angular/common/http';
|
|
5
|
+
import { Signal, Provider, InjectionToken, Type, TemplateRef, Injector } from '@angular/core';
|
|
7
6
|
import { CanActivateFn, Routes } from '@angular/router';
|
|
7
|
+
import { HttpRequest, HttpHandlerFn, HttpEvent } from '@angular/common/http';
|
|
8
8
|
import { ILayoutAuthApi, ICompanyInfo as ICompanyInfo$1, IBranchInfo as IBranchInfo$1, ILayoutAuthState, IUserInfo as IUserInfo$1 } from '@flusys/ng-layout';
|
|
9
9
|
import * as _angular_forms_signals from '@angular/forms/signals';
|
|
10
10
|
import * as _flusys_ng_auth from '@flusys/ng-auth';
|
|
11
11
|
import * as _flusys_ng_core from '@flusys/ng-core';
|
|
12
12
|
|
|
13
|
-
/**
|
|
14
|
-
* Login Request Interface
|
|
15
|
-
*/
|
|
16
13
|
interface ILoginRequest {
|
|
17
14
|
email: string;
|
|
18
15
|
password: string;
|
|
19
16
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Registration Request Interface
|
|
22
|
-
* Supports both simple registration and company-based registration
|
|
23
|
-
*/
|
|
24
17
|
interface IRegistrationRequest {
|
|
25
18
|
name: string;
|
|
26
19
|
email: string;
|
|
@@ -31,34 +24,21 @@ interface IRegistrationRequest {
|
|
|
31
24
|
newCompanyName?: string;
|
|
32
25
|
newCompanyPhone?: string;
|
|
33
26
|
newCompanyAddress?: string;
|
|
27
|
+
additionalFields?: Record<string, unknown>;
|
|
34
28
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Select Company & Branch Request Interface
|
|
37
|
-
* Used after login when user needs to select company and branch
|
|
38
|
-
*/
|
|
39
29
|
interface ISelectRequest {
|
|
40
30
|
sessionId: string;
|
|
41
31
|
companyId: string;
|
|
42
32
|
branchId: string;
|
|
43
33
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Switch Company Request Interface
|
|
46
|
-
* Used to switch company/branch after login
|
|
47
|
-
*/
|
|
48
34
|
interface ISwitchCompanyRequest {
|
|
49
35
|
companyId: string;
|
|
50
36
|
branchId: string;
|
|
51
37
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Change Password Request Interface
|
|
54
|
-
*/
|
|
55
38
|
interface IChangePasswordRequest {
|
|
56
39
|
currentPassword: string;
|
|
57
40
|
newPassword: string;
|
|
58
41
|
}
|
|
59
|
-
/**
|
|
60
|
-
* User Info Interface (used in responses)
|
|
61
|
-
*/
|
|
62
42
|
interface IUserInfo {
|
|
63
43
|
id: string;
|
|
64
44
|
email: string;
|
|
@@ -70,126 +50,76 @@ interface IUserInfo {
|
|
|
70
50
|
companyLogoId?: string;
|
|
71
51
|
branchLogoId?: string;
|
|
72
52
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Company Info Interface (used in responses)
|
|
75
|
-
*/
|
|
76
53
|
interface ICompanyInfo {
|
|
77
54
|
id: string;
|
|
78
55
|
name: string;
|
|
79
56
|
slug?: string;
|
|
80
57
|
logoId?: string | null;
|
|
81
58
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Branch Info Interface (used in responses)
|
|
84
|
-
*/
|
|
85
59
|
interface IBranchInfo {
|
|
86
60
|
id: string;
|
|
87
61
|
name: string;
|
|
88
62
|
slug?: string;
|
|
89
63
|
logoId?: string | null;
|
|
90
64
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Branch Selection Info Interface (with additional fields)
|
|
93
|
-
*/
|
|
94
65
|
interface IBranchSelectionInfo {
|
|
95
66
|
id: string;
|
|
96
67
|
name: string;
|
|
97
68
|
slug: string;
|
|
98
|
-
isActive: boolean;
|
|
99
69
|
logoId?: string | null;
|
|
100
70
|
}
|
|
101
|
-
/**
|
|
102
|
-
* Company with Branches Interface (for selection response)
|
|
103
|
-
*/
|
|
104
71
|
interface ICompanyWithBranches {
|
|
105
72
|
id: string;
|
|
106
73
|
name: string;
|
|
107
74
|
slug: string;
|
|
108
|
-
isActive: boolean;
|
|
109
75
|
logoId?: string | null;
|
|
110
76
|
branches: IBranchSelectionInfo[];
|
|
111
77
|
}
|
|
112
|
-
|
|
113
|
-
* Login Response Interface
|
|
114
|
-
* Returned on successful login with tokens
|
|
115
|
-
*/
|
|
116
|
-
interface ILoginResponse {
|
|
78
|
+
interface ILoginData {
|
|
117
79
|
accessToken: string;
|
|
118
|
-
refreshToken
|
|
80
|
+
refreshToken?: string;
|
|
119
81
|
user: IUserInfo;
|
|
120
82
|
company?: ICompanyInfo;
|
|
121
83
|
branch?: IBranchInfo;
|
|
122
|
-
companyFeatureEnabled?: boolean;
|
|
123
84
|
}
|
|
124
|
-
|
|
125
|
-
* Me Response Interface
|
|
126
|
-
* Returned by GET /auth/me endpoint
|
|
127
|
-
* Contains only user data, no tokens
|
|
128
|
-
*/
|
|
129
|
-
interface IMeResponse {
|
|
85
|
+
interface IMeData {
|
|
130
86
|
user: IUserInfo;
|
|
131
87
|
company?: ICompanyInfo;
|
|
132
88
|
branch?: IBranchInfo;
|
|
133
89
|
}
|
|
134
|
-
|
|
135
|
-
* Registration Response Interface
|
|
136
|
-
* Returned on successful registration
|
|
137
|
-
*/
|
|
138
|
-
interface IRegistrationResponse {
|
|
90
|
+
interface IRegistrationData {
|
|
139
91
|
accessToken?: string;
|
|
140
92
|
refreshToken?: string;
|
|
141
93
|
user: IUserInfo;
|
|
142
94
|
company?: ICompanyInfo;
|
|
143
95
|
branch?: IBranchInfo;
|
|
144
|
-
companyFeatureEnabled?: boolean;
|
|
145
96
|
requiresEmailVerification?: boolean;
|
|
146
97
|
}
|
|
147
|
-
|
|
148
|
-
* Company Selection Response Interface
|
|
149
|
-
* Returned when user has multiple companies/branches to choose from
|
|
150
|
-
*/
|
|
151
|
-
interface ICompanySelectionResponse {
|
|
98
|
+
interface ICompanySelectionData {
|
|
152
99
|
requiresSelection: true;
|
|
153
100
|
sessionId: string;
|
|
154
101
|
expiresAt: Date | string;
|
|
155
102
|
user: IUserInfo;
|
|
156
103
|
companies: ICompanyWithBranches[];
|
|
157
104
|
}
|
|
158
|
-
|
|
159
|
-
* Refresh Token Response Interface
|
|
160
|
-
*/
|
|
161
|
-
interface IRefreshTokenResponse {
|
|
162
|
-
accessToken: string;
|
|
163
|
-
refreshToken?: string;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Login Response when email verification required
|
|
167
|
-
*/
|
|
168
|
-
interface ILoginRequiresEmailVerification {
|
|
105
|
+
interface IEmailVerificationData {
|
|
169
106
|
requiresEmailVerification: true;
|
|
170
107
|
email: string;
|
|
171
|
-
message: string;
|
|
172
108
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
type
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
109
|
+
type ILoginResponse = ISingleResponse<ILoginData>;
|
|
110
|
+
type IMeResponse = ISingleResponse<IMeData>;
|
|
111
|
+
type IRegistrationResponse = ISingleResponse<IRegistrationData>;
|
|
112
|
+
type ICompanySelectionResponse = ISingleResponse<ICompanySelectionData>;
|
|
113
|
+
type ILoginRequiresEmailVerification = ISingleResponse<IEmailVerificationData>;
|
|
114
|
+
type IRefreshTokenResponse = ISingleResponse<{
|
|
115
|
+
accessToken: string;
|
|
116
|
+
refreshToken?: string;
|
|
117
|
+
}>;
|
|
118
|
+
type AuthResponse = ISingleResponse<ILoginData | ICompanySelectionData | IEmailVerificationData>;
|
|
180
119
|
declare function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification;
|
|
181
|
-
/**
|
|
182
|
-
* Type guard to check if response requires company selection
|
|
183
|
-
*/
|
|
184
120
|
declare function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse;
|
|
185
|
-
/**
|
|
186
|
-
* Type guard to check if response is a successful login
|
|
187
|
-
*/
|
|
188
121
|
declare function isLoginResponse(response: AuthResponse): response is ILoginResponse;
|
|
189
122
|
|
|
190
|
-
/**
|
|
191
|
-
* Create Company Branch Request Interface
|
|
192
|
-
*/
|
|
193
123
|
interface ICreateBranchRequest {
|
|
194
124
|
name: string;
|
|
195
125
|
slug: string;
|
|
@@ -203,15 +133,9 @@ interface ICreateBranchRequest {
|
|
|
203
133
|
isActive?: boolean;
|
|
204
134
|
additionalFields?: Record<string, unknown>;
|
|
205
135
|
}
|
|
206
|
-
/**
|
|
207
|
-
* Update Company Branch Request Interface
|
|
208
|
-
*/
|
|
209
136
|
interface IUpdateBranchRequest extends Partial<Omit<ICreateBranchRequest, 'companyId'>> {
|
|
210
137
|
id: string;
|
|
211
138
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Company Branch Response Interface
|
|
214
|
-
*/
|
|
215
139
|
interface IBranch {
|
|
216
140
|
id: string;
|
|
217
141
|
name: string;
|
|
@@ -230,9 +154,6 @@ interface IBranch {
|
|
|
230
154
|
updatedAt: Date | string;
|
|
231
155
|
}
|
|
232
156
|
|
|
233
|
-
/**
|
|
234
|
-
* Create Company Request Interface
|
|
235
|
-
*/
|
|
236
157
|
interface ICreateCompanyRequest {
|
|
237
158
|
name: string;
|
|
238
159
|
slug: string;
|
|
@@ -246,15 +167,9 @@ interface ICreateCompanyRequest {
|
|
|
246
167
|
settings?: Record<string, unknown>;
|
|
247
168
|
additionalFields?: Record<string, unknown>;
|
|
248
169
|
}
|
|
249
|
-
/**
|
|
250
|
-
* Update Company Request Interface
|
|
251
|
-
*/
|
|
252
170
|
interface IUpdateCompanyRequest extends Partial<ICreateCompanyRequest> {
|
|
253
171
|
id: string;
|
|
254
172
|
}
|
|
255
|
-
/**
|
|
256
|
-
* Company Response Interface
|
|
257
|
-
*/
|
|
258
173
|
interface ICompany {
|
|
259
174
|
id: string;
|
|
260
175
|
name: string;
|
|
@@ -273,88 +188,34 @@ interface ICompany {
|
|
|
273
188
|
updatedAt: Date | string;
|
|
274
189
|
}
|
|
275
190
|
|
|
276
|
-
/**
|
|
277
|
-
* Permission item for batch assignment/revocation
|
|
278
|
-
*/
|
|
279
191
|
interface IPermissionItem {
|
|
280
|
-
/** Target ID (Company ID or Branch ID) */
|
|
281
192
|
targetId: string;
|
|
282
|
-
/** Action: true to add permission, false to remove permission */
|
|
283
193
|
isAdd: boolean;
|
|
284
194
|
}
|
|
285
|
-
/**
|
|
286
|
-
* Batch assign/revoke user-company permissions request
|
|
287
|
-
*/
|
|
288
195
|
interface IAssignUserCompanyRequest {
|
|
289
|
-
/** User ID to assign/revoke permissions for */
|
|
290
196
|
userId: string;
|
|
291
|
-
/** List of company permissions to add or remove */
|
|
292
197
|
items: IPermissionItem[];
|
|
293
198
|
}
|
|
294
|
-
/**
|
|
295
|
-
* Batch assign/revoke user-branch permissions request
|
|
296
|
-
*/
|
|
297
199
|
interface IAssignUserBranchRequest {
|
|
298
|
-
/** User ID to assign/revoke permissions for */
|
|
299
200
|
userId: string;
|
|
300
|
-
/** List of branch permissions to add or remove */
|
|
301
201
|
items: IPermissionItem[];
|
|
302
202
|
}
|
|
303
|
-
/**
|
|
304
|
-
* User company permission with populated company details
|
|
305
|
-
*/
|
|
306
203
|
interface IUserCompanyPermission {
|
|
307
|
-
/** Permission ID */
|
|
308
204
|
id: string;
|
|
309
|
-
/** User ID */
|
|
310
205
|
userId: string;
|
|
311
|
-
/** Company ID */
|
|
312
206
|
companyId: string;
|
|
313
|
-
/** Company name */
|
|
314
207
|
companyName: string;
|
|
315
|
-
/** Company slug */
|
|
316
208
|
companySlug: string;
|
|
317
209
|
}
|
|
318
|
-
/**
|
|
319
|
-
* User branch permission with populated branch details
|
|
320
|
-
*/
|
|
321
210
|
interface IUserBranchPermission {
|
|
322
|
-
/** Permission ID */
|
|
323
211
|
id: string;
|
|
324
|
-
/** User ID */
|
|
325
212
|
userId: string;
|
|
326
|
-
/** Branch ID */
|
|
327
213
|
branchId: string;
|
|
328
|
-
/** Branch name */
|
|
329
214
|
branchName: string;
|
|
330
|
-
/** Branch slug */
|
|
331
215
|
branchSlug: string;
|
|
332
|
-
/** Company ID this branch belongs to */
|
|
333
216
|
companyId: string;
|
|
334
217
|
}
|
|
335
|
-
/**
|
|
336
|
-
* Response for user companies
|
|
337
|
-
*/
|
|
338
|
-
interface IUserCompaniesResponse {
|
|
339
|
-
data: IUserCompanyPermission[];
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Response for user branches
|
|
343
|
-
*/
|
|
344
|
-
interface IUserBranchesResponse {
|
|
345
|
-
data: IUserBranchPermission[];
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Batch operation result response
|
|
349
|
-
*/
|
|
350
|
-
interface IBatchOperationResponse {
|
|
351
|
-
success: boolean;
|
|
352
|
-
message: string;
|
|
353
|
-
}
|
|
354
218
|
|
|
355
|
-
/**
|
|
356
|
-
* Create User Request Interface
|
|
357
|
-
*/
|
|
358
219
|
interface ICreateUserRequest {
|
|
359
220
|
name: string;
|
|
360
221
|
email: string;
|
|
@@ -366,14 +227,12 @@ interface ICreateUserRequest {
|
|
|
366
227
|
phoneVerified?: boolean;
|
|
367
228
|
additionalFields?: Record<string, unknown>;
|
|
368
229
|
}
|
|
369
|
-
/**
|
|
370
|
-
* Update User Request Interface
|
|
371
|
-
*/
|
|
372
230
|
interface IUpdateUserRequest {
|
|
373
231
|
id: string;
|
|
374
232
|
name?: string;
|
|
375
233
|
email?: string;
|
|
376
234
|
password?: string;
|
|
235
|
+
oldPassword?: string;
|
|
377
236
|
phone?: string;
|
|
378
237
|
profilePictureId?: string;
|
|
379
238
|
isActive?: boolean;
|
|
@@ -381,9 +240,6 @@ interface IUpdateUserRequest {
|
|
|
381
240
|
phoneVerified?: boolean;
|
|
382
241
|
additionalFields?: Record<string, unknown>;
|
|
383
242
|
}
|
|
384
|
-
/**
|
|
385
|
-
* User Response Interface
|
|
386
|
-
*/
|
|
387
243
|
interface IUser {
|
|
388
244
|
id: string;
|
|
389
245
|
name: string;
|
|
@@ -400,113 +256,34 @@ interface IUser {
|
|
|
400
256
|
deletedAt?: Date | string | null;
|
|
401
257
|
}
|
|
402
258
|
|
|
403
|
-
/**
|
|
404
|
-
* Auth API Service
|
|
405
|
-
* Handles all authentication-related API calls matching NestJS auth endpoints
|
|
406
|
-
*/
|
|
407
259
|
declare class AuthApiService {
|
|
408
260
|
private readonly appConfig;
|
|
409
261
|
private readonly http;
|
|
410
262
|
private readonly baseUrl;
|
|
411
263
|
constructor();
|
|
412
|
-
/**
|
|
413
|
-
* Login with email and password
|
|
414
|
-
* Returns either:
|
|
415
|
-
* - ILoginResponse (direct login success)
|
|
416
|
-
* - ICompanySelectionResponse (requires company/branch selection)
|
|
417
|
-
*/
|
|
418
264
|
login(data: ILoginRequest): Observable<AuthResponse>;
|
|
419
|
-
/**
|
|
420
|
-
* Register new user
|
|
421
|
-
* Supports simple registration and company-based registration
|
|
422
|
-
* Returns RegistrationResponse directly (not wrapped in SingleResponse)
|
|
423
|
-
*/
|
|
424
265
|
register(data: IRegistrationRequest): Observable<IRegistrationResponse>;
|
|
425
|
-
/**
|
|
426
|
-
* Select company and branch after login
|
|
427
|
-
* Used when login returns requiresSelection: true
|
|
428
|
-
* Returns LoginResponse directly (not wrapped)
|
|
429
|
-
*/
|
|
430
266
|
select(data: ISelectRequest): Observable<ILoginResponse>;
|
|
431
|
-
/**
|
|
432
|
-
* Switch company/branch for logged-in user
|
|
433
|
-
* Returns LoginResponse directly (not wrapped)
|
|
434
|
-
*/
|
|
435
267
|
switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse>;
|
|
436
|
-
/**
|
|
437
|
-
* Refresh access token
|
|
438
|
-
* Refresh token is sent via HTTP-only cookie
|
|
439
|
-
* Returns RefreshTokenResponse directly (not wrapped)
|
|
440
|
-
*/
|
|
441
268
|
refresh(): Observable<IRefreshTokenResponse>;
|
|
442
|
-
/**
|
|
443
|
-
* Get current user info
|
|
444
|
-
* Returns only user data (no tokens) - IMeResponse
|
|
445
|
-
*/
|
|
446
269
|
me(): Observable<IMeResponse>;
|
|
447
|
-
/**
|
|
448
|
-
* Logout current user
|
|
449
|
-
*/
|
|
450
270
|
logout(): Observable<IMessageResponse>;
|
|
451
|
-
/**
|
|
452
|
-
* Change password for logged-in user
|
|
453
|
-
*/
|
|
454
271
|
changePassword(data: IChangePasswordRequest): Observable<IMessageResponse>;
|
|
455
|
-
/**
|
|
456
|
-
* Send forgot password email
|
|
457
|
-
*/
|
|
458
272
|
forgotPassword(email: string): Observable<IMessageResponse>;
|
|
459
|
-
/**
|
|
460
|
-
* Reset password with token
|
|
461
|
-
*/
|
|
462
273
|
resetPassword(token: string, newPassword: string): Observable<IMessageResponse>;
|
|
463
|
-
/**
|
|
464
|
-
* Resend verification email (unauthenticated)
|
|
465
|
-
*/
|
|
466
274
|
resendVerification(email: string): Observable<IMessageResponse>;
|
|
467
|
-
/**
|
|
468
|
-
* Verify email with token
|
|
469
|
-
* Returns IMessageResponse for existing user verification
|
|
470
|
-
* Returns IRegistrationResponse for pending registration completion
|
|
471
|
-
*/
|
|
472
275
|
verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse>;
|
|
473
276
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthApiService, never>;
|
|
474
277
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthApiService>;
|
|
475
278
|
}
|
|
476
279
|
|
|
477
|
-
/**
|
|
478
|
-
* Auth Initialization Service
|
|
479
|
-
* Handles app startup authentication flow:
|
|
480
|
-
* 1. Check if user has valid session (via refresh token cookie)
|
|
481
|
-
* 2. Restore user state from /auth/me
|
|
482
|
-
* 3. Handle company selection if needed
|
|
483
|
-
*
|
|
484
|
-
* IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues
|
|
485
|
-
*/
|
|
486
280
|
declare class AuthInitService {
|
|
487
281
|
private readonly authState;
|
|
488
282
|
private readonly authApi;
|
|
489
|
-
private readonly router;
|
|
490
283
|
private readonly appConfig;
|
|
491
|
-
|
|
492
|
-
readonly initialized: _angular_core.
|
|
493
|
-
/** Whether auth check is in progress */
|
|
494
|
-
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
495
|
-
/** Error from auth check */
|
|
496
|
-
readonly error: _angular_core.WritableSignal<string | null>;
|
|
497
|
-
/** Cached initialization observable to prevent duplicate calls */
|
|
284
|
+
private readonly _initialized;
|
|
285
|
+
readonly initialized: _angular_core.Signal<boolean>;
|
|
498
286
|
private initializationCache$;
|
|
499
|
-
/**
|
|
500
|
-
* Initialize authentication state on app startup.
|
|
501
|
-
*
|
|
502
|
-
* Flow:
|
|
503
|
-
* 1. If already authenticated with user data -> done
|
|
504
|
-
* 2. Try refresh token (via cookie) -> get new access token
|
|
505
|
-
* 3. Call /auth/me to get user info
|
|
506
|
-
* 4. Update state accordingly
|
|
507
|
-
*
|
|
508
|
-
* Uses shareReplay to prevent duplicate initialization calls.
|
|
509
|
-
*/
|
|
510
287
|
initialize(): Observable<boolean>;
|
|
511
288
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthInitService, never>;
|
|
512
289
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthInitService>;
|
|
@@ -519,29 +296,54 @@ declare class AuthInitService {
|
|
|
519
296
|
declare class AuthStateService {
|
|
520
297
|
private readonly appConfig;
|
|
521
298
|
private readonly router;
|
|
522
|
-
readonly
|
|
523
|
-
readonly
|
|
524
|
-
readonly
|
|
525
|
-
readonly
|
|
526
|
-
readonly
|
|
527
|
-
readonly
|
|
528
|
-
readonly
|
|
299
|
+
private readonly platform;
|
|
300
|
+
private readonly translateAdapter;
|
|
301
|
+
private readonly _user;
|
|
302
|
+
private readonly _accessToken;
|
|
303
|
+
private readonly _tokenExpiresAt;
|
|
304
|
+
private readonly _company;
|
|
305
|
+
private readonly _branch;
|
|
306
|
+
readonly user: _angular_core.Signal<IUserInfo | null>;
|
|
307
|
+
readonly accessToken: _angular_core.Signal<string>;
|
|
308
|
+
readonly tokenExpiresAt: _angular_core.Signal<number | null>;
|
|
309
|
+
readonly company: _angular_core.Signal<ICompanyInfo | null>;
|
|
310
|
+
readonly branch: _angular_core.Signal<IBranchInfo | null>;
|
|
311
|
+
private readonly _selectionSessionId;
|
|
312
|
+
private readonly _availableCompanies;
|
|
313
|
+
readonly selectionSessionId: _angular_core.Signal<string | null>;
|
|
314
|
+
readonly availableCompanies: _angular_core.Signal<ICompanyWithBranches[]>;
|
|
529
315
|
readonly isAuthenticated: _angular_core.Signal<boolean>;
|
|
530
316
|
readonly requiresCompanySelection: _angular_core.Signal<boolean>;
|
|
531
317
|
readonly userName: _angular_core.Signal<string>;
|
|
532
318
|
readonly companyName: _angular_core.Signal<string>;
|
|
533
319
|
readonly branchName: _angular_core.Signal<string>;
|
|
320
|
+
/**
|
|
321
|
+
* Check if token is expired or will expire soon (within 30 seconds).
|
|
322
|
+
* Used to proactively refresh token before requests fail.
|
|
323
|
+
*/
|
|
324
|
+
readonly isTokenExpired: _angular_core.Signal<boolean>;
|
|
534
325
|
readonly tenantId: _angular_core.Signal<string | null>;
|
|
535
326
|
constructor();
|
|
536
|
-
setLoginState(
|
|
537
|
-
setSelectionState(
|
|
327
|
+
setLoginState(data: ILoginData): void;
|
|
328
|
+
setSelectionState(data: ICompanySelectionData): void;
|
|
538
329
|
clearSelectionState(): void;
|
|
539
330
|
resetState(): void;
|
|
331
|
+
setUser(user: IUserInfo | null): void;
|
|
332
|
+
setAccessToken(token: string): void;
|
|
333
|
+
setCompany(company: ICompanyInfo | null): void;
|
|
334
|
+
setBranch(branch: IBranchInfo | null): void;
|
|
540
335
|
navigateToLogin(returnUrl?: string): void;
|
|
541
336
|
navigateAfterLogin(returnUrl?: string): void;
|
|
337
|
+
/** Validates a return URL to prevent open redirect attacks */
|
|
338
|
+
private isValidReturnUrl;
|
|
542
339
|
getStoredCompanyId(): string | null;
|
|
543
340
|
getStoredBranchId(): string | null;
|
|
544
341
|
private loadFromStorage;
|
|
342
|
+
/**
|
|
343
|
+
* Decode JWT expiry without verification (client-side only).
|
|
344
|
+
* Returns expiry timestamp in milliseconds.
|
|
345
|
+
*/
|
|
346
|
+
private decodeTokenExpiry;
|
|
545
347
|
private store;
|
|
546
348
|
private get;
|
|
547
349
|
private remove;
|
|
@@ -552,45 +354,9 @@ declare class AuthStateService {
|
|
|
552
354
|
/**
|
|
553
355
|
* Branch API Service
|
|
554
356
|
* Signal-based service for branch CRUD operations
|
|
555
|
-
* Branches default to current company context
|
|
556
|
-
*
|
|
557
|
-
* @example
|
|
558
|
-
* ```typescript
|
|
559
|
-
* branchService = inject(BranchApiService);
|
|
560
|
-
*
|
|
561
|
-
* // Set current company context
|
|
562
|
-
* branchService.setCurrentCompanyId('company-uuid');
|
|
563
|
-
*
|
|
564
|
-
* // Access data via signals
|
|
565
|
-
* branches = this.branchService.data;
|
|
566
|
-
* isLoading = this.branchService.isLoading;
|
|
567
|
-
*
|
|
568
|
-
* // Fetch branches (will filter by current company)
|
|
569
|
-
* this.branchService.fetchList('search');
|
|
570
|
-
*
|
|
571
|
-
* // Create branch (companyId will be auto-set if not provided)
|
|
572
|
-
* await this.branchService.insertBranch({ name: 'New Branch', slug: 'new-branch' });
|
|
573
|
-
* ```
|
|
574
357
|
*/
|
|
575
358
|
declare class BranchApiService extends ApiResourceService<ICreateBranchRequest | IUpdateBranchRequest, IBranch> {
|
|
576
|
-
|
|
577
|
-
readonly currentCompanyId: _angular_core.WritableSignal<string | null>;
|
|
578
|
-
/** Branches filtered by current company */
|
|
579
|
-
readonly companyBranches: _angular_core.Signal<IBranch[]>;
|
|
580
|
-
constructor(http: HttpClient);
|
|
581
|
-
/**
|
|
582
|
-
* Set the current company context for branch operations
|
|
583
|
-
*/
|
|
584
|
-
setCurrentCompanyId(companyId: string | null): void;
|
|
585
|
-
/**
|
|
586
|
-
* Insert a new branch, auto-setting companyId if not provided
|
|
587
|
-
*/
|
|
588
|
-
insertBranch(data: Omit<ICreateBranchRequest, 'companyId'> & {
|
|
589
|
-
companyId?: string;
|
|
590
|
-
}): Promise<ReturnType<typeof this.insertAsync>>;
|
|
591
|
-
/**
|
|
592
|
-
* Fetch branches for a specific company
|
|
593
|
-
*/
|
|
359
|
+
constructor();
|
|
594
360
|
fetchByCompany(companyId: string, search?: string): void;
|
|
595
361
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BranchApiService, never>;
|
|
596
362
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<BranchApiService>;
|
|
@@ -599,64 +365,25 @@ declare class BranchApiService extends ApiResourceService<ICreateBranchRequest |
|
|
|
599
365
|
/**
|
|
600
366
|
* Company API Service
|
|
601
367
|
* Signal-based service for company CRUD operations
|
|
602
|
-
*
|
|
603
|
-
* @example
|
|
604
|
-
* ```typescript
|
|
605
|
-
* companyService = inject(CompanyApiService);
|
|
606
|
-
*
|
|
607
|
-
* // Access data via signals
|
|
608
|
-
* companies = this.companyService.data;
|
|
609
|
-
* isLoading = this.companyService.isLoading;
|
|
610
|
-
*
|
|
611
|
-
* // Fetch companies
|
|
612
|
-
* this.companyService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });
|
|
613
|
-
*
|
|
614
|
-
* // Create company
|
|
615
|
-
* await this.companyService.insertAsync({ name: 'New Company', slug: 'new-company' });
|
|
616
|
-
* ```
|
|
617
368
|
*/
|
|
618
369
|
declare class CompanyApiService extends ApiResourceService<ICreateCompanyRequest | IUpdateCompanyRequest, ICompany> {
|
|
619
|
-
constructor(
|
|
370
|
+
constructor();
|
|
620
371
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyApiService, never>;
|
|
621
372
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<CompanyApiService>;
|
|
622
373
|
}
|
|
623
374
|
|
|
624
375
|
/**
|
|
625
376
|
* Token Refresh State Service
|
|
626
|
-
*
|
|
627
|
-
*
|
|
628
|
-
* Replaces module-level state that would be shared across requests in SSR.
|
|
629
|
-
*
|
|
630
|
-
* @example
|
|
631
|
-
* ```typescript
|
|
632
|
-
* const refreshState = inject(TokenRefreshStateService);
|
|
633
|
-
*
|
|
634
|
-
* if (refreshState.isRefreshing()) {
|
|
635
|
-
* // Queue request
|
|
636
|
-
* } else {
|
|
637
|
-
* refreshState.startRefresh();
|
|
638
|
-
* // Perform refresh
|
|
639
|
-
* }
|
|
640
|
-
* ```
|
|
377
|
+
* Manages token refresh state for SSR-safe request queuing.
|
|
378
|
+
* Uses BehaviorSubject for RxJS interop (multi-subscriber async coordination).
|
|
641
379
|
*/
|
|
642
380
|
declare class TokenRefreshStateService {
|
|
643
|
-
/** Flag to track if token refresh is in progress */
|
|
644
381
|
private readonly _isRefreshing;
|
|
645
382
|
readonly isRefreshing: _angular_core.Signal<boolean>;
|
|
646
|
-
/** Subject to queue requests while refreshing */
|
|
647
383
|
private readonly _refreshTokenSubject;
|
|
648
384
|
readonly refreshTokenSubject$: rxjs.Observable<string | null>;
|
|
649
|
-
/**
|
|
650
|
-
* Mark refresh as started
|
|
651
|
-
*/
|
|
652
385
|
startRefresh(): void;
|
|
653
|
-
/**
|
|
654
|
-
* Mark refresh as completed and broadcast new token
|
|
655
|
-
*/
|
|
656
386
|
completeRefresh(newToken: string): void;
|
|
657
|
-
/**
|
|
658
|
-
* Mark refresh as failed
|
|
659
|
-
*/
|
|
660
387
|
failRefresh(): void;
|
|
661
388
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TokenRefreshStateService, never>;
|
|
662
389
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<TokenRefreshStateService>;
|
|
@@ -665,43 +392,9 @@ declare class TokenRefreshStateService {
|
|
|
665
392
|
/**
|
|
666
393
|
* User API Service
|
|
667
394
|
* Signal-based service for user CRUD operations
|
|
668
|
-
*
|
|
669
|
-
* @example
|
|
670
|
-
* ```typescript
|
|
671
|
-
* userService = inject(UserApiService);
|
|
672
|
-
*
|
|
673
|
-
* // Access data via signals
|
|
674
|
-
* users = this.userService.data;
|
|
675
|
-
* isLoading = this.userService.isLoading;
|
|
676
|
-
*
|
|
677
|
-
* // Fetch users
|
|
678
|
-
* this.userService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });
|
|
679
|
-
*
|
|
680
|
-
* // Create user
|
|
681
|
-
* await this.userService.insertAsync({
|
|
682
|
-
* name: 'John Doe',
|
|
683
|
-
* email: 'john@example.com',
|
|
684
|
-
* password: 'password123'
|
|
685
|
-
* });
|
|
686
|
-
* ```
|
|
687
395
|
*/
|
|
688
396
|
declare class UserApiService extends ApiResourceService<ICreateUserRequest | IUpdateUserRequest, IUser> {
|
|
689
|
-
constructor(
|
|
690
|
-
/**
|
|
691
|
-
* Verify user's email
|
|
692
|
-
*/
|
|
693
|
-
verifyEmail(userId: string): Observable<IMessageResponse>;
|
|
694
|
-
/**
|
|
695
|
-
* Verify user's phone
|
|
696
|
-
*/
|
|
697
|
-
verifyPhone(userId: string): Observable<IMessageResponse>;
|
|
698
|
-
/**
|
|
699
|
-
* Update user status (active/inactive)
|
|
700
|
-
*/
|
|
701
|
-
updateStatus(userId: string, isActive: boolean): Observable<IMessageResponse>;
|
|
702
|
-
/**
|
|
703
|
-
* Update current user's profile
|
|
704
|
-
*/
|
|
397
|
+
constructor();
|
|
705
398
|
updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>>;
|
|
706
399
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserApiService, never>;
|
|
707
400
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserApiService>;
|
|
@@ -709,194 +402,42 @@ declare class UserApiService extends ApiResourceService<ICreateUserRequest | IUp
|
|
|
709
402
|
|
|
710
403
|
/**
|
|
711
404
|
* User Permission API Service
|
|
712
|
-
*
|
|
713
405
|
* Handles user-company and user-branch permission assignments.
|
|
714
|
-
*
|
|
715
|
-
*
|
|
716
|
-
* Backend Endpoints:
|
|
717
|
-
* - POST /administration/permissions/user-company/assign - Batch assign/revoke company permissions
|
|
718
|
-
* - GET /administration/permissions/user-company?userId=xxx - Get user's companies
|
|
719
|
-
* - POST /administration/permissions/user-branch/assign - Batch assign/revoke branch permissions
|
|
720
|
-
* - GET /administration/permissions/user-branch?userId=xxx - Get user's branches
|
|
406
|
+
* Endpoint: POST /administration/permissions/*
|
|
721
407
|
*/
|
|
722
408
|
declare class UserPermissionApiService {
|
|
723
409
|
private readonly appConfig;
|
|
724
410
|
private readonly http;
|
|
725
411
|
private readonly baseUrl;
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
* items: [
|
|
735
|
-
* { targetId: 'company-1', isAdd: true },
|
|
736
|
-
* { targetId: 'company-2', isAdd: true }
|
|
737
|
-
* ]
|
|
738
|
-
* });
|
|
739
|
-
*
|
|
740
|
-
* @example
|
|
741
|
-
* // Remove company permissions
|
|
742
|
-
* service.assignUserCompanies({
|
|
743
|
-
* userId: 'user-id',
|
|
744
|
-
* items: [
|
|
745
|
-
* { targetId: 'company-1', isAdd: false }
|
|
746
|
-
* ]
|
|
747
|
-
* });
|
|
748
|
-
*/
|
|
749
|
-
assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IBatchOperationResponse>;
|
|
750
|
-
/**
|
|
751
|
-
* Assign single company to user (convenience method)
|
|
752
|
-
*/
|
|
753
|
-
assignUserToCompany(userId: string, companyId: string): Observable<IBatchOperationResponse>;
|
|
754
|
-
/**
|
|
755
|
-
* Revoke single company from user (convenience method)
|
|
756
|
-
*/
|
|
757
|
-
revokeUserFromCompany(userId: string, companyId: string): Observable<IBatchOperationResponse>;
|
|
758
|
-
/**
|
|
759
|
-
* Get user's company permissions
|
|
760
|
-
*
|
|
761
|
-
* @param userId - User ID to get companies for
|
|
762
|
-
* @returns Observable with user's company permissions
|
|
763
|
-
*/
|
|
764
|
-
getUserCompanies(userId: string): Observable<IUserCompaniesResponse>;
|
|
765
|
-
/**
|
|
766
|
-
* Batch assign/revoke user-branch permissions
|
|
767
|
-
*
|
|
768
|
-
* @example
|
|
769
|
-
* // Add branch permissions
|
|
770
|
-
* service.assignUserBranches({
|
|
771
|
-
* userId: 'user-id',
|
|
772
|
-
* items: [
|
|
773
|
-
* { targetId: 'branch-1', isAdd: true },
|
|
774
|
-
* { targetId: 'branch-2', isAdd: true }
|
|
775
|
-
* ]
|
|
776
|
-
* });
|
|
777
|
-
*
|
|
778
|
-
* @example
|
|
779
|
-
* // Remove branch permissions
|
|
780
|
-
* service.assignUserBranches({
|
|
781
|
-
* userId: 'user-id',
|
|
782
|
-
* items: [
|
|
783
|
-
* { targetId: 'branch-1', isAdd: false }
|
|
784
|
-
* ]
|
|
785
|
-
* });
|
|
786
|
-
*/
|
|
787
|
-
assignUserBranches(data: IAssignUserBranchRequest): Observable<IBatchOperationResponse>;
|
|
788
|
-
/**
|
|
789
|
-
* Assign single branch to user (convenience method)
|
|
790
|
-
*/
|
|
791
|
-
assignUserToBranch(userId: string, branchId: string): Observable<IBatchOperationResponse>;
|
|
792
|
-
/**
|
|
793
|
-
* Revoke single branch from user (convenience method)
|
|
794
|
-
*/
|
|
795
|
-
revokeUserFromBranch(userId: string, branchId: string): Observable<IBatchOperationResponse>;
|
|
796
|
-
/**
|
|
797
|
-
* Get user's branch permissions
|
|
798
|
-
*
|
|
799
|
-
* @param userId - User ID to get branches for
|
|
800
|
-
* @returns Observable with user's branch permissions
|
|
801
|
-
*/
|
|
802
|
-
getUserBranches(userId: string): Observable<IUserBranchesResponse>;
|
|
412
|
+
assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IMessageResponse>;
|
|
413
|
+
assignUserToCompany(userId: string, companyId: string): Observable<IMessageResponse>;
|
|
414
|
+
revokeUserFromCompany(userId: string, companyId: string): Observable<IMessageResponse>;
|
|
415
|
+
getUserCompanies(userId: string): Observable<ISingleResponse<IUserCompanyPermission[]>>;
|
|
416
|
+
assignUserBranches(data: IAssignUserBranchRequest): Observable<IMessageResponse>;
|
|
417
|
+
assignUserToBranch(userId: string, branchId: string): Observable<IMessageResponse>;
|
|
418
|
+
revokeUserFromBranch(userId: string, branchId: string): Observable<IMessageResponse>;
|
|
419
|
+
getUserBranches(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission[]>>;
|
|
803
420
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserPermissionApiService, never>;
|
|
804
421
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserPermissionApiService>;
|
|
805
422
|
}
|
|
806
423
|
|
|
807
|
-
/**
|
|
808
|
-
* Auth Guard
|
|
809
|
-
* Protects routes that require authentication.
|
|
810
|
-
*
|
|
811
|
-
* Session restoration is handled by guestGuard. This guard assumes
|
|
812
|
-
* the session has already been restored if user accessed login page first.
|
|
813
|
-
*
|
|
814
|
-
* Handles company feature:
|
|
815
|
-
* - If company feature enabled and no company selected, redirects to login
|
|
816
|
-
* (login page handles company selection as step 2)
|
|
817
|
-
* - If not authenticated, redirects to login
|
|
818
|
-
*
|
|
819
|
-
* @example
|
|
820
|
-
* ```typescript
|
|
821
|
-
* // In routes configuration
|
|
822
|
-
* {
|
|
823
|
-
* path: 'dashboard',
|
|
824
|
-
* loadComponent: () => import('./dashboard.component'),
|
|
825
|
-
* canActivate: [authGuard]
|
|
826
|
-
* }
|
|
827
|
-
* ```
|
|
828
|
-
*/
|
|
424
|
+
/** Protects routes requiring authentication */
|
|
829
425
|
declare const authGuard: CanActivateFn;
|
|
830
|
-
/**
|
|
831
|
-
* Guest Guard
|
|
832
|
-
* Protects auth routes (login, register) from authenticated users.
|
|
833
|
-
* Redirects authenticated users to home page.
|
|
834
|
-
*
|
|
835
|
-
* CRITICAL: Unlike old implementation, this guard RESTORES the session first
|
|
836
|
-
* before checking authentication. This handles the case when users directly
|
|
837
|
-
* navigate to /auth/login via browser URL while having valid refresh token.
|
|
838
|
-
*
|
|
839
|
-
* Flow:
|
|
840
|
-
* 1. Restore session (if needed) via AuthInitService.initialize()
|
|
841
|
-
* 2. Check if user is authenticated
|
|
842
|
-
* 3. If authenticated -> redirect to dashboard
|
|
843
|
-
* 4. If not authenticated -> allow access to login page
|
|
844
|
-
*
|
|
845
|
-
* @example
|
|
846
|
-
* ```typescript
|
|
847
|
-
* // In routes configuration
|
|
848
|
-
* {
|
|
849
|
-
* path: 'auth/login',
|
|
850
|
-
* loadComponent: () => import('./login.component'),
|
|
851
|
-
* canActivate: [guestGuard]
|
|
852
|
-
* }
|
|
853
|
-
* ```
|
|
854
|
-
*/
|
|
426
|
+
/** Protects auth routes from authenticated users, restores session first */
|
|
855
427
|
declare const guestGuard: CanActivateFn;
|
|
856
|
-
/**
|
|
857
|
-
* Company Feature Guard
|
|
858
|
-
* Protects routes that require company feature to be enabled.
|
|
859
|
-
* Redirects to home if company feature is disabled.
|
|
860
|
-
*
|
|
861
|
-
* Use this guard on company/branch management routes.
|
|
862
|
-
*
|
|
863
|
-
* @example
|
|
864
|
-
* ```typescript
|
|
865
|
-
* // In routes configuration
|
|
866
|
-
* {
|
|
867
|
-
* path: 'administration/company',
|
|
868
|
-
* loadComponent: () => import('./company-list.component'),
|
|
869
|
-
* canActivate: [authGuard, companyFeatureGuard]
|
|
870
|
-
* }
|
|
871
|
-
* ```
|
|
872
|
-
*/
|
|
428
|
+
/** Protects routes requiring company feature to be enabled */
|
|
873
429
|
declare const companyFeatureGuard: CanActivateFn;
|
|
430
|
+
/** Protects routes requiring email feature to be enabled */
|
|
431
|
+
declare const emailFeatureGuard: CanActivateFn;
|
|
432
|
+
/** Protects routes requiring sign-up feature to be enabled */
|
|
433
|
+
declare const signUpFeatureGuard: CanActivateFn;
|
|
874
434
|
|
|
875
435
|
/**
|
|
876
436
|
* Auth Interceptor - Adds auth headers and cookie credentials to requests
|
|
877
437
|
*/
|
|
878
438
|
declare function authInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>>;
|
|
879
439
|
|
|
880
|
-
/**
|
|
881
|
-
* Token Refresh Interceptor
|
|
882
|
-
* Handles 401 errors by refreshing the access token.
|
|
883
|
-
*
|
|
884
|
-
* - Intercepts 401 Unauthorized responses
|
|
885
|
-
* - Calls refresh token endpoint
|
|
886
|
-
* - Retries failed request with new token
|
|
887
|
-
* - Queues concurrent requests during refresh
|
|
888
|
-
* - Redirects to login on refresh failure
|
|
889
|
-
* - SSR-safe: Uses injectable service instead of module-level state
|
|
890
|
-
*
|
|
891
|
-
* @example
|
|
892
|
-
* ```typescript
|
|
893
|
-
* // In app.config.ts
|
|
894
|
-
* provideHttpClient(
|
|
895
|
-
* withFetch(),
|
|
896
|
-
* withInterceptors([authInterceptor, tokenRefreshInterceptor])
|
|
897
|
-
* )
|
|
898
|
-
* ```
|
|
899
|
-
*/
|
|
440
|
+
/** Token Refresh Interceptor - Proactive and reactive token refresh with request queuing */
|
|
900
441
|
declare function tokenRefreshInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>>;
|
|
901
442
|
|
|
902
443
|
/**
|
|
@@ -919,86 +460,49 @@ declare const ADMINISTRATION_ROUTES: Routes;
|
|
|
919
460
|
declare const PROFILE_ROUTES: Routes;
|
|
920
461
|
|
|
921
462
|
/**
|
|
922
|
-
* Auth Layout
|
|
923
|
-
*
|
|
924
|
-
*
|
|
463
|
+
* Auth Layout Provider Adapters
|
|
464
|
+
*
|
|
465
|
+
* Implements provider interfaces from ng-layout using ng-auth services.
|
|
466
|
+
* Bridges auth state and API to layout components.
|
|
467
|
+
*
|
|
468
|
+
* @example
|
|
469
|
+
* // In app.config.ts
|
|
470
|
+
* import { provideAuthLayoutIntegration } from '@flusys/ng-auth';
|
|
471
|
+
* providers: [...provideAuthLayoutIntegration()]
|
|
925
472
|
*/
|
|
926
473
|
declare class AuthLayoutStateAdapter implements ILayoutAuthState {
|
|
927
474
|
private readonly authState;
|
|
928
|
-
/**
|
|
929
|
-
* Maps company info to company info for layout.
|
|
930
|
-
* Falls back to app name from config when no company is selected.
|
|
931
|
-
*/
|
|
932
475
|
readonly currentCompanyInfo: Signal<ICompanyInfo$1 | null>;
|
|
933
|
-
/**
|
|
934
|
-
* Maps branch info to branch info for layout.
|
|
935
|
-
* Returns null when no branch is selected.
|
|
936
|
-
*/
|
|
937
476
|
readonly currentBranchInfo: Signal<IBranchInfo$1 | null>;
|
|
938
|
-
/**
|
|
939
|
-
* Maps user info from auth state to layout user info.
|
|
940
|
-
* Profile picture URL is managed separately by AuthLayoutSyncService via FileUrlService.
|
|
941
|
-
*/
|
|
942
477
|
readonly loginUserData: Signal<IUserInfo$1 | null>;
|
|
943
478
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthLayoutStateAdapter, never>;
|
|
944
479
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthLayoutStateAdapter>;
|
|
945
480
|
}
|
|
946
|
-
/**
|
|
947
|
-
* Auth Layout API Adapter
|
|
948
|
-
* Bridges AuthApiService to ILayoutAuthApi interface.
|
|
949
|
-
* Handles logout and navigation for layout components.
|
|
950
|
-
*/
|
|
951
481
|
declare class AuthLayoutApiAdapter implements ILayoutAuthApi {
|
|
952
482
|
private readonly authApi;
|
|
953
483
|
private readonly authState;
|
|
954
484
|
private readonly permissionApi;
|
|
955
485
|
private readonly router;
|
|
956
|
-
/**
|
|
957
|
-
* Logout the current user.
|
|
958
|
-
* Calls backend logout endpoint and resets local auth state.
|
|
959
|
-
* Auth state reset handles clearing all localStorage including company/branch.
|
|
960
|
-
*/
|
|
961
486
|
logOut(): Observable<any>;
|
|
962
|
-
/**
|
|
963
|
-
* Navigate to login page.
|
|
964
|
-
* Optionally preserves current URL as return URL.
|
|
965
|
-
*/
|
|
966
487
|
navigateLogin(withUrl?: boolean): void;
|
|
967
|
-
/**
|
|
968
|
-
* Switch to a different company and branch.
|
|
969
|
-
* Calls backend switch endpoint, then triggers full page reload to
|
|
970
|
-
* refresh permissions, reset component state, and re-filter all data.
|
|
971
|
-
*/
|
|
972
488
|
switchCompany(companyId: string, branchId: string): Observable<any>;
|
|
973
|
-
/**
|
|
974
|
-
* Get list of companies the logged-in user has permissions for.
|
|
975
|
-
* Uses permission API to filter by user's actual company-level permissions.
|
|
976
|
-
*/
|
|
977
489
|
getUserCompanies(): Observable<ICompanyInfo$1[]>;
|
|
978
|
-
/**
|
|
979
|
-
* Get branches for a specific company that the logged-in user has access to.
|
|
980
|
-
* Fetches all user branches and filters by companyId.
|
|
981
|
-
*/
|
|
982
490
|
getCompanyBranches(companyId: string): Observable<IBranchInfo$1[]>;
|
|
983
491
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthLayoutApiAdapter, never>;
|
|
984
492
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthLayoutApiAdapter>;
|
|
985
493
|
}
|
|
986
494
|
|
|
987
495
|
/**
|
|
988
|
-
* Auth
|
|
496
|
+
* Auth Shared Provider Adapters
|
|
989
497
|
*
|
|
990
|
-
* Implements
|
|
991
|
-
*
|
|
498
|
+
* Implements provider interfaces from ng-shared using ng-auth services.
|
|
499
|
+
* Allows IAM, Storage, and Form-Builder packages to access auth data
|
|
500
|
+
* without depending on ng-auth directly.
|
|
992
501
|
*
|
|
993
502
|
* @example
|
|
994
503
|
* // In app.config.ts
|
|
995
|
-
*
|
|
996
|
-
*
|
|
997
|
-
* ]
|
|
998
|
-
*
|
|
999
|
-
* // In IAM component
|
|
1000
|
-
* private readonly userProvider = inject(USER_PROVIDER);
|
|
1001
|
-
* this.userProvider.getUsers({ page: 0, pageSize: 50 }).subscribe(...);
|
|
504
|
+
* import { provideAuthProviders } from '@flusys/ng-auth';
|
|
505
|
+
* providers: [...provideAuthProviders()]
|
|
1002
506
|
*/
|
|
1003
507
|
declare class AuthUserProviderAdapter implements IUserProvider {
|
|
1004
508
|
private readonly userApi;
|
|
@@ -1006,27 +510,12 @@ declare class AuthUserProviderAdapter implements IUserProvider {
|
|
|
1006
510
|
page?: number;
|
|
1007
511
|
pageSize?: number;
|
|
1008
512
|
search?: string;
|
|
1009
|
-
companyId?: string;
|
|
1010
|
-
branchId?: string;
|
|
1011
513
|
isActive?: boolean;
|
|
1012
514
|
[key: string]: any;
|
|
1013
515
|
}): Observable<IListResponse<IUserBasicInfo>>;
|
|
1014
516
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthUserProviderAdapter, never>;
|
|
1015
517
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthUserProviderAdapter>;
|
|
1016
518
|
}
|
|
1017
|
-
|
|
1018
|
-
/**
|
|
1019
|
-
* Auth Company API Provider Adapter
|
|
1020
|
-
*
|
|
1021
|
-
* Implements ICompanyApiProvider interface from ng-shared using CompanyApiService.
|
|
1022
|
-
* Allows IAM package to access company data without depending on ng-auth directly.
|
|
1023
|
-
*
|
|
1024
|
-
* @example
|
|
1025
|
-
* // In app.config.ts
|
|
1026
|
-
* providers: [
|
|
1027
|
-
* { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter }
|
|
1028
|
-
* ]
|
|
1029
|
-
*/
|
|
1030
519
|
declare class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {
|
|
1031
520
|
private readonly companyApi;
|
|
1032
521
|
getCompanies(filter?: {
|
|
@@ -1037,107 +526,250 @@ declare class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {
|
|
|
1037
526
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthCompanyApiProviderAdapter, never>;
|
|
1038
527
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthCompanyApiProviderAdapter>;
|
|
1039
528
|
}
|
|
1040
|
-
|
|
1041
|
-
/**
|
|
1042
|
-
* Auth User Permission Provider Adapter
|
|
1043
|
-
*
|
|
1044
|
-
* Implements IUserPermissionProvider interface from ng-shared using UserPermissionApiService.
|
|
1045
|
-
* Allows IAM package to query user permissions without depending on ng-auth directly.
|
|
1046
|
-
*
|
|
1047
|
-
* @example
|
|
1048
|
-
* // In app.config.ts
|
|
1049
|
-
* providers: [
|
|
1050
|
-
* { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter }
|
|
1051
|
-
* ]
|
|
1052
|
-
*/
|
|
1053
529
|
declare class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {
|
|
1054
530
|
private readonly userPermissionApi;
|
|
1055
|
-
getUserBranchPermissions(userId: string): Observable<ISingleResponse<
|
|
531
|
+
getUserBranchPermissions(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission$1[]>>;
|
|
1056
532
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthUserPermissionProviderAdapter, never>;
|
|
1057
533
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthUserPermissionProviderAdapter>;
|
|
1058
534
|
}
|
|
535
|
+
declare class AuthStateProviderAdapter implements IAuthStateProvider {
|
|
536
|
+
private readonly authState;
|
|
537
|
+
private readonly authInit;
|
|
538
|
+
get isAuthenticated(): Signal<boolean>;
|
|
539
|
+
initialize(): Observable<void>;
|
|
540
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthStateProviderAdapter, never>;
|
|
541
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthStateProviderAdapter>;
|
|
542
|
+
}
|
|
1059
543
|
|
|
1060
|
-
/**
|
|
1061
|
-
* Provides auth layout integration for ng-layout.
|
|
1062
|
-
* Call this in your app.config.ts to integrate ng-auth with ng-layout.
|
|
1063
|
-
*
|
|
1064
|
-
* Also registers LAYOUT_AUTH_STATE since AuthLayoutStateAdapter
|
|
1065
|
-
* implements both ILayoutAuthState and ICompanyContextProvider.
|
|
1066
|
-
*
|
|
1067
|
-
* @example
|
|
1068
|
-
* ```typescript
|
|
1069
|
-
* // In app.config.ts
|
|
1070
|
-
* export const appConfig: ApplicationConfig = {
|
|
1071
|
-
* providers: [
|
|
1072
|
-
* ...provideAuthLayoutIntegration(),
|
|
1073
|
-
* ],
|
|
1074
|
-
* };
|
|
1075
|
-
* ```
|
|
1076
|
-
*/
|
|
544
|
+
/** Provides auth integration for ng-layout */
|
|
1077
545
|
declare function provideAuthLayoutIntegration(): Provider[];
|
|
1078
546
|
|
|
1079
|
-
/**
|
|
1080
|
-
* Provide Auth Provider Adapters
|
|
1081
|
-
*
|
|
1082
|
-
* Registers auth implementations for provider interfaces from ng-shared.
|
|
1083
|
-
* This allows IAM and Storage packages to use auth services without direct dependencies.
|
|
1084
|
-
*
|
|
1085
|
-
* @example
|
|
1086
|
-
* // In app.config.ts
|
|
1087
|
-
* import { provideAuthProviders } from '@flusys/ng-auth';
|
|
1088
|
-
*
|
|
1089
|
-
* export const appConfig: ApplicationConfig = {
|
|
1090
|
-
* providers: [
|
|
1091
|
-
* provideAuthProviders(),
|
|
1092
|
-
* // ... other providers
|
|
1093
|
-
* ]
|
|
1094
|
-
* };
|
|
1095
|
-
*
|
|
1096
|
-
* @returns Array of Angular providers
|
|
1097
|
-
*/
|
|
547
|
+
/** Provides auth implementations for ng-shared provider interfaces */
|
|
1098
548
|
declare function provideAuthProviders(): Provider[];
|
|
1099
549
|
|
|
550
|
+
interface IEmailValidationConfig {
|
|
551
|
+
pattern?: RegExp;
|
|
552
|
+
message?: string;
|
|
553
|
+
messageKey?: string;
|
|
554
|
+
messageParam?: Record<string, string | number>;
|
|
555
|
+
}
|
|
556
|
+
interface IPasswordValidationConfig {
|
|
557
|
+
minLength?: number;
|
|
558
|
+
maxLength?: number;
|
|
559
|
+
requireUppercase?: boolean;
|
|
560
|
+
requireLowercase?: boolean;
|
|
561
|
+
requireNumbers?: boolean;
|
|
562
|
+
requireSpecialChars?: boolean;
|
|
563
|
+
pattern?: RegExp;
|
|
564
|
+
message?: string;
|
|
565
|
+
messageKey?: string;
|
|
566
|
+
messageParam?: Record<string, string | number>;
|
|
567
|
+
}
|
|
568
|
+
interface IAuthValidationConfig {
|
|
569
|
+
email?: IEmailValidationConfig;
|
|
570
|
+
password?: IPasswordValidationConfig;
|
|
571
|
+
}
|
|
572
|
+
declare const AUTH_VALIDATION_CONFIG: InjectionToken<IAuthValidationConfig>;
|
|
573
|
+
interface IRegistrationFieldTemplateContext {
|
|
574
|
+
field: IRegistrationExtraField;
|
|
575
|
+
value: unknown;
|
|
576
|
+
updateValue: (value: unknown) => void;
|
|
577
|
+
}
|
|
578
|
+
declare const REGISTRATION_FIELD_CONTEXT: InjectionToken<IRegistrationFieldTemplateContext>;
|
|
579
|
+
interface IRegistrationExtraField {
|
|
580
|
+
key: string;
|
|
581
|
+
label: string;
|
|
582
|
+
labelKey?: string;
|
|
583
|
+
type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';
|
|
584
|
+
placeholder?: string;
|
|
585
|
+
placeholderKey?: string;
|
|
586
|
+
required?: boolean;
|
|
587
|
+
defaultValue?: unknown;
|
|
588
|
+
options?: Array<{
|
|
589
|
+
label: string;
|
|
590
|
+
labelKey?: string;
|
|
591
|
+
value: unknown;
|
|
592
|
+
}>;
|
|
593
|
+
pattern?: RegExp;
|
|
594
|
+
validationMessage?: string;
|
|
595
|
+
validationMessageKey?: string;
|
|
596
|
+
validationMessageParam?: Record<string, string | number>;
|
|
597
|
+
order?: number;
|
|
598
|
+
containerClass?: string;
|
|
599
|
+
template?: TemplateRef<IRegistrationFieldTemplateContext>;
|
|
600
|
+
component?: Type<unknown>;
|
|
601
|
+
injector?: Injector;
|
|
602
|
+
}
|
|
603
|
+
interface IRegistrationExtensionProvider {
|
|
604
|
+
getExtraFields(): IRegistrationExtraField[];
|
|
605
|
+
transformRegistrationData?(data: Record<string, unknown>): Record<string, unknown>;
|
|
606
|
+
validateExtraFields?(data: Record<string, unknown>): string | null;
|
|
607
|
+
}
|
|
608
|
+
declare const AUTH_REGISTRATION_EXTENSION: InjectionToken<IRegistrationExtensionProvider>;
|
|
609
|
+
interface IUserListExtraColumn {
|
|
610
|
+
key: string;
|
|
611
|
+
header: string;
|
|
612
|
+
headerKey?: string;
|
|
613
|
+
field?: string;
|
|
614
|
+
template?: TemplateRef<{
|
|
615
|
+
$implicit: IUser;
|
|
616
|
+
}>;
|
|
617
|
+
styleClass?: string;
|
|
618
|
+
width?: string;
|
|
619
|
+
sortable?: boolean;
|
|
620
|
+
order?: number;
|
|
621
|
+
}
|
|
622
|
+
interface IUserListExtraAction {
|
|
623
|
+
key: string;
|
|
624
|
+
label: string;
|
|
625
|
+
labelKey?: string;
|
|
626
|
+
icon: string;
|
|
627
|
+
severity?: 'info' | 'success' | 'warn' | 'danger' | 'secondary' | 'contrast';
|
|
628
|
+
permission?: string;
|
|
629
|
+
onClick: (user: IUser) => void;
|
|
630
|
+
isVisible?: (user: IUser) => boolean;
|
|
631
|
+
isDisabled?: (user: IUser) => boolean;
|
|
632
|
+
order?: number;
|
|
633
|
+
}
|
|
634
|
+
interface IUserListExtensionProvider {
|
|
635
|
+
getExtraColumns(): IUserListExtraColumn[];
|
|
636
|
+
getExtraActions(): IUserListExtraAction[];
|
|
637
|
+
enrichUserData?(users: IUser[]): Observable<IUser[]>;
|
|
638
|
+
}
|
|
639
|
+
declare const AUTH_USER_LIST_EXTENSION: InjectionToken<IUserListExtensionProvider>;
|
|
640
|
+
interface IProfileExtraSection {
|
|
641
|
+
key: string;
|
|
642
|
+
title: string;
|
|
643
|
+
titleKey?: string;
|
|
644
|
+
icon?: string;
|
|
645
|
+
order?: number;
|
|
646
|
+
component?: Type<unknown>;
|
|
647
|
+
template?: TemplateRef<{
|
|
648
|
+
user: IUser;
|
|
649
|
+
}>;
|
|
650
|
+
collapsible?: boolean;
|
|
651
|
+
collapsed?: boolean;
|
|
652
|
+
editPermission?: string | ILogicNode;
|
|
653
|
+
}
|
|
654
|
+
interface IProfileFieldTemplateContext {
|
|
655
|
+
field: IProfileExtraField;
|
|
656
|
+
value: unknown;
|
|
657
|
+
updateValue: (value: unknown) => void;
|
|
658
|
+
}
|
|
659
|
+
declare const PROFILE_FIELD_CONTEXT: InjectionToken<IProfileFieldTemplateContext>;
|
|
660
|
+
interface IProfileExtraField {
|
|
661
|
+
key: string;
|
|
662
|
+
label: string;
|
|
663
|
+
labelKey?: string;
|
|
664
|
+
type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';
|
|
665
|
+
placeholder?: string;
|
|
666
|
+
placeholderKey?: string;
|
|
667
|
+
editable?: boolean;
|
|
668
|
+
required?: boolean;
|
|
669
|
+
options?: Array<{
|
|
670
|
+
label: string;
|
|
671
|
+
labelKey?: string;
|
|
672
|
+
value: unknown;
|
|
673
|
+
}>;
|
|
674
|
+
pattern?: RegExp;
|
|
675
|
+
validationMessage?: string;
|
|
676
|
+
validationMessageKey?: string;
|
|
677
|
+
validationMessageParam?: Record<string, string | number>;
|
|
678
|
+
order?: number;
|
|
679
|
+
sectionKey?: string;
|
|
680
|
+
template?: TemplateRef<IProfileFieldTemplateContext>;
|
|
681
|
+
component?: Type<unknown>;
|
|
682
|
+
injector?: Injector;
|
|
683
|
+
}
|
|
684
|
+
interface IProfileExtensionProvider {
|
|
685
|
+
getExtraSections?(): IProfileExtraSection[];
|
|
686
|
+
getExtraFields?(): IProfileExtraField[];
|
|
687
|
+
getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;
|
|
688
|
+
saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;
|
|
689
|
+
validateExtraFields?(data: Record<string, unknown>): string | null;
|
|
690
|
+
}
|
|
691
|
+
declare const AUTH_PROFILE_EXTENSION: InjectionToken<IProfileExtensionProvider>;
|
|
692
|
+
interface IUserFormFieldTemplateContext {
|
|
693
|
+
field: IUserFormExtraField;
|
|
694
|
+
value: unknown;
|
|
695
|
+
updateValue: (value: unknown) => void;
|
|
696
|
+
}
|
|
697
|
+
declare const USER_FORM_FIELD_CONTEXT: InjectionToken<IUserFormFieldTemplateContext>;
|
|
698
|
+
interface IUserFormExtraField {
|
|
699
|
+
key: string;
|
|
700
|
+
label: string;
|
|
701
|
+
labelKey?: string;
|
|
702
|
+
type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';
|
|
703
|
+
placeholder?: string;
|
|
704
|
+
placeholderKey?: string;
|
|
705
|
+
required?: boolean;
|
|
706
|
+
options?: Array<{
|
|
707
|
+
label: string;
|
|
708
|
+
labelKey?: string;
|
|
709
|
+
value: unknown;
|
|
710
|
+
}>;
|
|
711
|
+
pattern?: RegExp;
|
|
712
|
+
validationMessage?: string;
|
|
713
|
+
validationMessageKey?: string;
|
|
714
|
+
validationMessageParam?: Record<string, string | number>;
|
|
715
|
+
order?: number;
|
|
716
|
+
template?: TemplateRef<IUserFormFieldTemplateContext>;
|
|
717
|
+
component?: Type<unknown>;
|
|
718
|
+
injector?: Injector;
|
|
719
|
+
}
|
|
720
|
+
interface IUserFormExtensionProvider {
|
|
721
|
+
getExtraFields?(): IUserFormExtraField[];
|
|
722
|
+
getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;
|
|
723
|
+
saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;
|
|
724
|
+
validateExtraFields?(data: Record<string, unknown>): string | null;
|
|
725
|
+
}
|
|
726
|
+
declare const AUTH_USER_FORM_EXTENSION: InjectionToken<IUserFormExtensionProvider>;
|
|
727
|
+
type UserDetailViewMode = 'dialog' | 'sidebar' | 'page';
|
|
728
|
+
interface IUserDetailViewConfig {
|
|
729
|
+
viewMode: UserDetailViewMode;
|
|
730
|
+
allowEdit?: boolean;
|
|
731
|
+
width?: string;
|
|
732
|
+
component?: Type<unknown>;
|
|
733
|
+
tabs?: Array<{
|
|
734
|
+
key: string;
|
|
735
|
+
label: string;
|
|
736
|
+
labelKey?: string;
|
|
737
|
+
icon?: string;
|
|
738
|
+
component?: Type<unknown>;
|
|
739
|
+
template?: TemplateRef<{
|
|
740
|
+
user: IUser;
|
|
741
|
+
}>;
|
|
742
|
+
}>;
|
|
743
|
+
}
|
|
744
|
+
declare const AUTH_USER_DETAIL_CONFIG: InjectionToken<IUserDetailViewConfig>;
|
|
745
|
+
declare function validatePassword(password: string, config: IPasswordValidationConfig): string | null;
|
|
746
|
+
declare function validateEmail(email: string, config?: IEmailValidationConfig): string | null;
|
|
747
|
+
|
|
1100
748
|
/**
|
|
1101
749
|
* Authentication API Endpoints
|
|
1102
750
|
*
|
|
1103
751
|
* Centralized endpoint definitions to prevent inconsistencies across interceptors
|
|
1104
752
|
* and services. All auth-related endpoints should be referenced from here.
|
|
1105
|
-
*
|
|
1106
|
-
* @example
|
|
1107
|
-
* ```typescript
|
|
1108
|
-
* if (isAuthEndpoint(req.url)) {
|
|
1109
|
-
* // Skip interceptor logic
|
|
1110
|
-
* }
|
|
1111
|
-
* ```
|
|
1112
753
|
*/
|
|
1113
754
|
declare const AUTH_ENDPOINTS: {
|
|
1114
755
|
readonly LOGIN: "/auth/login";
|
|
1115
756
|
readonly LOGOUT: "/auth/logout";
|
|
1116
757
|
readonly REFRESH: "/auth/refresh";
|
|
1117
758
|
readonly REGISTER: "/auth/register";
|
|
759
|
+
readonly ME: "/auth/me";
|
|
1118
760
|
readonly SELECT: "/auth/select";
|
|
1119
761
|
readonly SWITCH_COMPANY: "/auth/switch-company";
|
|
762
|
+
readonly CHANGE_PASSWORD: "/auth/change-password";
|
|
1120
763
|
readonly VERIFY_EMAIL: "/auth/verify-email";
|
|
1121
764
|
readonly FORGOT_PASSWORD: "/auth/forgot-password";
|
|
1122
765
|
readonly RESET_PASSWORD: "/auth/reset-password";
|
|
1123
766
|
readonly RESEND_VERIFICATION: "/auth/resend-verification";
|
|
1124
767
|
};
|
|
1125
|
-
/**
|
|
1126
|
-
* Check if a URL is an auth-related endpoint
|
|
1127
|
-
*/
|
|
1128
|
-
declare function isAuthEndpoint(url: string): boolean;
|
|
1129
|
-
/**
|
|
1130
|
-
* Check if a URL is a specific auth endpoint
|
|
1131
|
-
*/
|
|
768
|
+
/** Check if a URL matches a specific endpoint */
|
|
1132
769
|
declare function isEndpoint(url: string, endpoint: string): boolean;
|
|
1133
770
|
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
label: string;
|
|
1137
|
-
icon: string;
|
|
1138
|
-
route: string;
|
|
1139
|
-
requiresCompanyFeature?: boolean;
|
|
1140
|
-
}
|
|
771
|
+
declare const AUTH_MESSAGES: Record<string, string>;
|
|
772
|
+
|
|
1141
773
|
/**
|
|
1142
774
|
* Administration Page Component
|
|
1143
775
|
* Unified administration page with tabs for:
|
|
@@ -1147,14 +779,14 @@ interface ITab {
|
|
|
1147
779
|
*/
|
|
1148
780
|
declare class AdministrationPageComponent {
|
|
1149
781
|
private readonly appConfig;
|
|
782
|
+
private readonly permissionValidator;
|
|
783
|
+
private readonly translateService;
|
|
1150
784
|
/** All available tabs */
|
|
1151
785
|
private readonly allTabs;
|
|
1152
786
|
/** Check if company feature is enabled */
|
|
1153
787
|
readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
|
|
1154
|
-
/** Visible tabs based on config */
|
|
1155
|
-
readonly visibleTabs: _angular_core.Signal<
|
|
1156
|
-
/** Dynamic subtitle based on visible features */
|
|
1157
|
-
readonly subtitle: _angular_core.Signal<"Manage users, companies, and branches" | "Manage users">;
|
|
788
|
+
/** Visible tabs based on config and permissions */
|
|
789
|
+
readonly visibleTabs: _angular_core.Signal<RouterTabItem[]>;
|
|
1158
790
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdministrationPageComponent, never>;
|
|
1159
791
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdministrationPageComponent, "lib-administration-page", never, {}, {}, never, never, true, never>;
|
|
1160
792
|
}
|
|
@@ -1174,13 +806,17 @@ interface IBranchFormModel {
|
|
|
1174
806
|
* Handles creating and editing branches.
|
|
1175
807
|
* Defaults to current company context.
|
|
1176
808
|
*/
|
|
1177
|
-
declare class BranchFormComponent
|
|
809
|
+
declare class BranchFormComponent {
|
|
1178
810
|
private readonly router;
|
|
1179
811
|
private readonly route;
|
|
1180
812
|
private readonly messageService;
|
|
1181
813
|
private readonly branchService;
|
|
1182
814
|
private readonly companyService;
|
|
1183
815
|
private readonly authState;
|
|
816
|
+
private readonly translateAdapter;
|
|
817
|
+
private translate;
|
|
818
|
+
private readonly routeParams;
|
|
819
|
+
private readonly queryParams;
|
|
1184
820
|
/** Loading state */
|
|
1185
821
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1186
822
|
/** Existing branch data when editing */
|
|
@@ -1192,24 +828,32 @@ declare class BranchFormComponent implements OnInit {
|
|
|
1192
828
|
/** Form model */
|
|
1193
829
|
readonly formModel: _angular_core.WritableSignal<IBranchFormModel>;
|
|
1194
830
|
/** Form with validation schema */
|
|
1195
|
-
readonly branchForm: _angular_forms_signals.FieldTree<IBranchFormModel, string | number>;
|
|
831
|
+
readonly branchForm: _angular_forms_signals.FieldTree<IBranchFormModel, string | number, "writable">;
|
|
1196
832
|
/** Check if form is valid */
|
|
1197
833
|
readonly isFormValid: _angular_core.Signal<boolean>;
|
|
1198
|
-
|
|
834
|
+
constructor();
|
|
1199
835
|
loadBranch(id: string): Promise<void>;
|
|
836
|
+
private toFormModel;
|
|
1200
837
|
generateSlug(): void;
|
|
1201
838
|
onSubmit(): Promise<void>;
|
|
839
|
+
private updateBranch;
|
|
840
|
+
private createBranch;
|
|
841
|
+
private buildOptionalFields;
|
|
842
|
+
private onSaveSuccess;
|
|
843
|
+
private getTargetCompanyId;
|
|
844
|
+
private navigateToList;
|
|
1202
845
|
onCancel(): void;
|
|
1203
846
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BranchFormComponent, never>;
|
|
1204
847
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BranchFormComponent, "lib-branch-form", never, {}, {}, never, never, true, never>;
|
|
1205
848
|
}
|
|
1206
849
|
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
850
|
+
declare class BranchListComponent {
|
|
851
|
+
readonly BRANCH_PERMISSIONS: {
|
|
852
|
+
readonly CREATE: "branch.create";
|
|
853
|
+
readonly READ: "branch.read";
|
|
854
|
+
readonly UPDATE: "branch.update";
|
|
855
|
+
readonly DELETE: "branch.delete";
|
|
856
|
+
};
|
|
1213
857
|
private readonly router;
|
|
1214
858
|
private readonly route;
|
|
1215
859
|
private readonly messageService;
|
|
@@ -1217,8 +861,12 @@ declare class BranchListComponent implements OnInit {
|
|
|
1217
861
|
private readonly branchService;
|
|
1218
862
|
private readonly companyService;
|
|
1219
863
|
private readonly authState;
|
|
1220
|
-
|
|
1221
|
-
|
|
864
|
+
private readonly translateAdapter;
|
|
865
|
+
private translate;
|
|
866
|
+
private readonly queryParamMap;
|
|
867
|
+
private initialized;
|
|
868
|
+
/** Selected company ID (signal for zoneless change detection) */
|
|
869
|
+
readonly selectedCompanyId: _angular_core.WritableSignal<string | null>;
|
|
1222
870
|
/** Companies list for dropdown */
|
|
1223
871
|
readonly companies: _angular_core.Signal<_flusys_ng_auth.ICompany[]>;
|
|
1224
872
|
/** Branches from service */
|
|
@@ -1227,8 +875,8 @@ declare class BranchListComponent implements OnInit {
|
|
|
1227
875
|
readonly isLoading: _angular_core.Signal<boolean>;
|
|
1228
876
|
/** Total count from service */
|
|
1229
877
|
readonly total: _angular_core.Signal<number>;
|
|
1230
|
-
|
|
1231
|
-
loadBranches(): void;
|
|
878
|
+
constructor();
|
|
879
|
+
loadBranches(page?: number, pageSize?: number): void;
|
|
1232
880
|
onCompanyChange(): void;
|
|
1233
881
|
onLazyLoad(event: {
|
|
1234
882
|
first?: number | null;
|
|
@@ -1241,72 +889,34 @@ declare class BranchListComponent implements OnInit {
|
|
|
1241
889
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BranchListComponent, "lib-branch-list", never, {}, {}, never, never, true, never>;
|
|
1242
890
|
}
|
|
1243
891
|
|
|
1244
|
-
|
|
1245
|
-
interface ICompanyFormModel$1 {
|
|
1246
|
-
name: string;
|
|
1247
|
-
slug: string;
|
|
1248
|
-
email: string;
|
|
1249
|
-
phone: string;
|
|
1250
|
-
website: string;
|
|
1251
|
-
address: string;
|
|
1252
|
-
isActive: boolean;
|
|
1253
|
-
}
|
|
1254
|
-
/**
|
|
1255
|
-
* Company Form Component
|
|
1256
|
-
* Handles creating and editing companies.
|
|
1257
|
-
*/
|
|
1258
|
-
declare class CompanyFormComponent implements OnInit {
|
|
1259
|
-
private readonly router;
|
|
892
|
+
declare class CompanyFormComponent {
|
|
1260
893
|
private readonly route;
|
|
1261
|
-
private readonly
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
readonly
|
|
1265
|
-
|
|
1266
|
-
readonly
|
|
1267
|
-
|
|
1268
|
-
readonly
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
/** Form with validation schema */
|
|
1272
|
-
readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel$1, string | number>;
|
|
1273
|
-
/** Check if form is valid */
|
|
1274
|
-
readonly isFormValid: _angular_core.Signal<boolean>;
|
|
1275
|
-
ngOnInit(): void;
|
|
1276
|
-
loadCompany(id: string): Promise<void>;
|
|
1277
|
-
generateSlug(): void;
|
|
1278
|
-
onSubmit(): Promise<void>;
|
|
1279
|
-
onCancel(): void;
|
|
894
|
+
private readonly translateAdapter;
|
|
895
|
+
readonly companyService: CompanyApiService;
|
|
896
|
+
readonly formRef: _angular_core.Signal<BaseFormComponent | undefined>;
|
|
897
|
+
private readonly routeParams;
|
|
898
|
+
readonly editId: _angular_core.Signal<string | null>;
|
|
899
|
+
readonly fields: IFormField[];
|
|
900
|
+
readonly buildRequest: (data: Record<string, unknown>, editId: string | null) => unknown;
|
|
901
|
+
readonly toFormModel: (entity: unknown) => Record<string, unknown>;
|
|
902
|
+
onFormValueChange(data: Record<string, unknown>): void;
|
|
903
|
+
private t;
|
|
1280
904
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyFormComponent, never>;
|
|
1281
905
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyFormComponent, "lib-company-form", never, {}, {}, never, never, true, never>;
|
|
1282
906
|
}
|
|
1283
907
|
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
* Only visible when company feature is enabled.
|
|
1288
|
-
*/
|
|
1289
|
-
declare class CompanyListComponent implements OnInit {
|
|
908
|
+
declare class CompanyListComponent {
|
|
909
|
+
private readonly permissionValidator;
|
|
910
|
+
private readonly translateAdapter;
|
|
1290
911
|
private readonly router;
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
readonly
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
readonly total: _angular_core.Signal<number>;
|
|
1300
|
-
ngOnInit(): void;
|
|
1301
|
-
loadCompanies(): void;
|
|
1302
|
-
onLazyLoad(event: {
|
|
1303
|
-
first?: number | null;
|
|
1304
|
-
rows?: number | null;
|
|
1305
|
-
}): void;
|
|
1306
|
-
onCreate(): void;
|
|
1307
|
-
onEdit(company: ICompany): void;
|
|
1308
|
-
onViewBranches(company: ICompany): void;
|
|
1309
|
-
onDelete(company: ICompany): void;
|
|
912
|
+
readonly companyService: CompanyApiService;
|
|
913
|
+
readonly canCreate: _angular_core.Signal<boolean>;
|
|
914
|
+
readonly canEditFn: (_item: unknown) => boolean;
|
|
915
|
+
readonly canDeleteFn: (item: unknown) => boolean;
|
|
916
|
+
readonly viewBranchesAction: ITableAction[];
|
|
917
|
+
readonly columns: ITableColumn[];
|
|
918
|
+
asCompany(item: unknown): ICompany;
|
|
919
|
+
private t;
|
|
1310
920
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyListComponent, never>;
|
|
1311
921
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyListComponent, "lib-company-list", never, {}, {}, never, never, true, never>;
|
|
1312
922
|
}
|
|
@@ -1318,72 +928,66 @@ declare class ForgotPasswordPageComponent {
|
|
|
1318
928
|
private readonly destroyRef;
|
|
1319
929
|
private readonly messageService;
|
|
1320
930
|
private readonly authApi;
|
|
931
|
+
private readonly translateAdapter;
|
|
932
|
+
private translate;
|
|
1321
933
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1322
934
|
readonly emailSent: _angular_core.WritableSignal<boolean>;
|
|
1323
935
|
readonly submittedEmail: _angular_core.WritableSignal<string>;
|
|
1324
936
|
readonly formModel: _angular_core.WritableSignal<IForgotPasswordFormModel>;
|
|
1325
|
-
readonly forgotForm: _angular_forms_signals.FieldTree<IForgotPasswordFormModel, string | number>;
|
|
937
|
+
readonly forgotForm: _angular_forms_signals.FieldTree<IForgotPasswordFormModel, string | number, "writable">;
|
|
1326
938
|
readonly isFormValid: _angular_core.Signal<boolean>;
|
|
1327
939
|
onSubmit(): void;
|
|
940
|
+
private showEmailSent;
|
|
1328
941
|
resetForm(): void;
|
|
1329
942
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForgotPasswordPageComponent, never>;
|
|
1330
943
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ForgotPasswordPageComponent, "lib-forgot-password-page", never, {}, {}, never, never, true, never>;
|
|
1331
944
|
}
|
|
1332
945
|
|
|
1333
|
-
/** Login form model interface */
|
|
1334
946
|
interface ILoginFormModel {
|
|
1335
947
|
email: string;
|
|
1336
948
|
password: string;
|
|
1337
949
|
rememberMe: boolean;
|
|
1338
950
|
}
|
|
1339
|
-
/** Company selection form model interface */
|
|
1340
951
|
interface ISelectionFormModel {
|
|
1341
952
|
companyId: string;
|
|
1342
953
|
branchId: string;
|
|
1343
954
|
rememberSelection: boolean;
|
|
1344
955
|
}
|
|
1345
956
|
type LoginStep = 'credentials' | 'company-selection' | 'email-verification';
|
|
1346
|
-
|
|
1347
|
-
* Login Page Component
|
|
1348
|
-
* Multi-step authentication flow:
|
|
1349
|
-
* - Step 1: Email/Password credentials
|
|
1350
|
-
* - Step 2: Company/Branch selection (when company feature enabled and user has multiple)
|
|
1351
|
-
*/
|
|
1352
|
-
declare class LoginPageComponent implements OnInit {
|
|
957
|
+
declare class LoginPageComponent {
|
|
1353
958
|
private readonly destroyRef;
|
|
1354
959
|
private readonly appConfig;
|
|
1355
960
|
private readonly messageService;
|
|
1356
961
|
private readonly authApi;
|
|
1357
962
|
private readonly authState;
|
|
963
|
+
private readonly translateAdapter;
|
|
964
|
+
private readonly validationConfig;
|
|
965
|
+
private translate;
|
|
1358
966
|
readonly returnUrl: _angular_core.InputSignal<string>;
|
|
1359
967
|
readonly currentStep: _angular_core.WritableSignal<LoginStep>;
|
|
1360
968
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1361
969
|
readonly unverifiedEmail: _angular_core.WritableSignal<string>;
|
|
1362
|
-
/** Login form model */
|
|
1363
970
|
readonly loginFormModel: _angular_core.WritableSignal<ILoginFormModel>;
|
|
1364
|
-
|
|
1365
|
-
readonly
|
|
1366
|
-
|
|
971
|
+
private readonly emailErrorMessage;
|
|
972
|
+
private readonly passwordMinLength;
|
|
973
|
+
private readonly passwordErrorMessage;
|
|
974
|
+
readonly loginForm: _angular_forms_signals.FieldTree<ILoginFormModel, string | number, "writable">;
|
|
975
|
+
readonly emailValidationError: _angular_core.Signal<string | null>;
|
|
976
|
+
readonly passwordValidationError: _angular_core.Signal<string | null>;
|
|
1367
977
|
readonly isLoginFormValid: _angular_core.Signal<boolean>;
|
|
1368
|
-
/** Selection form model */
|
|
1369
978
|
readonly selectionFormModel: _angular_core.WritableSignal<ISelectionFormModel>;
|
|
1370
|
-
|
|
1371
|
-
readonly selectionForm: _angular_forms_signals.FieldTree<ISelectionFormModel, string | number>;
|
|
1372
|
-
/** Check if selection form is valid */
|
|
979
|
+
readonly selectionForm: _angular_forms_signals.FieldTree<ISelectionFormModel, string | number, "writable">;
|
|
1373
980
|
readonly isSelectionFormValid: _angular_core.Signal<boolean>;
|
|
1374
|
-
/** Whether company feature is enabled */
|
|
1375
981
|
readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
|
|
1376
|
-
|
|
982
|
+
readonly emailFeatureEnabled: _angular_core.Signal<boolean>;
|
|
983
|
+
readonly signUpEnabled: _angular_core.Signal<boolean>;
|
|
1377
984
|
private sessionId;
|
|
1378
|
-
/** Available companies */
|
|
1379
985
|
readonly companies: _angular_core.WritableSignal<ICompanyWithBranches[]>;
|
|
1380
|
-
/** User's name */
|
|
1381
986
|
readonly userName: _angular_core.WritableSignal<string>;
|
|
1382
|
-
/** Branches for selected company */
|
|
1383
987
|
readonly branches: _angular_core.Signal<IBranchSelectionInfo[]>;
|
|
1384
|
-
|
|
988
|
+
constructor();
|
|
989
|
+
private restorePendingSelectionState;
|
|
1385
990
|
onSubmit(): void;
|
|
1386
|
-
/** Handle company selection change */
|
|
1387
991
|
onCompanyChange(): void;
|
|
1388
992
|
onSelectCompany(): void;
|
|
1389
993
|
goBackToCredentials(): void;
|
|
@@ -1393,32 +997,16 @@ declare class LoginPageComponent implements OnInit {
|
|
|
1393
997
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoginPageComponent, "lib-login-page", never, { "returnUrl": { "alias": "returnUrl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1394
998
|
}
|
|
1395
999
|
|
|
1396
|
-
/** Profile form model */
|
|
1397
1000
|
interface IProfileFormModel {
|
|
1398
1001
|
name: string;
|
|
1399
1002
|
phone: string;
|
|
1400
1003
|
}
|
|
1401
|
-
/** Password form model */
|
|
1402
1004
|
interface IPasswordFormModel {
|
|
1403
1005
|
currentPassword: string;
|
|
1404
1006
|
newPassword: string;
|
|
1405
1007
|
confirmPassword: string;
|
|
1406
1008
|
}
|
|
1407
|
-
|
|
1408
|
-
* Profile Page Component
|
|
1409
|
-
*
|
|
1410
|
-
* Allows users to view and update their profile information.
|
|
1411
|
-
* Features:
|
|
1412
|
-
* - Update name, phone, profile picture (if storage enabled)
|
|
1413
|
-
* - View company/branch info (read-only, if company feature enabled)
|
|
1414
|
-
* - View roles/actions (read-only, if IAM enabled via optional injection)
|
|
1415
|
-
*
|
|
1416
|
-
* Package Independence:
|
|
1417
|
-
* - Uses PROFILE_UPLOAD_PROVIDER (optional) for storage functionality
|
|
1418
|
-
* - Uses PROFILE_PERMISSION_PROVIDER (optional) for IAM functionality
|
|
1419
|
-
* - No direct imports from ng-storage or ng-iam
|
|
1420
|
-
*/
|
|
1421
|
-
declare class ProfilePageComponent implements OnInit {
|
|
1009
|
+
declare class ProfilePageComponent {
|
|
1422
1010
|
private readonly destroyRef;
|
|
1423
1011
|
private readonly appConfig;
|
|
1424
1012
|
private readonly messageService;
|
|
@@ -1426,16 +1014,30 @@ declare class ProfilePageComponent implements OnInit {
|
|
|
1426
1014
|
private readonly userService;
|
|
1427
1015
|
private readonly authApiService;
|
|
1428
1016
|
private readonly fileUrlService;
|
|
1429
|
-
private readonly
|
|
1017
|
+
private readonly fileProvider;
|
|
1430
1018
|
private readonly permissionProvider;
|
|
1019
|
+
private readonly profileExtension;
|
|
1020
|
+
private readonly userFormExtension;
|
|
1021
|
+
private readonly translateAdapter;
|
|
1022
|
+
private translate;
|
|
1431
1023
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1432
1024
|
readonly isLoadingPermissions: _angular_core.WritableSignal<boolean>;
|
|
1025
|
+
readonly isLoadingExtraFields: _angular_core.WritableSignal<boolean>;
|
|
1433
1026
|
private readonly _profilePictureUrl;
|
|
1434
1027
|
readonly profilePictureUrl: _angular_core.Signal<string | null>;
|
|
1435
1028
|
private readonly _userRoles;
|
|
1436
1029
|
readonly userRoles: _angular_core.Signal<IProfileRoleInfo[]>;
|
|
1437
1030
|
private readonly _userActions;
|
|
1438
1031
|
readonly userActions: _angular_core.Signal<IProfileActionInfo[]>;
|
|
1032
|
+
readonly extraSections: _angular_core.Signal<IProfileExtraSection[]>;
|
|
1033
|
+
readonly editableFields: _angular_core.Signal<IProfileExtraField[]>;
|
|
1034
|
+
readonly viewOnlyFields: _angular_core.Signal<IUserFormExtraField[]>;
|
|
1035
|
+
readonly hasExtraContent: _angular_core.Signal<boolean>;
|
|
1036
|
+
readonly extraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1037
|
+
readonly originalExtraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1038
|
+
readonly adminFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1039
|
+
readonly isExtraFieldsDirty: _angular_core.Signal<boolean>;
|
|
1040
|
+
readonly extraFieldsValidationError: _angular_core.Signal<string | null>;
|
|
1439
1041
|
readonly userEmail: _angular_core.Signal<string>;
|
|
1440
1042
|
readonly userName: _angular_core.Signal<string>;
|
|
1441
1043
|
readonly userInitials: _angular_core.Signal<string>;
|
|
@@ -1448,19 +1050,34 @@ declare class ProfilePageComponent implements OnInit {
|
|
|
1448
1050
|
readonly showRoles: _angular_core.Signal<boolean>;
|
|
1449
1051
|
readonly showActions: _angular_core.Signal<boolean>;
|
|
1450
1052
|
readonly showBottomRow: _angular_core.Signal<boolean>;
|
|
1053
|
+
private readonly originalFormModel;
|
|
1451
1054
|
readonly formModel: _angular_core.WritableSignal<IProfileFormModel>;
|
|
1452
|
-
readonly formTree: _angular_forms_signals.FieldTree<IProfileFormModel, string | number>;
|
|
1055
|
+
readonly formTree: _angular_forms_signals.FieldTree<IProfileFormModel, string | number, "writable">;
|
|
1453
1056
|
readonly isFormValid: _angular_core.Signal<boolean>;
|
|
1057
|
+
readonly isFormDirty: _angular_core.Signal<boolean>;
|
|
1058
|
+
updateExtraField(key: string, value: unknown): void;
|
|
1059
|
+
getExtraFieldValue(key: string): unknown;
|
|
1060
|
+
getAdminFieldValue(key: string): unknown;
|
|
1061
|
+
getSelectLabel(field: IProfileExtraField | IUserFormExtraField, value: unknown): string;
|
|
1062
|
+
getFieldTemplateContext(field: IProfileExtraField): IProfileFieldTemplateContext;
|
|
1063
|
+
private readonly parentInjector;
|
|
1064
|
+
getFieldInjector(field: IProfileExtraField): Injector;
|
|
1454
1065
|
readonly passwordModel: _angular_core.WritableSignal<IPasswordFormModel>;
|
|
1066
|
+
readonly visiblePasswords: _angular_core.WritableSignal<Record<keyof IPasswordFormModel, boolean>>;
|
|
1455
1067
|
readonly isPasswordLoading: _angular_core.WritableSignal<boolean>;
|
|
1456
1068
|
readonly isPasswordFormValid: _angular_core.Signal<boolean>;
|
|
1457
1069
|
readonly passwordsMatch: _angular_core.Signal<boolean>;
|
|
1458
|
-
readonly
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1070
|
+
readonly profileUploadOptions: {
|
|
1071
|
+
folderPath: string;
|
|
1072
|
+
compress: boolean;
|
|
1073
|
+
maxWidth: number;
|
|
1074
|
+
maxHeight: number;
|
|
1075
|
+
isPrivate: boolean;
|
|
1076
|
+
};
|
|
1077
|
+
constructor();
|
|
1462
1078
|
private loadUserData;
|
|
1463
1079
|
private loadPermissions;
|
|
1080
|
+
private loadExtraFields;
|
|
1464
1081
|
onProfilePictureUploaded(file: {
|
|
1465
1082
|
id?: string;
|
|
1466
1083
|
name: string;
|
|
@@ -1469,6 +1086,7 @@ declare class ProfilePageComponent implements OnInit {
|
|
|
1469
1086
|
contentType: string;
|
|
1470
1087
|
}): void;
|
|
1471
1088
|
onSubmit(): void;
|
|
1089
|
+
togglePasswordVisibility(field: keyof IPasswordFormModel): void;
|
|
1472
1090
|
updatePasswordField(field: keyof IPasswordFormModel, value: string): void;
|
|
1473
1091
|
onChangePassword(): void;
|
|
1474
1092
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProfilePageComponent, never>;
|
|
@@ -1490,7 +1108,7 @@ interface ICompanyFormModel {
|
|
|
1490
1108
|
newCompanyPhone: string;
|
|
1491
1109
|
newCompanyAddress: string;
|
|
1492
1110
|
}
|
|
1493
|
-
declare class RegisterPageComponent
|
|
1111
|
+
declare class RegisterPageComponent {
|
|
1494
1112
|
private readonly destroyRef;
|
|
1495
1113
|
private readonly appConfig;
|
|
1496
1114
|
private readonly messageService;
|
|
@@ -1498,16 +1116,39 @@ declare class RegisterPageComponent implements OnInit {
|
|
|
1498
1116
|
private readonly authState;
|
|
1499
1117
|
private readonly route;
|
|
1500
1118
|
private readonly router;
|
|
1119
|
+
private readonly validationConfig;
|
|
1120
|
+
private readonly registrationExtension;
|
|
1121
|
+
private readonly translateAdapter;
|
|
1122
|
+
private translate;
|
|
1123
|
+
private readonly queryParamMap;
|
|
1124
|
+
private companySlugInitialized;
|
|
1501
1125
|
readonly returnUrl: _angular_core.InputSignal<string>;
|
|
1502
1126
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1503
1127
|
readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
|
|
1128
|
+
readonly defaultCompanySlug: _angular_core.Signal<string | undefined>;
|
|
1129
|
+
readonly defaultBranchSlug: _angular_core.Signal<string | undefined>;
|
|
1130
|
+
readonly hasDefaultCompany: _angular_core.Signal<boolean>;
|
|
1131
|
+
readonly hasDefaultBranch: _angular_core.Signal<boolean>;
|
|
1132
|
+
readonly extraFields: _angular_core.Signal<IRegistrationExtraField[]>;
|
|
1133
|
+
readonly extraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1134
|
+
private readonly emailErrorMessage;
|
|
1135
|
+
readonly passwordMinLength: _angular_core.Signal<number>;
|
|
1136
|
+
private readonly passwordErrorMessage;
|
|
1504
1137
|
readonly userFormModel: _angular_core.WritableSignal<IUserFormModel$1>;
|
|
1505
|
-
readonly userForm: _angular_forms_signals.FieldTree<IUserFormModel$1, string | number>;
|
|
1138
|
+
readonly userForm: _angular_forms_signals.FieldTree<IUserFormModel$1, string | number, "writable">;
|
|
1506
1139
|
readonly companyFormModel: _angular_core.WritableSignal<ICompanyFormModel>;
|
|
1507
|
-
readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel, string | number>;
|
|
1140
|
+
readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel, string | number, "writable">;
|
|
1141
|
+
readonly emailValidationError: _angular_core.Signal<string | null>;
|
|
1142
|
+
readonly passwordValidationError: _angular_core.Signal<string | null>;
|
|
1143
|
+
readonly extraFieldsValidationError: _angular_core.Signal<string | null>;
|
|
1508
1144
|
readonly passwordsMatch: _angular_core.Signal<boolean>;
|
|
1509
1145
|
readonly isFormValid: _angular_core.Signal<boolean>;
|
|
1510
|
-
|
|
1146
|
+
private validateRequiredExtraFields;
|
|
1147
|
+
updateExtraField(key: string, value: unknown): void;
|
|
1148
|
+
getFieldTemplateContext(field: IRegistrationExtraField): IRegistrationFieldTemplateContext;
|
|
1149
|
+
private readonly parentInjector;
|
|
1150
|
+
getFieldInjector(field: IRegistrationExtraField): Injector;
|
|
1151
|
+
constructor();
|
|
1511
1152
|
onCreateCompanyToggle(): void;
|
|
1512
1153
|
onSubmit(): void;
|
|
1513
1154
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RegisterPageComponent, never>;
|
|
@@ -1519,25 +1160,28 @@ interface IResetPasswordFormModel {
|
|
|
1519
1160
|
confirmPassword: string;
|
|
1520
1161
|
}
|
|
1521
1162
|
type PageState$1 = 'form' | 'success' | 'invalid-token';
|
|
1522
|
-
declare class ResetPasswordPageComponent
|
|
1163
|
+
declare class ResetPasswordPageComponent {
|
|
1523
1164
|
private readonly destroyRef;
|
|
1524
1165
|
private readonly route;
|
|
1525
1166
|
private readonly messageService;
|
|
1526
1167
|
private readonly authApi;
|
|
1168
|
+
private readonly translateAdapter;
|
|
1169
|
+
private translate;
|
|
1170
|
+
private readonly queryParams;
|
|
1171
|
+
private tokenInitialized;
|
|
1527
1172
|
private token;
|
|
1528
1173
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1529
1174
|
readonly pageState: _angular_core.WritableSignal<PageState$1>;
|
|
1530
1175
|
readonly formModel: _angular_core.WritableSignal<IResetPasswordFormModel>;
|
|
1531
|
-
readonly resetForm: _angular_forms_signals.FieldTree<IResetPasswordFormModel, string | number>;
|
|
1176
|
+
readonly resetForm: _angular_forms_signals.FieldTree<IResetPasswordFormModel, string | number, "writable">;
|
|
1532
1177
|
readonly passwordMismatch: _angular_core.Signal<boolean>;
|
|
1533
1178
|
readonly canSubmit: _angular_core.Signal<boolean>;
|
|
1534
|
-
|
|
1179
|
+
constructor();
|
|
1535
1180
|
onSubmit(): void;
|
|
1536
1181
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ResetPasswordPageComponent, never>;
|
|
1537
1182
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResetPasswordPageComponent, "lib-reset-password-page", never, {}, {}, never, never, true, never>;
|
|
1538
1183
|
}
|
|
1539
1184
|
|
|
1540
|
-
/** User form model interface */
|
|
1541
1185
|
interface IUserFormModel {
|
|
1542
1186
|
name: string;
|
|
1543
1187
|
email: string;
|
|
@@ -1546,12 +1190,7 @@ interface IUserFormModel {
|
|
|
1546
1190
|
isActive: boolean;
|
|
1547
1191
|
emailVerified: boolean;
|
|
1548
1192
|
}
|
|
1549
|
-
|
|
1550
|
-
* User Form Component
|
|
1551
|
-
* Handles creating and editing users.
|
|
1552
|
-
* When company feature is enabled, automatically assigns new users to current company/branch.
|
|
1553
|
-
*/
|
|
1554
|
-
declare class UserFormComponent implements OnInit {
|
|
1193
|
+
declare class UserFormComponent {
|
|
1555
1194
|
private readonly destroyRef;
|
|
1556
1195
|
private readonly router;
|
|
1557
1196
|
private readonly route;
|
|
@@ -1560,60 +1199,81 @@ declare class UserFormComponent implements OnInit {
|
|
|
1560
1199
|
private readonly userService;
|
|
1561
1200
|
private readonly permissionService;
|
|
1562
1201
|
private readonly authState;
|
|
1563
|
-
|
|
1202
|
+
private readonly translateAdapter;
|
|
1203
|
+
private readonly userFormExtension;
|
|
1204
|
+
private readonly parentInjector;
|
|
1205
|
+
private translate;
|
|
1206
|
+
private readonly routeParams;
|
|
1207
|
+
private userLoadTriggered;
|
|
1564
1208
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1565
|
-
/** Existing user data when editing */
|
|
1566
1209
|
readonly existingUser: _angular_core.WritableSignal<IUser | null>;
|
|
1567
|
-
/** Whether in edit mode */
|
|
1568
1210
|
readonly isEditMode: _angular_core.Signal<boolean>;
|
|
1569
|
-
/** Whether company feature is enabled */
|
|
1570
1211
|
readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
|
|
1571
|
-
/** Current company name */
|
|
1572
1212
|
readonly currentCompanyName: _angular_core.Signal<string>;
|
|
1573
|
-
/** Current branch name */
|
|
1574
1213
|
readonly currentBranchName: _angular_core.Signal<string>;
|
|
1575
|
-
/** Form model */
|
|
1576
1214
|
readonly formModel: _angular_core.WritableSignal<IUserFormModel>;
|
|
1577
|
-
|
|
1578
|
-
readonly
|
|
1579
|
-
|
|
1215
|
+
readonly formTree: _angular_forms_signals.FieldTree<IUserFormModel, string | number, "writable">;
|
|
1216
|
+
readonly isLoadingExtraFields: _angular_core.WritableSignal<boolean>;
|
|
1217
|
+
readonly extraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1218
|
+
readonly originalExtraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1219
|
+
readonly extraFields: _angular_core.Signal<IUserFormExtraField[]>;
|
|
1220
|
+
readonly hasExtraFields: _angular_core.Signal<boolean>;
|
|
1221
|
+
readonly extraFieldsValidationError: _angular_core.Signal<string | null>;
|
|
1222
|
+
readonly isExtraFieldsDirty: _angular_core.Signal<boolean>;
|
|
1223
|
+
updateExtraField(key: string, value: unknown): void;
|
|
1224
|
+
getExtraFieldValue(key: string): unknown;
|
|
1225
|
+
getFieldTemplateContext(field: IUserFormExtraField): IUserFormFieldTemplateContext;
|
|
1226
|
+
getFieldInjector(field: IUserFormExtraField): Injector;
|
|
1580
1227
|
readonly isFormValid: _angular_core.Signal<boolean>;
|
|
1581
|
-
|
|
1582
|
-
loadUser(id: string): void
|
|
1228
|
+
constructor();
|
|
1229
|
+
loadUser(id: string): Promise<void>;
|
|
1230
|
+
private loadExtraFields;
|
|
1231
|
+
private toFormModel;
|
|
1583
1232
|
onSubmit(): void;
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1233
|
+
private updateUser;
|
|
1234
|
+
private createUser;
|
|
1235
|
+
private saveExtraFieldsForNewUser;
|
|
1236
|
+
private onSaveSuccess;
|
|
1587
1237
|
private assignUserToCompanyAndBranch;
|
|
1588
1238
|
onCancel(): void;
|
|
1589
1239
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserFormComponent, never>;
|
|
1590
1240
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserFormComponent, "lib-user-form", never, {}, {}, never, never, true, never>;
|
|
1591
1241
|
}
|
|
1592
1242
|
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1243
|
+
declare class UserListComponent {
|
|
1244
|
+
readonly USER_PERMISSIONS: {
|
|
1245
|
+
readonly CREATE: "user.create";
|
|
1246
|
+
readonly READ: "user.read";
|
|
1247
|
+
readonly UPDATE: "user.update";
|
|
1248
|
+
readonly DELETE: "user.delete";
|
|
1249
|
+
};
|
|
1598
1250
|
private readonly router;
|
|
1599
1251
|
private readonly appConfig;
|
|
1600
1252
|
private readonly messageService;
|
|
1601
1253
|
private readonly confirmationService;
|
|
1602
1254
|
private readonly userService;
|
|
1603
|
-
|
|
1255
|
+
private readonly userListExtension;
|
|
1256
|
+
readonly userDetailConfig: _flusys_ng_auth.IUserDetailViewConfig | null;
|
|
1257
|
+
private readonly translateAdapter;
|
|
1258
|
+
private translate;
|
|
1604
1259
|
readonly users: _angular_core.Signal<IUser[]>;
|
|
1605
|
-
/** Loading state from service */
|
|
1606
1260
|
readonly isLoading: _angular_core.Signal<boolean>;
|
|
1607
|
-
/** Total count from service */
|
|
1608
1261
|
readonly total: _angular_core.Signal<number>;
|
|
1609
|
-
/** Whether company feature is enabled */
|
|
1610
1262
|
readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
|
|
1611
|
-
|
|
1263
|
+
readonly extraColumns: _angular_core.Signal<IUserListExtraColumn[]>;
|
|
1264
|
+
readonly extraActions: _angular_core.Signal<IUserListExtraAction[]>;
|
|
1265
|
+
readonly hasUserDetailView: _angular_core.Signal<boolean>;
|
|
1266
|
+
readonly tableColspan: _angular_core.Signal<number>;
|
|
1612
1267
|
readonly showCompanyDialog: _angular_core.WritableSignal<boolean>;
|
|
1613
1268
|
readonly showBranchDialog: _angular_core.WritableSignal<boolean>;
|
|
1614
|
-
|
|
1269
|
+
readonly showUserDetailDialog: _angular_core.WritableSignal<boolean>;
|
|
1615
1270
|
readonly selectedUser: _angular_core.WritableSignal<IUser | null>;
|
|
1616
|
-
|
|
1271
|
+
getFieldValue(user: IUser, field: string): unknown;
|
|
1272
|
+
isActionVisible(action: IUserListExtraAction, user: IUser): boolean;
|
|
1273
|
+
isActionDisabled(action: IUserListExtraAction, user: IUser): boolean;
|
|
1274
|
+
onExtraAction(action: IUserListExtraAction, user: IUser): void;
|
|
1275
|
+
onViewDetails(user: IUser): void;
|
|
1276
|
+
closeUserDetailDialog(): void;
|
|
1617
1277
|
loadUsers(): void;
|
|
1618
1278
|
onLazyLoad(event: {
|
|
1619
1279
|
first?: number | null;
|
|
@@ -1623,6 +1283,7 @@ declare class UserListComponent implements OnInit {
|
|
|
1623
1283
|
onEdit(user: IUser): void;
|
|
1624
1284
|
onManageCompanyPermissions(user: IUser): void;
|
|
1625
1285
|
onManageBranchPermissions(user: IUser): void;
|
|
1286
|
+
private openPermissionDialog;
|
|
1626
1287
|
onDelete(user: IUser): void;
|
|
1627
1288
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserListComponent, never>;
|
|
1628
1289
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserListComponent, "lib-user-list", never, {}, {}, never, never, true, never>;
|
|
@@ -1632,21 +1293,25 @@ interface IResendFormModel {
|
|
|
1632
1293
|
email: string;
|
|
1633
1294
|
}
|
|
1634
1295
|
type PageState = 'verifying' | 'success' | 'invalid-token' | 'resend';
|
|
1635
|
-
declare class VerifyEmailPageComponent
|
|
1296
|
+
declare class VerifyEmailPageComponent {
|
|
1636
1297
|
private readonly platformId;
|
|
1637
1298
|
private readonly transferState;
|
|
1638
1299
|
private readonly destroyRef;
|
|
1639
1300
|
private readonly route;
|
|
1640
1301
|
private readonly messageService;
|
|
1641
1302
|
private readonly authApi;
|
|
1303
|
+
private readonly translateAdapter;
|
|
1304
|
+
private translate;
|
|
1305
|
+
private readonly queryParams;
|
|
1306
|
+
private verificationTriggered;
|
|
1642
1307
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1643
1308
|
readonly pageState: _angular_core.WritableSignal<PageState>;
|
|
1644
1309
|
readonly resendSuccess: _angular_core.WritableSignal<boolean>;
|
|
1645
1310
|
readonly submittedEmail: _angular_core.WritableSignal<string>;
|
|
1646
1311
|
readonly resendFormModel: _angular_core.WritableSignal<IResendFormModel>;
|
|
1647
|
-
readonly resendForm: _angular_forms_signals.FieldTree<IResendFormModel, string | number>;
|
|
1312
|
+
readonly resendForm: _angular_forms_signals.FieldTree<IResendFormModel, string | number, "writable">;
|
|
1648
1313
|
readonly isResendFormValid: _angular_core.Signal<boolean>;
|
|
1649
|
-
|
|
1314
|
+
constructor();
|
|
1650
1315
|
private verifyEmail;
|
|
1651
1316
|
private handleVerificationResult;
|
|
1652
1317
|
showResendForm(): void;
|
|
@@ -1656,89 +1321,66 @@ declare class VerifyEmailPageComponent implements OnInit {
|
|
|
1656
1321
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<VerifyEmailPageComponent, "lib-verify-email-page", never, {}, {}, never, never, true, never>;
|
|
1657
1322
|
}
|
|
1658
1323
|
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
* Workflow:
|
|
1663
|
-
* 1. Dialog opens → Shows company dropdown with user's permitted companies
|
|
1664
|
-
* 2. User selects a company → Branches load for that company
|
|
1665
|
-
* 3. Branches show with checkboxes (checked = already assigned)
|
|
1666
|
-
* 4. Check to assign, uncheck to revoke
|
|
1667
|
-
*
|
|
1668
|
-
* Company dropdown only shows companies the user has company-level permissions for.
|
|
1669
|
-
* Branch permissions can only be assigned within user's permitted companies.
|
|
1670
|
-
*/
|
|
1324
|
+
interface BranchWithAssignment extends IBranch {
|
|
1325
|
+
isAssigned: boolean;
|
|
1326
|
+
}
|
|
1671
1327
|
declare class UserBranchPermissionDialogComponent {
|
|
1672
1328
|
private readonly branchApi;
|
|
1673
1329
|
private readonly permissionApi;
|
|
1674
|
-
private readonly authState;
|
|
1675
1330
|
private readonly messageService;
|
|
1676
|
-
|
|
1331
|
+
private readonly translateAdapter;
|
|
1332
|
+
private t;
|
|
1677
1333
|
readonly visible: _angular_core.InputSignal<boolean>;
|
|
1678
|
-
/** User to manage permissions for */
|
|
1679
1334
|
readonly user: _angular_core.InputSignal<IUser | null>;
|
|
1680
|
-
/** Close event */
|
|
1681
1335
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
1682
|
-
/** Refresh event after changes */
|
|
1683
1336
|
readonly permissionsChanged: _angular_core.OutputEmitterRef<void>;
|
|
1684
|
-
/** Loading state */
|
|
1685
|
-
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1686
|
-
/** Saving state */
|
|
1687
1337
|
readonly isSaving: _angular_core.WritableSignal<boolean>;
|
|
1688
|
-
|
|
1689
|
-
readonly
|
|
1690
|
-
/** Available companies (filtered by user's company permissions) */
|
|
1691
|
-
readonly companies: _angular_core.WritableSignal<{
|
|
1338
|
+
readonly selectedCompanyId: _angular_core.WritableSignal<string | null>;
|
|
1339
|
+
readonly companiesResource: _angular_core.ResourceRef<{
|
|
1692
1340
|
id: string;
|
|
1693
1341
|
name: string;
|
|
1694
|
-
}[]>;
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1342
|
+
}[] | undefined>;
|
|
1343
|
+
readonly branchesResource: _angular_core.ResourceRef<{
|
|
1344
|
+
isAssigned: boolean;
|
|
1345
|
+
id: string;
|
|
1346
|
+
name: string;
|
|
1347
|
+
slug: string;
|
|
1348
|
+
companyId: string;
|
|
1349
|
+
parentId?: string | null;
|
|
1350
|
+
logoId?: string | null;
|
|
1351
|
+
address?: string | null;
|
|
1352
|
+
phone?: string | null;
|
|
1353
|
+
email?: string | null;
|
|
1354
|
+
serial?: number;
|
|
1355
|
+
isActive: boolean;
|
|
1356
|
+
readOnly: boolean;
|
|
1357
|
+
additionalFields?: Record<string, unknown> | null;
|
|
1358
|
+
createdAt: Date | string;
|
|
1359
|
+
updatedAt: Date | string;
|
|
1360
|
+
}[] | undefined>;
|
|
1361
|
+
readonly isInitialLoading: _angular_core.Signal<boolean>;
|
|
1362
|
+
onBranchToggle(branch: BranchWithAssignment, isAssigned: boolean): Promise<void>;
|
|
1709
1363
|
onClose(): void;
|
|
1710
1364
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserBranchPermissionDialogComponent, never>;
|
|
1711
1365
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserBranchPermissionDialogComponent, "lib-user-branch-permission-dialog", never, { "visible": { "alias": "visible"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; }, { "closed": "closed"; "permissionsChanged": "permissionsChanged"; }, never, never, true, never>;
|
|
1712
1366
|
}
|
|
1713
|
-
|
|
1367
|
+
|
|
1368
|
+
interface CompanyWithAssignment extends ICompany {
|
|
1714
1369
|
isAssigned: boolean;
|
|
1715
1370
|
}
|
|
1716
|
-
|
|
1717
|
-
/**
|
|
1718
|
-
* User Company Permission Dialog
|
|
1719
|
-
* Shows all companies with checkboxes
|
|
1720
|
-
* Initially assigned companies are checked
|
|
1721
|
-
* Check to assign, uncheck to revoke
|
|
1722
|
-
*/
|
|
1723
1371
|
declare class UserCompanyPermissionDialogComponent {
|
|
1724
1372
|
private readonly companyApi;
|
|
1725
1373
|
private readonly permissionApi;
|
|
1726
1374
|
private readonly messageService;
|
|
1727
|
-
|
|
1375
|
+
private readonly translateAdapter;
|
|
1376
|
+
private t;
|
|
1728
1377
|
readonly visible: _angular_core.InputSignal<boolean>;
|
|
1729
|
-
/** User to manage permissions for */
|
|
1730
1378
|
readonly user: _angular_core.InputSignal<IUser | null>;
|
|
1731
|
-
/** Close event */
|
|
1732
1379
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
1733
|
-
/** Refresh event after changes */
|
|
1734
1380
|
readonly permissionsChanged: _angular_core.OutputEmitterRef<void>;
|
|
1735
|
-
/** Loading state */
|
|
1736
1381
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
1737
|
-
/** Saving state */
|
|
1738
1382
|
readonly isSaving: _angular_core.WritableSignal<boolean>;
|
|
1739
|
-
/** Companies with assignment status */
|
|
1740
1383
|
readonly companies: _angular_core.WritableSignal<CompanyWithAssignment[]>;
|
|
1741
|
-
/** Currently assigned company IDs */
|
|
1742
1384
|
private assignedCompanyIds;
|
|
1743
1385
|
constructor();
|
|
1744
1386
|
private loadData;
|
|
@@ -1747,9 +1389,6 @@ declare class UserCompanyPermissionDialogComponent {
|
|
|
1747
1389
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserCompanyPermissionDialogComponent, never>;
|
|
1748
1390
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserCompanyPermissionDialogComponent, "lib-user-company-permission-dialog", never, { "visible": { "alias": "visible"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; }, { "closed": "closed"; "permissionsChanged": "permissionsChanged"; }, never, never, true, never>;
|
|
1749
1391
|
}
|
|
1750
|
-
interface CompanyWithAssignment extends ICompany {
|
|
1751
|
-
isAssigned: boolean;
|
|
1752
|
-
}
|
|
1753
1392
|
|
|
1754
|
-
export { ADMINISTRATION_ROUTES, AUTH_ENDPOINTS, AUTH_ROUTES, AdministrationPageComponent, AuthApiService, AuthCompanyApiProviderAdapter, AuthInitService, AuthLayoutApiAdapter, AuthLayoutStateAdapter, AuthStateService, AuthUserPermissionProviderAdapter, AuthUserProviderAdapter, BranchApiService, BranchFormComponent, BranchListComponent, CompanyApiService, CompanyFormComponent, CompanyListComponent, ForgotPasswordPageComponent, LoginPageComponent, PROFILE_ROUTES, ProfilePageComponent, RegisterPageComponent, ResetPasswordPageComponent, TokenRefreshStateService, UserApiService, UserBranchPermissionDialogComponent, UserCompanyPermissionDialogComponent, UserFormComponent, UserListComponent, UserPermissionApiService, VerifyEmailPageComponent, authGuard, authInterceptor, companyFeatureGuard,
|
|
1755
|
-
export type { AuthResponse, IAssignUserBranchRequest, IAssignUserCompanyRequest,
|
|
1393
|
+
export { ADMINISTRATION_ROUTES, AUTH_ENDPOINTS, AUTH_MESSAGES, AUTH_PROFILE_EXTENSION, AUTH_REGISTRATION_EXTENSION, AUTH_ROUTES, AUTH_USER_DETAIL_CONFIG, AUTH_USER_FORM_EXTENSION, AUTH_USER_LIST_EXTENSION, AUTH_VALIDATION_CONFIG, AdministrationPageComponent, AuthApiService, AuthCompanyApiProviderAdapter, AuthInitService, AuthLayoutApiAdapter, AuthLayoutStateAdapter, AuthStateProviderAdapter, AuthStateService, AuthUserPermissionProviderAdapter, AuthUserProviderAdapter, BranchApiService, BranchFormComponent, BranchListComponent, CompanyApiService, CompanyFormComponent, CompanyListComponent, ForgotPasswordPageComponent, LoginPageComponent, PROFILE_FIELD_CONTEXT, PROFILE_ROUTES, ProfilePageComponent, REGISTRATION_FIELD_CONTEXT, RegisterPageComponent, ResetPasswordPageComponent, TokenRefreshStateService, USER_FORM_FIELD_CONTEXT, UserApiService, UserBranchPermissionDialogComponent, UserCompanyPermissionDialogComponent, UserFormComponent, UserListComponent, UserPermissionApiService, VerifyEmailPageComponent, authGuard, authInterceptor, companyFeatureGuard, emailFeatureGuard, guestGuard, isCompanySelectionResponse, isEmailVerificationRequired, isEndpoint, isLoginResponse, provideAuthLayoutIntegration, provideAuthProviders, signUpFeatureGuard, tokenRefreshInterceptor, validateEmail, validatePassword };
|
|
1394
|
+
export type { AuthResponse, IAssignUserBranchRequest, IAssignUserCompanyRequest, IAuthValidationConfig, IBranch, IBranchInfo, IBranchSelectionInfo, IChangePasswordRequest, ICompany, ICompanyInfo, ICompanySelectionData, ICompanySelectionResponse, ICompanyWithBranches, ICreateBranchRequest, ICreateCompanyRequest, ICreateUserRequest, IEmailValidationConfig, IEmailVerificationData, ILoginData, ILoginRequest, ILoginRequiresEmailVerification, ILoginResponse, IMeData, IMeResponse, IPasswordValidationConfig, IPermissionItem, IProfileExtensionProvider, IProfileExtraField, IProfileExtraSection, IProfileFieldTemplateContext, IRefreshTokenResponse, IRegistrationData, IRegistrationExtensionProvider, IRegistrationExtraField, IRegistrationFieldTemplateContext, IRegistrationRequest, IRegistrationResponse, ISelectRequest, ISwitchCompanyRequest, IUpdateBranchRequest, IUpdateCompanyRequest, IUpdateUserRequest, IUser, IUserBranchPermission, IUserCompanyPermission, IUserDetailViewConfig, IUserFormExtensionProvider, IUserFormExtraField, IUserFormFieldTemplateContext, IUserInfo, IUserListExtensionProvider, IUserListExtraAction, IUserListExtraColumn, UserDetailViewMode };
|