valtech-components 4.0.135 → 4.0.137

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.
@@ -10,7 +10,6 @@ import { FeedbackService } from '../../../services/feedback/feedback.service';
10
10
  import { I18nService } from '../../../services/i18n';
11
11
  import { ComponentStates, InputType } from '../../types';
12
12
  import { FormComponent } from '../../organisms/form/form.component';
13
- import { AttachmentUploaderComponent } from '../../organisms/attachment-uploader/attachment-uploader.component';
14
13
  import * as i0 from "@angular/core";
15
14
  import * as i1 from "@angular/common";
16
15
  const REQUEST_FORM_I18N = {
@@ -22,6 +21,8 @@ const REQUEST_FORM_I18N = {
22
21
  descriptionPlaceholder: 'Añade más detalles aquí',
23
22
  descriptionValidation: 'La descripción es demasiado larga',
24
23
  submit: 'Enviar',
24
+ attachmentsLabel: 'Archivos adjuntos (opcional)',
25
+ attachmentsHint: 'Imágenes (JPG/PNG/WebP) o PDF, máx 5 MB cada uno. Hasta 5 archivos.',
25
26
  success: 'Solicitud enviada exitosamente',
26
27
  error: 'Error al enviar la solicitud',
27
28
  },
@@ -33,6 +34,8 @@ const REQUEST_FORM_I18N = {
33
34
  descriptionPlaceholder: 'Add more details here',
34
35
  descriptionValidation: 'Description is too long',
35
36
  submit: 'Submit',
37
+ attachmentsLabel: 'Attachments (optional)',
38
+ attachmentsHint: 'Images (JPG/PNG/WebP) or PDF, max 5 MB each. Up to 5 files.',
36
39
  success: 'Request submitted successfully',
37
40
  error: 'Error submitting the request',
38
41
  },
@@ -48,7 +51,6 @@ export class RequestFormComponent {
48
51
  this.isSubmitting = signal(false);
49
52
  this.isSuccess = signal(false);
50
53
  this.error = signal(null);
51
- this.currentAttachments = [];
52
54
  addIcons({ checkmarkCircleOutline, closeCircleOutline });
53
55
  if (!this.i18n.hasNamespace('RequestForm')) {
54
56
  this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
@@ -58,44 +60,57 @@ export class RequestFormComponent {
58
60
  this.formProps = this.buildFormProps();
59
61
  }
60
62
  buildFormProps() {
63
+ const fields = [
64
+ {
65
+ token: 'request-title',
66
+ name: 'title',
67
+ label: this.props.titleLabel ?? this.t('title'),
68
+ hint: '',
69
+ placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
70
+ type: InputType.TEXT,
71
+ order: 1,
72
+ validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
73
+ errors: {
74
+ required: this.t('titleValidation'),
75
+ minlength: this.t('titleValidation'),
76
+ maxlength: this.t('titleValidation'),
77
+ },
78
+ state: ComponentStates.ENABLED,
79
+ },
80
+ {
81
+ token: 'request-description',
82
+ name: 'description',
83
+ label: this.props.descriptionLabel ?? this.t('description'),
84
+ hint: '',
85
+ placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
86
+ type: InputType.TEXTAREA,
87
+ order: 2,
88
+ validators: [Validators.maxLength(5000)],
89
+ errors: { maxlength: this.t('descriptionValidation') },
90
+ state: ComponentStates.ENABLED,
91
+ },
92
+ ];
93
+ // Adjuntos como CAMPO del val-form (igual que feedback-form) — así respetan
94
+ // el orden y el separador del formulario, en vez de proyectarse como
95
+ // ng-content suelto después del separador.
96
+ if (this.props.showAttachments !== false) {
97
+ fields.push({
98
+ token: 'request-attachments',
99
+ name: 'attachments',
100
+ label: this.t('attachmentsLabel'),
101
+ hint: this.t('attachmentsHint'),
102
+ placeholder: '',
103
+ type: InputType.ATTACHMENT,
104
+ order: 3,
105
+ validators: [],
106
+ errors: {},
107
+ state: ComponentStates.ENABLED,
108
+ uploadFn: (file) => this.feedbackService.uploadAttachment(file),
109
+ });
110
+ }
61
111
  return {
62
112
  name: '',
63
- sections: [
64
- {
65
- name: '',
66
- order: 0,
67
- fields: [
68
- {
69
- token: 'request-title',
70
- name: 'title',
71
- label: this.props.titleLabel ?? this.t('title'),
72
- hint: '',
73
- placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
74
- type: InputType.TEXT,
75
- order: 1,
76
- validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
77
- errors: {
78
- required: this.t('titleValidation'),
79
- minlength: this.t('titleValidation'),
80
- maxlength: this.t('titleValidation'),
81
- },
82
- state: ComponentStates.ENABLED,
83
- },
84
- {
85
- token: 'request-description',
86
- name: 'description',
87
- label: this.props.descriptionLabel ?? this.t('description'),
88
- hint: '',
89
- placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
90
- type: InputType.TEXTAREA,
91
- order: 2,
92
- validators: [Validators.maxLength(5000)],
93
- errors: { maxlength: this.t('descriptionValidation') },
94
- state: ComponentStates.ENABLED,
95
- },
96
- ],
97
- },
98
- ],
113
+ sections: [{ name: '', order: 0, fields }],
99
114
  actions: {
100
115
  type: 'submit',
101
116
  color: 'dark',
@@ -111,8 +126,6 @@ export class RequestFormComponent {
111
126
  async handleFormSubmit(submitted) {
112
127
  if (this.isSubmitting())
113
128
  return;
114
- if (this.currentAttachments.some(a => a.status === 'uploading'))
115
- return;
116
129
  this.isSubmitting.set(true);
117
130
  this.error.set(null);
118
131
  this.isSuccess.set(false);
@@ -121,7 +134,7 @@ export class RequestFormComponent {
121
134
  try {
122
135
  const title = submitted.fields['title'].trim();
123
136
  const description = submitted.fields['description']?.trim() ?? '';
124
- const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
137
+ const attachmentUrls = submitted.fields['attachments'] ?? [];
125
138
  const result = await firstValueFrom(this.requestService.createRequest({
126
139
  type: this.props.type,
127
140
  title,
@@ -148,9 +161,6 @@ export class RequestFormComponent {
148
161
  this.formProps.actions.state = ComponentStates.ENABLED;
149
162
  }
150
163
  }
151
- onAttachmentsChange(items) {
152
- this.currentAttachments = items;
153
- }
154
164
  onCancelClick() {
155
165
  this.onCancel.emit();
156
166
  }
@@ -161,10 +171,6 @@ export class RequestFormComponent {
161
171
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestFormComponent, isStandalone: true, selector: "val-request-form", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit", onCancel: "onCancel" }, ngImport: i0, template: `
162
172
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
163
173
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
164
- @if (props.showAttachments !== false) {
165
- <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
166
- }
167
-
168
174
  @if (error()) {
169
175
  <div class="request-alert error">
170
176
  <ion-icon name="close-circle-outline" aria-hidden="true" />
@@ -186,17 +192,13 @@ export class RequestFormComponent {
186
192
  </ion-button>
187
193
  }
188
194
  </div>
189
- `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
195
+ `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
190
196
  }
191
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
192
198
  type: Component,
193
- args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
199
+ args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, IonButton, IonIcon], template: `
194
200
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
195
201
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
196
- @if (props.showAttachments !== false) {
197
- <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
198
- }
199
-
200
202
  @if (error()) {
201
203
  <div class="request-alert error">
202
204
  <ion-icon name="close-circle-outline" aria-hidden="true" />
@@ -226,4 +228,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
226
228
  }], onCancel: [{
227
229
  type: Output
228
230
  }] } });
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvcmVxdWVzdC1mb3JtL3JlcXVlc3QtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBMkMsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQzs7O0FBSWhILE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsRUFBRSxFQUFFO1FBQ0YsS0FBSyxFQUFFLFFBQVE7UUFDZixnQkFBZ0Is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Q0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekMsQ0FBQzsrR0F0SVUsb0JBQW9CO21HQUFwQixvQkFBb0IsaUtBdEVyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCVCwyZkE3QlMsWUFBWSw2SEFBRSxhQUFhLDhIQUFFLDJCQUEyQix1SEFBRSxTQUFTLG9QQUFFLE9BQU87OzRGQXVFM0Usb0JBQW9CO2tCQTFFaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSwyQkFBMkIsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQzdFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJUO3dEQTJDUSxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoZWNrbWFya0NpcmNsZU91dGxpbmUsIGNsb3NlQ2lyY2xlT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVxdWVzdHMvcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEZlZWRiYWNrU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZlZWRiYWNrL2ZlZWRiYWNrLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlcywgRm9ybU1ldGFkYXRhLCBGb3JtU3VibWl0LCBJbnB1dE1ldGFkYXRhLCBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL2F0dGFjaG1lbnQtdXBsb2FkZXIvYXR0YWNobWVudC11cGxvYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXR0YWNobWVudEl0ZW0gfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvYXR0YWNobWVudC11cGxvYWRlci90eXBlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0Rm9ybU1ldGFkYXRhLCBSZXF1ZXN0U3VibWl0RXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgUkVRVUVTVF9GT1JNX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgdGl0bGU6ICdUw610dWxvJyxcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiAnRGVzY3JpYmUgYnJldmVtZW50ZSB0dSBzb2xpY2l0dWQnLFxuICAgIHRpdGxlVmFsaWRhdGlvbjogJ0VsIHTDrXR1bG8gZGViZSB0ZW5lciBhbCBtZW5vcyAzIGNhcmFjdGVyZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcGNpw7NuJyxcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiAnQcOxYWRlIG3DoXMgZGV0YWxsZXMgYXF1w60nLFxuICAgIGRlc2NyaXB0aW9uVmFsaWRhdGlvbjogJ0xhIGRlc2NyaXBjacOzbiBlcyBkZW1hc2lhZG8gbGFyZ2EnLFxuICAgIHN1Ym1pdDogJ0VudmlhcicsXG4gICAgc3VjY2VzczogJ1NvbGljaXR1ZCBlbnZpYWRhIGV4aXRvc2FtZW50ZScsXG4gICAgZXJyb3I6ICdFcnJvciBhbCBlbnZpYXIgbGEgc29saWNpdHVkJyxcbiAgfSxcbiAgZW46IHtcbiAgICB0aXRsZTogJ1RpdGxlJyxcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiAnQnJpZWZseSBkZXNjcmliZSB5b3VyIHJlcXVlc3QnLFxuICAgIHRpdGxlVmFsaWRhdGlvbjogJ1RpdGxlIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiAnQWRkIG1vcmUgZGV0YWlscyBoZXJlJyxcbiAgICBkZXNjcmlwdGlvblZhbGlkYXRpb246ICdEZXNjcmlwdGlvbiBpcyB0b28gbG9uZycsXG4gICAgc3VibWl0OiAnU3VibWl0JyxcbiAgICBzdWNjZXNzOiAnUmVxdWVzdCBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICBlcnJvcjogJ0Vycm9yIHN1Ym1pdHRpbmcgdGhlIHJlcXVlc3QnLFxuICB9LFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJlcXVlc3QtZm9ybScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1Db21wb25lbnQsIEF0dGFjaG1lbnRVcGxvYWRlckNvbXBvbmVudCwgSW9uQnV0dG9uLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1mb3JtLXdyYXBwZXJcIiBbY2xhc3MuY29tcGFjdF09XCJwcm9wcy5jb21wYWN0XCIgW25nQ2xhc3NdPVwicHJvcHMuY3NzQ2xhc3NcIj5cbiAgICAgIDx2YWwtZm9ybSBbcHJvcHNdPVwiZm9ybVByb3BzXCIgKG9uU3VibWl0KT1cImhhbmRsZUZvcm1TdWJtaXQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKHByb3BzLnNob3dBdHRhY2htZW50cyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICA8dmFsLWF0dGFjaG1lbnQtdXBsb2FkZXIgW3Byb3BzXT1cInsgbWF4RmlsZXM6IDUgfVwiIChhdHRhY2htZW50c0NoYW5nZSk9XCJvbkF0dGFjaG1lbnRzQ2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChlcnJvcigpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlcXVlc3QtYWxlcnQgZXJyb3JcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgPHNwYW4+e3sgZXJyb3IoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1hbGVydCBzdWNjZXNzXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1jaXJjbGUtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj57eyBwcm9wcy5zdWNjZXNzTWVzc2FnZSB8fCB0KCdzdWNjZXNzJykgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvdmFsLWZvcm0+XG5cbiAgICAgIEBpZiAocHJvcHMuY2FuY2VsQnV0dG9uVGV4dCkge1xuICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwibWVkaXVtXCIgZXhwYW5kPVwiYmxvY2tcIiBjbGFzcz1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwib25DYW5jZWxDbGljaygpXCI+XG4gICAgICAgICAge3sgcHJvcHMuY2FuY2VsQnV0dG9uVGV4dCB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5yZXF1ZXN0LWZvcm0td3JhcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuXG4gICAgICAgICYuY29tcGFjdCB7XG4gICAgICAgICAgZ2FwOiA0cHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLnJlcXVlc3QtYWxlcnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcblxuICAgICAgICAmLmVycm9yIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLXRpbnQpO1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLXNoYWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgICYuc3VjY2VzcyB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taW9uLWNvbG9yLXN1Y2Nlc3MtdGludCk7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1zdWNjZXNzLXNoYWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlvbi1pY29uIHtcbiAgICAgICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmNhbmNlbC1idXR0b24ge1xuICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVxdWVzdEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9wczogUmVxdWVzdEZvcm1NZXRhZGF0YSA9IHsgdHlwZTogJycgfTtcblxuICBAT3V0cHV0KCkgb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlcXVlc3RTdWJtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZXF1ZXN0U2VydmljZSA9IGluamVjdChSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgZmVlZGJhY2tTZXJ2aWNlID0gaW5qZWN0KEZlZWRiYWNrU2VydmljZSk7XG5cbiAgZm9ybVByb3BzITogRm9ybU1ldGFkYXRhO1xuXG4gIGlzU3VibWl0dGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIGlzU3VjY2VzcyA9IHNpZ25hbChmYWxzZSk7XG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHByaXZhdGUgY3VycmVudEF0dGFjaG1lbnRzOiBBdHRhY2htZW50SXRlbVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgYWRkSWNvbnMoeyBjaGVja21hcmtDaXJjbGVPdXRsaW5lLCBjbG9zZUNpcmNsZU91dGxpbmUgfSk7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKCdSZXF1ZXN0Rm9ybScpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmVxdWVzdEZvcm0nLCBSRVFVRVNUX0ZPUk1fSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtUHJvcHMgPSB0aGlzLmJ1aWxkRm9ybVByb3BzKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybVByb3BzKCk6IEZvcm1NZXRhZGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0b2tlbjogJ3JlcXVlc3QtdGl0bGUnLFxuICAgICAgICAgICAgICBuYW1lOiAndGl0bGUnLFxuICAgICAgICAgICAgICBsYWJlbDogdGhpcy5wcm9wcy50aXRsZUxhYmVsID8/IHRoaXMudCgndGl0bGUnKSxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLnRpdGxlUGxhY2Vob2xkZXIgPz8gdGhpcy50KCd0aXRsZVBsYWNlaG9sZGVyJyksXG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5URVhULFxuICAgICAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgzMDApXSxcbiAgICAgICAgICAgICAgZXJyb3JzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRoaXMudCgndGl0bGVWYWxpZGF0aW9uJyksXG4gICAgICAgICAgICAgICAgbWlubGVuZ3RoOiB0aGlzLnQoJ3RpdGxlVmFsaWRhdGlvbicpLFxuICAgICAgICAgICAgICAgIG1heGxlbmd0aDogdGhpcy50KCd0aXRsZVZhbGlkYXRpb24nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSBhcyBJbnB1dE1ldGFkYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0b2tlbjogJ3JlcXVlc3QtZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICBuYW1lOiAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICBsYWJlbDogdGhpcy5wcm9wcy5kZXNjcmlwdGlvbkxhYmVsID8/IHRoaXMudCgnZGVzY3JpcHRpb24nKSxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLmRlc2NyaXB0aW9uUGxhY2Vob2xkZXIgPz8gdGhpcy50KCdkZXNjcmlwdGlvblBsYWNlaG9sZGVyJyksXG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5URVhUQVJFQSxcbiAgICAgICAgICAgICAgb3JkZXI6IDIsXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLm1heExlbmd0aCg1MDAwKV0sXG4gICAgICAgICAgICAgIGVycm9yczogeyBtYXhsZW5ndGg6IHRoaXMudCgnZGVzY3JpcHRpb25WYWxpZGF0aW9uJykgfSxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSBhcyBJbnB1dE1ldGFkYXRhLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgICAgdGV4dDogdGhpcy5wcm9wcy5zdWJtaXRCdXR0b25UZXh0ID8/IHRoaXMudCgnc3VibWl0JyksXG4gICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgIH0sXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZvcm1TdWJtaXQoc3VibWl0dGVkOiBGb3JtU3VibWl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50QXR0YWNobWVudHMuc29tZShhID0+IGEuc3RhdHVzID09PSAndXBsb2FkaW5nJykpIHJldHVybjtcblxuICAgIHRoaXMuaXNTdWJtaXR0aW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmlzU3VjY2Vzcy5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZm9ybVByb3BzLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLldPUktJTkc7XG4gICAgdGhpcy5mb3JtUHJvcHMuYWN0aW9ucy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gKHN1Ym1pdHRlZC5maWVsZHNbJ3RpdGxlJ10gYXMgc3RyaW5nKS50cmltKCk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChzdWJtaXR0ZWQuZmllbGRzWydkZXNjcmlwdGlvbiddIGFzIHN0cmluZyk/LnRyaW0oKSA/PyAnJztcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRVcmxzID0gdGhpcy5jdXJyZW50QXR0YWNobWVudHMuZmlsdGVyKGEgPT4gYS5zdGF0dXMgPT09ICdyZWFkeScpLm1hcChhID0+IGEudXJsISk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLnJlcXVlc3RTZXJ2aWNlLmNyZWF0ZVJlcXVlc3Qoe1xuICAgICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihhdHRhY2htZW50VXJscy5sZW5ndGggPyB7IGF0dGFjaG1lbnRVcmxzIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaXNTdWNjZXNzLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub25TdWJtaXQuZW1pdCh7XG4gICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdDogcmVzdWx0LnJlcXVlc3QsXG4gICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGF0dGFjaG1lbnRVcmxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KGVyci5lcnJvcj8ubWVzc2FnZSB8fCBlcnIubWVzc2FnZSB8fCB0aGlzLnQoJ2Vycm9yJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5mb3JtUHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICAgIHRoaXMuZm9ybVByb3BzLmFjdGlvbnMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICB9XG4gIH1cblxuICBvbkF0dGFjaG1lbnRzQ2hhbmdlKGl0ZW1zOiBBdHRhY2htZW50SXRlbVtdKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50QXR0YWNobWVudHMgPSBpdGVtcztcbiAgfVxuXG4gIG9uQ2FuY2VsQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ1JlcXVlc3RGb3JtJyk7XG4gIH1cbn1cbiJdfQ==
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvcmVxdWVzdC1mb3JtL3JlcXVlc3QtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBMkMsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBR3BFLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsRUFBRSxFQUFFO1FBQ0YsS0FBSyxFQUFFLFFBQVE7UUFDZixnQkFBZ0IsRUFBRSxrQ0FBa0M7UUFDcEQsZUFBZSxFQUFFLDRDQUE0QztRQUM3RCxXQUFX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QUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxDQUFDLENBQUMsR0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDOytHQTlJVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixpS0FsRXJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QlQsMmZBekJTLFlBQVksNkhBQUUsYUFBYSw4SEFBRSxTQUFTLG9QQUFFLE9BQU87OzRGQW1FOUMsb0JBQW9CO2tCQXRFaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQ2hEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QlQ7d0RBMkNRLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2hlY2ttYXJrQ2lyY2xlT3V0bGluZSwgY2xvc2VDaXJjbGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmVlZGJhY2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXF1ZXN0Rm9ybU1ldGFkYXRhLCBSZXF1ZXN0U3VibWl0RXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgUkVRVUVTVF9GT1JNX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgdGl0bGU6ICdUw610dWxvJyxcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiAnRGVzY3JpYmUgYnJldmVtZW50ZSB0dSBzb2xpY2l0dWQnLFxuICAgIHRpdGxlVmFsaWRhdGlvbjogJ0VsIHTDrXR1bG8gZGViZSB0ZW5lciBhbCBtZW5vcyAzIGNhcmFjdGVyZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcGNpw7NuJyxcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiAnQcOxYWRlIG3DoXMgZGV0YWxsZXMgYXF1w60nLFxuICAgIGRlc2NyaXB0aW9uVmFsaWRhdGlvbjogJ0xhIGRlc2NyaXBjacOzbiBlcyBkZW1hc2lhZG8gbGFyZ2EnLFxuICAgIHN1Ym1pdDogJ0VudmlhcicsXG4gICAgYXR0YWNobWVudHNMYWJlbDogJ0FyY2hpdm9zIGFkanVudG9zIChvcGNpb25hbCknLFxuICAgIGF0dGFjaG1lbnRzSGludDogJ0ltw6FnZW5lcyAoSlBHL1BORy9XZWJQKSBvIFBERiwgbcOheCA1IE1CIGNhZGEgdW5vLiBIYXN0YSA1IGFyY2hpdm9zLicsXG4gICAgc3VjY2VzczogJ1NvbGljaXR1ZCBlbnZpYWRhIGV4aXRvc2FtZW50ZScsXG4gICAgZXJyb3I6ICdFcnJvciBhbCBlbnZpYXIgbGEgc29saWNpdHVkJyxcbiAgfSxcbiAgZW46IHtcbiAgICB0aXRsZTogJ1RpdGxlJyxcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiAnQnJpZWZseSBkZXNjcmliZSB5b3VyIHJlcXVlc3QnLFxuICAgIHRpdGxlVmFsaWRhdGlvbjogJ1RpdGxlIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiAnQWRkIG1vcmUgZGV0YWlscyBoZXJlJyxcbiAgICBkZXNjcmlwdGlvblZhbGlkYXRpb246ICdEZXNjcmlwdGlvbiBpcyB0b28gbG9uZycsXG4gICAgc3VibWl0OiAnU3VibWl0JyxcbiAgICBhdHRhY2htZW50c0xhYmVsOiAnQXR0YWNobWVudHMgKG9wdGlvbmFsKScsXG4gICAgYXR0YWNobWVudHNIaW50OiAnSW1hZ2VzIChKUEcvUE5HL1dlYlApIG9yIFBERiwgbWF4IDUgTUIgZWFjaC4gVXAgdG8gNSBmaWxlcy4nLFxuICAgIHN1Y2Nlc3M6ICdSZXF1ZXN0IHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHknLFxuICAgIGVycm9yOiAnRXJyb3Igc3VibWl0dGluZyB0aGUgcmVxdWVzdCcsXG4gIH0sXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtcmVxdWVzdC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybUNvbXBvbmVudCwgSW9uQnV0dG9uLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1mb3JtLXdyYXBwZXJcIiBbY2xhc3MuY29tcGFjdF09XCJwcm9wcy5jb21wYWN0XCIgW25nQ2xhc3NdPVwicHJvcHMuY3NzQ2xhc3NcIj5cbiAgICAgIDx2YWwtZm9ybSBbcHJvcHNdPVwiZm9ybVByb3BzXCIgKG9uU3VibWl0KT1cImhhbmRsZUZvcm1TdWJtaXQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGVycm9yKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1hbGVydCBlcnJvclwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1jaXJjbGUtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj57eyBlcnJvcigpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChpc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1ZXN0LWFsZXJ0IHN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrLWNpcmNsZS1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IHByb3BzLnN1Y2Nlc3NNZXNzYWdlIHx8IHQoJ3N1Y2Nlc3MnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC92YWwtZm9ybT5cblxuICAgICAgQGlmIChwcm9wcy5jYW5jZWxCdXR0b25UZXh0KSB7XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJvdXRsaW5lXCIgY29sb3I9XCJtZWRpdW1cIiBleHBhbmQ9XCJibG9ja1wiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbENsaWNrKClcIj5cbiAgICAgICAgICB7eyBwcm9wcy5jYW5jZWxCdXR0b25UZXh0IH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnJlcXVlc3QtZm9ybS13cmFwcGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG5cbiAgICAgICAgJi5jb21wYWN0IHtcbiAgICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAucmVxdWVzdC1hbGVydCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuXG4gICAgICAgICYuZXJyb3Ige1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXItdGludCk7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXItc2hhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgJi5zdWNjZXNzIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pb24tY29sb3Itc3VjY2Vzcy10aW50KTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXN1Y2Nlc3Mtc2hhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9uLWljb24ge1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuY2FuY2VsLWJ1dHRvbiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb3BzOiBSZXF1ZXN0Rm9ybU1ldGFkYXRhID0geyB0eXBlOiAnJyB9O1xuXG4gIEBPdXRwdXQoKSBvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVxdWVzdFN1Ym1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJvdGVjdGVkIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIHJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmZWVkYmFja1NlcnZpY2UgPSBpbmplY3QoRmVlZGJhY2tTZXJ2aWNlKTtcblxuICBmb3JtUHJvcHMhOiBGb3JtTWV0YWRhdGE7XG5cbiAgaXNTdWJtaXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgaXNTdWNjZXNzID0gc2lnbmFsKGZhbHNlKTtcbiAgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgYWRkSWNvbnMoeyBjaGVja21hcmtDaXJjbGVPdXRsaW5lLCBjbG9zZUNpcmNsZU91dGxpbmUgfSk7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKCdSZXF1ZXN0Rm9ybScpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmVxdWVzdEZvcm0nLCBSRVFVRVNUX0ZPUk1fSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtUHJvcHMgPSB0aGlzLmJ1aWxkRm9ybVByb3BzKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybVByb3BzKCk6IEZvcm1NZXRhZGF0YSB7XG4gICAgY29uc3QgZmllbGRzOiBJbnB1dE1ldGFkYXRhW10gPSBbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAncmVxdWVzdC10aXRsZScsXG4gICAgICAgIG5hbWU6ICd0aXRsZScsXG4gICAgICAgIGxhYmVsOiB0aGlzLnByb3BzLnRpdGxlTGFiZWwgPz8gdGhpcy50KCd0aXRsZScpLFxuICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucHJvcHMudGl0bGVQbGFjZWhvbGRlciA/PyB0aGlzLnQoJ3RpdGxlUGxhY2Vob2xkZXInKSxcbiAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICAgIG9yZGVyOiAxLFxuICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMyksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICByZXF1aXJlZDogdGhpcy50KCd0aXRsZVZhbGlkYXRpb24nKSxcbiAgICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgndGl0bGVWYWxpZGF0aW9uJyksXG4gICAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLnQoJ3RpdGxlVmFsaWRhdGlvbicpLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICB9IGFzIElucHV0TWV0YWRhdGEsXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAncmVxdWVzdC1kZXNjcmlwdGlvbicsXG4gICAgICAgIG5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgIGxhYmVsOiB0aGlzLnByb3BzLmRlc2NyaXB0aW9uTGFiZWwgPz8gdGhpcy50KCdkZXNjcmlwdGlvbicpLFxuICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucHJvcHMuZGVzY3JpcHRpb25QbGFjZWhvbGRlciA/PyB0aGlzLnQoJ2Rlc2NyaXB0aW9uUGxhY2Vob2xkZXInKSxcbiAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFRBUkVBLFxuICAgICAgICBvcmRlcjogMixcbiAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwMDApXSxcbiAgICAgICAgZXJyb3JzOiB7IG1heGxlbmd0aDogdGhpcy50KCdkZXNjcmlwdGlvblZhbGlkYXRpb24nKSB9LFxuICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICB9IGFzIElucHV0TWV0YWRhdGEsXG4gICAgXTtcblxuICAgIC8vIEFkanVudG9zIGNvbW8gQ0FNUE8gZGVsIHZhbC1mb3JtIChpZ3VhbCBxdWUgZmVlZGJhY2stZm9ybSkg4oCUIGFzw60gcmVzcGV0YW5cbiAgICAvLyBlbCBvcmRlbiB5IGVsIHNlcGFyYWRvciBkZWwgZm9ybXVsYXJpbywgZW4gdmV6IGRlIHByb3llY3RhcnNlIGNvbW9cbiAgICAvLyBuZy1jb250ZW50IHN1ZWx0byBkZXNwdcOpcyBkZWwgc2VwYXJhZG9yLlxuICAgIGlmICh0aGlzLnByb3BzLnNob3dBdHRhY2htZW50cyAhPT0gZmFsc2UpIHtcbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgdG9rZW46ICdyZXF1ZXN0LWF0dGFjaG1lbnRzJyxcbiAgICAgICAgbmFtZTogJ2F0dGFjaG1lbnRzJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnYXR0YWNobWVudHNMYWJlbCcpLFxuICAgICAgICBoaW50OiB0aGlzLnQoJ2F0dGFjaG1lbnRzSGludCcpLFxuICAgICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICAgIHR5cGU6IElucHV0VHlwZS5BVFRBQ0hNRU5ULFxuICAgICAgICBvcmRlcjogMyxcbiAgICAgICAgdmFsaWRhdG9yczogW10sXG4gICAgICAgIGVycm9yczoge30sXG4gICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgdXBsb2FkRm46IChmaWxlOiBGaWxlKSA9PiB0aGlzLmZlZWRiYWNrU2VydmljZS51cGxvYWRBdHRhY2htZW50KGZpbGUpLFxuICAgICAgfSBhcyBJbnB1dE1ldGFkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzZWN0aW9uczogW3sgbmFtZTogJycsIG9yZGVyOiAwLCBmaWVsZHMgfV0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICB0ZXh0OiB0aGlzLnByb3BzLnN1Ym1pdEJ1dHRvblRleHQgPz8gdGhpcy50KCdzdWJtaXQnKSxcbiAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRm9ybVN1Ym1pdChzdWJtaXR0ZWQ6IEZvcm1TdWJtaXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMuaXNTdWNjZXNzLnNldChmYWxzZSk7XG4gICAgdGhpcy5mb3JtUHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuV09SS0lORztcbiAgICB0aGlzLmZvcm1Qcm9wcy5hY3Rpb25zLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLldPUktJTkc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGl0bGUgPSAoc3VibWl0dGVkLmZpZWxkc1sndGl0bGUnXSBhcyBzdHJpbmcpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKHN1Ym1pdHRlZC5maWVsZHNbJ2Rlc2NyaXB0aW9uJ10gYXMgc3RyaW5nKT8udHJpbSgpID8/ICcnO1xuICAgICAgY29uc3QgYXR0YWNobWVudFVybHMgPSAoc3VibWl0dGVkLmZpZWxkc1snYXR0YWNobWVudHMnXSBhcyBzdHJpbmdbXSkgPz8gW107XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLnJlcXVlc3RTZXJ2aWNlLmNyZWF0ZVJlcXVlc3Qoe1xuICAgICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihhdHRhY2htZW50VXJscy5sZW5ndGggPyB7IGF0dGFjaG1lbnRVcmxzIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaXNTdWNjZXNzLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub25TdWJtaXQuZW1pdCh7XG4gICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdDogcmVzdWx0LnJlcXVlc3QsXG4gICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGF0dGFjaG1lbnRVcmxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KGVyci5lcnJvcj8ubWVzc2FnZSB8fCBlcnIubWVzc2FnZSB8fCB0aGlzLnQoJ2Vycm9yJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5mb3JtUHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICAgIHRoaXMuZm9ybVByb3BzLmFjdGlvbnMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICB9XG4gIH1cblxuICBvbkNhbmNlbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksICdSZXF1ZXN0Rm9ybScpO1xuICB9XG59XG4iXX0=
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.135';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMzUnO1xuIl19
5
+ export const VERSION = '4.0.137';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMzcnO1xuIl19
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.135';
59
+ const VERSION = '4.0.137';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -35466,6 +35466,8 @@ const REQUEST_FORM_I18N = {
35466
35466
  descriptionPlaceholder: 'Añade más detalles aquí',
35467
35467
  descriptionValidation: 'La descripción es demasiado larga',
35468
35468
  submit: 'Enviar',
35469
+ attachmentsLabel: 'Archivos adjuntos (opcional)',
35470
+ attachmentsHint: 'Imágenes (JPG/PNG/WebP) o PDF, máx 5 MB cada uno. Hasta 5 archivos.',
35469
35471
  success: 'Solicitud enviada exitosamente',
35470
35472
  error: 'Error al enviar la solicitud',
35471
35473
  },
@@ -35477,6 +35479,8 @@ const REQUEST_FORM_I18N = {
35477
35479
  descriptionPlaceholder: 'Add more details here',
35478
35480
  descriptionValidation: 'Description is too long',
35479
35481
  submit: 'Submit',
35482
+ attachmentsLabel: 'Attachments (optional)',
35483
+ attachmentsHint: 'Images (JPG/PNG/WebP) or PDF, max 5 MB each. Up to 5 files.',
35480
35484
  success: 'Request submitted successfully',
35481
35485
  error: 'Error submitting the request',
35482
35486
  },
@@ -35492,7 +35496,6 @@ class RequestFormComponent {
35492
35496
  this.isSubmitting = signal(false);
35493
35497
  this.isSuccess = signal(false);
35494
35498
  this.error = signal(null);
35495
- this.currentAttachments = [];
35496
35499
  addIcons({ checkmarkCircleOutline, closeCircleOutline });
35497
35500
  if (!this.i18n.hasNamespace('RequestForm')) {
35498
35501
  this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
@@ -35502,44 +35505,57 @@ class RequestFormComponent {
35502
35505
  this.formProps = this.buildFormProps();
35503
35506
  }
35504
35507
  buildFormProps() {
35508
+ const fields = [
35509
+ {
35510
+ token: 'request-title',
35511
+ name: 'title',
35512
+ label: this.props.titleLabel ?? this.t('title'),
35513
+ hint: '',
35514
+ placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
35515
+ type: InputType.TEXT,
35516
+ order: 1,
35517
+ validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
35518
+ errors: {
35519
+ required: this.t('titleValidation'),
35520
+ minlength: this.t('titleValidation'),
35521
+ maxlength: this.t('titleValidation'),
35522
+ },
35523
+ state: ComponentStates.ENABLED,
35524
+ },
35525
+ {
35526
+ token: 'request-description',
35527
+ name: 'description',
35528
+ label: this.props.descriptionLabel ?? this.t('description'),
35529
+ hint: '',
35530
+ placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
35531
+ type: InputType.TEXTAREA,
35532
+ order: 2,
35533
+ validators: [Validators.maxLength(5000)],
35534
+ errors: { maxlength: this.t('descriptionValidation') },
35535
+ state: ComponentStates.ENABLED,
35536
+ },
35537
+ ];
35538
+ // Adjuntos como CAMPO del val-form (igual que feedback-form) — así respetan
35539
+ // el orden y el separador del formulario, en vez de proyectarse como
35540
+ // ng-content suelto después del separador.
35541
+ if (this.props.showAttachments !== false) {
35542
+ fields.push({
35543
+ token: 'request-attachments',
35544
+ name: 'attachments',
35545
+ label: this.t('attachmentsLabel'),
35546
+ hint: this.t('attachmentsHint'),
35547
+ placeholder: '',
35548
+ type: InputType.ATTACHMENT,
35549
+ order: 3,
35550
+ validators: [],
35551
+ errors: {},
35552
+ state: ComponentStates.ENABLED,
35553
+ uploadFn: (file) => this.feedbackService.uploadAttachment(file),
35554
+ });
35555
+ }
35505
35556
  return {
35506
35557
  name: '',
35507
- sections: [
35508
- {
35509
- name: '',
35510
- order: 0,
35511
- fields: [
35512
- {
35513
- token: 'request-title',
35514
- name: 'title',
35515
- label: this.props.titleLabel ?? this.t('title'),
35516
- hint: '',
35517
- placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
35518
- type: InputType.TEXT,
35519
- order: 1,
35520
- validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
35521
- errors: {
35522
- required: this.t('titleValidation'),
35523
- minlength: this.t('titleValidation'),
35524
- maxlength: this.t('titleValidation'),
35525
- },
35526
- state: ComponentStates.ENABLED,
35527
- },
35528
- {
35529
- token: 'request-description',
35530
- name: 'description',
35531
- label: this.props.descriptionLabel ?? this.t('description'),
35532
- hint: '',
35533
- placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
35534
- type: InputType.TEXTAREA,
35535
- order: 2,
35536
- validators: [Validators.maxLength(5000)],
35537
- errors: { maxlength: this.t('descriptionValidation') },
35538
- state: ComponentStates.ENABLED,
35539
- },
35540
- ],
35541
- },
35542
- ],
35558
+ sections: [{ name: '', order: 0, fields }],
35543
35559
  actions: {
35544
35560
  type: 'submit',
35545
35561
  color: 'dark',
@@ -35555,8 +35571,6 @@ class RequestFormComponent {
35555
35571
  async handleFormSubmit(submitted) {
35556
35572
  if (this.isSubmitting())
35557
35573
  return;
35558
- if (this.currentAttachments.some(a => a.status === 'uploading'))
35559
- return;
35560
35574
  this.isSubmitting.set(true);
35561
35575
  this.error.set(null);
35562
35576
  this.isSuccess.set(false);
@@ -35565,7 +35579,7 @@ class RequestFormComponent {
35565
35579
  try {
35566
35580
  const title = submitted.fields['title'].trim();
35567
35581
  const description = submitted.fields['description']?.trim() ?? '';
35568
- const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
35582
+ const attachmentUrls = submitted.fields['attachments'] ?? [];
35569
35583
  const result = await firstValueFrom(this.requestService.createRequest({
35570
35584
  type: this.props.type,
35571
35585
  title,
@@ -35592,9 +35606,6 @@ class RequestFormComponent {
35592
35606
  this.formProps.actions.state = ComponentStates.ENABLED;
35593
35607
  }
35594
35608
  }
35595
- onAttachmentsChange(items) {
35596
- this.currentAttachments = items;
35597
- }
35598
35609
  onCancelClick() {
35599
35610
  this.onCancel.emit();
35600
35611
  }
@@ -35605,10 +35616,6 @@ class RequestFormComponent {
35605
35616
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestFormComponent, isStandalone: true, selector: "val-request-form", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit", onCancel: "onCancel" }, ngImport: i0, template: `
35606
35617
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
35607
35618
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
35608
- @if (props.showAttachments !== false) {
35609
- <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
35610
- }
35611
-
35612
35619
  @if (error()) {
35613
35620
  <div class="request-alert error">
35614
35621
  <ion-icon name="close-circle-outline" aria-hidden="true" />
@@ -35630,17 +35637,13 @@ class RequestFormComponent {
35630
35637
  </ion-button>
35631
35638
  }
35632
35639
  </div>
35633
- `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
35640
+ `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
35634
35641
  }
35635
35642
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
35636
35643
  type: Component,
35637
- args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
35644
+ args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, IonButton, IonIcon], template: `
35638
35645
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
35639
35646
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
35640
- @if (props.showAttachments !== false) {
35641
- <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
35642
- }
35643
-
35644
35647
  @if (error()) {
35645
35648
  <div class="request-alert error">
35646
35649
  <ion-icon name="close-circle-outline" aria-hidden="true" />