valtech-components 2.0.984 → 2.0.986
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/molecules/date-input/date-input.component.mjs +97 -14
- package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +732 -0
- package/esm2022/lib/components/organisms/account-view/account-view.i18n.mjs +96 -0
- package/esm2022/lib/components/organisms/account-view/account.routes.mjs +29 -0
- package/esm2022/lib/components/organisms/account-view/types.mjs +2 -0
- package/esm2022/lib/components/organisms/bottom-nav/bottom-nav.component.mjs +3 -3
- package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +240 -0
- package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.i18n.mjs +46 -0
- package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +272 -0
- package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.i18n.mjs +40 -0
- package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +205 -0
- package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.i18n.mjs +35 -0
- package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +280 -0
- package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.mjs +26 -0
- package/esm2022/lib/services/font-size/font-size.service.mjs +3 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +8 -1
- package/fesm2022/valtech-components.mjs +2279 -279
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/date-input/date-input.component.d.ts +9 -0
- package/lib/components/organisms/account-view/account-view.component.d.ts +88 -0
- package/lib/components/organisms/account-view/account-view.i18n.d.ts +7 -0
- package/lib/components/organisms/account-view/account.routes.d.ts +24 -0
- package/lib/components/organisms/account-view/types.d.ts +44 -0
- package/lib/components/organisms/create-org-modal/create-org-modal.component.d.ts +45 -0
- package/lib/components/organisms/create-org-modal/create-org-modal.i18n.d.ts +7 -0
- package/lib/components/organisms/delete-account-modal/delete-account-modal.component.d.ts +50 -0
- package/lib/components/organisms/delete-account-modal/delete-account-modal.i18n.d.ts +7 -0
- package/lib/components/organisms/org-info-sheet/org-info-sheet.component.d.ts +44 -0
- package/lib/components/organisms/org-info-sheet/org-info-sheet.i18n.d.ts +12 -0
- package/lib/components/organisms/switch-org-modal/switch-org-modal.component.d.ts +47 -0
- package/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.d.ts +7 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +7 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { Component, effect, inject, Input, signal } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { firstValueFrom } from 'rxjs';
|
|
4
|
+
import { IonButton, IonButtons, IonContent, IonHeader, IonToolbar } from '@ionic/angular/standalone';
|
|
5
|
+
import { FormComponent } from '../form/form.component';
|
|
6
|
+
import { DisplayComponent } from '../../atoms/display/display.component';
|
|
7
|
+
import { TitleComponent } from '../../atoms/title/title.component';
|
|
8
|
+
import { ComponentStates, InputType } from '../../types';
|
|
9
|
+
import { I18nService } from '../../../services/i18n';
|
|
10
|
+
import { OrgService } from '../../../services/org/org.service';
|
|
11
|
+
import { OrgSwitchService } from '../../../services/auth/org-switch.service';
|
|
12
|
+
import { ToastService } from '../../../services/toast.service';
|
|
13
|
+
import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
|
|
14
|
+
import { CREATE_ORG_MODAL_I18N } from './create-org-modal.i18n';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
const DEFAULT_NAMESPACE = 'CreateOrgModal';
|
|
17
|
+
/**
|
|
18
|
+
* `val-create-org-modal` — modal de creación de organización (organism
|
|
19
|
+
* compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
|
|
20
|
+
* la vista Cuenta (y futuras vistas org-aware).
|
|
21
|
+
*
|
|
22
|
+
* Crea la org vía `OrgService.createOrg` y, en éxito, cambia a ella con
|
|
23
|
+
* `OrgSwitchService.switchTo`. El formulario (nombre + tipo + descripción) se
|
|
24
|
+
* construye una vez y se mantiene reactivo a idioma + estado de trabajo vía
|
|
25
|
+
* effects `allowSignalWrites`.
|
|
26
|
+
*
|
|
27
|
+
* Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` + callback
|
|
28
|
+
* `onSuccess(newOrg)`. Header canónico (Regla #5): sin `ion-title`, botón Cerrar
|
|
29
|
+
* texto en `slot=end`, título/subtítulo en el body con `val-display`/`val-title`.
|
|
30
|
+
*
|
|
31
|
+
* Auto-registra sus defaults i18n (es/en) si el consumer no proveyó el namespace
|
|
32
|
+
* `CreateOrgModal`.
|
|
33
|
+
*/
|
|
34
|
+
export class CreateOrgModalComponent {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.i18n = inject(I18nService);
|
|
37
|
+
this.orgService = inject(OrgService);
|
|
38
|
+
this.orgSwitch = inject(OrgSwitchService);
|
|
39
|
+
this.toast = inject(ToastService);
|
|
40
|
+
this.errors = inject(ValtechErrorService);
|
|
41
|
+
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
42
|
+
this.i18nNamespace = DEFAULT_NAMESPACE;
|
|
43
|
+
this._busy = signal(false);
|
|
44
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {
|
|
45
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE, CREATE_ORG_MODAL_I18N);
|
|
46
|
+
}
|
|
47
|
+
this.formMeta = signal(this.buildFormMeta());
|
|
48
|
+
effect(() => {
|
|
49
|
+
this.i18n.lang();
|
|
50
|
+
this.formMeta.set(this.buildFormMeta());
|
|
51
|
+
}, { allowSignalWrites: true });
|
|
52
|
+
effect(() => {
|
|
53
|
+
const working = this._busy();
|
|
54
|
+
this.formMeta.update(meta => ({
|
|
55
|
+
...meta,
|
|
56
|
+
state: working ? ComponentStates.WORKING : ComponentStates.ENABLED,
|
|
57
|
+
actions: {
|
|
58
|
+
...meta.actions,
|
|
59
|
+
state: working ? ComponentStates.WORKING : ComponentStates.ENABLED,
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
}, { allowSignalWrites: true });
|
|
63
|
+
}
|
|
64
|
+
async onSubmit(event) {
|
|
65
|
+
if (this._busy())
|
|
66
|
+
return;
|
|
67
|
+
const name = event.fields['name'];
|
|
68
|
+
const type = event.fields['type'];
|
|
69
|
+
if (!name?.trim() || !type) {
|
|
70
|
+
this.toast.show({
|
|
71
|
+
message: this.t('fillRequired'),
|
|
72
|
+
duration: 3000,
|
|
73
|
+
color: 'dark',
|
|
74
|
+
position: 'top',
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this._busy.set(true);
|
|
79
|
+
try {
|
|
80
|
+
const description = event.fields['description'];
|
|
81
|
+
const newOrg = await firstValueFrom(this.orgService.createOrg({ name, type, description }));
|
|
82
|
+
this.toast.show({
|
|
83
|
+
message: this.t('successMsg'),
|
|
84
|
+
color: 'dark',
|
|
85
|
+
duration: 3500,
|
|
86
|
+
});
|
|
87
|
+
await this.orgSwitch.switchTo(newOrg.id);
|
|
88
|
+
this.onSuccess?.(newOrg);
|
|
89
|
+
this._modalRef?.dismiss(newOrg, 'confirm');
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
this.errors.handle(err, { i18nNamespace: this.i18nNamespace });
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
this._busy.set(false);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
dismiss() {
|
|
99
|
+
this._modalRef?.dismiss(null, 'cancel');
|
|
100
|
+
}
|
|
101
|
+
buildFormMeta() {
|
|
102
|
+
const nameField = {
|
|
103
|
+
token: 'new-org-name',
|
|
104
|
+
name: 'name',
|
|
105
|
+
label: this.t('nameLabel'),
|
|
106
|
+
hint: '',
|
|
107
|
+
placeholder: this.t('namePlaceholder'),
|
|
108
|
+
type: InputType.TEXT,
|
|
109
|
+
order: 1,
|
|
110
|
+
validators: [Validators.required, Validators.minLength(2), Validators.maxLength(100)],
|
|
111
|
+
errors: {
|
|
112
|
+
required: this.t('nameRequired'),
|
|
113
|
+
minlength: this.t('nameMin'),
|
|
114
|
+
},
|
|
115
|
+
value: '',
|
|
116
|
+
state: ComponentStates.ENABLED,
|
|
117
|
+
};
|
|
118
|
+
const typeField = {
|
|
119
|
+
token: 'new-org-type',
|
|
120
|
+
name: 'type',
|
|
121
|
+
label: this.t('typeLabel'),
|
|
122
|
+
hint: '',
|
|
123
|
+
placeholder: '',
|
|
124
|
+
type: InputType.SELECT,
|
|
125
|
+
order: 2,
|
|
126
|
+
validators: [Validators.required],
|
|
127
|
+
errors: {},
|
|
128
|
+
value: 'PERSONAL',
|
|
129
|
+
withDefault: 'PERSONAL',
|
|
130
|
+
state: ComponentStates.ENABLED,
|
|
131
|
+
options: [
|
|
132
|
+
{ id: 'PERSONAL', name: this.t('typePersonal'), order: 1 },
|
|
133
|
+
{ id: 'PRIVATE', name: this.t('typePrivate'), order: 2 },
|
|
134
|
+
{ id: 'PUBLIC', name: this.t('typePublic'), order: 3 },
|
|
135
|
+
{ id: 'BUSINESS', name: this.t('typeBusiness'), order: 4 },
|
|
136
|
+
],
|
|
137
|
+
};
|
|
138
|
+
const descriptionField = {
|
|
139
|
+
token: 'new-org-description',
|
|
140
|
+
name: 'description',
|
|
141
|
+
label: this.t('descriptionLabel'),
|
|
142
|
+
hint: '',
|
|
143
|
+
placeholder: this.t('descriptionPlaceholder'),
|
|
144
|
+
type: InputType.TEXTAREA,
|
|
145
|
+
order: 3,
|
|
146
|
+
validators: [],
|
|
147
|
+
errors: {},
|
|
148
|
+
value: '',
|
|
149
|
+
state: ComponentStates.ENABLED,
|
|
150
|
+
};
|
|
151
|
+
const submitButton = {
|
|
152
|
+
text: this.t('createCta'),
|
|
153
|
+
color: 'dark',
|
|
154
|
+
type: 'submit',
|
|
155
|
+
fill: 'solid',
|
|
156
|
+
size: 'default',
|
|
157
|
+
shape: 'round',
|
|
158
|
+
expand: 'block',
|
|
159
|
+
state: ComponentStates.ENABLED,
|
|
160
|
+
token: 'new-org-submit',
|
|
161
|
+
};
|
|
162
|
+
return {
|
|
163
|
+
name: '',
|
|
164
|
+
state: ComponentStates.ENABLED,
|
|
165
|
+
sections: [
|
|
166
|
+
{
|
|
167
|
+
name: '',
|
|
168
|
+
order: 1,
|
|
169
|
+
fields: [nameField, typeField, descriptionField],
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
actions: submitButton,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
t(key) {
|
|
176
|
+
return this.i18n.t(key, this.i18nNamespace);
|
|
177
|
+
}
|
|
178
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CreateOrgModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
179
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CreateOrgModalComponent, isStandalone: true, selector: "val-create-org-modal", inputs: { _modalRef: "_modalRef", onSuccess: "onSuccess", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
|
|
180
|
+
<ion-header>
|
|
181
|
+
<ion-toolbar>
|
|
182
|
+
<ion-buttons slot="end">
|
|
183
|
+
<ion-button fill="clear" color="dark" (click)="dismiss()">
|
|
184
|
+
<strong>{{ t('close') }}</strong>
|
|
185
|
+
</ion-button>
|
|
186
|
+
</ion-buttons>
|
|
187
|
+
</ion-toolbar>
|
|
188
|
+
</ion-header>
|
|
189
|
+
<ion-content class="ion-padding">
|
|
190
|
+
<val-display [props]="{ content: t('pageTitle'), size: 'small', color: 'dark' }" />
|
|
191
|
+
<val-title
|
|
192
|
+
[props]="{
|
|
193
|
+
content: t('pageDescription'),
|
|
194
|
+
size: 'large',
|
|
195
|
+
color: '',
|
|
196
|
+
bold: false,
|
|
197
|
+
}"
|
|
198
|
+
/>
|
|
199
|
+
<val-form [props]="formMeta()" (onSubmit)="onSubmit($event)" />
|
|
200
|
+
</ion-content>
|
|
201
|
+
`, isInline: true, dependencies: [{ 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: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
|
|
202
|
+
}
|
|
203
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CreateOrgModalComponent, decorators: [{
|
|
204
|
+
type: Component,
|
|
205
|
+
args: [{
|
|
206
|
+
selector: 'val-create-org-modal',
|
|
207
|
+
standalone: true,
|
|
208
|
+
imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, FormComponent, DisplayComponent, TitleComponent],
|
|
209
|
+
template: `
|
|
210
|
+
<ion-header>
|
|
211
|
+
<ion-toolbar>
|
|
212
|
+
<ion-buttons slot="end">
|
|
213
|
+
<ion-button fill="clear" color="dark" (click)="dismiss()">
|
|
214
|
+
<strong>{{ t('close') }}</strong>
|
|
215
|
+
</ion-button>
|
|
216
|
+
</ion-buttons>
|
|
217
|
+
</ion-toolbar>
|
|
218
|
+
</ion-header>
|
|
219
|
+
<ion-content class="ion-padding">
|
|
220
|
+
<val-display [props]="{ content: t('pageTitle'), size: 'small', color: 'dark' }" />
|
|
221
|
+
<val-title
|
|
222
|
+
[props]="{
|
|
223
|
+
content: t('pageDescription'),
|
|
224
|
+
size: 'large',
|
|
225
|
+
color: '',
|
|
226
|
+
bold: false,
|
|
227
|
+
}"
|
|
228
|
+
/>
|
|
229
|
+
<val-form [props]="formMeta()" (onSubmit)="onSubmit($event)" />
|
|
230
|
+
</ion-content>
|
|
231
|
+
`,
|
|
232
|
+
}]
|
|
233
|
+
}], ctorParameters: () => [], propDecorators: { _modalRef: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}], onSuccess: [{
|
|
236
|
+
type: Input
|
|
237
|
+
}], i18nNamespace: [{
|
|
238
|
+
type: Input
|
|
239
|
+
}] } });
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW9yZy1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2NyZWF0ZS1vcmctbW9kYWwvY3JlYXRlLW9yZy1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUEyQyxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFckYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FB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Q1IsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztpQkFDakQ7YUFDRjtZQUNELE9BQU8sRUFBRSxZQUFZO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsQ0FBQyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQzsrR0F0S1UsdUJBQXVCO21HQUF2Qix1QkFBdUIsNEtBeEJ4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCVCw0REF2QlMsU0FBUyxvR0FBRSxVQUFVLG1GQUFFLFVBQVUsOEVBQUUsU0FBUyxvUEFBRSxVQUFVLHdLQUFFLGFBQWEsOEhBQUUsZ0JBQWdCLDJFQUFFLGNBQWM7OzRGQXlCeEcsdUJBQXVCO2tCQTVCbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDO29CQUNwSCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlQ7aUJBQ0Y7d0RBU1UsU0FBUztzQkFBakIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGVmZmVjdCwgaW5qZWN0LCBJbnB1dCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkJ1dHRvbnMsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uVG9vbGJhciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuXG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZXMsIEZvcm1NZXRhZGF0YSwgRm9ybVN1Ym1pdCwgSW5wdXRNZXRhZGF0YSwgSW5wdXRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgT3JnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL29yZy9vcmcuc2VydmljZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb24sIE9yZ1R5cGUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vcmcvdHlwZXMnO1xuaW1wb3J0IHsgT3JnU3dpdGNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvb3JnLXN3aXRjaC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDUkVBVEVfT1JHX01PREFMX0kxOE4gfSBmcm9tICcuL2NyZWF0ZS1vcmctbW9kYWwuaTE4bic7XG5cbmNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gJ0NyZWF0ZU9yZ01vZGFsJztcblxuLyoqXG4gKiBgdmFsLWNyZWF0ZS1vcmctbW9kYWxgIOKAlCBtb2RhbCBkZSBjcmVhY2nDs24gZGUgb3JnYW5pemFjacOzbiAob3JnYW5pc21cbiAqIGNvbXBhcnRpZG8pLiBQcm9tb3ZpZG8gZGVzZGUgYHNob3djYXNlYCBiYWpvIGVsIHByb2Nlc28gZGUgQURSLTAyMS4gUmV1c2FkbyBwb3JcbiAqIGxhIHZpc3RhIEN1ZW50YSAoeSBmdXR1cmFzIHZpc3RhcyBvcmctYXdhcmUpLlxuICpcbiAqIENyZWEgbGEgb3JnIHbDrWEgYE9yZ1NlcnZpY2UuY3JlYXRlT3JnYCB5LCBlbiDDqXhpdG8sIGNhbWJpYSBhIGVsbGEgY29uXG4gKiBgT3JnU3dpdGNoU2VydmljZS5zd2l0Y2hUb2AuIEVsIGZvcm11bGFyaW8gKG5vbWJyZSArIHRpcG8gKyBkZXNjcmlwY2nDs24pIHNlXG4gKiBjb25zdHJ1eWUgdW5hIHZleiB5IHNlIG1hbnRpZW5lIHJlYWN0aXZvIGEgaWRpb21hICsgZXN0YWRvIGRlIHRyYWJham8gdsOtYVxuICogZWZmZWN0cyBgYWxsb3dTaWduYWxXcml0ZXNgLlxuICpcbiAqIEFiaWVydG8gdsOtYSBgTW9kYWxTZXJ2aWNlYCDigJQgcmVjaWJlIGBfbW9kYWxSZWZgIHBvciBgY29tcG9uZW50UHJvcHNgICsgY2FsbGJhY2tcbiAqIGBvblN1Y2Nlc3MobmV3T3JnKWAuIEhlYWRlciBjYW7Ds25pY28gKFJlZ2xhICM1KTogc2luIGBpb24tdGl0bGVgLCBib3TDs24gQ2VycmFyXG4gKiB0ZXh0byBlbiBgc2xvdD1lbmRgLCB0w610dWxvL3N1YnTDrXR1bG8gZW4gZWwgYm9keSBjb24gYHZhbC1kaXNwbGF5YC9gdmFsLXRpdGxlYC5cbiAqXG4gKiBBdXRvLXJlZ2lzdHJhIHN1cyBkZWZhdWx0cyBpMThuIChlcy9lbikgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiBgQ3JlYXRlT3JnTW9kYWxgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY3JlYXRlLW9yZy1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25IZWFkZXIsIElvblRvb2xiYXIsIElvbkJ1dHRvbnMsIElvbkJ1dHRvbiwgSW9uQ29udGVudCwgRm9ybUNvbXBvbmVudCwgRGlzcGxheUNvbXBvbmVudCwgVGl0bGVDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taGVhZGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJkaXNtaXNzKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdCgncGFnZVRpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICA8dmFsLXRpdGxlXG4gICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgY29udGVudDogdCgncGFnZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgc2l6ZTogJ2xhcmdlJyxcbiAgICAgICAgICBjb2xvcjogJycsXG4gICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgIH1cIlxuICAgICAgLz5cbiAgICAgIDx2YWwtZm9ybSBbcHJvcHNdPVwiZm9ybU1ldGEoKVwiIChvblN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCIgLz5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVPcmdNb2RhbENvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgb3JnU2VydmljZSA9IGluamVjdChPcmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBvcmdTd2l0Y2ggPSBpbmplY3QoT3JnU3dpdGNoU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlcnJvcnMgPSBpbmplY3QoVmFsdGVjaEVycm9yU2VydmljZSk7XG5cbiAgLyoqIElueWVjdGFkbyBwb3IgYE1vZGFsU2VydmljZS5vcGVuYCDigJQgcmVmZXJlbmNpYSBwYXJhIGNlcnJhciBkZXNkZSBkZW50cm8uICovXG4gIEBJbnB1dCgpIF9tb2RhbFJlZj86IHsgZGlzbWlzczogKGRhdGE/OiB1bmtub3duLCByb2xlPzogc3RyaW5nKSA9PiB2b2lkIH07XG5cbiAgLyoqIENhbGxiYWNrIHRyYXMgY3JlYXIgbGEgb3JnIChwYXNhZG8gcG9yIGBjb21wb25lbnRQcm9wc2ApLiAqL1xuICBASW5wdXQoKSBvblN1Y2Nlc3M/OiAobmV3T3JnOiBPcmdhbml6YXRpb24pID0+IHZvaWQ7XG5cbiAgLyoqIE5hbWVzcGFjZSBpMThuIGNvbiBxdWUgbGEgdmlzdGEgcmVzdWVsdmUgc3VzIHRleHRvcy4gKi9cbiAgQElucHV0KCkgaTE4bk5hbWVzcGFjZSA9IERFRkFVTFRfTkFNRVNQQUNFO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBmb3JtTWV0YTogV3JpdGFibGVTaWduYWw8Rm9ybU1ldGFkYXRhPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoREVGQVVMVF9OQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KERFRkFVTFRfTkFNRVNQQUNFLCBDUkVBVEVfT1JHX01PREFMX0kxOE4pO1xuICAgIH1cbiAgICB0aGlzLmZvcm1NZXRhID0gc2lnbmFsKHRoaXMuYnVpbGRGb3JtTWV0YSgpKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICAgICAgdGhpcy5mb3JtTWV0YS5zZXQodGhpcy5idWlsZEZvcm1NZXRhKCkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtpbmcgPSB0aGlzLl9idXN5KCk7XG4gICAgICAgIHRoaXMuZm9ybU1ldGEudXBkYXRlKG1ldGEgPT4gKHtcbiAgICAgICAgICAuLi5tZXRhLFxuICAgICAgICAgIHN0YXRlOiB3b3JraW5nID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICBhY3Rpb25zOiB7XG4gICAgICAgICAgICAuLi5tZXRhLmFjdGlvbnMsXG4gICAgICAgICAgICBzdGF0ZTogd29ya2luZyA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyBvblN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQuZmllbGRzWyduYW1lJ10gYXMgc3RyaW5nO1xuICAgIGNvbnN0IHR5cGUgPSBldmVudC5maWVsZHNbJ3R5cGUnXSBhcyBPcmdUeXBlO1xuICAgIGlmICghbmFtZT8udHJpbSgpIHx8ICF0eXBlKSB7XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ2ZpbGxSZXF1aXJlZCcpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2J1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV2ZW50LmZpZWxkc1snZGVzY3JpcHRpb24nXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBuZXdPcmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLm9yZ1NlcnZpY2UuY3JlYXRlT3JnKHsgbmFtZSwgdHlwZSwgZGVzY3JpcHRpb24gfSkpO1xuICAgICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy50KCdzdWNjZXNzTXNnJyksXG4gICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgIGR1cmF0aW9uOiAzNTAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLm9yZ1N3aXRjaC5zd2l0Y2hUbyhuZXdPcmcuaWQpO1xuICAgICAgdGhpcy5vblN1Y2Nlc3M/LihuZXdPcmcpO1xuICAgICAgdGhpcy5fbW9kYWxSZWY/LmRpc21pc3MobmV3T3JnLCAnY29uZmlybScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwgeyBpMThuTmFtZXNwYWNlOiB0aGlzLmkxOG5OYW1lc3BhY2UgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2J1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKG51bGwsICdjYW5jZWwnKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtTWV0YSgpOiBGb3JtTWV0YWRhdGEge1xuICAgIGNvbnN0IG5hbWVGaWVsZDogSW5wdXRNZXRhZGF0YSA9IHtcbiAgICAgIHRva2VuOiAnbmV3LW9yZy1uYW1lJyxcbiAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgIGxhYmVsOiB0aGlzLnQoJ25hbWVMYWJlbCcpLFxuICAgICAgaGludDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogdGhpcy50KCduYW1lUGxhY2Vob2xkZXInKSxcbiAgICAgIHR5cGU6IElucHV0VHlwZS5URVhULFxuICAgICAgb3JkZXI6IDEsXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMiksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldLFxuICAgICAgZXJyb3JzOiB7XG4gICAgICAgIHJlcXVpcmVkOiB0aGlzLnQoJ25hbWVSZXF1aXJlZCcpLFxuICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgnbmFtZU1pbicpLFxuICAgICAgfSxcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9IGFzIElucHV0TWV0YWRhdGE7XG5cbiAgICBjb25zdCB0eXBlRmllbGQ6IElucHV0TWV0YWRhdGEgPSB7XG4gICAgICB0b2tlbjogJ25ldy1vcmctdHlwZScsXG4gICAgICBuYW1lOiAndHlwZScsXG4gICAgICBsYWJlbDogdGhpcy50KCd0eXBlTGFiZWwnKSxcbiAgICAgIGhpbnQ6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgdHlwZTogSW5wdXRUeXBlLlNFTEVDVCxcbiAgICAgIG9yZGVyOiAyLFxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICAgIHZhbHVlOiAnUEVSU09OQUwnLFxuICAgICAgd2l0aERlZmF1bHQ6ICdQRVJTT05BTCcsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgaWQ6ICdQRVJTT05BTCcsIG5hbWU6IHRoaXMudCgndHlwZVBlcnNvbmFsJyksIG9yZGVyOiAxIH0sXG4gICAgICAgIHsgaWQ6ICdQUklWQVRFJywgbmFtZTogdGhpcy50KCd0eXBlUHJpdmF0ZScpLCBvcmRlcjogMiB9LFxuICAgICAgICB7IGlkOiAnUFVCTElDJywgbmFtZTogdGhpcy50KCd0eXBlUHVibGljJyksIG9yZGVyOiAzIH0sXG4gICAgICAgIHsgaWQ6ICdCVVNJTkVTUycsIG5hbWU6IHRoaXMudCgndHlwZUJ1c2luZXNzJyksIG9yZGVyOiA0IH0sXG4gICAgICBdLFxuICAgIH0gYXMgSW5wdXRNZXRhZGF0YTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uRmllbGQ6IElucHV0TWV0YWRhdGEgPSB7XG4gICAgICB0b2tlbjogJ25ldy1vcmctZGVzY3JpcHRpb24nLFxuICAgICAgbmFtZTogJ2Rlc2NyaXB0aW9uJyxcbiAgICAgIGxhYmVsOiB0aGlzLnQoJ2Rlc2NyaXB0aW9uTGFiZWwnKSxcbiAgICAgIGhpbnQ6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMudCgnZGVzY3JpcHRpb25QbGFjZWhvbGRlcicpLFxuICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFRBUkVBLFxuICAgICAgb3JkZXI6IDMsXG4gICAgICB2YWxpZGF0b3JzOiBbXSxcbiAgICAgIGVycm9yczoge30sXG4gICAgICB2YWx1ZTogJycsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfSBhcyBJbnB1dE1ldGFkYXRhO1xuXG4gICAgY29uc3Qgc3VibWl0QnV0dG9uID0ge1xuICAgICAgdGV4dDogdGhpcy50KCdjcmVhdGVDdGEnKSxcbiAgICAgIGNvbG9yOiAnZGFyaycgYXMgY29uc3QsXG4gICAgICB0eXBlOiAnc3VibWl0JyBhcyBjb25zdCxcbiAgICAgIGZpbGw6ICdzb2xpZCcgYXMgY29uc3QsXG4gICAgICBzaXplOiAnZGVmYXVsdCcgYXMgY29uc3QsXG4gICAgICBzaGFwZTogJ3JvdW5kJyBhcyBjb25zdCxcbiAgICAgIGV4cGFuZDogJ2Jsb2NrJyBhcyBjb25zdCxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgIHRva2VuOiAnbmV3LW9yZy1zdWJtaXQnLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgZmllbGRzOiBbbmFtZUZpZWxkLCB0eXBlRmllbGQsIGRlc2NyaXB0aW9uRmllbGRdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHN1Ym1pdEJ1dHRvbixcbiAgICB9O1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgdGhpcy5pMThuTmFtZXNwYWNlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defaults i18n (es/en) embebidos en `val-create-org-modal`. Auto-registrados en
|
|
3
|
+
* el constructor del componente si el consumer no proveyó el namespace
|
|
4
|
+
* (`CreateOrgModal` por default). SOLO incluye las keys que el modal usa.
|
|
5
|
+
*/
|
|
6
|
+
export const CREATE_ORG_MODAL_I18N = {
|
|
7
|
+
es: {
|
|
8
|
+
pageTitle: 'Nueva organización',
|
|
9
|
+
pageDescription: 'Crea una nueva organización',
|
|
10
|
+
nameLabel: 'Nombre',
|
|
11
|
+
namePlaceholder: 'Nombre de la organización',
|
|
12
|
+
typeLabel: 'Tipo',
|
|
13
|
+
descriptionLabel: 'Descripción',
|
|
14
|
+
descriptionPlaceholder: 'Opcional',
|
|
15
|
+
createCta: 'Crear organización',
|
|
16
|
+
close: 'Cancelar',
|
|
17
|
+
nameRequired: 'El nombre es obligatorio',
|
|
18
|
+
nameMin: 'Mínimo 2 caracteres',
|
|
19
|
+
typePersonal: 'Personal',
|
|
20
|
+
typePrivate: 'Privada',
|
|
21
|
+
typePublic: 'Pública',
|
|
22
|
+
typeBusiness: 'Empresa',
|
|
23
|
+
successMsg: 'Organización creada. Cambiando...',
|
|
24
|
+
fillRequired: 'Completa todos los campos requeridos.',
|
|
25
|
+
},
|
|
26
|
+
en: {
|
|
27
|
+
pageTitle: 'New organization',
|
|
28
|
+
pageDescription: 'Create a new organization',
|
|
29
|
+
nameLabel: 'Name',
|
|
30
|
+
namePlaceholder: 'Organization name',
|
|
31
|
+
typeLabel: 'Type',
|
|
32
|
+
descriptionLabel: 'Description',
|
|
33
|
+
descriptionPlaceholder: 'Optional',
|
|
34
|
+
createCta: 'Create organization',
|
|
35
|
+
close: 'Cancel',
|
|
36
|
+
nameRequired: 'Name is required',
|
|
37
|
+
nameMin: 'Minimum 2 characters',
|
|
38
|
+
typePersonal: 'Personal',
|
|
39
|
+
typePrivate: 'Private',
|
|
40
|
+
typePublic: 'Public',
|
|
41
|
+
typeBusiness: 'Business',
|
|
42
|
+
successMsg: 'Organization created. Switching...',
|
|
43
|
+
fillRequired: 'Please fill in all required fields.',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW9yZy1tb2RhbC5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9jcmVhdGUtb3JnLW1vZGFsL2NyZWF0ZS1vcmctbW9kYWwuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQXFCO0lBQ3JELEVBQUUsRUFBRTtRQUNGLFNBQVMsRUFBRSxvQkFBb0I7UUFDL0IsZUFBZSxFQUFFLDZCQUE2QjtRQUM5QyxTQUFTLEVBQUUsUUFBUTtRQUNuQixlQUFlLEVBQUUsMkJBQTJCO1FBQzVDLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isc0JBQXNCLEVBQUUsVUFBVTtRQUNsQyxTQUFTLEVBQUUsb0JBQW9CO1FBQy9CLEtBQUssRUFBRSxVQUFVO1FBQ2pCLFlBQVksRUFBRSwwQkFBMEI7UUFDeEMsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixZQUFZLEVBQUUsVUFBVTtRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsU0FBUztRQUNyQixZQUFZLEVBQUUsU0FBUztRQUN2QixVQUFVLEVBQUUsbUNBQW1DO1FBQy9DLFlBQVksRUFBRSx1Q0FBdUM7S0FDdEQ7SUFDRCxFQUFFLEVBQUU7UUFDRixTQUFTLEVBQUUsa0JBQWtCO1FBQzdCLGVBQWUsRUFBRSwyQkFBMkI7UUFDNUMsU0FBUyxFQUFFLE1BQU07UUFDakIsZUFBZSxFQUFFLG1CQUFtQjtRQUNwQyxTQUFTLEVBQUUsTUFBTTtRQUNqQixnQkFBZ0IsRUFBRSxhQUFhO1FBQy9CLHNCQUFzQixFQUFFLFVBQVU7UUFDbEMsU0FBUyxFQUFFLHFCQUFxQjtRQUNoQyxLQUFLLEVBQUUsUUFBUTtRQUNmLFlBQVksRUFBRSxrQkFBa0I7UUFDaEMsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixZQUFZLEVBQUUsVUFBVTtRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsUUFBUTtRQUNwQixZQUFZLEVBQUUsVUFBVTtRQUN4QixVQUFVLEVBQUUsb0NBQW9DO1FBQ2hELFlBQVksRUFBRSxxQ0FBcUM7S0FDcEQ7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1jcmVhdGUtb3JnLW1vZGFsYC4gQXV0by1yZWdpc3RyYWRvcyBlblxuICogZWwgY29uc3RydWN0b3IgZGVsIGNvbXBvbmVudGUgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiAoYENyZWF0ZU9yZ01vZGFsYCBwb3IgZGVmYXVsdCkuIFNPTE8gaW5jbHV5ZSBsYXMga2V5cyBxdWUgZWwgbW9kYWwgdXNhLlxuICovXG5leHBvcnQgY29uc3QgQ1JFQVRFX09SR19NT0RBTF9JMThOOiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICBlczoge1xuICAgIHBhZ2VUaXRsZTogJ051ZXZhIG9yZ2FuaXphY2nDs24nLFxuICAgIHBhZ2VEZXNjcmlwdGlvbjogJ0NyZWEgdW5hIG51ZXZhIG9yZ2FuaXphY2nDs24nLFxuICAgIG5hbWVMYWJlbDogJ05vbWJyZScsXG4gICAgbmFtZVBsYWNlaG9sZGVyOiAnTm9tYnJlIGRlIGxhIG9yZ2FuaXphY2nDs24nLFxuICAgIHR5cGVMYWJlbDogJ1RpcG8nLFxuICAgIGRlc2NyaXB0aW9uTGFiZWw6ICdEZXNjcmlwY2nDs24nLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6ICdPcGNpb25hbCcsXG4gICAgY3JlYXRlQ3RhOiAnQ3JlYXIgb3JnYW5pemFjacOzbicsXG4gICAgY2xvc2U6ICdDYW5jZWxhcicsXG4gICAgbmFtZVJlcXVpcmVkOiAnRWwgbm9tYnJlIGVzIG9ibGlnYXRvcmlvJyxcbiAgICBuYW1lTWluOiAnTcOtbmltbyAyIGNhcmFjdGVyZXMnLFxuICAgIHR5cGVQZXJzb25hbDogJ1BlcnNvbmFsJyxcbiAgICB0eXBlUHJpdmF0ZTogJ1ByaXZhZGEnLFxuICAgIHR5cGVQdWJsaWM6ICdQw7pibGljYScsXG4gICAgdHlwZUJ1c2luZXNzOiAnRW1wcmVzYScsXG4gICAgc3VjY2Vzc01zZzogJ09yZ2FuaXphY2nDs24gY3JlYWRhLiBDYW1iaWFuZG8uLi4nLFxuICAgIGZpbGxSZXF1aXJlZDogJ0NvbXBsZXRhIHRvZG9zIGxvcyBjYW1wb3MgcmVxdWVyaWRvcy4nLFxuICB9LFxuICBlbjoge1xuICAgIHBhZ2VUaXRsZTogJ05ldyBvcmdhbml6YXRpb24nLFxuICAgIHBhZ2VEZXNjcmlwdGlvbjogJ0NyZWF0ZSBhIG5ldyBvcmdhbml6YXRpb24nLFxuICAgIG5hbWVMYWJlbDogJ05hbWUnLFxuICAgIG5hbWVQbGFjZWhvbGRlcjogJ09yZ2FuaXphdGlvbiBuYW1lJyxcbiAgICB0eXBlTGFiZWw6ICdUeXBlJyxcbiAgICBkZXNjcmlwdGlvbkxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6ICdPcHRpb25hbCcsXG4gICAgY3JlYXRlQ3RhOiAnQ3JlYXRlIG9yZ2FuaXphdGlvbicsXG4gICAgY2xvc2U6ICdDYW5jZWwnLFxuICAgIG5hbWVSZXF1aXJlZDogJ05hbWUgaXMgcmVxdWlyZWQnLFxuICAgIG5hbWVNaW46ICdNaW5pbXVtIDIgY2hhcmFjdGVycycsXG4gICAgdHlwZVBlcnNvbmFsOiAnUGVyc29uYWwnLFxuICAgIHR5cGVQcml2YXRlOiAnUHJpdmF0ZScsXG4gICAgdHlwZVB1YmxpYzogJ1B1YmxpYycsXG4gICAgdHlwZUJ1c2luZXNzOiAnQnVzaW5lc3MnLFxuICAgIHN1Y2Nlc3NNc2c6ICdPcmdhbml6YXRpb24gY3JlYXRlZC4gU3dpdGNoaW5nLi4uJyxcbiAgICBmaWxsUmVxdWlyZWQ6ICdQbGVhc2UgZmlsbCBpbiBhbGwgcmVxdWlyZWQgZmllbGRzLicsXG4gIH0sXG59O1xuIl19
|
package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { Component, computed, inject, Input, signal } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { IonButton, IonButtons, IonContent, IonHeader, IonSpinner, IonToolbar } from '@ionic/angular/standalone';
|
|
4
|
+
import { firstValueFrom } from 'rxjs';
|
|
5
|
+
import { FormComponent } from '../form/form.component';
|
|
6
|
+
import { ComponentStates, InputType } from '../../types';
|
|
7
|
+
import { AuthService } from '../../../services/auth/auth.service';
|
|
8
|
+
import { I18nService } from '../../../services/i18n';
|
|
9
|
+
import { ToastService } from '../../../services/toast.service';
|
|
10
|
+
import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
|
|
11
|
+
import { DELETE_ACCOUNT_MODAL_I18N } from './delete-account-modal.i18n';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
const DEFAULT_NAMESPACE = 'Settings.DeleteAccount';
|
|
14
|
+
/**
|
|
15
|
+
* `val-delete-account-modal` — modal de eliminación de cuenta (organism,
|
|
16
|
+
* cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.
|
|
17
|
+
*
|
|
18
|
+
* Decide el flujo según si la cuenta tiene contraseña:
|
|
19
|
+
* - **con password** → pide la contraseña actual y la verifica vía
|
|
20
|
+
* `auth.deleteAccount({ password })`.
|
|
21
|
+
* - **sin password** (cuenta OAuth) → envía un código por email
|
|
22
|
+
* (`auth.sendDeleteAccountCode()`) y lo pide para confirmar
|
|
23
|
+
* (`auth.deleteAccount({ code })`).
|
|
24
|
+
*
|
|
25
|
+
* Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` para
|
|
26
|
+
* cerrar desde dentro. Header canónico (Regla #5): sin `ion-title`, botón Cerrar
|
|
27
|
+
* texto en `slot=end`, título/subtítulo en el body vía `val-form`.
|
|
28
|
+
*
|
|
29
|
+
* Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
|
|
30
|
+
* proveyó el namespace `Settings.DeleteAccount`.
|
|
31
|
+
*/
|
|
32
|
+
export class DeleteAccountModalComponent {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.auth = inject(AuthService);
|
|
35
|
+
this.errors = inject(ValtechErrorService);
|
|
36
|
+
this.i18n = inject(I18nService);
|
|
37
|
+
this.toast = inject(ToastService);
|
|
38
|
+
/** Namespace i18n con que la vista resuelve sus textos. */
|
|
39
|
+
this.i18nNamespace = DEFAULT_NAMESPACE;
|
|
40
|
+
this.hasPassword = signal(null);
|
|
41
|
+
this.codeSent = signal(false);
|
|
42
|
+
this.formState = signal(ComponentStates.ENABLED);
|
|
43
|
+
this.t = (key) => this.i18n.t(key, this.i18nNamespace);
|
|
44
|
+
this.passwordFormProps = computed(() => ({
|
|
45
|
+
name: this.t('title'),
|
|
46
|
+
state: this.formState(),
|
|
47
|
+
sections: [
|
|
48
|
+
{
|
|
49
|
+
name: this.t('warningPassword'),
|
|
50
|
+
order: 0,
|
|
51
|
+
fields: [
|
|
52
|
+
{
|
|
53
|
+
token: 'delete-password',
|
|
54
|
+
name: 'password',
|
|
55
|
+
label: this.t('passwordLabel'),
|
|
56
|
+
hint: '',
|
|
57
|
+
placeholder: this.t('passwordPlaceholder'),
|
|
58
|
+
type: InputType.PASSWORD,
|
|
59
|
+
order: 0,
|
|
60
|
+
validators: [Validators.required],
|
|
61
|
+
errors: { required: this.t('passwordRequired') },
|
|
62
|
+
state: ComponentStates.ENABLED,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
actions: this.submitBtn('delete-password-submit', 'confirmCta'),
|
|
68
|
+
}));
|
|
69
|
+
this.sendCodeFormProps = computed(() => ({
|
|
70
|
+
name: this.t('title'),
|
|
71
|
+
state: this.formState(),
|
|
72
|
+
sections: [
|
|
73
|
+
{
|
|
74
|
+
name: this.t('warningSendCode'),
|
|
75
|
+
order: 0,
|
|
76
|
+
fields: [],
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
actions: this.submitBtn('delete-send-code-submit', 'sendCodeCta'),
|
|
80
|
+
}));
|
|
81
|
+
this.codeFormProps = computed(() => ({
|
|
82
|
+
name: this.t('title'),
|
|
83
|
+
state: this.formState(),
|
|
84
|
+
sections: [
|
|
85
|
+
{
|
|
86
|
+
name: this.t('warningEnterCode'),
|
|
87
|
+
order: 0,
|
|
88
|
+
fields: [
|
|
89
|
+
{
|
|
90
|
+
token: 'delete-code',
|
|
91
|
+
name: 'code',
|
|
92
|
+
label: this.t('codeLabel'),
|
|
93
|
+
hint: '',
|
|
94
|
+
placeholder: this.t('codePlaceholder'),
|
|
95
|
+
type: InputType.TEXT,
|
|
96
|
+
order: 0,
|
|
97
|
+
validators: [Validators.required],
|
|
98
|
+
errors: { required: this.t('codeRequired') },
|
|
99
|
+
state: ComponentStates.ENABLED,
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
actions: this.submitBtn('delete-code-submit', 'confirmCta'),
|
|
105
|
+
}));
|
|
106
|
+
if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {
|
|
107
|
+
this.i18n.registerContent(DEFAULT_NAMESPACE, DELETE_ACCOUNT_MODAL_I18N);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
ngOnInit() {
|
|
111
|
+
firstValueFrom(this.auth.getProfile())
|
|
112
|
+
.then(profile => this.hasPassword.set(profile.hasPassword ?? true))
|
|
113
|
+
.catch(() => this.hasPassword.set(true));
|
|
114
|
+
}
|
|
115
|
+
submitBtn(token, textKey) {
|
|
116
|
+
return {
|
|
117
|
+
text: this.t(textKey),
|
|
118
|
+
type: 'submit',
|
|
119
|
+
expand: 'block',
|
|
120
|
+
fill: 'solid',
|
|
121
|
+
color: 'dark',
|
|
122
|
+
size: 'default',
|
|
123
|
+
token,
|
|
124
|
+
state: ComponentStates.ENABLED,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
close() {
|
|
128
|
+
this._modalRef?.dismiss(undefined, 'cancel');
|
|
129
|
+
}
|
|
130
|
+
async onPasswordSubmit(event) {
|
|
131
|
+
const password = event.fields['password'];
|
|
132
|
+
if (!password) {
|
|
133
|
+
this.toast.show({
|
|
134
|
+
message: this.t('passwordRequired'),
|
|
135
|
+
duration: 3000,
|
|
136
|
+
color: 'dark',
|
|
137
|
+
position: 'top',
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.formState.set(ComponentStates.WORKING);
|
|
142
|
+
try {
|
|
143
|
+
await firstValueFrom(this.auth.deleteAccount({ password }));
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
this.errors.handle(err, { context: 'delete-account.password' });
|
|
147
|
+
this.formState.set(ComponentStates.ENABLED);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async onSendCode() {
|
|
151
|
+
this.formState.set(ComponentStates.WORKING);
|
|
152
|
+
try {
|
|
153
|
+
await firstValueFrom(this.auth.sendDeleteAccountCode());
|
|
154
|
+
this.codeSent.set(true);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
this.errors.handle(err, { context: 'delete-account.send-code' });
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
this.formState.set(ComponentStates.ENABLED);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async onResendCode() {
|
|
164
|
+
this.codeSent.set(false);
|
|
165
|
+
await this.onSendCode();
|
|
166
|
+
}
|
|
167
|
+
async onCodeSubmit(event) {
|
|
168
|
+
const code = event.fields['code'];
|
|
169
|
+
if (!code) {
|
|
170
|
+
this.toast.show({
|
|
171
|
+
message: this.t('codeRequired'),
|
|
172
|
+
duration: 3000,
|
|
173
|
+
color: 'dark',
|
|
174
|
+
position: 'top',
|
|
175
|
+
});
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.formState.set(ComponentStates.WORKING);
|
|
179
|
+
try {
|
|
180
|
+
await firstValueFrom(this.auth.deleteAccount({ code }));
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
this.errors.handle(err, { context: 'delete-account.code' });
|
|
184
|
+
this.formState.set(ComponentStates.ENABLED);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DeleteAccountModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
188
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DeleteAccountModalComponent, isStandalone: true, selector: "val-delete-account-modal", inputs: { _modalRef: "_modalRef", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
|
|
189
|
+
<ion-header>
|
|
190
|
+
<ion-toolbar>
|
|
191
|
+
<ion-buttons slot="end">
|
|
192
|
+
<ion-button fill="clear" color="dark" (click)="close()">
|
|
193
|
+
<strong>{{ t('close') }}</strong>
|
|
194
|
+
</ion-button>
|
|
195
|
+
</ion-buttons>
|
|
196
|
+
</ion-toolbar>
|
|
197
|
+
</ion-header>
|
|
198
|
+
|
|
199
|
+
<ion-content class="ion-padding">
|
|
200
|
+
<section class="modal-form-section">
|
|
201
|
+
@if (hasPassword() === null) {
|
|
202
|
+
<div class="spinner-center">
|
|
203
|
+
<ion-spinner name="crescent" />
|
|
204
|
+
</div>
|
|
205
|
+
} @else if (hasPassword()) {
|
|
206
|
+
<val-form [props]="passwordFormProps()" (onSubmit)="onPasswordSubmit($event)" />
|
|
207
|
+
} @else if (!codeSent()) {
|
|
208
|
+
<val-form [props]="sendCodeFormProps()" (onSubmit)="onSendCode()" />
|
|
209
|
+
} @else {
|
|
210
|
+
<val-form [props]="codeFormProps()" (onSubmit)="onCodeSubmit($event)" />
|
|
211
|
+
<div class="resend-row">
|
|
212
|
+
<ion-button
|
|
213
|
+
fill="clear"
|
|
214
|
+
color="medium"
|
|
215
|
+
size="small"
|
|
216
|
+
[disabled]="formState() === 'WORKING'"
|
|
217
|
+
(click)="onResendCode()"
|
|
218
|
+
>
|
|
219
|
+
{{ t('resend') }}
|
|
220
|
+
</ion-button>
|
|
221
|
+
</div>
|
|
222
|
+
}
|
|
223
|
+
</section>
|
|
224
|
+
</ion-content>
|
|
225
|
+
`, isInline: true, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"], dependencies: [{ 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: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
|
|
226
|
+
}
|
|
227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DeleteAccountModalComponent, decorators: [{
|
|
228
|
+
type: Component,
|
|
229
|
+
args: [{ selector: 'val-delete-account-modal', standalone: true, imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, IonSpinner, FormComponent], template: `
|
|
230
|
+
<ion-header>
|
|
231
|
+
<ion-toolbar>
|
|
232
|
+
<ion-buttons slot="end">
|
|
233
|
+
<ion-button fill="clear" color="dark" (click)="close()">
|
|
234
|
+
<strong>{{ t('close') }}</strong>
|
|
235
|
+
</ion-button>
|
|
236
|
+
</ion-buttons>
|
|
237
|
+
</ion-toolbar>
|
|
238
|
+
</ion-header>
|
|
239
|
+
|
|
240
|
+
<ion-content class="ion-padding">
|
|
241
|
+
<section class="modal-form-section">
|
|
242
|
+
@if (hasPassword() === null) {
|
|
243
|
+
<div class="spinner-center">
|
|
244
|
+
<ion-spinner name="crescent" />
|
|
245
|
+
</div>
|
|
246
|
+
} @else if (hasPassword()) {
|
|
247
|
+
<val-form [props]="passwordFormProps()" (onSubmit)="onPasswordSubmit($event)" />
|
|
248
|
+
} @else if (!codeSent()) {
|
|
249
|
+
<val-form [props]="sendCodeFormProps()" (onSubmit)="onSendCode()" />
|
|
250
|
+
} @else {
|
|
251
|
+
<val-form [props]="codeFormProps()" (onSubmit)="onCodeSubmit($event)" />
|
|
252
|
+
<div class="resend-row">
|
|
253
|
+
<ion-button
|
|
254
|
+
fill="clear"
|
|
255
|
+
color="medium"
|
|
256
|
+
size="small"
|
|
257
|
+
[disabled]="formState() === 'WORKING'"
|
|
258
|
+
(click)="onResendCode()"
|
|
259
|
+
>
|
|
260
|
+
{{ t('resend') }}
|
|
261
|
+
</ion-button>
|
|
262
|
+
</div>
|
|
263
|
+
}
|
|
264
|
+
</section>
|
|
265
|
+
</ion-content>
|
|
266
|
+
`, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"] }]
|
|
267
|
+
}], ctorParameters: () => [], propDecorators: { _modalRef: [{
|
|
268
|
+
type: Input
|
|
269
|
+
}], i18nNamespace: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}] } });
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWFjY291bnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9kZWxldGUtYWNjb3VudC1tb2RhbC9kZWxldGUtYWNjb3VudC1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBa0IsZUFBZSxFQUEyQyxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFckYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBRXhFLE1BQU0saUJBQWlCLEdBQUcsd0JBQXdCLENBQUM7QUFFbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBa0VILE1BQU0sT0FBTywyQkFBMkI7SUFnQnRDO1FBZlEsU0FBSSxHQUFHLE1BQU0s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QWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDOytHQXZLVSwyQkFBMkI7bUdBQTNCLDJCQUEyQix3SkE3RDVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNULCtUQXRDUyxTQUFTLG9HQUFFLFVBQVUsbUZBQUUsVUFBVSw4RUFBRSxTQUFTLG9QQUFFLFVBQVUsd0tBQUUsVUFBVSx5R0FBRSxhQUFhOzs0RkE4RGxGLDJCQUEyQjtrQkFqRXZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxZQUNwRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDVDt3REErQlEsU0FBUztzQkFBakIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkJ1dHRvbnMsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uU3Bpbm5lciwgSW9uVG9vbGJhciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGUsIENvbXBvbmVudFN0YXRlcywgRm9ybU1ldGFkYXRhLCBGb3JtU3VibWl0LCBJbnB1dE1ldGFkYXRhLCBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBERUxFVEVfQUNDT1VOVF9NT0RBTF9JMThOIH0gZnJvbSAnLi9kZWxldGUtYWNjb3VudC1tb2RhbC5pMThuJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnU2V0dGluZ3MuRGVsZXRlQWNjb3VudCc7XG5cbi8qKlxuICogYHZhbC1kZWxldGUtYWNjb3VudC1tb2RhbGAg4oCUIG1vZGFsIGRlIGVsaW1pbmFjacOzbiBkZSBjdWVudGEgKG9yZ2FuaXNtLFxuICogY3VlbnRhLWVzcGVjw61maWNvKS4gUHJvbW92aWRvIGRlc2RlIGBzaG93Y2FzZWAgYmFqbyBlbCBwcm9jZXNvIGRlIEFEUi0wMjEuXG4gKlxuICogRGVjaWRlIGVsIGZsdWpvIHNlZ8O6biBzaSBsYSBjdWVudGEgdGllbmUgY29udHJhc2XDsWE6XG4gKiAgLSAqKmNvbiBwYXNzd29yZCoqIOKGkiBwaWRlIGxhIGNvbnRyYXNlw7FhIGFjdHVhbCB5IGxhIHZlcmlmaWNhIHbDrWFcbiAqICAgIGBhdXRoLmRlbGV0ZUFjY291bnQoeyBwYXNzd29yZCB9KWAuXG4gKiAgLSAqKnNpbiBwYXNzd29yZCoqIChjdWVudGEgT0F1dGgpIOKGkiBlbnbDrWEgdW4gY8OzZGlnbyBwb3IgZW1haWxcbiAqICAgIChgYXV0aC5zZW5kRGVsZXRlQWNjb3VudENvZGUoKWApIHkgbG8gcGlkZSBwYXJhIGNvbmZpcm1hclxuICogICAgKGBhdXRoLmRlbGV0ZUFjY291bnQoeyBjb2RlIH0pYCkuXG4gKlxuICogQWJpZXJ0byB2w61hIGBNb2RhbFNlcnZpY2VgIOKAlCByZWNpYmUgYF9tb2RhbFJlZmAgcG9yIGBjb21wb25lbnRQcm9wc2AgcGFyYVxuICogY2VycmFyIGRlc2RlIGRlbnRyby4gSGVhZGVyIGNhbsOzbmljbyAoUmVnbGEgIzUpOiBzaW4gYGlvbi10aXRsZWAsIGJvdMOzbiBDZXJyYXJcbiAqIHRleHRvIGVuIGBzbG90PWVuZGAsIHTDrXR1bG8vc3VidMOtdHVsbyBlbiBlbCBib2R5IHbDrWEgYHZhbC1mb3JtYC5cbiAqXG4gKiBBdXRvLXJlZ2lzdHJhIHN1cyBkZWZhdWx0cyBpMThuIChlcy9lbikgZW4gZWwgY29uc3RydWN0b3Igc2kgZWwgY29uc3VtZXIgbm9cbiAqIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgU2V0dGluZ3MuRGVsZXRlQWNjb3VudGAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1kZWxldGUtYWNjb3VudC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25IZWFkZXIsIElvblRvb2xiYXIsIElvbkJ1dHRvbnMsIElvbkJ1dHRvbiwgSW9uQ29udGVudCwgSW9uU3Bpbm5lciwgRm9ybUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuXG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwibW9kYWwtZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIEBpZiAoaGFzUGFzc3dvcmQoKSA9PT0gbnVsbCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2UgaWYgKGhhc1Bhc3N3b3JkKCkpIHtcbiAgICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInBhc3N3b3JkRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25QYXNzd29yZFN1Ym1pdCgkZXZlbnQpXCIgLz5cbiAgICAgICAgfSBAZWxzZSBpZiAoIWNvZGVTZW50KCkpIHtcbiAgICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInNlbmRDb2RlRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25TZW5kQ29kZSgpXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJjb2RlRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25Db2RlU3VibWl0KCRldmVudClcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtcm93XCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBjb2xvcj1cIm1lZGl1bVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtU3RhdGUoKSA9PT0gJ1dPUktJTkcnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVzZW5kQ29kZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdCgncmVzZW5kJykgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5tb2RhbC1mb3JtLXNlY3Rpb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIG1heC13aWR0aDogNDIwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgICBwYWRkaW5nLXRvcDogOHB4O1xuICAgICAgfVxuICAgICAgLnJlc2VuZC1yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luLXRvcDogLThweDtcbiAgICAgIH1cbiAgICAgIC5zcGlubmVyLWNlbnRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBwYWRkaW5nLXRvcDogMzJweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEZWxldGVBY2NvdW50TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuXG4gIC8qKiBJbnllY3RhZG8gcG9yIGBNb2RhbFNlcnZpY2Uub3BlbmAg4oCUIHJlZmVyZW5jaWEgcGFyYSBjZXJyYXIgZGVzZGUgZGVudHJvLiAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gdm9pZCB9O1xuXG4gIC8qKiBOYW1lc3BhY2UgaTE4biBjb24gcXVlIGxhIHZpc3RhIHJlc3VlbHZlIHN1cyB0ZXh0b3MuICovXG4gIEBJbnB1dCgpIGkxOG5OYW1lc3BhY2UgPSBERUZBVUxUX05BTUVTUEFDRTtcblxuICByZWFkb25seSBoYXNQYXNzd29yZCA9IHNpZ25hbDxib29sZWFuIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGNvZGVTZW50ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZm9ybVN0YXRlID0gc2lnbmFsPENvbXBvbmVudFN0YXRlPihDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKERFRkFVTFRfTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudChERUZBVUxUX05BTUVTUEFDRSwgREVMRVRFX0FDQ09VTlRfTU9EQUxfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLmdldFByb2ZpbGUoKSlcbiAgICAgIC50aGVuKHByb2ZpbGUgPT4gdGhpcy5oYXNQYXNzd29yZC5zZXQocHJvZmlsZS5oYXNQYXNzd29yZCA/PyB0cnVlKSlcbiAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLmhhc1Bhc3N3b3JkLnNldCh0cnVlKSk7XG4gIH1cblxuICB0ID0gKGtleTogc3RyaW5nKTogc3RyaW5nID0+IHRoaXMuaTE4bi50KGtleSwgdGhpcy5pMThuTmFtZXNwYWNlKTtcblxuICBwcml2YXRlIHN1Ym1pdEJ0bih0b2tlbjogc3RyaW5nLCB0ZXh0S2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogdGhpcy50KHRleHRLZXkpLFxuICAgICAgdHlwZTogJ3N1Ym1pdCcgYXMgY29uc3QsXG4gICAgICBleHBhbmQ6ICdibG9jaycgYXMgY29uc3QsXG4gICAgICBmaWxsOiAnc29saWQnIGFzIGNvbnN0LFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyBhcyBjb25zdCxcbiAgICAgIHRva2VuLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG4gIH1cblxuICByZWFkb25seSBwYXNzd29yZEZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4gKHtcbiAgICBuYW1lOiB0aGlzLnQoJ3RpdGxlJyksXG4gICAgc3RhdGU6IHRoaXMuZm9ybVN0YXRlKCksXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogdGhpcy50KCd3YXJuaW5nUGFzc3dvcmQnKSxcbiAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRva2VuOiAnZGVsZXRlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50KCdwYXNzd29yZExhYmVsJyksXG4gICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ3Bhc3N3b3JkUGxhY2Vob2xkZXInKSxcbiAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgZXJyb3JzOiB7IHJlcXVpcmVkOiB0aGlzLnQoJ3Bhc3N3b3JkUmVxdWlyZWQnKSB9LFxuICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgIH0gYXMgSW5wdXRNZXRhZGF0YSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBhY3Rpb25zOiB0aGlzLnN1Ym1pdEJ0bignZGVsZXRlLXBhc3N3b3JkLXN1Ym1pdCcsICdjb25maXJtQ3RhJyksXG4gIH0pKTtcblxuICByZWFkb25seSBzZW5kQ29kZUZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4gKHtcbiAgICBuYW1lOiB0aGlzLnQoJ3RpdGxlJyksXG4gICAgc3RhdGU6IHRoaXMuZm9ybVN0YXRlKCksXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogdGhpcy50KCd3YXJuaW5nU2VuZENvZGUnKSxcbiAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICB9LFxuICAgIF0sXG4gICAgYWN0aW9uczogdGhpcy5zdWJtaXRCdG4oJ2RlbGV0ZS1zZW5kLWNvZGUtc3VibWl0JywgJ3NlbmRDb2RlQ3RhJyksXG4gIH0pKTtcblxuICByZWFkb25seSBjb2RlRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PiAoe1xuICAgIG5hbWU6IHRoaXMudCgndGl0bGUnKSxcbiAgICBzdGF0ZTogdGhpcy5mb3JtU3RhdGUoKSxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiB0aGlzLnQoJ3dhcm5pbmdFbnRlckNvZGUnKSxcbiAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRva2VuOiAnZGVsZXRlLWNvZGUnLFxuICAgICAgICAgICAgbmFtZTogJ2NvZGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudCgnY29kZUxhYmVsJyksXG4gICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ2NvZGVQbGFjZWhvbGRlcicpLFxuICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGVycm9yczogeyByZXF1aXJlZDogdGhpcy50KCdjb2RlUmVxdWlyZWQnKSB9LFxuICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgIH0gYXMgSW5wdXRNZXRhZGF0YSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBhY3Rpb25zOiB0aGlzLnN1Ym1pdEJ0bignZGVsZXRlLWNvZGUtc3VibWl0JywgJ2NvbmZpcm1DdGEnKSxcbiAgfSkpO1xuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKHVuZGVmaW5lZCwgJ2NhbmNlbCcpO1xuICB9XG5cbiAgYXN5bmMgb25QYXNzd29yZFN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gZXZlbnQuZmllbGRzWydwYXNzd29yZCddO1xuICAgIGlmICghcGFzc3dvcmQpIHtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudCgncGFzc3dvcmRSZXF1aXJlZCcpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5kZWxldGVBY2NvdW50KHsgcGFzc3dvcmQgfSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwgeyBjb250ZXh0OiAnZGVsZXRlLWFjY291bnQucGFzc3dvcmQnIH0pO1xuICAgICAgdGhpcy5mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNlbmRDb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zZW5kRGVsZXRlQWNjb3VudENvZGUoKSk7XG4gICAgICB0aGlzLmNvZGVTZW50LnNldCh0cnVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHsgY29udGV4dDogJ2RlbGV0ZS1hY2NvdW50LnNlbmQtY29kZScgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25SZXNlbmRDb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29kZVNlbnQuc2V0KGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLm9uU2VuZENvZGUoKTtcbiAgfVxuXG4gIGFzeW5jIG9uQ29kZVN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvZGUgPSBldmVudC5maWVsZHNbJ2NvZGUnXTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudCgnY29kZVJlcXVpcmVkJyksXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLmRlbGV0ZUFjY291bnQoeyBjb2RlIH0pKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHsgY29udGV4dDogJ2RlbGV0ZS1hY2NvdW50LmNvZGUnIH0pO1xuICAgICAgdGhpcy5mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|