valtech-components 4.0.72 → 4.0.73

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 (52) 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/ticket-card/ticket-card.component.mjs +2 -4
  14. package/esm2022/lib/components/organisms/about-view/about-view.component.mjs +2 -4
  15. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +2 -4
  16. package/esm2022/lib/components/organisms/api-key-create-modal/api-key-create-modal.component.mjs +3 -7
  17. package/esm2022/lib/components/organisms/api-keys-modal/api-keys-modal.component.mjs +3 -7
  18. package/esm2022/lib/components/organisms/api-keys-view/api-keys-view.component.mjs +2 -4
  19. package/esm2022/lib/components/organisms/auth-cta/auth-cta.component.mjs +2 -4
  20. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +2 -4
  21. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +2 -4
  22. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +2 -4
  23. package/esm2022/lib/components/organisms/field-list/field-list.component.mjs +2 -4
  24. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +2 -4
  25. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +3 -7
  26. package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.component.mjs +3 -7
  27. package/esm2022/lib/components/organisms/notification-preferences-view/notification-preferences-view.component.mjs +2 -4
  28. package/esm2022/lib/components/organisms/notifications-view/notifications-view.component.mjs +2 -4
  29. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +2 -4
  30. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +2 -4
  31. package/esm2022/lib/components/organisms/permissions-view/permissions-view.component.mjs +2 -4
  32. package/esm2022/lib/components/organisms/preferences-view/preferences-view.component.mjs +2 -4
  33. package/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +2 -4
  34. package/esm2022/lib/components/organisms/qr-scanner/qr-scanner.component.mjs +2 -4
  35. package/esm2022/lib/components/organisms/security-view/security-view.component.mjs +2 -4
  36. package/esm2022/lib/components/organisms/settings-hub/settings-hub.component.mjs +3 -7
  37. package/esm2022/lib/components/organisms/share-profile-modal/share-profile-modal.component.mjs +2 -4
  38. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +2 -4
  39. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +3 -7
  40. package/esm2022/lib/services/i18n/i18n.service.mjs +21 -1
  41. package/esm2022/lib/version.mjs +2 -2
  42. package/fesm2022/valtech-components.mjs +66 -136
  43. package/fesm2022/valtech-components.mjs.map +1 -1
  44. package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +2 -2
  45. package/lib/components/molecules/cta-card/cta-card.component.d.ts +1 -1
  46. package/lib/components/molecules/metric-card/metric-card.component.d.ts +1 -1
  47. package/lib/components/organisms/article/article.component.d.ts +5 -5
  48. package/lib/components/organisms/auth-cta/auth-cta.component.d.ts +1 -1
  49. package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
  50. package/lib/services/i18n/i18n.service.d.ts +7 -0
  51. package/lib/version.d.ts +1 -1
  52. package/package.json +1 -1
@@ -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.73';
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
  }
@@ -67988,9 +67924,7 @@ class AuthCtaComponent {
67988
67924
  return undefined;
67989
67925
  return IONIC_COLORS.includes(bg) ? `var(--ion-color-${bg})` : bg;
67990
67926
  });
67991
- if (!this.i18n.hasNamespace('AuthCta')) {
67992
- this.i18n.registerContent('AuthCta', AUTH_CTA_I18N);
67993
- }
67927
+ this.i18n.registerDefaults('AuthCta', AUTH_CTA_I18N);
67994
67928
  }
67995
67929
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthCtaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
67996
67930
  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 +68135,7 @@ class TicketCardComponent {
68201
68135
  }
68202
68136
  return '';
68203
68137
  });
68204
- if (!this.i18n.hasNamespace('TicketCard')) {
68205
- this.i18n.registerContent('TicketCard', TICKET_CARD_I18N);
68206
- }
68138
+ this.i18n.registerDefaults('TicketCard', TICKET_CARD_I18N);
68207
68139
  // Regenera el QR cuando cambia el token o el tamaño.
68208
68140
  effect(() => {
68209
68141
  const token = this.props().qrToken;
@@ -68391,9 +68323,7 @@ class QrScannerComponent {
68391
68323
  this.lastValue = '';
68392
68324
  this.lastAt = 0;
68393
68325
  this.viewReady = false;
68394
- if (!this.i18n.hasNamespace('QrScanner')) {
68395
- this.i18n.registerContent('QrScanner', QR_SCANNER_I18N);
68396
- }
68326
+ this.i18n.registerDefaults('QrScanner', QR_SCANNER_I18N);
68397
68327
  }
68398
68328
  ngAfterViewInit() {
68399
68329
  this.viewReady = true;