valtech-components 4.0.72 → 4.0.75

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.
Files changed (58) hide show
  1. package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +2 -4
  2. package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +2 -4
  3. package/esm2022/lib/components/molecules/comment/comment.component.mjs +2 -4
  4. package/esm2022/lib/components/molecules/content-reaction/content-reaction.component.mjs +2 -4
  5. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +2 -4
  6. package/esm2022/lib/components/molecules/date-picker/date-picker.component.mjs +2 -4
  7. package/esm2022/lib/components/molecules/features-list/features-list.component.mjs +2 -4
  8. package/esm2022/lib/components/molecules/font-size-selector/font-size-selector.component.mjs +2 -4
  9. package/esm2022/lib/components/molecules/pagination/pagination.component.mjs +2 -4
  10. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +2 -4
  11. package/esm2022/lib/components/molecules/permission-selector/permission-selector.component.mjs +2 -4
  12. package/esm2022/lib/components/molecules/rating/rating.component.mjs +2 -4
  13. package/esm2022/lib/components/molecules/request-form/request-form.component.mjs +229 -0
  14. package/esm2022/lib/components/molecules/request-form/types.mjs +2 -0
  15. package/esm2022/lib/components/molecules/ticket-card/ticket-card.component.mjs +2 -4
  16. package/esm2022/lib/components/organisms/about-view/about-view.component.mjs +2 -4
  17. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +2 -4
  18. package/esm2022/lib/components/organisms/api-key-create-modal/api-key-create-modal.component.mjs +3 -7
  19. package/esm2022/lib/components/organisms/api-keys-modal/api-keys-modal.component.mjs +3 -7
  20. package/esm2022/lib/components/organisms/api-keys-view/api-keys-view.component.mjs +2 -4
  21. package/esm2022/lib/components/organisms/auth-cta/auth-cta.component.mjs +2 -4
  22. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +2 -4
  23. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +2 -4
  24. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +2 -4
  25. package/esm2022/lib/components/organisms/field-list/field-list.component.mjs +2 -4
  26. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +2 -4
  27. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +3 -7
  28. package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.component.mjs +3 -7
  29. package/esm2022/lib/components/organisms/notification-preferences-view/notification-preferences-view.component.mjs +2 -4
  30. package/esm2022/lib/components/organisms/notifications-view/notifications-view.component.mjs +2 -4
  31. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +2 -4
  32. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +2 -4
  33. package/esm2022/lib/components/organisms/permissions-view/permissions-view.component.mjs +2 -4
  34. package/esm2022/lib/components/organisms/preferences-view/preferences-view.component.mjs +2 -4
  35. package/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +2 -4
  36. package/esm2022/lib/components/organisms/qr-scanner/qr-scanner.component.mjs +2 -4
  37. package/esm2022/lib/components/organisms/security-view/security-view.component.mjs +2 -4
  38. package/esm2022/lib/components/organisms/settings-hub/settings-hub.component.mjs +3 -7
  39. package/esm2022/lib/components/organisms/share-profile-modal/share-profile-modal.component.mjs +2 -4
  40. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +2 -4
  41. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +3 -7
  42. package/esm2022/lib/services/i18n/i18n.service.mjs +21 -1
  43. package/esm2022/lib/version.mjs +2 -2
  44. package/esm2022/public-api.mjs +3 -1
  45. package/fesm2022/valtech-components.mjs +376 -232
  46. package/fesm2022/valtech-components.mjs.map +1 -1
  47. package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +2 -2
  48. package/lib/components/molecules/cta-card/cta-card.component.d.ts +1 -1
  49. package/lib/components/molecules/metric-card/metric-card.component.d.ts +1 -1
  50. package/lib/components/molecules/request-form/request-form.component.d.ts +28 -0
  51. package/lib/components/molecules/request-form/types.d.ts +32 -0
  52. package/lib/components/organisms/article/article.component.d.ts +5 -5
  53. package/lib/components/organisms/auth-cta/auth-cta.component.d.ts +1 -1
  54. package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
  55. package/lib/services/i18n/i18n.service.d.ts +7 -0
  56. package/lib/version.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/public-api.d.ts +2 -0
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.72';
59
+ const VERSION = '4.0.75';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -1664,6 +1664,26 @@ class I18nService {
1664
1664
  [namespace]: content,
1665
1665
  }));
1666
1666
  }
1667
+ /**
1668
+ * Registra defaults para un namespace, mezclando solo las keys ausentes por idioma.
1669
+ * A diferencia de `registerContent`, no sobreescribe keys que el consumer ya registró.
1670
+ * Úsalo en componentes de la lib para que sus defaults funcionen incluso cuando el
1671
+ * consumer registró el namespace de forma parcial.
1672
+ */
1673
+ registerDefaults(namespace, defaults) {
1674
+ this._content.update(store => {
1675
+ const existing = store[namespace];
1676
+ if (!existing)
1677
+ return { ...store, [namespace]: defaults };
1678
+ const merged = { ...existing };
1679
+ for (const lang of Object.keys(defaults)) {
1680
+ const defLang = defaults[lang] ?? {};
1681
+ const curLang = (existing[lang] ?? {});
1682
+ merged[lang] = { ...defLang, ...curLang };
1683
+ }
1684
+ return { ...store, [namespace]: merged };
1685
+ });
1686
+ }
1667
1687
  /**
1668
1688
  * Registra múltiples namespaces de una vez
1669
1689
  *
@@ -16046,9 +16066,7 @@ class DateInputComponent {
16046
16066
  */
16047
16067
  this.resolvedProps = {};
16048
16068
  // Auto-registro de defaults i18n (anti key-faltante → anti storm de CD).
16049
- if (!this.i18n.hasNamespace('DateInput')) {
16050
- this.i18n.registerContent('DateInput', DATE_INPUT_I18N);
16051
- }
16069
+ this.i18n.registerDefaults('DateInput', DATE_INPUT_I18N);
16052
16070
  }
16053
16071
  /** Done button text - from props or i18n default */
16054
16072
  get doneText() {
@@ -17097,9 +17115,7 @@ class FontSizeSelectorComponent {
17097
17115
  this.i18n = inject(I18nService);
17098
17116
  this.popoverId = `font-size-selector-${Math.random().toString(36).slice(2, 8)}`;
17099
17117
  this.currentSize = this.fontSizeService.size;
17100
- if (!this.i18n.hasNamespace('FontSizeSelector')) {
17101
- this.i18n.registerContent('FontSizeSelector', FONT_SIZE_SELECTOR_I18N);
17102
- }
17118
+ this.i18n.registerDefaults('FontSizeSelector', FONT_SIZE_SELECTOR_I18N);
17103
17119
  }
17104
17120
  get options() {
17105
17121
  return [
@@ -18036,9 +18052,7 @@ class PasswordInputComponent {
18036
18052
  */
18037
18053
  this.resolvedProps = {};
18038
18054
  this.hidePassword = true;
18039
- if (!this.i18n.hasNamespace('PasswordInput')) {
18040
- this.i18n.registerContent('PasswordInput', PASSWORD_INPUT_I18N);
18041
- }
18055
+ this.i18n.registerDefaults('PasswordInput', PASSWORD_INPUT_I18N);
18042
18056
  }
18043
18057
  /** Aria-label del botón mostrar/ocultar según el estado de visibilidad. */
18044
18058
  toggleLabel() {
@@ -20073,9 +20087,7 @@ class CommandDisplayComponent {
20073
20087
  this.i18n = inject(I18nService);
20074
20088
  /** Mensaje anunciado por el lector de pantalla al copiar. */
20075
20089
  this.copiedMessage = '';
20076
- if (!this.i18n.hasNamespace('CommandDisplay')) {
20077
- this.i18n.registerContent('CommandDisplay', COMMAND_DISPLAY_I18N);
20078
- }
20090
+ this.i18n.registerDefaults('CommandDisplay', COMMAND_DISPLAY_I18N);
20079
20091
  }
20080
20092
  copyLabel() {
20081
20093
  this.i18n.lang();
@@ -20665,9 +20677,7 @@ class PaginationComponent {
20665
20677
  this.pageChange = new EventEmitter();
20666
20678
  this.visiblePages = [];
20667
20679
  this.totalPages = 1;
20668
- if (!this.i18n.hasNamespace('Pagination')) {
20669
- this.i18n.registerContent('Pagination', PAGINATION_I18N);
20670
- }
20680
+ this.i18n.registerDefaults('Pagination', PAGINATION_I18N);
20671
20681
  }
20672
20682
  t(key) {
20673
20683
  this.i18n.lang();
@@ -21197,9 +21207,7 @@ class ChipGroupComponent {
21197
21207
  this.selectionChange = new EventEmitter();
21198
21208
  this.chipRemove = new EventEmitter();
21199
21209
  this.chipClick = new EventEmitter();
21200
- if (!this.i18n.hasNamespace('ChipGroup')) {
21201
- this.i18n.registerContent('ChipGroup', CHIP_GROUP_I18N);
21202
- }
21210
+ this.i18n.registerDefaults('ChipGroup', CHIP_GROUP_I18N);
21203
21211
  }
21204
21212
  ngOnInit() {
21205
21213
  this.resolveProps();
@@ -21395,9 +21403,7 @@ class RatingComponent {
21395
21403
  this.resolvedProps = {};
21396
21404
  this.ratingChange = new EventEmitter();
21397
21405
  this.hoverValue = null;
21398
- if (!this.i18n.hasNamespace('Rating')) {
21399
- this.i18n.registerContent('Rating', RATING_I18N);
21400
- }
21406
+ this.i18n.registerDefaults('Rating', RATING_I18N);
21401
21407
  }
21402
21408
  ngOnInit() {
21403
21409
  this.resolveProps();
@@ -22008,9 +22014,7 @@ class CommentComponent {
22008
22014
  this.loadMoreClick = new EventEmitter();
22009
22015
  this.collapseToggle = new EventEmitter();
22010
22016
  this.displayContent = '';
22011
- if (!this.i18n.hasNamespace('Comment')) {
22012
- this.i18n.registerContent('Comment', COMMENT_I18N);
22013
- }
22017
+ this.i18n.registerDefaults('Comment', COMMENT_I18N);
22014
22018
  }
22015
22019
  ngOnInit() {
22016
22020
  this.displayContent = this.props.content || this.props.contentFallback || '';
@@ -25953,9 +25957,7 @@ class FeaturesListComponent {
25953
25957
  }
25954
25958
  return color;
25955
25959
  });
25956
- if (!this.i18n.hasNamespace('FeaturesList')) {
25957
- this.i18n.registerContent('FeaturesList', FEATURES_LIST_I18N);
25958
- }
25960
+ this.i18n.registerDefaults('FeaturesList', FEATURES_LIST_I18N);
25959
25961
  }
25960
25962
  toggle() {
25961
25963
  this._expanded.set(!this._expanded());
@@ -29237,9 +29239,7 @@ class PermissionSelectorComponent {
29237
29239
  };
29238
29240
  });
29239
29241
  });
29240
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$l)) {
29241
- this.i18n.registerContent(DEFAULT_NAMESPACE$l, PERMISSION_SELECTOR_I18N);
29242
- }
29242
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$l, PERMISSION_SELECTOR_I18N);
29243
29243
  }
29244
29244
  toggleAction(code) {
29245
29245
  const sel = new Set(this.selected());
@@ -31896,9 +31896,7 @@ class DatePickerComponent {
31896
31896
  this.sheetOpen = signal(false);
31897
31897
  /** true cuando el calendario ya se construyó y es visible (fade-in). */
31898
31898
  this.calReady = signal(false);
31899
- if (!this.i18n.hasNamespace(I18N_NS$2)) {
31900
- this.i18n.registerContent(I18N_NS$2, DATE_PICKER_I18N);
31901
- }
31899
+ this.i18n.registerDefaults(I18N_NS$2, DATE_PICKER_I18N);
31902
31900
  }
31903
31901
  get triggerId() {
31904
31902
  if (!this.props.token) {
@@ -34546,9 +34544,7 @@ class ShareProfileModalComponent {
34546
34544
  }));
34547
34545
  this.displayName = computed(() => this.config().title || this.config().name || this.t('title'));
34548
34546
  this.caption = computed(() => this.config().caption || this.t('caption'));
34549
- if (!this.i18n.hasNamespace('ShareProfileModal')) {
34550
- this.i18n.registerContent('ShareProfileModal', SHARE_PROFILE_MODAL_I18N);
34551
- }
34547
+ this.i18n.registerDefaults('ShareProfileModal', SHARE_PROFILE_MODAL_I18N);
34552
34548
  }
34553
34549
  t(key) {
34554
34550
  this.i18n.lang();
@@ -44023,9 +44019,7 @@ class ProfileViewComponent {
44023
44019
  // Auto-registro i18n — respeta override del consumer. El namespace puede
44024
44020
  // venir de @Input.config o del route data; lo resolvemos acá.
44025
44021
  const ns = this.ns;
44026
- if (!this.i18n.hasNamespace(ns)) {
44027
- this.i18n.registerContent(ns, PROFILE_VIEW_I18N);
44028
- }
44022
+ this.i18n.registerDefaults(ns, PROFILE_VIEW_I18N);
44029
44023
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
44030
44024
  connectPageRefresh(() => this.loadFromApi());
44031
44025
  effect(onCleanup => {
@@ -44901,9 +44895,7 @@ class PreferencesViewComponent {
44901
44895
  // Auto-registro i18n — respeta override del consumer. El namespace puede
44902
44896
  // venir de @Input.config o del route data; lo resolvemos acá.
44903
44897
  const ns = this.ns;
44904
- if (!this.i18n.hasNamespace(ns)) {
44905
- this.i18n.registerContent(ns, PREFERENCES_VIEW_I18N);
44906
- }
44898
+ this.i18n.registerDefaults(ns, PREFERENCES_VIEW_I18N);
44907
44899
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
44908
44900
  }
44909
44901
  async onThemeChange(value) {
@@ -45439,13 +45431,9 @@ class SettingsHubComponent {
45439
45431
  // Auto-registro i18n — respeta override del consumer. Los namespaces pueden
45440
45432
  // venir de @Input.config o del route data; los resolvemos acá.
45441
45433
  const labelsNs = this.labelsNs;
45442
- if (!this.i18n.hasNamespace(labelsNs)) {
45443
- this.i18n.registerContent(labelsNs, SETTINGS_HUB_LABELS_I18N);
45444
- }
45434
+ this.i18n.registerDefaults(labelsNs, SETTINGS_HUB_LABELS_I18N);
45445
45435
  const pageNs = this.pageNs;
45446
- if (!this.i18n.hasNamespace(pageNs)) {
45447
- this.i18n.registerContent(pageNs, SETTINGS_HUB_PAGE_I18N);
45448
- }
45436
+ this.i18n.registerDefaults(pageNs, SETTINGS_HUB_PAGE_I18N);
45449
45437
  this.nav.setBackHeader('pageTitle', pageNs, { withMenu: true });
45450
45438
  }
45451
45439
  onActionClick(action) {
@@ -46689,9 +46677,7 @@ class SecurityViewComponent {
46689
46677
  },
46690
46678
  }));
46691
46679
  const ns = this.ns;
46692
- if (!this.i18n.hasNamespace(ns)) {
46693
- this.i18n.registerContent(ns, SECURITY_VIEW_I18N);
46694
- }
46680
+ this.i18n.registerDefaults(ns, SECURITY_VIEW_I18N);
46695
46681
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
46696
46682
  // Carga inicial de sesiones - recarga reactiva a cambio de locale para
46697
46683
  // que los textos y metadatos se mantengan frescos. Los devices solo se
@@ -47493,9 +47479,7 @@ class CreateOrgModalComponent {
47493
47479
  this.dismissed = new EventEmitter();
47494
47480
  this.created = new EventEmitter();
47495
47481
  this._busy = signal(false);
47496
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$h)) {
47497
- this.i18n.registerContent(DEFAULT_NAMESPACE$h, CREATE_ORG_MODAL_I18N);
47498
- }
47482
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$h, CREATE_ORG_MODAL_I18N);
47499
47483
  this.formMeta = signal(this.buildFormMeta());
47500
47484
  effect(() => {
47501
47485
  this.i18n.lang();
@@ -47858,9 +47842,7 @@ class DeleteAccountModalComponent {
47858
47842
  ],
47859
47843
  actions: this.submitBtn('delete-code-submit', 'confirmCta'),
47860
47844
  }));
47861
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$g)) {
47862
- this.i18n.registerContent(DEFAULT_NAMESPACE$g, DELETE_ACCOUNT_MODAL_I18N);
47863
- }
47845
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$g, DELETE_ACCOUNT_MODAL_I18N);
47864
47846
  }
47865
47847
  submitBtn(token, textKey) {
47866
47848
  return {
@@ -48128,9 +48110,7 @@ class OrgInfoSheetComponent {
48128
48110
  ];
48129
48111
  });
48130
48112
  addIcons({ peopleOutline, swapHorizontalOutline, mailOutline, codeSlashOutline, shieldCheckmarkOutline, warningOutline });
48131
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$f)) {
48132
- this.i18n.registerContent(DEFAULT_NAMESPACE$f, ORG_INFO_SHEET_I18N);
48133
- }
48113
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$f, ORG_INFO_SHEET_I18N);
48134
48114
  }
48135
48115
  dismiss() {
48136
48116
  this._modalRef?.dismiss(null, 'cancel');
@@ -48347,9 +48327,7 @@ class SwitchOrgModalComponent {
48347
48327
  return list;
48348
48328
  return list.filter(o => o.name.toLowerCase().includes(q));
48349
48329
  });
48350
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$e)) {
48351
- this.i18n.registerContent(DEFAULT_NAMESPACE$e, SWITCH_ORG_MODAL_I18N);
48352
- }
48330
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$e, SWITCH_ORG_MODAL_I18N);
48353
48331
  this.loadOrgs();
48354
48332
  }
48355
48333
  onQueryChange(value) {
@@ -48889,9 +48867,7 @@ class AccountViewComponent {
48889
48867
  token: 'account-switch',
48890
48868
  }));
48891
48869
  const ns = this.ns;
48892
- if (!this.i18n.hasNamespace(ns)) {
48893
- this.i18n.registerContent(ns, ACCOUNT_VIEW_I18N);
48894
- }
48870
+ this.i18n.registerDefaults(ns, ACCOUNT_VIEW_I18N);
48895
48871
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
48896
48872
  this.loadOrgs();
48897
48873
  this.loadPendingInvites();
@@ -49630,9 +49606,7 @@ class EditOrgModalComponent {
49630
49606
  const name = this.org?.name ?? '';
49631
49607
  return name.slice(0, 2).toUpperCase() || '?';
49632
49608
  });
49633
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$c)) {
49634
- this.i18n.registerContent(DEFAULT_NAMESPACE$c, EDIT_ORG_MODAL_I18N);
49635
- }
49609
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$c, EDIT_ORG_MODAL_I18N);
49636
49610
  this.formMeta = signal(this.buildFormMeta());
49637
49611
  effect(() => {
49638
49612
  this.i18n.lang();
@@ -50032,9 +50006,7 @@ class InviteMemberModalComponent {
50032
50006
  state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
50033
50007
  }));
50034
50008
  this.searchSubject = new Subject();
50035
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$b)) {
50036
- this.i18n.registerContent(DEFAULT_NAMESPACE$b, INVITE_MEMBER_MODAL_I18N);
50037
- }
50009
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$b, INVITE_MEMBER_MODAL_I18N);
50038
50010
  this.roleSub = this.roleControl.valueChanges.subscribe(v => {
50039
50011
  if (v)
50040
50012
  this.selectedRole.set(v);
@@ -50737,14 +50709,10 @@ class MemberDetailModalComponent {
50737
50709
  type: 'button',
50738
50710
  state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
50739
50711
  }));
50740
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
50741
- this.i18n.registerContent(DEFAULT_NAMESPACE$a, MEMBER_DETAIL_MODAL_I18N);
50742
- }
50712
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$a, MEMBER_DETAIL_MODAL_I18N);
50743
50713
  }
50744
50714
  ngOnInit() {
50745
- if (!this.i18n.hasNamespace(this.i18nNamespace)) {
50746
- this.i18n.registerContent(this.i18nNamespace, MEMBER_DETAIL_MODAL_I18N);
50747
- }
50715
+ this.i18n.registerDefaults(this.i18nNamespace, MEMBER_DETAIL_MODAL_I18N);
50748
50716
  const roleName = this.member?.roles?.[0] ?? '';
50749
50717
  // Resolve the role name to its UUID -- the select uses r.id (UUID) as value
50750
50718
  const matched = this.availableRoles.find(r => r.name === roleName);
@@ -51227,9 +51195,7 @@ class PermissionsViewComponent {
51227
51195
  state: this.loading() ? ComponentStates.DISABLED : ComponentStates.ENABLED,
51228
51196
  }));
51229
51197
  const ns = this.ns;
51230
- if (!this.i18n.hasNamespace(ns)) {
51231
- this.i18n.registerContent(ns, PERMISSIONS_VIEW_I18N);
51232
- }
51198
+ this.i18n.registerDefaults(ns, PERMISSIONS_VIEW_I18N);
51233
51199
  this.load();
51234
51200
  connectPageRefresh(() => this.load());
51235
51201
  }
@@ -51796,14 +51762,10 @@ class TransferOwnershipModalComponent {
51796
51762
  return this.members.filter(m => m.name?.toLowerCase().includes(q) || m.email?.toLowerCase().includes(q) || m.userId.toLowerCase().includes(q));
51797
51763
  });
51798
51764
  this.noResultsLabel = computed(() => `${this.t('noResults')} "${this.query()}"`);
51799
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$8)) {
51800
- this.i18n.registerContent(DEFAULT_NAMESPACE$8, TRANSFER_OWNERSHIP_MODAL_I18N);
51801
- }
51765
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$8, TRANSFER_OWNERSHIP_MODAL_I18N);
51802
51766
  }
51803
51767
  ngOnInit() {
51804
- if (!this.i18n.hasNamespace(this.i18nNamespace)) {
51805
- this.i18n.registerContent(this.i18nNamespace, TRANSFER_OWNERSHIP_MODAL_I18N);
51806
- }
51768
+ this.i18n.registerDefaults(this.i18nNamespace, TRANSFER_OWNERSHIP_MODAL_I18N);
51807
51769
  }
51808
51770
  confirm() {
51809
51771
  const id = this.selectedId();
@@ -52135,14 +52097,10 @@ class MemberImportModalComponent {
52135
52097
  return this.t('summary');
52136
52098
  return `${this.t('summary')}: ${s.created} ${this.t('created')} · ${s.assigned} ${this.t('assigned')} · ${s.skipped} ${this.t('skipped')} · ${s.failed} ${this.t('failed')}`;
52137
52099
  });
52138
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$7)) {
52139
- this.i18n.registerContent(DEFAULT_NAMESPACE$7, MEMBER_IMPORT_MODAL_I18N);
52140
- }
52100
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$7, MEMBER_IMPORT_MODAL_I18N);
52141
52101
  }
52142
52102
  ngOnInit() {
52143
- if (!this.i18n.hasNamespace(this.i18nNamespace)) {
52144
- this.i18n.registerContent(this.i18nNamespace, MEMBER_IMPORT_MODAL_I18N);
52145
- }
52103
+ this.i18n.registerDefaults(this.i18nNamespace, MEMBER_IMPORT_MODAL_I18N);
52146
52104
  }
52147
52105
  /** Carga un archivo CSV seleccionado: lee su texto al textarea (`csv`). */
52148
52106
  onFileSelected(event) {
@@ -52996,9 +52954,7 @@ class OrganizationViewComponent {
52996
52954
  /** Guarda para detectar el primer disparo del effect (evita doble carga). */
52997
52955
  this.lastLoadedOrgId = null;
52998
52956
  const ns = this.ns;
52999
- if (!this.i18n.hasNamespace(ns)) {
53000
- this.i18n.registerContent(ns, ORGANIZATION_VIEW_I18N);
53001
- }
52957
+ this.i18n.registerDefaults(ns, ORGANIZATION_VIEW_I18N);
53002
52958
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
53003
52959
  // Auto-reload en org-switch: reacciona a activeOrgId() y recarga org + miembros
53004
52960
  // cuando el usuario cambia de organización activa mientras la vista está
@@ -54332,9 +54288,7 @@ class NotificationPreferencesViewComponent {
54332
54288
  return `${t.slice(0, 22)}…${t.slice(-6)}`;
54333
54289
  });
54334
54290
  const ns = this.ns;
54335
- if (!this.i18n.hasNamespace(ns)) {
54336
- this.i18n.registerContent(ns, NOTIFICATION_PREFERENCES_VIEW_I18N);
54337
- }
54291
+ this.i18n.registerDefaults(ns, NOTIFICATION_PREFERENCES_VIEW_I18N);
54338
54292
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
54339
54293
  void this.refreshBrowserState();
54340
54294
  // Re-aplicar header en cambio de idioma.
@@ -55042,14 +54996,10 @@ class ApiKeyCreateModalComponent {
55042
54996
  actions: submitButton,
55043
54997
  };
55044
54998
  });
55045
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
55046
- this.i18n.registerContent(DEFAULT_NAMESPACE$4, API_KEYS_MODAL_I18N);
55047
- }
54999
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE$4, API_KEYS_MODAL_I18N);
55048
55000
  }
55049
55001
  ngOnInit() {
55050
- if (!this.i18n.hasNamespace(this.i18nNamespace)) {
55051
- this.i18n.registerContent(this.i18nNamespace, API_KEYS_MODAL_I18N);
55052
- }
55002
+ this.i18n.registerDefaults(this.i18nNamespace, API_KEYS_MODAL_I18N);
55053
55003
  this.loadCatalog();
55054
55004
  }
55055
55005
  /**
@@ -55365,9 +55315,7 @@ class ApiKeysViewComponent {
55365
55315
  this.i18n.lang();
55366
55316
  return { variant: 'empty', title: this.tt('empty'), description: this.tt('emptyHint') };
55367
55317
  });
55368
- if (!this.i18n.hasNamespace(this.ns)) {
55369
- this.i18n.registerContent(this.ns, API_KEYS_VIEW_I18N);
55370
- }
55318
+ this.i18n.registerDefaults(this.ns, API_KEYS_VIEW_I18N);
55371
55319
  this.nav.setBackHeader('pageTitle', this.ns, { withMenu: true });
55372
55320
  this.load();
55373
55321
  connectPageRefresh(() => this.load());
@@ -56116,9 +56064,7 @@ class NotificationsViewComponent {
56116
56064
  state: this._loadingMore() ? ComponentStates.WORKING : ComponentStates.ENABLED,
56117
56065
  }));
56118
56066
  const ns = this.ns;
56119
- if (!this.i18n.hasNamespace(ns)) {
56120
- this.i18n.registerContent(ns, NOTIFICATIONS_VIEW_I18N);
56121
- }
56067
+ this.i18n.registerDefaults(ns, NOTIFICATIONS_VIEW_I18N);
56122
56068
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
56123
56069
  // Re-aplicar header en cambio de idioma.
56124
56070
  effect(() => {
@@ -56738,9 +56684,7 @@ class ContentReactionComponent {
56738
56684
  // Auto-registro de defaults i18n (es/en) si el consumer no proveyó el
56739
56685
  // namespace. Garantiza que `t()` nunca caiga en key faltante. Ver
56740
56686
  // CONTENT_REACTION_I18N. Idempotente: solo la 1ª instancia registra.
56741
- if (!this.i18n.hasNamespace('ContentReaction')) {
56742
- this.i18n.registerContent('ContentReaction', CONTENT_REACTION_I18N);
56743
- }
56687
+ this.i18n.registerDefaults('ContentReaction', CONTENT_REACTION_I18N);
56744
56688
  }
56745
56689
  /** Cierra el modal/sheet contenedor (si el componente se abrió vía ModalService). */
56746
56690
  close() {
@@ -57080,9 +57024,7 @@ class AboutViewComponent {
57080
57024
  };
57081
57025
  });
57082
57026
  const ns = this.ns;
57083
- if (!this.i18n.hasNamespace(ns)) {
57084
- this.i18n.registerContent(ns, ABOUT_VIEW_I18N);
57085
- }
57027
+ this.i18n.registerDefaults(ns, ABOUT_VIEW_I18N);
57086
57028
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
57087
57029
  }
57088
57030
  /** Helper i18n bound al namespace resuelto. Reactivo vía `lang()`. */
@@ -57544,9 +57486,7 @@ class FieldListComponent {
57544
57486
  const max = this.props.max;
57545
57487
  return max == null || this.rowsSig().length < max;
57546
57488
  });
57547
- if (!this.i18n.hasNamespace(I18N_NS$1)) {
57548
- this.i18n.registerContent(I18N_NS$1, FIELD_LIST_I18N);
57549
- }
57489
+ this.i18n.registerDefaults(I18N_NS$1, FIELD_LIST_I18N);
57550
57490
  }
57551
57491
  ngOnChanges(changes) {
57552
57492
  // Re-siembra solo si cambió la referencia de items entrante (evita pisar lo
@@ -57793,14 +57733,10 @@ class ApiKeysModalComponent {
57793
57733
  actions: submitButton,
57794
57734
  };
57795
57735
  });
57796
- if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {
57797
- this.i18n.registerContent(DEFAULT_NAMESPACE, API_KEYS_MODAL_I18N);
57798
- }
57736
+ this.i18n.registerDefaults(DEFAULT_NAMESPACE, API_KEYS_MODAL_I18N);
57799
57737
  }
57800
57738
  ngOnInit() {
57801
- if (!this.i18n.hasNamespace(this.i18nNamespace)) {
57802
- this.i18n.registerContent(this.i18nNamespace, API_KEYS_MODAL_I18N);
57803
- }
57739
+ this.i18n.registerDefaults(this.i18nNamespace, API_KEYS_MODAL_I18N);
57804
57740
  this.refresh();
57805
57741
  this.loadCatalog();
57806
57742
  }
@@ -64446,6 +64382,315 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
64446
64382
  type: Output
64447
64383
  }] } });
64448
64384
 
64385
+ class RequestService {
64386
+ constructor(config, http) {
64387
+ this.config = config;
64388
+ this.http = http;
64389
+ }
64390
+ get baseUrl() {
64391
+ return `${this.config.apiUrl}/v2/requests`;
64392
+ }
64393
+ get typesUrl() {
64394
+ return `${this.config.apiUrl}/v2/request-types`;
64395
+ }
64396
+ // ── Requests ──
64397
+ createRequest(payload) {
64398
+ return this.http.post(this.baseUrl, payload);
64399
+ }
64400
+ createAnonymousRequest(payload) {
64401
+ return this.http.post(`${this.baseUrl}/anonymous`, payload);
64402
+ }
64403
+ listRequests(params) {
64404
+ const qs = this.buildQueryString(params);
64405
+ return this.http.get(`${this.baseUrl}${qs}`);
64406
+ }
64407
+ listMyRequests(params) {
64408
+ const qs = this.buildQueryString(params);
64409
+ return this.http.get(`${this.baseUrl}/my${qs}`);
64410
+ }
64411
+ getRequest(id) {
64412
+ return this.http
64413
+ .get(`${this.baseUrl}/${id}`)
64414
+ .pipe(map$1(r => r.request));
64415
+ }
64416
+ updateRequest(id, payload) {
64417
+ return this.http
64418
+ .put(`${this.baseUrl}/${id}`, payload)
64419
+ .pipe(map$1(r => r.request));
64420
+ }
64421
+ transition(id, payload) {
64422
+ return this.http.post(`${this.baseUrl}/${id}/transition`, payload);
64423
+ }
64424
+ // ── Comments ──
64425
+ addComment(requestId, payload) {
64426
+ return this.http
64427
+ .post(`${this.baseUrl}/${requestId}/comments`, payload)
64428
+ .pipe(map$1(r => r.comment));
64429
+ }
64430
+ listComments(requestId) {
64431
+ return this.http.get(`${this.baseUrl}/${requestId}/comments`);
64432
+ }
64433
+ // ── Request Types ──
64434
+ listRequestTypes() {
64435
+ return this.http.get(this.typesUrl);
64436
+ }
64437
+ getRequestType(typeId) {
64438
+ return this.http.get(`${this.typesUrl}/${typeId}`);
64439
+ }
64440
+ createRequestType(payload) {
64441
+ return this.http
64442
+ .post(this.typesUrl, payload)
64443
+ .pipe(map$1(r => r.typeConfig));
64444
+ }
64445
+ updateRequestType(typeId, payload) {
64446
+ return this.http
64447
+ .put(`${this.typesUrl}/${typeId}`, payload)
64448
+ .pipe(map$1(r => r.typeConfig));
64449
+ }
64450
+ deleteRequestType(typeId) {
64451
+ return this.http.delete(`${this.typesUrl}/${typeId}`);
64452
+ }
64453
+ // ── Helpers ──
64454
+ buildQueryString(params) {
64455
+ if (!params)
64456
+ return '';
64457
+ const qs = new URLSearchParams();
64458
+ if (params.type)
64459
+ qs.set('type', params.type);
64460
+ if (params.status)
64461
+ qs.set('status', params.status);
64462
+ if (params.limit != null)
64463
+ qs.set('limit', String(params.limit));
64464
+ if (params.nextToken)
64465
+ qs.set('nextToken', params.nextToken);
64466
+ const str = qs.toString();
64467
+ return str ? `?${str}` : '';
64468
+ }
64469
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
64470
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, providedIn: 'root' }); }
64471
+ }
64472
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, decorators: [{
64473
+ type: Injectable,
64474
+ args: [{ providedIn: 'root' }]
64475
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
64476
+ type: Inject,
64477
+ args: [VALTECH_AUTH_CONFIG]
64478
+ }] }, { type: i1$3.HttpClient }] });
64479
+
64480
+ const REQUEST_FORM_I18N = {
64481
+ es: {
64482
+ title: 'Título',
64483
+ titlePlaceholder: 'Describe brevemente tu solicitud',
64484
+ titleValidation: 'El título debe tener al menos 3 caracteres',
64485
+ description: 'Descripción',
64486
+ descriptionPlaceholder: 'Añade más detalles aquí',
64487
+ descriptionValidation: 'La descripción es demasiado larga',
64488
+ submit: 'Enviar',
64489
+ success: 'Solicitud enviada exitosamente',
64490
+ error: 'Error al enviar la solicitud',
64491
+ },
64492
+ en: {
64493
+ title: 'Title',
64494
+ titlePlaceholder: 'Briefly describe your request',
64495
+ titleValidation: 'Title must be at least 3 characters',
64496
+ description: 'Description',
64497
+ descriptionPlaceholder: 'Add more details here',
64498
+ descriptionValidation: 'Description is too long',
64499
+ submit: 'Submit',
64500
+ success: 'Request submitted successfully',
64501
+ error: 'Error submitting the request',
64502
+ },
64503
+ };
64504
+ class RequestFormComponent {
64505
+ constructor() {
64506
+ this.props = { type: '' };
64507
+ this.onSubmit = new EventEmitter();
64508
+ this.onCancel = new EventEmitter();
64509
+ this.i18n = inject(I18nService);
64510
+ this.requestService = inject(RequestService);
64511
+ this.feedbackService = inject(FeedbackService);
64512
+ this.isSubmitting = signal(false);
64513
+ this.isSuccess = signal(false);
64514
+ this.error = signal(null);
64515
+ this.currentAttachments = [];
64516
+ addIcons({ checkmarkCircleOutline, closeCircleOutline });
64517
+ if (!this.i18n.hasNamespace('RequestForm')) {
64518
+ this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
64519
+ }
64520
+ }
64521
+ ngOnInit() {
64522
+ this.formProps = this.buildFormProps();
64523
+ }
64524
+ buildFormProps() {
64525
+ return {
64526
+ name: '',
64527
+ sections: [
64528
+ {
64529
+ name: '',
64530
+ order: 0,
64531
+ fields: [
64532
+ {
64533
+ token: 'request-title',
64534
+ name: 'title',
64535
+ label: this.props.titleLabel ?? this.t('title'),
64536
+ hint: '',
64537
+ placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
64538
+ type: InputType.TEXT,
64539
+ order: 1,
64540
+ validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
64541
+ errors: {
64542
+ required: this.t('titleValidation'),
64543
+ minlength: this.t('titleValidation'),
64544
+ maxlength: this.t('titleValidation'),
64545
+ },
64546
+ state: ComponentStates.ENABLED,
64547
+ },
64548
+ {
64549
+ token: 'request-description',
64550
+ name: 'description',
64551
+ label: this.props.descriptionLabel ?? this.t('description'),
64552
+ hint: '',
64553
+ placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
64554
+ type: InputType.TEXTAREA,
64555
+ order: 2,
64556
+ validators: [Validators.maxLength(5000)],
64557
+ errors: { maxlength: this.t('descriptionValidation') },
64558
+ state: ComponentStates.ENABLED,
64559
+ },
64560
+ ],
64561
+ },
64562
+ ],
64563
+ actions: {
64564
+ type: 'submit',
64565
+ color: 'dark',
64566
+ fill: 'solid',
64567
+ shape: 'round',
64568
+ expand: 'block',
64569
+ text: this.props.submitButtonText ?? this.t('submit'),
64570
+ state: ComponentStates.ENABLED,
64571
+ },
64572
+ state: ComponentStates.ENABLED,
64573
+ };
64574
+ }
64575
+ async handleFormSubmit(submitted) {
64576
+ if (this.isSubmitting())
64577
+ return;
64578
+ if (this.currentAttachments.some(a => a.status === 'uploading'))
64579
+ return;
64580
+ this.isSubmitting.set(true);
64581
+ this.error.set(null);
64582
+ this.isSuccess.set(false);
64583
+ this.formProps.state = ComponentStates.WORKING;
64584
+ this.formProps.actions.state = ComponentStates.WORKING;
64585
+ try {
64586
+ const title = submitted.fields['title'].trim();
64587
+ const description = submitted.fields['description']?.trim() ?? '';
64588
+ const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
64589
+ const result = await firstValueFrom(this.requestService.createRequest({
64590
+ type: this.props.type,
64591
+ title,
64592
+ fields: {
64593
+ ...(description ? { description } : {}),
64594
+ ...(attachmentUrls.length ? { attachmentUrls } : {}),
64595
+ },
64596
+ }));
64597
+ this.isSuccess.set(true);
64598
+ this.onSubmit.emit({
64599
+ requestId: result.requestId,
64600
+ request: result.request,
64601
+ type: this.props.type,
64602
+ title,
64603
+ attachmentUrls,
64604
+ });
64605
+ }
64606
+ catch (err) {
64607
+ this.error.set(err.error?.message || err.message || this.t('error'));
64608
+ }
64609
+ finally {
64610
+ this.isSubmitting.set(false);
64611
+ this.formProps.state = ComponentStates.ENABLED;
64612
+ this.formProps.actions.state = ComponentStates.ENABLED;
64613
+ }
64614
+ }
64615
+ onAttachmentsChange(items) {
64616
+ this.currentAttachments = items;
64617
+ }
64618
+ onCancelClick() {
64619
+ this.onCancel.emit();
64620
+ }
64621
+ t(key) {
64622
+ return this.i18n.t(key, 'RequestForm');
64623
+ }
64624
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
64625
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestFormComponent, isStandalone: true, selector: "val-request-form", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit", onCancel: "onCancel" }, ngImport: i0, template: `
64626
+ <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
64627
+ <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
64628
+ @if (props.showAttachments !== false) {
64629
+ <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
64630
+ }
64631
+
64632
+ @if (error()) {
64633
+ <div class="request-alert error">
64634
+ <ion-icon name="close-circle-outline" aria-hidden="true" />
64635
+ <span>{{ error() }}</span>
64636
+ </div>
64637
+ }
64638
+
64639
+ @if (isSuccess()) {
64640
+ <div class="request-alert success">
64641
+ <ion-icon name="checkmark-circle-outline" aria-hidden="true" />
64642
+ <span>{{ props.successMessage || t('success') }}</span>
64643
+ </div>
64644
+ }
64645
+ </val-form>
64646
+
64647
+ @if (props.cancelButtonText) {
64648
+ <ion-button fill="outline" color="medium" expand="block" class="cancel-button" (click)="onCancelClick()">
64649
+ {{ props.cancelButtonText }}
64650
+ </ion-button>
64651
+ }
64652
+ </div>
64653
+ `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
64654
+ }
64655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
64656
+ type: Component,
64657
+ args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
64658
+ <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
64659
+ <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
64660
+ @if (props.showAttachments !== false) {
64661
+ <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
64662
+ }
64663
+
64664
+ @if (error()) {
64665
+ <div class="request-alert error">
64666
+ <ion-icon name="close-circle-outline" aria-hidden="true" />
64667
+ <span>{{ error() }}</span>
64668
+ </div>
64669
+ }
64670
+
64671
+ @if (isSuccess()) {
64672
+ <div class="request-alert success">
64673
+ <ion-icon name="checkmark-circle-outline" aria-hidden="true" />
64674
+ <span>{{ props.successMessage || t('success') }}</span>
64675
+ </div>
64676
+ }
64677
+ </val-form>
64678
+
64679
+ @if (props.cancelButtonText) {
64680
+ <ion-button fill="outline" color="medium" expand="block" class="cancel-button" (click)="onCancelClick()">
64681
+ {{ props.cancelButtonText }}
64682
+ </ion-button>
64683
+ }
64684
+ </div>
64685
+ `, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"] }]
64686
+ }], ctorParameters: () => [], propDecorators: { props: [{
64687
+ type: Input
64688
+ }], onSubmit: [{
64689
+ type: Output
64690
+ }], onCancel: [{
64691
+ type: Output
64692
+ }] } });
64693
+
64449
64694
  const DEFAULT_SPLASH_SCREEN_CONFIG = {
64450
64695
  fadeOutDuration: 300,
64451
64696
  };
@@ -67336,101 +67581,6 @@ const REQUEST_STATUSES = [
67336
67581
  'closed',
67337
67582
  ];
67338
67583
 
67339
- class RequestService {
67340
- constructor(config, http) {
67341
- this.config = config;
67342
- this.http = http;
67343
- }
67344
- get baseUrl() {
67345
- return `${this.config.apiUrl}/v2/requests`;
67346
- }
67347
- get typesUrl() {
67348
- return `${this.config.apiUrl}/v2/request-types`;
67349
- }
67350
- // ── Requests ──
67351
- createRequest(payload) {
67352
- return this.http.post(this.baseUrl, payload);
67353
- }
67354
- createAnonymousRequest(payload) {
67355
- return this.http.post(`${this.baseUrl}/anonymous`, payload);
67356
- }
67357
- listRequests(params) {
67358
- const qs = this.buildQueryString(params);
67359
- return this.http.get(`${this.baseUrl}${qs}`);
67360
- }
67361
- listMyRequests(params) {
67362
- const qs = this.buildQueryString(params);
67363
- return this.http.get(`${this.baseUrl}/my${qs}`);
67364
- }
67365
- getRequest(id) {
67366
- return this.http
67367
- .get(`${this.baseUrl}/${id}`)
67368
- .pipe(map$1(r => r.request));
67369
- }
67370
- updateRequest(id, payload) {
67371
- return this.http
67372
- .put(`${this.baseUrl}/${id}`, payload)
67373
- .pipe(map$1(r => r.request));
67374
- }
67375
- transition(id, payload) {
67376
- return this.http.post(`${this.baseUrl}/${id}/transition`, payload);
67377
- }
67378
- // ── Comments ──
67379
- addComment(requestId, payload) {
67380
- return this.http
67381
- .post(`${this.baseUrl}/${requestId}/comments`, payload)
67382
- .pipe(map$1(r => r.comment));
67383
- }
67384
- listComments(requestId) {
67385
- return this.http.get(`${this.baseUrl}/${requestId}/comments`);
67386
- }
67387
- // ── Request Types ──
67388
- listRequestTypes() {
67389
- return this.http.get(this.typesUrl);
67390
- }
67391
- getRequestType(typeId) {
67392
- return this.http.get(`${this.typesUrl}/${typeId}`);
67393
- }
67394
- createRequestType(payload) {
67395
- return this.http
67396
- .post(this.typesUrl, payload)
67397
- .pipe(map$1(r => r.typeConfig));
67398
- }
67399
- updateRequestType(typeId, payload) {
67400
- return this.http
67401
- .put(`${this.typesUrl}/${typeId}`, payload)
67402
- .pipe(map$1(r => r.typeConfig));
67403
- }
67404
- deleteRequestType(typeId) {
67405
- return this.http.delete(`${this.typesUrl}/${typeId}`);
67406
- }
67407
- // ── Helpers ──
67408
- buildQueryString(params) {
67409
- if (!params)
67410
- return '';
67411
- const qs = new URLSearchParams();
67412
- if (params.type)
67413
- qs.set('type', params.type);
67414
- if (params.status)
67415
- qs.set('status', params.status);
67416
- if (params.limit != null)
67417
- qs.set('limit', String(params.limit));
67418
- if (params.nextToken)
67419
- qs.set('nextToken', params.nextToken);
67420
- const str = qs.toString();
67421
- return str ? `?${str}` : '';
67422
- }
67423
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
67424
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, providedIn: 'root' }); }
67425
- }
67426
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, decorators: [{
67427
- type: Injectable,
67428
- args: [{ providedIn: 'root' }]
67429
- }], ctorParameters: () => [{ type: undefined, decorators: [{
67430
- type: Inject,
67431
- args: [VALTECH_AUTH_CONFIG]
67432
- }] }, { type: i1$3.HttpClient }] });
67433
-
67434
67584
  class RequestFormBuilderService {
67435
67585
  constructor() {
67436
67586
  this.i18n = inject(I18nService);
@@ -67988,9 +68138,7 @@ class AuthCtaComponent {
67988
68138
  return undefined;
67989
68139
  return IONIC_COLORS.includes(bg) ? `var(--ion-color-${bg})` : bg;
67990
68140
  });
67991
- if (!this.i18n.hasNamespace('AuthCta')) {
67992
- this.i18n.registerContent('AuthCta', AUTH_CTA_I18N);
67993
- }
68141
+ this.i18n.registerDefaults('AuthCta', AUTH_CTA_I18N);
67994
68142
  }
67995
68143
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthCtaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
67996
68144
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AuthCtaComponent, isStandalone: true, selector: "val-auth-cta", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onLogin: "onLogin", onRegister: "onRegister" }, ngImport: i0, template: `
@@ -68201,9 +68349,7 @@ class TicketCardComponent {
68201
68349
  }
68202
68350
  return '';
68203
68351
  });
68204
- if (!this.i18n.hasNamespace('TicketCard')) {
68205
- this.i18n.registerContent('TicketCard', TICKET_CARD_I18N);
68206
- }
68352
+ this.i18n.registerDefaults('TicketCard', TICKET_CARD_I18N);
68207
68353
  // Regenera el QR cuando cambia el token o el tamaño.
68208
68354
  effect(() => {
68209
68355
  const token = this.props().qrToken;
@@ -68391,9 +68537,7 @@ class QrScannerComponent {
68391
68537
  this.lastValue = '';
68392
68538
  this.lastAt = 0;
68393
68539
  this.viewReady = false;
68394
- if (!this.i18n.hasNamespace('QrScanner')) {
68395
- this.i18n.registerContent('QrScanner', QR_SCANNER_I18N);
68396
- }
68540
+ this.i18n.registerDefaults('QrScanner', QR_SCANNER_I18N);
68397
68541
  }
68398
68542
  ngAfterViewInit() {
68399
68543
  this.viewReady = true;
@@ -68662,5 +68806,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
68662
68806
  * Generated bundle index. Do not edit.
68663
68807
  */
68664
68808
 
68665
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, 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_BUTTON_PRESETS, 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_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, 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, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
68809
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, 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_BUTTON_PRESETS, 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_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, 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, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
68666
68810
  //# sourceMappingURL=valtech-components.mjs.map