{"version":3,"file":"uipath-angular-directives-ui-virtual-scroll-range-loader.mjs","sources":["../../../projects/angular/directives/ui-virtual-scroll-range-loader/src/ui-virtual-scroll-range-loader.directive.ts","../../../projects/angular/directives/ui-virtual-scroll-range-loader/src/ui-virtual-scroll-range-loader.module.ts","../../../projects/angular/directives/ui-virtual-scroll-range-loader/src/uipath-angular-directives-ui-virtual-scroll-range-loader.ts"],"sourcesContent":["import { Subject } from 'rxjs';\nimport {\n    debounceTime,\n    distinctUntilChanged,\n    filter,\n    map,\n    startWith,\n    takeUntil,\n    tap,\n    withLatestFrom,\n} from 'rxjs/operators';\n\nimport { ListRange } from '@angular/cdk/collections';\nimport {\n    CdkVirtualForOf,\n    CdkVirtualScrollViewport,\n} from '@angular/cdk/scrolling';\nimport {\n    ContentChild,\n    Directive,\n    EventEmitter,\n    Inject,\n    Input,\n    OnDestroy,\n    OnInit,\n    Output,\n    Self,\n} from '@angular/core';\n\n/**\n * Used for marking the loading state of items\n * within a lazily loaded collection\n *\n * @export\n */\nexport enum VirtualScrollItemStatus {\n    /**\n     * Initial status of an item within the collection,\n     * a placeholder with no content\n     */\n    initial = 'initial',\n    /**\n     * Item marked as pending to be loaded, a request was sent out,\n     * but still no content, item data was not yet received\n     */\n    pending = 'pending',\n    /**\n     * Item with content, data of item has been loaded\n     */\n    loaded = 'loaded',\n}\n\n/**\n * Item with loading state to be used\n * if lazily loading results to reduce events emitted\n * and intervals emitted within events on `rangeLoad` Output\n *\n * @export\n */\nexport interface VirtualScrollItem {\n    loading?: VirtualScrollItemStatus;\n}\n\n/**\n * A directive that is designed to work alongside CdkVirtualScrollViewport\n * which can be used to lazy load in chunks depending on what is in view\n *\n * @export\n */\n@Directive({\n    selector: '[uiVirtualScrollRangeLoader], ui-virtual-scroll-range-loader',\n})\nexport class UiVirtualScrollRangeLoaderDirective implements OnInit, OnDestroy {\n\n    /**\n     * Used to extend the ListRange interval emmited by rangeLoad Output\n     * this will expand at both ends with the specified number,\n     * taking into account the status of the loading items\n     * available\n     *\n     */\n    @Input()\n    buffer = 10;\n\n    /**\n     * Flag used to indicate the direction of items\n     * set to `false` if virtual scroll events indexes need to be reversed\n     */\n    @Input()\n    isDown = true;\n\n    /**\n     * Output of `ListRange` events based on renderedRangeStream from\n     * CdkVirtualScrollViewport which takes into account\n     * direction of list (`isDown`), `buffer`\n     * and reduces interval to untouched indexes (items with `loading: \"initial\"`)\n     *\n     */\n    @Output()\n    rangeLoad = new EventEmitter<ListRange>();\n\n    @ContentChild(CdkVirtualForOf, {\n        static: true,\n    })\n    private readonly _cdkVirtualForOf!: CdkVirtualForOf<VirtualScrollItem>;\n\n    private readonly _destroyed$ = new Subject<void>();\n\n    /**\n     * @ignore\n     */\n    constructor(\n        @Self()\n        @Inject(CdkVirtualScrollViewport)\n        private readonly _viewport: CdkVirtualScrollViewport,\n    ) { }\n\n    /**\n     * @ignore\n     */\n    ngOnInit() {\n        this._viewport.renderedRangeStream\n            .pipe(\n                withLatestFrom(\n                    this._cdkVirtualForOf.dataStream.pipe(\n                        startWith([] as VirtualScrollItem[]),\n                    ),\n                ),\n                distinctUntilChanged(([list1], [list2]) => `${list1.start}${list1.end}` === `${list2.start}${list2.end}`),\n                debounceTime(100),\n                // filter early, in case of false emissions like { 0,0 }\n                filter(([{ start, end }]) => this._isValidRange({\n                    start,\n                    end,\n                })),\n                filter(this._filterTouchedRange),\n                map(([{ start, end }, items]) => ({\n                    ...this._adjustLoadingRange(start, end, this.buffer, items),\n                    items,\n                })),\n                // eslint-disable-next-line sonarjs/no-identical-functions\n                filter(({ start, end }) => this._isValidRange({\n                    start,\n                    end,\n                })),\n                map(({ start, end, items }) =>\n                    this.isDown ?\n                        {\n                            start,\n                            end,\n                        } :\n                        this._reverseIndex({\n                            start,\n                            end,\n                        }, items.length),\n                ),\n                filter(this._isValidRange),\n                tap(range => this.rangeLoad.emit(range)),\n            )\n            .pipe(takeUntil(this._destroyed$))\n            .subscribe();\n    }\n\n    /**\n     * @ignore\n     */\n    ngOnDestroy() {\n        this._destroyed$.next();\n        this._destroyed$.complete();\n    }\n\n    private _filterTouchedRange = (\n        [{ start, end }, items]: [ListRange, VirtualScrollItem[] | readonly VirtualScrollItem[]],\n    ) =>\n        items\n            .slice(start, end)\n            .some(({ loading }) => loading === VirtualScrollItemStatus.initial);\n\n    private _isValidRange = ({ start, end }: ListRange) => end >= 0 && start >= 0 && end - start >= 0;\n    private _reverseIndex({ start, end }: ListRange, count: number) {\n        return {\n            start: count - 1 - end,\n            end: count - 1 - start,\n        };\n    }\n\n    private _adjustLoadingRange(\n        start: number,\n        end: number,\n        buffer: number,\n        items: VirtualScrollItem[] | readonly VirtualScrollItem[]): ListRange {\n        (\n            { start, end } = this._addSafeBuffer(start, end, buffer, items)\n        );\n\n        let isTrimmedBefore;\n        let isTrimmedAfter;\n\n        (\n            { start, end, isTrimmedBefore, isTrimmedAfter } = this._trimInterval(start, end, items)\n        );\n\n        if (start > end) {\n            // kill the request\n            return {\n                start,\n                end: -1,\n            };\n        }\n\n        const isNotTrimmedAtBothEnds = !isTrimmedBefore || !isTrimmedAfter;\n        if (\n            end - start < buffer &&\n            isNotTrimmedAtBothEnds\n        ) {\n            if (!isTrimmedBefore) {\n                start -= buffer;\n            }\n            if (!isTrimmedAfter) {\n                end += buffer;\n            }\n\n            (\n                { start, end } = this._trimInterval(\n                    Math.max(0, start),\n                    Math.min(items.length - 1, end),\n                    items,\n                )\n            );\n        }\n\n        if (start > end) {\n            // kill the request\n            end = -1;\n        }\n\n        return {\n            start,\n            end,\n        };\n    }\n\n    private _addSafeBuffer(start: number, end: number, buffer: number, items: VirtualScrollItem[] | readonly VirtualScrollItem[]) {\n        end = Math.min(end + buffer, items.length - 1);\n        start = Math.max(start - buffer, 0);\n        return {\n            start,\n            end,\n        };\n    }\n\n    private _trimInterval(start: number, end: number, items: VirtualScrollItem[] | readonly VirtualScrollItem[]) {\n        let isTrimmedBefore = false;\n        let isTrimmedAfter = false;\n        while (start <= end &&\n            items[start].loading !== VirtualScrollItemStatus.initial) {\n            isTrimmedBefore = true;\n            start += 1;\n        }\n        while (end >= start &&\n            items[end].loading !== VirtualScrollItemStatus.initial) {\n            isTrimmedAfter = true;\n            end -= 1;\n        }\n        return {\n            start,\n            end,\n            isTrimmedBefore,\n            isTrimmedAfter,\n        };\n    }\n}\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { UiVirtualScrollRangeLoaderDirective } from './ui-virtual-scroll-range-loader.directive';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        ScrollingModule,\n    ],\n    declarations: [UiVirtualScrollRangeLoaderDirective],\n    exports: [UiVirtualScrollRangeLoaderDirective],\n})\nexport class UiVirtualScrollRangeLoaderModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}