valtech-components 4.0.133 → 4.0.135

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.
@@ -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.133';
59
+ const VERSION = '4.0.135';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -17195,7 +17195,6 @@ class LanguageSelectorV2Component {
17195
17195
  <span class="lsv2__flag">{{ f }}</span>
17196
17196
  }
17197
17197
  <span class="lsv2__name">{{ name(current()) }}</span>
17198
- <span class="lsv2__chevron" aria-hidden="true">⌄</span>
17199
17198
  </button>
17200
17199
 
17201
17200
  @if (open()) {
@@ -17220,7 +17219,7 @@ class LanguageSelectorV2Component {
17220
17219
  </ul>
17221
17220
  }
17222
17221
  </div>
17223
- `, isInline: true, styles: [".lsv2{position:relative;display:inline-block}.lsv2__trigger{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;margin:0;font-size:.9375rem;font-weight:600;line-height:1.2;cursor:pointer;color:var(--ion-text-color, #1a1a1a);background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1.5px solid var(--ion-color-dark, #1a1a1a);border-radius:10px;transition:border-color .15s ease,box-shadow .15s ease}.lsv2__trigger.is-open,.lsv2__trigger:focus-visible{border-color:var(--ion-color-primary);outline:none;box-shadow:0 0 0 3px rgba(var(--ion-color-primary-rgb, 112, 38, 223),.15)}.lsv2__flag{font-size:1.15em;line-height:1}.lsv2__name{white-space:nowrap}.lsv2__chevron{margin-left:2px;font-size:1em;line-height:1;opacity:.55}.lsv2__menu{position:absolute;top:calc(100% + 6px);left:0;z-index:50;min-width:100%;margin:0;padding:6px;list-style:none;background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:12px;box-shadow:0 8px 24px #00000029}.lsv2__option{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;white-space:nowrap;color:var(--ion-text-color, #1a1a1a);transition:background .12s ease}.lsv2__option:hover{background:var(--ion-color-light, rgba(0, 0, 0, .05))}.lsv2__option.is-active{font-weight:700}.lsv2__check{margin-left:auto;color:var(--ion-color-primary);font-weight:700}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17222
+ `, isInline: true, styles: [".lsv2{position:relative;display:inline-block}.lsv2__trigger{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;margin:0;font-size:.9375rem;font-weight:600;line-height:1.2;cursor:pointer;color:var(--ion-text-color, #1a1a1a);background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1.5px solid var(--ion-color-dark, #1a1a1a);border-radius:10px;transition:border-color .15s ease,box-shadow .15s ease}.lsv2__trigger.is-open,.lsv2__trigger:focus-visible{border-color:var(--ion-color-primary);outline:none;box-shadow:0 0 0 3px rgba(var(--ion-color-primary-rgb, 112, 38, 223),.15)}.lsv2__flag{font-size:1.15em;line-height:1}.lsv2__name{white-space:nowrap}.lsv2__menu{position:absolute;top:calc(100% + 6px);left:0;z-index:50;min-width:100%;margin:0;padding:6px;list-style:none;background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:12px;box-shadow:0 8px 24px #00000029}.lsv2__option{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;white-space:nowrap;color:var(--ion-text-color, #1a1a1a);transition:background .12s ease}.lsv2__option:hover{background:var(--ion-color-light, rgba(0, 0, 0, .05))}.lsv2__option.is-active{font-weight:700}.lsv2__check{margin-left:auto;color:var(--ion-color-primary);font-weight:700}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17224
17223
  }
17225
17224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LanguageSelectorV2Component, decorators: [{
17226
17225
  type: Component,
@@ -17239,7 +17238,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17239
17238
  <span class="lsv2__flag">{{ f }}</span>
17240
17239
  }
17241
17240
  <span class="lsv2__name">{{ name(current()) }}</span>
17242
- <span class="lsv2__chevron" aria-hidden="true">⌄</span>
17243
17241
  </button>
17244
17242
 
17245
17243
  @if (open()) {
@@ -17264,7 +17262,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17264
17262
  </ul>
17265
17263
  }
17266
17264
  </div>
17267
- `, styles: [".lsv2{position:relative;display:inline-block}.lsv2__trigger{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;margin:0;font-size:.9375rem;font-weight:600;line-height:1.2;cursor:pointer;color:var(--ion-text-color, #1a1a1a);background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1.5px solid var(--ion-color-dark, #1a1a1a);border-radius:10px;transition:border-color .15s ease,box-shadow .15s ease}.lsv2__trigger.is-open,.lsv2__trigger:focus-visible{border-color:var(--ion-color-primary);outline:none;box-shadow:0 0 0 3px rgba(var(--ion-color-primary-rgb, 112, 38, 223),.15)}.lsv2__flag{font-size:1.15em;line-height:1}.lsv2__name{white-space:nowrap}.lsv2__chevron{margin-left:2px;font-size:1em;line-height:1;opacity:.55}.lsv2__menu{position:absolute;top:calc(100% + 6px);left:0;z-index:50;min-width:100%;margin:0;padding:6px;list-style:none;background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:12px;box-shadow:0 8px 24px #00000029}.lsv2__option{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;white-space:nowrap;color:var(--ion-text-color, #1a1a1a);transition:background .12s ease}.lsv2__option:hover{background:var(--ion-color-light, rgba(0, 0, 0, .05))}.lsv2__option.is-active{font-weight:700}.lsv2__check{margin-left:auto;color:var(--ion-color-primary);font-weight:700}\n"] }]
17265
+ `, styles: [".lsv2{position:relative;display:inline-block}.lsv2__trigger{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;margin:0;font-size:.9375rem;font-weight:600;line-height:1.2;cursor:pointer;color:var(--ion-text-color, #1a1a1a);background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1.5px solid var(--ion-color-dark, #1a1a1a);border-radius:10px;transition:border-color .15s ease,box-shadow .15s ease}.lsv2__trigger.is-open,.lsv2__trigger:focus-visible{border-color:var(--ion-color-primary);outline:none;box-shadow:0 0 0 3px rgba(var(--ion-color-primary-rgb, 112, 38, 223),.15)}.lsv2__flag{font-size:1.15em;line-height:1}.lsv2__name{white-space:nowrap}.lsv2__menu{position:absolute;top:calc(100% + 6px);left:0;z-index:50;min-width:100%;margin:0;padding:6px;list-style:none;background:var(--ion-card-background, var(--ion-background-color, #ffffff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:12px;box-shadow:0 8px 24px #00000029}.lsv2__option{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;white-space:nowrap;color:var(--ion-text-color, #1a1a1a);transition:background .12s ease}.lsv2__option:hover{background:var(--ion-color-light, rgba(0, 0, 0, .05))}.lsv2__option.is-active{font-weight:700}.lsv2__check{margin-left:auto;color:var(--ion-color-primary);font-weight:700}\n"] }]
17268
17266
  }], propDecorators: { props: [{
17269
17267
  type: Input
17270
17268
  }], languageChange: [{
@@ -35364,6 +35362,395 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
35364
35362
  type: Output
35365
35363
  }] } });
35366
35364
 
35365
+ class RequestService {
35366
+ constructor(config, http) {
35367
+ this.config = config;
35368
+ this.http = http;
35369
+ }
35370
+ get baseUrl() {
35371
+ return `${this.config.apiUrl}/v2/requests`;
35372
+ }
35373
+ get typesUrl() {
35374
+ return `${this.config.apiUrl}/v2/request-types`;
35375
+ }
35376
+ // ── Requests ──
35377
+ createRequest(payload) {
35378
+ return this.http.post(this.baseUrl, payload);
35379
+ }
35380
+ createAnonymousRequest(payload) {
35381
+ return this.http.post(`${this.baseUrl}/anonymous`, payload);
35382
+ }
35383
+ listRequests(params) {
35384
+ const qs = this.buildQueryString(params);
35385
+ return this.http.get(`${this.baseUrl}${qs}`);
35386
+ }
35387
+ listMyRequests(params) {
35388
+ const qs = this.buildQueryString(params);
35389
+ return this.http.get(`${this.baseUrl}/my${qs}`);
35390
+ }
35391
+ getRequest(id) {
35392
+ return this.http
35393
+ .get(`${this.baseUrl}/${id}`)
35394
+ .pipe(map$1(r => r.request));
35395
+ }
35396
+ updateRequest(id, payload) {
35397
+ return this.http
35398
+ .put(`${this.baseUrl}/${id}`, payload)
35399
+ .pipe(map$1(r => r.request));
35400
+ }
35401
+ transition(id, payload) {
35402
+ return this.http.post(`${this.baseUrl}/${id}/transition`, payload);
35403
+ }
35404
+ // ── Comments ──
35405
+ addComment(requestId, payload) {
35406
+ return this.http
35407
+ .post(`${this.baseUrl}/${requestId}/comments`, payload)
35408
+ .pipe(map$1(r => r.comment));
35409
+ }
35410
+ listComments(requestId) {
35411
+ return this.http.get(`${this.baseUrl}/${requestId}/comments`);
35412
+ }
35413
+ // ── Request Types ──
35414
+ listRequestTypes() {
35415
+ return this.http.get(this.typesUrl);
35416
+ }
35417
+ getRequestType(typeId) {
35418
+ return this.http.get(`${this.typesUrl}/${typeId}`);
35419
+ }
35420
+ createRequestType(payload) {
35421
+ return this.http
35422
+ .post(this.typesUrl, payload)
35423
+ .pipe(map$1(r => r.typeConfig));
35424
+ }
35425
+ updateRequestType(typeId, payload) {
35426
+ return this.http
35427
+ .put(`${this.typesUrl}/${typeId}`, payload)
35428
+ .pipe(map$1(r => r.typeConfig));
35429
+ }
35430
+ deleteRequestType(typeId) {
35431
+ return this.http.delete(`${this.typesUrl}/${typeId}`);
35432
+ }
35433
+ // ── Helpers ──
35434
+ buildQueryString(params) {
35435
+ if (!params)
35436
+ return '';
35437
+ const qs = new URLSearchParams();
35438
+ if (params.type)
35439
+ qs.set('type', params.type);
35440
+ if (params.status)
35441
+ qs.set('status', params.status);
35442
+ if (params.limit != null)
35443
+ qs.set('limit', String(params.limit));
35444
+ if (params.nextToken)
35445
+ qs.set('nextToken', params.nextToken);
35446
+ const str = qs.toString();
35447
+ return str ? `?${str}` : '';
35448
+ }
35449
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
35450
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, providedIn: 'root' }); }
35451
+ }
35452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, decorators: [{
35453
+ type: Injectable,
35454
+ args: [{ providedIn: 'root' }]
35455
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
35456
+ type: Inject,
35457
+ args: [VALTECH_AUTH_CONFIG]
35458
+ }] }, { type: i1$3.HttpClient }] });
35459
+
35460
+ const REQUEST_FORM_I18N = {
35461
+ es: {
35462
+ title: 'Título',
35463
+ titlePlaceholder: 'Describe brevemente tu solicitud',
35464
+ titleValidation: 'El título debe tener al menos 3 caracteres',
35465
+ description: 'Descripción',
35466
+ descriptionPlaceholder: 'Añade más detalles aquí',
35467
+ descriptionValidation: 'La descripción es demasiado larga',
35468
+ submit: 'Enviar',
35469
+ success: 'Solicitud enviada exitosamente',
35470
+ error: 'Error al enviar la solicitud',
35471
+ },
35472
+ en: {
35473
+ title: 'Title',
35474
+ titlePlaceholder: 'Briefly describe your request',
35475
+ titleValidation: 'Title must be at least 3 characters',
35476
+ description: 'Description',
35477
+ descriptionPlaceholder: 'Add more details here',
35478
+ descriptionValidation: 'Description is too long',
35479
+ submit: 'Submit',
35480
+ success: 'Request submitted successfully',
35481
+ error: 'Error submitting the request',
35482
+ },
35483
+ };
35484
+ class RequestFormComponent {
35485
+ constructor() {
35486
+ this.props = { type: '' };
35487
+ this.onSubmit = new EventEmitter();
35488
+ this.onCancel = new EventEmitter();
35489
+ this.i18n = inject(I18nService);
35490
+ this.requestService = inject(RequestService);
35491
+ this.feedbackService = inject(FeedbackService);
35492
+ this.isSubmitting = signal(false);
35493
+ this.isSuccess = signal(false);
35494
+ this.error = signal(null);
35495
+ this.currentAttachments = [];
35496
+ addIcons({ checkmarkCircleOutline, closeCircleOutline });
35497
+ if (!this.i18n.hasNamespace('RequestForm')) {
35498
+ this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
35499
+ }
35500
+ }
35501
+ ngOnInit() {
35502
+ this.formProps = this.buildFormProps();
35503
+ }
35504
+ buildFormProps() {
35505
+ return {
35506
+ 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
+ ],
35543
+ actions: {
35544
+ type: 'submit',
35545
+ color: 'dark',
35546
+ fill: 'solid',
35547
+ shape: 'round',
35548
+ expand: 'block',
35549
+ text: this.props.submitButtonText ?? this.t('submit'),
35550
+ state: ComponentStates.ENABLED,
35551
+ },
35552
+ state: ComponentStates.ENABLED,
35553
+ };
35554
+ }
35555
+ async handleFormSubmit(submitted) {
35556
+ if (this.isSubmitting())
35557
+ return;
35558
+ if (this.currentAttachments.some(a => a.status === 'uploading'))
35559
+ return;
35560
+ this.isSubmitting.set(true);
35561
+ this.error.set(null);
35562
+ this.isSuccess.set(false);
35563
+ this.formProps.state = ComponentStates.WORKING;
35564
+ this.formProps.actions.state = ComponentStates.WORKING;
35565
+ try {
35566
+ const title = submitted.fields['title'].trim();
35567
+ const description = submitted.fields['description']?.trim() ?? '';
35568
+ const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
35569
+ const result = await firstValueFrom(this.requestService.createRequest({
35570
+ type: this.props.type,
35571
+ title,
35572
+ fields: {
35573
+ ...(description ? { description } : {}),
35574
+ ...(attachmentUrls.length ? { attachmentUrls } : {}),
35575
+ },
35576
+ }));
35577
+ this.isSuccess.set(true);
35578
+ this.onSubmit.emit({
35579
+ requestId: result.requestId,
35580
+ request: result.request,
35581
+ type: this.props.type,
35582
+ title,
35583
+ attachmentUrls,
35584
+ });
35585
+ }
35586
+ catch (err) {
35587
+ this.error.set(err.error?.message || err.message || this.t('error'));
35588
+ }
35589
+ finally {
35590
+ this.isSubmitting.set(false);
35591
+ this.formProps.state = ComponentStates.ENABLED;
35592
+ this.formProps.actions.state = ComponentStates.ENABLED;
35593
+ }
35594
+ }
35595
+ onAttachmentsChange(items) {
35596
+ this.currentAttachments = items;
35597
+ }
35598
+ onCancelClick() {
35599
+ this.onCancel.emit();
35600
+ }
35601
+ t(key) {
35602
+ return this.i18n.t(key, 'RequestForm');
35603
+ }
35604
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35605
+ 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
+ <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
35607
+ <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
+ @if (error()) {
35613
+ <div class="request-alert error">
35614
+ <ion-icon name="close-circle-outline" aria-hidden="true" />
35615
+ <span>{{ error() }}</span>
35616
+ </div>
35617
+ }
35618
+
35619
+ @if (isSuccess()) {
35620
+ <div class="request-alert success">
35621
+ <ion-icon name="checkmark-circle-outline" aria-hidden="true" />
35622
+ <span>{{ props.successMessage || t('success') }}</span>
35623
+ </div>
35624
+ }
35625
+ </val-form>
35626
+
35627
+ @if (props.cancelButtonText) {
35628
+ <ion-button fill="outline" color="medium" expand="block" class="cancel-button" (click)="onCancelClick()">
35629
+ {{ props.cancelButtonText }}
35630
+ </ion-button>
35631
+ }
35632
+ </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"] }] }); }
35634
+ }
35635
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
35636
+ type: Component,
35637
+ args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
35638
+ <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
35639
+ <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
+ @if (error()) {
35645
+ <div class="request-alert error">
35646
+ <ion-icon name="close-circle-outline" aria-hidden="true" />
35647
+ <span>{{ error() }}</span>
35648
+ </div>
35649
+ }
35650
+
35651
+ @if (isSuccess()) {
35652
+ <div class="request-alert success">
35653
+ <ion-icon name="checkmark-circle-outline" aria-hidden="true" />
35654
+ <span>{{ props.successMessage || t('success') }}</span>
35655
+ </div>
35656
+ }
35657
+ </val-form>
35658
+
35659
+ @if (props.cancelButtonText) {
35660
+ <ion-button fill="outline" color="medium" expand="block" class="cancel-button" (click)="onCancelClick()">
35661
+ {{ props.cancelButtonText }}
35662
+ </ion-button>
35663
+ }
35664
+ </div>
35665
+ `, 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"] }]
35666
+ }], ctorParameters: () => [], propDecorators: { props: [{
35667
+ type: Input
35668
+ }], onSubmit: [{
35669
+ type: Output
35670
+ }], onCancel: [{
35671
+ type: Output
35672
+ }] } });
35673
+
35674
+ /**
35675
+ * `val-request-modal`
35676
+ *
35677
+ * Modal canónico para crear una solicitud (ticket de soporte, etc.): envuelve
35678
+ * `val-request-form` en el shell de modal de la lib (Regla #5 — header con botón
35679
+ * "Cerrar", sin `ion-title`). Antes cada app duplicaba este `ion-modal` +
35680
+ * `ion-header` + `val-request-form` a mano (ej. `support-ticket-modal` de web).
35681
+ *
35682
+ * Patrón declarativo `[isOpen]` + `(dismissed)` — el padre controla la
35683
+ * visibilidad. El tipo de solicitud y demás opciones se pasan por `formProps`
35684
+ * (default `{ type: 'support_ticket' }`).
35685
+ *
35686
+ * @example
35687
+ * ```html
35688
+ * <val-request-modal
35689
+ * [isOpen]="ticketOpen()"
35690
+ * [formProps]="{ type: 'support_ticket' }"
35691
+ * (submitted)="onTicketCreated($event)"
35692
+ * (dismissed)="ticketOpen.set(false)" />
35693
+ * ```
35694
+ */
35695
+ class RequestModalComponent {
35696
+ constructor() {
35697
+ /** Controla la visibilidad del modal (el padre la maneja). */
35698
+ this.isOpen = false;
35699
+ /** Config del `val-request-form` (tipo de solicitud, labels, etc.). */
35700
+ this.formProps = { type: 'support_ticket' };
35701
+ /** Override del texto del botón cerrar (default: i18n `_global.close`). */
35702
+ this.closeLabel = '';
35703
+ /** Se emite al cerrar el modal (X o backdrop). */
35704
+ this.dismissed = new EventEmitter();
35705
+ /** Se emite cuando el formulario se envía con éxito. */
35706
+ this.submitted = new EventEmitter();
35707
+ }
35708
+ close() {
35709
+ this.isOpen = false;
35710
+ this.dismissed.emit();
35711
+ }
35712
+ onFormSubmit(event) {
35713
+ this.submitted.emit(event);
35714
+ }
35715
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35716
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RequestModalComponent, isStandalone: true, selector: "val-request-modal", inputs: { isOpen: "isOpen", formProps: "formProps", closeLabel: "closeLabel" }, outputs: { dismissed: "dismissed", submitted: "submitted" }, ngImport: i0, template: `
35717
+ <ion-modal [isOpen]="isOpen" (didDismiss)="close()">
35718
+ <ng-template>
35719
+ <val-modal-shell [closeLabel]="closeLabel" (close)="close()">
35720
+ <val-request-form [props]="formProps" (onSubmit)="onFormSubmit($event)" />
35721
+ </val-modal-shell>
35722
+ </ng-template>
35723
+ </ion-modal>
35724
+ `, isInline: true, dependencies: [{ kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: ModalShellComponent, selector: "val-modal-shell", inputs: ["title", "subtitle", "closeLabel", "showClose"], outputs: ["close"] }, { kind: "component", type: RequestFormComponent, selector: "val-request-form", inputs: ["props"], outputs: ["onSubmit", "onCancel"] }] }); }
35725
+ }
35726
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestModalComponent, decorators: [{
35727
+ type: Component,
35728
+ args: [{
35729
+ selector: 'val-request-modal',
35730
+ standalone: true,
35731
+ imports: [IonModal, ModalShellComponent, RequestFormComponent],
35732
+ template: `
35733
+ <ion-modal [isOpen]="isOpen" (didDismiss)="close()">
35734
+ <ng-template>
35735
+ <val-modal-shell [closeLabel]="closeLabel" (close)="close()">
35736
+ <val-request-form [props]="formProps" (onSubmit)="onFormSubmit($event)" />
35737
+ </val-modal-shell>
35738
+ </ng-template>
35739
+ </ion-modal>
35740
+ `,
35741
+ }]
35742
+ }], propDecorators: { isOpen: [{
35743
+ type: Input
35744
+ }], formProps: [{
35745
+ type: Input
35746
+ }], closeLabel: [{
35747
+ type: Input
35748
+ }], dismissed: [{
35749
+ type: Output
35750
+ }], submitted: [{
35751
+ type: Output
35752
+ }] } });
35753
+
35367
35754
  /**
35368
35755
  * `val-cookie-banner` — bottom/top fixed banner asking the user to choose
35369
35756
  * a cookie consent option. Presentational only: emits events on each
@@ -65439,315 +65826,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
65439
65826
  type: Output
65440
65827
  }] } });
65441
65828
 
65442
- class RequestService {
65443
- constructor(config, http) {
65444
- this.config = config;
65445
- this.http = http;
65446
- }
65447
- get baseUrl() {
65448
- return `${this.config.apiUrl}/v2/requests`;
65449
- }
65450
- get typesUrl() {
65451
- return `${this.config.apiUrl}/v2/request-types`;
65452
- }
65453
- // ── Requests ──
65454
- createRequest(payload) {
65455
- return this.http.post(this.baseUrl, payload);
65456
- }
65457
- createAnonymousRequest(payload) {
65458
- return this.http.post(`${this.baseUrl}/anonymous`, payload);
65459
- }
65460
- listRequests(params) {
65461
- const qs = this.buildQueryString(params);
65462
- return this.http.get(`${this.baseUrl}${qs}`);
65463
- }
65464
- listMyRequests(params) {
65465
- const qs = this.buildQueryString(params);
65466
- return this.http.get(`${this.baseUrl}/my${qs}`);
65467
- }
65468
- getRequest(id) {
65469
- return this.http
65470
- .get(`${this.baseUrl}/${id}`)
65471
- .pipe(map$1(r => r.request));
65472
- }
65473
- updateRequest(id, payload) {
65474
- return this.http
65475
- .put(`${this.baseUrl}/${id}`, payload)
65476
- .pipe(map$1(r => r.request));
65477
- }
65478
- transition(id, payload) {
65479
- return this.http.post(`${this.baseUrl}/${id}/transition`, payload);
65480
- }
65481
- // ── Comments ──
65482
- addComment(requestId, payload) {
65483
- return this.http
65484
- .post(`${this.baseUrl}/${requestId}/comments`, payload)
65485
- .pipe(map$1(r => r.comment));
65486
- }
65487
- listComments(requestId) {
65488
- return this.http.get(`${this.baseUrl}/${requestId}/comments`);
65489
- }
65490
- // ── Request Types ──
65491
- listRequestTypes() {
65492
- return this.http.get(this.typesUrl);
65493
- }
65494
- getRequestType(typeId) {
65495
- return this.http.get(`${this.typesUrl}/${typeId}`);
65496
- }
65497
- createRequestType(payload) {
65498
- return this.http
65499
- .post(this.typesUrl, payload)
65500
- .pipe(map$1(r => r.typeConfig));
65501
- }
65502
- updateRequestType(typeId, payload) {
65503
- return this.http
65504
- .put(`${this.typesUrl}/${typeId}`, payload)
65505
- .pipe(map$1(r => r.typeConfig));
65506
- }
65507
- deleteRequestType(typeId) {
65508
- return this.http.delete(`${this.typesUrl}/${typeId}`);
65509
- }
65510
- // ── Helpers ──
65511
- buildQueryString(params) {
65512
- if (!params)
65513
- return '';
65514
- const qs = new URLSearchParams();
65515
- if (params.type)
65516
- qs.set('type', params.type);
65517
- if (params.status)
65518
- qs.set('status', params.status);
65519
- if (params.limit != null)
65520
- qs.set('limit', String(params.limit));
65521
- if (params.nextToken)
65522
- qs.set('nextToken', params.nextToken);
65523
- const str = qs.toString();
65524
- return str ? `?${str}` : '';
65525
- }
65526
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
65527
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, providedIn: 'root' }); }
65528
- }
65529
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestService, decorators: [{
65530
- type: Injectable,
65531
- args: [{ providedIn: 'root' }]
65532
- }], ctorParameters: () => [{ type: undefined, decorators: [{
65533
- type: Inject,
65534
- args: [VALTECH_AUTH_CONFIG]
65535
- }] }, { type: i1$3.HttpClient }] });
65536
-
65537
- const REQUEST_FORM_I18N = {
65538
- es: {
65539
- title: 'Título',
65540
- titlePlaceholder: 'Describe brevemente tu solicitud',
65541
- titleValidation: 'El título debe tener al menos 3 caracteres',
65542
- description: 'Descripción',
65543
- descriptionPlaceholder: 'Añade más detalles aquí',
65544
- descriptionValidation: 'La descripción es demasiado larga',
65545
- submit: 'Enviar',
65546
- success: 'Solicitud enviada exitosamente',
65547
- error: 'Error al enviar la solicitud',
65548
- },
65549
- en: {
65550
- title: 'Title',
65551
- titlePlaceholder: 'Briefly describe your request',
65552
- titleValidation: 'Title must be at least 3 characters',
65553
- description: 'Description',
65554
- descriptionPlaceholder: 'Add more details here',
65555
- descriptionValidation: 'Description is too long',
65556
- submit: 'Submit',
65557
- success: 'Request submitted successfully',
65558
- error: 'Error submitting the request',
65559
- },
65560
- };
65561
- class RequestFormComponent {
65562
- constructor() {
65563
- this.props = { type: '' };
65564
- this.onSubmit = new EventEmitter();
65565
- this.onCancel = new EventEmitter();
65566
- this.i18n = inject(I18nService);
65567
- this.requestService = inject(RequestService);
65568
- this.feedbackService = inject(FeedbackService);
65569
- this.isSubmitting = signal(false);
65570
- this.isSuccess = signal(false);
65571
- this.error = signal(null);
65572
- this.currentAttachments = [];
65573
- addIcons({ checkmarkCircleOutline, closeCircleOutline });
65574
- if (!this.i18n.hasNamespace('RequestForm')) {
65575
- this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
65576
- }
65577
- }
65578
- ngOnInit() {
65579
- this.formProps = this.buildFormProps();
65580
- }
65581
- buildFormProps() {
65582
- return {
65583
- name: '',
65584
- sections: [
65585
- {
65586
- name: '',
65587
- order: 0,
65588
- fields: [
65589
- {
65590
- token: 'request-title',
65591
- name: 'title',
65592
- label: this.props.titleLabel ?? this.t('title'),
65593
- hint: '',
65594
- placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
65595
- type: InputType.TEXT,
65596
- order: 1,
65597
- validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
65598
- errors: {
65599
- required: this.t('titleValidation'),
65600
- minlength: this.t('titleValidation'),
65601
- maxlength: this.t('titleValidation'),
65602
- },
65603
- state: ComponentStates.ENABLED,
65604
- },
65605
- {
65606
- token: 'request-description',
65607
- name: 'description',
65608
- label: this.props.descriptionLabel ?? this.t('description'),
65609
- hint: '',
65610
- placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
65611
- type: InputType.TEXTAREA,
65612
- order: 2,
65613
- validators: [Validators.maxLength(5000)],
65614
- errors: { maxlength: this.t('descriptionValidation') },
65615
- state: ComponentStates.ENABLED,
65616
- },
65617
- ],
65618
- },
65619
- ],
65620
- actions: {
65621
- type: 'submit',
65622
- color: 'dark',
65623
- fill: 'solid',
65624
- shape: 'round',
65625
- expand: 'block',
65626
- text: this.props.submitButtonText ?? this.t('submit'),
65627
- state: ComponentStates.ENABLED,
65628
- },
65629
- state: ComponentStates.ENABLED,
65630
- };
65631
- }
65632
- async handleFormSubmit(submitted) {
65633
- if (this.isSubmitting())
65634
- return;
65635
- if (this.currentAttachments.some(a => a.status === 'uploading'))
65636
- return;
65637
- this.isSubmitting.set(true);
65638
- this.error.set(null);
65639
- this.isSuccess.set(false);
65640
- this.formProps.state = ComponentStates.WORKING;
65641
- this.formProps.actions.state = ComponentStates.WORKING;
65642
- try {
65643
- const title = submitted.fields['title'].trim();
65644
- const description = submitted.fields['description']?.trim() ?? '';
65645
- const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
65646
- const result = await firstValueFrom(this.requestService.createRequest({
65647
- type: this.props.type,
65648
- title,
65649
- fields: {
65650
- ...(description ? { description } : {}),
65651
- ...(attachmentUrls.length ? { attachmentUrls } : {}),
65652
- },
65653
- }));
65654
- this.isSuccess.set(true);
65655
- this.onSubmit.emit({
65656
- requestId: result.requestId,
65657
- request: result.request,
65658
- type: this.props.type,
65659
- title,
65660
- attachmentUrls,
65661
- });
65662
- }
65663
- catch (err) {
65664
- this.error.set(err.error?.message || err.message || this.t('error'));
65665
- }
65666
- finally {
65667
- this.isSubmitting.set(false);
65668
- this.formProps.state = ComponentStates.ENABLED;
65669
- this.formProps.actions.state = ComponentStates.ENABLED;
65670
- }
65671
- }
65672
- onAttachmentsChange(items) {
65673
- this.currentAttachments = items;
65674
- }
65675
- onCancelClick() {
65676
- this.onCancel.emit();
65677
- }
65678
- t(key) {
65679
- return this.i18n.t(key, 'RequestForm');
65680
- }
65681
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65682
- 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: `
65683
- <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
65684
- <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
65685
- @if (props.showAttachments !== false) {
65686
- <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
65687
- }
65688
-
65689
- @if (error()) {
65690
- <div class="request-alert error">
65691
- <ion-icon name="close-circle-outline" aria-hidden="true" />
65692
- <span>{{ error() }}</span>
65693
- </div>
65694
- }
65695
-
65696
- @if (isSuccess()) {
65697
- <div class="request-alert success">
65698
- <ion-icon name="checkmark-circle-outline" aria-hidden="true" />
65699
- <span>{{ props.successMessage || t('success') }}</span>
65700
- </div>
65701
- }
65702
- </val-form>
65703
-
65704
- @if (props.cancelButtonText) {
65705
- <ion-button fill="outline" color="medium" expand="block" class="cancel-button" (click)="onCancelClick()">
65706
- {{ props.cancelButtonText }}
65707
- </ion-button>
65708
- }
65709
- </div>
65710
- `, 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"] }] }); }
65711
- }
65712
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
65713
- type: Component,
65714
- args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
65715
- <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
65716
- <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
65717
- @if (props.showAttachments !== false) {
65718
- <val-attachment-uploader [props]="{ maxFiles: 5 }" (attachmentsChange)="onAttachmentsChange($event)" />
65719
- }
65720
-
65721
- @if (error()) {
65722
- <div class="request-alert error">
65723
- <ion-icon name="close-circle-outline" aria-hidden="true" />
65724
- <span>{{ error() }}</span>
65725
- </div>
65726
- }
65727
-
65728
- @if (isSuccess()) {
65729
- <div class="request-alert success">
65730
- <ion-icon name="checkmark-circle-outline" aria-hidden="true" />
65731
- <span>{{ props.successMessage || t('success') }}</span>
65732
- </div>
65733
- }
65734
- </val-form>
65735
-
65736
- @if (props.cancelButtonText) {
65737
- <ion-button fill="outline" color="medium" expand="block" class="cancel-button" (click)="onCancelClick()">
65738
- {{ props.cancelButtonText }}
65739
- </ion-button>
65740
- }
65741
- </div>
65742
- `, 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"] }]
65743
- }], ctorParameters: () => [], propDecorators: { props: [{
65744
- type: Input
65745
- }], onSubmit: [{
65746
- type: Output
65747
- }], onCancel: [{
65748
- type: Output
65749
- }] } });
65750
-
65751
65829
  const DEFAULT_SPLASH_SCREEN_CONFIG = {
65752
65830
  fadeOutDuration: 300,
65753
65831
  };
@@ -69963,5 +70041,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
69963
70041
  * Generated bundle index. Do not edit.
69964
70042
  */
69965
70043
 
69966
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
70044
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
69967
70045
  //# sourceMappingURL=valtech-components.mjs.map