UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

83 lines 12.6 kB
import { coerceElement } from '@angular/cdk/coercion'; import { isPlatformBrowser } from '@angular/common'; import { DestroyRef, effect, inject, INJECTOR, isSignal, PLATFORM_ID, signal, untracked, } from '@angular/core'; import { WA_WINDOW } from '@ng-web-apis/common'; import { TUI_ALLOW_SIGNAL_WRITES } from '@taiga-ui/cdk/constants'; export function tuiValue(input, injector = inject(INJECTOR)) { const win = injector.get(WA_WINDOW); if (!win.tuiInputPatched && isPlatformBrowser(injector.get(PLATFORM_ID))) { win.tuiInputPatched = true; patch(win.HTMLInputElement.prototype); patch(win.HTMLTextAreaElement.prototype); patch(win.HTMLSelectElement.prototype); } let element = isSignal(input) ? undefined : coerceElement(input); let cleanup = () => { }; const options = { injector, ...TUI_ALLOW_SIGNAL_WRITES }; const value = signal(element?.value || ''); const process = (el) => { const update = () => untracked(() => value.set(el.value)); el.addEventListener('input', update, { capture: true }); el.addEventListener('tui-input', update, { capture: true }); return () => { el.removeEventListener('input', update, { capture: true }); el.removeEventListener('tui-input', update, { capture: true }); }; }; injector.get(DestroyRef).onDestroy(() => cleanup()); if (isSignal(input)) { effect(() => { element = coerceElement(input()); cleanup(); if (element && !element.matches('select[multiple]')) { value.set(element.value); cleanup = process(element); } }, options); } else if (element && !element.matches('select[multiple]')) { cleanup = process(element); } effect(() => { const v = value(); /** * select[multiple] elements have value of first selected option, * but there could be more, setting value resets other selected options */ if (element?.matches('select[multiple]')) { return; } if (element?.matches(':focus') && 'selectionStart' in element) { const { selectionStart, selectionEnd } = element; /** * After programmatic updates of input's value, caret is automatically placed at the end – * revert to the previous position * * Only the types 'text', 'search', 'password', 'tel', and 'url' support selection */ element.value = v; try { element.setSelectionRange(selectionStart, selectionEnd); } catch { } } else if (element) { element.value = v; } }, options); return value; } function patch(prototype) { const { set } = Object.getOwnPropertyDescriptor(prototype, 'value'); Object.defineProperty(prototype, 'value', { set(detail) { const value = this.value; const event = new CustomEvent('tui-input', { detail, bubbles: true }); set.call(this, detail); if (value !== detail) { this.dispatchEvent(event); } }, }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvdXRpbHMvZG9tL3ZhbHVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0gsVUFBVSxFQUNWLE1BQU0sRUFFTixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixXQUFXLEVBRVgsTUFBTSxFQUNOLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFJaEUsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsS0FJZSxFQUNmLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBRTNCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQU0sU0FBUyxDQUFDLENBQUM7SUFFekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQ3RFLEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTNCLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxD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L0IsTUFBTSxFQUFDLEdBQUcsRUFBQyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFFLENBQUM7SUFFbkUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFO1FBQ3RDLEdBQUcsQ0FBa0IsTUFBYztZQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztZQUVwRSxHQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4QixJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDN0I7UUFDTCxDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7aXNQbGF0Zm9ybUJyb3dzZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERlc3Ryb3lSZWYsXG4gICAgZWZmZWN0LFxuICAgIHR5cGUgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgSU5KRUNUT1IsXG4gICAgaXNTaWduYWwsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgdHlwZSBTaWduYWwsXG4gICAgc2lnbmFsLFxuICAgIHVudHJhY2tlZCxcbiAgICB0eXBlIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V0FfV0lORE9XfSBmcm9tICdAbmctd2ViLWFwaXMvY29tbW9uJztcbmltcG9ydCB7VFVJX0FMTE9XX1NJR05BTF9XUklURVN9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcblxudHlwZSBXaXRoVmFsdWUgPSBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50O1xuXG5leHBvcnQgZnVuY3Rpb24gdHVpVmFsdWUoXG4gICAgaW5wdXQ6XG4gICAgICAgIHwgRWxlbWVudFJlZjxXaXRoVmFsdWU+XG4gICAgICAgIHwgU2lnbmFsPEVsZW1lbnRSZWY8V2l0aFZhbHVlPiB8IHVuZGVmaW5lZD5cbiAgICAgICAgfCBTaWduYWw8V2l0aFZhbHVlIHwgdW5kZWZpbmVkPlxuICAgICAgICB8IFdpdGhWYWx1ZSxcbiAgICBpbmplY3RvciA9IGluamVjdChJTkpFQ1RPUiksXG4pOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+IHtcbiAgICBjb25zdCB3aW4gPSBpbmplY3Rvci5nZXQ8YW55PihXQV9XSU5ET1cpO1xuXG4gICAgaWYgKCF3aW4udHVpSW5wdXRQYXRjaGVkICYmIGlzUGxhdGZvcm1Ccm93c2VyKGluamVjdG9yLmdldChQTEFURk9STV9JRCkpKSB7XG4gICAgICAgIHdpbi50dWlJbnB1dFBhdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgIHBhdGNoKHdpbi5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSk7XG4gICAgICAgIHBhdGNoKHdpbi5IVE1MVGV4dEFyZWFFbGVtZW50LnByb3RvdHlwZSk7XG4gICAgICAgIHBhdGNoKHdpbi5IVE1MU2VsZWN0RWxlbWVudC5wcm90b3R5cGUpO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50ID0gaXNTaWduYWwoaW5wdXQpID8gdW5kZWZpbmVkIDogY29lcmNlRWxlbWVudChpbnB1dCk7XG4gICAgbGV0IGNsZWFudXAgPSAoKTogdm9pZCA9PiB7fTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7aW5qZWN0b3IsIC4uLlRVSV9BTExPV19TSUdOQUxfV1JJVEVTfTtcbiAgICBjb25zdCB2YWx1ZSA9IHNpZ25hbChlbGVtZW50Py52YWx1ZSB8fCAnJyk7XG4gICAgY29uc3QgcHJvY2VzcyA9IChlbDogV2l0aFZhbHVlKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gKCk6IHZvaWQgPT4gdW50cmFja2VkKCgpID0+IHZhbHVlLnNldChlbC52YWx1ZSkpO1xuXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0dWktaW5wdXQnLCB1cGRhdGUsIHtjYXB0dXJlOiB0cnVlfSk7XG5cbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHVpLWlucHV0JywgdXBkYXRlLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBpbmplY3Rvci5nZXQoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IGNsZWFudXAoKSk7XG5cbiAgICBpZiAoaXNTaWduYWwoaW5wdXQpKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50ID0gY29lcmNlRWxlbWVudChpbnB1dCgpKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQubWF0Y2hlcygnc2VsZWN0W211bHRpcGxlXScpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuc2V0KGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGNsZWFudXAgPSBwcm9jZXNzKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQubWF0Y2hlcygnc2VsZWN0W211bHRpcGxlXScpKSB7XG4gICAgICAgIGNsZWFudXAgPSBwcm9jZXNzKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSB2YWx1ZSgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBzZWxlY3RbbXVsdGlwbGVdIGVsZW1lbnRzIGhhdmUgdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgb3B0aW9uLFxuICAgICAgICAgKiBidXQgdGhlcmUgY291bGQgYmUgbW9yZSwgc2V0dGluZyB2YWx1ZSByZXNldHMgb3RoZXIgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGVsZW1lbnQ/Lm1hdGNoZXMoJ3NlbGVjdFttdWx0aXBsZV0nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQ/Lm1hdGNoZXMoJzpmb2N1cycpICYmICdzZWxlY3Rpb25TdGFydCcgaW4gZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge3NlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmR9ID0gZWxlbWVudDtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBBZnRlciBwcm9ncmFtbWF0aWMgdXBkYXRlcyBvZiBpbnB1dCdzIHZhbHVlLCBjYXJldCBpcyBhdXRvbWF0aWNhbGx5IHBsYWNlZCBhdCB0aGUgZW5kIOKAk1xuICAgICAgICAgICAgICogcmV2ZXJ0IHRvIHRoZSBwcmV2aW91cyBwb3NpdGlvblxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIE9ubHkgdGhlIHR5cGVzICd0ZXh0JywgJ3NlYXJjaCcsICdwYXNzd29yZCcsICd0ZWwnLCBhbmQgJ3VybCcgc3VwcG9ydCBzZWxlY3Rpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHY7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gdjtcbiAgICAgICAgfVxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBwYXRjaChwcm90b3R5cGU6IFdpdGhWYWx1ZSk6IHZvaWQge1xuICAgIGNvbnN0IHtzZXR9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsICd2YWx1ZScpITtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsICd2YWx1ZScsIHtcbiAgICAgICAgc2V0KHRoaXM6IFdpdGhWYWx1ZSwgZGV0YWlsOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCd0dWktaW5wdXQnLCB7ZGV0YWlsLCBidWJibGVzOiB0cnVlfSk7XG5cbiAgICAgICAgICAgIHNldCEuY2FsbCh0aGlzLCBkZXRhaWwpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGRldGFpbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4iXX0=