@ngbase/adk 0.1.16 → 0.1.17
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/fesm2022/ngbase-adk-jwt.mjs +313 -35
- package/fesm2022/ngbase-adk-jwt.mjs.map +1 -1
- package/fesm2022/ngbase-adk-sidenav.mjs +4 -2
- package/fesm2022/ngbase-adk-sidenav.mjs.map +1 -1
- package/jwt/index.d.ts +56 -12
- package/package.json +62 -62
- package/schematics/components/files/accordion/accordion.ts.template +1 -1
- package/schematics/components/files/button/button-llm.md.template +3 -2
- package/schematics/components/files/form-field/form-field.ts.template +2 -2
- package/schematics/components/files/tabs/tab.ts.template +3 -3
- package/schematics/components/schema.json +2 -0
- package/sidenav/index.d.ts +2 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, makeEnvironmentProviders, inject, Injectable } from '@angular/core';
|
|
2
|
+
import { InjectionToken, makeEnvironmentProviders, signal, computed, inject, Injectable } from '@angular/core';
|
|
3
|
+
import { BehaviorSubject, throwError, of } from 'rxjs';
|
|
4
|
+
import { tap, catchError, switchMap, filter, take, map } from 'rxjs/operators';
|
|
3
5
|
|
|
4
6
|
// injectiontoken for getting the token
|
|
5
7
|
const JWT_OPTIONS = new InjectionToken('JWT_OPTIONS');
|
|
@@ -9,41 +11,59 @@ function provideJwt(options) {
|
|
|
9
11
|
{ provide: JwtInterceptor, useClass: JwtInterceptor },
|
|
10
12
|
]);
|
|
11
13
|
}
|
|
12
|
-
class
|
|
13
|
-
constructor() {
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
14
|
+
class TokenHandler {
|
|
15
|
+
constructor(storageKey, tokenGetter, tokenSetter) {
|
|
16
|
+
this.storageKey = storageKey;
|
|
17
|
+
this.tokenGetter = tokenGetter;
|
|
18
|
+
this.tokenSetter = tokenSetter;
|
|
19
|
+
this._token = signal(null, ...(ngDevMode ? [{ debugName: "_token" }] : []));
|
|
20
|
+
this.token = this._token.asReadonly();
|
|
21
|
+
this.decoded = computed(() => {
|
|
22
|
+
const tokenValue = this._token();
|
|
23
|
+
if (!tokenValue)
|
|
24
|
+
return null;
|
|
25
|
+
try {
|
|
26
|
+
const payload = tokenValue.split('.')[1];
|
|
27
|
+
return JSON.parse(this.base64UrlDecode(payload));
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
console.error('Error decoding token', e);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}, ...(ngDevMode ? [{ debugName: "decoded" }] : []));
|
|
34
|
+
this.exp = computed(() => {
|
|
35
|
+
const decodedToken = this.decoded();
|
|
36
|
+
return decodedToken?.exp || null;
|
|
37
|
+
}, ...(ngDevMode ? [{ debugName: "exp" }] : []));
|
|
38
|
+
this.expirationDate = computed(() => {
|
|
39
|
+
const exp = this.exp();
|
|
40
|
+
if (!exp)
|
|
41
|
+
return null;
|
|
42
|
+
const date = new Date(0);
|
|
43
|
+
date.setUTCSeconds(exp);
|
|
44
|
+
return date;
|
|
45
|
+
}, ...(ngDevMode ? [{ debugName: "expirationDate" }] : []));
|
|
46
|
+
this.isExpired = () => {
|
|
47
|
+
const expiry = this.expirationDate();
|
|
48
|
+
const ise = expiry ? expiry <= new Date() : true;
|
|
49
|
+
return ise;
|
|
50
|
+
};
|
|
51
|
+
const initialToken = this.tokenGetter?.() ?? localStorage.getItem(this.storageKey);
|
|
52
|
+
this._token.set(initialToken);
|
|
16
53
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
isTokenExpired(token) {
|
|
21
|
-
const inputToken = token ?? this.getToken();
|
|
22
|
-
if (!inputToken)
|
|
23
|
-
return true;
|
|
24
|
-
const expiry = this.getTokenExpirationDate(inputToken);
|
|
25
|
-
return expiry ? expiry <= new Date() : true;
|
|
26
|
-
}
|
|
27
|
-
decodeToken(token) {
|
|
28
|
-
const inputToken = token ?? this.getToken();
|
|
29
|
-
if (!inputToken)
|
|
30
|
-
return null;
|
|
31
|
-
try {
|
|
32
|
-
const payload = inputToken.split('.')[1];
|
|
33
|
-
return JSON.parse(this.base64UrlDecode(payload));
|
|
54
|
+
setToken(token) {
|
|
55
|
+
if (this.tokenSetter) {
|
|
56
|
+
this.tokenSetter(token);
|
|
34
57
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
58
|
+
else {
|
|
59
|
+
if (token) {
|
|
60
|
+
localStorage.setItem(this.storageKey, token);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
localStorage.removeItem(this.storageKey);
|
|
64
|
+
}
|
|
38
65
|
}
|
|
39
|
-
|
|
40
|
-
getTokenExpirationDate(token) {
|
|
41
|
-
const decoded = this.decodeToken(token);
|
|
42
|
-
if (!decoded || !decoded.exp)
|
|
43
|
-
return null;
|
|
44
|
-
const date = new Date(0);
|
|
45
|
-
date.setUTCSeconds(decoded.exp);
|
|
46
|
-
return date;
|
|
66
|
+
this._token.set(token);
|
|
47
67
|
}
|
|
48
68
|
base64UrlDecode(input) {
|
|
49
69
|
input = input.replace(/-/g, '+').replace(/_/g, '/');
|
|
@@ -52,6 +72,40 @@ class JwtService {
|
|
|
52
72
|
}
|
|
53
73
|
return atob(input);
|
|
54
74
|
}
|
|
75
|
+
}
|
|
76
|
+
class JwtService {
|
|
77
|
+
constructor() {
|
|
78
|
+
this.options = inject(JWT_OPTIONS, { optional: true });
|
|
79
|
+
this.accessTokenKey = 'access_token';
|
|
80
|
+
this.refreshTokenKey = 'refresh_token';
|
|
81
|
+
this._accessToken = new TokenHandler(this.accessTokenKey, this.options?.tokenGetter, this.options?.tokenSetter);
|
|
82
|
+
this._refreshToken = new TokenHandler(this.refreshTokenKey, this.options?.refreshTokenGetter, this.options?.refreshTokenSetter);
|
|
83
|
+
this.getAccessToken = this._accessToken.token;
|
|
84
|
+
this.getRefreshToken = this._refreshToken.token;
|
|
85
|
+
this.isAccessTokenExpired = this._accessToken.isExpired;
|
|
86
|
+
this.isRefreshTokenExpired = this._refreshToken.isExpired;
|
|
87
|
+
this.decodeToken = this._accessToken.decoded;
|
|
88
|
+
this.getTokenExpirationDate = this._accessToken.expirationDate;
|
|
89
|
+
}
|
|
90
|
+
setTokens(accessToken, refreshToken) {
|
|
91
|
+
this._accessToken.setToken(accessToken);
|
|
92
|
+
this._refreshToken.setToken(refreshToken);
|
|
93
|
+
}
|
|
94
|
+
clearTokens() {
|
|
95
|
+
this._accessToken.setToken(null);
|
|
96
|
+
this._refreshToken.setToken(null);
|
|
97
|
+
}
|
|
98
|
+
isAccessTokenNearExpiry(minutesBeforeExpiry = 5) {
|
|
99
|
+
const token = this.getAccessToken();
|
|
100
|
+
if (!token)
|
|
101
|
+
return true;
|
|
102
|
+
const expiry = this.getTokenExpirationDate();
|
|
103
|
+
if (!expiry)
|
|
104
|
+
return true;
|
|
105
|
+
console.log('minutesBeforeExpiry ', minutesBeforeExpiry);
|
|
106
|
+
const bufferTime = new Date(Date.now() + 0.5 * 60 * 1000);
|
|
107
|
+
return expiry <= bufferTime;
|
|
108
|
+
}
|
|
55
109
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: JwtService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
56
110
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: JwtService, providedIn: 'root' }); }
|
|
57
111
|
}
|
|
@@ -65,7 +119,7 @@ class JwtInterceptor {
|
|
|
65
119
|
this.jwtService = jwtService;
|
|
66
120
|
}
|
|
67
121
|
intercept(req, next) {
|
|
68
|
-
const token = this.jwtService.
|
|
122
|
+
const token = this.jwtService.getAccessToken();
|
|
69
123
|
if (token) {
|
|
70
124
|
req = req.clone({
|
|
71
125
|
setHeaders: { Authorization: `Bearer ${token}` },
|
|
@@ -82,9 +136,233 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
82
136
|
}], ctorParameters: () => [{ type: JwtService }] });
|
|
83
137
|
const injectJwt = () => inject(JwtService);
|
|
84
138
|
|
|
139
|
+
class TokenRefreshService {
|
|
140
|
+
constructor(refreshApi) {
|
|
141
|
+
this.refreshApi = refreshApi;
|
|
142
|
+
this.jwt = injectJwt();
|
|
143
|
+
this.refreshSubject = new BehaviorSubject(null);
|
|
144
|
+
this.isRefreshing = false;
|
|
145
|
+
/**
|
|
146
|
+
* Returns an observable that emits when refresh completes
|
|
147
|
+
*/
|
|
148
|
+
this.getRefreshStatus$ = this.refreshSubject.asObservable();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Attempts to refresh the access token using the refresh token
|
|
152
|
+
* @returns Observable with new token pair
|
|
153
|
+
*/
|
|
154
|
+
refreshToken() {
|
|
155
|
+
const refreshToken = this.jwt.getRefreshToken();
|
|
156
|
+
if (!refreshToken) {
|
|
157
|
+
return throwError(() => new Error('No refresh token available'));
|
|
158
|
+
}
|
|
159
|
+
if (this.isRefreshing) {
|
|
160
|
+
// If already refreshing, wait for the refresh to complete
|
|
161
|
+
return this.refreshSubject.asObservable();
|
|
162
|
+
}
|
|
163
|
+
this.isRefreshing = true;
|
|
164
|
+
this.refreshSubject.next(null);
|
|
165
|
+
return this.refreshApi().pipe(tap(res => {
|
|
166
|
+
this.isRefreshing = false;
|
|
167
|
+
this.refreshSubject.next(res);
|
|
168
|
+
}), catchError(error => {
|
|
169
|
+
this.isRefreshing = false;
|
|
170
|
+
this.refreshSubject.next(null);
|
|
171
|
+
// Clear tokens on refresh failure
|
|
172
|
+
this.jwt.clearTokens();
|
|
173
|
+
return throwError(() => error);
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Checks if a refresh operation is currently in progress
|
|
178
|
+
*/
|
|
179
|
+
isTokenRefreshing() {
|
|
180
|
+
return this.isRefreshing;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Proactively refresh token if it's expired or near expiry
|
|
184
|
+
* @param minutesBeforeExpiry How many minutes before expiry to refresh (default: 5)
|
|
185
|
+
* @returns Observable that emits true if refresh was needed and successful, false if not needed
|
|
186
|
+
*/
|
|
187
|
+
refreshIfNeeded(minutesBeforeExpiry = 5) {
|
|
188
|
+
if (this.jwt.isRefreshTokenExpired()) {
|
|
189
|
+
// Refresh token is expired, clear tokens and reject
|
|
190
|
+
this.jwt.clearTokens();
|
|
191
|
+
return throwError(() => new Error('Refresh token expired'));
|
|
192
|
+
}
|
|
193
|
+
if (this.jwt.isAccessTokenExpired() || this.jwt.isAccessTokenNearExpiry(minutesBeforeExpiry)) {
|
|
194
|
+
// Need to refresh
|
|
195
|
+
return this.refreshToken().pipe(switchMap(() => of(true)), // Return true to indicate refresh was performed
|
|
196
|
+
catchError(error => throwError(() => error)));
|
|
197
|
+
}
|
|
198
|
+
// No refresh needed
|
|
199
|
+
return of(false);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Centralized authentication service for guards and interceptors
|
|
205
|
+
* Handles token validation and refresh logic consistently
|
|
206
|
+
*/
|
|
207
|
+
class TokenGuardHelper {
|
|
208
|
+
constructor(refreshApi, logout) {
|
|
209
|
+
this.refreshApi = refreshApi;
|
|
210
|
+
this.logout = logout;
|
|
211
|
+
this.jwt = injectJwt();
|
|
212
|
+
/**
|
|
213
|
+
* Checks if user is authenticated, handles token refresh if needed
|
|
214
|
+
* Returns Observable<boolean> - true if authenticated, false if should redirect to login
|
|
215
|
+
*/
|
|
216
|
+
this.checkAuthentication = () => {
|
|
217
|
+
// Check if we have basic tokens
|
|
218
|
+
const accessToken = this.jwt.getAccessToken();
|
|
219
|
+
const refreshToken = this.jwt.getRefreshToken();
|
|
220
|
+
if (!accessToken || !refreshToken) {
|
|
221
|
+
console.log('AuthGuard: No tokens available, redirecting to login');
|
|
222
|
+
return of(false);
|
|
223
|
+
}
|
|
224
|
+
// Check if refresh token is expired
|
|
225
|
+
if (this.jwt.isRefreshTokenExpired()) {
|
|
226
|
+
console.warn('AuthGuard: Refresh token is expired, clearing tokens');
|
|
227
|
+
this.logout();
|
|
228
|
+
return of(false);
|
|
229
|
+
}
|
|
230
|
+
// If access token is valid, allow access
|
|
231
|
+
if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {
|
|
232
|
+
console.log('AuthGuard: Access token is valid, allowing access');
|
|
233
|
+
return of(true);
|
|
234
|
+
}
|
|
235
|
+
// Access token is expired or near expiry, need to refresh
|
|
236
|
+
console.log('AuthGuard: Access token expired or near expiry, attempting refresh');
|
|
237
|
+
// Check if already refreshing
|
|
238
|
+
if (this.tokenRefreshService.isTokenRefreshing()) {
|
|
239
|
+
console.log('AuthGuard: Token refresh already in progress, waiting...');
|
|
240
|
+
return this.tokenRefreshService.getRefreshStatus$.pipe(filter(refreshed => refreshed === true), take(1), map(() => {
|
|
241
|
+
const newToken = this.jwt.getAccessToken();
|
|
242
|
+
if (newToken && !this.jwt.isAccessTokenExpired()) {
|
|
243
|
+
console.log('AuthGuard: Token refresh completed successfully');
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
console.warn('AuthGuard: No valid token after refresh completion');
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}), catchError(error => {
|
|
251
|
+
console.error('AuthGuard: Failed to wait for token refresh:', error);
|
|
252
|
+
return of(false);
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
// Start token refresh
|
|
256
|
+
return this.tokenRefreshService.refreshToken().pipe(map(() => {
|
|
257
|
+
if (!this.jwt.isAccessTokenExpired()) {
|
|
258
|
+
console.log('AuthGuard: Token refresh successful');
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.warn('AuthGuard: Invalid refresh response or token still expired');
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
}), catchError(refreshError => {
|
|
266
|
+
console.warn('AuthGuard: Token refresh failed:', refreshError);
|
|
267
|
+
this.logout();
|
|
268
|
+
return of(false);
|
|
269
|
+
}));
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Enhanced authentication check with automatic retry
|
|
273
|
+
* Attempts refresh once, then falls back to login redirect
|
|
274
|
+
*/
|
|
275
|
+
this.ensureAuthenticated = () => {
|
|
276
|
+
return this.checkAuthentication().pipe(switchMap(isAuthenticated => {
|
|
277
|
+
if (isAuthenticated) {
|
|
278
|
+
return of(true);
|
|
279
|
+
}
|
|
280
|
+
// If not authenticated after refresh attempt, redirect to login
|
|
281
|
+
console.log('AuthGuard: Authentication failed, redirecting to login');
|
|
282
|
+
this.logout();
|
|
283
|
+
return of(false);
|
|
284
|
+
}));
|
|
285
|
+
};
|
|
286
|
+
/**
|
|
287
|
+
* Quick synchronous check for authentication status
|
|
288
|
+
* Use this only when you don't need token refresh
|
|
289
|
+
*/
|
|
290
|
+
this.isQuickAuthenticated = () => {
|
|
291
|
+
const accessToken = this.jwt.getAccessToken();
|
|
292
|
+
const refreshToken = this.jwt.getRefreshToken();
|
|
293
|
+
if (!accessToken || !refreshToken)
|
|
294
|
+
return false;
|
|
295
|
+
if (this.jwt.isRefreshTokenExpired())
|
|
296
|
+
return false;
|
|
297
|
+
if (this.jwt.isAccessTokenExpired())
|
|
298
|
+
return false;
|
|
299
|
+
return true;
|
|
300
|
+
};
|
|
301
|
+
/**
|
|
302
|
+
* Validates and refreshes token for HTTP requests
|
|
303
|
+
* Returns Observable<string> with valid access token or throws error
|
|
304
|
+
* Used by interceptors
|
|
305
|
+
*/
|
|
306
|
+
this.getValidAccessToken = () => {
|
|
307
|
+
// Check if we have tokens
|
|
308
|
+
const accessToken = this.jwt.getAccessToken();
|
|
309
|
+
if (!accessToken) {
|
|
310
|
+
console.warn('Interceptor: No access token available');
|
|
311
|
+
this.logout();
|
|
312
|
+
throw new Error('No access token available');
|
|
313
|
+
}
|
|
314
|
+
// Check if refresh token is expired
|
|
315
|
+
if (this.jwt.isRefreshTokenExpired()) {
|
|
316
|
+
console.warn('Interceptor: Refresh token is expired, redirecting to login');
|
|
317
|
+
this.logout();
|
|
318
|
+
throw new Error('Refresh token expired');
|
|
319
|
+
}
|
|
320
|
+
// If access token is valid, return it
|
|
321
|
+
if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {
|
|
322
|
+
return of(accessToken);
|
|
323
|
+
}
|
|
324
|
+
// Access token needs refresh
|
|
325
|
+
console.log('Interceptor: Access token expired or near expiry, refreshing proactively');
|
|
326
|
+
// Check if already refreshing
|
|
327
|
+
if (this.tokenRefreshService.isTokenRefreshing()) {
|
|
328
|
+
return this.tokenRefreshService.getRefreshStatus$.pipe(filter(refreshed => refreshed === true), take(1), map(() => {
|
|
329
|
+
const newToken = this.jwt.getAccessToken();
|
|
330
|
+
if (newToken) {
|
|
331
|
+
return newToken;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.logout();
|
|
335
|
+
throw new Error('Failed to get new access token');
|
|
336
|
+
}
|
|
337
|
+
}), catchError(error => {
|
|
338
|
+
console.error('Interceptor: Failed to wait for token refresh:', error);
|
|
339
|
+
this.logout();
|
|
340
|
+
throw error;
|
|
341
|
+
}));
|
|
342
|
+
}
|
|
343
|
+
// Start token refresh
|
|
344
|
+
return this.tokenRefreshService.refreshToken().pipe(map(() => {
|
|
345
|
+
const newToken = this.jwt.getAccessToken();
|
|
346
|
+
if (newToken) {
|
|
347
|
+
return newToken;
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
this.logout();
|
|
351
|
+
throw new Error('Invalid refresh response');
|
|
352
|
+
}
|
|
353
|
+
}), catchError(refreshError => {
|
|
354
|
+
console.warn('Interceptor: Token refresh failed:', refreshError);
|
|
355
|
+
this.logout();
|
|
356
|
+
throw refreshError;
|
|
357
|
+
}));
|
|
358
|
+
};
|
|
359
|
+
this.tokenRefreshService = new TokenRefreshService(this.refreshApi);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
85
363
|
/**
|
|
86
364
|
* Generated bundle index. Do not edit.
|
|
87
365
|
*/
|
|
88
366
|
|
|
89
|
-
export { JwtService, injectJwt, provideJwt };
|
|
367
|
+
export { JwtService, TokenGuardHelper, injectJwt, provideJwt };
|
|
90
368
|
//# sourceMappingURL=ngbase-adk-jwt.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngbase-adk-jwt.mjs","sources":["../../../projects/adk/jwt/jwt.service.ts","../../../projects/adk/jwt/ngbase-adk-jwt.ts"],"sourcesContent":["import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { inject, Injectable, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n// injectiontoken for getting the token\nconst JWT_OPTIONS = new InjectionToken<JwtOptions>('JWT_OPTIONS');\n\ninterface JwtOptions {\n tokenGetter: () => string | null | undefined;\n}\n\nexport function provideJwt(options: () => JwtOptions) {\n return makeEnvironmentProviders([\n { provide: JWT_OPTIONS, useFactory: options },\n { provide: JwtInterceptor, useClass: JwtInterceptor },\n ]);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class JwtService<T> {\n private tokenKey = 'auth_token';\n private options = inject(JWT_OPTIONS, { optional: true });\n\n getToken(): string | null {\n return this.options?.tokenGetter() ?? localStorage.getItem(this.tokenKey);\n }\n\n isTokenExpired(token?: string): boolean {\n const inputToken = token ?? this.getToken();\n if (!inputToken) return true;\n\n const expiry = this.getTokenExpirationDate(inputToken);\n return expiry ? expiry <= new Date() : true;\n }\n\n decodeToken(token?: string): T | null {\n const inputToken = token ?? this.getToken();\n if (!inputToken) return null;\n\n try {\n const payload = inputToken.split('.')[1];\n return JSON.parse(this.base64UrlDecode(payload));\n } catch (e) {\n console.error('Error decoding token', e);\n return null;\n }\n }\n\n getTokenExpirationDate(token?: string): Date | null {\n const decoded = this.decodeToken(token) as T extends { exp: number } ? T : null;\n if (!decoded || !decoded.exp) return null;\n\n const date = new Date(0);\n date.setUTCSeconds(decoded.exp);\n return date;\n }\n\n private base64UrlDecode(input: string): string {\n input = input.replace(/-/g, '+').replace(/_/g, '/');\n while (input.length % 4) {\n input += '=';\n }\n return atob(input);\n }\n}\n\n// jwt interceptor\n@Injectable({ providedIn: 'root' })\nexport class JwtInterceptor implements HttpInterceptor {\n constructor(private jwtService: JwtService<any>) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const token = this.jwtService.getToken();\n if (token) {\n req = req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n });\n }\n return next.handle(req);\n }\n}\n\nexport const injectJwt = () => inject(JwtService);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngbase-adk-jwt.mjs","sources":["../../../projects/adk/jwt/jwt.service.ts","../../../projects/adk/jwt/token-refresh.ts","../../../projects/adk/jwt/token-guard.ts","../../../projects/adk/jwt/ngbase-adk-jwt.ts"],"sourcesContent":["import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport {\n computed,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\n\n// injectiontoken for getting the token\nconst JWT_OPTIONS = new InjectionToken<JwtOptions>('JWT_OPTIONS');\n\ninterface JwtOptions {\n tokenGetter: () => string | null | undefined;\n tokenSetter?: (token: string | null) => void;\n refreshTokenGetter?: () => string | null | undefined;\n refreshTokenSetter?: (token: string | null) => void;\n}\n\nexport function provideJwt(options: () => JwtOptions) {\n return makeEnvironmentProviders([\n { provide: JWT_OPTIONS, useFactory: options },\n { provide: JwtInterceptor, useClass: JwtInterceptor },\n ]);\n}\n\nclass TokenHandler<T = any> {\n readonly _token = signal<string | null>(null);\n readonly token = this._token.asReadonly();\n\n readonly decoded = computed<T | null>(() => {\n const tokenValue = this._token();\n if (!tokenValue) return null;\n\n try {\n const payload = tokenValue.split('.')[1];\n return JSON.parse(this.base64UrlDecode(payload));\n } catch (e) {\n console.error('Error decoding token', e);\n return null;\n }\n });\n\n readonly exp = computed<number | null>(() => {\n const decodedToken = this.decoded() as T extends { exp: number } ? T : null;\n return decodedToken?.exp || null;\n });\n\n readonly expirationDate = computed<Date | null>(() => {\n const exp = this.exp();\n if (!exp) return null;\n\n const date = new Date(0);\n date.setUTCSeconds(exp);\n return date;\n });\n\n readonly isExpired = () => {\n const expiry = this.expirationDate();\n const ise = expiry ? expiry <= new Date() : true;\n return ise;\n };\n\n constructor(\n private storageKey: string,\n private tokenGetter?: () => string | null | undefined,\n private tokenSetter?: (token: string | null) => void,\n ) {\n const initialToken = this.tokenGetter?.() ?? localStorage.getItem(this.storageKey);\n this._token.set(initialToken);\n }\n\n setToken(token: string | null): void {\n if (this.tokenSetter) {\n this.tokenSetter(token);\n } else {\n if (token) {\n localStorage.setItem(this.storageKey, token);\n } else {\n localStorage.removeItem(this.storageKey);\n }\n }\n this._token.set(token);\n }\n\n private base64UrlDecode(input: string): string {\n input = input.replace(/-/g, '+').replace(/_/g, '/');\n while (input.length % 4) {\n input += '=';\n }\n return atob(input);\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class JwtService<T> {\n private options = inject(JWT_OPTIONS, { optional: true });\n\n private accessTokenKey = 'access_token';\n private refreshTokenKey = 'refresh_token';\n\n private _accessToken = new TokenHandler<T>(\n this.accessTokenKey,\n this.options?.tokenGetter,\n this.options?.tokenSetter,\n );\n private _refreshToken = new TokenHandler<T>(\n this.refreshTokenKey,\n this.options?.refreshTokenGetter,\n this.options?.refreshTokenSetter,\n );\n\n getAccessToken = this._accessToken.token;\n\n getRefreshToken = this._refreshToken.token;\n\n setTokens(accessToken: string, refreshToken: string): void {\n this._accessToken.setToken(accessToken);\n this._refreshToken.setToken(refreshToken);\n }\n\n clearTokens(): void {\n this._accessToken.setToken(null);\n this._refreshToken.setToken(null);\n }\n\n isAccessTokenExpired = this._accessToken.isExpired;\n\n isRefreshTokenExpired = this._refreshToken.isExpired;\n\n isAccessTokenNearExpiry(minutesBeforeExpiry: number = 5): boolean {\n const token = this.getAccessToken();\n if (!token) return true;\n\n const expiry = this.getTokenExpirationDate();\n if (!expiry) return true;\n\n console.log('minutesBeforeExpiry ', minutesBeforeExpiry);\n const bufferTime = new Date(Date.now() + 0.5 * 60 * 1000);\n return expiry <= bufferTime;\n }\n\n decodeToken = this._accessToken.decoded;\n\n getTokenExpirationDate = this._accessToken.expirationDate;\n}\n\n// jwt interceptor\n@Injectable({ providedIn: 'root' })\nexport class JwtInterceptor implements HttpInterceptor {\n constructor(private jwtService: JwtService<any>) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const token = this.jwtService.getAccessToken();\n if (token) {\n req = req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n });\n }\n return next.handle(req);\n }\n}\n\nexport const injectJwt = <T>() => inject<JwtService<T>>(JwtService);\n","import { BehaviorSubject, Observable, throwError, of } from 'rxjs';\nimport { catchError, tap, switchMap } from 'rxjs/operators';\nimport { injectJwt } from './jwt.service';\n\nexport class TokenRefreshService<T> {\n private jwt = injectJwt();\n private refreshSubject = new BehaviorSubject<T | null>(null);\n private isRefreshing = false;\n\n /**\n * Returns an observable that emits when refresh completes\n */\n getRefreshStatus$ = this.refreshSubject.asObservable();\n\n constructor(private refreshApi: () => Observable<T>) {}\n\n /**\n * Attempts to refresh the access token using the refresh token\n * @returns Observable with new token pair\n */\n refreshToken(): Observable<T | null> {\n const refreshToken = this.jwt.getRefreshToken();\n if (!refreshToken) {\n return throwError(() => new Error('No refresh token available'));\n }\n\n if (this.isRefreshing) {\n // If already refreshing, wait for the refresh to complete\n return this.refreshSubject.asObservable();\n }\n\n this.isRefreshing = true;\n this.refreshSubject.next(null);\n\n return this.refreshApi().pipe(\n tap(res => {\n this.isRefreshing = false;\n this.refreshSubject.next(res);\n }),\n catchError(error => {\n this.isRefreshing = false;\n this.refreshSubject.next(null);\n\n // Clear tokens on refresh failure\n this.jwt.clearTokens();\n\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Checks if a refresh operation is currently in progress\n */\n isTokenRefreshing(): boolean {\n return this.isRefreshing;\n }\n\n /**\n * Proactively refresh token if it's expired or near expiry\n * @param minutesBeforeExpiry How many minutes before expiry to refresh (default: 5)\n * @returns Observable that emits true if refresh was needed and successful, false if not needed\n */\n refreshIfNeeded(minutesBeforeExpiry: number = 5): Observable<boolean> {\n if (this.jwt.isRefreshTokenExpired()) {\n // Refresh token is expired, clear tokens and reject\n this.jwt.clearTokens();\n return throwError(() => new Error('Refresh token expired'));\n }\n\n if (this.jwt.isAccessTokenExpired() || this.jwt.isAccessTokenNearExpiry(minutesBeforeExpiry)) {\n // Need to refresh\n return this.refreshToken().pipe(\n switchMap(() => of(true)), // Return true to indicate refresh was performed\n catchError(error => throwError(() => error)),\n );\n }\n\n // No refresh needed\n return of(false);\n }\n}\n","import { Observable, of } from 'rxjs';\nimport { map, catchError, switchMap, filter, take } from 'rxjs/operators';\nimport { TokenRefreshService } from './token-refresh';\nimport { injectJwt } from './jwt.service';\n\n/**\n * Centralized authentication service for guards and interceptors\n * Handles token validation and refresh logic consistently\n */\nexport class TokenGuardHelper {\n private readonly tokenRefreshService: TokenRefreshService<any>;\n private readonly jwt = injectJwt();\n\n constructor(\n private refreshApi: () => Observable<any>,\n private logout: () => void,\n ) {\n this.tokenRefreshService = new TokenRefreshService(this.refreshApi);\n }\n\n /**\n * Checks if user is authenticated, handles token refresh if needed\n * Returns Observable<boolean> - true if authenticated, false if should redirect to login\n */\n checkAuthentication = (): Observable<boolean> => {\n // Check if we have basic tokens\n const accessToken = this.jwt.getAccessToken();\n const refreshToken = this.jwt.getRefreshToken();\n\n if (!accessToken || !refreshToken) {\n console.log('AuthGuard: No tokens available, redirecting to login');\n return of(false);\n }\n\n // Check if refresh token is expired\n if (this.jwt.isRefreshTokenExpired()) {\n console.warn('AuthGuard: Refresh token is expired, clearing tokens');\n this.logout();\n return of(false);\n }\n\n // If access token is valid, allow access\n if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {\n console.log('AuthGuard: Access token is valid, allowing access');\n return of(true);\n }\n\n // Access token is expired or near expiry, need to refresh\n console.log('AuthGuard: Access token expired or near expiry, attempting refresh');\n\n // Check if already refreshing\n if (this.tokenRefreshService.isTokenRefreshing()) {\n console.log('AuthGuard: Token refresh already in progress, waiting...');\n return this.tokenRefreshService.getRefreshStatus$.pipe(\n filter(refreshed => refreshed === true),\n take(1),\n map(() => {\n const newToken = this.jwt.getAccessToken();\n if (newToken && !this.jwt.isAccessTokenExpired()) {\n console.log('AuthGuard: Token refresh completed successfully');\n return true;\n } else {\n console.warn('AuthGuard: No valid token after refresh completion');\n return false;\n }\n }),\n catchError(error => {\n console.error('AuthGuard: Failed to wait for token refresh:', error);\n return of(false);\n }),\n );\n }\n\n // Start token refresh\n return this.tokenRefreshService.refreshToken().pipe(\n map(() => {\n if (!this.jwt.isAccessTokenExpired()) {\n console.log('AuthGuard: Token refresh successful');\n return true;\n } else {\n console.warn('AuthGuard: Invalid refresh response or token still expired');\n return false;\n }\n }),\n catchError(refreshError => {\n console.warn('AuthGuard: Token refresh failed:', refreshError);\n this.logout();\n return of(false);\n }),\n );\n };\n\n /**\n * Enhanced authentication check with automatic retry\n * Attempts refresh once, then falls back to login redirect\n */\n ensureAuthenticated = (): Observable<boolean> => {\n return this.checkAuthentication().pipe(\n switchMap(isAuthenticated => {\n if (isAuthenticated) {\n return of(true);\n }\n\n // If not authenticated after refresh attempt, redirect to login\n console.log('AuthGuard: Authentication failed, redirecting to login');\n this.logout();\n return of(false);\n }),\n );\n };\n\n /**\n * Quick synchronous check for authentication status\n * Use this only when you don't need token refresh\n */\n isQuickAuthenticated = (): boolean => {\n const accessToken = this.jwt.getAccessToken();\n const refreshToken = this.jwt.getRefreshToken();\n\n if (!accessToken || !refreshToken) return false;\n if (this.jwt.isRefreshTokenExpired()) return false;\n if (this.jwt.isAccessTokenExpired()) return false;\n\n return true;\n };\n\n /**\n * Validates and refreshes token for HTTP requests\n * Returns Observable<string> with valid access token or throws error\n * Used by interceptors\n */\n getValidAccessToken = (): Observable<string> => {\n // Check if we have tokens\n const accessToken = this.jwt.getAccessToken();\n\n if (!accessToken) {\n console.warn('Interceptor: No access token available');\n this.logout();\n throw new Error('No access token available');\n }\n\n // Check if refresh token is expired\n if (this.jwt.isRefreshTokenExpired()) {\n console.warn('Interceptor: Refresh token is expired, redirecting to login');\n this.logout();\n throw new Error('Refresh token expired');\n }\n\n // If access token is valid, return it\n if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {\n return of(accessToken);\n }\n\n // Access token needs refresh\n console.log('Interceptor: Access token expired or near expiry, refreshing proactively');\n\n // Check if already refreshing\n if (this.tokenRefreshService.isTokenRefreshing()) {\n return this.tokenRefreshService.getRefreshStatus$.pipe(\n filter(refreshed => refreshed === true),\n take(1),\n map(() => {\n const newToken = this.jwt.getAccessToken();\n if (newToken) {\n return newToken;\n } else {\n this.logout();\n throw new Error('Failed to get new access token');\n }\n }),\n catchError(error => {\n console.error('Interceptor: Failed to wait for token refresh:', error);\n this.logout();\n throw error;\n }),\n );\n }\n\n // Start token refresh\n return this.tokenRefreshService.refreshToken().pipe(\n map(() => {\n const newToken = this.jwt.getAccessToken();\n if (newToken) {\n return newToken;\n } else {\n this.logout();\n throw new Error('Invalid refresh response');\n }\n }),\n catchError(refreshError => {\n console.warn('Interceptor: Token refresh failed:', refreshError);\n this.logout();\n throw refreshError;\n }),\n );\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, computed, Injectable, inject, Component, model, input, linkedSignal, Directive, ElementRef } from '@angular/core';
|
|
3
|
-
import
|
|
3
|
+
import * as i1 from '@ngbase/adk/utils';
|
|
4
|
+
import { fadeAnimation, DisableAnimation } from '@ngbase/adk/utils';
|
|
4
5
|
import { injectDirectionality, Directionality } from '@ngbase/adk/bidi';
|
|
5
6
|
import { trigger, state, style, transition, animate } from '@angular/animations';
|
|
6
7
|
|
|
@@ -180,12 +181,13 @@ class NgbSidenavHeader {
|
|
|
180
181
|
this.sidenav.minWidth = linkedSignal(this.minWidth);
|
|
181
182
|
}
|
|
182
183
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbSidenavHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
183
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbSidenavHeader, isStandalone: true, selector: "[ngbSidenavHeader]", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "@slide.done": "sidenav.animationDone()", "@slide.start": "sidenav.animationStart()" }, properties: { "style.visibility": "sidenav.visibility() ? \"visible\" : \"hidden\"", "style": "headerStyles()", "style.width": "actualWidth()", "attr.aria-hidden": "!sidenav.show()", "attr.data-mode": "sidenav.mode()", "@slide": "{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }" }, styleAttribute: "overflow:hidden;position:absolute;" }, ngImport: i0 }); }
|
|
184
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbSidenavHeader, isStandalone: true, selector: "[ngbSidenavHeader]", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "@slide.done": "sidenav.animationDone()", "@slide.start": "sidenav.animationStart()" }, properties: { "style.visibility": "sidenav.visibility() ? \"visible\" : \"hidden\"", "style": "headerStyles()", "style.width": "actualWidth()", "attr.aria-hidden": "!sidenav.show()", "attr.data-mode": "sidenav.mode()", "@slide": "{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }" }, styleAttribute: "overflow:hidden;position:absolute;" }, hostDirectives: [{ directive: i1.DisableAnimation }], ngImport: i0 }); }
|
|
184
185
|
}
|
|
185
186
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbSidenavHeader, decorators: [{
|
|
186
187
|
type: Directive,
|
|
187
188
|
args: [{
|
|
188
189
|
selector: '[ngbSidenavHeader]',
|
|
190
|
+
hostDirectives: [DisableAnimation],
|
|
189
191
|
host: {
|
|
190
192
|
style: 'overflow:hidden;position:absolute;',
|
|
191
193
|
'[style.visibility]': 'sidenav.visibility() ? "visible" : "hidden"',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngbase-adk-sidenav.mjs","sources":["../../../projects/adk/sidenav/sidenav.service.ts","../../../projects/adk/sidenav/sidenav.ts","../../../projects/adk/sidenav/sidenav-header.ts","../../../projects/adk/sidenav/ngbase-adk-sidenav.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\nimport { injectDirectionality } from '@ngbase/adk/bidi';\n\nexport type SidenavType = 'side' | 'over' | 'partial';\n\n@Injectable()\nexport class SidenavService {\n readonly dir = injectDirectionality();\n width = signal('0');\n show = signal(true);\n mode = signal<'side' | 'over' | 'partial'>('side');\n minWidth = signal('0');\n readonly status = signal(1);\n\n readonly visibility = computed(() => (this.mode() === 'partial' ? true : this.status()));\n readonly animate = computed(() => (this.mode() === 'partial' ? true : this.show()));\n\n readonly w = computed(() =>\n this.show() && this.mode() !== 'over'\n ? this.width()\n : this.mode() === 'partial'\n ? this.minWidth()\n : '0',\n );\n\n readonly styles = computed(() => {\n const styles = {} as any;\n if (this.dir.isRtl()) {\n styles.paddingRight = this.w();\n } else {\n styles.paddingLeft = this.w();\n }\n return styles;\n });\n\n animationDone() {\n this.status.set(this.show() ? 1 : 0);\n }\n\n animationStart() {\n this.status.set(1);\n }\n}\n","import {\n Component,\n computed,\n Directive,\n inject,\n input,\n linkedSignal,\n model,\n Type,\n} from '@angular/core';\nimport { fadeAnimation } from '@ngbase/adk/utils';\nimport { SidenavType } from './sidenav.service';\nimport { SidenavService } from './sidenav.service';\n\n@Component({\n selector: '[ngbSidenavOverlay]',\n template: ``,\n host: {\n class: 'sidenav-overlay',\n style: 'position:absolute;left:0;top:0;width:100%;height:100%;',\n '(click)': 'sidenav.toggle()',\n '[@fadeAnimation]': '',\n },\n animations: [fadeAnimation('500ms')],\n})\nexport class NgbSidenavOverlay {\n readonly sidenav = inject(NgbSidenav);\n}\n\n@Directive({\n selector: '[ngbSidenav]',\n exportAs: 'ngbSidenav',\n providers: [SidenavService],\n host: {\n style: 'position:relative;width:100%;height:100%;',\n },\n})\nexport class NgbSidenav {\n readonly sidenavService = inject(SidenavService);\n\n // Inputs\n readonly show = model(true);\n readonly mode = input<SidenavType>('side');\n\n readonly showOverlay = computed(() => this.mode() === 'over' && this.show());\n\n constructor() {\n this.sidenavService.show = linkedSignal(this.show);\n this.sidenavService.mode = linkedSignal(this.mode);\n }\n\n toggle() {\n this.show.update(show => !show);\n }\n}\n\nexport const aliasSidenav = (sidenav: Type<NgbSidenav>) => [\n SidenavService,\n { provide: NgbSidenav, useExisting: sidenav },\n];\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport { computed, Directive, ElementRef, inject, input, linkedSignal } from '@angular/core';\nimport { Directionality } from '@ngbase/adk/bidi';\nimport { SidenavService } from './sidenav.service';\n\n@Directive({\n selector: '[ngbSidenavHeaderContent]',\n host: {\n '[style.width]': 'w()',\n },\n})\nexport class NgbSidenavHeaderContent {\n readonly sidenav = inject(SidenavService);\n readonly w = computed(() =>\n this.sidenav.mode() === 'partial' && !this.sidenav.show()\n ? this.sidenav.minWidth()\n : this.sidenav.width(),\n );\n}\n\n@Directive({\n selector: '[ngbSidenavHeaderTrack]',\n host: {\n '[style.width]': 'sidenav.w()',\n },\n})\nexport class NgbSidenavHeaderTrack {\n readonly sidenav = inject(SidenavService);\n}\n\nexport function slideAnimation(ease: string) {\n return trigger('slide', [\n state('true', style({ transform: 'translateX(0)' })),\n state('false', style({ transform: 'translateX({{x}})' }), { params: { x: '-100%' } }),\n transition('* <=> *', [animate(ease)]),\n ]);\n}\n\n@Directive({\n selector: '[ngbSidenavHeader]',\n host: {\n style: 'overflow:hidden;position:absolute;',\n '[style.visibility]': 'sidenav.visibility() ? \"visible\" : \"hidden\"',\n '[style]': `headerStyles()`,\n '[style.width]': `actualWidth()`,\n '[attr.aria-hidden]': '!sidenav.show()',\n '[attr.data-mode]': 'sidenav.mode()',\n '[@slide]': `{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }`,\n '(@slide.done)': 'sidenav.animationDone()',\n '(@slide.start)': 'sidenav.animationStart()',\n // '[@slide.disabled]': 'isAnimationDisabled()',\n },\n})\nexport class NgbSidenavHeader {\n readonly sidenav = inject(SidenavService);\n readonly el = inject(ElementRef);\n readonly dir = inject(Directionality);\n\n readonly width = input('250px');\n readonly minWidth = input('0');\n\n private initial = 0;\n readonly isAnimationDisabled = linkedSignal({\n source: this.sidenav.animate,\n computation: () => this.initial++ === 0, // this will not considered on initial render due to increment\n });\n\n readonly w = computed(() => (this.sidenav.mode() === 'partial' ? this.minWidth() : this.width()));\n readonly actualWidth = computed(() => {\n if (this.sidenav.show()) {\n return this.width();\n } else if (this.sidenav.mode() === 'partial') {\n return this.minWidth();\n } else if (this.sidenav.mode() === 'over') {\n return this.width();\n }\n return this.width();\n });\n\n readonly headerStyles = computed(() => {\n let styles = {};\n if (this.sidenav.mode() === 'over') {\n styles = { ...styles, position: 'absolute', top: '0', height: '100%' };\n }\n if (this.dir.isRtl()) {\n styles = { ...styles, right: '0' };\n } else {\n styles = { ...styles, left: '0' };\n }\n return styles;\n });\n\n constructor() {\n this.sidenav.width = linkedSignal(this.width);\n this.sidenav.minWidth = linkedSignal(this.minWidth);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngbase-adk-sidenav.mjs","sources":["../../../projects/adk/sidenav/sidenav.service.ts","../../../projects/adk/sidenav/sidenav.ts","../../../projects/adk/sidenav/sidenav-header.ts","../../../projects/adk/sidenav/ngbase-adk-sidenav.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\nimport { injectDirectionality } from '@ngbase/adk/bidi';\n\nexport type SidenavType = 'side' | 'over' | 'partial';\n\n@Injectable()\nexport class SidenavService {\n readonly dir = injectDirectionality();\n width = signal('0');\n show = signal(true);\n mode = signal<'side' | 'over' | 'partial'>('side');\n minWidth = signal('0');\n readonly status = signal(1);\n\n readonly visibility = computed(() => (this.mode() === 'partial' ? true : this.status()));\n readonly animate = computed(() => (this.mode() === 'partial' ? true : this.show()));\n\n readonly w = computed(() =>\n this.show() && this.mode() !== 'over'\n ? this.width()\n : this.mode() === 'partial'\n ? this.minWidth()\n : '0',\n );\n\n readonly styles = computed(() => {\n const styles = {} as any;\n if (this.dir.isRtl()) {\n styles.paddingRight = this.w();\n } else {\n styles.paddingLeft = this.w();\n }\n return styles;\n });\n\n animationDone() {\n this.status.set(this.show() ? 1 : 0);\n }\n\n animationStart() {\n this.status.set(1);\n }\n}\n","import {\n Component,\n computed,\n Directive,\n inject,\n input,\n linkedSignal,\n model,\n Type,\n} from '@angular/core';\nimport { fadeAnimation } from '@ngbase/adk/utils';\nimport { SidenavType } from './sidenav.service';\nimport { SidenavService } from './sidenav.service';\n\n@Component({\n selector: '[ngbSidenavOverlay]',\n template: ``,\n host: {\n class: 'sidenav-overlay',\n style: 'position:absolute;left:0;top:0;width:100%;height:100%;',\n '(click)': 'sidenav.toggle()',\n '[@fadeAnimation]': '',\n },\n animations: [fadeAnimation('500ms')],\n})\nexport class NgbSidenavOverlay {\n readonly sidenav = inject(NgbSidenav);\n}\n\n@Directive({\n selector: '[ngbSidenav]',\n exportAs: 'ngbSidenav',\n providers: [SidenavService],\n host: {\n style: 'position:relative;width:100%;height:100%;',\n },\n})\nexport class NgbSidenav {\n readonly sidenavService = inject(SidenavService);\n\n // Inputs\n readonly show = model(true);\n readonly mode = input<SidenavType>('side');\n\n readonly showOverlay = computed(() => this.mode() === 'over' && this.show());\n\n constructor() {\n this.sidenavService.show = linkedSignal(this.show);\n this.sidenavService.mode = linkedSignal(this.mode);\n }\n\n toggle() {\n this.show.update(show => !show);\n }\n}\n\nexport const aliasSidenav = (sidenav: Type<NgbSidenav>) => [\n SidenavService,\n { provide: NgbSidenav, useExisting: sidenav },\n];\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport { computed, Directive, ElementRef, inject, input, linkedSignal } from '@angular/core';\nimport { Directionality } from '@ngbase/adk/bidi';\nimport { SidenavService } from './sidenav.service';\nimport { DisableAnimation } from '@ngbase/adk/utils';\n\n@Directive({\n selector: '[ngbSidenavHeaderContent]',\n host: {\n '[style.width]': 'w()',\n },\n})\nexport class NgbSidenavHeaderContent {\n readonly sidenav = inject(SidenavService);\n readonly w = computed(() =>\n this.sidenav.mode() === 'partial' && !this.sidenav.show()\n ? this.sidenav.minWidth()\n : this.sidenav.width(),\n );\n}\n\n@Directive({\n selector: '[ngbSidenavHeaderTrack]',\n host: {\n '[style.width]': 'sidenav.w()',\n },\n})\nexport class NgbSidenavHeaderTrack {\n readonly sidenav = inject(SidenavService);\n}\n\nexport function slideAnimation(ease: string) {\n return trigger('slide', [\n state('true', style({ transform: 'translateX(0)' })),\n state('false', style({ transform: 'translateX({{x}})' }), { params: { x: '-100%' } }),\n transition('* <=> *', [animate(ease)]),\n ]);\n}\n\n@Directive({\n selector: '[ngbSidenavHeader]',\n hostDirectives: [DisableAnimation],\n host: {\n style: 'overflow:hidden;position:absolute;',\n '[style.visibility]': 'sidenav.visibility() ? \"visible\" : \"hidden\"',\n '[style]': `headerStyles()`,\n '[style.width]': `actualWidth()`,\n '[attr.aria-hidden]': '!sidenav.show()',\n '[attr.data-mode]': 'sidenav.mode()',\n '[@slide]': `{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }`,\n '(@slide.done)': 'sidenav.animationDone()',\n '(@slide.start)': 'sidenav.animationStart()',\n // '[@slide.disabled]': 'isAnimationDisabled()',\n },\n})\nexport class NgbSidenavHeader {\n readonly sidenav = inject(SidenavService);\n readonly el = inject(ElementRef);\n readonly dir = inject(Directionality);\n\n readonly width = input('250px');\n readonly minWidth = input('0');\n\n private initial = 0;\n readonly isAnimationDisabled = linkedSignal({\n source: this.sidenav.animate,\n computation: () => this.initial++ === 0, // this will not considered on initial render due to increment\n });\n\n readonly w = computed(() => (this.sidenav.mode() === 'partial' ? this.minWidth() : this.width()));\n readonly actualWidth = computed(() => {\n if (this.sidenav.show()) {\n return this.width();\n } else if (this.sidenav.mode() === 'partial') {\n return this.minWidth();\n } else if (this.sidenav.mode() === 'over') {\n return this.width();\n }\n return this.width();\n });\n\n readonly headerStyles = computed(() => {\n let styles = {};\n if (this.sidenav.mode() === 'over') {\n styles = { ...styles, position: 'absolute', top: '0', height: '100%' };\n }\n if (this.dir.isRtl()) {\n styles = { ...styles, right: '0' };\n } else {\n styles = { ...styles, left: '0' };\n }\n return styles;\n });\n\n constructor() {\n this.sidenav.width = linkedSignal(this.width);\n this.sidenav.minWidth = linkedSignal(this.minWidth);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/jwt/index.d.ts
CHANGED
|
@@ -1,20 +1,64 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
2
3
|
|
|
3
4
|
interface JwtOptions {
|
|
4
5
|
tokenGetter: () => string | null | undefined;
|
|
6
|
+
tokenSetter?: (token: string | null) => void;
|
|
7
|
+
refreshTokenGetter?: () => string | null | undefined;
|
|
8
|
+
refreshTokenSetter?: (token: string | null) => void;
|
|
5
9
|
}
|
|
6
|
-
declare function provideJwt(options: () => JwtOptions):
|
|
10
|
+
declare function provideJwt(options: () => JwtOptions): _angular_core.EnvironmentProviders;
|
|
7
11
|
declare class JwtService<T> {
|
|
8
|
-
private tokenKey;
|
|
9
12
|
private options;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
private accessTokenKey;
|
|
14
|
+
private refreshTokenKey;
|
|
15
|
+
private _accessToken;
|
|
16
|
+
private _refreshToken;
|
|
17
|
+
getAccessToken: _angular_core.Signal<string | null>;
|
|
18
|
+
getRefreshToken: _angular_core.Signal<string | null>;
|
|
19
|
+
setTokens(accessToken: string, refreshToken: string): void;
|
|
20
|
+
clearTokens(): void;
|
|
21
|
+
isAccessTokenExpired: () => boolean;
|
|
22
|
+
isRefreshTokenExpired: () => boolean;
|
|
23
|
+
isAccessTokenNearExpiry(minutesBeforeExpiry?: number): boolean;
|
|
24
|
+
decodeToken: _angular_core.Signal<T | null>;
|
|
25
|
+
getTokenExpirationDate: _angular_core.Signal<Date | null>;
|
|
26
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<JwtService<any>, never>;
|
|
27
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<JwtService<any>>;
|
|
17
28
|
}
|
|
18
|
-
declare const injectJwt: () => JwtService<
|
|
29
|
+
declare const injectJwt: <T>() => JwtService<T>;
|
|
19
30
|
|
|
20
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Centralized authentication service for guards and interceptors
|
|
33
|
+
* Handles token validation and refresh logic consistently
|
|
34
|
+
*/
|
|
35
|
+
declare class TokenGuardHelper {
|
|
36
|
+
private refreshApi;
|
|
37
|
+
private logout;
|
|
38
|
+
private readonly tokenRefreshService;
|
|
39
|
+
private readonly jwt;
|
|
40
|
+
constructor(refreshApi: () => Observable<any>, logout: () => void);
|
|
41
|
+
/**
|
|
42
|
+
* Checks if user is authenticated, handles token refresh if needed
|
|
43
|
+
* Returns Observable<boolean> - true if authenticated, false if should redirect to login
|
|
44
|
+
*/
|
|
45
|
+
checkAuthentication: () => Observable<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Enhanced authentication check with automatic retry
|
|
48
|
+
* Attempts refresh once, then falls back to login redirect
|
|
49
|
+
*/
|
|
50
|
+
ensureAuthenticated: () => Observable<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Quick synchronous check for authentication status
|
|
53
|
+
* Use this only when you don't need token refresh
|
|
54
|
+
*/
|
|
55
|
+
isQuickAuthenticated: () => boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Validates and refreshes token for HTTP requests
|
|
58
|
+
* Returns Observable<string> with valid access token or throws error
|
|
59
|
+
* Used by interceptors
|
|
60
|
+
*/
|
|
61
|
+
getValidAccessToken: () => Observable<string>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { JwtService, TokenGuardHelper, injectJwt, provideJwt };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngbase/adk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/ng-base/ngbase.git"
|
|
@@ -36,65 +36,69 @@
|
|
|
36
36
|
"types": "./a11y/index.d.ts",
|
|
37
37
|
"default": "./fesm2022/ngbase-adk-a11y.mjs"
|
|
38
38
|
},
|
|
39
|
-
"./avatar": {
|
|
40
|
-
"types": "./avatar/index.d.ts",
|
|
41
|
-
"default": "./fesm2022/ngbase-adk-avatar.mjs"
|
|
42
|
-
},
|
|
43
|
-
"./autocomplete": {
|
|
44
|
-
"types": "./autocomplete/index.d.ts",
|
|
45
|
-
"default": "./fesm2022/ngbase-adk-autocomplete.mjs"
|
|
46
|
-
},
|
|
47
39
|
"./accordion": {
|
|
48
40
|
"types": "./accordion/index.d.ts",
|
|
49
41
|
"default": "./fesm2022/ngbase-adk-accordion.mjs"
|
|
50
42
|
},
|
|
43
|
+
"./avatar": {
|
|
44
|
+
"types": "./avatar/index.d.ts",
|
|
45
|
+
"default": "./fesm2022/ngbase-adk-avatar.mjs"
|
|
46
|
+
},
|
|
51
47
|
"./bidi": {
|
|
52
48
|
"types": "./bidi/index.d.ts",
|
|
53
49
|
"default": "./fesm2022/ngbase-adk-bidi.mjs"
|
|
54
50
|
},
|
|
55
|
-
"./
|
|
56
|
-
"types": "./
|
|
57
|
-
"default": "./fesm2022/ngbase-adk-
|
|
51
|
+
"./autocomplete": {
|
|
52
|
+
"types": "./autocomplete/index.d.ts",
|
|
53
|
+
"default": "./fesm2022/ngbase-adk-autocomplete.mjs"
|
|
58
54
|
},
|
|
59
55
|
"./cache": {
|
|
60
56
|
"types": "./cache/index.d.ts",
|
|
61
57
|
"default": "./fesm2022/ngbase-adk-cache.mjs"
|
|
62
58
|
},
|
|
59
|
+
"./breadcrumb": {
|
|
60
|
+
"types": "./breadcrumb/index.d.ts",
|
|
61
|
+
"default": "./fesm2022/ngbase-adk-breadcrumb.mjs"
|
|
62
|
+
},
|
|
63
63
|
"./carousel": {
|
|
64
64
|
"types": "./carousel/index.d.ts",
|
|
65
65
|
"default": "./fesm2022/ngbase-adk-carousel.mjs"
|
|
66
66
|
},
|
|
67
|
+
"./checkbox": {
|
|
68
|
+
"types": "./checkbox/index.d.ts",
|
|
69
|
+
"default": "./fesm2022/ngbase-adk-checkbox.mjs"
|
|
70
|
+
},
|
|
67
71
|
"./chip": {
|
|
68
72
|
"types": "./chip/index.d.ts",
|
|
69
73
|
"default": "./fesm2022/ngbase-adk-chip.mjs"
|
|
70
74
|
},
|
|
75
|
+
"./collections": {
|
|
76
|
+
"types": "./collections/index.d.ts",
|
|
77
|
+
"default": "./fesm2022/ngbase-adk-collections.mjs"
|
|
78
|
+
},
|
|
71
79
|
"./clipboard": {
|
|
72
80
|
"types": "./clipboard/index.d.ts",
|
|
73
81
|
"default": "./fesm2022/ngbase-adk-clipboard.mjs"
|
|
74
82
|
},
|
|
75
|
-
"./
|
|
76
|
-
"types": "./
|
|
77
|
-
"default": "./fesm2022/ngbase-adk-
|
|
78
|
-
},
|
|
79
|
-
"./collections": {
|
|
80
|
-
"types": "./collections/index.d.ts",
|
|
81
|
-
"default": "./fesm2022/ngbase-adk-collections.mjs"
|
|
83
|
+
"./cookies": {
|
|
84
|
+
"types": "./cookies/index.d.ts",
|
|
85
|
+
"default": "./fesm2022/ngbase-adk-cookies.mjs"
|
|
82
86
|
},
|
|
83
87
|
"./color-picker": {
|
|
84
88
|
"types": "./color-picker/index.d.ts",
|
|
85
89
|
"default": "./fesm2022/ngbase-adk-color-picker.mjs"
|
|
86
90
|
},
|
|
87
|
-
"./
|
|
88
|
-
"types": "./
|
|
89
|
-
"default": "./fesm2022/ngbase-adk-
|
|
91
|
+
"./datepicker": {
|
|
92
|
+
"types": "./datepicker/index.d.ts",
|
|
93
|
+
"default": "./fesm2022/ngbase-adk-datepicker.mjs"
|
|
90
94
|
},
|
|
91
95
|
"./dialog": {
|
|
92
96
|
"types": "./dialog/index.d.ts",
|
|
93
97
|
"default": "./fesm2022/ngbase-adk-dialog.mjs"
|
|
94
98
|
},
|
|
95
|
-
"./
|
|
96
|
-
"types": "./
|
|
97
|
-
"default": "./fesm2022/ngbase-adk-
|
|
99
|
+
"./hover-card": {
|
|
100
|
+
"types": "./hover-card/index.d.ts",
|
|
101
|
+
"default": "./fesm2022/ngbase-adk-hover-card.mjs"
|
|
98
102
|
},
|
|
99
103
|
"./drag": {
|
|
100
104
|
"types": "./drag/index.d.ts",
|
|
@@ -104,10 +108,6 @@
|
|
|
104
108
|
"types": "./form-field/index.d.ts",
|
|
105
109
|
"default": "./fesm2022/ngbase-adk-form-field.mjs"
|
|
106
110
|
},
|
|
107
|
-
"./hover-card": {
|
|
108
|
-
"types": "./hover-card/index.d.ts",
|
|
109
|
-
"default": "./fesm2022/ngbase-adk-hover-card.mjs"
|
|
110
|
-
},
|
|
111
111
|
"./icon": {
|
|
112
112
|
"types": "./icon/index.d.ts",
|
|
113
113
|
"default": "./fesm2022/ngbase-adk-icon.mjs"
|
|
@@ -120,18 +120,22 @@
|
|
|
120
120
|
"types": "./inline-edit/index.d.ts",
|
|
121
121
|
"default": "./fesm2022/ngbase-adk-inline-edit.mjs"
|
|
122
122
|
},
|
|
123
|
-
"./layout": {
|
|
124
|
-
"types": "./layout/index.d.ts",
|
|
125
|
-
"default": "./fesm2022/ngbase-adk-layout.mjs"
|
|
126
|
-
},
|
|
127
123
|
"./keys": {
|
|
128
124
|
"types": "./keys/index.d.ts",
|
|
129
125
|
"default": "./fesm2022/ngbase-adk-keys.mjs"
|
|
130
126
|
},
|
|
127
|
+
"./layout": {
|
|
128
|
+
"types": "./layout/index.d.ts",
|
|
129
|
+
"default": "./fesm2022/ngbase-adk-layout.mjs"
|
|
130
|
+
},
|
|
131
131
|
"./list": {
|
|
132
132
|
"types": "./list/index.d.ts",
|
|
133
133
|
"default": "./fesm2022/ngbase-adk-list.mjs"
|
|
134
134
|
},
|
|
135
|
+
"./menu": {
|
|
136
|
+
"types": "./menu/index.d.ts",
|
|
137
|
+
"default": "./fesm2022/ngbase-adk-menu.mjs"
|
|
138
|
+
},
|
|
135
139
|
"./mask": {
|
|
136
140
|
"types": "./mask/index.d.ts",
|
|
137
141
|
"default": "./fesm2022/ngbase-adk-mask.mjs"
|
|
@@ -140,33 +144,29 @@
|
|
|
140
144
|
"types": "./network/index.d.ts",
|
|
141
145
|
"default": "./fesm2022/ngbase-adk-network.mjs"
|
|
142
146
|
},
|
|
143
|
-
"./menu": {
|
|
144
|
-
"types": "./menu/index.d.ts",
|
|
145
|
-
"default": "./fesm2022/ngbase-adk-menu.mjs"
|
|
146
|
-
},
|
|
147
147
|
"./otp": {
|
|
148
148
|
"types": "./otp/index.d.ts",
|
|
149
149
|
"default": "./fesm2022/ngbase-adk-otp.mjs"
|
|
150
150
|
},
|
|
151
|
-
"./pagination": {
|
|
152
|
-
"types": "./pagination/index.d.ts",
|
|
153
|
-
"default": "./fesm2022/ngbase-adk-pagination.mjs"
|
|
154
|
-
},
|
|
155
151
|
"./popover": {
|
|
156
152
|
"types": "./popover/index.d.ts",
|
|
157
153
|
"default": "./fesm2022/ngbase-adk-popover.mjs"
|
|
158
154
|
},
|
|
159
|
-
"./
|
|
160
|
-
"types": "./
|
|
161
|
-
"default": "./fesm2022/ngbase-adk-
|
|
155
|
+
"./pagination": {
|
|
156
|
+
"types": "./pagination/index.d.ts",
|
|
157
|
+
"default": "./fesm2022/ngbase-adk-pagination.mjs"
|
|
158
|
+
},
|
|
159
|
+
"./portal": {
|
|
160
|
+
"types": "./portal/index.d.ts",
|
|
161
|
+
"default": "./fesm2022/ngbase-adk-portal.mjs"
|
|
162
162
|
},
|
|
163
163
|
"./radio": {
|
|
164
164
|
"types": "./radio/index.d.ts",
|
|
165
165
|
"default": "./fesm2022/ngbase-adk-radio.mjs"
|
|
166
166
|
},
|
|
167
|
-
"./
|
|
168
|
-
"types": "./
|
|
169
|
-
"default": "./fesm2022/ngbase-adk-
|
|
167
|
+
"./progress": {
|
|
168
|
+
"types": "./progress/index.d.ts",
|
|
169
|
+
"default": "./fesm2022/ngbase-adk-progress.mjs"
|
|
170
170
|
},
|
|
171
171
|
"./resizable": {
|
|
172
172
|
"types": "./resizable/index.d.ts",
|
|
@@ -188,14 +188,14 @@
|
|
|
188
188
|
"types": "./sheet/index.d.ts",
|
|
189
189
|
"default": "./fesm2022/ngbase-adk-sheet.mjs"
|
|
190
190
|
},
|
|
191
|
-
"./sidenav": {
|
|
192
|
-
"types": "./sidenav/index.d.ts",
|
|
193
|
-
"default": "./fesm2022/ngbase-adk-sidenav.mjs"
|
|
194
|
-
},
|
|
195
191
|
"./slider": {
|
|
196
192
|
"types": "./slider/index.d.ts",
|
|
197
193
|
"default": "./fesm2022/ngbase-adk-slider.mjs"
|
|
198
194
|
},
|
|
195
|
+
"./sidenav": {
|
|
196
|
+
"types": "./sidenav/index.d.ts",
|
|
197
|
+
"default": "./fesm2022/ngbase-adk-sidenav.mjs"
|
|
198
|
+
},
|
|
199
199
|
"./sonner": {
|
|
200
200
|
"types": "./sonner/index.d.ts",
|
|
201
201
|
"default": "./fesm2022/ngbase-adk-sonner.mjs"
|
|
@@ -208,6 +208,10 @@
|
|
|
208
208
|
"types": "./switch/index.d.ts",
|
|
209
209
|
"default": "./fesm2022/ngbase-adk-switch.mjs"
|
|
210
210
|
},
|
|
211
|
+
"./tabs": {
|
|
212
|
+
"types": "./tabs/index.d.ts",
|
|
213
|
+
"default": "./fesm2022/ngbase-adk-tabs.mjs"
|
|
214
|
+
},
|
|
211
215
|
"./table": {
|
|
212
216
|
"types": "./table/index.d.ts",
|
|
213
217
|
"default": "./fesm2022/ngbase-adk-table.mjs"
|
|
@@ -220,30 +224,26 @@
|
|
|
220
224
|
"types": "./toggle/index.d.ts",
|
|
221
225
|
"default": "./fesm2022/ngbase-adk-toggle.mjs"
|
|
222
226
|
},
|
|
223
|
-
"./tabs": {
|
|
224
|
-
"types": "./tabs/index.d.ts",
|
|
225
|
-
"default": "./fesm2022/ngbase-adk-tabs.mjs"
|
|
226
|
-
},
|
|
227
227
|
"./toggle-group": {
|
|
228
228
|
"types": "./toggle-group/index.d.ts",
|
|
229
229
|
"default": "./fesm2022/ngbase-adk-toggle-group.mjs"
|
|
230
230
|
},
|
|
231
|
-
"./
|
|
232
|
-
"types": "./
|
|
233
|
-
"default": "./fesm2022/ngbase-adk-
|
|
231
|
+
"./translate": {
|
|
232
|
+
"types": "./translate/index.d.ts",
|
|
233
|
+
"default": "./fesm2022/ngbase-adk-translate.mjs"
|
|
234
234
|
},
|
|
235
235
|
"./tooltip": {
|
|
236
236
|
"types": "./tooltip/index.d.ts",
|
|
237
237
|
"default": "./fesm2022/ngbase-adk-tooltip.mjs"
|
|
238
238
|
},
|
|
239
|
-
"./translate": {
|
|
240
|
-
"types": "./translate/index.d.ts",
|
|
241
|
-
"default": "./fesm2022/ngbase-adk-translate.mjs"
|
|
242
|
-
},
|
|
243
239
|
"./tree": {
|
|
244
240
|
"types": "./tree/index.d.ts",
|
|
245
241
|
"default": "./fesm2022/ngbase-adk-tree.mjs"
|
|
246
242
|
},
|
|
243
|
+
"./tour": {
|
|
244
|
+
"types": "./tour/index.d.ts",
|
|
245
|
+
"default": "./fesm2022/ngbase-adk-tour.mjs"
|
|
246
|
+
},
|
|
247
247
|
"./utils": {
|
|
248
248
|
"types": "./utils/index.d.ts",
|
|
249
249
|
"default": "./fesm2022/ngbase-adk-utils.mjs"
|
|
@@ -47,7 +47,7 @@ export class Accordion extends NgbAccordion {}
|
|
|
47
47
|
hostDirectives: [NgbAccordionHeader],
|
|
48
48
|
host: {
|
|
49
49
|
class:
|
|
50
|
-
'flex items-center w-full py-3 px-3 aria-disabled:cursor-not-allowed aria-disabled:opacity-50',
|
|
50
|
+
'flex items-center w-full py-3 px-3 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 cursor-pointer',
|
|
51
51
|
},
|
|
52
52
|
})
|
|
53
53
|
export class AccordionHeader {}
|
|
@@ -11,14 +11,15 @@ import { Button } from '@/ui/button';
|
|
|
11
11
|
- ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'icon'
|
|
12
12
|
- **Inputs:**
|
|
13
13
|
|
|
14
|
-
-
|
|
14
|
+
- `<%= name %>Button`: ButtonVariant = 'primary'
|
|
15
15
|
|
|
16
16
|
- **Export:** `#button="<%= name %>Button"` - Template reference
|
|
17
17
|
|
|
18
18
|
## Usage
|
|
19
19
|
|
|
20
20
|
```html
|
|
21
|
-
<button <%= name %>Button>Button</button>
|
|
21
|
+
<button <%= name %>Button>Button</button>
|
|
22
|
+
<button <%= name %>Button="ghost">Button</button>
|
|
22
23
|
<button <%= name %>Button="icon">
|
|
23
24
|
<<%= name %>-icon name="lucideHouse" />
|
|
24
25
|
</button>
|
|
@@ -79,7 +79,7 @@ export class Description {}
|
|
|
79
79
|
@Directive({
|
|
80
80
|
selector: '[<%= name %>Prefix]',
|
|
81
81
|
host: {
|
|
82
|
-
class: 'mr-2.5',
|
|
82
|
+
class: 'mr-2.5 text-muted-foreground',
|
|
83
83
|
},
|
|
84
84
|
})
|
|
85
85
|
export class InputPrefix {}
|
|
@@ -87,7 +87,7 @@ export class InputPrefix {}
|
|
|
87
87
|
@Directive({
|
|
88
88
|
selector: '[<%= name %>Suffix]',
|
|
89
89
|
host: {
|
|
90
|
-
class: 'ml-2.5',
|
|
90
|
+
class: 'ml-2.5 text-muted-foreground',
|
|
91
91
|
},
|
|
92
92
|
})
|
|
93
93
|
export class InputSuffix {}
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
<div class="relative flex overflow-hidden">
|
|
28
28
|
<button
|
|
29
29
|
ngbTabScroll="left"
|
|
30
|
-
class="absolute left-0 z-10 h-full place-items-center
|
|
30
|
+
class="bg-background absolute left-0 z-10 h-full place-items-center px-2"
|
|
31
31
|
>
|
|
32
32
|
<<%= name %>-icon name="lucideChevronLeft" />
|
|
33
33
|
</button>
|
|
@@ -36,14 +36,14 @@ import {
|
|
|
36
36
|
@for (tab of tabs(); track tab.id) {
|
|
37
37
|
<button
|
|
38
38
|
[ngbTabButton]="tab"
|
|
39
|
-
class="
|
|
39
|
+
class="text-muted-foreground aria-[selected=true]:!border-primary aria-[disabled=true]:text-muted-foreground aria-[selected=true]:!text-primary cursor-pointer border-b-2 border-transparent font-medium whitespace-nowrap aria-[disabled=true]:cursor-not-allowed aria-[disabled=true]:opacity-50 [&[data-ch='false']]:px-4 [&[data-ch='false']]:py-3 [&[data-ch='true']>*:first-child]:px-4 [&[data-ch='true']>*:first-child]:py-3"
|
|
40
40
|
></button>
|
|
41
41
|
}
|
|
42
42
|
</div>
|
|
43
43
|
</nav>
|
|
44
44
|
<button
|
|
45
45
|
ngbTabScroll="right"
|
|
46
|
-
class="absolute right-0 z-10 h-full place-items-center
|
|
46
|
+
class="bg-background absolute right-0 z-10 h-full place-items-center px-2"
|
|
47
47
|
>
|
|
48
48
|
<<%= name %>-icon name="lucideChevronRight" />
|
|
49
49
|
</button>
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"chip",
|
|
44
44
|
"color-picker",
|
|
45
45
|
"command",
|
|
46
|
+
"confirmation",
|
|
46
47
|
"datepicker",
|
|
47
48
|
"dialog",
|
|
48
49
|
"drawer",
|
|
@@ -100,6 +101,7 @@
|
|
|
100
101
|
{ "value": "chip", "label": "Chip" },
|
|
101
102
|
{ "value": "color-picker", "label": "Color Picker" },
|
|
102
103
|
{ "value": "command", "label": "Command" },
|
|
104
|
+
{ "value": "confirmation", "label": "Confirmation" },
|
|
103
105
|
{ "value": "datepicker", "label": "Datepicker" },
|
|
104
106
|
{ "value": "dialog", "label": "Dialog" },
|
|
105
107
|
{ "value": "drawer", "label": "Drawer" },
|
package/sidenav/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { Type, ElementRef } from '@angular/core';
|
|
|
3
3
|
import * as _ngbase_adk_bidi from '@ngbase/adk/bidi';
|
|
4
4
|
import { Directionality } from '@ngbase/adk/bidi';
|
|
5
5
|
import * as _angular_animations from '@angular/animations';
|
|
6
|
+
import * as i1 from '@ngbase/adk/utils';
|
|
6
7
|
|
|
7
8
|
type SidenavType = 'side' | 'over' | 'partial';
|
|
8
9
|
declare class SidenavService {
|
|
@@ -67,7 +68,7 @@ declare class NgbSidenavHeader {
|
|
|
67
68
|
readonly headerStyles: _angular_core.Signal<{}>;
|
|
68
69
|
constructor();
|
|
69
70
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgbSidenavHeader, never>;
|
|
70
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgbSidenavHeader, "[ngbSidenavHeader]", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true,
|
|
71
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgbSidenavHeader, "[ngbSidenavHeader]", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.DisableAnimation; inputs: {}; outputs: {}; }]>;
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
export { NgbSidenav, NgbSidenavHeader, NgbSidenavHeaderContent, NgbSidenavHeaderTrack, NgbSidenavOverlay, aliasSidenav, slideAnimation };
|