quang 20.7.0 → 20.7.2-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.
Files changed (33) hide show
  1. package/auth/index.d.ts +4 -4
  2. package/components/date/index.d.ts +2 -0
  3. package/components/paginator/index.d.ts +4 -5
  4. package/components/shared/index.d.ts +4 -5
  5. package/components/table/index.d.ts +6 -6
  6. package/components/tabs/index.d.ts +1 -1
  7. package/components/wysiwyg/index.d.ts +2 -2
  8. package/fesm2022/quang-auth.mjs.map +1 -1
  9. package/fesm2022/quang-components-date.mjs +49 -2
  10. package/fesm2022/quang-components-date.mjs.map +1 -1
  11. package/fesm2022/quang-components-paginator.mjs +13 -10
  12. package/fesm2022/quang-components-paginator.mjs.map +1 -1
  13. package/fesm2022/quang-components-shared.mjs +2 -1
  14. package/fesm2022/quang-components-shared.mjs.map +1 -1
  15. package/fesm2022/quang-components-table.mjs.map +1 -1
  16. package/fesm2022/quang-components-tabs.mjs.map +1 -1
  17. package/fesm2022/quang-components-wysiwyg.mjs.map +1 -1
  18. package/fesm2022/quang-forms.mjs +1 -1
  19. package/fesm2022/quang-forms.mjs.map +1 -1
  20. package/fesm2022/quang-overlay-modal.mjs +7 -8
  21. package/fesm2022/quang-overlay-modal.mjs.map +1 -1
  22. package/fesm2022/quang-overlay-popover.mjs.map +1 -1
  23. package/fesm2022/quang-overlay-shared.mjs.map +1 -1
  24. package/fesm2022/quang-overlay-toast.mjs +4 -1
  25. package/fesm2022/quang-overlay-toast.mjs.map +1 -1
  26. package/fesm2022/quang-overlay-tooltip.mjs.map +1 -1
  27. package/forms/index.d.ts +10 -10
  28. package/overlay/modal/index.d.ts +1 -3
  29. package/overlay/popover/index.d.ts +5 -5
  30. package/overlay/shared/index.d.ts +10 -10
  31. package/overlay/toast/index.d.ts +1 -1
  32. package/overlay/tooltip/index.d.ts +2 -2
  33. package/package.json +1 -1
package/auth/index.d.ts CHANGED
@@ -144,8 +144,8 @@ declare class QuangHasEveryRoleDirective {
144
144
 
145
145
  declare class QuangIsAuthenticatedDirective {
146
146
  viewContainerRef: ViewContainerRef;
147
- templateRef: TemplateRef<any>;
148
- embeddedViewRef: EmbeddedViewRef<any> | null;
147
+ templateRef: TemplateRef<unknown>;
148
+ embeddedViewRef: EmbeddedViewRef<unknown> | null;
149
149
  authService: QuangAuthService;
150
150
  takeUntilDestroyed: rxjs.MonoTypeOperatorFunction<unknown>;
151
151
  changeDetectorRef: ChangeDetectorRef;
@@ -156,8 +156,8 @@ declare class QuangIsAuthenticatedDirective {
156
156
 
157
157
  declare class QuangIsNotAuthenticatedDirective {
158
158
  viewContainerRef: ViewContainerRef;
159
- templateRef: TemplateRef<any>;
160
- embeddedViewRef: EmbeddedViewRef<any> | null;
159
+ templateRef: TemplateRef<unknown>;
160
+ embeddedViewRef: EmbeddedViewRef<unknown> | null;
161
161
  authService: QuangAuthService;
162
162
  takeUntilDestroyed: rxjs.MonoTypeOperatorFunction<unknown>;
163
163
  changeDetectorRef: ChangeDetectorRef;
@@ -74,6 +74,7 @@ declare class QuangDateComponent extends QuangBaseComponent<string | DateRange |
74
74
  isMouseOutsideCalendar: _angular_core.Signal<boolean>;
75
75
  private _shouldRefocusInputOnHide;
76
76
  setupCalendar(): void;
77
+ private handleDisabledState;
77
78
  onChangeText($event: Event): void;
78
79
  onBlurHandler(): void;
79
80
  setupInputStringToDate(value: string): Date;
@@ -93,6 +94,7 @@ declare class QuangDateComponent extends QuangBaseComponent<string | DateRange |
93
94
  private setCalendarPosition;
94
95
  private setupTimepicker;
95
96
  checkDateMatch(date: string): boolean;
97
+ private setTimepickerInputValues;
96
98
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuangDateComponent, never>;
97
99
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QuangDateComponent, "quang-date", never, { "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "activeLanguageOverride": { "alias": "activeLanguageOverride"; "required": false; "isSignal": true; }; "timepicker": { "alias": "timepicker"; "required": false; "isSignal": true; }; "invalidDateMessage": { "alias": "invalidDateMessage"; "required": false; "isSignal": true; }; "showOnlyTimepicker": { "alias": "showOnlyTimepicker"; "required": false; "isSignal": true; }; "minHour": { "alias": "minHour"; "required": false; "isSignal": true; }; "maxHour": { "alias": "maxHour"; "required": false; "isSignal": true; }; "minMinute": { "alias": "minMinute"; "required": false; "isSignal": true; }; "maxMinute": { "alias": "maxMinute"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "showInline": { "alias": "showInline"; "required": false; "isSignal": true; }; "calendarClasses": { "alias": "calendarClasses"; "required": false; "isSignal": true; }; "buttonClass": { "alias": "buttonClass"; "required": false; "isSignal": true; }; "datepickerOptions": { "alias": "datepickerOptions"; "required": false; "isSignal": true; }; "multipleDatesSeparator": { "alias": "multipleDatesSeparator"; "required": false; "isSignal": true; }; "rangeSelection": { "alias": "rangeSelection"; "required": false; "isSignal": true; }; "searchTextDebounce": { "alias": "searchTextDebounce"; "required": false; "isSignal": true; }; }, {}, never, ["[help-icon]", "*"], true, never>;
98
100
  }
@@ -1,11 +1,10 @@
1
- import { TranslocoService } from '@jsverse/transloco';
2
1
  import * as _angular_core from '@angular/core';
3
2
  import { ɵɵFactoryDeclaration as __FactoryDeclaration, ɵɵInjectableDeclaration as __InjectableDeclaration, OnInit } from '@angular/core';
4
3
  import * as rxjs from 'rxjs';
5
4
  import * as i1 from '@angular/common';
6
5
 
7
6
  declare class PaginatorIntl {
8
- readonly changes: _angular_core.WritableSignal<any>;
7
+ readonly changes: _angular_core.WritableSignal<number>;
9
8
  itemsPerPageLabel: string;
10
9
  nextPageLabel: string;
11
10
  previousPageLabel: string;
@@ -18,7 +17,7 @@ declare class PaginatorIntl {
18
17
 
19
18
  declare class QuangPaginatorLanguageService extends PaginatorIntl {
20
19
  private readonly transloco;
21
- constructor(transloco: TranslocoService);
20
+ constructor();
22
21
  getAndInitTranslations(): void;
23
22
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuangPaginatorLanguageService, never>;
24
23
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<QuangPaginatorLanguageService>;
@@ -44,7 +43,7 @@ declare class QuangPaginatorComponent implements OnInit {
44
43
  changePage: _angular_core.OutputEmitterRef<number>;
45
44
  changeSize: _angular_core.OutputEmitterRef<number>;
46
45
  ngOnInit(): void;
47
- onChangeSize(event: any): void;
46
+ onChangeSize(event: Event): void;
48
47
  goToNextPage(): void;
49
48
  goToPreviousPage(): void;
50
49
  goToFirstPage(): void;
@@ -60,7 +59,7 @@ declare class PaginatorModule {
60
59
  }
61
60
 
62
61
  declare class QuangPaginatorService {
63
- getPage(list: any[], pageNumber: number, pageSize: number): any[];
62
+ getPage<T>(list: readonly T[], pageNumber: number, pageSize: number): T[];
64
63
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuangPaginatorService, never>;
65
64
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<QuangPaginatorService>;
66
65
  }
@@ -1,8 +1,7 @@
1
- import * as rxjs from 'rxjs';
2
- import { Subscription } from 'rxjs';
3
1
  import * as _angular_core from '@angular/core';
4
2
  import { AfterViewInit, Injector, DestroyRef, TemplateRef, ElementRef } from '@angular/core';
5
3
  import { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';
4
+ import { Observable, Subscription } from 'rxjs';
6
5
 
7
6
  declare const makeId: (length: number) => string;
8
7
 
@@ -11,10 +10,10 @@ interface ErrorData {
11
10
  message: string;
12
11
  }
13
12
 
14
- declare abstract class QuangBaseComponent<T = any> implements ControlValueAccessor, AfterViewInit {
13
+ declare abstract class QuangBaseComponent<T = unknown> implements ControlValueAccessor, AfterViewInit {
15
14
  componentId: _angular_core.InputSignal<string>;
16
15
  isReadonly: _angular_core.InputSignal<boolean>;
17
- isReadonly$: rxjs.Observable<boolean>;
16
+ isReadonly$: Observable<boolean>;
18
17
  componentTabIndex: _angular_core.InputSignal<number>;
19
18
  componentClass: _angular_core.InputSignal<string | string[]>;
20
19
  componentLabel: _angular_core.InputSignal<string>;
@@ -35,7 +34,7 @@ declare abstract class QuangBaseComponent<T = any> implements ControlValueAccess
35
34
  _showSuccess: _angular_core.Signal<boolean | "">;
36
35
  _showErrors: _angular_core.Signal<boolean>;
37
36
  _currentErrorMessage: _angular_core.WritableSignal<string>;
38
- _currentErrorMessageExtraData: _angular_core.WritableSignal<Record<string, any>>;
37
+ _currentErrorMessageExtraData: _angular_core.WritableSignal<Record<string, unknown>>;
39
38
  _ngControl: _angular_core.WritableSignal<NgControl | null>;
40
39
  _injector: _angular_core.WritableSignal<Injector>;
41
40
  _statusChange$?: Subscription;
@@ -7,21 +7,21 @@ interface TableHeader {
7
7
  text?: string;
8
8
  sort?: SortCol;
9
9
  css?: string[];
10
- renderer?: TemplateRef<any>;
11
- payload?: any;
10
+ renderer?: TemplateRef<unknown>;
11
+ payload?: unknown;
12
12
  }
13
13
  interface TableConfiguration<T> {
14
14
  headers: TableHeader[];
15
15
  rows: TableRow<T>[];
16
16
  }
17
17
  interface TableCell {
18
- renderer?: TemplateRef<any>;
19
- payload?: any;
18
+ renderer?: TemplateRef<unknown>;
19
+ payload?: unknown;
20
20
  text?: string;
21
21
  css?: string[];
22
22
  fullWidth?: boolean;
23
23
  style?: Record<string, string>;
24
- properties?: Record<string, any>;
24
+ properties?: Record<string, unknown>;
25
25
  cellId?: string | number;
26
26
  }
27
27
  interface TableRow<T> {
@@ -73,7 +73,7 @@ declare class QuangTableComponent<T> {
73
73
  lastWidth: number;
74
74
  fixTableHeaderWidth(): void;
75
75
  onSortColumn(sort: SortCol): void;
76
- convertToString(value?: any): string | undefined;
76
+ convertToString(value?: unknown): string | undefined;
77
77
  protected readonly SortType: typeof SortType;
78
78
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuangTableComponent<any>, never>;
79
79
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QuangTableComponent<any>, "quang-table", never, { "clickableRow": { "alias": "clickableRow"; "required": false; "isSignal": true; }; "selectedRows": { "alias": "selectedRows"; "required": false; "isSignal": true; }; "stickyTable": { "alias": "stickyTable"; "required": false; "isSignal": true; }; "sortType": { "alias": "sortType"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "tableConfigurations": { "alias": "tableConfigurations"; "required": true; "isSignal": true; }; }, { "selectedRow": "selectedRow"; "sortChanged": "sortChanged"; }, never, never, true, never>;
@@ -6,7 +6,7 @@ interface TabConfiguration {
6
6
  id: string;
7
7
  label: string;
8
8
  disabled?: boolean;
9
- renderer?: TemplateRef<any>;
9
+ renderer?: TemplateRef<unknown>;
10
10
  }
11
11
  declare class QuangTabsComponent extends QuangBaseComponent<string> {
12
12
  tabs: _angular_core.InputSignal<TabConfiguration[]>;
@@ -30,8 +30,8 @@ declare class QuangWysiwygComponent extends QuangBaseComponent<string> implement
30
30
  image: _angular_core.InputSignal<boolean>;
31
31
  fullScreen: _angular_core.InputSignal<boolean>;
32
32
  showBlocks: _angular_core.InputSignal<boolean>;
33
- onImageUploadError: _angular_core.InputSignal<((errorMessage: any, result: any, core: any) => boolean) | undefined>;
34
- onFileDrop: _angular_core.InputSignal<((e: any, cleanData: any, maxCharCount: any, core: any) => boolean) | undefined>;
33
+ onImageUploadError: _angular_core.InputSignal<((errorMessage: unknown, result: unknown, core: unknown) => boolean) | undefined>;
34
+ onFileDrop: _angular_core.InputSignal<((e: unknown, cleanData: unknown, maxCharCount: unknown, core: unknown) => boolean) | undefined>;
35
35
  wysiwygOptions: _angular_core.InputSignal<SunEditorOptions | undefined>;
36
36
  _sunEditorWysiwygInstance: _angular_core.WritableSignal<SunEditorCore | undefined>;
37
37
  _sunEditorWysiwygInstance$: rxjs.Observable<SunEditorCore | undefined>;
@@ -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<unknown>>(TemplateRef)\n\n embeddedViewRef: EmbeddedViewRef<unknown> | 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<unknown>>(TemplateRef)\n\n embeddedViewRef: EmbeddedViewRef<unknown> | 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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"}
@@ -242,6 +242,9 @@ class QuangDateComponent extends QuangBaseComponent {
242
242
  else {
243
243
  this._airDatepickerInstance()?.setFocusDate(false);
244
244
  this._airDatepickerInstance()?.clear({ silent: true });
245
+ if (this.showOnlyTimepicker()) {
246
+ this.setTimepickerInputValues('');
247
+ }
245
248
  }
246
249
  }
247
250
  else {
@@ -255,6 +258,25 @@ class QuangDateComponent extends QuangBaseComponent {
255
258
  if (this.showInline()) {
256
259
  this.setupTimepicker();
257
260
  }
261
+ this.handleDisabledState();
262
+ }
263
+ handleDisabledState() {
264
+ const isDisabled = this._isDisabled();
265
+ const datepickerInstance = this._airDatepickerInstance();
266
+ if (!datepickerInstance)
267
+ return;
268
+ const datepickerEl = datepickerInstance.$datepicker;
269
+ if (!datepickerEl)
270
+ return;
271
+ const inputs = datepickerEl.querySelectorAll('input');
272
+ if (isDisabled) {
273
+ datepickerEl.classList.add('quang-calendar-disabled');
274
+ Array.from(inputs).forEach((input) => (input.disabled = true));
275
+ }
276
+ else {
277
+ datepickerEl.classList.remove('quang-calendar-disabled');
278
+ Array.from(inputs).forEach((input) => (input.disabled = false));
279
+ }
258
280
  }
259
281
  onChangeText($event) {
260
282
  const value = $event.target?.value;
@@ -356,6 +378,18 @@ class QuangDateComponent extends QuangBaseComponent {
356
378
  if (!this.showInline()) {
357
379
  return;
358
380
  }
381
+ if (this.showOnlyTimepicker()) {
382
+ const datepickerRoot = this._airDatepickerInstance()?.$datepicker;
383
+ if (datepickerRoot) {
384
+ const timeInputs = datepickerRoot.querySelectorAll('.air-datepicker-time input');
385
+ if (timeInputs.length > 0 &&
386
+ Array.from(timeInputs).every((input) => input.value === '')) {
387
+ this.onChangedHandler(null);
388
+ this.propagateValueToControl();
389
+ return;
390
+ }
391
+ }
392
+ }
359
393
  const datepickerInstance = this._airDatepickerInstance();
360
394
  const selectedDate = datepickerInstance?.selectedDates?.[0];
361
395
  if (!(selectedDate instanceof Date)) {
@@ -536,12 +570,25 @@ class QuangDateComponent extends QuangBaseComponent {
536
570
  checkDateMatch(date) {
537
571
  return isMatch(date, this.valueFormat()) || isMatch(date, this.valueFormat().replace('yyyy', 'yy'));
538
572
  }
573
+ setTimepickerInputValues(value) {
574
+ const datepickerRoot = this._airDatepickerInstance()?.$datepicker;
575
+ if (!datepickerRoot) {
576
+ return;
577
+ }
578
+ const timepickers = datepickerRoot.getElementsByClassName('air-datepicker-time');
579
+ for (const timepicker of Array.from(timepickers)) {
580
+ const inputs = timepicker.getElementsByTagName('input');
581
+ for (const input of Array.from(inputs)) {
582
+ input.value = value;
583
+ }
584
+ }
585
+ }
539
586
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: QuangDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
540
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: QuangDateComponent, isStandalone: true, selector: "quang-date", inputs: { dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, timeFormat: { classPropertyName: "timeFormat", publicName: "timeFormat", isSignal: true, isRequired: false, transformFunction: null }, activeLanguageOverride: { classPropertyName: "activeLanguageOverride", publicName: "activeLanguageOverride", isSignal: true, isRequired: false, transformFunction: null }, timepicker: { classPropertyName: "timepicker", publicName: "timepicker", isSignal: true, isRequired: false, transformFunction: null }, invalidDateMessage: { classPropertyName: "invalidDateMessage", publicName: "invalidDateMessage", isSignal: true, isRequired: false, transformFunction: null }, showOnlyTimepicker: { classPropertyName: "showOnlyTimepicker", publicName: "showOnlyTimepicker", isSignal: true, isRequired: false, transformFunction: null }, minHour: { classPropertyName: "minHour", publicName: "minHour", isSignal: true, isRequired: false, transformFunction: null }, maxHour: { classPropertyName: "maxHour", publicName: "maxHour", isSignal: true, isRequired: false, transformFunction: null }, minMinute: { classPropertyName: "minMinute", publicName: "minMinute", isSignal: true, isRequired: false, transformFunction: null }, maxMinute: { classPropertyName: "maxMinute", publicName: "maxMinute", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, showInline: { classPropertyName: "showInline", publicName: "showInline", isSignal: true, isRequired: false, transformFunction: null }, calendarClasses: { classPropertyName: "calendarClasses", publicName: "calendarClasses", isSignal: true, isRequired: false, transformFunction: null }, buttonClass: { classPropertyName: "buttonClass", publicName: "buttonClass", isSignal: true, isRequired: false, transformFunction: null }, datepickerOptions: { classPropertyName: "datepickerOptions", publicName: "datepickerOptions", isSignal: true, isRequired: false, transformFunction: null }, multipleDatesSeparator: { classPropertyName: "multipleDatesSeparator", publicName: "multipleDatesSeparator", isSignal: true, isRequired: false, transformFunction: null }, rangeSelection: { classPropertyName: "rangeSelection", publicName: "rangeSelection", isSignal: true, isRequired: false, transformFunction: null }, searchTextDebounce: { classPropertyName: "searchTextDebounce", publicName: "searchTextDebounce", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], viewQueries: [{ propertyName: "_inputForDate", first: true, predicate: ["inputForDate"], descendants: true, isSignal: true }, { propertyName: "contentTemplate", first: true, predicate: ["calendarButton"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mb-3\">\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 [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\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: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;padding-top:.25rem;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:0;padding-left:1rem;border-color:var(--bs-border-color)}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker-time{padding:0!important}:host{display:block}:host .quang-date-inline-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:0!important;border:0!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important;white-space:nowrap!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\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 }); }
587
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: QuangDateComponent, isStandalone: true, selector: "quang-date", inputs: { dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, timeFormat: { classPropertyName: "timeFormat", publicName: "timeFormat", isSignal: true, isRequired: false, transformFunction: null }, activeLanguageOverride: { classPropertyName: "activeLanguageOverride", publicName: "activeLanguageOverride", isSignal: true, isRequired: false, transformFunction: null }, timepicker: { classPropertyName: "timepicker", publicName: "timepicker", isSignal: true, isRequired: false, transformFunction: null }, invalidDateMessage: { classPropertyName: "invalidDateMessage", publicName: "invalidDateMessage", isSignal: true, isRequired: false, transformFunction: null }, showOnlyTimepicker: { classPropertyName: "showOnlyTimepicker", publicName: "showOnlyTimepicker", isSignal: true, isRequired: false, transformFunction: null }, minHour: { classPropertyName: "minHour", publicName: "minHour", isSignal: true, isRequired: false, transformFunction: null }, maxHour: { classPropertyName: "maxHour", publicName: "maxHour", isSignal: true, isRequired: false, transformFunction: null }, minMinute: { classPropertyName: "minMinute", publicName: "minMinute", isSignal: true, isRequired: false, transformFunction: null }, maxMinute: { classPropertyName: "maxMinute", publicName: "maxMinute", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, showInline: { classPropertyName: "showInline", publicName: "showInline", isSignal: true, isRequired: false, transformFunction: null }, calendarClasses: { classPropertyName: "calendarClasses", publicName: "calendarClasses", isSignal: true, isRequired: false, transformFunction: null }, buttonClass: { classPropertyName: "buttonClass", publicName: "buttonClass", isSignal: true, isRequired: false, transformFunction: null }, datepickerOptions: { classPropertyName: "datepickerOptions", publicName: "datepickerOptions", isSignal: true, isRequired: false, transformFunction: null }, multipleDatesSeparator: { classPropertyName: "multipleDatesSeparator", publicName: "multipleDatesSeparator", isSignal: true, isRequired: false, transformFunction: null }, rangeSelection: { classPropertyName: "rangeSelection", publicName: "rangeSelection", isSignal: true, isRequired: false, transformFunction: null }, searchTextDebounce: { classPropertyName: "searchTextDebounce", publicName: "searchTextDebounce", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], viewQueries: [{ propertyName: "_inputForDate", first: true, predicate: ["inputForDate"], descendants: true, isSignal: true }, { propertyName: "contentTemplate", first: true, predicate: ["calendarButton"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mb-3\">\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 [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\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: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker.quang-calendar-disabled{pointer-events:none;opacity:.6}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative;height:100%}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:.375rem .75rem .375rem 1.5rem;border-color:var(--bs-border-color);height:38px}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0;padding:0!important;background-color:transparent}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker-time{padding:0!important}:host{display:block}:host .quang-date-inline-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:0!important;border:0!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important;white-space:nowrap!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\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 }); }
541
588
  }
542
589
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: QuangDateComponent, decorators: [{
543
590
  type: Component,
544
- args: [{ selector: 'quang-date', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], imports: [TranslocoPipe, NgClass, QuangTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\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 [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\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: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;padding-top:.25rem;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:0;padding-left:1rem;border-color:var(--bs-border-color)}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker-time{padding:0!important}:host{display:block}:host .quang-date-inline-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:0!important;border:0!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important;white-space:nowrap!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\n"] }]
591
+ args: [{ selector: 'quang-date', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], imports: [TranslocoPipe, NgClass, QuangTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\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 [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\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: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker.quang-calendar-disabled{pointer-events:none;opacity:.6}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative;height:100%}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:.375rem .75rem .375rem 1.5rem;border-color:var(--bs-border-color);height:38px}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0;padding:0!important;background-color:transparent}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker-time{padding:0!important}:host{display:block}:host .quang-date-inline-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:0!important;border:0!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important;white-space:nowrap!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\n"] }]
545
592
  }], ctorParameters: () => [], propDecorators: { dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], timeFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeFormat", required: false }] }], activeLanguageOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeLanguageOverride", required: false }] }], timepicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "timepicker", required: false }] }], invalidDateMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidDateMessage", required: false }] }], showOnlyTimepicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOnlyTimepicker", required: false }] }], minHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHour", required: false }] }], maxHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHour", required: false }] }], minMinute: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMinute", required: false }] }], maxMinute: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxMinute", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], showInline: [{ type: i0.Input, args: [{ isSignal: true, alias: "showInline", required: false }] }], calendarClasses: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarClasses", required: false }] }], buttonClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonClass", required: false }] }], datepickerOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "datepickerOptions", required: false }] }], _inputForDate: [{ type: i0.ViewChild, args: ['inputForDate', { isSignal: true }] }], contentTemplate: [{ type: i0.ViewChild, args: ['calendarButton', { isSignal: true }] }], multipleDatesSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "multipleDatesSeparator", required: false }] }], rangeSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "rangeSelection", required: false }] }], searchTextDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchTextDebounce", required: false }] }] } });
546
593
 
547
594
  /**