igniteui-angular 21.0.3 → 21.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -0
- package/README.md +5 -6
- package/fesm2022/igniteui-angular-action-strip.mjs +39 -34
- package/fesm2022/igniteui-angular-action-strip.mjs.map +1 -1
- package/fesm2022/igniteui-angular-banner.mjs +64 -59
- package/fesm2022/igniteui-angular-banner.mjs.map +1 -1
- package/fesm2022/igniteui-angular-calendar.mjs +182 -161
- package/fesm2022/igniteui-angular-calendar.mjs.map +1 -1
- package/fesm2022/igniteui-angular-carousel.mjs +7 -3
- package/fesm2022/igniteui-angular-carousel.mjs.map +1 -1
- package/fesm2022/igniteui-angular-chips.mjs +140 -136
- package/fesm2022/igniteui-angular-chips.mjs.map +1 -1
- package/fesm2022/igniteui-angular-combo.mjs +360 -356
- package/fesm2022/igniteui-angular-combo.mjs.map +1 -1
- package/fesm2022/igniteui-angular-core.mjs +420 -618
- package/fesm2022/igniteui-angular-core.mjs.map +1 -1
- package/fesm2022/igniteui-angular-date-picker.mjs +124 -32
- package/fesm2022/igniteui-angular-date-picker.mjs.map +1 -1
- package/fesm2022/igniteui-angular-directives.mjs +15 -10
- package/fesm2022/igniteui-angular-directives.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-core.mjs +75 -57
- package/fesm2022/igniteui-angular-grids-core.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-grid.mjs +71 -62
- package/fesm2022/igniteui-angular-grids-grid.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs +51 -6
- package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-pivot-grid.mjs +6 -1
- package/fesm2022/igniteui-angular-grids-pivot-grid.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-tree-grid.mjs +8 -8
- package/fesm2022/igniteui-angular-grids-tree-grid.mjs.map +1 -1
- package/fesm2022/igniteui-angular-input-group.mjs +8 -4
- package/fesm2022/igniteui-angular-input-group.mjs.map +1 -1
- package/fesm2022/igniteui-angular-list.mjs +24 -19
- package/fesm2022/igniteui-angular-list.mjs.map +1 -1
- package/fesm2022/igniteui-angular-paginator.mjs +71 -66
- package/fesm2022/igniteui-angular-paginator.mjs.map +1 -1
- package/fesm2022/igniteui-angular-query-builder.mjs +51 -36
- package/fesm2022/igniteui-angular-query-builder.mjs.map +1 -1
- package/fesm2022/igniteui-angular-time-picker.mjs +50 -8
- package/fesm2022/igniteui-angular-time-picker.mjs.map +1 -1
- package/fesm2022/igniteui-angular-tree.mjs +64 -61
- package/fesm2022/igniteui-angular-tree.mjs.map +1 -1
- package/lib/core/styles/components/calendar/_calendar-theme.scss +2 -0
- package/lib/core/styles/components/grid/_grid-theme.scss +2 -1
- package/lib/core/styles/components/slider/_slider-theme.scss +0 -1
- package/lib/core/styles/components/tabs/_tabs-theme.scss +2 -1
- package/package.json +3 -2
- package/schematics/tsconfig.tsbuildinfo +1 -1
- package/schematics/utils/dependency-handler.js +1 -0
- package/styles/igniteui-angular-dark.css +1 -1
- package/styles/igniteui-angular.css +1 -1
- package/styles/igniteui-bootstrap-dark.css +1 -1
- package/styles/igniteui-bootstrap-light.css +1 -1
- package/styles/igniteui-dark-green.css +1 -1
- package/styles/igniteui-fluent-dark-excel.css +1 -1
- package/styles/igniteui-fluent-dark-word.css +1 -1
- package/styles/igniteui-fluent-dark.css +1 -1
- package/styles/igniteui-fluent-light-excel.css +1 -1
- package/styles/igniteui-fluent-light-word.css +1 -1
- package/styles/igniteui-fluent-light.css +1 -1
- package/styles/igniteui-indigo-dark.css +1 -1
- package/styles/igniteui-indigo-light.css +1 -1
- package/styles/maps/igniteui-angular-dark.css.map +1 -1
- package/styles/maps/igniteui-angular.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
- package/styles/maps/igniteui-dark-green.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-light.css.map +1 -1
- package/styles/maps/igniteui-indigo-dark.css.map +1 -1
- package/styles/maps/igniteui-indigo-light.css.map +1 -1
- package/types/igniteui-angular-action-strip.d.ts +3 -0
- package/types/igniteui-angular-banner.d.ts +3 -0
- package/types/igniteui-angular-calendar.d.ts +37 -47
- package/types/igniteui-angular-carousel.d.ts +1 -0
- package/types/igniteui-angular-chips.d.ts +2 -0
- package/types/igniteui-angular-combo.d.ts +4 -2
- package/types/igniteui-angular-core.d.ts +152 -397
- package/types/igniteui-angular-date-picker.d.ts +22 -4
- package/types/igniteui-angular-directives.d.ts +8 -4
- package/types/igniteui-angular-grids-core.d.ts +18 -8
- package/types/igniteui-angular-grids-grid.d.ts +9 -7
- package/types/igniteui-angular-grids-hierarchical-grid.d.ts +20 -3
- package/types/igniteui-angular-input-group.d.ts +1 -0
- package/types/igniteui-angular-list.d.ts +3 -0
- package/types/igniteui-angular-paginator.d.ts +3 -0
- package/types/igniteui-angular-query-builder.d.ts +8 -0
- package/types/igniteui-angular-time-picker.d.ts +7 -2
- package/types/igniteui-angular-tree.d.ts +2 -1
|
@@ -6,7 +6,7 @@ import { Injectable, inject, booleanAttribute, Input, HostBinding, Component, Di
|
|
|
6
6
|
import * as i1 from '@angular/forms';
|
|
7
7
|
import { NgControl, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
8
8
|
import { IgxForOfDirective, IgxToggleDirective, IgxButtonDirective, IgxRippleDirective } from 'igniteui-angular/directives';
|
|
9
|
-
import { rem, IgxSelectionAPIService, getCurrentResourceStrings, ComboResourceStringsEN, SortingDirection, AutoPositionStrategy, AbsoluteScrollStrategy, cloneArray } from 'igniteui-angular/core';
|
|
9
|
+
import { rem, IgxSelectionAPIService, getCurrentResourceStrings, ComboResourceStringsEN, SortingDirection, onResourceChangeHandle, AutoPositionStrategy, AbsoluteScrollStrategy, cloneArray } from 'igniteui-angular/core';
|
|
10
10
|
import { IgxCheckboxComponent } from 'igniteui-angular/checkbox';
|
|
11
11
|
import { IgxDropDownItemComponent, Navigate, IgxDropDownComponent, DropDownActionKey, IGX_DROPDOWN_BASE, IgxDropDownItemNavigationDirective } from 'igniteui-angular/drop-down';
|
|
12
12
|
import { caseSensitive } from '@igniteui/material-icons-extended';
|
|
@@ -397,359 +397,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImpor
|
|
|
397
397
|
const IGX_COMBO_COMPONENT = /*@__PURE__*/ new InjectionToken('IgxComboComponentToken');
|
|
398
398
|
let NEXT_ID = 0;
|
|
399
399
|
class IgxComboBaseDirective {
|
|
400
|
-
constructor() {
|
|
401
|
-
this.elementRef = inject(ElementRef);
|
|
402
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
403
|
-
this.selectionService = inject(IgxSelectionAPIService);
|
|
404
|
-
this.comboAPI = inject(IgxComboAPIService);
|
|
405
|
-
this.document = inject(DOCUMENT);
|
|
406
|
-
this._inputGroupType = inject(IGX_INPUT_GROUP_TYPE, { optional: true });
|
|
407
|
-
this._injector = inject(Injector, { optional: true });
|
|
408
|
-
this._iconService = inject(IgxIconService, { optional: true });
|
|
409
|
-
/**
|
|
410
|
-
* Defines whether the caseSensitive icon should be shown in the search input
|
|
411
|
-
*
|
|
412
|
-
* ```typescript
|
|
413
|
-
* // get
|
|
414
|
-
* let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
|
|
415
|
-
* ```
|
|
416
|
-
*
|
|
417
|
-
* ```html
|
|
418
|
-
* <!--set-->
|
|
419
|
-
* <igx-combo [showSearchCaseIcon]='true'></igx-combo>
|
|
420
|
-
* ```
|
|
421
|
-
*/
|
|
422
|
-
this.showSearchCaseIcon = false;
|
|
423
|
-
/**
|
|
424
|
-
* Set custom overlay settings that control how the combo's list of items is displayed.
|
|
425
|
-
* Set:
|
|
426
|
-
* ```html
|
|
427
|
-
* <igx-combo [overlaySettings]="customOverlaySettings"></igx-combo>
|
|
428
|
-
* ```
|
|
429
|
-
*
|
|
430
|
-
* ```typescript
|
|
431
|
-
* const customSettings = { positionStrategy: { settings: { target: myTarget } } };
|
|
432
|
-
* combo.overlaySettings = customSettings;
|
|
433
|
-
* ```
|
|
434
|
-
* Get any custom overlay settings used by the combo:
|
|
435
|
-
* ```typescript
|
|
436
|
-
* const comboOverlaySettings: OverlaySettings = myCombo.overlaySettings;
|
|
437
|
-
* ```
|
|
438
|
-
*/
|
|
439
|
-
this.overlaySettings = null;
|
|
440
|
-
/**
|
|
441
|
-
* Controls whether custom values can be added to the collection
|
|
442
|
-
*
|
|
443
|
-
* ```typescript
|
|
444
|
-
* // get
|
|
445
|
-
* let comboAllowsCustomValues = this.combo.allowCustomValues;
|
|
446
|
-
* ```
|
|
447
|
-
*
|
|
448
|
-
* ```html
|
|
449
|
-
* <!--set-->
|
|
450
|
-
* <igx-combo [allowCustomValues]='true'></igx-combo>
|
|
451
|
-
* ```
|
|
452
|
-
*/
|
|
453
|
-
this.allowCustomValues = false;
|
|
454
|
-
/**
|
|
455
|
-
* Determines which column in the data source is used to determine the value.
|
|
456
|
-
*
|
|
457
|
-
* ```typescript
|
|
458
|
-
* // get
|
|
459
|
-
* let myComboValueKey = this.combo.valueKey;
|
|
460
|
-
* ```
|
|
461
|
-
*
|
|
462
|
-
* ```html
|
|
463
|
-
* <!--set-->
|
|
464
|
-
* <igx-combo [valueKey]='myKey'></igx-combo>
|
|
465
|
-
* ```
|
|
466
|
-
*/
|
|
467
|
-
this.valueKey = null;
|
|
468
|
-
/** @hidden @internal */
|
|
469
|
-
this.cssClass = 'igx-combo'; // Independent of display density for the time being
|
|
470
|
-
/**
|
|
471
|
-
* Disables the combo. The default is `false`.
|
|
472
|
-
* ```html
|
|
473
|
-
* <igx-combo [disabled]="'true'">
|
|
474
|
-
* ```
|
|
475
|
-
*/
|
|
476
|
-
this.disabled = false;
|
|
477
|
-
/**
|
|
478
|
-
* Emitted before the dropdown is opened
|
|
479
|
-
*
|
|
480
|
-
* ```html
|
|
481
|
-
* <igx-combo opening='handleOpening($event)'></igx-combo>
|
|
482
|
-
* ```
|
|
483
|
-
*/
|
|
484
|
-
this.opening = new EventEmitter();
|
|
485
|
-
/**
|
|
486
|
-
* Emitted after the dropdown is opened
|
|
487
|
-
*
|
|
488
|
-
* ```html
|
|
489
|
-
* <igx-combo (opened)='handleOpened($event)'></igx-combo>
|
|
490
|
-
* ```
|
|
491
|
-
*/
|
|
492
|
-
this.opened = new EventEmitter();
|
|
493
|
-
/**
|
|
494
|
-
* Emitted before the dropdown is closed
|
|
495
|
-
*
|
|
496
|
-
* ```html
|
|
497
|
-
* <igx-combo (closing)='handleClosing($event)'></igx-combo>
|
|
498
|
-
* ```
|
|
499
|
-
*/
|
|
500
|
-
this.closing = new EventEmitter();
|
|
501
|
-
/**
|
|
502
|
-
* Emitted after the dropdown is closed
|
|
503
|
-
*
|
|
504
|
-
* ```html
|
|
505
|
-
* <igx-combo (closed)='handleClosed($event)'></igx-combo>
|
|
506
|
-
* ```
|
|
507
|
-
*/
|
|
508
|
-
this.closed = new EventEmitter();
|
|
509
|
-
/**
|
|
510
|
-
* Emitted when an item is being added to the data collection
|
|
511
|
-
*
|
|
512
|
-
* ```html
|
|
513
|
-
* <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
|
|
514
|
-
* ```
|
|
515
|
-
*/
|
|
516
|
-
this.addition = new EventEmitter();
|
|
517
|
-
/**
|
|
518
|
-
* Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
|
|
519
|
-
*
|
|
520
|
-
* ```html
|
|
521
|
-
* <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
|
|
522
|
-
* ```
|
|
523
|
-
*/
|
|
524
|
-
this.searchInputUpdate = new EventEmitter();
|
|
525
|
-
/**
|
|
526
|
-
* Emitted when new chunk of data is loaded from the virtualization
|
|
527
|
-
*
|
|
528
|
-
* ```html
|
|
529
|
-
* <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
|
|
530
|
-
* ```
|
|
531
|
-
*/
|
|
532
|
-
this.dataPreLoad = new EventEmitter();
|
|
533
|
-
/**
|
|
534
|
-
* The custom template, if any, that should be used when rendering ITEMS in the combo list
|
|
535
|
-
*
|
|
536
|
-
* ```typescript
|
|
537
|
-
* // Set in typescript
|
|
538
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
539
|
-
* myComponent.combo.itemTemplate = myCustomTemplate;
|
|
540
|
-
* ```
|
|
541
|
-
* ```html
|
|
542
|
-
* <!-- Set in markup -->
|
|
543
|
-
* <igx-combo #combo>
|
|
544
|
-
* ...
|
|
545
|
-
* <ng-template igxComboItem let-item let-key="valueKey">
|
|
546
|
-
* <div class="custom-item">
|
|
547
|
-
* <div class="custom-item__name">{{ item[key] }}</div>
|
|
548
|
-
* <div class="custom-item__cost">{{ item.cost }}</div>
|
|
549
|
-
* </div>
|
|
550
|
-
* </ng-template>
|
|
551
|
-
* </igx-combo>
|
|
552
|
-
* ```
|
|
553
|
-
*/
|
|
554
|
-
this.itemTemplate = null;
|
|
555
|
-
/**
|
|
556
|
-
* The custom template, if any, that should be used when rendering the HEADER for the combo items list
|
|
557
|
-
*
|
|
558
|
-
* ```typescript
|
|
559
|
-
* // Set in typescript
|
|
560
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
561
|
-
* myComponent.combo.headerTemplate = myCustomTemplate;
|
|
562
|
-
* ```
|
|
563
|
-
* ```html
|
|
564
|
-
* <!-- Set in markup -->
|
|
565
|
-
* <igx-combo #combo>
|
|
566
|
-
* ...
|
|
567
|
-
* <ng-template igxComboHeader>
|
|
568
|
-
* <div class="combo__header">
|
|
569
|
-
* This is a custom header
|
|
570
|
-
* </div>
|
|
571
|
-
* </ng-template>
|
|
572
|
-
* </igx-combo>
|
|
573
|
-
* ```
|
|
574
|
-
*/
|
|
575
|
-
this.headerTemplate = null;
|
|
576
|
-
/**
|
|
577
|
-
* The custom template, if any, that should be used when rendering the FOOTER for the combo items list
|
|
578
|
-
*
|
|
579
|
-
* ```typescript
|
|
580
|
-
* // Set in typescript
|
|
581
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
582
|
-
* myComponent.combo.footerTemplate = myCustomTemplate;
|
|
583
|
-
* ```
|
|
584
|
-
* ```html
|
|
585
|
-
* <!-- Set in markup -->
|
|
586
|
-
* <igx-combo #combo>
|
|
587
|
-
* ...
|
|
588
|
-
* <ng-template igxComboFooter>
|
|
589
|
-
* <div class="combo__footer">
|
|
590
|
-
* This is a custom footer
|
|
591
|
-
* </div>
|
|
592
|
-
* </ng-template>
|
|
593
|
-
* </igx-combo>
|
|
594
|
-
* ```
|
|
595
|
-
*/
|
|
596
|
-
this.footerTemplate = null;
|
|
597
|
-
/**
|
|
598
|
-
* The custom template, if any, that should be used when rendering HEADER ITEMS for groups in the combo list
|
|
599
|
-
*
|
|
600
|
-
* ```typescript
|
|
601
|
-
* // Set in typescript
|
|
602
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
603
|
-
* myComponent.combo.headerItemTemplate = myCustomTemplate;
|
|
604
|
-
* ```
|
|
605
|
-
* ```html
|
|
606
|
-
* <!-- Set in markup -->
|
|
607
|
-
* <igx-combo #combo>
|
|
608
|
-
* ...
|
|
609
|
-
* <ng-template igxComboHeaderItem let-item let-key="groupKey">
|
|
610
|
-
* <div class="custom-item--group">Group header for {{ item[key] }}</div>
|
|
611
|
-
* </ng-template>
|
|
612
|
-
* </igx-combo>
|
|
613
|
-
* ```
|
|
614
|
-
*/
|
|
615
|
-
this.headerItemTemplate = null;
|
|
616
|
-
/**
|
|
617
|
-
* The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
|
|
618
|
-
*
|
|
619
|
-
* ```typescript
|
|
620
|
-
* // Set in typescript
|
|
621
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
622
|
-
* myComponent.combo.addItemTemplate = myCustomTemplate;
|
|
623
|
-
* ```
|
|
624
|
-
* ```html
|
|
625
|
-
* <!-- Set in markup -->
|
|
626
|
-
* <igx-combo #combo>
|
|
627
|
-
* ...
|
|
628
|
-
* <ng-template igxComboAddItem>
|
|
629
|
-
* <button type="button" igxButton="contained" class="combo__add-button">
|
|
630
|
-
* Click to add item
|
|
631
|
-
* </button>
|
|
632
|
-
* </ng-template>
|
|
633
|
-
* </igx-combo>
|
|
634
|
-
* ```
|
|
635
|
-
*/
|
|
636
|
-
this.addItemTemplate = null;
|
|
637
|
-
/**
|
|
638
|
-
* The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
|
|
639
|
-
*
|
|
640
|
-
* ```typescript
|
|
641
|
-
* // Set in typescript
|
|
642
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
643
|
-
* myComponent.combo.emptyTemplate = myCustomTemplate;
|
|
644
|
-
* ```
|
|
645
|
-
* ```html
|
|
646
|
-
* <!-- Set in markup -->
|
|
647
|
-
* <igx-combo #combo>
|
|
648
|
-
* ...
|
|
649
|
-
* <ng-template igxComboEmpty>
|
|
650
|
-
* <div class="combo--empty">
|
|
651
|
-
* There are no items to display
|
|
652
|
-
* </div>
|
|
653
|
-
* </ng-template>
|
|
654
|
-
* </igx-combo>
|
|
655
|
-
* ```
|
|
656
|
-
*/
|
|
657
|
-
this.emptyTemplate = null;
|
|
658
|
-
/**
|
|
659
|
-
* The custom template, if any, that should be used when rendering the combo TOGGLE(open/close) button
|
|
660
|
-
*
|
|
661
|
-
* ```typescript
|
|
662
|
-
* // Set in typescript
|
|
663
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
664
|
-
* myComponent.combo.toggleIconTemplate = myCustomTemplate;
|
|
665
|
-
* ```
|
|
666
|
-
* ```html
|
|
667
|
-
* <!-- Set in markup -->
|
|
668
|
-
* <igx-combo #combo>
|
|
669
|
-
* ...
|
|
670
|
-
* <ng-template igxComboToggleIcon let-collapsed>
|
|
671
|
-
* <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
|
|
672
|
-
* </ng-template>
|
|
673
|
-
* </igx-combo>
|
|
674
|
-
* ```
|
|
675
|
-
*/
|
|
676
|
-
this.toggleIconTemplate = null;
|
|
677
|
-
/**
|
|
678
|
-
* The custom template, if any, that should be used when rendering the combo CLEAR button
|
|
679
|
-
*
|
|
680
|
-
* ```typescript
|
|
681
|
-
* // Set in typescript
|
|
682
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
683
|
-
* myComponent.combo.clearIconTemplate = myCustomTemplate;
|
|
684
|
-
* ```
|
|
685
|
-
* ```html
|
|
686
|
-
* <!-- Set in markup -->
|
|
687
|
-
* <igx-combo #combo>
|
|
688
|
-
* ...
|
|
689
|
-
* <ng-template igxComboClearIcon>
|
|
690
|
-
* <igx-icon>clear</igx-icon>
|
|
691
|
-
* </ng-template>
|
|
692
|
-
* </igx-combo>
|
|
693
|
-
* ```
|
|
694
|
-
*/
|
|
695
|
-
this.clearIconTemplate = null;
|
|
696
|
-
/** @hidden @internal */
|
|
697
|
-
this.searchInput = null;
|
|
698
|
-
this.dropdownContainer = null;
|
|
699
|
-
/** @hidden @internal */
|
|
700
|
-
this.customValueFlag = true;
|
|
701
|
-
/** @hidden @internal */
|
|
702
|
-
this.filterValue = '';
|
|
703
|
-
/** @hidden @internal */
|
|
704
|
-
this.defaultFallbackGroup = 'Other';
|
|
705
|
-
/** @hidden @internal */
|
|
706
|
-
this.activeDescendant = '';
|
|
707
|
-
this.containerSize = undefined;
|
|
708
|
-
this.itemSize = undefined;
|
|
709
|
-
this._data = [];
|
|
710
|
-
this._value = [];
|
|
711
|
-
this._displayValue = '';
|
|
712
|
-
this._groupKey = '';
|
|
713
|
-
this._searchValue = '';
|
|
714
|
-
this._filteredData = [];
|
|
715
|
-
this._remoteSelection = {};
|
|
716
|
-
this._resourceStrings = getCurrentResourceStrings(ComboResourceStringsEN);
|
|
717
|
-
this._valid = IgxInputState.INITIAL;
|
|
718
|
-
this.ngControl = null;
|
|
719
|
-
this.destroy$ = new Subject();
|
|
720
|
-
this._onTouchedCallback = noop;
|
|
721
|
-
this._onChangeCallback = noop;
|
|
722
|
-
this.compareCollator = new Intl.Collator();
|
|
723
|
-
this._id = `igx-combo-${NEXT_ID++}`;
|
|
724
|
-
this._disableFiltering = false;
|
|
725
|
-
this._type = null;
|
|
726
|
-
this._dataType = '';
|
|
727
|
-
this._itemHeight = undefined;
|
|
728
|
-
this._itemsMaxHeight = null;
|
|
729
|
-
this._groupSortingDirection = SortingDirection.Asc;
|
|
730
|
-
this._defaultFilteringOptions = { caseSensitive: false };
|
|
731
|
-
this.itemsInContainer = 10;
|
|
732
|
-
this.onStatusChanged = () => {
|
|
733
|
-
if (this.ngControl && this.isTouchedOrDirty && !this.disabled) {
|
|
734
|
-
if (this.hasValidators && (!this.collapsed || this.inputGroup.isFocused)) {
|
|
735
|
-
this.valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
|
|
736
|
-
}
|
|
737
|
-
else {
|
|
738
|
-
this.valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
else {
|
|
742
|
-
// B.P. 18 May 2021: IgxDatePicker does not reset its state upon resetForm #9526
|
|
743
|
-
this.valid = IgxInputState.INITIAL;
|
|
744
|
-
}
|
|
745
|
-
this.manageRequiredAsterisk();
|
|
746
|
-
};
|
|
747
|
-
this.findMatch = (element) => {
|
|
748
|
-
const value = this.displayKey ? element[this.displayKey] : element;
|
|
749
|
-
const searchValue = this.searchValue || this.comboInput?.value;
|
|
750
|
-
return value?.toString().trim().toLowerCase() === searchValue.trim().toLowerCase();
|
|
751
|
-
};
|
|
752
|
-
}
|
|
753
400
|
/**
|
|
754
401
|
* Enables/disables filtering in the list. The default is `false`.
|
|
755
402
|
*/
|
|
@@ -935,7 +582,7 @@ class IgxComboBaseDirective {
|
|
|
935
582
|
* By default it uses EN resources.
|
|
936
583
|
*/
|
|
937
584
|
get resourceStrings() {
|
|
938
|
-
return this._resourceStrings;
|
|
585
|
+
return this._resourceStrings || this._defaultResourceStrings;
|
|
939
586
|
}
|
|
940
587
|
set resourceStrings(value) {
|
|
941
588
|
this._resourceStrings = Object.assign({}, this._resourceStrings, value);
|
|
@@ -1090,6 +737,363 @@ class IgxComboBaseDirective {
|
|
|
1090
737
|
set filteringOptions(value) {
|
|
1091
738
|
this._filteringOptions = value;
|
|
1092
739
|
}
|
|
740
|
+
constructor() {
|
|
741
|
+
this.elementRef = inject(ElementRef);
|
|
742
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
743
|
+
this.selectionService = inject(IgxSelectionAPIService);
|
|
744
|
+
this.comboAPI = inject(IgxComboAPIService);
|
|
745
|
+
this.document = inject(DOCUMENT);
|
|
746
|
+
this._inputGroupType = inject(IGX_INPUT_GROUP_TYPE, { optional: true });
|
|
747
|
+
this._injector = inject(Injector, { optional: true });
|
|
748
|
+
this._iconService = inject(IgxIconService, { optional: true });
|
|
749
|
+
/**
|
|
750
|
+
* Defines whether the caseSensitive icon should be shown in the search input
|
|
751
|
+
*
|
|
752
|
+
* ```typescript
|
|
753
|
+
* // get
|
|
754
|
+
* let myComboShowSearchCaseIcon = this.combo.showSearchCaseIcon;
|
|
755
|
+
* ```
|
|
756
|
+
*
|
|
757
|
+
* ```html
|
|
758
|
+
* <!--set-->
|
|
759
|
+
* <igx-combo [showSearchCaseIcon]='true'></igx-combo>
|
|
760
|
+
* ```
|
|
761
|
+
*/
|
|
762
|
+
this.showSearchCaseIcon = false;
|
|
763
|
+
/**
|
|
764
|
+
* Set custom overlay settings that control how the combo's list of items is displayed.
|
|
765
|
+
* Set:
|
|
766
|
+
* ```html
|
|
767
|
+
* <igx-combo [overlaySettings]="customOverlaySettings"></igx-combo>
|
|
768
|
+
* ```
|
|
769
|
+
*
|
|
770
|
+
* ```typescript
|
|
771
|
+
* const customSettings = { positionStrategy: { settings: { target: myTarget } } };
|
|
772
|
+
* combo.overlaySettings = customSettings;
|
|
773
|
+
* ```
|
|
774
|
+
* Get any custom overlay settings used by the combo:
|
|
775
|
+
* ```typescript
|
|
776
|
+
* const comboOverlaySettings: OverlaySettings = myCombo.overlaySettings;
|
|
777
|
+
* ```
|
|
778
|
+
*/
|
|
779
|
+
this.overlaySettings = null;
|
|
780
|
+
/**
|
|
781
|
+
* Controls whether custom values can be added to the collection
|
|
782
|
+
*
|
|
783
|
+
* ```typescript
|
|
784
|
+
* // get
|
|
785
|
+
* let comboAllowsCustomValues = this.combo.allowCustomValues;
|
|
786
|
+
* ```
|
|
787
|
+
*
|
|
788
|
+
* ```html
|
|
789
|
+
* <!--set-->
|
|
790
|
+
* <igx-combo [allowCustomValues]='true'></igx-combo>
|
|
791
|
+
* ```
|
|
792
|
+
*/
|
|
793
|
+
this.allowCustomValues = false;
|
|
794
|
+
/**
|
|
795
|
+
* Determines which column in the data source is used to determine the value.
|
|
796
|
+
*
|
|
797
|
+
* ```typescript
|
|
798
|
+
* // get
|
|
799
|
+
* let myComboValueKey = this.combo.valueKey;
|
|
800
|
+
* ```
|
|
801
|
+
*
|
|
802
|
+
* ```html
|
|
803
|
+
* <!--set-->
|
|
804
|
+
* <igx-combo [valueKey]='myKey'></igx-combo>
|
|
805
|
+
* ```
|
|
806
|
+
*/
|
|
807
|
+
this.valueKey = null;
|
|
808
|
+
/** @hidden @internal */
|
|
809
|
+
this.cssClass = 'igx-combo'; // Independent of display density for the time being
|
|
810
|
+
/**
|
|
811
|
+
* Disables the combo. The default is `false`.
|
|
812
|
+
* ```html
|
|
813
|
+
* <igx-combo [disabled]="'true'">
|
|
814
|
+
* ```
|
|
815
|
+
*/
|
|
816
|
+
this.disabled = false;
|
|
817
|
+
/**
|
|
818
|
+
* Emitted before the dropdown is opened
|
|
819
|
+
*
|
|
820
|
+
* ```html
|
|
821
|
+
* <igx-combo opening='handleOpening($event)'></igx-combo>
|
|
822
|
+
* ```
|
|
823
|
+
*/
|
|
824
|
+
this.opening = new EventEmitter();
|
|
825
|
+
/**
|
|
826
|
+
* Emitted after the dropdown is opened
|
|
827
|
+
*
|
|
828
|
+
* ```html
|
|
829
|
+
* <igx-combo (opened)='handleOpened($event)'></igx-combo>
|
|
830
|
+
* ```
|
|
831
|
+
*/
|
|
832
|
+
this.opened = new EventEmitter();
|
|
833
|
+
/**
|
|
834
|
+
* Emitted before the dropdown is closed
|
|
835
|
+
*
|
|
836
|
+
* ```html
|
|
837
|
+
* <igx-combo (closing)='handleClosing($event)'></igx-combo>
|
|
838
|
+
* ```
|
|
839
|
+
*/
|
|
840
|
+
this.closing = new EventEmitter();
|
|
841
|
+
/**
|
|
842
|
+
* Emitted after the dropdown is closed
|
|
843
|
+
*
|
|
844
|
+
* ```html
|
|
845
|
+
* <igx-combo (closed)='handleClosed($event)'></igx-combo>
|
|
846
|
+
* ```
|
|
847
|
+
*/
|
|
848
|
+
this.closed = new EventEmitter();
|
|
849
|
+
/**
|
|
850
|
+
* Emitted when an item is being added to the data collection
|
|
851
|
+
*
|
|
852
|
+
* ```html
|
|
853
|
+
* <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
|
|
854
|
+
* ```
|
|
855
|
+
*/
|
|
856
|
+
this.addition = new EventEmitter();
|
|
857
|
+
/**
|
|
858
|
+
* Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
|
|
859
|
+
*
|
|
860
|
+
* ```html
|
|
861
|
+
* <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
|
|
862
|
+
* ```
|
|
863
|
+
*/
|
|
864
|
+
this.searchInputUpdate = new EventEmitter();
|
|
865
|
+
/**
|
|
866
|
+
* Emitted when new chunk of data is loaded from the virtualization
|
|
867
|
+
*
|
|
868
|
+
* ```html
|
|
869
|
+
* <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
|
|
870
|
+
* ```
|
|
871
|
+
*/
|
|
872
|
+
this.dataPreLoad = new EventEmitter();
|
|
873
|
+
/**
|
|
874
|
+
* The custom template, if any, that should be used when rendering ITEMS in the combo list
|
|
875
|
+
*
|
|
876
|
+
* ```typescript
|
|
877
|
+
* // Set in typescript
|
|
878
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
879
|
+
* myComponent.combo.itemTemplate = myCustomTemplate;
|
|
880
|
+
* ```
|
|
881
|
+
* ```html
|
|
882
|
+
* <!-- Set in markup -->
|
|
883
|
+
* <igx-combo #combo>
|
|
884
|
+
* ...
|
|
885
|
+
* <ng-template igxComboItem let-item let-key="valueKey">
|
|
886
|
+
* <div class="custom-item">
|
|
887
|
+
* <div class="custom-item__name">{{ item[key] }}</div>
|
|
888
|
+
* <div class="custom-item__cost">{{ item.cost }}</div>
|
|
889
|
+
* </div>
|
|
890
|
+
* </ng-template>
|
|
891
|
+
* </igx-combo>
|
|
892
|
+
* ```
|
|
893
|
+
*/
|
|
894
|
+
this.itemTemplate = null;
|
|
895
|
+
/**
|
|
896
|
+
* The custom template, if any, that should be used when rendering the HEADER for the combo items list
|
|
897
|
+
*
|
|
898
|
+
* ```typescript
|
|
899
|
+
* // Set in typescript
|
|
900
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
901
|
+
* myComponent.combo.headerTemplate = myCustomTemplate;
|
|
902
|
+
* ```
|
|
903
|
+
* ```html
|
|
904
|
+
* <!-- Set in markup -->
|
|
905
|
+
* <igx-combo #combo>
|
|
906
|
+
* ...
|
|
907
|
+
* <ng-template igxComboHeader>
|
|
908
|
+
* <div class="combo__header">
|
|
909
|
+
* This is a custom header
|
|
910
|
+
* </div>
|
|
911
|
+
* </ng-template>
|
|
912
|
+
* </igx-combo>
|
|
913
|
+
* ```
|
|
914
|
+
*/
|
|
915
|
+
this.headerTemplate = null;
|
|
916
|
+
/**
|
|
917
|
+
* The custom template, if any, that should be used when rendering the FOOTER for the combo items list
|
|
918
|
+
*
|
|
919
|
+
* ```typescript
|
|
920
|
+
* // Set in typescript
|
|
921
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
922
|
+
* myComponent.combo.footerTemplate = myCustomTemplate;
|
|
923
|
+
* ```
|
|
924
|
+
* ```html
|
|
925
|
+
* <!-- Set in markup -->
|
|
926
|
+
* <igx-combo #combo>
|
|
927
|
+
* ...
|
|
928
|
+
* <ng-template igxComboFooter>
|
|
929
|
+
* <div class="combo__footer">
|
|
930
|
+
* This is a custom footer
|
|
931
|
+
* </div>
|
|
932
|
+
* </ng-template>
|
|
933
|
+
* </igx-combo>
|
|
934
|
+
* ```
|
|
935
|
+
*/
|
|
936
|
+
this.footerTemplate = null;
|
|
937
|
+
/**
|
|
938
|
+
* The custom template, if any, that should be used when rendering HEADER ITEMS for groups in the combo list
|
|
939
|
+
*
|
|
940
|
+
* ```typescript
|
|
941
|
+
* // Set in typescript
|
|
942
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
943
|
+
* myComponent.combo.headerItemTemplate = myCustomTemplate;
|
|
944
|
+
* ```
|
|
945
|
+
* ```html
|
|
946
|
+
* <!-- Set in markup -->
|
|
947
|
+
* <igx-combo #combo>
|
|
948
|
+
* ...
|
|
949
|
+
* <ng-template igxComboHeaderItem let-item let-key="groupKey">
|
|
950
|
+
* <div class="custom-item--group">Group header for {{ item[key] }}</div>
|
|
951
|
+
* </ng-template>
|
|
952
|
+
* </igx-combo>
|
|
953
|
+
* ```
|
|
954
|
+
*/
|
|
955
|
+
this.headerItemTemplate = null;
|
|
956
|
+
/**
|
|
957
|
+
* The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
|
|
958
|
+
*
|
|
959
|
+
* ```typescript
|
|
960
|
+
* // Set in typescript
|
|
961
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
962
|
+
* myComponent.combo.addItemTemplate = myCustomTemplate;
|
|
963
|
+
* ```
|
|
964
|
+
* ```html
|
|
965
|
+
* <!-- Set in markup -->
|
|
966
|
+
* <igx-combo #combo>
|
|
967
|
+
* ...
|
|
968
|
+
* <ng-template igxComboAddItem>
|
|
969
|
+
* <button type="button" igxButton="contained" class="combo__add-button">
|
|
970
|
+
* Click to add item
|
|
971
|
+
* </button>
|
|
972
|
+
* </ng-template>
|
|
973
|
+
* </igx-combo>
|
|
974
|
+
* ```
|
|
975
|
+
*/
|
|
976
|
+
this.addItemTemplate = null;
|
|
977
|
+
/**
|
|
978
|
+
* The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
|
|
979
|
+
*
|
|
980
|
+
* ```typescript
|
|
981
|
+
* // Set in typescript
|
|
982
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
983
|
+
* myComponent.combo.emptyTemplate = myCustomTemplate;
|
|
984
|
+
* ```
|
|
985
|
+
* ```html
|
|
986
|
+
* <!-- Set in markup -->
|
|
987
|
+
* <igx-combo #combo>
|
|
988
|
+
* ...
|
|
989
|
+
* <ng-template igxComboEmpty>
|
|
990
|
+
* <div class="combo--empty">
|
|
991
|
+
* There are no items to display
|
|
992
|
+
* </div>
|
|
993
|
+
* </ng-template>
|
|
994
|
+
* </igx-combo>
|
|
995
|
+
* ```
|
|
996
|
+
*/
|
|
997
|
+
this.emptyTemplate = null;
|
|
998
|
+
/**
|
|
999
|
+
* The custom template, if any, that should be used when rendering the combo TOGGLE(open/close) button
|
|
1000
|
+
*
|
|
1001
|
+
* ```typescript
|
|
1002
|
+
* // Set in typescript
|
|
1003
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
1004
|
+
* myComponent.combo.toggleIconTemplate = myCustomTemplate;
|
|
1005
|
+
* ```
|
|
1006
|
+
* ```html
|
|
1007
|
+
* <!-- Set in markup -->
|
|
1008
|
+
* <igx-combo #combo>
|
|
1009
|
+
* ...
|
|
1010
|
+
* <ng-template igxComboToggleIcon let-collapsed>
|
|
1011
|
+
* <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
|
|
1012
|
+
* </ng-template>
|
|
1013
|
+
* </igx-combo>
|
|
1014
|
+
* ```
|
|
1015
|
+
*/
|
|
1016
|
+
this.toggleIconTemplate = null;
|
|
1017
|
+
/**
|
|
1018
|
+
* The custom template, if any, that should be used when rendering the combo CLEAR button
|
|
1019
|
+
*
|
|
1020
|
+
* ```typescript
|
|
1021
|
+
* // Set in typescript
|
|
1022
|
+
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
1023
|
+
* myComponent.combo.clearIconTemplate = myCustomTemplate;
|
|
1024
|
+
* ```
|
|
1025
|
+
* ```html
|
|
1026
|
+
* <!-- Set in markup -->
|
|
1027
|
+
* <igx-combo #combo>
|
|
1028
|
+
* ...
|
|
1029
|
+
* <ng-template igxComboClearIcon>
|
|
1030
|
+
* <igx-icon>clear</igx-icon>
|
|
1031
|
+
* </ng-template>
|
|
1032
|
+
* </igx-combo>
|
|
1033
|
+
* ```
|
|
1034
|
+
*/
|
|
1035
|
+
this.clearIconTemplate = null;
|
|
1036
|
+
/** @hidden @internal */
|
|
1037
|
+
this.searchInput = null;
|
|
1038
|
+
this.dropdownContainer = null;
|
|
1039
|
+
/** @hidden @internal */
|
|
1040
|
+
this.customValueFlag = true;
|
|
1041
|
+
/** @hidden @internal */
|
|
1042
|
+
this.filterValue = '';
|
|
1043
|
+
/** @hidden @internal */
|
|
1044
|
+
this.defaultFallbackGroup = 'Other';
|
|
1045
|
+
/** @hidden @internal */
|
|
1046
|
+
this.activeDescendant = '';
|
|
1047
|
+
this.containerSize = undefined;
|
|
1048
|
+
this.itemSize = undefined;
|
|
1049
|
+
this._data = [];
|
|
1050
|
+
this._value = [];
|
|
1051
|
+
this._displayValue = '';
|
|
1052
|
+
this._groupKey = '';
|
|
1053
|
+
this._searchValue = '';
|
|
1054
|
+
this._filteredData = [];
|
|
1055
|
+
this._remoteSelection = {};
|
|
1056
|
+
this._resourceStrings = null;
|
|
1057
|
+
this._defaultResourceStrings = getCurrentResourceStrings(ComboResourceStringsEN);
|
|
1058
|
+
this._valid = IgxInputState.INITIAL;
|
|
1059
|
+
this.ngControl = null;
|
|
1060
|
+
this.destroy$ = new Subject();
|
|
1061
|
+
this._onTouchedCallback = noop;
|
|
1062
|
+
this._onChangeCallback = noop;
|
|
1063
|
+
this.compareCollator = new Intl.Collator();
|
|
1064
|
+
this._id = `igx-combo-${NEXT_ID++}`;
|
|
1065
|
+
this._disableFiltering = false;
|
|
1066
|
+
this._type = null;
|
|
1067
|
+
this._dataType = '';
|
|
1068
|
+
this._itemHeight = undefined;
|
|
1069
|
+
this._itemsMaxHeight = null;
|
|
1070
|
+
this._groupSortingDirection = SortingDirection.Asc;
|
|
1071
|
+
this._defaultFilteringOptions = { caseSensitive: false };
|
|
1072
|
+
this.itemsInContainer = 10;
|
|
1073
|
+
this.onStatusChanged = () => {
|
|
1074
|
+
if (this.ngControl && this.isTouchedOrDirty && !this.disabled) {
|
|
1075
|
+
if (this.hasValidators && (!this.collapsed || this.inputGroup.isFocused)) {
|
|
1076
|
+
this.valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
|
|
1077
|
+
}
|
|
1078
|
+
else {
|
|
1079
|
+
this.valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
else {
|
|
1083
|
+
// B.P. 18 May 2021: IgxDatePicker does not reset its state upon resetForm #9526
|
|
1084
|
+
this.valid = IgxInputState.INITIAL;
|
|
1085
|
+
}
|
|
1086
|
+
this.manageRequiredAsterisk();
|
|
1087
|
+
};
|
|
1088
|
+
this.findMatch = (element) => {
|
|
1089
|
+
const value = this.displayKey ? element[this.displayKey] : element;
|
|
1090
|
+
const searchValue = this.searchValue || this.comboInput?.value;
|
|
1091
|
+
return value?.toString().trim().toLowerCase() === searchValue.trim().toLowerCase();
|
|
1092
|
+
};
|
|
1093
|
+
onResourceChangeHandle(this.destroy$, () => {
|
|
1094
|
+
this._defaultResourceStrings = getCurrentResourceStrings(ComboResourceStringsEN, false);
|
|
1095
|
+
}, this);
|
|
1096
|
+
}
|
|
1093
1097
|
ngAfterViewChecked() {
|
|
1094
1098
|
const targetElement = this.inputGroup.element.nativeElement.querySelector('.igx-input-group__bundle');
|
|
1095
1099
|
this._overlaySettings = {
|
|
@@ -1451,7 +1455,7 @@ class IgxComboBaseDirective {
|
|
|
1451
1455
|
}
|
|
1452
1456
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: IgxComboBaseDirective, decorators: [{
|
|
1453
1457
|
type: Directive
|
|
1454
|
-
}], propDecorators: { showSearchCaseIcon: [{
|
|
1458
|
+
}], ctorParameters: () => [], propDecorators: { showSearchCaseIcon: [{
|
|
1455
1459
|
type: Input,
|
|
1456
1460
|
args: [{ transform: booleanAttribute }]
|
|
1457
1461
|
}], disableFiltering: [{
|