Fixed #1836 - For VirtualScroller

pull/1846/head
mertsincan 2021-12-02 00:14:58 +03:00
parent 3ca3ab8f17
commit 4ff39e208b
1 changed files with 244 additions and 48 deletions

View File

@ -1,74 +1,270 @@
interface VirtualScrollerProps {
items?: any[]|any[][];
itemSize?: number|any[];
scrollHeight?: string;
scrollWidth?: string;
orientation?: string;
numToleratedItems?: number;
delay?: number;
lazy?: boolean;
showLoader?: boolean;
loading?: boolean;
style?: any;
class?: string;
}
import { VNode } from 'vue';
import { ClassComponent, GlobalComponentConstructor } from '../ts-helpers';
interface VirtualScrollerRangeMethodInterface {
type VirtualScrollerItemsType = any[] | any[][] | undefined | null;
type VirtualScrollerItemSizeType = number | number[];
type VirtualScrollerOrientationType = 'vertical' | 'horizontal' | 'both';
type VirtualScrollerToType = 'to-start' | 'to-end';
export interface VirtualScrollerScrollIndexChangeEvent {
/**
* First index of the new data range to be loaded.
*/
first: number;
/**
* Last index of the new data range to be loaded.
*/
last: number;
viewport: {
first: number;
last: number;
}
}
interface VirtualScrollerGetItemOptionsInterface {
index: number;
count: number;
/**
* @extends VirtualScrollerScrollIndexChangeEvent
*/
export interface VirtualScrollerLazyEvent extends VirtualScrollerScrollIndexChangeEvent { }
/**
* @extends VirtualScrollerScrollIndexChangeEvent
*/
export interface VirtualScrollerViewport extends VirtualScrollerScrollIndexChangeEvent { }
export interface VirtualScrollerRangeMethod {
/**
* Whether the item is first.
*/
first: number;
/**
* Whether the item is last.
*/
last: number;
even: number;
odd: number;
/**
* Viewport info.
* @see VirtualScrollerViewport
*/
viewport: VirtualScrollerViewport;
}
interface VirtualScrollerGetLoaderOptionsInterface {
export interface VirtualScrollerGetLoaderOptions {
/**
* Whether the loader is active.
*/
loading: boolean;
/**
* Whether the item is first.
*/
first: number;
/**
* Whether the item is last.
*/
last: number;
/**
* Whether the item is even.
*/
even: number;
/**
* Whether the item is odd.
*/
odd: number;
}
interface VirtualScrollerContentSlotInterface {
contentRef: string;
styleClass: string;
items: any[];
getItemOptions: VirtualScrollerGetItemOptionsInterface;
export interface VirtualScrollerItemOptions {
/**
* Item index
*/
index: number;
/**
* Items count
*/
count: number;
/**
* Whether the item is first.
*/
first: number;
/**
* Whether the item is first.
*/
last: number;
/**
* Whether the item is even.
*/
even: number;
/**
* Whether the item is odd.
*/
odd: number;
}
interface VirtualScrollerItemSlotInterface {
item: any;
options: VirtualScrollerGetItemOptionsInterface;
export interface VirtualScrollerProps {
/**
* An array of objects to display.
*/
items?: VirtualScrollerItemsType;
/**
* The height/width of item according to orientation.
*/
itemSize?: VirtualScrollerItemSizeType;
/**
* Height of the scroll viewport.
*/
scrollHeight?: string | undefined;
/**
* Width of the scroll viewport.
*/
scrollWidth?: string | undefined;
/**
* The orientation of scrollbar.
* @see VirtualScrollerOrientationType
* Default value is 'vertical'.
*/
orientation?: VirtualScrollerOrientationType;
/**
* Determines how many additional elements to add to the DOM outside of the view.
* According to the scrolls made up and down, extra items are added in a certain algorithm in the form of multiples of this number.
* Default value is half the number of items shown in the view.
*/
numToleratedItems?: number | undefined;
/**
* Delay in scroll before new data is loaded.
* Default value is 0.
*/
delay?: number | undefined;
/**
* Defines if data is loaded and interacted with in lazy manner.
*/
lazy?: boolean | undefined;
/**
* Whether to show loader.
*/
showLoader?: boolean | undefined;
/**
* Whether to load items.
*/
loading?: boolean | undefined;
/**
* Inline style of the component.
*/
style?: any;
/**
* Style class of the component.
*/
class?: string | undefined;
}
interface VirtualScrollerLoaderSlotInterface {
options: VirtualScrollerGetLoaderOptionsInterface;
export interface VirtualScrollerSlots {
/**
* Custom content template.
* @param {Object} scope - content slot's params.
*/
content: (scope: {
/**
* An array of objects to display for virtualscroller
*/
items: any;
/**
* Style class of the component
*/
styleClass: string;
/**
* Referance of the content
* @param {HTMLElement} el - Element of 'ref' property
*/
contentRef(el: any): void;
/**
* Options of the items
* @param {number} index - Rendered index
* @return {@link VirtualScroller.VirtualScrollerItemOptions}
*/
getItemOptions(index: number): VirtualScrollerItemOptions;
}) => VNode[];
/**
* Custom item template.
* @param {Object} scope - item slot's params.
*/
item: (scope: {
/**
* Item data.
*/
item: any;
/**
* Item options.
*/
options: VirtualScrollerItemOptions;
}) => VNode[];
/**
* Custom loader template.
* @param {Object} scope - header slot's params.
*/
loader: (scope: {
/**
* Loader options.
*/
options: VirtualScrollerGetLoaderOptions;
}) => VNode[];
}
declare class VirtualScroller {
$props: VirtualScrollerProps;
export declare type VirtualScrollerEmits = {
/**
* Emitted when the numToleratedItems changes.
* @param {number} value - New number tolerated items
*/
'update:numToleratedItems': (value: number) => void;
/**
* Callback to invoke when scroll position changes.
* @param {Event} event - Browser event.
*/
'scroll': (event: Event) => void;
/**
* Callback to invoke when scroll position and item's range in view changes.
* @param {AccordionTabOpenEvent} event - Custom tab open event.
*/
'scroll-index-change': (event: VirtualScrollerScrollIndexChangeEvent) => void;
/**
* Callback to invoke in lazy mode to load new data.
* @param {VirtualScrollerLazyEvent} event - Custom lazy event.
*/
'lazy-load': (event: VirtualScrollerLazyEvent) => void;
}
declare class VirtualScroller extends ClassComponent<VirtualScrollerProps, VirtualScrollerSlots, VirtualScrollerEmits> {
/**
* Scroll to move to a specific position.
* @param {ScrollToOptions} [options] - scoll options.
*/
scrollTo(options?: ScrollToOptions): void;
scrollToIndex(index: number, behavior: ScrollBehavior): void;
scrollInView(index: number, to: "to-start" | "to-end", behavior: ScrollBehavior): void;
getRenderedRange(): VirtualScrollerRangeMethodInterface;
$emit(eventName: 'update:numToleratedItems', value: number): this;
$emit(eventName: 'scroll-index-change', value: { first: number, last: number }): this;
$emit(eventName: 'lazy-load', value: { first: number, last: number }): this;
$slots: {
content: VirtualScrollerContentSlotInterface;
item: VirtualScrollerItemSlotInterface;
loader: VirtualScrollerLoaderSlotInterface;
/**
* Scroll to move to a specific item.
* @param {number} index - Index of item according to orientation mode.
* @param {ScrollBehavior} [behavior] - Behavior of scroll.
*/
scrollToIndex(index: number, behavior?: ScrollBehavior): void;
/**
* It is used to move the specified index into the view. It is a method that will usually be needed when keyboard support is added to the virtualScroller component.
* @param {number} index - Index of item according to orientation mode.
* @param {VirtualScrollerToType} to - Defines the location of the item in view,
* @param {ScrollBehavior} [behavior] Behavior of scroll
*/
scrollInView(index: number, to: VirtualScrollerToType, behavior?: ScrollBehavior): void;
/**
* Returns the range of items added to the DOM.
*/
getRenderedRange(): VirtualScrollerRangeMethod;
}
declare module '@vue/runtime-core' {
interface GlobalComponents {
VirtualScroller: GlobalComponentConstructor<VirtualScroller>
}
}
/**
*
* VirtualScroller is a performant approach to handle huge data efficiently.
*
* Demos:
*
* - [VirtualScroller](https://www.primefaces.org/primevue/showcase/#/virtualscroller)
*
*/
export default VirtualScroller;