@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
71 lines • 11.2 kB
JavaScript
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) {
value.set(element.value);
cleanup = process(element);
}
}, options);
}
else if (element) {
cleanup = process(element);
}
effect(() => {
const v = value();
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
*/
element.value = v;
element.setSelectionRange(selectionStart, selectionEnd);
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvdXRpbHMvZG9tL3ZhbHVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRCxPQUFPLEVBQ0gsVUFBVSxFQUNWLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixXQUFXLEVBQ1gsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFJaEUsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsS0FJZSxFQUNmLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBRTNCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQU0sU0FBUyxDQUFDLENBQUM7SUFFekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQ3RFLEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTNCLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxD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TSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1lBRXBFLEdBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXhCLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3QjtRQUNMLENBQUM7S0FDSixDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjb2VyY2VFbGVtZW50fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtFbGVtZW50UmVmLCBTaWduYWwsIFdyaXRhYmxlU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgRGVzdHJveVJlZixcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxuICAgIElOSkVDVE9SLFxuICAgIGlzU2lnbmFsLFxuICAgIFBMQVRGT1JNX0lELFxuICAgIHNpZ25hbCxcbiAgICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXQV9XSU5ET1d9IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuaW1wb3J0IHtUVUlfQUxMT1dfU0lHTkFMX1dSSVRFU30gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuXG50eXBlIFdpdGhWYWx1ZSA9IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbmV4cG9ydCBmdW5jdGlvbiB0dWlWYWx1ZShcbiAgICBpbnB1dDpcbiAgICAgICAgfCBFbGVtZW50UmVmPFdpdGhWYWx1ZT5cbiAgICAgICAgfCBTaWduYWw8RWxlbWVudFJlZjxXaXRoVmFsdWU+IHwgdW5kZWZpbmVkPlxuICAgICAgICB8IFNpZ25hbDxXaXRoVmFsdWUgfCB1bmRlZmluZWQ+XG4gICAgICAgIHwgV2l0aFZhbHVlLFxuICAgIGluamVjdG9yID0gaW5qZWN0KElOSkVDVE9SKSxcbik6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4ge1xuICAgIGNvbnN0IHdpbiA9IGluamVjdG9yLmdldDxhbnk+KFdBX1dJTkRPVyk7XG5cbiAgICBpZiAoIXdpbi50dWlJbnB1dFBhdGNoZWQgJiYgaXNQbGF0Zm9ybUJyb3dzZXIoaW5qZWN0b3IuZ2V0KFBMQVRGT1JNX0lEKSkpIHtcbiAgICAgICAgd2luLnR1aUlucHV0UGF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgcGF0Y2god2luLkhUTUxJbnB1dEVsZW1lbnQucHJvdG90eXBlKTtcbiAgICAgICAgcGF0Y2god2luLkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlKTtcbiAgICAgICAgcGF0Y2god2luLkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSk7XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnQgPSBpc1NpZ25hbChpbnB1dCkgPyB1bmRlZmluZWQgOiBjb2VyY2VFbGVtZW50KGlucHV0KTtcbiAgICBsZXQgY2xlYW51cCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtpbmplY3RvciwgLi4uVFVJX0FMTE9XX1NJR05BTF9XUklURVN9O1xuICAgIGNvbnN0IHZhbHVlID0gc2lnbmFsKGVsZW1lbnQ/LnZhbHVlIHx8ICcnKTtcbiAgICBjb25zdCBwcm9jZXNzID0gKGVsOiBXaXRoVmFsdWUpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSAoKTogdm9pZCA9PiB1bnRyYWNrZWQoKCkgPT4gdmFsdWUuc2V0KGVsLnZhbHVlKSk7XG5cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB1cGRhdGUsIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3R1aS1pbnB1dCcsIHVwZGF0ZSwge2NhcHR1cmU6IHRydWV9KTtcblxuICAgICAgICByZXR1cm4gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB1cGRhdGUsIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0dWktaW5wdXQnLCB1cGRhdGUsIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGluamVjdG9yLmdldChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4gY2xlYW51cCgpKTtcblxuICAgIGlmIChpc1NpZ25hbChpbnB1dCkpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGlucHV0KCkpO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLnNldChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICBjbGVhbnVwID0gcHJvY2VzcyhlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGNsZWFudXAgPSBwcm9jZXNzKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSB2YWx1ZSgpO1xuXG4gICAgICAgIGlmIChlbGVtZW50Py5tYXRjaGVzKCc6Zm9jdXMnKSAmJiAnc2VsZWN0aW9uU3RhcnQnIGluIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kfSA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQWZ0ZXIgcHJvZ3JhbW1hdGljIHVwZGF0ZXMgb2YgaW5wdXQncyB2YWx1ZSwgY2FyZXQgaXMgYXV0b21hdGljYWxseSBwbGFjZWQgYXQgdGhlIGVuZCDigJNcbiAgICAgICAgICAgICAqIHJldmVydCB0byB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHY7XG4gICAgICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSB2O1xuICAgICAgICB9XG4gICAgfSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhdGNoKHByb3RvdHlwZTogV2l0aFZhbHVlKTogdm9pZCB7XG4gICAgY29uc3Qge3NldH0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgJ3ZhbHVlJykhO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgJ3ZhbHVlJywge1xuICAgICAgICBzZXQodGhpczogV2l0aFZhbHVlLCBkZXRhaWw6IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3R1aS1pbnB1dCcsIHtkZXRhaWwsIGJ1YmJsZXM6IHRydWV9KTtcblxuICAgICAgICAgICAgc2V0IS5jYWxsKHRoaXMsIGRldGFpbCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gZGV0YWlsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiJdfQ==