@taiga-ui/layout
Version:
A package with Taiga UI layout components
96 lines • 18.3 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { tuiContainsOrAfter, tuiInjectElement, tuiIsElement, } from '@taiga-ui/cdk/utils/dom';
import { tuiGetClosestFocusable } from '@taiga-ui/cdk/utils/focus';
import { tuiDirectiveBinding } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiTextfieldComponent, TuiWithTextfield, } from '@taiga-ui/core/components/textfield';
import { TuiIcons } from '@taiga-ui/core/directives/icons';
import { TuiPopupService } from '@taiga-ui/core/directives/popup';
import { TUI_COMMON_ICONS } from '@taiga-ui/core/tokens';
import { tuiCellOptionsProvider } from '@taiga-ui/layout/components/cell';
import { TUI_INPUT_SEARCH } from '@taiga-ui/layout/tokens';
import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
class TuiInputSearch {
constructor() {
this.el = tuiInjectElement();
this.service = inject(TuiPopupService);
this.textfield = inject(TuiTextfieldComponent);
this.i18n = toSignal(inject(TUI_INPUT_SEARCH));
this.parent = this.textfield.el.parentElement;
this.neighbor = this.textfield.el.nextSibling;
this.placeholder = '';
this.icon = tuiDirectiveBinding(TuiIcons, 'iconStart', inject(TUI_COMMON_ICONS).search, {});
this.tuiInputSearchOpen = false;
this.tuiInputSearchOpenChange = new EventEmitter();
}
ngOnChanges() {
if (this.tuiInputSearchOpen) {
this.open();
}
else {
this.close();
}
}
open() {
if (this.ref?.destroyed === false || !this.template) {
return;
}
this.placeholder = this.el.placeholder;
this.parent = this.textfield.el.parentElement;
this.neighbor = this.textfield.el.nextSibling;
this.ref = this.service.addTemplate(this.template);
this.ref.rootNodes[0]?.insertAdjacentElement('afterbegin', this.textfield.el);
this.el.focus({ preventScroll: true });
this.el.placeholder = this.i18n()?.placeholder || this.el.placeholder;
this.tuiInputSearchOpen = true;
this.tuiInputSearchOpenChange.emit(true);
}
close() {
this.el.placeholder = this.placeholder || this.el.placeholder;
this.parent?.insertBefore(this.textfield.el, this.neighbor);
this.ref?.destroy();
this.tuiInputSearchOpen = false;
this.tuiInputSearchOpenChange.emit(false);
}
onArrow() {
tuiGetClosestFocusable({
initial: this.container?.nativeElement || this.el,
root: this.container?.nativeElement || this.el,
})?.focus();
}
onFocus({ target }) {
if (this.container &&
target !== this.el &&
tuiIsElement(target) &&
!tuiContainsOrAfter(this.container.nativeElement, target)) {
this.close();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputSearch, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputSearch, isStandalone: true, selector: "input[tuiInputSearch]", inputs: { tuiInputSearch: "tuiInputSearch", tuiInputSearchOpen: "tuiInputSearchOpen" }, outputs: { tuiInputSearchOpenChange: "tuiInputSearchOpenChange" }, host: { attributes: { "ngSkipHydration": "true" }, listeners: { "focus": "open()", "keydown.tab.prevent": "0", "keydown.arrowDown.prevent": "onArrow()" } }, providers: [tuiCellOptionsProvider({ size: 'm' })], viewQueries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0, template: "<ng-template>\n <div\n tuiTheme=\"dark\"\n class=\"t-container\"\n (document:focusin)=\"onFocus($event)\"\n (keydown.esc)=\"close()\"\n (pointerdown.self)=\"close()\"\n >\n <div\n #container\n class=\"t-content\"\n >\n <ng-container *polymorpheusOutlet=\"tuiInputSearch\" />\n </div>\n </div>\n</ng-template>\n", styles: [".t-container{position:fixed;top:0;left:0;bottom:0;right:0;display:grid;gap:.25rem;grid-template:-webkit-min-content / minmax(auto,50rem);grid-template:min-content / minmax(auto,50rem);place-content:start center;padding:.5rem;background:var(--tui-service-backdrop);box-shadow:0 0 0 5rem var(--tui-service-backdrop)}.t-container ::ng-deep>tui-textfield{background:var(--tui-background-base-alt)}.t-content{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiInputSearch };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputSearch, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'input[tuiInputSearch]', imports: [PolymorpheusOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiCellOptionsProvider({ size: 'm' })], hostDirectives: [TuiWithTextfield], host: {
ngSkipHydration: 'true',
'(focus)': 'open()',
'(keydown.tab.prevent)': '0',
'(keydown.arrowDown.prevent)': 'onArrow()',
}, template: "<ng-template>\n <div\n tuiTheme=\"dark\"\n class=\"t-container\"\n (document:focusin)=\"onFocus($event)\"\n (keydown.esc)=\"close()\"\n (pointerdown.self)=\"close()\"\n >\n <div\n #container\n class=\"t-content\"\n >\n <ng-container *polymorpheusOutlet=\"tuiInputSearch\" />\n </div>\n </div>\n</ng-template>\n", styles: [".t-container{position:fixed;top:0;left:0;bottom:0;right:0;display:grid;gap:.25rem;grid-template:-webkit-min-content / minmax(auto,50rem);grid-template:min-content / minmax(auto,50rem);place-content:start center;padding:.5rem;background:var(--tui-service-backdrop);box-shadow:0 0 0 5rem var(--tui-service-backdrop)}.t-container ::ng-deep>tui-textfield{background:var(--tui-background-base-alt)}.t-content{overflow:hidden}\n"] }]
}], propDecorators: { template: [{
type: ViewChild,
args: [TemplateRef]
}], container: [{
type: ViewChild,
args: ['container']
}], tuiInputSearch: [{
type: Input
}], tuiInputSearchOpen: [{
type: Input
}], tuiInputSearchOpenChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xheW91dC9jb21wb25lbnRzL2lucHV0LXNlYXJjaC9pbnB1dC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGF5b3V0L2NvbXBvbmVudHMvaW5wdXQtc2VhcmNoL2lucHV0LXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUNILGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNmLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUNILHFCQUFxQixFQUNyQixnQkFBZ0IsR0FDbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBMkIsa0JBQWtCLEVBQUMsTUFBTSx3QkFB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QyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgdHlwZSBFbGVtZW50UmVmLFxuICAgIHR5cGUgRW1iZWRkZWRWaWV3UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgdHlwZSBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3RvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIHR1aUNvbnRhaW5zT3JBZnRlcixcbiAgICB0dWlJbmplY3RFbGVtZW50LFxuICAgIHR1aUlzRWxlbWVudCxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHt0dWlHZXRDbG9zZXN0Rm9jdXNhYmxlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2ZvY3VzJztcbmltcG9ydCB7dHVpRGlyZWN0aXZlQmluZGluZ30gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7XG4gICAgVHVpVGV4dGZpZWxkQ29tcG9uZW50LFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7VHVpSWNvbnN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaWNvbnMnO1xuaW1wb3J0IHtUdWlQb3B1cFNlcnZpY2V9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvcG9wdXAnO1xuaW1wb3J0IHtUVUlfQ09NTU9OX0lDT05TfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHt0dWlDZWxsT3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkvbGF5b3V0L2NvbXBvbmVudHMvY2VsbCc7XG5pbXBvcnQge1RVSV9JTlBVVF9TRUFSQ0h9IGZyb20gJ0B0YWlnYS11aS9sYXlvdXQvdG9rZW5zJztcbmltcG9ydCB7dHlwZSBQb2x5bW9ycGhldXNDb250ZW50LCBQb2x5bW9ycGhldXNPdXRsZXR9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpSW5wdXRTZWFyY2hdJyxcbiAgICBpbXBvcnRzOiBbUG9seW1vcnBoZXVzT3V0bGV0XSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC1zZWFyY2guY29tcG9uZW50Lmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFt0dWlDZWxsT3B0aW9uc1Byb3ZpZGVyKHtzaXplOiAnbSd9KV0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtUdWlXaXRoVGV4dGZpZWxkXSxcbiAgICBob3N0OiB7XG4gICAgICAgIG5nU2tpcEh5ZHJhdGlvbjogJ3RydWUnLFxuICAgICAgICAnKGZvY3VzKSc6ICdvcGVuKCknLFxuICAgICAgICAnKGtleWRvd24udGFiLnByZXZlbnQpJzogJzAnLFxuICAgICAgICAnKGtleWRvd24uYXJyb3dEb3duLnByZXZlbnQpJzogJ29uQXJyb3coKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpSW5wdXRTZWFyY2ggaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYpXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudDxIVE1MSW5wdXRFbGVtZW50PigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChUdWlQb3B1cFNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkID0gaW5qZWN0KFR1aVRleHRmaWVsZENvbXBvbmVudCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gdG9TaWduYWwoaW5qZWN0KFRVSV9JTlBVVF9TRUFSQ0gpKTtcbiAgICBwcml2YXRlIHBhcmVudCA9IHRoaXMudGV4dGZpZWxkLmVsLnBhcmVudEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBuZWlnaGJvciA9IHRoaXMudGV4dGZpZWxkLmVsLm5leHRTaWJsaW5nO1xuICAgIHByaXZhdGUgcGxhY2Vob2xkZXIgPSAnJztcbiAgICBwcml2YXRlIHJlZj86IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPjtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpY29uID0gdHVpRGlyZWN0aXZlQmluZGluZyhcbiAgICAgICAgVHVpSWNvbnMsXG4gICAgICAgICdpY29uU3RhcnQnLFxuICAgICAgICBpbmplY3QoVFVJX0NPTU1PTl9JQ09OUykuc2VhcmNoLFxuICAgICAgICB7fSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHVpSW5wdXRTZWFyY2g6IFBvbHltb3JwaGV1c0NvbnRlbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0dWlJbnB1dFNlYXJjaE9wZW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSB0dWlJbnB1dFNlYXJjaE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnR1aUlucHV0U2VhcmNoT3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVmPy5kZXN0cm95ZWQgPT09IGZhbHNlIHx8ICF0aGlzLnRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5lbC5wbGFjZWhvbGRlcjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSB0aGlzLnRleHRmaWVsZC5lbC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB0aGlzLm5laWdoYm9yID0gdGhpcy50ZXh0ZmllbGQuZWwubmV4dFNpYmxpbmc7XG4gICAgICAgIHRoaXMucmVmID0gdGhpcy5zZXJ2aWNlLmFkZFRlbXBsYXRlKHRoaXMudGVtcGxhdGUpO1xuICAgICAgICB0aGlzLnJlZi5yb290Tm9kZXNbMF0/Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIHRoaXMudGV4dGZpZWxkLmVsKTtcbiAgICAgICAgdGhpcy5lbC5mb2N1cyh7cHJldmVudFNjcm9sbDogdHJ1ZX0pO1xuICAgICAgICB0aGlzLmVsLnBsYWNlaG9sZGVyID0gdGhpcy5pMThuKCk/LnBsYWNlaG9sZGVyIHx8IHRoaXMuZWwucGxhY2Vob2xkZXI7XG4gICAgICAgIHRoaXMudHVpSW5wdXRTZWFyY2hPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50dWlJbnB1dFNlYXJjaE9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWwucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMuZWwucGxhY2Vob2xkZXI7XG4gICAgICAgIHRoaXMucGFyZW50Py5pbnNlcnRCZWZvcmUodGhpcy50ZXh0ZmllbGQuZWwsIHRoaXMubmVpZ2hib3IpO1xuICAgICAgICB0aGlzLnJlZj8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnR1aUlucHV0U2VhcmNoT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnR1aUlucHV0U2VhcmNoT3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25BcnJvdygpOiB2b2lkIHtcbiAgICAgICAgdHVpR2V0Q2xvc2VzdEZvY3VzYWJsZSh7XG4gICAgICAgICAgICBpbml0aWFsOiB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCB8fCB0aGlzLmVsLFxuICAgICAgICAgICAgcm9vdDogdGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5lbCxcbiAgICAgICAgfSk/LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9jdXMoe3RhcmdldH06IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyICYmXG4gICAgICAgICAgICB0YXJnZXQgIT09IHRoaXMuZWwgJiZcbiAgICAgICAgICAgIHR1aUlzRWxlbWVudCh0YXJnZXQpICYmXG4gICAgICAgICAgICAhdHVpQ29udGFpbnNPckFmdGVyKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHRhcmdldClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICB0dWlUaGVtZT1cImRhcmtcIlxuICAgICAgICBjbGFzcz1cInQtY29udGFpbmVyXCJcbiAgICAgICAgKGRvY3VtZW50OmZvY3VzaW4pPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uZXNjKT1cImNsb3NlKClcIlxuICAgICAgICAocG9pbnRlcmRvd24uc2VsZik9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICNjb250YWluZXJcbiAgICAgICAgICAgIGNsYXNzPVwidC1jb250ZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcG9seW1vcnBoZXVzT3V0bGV0PVwidHVpSW5wdXRTZWFyY2hcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=