valtech-components 2.0.725 → 2.0.726

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.
@@ -50,7 +50,7 @@ import 'prismjs/components/prism-json';
50
50
  * Current version of valtech-components.
51
51
  * This is automatically updated during the publish process.
52
52
  */
53
- const VERSION = '2.0.725';
53
+ const VERSION = '2.0.726';
54
54
 
55
55
  /**
56
56
  * Servicio para gestionar presets de componentes.
@@ -17863,6 +17863,19 @@ function joinPath(...segments) {
17863
17863
  * Servicio genérico para operaciones CRUD en Firestore.
17864
17864
  * Soporta lecturas one-time, subscripciones real-time, paginación y queries complejas.
17865
17865
  */
17866
+ /**
17867
+ * Internal sentinel used to mark a collection path as global cross-app —
17868
+ * i.e. it should NOT be prefixed with `apps/{appId}/`.
17869
+ *
17870
+ * Apps consume this via `CollectionOptions.skipAppPrefix`; the sentinel
17871
+ * stays in `TypedCollection` and is stripped here before Firestore sees it.
17872
+ *
17873
+ * Format keeps it impossible to collide with a real Firestore path (`:` is
17874
+ * not allowed in collection segments).
17875
+ *
17876
+ * @internal
17877
+ */
17878
+ const ABS_PATH_SENTINEL = '__abs__:';
17866
17879
  /**
17867
17880
  * Servicio para operaciones CRUD en Firestore.
17868
17881
  *
@@ -17905,9 +17918,17 @@ class FirestoreService {
17905
17918
  * Prefija el path de colección con el appId si está configurado.
17906
17919
  * Si no hay appId, retorna el path sin modificar (backward compatible).
17907
17920
  *
17921
+ * Si el path empieza con `ABS_PATH_SENTINEL` (`__abs__:`), se asume que el
17922
+ * caller quiere un path global cross-app (ej. `users/{uid}/notifications` —
17923
+ * el inbox global de notificaciones). El sentinel se strippea y el resto
17924
+ * del path se pasa verbatim, sin prefijo `apps/{appId}/`.
17925
+ *
17908
17926
  * @internal
17909
17927
  */
17910
17928
  prefixCollectionPath(collectionPath) {
17929
+ if (collectionPath.startsWith(ABS_PATH_SENTINEL)) {
17930
+ return collectionPath.slice(ABS_PATH_SENTINEL.length);
17931
+ }
17911
17932
  if (!this.config?.appId)
17912
17933
  return collectionPath;
17913
17934
  return `apps/${this.config.appId}/${collectionPath}`;
@@ -25930,57 +25951,90 @@ const DEFAULT_EMULATOR_CONFIG = {
25930
25951
  // STORAGE PATH BUILDERS
25931
25952
  // ============================================================================
25932
25953
  /**
25933
- * Genera paths de Storage con namespace por app.
25954
+ * Genera paths de Storage alineados con storage.rules.
25955
+ *
25956
+ * Convenciones (ver frontend/firebase/storage.rules):
25957
+ * - Avatar global del user (cross-app): /users/{uid}/avatar.jpg
25958
+ * - Files privados del user (cross-app): /users/{uid}/files/{path}
25959
+ * - Avatar per-app del user: /apps/{appId}/users/{uid}/avatar.jpg
25960
+ * - Files per-app del user: /apps/{appId}/users/{uid}/files/{path}
25961
+ * - Public per-app: /apps/{appId}/public/{path}
25962
+ * - Shared per-app (auth-only): /apps/{appId}/shared/{path}
25963
+ * - Public global: /public/{path}
25934
25964
  *
25935
25965
  * @example
25936
- * // Path específico de la app
25937
- * storagePaths.forApp('showcase', 'uploads', 'image.jpg')
25938
- * // => 'showcase/uploads/image.jpg'
25966
+ * storagePaths.forApp('showcase', 'public', 'banner.jpg')
25967
+ * // => 'apps/showcase/public/banner.jpg'
25968
+ *
25969
+ * storagePaths.userAvatar('user123')
25970
+ * // => 'users/user123/avatar.jpg'
25939
25971
  *
25940
- * // Path compartido
25941
- * storagePaths.shared.profilePhoto('user123', 'avatar.jpg')
25942
- * // => 'profile-photos/user123/avatar.jpg'
25972
+ * storagePaths.appUserFile('showcase', 'user123', 'doc.pdf')
25973
+ * // => 'apps/showcase/users/user123/files/doc.pdf'
25943
25974
  */
25944
25975
  const storagePaths = {
25945
- /** Carpeta específica de la app: {appId}/{...paths} */
25946
- forApp: (appId, ...paths) => [appId, ...paths].join('/'),
25947
- /** Carpetas compartidas (sin namespace) */
25948
- shared: {
25949
- /** Foto de perfil de usuario */
25950
- profilePhoto: (userId, fileName) => `profile-photos/${userId}/${fileName}`,
25951
- /** Archivos públicos accesibles sin autenticación */
25952
- public: (...paths) => `public/${paths.join('/')}`,
25953
- },
25976
+ /** Path per-app: apps/{appId}/{...paths} */
25977
+ forApp: (appId, ...paths) => ['apps', appId, ...paths].join('/'),
25978
+ /** Avatar global del user (cross-app) */
25979
+ userAvatar: (userId) => `users/${userId}/avatar.jpg`,
25980
+ /** Thumbnail global del user (cross-app) */
25981
+ userThumb: (userId) => `users/${userId}/thumb.jpg`,
25982
+ /** File privado global del user (cross-app) */
25983
+ userFile: (userId, ...paths) => ['users', userId, 'files', ...paths].join('/'),
25984
+ /** Avatar per-app del user */
25985
+ appUserAvatar: (appId, userId) => `apps/${appId}/users/${userId}/avatar.jpg`,
25986
+ /** File per-app del user */
25987
+ appUserFile: (appId, userId, ...paths) => ['apps', appId, 'users', userId, 'files', ...paths].join('/'),
25988
+ /** Public global (acceso sin auth, write admin-only) */
25989
+ public: (...paths) => `public/${paths.join('/')}`,
25954
25990
  };
25955
25991
  // ============================================================================
25956
25992
  // FIRESTORE COLLECTION BUILDERS
25957
25993
  // ============================================================================
25958
25994
  /**
25959
- * Genera paths de colecciones con namespace por app.
25995
+ * Genera paths de colecciones alineados con firestore.rules.
25960
25996
  *
25961
- * IMPORTANTE: La estructura es /apps/{appId}/{collection}/{docId}
25962
- * Firestore requiere número impar de segmentos para paths de colección.
25997
+ * Convenciones (ver frontend/firebase/firestore.rules):
25998
+ * - Cross-app shared:
25999
+ * /users/{uid} (privado), /profiles/{uid} (público global),
26000
+ * /users/{uid}/notifications (INBOX GLOBAL cross-app cross-org)
26001
+ * - Per-app:
26002
+ * /apps/{appId}/{collection}, /apps/{appId}/profiles/{uid}
26003
+ * - Per-app per-user (notifications NO viven aquí):
26004
+ * /apps/{appId}/users/{uid}/{collection}
26005
+ * - Per-app per-org:
26006
+ * /apps/{appId}/orgs/{orgId}/{collection}
25963
26007
  *
25964
26008
  * @example
25965
- * // Colección específica de la app
25966
26009
  * collections.forApp('showcase', 'items')
25967
26010
  * // => 'apps/showcase/items'
25968
26011
  *
25969
- * // Colección compartida
25970
- * collections.shared.users
25971
- * // => 'users'
26012
+ * collections.appUser('showcase', 'user123', 'drafts')
26013
+ * // => 'apps/showcase/users/user123/drafts'
26014
+ *
26015
+ * collections.appOrg('showcase', 'org_abc', 'posts')
26016
+ * // => 'apps/showcase/orgs/org_abc/posts'
26017
+ *
26018
+ * collections.userNotifications('user123')
26019
+ * // => 'users/user123/notifications'
25972
26020
  */
25973
26021
  const collections = {
25974
- /** Colección específica de la app: apps/{appId}/{collection} */
26022
+ /** Per-app cross-user: apps/{appId}/{collection} */
25975
26023
  forApp: (appId, collectionName) => `apps/${appId}/${collectionName}`,
25976
- /** Colecciones compartidas (sin namespace, nivel raíz) */
26024
+ /** Per-app per-user: apps/{appId}/users/{uid}/{collection} */
26025
+ appUser: (appId, userId, collectionName) => `apps/${appId}/users/${userId}/${collectionName}`,
26026
+ /** Per-app per-org: apps/{appId}/orgs/{orgId}/{collection} */
26027
+ appOrg: (appId, orgId, collectionName) => `apps/${appId}/orgs/${orgId}/${collectionName}`,
26028
+ /** Per-app perfil público del user: apps/{appId}/profiles/{uid} */
26029
+ appProfile: (appId, userId) => `apps/${appId}/profiles/${userId}`,
26030
+ /** Inbox global del user (cross-app cross-org) */
26031
+ userNotifications: (userId) => `users/${userId}/notifications`,
26032
+ /** Cross-app shared (sin namespace, nivel raíz) */
25977
26033
  shared: {
25978
- /** Usuarios del sistema */
26034
+ /** Doc privado del user — /users/{uid} */
25979
26035
  users: 'users',
25980
- /** Perfiles públicos */
26036
+ /** Perfiles públicos globales — /profiles/{uid} */
25981
26037
  profiles: 'profiles',
25982
- /** Notificaciones de usuarios */
25983
- notifications: 'notifications',
25984
26038
  },
25985
26039
  };
25986
26040
  /**
@@ -26541,12 +26595,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26541
26595
  class TypedCollection {
26542
26596
  constructor(firestore, collectionPath, options = {}) {
26543
26597
  this.firestore = firestore;
26544
- this.collectionPath = collectionPath;
26545
26598
  this.options = {
26546
26599
  softDelete: false,
26547
26600
  timestamps: true,
26601
+ skipAppPrefix: false,
26548
26602
  ...options,
26549
26603
  };
26604
+ // Marcar el path con el sentinel cuando skipAppPrefix=true. FirestoreService
26605
+ // detecta el sentinel y devuelve el path sin prefijo `apps/{appId}/`.
26606
+ // Subcolecciones (subPath = `${this.collectionPath}/...`) heredan el sentinel
26607
+ // automáticamente por concatenación.
26608
+ this.collectionPath = this.options.skipAppPrefix
26609
+ ? `${ABS_PATH_SENTINEL}${collectionPath}`
26610
+ : collectionPath;
26550
26611
  }
26551
26612
  // ===========================================================================
26552
26613
  // LECTURAS ONE-TIME
@@ -30782,6 +30843,283 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30782
30843
  `, styles: [".oauth-callback{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.oauth-callback__spinner{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:16px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.oauth-callback__text{color:#666;font-size:14px}\n"] }]
30783
30844
  }] });
30784
30845
 
30846
+ /**
30847
+ * Name of the query param that carries the handoff token. Apps may override
30848
+ * via `detectAndExchangeHandoff({ tokenParam })` but the default keeps the
30849
+ * convention consistent across the factory.
30850
+ */
30851
+ const HANDOFF_TOKEN_PARAM = 'handoff';
30852
+ /**
30853
+ * Name of the query param that carries the post-exchange route.
30854
+ */
30855
+ const HANDOFF_ROUTE_PARAM = 'route';
30856
+ /**
30857
+ * HandoffService — cross-app session transfer.
30858
+ *
30859
+ * Implements the OAuth Authorization Code pattern, applied internally between
30860
+ * apps that share the same backend.
30861
+ *
30862
+ * **Origin app (user is authenticated):**
30863
+ *
30864
+ * ```typescript
30865
+ * const { token, route } = await firstValueFrom(
30866
+ * handoff.createHandoff({ targetAppId: 'myvaltech', route: '/app/dashboard' })
30867
+ * );
30868
+ * window.location.href = `https://myvaltech.app/?handoff=${token}&route=${encodeURIComponent(route ?? '/')}`;
30869
+ * ```
30870
+ *
30871
+ * **Target app (boot):** call `exchangeHandoff(token)`. On success, the session
30872
+ * is installed (`AuthService.setExternalAuth`) and the user is authenticated.
30873
+ * See `detectAndExchangeHandoff` helper for the typical bootstrap pattern.
30874
+ *
30875
+ * Security notes:
30876
+ * - Token is single-use and short-lived (30s) — enforced server-side.
30877
+ * - Token in URL must be removed from history after exchange to avoid log leakage.
30878
+ * - The exchange endpoint is public; do NOT add auth header. The
30879
+ * `HttpClient` request below avoids triggering the auth interceptor since the
30880
+ * user isn't logged in yet on the target app.
30881
+ */
30882
+ class HandoffService {
30883
+ constructor(config, http, auth, router) {
30884
+ this.config = config;
30885
+ this.http = http;
30886
+ this.auth = auth;
30887
+ this.router = router;
30888
+ this.detected = false;
30889
+ }
30890
+ /**
30891
+ * Create a handoff token. Caller must be authenticated.
30892
+ *
30893
+ * @param request Optional metadata: target app id and intended route.
30894
+ * @returns Observable emitting `{ token, expiresAt, route? }`.
30895
+ */
30896
+ createHandoff(request = {}) {
30897
+ return this.http.post(`${this.baseUrl}/handoff`, request);
30898
+ }
30899
+ /**
30900
+ * Exchange a handoff token for a session and install it.
30901
+ *
30902
+ * On success, the response is piped through `AuthService.setExternalAuth`
30903
+ * so the user becomes authenticated. Subsequent navigation can proceed.
30904
+ *
30905
+ * On failure, the observable errors. The caller is responsible for
30906
+ * showing an error and routing to `/login`.
30907
+ *
30908
+ * @param token Raw handoff token read from the URL.
30909
+ */
30910
+ exchangeHandoff(token) {
30911
+ return this.http
30912
+ .post(`${this.baseUrl}/handoff/exchange`, { token })
30913
+ .pipe(tap(response => this.installSession(response)), catchError$1(err => {
30914
+ // Surface the error untouched — the caller decides how to react
30915
+ // (typically: redirect to /login + toast). Don't install a bad session.
30916
+ throw err;
30917
+ }));
30918
+ }
30919
+ /**
30920
+ * Bootstrap helper — reads the handoff token from the current URL, exchanges
30921
+ * it for a session, and navigates to the intended route with the token
30922
+ * stripped from history.
30923
+ *
30924
+ * Idempotent: subsequent calls are no-ops. Wire from an
30925
+ * `APP_INITIALIZER`/`provideAppInitializer` factory in `main.ts`.
30926
+ *
30927
+ * ```typescript
30928
+ * // main.ts
30929
+ * provideAppInitializer(() => inject(HandoffService).detectAndExchangeHandoff())
30930
+ * ```
30931
+ *
30932
+ * On error (expired/used/invalid token), redirects to `errorRoute` (default:
30933
+ * the app's configured `loginRoute`). The URL is always cleaned, even on
30934
+ * error, so the token cannot be retried by refreshing the page.
30935
+ *
30936
+ * @returns `true` if a handoff was detected and processed (success or fail).
30937
+ * `false` if no token was present (cold boot, normal flow).
30938
+ */
30939
+ async detectAndExchangeHandoff(options = {}) {
30940
+ if (this.detected || typeof window === 'undefined') {
30941
+ return false;
30942
+ }
30943
+ this.detected = true;
30944
+ const tokenParam = options.tokenParam ?? HANDOFF_TOKEN_PARAM;
30945
+ const routeParam = options.routeParam ?? HANDOFF_ROUTE_PARAM;
30946
+ const defaultRoute = options.defaultRoute ?? '/';
30947
+ const errorRoute = options.errorRoute ?? this.config.loginRoute ?? '/login';
30948
+ const params = new URLSearchParams(window.location.search);
30949
+ const token = params.get(tokenParam);
30950
+ if (!token) {
30951
+ return false;
30952
+ }
30953
+ const targetRoute = params.get(routeParam) || defaultRoute;
30954
+ try {
30955
+ await firstValueFrom(this.exchangeHandoff(token));
30956
+ await this.router.navigateByUrl(targetRoute, { replaceUrl: true });
30957
+ }
30958
+ catch (err) {
30959
+ console.warn('[Handoff] Exchange failed, redirecting to login', err);
30960
+ await this.router.navigateByUrl(errorRoute, { replaceUrl: true });
30961
+ }
30962
+ return true;
30963
+ }
30964
+ /**
30965
+ * Persist the session in `AuthService`. Mirrors the install flow used by
30966
+ * the normal signin path so timers, Firebase, and tab-sync all kick in.
30967
+ */
30968
+ installSession(response) {
30969
+ this.auth.setExternalAuth({
30970
+ accessToken: response.accessToken,
30971
+ refreshToken: response.refreshToken,
30972
+ firebaseToken: response.firebaseToken,
30973
+ expiresIn: response.expiresIn,
30974
+ });
30975
+ }
30976
+ get baseUrl() {
30977
+ return `${this.config.apiUrl}${this.config.authPrefix}`;
30978
+ }
30979
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HandoffService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$8.HttpClient }, { token: AuthService }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
30980
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HandoffService, providedIn: 'root' }); }
30981
+ }
30982
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HandoffService, decorators: [{
30983
+ type: Injectable,
30984
+ args: [{ providedIn: 'root' }]
30985
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
30986
+ type: Inject,
30987
+ args: [VALTECH_AUTH_CONFIG]
30988
+ }] }, { type: i1$8.HttpClient }, { type: AuthService }, { type: i1$1.Router }] });
30989
+
30990
+ /**
30991
+ * OrgSwitchService — orchestrates active organization changes across the app.
30992
+ *
30993
+ * Built on top of `AuthService.switchOrg`, which already:
30994
+ * - Hits `POST /v2/auth/switch-org` and receives a new Firebase custom token.
30995
+ * - Re-authenticates Firebase Auth with the new token (RBAC claims update).
30996
+ * - Broadcasts `ORG_SWITCH` to other tabs via `AuthSyncService` (multi-tab sync).
30997
+ *
30998
+ * What this service adds on top:
30999
+ * - A `switching` signal so the UI can show a loading indicator (1-2s switch).
31000
+ * - An `orgChanged$` Observable that components subscribe to in order to
31001
+ * invalidate their org-scoped caches (e.g. drop old query results, reset
31002
+ * page state) without a full page reload.
31003
+ * - Optional `reload: true` for apps where invalidating in-memory state piece
31004
+ * by piece is impractical.
31005
+ *
31006
+ * **What this service does NOT do automatically:**
31007
+ *
31008
+ * 1. **Teardown Firestore listeners.** Listeners are owned by their subscribing
31009
+ * components (typically via `takeUntilDestroyed` or async pipe). When the
31010
+ * component re-renders or unsubscribes, the listener disposes. If a
31011
+ * component does NOT unsubscribe on org change, its listener will keep
31012
+ * pointing at the previous org's path and may start failing rules. The fix
31013
+ * is component-level: subscribe to `orgChanged$` and reset state, or use
31014
+ * the `reload: true` option.
31015
+ *
31016
+ * 2. **Re-instantiate routed components.** Angular keeps mounted components
31017
+ * alive across navigations. If you need fresh state, either subscribe to
31018
+ * `orgChanged$` in the component, or use `reload: true`.
31019
+ *
31020
+ * @example Basic switch with loading state
31021
+ * ```typescript
31022
+ * private orgSwitch = inject(OrgSwitchService);
31023
+ *
31024
+ * async onSwitchOrg(orgId: string) {
31025
+ * await this.orgSwitch.switchTo(orgId);
31026
+ * // Components subscribed to orgChanged$ have already reset their state.
31027
+ * }
31028
+ *
31029
+ * // In template:
31030
+ * @if (orgSwitch.switching()) { <val-loading /> }
31031
+ * ```
31032
+ *
31033
+ * @example Component reacting to org change
31034
+ * ```typescript
31035
+ * private orgSwitch = inject(OrgSwitchService);
31036
+ *
31037
+ * constructor() {
31038
+ * this.orgSwitch.orgChanged$
31039
+ * .pipe(takeUntilDestroyed())
31040
+ * .subscribe(() => this.resetState());
31041
+ * }
31042
+ * ```
31043
+ *
31044
+ * @example Brutal reload mode
31045
+ * ```typescript
31046
+ * await this.orgSwitch.switchTo(orgId, { reload: true });
31047
+ * // window.location.reload() — clean slate, loses scroll position
31048
+ * ```
31049
+ */
31050
+ class OrgSwitchService {
31051
+ constructor(auth) {
31052
+ this.auth = auth;
31053
+ this._switching = signal(false);
31054
+ this._orgChanged = new Subject();
31055
+ /**
31056
+ * `true` while a switch is in flight. UI should disable interactions
31057
+ * with org-scoped data and show a loading indicator.
31058
+ */
31059
+ this.switching = this._switching.asReadonly();
31060
+ /**
31061
+ * Fires after a successful switch, with the previous and new org ids.
31062
+ * Components subscribe to invalidate caches / reset state.
31063
+ *
31064
+ * Fires AFTER the Firebase re-auth completes — listeners attached here
31065
+ * see the updated Firebase user / activeOrg claim.
31066
+ */
31067
+ this.orgChanged$ = this._orgChanged.asObservable();
31068
+ }
31069
+ /**
31070
+ * Switch the user's active organization.
31071
+ *
31072
+ * Re-entrant safe: while a switch is in flight, additional calls are
31073
+ * rejected silently (returns immediately). Inspect `switching()` to gate UI.
31074
+ *
31075
+ * @param orgId Target organization id. Must be one the user has a role in
31076
+ * — backend rejects otherwise with `PERMISSION_DENIED`.
31077
+ * @param options See `SwitchOrgOptions`.
31078
+ *
31079
+ * @throws The error from `auth.switchOrg` if the backend call fails.
31080
+ * `switching` returns to `false` before the error propagates.
31081
+ */
31082
+ async switchTo(orgId, options = {}) {
31083
+ if (this._switching()) {
31084
+ return;
31085
+ }
31086
+ const previousOrg = this.currentActiveOrg();
31087
+ if (previousOrg === orgId) {
31088
+ // No-op — already on this org.
31089
+ return;
31090
+ }
31091
+ this._switching.set(true);
31092
+ try {
31093
+ await firstValueFrom(this.auth.switchOrg(orgId));
31094
+ this._orgChanged.next({ previousOrg, newOrg: orgId });
31095
+ if (options.reload && typeof window !== 'undefined') {
31096
+ window.location.reload();
31097
+ }
31098
+ }
31099
+ finally {
31100
+ this._switching.set(false);
31101
+ }
31102
+ }
31103
+ /**
31104
+ * Read the current `activeOrg` from the auth user signal.
31105
+ * Falls back to empty string if the user isn't loaded yet.
31106
+ */
31107
+ currentActiveOrg() {
31108
+ const user = this.auth.user();
31109
+ // AuthUser may expose activeOrgId under different names depending on
31110
+ // backend version — keep tolerant.
31111
+ return (user?.activeOrgId ??
31112
+ user?.activeOrg ??
31113
+ '');
31114
+ }
31115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgSwitchService, deps: [{ token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
31116
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgSwitchService, providedIn: 'root' }); }
31117
+ }
31118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgSwitchService, decorators: [{
31119
+ type: Injectable,
31120
+ args: [{ providedIn: 'root' }]
31121
+ }], ctorParameters: () => [{ type: AuthService }] });
31122
+
30785
31123
  /**
30786
31124
  * Valtech Auth Service
30787
31125
  *
@@ -41627,5 +41965,5 @@ function buildFooterLinks(links, t) {
41627
41965
  * Generated bundle index. Do not edit.
41628
41966
  */
41629
41967
 
41630
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SKELETON_PRESETS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
41968
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SKELETON_PRESETS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
41631
41969
  //# sourceMappingURL=valtech-components.mjs.map