valtech-components 2.0.398 → 2.0.400

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, ChangeDetectorRef, HostListener, Pipe, ChangeDetectionStrategy, ViewChild } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, ChangeDetectorRef, HostListener, Pipe, ChangeDetectionStrategy, ViewChild, forwardRef } from '@angular/core';
3
3
  import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonTextarea, IonDatetime, IonDatetimeButton, IonInput, IonSelect, IonSelectOption, IonLabel, IonRadioGroup, IonRadio, IonSearchbar, IonMenuButton, IonFooter, IonList, IonListHeader, IonNote, IonItem } from '@ionic/angular/standalone';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgStyle, Location, AsyncPipe, NgFor, NgClass } from '@angular/common';
@@ -10,7 +10,7 @@ import { Router, RouterLink } from '@angular/router';
10
10
  import { Browser } from '@capacitor/browser';
11
11
  import * as i1$1 from '@angular/platform-browser';
12
12
  import * as i1$2 from '@angular/forms';
13
- import { ReactiveFormsModule, FormsModule, Validators } from '@angular/forms';
13
+ import { ReactiveFormsModule, FormsModule, Validators, NG_VALUE_ACCESSOR } from '@angular/forms';
14
14
  import { map as map$1 } from 'rxjs/operators';
15
15
  import * as i1$3 from 'ng-otp-input';
16
16
  import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
@@ -7517,351 +7517,361 @@ class MultiSelectSearchComponent {
7517
7517
  constructor() {
7518
7518
  this.labelProperty = 'name';
7519
7519
  this.valueProperty = 'id';
7520
+ this.placeholder = '';
7520
7521
  this.langService = inject(LangService);
7521
- this.icon = inject(IconService);
7522
7522
  this.changeDetector = inject(ChangeDetectorRef);
7523
+ // Component state
7524
+ this.isOpen = false;
7523
7525
  this.searchTerm = '';
7524
- this.filteredItems = [];
7525
- this.selectedItems = [];
7526
+ this.selectedValues = [];
7526
7527
  this.displayValue = '';
7527
- this.previousOptions = [];
7528
- this.isProcessingChanges = false;
7529
- this.label = this.langService.getText('_global', 'selectMultiple', 'Seleccionar múltiples');
7528
+ this.filteredOptions = [];
7529
+ this.searchPlaceholder = '';
7530
+ // ControlValueAccessor
7531
+ this.onChange = (_value) => { };
7532
+ this.onTouched = () => { };
7530
7533
  this.placeholder = this.langService.getText('_global', 'selectOptions', 'Seleccione opciones');
7534
+ this.searchPlaceholder = this.langService.getText('_global', 'search', 'Buscar');
7535
+ // Close dropdown when clicking outside
7536
+ document.addEventListener('click', this.handleClickOutside.bind(this));
7531
7537
  }
7532
7538
  ngOnInit() {
7533
7539
  this.applyDefaultValue();
7534
- this.initializeItems();
7535
- this.syncControlValueWithSelectedItems();
7540
+ this.initializeOptions();
7541
+ this.syncSelectedValues();
7536
7542
  this.updateDisplayValue();
7537
- this.subscribeToValueChanges();
7538
7543
  }
7539
7544
  ngOnDestroy() {
7540
- if (this.valueChangesSubscription) {
7541
- this.valueChangesSubscription.unsubscribe();
7542
- }
7545
+ document.removeEventListener('click', this.handleClickOutside.bind(this));
7543
7546
  }
7544
7547
  ngOnChanges(changes) {
7545
- if (this.isProcessingChanges) {
7546
- return;
7547
- }
7548
- if (changes['props']) {
7549
- try {
7550
- this.isProcessingChanges = true;
7551
- if (this.valueChangesSubscription) {
7552
- this.valueChangesSubscription.unsubscribe();
7553
- }
7554
- if (this.props?.options) {
7555
- const optionsChanged = !this.areOptionsEqual(this.previousOptions, this.props.options);
7556
- if (optionsChanged) {
7557
- this.previousOptions = [...this.props.options];
7558
- this.initializeItems();
7559
- }
7560
- }
7561
- this.syncControlValueWithSelectedItems();
7562
- this.updateDisplayValue();
7563
- this.subscribeToValueChanges();
7564
- }
7565
- finally {
7566
- this.isProcessingChanges = false;
7567
- }
7568
- }
7569
- }
7570
- ionViewWillEnter() {
7571
- if (this.isProcessingChanges) {
7572
- return;
7573
- }
7574
- try {
7575
- this.isProcessingChanges = true;
7576
- this.initializeItems();
7577
- this.syncControlValueWithSelectedItems();
7548
+ if (changes['props'] && this.props) {
7549
+ this.initializeOptions();
7550
+ this.syncSelectedValues();
7578
7551
  this.updateDisplayValue();
7579
- this.subscribeToValueChanges();
7580
- }
7581
- finally {
7582
- this.isProcessingChanges = false;
7552
+ this.changeDetector.detectChanges();
7583
7553
  }
7584
7554
  }
7585
- subscribeToValueChanges() {
7586
- if (!this.props?.control)
7587
- return;
7588
- this.valueChangesSubscription = this.props.control.valueChanges.subscribe(value => {
7589
- if (this.isProcessingChanges)
7590
- return;
7591
- try {
7592
- this.isProcessingChanges = true;
7593
- this.syncControlValueWithSelectedItems();
7594
- this.updateDisplayValue();
7595
- }
7596
- finally {
7597
- this.isProcessingChanges = false;
7598
- }
7599
- });
7555
+ // ControlValueAccessor implementation
7556
+ writeValue(value) {
7557
+ const valueArray = this.parseValue(value);
7558
+ this.selectedValues = valueArray;
7559
+ this.updateDisplayValue();
7600
7560
  }
7601
- areOptionsEqual(prevOptions, newOptions) {
7602
- if (prevOptions === newOptions)
7603
- return true;
7604
- if (!prevOptions || !newOptions)
7605
- return prevOptions === newOptions;
7606
- if (prevOptions.length !== newOptions.length)
7607
- return false;
7608
- for (let i = 0; i < prevOptions.length; i++) {
7609
- if (prevOptions[i][this.valueProperty] !== newOptions[i][this.valueProperty]) {
7610
- return false;
7611
- }
7612
- }
7613
- return true;
7561
+ registerOnChange(fn) {
7562
+ this.onChange = fn;
7614
7563
  }
7615
- initializeItems() {
7616
- this.filteredItems = this.props?.options || [];
7564
+ registerOnTouched(fn) {
7565
+ this.onTouched = fn;
7617
7566
  }
7618
- syncControlValueWithSelectedItems() {
7619
- if (!this.props?.control) {
7620
- this.selectedItems = [];
7621
- return;
7622
- }
7623
- const controlValue = this.props.control.value;
7624
- if (!Array.isArray(controlValue) || controlValue.length === 0) {
7625
- this.selectedItems = [];
7626
- return;
7627
- }
7628
- if (this.props.options && this.props.options.length > 0) {
7629
- const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));
7630
- this.selectedItems = controlValue
7631
- .map(value => map.get(value))
7632
- .filter(item => item !== undefined);
7633
- }
7634
- else {
7635
- this.selectedItems = [];
7567
+ setDisabledState(_isDisabled) {
7568
+ // Handle disabled state if needed
7569
+ }
7570
+ // Component methods
7571
+ toggleDropdown(event) {
7572
+ event.stopPropagation();
7573
+ this.isOpen = !this.isOpen;
7574
+ if (this.isOpen) {
7575
+ this.onTouched();
7576
+ // Focus search bar when opening
7577
+ setTimeout(() => {
7578
+ const searchbar = this.dropdownRef?.nativeElement?.querySelector('ion-searchbar');
7579
+ if (searchbar) {
7580
+ searchbar.setFocus();
7581
+ }
7582
+ }, 100);
7636
7583
  }
7637
7584
  }
7638
- applyDefaultValue() {
7639
- applyDefaultValueToControl(this.props);
7585
+ onSearch(event) {
7586
+ this.searchTerm = event.detail.value || '';
7587
+ this.filterOptions();
7640
7588
  }
7641
- onFilter(event) {
7642
- if (!event || event.trim() === '') {
7643
- this.filteredItems = this.props?.options ? [...this.props.options] : [];
7644
- this.changeDetector.detectChanges();
7645
- return;
7589
+ toggleOption(option) {
7590
+ const value = String(option[this.valueProperty]);
7591
+ if (this.isSelected(option)) {
7592
+ // Remove from selection
7593
+ this.selectedValues = this.selectedValues.filter(v => v !== value);
7646
7594
  }
7647
- if (!this.props?.options || this.props.options.length === 0) {
7648
- this.filteredItems = [];
7649
- this.changeDetector.detectChanges();
7650
- return;
7595
+ else {
7596
+ // Add to selection
7597
+ this.selectedValues = [...this.selectedValues, value];
7651
7598
  }
7652
- const search = replaceSpecialChars(event.toLowerCase());
7653
- this.filteredItems = this.props.options.filter(element => {
7654
- const label = element[this.labelProperty]
7655
- ? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())
7656
- : '';
7657
- const value = element[this.valueProperty]
7658
- ? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())
7659
- : '';
7660
- return label.includes(search) || value.includes(search);
7661
- });
7662
- this.changeDetector.detectChanges();
7599
+ this.updateDisplayValue();
7600
+ this.emitValue();
7663
7601
  }
7664
- onFocus() {
7665
- console.log('onFocus');
7602
+ selectAll() {
7603
+ const allValues = this.filteredOptions.map(option => String(option[this.valueProperty]));
7604
+ // Add only new values to avoid duplicates
7605
+ const newValues = allValues.filter(value => !this.selectedValues.includes(value));
7606
+ this.selectedValues = [...this.selectedValues, ...newValues];
7607
+ this.updateDisplayValue();
7608
+ this.emitValue();
7666
7609
  }
7667
- onBlur() {
7668
- console.log('onBlur');
7610
+ clearAll() {
7611
+ this.selectedValues = [];
7612
+ this.updateDisplayValue();
7613
+ this.emitValue();
7669
7614
  }
7670
- openModal() {
7671
- if (this.modal) {
7672
- this.modal.present();
7673
- }
7615
+ isSelected(option) {
7616
+ return this.selectedValues.includes(String(option[this.valueProperty]));
7674
7617
  }
7675
- preventDefaultBehavior(event) {
7676
- event.preventDefault();
7677
- event.stopPropagation();
7678
- this.openModal();
7618
+ trackByFn(_index, option) {
7619
+ return option[this.valueProperty];
7679
7620
  }
7680
- cancelModal() {
7681
- // Reset filter and show all options when closing modal
7682
- this.searchTerm = '';
7683
- this.filteredItems = this.props?.options ? [...this.props.options] : [];
7684
- this.changeDetector.detectChanges();
7685
- if (this.modal) {
7686
- this.modal.dismiss();
7621
+ handleClickOutside(event) {
7622
+ if (this.isOpen &&
7623
+ !this.mainInputRef?.nativeElement?.contains(event.target) &&
7624
+ !this.dropdownRef?.nativeElement?.contains(event.target)) {
7625
+ this.isOpen = false;
7626
+ this.searchTerm = '';
7627
+ this.initializeOptions();
7687
7628
  }
7688
7629
  }
7689
- toggleItem(item) {
7690
- const index = this.selectedItems.findIndex(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
7691
- if (index === -1) {
7692
- this.selectedItems.push(item);
7693
- }
7694
- else {
7695
- this.selectedItems.splice(index, 1);
7630
+ parseValue(value) {
7631
+ if (!value)
7632
+ return [];
7633
+ if (Array.isArray(value))
7634
+ return value.map(v => String(v));
7635
+ if (typeof value === 'string') {
7636
+ return value
7637
+ .split(',')
7638
+ .map(v => v.trim())
7639
+ .filter(v => v !== '');
7640
+ }
7641
+ return [String(value)];
7642
+ }
7643
+ emitValue() {
7644
+ const value = this.selectedValues.join(',');
7645
+ this.onChange(value);
7646
+ if (this.props?.control) {
7647
+ this.props.control.setValue(value);
7648
+ this.props.control.markAsDirty();
7649
+ this.props.control.markAsTouched();
7696
7650
  }
7697
- this.updateDisplayValue();
7698
7651
  }
7699
- isItemSelected(item) {
7700
- return this.selectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
7652
+ getOptionByValue(value) {
7653
+ return this.filteredOptions.find(option => String(option[this.valueProperty]) === String(value));
7701
7654
  }
7702
- clearSelection() {
7703
- this.selectedItems = [];
7704
- this.updateDisplayValue();
7655
+ applyDefaultValue() {
7656
+ if (this.props) {
7657
+ applyDefaultValueToControl(this.props);
7658
+ }
7705
7659
  }
7706
- applySelection() {
7707
- this.applyChanges();
7708
- this.cancelModal();
7660
+ initializeOptions() {
7661
+ this.filteredOptions = this.props?.options || [];
7709
7662
  }
7710
- updateDisplayValue() {
7711
- if (this.selectedItems.length === 0) {
7712
- this.displayValue = '';
7663
+ filterOptions() {
7664
+ if (!this.searchTerm) {
7665
+ this.initializeOptions();
7713
7666
  return;
7714
7667
  }
7715
- if (this.selectedItems.length === 1) {
7716
- this.displayValue = this.selectedItems[0][this.labelProperty];
7717
- }
7718
- else {
7719
- this.displayValue = `${this.selectedItems.length} elementos seleccionados`;
7720
- }
7668
+ const search = replaceSpecialChars(this.searchTerm.toLowerCase());
7669
+ this.filteredOptions = (this.props?.options || []).filter(option => {
7670
+ const label = option[this.labelProperty]
7671
+ ? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
7672
+ : '';
7673
+ const value = option[this.valueProperty]
7674
+ ? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
7675
+ : '';
7676
+ return label.includes(search) || value.includes(search);
7677
+ });
7721
7678
  }
7722
- applyChanges() {
7723
- if (!this.props?.control) {
7679
+ updateDisplayValue() {
7680
+ if (this.selectedValues.length === 0) {
7681
+ this.displayValue = '';
7724
7682
  return;
7725
7683
  }
7726
- try {
7727
- this.isProcessingChanges = true;
7728
- const values = this.selectedItems.map(item => item[this.valueProperty]);
7729
- this.props.control.setValue(values);
7730
- this.props.control.markAsDirty();
7731
- this.props.control.updateValueAndValidity();
7684
+ if (this.selectedValues.length === 1) {
7685
+ const option = this.getOptionByValue(this.selectedValues[0]);
7686
+ this.displayValue = option ? option[this.labelProperty] : '';
7732
7687
  }
7733
- finally {
7734
- this.isProcessingChanges = false;
7688
+ else {
7689
+ this.displayValue = `${this.selectedValues.length} elementos seleccionados`;
7735
7690
  }
7736
7691
  }
7737
- reset() {
7738
- this.selectedItems = [];
7739
- this.displayValue = '';
7740
- if (this.props?.control) {
7741
- this.props.control.setValue([]);
7692
+ syncSelectedValues() {
7693
+ if (this.props?.control?.value) {
7694
+ const valueArray = this.parseValue(this.props.control.value);
7695
+ this.selectedValues = valueArray;
7742
7696
  }
7743
- this.changeDetector.detectChanges();
7744
7697
  }
7745
7698
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7746
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiSelectSearchComponent, isStandalone: true, selector: "val-multi-select-search", inputs: { label: "label", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder", props: "props" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
7747
- <ion-input
7748
- type="text"
7749
- [value]="displayValue"
7750
- [placeholder]="props?.placeholder || placeholder"
7751
- readonly
7752
- (mousedown)="preventDefaultBehavior($event)"
7753
- />
7699
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiSelectSearchComponent, isStandalone: true, selector: "val-multi-select-search", inputs: { props: "props", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder" }, providers: [
7700
+ {
7701
+ provide: NG_VALUE_ACCESSOR,
7702
+ useExisting: forwardRef(() => MultiSelectSearchComponent),
7703
+ multi: true,
7704
+ },
7705
+ ], viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "mainInputRef", first: true, predicate: ["mainInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
7706
+ <div class="multi-select-container" (click)="toggleDropdown($event)">
7707
+ <!-- Main input display -->
7708
+ <ion-input
7709
+ #mainInput
7710
+ type="text"
7711
+ [value]="displayValue"
7712
+ [placeholder]="props?.placeholder || placeholder"
7713
+ readonly
7714
+ class="main-input"
7715
+ [class.is-open]="isOpen"
7716
+ />
7717
+
7718
+ <!-- Dropdown icon -->
7719
+ <ion-icon name="chevron-down-outline" class="dropdown-icon" [class.rotated]="isOpen"></ion-icon>
7720
+
7721
+ <!-- Hidden input for form control -->
7722
+ <ion-input
7723
+ style="position: absolute; opacity: 0; pointer-events: none;"
7724
+ [formControl]="props?.control"
7725
+ type="hidden"
7726
+ />
7727
+ </div>
7754
7728
 
7755
- <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
7729
+ <!-- Dropdown overlay -->
7730
+ <div class="dropdown-overlay" [class.visible]="isOpen" #dropdown>
7731
+ <!-- Search bar -->
7732
+ <div class="search-container" *ngIf="props?.options && props.options.length > 5">
7733
+ <ion-searchbar
7734
+ #searchbar
7735
+ [placeholder]="searchPlaceholder"
7736
+ (ionInput)="onSearch($event)"
7737
+ [value]="searchTerm"
7738
+ show-clear-button="focus"
7739
+ [debounce]="200"
7740
+ ></ion-searchbar>
7741
+ </div>
7756
7742
 
7757
- <ion-modal
7758
- #modal
7759
- trigger="open-modal"
7760
- [initialBreakpoint]="1"
7761
- [breakpoints]="[0, 0.5, 0.75, 1]"
7762
- (didDismiss)="cancelModal()"
7763
- >
7764
- <ng-template>
7765
- <ion-header>
7766
- <ion-toolbar>
7767
- <ion-title>{{ label }}</ion-title>
7768
- <ion-buttons slot="end">
7769
- <ion-button (click)="cancelModal()">Cerrar</ion-button>
7770
- </ion-buttons>
7771
- </ion-toolbar>
7772
- <ion-toolbar>
7773
- <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
7774
- </ion-toolbar>
7775
- </ion-header>
7776
- <ion-content>
7777
- <ion-list>
7778
- <ion-item *ngFor="let item of filteredItems" button (click)="toggleItem(item)" detail="false">
7779
- <ion-checkbox
7780
- [checked]="isItemSelected(item)"
7781
- slot="start"
7782
- (ionChange)="toggleItem(item)"
7783
- ></ion-checkbox>
7784
- <ion-label>{{ item[labelProperty] }}</ion-label>
7785
- </ion-item>
7786
- <ion-item *ngIf="filteredItems.length === 0" lines="none">
7787
- <ion-label color="dark">No se encontraron resultados</ion-label>
7788
- </ion-item>
7789
- </ion-list>
7790
- </ion-content>
7791
- <ion-footer *ngIf="selectedItems.length > 0">
7792
- <ion-toolbar>
7793
- <ion-buttons slot="end">
7794
- <ion-button (click)="clearSelection()">Limpiar</ion-button>
7795
- <ion-button fill="solid" (click)="applySelection()">Aplicar ({{ selectedItems.length }})</ion-button>
7796
- </ion-buttons>
7797
- </ion-toolbar>
7798
- </ion-footer>
7799
- </ng-template>
7800
- </ion-modal>
7801
- `, isInline: true, styles: ["ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.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: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
7743
+ <!-- Action buttons -->
7744
+ <div class="actions-container" *ngIf="filteredOptions.length > 0">
7745
+ <ion-button fill="clear" size="small" (click)="selectAll()" [disabled]="filteredOptions.length === 0">
7746
+ Seleccionar todos
7747
+ </ion-button>
7748
+ <ion-button
7749
+ fill="clear"
7750
+ size="small"
7751
+ color="medium"
7752
+ (click)="clearAll()"
7753
+ [disabled]="selectedValues.length === 0"
7754
+ >
7755
+ Limpiar
7756
+ </ion-button>
7757
+ </div>
7758
+
7759
+ <!-- Options list -->
7760
+ <div class="options-container">
7761
+ <ion-list class="options-list">
7762
+ <ion-item
7763
+ *ngFor="let option of filteredOptions; trackBy: trackByFn"
7764
+ button
7765
+ (click)="toggleOption(option)"
7766
+ class="option-item"
7767
+ >
7768
+ <ion-checkbox slot="start" [checked]="isSelected(option)"></ion-checkbox>
7769
+ <ion-label>{{ option[labelProperty] }}</ion-label>
7770
+ </ion-item>
7771
+
7772
+ <!-- No results message -->
7773
+ <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
7774
+ <ion-label color="medium">
7775
+ {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
7776
+ </ion-label>
7777
+ </ion-item>
7778
+ </ion-list>
7779
+ </div>
7780
+ </div>
7781
+ `, isInline: true, styles: [".multi-select-container{position:relative;display:flex;align-items:center;width:100%}.multi-select-container .main-input{flex:1;cursor:pointer}.multi-select-container .main-input.is-open{border-color:var(--ion-color-primary)}.multi-select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none}.multi-select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;z-index:1000;background:var(--ion-color-light);border:1px solid var(--ion-color-medium);border-radius:8px;box-shadow:0 4px 16px #00000026;max-height:300px;overflow:hidden;opacity:0;visibility:hidden;transform:translateY(-10px);transition:all .2s ease}.dropdown-overlay.visible{opacity:1;visibility:visible;transform:translateY(0)}.dropdown-overlay .search-container{padding:8px;border-bottom:1px solid var(--ion-color-light-shade)}.dropdown-overlay .search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 6px;--box-shadow: none;padding:0}.dropdown-overlay .actions-container{display:flex;justify-content:space-between;padding:8px;border-bottom:1px solid var(--ion-color-light-shade);background:var(--ion-color-light-tint)}.dropdown-overlay .actions-container ion-button{--padding-start: 8px;--padding-end: 8px;font-size:12px;height:28px}.dropdown-overlay .options-container{max-height:200px;overflow-y:auto}.dropdown-overlay .options-container .options-list{padding:0;margin:0}.dropdown-overlay .options-container .options-list .option-item{--padding-start: 12px;--padding-end: 12px;--inner-padding-end: 0;cursor:pointer;transition:background-color .2s ease}.dropdown-overlay .options-container .options-list .option-item:hover{--background: var(--ion-color-light-shade)}.dropdown-overlay .options-container .options-list .option-item ion-checkbox{margin-right:12px}.dropdown-overlay .options-container .options-list .option-item ion-label{font-size:14px;color:var(--ion-color-dark)}.dropdown-overlay .options-container .options-list .no-results{--padding-start: 12px;--padding-end: 12px;cursor:default}.dropdown-overlay .options-container .options-list .no-results ion-label{font-size:14px;font-style:italic}@media (prefers-color-scheme: dark){.dropdown-overlay{background:var(--ion-color-dark);border-color:var(--ion-color-medium-shade)}.dropdown-overlay .search-container{border-bottom-color:var(--ion-color-dark-shade)}.dropdown-overlay .search-container ion-searchbar{--background: var(--ion-color-dark-tint)}.dropdown-overlay .actions-container{border-bottom-color:var(--ion-color-dark-shade);background:var(--ion-color-dark-tint)}.dropdown-overlay .options-list .option-item:hover{--background: var(--ion-color-dark-shade)}.dropdown-overlay .options-list .option-item ion-label{color:var(--ion-color-light)}}@media (max-width: 768px){.dropdown-overlay .options-container{max-height:180px}.dropdown-overlay .actions-container ion-button{font-size:11px;height:26px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.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: i2.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
7802
7782
  }
7803
7783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSearchComponent, decorators: [{
7804
7784
  type: Component,
7805
- args: [{ selector: 'val-multi-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule], template: `
7806
- <ion-input
7807
- type="text"
7808
- [value]="displayValue"
7809
- [placeholder]="props?.placeholder || placeholder"
7810
- readonly
7811
- (mousedown)="preventDefaultBehavior($event)"
7812
- />
7785
+ args: [{ selector: 'val-multi-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, ReactiveFormsModule], providers: [
7786
+ {
7787
+ provide: NG_VALUE_ACCESSOR,
7788
+ useExisting: forwardRef(() => MultiSelectSearchComponent),
7789
+ multi: true,
7790
+ },
7791
+ ], template: `
7792
+ <div class="multi-select-container" (click)="toggleDropdown($event)">
7793
+ <!-- Main input display -->
7794
+ <ion-input
7795
+ #mainInput
7796
+ type="text"
7797
+ [value]="displayValue"
7798
+ [placeholder]="props?.placeholder || placeholder"
7799
+ readonly
7800
+ class="main-input"
7801
+ [class.is-open]="isOpen"
7802
+ />
7803
+
7804
+ <!-- Dropdown icon -->
7805
+ <ion-icon name="chevron-down-outline" class="dropdown-icon" [class.rotated]="isOpen"></ion-icon>
7806
+
7807
+ <!-- Hidden input for form control -->
7808
+ <ion-input
7809
+ style="position: absolute; opacity: 0; pointer-events: none;"
7810
+ [formControl]="props?.control"
7811
+ type="hidden"
7812
+ />
7813
+ </div>
7813
7814
 
7814
- <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
7815
+ <!-- Dropdown overlay -->
7816
+ <div class="dropdown-overlay" [class.visible]="isOpen" #dropdown>
7817
+ <!-- Search bar -->
7818
+ <div class="search-container" *ngIf="props?.options && props.options.length > 5">
7819
+ <ion-searchbar
7820
+ #searchbar
7821
+ [placeholder]="searchPlaceholder"
7822
+ (ionInput)="onSearch($event)"
7823
+ [value]="searchTerm"
7824
+ show-clear-button="focus"
7825
+ [debounce]="200"
7826
+ ></ion-searchbar>
7827
+ </div>
7815
7828
 
7816
- <ion-modal
7817
- #modal
7818
- trigger="open-modal"
7819
- [initialBreakpoint]="1"
7820
- [breakpoints]="[0, 0.5, 0.75, 1]"
7821
- (didDismiss)="cancelModal()"
7822
- >
7823
- <ng-template>
7824
- <ion-header>
7825
- <ion-toolbar>
7826
- <ion-title>{{ label }}</ion-title>
7827
- <ion-buttons slot="end">
7828
- <ion-button (click)="cancelModal()">Cerrar</ion-button>
7829
- </ion-buttons>
7830
- </ion-toolbar>
7831
- <ion-toolbar>
7832
- <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
7833
- </ion-toolbar>
7834
- </ion-header>
7835
- <ion-content>
7836
- <ion-list>
7837
- <ion-item *ngFor="let item of filteredItems" button (click)="toggleItem(item)" detail="false">
7838
- <ion-checkbox
7839
- [checked]="isItemSelected(item)"
7840
- slot="start"
7841
- (ionChange)="toggleItem(item)"
7842
- ></ion-checkbox>
7843
- <ion-label>{{ item[labelProperty] }}</ion-label>
7844
- </ion-item>
7845
- <ion-item *ngIf="filteredItems.length === 0" lines="none">
7846
- <ion-label color="dark">No se encontraron resultados</ion-label>
7847
- </ion-item>
7848
- </ion-list>
7849
- </ion-content>
7850
- <ion-footer *ngIf="selectedItems.length > 0">
7851
- <ion-toolbar>
7852
- <ion-buttons slot="end">
7853
- <ion-button (click)="clearSelection()">Limpiar</ion-button>
7854
- <ion-button fill="solid" (click)="applySelection()">Aplicar ({{ selectedItems.length }})</ion-button>
7855
- </ion-buttons>
7856
- </ion-toolbar>
7857
- </ion-footer>
7858
- </ng-template>
7859
- </ion-modal>
7860
- `, styles: ["ion-header{padding:8px 8px 0}\n"] }]
7861
- }], ctorParameters: () => [], propDecorators: { modal: [{
7829
+ <!-- Action buttons -->
7830
+ <div class="actions-container" *ngIf="filteredOptions.length > 0">
7831
+ <ion-button fill="clear" size="small" (click)="selectAll()" [disabled]="filteredOptions.length === 0">
7832
+ Seleccionar todos
7833
+ </ion-button>
7834
+ <ion-button
7835
+ fill="clear"
7836
+ size="small"
7837
+ color="medium"
7838
+ (click)="clearAll()"
7839
+ [disabled]="selectedValues.length === 0"
7840
+ >
7841
+ Limpiar
7842
+ </ion-button>
7843
+ </div>
7844
+
7845
+ <!-- Options list -->
7846
+ <div class="options-container">
7847
+ <ion-list class="options-list">
7848
+ <ion-item
7849
+ *ngFor="let option of filteredOptions; trackBy: trackByFn"
7850
+ button
7851
+ (click)="toggleOption(option)"
7852
+ class="option-item"
7853
+ >
7854
+ <ion-checkbox slot="start" [checked]="isSelected(option)"></ion-checkbox>
7855
+ <ion-label>{{ option[labelProperty] }}</ion-label>
7856
+ </ion-item>
7857
+
7858
+ <!-- No results message -->
7859
+ <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
7860
+ <ion-label color="medium">
7861
+ {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
7862
+ </ion-label>
7863
+ </ion-item>
7864
+ </ion-list>
7865
+ </div>
7866
+ </div>
7867
+ `, styles: [".multi-select-container{position:relative;display:flex;align-items:center;width:100%}.multi-select-container .main-input{flex:1;cursor:pointer}.multi-select-container .main-input.is-open{border-color:var(--ion-color-primary)}.multi-select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none}.multi-select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;z-index:1000;background:var(--ion-color-light);border:1px solid var(--ion-color-medium);border-radius:8px;box-shadow:0 4px 16px #00000026;max-height:300px;overflow:hidden;opacity:0;visibility:hidden;transform:translateY(-10px);transition:all .2s ease}.dropdown-overlay.visible{opacity:1;visibility:visible;transform:translateY(0)}.dropdown-overlay .search-container{padding:8px;border-bottom:1px solid var(--ion-color-light-shade)}.dropdown-overlay .search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 6px;--box-shadow: none;padding:0}.dropdown-overlay .actions-container{display:flex;justify-content:space-between;padding:8px;border-bottom:1px solid var(--ion-color-light-shade);background:var(--ion-color-light-tint)}.dropdown-overlay .actions-container ion-button{--padding-start: 8px;--padding-end: 8px;font-size:12px;height:28px}.dropdown-overlay .options-container{max-height:200px;overflow-y:auto}.dropdown-overlay .options-container .options-list{padding:0;margin:0}.dropdown-overlay .options-container .options-list .option-item{--padding-start: 12px;--padding-end: 12px;--inner-padding-end: 0;cursor:pointer;transition:background-color .2s ease}.dropdown-overlay .options-container .options-list .option-item:hover{--background: var(--ion-color-light-shade)}.dropdown-overlay .options-container .options-list .option-item ion-checkbox{margin-right:12px}.dropdown-overlay .options-container .options-list .option-item ion-label{font-size:14px;color:var(--ion-color-dark)}.dropdown-overlay .options-container .options-list .no-results{--padding-start: 12px;--padding-end: 12px;cursor:default}.dropdown-overlay .options-container .options-list .no-results ion-label{font-size:14px;font-style:italic}@media (prefers-color-scheme: dark){.dropdown-overlay{background:var(--ion-color-dark);border-color:var(--ion-color-medium-shade)}.dropdown-overlay .search-container{border-bottom-color:var(--ion-color-dark-shade)}.dropdown-overlay .search-container ion-searchbar{--background: var(--ion-color-dark-tint)}.dropdown-overlay .actions-container{border-bottom-color:var(--ion-color-dark-shade);background:var(--ion-color-dark-tint)}.dropdown-overlay .options-list .option-item:hover{--background: var(--ion-color-dark-shade)}.dropdown-overlay .options-list .option-item ion-label{color:var(--ion-color-light)}}@media (max-width: 768px){.dropdown-overlay .options-container{max-height:180px}.dropdown-overlay .actions-container ion-button{font-size:11px;height:26px}}\n"] }]
7868
+ }], ctorParameters: () => [], propDecorators: { dropdownRef: [{
7862
7869
  type: ViewChild,
7863
- args: ['modal']
7864
- }], label: [{
7870
+ args: ['dropdown']
7871
+ }], mainInputRef: [{
7872
+ type: ViewChild,
7873
+ args: ['mainInput']
7874
+ }], props: [{
7865
7875
  type: Input
7866
7876
  }], labelProperty: [{
7867
7877
  type: Input
@@ -7869,8 +7879,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7869
7879
  type: Input
7870
7880
  }], placeholder: [{
7871
7881
  type: Input
7872
- }], props: [{
7873
- type: Input
7874
7882
  }] } });
7875
7883
 
7876
7884
  class FormComponent {
@@ -7900,7 +7908,10 @@ class FormComponent {
7900
7908
  this.form = this.fb.group(formControls);
7901
7909
  this.props.sections.forEach(section => {
7902
7910
  section.fields
7903
- .filter(x => x.type === this.types.SELECT || x.type === this.types.TEXT || x.type === this.types.SEARCH_SELECT || x.type === this.types.MULTI_SELECT)
7911
+ .filter(x => x.type === this.types.SELECT ||
7912
+ x.type === this.types.TEXT ||
7913
+ x.type === this.types.SEARCH_SELECT ||
7914
+ x.type === this.types.MULTI_SELECT)
7904
7915
  .forEach(field => {
7905
7916
  this.trackSelectChanges(field.name);
7906
7917
  });
@@ -8062,7 +8073,7 @@ class FormComponent {
8062
8073
  ></val-button-group>
8063
8074
  </form>
8064
8075
  </div>
8065
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["label", "labelProperty", "valueProperty", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
8076
+ `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["props", "labelProperty", "valueProperty", "placeholder"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
8066
8077
  }
8067
8078
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, decorators: [{
8068
8079
  type: Component,