@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
172 lines • 18.3 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, inject, Input, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { BehaviorSubject, Subject, takeUntil } from 'rxjs';
import { Utils } from '../../utils/utils.util';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class SliderComponent {
constructor() {
this._max = 100;
this._min = 0;
this.inputValue$ = new BehaviorSubject(this._min);
this.unsubscribe = new Subject();
this.cdr = inject(ChangeDetectorRef);
/**
* @ignore
*/
this._onChange = (_) => { };
/**
* @ignore
*/
this._onTouched = () => { };
/**
* Slider input step
*/
this.step = 0.1;
/**
* Whether input is disabled or not
*/
this.isDisabled = false;
}
/**
* Minimum value
*/
set min(min) {
if (!Utils.isUndefinedOrNull(min)) {
this._min = min;
this.updateInputCssPropWithValue(this._currentValue);
}
}
get min() {
return this._min;
}
/**
* Maximum value
*/
set max(max) {
if (!Utils.isUndefinedOrNull(max)) {
this._max = max;
this.updateInputCssPropWithValue(this._currentValue);
}
}
get max() {
return this._max;
}
/**
* Input value
*/
set value(val) {
if (!Utils.isUndefinedOrNull(val)) {
this._initialValue = val;
}
else {
this._initialValue = this._min;
}
this._currentValue = this._initialValue;
this.inputValue$.next(this._currentValue);
this.cdr.markForCheck();
}
get value() {
return this._initialValue;
}
ngAfterViewInit() {
this.inputValue$.pipe(takeUntil(this.unsubscribe)).subscribe((val) => {
this.updateInputCssPropWithValue(val);
});
}
ngOnDestroy() {
this.unsubscribe.next();
this.unsubscribe.complete();
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
writeValue(value) {
this.value = value;
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
registerOnChange(fn) {
this._onChange = fn;
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
registerOnTouched(fn) {
this._onTouched = fn;
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
setDisabledState(isDisabled) {
this.isDisabled = isDisabled;
this.cdr.markForCheck();
}
/**
* @ignore
*/
updateValue(event) {
// @ts-ignore
const newVal = event?.target?.value;
if (newVal !== this._currentValue) {
this._currentValue = newVal;
this.writeValue(newVal);
this._onChange(newVal);
}
}
/**
* @ignore
*/
updateInputCssPropWithValue(value) {
if (!this.input?.nativeElement || Utils.isUndefinedOrNull(value)) {
return;
}
let percentage = (100 * (value - this.min)) / (this.max - this.min);
percentage = isNaN(percentage) ? 0 : percentage;
this.input.nativeElement.style.setProperty('--nj-slider-track-position', `${percentage}% 100%`);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SliderComponent, isStandalone: true, selector: "nj-slider", inputs: { sliderId: "sliderId", name: "name", label: "label", min: "min", max: "max", value: "value", step: "step", isDisabled: "isDisabled" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SliderComponent),
multi: true
}
], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"nj-slider\" [ngClass]=\"{'nj-slider--disabled': isDisabled}\">\n <label *ngIf=\"label\" [attr.for]=\"sliderId\">{{label}}</label>\n <input #input\n [style]=\"\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step ? step : 0.1\"\n type=\"range\"\n [attr.id]=\"sliderId\"\n [name]=\"step ? name : ''\"\n [value]=\"value\"\n (input)=\"updateValue($event)\"\n (focus)=\"_onTouched?.()\"\n [disabled]=\"isDisabled\"/>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SliderComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-slider', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SliderComponent),
multi: true
}
], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div class=\"nj-slider\" [ngClass]=\"{'nj-slider--disabled': isDisabled}\">\n <label *ngIf=\"label\" [attr.for]=\"sliderId\">{{label}}</label>\n <input #input\n [style]=\"\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step ? step : 0.1\"\n type=\"range\"\n [attr.id]=\"sliderId\"\n [name]=\"step ? name : ''\"\n [value]=\"value\"\n (input)=\"updateValue($event)\"\n (focus)=\"_onTouched?.()\"\n [disabled]=\"isDisabled\"/>\n</div>\n" }]
}], propDecorators: { sliderId: [{
type: Input
}], name: [{
type: Input
}], label: [{
type: Input
}], min: [{
type: Input
}], max: [{
type: Input
}], value: [{
type: Input
}], step: [{
type: Input
}], isDisabled: [{
type: Input
}], input: [{
type: ViewChild,
args: ['input']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBZ0IvQyxNQUFNLE9BQU8sZUFBZTtJQWQ1QjtRQWtCVSxTQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ1gsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJELGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNsQyxRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFeEM7O1dBRUc7UUFDSyxjQUFTLEdBQUcsQ0FBQyxDQUFNLEVBQVEsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUV6Qzs7V0FFRztRQUNPLGVBQVUsR0FBRyxHQUFTLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFrRXRDOztXQUVHO1FBQ00sU0FBSSxHQUFXLEdBQUcsQ0FBQztRQUU1Qjs7V0FFRztRQUNNLGVBQVUsR0FB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QUFaLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQU1GLEdBQUc7c0JBRE4sS0FBSztnQkFnQkYsR0FBRztzQkFETixLQUFLO2dCQWdCRixLQUFLO3NCQURSLEtBQUs7Z0JBbUJHLElBQUk7c0JBQVosS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVjLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy91dGlscy51dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmotc2xpZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpZGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgX2luaXRpYWxWYWx1ZTogbnVtYmVyO1xuXG4gIHByaXZhdGUgX2N1cnJlbnRWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIF9tYXggPSAxMDA7XG4gIHByaXZhdGUgX21pbiA9IDA7XG4gIHByaXZhdGUgaW5wdXRWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4odGhpcy5fbWluKTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIF9vbkNoYW5nZSA9IChfOiBhbnkpOiB2b2lkID0+IHt9O1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gIC8qKlxuICAgKiBTbGlkZXIgSWQsIHJlcXVpcmVkIGlmIGxhYmVsIGlzIHNldFxuICAgKi9cbiAgQElucHV0KCkgc2xpZGVySWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElucHV0IG5hbWVcbiAgICovXG4gIEBJbnB1dCgpIG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNsaWRlciBsYWJlbFxuICAgKi9cbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBtaW4obWluOiBudW1iZXIpIHtcbiAgICBpZiAoIVV0aWxzLmlzVW5kZWZpbmVkT3JOdWxsKG1pbikpIHtcbiAgICAgIHRoaXMuX21pbiA9IG1pbjtcbiAgICAgIHRoaXMudXBkYXRlSW5wdXRDc3NQcm9wV2l0aFZhbHVlKHRoaXMuX2N1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICAvKipcbiAgICogTWF4aW11bSB2YWx1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG1heChtYXg6IG51bWJlcikge1xuICAgIGlmICghVXRpbHMuaXNVbmRlZmluZWRPck51bGwobWF4KSkge1xuICAgICAgdGhpcy5fbWF4ID0gbWF4O1xuICAgICAgdGhpcy51cGRhdGVJbnB1dENzc1Byb3BXaXRoVmFsdWUodGhpcy5fY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnB1dCB2YWx1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCFVdGlscy5pc1VuZGVmaW5lZE9yTnVsbCh2YWwpKSB7XG4gICAgICB0aGlzLl9pbml0aWFsVmFsdWUgPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZSA9IHRoaXMuX21pbjtcbiAgICB9XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdGhpcy5faW5pdGlhbFZhbHVlO1xuICAgIHRoaXMuaW5wdXRWYWx1ZSQubmV4dCh0aGlzLl9jdXJyZW50VmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGlkZXIgaW5wdXQgc3RlcFxuICAgKi9cbiAgQElucHV0KCkgc3RlcDogbnVtYmVyID0gMC4xO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGlucHV0IGlzIGRpc2FibGVkIG9yIG5vdFxuICAgKi9cbiAgQElucHV0KCkgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0JykgaW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5wdXRWYWx1ZSQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSkpLnN1YnNjcmliZSgodmFsKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUlucHV0Q3NzUHJvcFdpdGhWYWx1ZSh2YWwpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHVwZGF0ZVZhbHVlKGV2ZW50OiBFdmVudCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBuZXdWYWwgPSBldmVudD8udGFyZ2V0Py52YWx1ZTtcbiAgICBpZiAobmV3VmFsICE9PSB0aGlzLl9jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG5ld1ZhbDtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWwpO1xuICAgICAgdGhpcy5fb25DaGFuZ2UobmV3VmFsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgdXBkYXRlSW5wdXRDc3NQcm9wV2l0aFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQgfHwgVXRpbHMuaXNVbmRlZmluZWRPck51bGwodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBwZXJjZW50YWdlID0gKDEwMCAqICh2YWx1ZSAtIHRoaXMubWluKSkgLyAodGhpcy5tYXggLSB0aGlzLm1pbik7XG4gICAgcGVyY2VudGFnZSA9IGlzTmFOKHBlcmNlbnRhZ2UpID8gMCA6IHBlcmNlbnRhZ2U7XG4gICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLW5qLXNsaWRlci10cmFjay1wb3NpdGlvbicsIGAke3BlcmNlbnRhZ2V9JSAxMDAlYCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuai1zbGlkZXJcIiBbbmdDbGFzc109XCJ7J25qLXNsaWRlci0tZGlzYWJsZWQnOiBpc0Rpc2FibGVkfVwiPlxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFthdHRyLmZvcl09XCJzbGlkZXJJZFwiPnt7bGFiZWx9fTwvbGFiZWw+XG4gIDxpbnB1dCAjaW5wdXRcbiAgICAgICAgIFtzdHlsZV09XCJcIlxuICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICAgW3N0ZXBdPVwic3RlcCA/IHN0ZXAgOiAwLjFcIlxuICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgIFthdHRyLmlkXT1cInNsaWRlcklkXCJcbiAgICAgICAgIFtuYW1lXT1cInN0ZXAgPyBuYW1lIDogJydcIlxuICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgIChpbnB1dCk9XCJ1cGRhdGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgIChmb2N1cyk9XCJfb25Ub3VjaGVkPy4oKVwiXG4gICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiLz5cbjwvZGl2PlxuIl19