UNPKG

@ng-select/ng-select

Version:

Angular ng-select - All in One UI Select, Multiselect and Autocomplete

68 lines 8.94 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class NgDropdownPanelService { constructor() { this._dimensions = { itemHeight: 0, panelHeight: 0, itemsPerViewport: 0, }; } get dimensions() { return this._dimensions; } calculateItems(scrollPos, itemsLength, buffer) { const d = this._dimensions; const scrollHeight = d.itemHeight * itemsLength; const scrollTop = Math.max(0, scrollPos); const indexByScrollTop = (scrollTop / scrollHeight) * itemsLength; let end = Math.min(itemsLength, Math.ceil(indexByScrollTop) + (d.itemsPerViewport + 1)); const maxStartEnd = end; const maxStart = Math.max(0, maxStartEnd - d.itemsPerViewport); let start = Math.min(maxStart, Math.floor(indexByScrollTop)); let topPadding = d.itemHeight * Math.ceil(start) - d.itemHeight * Math.min(start, buffer); topPadding = !isNaN(topPadding) ? topPadding : 0; start = !isNaN(start) ? start : -1; end = !isNaN(end) ? end : -1; start -= buffer; start = Math.max(0, start); end += buffer; end = Math.min(itemsLength, end); return { topPadding, scrollHeight, start, end, }; } setDimensions(itemHeight, panelHeight) { const itemsPerViewport = Math.max(1, Math.floor(panelHeight / itemHeight)); this._dimensions = { itemHeight, panelHeight, itemsPerViewport, }; } getScrollTo(itemTop, itemHeight, lastScroll) { const { panelHeight } = this.dimensions; const itemBottom = itemTop + itemHeight; const top = lastScroll; const bottom = top + panelHeight; if (panelHeight >= itemBottom && lastScroll === itemTop) { return null; } if (itemBottom > bottom) { return top + itemBottom - bottom; } else if (itemTop <= top) { return itemTop; } return null; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgDropdownPanelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgDropdownPanelService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgDropdownPanelService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZHJvcGRvd24tcGFuZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZy1zZWxlY3QvbGliL25nLWRyb3Bkb3duLXBhbmVsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFlM0MsTUFBTSxPQUFPLHNCQUFzQjtJQURuQztRQUVTLGdCQUFXLEdBQW9CO1lBQ3RDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsV0FBVyxFQUFFLENBQUM7WUFDZCxnQkFBZ0IsRUFBRSxDQUFDO1NBQ25CLENBQUM7S0E4REY7SUE1REEsSUFBSSxVQUFVO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxjQUFjLENBQUMsU0FBaUIsRUFBRSxXQUFtQixFQUFFLE1BQWM7UUFDcEUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMzQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUVoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4RixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQy9ELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBRTdELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFGLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixLQUFLLElBQUksTUFBTSxDQUFDO1FBQ2hCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQixHQUFHLElBQUksTUFBTSxDQUFDO1FBQ2QsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRWpDLE9BQU87WUFDTixVQUFVO1lBQ1YsWUFBWTtZQUNaLEtBQUs7WUFDTCxHQUFHO1NBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsVUFBa0IsRUFBRSxXQUFtQjtRQUNwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNsQixVQUFVO1lBQ1YsV0FBVztZQUNYLGdCQUFnQjtTQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFlLEVBQUUsVUFBa0IsRUFBRSxVQUFrQjtRQUNsRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQztRQUN2QixNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBRWpDLElBQUksV0FBVyxJQUFJLFVBQVUsSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBRUQsSUFBSSxVQUFVLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDekIsT0FBTyxHQUFHLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7WUFDM0IsT0FBTyxPQUFPLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQzs4R0FsRVcsc0JBQXNCO2tIQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1zUmFuZ2VSZXN1bHQge1xuXHRzY3JvbGxIZWlnaHQ6IG51bWJlcjtcblx0dG9wUGFkZGluZzogbnVtYmVyO1xuXHRzdGFydDogbnVtYmVyO1xuXHRlbmQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYW5lbERpbWVuc2lvbnMge1xuXHRpdGVtSGVpZ2h0OiBudW1iZXI7XG5cdHBhbmVsSGVpZ2h0OiBudW1iZXI7XG5cdGl0ZW1zUGVyVmlld3BvcnQ6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nRHJvcGRvd25QYW5lbFNlcnZpY2Uge1xuXHRwcml2YXRlIF9kaW1lbnNpb25zOiBQYW5lbERpbWVuc2lvbnMgPSB7XG5cdFx0aXRlbUhlaWdodDogMCxcblx0XHRwYW5lbEhlaWdodDogMCxcblx0XHRpdGVtc1BlclZpZXdwb3J0OiAwLFxuXHR9O1xuXG5cdGdldCBkaW1lbnNpb25zKCkge1xuXHRcdHJldHVybiB0aGlzLl9kaW1lbnNpb25zO1xuXHR9XG5cblx0Y2FsY3VsYXRlSXRlbXMoc2Nyb2xsUG9zOiBudW1iZXIsIGl0ZW1zTGVuZ3RoOiBudW1iZXIsIGJ1ZmZlcjogbnVtYmVyKTogSXRlbXNSYW5nZVJlc3VsdCB7XG5cdFx0Y29uc3QgZCA9IHRoaXMuX2RpbWVuc2lvbnM7XG5cdFx0Y29uc3Qgc2Nyb2xsSGVpZ2h0ID0gZC5pdGVtSGVpZ2h0ICogaXRlbXNMZW5ndGg7XG5cblx0XHRjb25zdCBzY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBzY3JvbGxQb3MpO1xuXHRcdGNvbnN0IGluZGV4QnlTY3JvbGxUb3AgPSAoc2Nyb2xsVG9wIC8gc2Nyb2xsSGVpZ2h0KSAqIGl0ZW1zTGVuZ3RoO1xuXHRcdGxldCBlbmQgPSBNYXRoLm1pbihpdGVtc0xlbmd0aCwgTWF0aC5jZWlsKGluZGV4QnlTY3JvbGxUb3ApICsgKGQuaXRlbXNQZXJWaWV3cG9ydCArIDEpKTtcblxuXHRcdGNvbnN0IG1heFN0YXJ0RW5kID0gZW5kO1xuXHRcdGNvbnN0IG1heFN0YXJ0ID0gTWF0aC5tYXgoMCwgbWF4U3RhcnRFbmQgLSBkLml0ZW1zUGVyVmlld3BvcnQpO1xuXHRcdGxldCBzdGFydCA9IE1hdGgubWluKG1heFN0YXJ0LCBNYXRoLmZsb29yKGluZGV4QnlTY3JvbGxUb3ApKTtcblxuXHRcdGxldCB0b3BQYWRkaW5nID0gZC5pdGVtSGVpZ2h0ICogTWF0aC5jZWlsKHN0YXJ0KSAtIGQuaXRlbUhlaWdodCAqIE1hdGgubWluKHN0YXJ0LCBidWZmZXIpO1xuXHRcdHRvcFBhZGRpbmcgPSAhaXNOYU4odG9wUGFkZGluZykgPyB0b3BQYWRkaW5nIDogMDtcblx0XHRzdGFydCA9ICFpc05hTihzdGFydCkgPyBzdGFydCA6IC0xO1xuXHRcdGVuZCA9ICFpc05hTihlbmQpID8gZW5kIDogLTE7XG5cdFx0c3RhcnQgLT0gYnVmZmVyO1xuXHRcdHN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQpO1xuXHRcdGVuZCArPSBidWZmZXI7XG5cdFx0ZW5kID0gTWF0aC5taW4oaXRlbXNMZW5ndGgsIGVuZCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wUGFkZGluZyxcblx0XHRcdHNjcm9sbEhlaWdodCxcblx0XHRcdHN0YXJ0LFxuXHRcdFx0ZW5kLFxuXHRcdH07XG5cdH1cblxuXHRzZXREaW1lbnNpb25zKGl0ZW1IZWlnaHQ6IG51bWJlciwgcGFuZWxIZWlnaHQ6IG51bWJlcikge1xuXHRcdGNvbnN0IGl0ZW1zUGVyVmlld3BvcnQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHBhbmVsSGVpZ2h0IC8gaXRlbUhlaWdodCkpO1xuXHRcdHRoaXMuX2RpbWVuc2lvbnMgPSB7XG5cdFx0XHRpdGVtSGVpZ2h0LFxuXHRcdFx0cGFuZWxIZWlnaHQsXG5cdFx0XHRpdGVtc1BlclZpZXdwb3J0LFxuXHRcdH07XG5cdH1cblxuXHRnZXRTY3JvbGxUbyhpdGVtVG9wOiBudW1iZXIsIGl0ZW1IZWlnaHQ6IG51bWJlciwgbGFzdFNjcm9sbDogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeyBwYW5lbEhlaWdodCB9ID0gdGhpcy5kaW1lbnNpb25zO1xuXHRcdGNvbnN0IGl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgaXRlbUhlaWdodDtcblx0XHRjb25zdCB0b3AgPSBsYXN0U2Nyb2xsO1xuXHRcdGNvbnN0IGJvdHRvbSA9IHRvcCArIHBhbmVsSGVpZ2h0O1xuXG5cdFx0aWYgKHBhbmVsSGVpZ2h0ID49IGl0ZW1Cb3R0b20gJiYgbGFzdFNjcm9sbCA9PT0gaXRlbVRvcCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1Cb3R0b20gPiBib3R0b20pIHtcblx0XHRcdHJldHVybiB0b3AgKyBpdGVtQm90dG9tIC0gYm90dG9tO1xuXHRcdH0gZWxzZSBpZiAoaXRlbVRvcCA8PSB0b3ApIHtcblx0XHRcdHJldHVybiBpdGVtVG9wO1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG4iXX0=