valtech-components 2.0.993 → 2.0.995
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.component.mjs +313 -0
- package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.i18n.mjs +63 -0
- package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +53 -1
- package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +3 -1
- package/esm2022/lib/services/auth/auth.service.mjs +14 -1
- package/esm2022/lib/services/auth/types.mjs +1 -1
- package/esm2022/lib/services/org/org.service.mjs +8 -1
- package/esm2022/lib/services/org/types.mjs +1 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/valtech-components.mjs +480 -42
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/member-import-modal/member-import-modal.component.d.ts +47 -0
- package/lib/components/organisms/member-import-modal/member-import-modal.i18n.d.ts +6 -0
- package/lib/components/organisms/organization-view/organization-view.component.d.ts +3 -0
- package/lib/services/auth/auth.service.d.ts +7 -1
- package/lib/services/auth/types.d.ts +23 -0
- package/lib/services/org/org.service.d.ts +6 -1
- package/lib/services/org/types.d.ts +30 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -54,7 +54,7 @@ import 'prismjs/components/prism-json';
|
|
|
54
54
|
* Current version of valtech-components.
|
|
55
55
|
* This is automatically updated during the publish process.
|
|
56
56
|
*/
|
|
57
|
-
const VERSION = '2.0.
|
|
57
|
+
const VERSION = '2.0.995';
|
|
58
58
|
|
|
59
59
|
// Control de estado de refresco (singleton a nivel de módulo)
|
|
60
60
|
let isRefreshing = false;
|
|
@@ -8658,6 +8658,19 @@ class AuthService {
|
|
|
8658
8658
|
.post(`${this.baseUrl}/reset-password`, request)
|
|
8659
8659
|
.pipe(catchError(error => this.handleAuthError(error)));
|
|
8660
8660
|
}
|
|
8661
|
+
/**
|
|
8662
|
+
* Activa una cuenta pre-aprovisionada por una organización (ADR-023): define
|
|
8663
|
+
* la contraseña con el token del enlace de email. En éxito el backend devuelve
|
|
8664
|
+
* tokens de auto-signin → el usuario queda logueado (mismo flujo que verify-email).
|
|
8665
|
+
*/
|
|
8666
|
+
activateAccount(request) {
|
|
8667
|
+
this.stateService.clearError();
|
|
8668
|
+
return this.http.post(`${this.baseUrl}/activate`, request).pipe(tap(response => {
|
|
8669
|
+
if (response.activated && response.accessToken) {
|
|
8670
|
+
this.handleSuccessfulAuth(response);
|
|
8671
|
+
}
|
|
8672
|
+
}), catchError(error => this.handleAuthError(error)));
|
|
8673
|
+
}
|
|
8661
8674
|
/**
|
|
8662
8675
|
* Cambia la contraseña del usuario autenticado.
|
|
8663
8676
|
* Requiere la contraseña actual para verificación.
|
|
@@ -41737,7 +41750,7 @@ const PROFILE_VIEW_I18N = {
|
|
|
41737
41750
|
const HANDLE_PATTERN = /^[a-z_][a-z0-9_]*$/;
|
|
41738
41751
|
const HANDLE_MIN = 3;
|
|
41739
41752
|
const HANDLE_MAX = 20;
|
|
41740
|
-
const DEFAULT_NAMESPACE$
|
|
41753
|
+
const DEFAULT_NAMESPACE$e = 'Settings.Profile';
|
|
41741
41754
|
/**
|
|
41742
41755
|
* `val-profile-view` — vista Perfil full-feature autocontenida (organism).
|
|
41743
41756
|
*
|
|
@@ -41787,7 +41800,7 @@ class ProfileViewComponent {
|
|
|
41787
41800
|
showPhone: merged.showPhone ?? true,
|
|
41788
41801
|
showShareCta: merged.showShareCta ?? true,
|
|
41789
41802
|
profileBaseUrl: merged.profileBaseUrl ?? '',
|
|
41790
|
-
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$
|
|
41803
|
+
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$e,
|
|
41791
41804
|
onSaved: merged.onSaved,
|
|
41792
41805
|
onAvatarUploaded: merged.onAvatarUploaded,
|
|
41793
41806
|
};
|
|
@@ -42703,7 +42716,7 @@ const PREFERENCES_VIEW_I18N = {
|
|
|
42703
42716
|
},
|
|
42704
42717
|
};
|
|
42705
42718
|
|
|
42706
|
-
const DEFAULT_NAMESPACE$
|
|
42719
|
+
const DEFAULT_NAMESPACE$d = 'Settings.General';
|
|
42707
42720
|
const DEFAULT_LANGUAGES = ['es', 'en'];
|
|
42708
42721
|
/**
|
|
42709
42722
|
* `val-preferences-view` — vista de preferencias de UI cross-app (tema +
|
|
@@ -42740,7 +42753,7 @@ class PreferencesViewComponent {
|
|
|
42740
42753
|
showLanguage: merged.showLanguage ?? true,
|
|
42741
42754
|
showFontSize: merged.showFontSize ?? true,
|
|
42742
42755
|
supportedLanguages: merged.supportedLanguages ?? DEFAULT_LANGUAGES,
|
|
42743
|
-
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$
|
|
42756
|
+
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$d,
|
|
42744
42757
|
onThemeChanged: merged.onThemeChanged,
|
|
42745
42758
|
onLanguageChanged: merged.onLanguageChanged,
|
|
42746
42759
|
onFontSizeChanged: merged.onFontSizeChanged,
|
|
@@ -44552,7 +44565,7 @@ const SECURITY_VIEW_I18N = {
|
|
|
44552
44565
|
};
|
|
44553
44566
|
|
|
44554
44567
|
addIcons({ laptopOutline, phonePortraitOutline });
|
|
44555
|
-
const DEFAULT_NAMESPACE$
|
|
44568
|
+
const DEFAULT_NAMESPACE$c = 'Settings.Security';
|
|
44556
44569
|
/**
|
|
44557
44570
|
* `val-security-view` — vista Seguridad full-feature autocontenida (organism).
|
|
44558
44571
|
*
|
|
@@ -44601,7 +44614,7 @@ class SecurityViewComponent {
|
|
|
44601
44614
|
showChangeEmail: merged.showChangeEmail ?? true,
|
|
44602
44615
|
showMfa: merged.showMfa ?? true,
|
|
44603
44616
|
showPolicies: merged.showPolicies ?? true,
|
|
44604
|
-
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$
|
|
44617
|
+
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$c,
|
|
44605
44618
|
handleDeepLinks: merged.handleDeepLinks ?? true,
|
|
44606
44619
|
homeRoute: merged.homeRoute ?? '/app/home',
|
|
44607
44620
|
onMfaCompleted: merged.onMfaCompleted,
|
|
@@ -45403,6 +45416,13 @@ class OrgService {
|
|
|
45403
45416
|
inviteUser(orgId, req) {
|
|
45404
45417
|
return this.http.post(`${this.baseUrl}/${orgId}/invite`, req);
|
|
45405
45418
|
}
|
|
45419
|
+
/**
|
|
45420
|
+
* Crea/asigna miembros en masa (ADR-023). Resultado por-fila (partial success):
|
|
45421
|
+
* `created` (pre-aprovisionado), `assigned` (ya existía), `skipped`, `error`.
|
|
45422
|
+
*/
|
|
45423
|
+
importMembers(orgId, req) {
|
|
45424
|
+
return this.http.post(`${this.baseUrl}/${orgId}/members/import`, req);
|
|
45425
|
+
}
|
|
45406
45426
|
leaveOrg(orgId) {
|
|
45407
45427
|
return this.http.post(`${this.baseUrl}/${orgId}/leave`, {});
|
|
45408
45428
|
}
|
|
@@ -45507,7 +45527,7 @@ const CREATE_ORG_MODAL_I18N = {
|
|
|
45507
45527
|
},
|
|
45508
45528
|
};
|
|
45509
45529
|
|
|
45510
|
-
const DEFAULT_NAMESPACE$
|
|
45530
|
+
const DEFAULT_NAMESPACE$b = 'CreateOrgModal';
|
|
45511
45531
|
/**
|
|
45512
45532
|
* `val-create-org-modal` — modal de creación de organización (organism
|
|
45513
45533
|
* compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
|
|
@@ -45533,10 +45553,10 @@ class CreateOrgModalComponent {
|
|
|
45533
45553
|
this.toast = inject(ToastService);
|
|
45534
45554
|
this.errors = inject(ValtechErrorService);
|
|
45535
45555
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
45536
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
45556
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$b;
|
|
45537
45557
|
this._busy = signal(false);
|
|
45538
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
45539
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
45558
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$b)) {
|
|
45559
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$b, CREATE_ORG_MODAL_I18N);
|
|
45540
45560
|
}
|
|
45541
45561
|
this.formMeta = signal(this.buildFormMeta());
|
|
45542
45562
|
effect(() => {
|
|
@@ -45772,7 +45792,7 @@ const DELETE_ACCOUNT_MODAL_I18N = {
|
|
|
45772
45792
|
},
|
|
45773
45793
|
};
|
|
45774
45794
|
|
|
45775
|
-
const DEFAULT_NAMESPACE$
|
|
45795
|
+
const DEFAULT_NAMESPACE$a = 'Settings.DeleteAccount';
|
|
45776
45796
|
/**
|
|
45777
45797
|
* `val-delete-account-modal` — modal de eliminación de cuenta (organism,
|
|
45778
45798
|
* cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.
|
|
@@ -45798,7 +45818,7 @@ class DeleteAccountModalComponent {
|
|
|
45798
45818
|
this.i18n = inject(I18nService);
|
|
45799
45819
|
this.toast = inject(ToastService);
|
|
45800
45820
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
45801
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
45821
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$a;
|
|
45802
45822
|
this.hasPassword = signal(null);
|
|
45803
45823
|
this.codeSent = signal(false);
|
|
45804
45824
|
this.formState = signal(ComponentStates.ENABLED);
|
|
@@ -45865,8 +45885,8 @@ class DeleteAccountModalComponent {
|
|
|
45865
45885
|
],
|
|
45866
45886
|
actions: this.submitBtn('delete-code-submit', 'confirmCta'),
|
|
45867
45887
|
}));
|
|
45868
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
45869
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
45888
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$a)) {
|
|
45889
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$a, DELETE_ACCOUNT_MODAL_I18N);
|
|
45870
45890
|
}
|
|
45871
45891
|
}
|
|
45872
45892
|
ngOnInit() {
|
|
@@ -46067,7 +46087,7 @@ const ORG_INFO_SHEET_I18N = {
|
|
|
46067
46087
|
},
|
|
46068
46088
|
};
|
|
46069
46089
|
|
|
46070
|
-
const DEFAULT_NAMESPACE$
|
|
46090
|
+
const DEFAULT_NAMESPACE$9 = 'OrgInfoSheet';
|
|
46071
46091
|
/**
|
|
46072
46092
|
* `val-org-info-sheet` — sheet informativo "¿Qué son las organizaciones?".
|
|
46073
46093
|
* Extraído del `OrgInfoSheetComponent` inline de `AccountPage` bajo el proceso de
|
|
@@ -46112,15 +46132,15 @@ class OrgInfoSheetComponent {
|
|
|
46112
46132
|
text: this.closeProps.text || this.resolvedCloseLabel(),
|
|
46113
46133
|
}));
|
|
46114
46134
|
addIcons({ peopleOutline, swapHorizontalOutline, mailOutline });
|
|
46115
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
46116
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
46135
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$9)) {
|
|
46136
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$9, ORG_INFO_SHEET_I18N);
|
|
46117
46137
|
}
|
|
46118
46138
|
}
|
|
46119
46139
|
dismiss() {
|
|
46120
46140
|
this._modalRef?.dismiss(null, 'cancel');
|
|
46121
46141
|
}
|
|
46122
46142
|
tt(key) {
|
|
46123
|
-
return this.i18n.t(key, DEFAULT_NAMESPACE$
|
|
46143
|
+
return this.i18n.t(key, DEFAULT_NAMESPACE$9);
|
|
46124
46144
|
}
|
|
46125
46145
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
46126
46146
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: OrgInfoSheetComponent, isStandalone: true, selector: "val-org-info-sheet", inputs: { title: "title", subtitle: "subtitle", body: "body", closeLabel: "closeLabel", closeProps: "closeProps", _modalRef: "_modalRef" }, ngImport: i0, template: `
|
|
@@ -46287,7 +46307,7 @@ const SWITCH_ORG_MODAL_I18N = {
|
|
|
46287
46307
|
},
|
|
46288
46308
|
};
|
|
46289
46309
|
|
|
46290
|
-
const DEFAULT_NAMESPACE$
|
|
46310
|
+
const DEFAULT_NAMESPACE$8 = 'Settings.SwitchOrg';
|
|
46291
46311
|
addIcons({ businessOutline, checkmarkCircleOutline });
|
|
46292
46312
|
/**
|
|
46293
46313
|
* `val-switch-org-modal` — modal de cambio de organización activa (organism
|
|
@@ -46313,7 +46333,7 @@ class SwitchOrgModalComponent {
|
|
|
46313
46333
|
this.orgSwitch = inject(OrgSwitchService);
|
|
46314
46334
|
this.errors = inject(ValtechErrorService);
|
|
46315
46335
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
46316
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
46336
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$8;
|
|
46317
46337
|
this.orgs = signal([]);
|
|
46318
46338
|
this.loading = signal(false);
|
|
46319
46339
|
this.query = signal('');
|
|
@@ -46329,8 +46349,8 @@ class SwitchOrgModalComponent {
|
|
|
46329
46349
|
return list;
|
|
46330
46350
|
return list.filter(o => o.name.toLowerCase().includes(q));
|
|
46331
46351
|
});
|
|
46332
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
46333
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
46352
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$8)) {
|
|
46353
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$8, SWITCH_ORG_MODAL_I18N);
|
|
46334
46354
|
}
|
|
46335
46355
|
this.loadOrgs();
|
|
46336
46356
|
}
|
|
@@ -46648,7 +46668,7 @@ const ACCOUNT_VIEW_I18N = {
|
|
|
46648
46668
|
};
|
|
46649
46669
|
|
|
46650
46670
|
addIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline });
|
|
46651
|
-
const DEFAULT_NAMESPACE$
|
|
46671
|
+
const DEFAULT_NAMESPACE$7 = 'Settings.Account';
|
|
46652
46672
|
const DEFAULT_MANAGE_ORG_ROUTE = '/app/settings/organization';
|
|
46653
46673
|
/**
|
|
46654
46674
|
* `val-account-view` — vista Cuenta full-feature autocontenida (organism).
|
|
@@ -46689,7 +46709,7 @@ class AccountViewComponent {
|
|
|
46689
46709
|
showNewOrgCta: merged.showNewOrgCta ?? true,
|
|
46690
46710
|
showLogout: merged.showLogout ?? true,
|
|
46691
46711
|
showDeleteAccount: merged.showDeleteAccount ?? true,
|
|
46692
|
-
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$
|
|
46712
|
+
i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$7,
|
|
46693
46713
|
manageOrgRoute: merged.manageOrgRoute ?? DEFAULT_MANAGE_ORG_ROUTE,
|
|
46694
46714
|
onOrgSwitched: merged.onOrgSwitched,
|
|
46695
46715
|
onOrgCreated: merged.onOrgCreated,
|
|
@@ -47414,7 +47434,7 @@ const EDIT_ORG_MODAL_I18N = {
|
|
|
47414
47434
|
},
|
|
47415
47435
|
};
|
|
47416
47436
|
|
|
47417
|
-
const DEFAULT_NAMESPACE$
|
|
47437
|
+
const DEFAULT_NAMESPACE$6 = 'EditOrgModal';
|
|
47418
47438
|
/**
|
|
47419
47439
|
* `val-edit-org-modal` — modal de edición de organización (nombre + descripción).
|
|
47420
47440
|
* Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por la vista de
|
|
@@ -47441,10 +47461,10 @@ class EditOrgModalComponent {
|
|
|
47441
47461
|
/** Organización a editar (pasada por `componentProps`). */
|
|
47442
47462
|
this.org = null;
|
|
47443
47463
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
47444
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
47464
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$6;
|
|
47445
47465
|
this.saving = signal(false);
|
|
47446
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
47447
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
47466
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$6)) {
|
|
47467
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$6, EDIT_ORG_MODAL_I18N);
|
|
47448
47468
|
}
|
|
47449
47469
|
this.formMeta = signal(this.buildFormMeta());
|
|
47450
47470
|
effect(() => {
|
|
@@ -47682,7 +47702,7 @@ const INVITE_MEMBER_MODAL_I18N = {
|
|
|
47682
47702
|
},
|
|
47683
47703
|
};
|
|
47684
47704
|
|
|
47685
|
-
const DEFAULT_NAMESPACE$
|
|
47705
|
+
const DEFAULT_NAMESPACE$5 = 'InviteModal';
|
|
47686
47706
|
addIcons({ personOutline, mailOutline, closeOutline, checkmarkCircleOutline });
|
|
47687
47707
|
/**
|
|
47688
47708
|
* `val-invite-member-modal` — invitación de miembros a una organización.
|
|
@@ -47713,7 +47733,7 @@ class InviteMemberModalComponent {
|
|
|
47713
47733
|
/** Ids de miembros ya existentes (excluidos de los resultados). */
|
|
47714
47734
|
this.existingMemberIds = [];
|
|
47715
47735
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
47716
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
47736
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$5;
|
|
47717
47737
|
this.query = signal('');
|
|
47718
47738
|
this.searching = signal(false);
|
|
47719
47739
|
this.searchResults = signal([]);
|
|
@@ -47760,8 +47780,8 @@ class InviteMemberModalComponent {
|
|
|
47760
47780
|
state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
|
|
47761
47781
|
}));
|
|
47762
47782
|
this.searchSubject = new Subject();
|
|
47763
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
47764
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
47783
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$5)) {
|
|
47784
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$5, INVITE_MEMBER_MODAL_I18N);
|
|
47765
47785
|
}
|
|
47766
47786
|
this.loadRoles();
|
|
47767
47787
|
this.roleSub = this.roleControl.valueChanges.subscribe(v => {
|
|
@@ -48250,7 +48270,7 @@ const MEMBER_DETAIL_MODAL_I18N = {
|
|
|
48250
48270
|
},
|
|
48251
48271
|
};
|
|
48252
48272
|
|
|
48253
|
-
const DEFAULT_NAMESPACE$
|
|
48273
|
+
const DEFAULT_NAMESPACE$4 = 'Settings.MemberDetail';
|
|
48254
48274
|
/**
|
|
48255
48275
|
* `val-member-detail-modal` — detalle de miembro de organización: perfil, rol y
|
|
48256
48276
|
* permisos. Promovido desde `showcase` bajo el proceso de ADR-021.
|
|
@@ -48287,7 +48307,7 @@ class MemberDetailModalComponent {
|
|
|
48287
48307
|
{ id: 'admin', name: 'admin' },
|
|
48288
48308
|
];
|
|
48289
48309
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
48290
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
48310
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$4;
|
|
48291
48311
|
this.working = signal(false);
|
|
48292
48312
|
this.currentRole = signal('');
|
|
48293
48313
|
this.roleControl = new FormControl('');
|
|
@@ -48327,8 +48347,8 @@ class MemberDetailModalComponent {
|
|
|
48327
48347
|
type: 'button',
|
|
48328
48348
|
state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
|
|
48329
48349
|
}));
|
|
48330
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
48331
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
48350
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$4)) {
|
|
48351
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$4, MEMBER_DETAIL_MODAL_I18N);
|
|
48332
48352
|
}
|
|
48333
48353
|
}
|
|
48334
48354
|
ngOnInit() {
|
|
@@ -48665,7 +48685,7 @@ const TRANSFER_OWNERSHIP_MODAL_I18N = {
|
|
|
48665
48685
|
},
|
|
48666
48686
|
};
|
|
48667
48687
|
|
|
48668
|
-
const DEFAULT_NAMESPACE$
|
|
48688
|
+
const DEFAULT_NAMESPACE$3 = 'Settings.TransferModal';
|
|
48669
48689
|
/**
|
|
48670
48690
|
* `val-transfer-ownership-modal` — selector de miembro para transferir la
|
|
48671
48691
|
* propiedad de la organización. Promovido desde `showcase` bajo el proceso de
|
|
@@ -48689,7 +48709,7 @@ class TransferOwnershipModalComponent {
|
|
|
48689
48709
|
/** Lista de miembros transferibles (todos excepto el owner actual). */
|
|
48690
48710
|
this.members = [];
|
|
48691
48711
|
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
48692
|
-
this.i18nNamespace = DEFAULT_NAMESPACE$
|
|
48712
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$3;
|
|
48693
48713
|
this.query = signal('');
|
|
48694
48714
|
this.selectedId = signal('');
|
|
48695
48715
|
this.filtered = computed(() => {
|
|
@@ -48701,8 +48721,8 @@ class TransferOwnershipModalComponent {
|
|
|
48701
48721
|
m.userId.toLowerCase().includes(q));
|
|
48702
48722
|
});
|
|
48703
48723
|
this.noResultsLabel = computed(() => `${this.t('noResults')} "${this.query()}"`);
|
|
48704
|
-
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$
|
|
48705
|
-
this.i18n.registerContent(DEFAULT_NAMESPACE$
|
|
48724
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$3)) {
|
|
48725
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$3, TRANSFER_OWNERSHIP_MODAL_I18N);
|
|
48706
48726
|
}
|
|
48707
48727
|
}
|
|
48708
48728
|
ngOnInit() {
|
|
@@ -48887,6 +48907,371 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
48887
48907
|
type: Input
|
|
48888
48908
|
}] } });
|
|
48889
48909
|
|
|
48910
|
+
/**
|
|
48911
|
+
* Defaults i18n (es/en) embebidos en `val-member-import-modal` (ADR-023).
|
|
48912
|
+
* Auto-registrados si el consumer no proveyó el namespace `Settings.ImportModal`.
|
|
48913
|
+
*/
|
|
48914
|
+
const MEMBER_IMPORT_MODAL_I18N = {
|
|
48915
|
+
es: {
|
|
48916
|
+
title: 'Importar miembros',
|
|
48917
|
+
hint: 'Pega un CSV con columnas: email, nombre, rol (una fila por persona).',
|
|
48918
|
+
csvPlaceholder: 'email,nombre,rol\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
|
|
48919
|
+
rolesAvailable: 'Roles disponibles:',
|
|
48920
|
+
onConflictLabel: 'Si el email ya existe',
|
|
48921
|
+
conflictAssign: 'Asignar el rol',
|
|
48922
|
+
conflictSkip: 'Omitir',
|
|
48923
|
+
conflictError: 'Marcar error',
|
|
48924
|
+
sendActivation: 'Enviar email de activación a las cuentas nuevas',
|
|
48925
|
+
submit: 'Importar',
|
|
48926
|
+
submitting: 'Importando...',
|
|
48927
|
+
parseError: 'No se pudo interpretar el CSV. Revisa el formato.',
|
|
48928
|
+
noRows: 'Pega al menos una fila válida (email y rol).',
|
|
48929
|
+
summary: 'Resumen',
|
|
48930
|
+
created: 'creados',
|
|
48931
|
+
assigned: 'asignados',
|
|
48932
|
+
skipped: 'omitidos',
|
|
48933
|
+
failed: 'con error',
|
|
48934
|
+
colEmail: 'Email',
|
|
48935
|
+
colStatus: 'Estado',
|
|
48936
|
+
colDetail: 'Detalle',
|
|
48937
|
+
activationSent: 'activación enviada',
|
|
48938
|
+
activationPending: 'activación pendiente',
|
|
48939
|
+
again: 'Importar otro lote',
|
|
48940
|
+
close: 'Cerrar',
|
|
48941
|
+
genericError: 'No se pudo completar la importación. Intenta de nuevo.',
|
|
48942
|
+
},
|
|
48943
|
+
en: {
|
|
48944
|
+
title: 'Import members',
|
|
48945
|
+
hint: 'Paste a CSV with columns: email, name, role (one row per person).',
|
|
48946
|
+
csvPlaceholder: 'email,name,role\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
|
|
48947
|
+
rolesAvailable: 'Available roles:',
|
|
48948
|
+
onConflictLabel: 'If the email already exists',
|
|
48949
|
+
conflictAssign: 'Assign the role',
|
|
48950
|
+
conflictSkip: 'Skip',
|
|
48951
|
+
conflictError: 'Mark as error',
|
|
48952
|
+
sendActivation: 'Send activation email to new accounts',
|
|
48953
|
+
submit: 'Import',
|
|
48954
|
+
submitting: 'Importing...',
|
|
48955
|
+
parseError: "Couldn't parse the CSV. Check the format.",
|
|
48956
|
+
noRows: 'Paste at least one valid row (email and role).',
|
|
48957
|
+
summary: 'Summary',
|
|
48958
|
+
created: 'created',
|
|
48959
|
+
assigned: 'assigned',
|
|
48960
|
+
skipped: 'skipped',
|
|
48961
|
+
failed: 'failed',
|
|
48962
|
+
colEmail: 'Email',
|
|
48963
|
+
colStatus: 'Status',
|
|
48964
|
+
colDetail: 'Detail',
|
|
48965
|
+
activationSent: 'activation sent',
|
|
48966
|
+
activationPending: 'activation pending',
|
|
48967
|
+
again: 'Import another batch',
|
|
48968
|
+
close: 'Close',
|
|
48969
|
+
genericError: "Couldn't complete the import. Try again.",
|
|
48970
|
+
},
|
|
48971
|
+
};
|
|
48972
|
+
|
|
48973
|
+
const DEFAULT_NAMESPACE$2 = 'Settings.ImportModal';
|
|
48974
|
+
/**
|
|
48975
|
+
* `val-member-import-modal` — panel de carga masiva de miembros (ADR-023 fase 6).
|
|
48976
|
+
*
|
|
48977
|
+
* El admin pega un CSV (`email,nombre,rol`); el modal lo parsea a filas y llama
|
|
48978
|
+
* `OrgService.importMembers`. Muestra el resultado por-fila (partial success):
|
|
48979
|
+
* `created` / `assigned` / `skipped` / `error`. Header canónico (Regla #5).
|
|
48980
|
+
*
|
|
48981
|
+
* Auto-registra defaults i18n (es/en) en `Settings.ImportModal`.
|
|
48982
|
+
*/
|
|
48983
|
+
class MemberImportModalComponent {
|
|
48984
|
+
constructor() {
|
|
48985
|
+
this.i18n = inject(I18nService);
|
|
48986
|
+
this.orgService = inject(OrgService);
|
|
48987
|
+
/** Org destino del import. */
|
|
48988
|
+
this.orgId = '';
|
|
48989
|
+
/** Nombres de roles disponibles (para el hint). Opcional. */
|
|
48990
|
+
this.availableRoles = [];
|
|
48991
|
+
/** Namespace i18n. */
|
|
48992
|
+
this.i18nNamespace = DEFAULT_NAMESPACE$2;
|
|
48993
|
+
this.csv = '';
|
|
48994
|
+
this.onConflict = 'assignRole';
|
|
48995
|
+
this.sendActivation = true;
|
|
48996
|
+
this.submitting = signal(false);
|
|
48997
|
+
this.errorMsg = signal('');
|
|
48998
|
+
this.results = signal(null);
|
|
48999
|
+
this.rolesHint = computed(() => this.availableRoles.length ? `${this.t('rolesAvailable')} ${this.availableRoles.join(', ')}` : '');
|
|
49000
|
+
this.summaryLabel = computed(() => {
|
|
49001
|
+
const s = this.results()?.summary;
|
|
49002
|
+
if (!s)
|
|
49003
|
+
return this.t('summary');
|
|
49004
|
+
return `${this.t('summary')}: ${s.created} ${this.t('created')} · ${s.assigned} ${this.t('assigned')} · ${s.skipped} ${this.t('skipped')} · ${s.failed} ${this.t('failed')}`;
|
|
49005
|
+
});
|
|
49006
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$2)) {
|
|
49007
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE$2, MEMBER_IMPORT_MODAL_I18N);
|
|
49008
|
+
}
|
|
49009
|
+
}
|
|
49010
|
+
ngOnInit() {
|
|
49011
|
+
if (!this.i18n.hasNamespace(this.i18nNamespace)) {
|
|
49012
|
+
this.i18n.registerContent(this.i18nNamespace, MEMBER_IMPORT_MODAL_I18N);
|
|
49013
|
+
}
|
|
49014
|
+
}
|
|
49015
|
+
/** Parsea el CSV pegado a filas {email,name,roleName}. Tolera header. */
|
|
49016
|
+
parseCsv() {
|
|
49017
|
+
const rows = [];
|
|
49018
|
+
for (const raw of this.csv.split(/\r?\n/)) {
|
|
49019
|
+
const line = raw.trim();
|
|
49020
|
+
if (!line)
|
|
49021
|
+
continue;
|
|
49022
|
+
const cols = line.split(',').map(c => c.trim());
|
|
49023
|
+
const email = (cols[0] ?? '').toLowerCase();
|
|
49024
|
+
// Saltar header (primera col "email") o líneas sin @.
|
|
49025
|
+
if (!email || !email.includes('@'))
|
|
49026
|
+
continue;
|
|
49027
|
+
rows.push({ email, name: cols[1] ?? '', roleName: cols[2] ?? '' });
|
|
49028
|
+
}
|
|
49029
|
+
return rows;
|
|
49030
|
+
}
|
|
49031
|
+
submit() {
|
|
49032
|
+
this.errorMsg.set('');
|
|
49033
|
+
const users = this.parseCsv();
|
|
49034
|
+
if (users.length === 0) {
|
|
49035
|
+
this.errorMsg.set(this.t('noRows'));
|
|
49036
|
+
return;
|
|
49037
|
+
}
|
|
49038
|
+
if (users.some(u => !u.roleName)) {
|
|
49039
|
+
this.errorMsg.set(this.t('parseError'));
|
|
49040
|
+
return;
|
|
49041
|
+
}
|
|
49042
|
+
this.submitting.set(true);
|
|
49043
|
+
this.orgService
|
|
49044
|
+
.importMembers(this.orgId, {
|
|
49045
|
+
users,
|
|
49046
|
+
onConflict: this.onConflict,
|
|
49047
|
+
sendActivation: this.sendActivation,
|
|
49048
|
+
})
|
|
49049
|
+
.subscribe({
|
|
49050
|
+
next: res => {
|
|
49051
|
+
this.submitting.set(false);
|
|
49052
|
+
this.results.set(res);
|
|
49053
|
+
// Refrescar lista del consumer si hubo altas/asignaciones efectivas.
|
|
49054
|
+
if (res.summary.created + res.summary.assigned > 0) {
|
|
49055
|
+
this.onSuccess?.();
|
|
49056
|
+
}
|
|
49057
|
+
},
|
|
49058
|
+
error: err => {
|
|
49059
|
+
this.submitting.set(false);
|
|
49060
|
+
this.errorMsg.set(err?.error?.message ?? this.t('genericError'));
|
|
49061
|
+
},
|
|
49062
|
+
});
|
|
49063
|
+
}
|
|
49064
|
+
statusLabel(r) {
|
|
49065
|
+
const base = this.t(r.status === 'error' ? 'failed' : r.status);
|
|
49066
|
+
if (r.status === 'created' && r.activation) {
|
|
49067
|
+
return `${base} · ${this.t(r.activation === 'sent' ? 'activationSent' : 'activationPending')}`;
|
|
49068
|
+
}
|
|
49069
|
+
return base;
|
|
49070
|
+
}
|
|
49071
|
+
reset() {
|
|
49072
|
+
this.csv = '';
|
|
49073
|
+
this.errorMsg.set('');
|
|
49074
|
+
this.results.set(null);
|
|
49075
|
+
}
|
|
49076
|
+
dismiss() {
|
|
49077
|
+
this._modalRef?.dismiss(null, 'cancel');
|
|
49078
|
+
}
|
|
49079
|
+
t(key) {
|
|
49080
|
+
return this.i18n.t(key, this.i18nNamespace);
|
|
49081
|
+
}
|
|
49082
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
49083
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MemberImportModalComponent, isStandalone: true, selector: "val-member-import-modal", inputs: { orgId: "orgId", availableRoles: "availableRoles", onSuccess: "onSuccess", _modalRef: "_modalRef", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
|
|
49084
|
+
<ion-header>
|
|
49085
|
+
<ion-toolbar>
|
|
49086
|
+
<ion-buttons slot="end">
|
|
49087
|
+
<ion-button fill="clear" color="dark" (click)="dismiss()">
|
|
49088
|
+
<strong>{{ t('close') }}</strong>
|
|
49089
|
+
</ion-button>
|
|
49090
|
+
</ion-buttons>
|
|
49091
|
+
</ion-toolbar>
|
|
49092
|
+
</ion-header>
|
|
49093
|
+
|
|
49094
|
+
<ion-content class="ion-padding">
|
|
49095
|
+
<val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
|
|
49096
|
+
|
|
49097
|
+
@if (!results()) {
|
|
49098
|
+
<val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
|
|
49099
|
+
|
|
49100
|
+
@if (rolesHint()) {
|
|
49101
|
+
<val-text [props]="{ content: rolesHint(), size: 'small', color: 'medium', bold: false }" />
|
|
49102
|
+
}
|
|
49103
|
+
|
|
49104
|
+
<ion-textarea
|
|
49105
|
+
class="import-csv"
|
|
49106
|
+
[autoGrow]="true"
|
|
49107
|
+
[rows]="6"
|
|
49108
|
+
[placeholder]="t('csvPlaceholder')"
|
|
49109
|
+
[(ngModel)]="csv"
|
|
49110
|
+
/>
|
|
49111
|
+
|
|
49112
|
+
<ion-select
|
|
49113
|
+
class="import-conflict"
|
|
49114
|
+
label="{{ t('onConflictLabel') }}"
|
|
49115
|
+
labelPlacement="stacked"
|
|
49116
|
+
interface="popover"
|
|
49117
|
+
[(ngModel)]="onConflict"
|
|
49118
|
+
>
|
|
49119
|
+
<ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
|
|
49120
|
+
<ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
|
|
49121
|
+
<ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
|
|
49122
|
+
</ion-select>
|
|
49123
|
+
|
|
49124
|
+
<ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
|
|
49125
|
+
{{ t('sendActivation') }}
|
|
49126
|
+
</ion-checkbox>
|
|
49127
|
+
|
|
49128
|
+
@if (errorMsg()) {
|
|
49129
|
+
<p class="import-error">{{ errorMsg() }}</p>
|
|
49130
|
+
}
|
|
49131
|
+
|
|
49132
|
+
<div class="import-actions">
|
|
49133
|
+
<ion-button expand="block" color="dark" [disabled]="submitting()" (click)="submit()">
|
|
49134
|
+
@if (submitting()) {
|
|
49135
|
+
<ion-spinner name="dots" />
|
|
49136
|
+
{{ t('submitting') }}
|
|
49137
|
+
} @else {
|
|
49138
|
+
{{ t('submit') }}
|
|
49139
|
+
}
|
|
49140
|
+
</ion-button>
|
|
49141
|
+
</div>
|
|
49142
|
+
} @else {
|
|
49143
|
+
<!-- Resultados -->
|
|
49144
|
+
<val-title [props]="{ content: summaryLabel(), size: 'large', color: '', bold: true }" />
|
|
49145
|
+
<div class="import-results">
|
|
49146
|
+
@for (r of results()!.results; track r.email) {
|
|
49147
|
+
<div class="import-row import-row--{{ r.status }}">
|
|
49148
|
+
<span class="import-row__email">{{ r.email }}</span>
|
|
49149
|
+
<span class="import-row__status">{{ statusLabel(r) }}</span>
|
|
49150
|
+
@if (r.reason) {
|
|
49151
|
+
<span class="import-row__reason">{{ r.reason }}</span>
|
|
49152
|
+
}
|
|
49153
|
+
</div>
|
|
49154
|
+
}
|
|
49155
|
+
</div>
|
|
49156
|
+
<div class="import-actions">
|
|
49157
|
+
<ion-button expand="block" fill="outline" color="dark" (click)="reset()">
|
|
49158
|
+
{{ t('again') }}
|
|
49159
|
+
</ion-button>
|
|
49160
|
+
</div>
|
|
49161
|
+
}
|
|
49162
|
+
</ion-content>
|
|
49163
|
+
`, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size:13px}.import-conflict{margin-bottom:12px}.import-activation{display:block;margin-bottom:16px;font-size:14px}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
|
|
49164
|
+
}
|
|
49165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, decorators: [{
|
|
49166
|
+
type: Component,
|
|
49167
|
+
args: [{ selector: 'val-member-import-modal', standalone: true, imports: [
|
|
49168
|
+
FormsModule,
|
|
49169
|
+
IonHeader,
|
|
49170
|
+
IonToolbar,
|
|
49171
|
+
IonButtons,
|
|
49172
|
+
IonButton,
|
|
49173
|
+
IonContent,
|
|
49174
|
+
IonTextarea,
|
|
49175
|
+
IonSelect,
|
|
49176
|
+
IonSelectOption,
|
|
49177
|
+
IonCheckbox,
|
|
49178
|
+
IonSpinner,
|
|
49179
|
+
DisplayComponent,
|
|
49180
|
+
TextComponent,
|
|
49181
|
+
TitleComponent,
|
|
49182
|
+
], template: `
|
|
49183
|
+
<ion-header>
|
|
49184
|
+
<ion-toolbar>
|
|
49185
|
+
<ion-buttons slot="end">
|
|
49186
|
+
<ion-button fill="clear" color="dark" (click)="dismiss()">
|
|
49187
|
+
<strong>{{ t('close') }}</strong>
|
|
49188
|
+
</ion-button>
|
|
49189
|
+
</ion-buttons>
|
|
49190
|
+
</ion-toolbar>
|
|
49191
|
+
</ion-header>
|
|
49192
|
+
|
|
49193
|
+
<ion-content class="ion-padding">
|
|
49194
|
+
<val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
|
|
49195
|
+
|
|
49196
|
+
@if (!results()) {
|
|
49197
|
+
<val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
|
|
49198
|
+
|
|
49199
|
+
@if (rolesHint()) {
|
|
49200
|
+
<val-text [props]="{ content: rolesHint(), size: 'small', color: 'medium', bold: false }" />
|
|
49201
|
+
}
|
|
49202
|
+
|
|
49203
|
+
<ion-textarea
|
|
49204
|
+
class="import-csv"
|
|
49205
|
+
[autoGrow]="true"
|
|
49206
|
+
[rows]="6"
|
|
49207
|
+
[placeholder]="t('csvPlaceholder')"
|
|
49208
|
+
[(ngModel)]="csv"
|
|
49209
|
+
/>
|
|
49210
|
+
|
|
49211
|
+
<ion-select
|
|
49212
|
+
class="import-conflict"
|
|
49213
|
+
label="{{ t('onConflictLabel') }}"
|
|
49214
|
+
labelPlacement="stacked"
|
|
49215
|
+
interface="popover"
|
|
49216
|
+
[(ngModel)]="onConflict"
|
|
49217
|
+
>
|
|
49218
|
+
<ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
|
|
49219
|
+
<ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
|
|
49220
|
+
<ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
|
|
49221
|
+
</ion-select>
|
|
49222
|
+
|
|
49223
|
+
<ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
|
|
49224
|
+
{{ t('sendActivation') }}
|
|
49225
|
+
</ion-checkbox>
|
|
49226
|
+
|
|
49227
|
+
@if (errorMsg()) {
|
|
49228
|
+
<p class="import-error">{{ errorMsg() }}</p>
|
|
49229
|
+
}
|
|
49230
|
+
|
|
49231
|
+
<div class="import-actions">
|
|
49232
|
+
<ion-button expand="block" color="dark" [disabled]="submitting()" (click)="submit()">
|
|
49233
|
+
@if (submitting()) {
|
|
49234
|
+
<ion-spinner name="dots" />
|
|
49235
|
+
{{ t('submitting') }}
|
|
49236
|
+
} @else {
|
|
49237
|
+
{{ t('submit') }}
|
|
49238
|
+
}
|
|
49239
|
+
</ion-button>
|
|
49240
|
+
</div>
|
|
49241
|
+
} @else {
|
|
49242
|
+
<!-- Resultados -->
|
|
49243
|
+
<val-title [props]="{ content: summaryLabel(), size: 'large', color: '', bold: true }" />
|
|
49244
|
+
<div class="import-results">
|
|
49245
|
+
@for (r of results()!.results; track r.email) {
|
|
49246
|
+
<div class="import-row import-row--{{ r.status }}">
|
|
49247
|
+
<span class="import-row__email">{{ r.email }}</span>
|
|
49248
|
+
<span class="import-row__status">{{ statusLabel(r) }}</span>
|
|
49249
|
+
@if (r.reason) {
|
|
49250
|
+
<span class="import-row__reason">{{ r.reason }}</span>
|
|
49251
|
+
}
|
|
49252
|
+
</div>
|
|
49253
|
+
}
|
|
49254
|
+
</div>
|
|
49255
|
+
<div class="import-actions">
|
|
49256
|
+
<ion-button expand="block" fill="outline" color="dark" (click)="reset()">
|
|
49257
|
+
{{ t('again') }}
|
|
49258
|
+
</ion-button>
|
|
49259
|
+
</div>
|
|
49260
|
+
}
|
|
49261
|
+
</ion-content>
|
|
49262
|
+
`, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size:13px}.import-conflict{margin-bottom:12px}.import-activation{display:block;margin-bottom:16px;font-size:14px}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"] }]
|
|
49263
|
+
}], ctorParameters: () => [], propDecorators: { orgId: [{
|
|
49264
|
+
type: Input
|
|
49265
|
+
}], availableRoles: [{
|
|
49266
|
+
type: Input
|
|
49267
|
+
}], onSuccess: [{
|
|
49268
|
+
type: Input
|
|
49269
|
+
}], _modalRef: [{
|
|
49270
|
+
type: Input
|
|
49271
|
+
}], i18nNamespace: [{
|
|
49272
|
+
type: Input
|
|
49273
|
+
}] } });
|
|
49274
|
+
|
|
48890
49275
|
/**
|
|
48891
49276
|
* Defaults i18n (es/en) embebidos en `val-organization-view`. Auto-registrados en
|
|
48892
49277
|
* el constructor del componente si el consumer no proveyó el namespace
|
|
@@ -48942,6 +49327,7 @@ const ORGANIZATION_VIEW_I18N = {
|
|
|
48942
49327
|
inviteCtaTitle: '¿Deseas agregar a alguien?',
|
|
48943
49328
|
inviteCtaHint: 'Invita a usuarios a unirse a tu organización.',
|
|
48944
49329
|
inviteOpen: 'Invitar',
|
|
49330
|
+
importOpen: 'Importar',
|
|
48945
49331
|
viewMemberCta: 'Ver miembro',
|
|
48946
49332
|
roleViewer: 'Visor',
|
|
48947
49333
|
roleEditor: 'Editor',
|
|
@@ -49011,6 +49397,7 @@ const ORGANIZATION_VIEW_I18N = {
|
|
|
49011
49397
|
inviteCtaTitle: 'Want to add someone?',
|
|
49012
49398
|
inviteCtaHint: 'Invite users to join your organization.',
|
|
49013
49399
|
inviteOpen: 'Invite',
|
|
49400
|
+
importOpen: 'Import',
|
|
49014
49401
|
viewMemberCta: 'View member',
|
|
49015
49402
|
roleViewer: 'Viewer',
|
|
49016
49403
|
roleEditor: 'Editor',
|
|
@@ -49124,6 +49511,22 @@ class OrganizationViewComponent {
|
|
|
49124
49511
|
this.members = signal([]);
|
|
49125
49512
|
this.membersLoading = signal(false);
|
|
49126
49513
|
this.membersLoadError = signal(null);
|
|
49514
|
+
this.membersErrorState = computed(() => {
|
|
49515
|
+
this.i18n.lang();
|
|
49516
|
+
const err = this.membersLoadError();
|
|
49517
|
+
if (!err)
|
|
49518
|
+
return null;
|
|
49519
|
+
return createErrorStateProps(err, {
|
|
49520
|
+
title: { offline: this.tt('offlineTitle'), error: this.tt('errorTitle') },
|
|
49521
|
+
description: {
|
|
49522
|
+
offline: this.tt('offlineHint'),
|
|
49523
|
+
error: interpretError(err).message,
|
|
49524
|
+
},
|
|
49525
|
+
retryLabel: this.tt('retry'),
|
|
49526
|
+
onRetry: () => this.loadMembers(),
|
|
49527
|
+
retrying: this.membersLoading(),
|
|
49528
|
+
});
|
|
49529
|
+
});
|
|
49127
49530
|
this.membersNextToken = signal(null);
|
|
49128
49531
|
this.loadingMoreMembers = signal(false);
|
|
49129
49532
|
this.showAllMembers = signal(false);
|
|
@@ -49210,6 +49613,14 @@ class OrganizationViewComponent {
|
|
|
49210
49613
|
shape: 'round',
|
|
49211
49614
|
type: 'button',
|
|
49212
49615
|
}));
|
|
49616
|
+
this.openImportButtonProps = computed(() => ({
|
|
49617
|
+
text: this.tt('importOpen'),
|
|
49618
|
+
color: 'dark',
|
|
49619
|
+
fill: 'outline',
|
|
49620
|
+
size: 'default',
|
|
49621
|
+
shape: 'round',
|
|
49622
|
+
type: 'button',
|
|
49623
|
+
}));
|
|
49213
49624
|
/** Guarda para detectar el primer disparo del effect (evita doble carga). */
|
|
49214
49625
|
this.lastLoadedOrgId = null;
|
|
49215
49626
|
const ns = this.ns;
|
|
@@ -49310,6 +49721,25 @@ class OrganizationViewComponent {
|
|
|
49310
49721
|
backdropDismiss: true,
|
|
49311
49722
|
});
|
|
49312
49723
|
}
|
|
49724
|
+
onOpenImport() {
|
|
49725
|
+
void this.modalService.open({
|
|
49726
|
+
component: MemberImportModalComponent,
|
|
49727
|
+
componentProps: {
|
|
49728
|
+
orgId: this.activeOrgId(),
|
|
49729
|
+
availableRoles: this.availableRoles().map(r => r.name),
|
|
49730
|
+
onSuccess: () => {
|
|
49731
|
+
this.loadMembers();
|
|
49732
|
+
this.resolvedConfig().onMemberInvited?.();
|
|
49733
|
+
},
|
|
49734
|
+
},
|
|
49735
|
+
breakpoints: {
|
|
49736
|
+
breakpoints: [0, 0.92],
|
|
49737
|
+
initialBreakpoint: 0.92,
|
|
49738
|
+
showHandle: true,
|
|
49739
|
+
},
|
|
49740
|
+
backdropDismiss: true,
|
|
49741
|
+
});
|
|
49742
|
+
}
|
|
49313
49743
|
onViewPermissions() {
|
|
49314
49744
|
this.nav.navigateByUrl(this.resolvedConfig().viewPermissionsRoute);
|
|
49315
49745
|
}
|
|
@@ -49391,6 +49821,7 @@ class OrganizationViewComponent {
|
|
|
49391
49821
|
if (!orgId)
|
|
49392
49822
|
return Promise.resolve();
|
|
49393
49823
|
this.membersLoading.set(true);
|
|
49824
|
+
this.membersLoadError.set(null);
|
|
49394
49825
|
this.membersNextToken.set(null);
|
|
49395
49826
|
this.showAllMembers.set(false);
|
|
49396
49827
|
return new Promise(resolve => {
|
|
@@ -49601,6 +50032,8 @@ class OrganizationViewComponent {
|
|
|
49601
50032
|
<div class="section-body">
|
|
49602
50033
|
@if (membersLoading()) {
|
|
49603
50034
|
<val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
|
|
50035
|
+
} @else if (membersErrorState()) {
|
|
50036
|
+
<val-empty-state [props]="membersErrorState()!" />
|
|
49604
50037
|
} @else if (members().length === 0) {
|
|
49605
50038
|
<val-text
|
|
49606
50039
|
[props]="{
|
|
@@ -49693,6 +50126,7 @@ class OrganizationViewComponent {
|
|
|
49693
50126
|
/>
|
|
49694
50127
|
</div>
|
|
49695
50128
|
<val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
|
|
50129
|
+
<val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
|
|
49696
50130
|
</div>
|
|
49697
50131
|
</section>
|
|
49698
50132
|
}
|
|
@@ -49801,6 +50235,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49801
50235
|
ButtonComponent,
|
|
49802
50236
|
MemberCardComponent,
|
|
49803
50237
|
TransferOwnershipModalComponent,
|
|
50238
|
+
MemberImportModalComponent,
|
|
49804
50239
|
], template: `
|
|
49805
50240
|
<div class="page">
|
|
49806
50241
|
<header class="page-header">
|
|
@@ -49879,6 +50314,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49879
50314
|
<div class="section-body">
|
|
49880
50315
|
@if (membersLoading()) {
|
|
49881
50316
|
<val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
|
|
50317
|
+
} @else if (membersErrorState()) {
|
|
50318
|
+
<val-empty-state [props]="membersErrorState()!" />
|
|
49882
50319
|
} @else if (members().length === 0) {
|
|
49883
50320
|
<val-text
|
|
49884
50321
|
[props]="{
|
|
@@ -49971,6 +50408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49971
50408
|
/>
|
|
49972
50409
|
</div>
|
|
49973
50410
|
<val-button [props]="openInviteButtonProps()" (click)="onOpenInvite()" />
|
|
50411
|
+
<val-button [props]="openImportButtonProps()" (click)="onOpenImport()" />
|
|
49974
50412
|
</div>
|
|
49975
50413
|
</section>
|
|
49976
50414
|
}
|
|
@@ -61241,5 +61679,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
61241
61679
|
* Generated bundle index. Do not edit.
|
|
61242
61680
|
*/
|
|
61243
61681
|
|
|
61244
|
-
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAccountRoutes, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
61682
|
+
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAccountRoutes, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
61245
61683
|
//# sourceMappingURL=valtech-components.mjs.map
|