{"version":3,"file":"deja-js-component-v2-viewport.mjs","sources":["../../../../projects/deja-js/component/v2/viewport/viewport.service.ts","../../../../projects/deja-js/component/v2/viewport/viewport.component.ts","../../../../projects/deja-js/component/v2/viewport/viewport.component.html","../../../../projects/deja-js/component/v2/viewport/index.ts","../../../../projects/deja-js/component/v2/viewport/deja-js-component-v2-viewport.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/* eslint-disable @typescript-eslint/naming-convention */\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, combineLatestWith, debounceTime, delay, distinctUntilChanged, filter, fromEvent, map, mergeWith, Observable, of, ReplaySubject, shareReplay, startWith, Subject, switchMap, take, tap, withLatestFrom } from 'rxjs';\n\nexport type ViewPortMode = 'disabled' | 'fixed' | 'variable' | 'auto';\n\nexport type ViewPortDirection = 'horizontal' | 'vertical';\n\nexport type ViewPortMaxSize = number | 'auto';\n\n/** Service de gestion du viewport d'une liste.\n * Ce service permet la gestion du viewport verticalement ou horizontalement.\n */\n@Injectable()\nexport class ViewPortService<T> {\n    public viewPort$: Observable<ViewPort<T>>;\n\n    public emptyViewPort = {\n        beforeSize: 0,\n        afterSize: 0,\n        viewPortSize: 0,\n        listSize: 0,\n        visibleItems: new Array<ViewPortItem<T>>() as ReadonlyArray<ViewPortItem<T>>,\n        startIndex: 0,\n        endIndex: 0,\n        targetScrollPos: 0,\n        items: new Array<ViewPortItem<T>>() as ReadonlyArray<ViewPortItem<T>>\n    } as ViewPort<T>;\n\n    public mode$ = new BehaviorSubject<ViewPortMode>('fixed');\n    public items$ = new BehaviorSubject<ReadonlyArray<ViewPortItem<T>>>([]);\n    public maxSize$ = new BehaviorSubject<ViewPortMaxSize>(0);\n    public ensureItem$ = new Subject<ViewPortItem<T> | number>();\n    public scrollPosition$ = new BehaviorSubject<number>(0);\n    public element$ = new ReplaySubject<HTMLElement>(1);\n    public itemsSize$ = new BehaviorSubject<number>(40);\n    public direction$ = new BehaviorSubject<ViewPortDirection>('vertical');\n    public debug = false;\n\n    private refresh$ = new BehaviorSubject<boolean>(null);\n    private deleteSizeCache$ = new BehaviorSubject<void>(undefined);\n    private clear$ = new Subject<ViewPort<T>>();\n    private lastCalculatedSize: number;\n\n    private measureViewPort = {\n        beforeSize: 0,\n        afterSize: 200000,\n        viewPortSize: 0,\n        listSize: 0,\n        visibleItems: new Array<ViewPortItem<T>>() as ReadonlyArray<ViewPortItem<T>>,\n        startIndex: 0,\n        endIndex: 0,\n        targetScrollPos: undefined, // Do not change the scroll pos in case of refresh is called when the list is scrolling (I.E. dynamic content loading)\n        items: new Array<ViewPortItem<T>>() as ReadonlyArray<ViewPortItem<T>>\n    } as ViewPort<T>;\n\n    public constructor() {\n\n        const element$ = this.element$.pipe(\n            distinctUntilChanged()\n        );\n\n        const maxSize$ = this.maxSize$.pipe(\n            distinctUntilChanged()\n        );\n\n        const dir$ = this.direction$.pipe(\n            distinctUntilChanged()\n        );\n\n        const mode$ = this.mode$.pipe(\n            distinctUntilChanged()\n        );\n\n        const deleteSizeCache$ = (): Observable<[ReadonlyArray<ViewPortItem<T>>, ViewPortMode]> => this.items$.pipe(\n            combineLatestWith(mode$),\n            take(1),\n            tap(([items, mode]) => {\n                if (items?.length && mode === 'auto') {\n                    items.forEach(item => item.size = undefined);\n                }\n            })\n        );\n\n        const direction$ = dir$.pipe(\n            combineLatestWith(this.deleteSizeCache$),\n            switchMap(([direction]) =>\n                // Reset items size when direction change in auto mode\n                deleteSizeCache$().pipe(\n                    map(() => direction)\n                )\n            )\n        );\n\n        const itemsSize$ = this.itemsSize$.pipe(\n            distinctUntilChanged()\n        );\n\n        const innerSize = (direction: ViewPortDirection): number => direction === 'horizontal' ? window.innerWidth : window.innerHeight;\n\n        const clientSize = (element: HTMLElement, direction: ViewPortDirection): number => Math.ceil(direction === 'horizontal' ? element.clientWidth : element.clientHeight);\n\n        const calcFixedSizeViewPort$ = (params: ViewPortParams, items: ReadonlyArray<ViewPortItem<T>>, scrollPosition: number, containerSize: ViewPortMaxSize): Observable<ViewPort<T>> => {\n            this.log('calcFixedSizeViewPort');\n            const maxCount = Math.ceil(+containerSize / params.itemsSize) + 1;\n            const startRow = Math.floor(scrollPosition / params.itemsSize);\n\n            const rowsCount = Math.min(items.length - startRow, maxCount);\n            let startIndex: number;\n            let endIndex: number;\n            let newScrollPos: number;\n            if (!params.ensureParams || params.ensureParams.index === undefined || !params.ensureParams.atEnd) {\n                if (rowsCount < 0) {\n                    endIndex = items.length - 1;\n                    startIndex = endIndex + 1 - Math.min(items.length, maxCount);\n                } else if (params.ensureParams?.index !== undefined) {\n                    startIndex = params.ensureParams.index;\n                    endIndex = startIndex + rowsCount - 1;\n                    newScrollPos = startIndex * params.itemsSize;\n                } else {\n                    startIndex = startRow;\n                    endIndex = startIndex + rowsCount - 1;\n                }\n            } else {\n                // Ensure visible from the end\n                startIndex = Math.max(0, params.ensureParams.index + 1 - Math.min(items.length, maxCount));\n                endIndex = Math.max(params.ensureParams.index, rowsCount - 1);\n                newScrollPos = (endIndex + 1) * params.itemsSize - +containerSize;\n            }\n\n            const visibleItems = items.slice(startIndex, endIndex + 1);\n\n            return of({\n                beforeSize: startIndex * params.itemsSize,\n                afterSize: (items.length - endIndex - 1) * params.itemsSize,\n                listSize: containerSize,\n                viewPortSize: visibleItems.length * params.itemsSize,\n                visibleItems: visibleItems as ReadonlyArray<ViewPortItem<T>>,\n                startIndex: startIndex,\n                endIndex: endIndex,\n                targetScrollPos: newScrollPos,\n                items\n            } as ViewPort<T>);\n        };\n\n        const calcVariableSizeViewPort$ = (params: ViewPortParams, items: ReadonlyArray<ViewPortItem<T>>, scrollPosition: number, containerSize: ViewPortMaxSize): Observable<ViewPort<T>> => {\n            this.log('calcVariableSizeViewPort');\n            const visibleItems = new Array<ViewPortItem<T>>();\n            let startIndex: number;\n            let endIndex: number;\n            let beforeSize = 0;\n            let viewPortSize = 0;\n            let afterSize = 0;\n            let newScrollPos: number;\n\n            if (!params.ensureParams || params.ensureParams.index === undefined || !params.ensureParams.atEnd) {\n                items.forEach((item: ViewPortItem<T>, index: number) => {\n                    const itemSize = item.size || params.itemsSize;\n\n                    if (params.ensureParams && params.ensureParams.index === index) {\n                        startIndex = index;\n                        newScrollPos = beforeSize;\n                    }\n\n                    if (startIndex === undefined) {\n                        if (beforeSize + itemSize >= scrollPosition) {\n                            startIndex = index;\n                        } else {\n                            beforeSize += itemSize;\n                        }\n                    }\n\n                    if (startIndex !== undefined && endIndex === undefined) {\n                        viewPortSize += itemSize;\n                        visibleItems.push(item);\n                    }\n\n                    if (endIndex === undefined) {\n                        if ((beforeSize + viewPortSize > (newScrollPos || scrollPosition) + +containerSize) || index === items.length - 1) {\n                            endIndex = index;\n                        }\n                    } else {\n                        afterSize += itemSize;\n                    }\n                });\n            } else {\n                // Ensure visible from the end\n                let index = items.length;\n                // eslint-disable-next-line no-loops/no-loops\n                while (--index >= 0) {\n                    const item = items[index];\n                    const itemSize = item.size || params.itemsSize;\n\n                    if (params.ensureParams.index === index) {\n                        endIndex = index;\n                    }\n\n                    if (endIndex !== undefined) {\n                        if (startIndex === undefined) {\n                            viewPortSize += itemSize;\n                            visibleItems.unshift(item);\n\n                            if (viewPortSize > +containerSize || index === 0) {\n                                startIndex = index;\n                                newScrollPos = viewPortSize - +containerSize;\n                            }\n                        } else {\n                            newScrollPos += itemSize;\n                            beforeSize += itemSize;\n                        }\n                    } else {\n                        afterSize += itemSize;\n                    }\n                }\n            }\n\n            if (params.ensureParams?.index !== undefined && viewPortSize < containerSize && visibleItems.length < items.length) {\n                params.ensureParams = {\n                    index: params.ensureParams.atEnd ? 0 : items.length - 1,\n                    atEnd: !params.ensureParams.atEnd\n                } as EnsureParams;\n                return calcVariableSizeViewPort$(params, items, scrollPosition, containerSize);\n            }\n\n            return of({\n                beforeSize: beforeSize,\n                afterSize: afterSize,\n                listSize: containerSize,\n                viewPortSize: viewPortSize,\n                visibleItems: visibleItems as ReadonlyArray<ViewPortItem<T>>,\n                startIndex: startIndex || 0,\n                endIndex: endIndex || items.length,\n                targetScrollPos: newScrollPos,\n                items\n            } as ViewPort<T>);\n        };\n\n        const calcAutoSizeViewPort$ = (params: ViewPortParams, items: ReadonlyArray<ViewPortItem<T>>, scrollPosition: number, containerSize: ViewPortMaxSize, isCalculation?: boolean): Observable<ViewPort<T>> => {\n            this.log('calcAutoSizeViewPort');\n            return calcVariableSizeViewPort$(params, items, scrollPosition, containerSize).pipe(\n                switchMap(viewPort => {\n                    const calculationRequired = !isCalculation && viewPort.visibleItems.find(item => !item.size);\n\n                    const measure$ = of(viewPort);\n                    if (!calculationRequired) {\n                        this.log('calcAutoSizeViewPort: no calculationRequired', viewPort);\n                        return measure$;\n                    } else {\n                        // Measure items size\n                        this.log('calcAutoSizeViewPort: measure');\n                        return measure$.pipe(\n                            mergeWith(measure$.pipe(\n                                delay(1),\n                                tap(() => {\n                                    const elements = Array.from(params.element.getElementsByClassName('listitem'));\n                                    elements.forEach(itemElement => {\n                                        const index = +itemElement.getAttribute('flat');\n                                        const item = viewPort.visibleItems[index - viewPort.startIndex];\n                                        if (item) {\n                                            item.size = clientSize(itemElement as HTMLElement, params.direction);\n                                            this.log('calcAutoSizeViewPort: item found', item, 'measured size', item.size, 'HTML Element', itemElement);\n                                        } else {\n                                            this.log('calcAutoSizeViewPort: item not found', item);\n                                        }\n                                    });\n                                    // Recalc Viewport size\n                                    viewPort.viewPortSize = viewPort.visibleItems.reduce((size, item) => size += item.size || params.itemsSize, 0);\n                                }),\n                                switchMap(() => calcVariableSizeViewPort$(params, items, viewPort.targetScrollPos || scrollPosition, containerSize))\n                            ))\n                        );\n                    }\n                })\n            );\n        };\n\n        const calcDisabledViewPort$ = (params: ViewPortParams, items: ReadonlyArray<ViewPortItem<T>>, scrollPosition: number, containerSize: ViewPortMaxSize, bindIfAny: boolean): Observable<ViewPort<T>> => {\n            let viewPortSize = 0;\n            let startIndex: number;\n            let endIndex: number;\n            let newScrollPos: number;\n            const elements = params.element.getElementsByClassName('listitem');\n\n            const viewPort = {\n                beforeSize: 0,\n                afterSize: 0,\n                listSize: containerSize,\n                viewPortSize: 0,\n                visibleItems: new Array<ViewPortItem<T>>() as ReadonlyArray<ViewPortItem<T>>,\n                startIndex: 0,\n                endIndex: 0,\n                targetScrollPos: 0,\n                items\n            } as ViewPort<T>;\n\n            if (elements.length !== items.length && (bindIfAny ?? true)) {\n                const measure$ = of(viewPort);\n                return measure$.pipe(\n                    mergeWith(measure$.pipe(\n                        delay(1),\n                        switchMap(() => calcDisabledViewPort$(params, items, scrollPosition, containerSize, false))\n                    ))\n                );\n            }\n\n            if (!params.ensureParams || params.ensureParams.index === undefined || !params.ensureParams.atEnd) {\n                // eslint-disable-next-line no-loops/no-loops\n                const itemElements = Array.from(elements) as HTMLElement[];\n                itemElements.forEach((itemElement, i) => {\n                    const itemSize = items[i].size = clientSize(itemElement, params.direction);\n\n                    if (params.ensureParams && params.ensureParams.index === i) {\n                        startIndex = i;\n                        newScrollPos = viewPortSize;\n                    }\n\n                    viewPortSize += itemSize;\n\n                    if (startIndex === undefined && viewPortSize > scrollPosition) {\n                        startIndex = i;\n                    }\n\n                    if (endIndex === undefined && viewPortSize > (newScrollPos || scrollPosition) + +containerSize) {\n                        endIndex = i;\n                    }\n                });\n            } else {\n                // Ensure visible from the end\n                newScrollPos = 0;\n                let listSize = 0;\n                let i = elements.length;\n                // eslint-disable-next-line no-loops/no-loops\n                while (--i >= 0) {\n                    const itemElement = elements[i] as HTMLElement;\n                    const itemSize = items[i].size = clientSize(itemElement, params.direction);\n\n                    if (params.ensureParams.index === i) {\n                        endIndex = i;\n                    }\n\n                    if (endIndex !== undefined) {\n                        if (startIndex === undefined) {\n                            listSize += itemSize;\n                            if (listSize > +containerSize) {\n                                startIndex = i;\n                                newScrollPos = listSize - +containerSize;\n                            }\n                        } else {\n                            newScrollPos += itemSize;\n                        }\n                    }\n\n                    viewPortSize += itemSize;\n                }\n            }\n\n            startIndex = startIndex || 0;\n            endIndex = endIndex || items.length - 1;\n            this.log(`viewPortSize ${viewPortSize}`);\n            return of({\n                beforeSize: 0,\n                afterSize: 0,\n                listSize: containerSize,\n                viewPortSize: viewPortSize,\n                visibleItems: items.slice(startIndex, 1 + endIndex) as ReadonlyArray<ViewPortItem<T>>,\n                startIndex: startIndex,\n                endIndex: endIndex,\n                targetScrollPos: newScrollPos,\n                items\n            } as ViewPort<T>);\n        };\n\n        const calcViewPort$ = (params: ViewPortParams, items: ReadonlyArray<ViewPortItem<T>>, scrollPosition: number, fromMeasure?: boolean): Observable<ViewPort<T>> => {\n            this.log('calcViewPort');\n            if (!items?.length) {\n                return of(this.emptyViewPort);\n            }\n\n            let listSize = params.maxSize || clientSize(params.element, params.direction);\n            if (listSize <= 40) {\n                listSize = innerSize(params.direction);\n            }\n\n            let viewPort$: Observable<ViewPort<T>>;\n            switch (params.mode) {\n                case 'disabled':\n                    viewPort$ = calcDisabledViewPort$(params, items, scrollPosition, listSize, true);\n                    break;\n                case 'variable':\n                    viewPort$ = calcVariableSizeViewPort$(params, items, scrollPosition, listSize);\n                    break;\n                case 'auto':\n                    viewPort$ = calcAutoSizeViewPort$(params, items, scrollPosition, listSize);\n                    break;\n                default: // 'fixed'\n                    viewPort$ = calcFixedSizeViewPort$(params, items, scrollPosition, listSize);\n            }\n\n            return viewPort$.pipe(\n                switchMap(viewPort => {\n                    if (!fromMeasure && viewPort.viewPortSize > 0) {\n                        const endScrollPos = viewPort.beforeSize + viewPort.viewPortSize + viewPort.afterSize - viewPort.listSize;\n                        if (params.mode !== 'disabled' && listSize < 80) {\n                            // Measure again container and recalc viewport\n                            const measure$ = of(this.measureViewPort);\n                            return measure$.pipe(\n                                mergeWith(measure$.pipe(\n                                    delay(1),\n                                    switchMap(() => calcViewPort$(params, items, scrollPosition, true))\n                                ))\n                            );\n                        } else if (endScrollPos < 0 || (items.length && endScrollPos > 0 && (viewPort.targetScrollPos || scrollPosition) > endScrollPos)) {\n                            // Scroll position is over the last item\n                            // Ensure last item visible and recalc viewport\n                            params.ensureParams = {\n                                index: items.length - 1,\n                                atEnd: true\n                            };\n                            return calcViewPort$(params, items, 0, true);\n                        } else if (params.mode === 'auto' && viewPort.viewPortSize < listSize) {\n                            // Rendered viewport is to small, render again to complete\n                            params.ensureParams = {\n                                index: items.length - 1,\n                                atEnd: true\n                            } as EnsureParams;\n                            return calcViewPort$(params, items, 0, true);\n                        }\n                    }\n\n                    // Return calculated viewport\n                    return of(viewPort);\n                }),\n                tap(() => {\n                    if (params.ensureParams) {\n                        params.ensureParams.index = undefined;\n                    }\n                })\n            );\n        };\n\n        // Ensure item visible by index or instance\n        const ensureParams$ = this.ensureItem$.pipe(\n            withLatestFrom(this.items$),\n            switchMap(([ensureItem, items]) => this.viewPort$.pipe(\n                take(1),\n                map(viewPort => {\n                    const ensureParams = {} as EnsureParams;\n\n                    if (ensureItem !== undefined && ensureItem !== null && items?.length) {\n                        let ensureIndex = ensureItem as number;\n                        if (isNaN(ensureIndex)) {\n                            ensureIndex = items.findIndex(itm => ensureItem === itm);\n                        }\n\n                        if (ensureIndex >= 0) {\n                            if (viewPort && ensureIndex <= viewPort.startIndex) {\n                                ensureParams.index = ensureIndex;\n                                ensureParams.atEnd = false;\n                            } else if (!viewPort || ensureIndex >= viewPort.endIndex) {\n                                ensureParams.index = ensureIndex;\n                                ensureParams.atEnd = true;\n                            }\n                        }\n                    }\n\n                    return ensureParams;\n                })\n            )),\n            startWith(null as EnsureParams),\n            shareReplay({ bufferSize: 1, refCount: false })\n        );\n\n        const resize$ = fromEvent<Event>(window, 'resize').pipe(\n            debounceTime(5),\n            switchMap(() => deleteSizeCache$().pipe(\n                map(() => false)\n            ))\n        );\n\n        const refresh$ = this.refresh$.pipe(\n            mergeWith(resize$),\n            withLatestFrom(this.items$),\n            tap(([clearMeasuredSize, items]) => {\n                if (clearMeasuredSize && items?.length) {\n                    this.lastCalculatedSize = undefined;\n                    items.forEach(item => item.size = undefined);\n                }\n            }),\n            debounceTime(100)\n        );\n\n        const scrollPosition$ = this.scrollPosition$.pipe(\n            distinctUntilChanged()\n        );\n\n        // Calc view port observable\n        const viewPort$ = element$.pipe(\n            combineLatestWith(maxSize$, mode$, direction$, itemsSize$, ensureParams$),\n            map(([element, maxSize, mode, direction, itemsSize, ensureParams]) => ({ element, maxSize, mode, direction, itemsSize, ensureParams } as ViewPortParams)),\n            debounceTime(1),\n            combineLatestWith(this.items$, scrollPosition$, refresh$),\n            filter(([params]) => !!params.element),\n            switchMap(([params, items, scrollPosition]) => {\n                this.log('scrollPosition', scrollPosition);\n                const listSize = this.lastCalculatedSize || params.maxSize || clientSize(params.element, params.direction);\n                let maxSizeValue = params.maxSize === 'auto' ? 0 : +params.maxSize;\n                let vp$: Observable<ViewPort<T>>;\n                if (items?.length && (listSize === 'auto' || listSize < 80)) {\n                    // Set the viewlist to the maximum height to measure the real max-height defined in the css\n                    // Use a blank div to do that\n                    const measure$ = of(this.measureViewPort);\n                    vp$ = measure$.pipe(\n                        mergeWith(measure$.pipe(\n                            delay(1), // Wait next life cycle for the result\n                            switchMap(() => {\n                                // Get max size from container\n                                maxSizeValue = this.lastCalculatedSize = clientSize(params.element, params.direction);\n                                // Ensure that max size is not more than the items size\n                                if (params.mode === 'fixed') {\n                                    if (items.length * params.itemsSize < maxSizeValue) {\n                                        maxSizeValue = items.length * params.itemsSize;\n                                    }\n                                } else if (params.mode === 'variable') {\n                                    let maxItemsSize = 0;\n                                    items.find(item => {\n                                        maxItemsSize += item.size || params.itemsSize;\n                                        return maxItemsSize > maxSizeValue;\n                                    });\n                                    if (maxItemsSize < maxSizeValue) {\n                                        maxSizeValue = maxItemsSize;\n                                    }\n                                }\n                                return calcViewPort$(params, items, scrollPosition);\n                            })\n                        ))\n                    );\n                } else {\n                    vp$ = calcViewPort$(params, items, scrollPosition);\n                }\n\n                return vp$.pipe(\n                    map(vp => ({ ...vp, ...params, ...{ scrollPosition } }))\n                );\n            })\n        );\n\n        this.viewPort$ = viewPort$.pipe(\n            mergeWith(this.clear$),\n            shareReplay({ bufferSize: 1, refCount: true })\n        );\n    }\n\n    public deleteSizeCache(): void {\n        this.deleteSizeCache$.next();\n    }\n\n    public clear(): void {\n        this.clear$.next(this.emptyViewPort);\n    }\n\n    public refresh(clearMeasuredSize?: boolean): void {\n        this.refresh$.next(clearMeasuredSize);\n    }\n\n    private log(message: unknown, ...optionalParams: unknown[]): void {\n        if (this.debug) {\n            console.log(message, optionalParams.length ? optionalParams : undefined);\n        }\n    }\n}\n\ninterface ViewPortParams {\n    element: HTMLElement;\n    maxSize: ViewPortMaxSize;\n    mode: ViewPortMode;\n    direction: ViewPortDirection;\n    itemsSize: number;\n    ensureParams: EnsureParams;\n}\n\nexport interface EnsureParams {\n    index: number;\n    atEnd: boolean;\n}\n\nexport interface ViewPort<T> extends ViewPortParams {\n    beforeSize: number;\n    afterSize: number;\n    visibleItems: ReadonlyArray<ViewPortItem<T>>;\n    startIndex: number;\n    endIndex: number;\n    viewPortSize: number;\n    listSize: number;\n    targetScrollPos: number;\n    scrollPosition: number;\n    items: ReadonlyArray<ViewPortItem<T>>;\n}\n\nexport interface ViewPortItem<T> {\n    size?: number;\n    model?: T;\n    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, coerceNumberProperty, NumberInput } from '@angular/cdk/coercion';\nimport { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\nimport { Destroy } from '@deja-js/component/core';\nimport { BehaviorSubject, combineLatestWith, debounceTime, distinctUntilChanged, filter, from, fromEvent, interval, map, mergeMap, mergeWith, Observable, Subject, switchMap, takeUntil, tap, timer, withLatestFrom } from 'rxjs';\n\nimport { ViewPort, ViewPortDirection, ViewPortItem, ViewPortMode, ViewPortService } from './viewport.service';\n\nexport type ViewPortScrollStyleType = 'scrollbar' | 'buttons';\n\nexport class ViewPortItemClassEvent<T> {\n    public item: ViewPortItem<T>;\n    public classes: Array<string>;\n}\n\n@Component({\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [ViewPortService],\n    selector: 'viewport',\n    styleUrls: ['./viewport.component.scss'],\n    templateUrl: './viewport.component.html'\n})\nexport class ViewPortComponent<T> extends Destroy {\n    @HostBinding('attr.buttons') public hasButtons: boolean = null;\n    @HostBinding('attr.horizontal') public isHorizontal: boolean = null;\n\n    /** Permet de définir un template d'élément par binding */\n    @Input() public viewPortItemTemplateExternal: TemplateRef<T>;\n\n    @Output() public readonly itemClass = new EventEmitter<ViewPortItemClassEvent<T>>();\n\n    @ContentChild('viewPortItemTemplate') private viewPortItemTemplateInternal: TemplateRef<T>;\n\n    public hasUpButton: boolean = null;\n    public hasDownButton: boolean = null;\n    public buttons$ = new Subject<QueryList<ElementRef<HTMLElement>>>();\n    public viewPort$: Observable<ViewPort<T>>;\n    public viewPortElementSize$ = new Subject<{ size: number }>();\n\n    private _buttonsStep: NumberInput;\n    private reloadViewPort$ = new BehaviorSubject<void>(null);\n\n    @Input()\n    public set buttonsStep(value: NumberInput) {\n        this._buttonsStep = coerceNumberProperty(value);\n    }\n\n    public get buttonsStep(): NumberInput {\n        return this._buttonsStep || 20;\n    }\n\n    /** Set the list of models to render inside the viewport control */\n    @Input()\n    public set models(models: ReadonlyArray<T>) {\n        this.items = models ? models.map(model => ({\n            model: model\n        } as ViewPortItem<T>)) : [];\n    }\n\n    /** Set the list of items to render inside the viewport control */\n    @Input()\n    public set items(items: ReadonlyArray<ViewPortItem<T>>) {\n        this.viewPortService.items$.next(items);\n    }\n\n    /** Set the scrolling style\n      * scrollbar: Classic scrollbars\n      * buttons: A button before is placed at the top or at the left of the list, and a button after is placed at the right or the bottom of the list.\n      */\n    @Input()\n    public set scrollingStyle(value: ViewPortScrollStyleType) {\n        this.hasButtons = value === 'buttons';\n        this.viewPortService.refresh();\n    }\n\n    /** Set the direction of the items rendering\n     * vertical: The item are displayed vertically\n     * horizontal: The item are displayed horizontally\n     */\n    @Input()\n    public set direction(value: ViewPortDirection) {\n        this.isHorizontal = value === 'horizontal';\n        this.viewPortService.direction$.next(value);\n    }\n\n    /** Set the item size in fixed mode or the default item size before rendering in auto mode */\n    @Input()\n    public set itemSize(value: NumberInput) {\n        if (value) {\n            const itemSize = coerceNumberProperty(value);\n            this.viewPortService.itemsSize$.next(itemSize);\n        }\n    }\n\n    @ViewChild('wrapper')\n    protected set wrapperElement(element: ElementRef<HTMLElement>) {\n        this.viewPortService.element$.next(element.nativeElement);\n    }\n\n    @ViewChildren('button')\n    protected set buttons(buttons: QueryList<ElementRef<HTMLElement>>) {\n        this.buttons$.next(buttons);\n    }\n\n    public get viewPortItemTemplate(): TemplateRef<T> {\n        return this.viewPortItemTemplateExternal || this.viewPortItemTemplateInternal;\n    }\n\n    public set scrollPos(value: number) {\n        const scrollPosition = Math.max(coerceNumberProperty(value), 0);\n        this.viewPortService.scrollPosition$.next(scrollPosition);\n    }\n\n    /**\n     * Définit la méthode de calcul de la taille des éléments. Les valuers acceptées sont\n     * disabled: Tous les éléments sont rendus. (< 100 éléments)\n     * fixed: Seul les éléments visibles sont rendus. La taille des éléments est constante et définie par itemsSize. (performances ++)\n     * variable: Seul les éléments visibles sont rendus. La taille des éléments est variable et définie par item.size. (performances +-)\n     * auto: Seul les éléments visibles sont rendus. La taille des éléments est calculée automatiquement (performances --)\n    */\n    @Input()\n    public set viewPortMode(mode: ViewPortMode) {\n        this.viewPortService.mode$.next(mode);\n    }\n\n    @Input()\n    public set debugMode(value: BooleanInput) {\n        this.viewPortService.debug = coerceBooleanProperty(value);\n    }\n\n    public constructor(\n        public viewPortService: ViewPortService<T>\n    ) {\n        super();\n\n        this.viewPort$ = viewPortService.viewPort$.pipe(\n            combineLatestWith(this.reloadViewPort$),\n            map(([viewPort]) => ({ ...viewPort }))\n        );\n\n        viewPortService.element$.pipe(\n            distinctUntilChanged(),\n            switchMap(element => fromEvent<Event>(element, 'scroll').pipe(\n                distinctUntilChanged(),\n                withLatestFrom(viewPortService.direction$),\n                map(([_, direction]) => Math.round(direction === 'horizontal' ? element.scrollLeft : element.scrollTop))\n            )),\n            takeUntil(this.destroyed$)\n        ).subscribe(scrollPosition => {\n            this.viewPortService.scrollPosition$.next(scrollPosition);\n        });\n\n        viewPortService.element$.pipe(\n            distinctUntilChanged(),\n            switchMap(element => fromEvent<WheelEvent>(element, 'mousewheel').pipe(\n                withLatestFrom(viewPortService.direction$),\n                filter(([_, direction]) => direction === 'horizontal' || this.hasButtons),\n                tap(([event, direction]) => {\n                    event.stopPropagation();\n                    event.preventDefault();\n                    if (direction === 'horizontal') {\n                        element.scroll({ left: element.scrollLeft + event.deltaY, top: 0 });\n                    } else {\n                        element.scroll({ left: 0, top: element.scrollTop + event.deltaY });\n                    }\n                })\n            )),\n            takeUntil(this.destroyed$)\n        ).subscribe();\n\n        viewPortService.viewPort$.pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(viewPort => {\n            this.hasUpButton = this.hasButtons && viewPort.mode === 'disabled' ? viewPort.scrollPosition > 0 : viewPort.beforeSize > 0;\n            this.hasDownButton = this.hasButtons && viewPort.mode === 'disabled' ? viewPort.scrollPosition < viewPort.viewPortSize - viewPort.listSize : viewPort.afterSize > 0;\n\n            if (viewPort?.element) {\n                if (viewPort.direction === 'horizontal') {\n                    viewPort.element.scrollLeft = viewPort.targetScrollPos ?? viewPort.scrollPosition;\n                } else {\n                    viewPort.element.scrollTop = viewPort.targetScrollPos ?? viewPort.scrollPosition;\n                }\n\n                this.viewPortElementSize$.next({ size: viewPort.direction === 'horizontal' ? viewPort.element.clientWidth : viewPort.element.clientHeight });\n            }\n        });\n\n        this.viewPortElementSize$.pipe(\n            debounceTime(1),\n            distinctUntilChanged(),\n            withLatestFrom(viewPortService.direction$, viewPortService.element$),\n            takeUntil(this.destroyed$)\n        ).subscribe(([viewPortElementSize, direction, element]) => {\n            const newElementSize = direction === 'horizontal' ? element.clientWidth : element.clientHeight;\n            if (viewPortElementSize.size > 0 && newElementSize > viewPortElementSize.size) {\n                console.log('ViewPort element size to small, refresh view port');\n                this.viewPortService.refresh();\n            }\n            viewPortElementSize.size = newElementSize;\n        });\n\n        const buttons$ = this.buttons$.pipe(\n            debounceTime(100),\n            map(buttons => buttons.map(button => button.nativeElement)),\n            distinctUntilChanged((b1, b2) => b1?.length === b2?.length)\n        );\n\n        const destroyButtons$ = buttons$.pipe(\n            filter(buttons => buttons.length === 0)\n        );\n\n        buttons$.pipe(\n            filter(buttons => buttons.length === 2),\n            withLatestFrom(viewPortService.element$),\n            switchMap(([buttons, viewPortElement]) => {\n                const clientSize = this.isHorizontal ? viewPortElement.clientWidth : viewPortElement.clientHeight;\n\n                const scroll = (event: MouseEvent, sign: number): void => {\n                    const delta = sign * (event.ctrlKey ? clientSize : +this.buttonsStep * 2);\n                    if (this.isHorizontal) {\n                        viewPortElement.scroll({ left: viewPortElement.scrollLeft + delta, top: 0 });\n                    } else {\n                        viewPortElement.scroll({ left: 0, top: viewPortElement.scrollTop + delta });\n                    }\n                };\n\n                return from(buttons).pipe(\n                    mergeMap(button => {\n                        const sign = button.id === 'down' ? 1 : -1;\n\n                        const autoScroll$ = (event: MouseEvent): Observable<number> => {\n                            const mouseup$ = fromEvent<MouseEvent>(buttons[0], 'mouseup').pipe(\n                                mergeWith(fromEvent<MouseEvent>(buttons[0], 'mouseleave'), fromEvent<MouseEvent>(buttons[1], 'mouseup'), fromEvent<MouseEvent>(buttons[1], 'mouseleave'))\n                            );\n                            return timer(750).pipe(\n                                mergeMap(() => interval(50)),\n                                tap(() => scroll(event, sign)),\n                                takeUntil(mouseup$)\n                            );\n                        };\n\n                        return fromEvent<MouseEvent>(button, 'mousedown').pipe(\n                            switchMap(event => {\n                                scroll(event, sign);\n                                return autoScroll$(event);\n                            }),\n                            takeUntil(destroyButtons$)\n                        );\n                    })\n                );\n            }),\n            takeUntil(this.destroyed$)\n        ).subscribe();\n    }\n\n    /** Recalcule le viewport. */\n    public refreshViewPort(clearMeasuredSize?: boolean): void {\n        this.viewPortService.refresh(clearMeasuredSize);\n    }\n\n    /** Rebind le viewport */\n    public reloadViewPort(): void {\n        this.reloadViewPort$.next();\n    }\n\n    /** Efface le viewport */\n    public clearViewPort(): void {\n        this.viewPortService.clear();\n    }\n\n    public ensureVisible(item: number | ViewPortItem<T>): void {\n        this.viewPortService.ensureItem$.next(item);\n    }\n\n    public getCssSize(item: ViewPortItem<T>, defaultItemSize: number, mode: ViewPortMode): string {\n        const itemSize = this.getItemSize(item, defaultItemSize, mode);\n        return itemSize ? `${itemSize}px` : 'auto';\n    }\n\n    public getItemSize(item: ViewPortItem<T>, defaultItemSize: number, mode: ViewPortMode): NumberInput {\n        if (mode === 'disabled') {\n            return null;\n        } else if (mode === 'fixed') {\n            return defaultItemSize;\n        } else if (mode === 'auto') {\n            return item.size || null;\n        } else {\n            return (item.size && item.size > 40) ? item.size : defaultItemSize;\n        }\n    }\n\n    public getItemClassName(item: ViewPortItem<T>): string {\n        const classes = ['listitem'];\n        if (this.itemClass.observed) {\n            this.itemClass.next({\n                item,\n                classes\n            } as ViewPortItemClassEvent<T>);\n        }\n        return classes.join(' ');\n    }\n\n    public trackBy(_index: number, item: ViewPortItem<T>): unknown {\n        return item.trackBy || item;\n    }\n}\n","<div #button id=\"up\" *ngIf=\"hasButtons\" [attr.hidden]=\"!hasUpButton || null\">\n    <mat-icon>keyboard_arrow_up</mat-icon>\n</div>\n<div #wrapper class=\"viewport-wrapper\">\n    <ng-container *ngIf=\"viewPort$ | async as viewPort\">\n        <ng-container *ngIf=\"viewPort.direction === 'vertical';else horizontal\">\n            <div class=\"fake\" *ngIf=\"viewPort.beforeSize > 0\" [style.height.px]=\"viewPort.beforeSize\">&nbsp;</div>\n            <div *ngFor=\"let item of (viewPort.mode === 'disabled' ? viewPort.items : viewPort.visibleItems); trackBy: trackBy; let index = index\" [attr.class]=\"getItemClassName(item)\" [attr.flat]=\"viewPort.startIndex + index\" [attr.mode]=\"viewPort.mode\" [style.width]=\"'100%'\" [style.height]=\"getCssSize(item, viewPort.itemsSize, viewPort.mode)\">\n                <ng-template [ngTemplateOutlet]=\"viewPortItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item, index: viewPort.startIndex + index, size: getItemSize(item, viewPort.itemsSize, viewPort.mode), model: item.model }\"></ng-template>\n            </div>\n            <div class=\"fake\" *ngIf=\"viewPort.afterSize > 0\" [style.height.px]=\"viewPort.afterSize\">&nbsp;</div>\n        </ng-container>\n        <ng-template #horizontal>\n            <div class=\"fake\" *ngIf=\"viewPort.beforeSize > 0\" [style.flex-basis.px]=\"viewPort.beforeSize\">&nbsp;</div>\n            <div *ngFor=\"let item of (viewPort.mode === 'disabled' ? viewPort.items : viewPort.visibleItems); trackBy: trackBy; let index = index\" [attr.class]=\"getItemClassName(item)\" [attr.flat]=\"viewPort.startIndex + index\" [attr.mode]=\"viewPort.mode\" [style.height]=\"'100%'\" [style.flex-basis]=\"getCssSize(item, viewPort.itemsSize, viewPort.mode)\">\n                <ng-template [ngTemplateOutlet]=\"viewPortItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item, index: viewPort.startIndex + index, size: getItemSize(item, viewPort.itemsSize, viewPort.mode), model: item.model }\"></ng-template>\n            </div>\n            <div class=\"fake\" *ngIf=\"viewPort.afterSize > 0\" [style.flex-basis.px]=\"viewPort.afterSize\">&nbsp;</div>\n        </ng-template>\n    </ng-container>\n</div>\n<div #button id=\"down\" *ngIf=\"hasButtons\" [attr.hidden]=\"!hasDownButton || null\">\n    <mat-icon>keyboard_arrow_down</mat-icon>\n</div>\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';\nimport { MatIconModule } from '@angular/material/icon';\n\nimport { ViewPortComponent } from './viewport.component';\n\n@NgModule({\n    declarations: [\n        ViewPortComponent\n    ],\n    exports: [\n        ViewPortComponent\n    ],\n    imports: [\n        CommonModule,\n        MatIconModule\n    ]\n})\nexport class ViewPortModule { }\n\nexport * from './viewport.service';\nexport * from './viewport.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ViewPortService"],"mappings":"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"}