{"version":3,"file":"deja-js-component-range.mjs","sources":["../../../../projects/deja-js/component/range/range.interface.ts","../../../../projects/deja-js/component/range/range.component.ts","../../../../projects/deja-js/component/range/range.component.html","../../../../projects/deja-js/component/range/index.ts","../../../../projects/deja-js/component/range/deja-js-component-range.ts"],"sourcesContent":["/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\n/**\n * IRange interface\n */\nexport interface IRange {\n    min: number;\n    max: number;\n    trackBy?: unknown;\n    $width?: number;\n}\n\n/**\n * IRange Generic Event\n */\nexport interface IRangeEvent extends Event {\n    range: IRange;\n    ranges: IRange[];\n    index: number;\n}\n\n/**\n * IRange Step Event\n */\nexport interface IStepRangeEvent extends IRangeEvent {\n    newMax: number;\n}\n\n/**\n * IRange class implementation\n */\nexport class Range implements IRange {\n    public constructor(public min: number, public max: number, public $width?: number, public trackBy?: unknown) { }\n}\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, HostListener, Input, Optional, Output, Self, TemplateRef } from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { Destroy } from '@deja-js/component/core';\nimport { fromEvent, map, mergeWith, take, takeUntil } from 'rxjs';\n\nimport { IRange, IRangeEvent, IStepRangeEvent, Range } from './range.interface';\n\n\n@Component({\n    selector: 'deja-range',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    styleUrls: ['./range.component.scss'],\n    templateUrl: './range.component.html'\n})\nexport class DejaRangeComponent extends Destroy implements ControlValueAccessor {\n    // emit the selected range\n    // eslint-disable-next-line @angular-eslint/no-output-native\n    @Output() public readonly select = new EventEmitter();\n    // error emitter, used to notify the outside when forbidden actions are performed\n    @Output() public readonly errorFeedback = new EventEmitter();\n    // step can be either a numeric value, an array of accepted intervals or a function returning the next accepted interval\n    @Input() public step: number | number[] | ((event: IStepRangeEvent) => number) = 1;\n    // index of the selected range\n    @Input() public selected = 0;\n    // custom templates\n    @ContentChild('rangeTemplate') public rangeTemplate: TemplateRef<unknown>;\n    @ContentChild('separatorTemplate') public separatorTemplate: TemplateRef<unknown>;\n\n    // minimum range percentage, used to avoid 2 separator being on the same visual space\n    private minimumRangePercentage = 0.01;\n\n    private _readOnly = true;\n    private _disabled = false;\n    private _ranges: IRange[];\n\n    public constructor(private changeDetectorRef: ChangeDetectorRef, private elementRef: ElementRef<HTMLElement>, @Self() @Optional() public control: NgControl) {\n        super();\n        if (this.control) {\n            this.control.valueAccessor = this;\n        }\n    }\n\n    @HostListener('window:resize', [])\n    public onResize(): void {\n        this.ranges = this.ranges.concat();\n    }\n\n    public registerOnChange(fn: () => void): void {\n        this._onChangeCallback = fn;\n    }\n\n    public registerOnTouched(fn: () => void): void {\n        this._onTouchCallback = fn;\n    }\n\n    // inner model\n    public get ranges(): IRange[] {\n        return this._ranges || [];\n    }\n\n    public set ranges(ranges: IRange[]) {\n        if (ranges) {\n            this.writeValue(ranges);\n            this._onChangeCallback(ranges);\n        }\n    }\n\n    @Input()\n    public set disabled(value: BooleanInput) {\n        this._disabled = coerceBooleanProperty(value);\n        this.changeDetectorRef.markForCheck();\n    }\n\n    public get disabled(): BooleanInput {\n        return this._disabled;\n    }\n\n    @Input()\n    public set readOnly(value: BooleanInput) {\n        this._readOnly = coerceBooleanProperty(value);\n    }\n\n    public get readOnly(): BooleanInput {\n        return this._readOnly || this.disabled;\n    }\n\n    // ControlValueAccessor implementation\n    public writeValue(ranges: IRange[]): void {\n        if (!!ranges && !!ranges.length) {\n            const host = this.elementRef.nativeElement.firstElementChild as HTMLElement;\n            const hostWidth = host.getBoundingClientRect().width;\n            const totalDifference = ranges[ranges.length - 1].max - ranges[0].min;\n\n            this._ranges = ranges.map((range, index) => {\n                // calculate new width\n                const difference = ranges[index].max - ranges[index].min;\n                const modelPercent = totalDifference / 100;\n                const percent = difference / modelPercent;\n                const viewValue = hostWidth * percent / 100;\n                range.$width = +viewValue.toFixed(2);\n                return range;\n            });\n\n            this.changeDetectorRef.markForCheck();\n        }\n    }\n\n    public setDisabledState(isDisabled: boolean): void {\n        this.disabled = isDisabled;\n    }\n    // End of ControlValueAccessor implementation\n\n    // add a new range, by splitting the selected one into 2 new ranges\n    public add(): void {\n        if (!this.readOnly) {\n            if (typeof this.step === 'number') {\n                const ranges = this.ranges;\n                const index = this.selected;\n                const selected = ranges[index];\n\n                const difference = selected.max - selected.min;\n                const totalDifference = ranges[ranges.length - 1].max - ranges[0].min;\n\n                const minimumViewDifference = this.minimumRangePercentage * 2;\n                const modelDifferencePercentage = difference / totalDifference;\n                const isViewDifferenceEnough = modelDifferencePercentage > minimumViewDifference;\n\n                let newMax;\n                let newRange;\n\n                const isModelDifferenceEnough = difference >= this.step * 2;\n\n                if (isViewDifferenceEnough && isModelDifferenceEnough) {\n                    newMax = selected.min + difference / 2;\n                    newRange = new Range(selected.min, newMax);\n                    selected.min = newMax;\n\n                    // split array in half excluding the selected range\n                    const leftSide = ranges.slice(0, index);\n                    const rightSide = ranges.length - 1 > index ? ranges.slice(index + 1) : [];\n\n                    // build new array with new range\n                    let newRanges = [...leftSide, newRange, selected, ...rightSide];\n\n                    // step\n                    const newRangeIndex = newRanges.indexOf(newRange);\n                    newRanges[newRangeIndex].max = this.toStep(newRanges, newRangeIndex, newRanges[newRangeIndex].max);\n\n                    newRanges = newRanges\n                        .map((range: IRange, _index: number) => {\n                            if (_index !== 0) {\n                                range.min = newRanges[_index - 1].max;\n                            }\n                            return range;\n                        });\n\n                    this.ranges = newRanges;\n\n                } else {\n                    this.errorFeedback.emit(new Error('Range is too small to be splitted'));\n                }\n            } else {\n                throw new Error('Invalid step type, you have to implement the add function yourself for the fn & array.');\n            }\n        }\n    }\n\n    // remove the select range\n    public remove(): void {\n        if (!this.readOnly && this.ranges.length > 2) {\n            const ranges = this.ranges\n                .filter((_range: IRange, index: number) => this.selected !== index);\n            this.ranges = ranges\n                .map((range: IRange, index: number) => {\n                    if (index !== ranges.length - 1) {\n                        range.max = ranges[index + 1].min;\n                    }\n                    return range;\n                });\n        }\n    }\n\n    /** Force control to rebind */\n    public refresh(): void {\n        this.changeDetectorRef.markForCheck();\n    }\n\n    // set the new selected index and emit a IRangeEvent\n    public onSelect(e: Event, index: number): void {\n        if (this.disabled) {\n            return;\n        }\n\n        if (this.selected !== index) {\n            const event = e as IRangeEvent;\n            event.range = this.ranges[index];\n            event.index = index;\n            event.ranges = this.ranges;\n            this.select.emit(event);\n            this.selected = index;\n        }\n    }\n\n    public onMouseDown($event: MouseEvent, index: number): void {\n        if (!this.readOnly) {\n            const xStart = $event.pageX;\n            const target = $event.target as HTMLElement;\n            const ranges = this.ranges;\n            const range = this.ranges[index];\n            const rangeStart = range.max;\n\n            // get the block HTMLElement (contains range HTMLElement & separator HTMLElement)\n            let parentElement = target.parentElement;\n            // eslint-disable-next-line no-loops/no-loops\n            while (!parentElement.classList.contains('block')) {\n                parentElement = parentElement.parentElement;\n            }\n\n            const up$ = fromEvent<MouseEvent>(document, 'mouseup');\n            const leave$ = fromEvent<MouseEvent>(document.body, 'mouseleave');\n            const kill$ = up$.pipe(\n                mergeWith(leave$),\n                take(1),\n                map(() => {\n                    const host = this.elementRef.nativeElement.firstElementChild as HTMLElement;\n                    host.ownerDocument.body.classList.remove('noselect');\n\n                    this._onChangeCallback(this._ranges);\n                }),\n                mergeWith(this.destroyed$)\n            );\n\n            const move$ = fromEvent<MouseEvent>(document, 'mousemove');\n            move$.pipe(\n                takeUntil(kill$)\n            ).subscribe(event => {\n                const x = event.pageX;\n                const xDifference = -(xStart - x);\n\n                const nextRange = this.ranges[index + 1];\n\n                // compute total difference\n                const totalDifference = ranges[ranges.length - 1].max - ranges[0].min;\n\n                // calculate new width of the range, get host width\n                const host = this.elementRef.nativeElement.firstElementChild as HTMLElement;\n                const hostWidth = host.getBoundingClientRect().width;\n\n                // avoid drag\n                host.ownerDocument.body.classList.add('noselect');\n\n                // compute new model value\n                const modelDifference = xDifference * totalDifference / hostWidth;\n                let newMax = rangeStart + modelDifference;\n\n                const minDifference = this.minimumRangePercentage * totalDifference;\n                const min = range.min + minDifference;\n                const max = nextRange.max - minDifference;\n\n                newMax = Math.min(newMax, max);\n                newMax = Math.max(newMax, min);\n                const newStepped = this.toStep(ranges, index, newMax);\n\n                nextRange.min = range.max = newStepped;\n\n                ranges[index] = range;\n                ranges[index + 1] = nextRange;\n                this.writeValue(ranges);\n            });\n        }\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public _onChangeCallback = (_a?: unknown): void => undefined;\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public _onTouchCallback = (): void => undefined;\n\n    protected trackBy(_index: number, range: IRange): unknown {\n        return range.trackBy || range;\n    }\n\n    private toStep(ranges: IRange[], index: number, newMax: number): number {\n\n        const range = ranges[index];\n        const maybeNextIndex = ranges.length - 1 > index ? index + 1 : index;\n        const nextMax = ranges[maybeNextIndex].max;\n        const previousMax = index !== 0 ? ranges[index - 1].max : 0;\n\n        const totalDifference = ranges[ranges.length - 1].max - ranges[0].min;\n        const minimumViewDifference = this.minimumRangePercentage * totalDifference;\n\n        const viewMin = range.min + minimumViewDifference;\n        const viewMax = nextMax - minimumViewDifference;\n\n        if (typeof this.step === 'number') {\n\n            const numericStep = this.step;\n            const precision = 100 / (numericStep * 100);\n            const steppedValue = (Math.round(newMax * precision) / precision);\n\n            const mantisseLength = numericStep\n                .toString()\n                .replace(/[0-9]+\\./, '')\n                .length;\n\n            const fixedValue = +steppedValue.toFixed(mantisseLength);\n\n            const modelMax = Math.min(fixedValue, nextMax - numericStep);\n            const modelMin = Math.max(fixedValue, previousMax + numericStep);\n\n            const min = viewMin < modelMin ? modelMin : viewMin;\n            const max = viewMax > modelMax ? modelMax : viewMax;\n\n            const bestValue = newMax > range.max ? max : min;\n\n            return bestValue;\n\n        } else if (typeof this.step === 'function') {\n            const event = {} as IStepRangeEvent;\n\n            event.range = this.ranges[index];\n            event.index = index;\n            event.ranges = this.ranges;\n            event.newMax = newMax;\n\n            return this.step(event);\n\n        } else if (this.step instanceof Array) {\n            let idealValue = newMax;\n            let bestDiff: number;\n            this.step\n                .filter(value => value <= viewMax && value >= viewMin)\n                .forEach(value => {\n                    const diff = Math.abs(value - newMax);\n                    if (bestDiff === undefined || bestDiff > diff) {\n                        idealValue = value;\n                        bestDiff = diff;\n                    }\n                });\n\n            return idealValue;\n\n        } else {\n            throw new Error('Invalid step type.');\n        }\n    }\n}\n","<section id=\"container\">\n    <section *ngFor=\"let range of ranges; trackBy: trackBy; let index=index\" class=\"block\" [style.width.px]=\"range.$width\">\n        <span class=\"range\" (mousedown)=\"onSelect($event, index)\" [class.selected]=\"selected === index\">\n\t\t\t\t<span class=\"default-range\" *ngIf=\"!rangeTemplate\">{{range.min}} - {{range.max}}</span>\n        <ng-template [ngTemplateOutlet]=\"rangeTemplate\" [ngTemplateOutletContext]=\"{ $implicit : range, index: index, ranges: ranges }\"></ng-template>\n        </span>\n        <span class=\"separator\" *ngIf=\"ranges.length > index + 1\" (mousedown)=\"onMouseDown($event, index)\">\n\t\t\t\t<span class=\"default-separator\" *ngIf=\"!separatorTemplate\">\n\t\t\t\t\t<span class=\"default-separator-item\"></span>\n        </span>\n        <ng-template [ngTemplateOutlet]=\"separatorTemplate\" [ngTemplateOutletContext]=\"{ $implicit : range, index: index, ranges: ranges }\"></ng-template>\n        </span>\n    </section>\n</section>\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { DejaRangeComponent } from './range.component';\n\n@NgModule({\n    declarations: [DejaRangeComponent],\n    exports: [DejaRangeComponent],\n    imports: [\n        CommonModule\n    ]\n})\nexport class DejaRangeModule { }\n\nexport * from './range.interface';\nexport * from './range.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}