@taiga-ui/kit
Version:
Taiga UI Angular main components kit
125 lines (120 loc) • 7.26 kB
JavaScript
import { TuiLabel } from '@taiga-ui/core/components/label';
import { TuiSliderComponent, TuiSliderKeyStepsBase, TuiSliderKeySteps } from '@taiga-ui/core/components/slider';
import { tuiInjectAuxiliary, TuiTextfieldComponent, TuiTextfieldOptionsDirective } from '@taiga-ui/core/components/textfield';
import { TuiDropdownContent } from '@taiga-ui/core/portals/dropdown';
import * as i0 from '@angular/core';
import { ChangeDetectionStrategy, ViewEncapsulation, Component, inject, computed, effect, Directive } from '@angular/core';
import { WA_IS_MOBILE } from '@ng-web-apis/platform';
import { TuiValueTransformer, TuiNonNullableValueTransformer } from '@taiga-ui/cdk/classes';
import { TUI_VERSION } from '@taiga-ui/cdk/constants';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { tuiWithStyles } from '@taiga-ui/cdk/utils/miscellaneous';
import * as i1 from '@taiga-ui/kit/components/input-number';
import { TuiNumberMask, TuiInputNumberDirective, tuiInputNumberOptionsProvider, TuiQuantumValueTransformer } from '@taiga-ui/kit/components/input-number';
import { fromEvent, tap, filter, switchMap } from 'rxjs';
class Styles {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: Styles, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: Styles, isStandalone: true, selector: "ng-component", exportAs: ["tui-input-slider-5.7.0"], ngImport: i0, template: '', isInline: true, styles: ["tui-textfield:where(*[data-tui-version=\"5.7.0\"]) [tuiInputSlider]~.t-content [tuiButtonX]{display:none!important}tui-textfield:where(*[data-tui-version=\"5.7.0\"]) [tuiInputSlider]~[tuiSlider]:disabled{display:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: Styles, decorators: [{
type: Component,
args: [{ template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: `tui-input-slider-${TUI_VERSION}`, styles: ["tui-textfield:where(*[data-tui-version=\"5.7.0\"]) [tuiInputSlider]~.t-content [tuiButtonX]{display:none!important}tui-textfield:where(*[data-tui-version=\"5.7.0\"]) [tuiInputSlider]~[tuiSlider]:disabled{display:none}\n"] }]
}] });
class TuiInputSliderDirective {
constructor() {
this.isMobile = inject(WA_IS_MOBILE);
this.el = tuiInjectElement();
this.slider = tuiInjectAuxiliary((x) => x instanceof TuiSliderComponent);
this.controlTransformer = inject(TuiValueTransformer, { self: true });
this.nothing = tuiWithStyles(Styles);
this.mask = inject(TuiNumberMask, { self: true });
this.inputNumber = inject(TuiInputNumberDirective, { self: true });
this.value = computed(() => this.controlTransformer.toControlValue(this.inputNumber.value()));
this.textfieldToSliderSync = effect(() => {
const slider = this.slider();
if (!slider) {
return;
}
if (slider.keySteps?.transformer()) {
slider.keySteps?.setControlValue(this.value());
}
else {
// Native <input type="range" /> does not support BigInt
slider.min = Number(this.mask.min());
slider.max = Number(this.mask.max());
slider.value = this.value();
}
slider.el.disabled = !this.inputNumber.interactive();
});
this.sliderInit = effect((onCleanup) => {
const slider = this.slider();
if (!slider) {
return;
}
slider.el.setAttribute('tabindex', '-1');
if (slider.keySteps) {
slider.keySteps.controlValue = this.value;
}
const subscription = fromEvent(slider.el, 'input')
.pipe(tap(() => this.inputNumber.setValue(slider.keySteps?.getControlValue() ?? slider.el.valueAsNumber)), filter(() => !this.isMobile), switchMap(() => fromEvent(this.el.ownerDocument, 'pointerup', { once: true })))
.subscribe(() => this.el.focus());
onCleanup(() => subscription.unsubscribe());
});
}
onStep(coefficient) {
const slider = this.slider();
if (slider && this.inputNumber.interactive()) {
const newValue = tuiClamp(slider.keySteps?.takeStep(coefficient) ??
slider.value + coefficient * slider.step, this.mask.min(), this.mask.max());
this.inputNumber.setValue(newValue);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: TuiInputSliderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.21", type: TuiInputSliderDirective, isStandalone: true, selector: "input[tuiInputSlider]", host: { listeners: { "blur": "inputNumber.setValue(value() ?? null)", "keydown.arrowDown": "onStep(-1)", "keydown.arrowUp": "onStep(1)" } }, providers: [
tuiInputNumberOptionsProvider({
valueTransformer: new TuiNonNullableValueTransformer(),
}),
], hostDirectives: [{ directive: i1.TuiInputNumberDirective, inputs: ["invalid", "invalid", "readOnly", "readOnly"] }, { directive: i1.TuiQuantumValueTransformer, inputs: ["quantum", "quantum"] }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: TuiInputSliderDirective, decorators: [{
type: Directive,
args: [{
selector: 'input[tuiInputSlider]',
providers: [
tuiInputNumberOptionsProvider({
valueTransformer: new TuiNonNullableValueTransformer(),
}),
],
hostDirectives: [
{
directive: TuiInputNumberDirective,
inputs: ['invalid', 'readOnly'],
},
{
directive: TuiQuantumValueTransformer,
inputs: ['quantum'],
},
],
host: {
'(blur)': 'inputNumber.setValue(value() ?? null)',
'(keydown.arrowDown)': 'onStep(-1)',
'(keydown.arrowUp)': 'onStep(1)',
},
}]
}] });
const TuiInputSlider = [
TuiSliderComponent,
TuiSliderKeyStepsBase,
TuiSliderKeySteps,
TuiInputSliderDirective,
TuiLabel,
TuiTextfieldComponent,
TuiTextfieldOptionsDirective,
TuiDropdownContent,
];
/**
* Generated bundle index. Do not edit.
*/
export { TuiInputSlider, TuiInputSliderDirective };
//# sourceMappingURL=taiga-ui-kit-components-input-slider.mjs.map