valtech-components 2.0.1021 → 2.0.1023

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.
@@ -54,7 +54,7 @@ import 'prismjs/components/prism-json';
54
54
  * Current version of valtech-components.
55
55
  * This is automatically updated during the publish process.
56
56
  */
57
- const VERSION = '2.0.1021';
57
+ const VERSION = '2.0.1023';
58
58
 
59
59
  // Control de estado de refresco (singleton a nivel de módulo)
60
60
  let isRefreshing = false;
@@ -46382,7 +46382,7 @@ class OrgInfoSheetComponent {
46382
46382
  <val-button [props]="resolvedCloseProps()" (click)="dismiss()" />
46383
46383
  </div>
46384
46384
  </ion-content>
46385
- `, isInline: true, styles: ["ion-content{--padding-bottom: 64px}val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
46385
+ `, isInline: true, styles: ["ion-content{--padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)) }val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
46386
46386
  }
46387
46387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, decorators: [{
46388
46388
  type: Component,
@@ -46453,7 +46453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
46453
46453
  <val-button [props]="resolvedCloseProps()" (click)="dismiss()" />
46454
46454
  </div>
46455
46455
  </ion-content>
46456
- `, styles: ["ion-content{--padding-bottom: 64px}val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"] }]
46456
+ `, styles: ["ion-content{--padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)) }val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"] }]
46457
46457
  }], ctorParameters: () => [], propDecorators: { title: [{
46458
46458
  type: Input
46459
46459
  }], subtitle: [{
@@ -47985,19 +47985,30 @@ class InviteMemberModalComponent {
47985
47985
  this.searchResults.set([]);
47986
47986
  return [];
47987
47987
  }
47988
- const cleanQ = (q.startsWith('@') ? q.slice(1) : q).toLowerCase();
47989
- // Prefijo: el sentinel alto `` cierra el rango (antes `cleanQ + ''`
47990
- // era exact-match solo encontraba el handle idéntico). NOTA: solo busca
47991
- // por `handle`; la búsqueda por nombre requiere un campo normalizado en
47992
- // /profiles (pendiente, ver TODO de búsqueda por nombre).
47993
- const q$ = query$1(collection(this.firestore, 'profiles'), orderBy('handle'), startAt(cleanQ), endAt(cleanQ + '\uf8ff'), limit(8));
47994
- return from(getDocs(q$)).pipe(map$1(snap => ({
47995
- users: snap.docs.map(d => ({
47996
- userId: d.id,
47997
- handle: d.data()['handle'],
47998
- name: d.data()['name'],
47999
- })),
48000
- })));
47988
+ // Búsqueda por prefijo sobre DOS campos: `handle` y `nameLower`. Firestore
47989
+ // no soporta OR entre campos en una query, así que se lanzan dos queries en
47990
+ // paralelo y se mezclan (dedup por id). El sentinel alto  cierra el
47991
+ // rango del prefijo. `nameLower` lo escribe el backend en /profiles
47992
+ // (NormalizeNameForSearch: lowercase + colapso de espacios); normalizamos el
47993
+ // query igual para que el prefijo matchee.
47994
+ const profiles = collection(this.firestore, 'profiles');
47995
+ const handleQ = (q.startsWith('@') ? q.slice(1) : q).toLowerCase();
47996
+ const nameQ = q.trim().toLowerCase().replace(/\s+/g, ' ');
47997
+ const byHandle$ = from(getDocs(query$1(profiles, orderBy('handle'), startAt(handleQ), endAt(handleQ + '\uf8ff'), limit(8))));
47998
+ const byName$ = from(getDocs(query$1(profiles, orderBy('nameLower'), startAt(nameQ), endAt(nameQ + '\uf8ff'), limit(8))));
47999
+ return forkJoin([byHandle$, byName$]).pipe(map$1(([handleSnap, nameSnap]) => {
48000
+ const byId = new Map();
48001
+ for (const d of [...handleSnap.docs, ...nameSnap.docs]) {
48002
+ if (byId.has(d.id))
48003
+ continue;
48004
+ byId.set(d.id, {
48005
+ userId: d.id,
48006
+ handle: d.data()['handle'],
48007
+ name: d.data()['name'],
48008
+ });
48009
+ }
48010
+ return { users: Array.from(byId.values()).slice(0, 8) };
48011
+ }));
48001
48012
  }))
48002
48013
  .subscribe({
48003
48014
  next: res => {
@@ -48388,6 +48399,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48388
48399
  type: Input
48389
48400
  }] } });
48390
48401
 
48402
+ /**
48403
+ * Consume el catálogo de permisos del backend (`GET /org/{orgId}/permissions-catalog`).
48404
+ * El backend es la fuente de verdad de qué permisos existen y de su alcance
48405
+ * (globales de plataforma vs. propios de una app). La respuesta incluye el
48406
+ * `appId` del request para que la vista distinga la app actual.
48407
+ *
48408
+ * Promovido desde `showcase` a la lib bajo el proceso de ADR-021. Usa
48409
+ * `VALTECH_AUTH_CONFIG.apiUrl` (como `OrgService`) en vez del `environment` de la
48410
+ * app — la lib no importa el environment del consumer.
48411
+ */
48412
+ class PermissionCatalogService {
48413
+ constructor(config, http) {
48414
+ this.config = config;
48415
+ this.http = http;
48416
+ }
48417
+ getCatalog(orgId) {
48418
+ return this.http.get(`${this.config.apiUrl}/org/${orgId}/permissions-catalog`);
48419
+ }
48420
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionCatalogService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
48421
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionCatalogService, providedIn: 'root' }); }
48422
+ }
48423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionCatalogService, decorators: [{
48424
+ type: Injectable,
48425
+ args: [{ providedIn: 'root' }]
48426
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
48427
+ type: Inject,
48428
+ args: [VALTECH_AUTH_CONFIG]
48429
+ }] }, { type: i1$3.HttpClient }] });
48430
+ /**
48431
+ * Humaniza un código crudo (`api-keys` → "Api Keys", `reset-password` → "Reset
48432
+ * Password") como último recurso cuando el catálogo no trae label para él.
48433
+ */
48434
+ function humanizePermissionCode(code) {
48435
+ if (!code)
48436
+ return '';
48437
+ return code
48438
+ .split(/[-_]/)
48439
+ .filter(Boolean)
48440
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
48441
+ .join(' ');
48442
+ }
48443
+ /**
48444
+ * Construye el resolvedor de labels de permisos a partir del catálogo del backend
48445
+ * (fuente única de verdad de los labels, ADR-024). Los consumers (permissions-view,
48446
+ * organization-view, member-detail-modal) usan esto en vez de duplicar mapas
48447
+ * hardcodeados `resource→key`/`action→key`.
48448
+ *
48449
+ * - Recurso → `permissions[].label[locale]`; acción → `actionLabels[action][locale]`.
48450
+ * - Wildcards (`*:*`, `resource:*`, `*`) usan `allLabel` (el catálogo no modela el
48451
+ * comodín; el consumer pasa su string i18n, p.ej. "Todos los permisos").
48452
+ * - Fallback humanizado si el catálogo no trae label (evita salidas vacías como
48453
+ * ": Gestionar" ante un recurso/acción nuevo aún sin etiqueta en el backend).
48454
+ */
48455
+ function createPermissionLabeler(catalog, locale, opts) {
48456
+ const byResource = new Map();
48457
+ for (const r of catalog.permissions ?? [])
48458
+ byResource.set(r.resource, r);
48459
+ const actionLabels = catalog.actionLabels ?? {};
48460
+ const allLabel = opts?.allLabel ?? humanizePermissionCode('all');
48461
+ const resLabel = (resource) => byResource.get(resource)?.label?.[locale] ?? humanizePermissionCode(resource);
48462
+ const actLabel = (action) => actionLabels[action]?.[locale] ?? humanizePermissionCode(action);
48463
+ return (perm) => {
48464
+ const [resource, action] = perm.split(':');
48465
+ if (resource === '*')
48466
+ return allLabel;
48467
+ const res = resLabel(resource);
48468
+ const act = action === '*' ? allLabel : actLabel(action);
48469
+ return `${res}: ${act}`;
48470
+ };
48471
+ }
48472
+
48391
48473
  /**
48392
48474
  * Defaults i18n (es/en) embebidos en `val-member-detail-modal`. Auto-registrados
48393
48475
  * en el constructor del componente si el consumer no proveyó el namespace
@@ -48526,6 +48608,9 @@ class MemberDetailModalComponent {
48526
48608
  this.errors = inject(ValtechErrorService);
48527
48609
  this.i18n = inject(I18nService);
48528
48610
  this.confirmDialog = inject(ConfirmationDialogService);
48611
+ this.catalog = inject(PermissionCatalogService);
48612
+ /** Labeler de permisos con la SSOT del backend (catálogo). Se llena al cargar. */
48613
+ this.permLabeler = signal(null);
48529
48614
  /** Organización a la que pertenece el miembro. */
48530
48615
  this.orgId = '';
48531
48616
  /** Si true, habilita cambio de rol y eliminación. */
@@ -48597,62 +48682,24 @@ class MemberDetailModalComponent {
48597
48682
  if (v && v !== this.currentRole())
48598
48683
  void this.onChangeRole(v);
48599
48684
  });
48685
+ // Catálogo del backend = SSOT de los labels de permisos (ADR-024). Si falla,
48686
+ // `permissionLabel` cae al fallback humanizado (no rompe el modal).
48687
+ if (this.orgId) {
48688
+ this.catalog.getCatalog(this.orgId).subscribe({
48689
+ next: catalog => this.permLabeler.set(createPermissionLabeler(catalog, this.i18n.lang(), { allLabel: this.t('permAll') })),
48690
+ error: () => { },
48691
+ });
48692
+ }
48600
48693
  }
48601
48694
  permissionLabel(perm) {
48602
- if (perm === '*:*')
48603
- return this.t('permAll');
48604
- const [resource, action] = perm.split(':');
48605
- const resKey = {
48606
- users: 'permUsers',
48607
- documents: 'permDocuments',
48608
- roles: 'permRoles',
48609
- media: 'permMedia',
48610
- templates: 'permTemplates',
48611
- rbac: 'permRbac',
48612
- apps: 'permApps',
48613
- 'api-keys': 'permApiKeys',
48614
- 'email-logs': 'permEmailLogs',
48615
- 'sms-logs': 'permSmsLogs',
48616
- 'comms-templates': 'permCommsTemplates',
48617
- requests: 'permRequests',
48618
- members: 'permMembers',
48619
- accounts: 'permAccounts',
48620
- support: 'permSupport',
48621
- bingo: 'permBingo',
48622
- '*': 'permAll',
48623
- };
48624
- const actKey = {
48625
- read: 'permRead',
48626
- write: 'permWrite',
48627
- create: 'permCreate',
48628
- delete: 'permDelete',
48629
- manage: 'permManage',
48630
- edit: 'permEdit',
48631
- sell: 'permSell',
48632
- checkin: 'permCheckin',
48633
- settle: 'permSettle',
48634
- export: 'permExport',
48635
- operate: 'permOperate',
48636
- suspend: 'permSuspend',
48637
- reactivate: 'permReactivate',
48638
- 'reset-password': 'permResetPassword',
48639
- import: 'permImport',
48640
- '*': 'permAll',
48641
- };
48642
- // Label del i18n si el recurso/acción está mapeado; si no, humanizar el código
48643
- // crudo (evita que un recurso nuevo salga vacío, ej. ": Gestionar").
48644
- const res = resKey[resource] ? this.t(resKey[resource]) : this.humanizeCode(resource);
48645
- const act = actKey[action] ? this.t(actKey[action]) : this.humanizeCode(action);
48646
- return `${res}: ${act}`;
48647
- }
48648
- humanizeCode(code) {
48649
- if (!code)
48650
- return '';
48651
- return code
48652
- .split(/[-_]/)
48653
- .filter(Boolean)
48654
- .map(w => w.charAt(0).toUpperCase() + w.slice(1))
48655
- .join(' ');
48695
+ // SSOT = catálogo del backend. Hasta que cargue (o si falló), fallback a un
48696
+ // labeler vacío que humaniza el código crudo (evita salidas vacías como
48697
+ // ": Gestionar"). El `*:*` y wildcards usan el label i18n `permAll`.
48698
+ const labeler = this.permLabeler() ??
48699
+ createPermissionLabeler({ permissions: [], actionLabels: {} }, this.i18n.lang(), {
48700
+ allLabel: this.t('permAll'),
48701
+ });
48702
+ return labeler(perm);
48656
48703
  }
48657
48704
  async onChangeRole(newRoleId) {
48658
48705
  if (this.working())
@@ -49577,35 +49624,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49577
49624
  args: [VALTECH_AUTH_CONFIG]
49578
49625
  }] }, { type: i1$3.HttpClient }] });
49579
49626
 
49580
- /**
49581
- * Consume el catálogo de permisos del backend (`GET /org/{orgId}/permissions-catalog`).
49582
- * El backend es la fuente de verdad de qué permisos existen y de su alcance
49583
- * (globales de plataforma vs. propios de una app). La respuesta incluye el
49584
- * `appId` del request para que la vista distinga la app actual.
49585
- *
49586
- * Promovido desde `showcase` a la lib bajo el proceso de ADR-021. Usa
49587
- * `VALTECH_AUTH_CONFIG.apiUrl` (como `OrgService`) en vez del `environment` de la
49588
- * app — la lib no importa el environment del consumer.
49589
- */
49590
- class PermissionCatalogService {
49591
- constructor(config, http) {
49592
- this.config = config;
49593
- this.http = http;
49594
- }
49595
- getCatalog(orgId) {
49596
- return this.http.get(`${this.config.apiUrl}/org/${orgId}/permissions-catalog`);
49597
- }
49598
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionCatalogService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
49599
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionCatalogService, providedIn: 'root' }); }
49600
- }
49601
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionCatalogService, decorators: [{
49602
- type: Injectable,
49603
- args: [{ providedIn: 'root' }]
49604
- }], ctorParameters: () => [{ type: undefined, decorators: [{
49605
- type: Inject,
49606
- args: [VALTECH_AUTH_CONFIG]
49607
- }] }, { type: i1$3.HttpClient }] });
49608
-
49609
49627
  /**
49610
49628
  * Defaults i18n (es/en) embebidos en `val-api-keys-modal` (ADR-023).
49611
49629
  * Auto-registrados si el consumer no proveyó el namespace `Settings.ApiKeysModal`.
@@ -50594,7 +50612,7 @@ class OrganizationViewComponent {
50594
50612
  type: 'button',
50595
50613
  },
50596
50614
  },
50597
- breakpoints: { breakpoints: [0, 0.85], initialBreakpoint: 0.85, showHandle: true },
50615
+ breakpoints: { breakpoints: [0, 0.92], initialBreakpoint: 0.92, showHandle: true },
50598
50616
  backdropDismiss: true,
50599
50617
  });
50600
50618
  }
@@ -50619,7 +50637,7 @@ class OrganizationViewComponent {
50619
50637
  type: 'button',
50620
50638
  },
50621
50639
  },
50622
- breakpoints: { breakpoints: [0, 0.85], initialBreakpoint: 0.85, showHandle: true },
50640
+ breakpoints: { breakpoints: [0, 0.92], initialBreakpoint: 0.92, showHandle: true },
50623
50641
  backdropDismiss: true,
50624
50642
  });
50625
50643
  }
@@ -50803,30 +50821,6 @@ class OrganizationViewComponent {
50803
50821
  .map(w => w.charAt(0).toUpperCase() + w.slice(1))
50804
50822
  .join(' ');
50805
50823
  }
50806
- permissionLabel(perm) {
50807
- if (perm === '*:*')
50808
- return this.tt('permAll');
50809
- const [resource, action] = perm.split(':');
50810
- const resKey = {
50811
- users: 'permUsers',
50812
- documents: 'permDocuments',
50813
- roles: 'permRoles',
50814
- media: 'permMedia',
50815
- templates: 'permTemplates',
50816
- '*': 'permAll',
50817
- };
50818
- const actKey = {
50819
- read: 'permRead',
50820
- write: 'permWrite',
50821
- create: 'permCreate',
50822
- delete: 'permDelete',
50823
- manage: 'permManage',
50824
- '*': 'permAll',
50825
- };
50826
- const res = this.tt(resKey[resource] ?? resource);
50827
- const act = this.tt(actKey[action] ?? action);
50828
- return `${res}: ${act}`;
50829
- }
50830
50824
  onViewMember(member) {
50831
50825
  void this.modalService.open({
50832
50826
  component: MemberDetailModalComponent,
@@ -52421,13 +52415,19 @@ class PermissionsViewComponent {
52421
52415
  for (const r of catalog.permissions)
52422
52416
  byResource.set(r.resource, r);
52423
52417
  const currentAppId = catalog.appId;
52418
+ // Labeler con la SSOT del backend (labels del catálogo) — reemplaza el
52419
+ // mapa hardcodeado `perm*`. Locale del momento de carga (igual que antes:
52420
+ // los labels se hornean en el RoleView; cambio de idioma requiere reload).
52421
+ const labeler = createPermissionLabeler(catalog, this.i18n.lang(), {
52422
+ allLabel: this.tt('permAll'),
52423
+ });
52424
52424
  this.roles.set((rawRoles ?? []).map((r) => this.buildRoleView({
52425
52425
  id: r.id,
52426
52426
  name: r.name,
52427
52427
  description: r.description,
52428
52428
  permissions: r.permissions ?? [],
52429
52429
  isSystem: r.isSystem ?? false,
52430
- }, byResource, currentAppId)));
52430
+ }, byResource, currentAppId, labeler)));
52431
52431
  this.loading.set(false);
52432
52432
  },
52433
52433
  error: err => {
@@ -52436,12 +52436,12 @@ class PermissionsViewComponent {
52436
52436
  },
52437
52437
  });
52438
52438
  }
52439
- buildRoleView(role, byResource, currentAppId) {
52439
+ buildRoleView(role, byResource, currentAppId, labeler) {
52440
52440
  const appPerms = [];
52441
52441
  const orgPerms = [];
52442
52442
  const otherByApp = new Map();
52443
52443
  for (const perm of role.permissions) {
52444
- const [resource, action] = perm.split(':');
52444
+ const [resource] = perm.split(':');
52445
52445
  const entry = byResource.get(resource);
52446
52446
  // Sin entrada en el catálogo (el backend omite los recursos internal para
52447
52447
  // no-platform-admins) o entrada internal → NUNCA se muestra a nivel de
@@ -52451,7 +52451,7 @@ class PermissionsViewComponent {
52451
52451
  if (!entry || entry.scope === 'internal') {
52452
52452
  continue;
52453
52453
  }
52454
- const label = this.permLabel(resource, action);
52454
+ const label = labeler(perm);
52455
52455
  if (entry.scope === 'app') {
52456
52456
  if (entry.appId === currentAppId) {
52457
52457
  appPerms.push(label);
@@ -52516,15 +52516,6 @@ class PermissionsViewComponent {
52516
52516
  };
52517
52517
  return this.tt(map[name] ?? name);
52518
52518
  }
52519
- permLabel(resource, action) {
52520
- if (resource === '*' && action === '*')
52521
- return this.tt('permAll');
52522
- const resKey = resource === '*' ? 'permAll' : `perm${resource.charAt(0).toUpperCase()}${resource.slice(1)}`;
52523
- const actKey = action === '*' ? 'permAll' : `perm${action.charAt(0).toUpperCase()}${action.slice(1)}`;
52524
- const res = this.tt(resKey);
52525
- const act = this.tt(actKey);
52526
- return `${res}: ${act}`;
52527
- }
52528
52519
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionsViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52529
52520
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PermissionsViewComponent, isStandalone: true, selector: "val-permissions-view", inputs: { config: "config" }, ngImport: i0, template: `
52530
52521
  <div class="page">
@@ -64703,5 +64694,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
64703
64694
  * Generated bundle index. Do not edit.
64704
64695
  */
64705
64696
 
64706
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyService, ApiKeysModalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, 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, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
64697
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyService, ApiKeysModalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, 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, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
64707
64698
  //# sourceMappingURL=valtech-components.mjs.map