Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
private _scrollToOption(): void {
const index = this.autocomplete._keyManager.activeItemIndex || 0;
const labelCount = _countGroupLabelsBeforeOption(index,
this.autocomplete.options, this.autocomplete.optionGroups);
if (index === 0 && labelCount === 1) {
// If we've got one group label before the option and we're at the top option,
// scroll the list to the top. This is better UX than scrolling the list to the
// top of the option, because it allows the user to read the top group's label.
this.autocomplete._setScrollTop(0);
} else {
const newScrollPosition = _getOptionScrollPosition(
index + labelCount,
AUTOCOMPLETE_OPTION_HEIGHT,
this.autocomplete._getScrollTop(),
AUTOCOMPLETE_PANEL_HEIGHT
);
this.autocomplete._setScrollTop(newScrollPosition);
private _calculateOverlayPosition(): void {
const itemHeight = this._getItemHeight();
const items = this._getItemCount();
const panelHeight = Math.min(items * itemHeight, SELECT_PANEL_MAX_HEIGHT);
const scrollContainerHeight = items * itemHeight;
// The farthest the panel can be scrolled before it hits the bottom
const maxScroll = scrollContainerHeight - panelHeight;
// If no value is selected we open the popup to the first item.
let selectedOptionOffset =
this.empty ? 0 : this._getOptionIndex(this._selectionModel.selected[0])!;
selectedOptionOffset += _countGroupLabelsBeforeOption(selectedOptionOffset, this.options,
this.optionGroups);
// We must maintain a scroll buffer so the selected option will be scrolled to the
// center of the overlay panel rather than the top.
const scrollBuffer = panelHeight / 2;
this._scrollTop = this._calculateOverlayScroll(selectedOptionOffset, scrollBuffer, maxScroll);
this._offsetY = this._calculateOverlayOffsetY(selectedOptionOffset, scrollBuffer, maxScroll);
this._checkOverlayWithinViewport(maxScroll);
}
private _scrollActiveOptionIntoView(): void {
const activeOptionIndex = this._keyManager.activeItemIndex || 0;
const labelCount = _countGroupLabelsBeforeOption(activeOptionIndex, this.options,
this.optionGroups);
this.panel.nativeElement.scrollTop = _getOptionScrollPosition(
activeOptionIndex + labelCount,
this._getItemHeight(),
this.panel.nativeElement.scrollTop,
SELECT_PANEL_MAX_HEIGHT
);
}