UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

76 lines 16.4 kB
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, computed, effect, inject, Input, signal, ViewChildren, } from '@angular/core'; import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes'; import { EMPTY_QUERY, TUI_ALLOW_SIGNAL_WRITES } from '@taiga-ui/cdk/constants'; import { tuiIsPresent } from '@taiga-ui/cdk/utils/miscellaneous'; import { tuiAsTextfieldAccessor, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield'; import { TUI_ITEMS_HANDLERS, } from '@taiga-ui/core/directives/items-handlers'; import { tuiIsFlat } from '@taiga-ui/kit/utils'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/textfield"; class TuiNativeSelect extends TuiControl { constructor() { super(...arguments); this.textfield = inject(TuiTextfieldDirective); this.options = signal(EMPTY_QUERY); this.isFlat = tuiIsFlat; this.placeholder = signal(''); this.itemsHandlers = inject(TUI_ITEMS_HANDLERS); this.stringified = computed((value = this.value()) => tuiIsPresent(value) ? this.itemsHandlers.stringify()(value) : ''); this.isSelected = computed((value = this.value()) => (x) => tuiIsPresent(value) && this.itemsHandlers.identityMatcher()(x, value)); this.valueEffect = effect(() => { /** * Wait until all `<option>`-s are inside DOM. * Otherwise * ``` * document.querySelector('select').value = 'even upcoming valid value'; * // same as * document.querySelector('select').value = ''; * ``` * (it breaks `tuiValue` utility logic) */ if (this.options().length) { this.textfield.value.set(this.stringified()); } }, TUI_ALLOW_SIGNAL_WRITES); this.items = []; this.labels = []; } // TODO(v5): use signal inputs set placeholderSetter(x) { this.placeholder.set(x); } setValue(value) { this.onChange(value); } set optionsSetter(options) { this.options.set(options); } selectOption(index) { const items = (this.items?.flat() ?? []); const placeholderOffset = this.stringified() ? 0 : 1; this.onChange(items[index - placeholderOffset] ?? null); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiNativeSelect, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiNativeSelect, isStandalone: true, selector: "select[tuiSelect]", inputs: { items: "items", labels: "labels", placeholderSetter: ["placeholder", "placeholderSetter"] }, host: { listeners: { "change": "selectOption($event.target.options.selectedIndex)" }, properties: { "attr.aria-invalid": "invalid()", "disabled": "!interactive()" } }, providers: [tuiAsTextfieldAccessor(TuiNativeSelect), tuiAsControl(TuiNativeSelect)], viewQueries: [{ propertyName: "optionsSetter", predicate: ["optionRef"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0, template: "<option\n *ngIf=\"!stringified()\"\n disabled\n selected\n value=\"\"\n>\n {{ placeholder() }}\n</option>\n\n<ng-container *ngIf=\"items && !isFlat(items); else flatItems\">\n <optgroup\n *ngFor=\"let group of labels; let index = index\"\n [label]=\"labels[index]\"\n >\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items[index]}\" />\n </optgroup>\n</ng-container>\n\n<ng-template #flatItems>\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items}\" />\n</ng-template>\n\n<ng-template\n #options\n let-items\n>\n <option\n *ngFor=\"let option of items\"\n #optionRef\n [disabled]=\"itemsHandlers.disabledItemHandler()(option)\"\n [selected]=\"isSelected()(option)\"\n [value]=\"itemsHandlers.stringify()(option)\"\n >\n {{ itemsHandlers.stringify()(option) }}\n </option>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiNativeSelect }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiNativeSelect, decorators: [{ type: Component, args: [{ standalone: true, selector: 'select[tuiSelect]', imports: [NgForOf, NgIf, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsTextfieldAccessor(TuiNativeSelect), tuiAsControl(TuiNativeSelect)], hostDirectives: [TuiWithTextfield], host: { '[attr.aria-invalid]': 'invalid()', '[disabled]': '!interactive()', '(change)': 'selectOption($event.target.options.selectedIndex)', }, template: "<option\n *ngIf=\"!stringified()\"\n disabled\n selected\n value=\"\"\n>\n {{ placeholder() }}\n</option>\n\n<ng-container *ngIf=\"items && !isFlat(items); else flatItems\">\n <optgroup\n *ngFor=\"let group of labels; let index = index\"\n [label]=\"labels[index]\"\n >\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items[index]}\" />\n </optgroup>\n</ng-container>\n\n<ng-template #flatItems>\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items}\" />\n</ng-template>\n\n<ng-template\n #options\n let-items\n>\n <option\n *ngFor=\"let option of items\"\n #optionRef\n [disabled]=\"itemsHandlers.disabledItemHandler()(option)\"\n [selected]=\"isSelected()(option)\"\n [value]=\"itemsHandlers.stringify()(option)\"\n >\n {{ itemsHandlers.stringify()(option) }}\n </option>\n</ng-template>\n" }] }], propDecorators: { items: [{ type: Input }], labels: [{ type: Input }], placeholderSetter: [{ type: Input, args: ['placeholder'] }], optionsSetter: [{ type: ViewChildren, args: ['optionRef'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9zZWxlY3QvbmF0aXZlLXNlbGVjdC9uYXRpdmUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3NlbGVjdC9uYXRpdmUtc2VsZWN0L25hdGl2ZS1zZWxlY3QudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLFdBQVcsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQ0gsc0JBQXNCLEVBRXRCLHFCQUFxQixFQUNyQixnQkFBZ0IsR0FDbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQ0gsa0JBQWtCLEdBRXJCLE1BQU0sMENBQTBDLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDOzs7QUFFOUMsTUFjYSxlQUNULFNBQVEsVUFBb0I7SUFmaEM7O1FBa0JxQixjQUFTLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUMsWUFBTyxHQUNwQixNQUFNLENBQTJDLFdBQVcsQ0FBQyxDQUFDO1FB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YUFBYTtnQkFVTixhQUFhO3NCQUQxQixZQUFZO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBlZmZlY3QsXG4gICAgdHlwZSBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICB0eXBlIFF1ZXJ5TGlzdCxcbiAgICBzaWduYWwsXG4gICAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dHVpQXNDb250cm9sLCBUdWlDb250cm9sfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NsYXNzZXMnO1xuaW1wb3J0IHtFTVBUWV9RVUVSWSwgVFVJX0FMTE9XX1NJR05BTF9XUklURVN9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7dHVpSXNQcmVzZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHtcbiAgICB0dWlBc1RleHRmaWVsZEFjY2Vzc29yLFxuICAgIHR5cGUgVHVpVGV4dGZpZWxkQWNjZXNzb3IsXG4gICAgVHVpVGV4dGZpZWxkRGlyZWN0aXZlLFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgVFVJX0lURU1TX0hBTkRMRVJTLFxuICAgIHR5cGUgVHVpSXRlbXNIYW5kbGVycyxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9pdGVtcy1oYW5kbGVycyc7XG5pbXBvcnQge3R1aUlzRmxhdH0gZnJvbSAnQHRhaWdhLXVpL2tpdC91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzZWxlY3RbdHVpU2VsZWN0XScsXG4gICAgaW1wb3J0czogW05nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uYXRpdmUtc2VsZWN0LnRlbXBsYXRlLmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW3R1aUFzVGV4dGZpZWxkQWNjZXNzb3IoVHVpTmF0aXZlU2VsZWN0KSwgdHVpQXNDb250cm9sKFR1aU5hdGl2ZVNlbGVjdCldLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbVHVpV2l0aFRleHRmaWVsZF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuYXJpYS1pbnZhbGlkXSc6ICdpbnZhbGlkKCknLFxuICAgICAgICAnW2Rpc2FibGVkXSc6ICchaW50ZXJhY3RpdmUoKScsXG4gICAgICAgICcoY2hhbmdlKSc6ICdzZWxlY3RPcHRpb24oJGV2ZW50LnRhcmdldC5vcHRpb25zLnNlbGVjdGVkSW5kZXgpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlOYXRpdmVTZWxlY3Q8VD5cbiAgICBleHRlbmRzIFR1aUNvbnRyb2w8VCB8IG51bGw+XG4gICAgaW1wbGVtZW50cyBUdWlUZXh0ZmllbGRBY2Nlc3NvcjxUPlxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkID0gaW5qZWN0KFR1aVRleHRmaWVsZERpcmVjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID1cbiAgICAgICAgc2lnbmFsPFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxPcHRpb25FbGVtZW50Pj4+KEVNUFRZX1FVRVJZKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0ZsYXQgPSB0dWlJc0ZsYXQ7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gc2lnbmFsKCcnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbXNIYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmluZ2lmaWVkID0gY29tcHV0ZWQoKHZhbHVlID0gdGhpcy52YWx1ZSgpKSA9PlxuICAgICAgICB0dWlJc1ByZXNlbnQodmFsdWUpID8gdGhpcy5pdGVtc0hhbmRsZXJzLnN0cmluZ2lmeSgpKHZhbHVlKSA6ICcnLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTZWxlY3RlZCA9IGNvbXB1dGVkKFxuICAgICAgICAodmFsdWUgPSB0aGlzLnZhbHVlKCkpID0+XG4gICAgICAgICAgICAoeDogVCkgPT5cbiAgICAgICAgICAgICAgICB0dWlJc1ByZXNlbnQodmFsdWUpICYmIHRoaXMuaXRlbXNIYW5kbGVycy5pZGVudGl0eU1hdGNoZXIoKSh4LCB2YWx1ZSksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0IHVudGlsIGFsbCBgPG9wdGlvbj5gLXMgYXJlIGluc2lkZSBET00uXG4gICAgICAgICAqIE90aGVyd2lzZVxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2VsZWN0JykudmFsdWUgPSAnZXZlbiB1cGNvbWluZyB2YWxpZCB2YWx1ZSc7XG4gICAgICAgICAqIC8vIHNhbWUgYXNcbiAgICAgICAgICogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2VsZWN0JykudmFsdWUgPSAnJztcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqIChpdCBicmVha3MgYHR1aVZhbHVlYCB1dGlsaXR5IGxvZ2ljKVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KHRoaXMuc3RyaW5naWZpZWQoKSk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpdGVtczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBUW10+IHwgcmVhZG9ubHkgVFtdIHwgbnVsbCA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGFiZWxzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gVE9ETyh2NSk6IHVzZSBzaWduYWwgaW5wdXRzXG4gICAgQElucHV0KCdwbGFjZWhvbGRlcicpXG4gICAgcHVibGljIHNldCBwbGFjZWhvbGRlclNldHRlcih4OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlci5zZXQoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkcmVuKCdvcHRpb25SZWYnKVxuICAgIHByb3RlY3RlZCBzZXQgb3B0aW9uc1NldHRlcihvcHRpb25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MT3B0aW9uRWxlbWVudD4+KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXQob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMuaXRlbXM/LmZsYXQoKSA/PyBbXSkgYXMgVFtdO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlck9mZnNldCA9IHRoaXMuc3RyaW5naWZpZWQoKSA/IDAgOiAxO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoaXRlbXNbaW5kZXggLSBwbGFjZWhvbGRlck9mZnNldF0gPz8gbnVsbCk7XG4gICAgfVxufVxuIiwiPG9wdGlvblxuICAgICpuZ0lmPVwiIXN0cmluZ2lmaWVkKClcIlxuICAgIGRpc2FibGVkXG4gICAgc2VsZWN0ZWRcbiAgICB2YWx1ZT1cIlwiXG4+XG4gICAge3sgcGxhY2Vob2xkZXIoKSB9fVxuPC9vcHRpb24+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtcyAmJiAhaXNGbGF0KGl0ZW1zKTsgZWxzZSBmbGF0SXRlbXNcIj5cbiAgICA8b3B0Z3JvdXBcbiAgICAgICAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGxhYmVsczsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICBbbGFiZWxdPVwibGFiZWxzW2luZGV4XVwiXG4gICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3B0aW9uczsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbXNbaW5kZXhdfVwiIC8+XG4gICAgPC9vcHRncm91cD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2ZsYXRJdGVtcz5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3B0aW9uczsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbXN9XCIgLz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNvcHRpb25zXG4gICAgbGV0LWl0ZW1zXG4+XG4gICAgPG9wdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGl0ZW1zXCJcbiAgICAgICAgI29wdGlvblJlZlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXRlbXNIYW5kbGVycy5kaXNhYmxlZEl0ZW1IYW5kbGVyKCkob3B0aW9uKVwiXG4gICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkKCkob3B0aW9uKVwiXG4gICAgICAgIFt2YWx1ZV09XCJpdGVtc0hhbmRsZXJzLnN0cmluZ2lmeSgpKG9wdGlvbilcIlxuICAgID5cbiAgICAgICAge3sgaXRlbXNIYW5kbGVycy5zdHJpbmdpZnkoKShvcHRpb24pIH19XG4gICAgPC9vcHRpb24+XG48L25nLXRlbXBsYXRlPlxuIl19