valtech-components 2.0.995 → 2.0.996

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.995';
57
+ const VERSION = '2.0.996';
58
58
 
59
59
  // Control de estado de refresco (singleton a nivel de módulo)
60
60
  let isRefreshing = false;
@@ -41750,7 +41750,7 @@ const PROFILE_VIEW_I18N = {
41750
41750
  const HANDLE_PATTERN = /^[a-z_][a-z0-9_]*$/;
41751
41751
  const HANDLE_MIN = 3;
41752
41752
  const HANDLE_MAX = 20;
41753
- const DEFAULT_NAMESPACE$e = 'Settings.Profile';
41753
+ const DEFAULT_NAMESPACE$f = 'Settings.Profile';
41754
41754
  /**
41755
41755
  * `val-profile-view` — vista Perfil full-feature autocontenida (organism).
41756
41756
  *
@@ -41800,7 +41800,7 @@ class ProfileViewComponent {
41800
41800
  showPhone: merged.showPhone ?? true,
41801
41801
  showShareCta: merged.showShareCta ?? true,
41802
41802
  profileBaseUrl: merged.profileBaseUrl ?? '',
41803
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$e,
41803
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$f,
41804
41804
  onSaved: merged.onSaved,
41805
41805
  onAvatarUploaded: merged.onAvatarUploaded,
41806
41806
  };
@@ -42716,7 +42716,7 @@ const PREFERENCES_VIEW_I18N = {
42716
42716
  },
42717
42717
  };
42718
42718
 
42719
- const DEFAULT_NAMESPACE$d = 'Settings.General';
42719
+ const DEFAULT_NAMESPACE$e = 'Settings.General';
42720
42720
  const DEFAULT_LANGUAGES = ['es', 'en'];
42721
42721
  /**
42722
42722
  * `val-preferences-view` — vista de preferencias de UI cross-app (tema +
@@ -42753,7 +42753,7 @@ class PreferencesViewComponent {
42753
42753
  showLanguage: merged.showLanguage ?? true,
42754
42754
  showFontSize: merged.showFontSize ?? true,
42755
42755
  supportedLanguages: merged.supportedLanguages ?? DEFAULT_LANGUAGES,
42756
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$d,
42756
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$e,
42757
42757
  onThemeChanged: merged.onThemeChanged,
42758
42758
  onLanguageChanged: merged.onLanguageChanged,
42759
42759
  onFontSizeChanged: merged.onFontSizeChanged,
@@ -44565,7 +44565,7 @@ const SECURITY_VIEW_I18N = {
44565
44565
  };
44566
44566
 
44567
44567
  addIcons({ laptopOutline, phonePortraitOutline });
44568
- const DEFAULT_NAMESPACE$c = 'Settings.Security';
44568
+ const DEFAULT_NAMESPACE$d = 'Settings.Security';
44569
44569
  /**
44570
44570
  * `val-security-view` — vista Seguridad full-feature autocontenida (organism).
44571
44571
  *
@@ -44614,7 +44614,7 @@ class SecurityViewComponent {
44614
44614
  showChangeEmail: merged.showChangeEmail ?? true,
44615
44615
  showMfa: merged.showMfa ?? true,
44616
44616
  showPolicies: merged.showPolicies ?? true,
44617
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$c,
44617
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$d,
44618
44618
  handleDeepLinks: merged.handleDeepLinks ?? true,
44619
44619
  homeRoute: merged.homeRoute ?? '/app/home',
44620
44620
  onMfaCompleted: merged.onMfaCompleted,
@@ -45527,7 +45527,7 @@ const CREATE_ORG_MODAL_I18N = {
45527
45527
  },
45528
45528
  };
45529
45529
 
45530
- const DEFAULT_NAMESPACE$b = 'CreateOrgModal';
45530
+ const DEFAULT_NAMESPACE$c = 'CreateOrgModal';
45531
45531
  /**
45532
45532
  * `val-create-org-modal` — modal de creación de organización (organism
45533
45533
  * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
@@ -45553,10 +45553,10 @@ class CreateOrgModalComponent {
45553
45553
  this.toast = inject(ToastService);
45554
45554
  this.errors = inject(ValtechErrorService);
45555
45555
  /** Namespace i18n con que la vista resuelve sus textos. */
45556
- this.i18nNamespace = DEFAULT_NAMESPACE$b;
45556
+ this.i18nNamespace = DEFAULT_NAMESPACE$c;
45557
45557
  this._busy = signal(false);
45558
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$b)) {
45559
- this.i18n.registerContent(DEFAULT_NAMESPACE$b, CREATE_ORG_MODAL_I18N);
45558
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$c)) {
45559
+ this.i18n.registerContent(DEFAULT_NAMESPACE$c, CREATE_ORG_MODAL_I18N);
45560
45560
  }
45561
45561
  this.formMeta = signal(this.buildFormMeta());
45562
45562
  effect(() => {
@@ -45792,7 +45792,7 @@ const DELETE_ACCOUNT_MODAL_I18N = {
45792
45792
  },
45793
45793
  };
45794
45794
 
45795
- const DEFAULT_NAMESPACE$a = 'Settings.DeleteAccount';
45795
+ const DEFAULT_NAMESPACE$b = 'Settings.DeleteAccount';
45796
45796
  /**
45797
45797
  * `val-delete-account-modal` — modal de eliminación de cuenta (organism,
45798
45798
  * cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.
@@ -45818,7 +45818,7 @@ class DeleteAccountModalComponent {
45818
45818
  this.i18n = inject(I18nService);
45819
45819
  this.toast = inject(ToastService);
45820
45820
  /** Namespace i18n con que la vista resuelve sus textos. */
45821
- this.i18nNamespace = DEFAULT_NAMESPACE$a;
45821
+ this.i18nNamespace = DEFAULT_NAMESPACE$b;
45822
45822
  this.hasPassword = signal(null);
45823
45823
  this.codeSent = signal(false);
45824
45824
  this.formState = signal(ComponentStates.ENABLED);
@@ -45885,8 +45885,8 @@ class DeleteAccountModalComponent {
45885
45885
  ],
45886
45886
  actions: this.submitBtn('delete-code-submit', 'confirmCta'),
45887
45887
  }));
45888
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
45889
- this.i18n.registerContent(DEFAULT_NAMESPACE$a, DELETE_ACCOUNT_MODAL_I18N);
45888
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$b)) {
45889
+ this.i18n.registerContent(DEFAULT_NAMESPACE$b, DELETE_ACCOUNT_MODAL_I18N);
45890
45890
  }
45891
45891
  }
45892
45892
  ngOnInit() {
@@ -46087,7 +46087,7 @@ const ORG_INFO_SHEET_I18N = {
46087
46087
  },
46088
46088
  };
46089
46089
 
46090
- const DEFAULT_NAMESPACE$9 = 'OrgInfoSheet';
46090
+ const DEFAULT_NAMESPACE$a = 'OrgInfoSheet';
46091
46091
  /**
46092
46092
  * `val-org-info-sheet` — sheet informativo "¿Qué son las organizaciones?".
46093
46093
  * Extraído del `OrgInfoSheetComponent` inline de `AccountPage` bajo el proceso de
@@ -46132,15 +46132,15 @@ class OrgInfoSheetComponent {
46132
46132
  text: this.closeProps.text || this.resolvedCloseLabel(),
46133
46133
  }));
46134
46134
  addIcons({ peopleOutline, swapHorizontalOutline, mailOutline });
46135
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$9)) {
46136
- this.i18n.registerContent(DEFAULT_NAMESPACE$9, ORG_INFO_SHEET_I18N);
46135
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
46136
+ this.i18n.registerContent(DEFAULT_NAMESPACE$a, ORG_INFO_SHEET_I18N);
46137
46137
  }
46138
46138
  }
46139
46139
  dismiss() {
46140
46140
  this._modalRef?.dismiss(null, 'cancel');
46141
46141
  }
46142
46142
  tt(key) {
46143
- return this.i18n.t(key, DEFAULT_NAMESPACE$9);
46143
+ return this.i18n.t(key, DEFAULT_NAMESPACE$a);
46144
46144
  }
46145
46145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46146
46146
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: OrgInfoSheetComponent, isStandalone: true, selector: "val-org-info-sheet", inputs: { title: "title", subtitle: "subtitle", body: "body", closeLabel: "closeLabel", closeProps: "closeProps", _modalRef: "_modalRef" }, ngImport: i0, template: `
@@ -46307,7 +46307,7 @@ const SWITCH_ORG_MODAL_I18N = {
46307
46307
  },
46308
46308
  };
46309
46309
 
46310
- const DEFAULT_NAMESPACE$8 = 'Settings.SwitchOrg';
46310
+ const DEFAULT_NAMESPACE$9 = 'Settings.SwitchOrg';
46311
46311
  addIcons({ businessOutline, checkmarkCircleOutline });
46312
46312
  /**
46313
46313
  * `val-switch-org-modal` — modal de cambio de organización activa (organism
@@ -46333,7 +46333,7 @@ class SwitchOrgModalComponent {
46333
46333
  this.orgSwitch = inject(OrgSwitchService);
46334
46334
  this.errors = inject(ValtechErrorService);
46335
46335
  /** Namespace i18n con que la vista resuelve sus textos. */
46336
- this.i18nNamespace = DEFAULT_NAMESPACE$8;
46336
+ this.i18nNamespace = DEFAULT_NAMESPACE$9;
46337
46337
  this.orgs = signal([]);
46338
46338
  this.loading = signal(false);
46339
46339
  this.query = signal('');
@@ -46349,8 +46349,8 @@ class SwitchOrgModalComponent {
46349
46349
  return list;
46350
46350
  return list.filter(o => o.name.toLowerCase().includes(q));
46351
46351
  });
46352
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$8)) {
46353
- this.i18n.registerContent(DEFAULT_NAMESPACE$8, SWITCH_ORG_MODAL_I18N);
46352
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$9)) {
46353
+ this.i18n.registerContent(DEFAULT_NAMESPACE$9, SWITCH_ORG_MODAL_I18N);
46354
46354
  }
46355
46355
  this.loadOrgs();
46356
46356
  }
@@ -46668,7 +46668,7 @@ const ACCOUNT_VIEW_I18N = {
46668
46668
  };
46669
46669
 
46670
46670
  addIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline });
46671
- const DEFAULT_NAMESPACE$7 = 'Settings.Account';
46671
+ const DEFAULT_NAMESPACE$8 = 'Settings.Account';
46672
46672
  const DEFAULT_MANAGE_ORG_ROUTE = '/app/settings/organization';
46673
46673
  /**
46674
46674
  * `val-account-view` — vista Cuenta full-feature autocontenida (organism).
@@ -46709,7 +46709,7 @@ class AccountViewComponent {
46709
46709
  showNewOrgCta: merged.showNewOrgCta ?? true,
46710
46710
  showLogout: merged.showLogout ?? true,
46711
46711
  showDeleteAccount: merged.showDeleteAccount ?? true,
46712
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$7,
46712
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$8,
46713
46713
  manageOrgRoute: merged.manageOrgRoute ?? DEFAULT_MANAGE_ORG_ROUTE,
46714
46714
  onOrgSwitched: merged.onOrgSwitched,
46715
46715
  onOrgCreated: merged.onOrgCreated,
@@ -47434,7 +47434,7 @@ const EDIT_ORG_MODAL_I18N = {
47434
47434
  },
47435
47435
  };
47436
47436
 
47437
- const DEFAULT_NAMESPACE$6 = 'EditOrgModal';
47437
+ const DEFAULT_NAMESPACE$7 = 'EditOrgModal';
47438
47438
  /**
47439
47439
  * `val-edit-org-modal` — modal de edición de organización (nombre + descripción).
47440
47440
  * Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por la vista de
@@ -47461,10 +47461,10 @@ class EditOrgModalComponent {
47461
47461
  /** Organización a editar (pasada por `componentProps`). */
47462
47462
  this.org = null;
47463
47463
  /** Namespace i18n con que la vista resuelve sus textos. */
47464
- this.i18nNamespace = DEFAULT_NAMESPACE$6;
47464
+ this.i18nNamespace = DEFAULT_NAMESPACE$7;
47465
47465
  this.saving = signal(false);
47466
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$6)) {
47467
- this.i18n.registerContent(DEFAULT_NAMESPACE$6, EDIT_ORG_MODAL_I18N);
47466
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$7)) {
47467
+ this.i18n.registerContent(DEFAULT_NAMESPACE$7, EDIT_ORG_MODAL_I18N);
47468
47468
  }
47469
47469
  this.formMeta = signal(this.buildFormMeta());
47470
47470
  effect(() => {
@@ -47702,7 +47702,7 @@ const INVITE_MEMBER_MODAL_I18N = {
47702
47702
  },
47703
47703
  };
47704
47704
 
47705
- const DEFAULT_NAMESPACE$5 = 'InviteModal';
47705
+ const DEFAULT_NAMESPACE$6 = 'InviteModal';
47706
47706
  addIcons({ personOutline, mailOutline, closeOutline, checkmarkCircleOutline });
47707
47707
  /**
47708
47708
  * `val-invite-member-modal` — invitación de miembros a una organización.
@@ -47733,7 +47733,7 @@ class InviteMemberModalComponent {
47733
47733
  /** Ids de miembros ya existentes (excluidos de los resultados). */
47734
47734
  this.existingMemberIds = [];
47735
47735
  /** Namespace i18n con que la vista resuelve sus textos. */
47736
- this.i18nNamespace = DEFAULT_NAMESPACE$5;
47736
+ this.i18nNamespace = DEFAULT_NAMESPACE$6;
47737
47737
  this.query = signal('');
47738
47738
  this.searching = signal(false);
47739
47739
  this.searchResults = signal([]);
@@ -47780,8 +47780,8 @@ class InviteMemberModalComponent {
47780
47780
  state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
47781
47781
  }));
47782
47782
  this.searchSubject = new Subject();
47783
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$5)) {
47784
- this.i18n.registerContent(DEFAULT_NAMESPACE$5, INVITE_MEMBER_MODAL_I18N);
47783
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$6)) {
47784
+ this.i18n.registerContent(DEFAULT_NAMESPACE$6, INVITE_MEMBER_MODAL_I18N);
47785
47785
  }
47786
47786
  this.loadRoles();
47787
47787
  this.roleSub = this.roleControl.valueChanges.subscribe(v => {
@@ -48270,7 +48270,7 @@ const MEMBER_DETAIL_MODAL_I18N = {
48270
48270
  },
48271
48271
  };
48272
48272
 
48273
- const DEFAULT_NAMESPACE$4 = 'Settings.MemberDetail';
48273
+ const DEFAULT_NAMESPACE$5 = 'Settings.MemberDetail';
48274
48274
  /**
48275
48275
  * `val-member-detail-modal` — detalle de miembro de organización: perfil, rol y
48276
48276
  * permisos. Promovido desde `showcase` bajo el proceso de ADR-021.
@@ -48307,7 +48307,7 @@ class MemberDetailModalComponent {
48307
48307
  { id: 'admin', name: 'admin' },
48308
48308
  ];
48309
48309
  /** Namespace i18n con que la vista resuelve sus textos. */
48310
- this.i18nNamespace = DEFAULT_NAMESPACE$4;
48310
+ this.i18nNamespace = DEFAULT_NAMESPACE$5;
48311
48311
  this.working = signal(false);
48312
48312
  this.currentRole = signal('');
48313
48313
  this.roleControl = new FormControl('');
@@ -48347,8 +48347,8 @@ class MemberDetailModalComponent {
48347
48347
  type: 'button',
48348
48348
  state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
48349
48349
  }));
48350
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
48351
- this.i18n.registerContent(DEFAULT_NAMESPACE$4, MEMBER_DETAIL_MODAL_I18N);
48350
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$5)) {
48351
+ this.i18n.registerContent(DEFAULT_NAMESPACE$5, MEMBER_DETAIL_MODAL_I18N);
48352
48352
  }
48353
48353
  }
48354
48354
  ngOnInit() {
@@ -48685,7 +48685,7 @@ const TRANSFER_OWNERSHIP_MODAL_I18N = {
48685
48685
  },
48686
48686
  };
48687
48687
 
48688
- const DEFAULT_NAMESPACE$3 = 'Settings.TransferModal';
48688
+ const DEFAULT_NAMESPACE$4 = 'Settings.TransferModal';
48689
48689
  /**
48690
48690
  * `val-transfer-ownership-modal` — selector de miembro para transferir la
48691
48691
  * propiedad de la organización. Promovido desde `showcase` bajo el proceso de
@@ -48709,7 +48709,7 @@ class TransferOwnershipModalComponent {
48709
48709
  /** Lista de miembros transferibles (todos excepto el owner actual). */
48710
48710
  this.members = [];
48711
48711
  /** Namespace i18n con que la vista resuelve sus textos. */
48712
- this.i18nNamespace = DEFAULT_NAMESPACE$3;
48712
+ this.i18nNamespace = DEFAULT_NAMESPACE$4;
48713
48713
  this.query = signal('');
48714
48714
  this.selectedId = signal('');
48715
48715
  this.filtered = computed(() => {
@@ -48721,8 +48721,8 @@ class TransferOwnershipModalComponent {
48721
48721
  m.userId.toLowerCase().includes(q));
48722
48722
  });
48723
48723
  this.noResultsLabel = computed(() => `${this.t('noResults')} "${this.query()}"`);
48724
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$3)) {
48725
- this.i18n.registerContent(DEFAULT_NAMESPACE$3, TRANSFER_OWNERSHIP_MODAL_I18N);
48724
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
48725
+ this.i18n.registerContent(DEFAULT_NAMESPACE$4, TRANSFER_OWNERSHIP_MODAL_I18N);
48726
48726
  }
48727
48727
  }
48728
48728
  ngOnInit() {
@@ -48970,7 +48970,7 @@ const MEMBER_IMPORT_MODAL_I18N = {
48970
48970
  },
48971
48971
  };
48972
48972
 
48973
- const DEFAULT_NAMESPACE$2 = 'Settings.ImportModal';
48973
+ const DEFAULT_NAMESPACE$3 = 'Settings.ImportModal';
48974
48974
  /**
48975
48975
  * `val-member-import-modal` — panel de carga masiva de miembros (ADR-023 fase 6).
48976
48976
  *
@@ -48989,7 +48989,7 @@ class MemberImportModalComponent {
48989
48989
  /** Nombres de roles disponibles (para el hint). Opcional. */
48990
48990
  this.availableRoles = [];
48991
48991
  /** Namespace i18n. */
48992
- this.i18nNamespace = DEFAULT_NAMESPACE$2;
48992
+ this.i18nNamespace = DEFAULT_NAMESPACE$3;
48993
48993
  this.csv = '';
48994
48994
  this.onConflict = 'assignRole';
48995
48995
  this.sendActivation = true;
@@ -49003,8 +49003,8 @@ class MemberImportModalComponent {
49003
49003
  return this.t('summary');
49004
49004
  return `${this.t('summary')}: ${s.created} ${this.t('created')} · ${s.assigned} ${this.t('assigned')} · ${s.skipped} ${this.t('skipped')} · ${s.failed} ${this.t('failed')}`;
49005
49005
  });
49006
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$2)) {
49007
- this.i18n.registerContent(DEFAULT_NAMESPACE$2, MEMBER_IMPORT_MODAL_I18N);
49006
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$3)) {
49007
+ this.i18n.registerContent(DEFAULT_NAMESPACE$3, MEMBER_IMPORT_MODAL_I18N);
49008
49008
  }
49009
49009
  }
49010
49010
  ngOnInit() {
@@ -49272,6 +49272,484 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49272
49272
  type: Input
49273
49273
  }] } });
49274
49274
 
49275
+ /**
49276
+ * Cliente HTTP de Client API Keys org-scopeadas (ADR-023). La org activa se
49277
+ * resuelve en backend desde el JWT, así que el path no la incluye.
49278
+ */
49279
+ class ApiKeyService {
49280
+ constructor(config, http) {
49281
+ this.config = config;
49282
+ this.http = http;
49283
+ }
49284
+ get baseUrl() {
49285
+ return `${this.config.apiUrl}/org/api-keys`;
49286
+ }
49287
+ /** Lista las API keys de la org activa. */
49288
+ list() {
49289
+ return this.http.get(`${this.baseUrl}/`).pipe(map$1(r => r.keys ?? []));
49290
+ }
49291
+ /** Crea una API key. La respuesta incluye el secreto (se muestra UNA vez). */
49292
+ create(req) {
49293
+ return this.http.post(`${this.baseUrl}/`, req);
49294
+ }
49295
+ /** Revoca (elimina) una API key por id. */
49296
+ revoke(keyId) {
49297
+ return this.http.delete(`${this.baseUrl}/${keyId}`);
49298
+ }
49299
+ /** Catálogo de permisos asignables a una key. */
49300
+ availablePermissions() {
49301
+ return this.http
49302
+ .get(`${this.baseUrl}/permissions`)
49303
+ .pipe(map$1(r => r.permissions ?? []));
49304
+ }
49305
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeyService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
49306
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeyService, providedIn: 'root' }); }
49307
+ }
49308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeyService, decorators: [{
49309
+ type: Injectable,
49310
+ args: [{ providedIn: 'root' }]
49311
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
49312
+ type: Inject,
49313
+ args: [VALTECH_AUTH_CONFIG]
49314
+ }] }, { type: i1$3.HttpClient }] });
49315
+
49316
+ /**
49317
+ * Defaults i18n (es/en) embebidos en `val-api-keys-modal` (ADR-023).
49318
+ * Auto-registrados si el consumer no proveyó el namespace `Settings.ApiKeysModal`.
49319
+ */
49320
+ const API_KEYS_MODAL_I18N = {
49321
+ es: {
49322
+ title: 'Client API Keys',
49323
+ hint: 'Llaves M2M org-scopeadas para integraciones (p. ej. importar miembros).',
49324
+ empty: 'Aún no hay API keys en esta organización.',
49325
+ newKey: 'Nueva API key',
49326
+ nameLabel: 'Nombre',
49327
+ namePlaceholder: 'Ej: Integración RRHH',
49328
+ permissionsLabel: 'Permisos',
49329
+ expiresLabel: 'Expira en (días, opcional)',
49330
+ create: 'Crear key',
49331
+ creating: 'Creando...',
49332
+ cancel: 'Cancelar',
49333
+ revoke: 'Revocar',
49334
+ revokeConfirm: '¿Revocar esta API key? Las integraciones que la usen dejarán de funcionar.',
49335
+ secretTitle: 'Copia tu API key ahora',
49336
+ secretWarning: 'Este secreto se muestra una sola vez. Guárdalo en un lugar seguro.',
49337
+ copy: 'Copiar',
49338
+ copied: 'Copiada',
49339
+ done: 'Listo',
49340
+ statusActive: 'activa',
49341
+ lastUsed: 'Último uso',
49342
+ never: 'nunca',
49343
+ permsCount: 'permisos',
49344
+ noName: 'El nombre es obligatorio.',
49345
+ noPerms: 'Selecciona al menos un permiso.',
49346
+ close: 'Cerrar',
49347
+ genericError: 'No se pudo completar la operación. Intenta de nuevo.',
49348
+ },
49349
+ en: {
49350
+ title: 'Client API Keys',
49351
+ hint: 'Org-scoped M2M keys for integrations (e.g. member import).',
49352
+ empty: 'No API keys in this organization yet.',
49353
+ newKey: 'New API key',
49354
+ nameLabel: 'Name',
49355
+ namePlaceholder: 'E.g: HR integration',
49356
+ permissionsLabel: 'Permissions',
49357
+ expiresLabel: 'Expires in (days, optional)',
49358
+ create: 'Create key',
49359
+ creating: 'Creating...',
49360
+ cancel: 'Cancel',
49361
+ revoke: 'Revoke',
49362
+ revokeConfirm: 'Revoke this API key? Integrations using it will stop working.',
49363
+ secretTitle: 'Copy your API key now',
49364
+ secretWarning: 'This secret is shown only once. Store it somewhere safe.',
49365
+ copy: 'Copy',
49366
+ copied: 'Copied',
49367
+ done: 'Done',
49368
+ statusActive: 'active',
49369
+ lastUsed: 'Last used',
49370
+ never: 'never',
49371
+ permsCount: 'permissions',
49372
+ noName: 'Name is required.',
49373
+ noPerms: 'Select at least one permission.',
49374
+ close: 'Close',
49375
+ genericError: "Couldn't complete the operation. Try again.",
49376
+ },
49377
+ };
49378
+
49379
+ const DEFAULT_NAMESPACE$2 = 'Settings.ApiKeysModal';
49380
+ /**
49381
+ * `val-api-keys-modal` — gestión de Client API Keys org-scopeadas (ADR-023 fase 6).
49382
+ *
49383
+ * Lista las keys de la org, permite crear (mostrando el secreto UNA vez con copia)
49384
+ * y revocar. Pensado para habilitar integraciones M2M del import de miembros, pero
49385
+ * sirve a cualquier permiso del catálogo. Header canónico (Regla #5).
49386
+ */
49387
+ class ApiKeysModalComponent {
49388
+ constructor() {
49389
+ this.i18n = inject(I18nService);
49390
+ this.apiKeys = inject(ApiKeyService);
49391
+ /** Namespace i18n. */
49392
+ this.i18nNamespace = DEFAULT_NAMESPACE$2;
49393
+ this.keys = signal([]);
49394
+ this.availablePermissions = signal([]);
49395
+ this.loading = signal(true);
49396
+ this.showCreate = signal(false);
49397
+ this.submitting = signal(false);
49398
+ this.errorMsg = signal('');
49399
+ this.secret = signal(null);
49400
+ this.copied = signal(false);
49401
+ this.name = '';
49402
+ this.expiresInDays = null;
49403
+ this.selectedPerms = signal(new Set());
49404
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$2)) {
49405
+ this.i18n.registerContent(DEFAULT_NAMESPACE$2, API_KEYS_MODAL_I18N);
49406
+ }
49407
+ }
49408
+ ngOnInit() {
49409
+ if (!this.i18n.hasNamespace(this.i18nNamespace)) {
49410
+ this.i18n.registerContent(this.i18nNamespace, API_KEYS_MODAL_I18N);
49411
+ }
49412
+ this.refresh();
49413
+ this.apiKeys.availablePermissions().subscribe({
49414
+ next: perms => this.availablePermissions.set(perms),
49415
+ error: () => { },
49416
+ });
49417
+ }
49418
+ refresh() {
49419
+ this.loading.set(true);
49420
+ this.apiKeys.list().subscribe({
49421
+ next: keys => {
49422
+ this.keys.set(keys);
49423
+ this.loading.set(false);
49424
+ },
49425
+ error: () => this.loading.set(false),
49426
+ });
49427
+ }
49428
+ openCreate() {
49429
+ this.errorMsg.set('');
49430
+ this.name = '';
49431
+ this.expiresInDays = null;
49432
+ this.selectedPerms.set(new Set());
49433
+ this.showCreate.set(true);
49434
+ }
49435
+ togglePerm(perm, ev) {
49436
+ const checked = ev.detail?.checked ?? false;
49437
+ const next = new Set(this.selectedPerms());
49438
+ if (checked) {
49439
+ next.add(perm);
49440
+ }
49441
+ else {
49442
+ next.delete(perm);
49443
+ }
49444
+ this.selectedPerms.set(next);
49445
+ }
49446
+ submit() {
49447
+ this.errorMsg.set('');
49448
+ if (!this.name.trim()) {
49449
+ this.errorMsg.set(this.t('noName'));
49450
+ return;
49451
+ }
49452
+ const permissions = Array.from(this.selectedPerms());
49453
+ if (permissions.length === 0) {
49454
+ this.errorMsg.set(this.t('noPerms'));
49455
+ return;
49456
+ }
49457
+ this.submitting.set(true);
49458
+ this.apiKeys
49459
+ .create({
49460
+ name: this.name.trim(),
49461
+ permissions,
49462
+ expiresInDays: this.expiresInDays && this.expiresInDays > 0 ? this.expiresInDays : undefined,
49463
+ })
49464
+ .subscribe({
49465
+ next: res => {
49466
+ this.submitting.set(false);
49467
+ this.showCreate.set(false);
49468
+ this.secret.set(res.key);
49469
+ },
49470
+ error: err => {
49471
+ this.submitting.set(false);
49472
+ this.errorMsg.set(err?.error?.message ?? this.t('genericError'));
49473
+ },
49474
+ });
49475
+ }
49476
+ revoke(key) {
49477
+ if (!confirm(this.t('revokeConfirm')))
49478
+ return;
49479
+ this.apiKeys.revoke(key.keyId).subscribe({
49480
+ next: () => this.refresh(),
49481
+ error: err => this.errorMsg.set(err?.error?.message ?? this.t('genericError')),
49482
+ });
49483
+ }
49484
+ async copy(secret) {
49485
+ try {
49486
+ await navigator.clipboard.writeText(secret);
49487
+ this.copied.set(true);
49488
+ }
49489
+ catch {
49490
+ // clipboard no disponible — el user puede seleccionar el texto manualmente
49491
+ }
49492
+ }
49493
+ finishSecret() {
49494
+ this.secret.set(null);
49495
+ this.copied.set(false);
49496
+ this.refresh();
49497
+ }
49498
+ dismiss() {
49499
+ this._modalRef?.dismiss(null, 'cancel');
49500
+ }
49501
+ t(key) {
49502
+ return this.i18n.t(key, this.i18nNamespace);
49503
+ }
49504
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeysModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
49505
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ApiKeysModalComponent, isStandalone: true, selector: "val-api-keys-modal", inputs: { _modalRef: "_modalRef", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
49506
+ <ion-header>
49507
+ <ion-toolbar>
49508
+ <ion-buttons slot="end">
49509
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
49510
+ <strong>{{ t('close') }}</strong>
49511
+ </ion-button>
49512
+ </ion-buttons>
49513
+ </ion-toolbar>
49514
+ </ion-header>
49515
+
49516
+ <ion-content class="ion-padding">
49517
+ <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
49518
+ <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
49519
+
49520
+ @if (secret(); as s) {
49521
+ <!-- Secreto recién creado: mostrar UNA vez -->
49522
+ <div class="apikey-secret">
49523
+ <val-title [props]="{ content: t('secretTitle'), size: 'large', color: '', bold: true }" />
49524
+ <p class="apikey-secret__warn">{{ t('secretWarning') }}</p>
49525
+ <div class="apikey-secret__box">
49526
+ <code>{{ s.secret }}</code>
49527
+ </div>
49528
+ <div class="apikey-actions">
49529
+ <ion-button expand="block" color="dark" (click)="copy(s.secret)">
49530
+ {{ copied() ? t('copied') : t('copy') }}
49531
+ </ion-button>
49532
+ <ion-button expand="block" fill="outline" color="dark" (click)="finishSecret()">
49533
+ {{ t('done') }}
49534
+ </ion-button>
49535
+ </div>
49536
+ </div>
49537
+ } @else {
49538
+ @if (loading()) {
49539
+ <ion-spinner name="dots" />
49540
+ } @else {
49541
+ <!-- Lista -->
49542
+ @if (keys().length === 0) {
49543
+ <val-text [props]="{ content: t('empty'), size: 'medium', color: 'medium', bold: false }" />
49544
+ } @else {
49545
+ <div class="apikey-list">
49546
+ @for (k of keys(); track k.keyId) {
49547
+ <div class="apikey-row">
49548
+ <div class="apikey-row__main">
49549
+ <span class="apikey-row__name">{{ k.name }}</span>
49550
+ <span class="apikey-row__meta">
49551
+ {{ k.permissions.length }} {{ t('permsCount') }} · {{ t('lastUsed') }}:
49552
+ {{ k.lastUsedAt || t('never') }}
49553
+ </span>
49554
+ </div>
49555
+ <ion-button fill="clear" color="danger" size="small" (click)="revoke(k)">
49556
+ {{ t('revoke') }}
49557
+ </ion-button>
49558
+ </div>
49559
+ }
49560
+ </div>
49561
+ }
49562
+
49563
+ @if (errorMsg()) {
49564
+ <p class="apikey-error">{{ errorMsg() }}</p>
49565
+ }
49566
+
49567
+ <!-- Crear -->
49568
+ @if (showCreate()) {
49569
+ <div class="apikey-create">
49570
+ <ion-input
49571
+ label="{{ t('nameLabel') }}"
49572
+ labelPlacement="stacked"
49573
+ [placeholder]="t('namePlaceholder')"
49574
+ [(ngModel)]="name"
49575
+ />
49576
+ <p class="apikey-create__label">{{ t('permissionsLabel') }}</p>
49577
+ <div class="apikey-perms">
49578
+ @for (p of availablePermissions(); track p) {
49579
+ <ion-checkbox
49580
+ labelPlacement="end"
49581
+ [checked]="selectedPerms().has(p)"
49582
+ (ionChange)="togglePerm(p, $event)"
49583
+ >
49584
+ {{ p }}
49585
+ </ion-checkbox>
49586
+ }
49587
+ </div>
49588
+ <ion-input
49589
+ label="{{ t('expiresLabel') }}"
49590
+ labelPlacement="stacked"
49591
+ type="number"
49592
+ [(ngModel)]="expiresInDays"
49593
+ />
49594
+ <div class="apikey-actions">
49595
+ <ion-button expand="block" color="dark" [disabled]="submitting()" (click)="submit()">
49596
+ @if (submitting()) {
49597
+ <ion-spinner name="dots" />&nbsp;{{ t('creating') }}
49598
+ } @else {
49599
+ {{ t('create') }}
49600
+ }
49601
+ </ion-button>
49602
+ <ion-button expand="block" fill="clear" color="medium" (click)="showCreate.set(false)">
49603
+ {{ t('cancel') }}
49604
+ </ion-button>
49605
+ </div>
49606
+ </div>
49607
+ } @else {
49608
+ <div class="apikey-actions">
49609
+ <ion-button expand="block" color="primary" (click)="openCreate()">
49610
+ {{ t('newKey') }}
49611
+ </ion-button>
49612
+ </div>
49613
+ }
49614
+ }
49615
+ }
49616
+ </ion-content>
49617
+ `, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.apikey-list{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.apikey-row{display:flex;align-items:center;justify-content:space-between;padding:12px;border-radius:10px;border:1.5px solid var(--ion-color-light)}.apikey-row__main{display:flex;flex-direction:column}.apikey-row__name{font-weight:600;color:var(--ion-color-dark)}.apikey-row__meta{font-size:12px;color:var(--ion-color-medium-shade, #6b6e76)}.apikey-create{margin-top:8px;padding:16px;border-radius:12px;background:var(--ion-color-light)}.apikey-create__label{margin:12px 0 4px;font-size:13px;font-weight:600;color:var(--ion-color-dark)}.apikey-perms{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;font-size:13px}.apikey-actions{margin-top:16px;display:flex;flex-direction:column;gap:8px}.apikey-error{margin:8px 0;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.apikey-secret__warn{font-size:.875rem;color:var(--ion-color-warning-shade, #b88600);margin:0 0 12px}.apikey-secret__box{padding:12px;border-radius:8px;background:var(--ion-color-dark);color:#fff;word-break:break-all;font-family:monospace;font-size:13px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { 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"] }] }); }
49618
+ }
49619
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeysModalComponent, decorators: [{
49620
+ type: Component,
49621
+ args: [{ selector: 'val-api-keys-modal', standalone: true, imports: [
49622
+ FormsModule,
49623
+ IonHeader,
49624
+ IonToolbar,
49625
+ IonButtons,
49626
+ IonButton,
49627
+ IonContent,
49628
+ IonInput,
49629
+ IonCheckbox,
49630
+ IonSpinner,
49631
+ DisplayComponent,
49632
+ TextComponent,
49633
+ TitleComponent,
49634
+ ], template: `
49635
+ <ion-header>
49636
+ <ion-toolbar>
49637
+ <ion-buttons slot="end">
49638
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
49639
+ <strong>{{ t('close') }}</strong>
49640
+ </ion-button>
49641
+ </ion-buttons>
49642
+ </ion-toolbar>
49643
+ </ion-header>
49644
+
49645
+ <ion-content class="ion-padding">
49646
+ <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
49647
+ <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
49648
+
49649
+ @if (secret(); as s) {
49650
+ <!-- Secreto recién creado: mostrar UNA vez -->
49651
+ <div class="apikey-secret">
49652
+ <val-title [props]="{ content: t('secretTitle'), size: 'large', color: '', bold: true }" />
49653
+ <p class="apikey-secret__warn">{{ t('secretWarning') }}</p>
49654
+ <div class="apikey-secret__box">
49655
+ <code>{{ s.secret }}</code>
49656
+ </div>
49657
+ <div class="apikey-actions">
49658
+ <ion-button expand="block" color="dark" (click)="copy(s.secret)">
49659
+ {{ copied() ? t('copied') : t('copy') }}
49660
+ </ion-button>
49661
+ <ion-button expand="block" fill="outline" color="dark" (click)="finishSecret()">
49662
+ {{ t('done') }}
49663
+ </ion-button>
49664
+ </div>
49665
+ </div>
49666
+ } @else {
49667
+ @if (loading()) {
49668
+ <ion-spinner name="dots" />
49669
+ } @else {
49670
+ <!-- Lista -->
49671
+ @if (keys().length === 0) {
49672
+ <val-text [props]="{ content: t('empty'), size: 'medium', color: 'medium', bold: false }" />
49673
+ } @else {
49674
+ <div class="apikey-list">
49675
+ @for (k of keys(); track k.keyId) {
49676
+ <div class="apikey-row">
49677
+ <div class="apikey-row__main">
49678
+ <span class="apikey-row__name">{{ k.name }}</span>
49679
+ <span class="apikey-row__meta">
49680
+ {{ k.permissions.length }} {{ t('permsCount') }} · {{ t('lastUsed') }}:
49681
+ {{ k.lastUsedAt || t('never') }}
49682
+ </span>
49683
+ </div>
49684
+ <ion-button fill="clear" color="danger" size="small" (click)="revoke(k)">
49685
+ {{ t('revoke') }}
49686
+ </ion-button>
49687
+ </div>
49688
+ }
49689
+ </div>
49690
+ }
49691
+
49692
+ @if (errorMsg()) {
49693
+ <p class="apikey-error">{{ errorMsg() }}</p>
49694
+ }
49695
+
49696
+ <!-- Crear -->
49697
+ @if (showCreate()) {
49698
+ <div class="apikey-create">
49699
+ <ion-input
49700
+ label="{{ t('nameLabel') }}"
49701
+ labelPlacement="stacked"
49702
+ [placeholder]="t('namePlaceholder')"
49703
+ [(ngModel)]="name"
49704
+ />
49705
+ <p class="apikey-create__label">{{ t('permissionsLabel') }}</p>
49706
+ <div class="apikey-perms">
49707
+ @for (p of availablePermissions(); track p) {
49708
+ <ion-checkbox
49709
+ labelPlacement="end"
49710
+ [checked]="selectedPerms().has(p)"
49711
+ (ionChange)="togglePerm(p, $event)"
49712
+ >
49713
+ {{ p }}
49714
+ </ion-checkbox>
49715
+ }
49716
+ </div>
49717
+ <ion-input
49718
+ label="{{ t('expiresLabel') }}"
49719
+ labelPlacement="stacked"
49720
+ type="number"
49721
+ [(ngModel)]="expiresInDays"
49722
+ />
49723
+ <div class="apikey-actions">
49724
+ <ion-button expand="block" color="dark" [disabled]="submitting()" (click)="submit()">
49725
+ @if (submitting()) {
49726
+ <ion-spinner name="dots" />&nbsp;{{ t('creating') }}
49727
+ } @else {
49728
+ {{ t('create') }}
49729
+ }
49730
+ </ion-button>
49731
+ <ion-button expand="block" fill="clear" color="medium" (click)="showCreate.set(false)">
49732
+ {{ t('cancel') }}
49733
+ </ion-button>
49734
+ </div>
49735
+ </div>
49736
+ } @else {
49737
+ <div class="apikey-actions">
49738
+ <ion-button expand="block" color="primary" (click)="openCreate()">
49739
+ {{ t('newKey') }}
49740
+ </ion-button>
49741
+ </div>
49742
+ }
49743
+ }
49744
+ }
49745
+ </ion-content>
49746
+ `, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.apikey-list{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.apikey-row{display:flex;align-items:center;justify-content:space-between;padding:12px;border-radius:10px;border:1.5px solid var(--ion-color-light)}.apikey-row__main{display:flex;flex-direction:column}.apikey-row__name{font-weight:600;color:var(--ion-color-dark)}.apikey-row__meta{font-size:12px;color:var(--ion-color-medium-shade, #6b6e76)}.apikey-create{margin-top:8px;padding:16px;border-radius:12px;background:var(--ion-color-light)}.apikey-create__label{margin:12px 0 4px;font-size:13px;font-weight:600;color:var(--ion-color-dark)}.apikey-perms{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;font-size:13px}.apikey-actions{margin-top:16px;display:flex;flex-direction:column;gap:8px}.apikey-error{margin:8px 0;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.apikey-secret__warn{font-size:.875rem;color:var(--ion-color-warning-shade, #b88600);margin:0 0 12px}.apikey-secret__box{padding:12px;border-radius:8px;background:var(--ion-color-dark);color:#fff;word-break:break-all;font-family:monospace;font-size:13px}\n"] }]
49747
+ }], ctorParameters: () => [], propDecorators: { _modalRef: [{
49748
+ type: Input
49749
+ }], i18nNamespace: [{
49750
+ type: Input
49751
+ }] } });
49752
+
49275
49753
  /**
49276
49754
  * Defaults i18n (es/en) embebidos en `val-organization-view`. Auto-registrados en
49277
49755
  * el constructor del componente si el consumer no proveyó el namespace
@@ -49328,6 +49806,7 @@ const ORGANIZATION_VIEW_I18N = {
49328
49806
  inviteCtaHint: 'Invita a usuarios a unirse a tu organización.',
49329
49807
  inviteOpen: 'Invitar',
49330
49808
  importOpen: 'Importar',
49809
+ apiKeysOpen: 'API Keys',
49331
49810
  viewMemberCta: 'Ver miembro',
49332
49811
  roleViewer: 'Visor',
49333
49812
  roleEditor: 'Editor',
@@ -49398,6 +49877,7 @@ const ORGANIZATION_VIEW_I18N = {
49398
49877
  inviteCtaHint: 'Invite users to join your organization.',
49399
49878
  inviteOpen: 'Invite',
49400
49879
  importOpen: 'Import',
49880
+ apiKeysOpen: 'API Keys',
49401
49881
  viewMemberCta: 'View member',
49402
49882
  roleViewer: 'Viewer',
49403
49883
  roleEditor: 'Editor',
@@ -49621,6 +50101,14 @@ class OrganizationViewComponent {
49621
50101
  shape: 'round',
49622
50102
  type: 'button',
49623
50103
  }));
50104
+ this.openApiKeysButtonProps = computed(() => ({
50105
+ text: this.tt('apiKeysOpen'),
50106
+ color: 'dark',
50107
+ fill: 'clear',
50108
+ size: 'default',
50109
+ shape: 'round',
50110
+ type: 'button',
50111
+ }));
49624
50112
  /** Guarda para detectar el primer disparo del effect (evita doble carga). */
49625
50113
  this.lastLoadedOrgId = null;
49626
50114
  const ns = this.ns;
@@ -49740,6 +50228,17 @@ class OrganizationViewComponent {
49740
50228
  backdropDismiss: true,
49741
50229
  });
49742
50230
  }
50231
+ onOpenApiKeys() {
50232
+ void this.modalService.open({
50233
+ component: ApiKeysModalComponent,
50234
+ breakpoints: {
50235
+ breakpoints: [0, 0.92],
50236
+ initialBreakpoint: 0.92,
50237
+ showHandle: true,
50238
+ },
50239
+ backdropDismiss: true,
50240
+ });
50241
+ }
49743
50242
  onViewPermissions() {
49744
50243
  this.nav.navigateByUrl(this.resolvedConfig().viewPermissionsRoute);
49745
50244
  }
@@ -50127,6 +50626,7 @@ class OrganizationViewComponent {
50127
50626
  </div>
50128
50627
  <val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
50129
50628
  <val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
50629
+ <val-button [props]="openApiKeysButtonProps()" (click)="onOpenApiKeys()" />
50130
50630
  </div>
50131
50631
  </section>
50132
50632
  }
@@ -50236,6 +50736,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50236
50736
  MemberCardComponent,
50237
50737
  TransferOwnershipModalComponent,
50238
50738
  MemberImportModalComponent,
50739
+ ApiKeysModalComponent,
50239
50740
  ], template: `
50240
50741
  <div class="page">
50241
50742
  <header class="page-header">
@@ -50409,6 +50910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50409
50910
  </div>
50410
50911
  <val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
50411
50912
  <val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
50913
+ <val-button [props]="openApiKeysButtonProps()" (click)="onOpenApiKeys()" />
50412
50914
  </div>
50413
50915
  </section>
50414
50916
  }
@@ -61679,5 +62181,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
61679
62181
  * Generated bundle index. Do not edit.
61680
62182
  */
61681
62183
 
61682
- 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, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, 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, 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, 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_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, provideValtechAccountRoutes, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
62184
+ 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, 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, 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, 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_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, provideValtechAccountRoutes, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
61683
62185
  //# sourceMappingURL=valtech-components.mjs.map