quang 20.4.5 → 20.5.0
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/auth/index.d.ts +4 -5
- package/components/date/index.d.ts +1 -0
- package/fesm2022/quang-auth.mjs +20 -20
- package/fesm2022/quang-auth.mjs.map +1 -1
- package/fesm2022/quang-components-autocomplete.mjs +4 -4
- package/fesm2022/quang-components-autocomplete.mjs.map +1 -1
- package/fesm2022/quang-components-checkbox.mjs +4 -4
- package/fesm2022/quang-components-checkbox.mjs.map +1 -1
- package/fesm2022/quang-components-date.mjs +23 -8
- package/fesm2022/quang-components-date.mjs.map +1 -1
- package/fesm2022/quang-components-input.mjs +4 -4
- package/fesm2022/quang-components-input.mjs.map +1 -1
- package/fesm2022/quang-components-paginator.mjs +14 -14
- package/fesm2022/quang-components-paginator.mjs.map +1 -1
- package/fesm2022/quang-components-select.mjs +4 -4
- package/fesm2022/quang-components-select.mjs.map +1 -1
- package/fesm2022/quang-components-shared.mjs +8 -8
- package/fesm2022/quang-components-shared.mjs.map +1 -1
- package/fesm2022/quang-components-table.mjs +4 -4
- package/fesm2022/quang-components-table.mjs.map +1 -1
- package/fesm2022/quang-components-wysiwyg.mjs +4 -4
- package/fesm2022/quang-components-wysiwyg.mjs.map +1 -1
- package/fesm2022/quang-device.mjs +3 -3
- package/fesm2022/quang-device.mjs.map +1 -1
- package/fesm2022/quang-loader.mjs +7 -7
- package/fesm2022/quang-loader.mjs.map +1 -1
- package/fesm2022/quang-overlay-modal.mjs +90 -12
- package/fesm2022/quang-overlay-modal.mjs.map +1 -1
- package/fesm2022/quang-overlay-popover.mjs +8 -8
- package/fesm2022/quang-overlay-popover.mjs.map +1 -1
- package/fesm2022/quang-overlay-shared.mjs +11 -11
- package/fesm2022/quang-overlay-shared.mjs.map +1 -1
- package/fesm2022/quang-overlay-toast.mjs +7 -7
- package/fesm2022/quang-overlay-toast.mjs.map +1 -1
- package/fesm2022/quang-overlay-tooltip.mjs +8 -8
- package/fesm2022/quang-overlay-tooltip.mjs.map +1 -1
- package/fesm2022/quang-translation.mjs +6 -6
- package/fesm2022/quang-translation.mjs.map +1 -1
- package/overlay/modal/index.d.ts +39 -5
- package/overlay/toast/index.d.ts +2 -3
- package/package.json +18 -18
package/auth/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { InjectionToken, EnvironmentProviders, Provider, ViewContainerRef, EmbeddedViewRef, TemplateRef, ChangeDetectorRef } from '@angular/core';
|
|
3
3
|
import { QuangFeature, QuangFeatureKind } from 'quang';
|
|
4
4
|
import * as _ngrx_signals from '@ngrx/signals';
|
|
5
|
-
import * as node_modules__ngrx_signals_src_deep_signal from 'node_modules/@ngrx/signals/src/deep-signal';
|
|
6
5
|
import { AuthConfig, OAuthStorage } from 'angular-oauth2-oidc';
|
|
7
6
|
import * as rxjs from 'rxjs';
|
|
8
7
|
import { CanActivateFn } from '@angular/router';
|
|
@@ -33,12 +32,12 @@ declare class QuangAuthService {
|
|
|
33
32
|
logLevel: "normal" | "verbose" | null;
|
|
34
33
|
private oAuthService;
|
|
35
34
|
private state;
|
|
36
|
-
loginChecked:
|
|
35
|
+
loginChecked: i0.Signal<boolean>;
|
|
37
36
|
isAuthenticated: i0.Signal<boolean>;
|
|
38
|
-
authenticationError:
|
|
37
|
+
authenticationError: i0.Signal<boolean>;
|
|
39
38
|
tokenStatus: _ngrx_signals.DeepSignal<TokenStatus>;
|
|
40
|
-
roles:
|
|
41
|
-
user:
|
|
39
|
+
roles: i0.Signal<Set<string>>;
|
|
40
|
+
user: i0.Signal<Record<string, any> | null>;
|
|
42
41
|
constructor();
|
|
43
42
|
init(): Promise<void>;
|
|
44
43
|
checkForAuthentication(forceRefresh?: boolean): Promise<boolean | undefined>;
|
|
@@ -79,6 +79,7 @@ declare class QuangDateComponent extends QuangBaseComponent<string | DateRange |
|
|
|
79
79
|
getLocale(): AirDatepickerLocale;
|
|
80
80
|
onCancel(): void;
|
|
81
81
|
private dateToUtc;
|
|
82
|
+
private dateToLocal;
|
|
82
83
|
private setCalendarPosition;
|
|
83
84
|
private setupTimepicker;
|
|
84
85
|
checkDateMatch(date: string): boolean;
|
package/fesm2022/quang-auth.mjs
CHANGED
|
@@ -173,10 +173,10 @@ class QuangAuthService {
|
|
|
173
173
|
hasAtLeastOneRole(roles) {
|
|
174
174
|
return roles.some((role) => this.roles().has(role));
|
|
175
175
|
}
|
|
176
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
177
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
176
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangAuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
177
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangAuthService, providedIn: 'root' }); }
|
|
178
178
|
}
|
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangAuthService, decorators: [{
|
|
180
180
|
type: Injectable,
|
|
181
181
|
args: [{
|
|
182
182
|
providedIn: 'root',
|
|
@@ -247,15 +247,15 @@ class QuangHasAtLeastOneRoleDirective {
|
|
|
247
247
|
this.changeDetectorRef.markForCheck();
|
|
248
248
|
}, ...(ngDevMode ? [{ debugName: "hideViewIfNotAllowed" }] : []));
|
|
249
249
|
}
|
|
250
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
251
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.
|
|
250
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangHasAtLeastOneRoleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
251
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.10", type: QuangHasAtLeastOneRoleDirective, isStandalone: true, selector: "[quangHasAtLeastOneRole]", inputs: { targetRoles: { classPropertyName: "targetRoles", publicName: "quangHasAtLeastOneRole", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
|
|
252
252
|
}
|
|
253
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangHasAtLeastOneRoleDirective, decorators: [{
|
|
254
254
|
type: Directive,
|
|
255
255
|
args: [{
|
|
256
256
|
selector: '[quangHasAtLeastOneRole]',
|
|
257
257
|
}]
|
|
258
|
-
}] });
|
|
258
|
+
}], propDecorators: { targetRoles: [{ type: i0.Input, args: [{ isSignal: true, alias: "quangHasAtLeastOneRole", required: true }] }] } });
|
|
259
259
|
|
|
260
260
|
/**
|
|
261
261
|
* This directive conditionally renders the associated template if the authenticated user
|
|
@@ -292,15 +292,15 @@ class QuangHasEveryRoleDirective {
|
|
|
292
292
|
this.changeDetectorRef.markForCheck();
|
|
293
293
|
}, ...(ngDevMode ? [{ debugName: "hideViewIfNotAllowed" }] : []));
|
|
294
294
|
}
|
|
295
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
296
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.
|
|
295
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangHasEveryRoleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
296
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.10", type: QuangHasEveryRoleDirective, isStandalone: true, selector: "[quangHasEveryRole]", inputs: { targetRoles: { classPropertyName: "targetRoles", publicName: "quangHasEveryRole", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
|
|
297
297
|
}
|
|
298
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangHasEveryRoleDirective, decorators: [{
|
|
299
299
|
type: Directive,
|
|
300
300
|
args: [{
|
|
301
301
|
selector: '[quangHasEveryRole]',
|
|
302
302
|
}]
|
|
303
|
-
}] });
|
|
303
|
+
}], propDecorators: { targetRoles: [{ type: i0.Input, args: [{ isSignal: true, alias: "quangHasEveryRole", required: true }] }] } });
|
|
304
304
|
|
|
305
305
|
class QuangIsAuthenticatedDirective {
|
|
306
306
|
constructor() {
|
|
@@ -322,10 +322,10 @@ class QuangIsAuthenticatedDirective {
|
|
|
322
322
|
this.changeDetectorRef.markForCheck();
|
|
323
323
|
}, ...(ngDevMode ? [{ debugName: "hideViewIfNotAuthenticated" }] : []));
|
|
324
324
|
}
|
|
325
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
326
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.
|
|
325
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangIsAuthenticatedDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
326
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.10", type: QuangIsAuthenticatedDirective, isStandalone: true, selector: "[quangIsAuthenticated]", ngImport: i0 }); }
|
|
327
327
|
}
|
|
328
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
328
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangIsAuthenticatedDirective, decorators: [{
|
|
329
329
|
type: Directive,
|
|
330
330
|
args: [{
|
|
331
331
|
selector: '[quangIsAuthenticated]',
|
|
@@ -351,10 +351,10 @@ class QuangIsNotAuthenticatedDirective {
|
|
|
351
351
|
this.changeDetectorRef.markForCheck();
|
|
352
352
|
}, ...(ngDevMode ? [{ debugName: "showViewIfNotAuthenticated" }] : []));
|
|
353
353
|
}
|
|
354
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
355
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.
|
|
354
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangIsNotAuthenticatedDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
355
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.10", type: QuangIsNotAuthenticatedDirective, isStandalone: true, selector: "[quangIsNotAuthenticated]", ngImport: i0 }); }
|
|
356
356
|
}
|
|
357
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangIsNotAuthenticatedDirective, decorators: [{
|
|
358
358
|
type: Directive,
|
|
359
359
|
args: [{
|
|
360
360
|
selector: '[quangIsNotAuthenticated]',
|
|
@@ -439,10 +439,10 @@ class MemoryStorage {
|
|
|
439
439
|
setItem(key, data) {
|
|
440
440
|
this.data.set(key, data);
|
|
441
441
|
}
|
|
442
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
443
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
442
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: MemoryStorage, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
443
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: MemoryStorage }); }
|
|
444
444
|
}
|
|
445
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
445
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: MemoryStorage, decorators: [{
|
|
446
446
|
type: Injectable
|
|
447
447
|
}] });
|
|
448
448
|
function withMemoryStorage() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quang-auth.mjs","sources":["../../../projects/quang/auth/auth.service.ts","../../../projects/quang/auth/auth-providers.ts","../../../projects/quang/auth/directives/has-at-least-one-role.directive.ts","../../../projects/quang/auth/directives/has-every-role.directive.ts","../../../projects/quang/auth/directives/is-authenticated.directive.ts","../../../projects/quang/auth/directives/is-not-authenticated.directive.ts","../../../projects/quang/auth/guards/is-allowed.guard.ts","../../../projects/quang/auth/guards/is-authenticated.guard.ts","../../../projects/quang/auth/logout-on-error.interceptor.ts","../../../projects/quang/auth/token-storage/local-storage-feature.ts","../../../projects/quang/auth/token-storage/memory-storage-feature.ts","../../../projects/quang/auth/token-storage/session-storage-feature.ts","../../../projects/quang/auth/quang-auth.ts"],"sourcesContent":["import {\n EnvironmentProviders,\n Injectable,\n InjectionToken,\n computed,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { patchState, signalState } from '@ngrx/signals'\n\nimport { AuthConfig, OAuthErrorEvent, OAuthEvent, OAuthService } from 'angular-oauth2-oidc'\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\nimport { filter, firstValueFrom } from 'rxjs'\n\nexport const AUTH_CONFIG = new InjectionToken<QuangAuthConfig | undefined>('AUTH_CONFIG')\n\nexport interface QuangAuthConfig extends AuthConfig {\n autoLogin: boolean\n sendAccessToken: boolean\n urlsToSendToken: string[]\n revokeTokensOnLogout?: boolean\n getUserProfileOnLoginSuccess?: boolean\n useSilentRefresh: boolean\n}\n\nexport function provideQuangAuthConfig(authConfig?: QuangAuthConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: AUTH_CONFIG, useValue: authConfig }])\n}\n\nexport const OPEN_URI = new InjectionToken<(uri: string) => void | undefined>('OPEN_URI')\n\nexport function provideOpenURI(openURI: (uri: string) => void | undefined): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: OPEN_URI, deps: [], useFactory: openURI }])\n}\n\ninterface LoginStatus {\n checked: boolean\n authenticationError: boolean\n}\n\ninterface TokenStatus {\n accessToken: string | null\n accessTokenExpiresAt: number | null\n idToken: string | null\n idTokenExpiresAt: number | null\n refreshToken: string | null\n}\n\ninterface AuthState {\n loginStatus: LoginStatus\n tokenStatus: TokenStatus\n roles: Set<string>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n user: Record<string, any> | null\n}\n\nconst initialState: AuthState = {\n loginStatus: {\n checked: false,\n authenticationError: false,\n },\n tokenStatus: {\n accessToken: null,\n accessTokenExpiresAt: null,\n idToken: null,\n idTokenExpiresAt: null,\n refreshToken: null,\n },\n roles: new Set<string>(),\n user: null,\n}\n\n// Subset of situations from https://openid.net/specs/openid-connect-core-1_0.html#AuthError\n// Only the ones where it's reasonably sure that sending the user to the IdServer will help.\nconst errorResponsesRequiringUserInteraction = [\n 'interaction_required',\n 'login_required',\n 'account_selection_required',\n 'consent_required',\n]\n\n@Injectable({\n providedIn: 'root',\n})\nexport class QuangAuthService {\n private config: QuangAuthConfig\n\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n private oAuthService = inject(OAuthService, { optional: true })\n\n private state = signalState<AuthState>(initialState)\n\n loginChecked = this.state.loginStatus.checked\n\n isAuthenticated = computed(() => !!this.state.tokenStatus.accessToken())\n\n authenticationError = this.state.loginStatus.authenticationError\n\n tokenStatus = this.state.tokenStatus\n\n roles = this.state.roles\n\n user = this.state.user\n\n constructor() {\n const authConfig = inject(AUTH_CONFIG)\n if (!authConfig) throw new Error('Missing auth config')\n\n const openUri = inject(OPEN_URI, { optional: true })\n if (openUri) authConfig.openUri = openUri\n\n this.config = authConfig\n\n this.oAuthService?.events.pipe(takeUntilDestroyed()).subscribe((event: OAuthEvent) => {\n if (this.logLevel === 'verbose') console.debug('Auth service event', event)\n if (event instanceof OAuthErrorEvent && this.loginChecked()) this.loginError()\n if (event.type === 'token_received') this.setTokens()\n })\n this.oAuthService?.configure(this.config)\n }\n\n public async init() {\n this.oAuthService?.setupAutomaticSilentRefresh()\n\n await this.oAuthService?.loadDiscoveryDocumentAndTryLogin()\n\n await this.checkForAuthentication()\n\n if (this.config.autoLogin && !this.isAuthenticated()) this.login()\n }\n\n public async checkForAuthentication(forceRefresh = false) {\n let hasValidToken = this.oAuthService?.hasValidAccessToken()\n\n try {\n if (forceRefresh) hasValidToken = await this.refreshAuth()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const reason = error?.reason\n if (this.config.autoLogin && reason && errorResponsesRequiringUserInteraction.includes(reason)) this.login()\n hasValidToken = false\n }\n\n this.setTokens()\n patchState(this.state, {\n loginStatus: {\n ...this.state().loginStatus,\n checked: true,\n },\n })\n\n if (hasValidToken && this.config.getUserProfileOnLoginSuccess) await this.getUserProfile()\n\n return hasValidToken\n }\n\n private async refreshAuth() {\n if (this.config.responseType === 'code') await this.oAuthService?.refreshToken()\n else await this.oAuthService?.silentRefresh()\n return this.oAuthService?.hasValidAccessToken()\n }\n\n public login() {\n this.oAuthService?.initLoginFlow()\n }\n\n public async logout() {\n if (!this.isAuthenticated()) return\n if (this.config.revokeTokensOnLogout) await this.oAuthService?.revokeTokenAndLogout()\n else this.oAuthService?.logOut()\n patchState(this.state, { ...initialState })\n }\n\n private loginError() {\n patchState(this.state, {\n loginStatus: {\n ...this.state().loginStatus,\n authenticationError: true,\n },\n })\n this.logout()\n }\n\n public async getUserProfile() {\n const user = await this.oAuthService?.loadUserProfile()\n if (user) patchState(this.state, { user })\n }\n\n private setTokens() {\n const tokenStatus = {\n accessToken: this.oAuthService?.getAccessToken() ?? null,\n accessTokenExpiresAt: this.oAuthService?.getAccessTokenExpiration() ?? null,\n idToken: this.oAuthService?.getIdToken() ?? null,\n idTokenExpiresAt: this.oAuthService?.getIdTokenExpiration() ?? null,\n refreshToken: this.oAuthService?.getRefreshToken() ?? null,\n }\n if (this.logLevel === 'verbose') {\n const now = new Date()\n const accessTokenDate = new Date(tokenStatus.accessTokenExpiresAt ?? '')\n const idTokenDate = new Date(tokenStatus.idTokenExpiresAt ?? '')\n console.table(tokenStatus)\n console.debug(\n `Id token expires at ${idTokenDate} in ${Math.abs(idTokenDate.valueOf() - now.valueOf()) / 1000 / 60} minutes`\n )\n console.debug(\n `Access token expires at ${accessTokenDate} in ${Math.abs(accessTokenDate.valueOf() - now.valueOf()) / 1000 / 60} minutes`\n )\n }\n patchState(this.state, {\n tokenStatus,\n })\n }\n\n async waitForLoginCheck(): Promise<void> {\n await firstValueFrom(toObservable(this.loginChecked).pipe(filter((checked) => checked)))\n }\n\n async getAuthResult(): Promise<boolean> {\n await this.waitForLoginCheck()\n return this.isAuthenticated()\n }\n\n addRoles(rolesToAdd: string[]) {\n patchState(this.state, { roles: new Set([...this.state.roles().values(), ...rolesToAdd]) })\n }\n\n removeRoles(rolesToRemove: string[]) {\n const newRoles = new Set(this.roles().values())\n for (const roleToRemove of rolesToRemove) {\n newRoles.delete(roleToRemove)\n }\n patchState(this.state, { roles: newRoles })\n }\n\n hasEveryRole(roles: string[]) {\n return roles.every((role) => this.roles().has(role))\n }\n\n hasAtLeastOneRole(roles: string[]) {\n return roles.some((role) => this.roles().has(role))\n }\n}\n","import { EnvironmentProviders, Provider, inject, makeEnvironmentProviders, provideAppInitializer } from '@angular/core'\n\nimport { provideOAuthClient } from 'angular-oauth2-oidc'\nimport { type QuangFeature, QuangFeatureKind, quangFeature } from 'quang'\n\nimport { type QuangAuthConfig, QuangAuthService, provideQuangAuthConfig } from './auth.service'\n\nfunction initializeAuthService(authService: QuangAuthService) {\n return () => authService.init()\n}\n\nexport function provideAuth(authConfig?: QuangAuthConfig, ...features: QuangAuthFeatures[]): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideQuangAuthConfig(authConfig),\n provideOAuthClient({\n resourceServer: {\n sendAccessToken: authConfig?.sendAccessToken ?? true,\n allowedUrls: authConfig?.urlsToSendToken ?? [],\n },\n }),\n ...features.map((feature) => feature.ɵproviders),\n provideAppInitializer(() => {\n const initializerFn = initializeAuthService(inject(QuangAuthService))\n return initializerFn()\n }),\n ])\n}\n\nexport function withAuth(\n authConfig?: QuangAuthConfig,\n ...features: QuangAuthFeatures[]\n): QuangFeature<QuangFeatureKind.LoaderFeature> {\n return quangFeature(QuangFeatureKind.LoaderFeature, [provideAuth(authConfig, ...features)])\n}\n\n/**\n * Helper type to represent a QuangAuth feature.\n *\n * @publicApi\n */\nexport interface QuangAuthFeature<FeatureKind extends QuangAuthFeatureKind> {\n ɵkind: FeatureKind\n ɵproviders: (Provider | EnvironmentProviders)[]\n}\n\n/**\n * Helper function to create an object that represents a QuangAuth feature.\n */\nexport function quangAuthFeature<FeatureKind extends QuangAuthFeatureKind>(\n kind: FeatureKind,\n providers: (Provider | EnvironmentProviders)[]\n): QuangAuthFeature<FeatureKind> {\n return { ɵkind: kind, ɵproviders: providers }\n}\n\n/**\n * A type alias that represents all QuangAuth features available for use with `provideAuth`.\n * Features can be enabled by adding special functions to the `provideAuth` call.\n * See documentation for each symbol to find corresponding function name. See also `provideAuth`\n * documentation on how to use those functions.\n *\n * @see {@link provideAuth}\n *\n * @publicApi\n */\nexport type QuangAuthFeatures = QuangAuthFeature<QuangAuthFeatureKind>\n\n/**\n * The list of features as an enum to uniquely type each feature.\n */\nexport const enum QuangAuthFeatureKind {\n MobileAuthFeature,\n SessionStorageFeature,\n LocalStorageFeature,\n MemoryStorageFeature,\n LogoutOnErrorFeature,\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n input,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\n\nimport { QuangAuthService } from '../auth.service'\n\n/**\n * This directive conditionally renders the associated template if the authenticated user\n * has at least one of the specified roles. By using the `QuangAuthService.hasAtLeastOneRole()` method it checks the user's roles against\n * the required roles provided through the `quangHasAtLeastOneRole` directive.\n *\n * @example\n * <div *quangHasAtLeastOneRole=\"['admin', 'editor']\">\n * This content will only be visible to users with 'admin' or 'editor' roles.\n * </div>\n */\n@Directive({\n selector: '[quangHasAtLeastOneRole]',\n})\nexport class QuangHasAtLeastOneRoleDirective {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n targetRoles = input.required<string[]>({ alias: 'quangHasAtLeastOneRole' })\n\n viewContainerRef = inject(ViewContainerRef)\n\n embeddedViewRef: EmbeddedViewRef<unknown> | null = null\n\n templateRef = inject(TemplateRef)\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n hideViewIfNotAllowed = effect(() => {\n if (this.logLevel === 'verbose')\n console.debug({ userRoles: this.authService.roles(), rolesToCheck: this.targetRoles() })\n const isAllowed = this.authService.hasAtLeastOneRole(this.targetRoles())\n if (isAllowed) {\n if (!this.embeddedViewRef) this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef)\n } else {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n input,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\n\nimport { QuangAuthService } from '../auth.service'\n\n/**\n * This directive conditionally renders the associated template if the authenticated user\n * has every of the specified roles. By using the `QuangAuthService.hasEveryRole()` method it checks the user's roles against\n * the required roles provided through the `quangHasEveryRole` required input.\n *\n * @example\n * <div *quangHasEveryRole=\"['admin', 'editor']\">\n * This content will only be visible to users with 'admin' and 'editor' roles.\n * </div>\n */\n@Directive({\n selector: '[quangHasEveryRole]',\n})\nexport class QuangHasEveryRoleDirective {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n targetRoles = input.required<string[]>({ alias: 'quangHasEveryRole' })\n\n viewContainerRef = inject(ViewContainerRef)\n\n embeddedViewRef: EmbeddedViewRef<unknown> | null = null\n\n templateRef = inject(TemplateRef)\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n hideViewIfNotAllowed = effect(() => {\n if (this.logLevel === 'verbose')\n console.debug({ userRoles: this.authService.roles(), rolesToCheck: this.targetRoles() })\n const isAllowed = this.authService.hasEveryRole(this.targetRoles())\n if (isAllowed) {\n if (!this.embeddedViewRef) this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef)\n } else {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangAuthService } from '../auth.service'\n\n@Directive({\n selector: '[quangIsAuthenticated]',\n})\nexport class QuangIsAuthenticatedDirective {\n viewContainerRef = inject(ViewContainerRef)\n\n templateRef = inject(TemplateRef)\n\n embeddedViewRef: EmbeddedViewRef<any> | null = null\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n hideViewIfNotAuthenticated = effect(() => {\n if (this.authService.isAuthenticated()) {\n if (!this.embeddedViewRef) this.viewContainerRef.createEmbeddedView(this.templateRef)\n } else {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangAuthService } from '../auth.service'\n\n@Directive({\n selector: '[quangIsNotAuthenticated]',\n})\nexport class QuangIsNotAuthenticatedDirective {\n viewContainerRef = inject(ViewContainerRef)\n\n templateRef = inject(TemplateRef)\n\n embeddedViewRef: EmbeddedViewRef<any> | null = null\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n showViewIfNotAuthenticated = effect(() => {\n if (this.authService.isAuthenticated()) {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n } else if (!this.embeddedViewRef) {\n this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef)\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import { inject } from '@angular/core'\nimport type { CanActivateFn } from '@angular/router'\n\nimport { QuangAuthService } from '../auth.service'\n\nexport const quangIsAllowedGuardFactory =\n (roles: string[], behavior: 'every' | 'atLeastOne'): CanActivateFn =>\n async () => {\n const authService = inject(QuangAuthService)\n const isAuthenticated = await authService.getAuthResult()\n if (!isAuthenticated) return false\n const isAllowedFunction = behavior === 'every' ? authService.hasEveryRole : authService.hasAtLeastOneRole\n return isAllowedFunction.call(authService, roles)\n }\n","import { inject } from '@angular/core'\nimport type { CanActivateFn } from '@angular/router'\n\nimport { QuangAuthService } from '../auth.service'\n\nexport const quangIsAuthenticatedGuard: CanActivateFn = async () => {\n const authService = inject(QuangAuthService)\n return authService.getAuthResult()\n}\n","import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http'\nimport { InjectionToken, Provider, inject } from '@angular/core'\n\nimport { UrlData, getExcludedUrlsByMethod, isHttpMethod } from 'quang/shared'\nimport { catchError, from, retry, switchMap, tap, throwError } from 'rxjs'\n\nimport { QuangAuthService } from './auth.service'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from './auth-providers'\n\nexport const LOGOUT_RETRIES = new InjectionToken<number>('LOGOUT_RETRIES')\nexport const LOGOUT_STATUSES = new InjectionToken<number[]>('LOGOUT_STATUSES')\nexport const LOGOUT_EXCLUDED_URLS = new InjectionToken<UrlData[]>('LOGOUT_EXCLUDED_URLS')\n\nexport const logoutOnErrorInterceptor: HttpInterceptorFn = (request, next) => {\n const quangAuthService = inject(QuangAuthService)\n const logoutStatuses = inject(LOGOUT_STATUSES, { optional: true }) ?? [401]\n const excludedUrlsByMethod = getExcludedUrlsByMethod(inject(LOGOUT_EXCLUDED_URLS, { optional: true }) ?? [])\n const retries = inject(LOGOUT_RETRIES, { optional: true }) ?? 4\n\n if (!isHttpMethod(request.method)) {\n return next(request)\n }\n\n if (\n Array.from(excludedUrlsByMethod.get(request.method) ?? []).some((excludedUrl) =>\n request.url.match(excludedUrl.replace(/\\//g, '\\\\/'))\n )\n ) {\n return next(request)\n }\n\n return next(request).pipe(\n retry({ count: retries, delay: 300 }),\n catchError((error: HttpErrorResponse) => {\n if (logoutStatuses.includes(error?.status))\n return from(quangAuthService.checkForAuthentication(true)).pipe(\n tap((isAuthenticated) => {\n if (!isAuthenticated) quangAuthService.logout()\n }),\n switchMap(() => throwError(() => error))\n )\n return throwError(() => error)\n }),\n retry({ count: 1, delay: 500 })\n )\n}\n\nexport function withLogoutOnError(\n excludedUrls: UrlData[] = [],\n statuses = [401],\n retries = 4\n): QuangAuthFeature<QuangAuthFeatureKind.LogoutOnErrorFeature> {\n const providers: Provider[] = [\n {\n provide: LOGOUT_STATUSES,\n useValue: statuses,\n },\n {\n provide: LOGOUT_EXCLUDED_URLS,\n useValue: excludedUrls,\n },\n {\n provide: LOGOUT_RETRIES,\n useValue: retries,\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.LogoutOnErrorFeature, providers)\n}\n","import { Provider } from '@angular/core'\n\nimport { OAuthStorage } from 'angular-oauth2-oidc'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from '../auth-providers'\n\nexport function withLocalStorage(): QuangAuthFeature<QuangAuthFeatureKind.LocalStorageFeature> {\n const providers: Provider[] = [\n {\n provide: OAuthStorage,\n useValue: localStorage,\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.LocalStorageFeature, providers)\n}\n","import { Injectable, Provider } from '@angular/core'\n\nimport { OAuthStorage } from 'angular-oauth2-oidc'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from '../auth-providers'\n\n@Injectable()\nexport class MemoryStorage implements OAuthStorage {\n private data = new Map<string, string>()\n\n getItem(key: string): string {\n return this.data.get(key) ?? ''\n }\n\n removeItem(key: string): void {\n this.data.delete(key)\n }\n\n setItem(key: string, data: string): void {\n this.data.set(key, data)\n }\n}\n\nexport function withMemoryStorage(): QuangAuthFeature<QuangAuthFeatureKind.MemoryStorageFeature> {\n const providers: Provider[] = [\n {\n provide: OAuthStorage,\n useFactory: () => new MemoryStorage(),\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.MemoryStorageFeature, providers)\n}\n","import { Provider } from '@angular/core'\n\nimport { OAuthStorage } from 'angular-oauth2-oidc'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from '../auth-providers'\n\nexport function withSessionStorage(): QuangAuthFeature<QuangAuthFeatureKind.SessionStorageFeature> {\n const providers: Provider[] = [\n {\n provide: OAuthStorage,\n useValue: sessionStorage,\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.SessionStorageFeature, providers)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quang-auth.mjs","sources":["../../../projects/quang/auth/auth.service.ts","../../../projects/quang/auth/auth-providers.ts","../../../projects/quang/auth/directives/has-at-least-one-role.directive.ts","../../../projects/quang/auth/directives/has-every-role.directive.ts","../../../projects/quang/auth/directives/is-authenticated.directive.ts","../../../projects/quang/auth/directives/is-not-authenticated.directive.ts","../../../projects/quang/auth/guards/is-allowed.guard.ts","../../../projects/quang/auth/guards/is-authenticated.guard.ts","../../../projects/quang/auth/logout-on-error.interceptor.ts","../../../projects/quang/auth/token-storage/local-storage-feature.ts","../../../projects/quang/auth/token-storage/memory-storage-feature.ts","../../../projects/quang/auth/token-storage/session-storage-feature.ts","../../../projects/quang/auth/quang-auth.ts"],"sourcesContent":["import {\n EnvironmentProviders,\n Injectable,\n InjectionToken,\n computed,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { patchState, signalState } from '@ngrx/signals'\n\nimport { AuthConfig, OAuthErrorEvent, OAuthEvent, OAuthService } from 'angular-oauth2-oidc'\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\nimport { filter, firstValueFrom } from 'rxjs'\n\nexport const AUTH_CONFIG = new InjectionToken<QuangAuthConfig | undefined>('AUTH_CONFIG')\n\nexport interface QuangAuthConfig extends AuthConfig {\n autoLogin: boolean\n sendAccessToken: boolean\n urlsToSendToken: string[]\n revokeTokensOnLogout?: boolean\n getUserProfileOnLoginSuccess?: boolean\n useSilentRefresh: boolean\n}\n\nexport function provideQuangAuthConfig(authConfig?: QuangAuthConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: AUTH_CONFIG, useValue: authConfig }])\n}\n\nexport const OPEN_URI = new InjectionToken<(uri: string) => void | undefined>('OPEN_URI')\n\nexport function provideOpenURI(openURI: (uri: string) => void | undefined): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: OPEN_URI, deps: [], useFactory: openURI }])\n}\n\ninterface LoginStatus {\n checked: boolean\n authenticationError: boolean\n}\n\ninterface TokenStatus {\n accessToken: string | null\n accessTokenExpiresAt: number | null\n idToken: string | null\n idTokenExpiresAt: number | null\n refreshToken: string | null\n}\n\ninterface AuthState {\n loginStatus: LoginStatus\n tokenStatus: TokenStatus\n roles: Set<string>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n user: Record<string, any> | null\n}\n\nconst initialState: AuthState = {\n loginStatus: {\n checked: false,\n authenticationError: false,\n },\n tokenStatus: {\n accessToken: null,\n accessTokenExpiresAt: null,\n idToken: null,\n idTokenExpiresAt: null,\n refreshToken: null,\n },\n roles: new Set<string>(),\n user: null,\n}\n\n// Subset of situations from https://openid.net/specs/openid-connect-core-1_0.html#AuthError\n// Only the ones where it's reasonably sure that sending the user to the IdServer will help.\nconst errorResponsesRequiringUserInteraction = [\n 'interaction_required',\n 'login_required',\n 'account_selection_required',\n 'consent_required',\n]\n\n@Injectable({\n providedIn: 'root',\n})\nexport class QuangAuthService {\n private config: QuangAuthConfig\n\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n private oAuthService = inject(OAuthService, { optional: true })\n\n private state = signalState<AuthState>(initialState)\n\n loginChecked = this.state.loginStatus.checked\n\n isAuthenticated = computed(() => !!this.state.tokenStatus.accessToken())\n\n authenticationError = this.state.loginStatus.authenticationError\n\n tokenStatus = this.state.tokenStatus\n\n roles = this.state.roles\n\n user = this.state.user\n\n constructor() {\n const authConfig = inject(AUTH_CONFIG)\n if (!authConfig) throw new Error('Missing auth config')\n\n const openUri = inject(OPEN_URI, { optional: true })\n if (openUri) authConfig.openUri = openUri\n\n this.config = authConfig\n\n this.oAuthService?.events.pipe(takeUntilDestroyed()).subscribe((event: OAuthEvent) => {\n if (this.logLevel === 'verbose') console.debug('Auth service event', event)\n if (event instanceof OAuthErrorEvent && this.loginChecked()) this.loginError()\n if (event.type === 'token_received') this.setTokens()\n })\n this.oAuthService?.configure(this.config)\n }\n\n public async init() {\n this.oAuthService?.setupAutomaticSilentRefresh()\n\n await this.oAuthService?.loadDiscoveryDocumentAndTryLogin()\n\n await this.checkForAuthentication()\n\n if (this.config.autoLogin && !this.isAuthenticated()) this.login()\n }\n\n public async checkForAuthentication(forceRefresh = false) {\n let hasValidToken = this.oAuthService?.hasValidAccessToken()\n\n try {\n if (forceRefresh) hasValidToken = await this.refreshAuth()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const reason = error?.reason\n if (this.config.autoLogin && reason && errorResponsesRequiringUserInteraction.includes(reason)) this.login()\n hasValidToken = false\n }\n\n this.setTokens()\n patchState(this.state, {\n loginStatus: {\n ...this.state().loginStatus,\n checked: true,\n },\n })\n\n if (hasValidToken && this.config.getUserProfileOnLoginSuccess) await this.getUserProfile()\n\n return hasValidToken\n }\n\n private async refreshAuth() {\n if (this.config.responseType === 'code') await this.oAuthService?.refreshToken()\n else await this.oAuthService?.silentRefresh()\n return this.oAuthService?.hasValidAccessToken()\n }\n\n public login() {\n this.oAuthService?.initLoginFlow()\n }\n\n public async logout() {\n if (!this.isAuthenticated()) return\n if (this.config.revokeTokensOnLogout) await this.oAuthService?.revokeTokenAndLogout()\n else this.oAuthService?.logOut()\n patchState(this.state, { ...initialState })\n }\n\n private loginError() {\n patchState(this.state, {\n loginStatus: {\n ...this.state().loginStatus,\n authenticationError: true,\n },\n })\n this.logout()\n }\n\n public async getUserProfile() {\n const user = await this.oAuthService?.loadUserProfile()\n if (user) patchState(this.state, { user })\n }\n\n private setTokens() {\n const tokenStatus = {\n accessToken: this.oAuthService?.getAccessToken() ?? null,\n accessTokenExpiresAt: this.oAuthService?.getAccessTokenExpiration() ?? null,\n idToken: this.oAuthService?.getIdToken() ?? null,\n idTokenExpiresAt: this.oAuthService?.getIdTokenExpiration() ?? null,\n refreshToken: this.oAuthService?.getRefreshToken() ?? null,\n }\n if (this.logLevel === 'verbose') {\n const now = new Date()\n const accessTokenDate = new Date(tokenStatus.accessTokenExpiresAt ?? '')\n const idTokenDate = new Date(tokenStatus.idTokenExpiresAt ?? '')\n console.table(tokenStatus)\n console.debug(\n `Id token expires at ${idTokenDate} in ${Math.abs(idTokenDate.valueOf() - now.valueOf()) / 1000 / 60} minutes`\n )\n console.debug(\n `Access token expires at ${accessTokenDate} in ${Math.abs(accessTokenDate.valueOf() - now.valueOf()) / 1000 / 60} minutes`\n )\n }\n patchState(this.state, {\n tokenStatus,\n })\n }\n\n async waitForLoginCheck(): Promise<void> {\n await firstValueFrom(toObservable(this.loginChecked).pipe(filter((checked) => checked)))\n }\n\n async getAuthResult(): Promise<boolean> {\n await this.waitForLoginCheck()\n return this.isAuthenticated()\n }\n\n addRoles(rolesToAdd: string[]) {\n patchState(this.state, { roles: new Set([...this.state.roles().values(), ...rolesToAdd]) })\n }\n\n removeRoles(rolesToRemove: string[]) {\n const newRoles = new Set(this.roles().values())\n for (const roleToRemove of rolesToRemove) {\n newRoles.delete(roleToRemove)\n }\n patchState(this.state, { roles: newRoles })\n }\n\n hasEveryRole(roles: string[]) {\n return roles.every((role) => this.roles().has(role))\n }\n\n hasAtLeastOneRole(roles: string[]) {\n return roles.some((role) => this.roles().has(role))\n }\n}\n","import { EnvironmentProviders, Provider, inject, makeEnvironmentProviders, provideAppInitializer } from '@angular/core'\n\nimport { provideOAuthClient } from 'angular-oauth2-oidc'\nimport { type QuangFeature, QuangFeatureKind, quangFeature } from 'quang'\n\nimport { type QuangAuthConfig, QuangAuthService, provideQuangAuthConfig } from './auth.service'\n\nfunction initializeAuthService(authService: QuangAuthService) {\n return () => authService.init()\n}\n\nexport function provideAuth(authConfig?: QuangAuthConfig, ...features: QuangAuthFeatures[]): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideQuangAuthConfig(authConfig),\n provideOAuthClient({\n resourceServer: {\n sendAccessToken: authConfig?.sendAccessToken ?? true,\n allowedUrls: authConfig?.urlsToSendToken ?? [],\n },\n }),\n ...features.map((feature) => feature.ɵproviders),\n provideAppInitializer(() => {\n const initializerFn = initializeAuthService(inject(QuangAuthService))\n return initializerFn()\n }),\n ])\n}\n\nexport function withAuth(\n authConfig?: QuangAuthConfig,\n ...features: QuangAuthFeatures[]\n): QuangFeature<QuangFeatureKind.LoaderFeature> {\n return quangFeature(QuangFeatureKind.LoaderFeature, [provideAuth(authConfig, ...features)])\n}\n\n/**\n * Helper type to represent a QuangAuth feature.\n *\n * @publicApi\n */\nexport interface QuangAuthFeature<FeatureKind extends QuangAuthFeatureKind> {\n ɵkind: FeatureKind\n ɵproviders: (Provider | EnvironmentProviders)[]\n}\n\n/**\n * Helper function to create an object that represents a QuangAuth feature.\n */\nexport function quangAuthFeature<FeatureKind extends QuangAuthFeatureKind>(\n kind: FeatureKind,\n providers: (Provider | EnvironmentProviders)[]\n): QuangAuthFeature<FeatureKind> {\n return { ɵkind: kind, ɵproviders: providers }\n}\n\n/**\n * A type alias that represents all QuangAuth features available for use with `provideAuth`.\n * Features can be enabled by adding special functions to the `provideAuth` call.\n * See documentation for each symbol to find corresponding function name. See also `provideAuth`\n * documentation on how to use those functions.\n *\n * @see {@link provideAuth}\n *\n * @publicApi\n */\nexport type QuangAuthFeatures = QuangAuthFeature<QuangAuthFeatureKind>\n\n/**\n * The list of features as an enum to uniquely type each feature.\n */\nexport const enum QuangAuthFeatureKind {\n MobileAuthFeature,\n SessionStorageFeature,\n LocalStorageFeature,\n MemoryStorageFeature,\n LogoutOnErrorFeature,\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n input,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\n\nimport { QuangAuthService } from '../auth.service'\n\n/**\n * This directive conditionally renders the associated template if the authenticated user\n * has at least one of the specified roles. By using the `QuangAuthService.hasAtLeastOneRole()` method it checks the user's roles against\n * the required roles provided through the `quangHasAtLeastOneRole` directive.\n *\n * @example\n * <div *quangHasAtLeastOneRole=\"['admin', 'editor']\">\n * This content will only be visible to users with 'admin' or 'editor' roles.\n * </div>\n */\n@Directive({\n selector: '[quangHasAtLeastOneRole]',\n})\nexport class QuangHasAtLeastOneRoleDirective {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n targetRoles = input.required<string[]>({ alias: 'quangHasAtLeastOneRole' })\n\n viewContainerRef = inject(ViewContainerRef)\n\n embeddedViewRef: EmbeddedViewRef<unknown> | null = null\n\n templateRef = inject(TemplateRef)\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n hideViewIfNotAllowed = effect(() => {\n if (this.logLevel === 'verbose')\n console.debug({ userRoles: this.authService.roles(), rolesToCheck: this.targetRoles() })\n const isAllowed = this.authService.hasAtLeastOneRole(this.targetRoles())\n if (isAllowed) {\n if (!this.embeddedViewRef) this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef)\n } else {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n input,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\n\nimport { QuangAuthService } from '../auth.service'\n\n/**\n * This directive conditionally renders the associated template if the authenticated user\n * has every of the specified roles. By using the `QuangAuthService.hasEveryRole()` method it checks the user's roles against\n * the required roles provided through the `quangHasEveryRole` required input.\n *\n * @example\n * <div *quangHasEveryRole=\"['admin', 'editor']\">\n * This content will only be visible to users with 'admin' and 'editor' roles.\n * </div>\n */\n@Directive({\n selector: '[quangHasEveryRole]',\n})\nexport class QuangHasEveryRoleDirective {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n targetRoles = input.required<string[]>({ alias: 'quangHasEveryRole' })\n\n viewContainerRef = inject(ViewContainerRef)\n\n embeddedViewRef: EmbeddedViewRef<unknown> | null = null\n\n templateRef = inject(TemplateRef)\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n hideViewIfNotAllowed = effect(() => {\n if (this.logLevel === 'verbose')\n console.debug({ userRoles: this.authService.roles(), rolesToCheck: this.targetRoles() })\n const isAllowed = this.authService.hasEveryRole(this.targetRoles())\n if (isAllowed) {\n if (!this.embeddedViewRef) this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef)\n } else {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangAuthService } from '../auth.service'\n\n@Directive({\n selector: '[quangIsAuthenticated]',\n})\nexport class QuangIsAuthenticatedDirective {\n viewContainerRef = inject(ViewContainerRef)\n\n templateRef = inject(TemplateRef)\n\n embeddedViewRef: EmbeddedViewRef<any> | null = null\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n hideViewIfNotAuthenticated = effect(() => {\n if (this.authService.isAuthenticated()) {\n if (!this.embeddedViewRef) this.viewContainerRef.createEmbeddedView(this.templateRef)\n } else {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import {\n ChangeDetectorRef,\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangAuthService } from '../auth.service'\n\n@Directive({\n selector: '[quangIsNotAuthenticated]',\n})\nexport class QuangIsNotAuthenticatedDirective {\n viewContainerRef = inject(ViewContainerRef)\n\n templateRef = inject(TemplateRef)\n\n embeddedViewRef: EmbeddedViewRef<any> | null = null\n\n authService = inject(QuangAuthService)\n\n takeUntilDestroyed = takeUntilDestroyed()\n\n changeDetectorRef = inject(ChangeDetectorRef)\n\n showViewIfNotAuthenticated = effect(() => {\n if (this.authService.isAuthenticated()) {\n this.viewContainerRef.clear()\n this.embeddedViewRef = null\n } else if (!this.embeddedViewRef) {\n this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef)\n }\n this.changeDetectorRef.markForCheck()\n })\n}\n","import { inject } from '@angular/core'\nimport type { CanActivateFn } from '@angular/router'\n\nimport { QuangAuthService } from '../auth.service'\n\nexport const quangIsAllowedGuardFactory =\n (roles: string[], behavior: 'every' | 'atLeastOne'): CanActivateFn =>\n async () => {\n const authService = inject(QuangAuthService)\n const isAuthenticated = await authService.getAuthResult()\n if (!isAuthenticated) return false\n const isAllowedFunction = behavior === 'every' ? authService.hasEveryRole : authService.hasAtLeastOneRole\n return isAllowedFunction.call(authService, roles)\n }\n","import { inject } from '@angular/core'\nimport type { CanActivateFn } from '@angular/router'\n\nimport { QuangAuthService } from '../auth.service'\n\nexport const quangIsAuthenticatedGuard: CanActivateFn = async () => {\n const authService = inject(QuangAuthService)\n return authService.getAuthResult()\n}\n","import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http'\nimport { InjectionToken, Provider, inject } from '@angular/core'\n\nimport { UrlData, getExcludedUrlsByMethod, isHttpMethod } from 'quang/shared'\nimport { catchError, from, retry, switchMap, tap, throwError } from 'rxjs'\n\nimport { QuangAuthService } from './auth.service'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from './auth-providers'\n\nexport const LOGOUT_RETRIES = new InjectionToken<number>('LOGOUT_RETRIES')\nexport const LOGOUT_STATUSES = new InjectionToken<number[]>('LOGOUT_STATUSES')\nexport const LOGOUT_EXCLUDED_URLS = new InjectionToken<UrlData[]>('LOGOUT_EXCLUDED_URLS')\n\nexport const logoutOnErrorInterceptor: HttpInterceptorFn = (request, next) => {\n const quangAuthService = inject(QuangAuthService)\n const logoutStatuses = inject(LOGOUT_STATUSES, { optional: true }) ?? [401]\n const excludedUrlsByMethod = getExcludedUrlsByMethod(inject(LOGOUT_EXCLUDED_URLS, { optional: true }) ?? [])\n const retries = inject(LOGOUT_RETRIES, { optional: true }) ?? 4\n\n if (!isHttpMethod(request.method)) {\n return next(request)\n }\n\n if (\n Array.from(excludedUrlsByMethod.get(request.method) ?? []).some((excludedUrl) =>\n request.url.match(excludedUrl.replace(/\\//g, '\\\\/'))\n )\n ) {\n return next(request)\n }\n\n return next(request).pipe(\n retry({ count: retries, delay: 300 }),\n catchError((error: HttpErrorResponse) => {\n if (logoutStatuses.includes(error?.status))\n return from(quangAuthService.checkForAuthentication(true)).pipe(\n tap((isAuthenticated) => {\n if (!isAuthenticated) quangAuthService.logout()\n }),\n switchMap(() => throwError(() => error))\n )\n return throwError(() => error)\n }),\n retry({ count: 1, delay: 500 })\n )\n}\n\nexport function withLogoutOnError(\n excludedUrls: UrlData[] = [],\n statuses = [401],\n retries = 4\n): QuangAuthFeature<QuangAuthFeatureKind.LogoutOnErrorFeature> {\n const providers: Provider[] = [\n {\n provide: LOGOUT_STATUSES,\n useValue: statuses,\n },\n {\n provide: LOGOUT_EXCLUDED_URLS,\n useValue: excludedUrls,\n },\n {\n provide: LOGOUT_RETRIES,\n useValue: retries,\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.LogoutOnErrorFeature, providers)\n}\n","import { Provider } from '@angular/core'\n\nimport { OAuthStorage } from 'angular-oauth2-oidc'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from '../auth-providers'\n\nexport function withLocalStorage(): QuangAuthFeature<QuangAuthFeatureKind.LocalStorageFeature> {\n const providers: Provider[] = [\n {\n provide: OAuthStorage,\n useValue: localStorage,\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.LocalStorageFeature, providers)\n}\n","import { Injectable, Provider } from '@angular/core'\n\nimport { OAuthStorage } from 'angular-oauth2-oidc'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from '../auth-providers'\n\n@Injectable()\nexport class MemoryStorage implements OAuthStorage {\n private data = new Map<string, string>()\n\n getItem(key: string): string {\n return this.data.get(key) ?? ''\n }\n\n removeItem(key: string): void {\n this.data.delete(key)\n }\n\n setItem(key: string, data: string): void {\n this.data.set(key, data)\n }\n}\n\nexport function withMemoryStorage(): QuangAuthFeature<QuangAuthFeatureKind.MemoryStorageFeature> {\n const providers: Provider[] = [\n {\n provide: OAuthStorage,\n useFactory: () => new MemoryStorage(),\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.MemoryStorageFeature, providers)\n}\n","import { Provider } from '@angular/core'\n\nimport { OAuthStorage } from 'angular-oauth2-oidc'\n\nimport { QuangAuthFeature, QuangAuthFeatureKind, quangAuthFeature } from '../auth-providers'\n\nexport function withSessionStorage(): QuangAuthFeature<QuangAuthFeatureKind.SessionStorageFeature> {\n const providers: Provider[] = [\n {\n provide: OAuthStorage,\n useValue: sessionStorage,\n },\n ]\n return quangAuthFeature(QuangAuthFeatureKind.SessionStorageFeature, providers)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -273,8 +273,8 @@ class QuangAutocompleteComponent extends QuangBaseComponent {
|
|
|
273
273
|
this._chipList.update((list) => [...list, chip.value]);
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
277
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.
|
|
276
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
277
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: QuangAutocompleteComponent, isStandalone: true, selector: "quang-autocomplete", inputs: { syncFormWithText: { classPropertyName: "syncFormWithText", publicName: "syncFormWithText", isSignal: true, isRequired: false, transformFunction: null }, optionListMaxHeight: { classPropertyName: "optionListMaxHeight", publicName: "optionListMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, selectOptions: { classPropertyName: "selectOptions", publicName: "selectOptions", isSignal: true, isRequired: true, transformFunction: null }, translateValue: { classPropertyName: "translateValue", publicName: "translateValue", isSignal: true, isRequired: false, transformFunction: null }, scrollBehaviorOnOpen: { classPropertyName: "scrollBehaviorOnOpen", publicName: "scrollBehaviorOnOpen", isSignal: true, isRequired: false, transformFunction: null }, emitOnly: { classPropertyName: "emitOnly", publicName: "emitOnly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, chipMaxLength: { classPropertyName: "chipMaxLength", publicName: "chipMaxLength", isSignal: true, isRequired: false, transformFunction: null }, multiSelectDisplayMode: { classPropertyName: "multiSelectDisplayMode", publicName: "multiSelectDisplayMode", isSignal: true, isRequired: false, transformFunction: null }, searchTextDebounce: { classPropertyName: "searchTextDebounce", publicName: "searchTextDebounce", isSignal: true, isRequired: false, transformFunction: null }, internalFilterOptions: { classPropertyName: "internalFilterOptions", publicName: "internalFilterOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedOption: "selectedOption", searchTextChange: "searchTextChange" }, providers: [
|
|
278
278
|
{
|
|
279
279
|
provide: NG_VALUE_ACCESSOR,
|
|
280
280
|
useExisting: forwardRef(() => QuangAutocompleteComponent),
|
|
@@ -286,7 +286,7 @@ class QuangAutocompleteComponent extends QuangBaseComponent {
|
|
|
286
286
|
},
|
|
287
287
|
], viewQueries: [{ propertyName: "optionList", first: true, predicate: ["optionList"], descendants: true, isSignal: true }, { propertyName: "selectInput", first: true, predicate: ["selectInput"], descendants: true, isSignal: true }, { propertyName: "chipContainer", first: true, predicate: ["chipContainer"], descendants: true, isSignal: true }, { propertyName: "autocompleteContainer", first: true, predicate: ["autocompleteContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n [ngStyle]=\"{ '--chip-max-length': chipMaxLength() ? chipMaxLength() + 'ch' : 'none' }\"\n #autocompleteContainer\n class=\"autocomplete-container\"\n>\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\n </label>\n }\n <div\n [ngClass]=\"multiSelectDisplayMode() === 'horizontal' ? 'horizontal form-control' : ''\"\n #chipContainer\n class=\"container-wrap\"\n >\n @if (multiple() && _chipList().length > 0) {\n @for (chip of _chipList(); track chip) {\n @if (getDescription(chip)) {\n <div\n [quangTooltip]=\"chipMaxLength() ? getDescription(chip) : ''\"\n class=\"chip chip-hover\"\n >\n <p [ngClass]=\"{ 'm-0': isReadonly() || _isDisabled() }\">\n {{ getDescription(chip) }}\n </p>\n @if (!isReadonly() && !_isDisabled()) {\n <button\n [tabIndex]=\"$index + 1\"\n (click)=\"deleteChip(chip)\"\n class=\"btn btn-chip\"\n type=\"button\"\n >\n <svg\n class=\"ionicon\"\n fill=\"currentColor\"\n height=\"24\"\n viewBox=\"0 0 512 512\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M368 368L144 144M368 144L144 368\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n />\n </svg>\n </button>\n }\n </div>\n }\n }\n }\n\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [class.form-control]=\"multiSelectDisplayMode() !== 'horizontal'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [disabled]=\"_isDisabled() || isReadonly()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_inputValue()\"\n (blur)=\"onBlurInput($event)\"\n (input)=\"onChangeInput($event)\"\n (mousedown)=\"showOptionVisibility()\"\n #selectInput\n autocomplete=\"off\"\n type=\"text\"\n />\n </div>\n @if (_showOptions()) {\n <quang-option-list\n [_isDisabled]=\"_isDisabled()\"\n [_value]=\"_value()\"\n [componentClass]=\"componentClass()\"\n [componentLabel]=\"componentLabel()\"\n [componentTabIndex]=\"componentTabIndex()\"\n [nullOption]=\"false\"\n [optionListMaxHeight]=\"optionListMaxHeight()\"\n [parentID]=\"componentId()\"\n [parentType]=\"ParentType\"\n [scrollBehaviorOnOpen]=\"scrollBehaviorOnOpen()\"\n [selectButtonRef]=\"autocompleteContainer\"\n [selectOptions]=\"_filteredOptions()\"\n [translateValue]=\"translateValue()\"\n (blurHandler)=\"onBlurOptionList($event)\"\n (changedHandler)=\"onValueChange($event)\"\n #optionList\n selectionMode=\"single\"\n />\n }\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage() && !helpMessageTooltip()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: [":host{display:block;--chip-max-length: none}.autocomplete-container{margin-bottom:1rem;position:relative}.chip:has(.btn-chip:disabled):hover{filter:unset;cursor:unset}.container-wrap{display:flex;flex-wrap:wrap;gap:.5rem}.container-wrap.horizontal{display:flex}.container-wrap.horizontal .chip-container{max-width:70%;margin-bottom:0;margin-left:.5rem;flex-wrap:nowrap;white-space:nowrap;overflow-x:auto;position:absolute;align-items:center}.container-wrap.horizontal .chip-container .chip{white-space:nowrap}.container-wrap.horizontal input{min-width:30%;flex:1 1 0;width:auto;border:none}.container-wrap.horizontal input:focus-visible{outline:none}.chip{display:flex;justify-content:space-between;align-items:center;padding:.25rem .5rem;border-radius:16px;color:var(--bs-btn-color);background-color:rgba(var(--bs-primary-rgb),.1);border-width:1px;border-style:solid;border-color:var(--bs-primary-border-subtle);height:2rem}.chip p{margin:0;max-width:var(--chip-max-length);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.chip .btn-chip{text-align:end;padding:0;min-width:unset}.chip .btn-chip:hover{opacity:80%}.chip .btn-chip:active{border-color:transparent}.chip .btn-chip svg{color:var(--bs-primary);vertical-align:sub}.chip:has(.btn-chip:focus-visible){border-width:2px;filter:brightness(80%)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: QuangOptionListComponent, selector: "quang-option-list", inputs: ["selectionMode", "optionListMaxHeight", "selectOptions", "selectButtonRef", "_value", "_isDisabled", "componentClass", "componentLabel", "componentTabIndex", "translateValue", "nullOption", "scrollBehaviorOnOpen", "parentType", "parentID"], outputs: ["changedHandler", "blurHandler"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: QuangTooltipDirective, selector: "[quangTooltip]", inputs: ["quangTooltip", "showMethod"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
288
288
|
}
|
|
289
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
289
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangAutocompleteComponent, decorators: [{
|
|
290
290
|
type: Component,
|
|
291
291
|
args: [{ selector: 'quang-autocomplete', imports: [TranslocoPipe, NgClass, QuangOptionListComponent, NgStyle, QuangTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
292
292
|
{
|
|
@@ -299,7 +299,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
299
299
|
multi: false,
|
|
300
300
|
},
|
|
301
301
|
], template: "<div\n [ngStyle]=\"{ '--chip-max-length': chipMaxLength() ? chipMaxLength() + 'ch' : 'none' }\"\n #autocompleteContainer\n class=\"autocomplete-container\"\n>\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\n </label>\n }\n <div\n [ngClass]=\"multiSelectDisplayMode() === 'horizontal' ? 'horizontal form-control' : ''\"\n #chipContainer\n class=\"container-wrap\"\n >\n @if (multiple() && _chipList().length > 0) {\n @for (chip of _chipList(); track chip) {\n @if (getDescription(chip)) {\n <div\n [quangTooltip]=\"chipMaxLength() ? getDescription(chip) : ''\"\n class=\"chip chip-hover\"\n >\n <p [ngClass]=\"{ 'm-0': isReadonly() || _isDisabled() }\">\n {{ getDescription(chip) }}\n </p>\n @if (!isReadonly() && !_isDisabled()) {\n <button\n [tabIndex]=\"$index + 1\"\n (click)=\"deleteChip(chip)\"\n class=\"btn btn-chip\"\n type=\"button\"\n >\n <svg\n class=\"ionicon\"\n fill=\"currentColor\"\n height=\"24\"\n viewBox=\"0 0 512 512\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M368 368L144 144M368 144L144 368\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n />\n </svg>\n </button>\n }\n </div>\n }\n }\n }\n\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [class.form-control]=\"multiSelectDisplayMode() !== 'horizontal'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [disabled]=\"_isDisabled() || isReadonly()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_inputValue()\"\n (blur)=\"onBlurInput($event)\"\n (input)=\"onChangeInput($event)\"\n (mousedown)=\"showOptionVisibility()\"\n #selectInput\n autocomplete=\"off\"\n type=\"text\"\n />\n </div>\n @if (_showOptions()) {\n <quang-option-list\n [_isDisabled]=\"_isDisabled()\"\n [_value]=\"_value()\"\n [componentClass]=\"componentClass()\"\n [componentLabel]=\"componentLabel()\"\n [componentTabIndex]=\"componentTabIndex()\"\n [nullOption]=\"false\"\n [optionListMaxHeight]=\"optionListMaxHeight()\"\n [parentID]=\"componentId()\"\n [parentType]=\"ParentType\"\n [scrollBehaviorOnOpen]=\"scrollBehaviorOnOpen()\"\n [selectButtonRef]=\"autocompleteContainer\"\n [selectOptions]=\"_filteredOptions()\"\n [translateValue]=\"translateValue()\"\n (blurHandler)=\"onBlurOptionList($event)\"\n (changedHandler)=\"onValueChange($event)\"\n #optionList\n selectionMode=\"single\"\n />\n }\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage() && !helpMessageTooltip()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: [":host{display:block;--chip-max-length: none}.autocomplete-container{margin-bottom:1rem;position:relative}.chip:has(.btn-chip:disabled):hover{filter:unset;cursor:unset}.container-wrap{display:flex;flex-wrap:wrap;gap:.5rem}.container-wrap.horizontal{display:flex}.container-wrap.horizontal .chip-container{max-width:70%;margin-bottom:0;margin-left:.5rem;flex-wrap:nowrap;white-space:nowrap;overflow-x:auto;position:absolute;align-items:center}.container-wrap.horizontal .chip-container .chip{white-space:nowrap}.container-wrap.horizontal input{min-width:30%;flex:1 1 0;width:auto;border:none}.container-wrap.horizontal input:focus-visible{outline:none}.chip{display:flex;justify-content:space-between;align-items:center;padding:.25rem .5rem;border-radius:16px;color:var(--bs-btn-color);background-color:rgba(var(--bs-primary-rgb),.1);border-width:1px;border-style:solid;border-color:var(--bs-primary-border-subtle);height:2rem}.chip p{margin:0;max-width:var(--chip-max-length);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.chip .btn-chip{text-align:end;padding:0;min-width:unset}.chip .btn-chip:hover{opacity:80%}.chip .btn-chip:active{border-color:transparent}.chip .btn-chip svg{color:var(--bs-primary);vertical-align:sub}.chip:has(.btn-chip:focus-visible){border-width:2px;filter:brightness(80%)}\n"] }]
|
|
302
|
-
}], ctorParameters: () => [] });
|
|
302
|
+
}], ctorParameters: () => [], propDecorators: { syncFormWithText: [{ type: i0.Input, args: [{ isSignal: true, alias: "syncFormWithText", required: false }] }], optionListMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionListMaxHeight", required: false }] }], selectOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectOptions", required: true }] }], translateValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "translateValue", required: false }] }], scrollBehaviorOnOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollBehaviorOnOpen", required: false }] }], emitOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitOnly", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], chipMaxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "chipMaxLength", required: false }] }], multiSelectDisplayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSelectDisplayMode", required: false }] }], optionList: [{ type: i0.ViewChild, args: ['optionList', { isSignal: true }] }], selectedOption: [{ type: i0.Output, args: ["selectedOption"] }], searchTextChange: [{ type: i0.Output, args: ["searchTextChange"] }], searchTextDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchTextDebounce", required: false }] }], internalFilterOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "internalFilterOptions", required: false }] }], selectInput: [{ type: i0.ViewChild, args: ['selectInput', { isSignal: true }] }], chipContainer: [{ type: i0.ViewChild, args: ['chipContainer', { isSignal: true }] }], autocompleteContainer: [{ type: i0.ViewChild, args: ['autocompleteContainer', { isSignal: true }] }] } });
|
|
303
303
|
|
|
304
304
|
/**
|
|
305
305
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quang-components-autocomplete.mjs","sources":["../../../projects/quang/components/autocomplete/autocomplete.component.ts","../../../projects/quang/components/autocomplete/autocomplete.component.html","../../../projects/quang/components/autocomplete/quang-components-autocomplete.ts"],"sourcesContent":["import { NgClass, NgStyle } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\nimport { NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { QuangTooltipDirective } from 'quang/overlay/tooltip'\nimport { Subject, Subscription, debounceTime, distinctUntilChanged } from 'rxjs'\n\nimport {\n OptionListParentType,\n QuangBaseComponent,\n QuangOptionListComponent,\n SelectOption,\n} from 'quang/components/shared'\n\n@Component({\n selector: 'quang-autocomplete',\n imports: [TranslocoPipe, NgClass, QuangOptionListComponent, NgStyle, QuangTooltipDirective],\n templateUrl: './autocomplete.component.html',\n styleUrl: './autocomplete.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => QuangAutocompleteComponent),\n multi: true,\n },\n {\n provide: QuangOptionListComponent,\n multi: false,\n },\n ],\n})\n/**\n * Autocomplete component for providing suggestion options {@link SelectOption} as the user types.\n *\n * @usageNotes\n * This component displays a list of filtered options based on user input.\n * It allows users to select an option from the suggestions and emits the event `selectedOption` when an option is selected.\n *\n * `searchTextDebounce` is by default set to 300ms.\n */\nexport class QuangAutocompleteComponent extends QuangBaseComponent<string | number | string[] | number[]> {\n // the form can't be a random text but must be one of the options if this is false\n syncFormWithText = input<boolean>(false)\n\n optionListMaxHeight = input<string>('200px')\n\n selectOptions = input.required<SelectOption[]>()\n\n translateValue = input<boolean>(true)\n\n scrollBehaviorOnOpen = input<ScrollBehavior>('smooth')\n\n /**\n * Only emits the value without saving it in ngControl\n */\n emitOnly = input<boolean>(false)\n\n multiple = input<boolean>(false)\n\n /**\n * Set the maximum length in characters of the single chip.\n */\n chipMaxLength = input<number>(0)\n\n multiSelectDisplayMode = input<'vertical' | 'horizontal'>('vertical')\n\n optionList = viewChild<QuangOptionListComponent>('optionList')\n\n _showOptions = signal<boolean | null>(null)\n\n _inputValue = signal<string>('')\n\n _optionHideTimeout = signal<any | undefined>(undefined)\n\n _chipList = signal<string[]>([])\n\n _selectedOptions = signal<SelectOption[]>([])\n\n inputValue$ = new Subject<string>()\n\n selectOptionsChange = toObservable(this.selectOptions)\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n const value = this._value()\n if (!this.multiple() && !this._inputValue()) {\n this.setInputValue()\n } else if (this.multiple() && Array.isArray(value) && value.length > 0) {\n for (const valueElement of value) {\n this.onSelectValue(valueElement)\n }\n }\n })\n\n _filteredOptions = computed<SelectOption[]>(() => {\n const text = this._inputValue()\n if (this.multiple()) {\n return this.filterOptions(text).filter((x) => !this._chipList().some((chip) => chip === x.value))\n } else {\n return text?.length ? this.filterOptions(text) : this.selectOptions()\n }\n })\n\n selectedOption = output<string | number | null>()\n\n searchTextChange = output<string>()\n\n searchTextDebounce = input<number>(300)\n\n internalFilterOptions = input<boolean>(true)\n\n readonly ParentType = OptionListParentType.AUTOCOMPLETE\n\n formValueChange$: Subscription | undefined = undefined\n\n private readonly selectInput = viewChild<ElementRef>('selectInput')\n private readonly chipContainer = viewChild<ElementRef>('chipContainer')\n private readonly autocompleteContainer = viewChild<ElementRef>('autocompleteContainer')\n\n inputHeight = signal<number>(0)\n\n private readonly onChangeSelectInput = effect(() => {\n const selectInput = this.selectInput()\n if (selectInput) {\n this.inputHeight.set(selectInput?.nativeElement?.getBoundingClientRect().height)\n selectInput.nativeElement.addEventListener('keydown', (e: KeyboardEvent) => {\n if (this.multiple() && this._chipList().length > 0 && !this._inputValue()?.length && e.key === 'Backspace') {\n e.preventDefault()\n // this.deleteChip(this._chipList()[this._chipList().length - 1])\n const chipContainer = this.chipContainer()?.nativeElement\n if (chipContainer) {\n const chips = chipContainer.querySelectorAll('.chip button.btn-chip')\n if (chips.length > 0) {\n const focusChip = chips[chips.length - 1]\n focusChip.focus()\n focusChip.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Backspace') {\n event.preventDefault()\n this.deleteChip(this._chipList()[this._chipList().length - 1])\n selectInput.nativeElement.focus()\n } else {\n event.preventDefault()\n }\n })\n }\n }\n }\n })\n }\n })\n\n constructor() {\n super()\n this.inputValue$\n .pipe(takeUntilDestroyed(), debounceTime(this.searchTextDebounce()), distinctUntilChanged())\n .subscribe((value) => {\n if (value !== this._inputValue()) {\n this.searchTextChange.emit(value?.toString() || '')\n if (this.syncFormWithText()) {\n this.onValueChange(value, false)\n }\n }\n this._inputValue.set(value?.toString() || '')\n if (!this._inputValue()?.length && !this.emitOnly() && !this.multiple()) {\n this._ngControl()?.control?.patchValue(null)\n }\n })\n toObservable(this._showOptions)\n .pipe(takeUntilDestroyed())\n .subscribe((data) => {\n if (!data && data !== null) {\n this.checkInputValue()\n }\n })\n }\n\n override setupFormControl(): void {\n super.setupFormControl()\n const formControl = this._ngControl()?.control\n if (this.formValueChange$) {\n this.formValueChange$.unsubscribe()\n this.formValueChange$ = undefined\n }\n if (formControl) {\n this.formValueChange$ = formControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {\n if (this.multiple() && Array.isArray(value)) {\n this._chipList.set([])\n this._selectedOptions.set([])\n value.forEach((x) => {\n this.onSelectValue(x)\n })\n } else if (!this.multiple() && (typeof value === 'string' || typeof value === 'number')) {\n this.setInputValue()\n }\n if (!this.syncFormWithText() && !value) {\n this._inputValue.set('')\n }\n })\n }\n }\n\n showOptionVisibility(): void {\n if (this._optionHideTimeout()) {\n clearTimeout(this._optionHideTimeout())\n this._optionHideTimeout.set(null)\n }\n this._showOptions.set(true)\n }\n\n hideOptionVisibility(skipTimeout = false): void {\n if (this._optionHideTimeout()) {\n clearTimeout(this._optionHideTimeout())\n }\n this._optionHideTimeout.set(\n setTimeout(\n () => {\n this._showOptions.set(false)\n },\n skipTimeout ? 0 : 50\n )\n )\n }\n\n onChangeInput(value: any): void {\n this.showOptionVisibility()\n this.inputValue$.next(value.target?.value)\n }\n\n filterOptions(value: string): SelectOption[] {\n const options = this.selectOptions()\n if (this.internalFilterOptions()) {\n return options.filter((x) => x.label.toLowerCase().includes(value.toLowerCase()))\n }\n return options\n }\n\n override onChangedHandler(value: string | number | string[] | number[]): void {\n super.onChangedHandler(value)\n this.setInputValue()\n }\n\n onValueChange(value: string | number, hideOptions = true): void {\n if (this.multiple()) {\n this.onSelectValue(value)\n this.onChangedHandler(this._chipList())\n if (this._chipList().some((x) => x === value)) {\n this.inputValue$.next('')\n }\n } else {\n this.onChangedHandler(value)\n if (hideOptions) {\n this.hideOptionVisibility()\n }\n this.selectedOption.emit(value)\n }\n }\n\n checkInputValue(): void {\n const option = this.selectOptions().find((x) => x.label.toLowerCase() === this._inputValue()?.toLowerCase())\n if (!this.multiple()) {\n if (option?.value === this._value()) return\n if (option) {\n this.onChangedHandler(option.value ?? '')\n } else if (!this.syncFormWithText()) {\n this.onChangedHandler('')\n }\n }\n }\n\n override writeValue(val: string | number | string[] | number[]): void {\n super.writeValue(val)\n this.setInputValue(true)\n if (Array.isArray(val)) {\n val.forEach((x) => {\n this.onSelectValue(x)\n })\n }\n }\n\n onBlurInput(event: FocusEvent) {\n if ((event?.relatedTarget as HTMLDivElement)?.id !== this.optionList()?.optionListContainer()?.nativeElement?.id)\n this.onBlurHandler()\n }\n\n override onBlurHandler() {\n setTimeout(() => {\n this.hideOptionVisibility()\n if (!this._inputValue()?.length && !this.emitOnly() && !this.multiple()) {\n this._ngControl()?.control?.patchValue(null)\n }\n super.onBlurHandler()\n }, 100)\n }\n\n onBlurOptionList(event: any): void {\n if (event) this.hideOptionVisibility()\n }\n\n setInputValue(resetOnMiss = false) {\n this._inputValue.set(\n this.selectOptions().find((x) => x.value === this._value())?.label ?? (resetOnMiss ? '' : this._inputValue())\n )\n if (!this.syncFormWithText()) this.inputValue$.next(this._inputValue() ?? '')\n }\n\n getDescription(chip: any): string {\n const valueChip = this.selectOptions().find((x) => x.value === chip)\n return valueChip ? valueChip.label.toString() : ''\n }\n\n onSelectValue(value: any): void {\n const newChip = this.selectOptions().find((x) => x.value === value)\n if (newChip && !this._chipList().some((x) => x === newChip?.value)) {\n this.createChipList(newChip)\n this._selectedOptions.update((list) => [...list, newChip])\n }\n }\n\n /**\n * remove chip from chips list\n * @param chipValue chip to delete\n */\n deleteChip(chipValue: any): void {\n const stringChipValue = chipValue?.toString()\n const i = this._chipList()?.findIndex((x) => x.toString() === stringChipValue)\n if (i >= 0) {\n const currentList = this._chipList()\n if (Array.isArray(currentList) && currentList.length > 0) {\n this._chipList.update((list) => (list as string[]).filter((_, index) => index !== i))\n this.onChangedHandler(this._chipList())\n }\n }\n }\n\n createChipList(chip: any): void {\n if (chip) {\n this._chipList.update((list) => [...list, chip.value])\n }\n }\n}\n","<div\n [ngStyle]=\"{ '--chip-max-length': chipMaxLength() ? chipMaxLength() + 'ch' : 'none' }\"\n #autocompleteContainer\n class=\"autocomplete-container\"\n>\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\n </label>\n }\n <div\n [ngClass]=\"multiSelectDisplayMode() === 'horizontal' ? 'horizontal form-control' : ''\"\n #chipContainer\n class=\"container-wrap\"\n >\n @if (multiple() && _chipList().length > 0) {\n @for (chip of _chipList(); track chip) {\n @if (getDescription(chip)) {\n <div\n [quangTooltip]=\"chipMaxLength() ? getDescription(chip) : ''\"\n class=\"chip chip-hover\"\n >\n <p [ngClass]=\"{ 'm-0': isReadonly() || _isDisabled() }\">\n {{ getDescription(chip) }}\n </p>\n @if (!isReadonly() && !_isDisabled()) {\n <button\n [tabIndex]=\"$index + 1\"\n (click)=\"deleteChip(chip)\"\n class=\"btn btn-chip\"\n type=\"button\"\n >\n <svg\n class=\"ionicon\"\n fill=\"currentColor\"\n height=\"24\"\n viewBox=\"0 0 512 512\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M368 368L144 144M368 144L144 368\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n />\n </svg>\n </button>\n }\n </div>\n }\n }\n }\n\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [class.form-control]=\"multiSelectDisplayMode() !== 'horizontal'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [disabled]=\"_isDisabled() || isReadonly()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_inputValue()\"\n (blur)=\"onBlurInput($event)\"\n (input)=\"onChangeInput($event)\"\n (mousedown)=\"showOptionVisibility()\"\n #selectInput\n autocomplete=\"off\"\n type=\"text\"\n />\n </div>\n @if (_showOptions()) {\n <quang-option-list\n [_isDisabled]=\"_isDisabled()\"\n [_value]=\"_value()\"\n [componentClass]=\"componentClass()\"\n [componentLabel]=\"componentLabel()\"\n [componentTabIndex]=\"componentTabIndex()\"\n [nullOption]=\"false\"\n [optionListMaxHeight]=\"optionListMaxHeight()\"\n [parentID]=\"componentId()\"\n [parentType]=\"ParentType\"\n [scrollBehaviorOnOpen]=\"scrollBehaviorOnOpen()\"\n [selectButtonRef]=\"autocompleteContainer\"\n [selectOptions]=\"_filteredOptions()\"\n [translateValue]=\"translateValue()\"\n (blurHandler)=\"onBlurOptionList($event)\"\n (changedHandler)=\"onValueChange($event)\"\n #optionList\n selectionMode=\"single\"\n />\n }\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage() && !helpMessageTooltip()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quang-components-autocomplete.mjs","sources":["../../../projects/quang/components/autocomplete/autocomplete.component.ts","../../../projects/quang/components/autocomplete/autocomplete.component.html","../../../projects/quang/components/autocomplete/quang-components-autocomplete.ts"],"sourcesContent":["import { NgClass, NgStyle } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\nimport { NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { QuangTooltipDirective } from 'quang/overlay/tooltip'\nimport { Subject, Subscription, debounceTime, distinctUntilChanged } from 'rxjs'\n\nimport {\n OptionListParentType,\n QuangBaseComponent,\n QuangOptionListComponent,\n SelectOption,\n} from 'quang/components/shared'\n\n@Component({\n selector: 'quang-autocomplete',\n imports: [TranslocoPipe, NgClass, QuangOptionListComponent, NgStyle, QuangTooltipDirective],\n templateUrl: './autocomplete.component.html',\n styleUrl: './autocomplete.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => QuangAutocompleteComponent),\n multi: true,\n },\n {\n provide: QuangOptionListComponent,\n multi: false,\n },\n ],\n})\n/**\n * Autocomplete component for providing suggestion options {@link SelectOption} as the user types.\n *\n * @usageNotes\n * This component displays a list of filtered options based on user input.\n * It allows users to select an option from the suggestions and emits the event `selectedOption` when an option is selected.\n *\n * `searchTextDebounce` is by default set to 300ms.\n */\nexport class QuangAutocompleteComponent extends QuangBaseComponent<string | number | string[] | number[]> {\n // the form can't be a random text but must be one of the options if this is false\n syncFormWithText = input<boolean>(false)\n\n optionListMaxHeight = input<string>('200px')\n\n selectOptions = input.required<SelectOption[]>()\n\n translateValue = input<boolean>(true)\n\n scrollBehaviorOnOpen = input<ScrollBehavior>('smooth')\n\n /**\n * Only emits the value without saving it in ngControl\n */\n emitOnly = input<boolean>(false)\n\n multiple = input<boolean>(false)\n\n /**\n * Set the maximum length in characters of the single chip.\n */\n chipMaxLength = input<number>(0)\n\n multiSelectDisplayMode = input<'vertical' | 'horizontal'>('vertical')\n\n optionList = viewChild<QuangOptionListComponent>('optionList')\n\n _showOptions = signal<boolean | null>(null)\n\n _inputValue = signal<string>('')\n\n _optionHideTimeout = signal<any | undefined>(undefined)\n\n _chipList = signal<string[]>([])\n\n _selectedOptions = signal<SelectOption[]>([])\n\n inputValue$ = new Subject<string>()\n\n selectOptionsChange = toObservable(this.selectOptions)\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n const value = this._value()\n if (!this.multiple() && !this._inputValue()) {\n this.setInputValue()\n } else if (this.multiple() && Array.isArray(value) && value.length > 0) {\n for (const valueElement of value) {\n this.onSelectValue(valueElement)\n }\n }\n })\n\n _filteredOptions = computed<SelectOption[]>(() => {\n const text = this._inputValue()\n if (this.multiple()) {\n return this.filterOptions(text).filter((x) => !this._chipList().some((chip) => chip === x.value))\n } else {\n return text?.length ? this.filterOptions(text) : this.selectOptions()\n }\n })\n\n selectedOption = output<string | number | null>()\n\n searchTextChange = output<string>()\n\n searchTextDebounce = input<number>(300)\n\n internalFilterOptions = input<boolean>(true)\n\n readonly ParentType = OptionListParentType.AUTOCOMPLETE\n\n formValueChange$: Subscription | undefined = undefined\n\n private readonly selectInput = viewChild<ElementRef>('selectInput')\n private readonly chipContainer = viewChild<ElementRef>('chipContainer')\n private readonly autocompleteContainer = viewChild<ElementRef>('autocompleteContainer')\n\n inputHeight = signal<number>(0)\n\n private readonly onChangeSelectInput = effect(() => {\n const selectInput = this.selectInput()\n if (selectInput) {\n this.inputHeight.set(selectInput?.nativeElement?.getBoundingClientRect().height)\n selectInput.nativeElement.addEventListener('keydown', (e: KeyboardEvent) => {\n if (this.multiple() && this._chipList().length > 0 && !this._inputValue()?.length && e.key === 'Backspace') {\n e.preventDefault()\n // this.deleteChip(this._chipList()[this._chipList().length - 1])\n const chipContainer = this.chipContainer()?.nativeElement\n if (chipContainer) {\n const chips = chipContainer.querySelectorAll('.chip button.btn-chip')\n if (chips.length > 0) {\n const focusChip = chips[chips.length - 1]\n focusChip.focus()\n focusChip.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Backspace') {\n event.preventDefault()\n this.deleteChip(this._chipList()[this._chipList().length - 1])\n selectInput.nativeElement.focus()\n } else {\n event.preventDefault()\n }\n })\n }\n }\n }\n })\n }\n })\n\n constructor() {\n super()\n this.inputValue$\n .pipe(takeUntilDestroyed(), debounceTime(this.searchTextDebounce()), distinctUntilChanged())\n .subscribe((value) => {\n if (value !== this._inputValue()) {\n this.searchTextChange.emit(value?.toString() || '')\n if (this.syncFormWithText()) {\n this.onValueChange(value, false)\n }\n }\n this._inputValue.set(value?.toString() || '')\n if (!this._inputValue()?.length && !this.emitOnly() && !this.multiple()) {\n this._ngControl()?.control?.patchValue(null)\n }\n })\n toObservable(this._showOptions)\n .pipe(takeUntilDestroyed())\n .subscribe((data) => {\n if (!data && data !== null) {\n this.checkInputValue()\n }\n })\n }\n\n override setupFormControl(): void {\n super.setupFormControl()\n const formControl = this._ngControl()?.control\n if (this.formValueChange$) {\n this.formValueChange$.unsubscribe()\n this.formValueChange$ = undefined\n }\n if (formControl) {\n this.formValueChange$ = formControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {\n if (this.multiple() && Array.isArray(value)) {\n this._chipList.set([])\n this._selectedOptions.set([])\n value.forEach((x) => {\n this.onSelectValue(x)\n })\n } else if (!this.multiple() && (typeof value === 'string' || typeof value === 'number')) {\n this.setInputValue()\n }\n if (!this.syncFormWithText() && !value) {\n this._inputValue.set('')\n }\n })\n }\n }\n\n showOptionVisibility(): void {\n if (this._optionHideTimeout()) {\n clearTimeout(this._optionHideTimeout())\n this._optionHideTimeout.set(null)\n }\n this._showOptions.set(true)\n }\n\n hideOptionVisibility(skipTimeout = false): void {\n if (this._optionHideTimeout()) {\n clearTimeout(this._optionHideTimeout())\n }\n this._optionHideTimeout.set(\n setTimeout(\n () => {\n this._showOptions.set(false)\n },\n skipTimeout ? 0 : 50\n )\n )\n }\n\n onChangeInput(value: any): void {\n this.showOptionVisibility()\n this.inputValue$.next(value.target?.value)\n }\n\n filterOptions(value: string): SelectOption[] {\n const options = this.selectOptions()\n if (this.internalFilterOptions()) {\n return options.filter((x) => x.label.toLowerCase().includes(value.toLowerCase()))\n }\n return options\n }\n\n override onChangedHandler(value: string | number | string[] | number[]): void {\n super.onChangedHandler(value)\n this.setInputValue()\n }\n\n onValueChange(value: string | number, hideOptions = true): void {\n if (this.multiple()) {\n this.onSelectValue(value)\n this.onChangedHandler(this._chipList())\n if (this._chipList().some((x) => x === value)) {\n this.inputValue$.next('')\n }\n } else {\n this.onChangedHandler(value)\n if (hideOptions) {\n this.hideOptionVisibility()\n }\n this.selectedOption.emit(value)\n }\n }\n\n checkInputValue(): void {\n const option = this.selectOptions().find((x) => x.label.toLowerCase() === this._inputValue()?.toLowerCase())\n if (!this.multiple()) {\n if (option?.value === this._value()) return\n if (option) {\n this.onChangedHandler(option.value ?? '')\n } else if (!this.syncFormWithText()) {\n this.onChangedHandler('')\n }\n }\n }\n\n override writeValue(val: string | number | string[] | number[]): void {\n super.writeValue(val)\n this.setInputValue(true)\n if (Array.isArray(val)) {\n val.forEach((x) => {\n this.onSelectValue(x)\n })\n }\n }\n\n onBlurInput(event: FocusEvent) {\n if ((event?.relatedTarget as HTMLDivElement)?.id !== this.optionList()?.optionListContainer()?.nativeElement?.id)\n this.onBlurHandler()\n }\n\n override onBlurHandler() {\n setTimeout(() => {\n this.hideOptionVisibility()\n if (!this._inputValue()?.length && !this.emitOnly() && !this.multiple()) {\n this._ngControl()?.control?.patchValue(null)\n }\n super.onBlurHandler()\n }, 100)\n }\n\n onBlurOptionList(event: any): void {\n if (event) this.hideOptionVisibility()\n }\n\n setInputValue(resetOnMiss = false) {\n this._inputValue.set(\n this.selectOptions().find((x) => x.value === this._value())?.label ?? (resetOnMiss ? '' : this._inputValue())\n )\n if (!this.syncFormWithText()) this.inputValue$.next(this._inputValue() ?? '')\n }\n\n getDescription(chip: any): string {\n const valueChip = this.selectOptions().find((x) => x.value === chip)\n return valueChip ? valueChip.label.toString() : ''\n }\n\n onSelectValue(value: any): void {\n const newChip = this.selectOptions().find((x) => x.value === value)\n if (newChip && !this._chipList().some((x) => x === newChip?.value)) {\n this.createChipList(newChip)\n this._selectedOptions.update((list) => [...list, newChip])\n }\n }\n\n /**\n * remove chip from chips list\n * @param chipValue chip to delete\n */\n deleteChip(chipValue: any): void {\n const stringChipValue = chipValue?.toString()\n const i = this._chipList()?.findIndex((x) => x.toString() === stringChipValue)\n if (i >= 0) {\n const currentList = this._chipList()\n if (Array.isArray(currentList) && currentList.length > 0) {\n this._chipList.update((list) => (list as string[]).filter((_, index) => index !== i))\n this.onChangedHandler(this._chipList())\n }\n }\n }\n\n createChipList(chip: any): void {\n if (chip) {\n this._chipList.update((list) => [...list, chip.value])\n }\n }\n}\n","<div\n [ngStyle]=\"{ '--chip-max-length': chipMaxLength() ? chipMaxLength() + 'ch' : 'none' }\"\n #autocompleteContainer\n class=\"autocomplete-container\"\n>\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\n </label>\n }\n <div\n [ngClass]=\"multiSelectDisplayMode() === 'horizontal' ? 'horizontal form-control' : ''\"\n #chipContainer\n class=\"container-wrap\"\n >\n @if (multiple() && _chipList().length > 0) {\n @for (chip of _chipList(); track chip) {\n @if (getDescription(chip)) {\n <div\n [quangTooltip]=\"chipMaxLength() ? getDescription(chip) : ''\"\n class=\"chip chip-hover\"\n >\n <p [ngClass]=\"{ 'm-0': isReadonly() || _isDisabled() }\">\n {{ getDescription(chip) }}\n </p>\n @if (!isReadonly() && !_isDisabled()) {\n <button\n [tabIndex]=\"$index + 1\"\n (click)=\"deleteChip(chip)\"\n class=\"btn btn-chip\"\n type=\"button\"\n >\n <svg\n class=\"ionicon\"\n fill=\"currentColor\"\n height=\"24\"\n viewBox=\"0 0 512 512\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M368 368L144 144M368 144L144 368\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n />\n </svg>\n </button>\n }\n </div>\n }\n }\n }\n\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [class.form-control]=\"multiSelectDisplayMode() !== 'horizontal'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [disabled]=\"_isDisabled() || isReadonly()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_inputValue()\"\n (blur)=\"onBlurInput($event)\"\n (input)=\"onChangeInput($event)\"\n (mousedown)=\"showOptionVisibility()\"\n #selectInput\n autocomplete=\"off\"\n type=\"text\"\n />\n </div>\n @if (_showOptions()) {\n <quang-option-list\n [_isDisabled]=\"_isDisabled()\"\n [_value]=\"_value()\"\n [componentClass]=\"componentClass()\"\n [componentLabel]=\"componentLabel()\"\n [componentTabIndex]=\"componentTabIndex()\"\n [nullOption]=\"false\"\n [optionListMaxHeight]=\"optionListMaxHeight()\"\n [parentID]=\"componentId()\"\n [parentType]=\"ParentType\"\n [scrollBehaviorOnOpen]=\"scrollBehaviorOnOpen()\"\n [selectButtonRef]=\"autocompleteContainer\"\n [selectOptions]=\"_filteredOptions()\"\n [translateValue]=\"translateValue()\"\n (blurHandler)=\"onBlurOptionList($event)\"\n (changedHandler)=\"onValueChange($event)\"\n #optionList\n selectionMode=\"single\"\n />\n }\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage() && !helpMessageTooltip()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,8 @@ class QuangCheckboxComponent extends QuangBaseComponent {
|
|
|
26
26
|
const inputElement = $event.target;
|
|
27
27
|
this.onChangedHandler(inputElement.checked);
|
|
28
28
|
}
|
|
29
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
30
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.
|
|
29
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangCheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
30
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: QuangCheckboxComponent, isStandalone: true, selector: "quang-checkbox", inputs: { labelPosition: { classPropertyName: "labelPosition", publicName: "labelPosition", isSignal: true, isRequired: false, transformFunction: null }, checkType: { classPropertyName: "checkType", publicName: "checkType", isSignal: true, isRequired: true, transformFunction: null }, removeMargin: { classPropertyName: "removeMargin", publicName: "removeMargin", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
31
31
|
{
|
|
32
32
|
provide: NG_VALUE_ACCESSOR,
|
|
33
33
|
useExisting: forwardRef(() => QuangCheckboxComponent),
|
|
@@ -35,7 +35,7 @@ class QuangCheckboxComponent extends QuangBaseComponent {
|
|
|
35
35
|
},
|
|
36
36
|
], usesInheritance: true, ngImport: i0, template: "<div\n [class.form-check-reverse]=\"labelPosition() === 'left' && checkType() === 'checkbox'\"\n [class.form-switch]=\"checkType() === 'toggle'\"\n [class.label-bottom]=\"labelPosition() === 'bottom'\"\n [class.label-left]=\"labelPosition() === 'left' && checkType() === 'toggle'\"\n [class.label-right]=\"labelPosition() === 'right' && checkType() === 'toggle'\"\n [class.label-top]=\"labelPosition() === 'top'\"\n [class.toggle-wrapper]=\"checkType() === 'toggle'\"\n [ngClass]=\"{ 'mb-3': !removeMargin(), 'form-check': !removeMargin() }\"\n>\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\n </label>\n }\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [attr.role]=\"checkType() === 'checkbox' ? 'checkbox' : 'switch'\"\n [checked]=\"_value()\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_value()\"\n (blur)=\"onBlurHandler()\"\n (input)=\"onChangedEventHandler($event)\"\n class=\"form-check-input {{ _isDisabled() ? '' : 'cursor-pointer' }}\"\n type=\"checkbox\"\n />\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage() && !helpMessageTooltip()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.label-top{display:flex;flex-direction:column}.label-top input{margin:unset;float:unset}.label-bottom{display:flex;flex-direction:column-reverse}.label-bottom input{margin:unset;float:unset}.label-right{flex-direction:row-reverse;justify-content:start}.label-right label{margin-left:.5rem;margin-bottom:0;align-self:center}.label-left{flex-direction:row}.label-left label{margin-bottom:0;align-self:center}.toggle-wrapper{display:flex;padding-left:unset}.toggle-wrapper label{display:block}.toggle-wrapper input{margin-left:unset;width:3em;height:1.5em}.direction-row{flex-direction:row}.direction-row .form-label{margin-right:.5rem}.direction-reverse-row{flex-direction:row-reverse;justify-content:start}.direction-reverse-row input{margin-right:.5rem}.direction-column{flex-direction:column}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: QuangTooltipDirective, selector: "[quangTooltip]", inputs: ["quangTooltip", "showMethod"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
37
37
|
}
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: QuangCheckboxComponent, decorators: [{
|
|
39
39
|
type: Component,
|
|
40
40
|
args: [{ selector: 'quang-checkbox', providers: [
|
|
41
41
|
{
|
|
@@ -44,7 +44,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
44
44
|
multi: true,
|
|
45
45
|
},
|
|
46
46
|
], imports: [TranslocoPipe, NgClass, QuangTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class.form-check-reverse]=\"labelPosition() === 'left' && checkType() === 'checkbox'\"\n [class.form-switch]=\"checkType() === 'toggle'\"\n [class.label-bottom]=\"labelPosition() === 'bottom'\"\n [class.label-left]=\"labelPosition() === 'left' && checkType() === 'toggle'\"\n [class.label-right]=\"labelPosition() === 'right' && checkType() === 'toggle'\"\n [class.label-top]=\"labelPosition() === 'top'\"\n [class.toggle-wrapper]=\"checkType() === 'toggle'\"\n [ngClass]=\"{ 'mb-3': !removeMargin(), 'form-check': !removeMargin() }\"\n>\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\n </label>\n }\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [attr.role]=\"checkType() === 'checkbox' ? 'checkbox' : 'switch'\"\n [checked]=\"_value()\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_value()\"\n (blur)=\"onBlurHandler()\"\n (input)=\"onChangedEventHandler($event)\"\n class=\"form-check-input {{ _isDisabled() ? '' : 'cursor-pointer' }}\"\n type=\"checkbox\"\n />\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage() && !helpMessageTooltip()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.label-top{display:flex;flex-direction:column}.label-top input{margin:unset;float:unset}.label-bottom{display:flex;flex-direction:column-reverse}.label-bottom input{margin:unset;float:unset}.label-right{flex-direction:row-reverse;justify-content:start}.label-right label{margin-left:.5rem;margin-bottom:0;align-self:center}.label-left{flex-direction:row}.label-left label{margin-bottom:0;align-self:center}.toggle-wrapper{display:flex;padding-left:unset}.toggle-wrapper label{display:block}.toggle-wrapper input{margin-left:unset;width:3em;height:1.5em}.direction-row{flex-direction:row}.direction-row .form-label{margin-right:.5rem}.direction-reverse-row{flex-direction:row-reverse;justify-content:start}.direction-reverse-row input{margin-right:.5rem}.direction-column{flex-direction:column}.cursor-pointer{cursor:pointer}\n"] }]
|
|
47
|
-
}] });
|
|
47
|
+
}], propDecorators: { labelPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPosition", required: false }] }], checkType: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkType", required: true }] }], removeMargin: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeMargin", required: false }] }] } });
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
50
|
* Generated bundle index. Do not edit.
|