valtech-components 2.0.994 → 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.994';
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;
@@ -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$d = 'Settings.Profile';
41753
+ const DEFAULT_NAMESPACE$e = '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$d,
41803
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$e,
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$c = 'Settings.General';
42719
+ const DEFAULT_NAMESPACE$d = '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$c,
42756
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$d,
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$b = 'Settings.Security';
44568
+ const DEFAULT_NAMESPACE$c = '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$b,
44617
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$c,
44618
44618
  handleDeepLinks: merged.handleDeepLinks ?? true,
44619
44619
  homeRoute: merged.homeRoute ?? '/app/home',
44620
44620
  onMfaCompleted: merged.onMfaCompleted,
@@ -45416,6 +45416,13 @@ class OrgService {
45416
45416
  inviteUser(orgId, req) {
45417
45417
  return this.http.post(`${this.baseUrl}/${orgId}/invite`, req);
45418
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
+ }
45419
45426
  leaveOrg(orgId) {
45420
45427
  return this.http.post(`${this.baseUrl}/${orgId}/leave`, {});
45421
45428
  }
@@ -45520,7 +45527,7 @@ const CREATE_ORG_MODAL_I18N = {
45520
45527
  },
45521
45528
  };
45522
45529
 
45523
- const DEFAULT_NAMESPACE$a = 'CreateOrgModal';
45530
+ const DEFAULT_NAMESPACE$b = 'CreateOrgModal';
45524
45531
  /**
45525
45532
  * `val-create-org-modal` — modal de creación de organización (organism
45526
45533
  * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
@@ -45546,10 +45553,10 @@ class CreateOrgModalComponent {
45546
45553
  this.toast = inject(ToastService);
45547
45554
  this.errors = inject(ValtechErrorService);
45548
45555
  /** Namespace i18n con que la vista resuelve sus textos. */
45549
- this.i18nNamespace = DEFAULT_NAMESPACE$a;
45556
+ this.i18nNamespace = DEFAULT_NAMESPACE$b;
45550
45557
  this._busy = signal(false);
45551
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
45552
- 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);
45553
45560
  }
45554
45561
  this.formMeta = signal(this.buildFormMeta());
45555
45562
  effect(() => {
@@ -45785,7 +45792,7 @@ const DELETE_ACCOUNT_MODAL_I18N = {
45785
45792
  },
45786
45793
  };
45787
45794
 
45788
- const DEFAULT_NAMESPACE$9 = 'Settings.DeleteAccount';
45795
+ const DEFAULT_NAMESPACE$a = 'Settings.DeleteAccount';
45789
45796
  /**
45790
45797
  * `val-delete-account-modal` — modal de eliminación de cuenta (organism,
45791
45798
  * cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.
@@ -45811,7 +45818,7 @@ class DeleteAccountModalComponent {
45811
45818
  this.i18n = inject(I18nService);
45812
45819
  this.toast = inject(ToastService);
45813
45820
  /** Namespace i18n con que la vista resuelve sus textos. */
45814
- this.i18nNamespace = DEFAULT_NAMESPACE$9;
45821
+ this.i18nNamespace = DEFAULT_NAMESPACE$a;
45815
45822
  this.hasPassword = signal(null);
45816
45823
  this.codeSent = signal(false);
45817
45824
  this.formState = signal(ComponentStates.ENABLED);
@@ -45878,8 +45885,8 @@ class DeleteAccountModalComponent {
45878
45885
  ],
45879
45886
  actions: this.submitBtn('delete-code-submit', 'confirmCta'),
45880
45887
  }));
45881
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$9)) {
45882
- 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);
45883
45890
  }
45884
45891
  }
45885
45892
  ngOnInit() {
@@ -46080,7 +46087,7 @@ const ORG_INFO_SHEET_I18N = {
46080
46087
  },
46081
46088
  };
46082
46089
 
46083
- const DEFAULT_NAMESPACE$8 = 'OrgInfoSheet';
46090
+ const DEFAULT_NAMESPACE$9 = 'OrgInfoSheet';
46084
46091
  /**
46085
46092
  * `val-org-info-sheet` — sheet informativo "¿Qué son las organizaciones?".
46086
46093
  * Extraído del `OrgInfoSheetComponent` inline de `AccountPage` bajo el proceso de
@@ -46125,15 +46132,15 @@ class OrgInfoSheetComponent {
46125
46132
  text: this.closeProps.text || this.resolvedCloseLabel(),
46126
46133
  }));
46127
46134
  addIcons({ peopleOutline, swapHorizontalOutline, mailOutline });
46128
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$8)) {
46129
- 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);
46130
46137
  }
46131
46138
  }
46132
46139
  dismiss() {
46133
46140
  this._modalRef?.dismiss(null, 'cancel');
46134
46141
  }
46135
46142
  tt(key) {
46136
- return this.i18n.t(key, DEFAULT_NAMESPACE$8);
46143
+ return this.i18n.t(key, DEFAULT_NAMESPACE$9);
46137
46144
  }
46138
46145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46139
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: `
@@ -46300,7 +46307,7 @@ const SWITCH_ORG_MODAL_I18N = {
46300
46307
  },
46301
46308
  };
46302
46309
 
46303
- const DEFAULT_NAMESPACE$7 = 'Settings.SwitchOrg';
46310
+ const DEFAULT_NAMESPACE$8 = 'Settings.SwitchOrg';
46304
46311
  addIcons({ businessOutline, checkmarkCircleOutline });
46305
46312
  /**
46306
46313
  * `val-switch-org-modal` — modal de cambio de organización activa (organism
@@ -46326,7 +46333,7 @@ class SwitchOrgModalComponent {
46326
46333
  this.orgSwitch = inject(OrgSwitchService);
46327
46334
  this.errors = inject(ValtechErrorService);
46328
46335
  /** Namespace i18n con que la vista resuelve sus textos. */
46329
- this.i18nNamespace = DEFAULT_NAMESPACE$7;
46336
+ this.i18nNamespace = DEFAULT_NAMESPACE$8;
46330
46337
  this.orgs = signal([]);
46331
46338
  this.loading = signal(false);
46332
46339
  this.query = signal('');
@@ -46342,8 +46349,8 @@ class SwitchOrgModalComponent {
46342
46349
  return list;
46343
46350
  return list.filter(o => o.name.toLowerCase().includes(q));
46344
46351
  });
46345
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$7)) {
46346
- 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);
46347
46354
  }
46348
46355
  this.loadOrgs();
46349
46356
  }
@@ -46661,7 +46668,7 @@ const ACCOUNT_VIEW_I18N = {
46661
46668
  };
46662
46669
 
46663
46670
  addIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline });
46664
- const DEFAULT_NAMESPACE$6 = 'Settings.Account';
46671
+ const DEFAULT_NAMESPACE$7 = 'Settings.Account';
46665
46672
  const DEFAULT_MANAGE_ORG_ROUTE = '/app/settings/organization';
46666
46673
  /**
46667
46674
  * `val-account-view` — vista Cuenta full-feature autocontenida (organism).
@@ -46702,7 +46709,7 @@ class AccountViewComponent {
46702
46709
  showNewOrgCta: merged.showNewOrgCta ?? true,
46703
46710
  showLogout: merged.showLogout ?? true,
46704
46711
  showDeleteAccount: merged.showDeleteAccount ?? true,
46705
- i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$6,
46712
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$7,
46706
46713
  manageOrgRoute: merged.manageOrgRoute ?? DEFAULT_MANAGE_ORG_ROUTE,
46707
46714
  onOrgSwitched: merged.onOrgSwitched,
46708
46715
  onOrgCreated: merged.onOrgCreated,
@@ -47427,7 +47434,7 @@ const EDIT_ORG_MODAL_I18N = {
47427
47434
  },
47428
47435
  };
47429
47436
 
47430
- const DEFAULT_NAMESPACE$5 = 'EditOrgModal';
47437
+ const DEFAULT_NAMESPACE$6 = 'EditOrgModal';
47431
47438
  /**
47432
47439
  * `val-edit-org-modal` — modal de edición de organización (nombre + descripción).
47433
47440
  * Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por la vista de
@@ -47454,10 +47461,10 @@ class EditOrgModalComponent {
47454
47461
  /** Organización a editar (pasada por `componentProps`). */
47455
47462
  this.org = null;
47456
47463
  /** Namespace i18n con que la vista resuelve sus textos. */
47457
- this.i18nNamespace = DEFAULT_NAMESPACE$5;
47464
+ this.i18nNamespace = DEFAULT_NAMESPACE$6;
47458
47465
  this.saving = signal(false);
47459
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$5)) {
47460
- 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);
47461
47468
  }
47462
47469
  this.formMeta = signal(this.buildFormMeta());
47463
47470
  effect(() => {
@@ -47695,7 +47702,7 @@ const INVITE_MEMBER_MODAL_I18N = {
47695
47702
  },
47696
47703
  };
47697
47704
 
47698
- const DEFAULT_NAMESPACE$4 = 'InviteModal';
47705
+ const DEFAULT_NAMESPACE$5 = 'InviteModal';
47699
47706
  addIcons({ personOutline, mailOutline, closeOutline, checkmarkCircleOutline });
47700
47707
  /**
47701
47708
  * `val-invite-member-modal` — invitación de miembros a una organización.
@@ -47726,7 +47733,7 @@ class InviteMemberModalComponent {
47726
47733
  /** Ids de miembros ya existentes (excluidos de los resultados). */
47727
47734
  this.existingMemberIds = [];
47728
47735
  /** Namespace i18n con que la vista resuelve sus textos. */
47729
- this.i18nNamespace = DEFAULT_NAMESPACE$4;
47736
+ this.i18nNamespace = DEFAULT_NAMESPACE$5;
47730
47737
  this.query = signal('');
47731
47738
  this.searching = signal(false);
47732
47739
  this.searchResults = signal([]);
@@ -47773,8 +47780,8 @@ class InviteMemberModalComponent {
47773
47780
  state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
47774
47781
  }));
47775
47782
  this.searchSubject = new Subject();
47776
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
47777
- 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);
47778
47785
  }
47779
47786
  this.loadRoles();
47780
47787
  this.roleSub = this.roleControl.valueChanges.subscribe(v => {
@@ -48263,7 +48270,7 @@ const MEMBER_DETAIL_MODAL_I18N = {
48263
48270
  },
48264
48271
  };
48265
48272
 
48266
- const DEFAULT_NAMESPACE$3 = 'Settings.MemberDetail';
48273
+ const DEFAULT_NAMESPACE$4 = 'Settings.MemberDetail';
48267
48274
  /**
48268
48275
  * `val-member-detail-modal` — detalle de miembro de organización: perfil, rol y
48269
48276
  * permisos. Promovido desde `showcase` bajo el proceso de ADR-021.
@@ -48300,7 +48307,7 @@ class MemberDetailModalComponent {
48300
48307
  { id: 'admin', name: 'admin' },
48301
48308
  ];
48302
48309
  /** Namespace i18n con que la vista resuelve sus textos. */
48303
- this.i18nNamespace = DEFAULT_NAMESPACE$3;
48310
+ this.i18nNamespace = DEFAULT_NAMESPACE$4;
48304
48311
  this.working = signal(false);
48305
48312
  this.currentRole = signal('');
48306
48313
  this.roleControl = new FormControl('');
@@ -48340,8 +48347,8 @@ class MemberDetailModalComponent {
48340
48347
  type: 'button',
48341
48348
  state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
48342
48349
  }));
48343
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$3)) {
48344
- 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);
48345
48352
  }
48346
48353
  }
48347
48354
  ngOnInit() {
@@ -48678,7 +48685,7 @@ const TRANSFER_OWNERSHIP_MODAL_I18N = {
48678
48685
  },
48679
48686
  };
48680
48687
 
48681
- const DEFAULT_NAMESPACE$2 = 'Settings.TransferModal';
48688
+ const DEFAULT_NAMESPACE$3 = 'Settings.TransferModal';
48682
48689
  /**
48683
48690
  * `val-transfer-ownership-modal` — selector de miembro para transferir la
48684
48691
  * propiedad de la organización. Promovido desde `showcase` bajo el proceso de
@@ -48702,7 +48709,7 @@ class TransferOwnershipModalComponent {
48702
48709
  /** Lista de miembros transferibles (todos excepto el owner actual). */
48703
48710
  this.members = [];
48704
48711
  /** Namespace i18n con que la vista resuelve sus textos. */
48705
- this.i18nNamespace = DEFAULT_NAMESPACE$2;
48712
+ this.i18nNamespace = DEFAULT_NAMESPACE$3;
48706
48713
  this.query = signal('');
48707
48714
  this.selectedId = signal('');
48708
48715
  this.filtered = computed(() => {
@@ -48714,8 +48721,8 @@ class TransferOwnershipModalComponent {
48714
48721
  m.userId.toLowerCase().includes(q));
48715
48722
  });
48716
48723
  this.noResultsLabel = computed(() => `${this.t('noResults')} "${this.query()}"`);
48717
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$2)) {
48718
- 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);
48719
48726
  }
48720
48727
  }
48721
48728
  ngOnInit() {
@@ -48900,6 +48907,371 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48900
48907
  type: Input
48901
48908
  }] } });
48902
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
+
48903
49275
  /**
48904
49276
  * Defaults i18n (es/en) embebidos en `val-organization-view`. Auto-registrados en
48905
49277
  * el constructor del componente si el consumer no proveyó el namespace
@@ -48955,6 +49327,7 @@ const ORGANIZATION_VIEW_I18N = {
48955
49327
  inviteCtaTitle: '¿Deseas agregar a alguien?',
48956
49328
  inviteCtaHint: 'Invita a usuarios a unirse a tu organización.',
48957
49329
  inviteOpen: 'Invitar',
49330
+ importOpen: 'Importar',
48958
49331
  viewMemberCta: 'Ver miembro',
48959
49332
  roleViewer: 'Visor',
48960
49333
  roleEditor: 'Editor',
@@ -49024,6 +49397,7 @@ const ORGANIZATION_VIEW_I18N = {
49024
49397
  inviteCtaTitle: 'Want to add someone?',
49025
49398
  inviteCtaHint: 'Invite users to join your organization.',
49026
49399
  inviteOpen: 'Invite',
49400
+ importOpen: 'Import',
49027
49401
  viewMemberCta: 'View member',
49028
49402
  roleViewer: 'Viewer',
49029
49403
  roleEditor: 'Editor',
@@ -49137,6 +49511,22 @@ class OrganizationViewComponent {
49137
49511
  this.members = signal([]);
49138
49512
  this.membersLoading = signal(false);
49139
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
+ });
49140
49530
  this.membersNextToken = signal(null);
49141
49531
  this.loadingMoreMembers = signal(false);
49142
49532
  this.showAllMembers = signal(false);
@@ -49223,6 +49613,14 @@ class OrganizationViewComponent {
49223
49613
  shape: 'round',
49224
49614
  type: 'button',
49225
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
+ }));
49226
49624
  /** Guarda para detectar el primer disparo del effect (evita doble carga). */
49227
49625
  this.lastLoadedOrgId = null;
49228
49626
  const ns = this.ns;
@@ -49323,6 +49721,25 @@ class OrganizationViewComponent {
49323
49721
  backdropDismiss: true,
49324
49722
  });
49325
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
+ }
49326
49743
  onViewPermissions() {
49327
49744
  this.nav.navigateByUrl(this.resolvedConfig().viewPermissionsRoute);
49328
49745
  }
@@ -49404,6 +49821,7 @@ class OrganizationViewComponent {
49404
49821
  if (!orgId)
49405
49822
  return Promise.resolve();
49406
49823
  this.membersLoading.set(true);
49824
+ this.membersLoadError.set(null);
49407
49825
  this.membersNextToken.set(null);
49408
49826
  this.showAllMembers.set(false);
49409
49827
  return new Promise(resolve => {
@@ -49614,6 +50032,8 @@ class OrganizationViewComponent {
49614
50032
  <div class="section-body">
49615
50033
  @if (membersLoading()) {
49616
50034
  <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
50035
+ } @else if (membersErrorState()) {
50036
+ <val-empty-state [props]="membersErrorState()!" />
49617
50037
  } @else if (members().length === 0) {
49618
50038
  <val-text
49619
50039
  [props]="{
@@ -49706,6 +50126,7 @@ class OrganizationViewComponent {
49706
50126
  />
49707
50127
  </div>
49708
50128
  <val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
50129
+ <val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
49709
50130
  </div>
49710
50131
  </section>
49711
50132
  }
@@ -49814,6 +50235,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49814
50235
  ButtonComponent,
49815
50236
  MemberCardComponent,
49816
50237
  TransferOwnershipModalComponent,
50238
+ MemberImportModalComponent,
49817
50239
  ], template: `
49818
50240
  <div class="page">
49819
50241
  <header class="page-header">
@@ -49892,6 +50314,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49892
50314
  <div class="section-body">
49893
50315
  @if (membersLoading()) {
49894
50316
  <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
50317
+ } @else if (membersErrorState()) {
50318
+ <val-empty-state [props]="membersErrorState()!" />
49895
50319
  } @else if (members().length === 0) {
49896
50320
  <val-text
49897
50321
  [props]="{
@@ -49984,6 +50408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49984
50408
  />
49985
50409
  </div>
49986
50410
  <val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
50411
+ <val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
49987
50412
  </div>
49988
50413
  </section>
49989
50414
  }
@@ -61254,5 +61679,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
61254
61679
  * Generated bundle index. Do not edit.
61255
61680
  */
61256
61681
 
61257
- 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 };
61258
61683
  //# sourceMappingURL=valtech-components.mjs.map