valtech-components 2.0.993 → 2.0.995

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.993';
57
+ const VERSION = '2.0.995';
58
58
 
59
59
  // Control de estado de refresco (singleton a nivel de módulo)
60
60
  let isRefreshing = false;
@@ -8658,6 +8658,19 @@ class AuthService {
8658
8658
  .post(`${this.baseUrl}/reset-password`, request)
8659
8659
  .pipe(catchError(error => this.handleAuthError(error)));
8660
8660
  }
8661
+ /**
8662
+ * Activa una cuenta pre-aprovisionada por una organización (ADR-023): define
8663
+ * la contraseña con el token del enlace de email. En éxito el backend devuelve
8664
+ * tokens de auto-signin → el usuario queda logueado (mismo flujo que verify-email).
8665
+ */
8666
+ activateAccount(request) {
8667
+ this.stateService.clearError();
8668
+ return this.http.post(`${this.baseUrl}/activate`, request).pipe(tap(response => {
8669
+ if (response.activated && response.accessToken) {
8670
+ this.handleSuccessfulAuth(response);
8671
+ }
8672
+ }), catchError(error => this.handleAuthError(error)));
8673
+ }
8661
8674
  /**
8662
8675
  * Cambia la contraseña del usuario autenticado.
8663
8676
  * Requiere la contraseña actual para verificación.
@@ -41737,7 +41750,7 @@ const PROFILE_VIEW_I18N = {
41737
41750
  const HANDLE_PATTERN = /^[a-z_][a-z0-9_]*$/;
41738
41751
  const HANDLE_MIN = 3;
41739
41752
  const HANDLE_MAX = 20;
41740
- const DEFAULT_NAMESPACE$d = 'Settings.Profile';
41753
+ const DEFAULT_NAMESPACE$e = 'Settings.Profile';
41741
41754
  /**
41742
41755
  * `val-profile-view` — vista Perfil full-feature autocontenida (organism).
41743
41756
  *
@@ -41787,7 +41800,7 @@ class ProfileViewComponent {
41787
41800
  showPhone: merged.showPhone ?? true,
41788
41801
  showShareCta: merged.showShareCta ?? true,
41789
41802
  profileBaseUrl: merged.profileBaseUrl ?? '',
41790
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$d,
41803
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$e,
41791
41804
  onSaved: merged.onSaved,
41792
41805
  onAvatarUploaded: merged.onAvatarUploaded,
41793
41806
  };
@@ -42703,7 +42716,7 @@ const PREFERENCES_VIEW_I18N = {
42703
42716
  },
42704
42717
  };
42705
42718
 
42706
- const DEFAULT_NAMESPACE$c = 'Settings.General';
42719
+ const DEFAULT_NAMESPACE$d = 'Settings.General';
42707
42720
  const DEFAULT_LANGUAGES = ['es', 'en'];
42708
42721
  /**
42709
42722
  * `val-preferences-view` — vista de preferencias de UI cross-app (tema +
@@ -42740,7 +42753,7 @@ class PreferencesViewComponent {
42740
42753
  showLanguage: merged.showLanguage ?? true,
42741
42754
  showFontSize: merged.showFontSize ?? true,
42742
42755
  supportedLanguages: merged.supportedLanguages ?? DEFAULT_LANGUAGES,
42743
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$c,
42756
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$d,
42744
42757
  onThemeChanged: merged.onThemeChanged,
42745
42758
  onLanguageChanged: merged.onLanguageChanged,
42746
42759
  onFontSizeChanged: merged.onFontSizeChanged,
@@ -44552,7 +44565,7 @@ const SECURITY_VIEW_I18N = {
44552
44565
  };
44553
44566
 
44554
44567
  addIcons({ laptopOutline, phonePortraitOutline });
44555
- const DEFAULT_NAMESPACE$b = 'Settings.Security';
44568
+ const DEFAULT_NAMESPACE$c = 'Settings.Security';
44556
44569
  /**
44557
44570
  * `val-security-view` — vista Seguridad full-feature autocontenida (organism).
44558
44571
  *
@@ -44601,7 +44614,7 @@ class SecurityViewComponent {
44601
44614
  showChangeEmail: merged.showChangeEmail ?? true,
44602
44615
  showMfa: merged.showMfa ?? true,
44603
44616
  showPolicies: merged.showPolicies ?? true,
44604
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$b,
44617
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$c,
44605
44618
  handleDeepLinks: merged.handleDeepLinks ?? true,
44606
44619
  homeRoute: merged.homeRoute ?? '/app/home',
44607
44620
  onMfaCompleted: merged.onMfaCompleted,
@@ -45403,6 +45416,13 @@ class OrgService {
45403
45416
  inviteUser(orgId, req) {
45404
45417
  return this.http.post(`${this.baseUrl}/${orgId}/invite`, req);
45405
45418
  }
45419
+ /**
45420
+ * Crea/asigna miembros en masa (ADR-023). Resultado por-fila (partial success):
45421
+ * `created` (pre-aprovisionado), `assigned` (ya existía), `skipped`, `error`.
45422
+ */
45423
+ importMembers(orgId, req) {
45424
+ return this.http.post(`${this.baseUrl}/${orgId}/members/import`, req);
45425
+ }
45406
45426
  leaveOrg(orgId) {
45407
45427
  return this.http.post(`${this.baseUrl}/${orgId}/leave`, {});
45408
45428
  }
@@ -45507,7 +45527,7 @@ const CREATE_ORG_MODAL_I18N = {
45507
45527
  },
45508
45528
  };
45509
45529
 
45510
- const DEFAULT_NAMESPACE$a = 'CreateOrgModal';
45530
+ const DEFAULT_NAMESPACE$b = 'CreateOrgModal';
45511
45531
  /**
45512
45532
  * `val-create-org-modal` — modal de creación de organización (organism
45513
45533
  * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
@@ -45533,10 +45553,10 @@ class CreateOrgModalComponent {
45533
45553
  this.toast = inject(ToastService);
45534
45554
  this.errors = inject(ValtechErrorService);
45535
45555
  /** Namespace i18n con que la vista resuelve sus textos. */
45536
- this.i18nNamespace = DEFAULT_NAMESPACE$a;
45556
+ this.i18nNamespace = DEFAULT_NAMESPACE$b;
45537
45557
  this._busy = signal(false);
45538
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
45539
- this.i18n.registerContent(DEFAULT_NAMESPACE$a, CREATE_ORG_MODAL_I18N);
45558
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$b)) {
45559
+ this.i18n.registerContent(DEFAULT_NAMESPACE$b, CREATE_ORG_MODAL_I18N);
45540
45560
  }
45541
45561
  this.formMeta = signal(this.buildFormMeta());
45542
45562
  effect(() => {
@@ -45772,7 +45792,7 @@ const DELETE_ACCOUNT_MODAL_I18N = {
45772
45792
  },
45773
45793
  };
45774
45794
 
45775
- const DEFAULT_NAMESPACE$9 = 'Settings.DeleteAccount';
45795
+ const DEFAULT_NAMESPACE$a = 'Settings.DeleteAccount';
45776
45796
  /**
45777
45797
  * `val-delete-account-modal` — modal de eliminación de cuenta (organism,
45778
45798
  * cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.
@@ -45798,7 +45818,7 @@ class DeleteAccountModalComponent {
45798
45818
  this.i18n = inject(I18nService);
45799
45819
  this.toast = inject(ToastService);
45800
45820
  /** Namespace i18n con que la vista resuelve sus textos. */
45801
- this.i18nNamespace = DEFAULT_NAMESPACE$9;
45821
+ this.i18nNamespace = DEFAULT_NAMESPACE$a;
45802
45822
  this.hasPassword = signal(null);
45803
45823
  this.codeSent = signal(false);
45804
45824
  this.formState = signal(ComponentStates.ENABLED);
@@ -45865,8 +45885,8 @@ class DeleteAccountModalComponent {
45865
45885
  ],
45866
45886
  actions: this.submitBtn('delete-code-submit', 'confirmCta'),
45867
45887
  }));
45868
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$9)) {
45869
- this.i18n.registerContent(DEFAULT_NAMESPACE$9, DELETE_ACCOUNT_MODAL_I18N);
45888
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
45889
+ this.i18n.registerContent(DEFAULT_NAMESPACE$a, DELETE_ACCOUNT_MODAL_I18N);
45870
45890
  }
45871
45891
  }
45872
45892
  ngOnInit() {
@@ -46067,7 +46087,7 @@ const ORG_INFO_SHEET_I18N = {
46067
46087
  },
46068
46088
  };
46069
46089
 
46070
- const DEFAULT_NAMESPACE$8 = 'OrgInfoSheet';
46090
+ const DEFAULT_NAMESPACE$9 = 'OrgInfoSheet';
46071
46091
  /**
46072
46092
  * `val-org-info-sheet` — sheet informativo "¿Qué son las organizaciones?".
46073
46093
  * Extraído del `OrgInfoSheetComponent` inline de `AccountPage` bajo el proceso de
@@ -46112,15 +46132,15 @@ class OrgInfoSheetComponent {
46112
46132
  text: this.closeProps.text || this.resolvedCloseLabel(),
46113
46133
  }));
46114
46134
  addIcons({ peopleOutline, swapHorizontalOutline, mailOutline });
46115
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$8)) {
46116
- this.i18n.registerContent(DEFAULT_NAMESPACE$8, ORG_INFO_SHEET_I18N);
46135
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$9)) {
46136
+ this.i18n.registerContent(DEFAULT_NAMESPACE$9, ORG_INFO_SHEET_I18N);
46117
46137
  }
46118
46138
  }
46119
46139
  dismiss() {
46120
46140
  this._modalRef?.dismiss(null, 'cancel');
46121
46141
  }
46122
46142
  tt(key) {
46123
- return this.i18n.t(key, DEFAULT_NAMESPACE$8);
46143
+ return this.i18n.t(key, DEFAULT_NAMESPACE$9);
46124
46144
  }
46125
46145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46126
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: `
@@ -46287,7 +46307,7 @@ const SWITCH_ORG_MODAL_I18N = {
46287
46307
  },
46288
46308
  };
46289
46309
 
46290
- const DEFAULT_NAMESPACE$7 = 'Settings.SwitchOrg';
46310
+ const DEFAULT_NAMESPACE$8 = 'Settings.SwitchOrg';
46291
46311
  addIcons({ businessOutline, checkmarkCircleOutline });
46292
46312
  /**
46293
46313
  * `val-switch-org-modal` — modal de cambio de organización activa (organism
@@ -46313,7 +46333,7 @@ class SwitchOrgModalComponent {
46313
46333
  this.orgSwitch = inject(OrgSwitchService);
46314
46334
  this.errors = inject(ValtechErrorService);
46315
46335
  /** Namespace i18n con que la vista resuelve sus textos. */
46316
- this.i18nNamespace = DEFAULT_NAMESPACE$7;
46336
+ this.i18nNamespace = DEFAULT_NAMESPACE$8;
46317
46337
  this.orgs = signal([]);
46318
46338
  this.loading = signal(false);
46319
46339
  this.query = signal('');
@@ -46329,8 +46349,8 @@ class SwitchOrgModalComponent {
46329
46349
  return list;
46330
46350
  return list.filter(o => o.name.toLowerCase().includes(q));
46331
46351
  });
46332
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$7)) {
46333
- this.i18n.registerContent(DEFAULT_NAMESPACE$7, SWITCH_ORG_MODAL_I18N);
46352
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$8)) {
46353
+ this.i18n.registerContent(DEFAULT_NAMESPACE$8, SWITCH_ORG_MODAL_I18N);
46334
46354
  }
46335
46355
  this.loadOrgs();
46336
46356
  }
@@ -46648,7 +46668,7 @@ const ACCOUNT_VIEW_I18N = {
46648
46668
  };
46649
46669
 
46650
46670
  addIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline });
46651
- const DEFAULT_NAMESPACE$6 = 'Settings.Account';
46671
+ const DEFAULT_NAMESPACE$7 = 'Settings.Account';
46652
46672
  const DEFAULT_MANAGE_ORG_ROUTE = '/app/settings/organization';
46653
46673
  /**
46654
46674
  * `val-account-view` — vista Cuenta full-feature autocontenida (organism).
@@ -46689,7 +46709,7 @@ class AccountViewComponent {
46689
46709
  showNewOrgCta: merged.showNewOrgCta ?? true,
46690
46710
  showLogout: merged.showLogout ?? true,
46691
46711
  showDeleteAccount: merged.showDeleteAccount ?? true,
46692
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$6,
46712
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$7,
46693
46713
  manageOrgRoute: merged.manageOrgRoute ?? DEFAULT_MANAGE_ORG_ROUTE,
46694
46714
  onOrgSwitched: merged.onOrgSwitched,
46695
46715
  onOrgCreated: merged.onOrgCreated,
@@ -47414,7 +47434,7 @@ const EDIT_ORG_MODAL_I18N = {
47414
47434
  },
47415
47435
  };
47416
47436
 
47417
- const DEFAULT_NAMESPACE$5 = 'EditOrgModal';
47437
+ const DEFAULT_NAMESPACE$6 = 'EditOrgModal';
47418
47438
  /**
47419
47439
  * `val-edit-org-modal` — modal de edición de organización (nombre + descripción).
47420
47440
  * Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por la vista de
@@ -47441,10 +47461,10 @@ class EditOrgModalComponent {
47441
47461
  /** Organización a editar (pasada por `componentProps`). */
47442
47462
  this.org = null;
47443
47463
  /** Namespace i18n con que la vista resuelve sus textos. */
47444
- this.i18nNamespace = DEFAULT_NAMESPACE$5;
47464
+ this.i18nNamespace = DEFAULT_NAMESPACE$6;
47445
47465
  this.saving = signal(false);
47446
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$5)) {
47447
- this.i18n.registerContent(DEFAULT_NAMESPACE$5, EDIT_ORG_MODAL_I18N);
47466
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$6)) {
47467
+ this.i18n.registerContent(DEFAULT_NAMESPACE$6, EDIT_ORG_MODAL_I18N);
47448
47468
  }
47449
47469
  this.formMeta = signal(this.buildFormMeta());
47450
47470
  effect(() => {
@@ -47682,7 +47702,7 @@ const INVITE_MEMBER_MODAL_I18N = {
47682
47702
  },
47683
47703
  };
47684
47704
 
47685
- const DEFAULT_NAMESPACE$4 = 'InviteModal';
47705
+ const DEFAULT_NAMESPACE$5 = 'InviteModal';
47686
47706
  addIcons({ personOutline, mailOutline, closeOutline, checkmarkCircleOutline });
47687
47707
  /**
47688
47708
  * `val-invite-member-modal` — invitación de miembros a una organización.
@@ -47713,7 +47733,7 @@ class InviteMemberModalComponent {
47713
47733
  /** Ids de miembros ya existentes (excluidos de los resultados). */
47714
47734
  this.existingMemberIds = [];
47715
47735
  /** Namespace i18n con que la vista resuelve sus textos. */
47716
- this.i18nNamespace = DEFAULT_NAMESPACE$4;
47736
+ this.i18nNamespace = DEFAULT_NAMESPACE$5;
47717
47737
  this.query = signal('');
47718
47738
  this.searching = signal(false);
47719
47739
  this.searchResults = signal([]);
@@ -47760,8 +47780,8 @@ class InviteMemberModalComponent {
47760
47780
  state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
47761
47781
  }));
47762
47782
  this.searchSubject = new Subject();
47763
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
47764
- this.i18n.registerContent(DEFAULT_NAMESPACE$4, INVITE_MEMBER_MODAL_I18N);
47783
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$5)) {
47784
+ this.i18n.registerContent(DEFAULT_NAMESPACE$5, INVITE_MEMBER_MODAL_I18N);
47765
47785
  }
47766
47786
  this.loadRoles();
47767
47787
  this.roleSub = this.roleControl.valueChanges.subscribe(v => {
@@ -48250,7 +48270,7 @@ const MEMBER_DETAIL_MODAL_I18N = {
48250
48270
  },
48251
48271
  };
48252
48272
 
48253
- const DEFAULT_NAMESPACE$3 = 'Settings.MemberDetail';
48273
+ const DEFAULT_NAMESPACE$4 = 'Settings.MemberDetail';
48254
48274
  /**
48255
48275
  * `val-member-detail-modal` — detalle de miembro de organización: perfil, rol y
48256
48276
  * permisos. Promovido desde `showcase` bajo el proceso de ADR-021.
@@ -48287,7 +48307,7 @@ class MemberDetailModalComponent {
48287
48307
  { id: 'admin', name: 'admin' },
48288
48308
  ];
48289
48309
  /** Namespace i18n con que la vista resuelve sus textos. */
48290
- this.i18nNamespace = DEFAULT_NAMESPACE$3;
48310
+ this.i18nNamespace = DEFAULT_NAMESPACE$4;
48291
48311
  this.working = signal(false);
48292
48312
  this.currentRole = signal('');
48293
48313
  this.roleControl = new FormControl('');
@@ -48327,8 +48347,8 @@ class MemberDetailModalComponent {
48327
48347
  type: 'button',
48328
48348
  state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
48329
48349
  }));
48330
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$3)) {
48331
- this.i18n.registerContent(DEFAULT_NAMESPACE$3, MEMBER_DETAIL_MODAL_I18N);
48350
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
48351
+ this.i18n.registerContent(DEFAULT_NAMESPACE$4, MEMBER_DETAIL_MODAL_I18N);
48332
48352
  }
48333
48353
  }
48334
48354
  ngOnInit() {
@@ -48665,7 +48685,7 @@ const TRANSFER_OWNERSHIP_MODAL_I18N = {
48665
48685
  },
48666
48686
  };
48667
48687
 
48668
- const DEFAULT_NAMESPACE$2 = 'Settings.TransferModal';
48688
+ const DEFAULT_NAMESPACE$3 = 'Settings.TransferModal';
48669
48689
  /**
48670
48690
  * `val-transfer-ownership-modal` — selector de miembro para transferir la
48671
48691
  * propiedad de la organización. Promovido desde `showcase` bajo el proceso de
@@ -48689,7 +48709,7 @@ class TransferOwnershipModalComponent {
48689
48709
  /** Lista de miembros transferibles (todos excepto el owner actual). */
48690
48710
  this.members = [];
48691
48711
  /** Namespace i18n con que la vista resuelve sus textos. */
48692
- this.i18nNamespace = DEFAULT_NAMESPACE$2;
48712
+ this.i18nNamespace = DEFAULT_NAMESPACE$3;
48693
48713
  this.query = signal('');
48694
48714
  this.selectedId = signal('');
48695
48715
  this.filtered = computed(() => {
@@ -48701,8 +48721,8 @@ class TransferOwnershipModalComponent {
48701
48721
  m.userId.toLowerCase().includes(q));
48702
48722
  });
48703
48723
  this.noResultsLabel = computed(() => `${this.t('noResults')} "${this.query()}"`);
48704
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$2)) {
48705
- this.i18n.registerContent(DEFAULT_NAMESPACE$2, TRANSFER_OWNERSHIP_MODAL_I18N);
48724
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$3)) {
48725
+ this.i18n.registerContent(DEFAULT_NAMESPACE$3, TRANSFER_OWNERSHIP_MODAL_I18N);
48706
48726
  }
48707
48727
  }
48708
48728
  ngOnInit() {
@@ -48887,6 +48907,371 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48887
48907
  type: Input
48888
48908
  }] } });
48889
48909
 
48910
+ /**
48911
+ * Defaults i18n (es/en) embebidos en `val-member-import-modal` (ADR-023).
48912
+ * Auto-registrados si el consumer no proveyó el namespace `Settings.ImportModal`.
48913
+ */
48914
+ const MEMBER_IMPORT_MODAL_I18N = {
48915
+ es: {
48916
+ title: 'Importar miembros',
48917
+ hint: 'Pega un CSV con columnas: email, nombre, rol (una fila por persona).',
48918
+ csvPlaceholder: 'email,nombre,rol\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
48919
+ rolesAvailable: 'Roles disponibles:',
48920
+ onConflictLabel: 'Si el email ya existe',
48921
+ conflictAssign: 'Asignar el rol',
48922
+ conflictSkip: 'Omitir',
48923
+ conflictError: 'Marcar error',
48924
+ sendActivation: 'Enviar email de activación a las cuentas nuevas',
48925
+ submit: 'Importar',
48926
+ submitting: 'Importando...',
48927
+ parseError: 'No se pudo interpretar el CSV. Revisa el formato.',
48928
+ noRows: 'Pega al menos una fila válida (email y rol).',
48929
+ summary: 'Resumen',
48930
+ created: 'creados',
48931
+ assigned: 'asignados',
48932
+ skipped: 'omitidos',
48933
+ failed: 'con error',
48934
+ colEmail: 'Email',
48935
+ colStatus: 'Estado',
48936
+ colDetail: 'Detalle',
48937
+ activationSent: 'activación enviada',
48938
+ activationPending: 'activación pendiente',
48939
+ again: 'Importar otro lote',
48940
+ close: 'Cerrar',
48941
+ genericError: 'No se pudo completar la importación. Intenta de nuevo.',
48942
+ },
48943
+ en: {
48944
+ title: 'Import members',
48945
+ hint: 'Paste a CSV with columns: email, name, role (one row per person).',
48946
+ csvPlaceholder: 'email,name,role\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
48947
+ rolesAvailable: 'Available roles:',
48948
+ onConflictLabel: 'If the email already exists',
48949
+ conflictAssign: 'Assign the role',
48950
+ conflictSkip: 'Skip',
48951
+ conflictError: 'Mark as error',
48952
+ sendActivation: 'Send activation email to new accounts',
48953
+ submit: 'Import',
48954
+ submitting: 'Importing...',
48955
+ parseError: "Couldn't parse the CSV. Check the format.",
48956
+ noRows: 'Paste at least one valid row (email and role).',
48957
+ summary: 'Summary',
48958
+ created: 'created',
48959
+ assigned: 'assigned',
48960
+ skipped: 'skipped',
48961
+ failed: 'failed',
48962
+ colEmail: 'Email',
48963
+ colStatus: 'Status',
48964
+ colDetail: 'Detail',
48965
+ activationSent: 'activation sent',
48966
+ activationPending: 'activation pending',
48967
+ again: 'Import another batch',
48968
+ close: 'Close',
48969
+ genericError: "Couldn't complete the import. Try again.",
48970
+ },
48971
+ };
48972
+
48973
+ const DEFAULT_NAMESPACE$2 = 'Settings.ImportModal';
48974
+ /**
48975
+ * `val-member-import-modal` — panel de carga masiva de miembros (ADR-023 fase 6).
48976
+ *
48977
+ * El admin pega un CSV (`email,nombre,rol`); el modal lo parsea a filas y llama
48978
+ * `OrgService.importMembers`. Muestra el resultado por-fila (partial success):
48979
+ * `created` / `assigned` / `skipped` / `error`. Header canónico (Regla #5).
48980
+ *
48981
+ * Auto-registra defaults i18n (es/en) en `Settings.ImportModal`.
48982
+ */
48983
+ class MemberImportModalComponent {
48984
+ constructor() {
48985
+ this.i18n = inject(I18nService);
48986
+ this.orgService = inject(OrgService);
48987
+ /** Org destino del import. */
48988
+ this.orgId = '';
48989
+ /** Nombres de roles disponibles (para el hint). Opcional. */
48990
+ this.availableRoles = [];
48991
+ /** Namespace i18n. */
48992
+ this.i18nNamespace = DEFAULT_NAMESPACE$2;
48993
+ this.csv = '';
48994
+ this.onConflict = 'assignRole';
48995
+ this.sendActivation = true;
48996
+ this.submitting = signal(false);
48997
+ this.errorMsg = signal('');
48998
+ this.results = signal(null);
48999
+ this.rolesHint = computed(() => this.availableRoles.length ? `${this.t('rolesAvailable')} ${this.availableRoles.join(', ')}` : '');
49000
+ this.summaryLabel = computed(() => {
49001
+ const s = this.results()?.summary;
49002
+ if (!s)
49003
+ return this.t('summary');
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
+ });
49006
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$2)) {
49007
+ this.i18n.registerContent(DEFAULT_NAMESPACE$2, MEMBER_IMPORT_MODAL_I18N);
49008
+ }
49009
+ }
49010
+ ngOnInit() {
49011
+ if (!this.i18n.hasNamespace(this.i18nNamespace)) {
49012
+ this.i18n.registerContent(this.i18nNamespace, MEMBER_IMPORT_MODAL_I18N);
49013
+ }
49014
+ }
49015
+ /** Parsea el CSV pegado a filas {email,name,roleName}. Tolera header. */
49016
+ parseCsv() {
49017
+ const rows = [];
49018
+ for (const raw of this.csv.split(/\r?\n/)) {
49019
+ const line = raw.trim();
49020
+ if (!line)
49021
+ continue;
49022
+ const cols = line.split(',').map(c => c.trim());
49023
+ const email = (cols[0] ?? '').toLowerCase();
49024
+ // Saltar header (primera col "email") o líneas sin @.
49025
+ if (!email || !email.includes('@'))
49026
+ continue;
49027
+ rows.push({ email, name: cols[1] ?? '', roleName: cols[2] ?? '' });
49028
+ }
49029
+ return rows;
49030
+ }
49031
+ submit() {
49032
+ this.errorMsg.set('');
49033
+ const users = this.parseCsv();
49034
+ if (users.length === 0) {
49035
+ this.errorMsg.set(this.t('noRows'));
49036
+ return;
49037
+ }
49038
+ if (users.some(u => !u.roleName)) {
49039
+ this.errorMsg.set(this.t('parseError'));
49040
+ return;
49041
+ }
49042
+ this.submitting.set(true);
49043
+ this.orgService
49044
+ .importMembers(this.orgId, {
49045
+ users,
49046
+ onConflict: this.onConflict,
49047
+ sendActivation: this.sendActivation,
49048
+ })
49049
+ .subscribe({
49050
+ next: res => {
49051
+ this.submitting.set(false);
49052
+ this.results.set(res);
49053
+ // Refrescar lista del consumer si hubo altas/asignaciones efectivas.
49054
+ if (res.summary.created + res.summary.assigned > 0) {
49055
+ this.onSuccess?.();
49056
+ }
49057
+ },
49058
+ error: err => {
49059
+ this.submitting.set(false);
49060
+ this.errorMsg.set(err?.error?.message ?? this.t('genericError'));
49061
+ },
49062
+ });
49063
+ }
49064
+ statusLabel(r) {
49065
+ const base = this.t(r.status === 'error' ? 'failed' : r.status);
49066
+ if (r.status === 'created' && r.activation) {
49067
+ return `${base} · ${this.t(r.activation === 'sent' ? 'activationSent' : 'activationPending')}`;
49068
+ }
49069
+ return base;
49070
+ }
49071
+ reset() {
49072
+ this.csv = '';
49073
+ this.errorMsg.set('');
49074
+ this.results.set(null);
49075
+ }
49076
+ dismiss() {
49077
+ this._modalRef?.dismiss(null, 'cancel');
49078
+ }
49079
+ t(key) {
49080
+ return this.i18n.t(key, this.i18nNamespace);
49081
+ }
49082
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
49083
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MemberImportModalComponent, isStandalone: true, selector: "val-member-import-modal", inputs: { orgId: "orgId", availableRoles: "availableRoles", onSuccess: "onSuccess", _modalRef: "_modalRef", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
49084
+ <ion-header>
49085
+ <ion-toolbar>
49086
+ <ion-buttons slot="end">
49087
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
49088
+ <strong>{{ t('close') }}</strong>
49089
+ </ion-button>
49090
+ </ion-buttons>
49091
+ </ion-toolbar>
49092
+ </ion-header>
49093
+
49094
+ <ion-content class="ion-padding">
49095
+ <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
49096
+
49097
+ @if (!results()) {
49098
+ <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
49099
+
49100
+ @if (rolesHint()) {
49101
+ <val-text [props]="{ content: rolesHint(), size: 'small', color: 'medium', bold: false }" />
49102
+ }
49103
+
49104
+ <ion-textarea
49105
+ class="import-csv"
49106
+ [autoGrow]="true"
49107
+ [rows]="6"
49108
+ [placeholder]="t('csvPlaceholder')"
49109
+ [(ngModel)]="csv"
49110
+ />
49111
+
49112
+ <ion-select
49113
+ class="import-conflict"
49114
+ label="{{ t('onConflictLabel') }}"
49115
+ labelPlacement="stacked"
49116
+ interface="popover"
49117
+ [(ngModel)]="onConflict"
49118
+ >
49119
+ <ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
49120
+ <ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
49121
+ <ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
49122
+ </ion-select>
49123
+
49124
+ <ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
49125
+ {{ t('sendActivation') }}
49126
+ </ion-checkbox>
49127
+
49128
+ @if (errorMsg()) {
49129
+ <p class="import-error">{{ errorMsg() }}</p>
49130
+ }
49131
+
49132
+ <div class="import-actions">
49133
+ <ion-button expand="block" color="dark" [disabled]="submitting()" (click)="submit()">
49134
+ @if (submitting()) {
49135
+ <ion-spinner name="dots" />
49136
+ &nbsp;{{ t('submitting') }}
49137
+ } @else {
49138
+ {{ t('submit') }}
49139
+ }
49140
+ </ion-button>
49141
+ </div>
49142
+ } @else {
49143
+ <!-- Resultados -->
49144
+ <val-title [props]="{ content: summaryLabel(), size: 'large', color: '', bold: true }" />
49145
+ <div class="import-results">
49146
+ @for (r of results()!.results; track r.email) {
49147
+ <div class="import-row import-row--{{ r.status }}">
49148
+ <span class="import-row__email">{{ r.email }}</span>
49149
+ <span class="import-row__status">{{ statusLabel(r) }}</span>
49150
+ @if (r.reason) {
49151
+ <span class="import-row__reason">{{ r.reason }}</span>
49152
+ }
49153
+ </div>
49154
+ }
49155
+ </div>
49156
+ <div class="import-actions">
49157
+ <ion-button expand="block" fill="outline" color="dark" (click)="reset()">
49158
+ {{ t('again') }}
49159
+ </ion-button>
49160
+ </div>
49161
+ }
49162
+ </ion-content>
49163
+ `, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size:13px}.import-conflict{margin-bottom:12px}.import-activation{display:block;margin-bottom:16px;font-size:14px}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\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: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "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"] }] }); }
49164
+ }
49165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, decorators: [{
49166
+ type: Component,
49167
+ args: [{ selector: 'val-member-import-modal', standalone: true, imports: [
49168
+ FormsModule,
49169
+ IonHeader,
49170
+ IonToolbar,
49171
+ IonButtons,
49172
+ IonButton,
49173
+ IonContent,
49174
+ IonTextarea,
49175
+ IonSelect,
49176
+ IonSelectOption,
49177
+ IonCheckbox,
49178
+ IonSpinner,
49179
+ DisplayComponent,
49180
+ TextComponent,
49181
+ TitleComponent,
49182
+ ], template: `
49183
+ <ion-header>
49184
+ <ion-toolbar>
49185
+ <ion-buttons slot="end">
49186
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
49187
+ <strong>{{ t('close') }}</strong>
49188
+ </ion-button>
49189
+ </ion-buttons>
49190
+ </ion-toolbar>
49191
+ </ion-header>
49192
+
49193
+ <ion-content class="ion-padding">
49194
+ <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
49195
+
49196
+ @if (!results()) {
49197
+ <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
49198
+
49199
+ @if (rolesHint()) {
49200
+ <val-text [props]="{ content: rolesHint(), size: 'small', color: 'medium', bold: false }" />
49201
+ }
49202
+
49203
+ <ion-textarea
49204
+ class="import-csv"
49205
+ [autoGrow]="true"
49206
+ [rows]="6"
49207
+ [placeholder]="t('csvPlaceholder')"
49208
+ [(ngModel)]="csv"
49209
+ />
49210
+
49211
+ <ion-select
49212
+ class="import-conflict"
49213
+ label="{{ t('onConflictLabel') }}"
49214
+ labelPlacement="stacked"
49215
+ interface="popover"
49216
+ [(ngModel)]="onConflict"
49217
+ >
49218
+ <ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
49219
+ <ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
49220
+ <ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
49221
+ </ion-select>
49222
+
49223
+ <ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
49224
+ {{ t('sendActivation') }}
49225
+ </ion-checkbox>
49226
+
49227
+ @if (errorMsg()) {
49228
+ <p class="import-error">{{ errorMsg() }}</p>
49229
+ }
49230
+
49231
+ <div class="import-actions">
49232
+ <ion-button expand="block" color="dark" [disabled]="submitting()" (click)="submit()">
49233
+ @if (submitting()) {
49234
+ <ion-spinner name="dots" />
49235
+ &nbsp;{{ t('submitting') }}
49236
+ } @else {
49237
+ {{ t('submit') }}
49238
+ }
49239
+ </ion-button>
49240
+ </div>
49241
+ } @else {
49242
+ <!-- Resultados -->
49243
+ <val-title [props]="{ content: summaryLabel(), size: 'large', color: '', bold: true }" />
49244
+ <div class="import-results">
49245
+ @for (r of results()!.results; track r.email) {
49246
+ <div class="import-row import-row--{{ r.status }}">
49247
+ <span class="import-row__email">{{ r.email }}</span>
49248
+ <span class="import-row__status">{{ statusLabel(r) }}</span>
49249
+ @if (r.reason) {
49250
+ <span class="import-row__reason">{{ r.reason }}</span>
49251
+ }
49252
+ </div>
49253
+ }
49254
+ </div>
49255
+ <div class="import-actions">
49256
+ <ion-button expand="block" fill="outline" color="dark" (click)="reset()">
49257
+ {{ t('again') }}
49258
+ </ion-button>
49259
+ </div>
49260
+ }
49261
+ </ion-content>
49262
+ `, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size:13px}.import-conflict{margin-bottom:12px}.import-activation{display:block;margin-bottom:16px;font-size:14px}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"] }]
49263
+ }], ctorParameters: () => [], propDecorators: { orgId: [{
49264
+ type: Input
49265
+ }], availableRoles: [{
49266
+ type: Input
49267
+ }], onSuccess: [{
49268
+ type: Input
49269
+ }], _modalRef: [{
49270
+ type: Input
49271
+ }], i18nNamespace: [{
49272
+ type: Input
49273
+ }] } });
49274
+
48890
49275
  /**
48891
49276
  * Defaults i18n (es/en) embebidos en `val-organization-view`. Auto-registrados en
48892
49277
  * el constructor del componente si el consumer no proveyó el namespace
@@ -48942,6 +49327,7 @@ const ORGANIZATION_VIEW_I18N = {
48942
49327
  inviteCtaTitle: '¿Deseas agregar a alguien?',
48943
49328
  inviteCtaHint: 'Invita a usuarios a unirse a tu organización.',
48944
49329
  inviteOpen: 'Invitar',
49330
+ importOpen: 'Importar',
48945
49331
  viewMemberCta: 'Ver miembro',
48946
49332
  roleViewer: 'Visor',
48947
49333
  roleEditor: 'Editor',
@@ -49011,6 +49397,7 @@ const ORGANIZATION_VIEW_I18N = {
49011
49397
  inviteCtaTitle: 'Want to add someone?',
49012
49398
  inviteCtaHint: 'Invite users to join your organization.',
49013
49399
  inviteOpen: 'Invite',
49400
+ importOpen: 'Import',
49014
49401
  viewMemberCta: 'View member',
49015
49402
  roleViewer: 'Viewer',
49016
49403
  roleEditor: 'Editor',
@@ -49124,6 +49511,22 @@ class OrganizationViewComponent {
49124
49511
  this.members = signal([]);
49125
49512
  this.membersLoading = signal(false);
49126
49513
  this.membersLoadError = signal(null);
49514
+ this.membersErrorState = computed(() => {
49515
+ this.i18n.lang();
49516
+ const err = this.membersLoadError();
49517
+ if (!err)
49518
+ return null;
49519
+ return createErrorStateProps(err, {
49520
+ title: { offline: this.tt('offlineTitle'), error: this.tt('errorTitle') },
49521
+ description: {
49522
+ offline: this.tt('offlineHint'),
49523
+ error: interpretError(err).message,
49524
+ },
49525
+ retryLabel: this.tt('retry'),
49526
+ onRetry: () => this.loadMembers(),
49527
+ retrying: this.membersLoading(),
49528
+ });
49529
+ });
49127
49530
  this.membersNextToken = signal(null);
49128
49531
  this.loadingMoreMembers = signal(false);
49129
49532
  this.showAllMembers = signal(false);
@@ -49210,6 +49613,14 @@ class OrganizationViewComponent {
49210
49613
  shape: 'round',
49211
49614
  type: 'button',
49212
49615
  }));
49616
+ this.openImportButtonProps = computed(() => ({
49617
+ text: this.tt('importOpen'),
49618
+ color: 'dark',
49619
+ fill: 'outline',
49620
+ size: 'default',
49621
+ shape: 'round',
49622
+ type: 'button',
49623
+ }));
49213
49624
  /** Guarda para detectar el primer disparo del effect (evita doble carga). */
49214
49625
  this.lastLoadedOrgId = null;
49215
49626
  const ns = this.ns;
@@ -49310,6 +49721,25 @@ class OrganizationViewComponent {
49310
49721
  backdropDismiss: true,
49311
49722
  });
49312
49723
  }
49724
+ onOpenImport() {
49725
+ void this.modalService.open({
49726
+ component: MemberImportModalComponent,
49727
+ componentProps: {
49728
+ orgId: this.activeOrgId(),
49729
+ availableRoles: this.availableRoles().map(r => r.name),
49730
+ onSuccess: () => {
49731
+ this.loadMembers();
49732
+ this.resolvedConfig().onMemberInvited?.();
49733
+ },
49734
+ },
49735
+ breakpoints: {
49736
+ breakpoints: [0, 0.92],
49737
+ initialBreakpoint: 0.92,
49738
+ showHandle: true,
49739
+ },
49740
+ backdropDismiss: true,
49741
+ });
49742
+ }
49313
49743
  onViewPermissions() {
49314
49744
  this.nav.navigateByUrl(this.resolvedConfig().viewPermissionsRoute);
49315
49745
  }
@@ -49391,6 +49821,7 @@ class OrganizationViewComponent {
49391
49821
  if (!orgId)
49392
49822
  return Promise.resolve();
49393
49823
  this.membersLoading.set(true);
49824
+ this.membersLoadError.set(null);
49394
49825
  this.membersNextToken.set(null);
49395
49826
  this.showAllMembers.set(false);
49396
49827
  return new Promise(resolve => {
@@ -49601,6 +50032,8 @@ class OrganizationViewComponent {
49601
50032
  <div class="section-body">
49602
50033
  @if (membersLoading()) {
49603
50034
  <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
50035
+ } @else if (membersErrorState()) {
50036
+ <val-empty-state [props]="membersErrorState()!" />
49604
50037
  } @else if (members().length === 0) {
49605
50038
  <val-text
49606
50039
  [props]="{
@@ -49693,6 +50126,7 @@ class OrganizationViewComponent {
49693
50126
  />
49694
50127
  </div>
49695
50128
  <val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
50129
+ <val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
49696
50130
  </div>
49697
50131
  </section>
49698
50132
  }
@@ -49801,6 +50235,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49801
50235
  ButtonComponent,
49802
50236
  MemberCardComponent,
49803
50237
  TransferOwnershipModalComponent,
50238
+ MemberImportModalComponent,
49804
50239
  ], template: `
49805
50240
  <div class="page">
49806
50241
  <header class="page-header">
@@ -49879,6 +50314,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49879
50314
  <div class="section-body">
49880
50315
  @if (membersLoading()) {
49881
50316
  <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
50317
+ } @else if (membersErrorState()) {
50318
+ <val-empty-state [props]="membersErrorState()!" />
49882
50319
  } @else if (members().length === 0) {
49883
50320
  <val-text
49884
50321
  [props]="{
@@ -49971,6 +50408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49971
50408
  />
49972
50409
  </div>
49973
50410
  <val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
50411
+ <val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
49974
50412
  </div>
49975
50413
  </section>
49976
50414
  }
@@ -61241,5 +61679,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
61241
61679
  * Generated bundle index. Do not edit.
61242
61680
  */
61243
61681
 
61244
- 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, 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 };
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 };
61245
61683
  //# sourceMappingURL=valtech-components.mjs.map