UNPKG

@uifabric/experiments

Version:

Experimental React components for building experiences for Microsoft 365.

191 lines (184 loc) 5.92 kB
import * as React from 'react'; import { ICalloutProps } from 'office-ui-fabric-react/lib/Callout'; import { IStyle } from '@uifabric/styling'; import { IFloatingSuggestionItemProps, IFloatingSuggestionOnRenderItemProps, IFloatingSuggestionItem, } from './FloatingSuggestionsItem/FloatingSuggestionsItem.types'; import { IRenderFunction, IRefObject } from '@uifabric/utilities'; import { IFloatingSuggestionsHeaderFooterProps } from './FloatingSuggestionsHeaderFooterItem/FloatingSuggestionsHeaderFooterItem.types'; /** * FloatingSuggestions component props * Type T is option data parameter to render custom suggestions */ export interface IBaseFloatingSuggestionsProps<T> { /** * Component reference in case needed to focus FloatingSuggestions */ componentRef?: IRefObject<HTMLDivElement>; /** * List of suggestions to be displayed with Type T */ suggestions: IFloatingSuggestionItem<T>[]; /** * This param decides whether to display suggestions or not * Must be set by parent component */ isSuggestionsVisible: boolean; /** * Custom component to render suggestion */ onRenderSuggestion?: (renderProps: IFloatingSuggestionOnRenderItemProps<T>) => JSX.Element; /** * Callback function on remove of suggestion from list */ onRemoveSuggestion?: (ev: React.MouseEvent<HTMLElement>, item: IFloatingSuggestionItemProps<T>) => void; /** * Callback function on selection of suggestion from list */ onSuggestionSelected?: (ev: React.MouseEvent<HTMLElement>, item: IFloatingSuggestionItemProps<T>) => void; /** * Custom header renderer which takes suggestions and headertext if passed * Going forward, this should accept the user defined type as parameter */ onRenderHeader?: (suggestionItems?: IFloatingSuggestionItemProps<T>[], suggestionsHeaderText?: string) => JSX.Element; /** * Custom footer renderer which takes suggestions as param * Going forward, this should accept the user defined type as param */ onRenderFooter?: (suggestionItems?: IFloatingSuggestionItemProps<T>[]) => JSX.Element; /** * Callback when the callout dismiss is called * When this callback is called parent comoponent must handle suggestion visibility */ onFloatingSuggestionsDismiss?: (ev?: React.MouseEvent) => void; /** * Option to show suggestion remove button * By default this is false */ showSuggestionRemoveButton?: boolean; /** * class name for the FloatingSuggestions div */ className?: string; /** * Target element here callout should be mounted * Pass the element current value to position the callout */ targetElement: HTMLInputElement | undefined | null; /** * Callout width */ calloutWidth?: number; /** * Callout props */ calloutProps?: ICalloutProps; /** * Class name for suggestion list container */ suggestionListClassName?: string; /** * Clas name for Suggestion item */ suggestionsItemClassName?: string; /** * Header text to display */ suggestionsHeaderText?: string; /** * Custom renderer when there are no results found */ onRenderNoResultFound?: IRenderFunction<void>; /** * Text to display when there are no results found */ noResultsFoundText?: string; /** * Maximum suggestions to how * Might not be used as showing suggestion must be by sending the suggestions */ maximumSuggestionsToShow?: number; /** * Aria label for suggestions container */ suggestionsContainerAriaLabel?: string; /** * Aria label for suggestions list container */ suggestionListAriaLabel?: string; /** * Aria label for suggestion remove button */ removeItemButtonAriaLabel?: string; /** * Index to indicate the selected suggestion * This logic must be driven by parent component by setting isSelected in data model * There should be no logic to handle this in Suggestion component as the focus is never on this component */ selectedSuggestionIndex?: number; /** * If set, the picker will be this width. If not, picker will be as wide as necessary * to fully display input values. */ pickerWidth?: string; /** * Arrow key callback */ onKeyDown?: (ev: React.KeyboardEvent<HTMLElement>) => void; /** * The properties used for selectable headers and footers * takes precedence over onRenderHeader and onRenderFooter */ pickerSuggestionsProps?: IBaseFloatingPickerHeaderFooterProps; /** * Index to indicate the selected header * This logic must be driven by parent component * Should be used with the headerItemProps on the pickerSuggestionProps */ selectedHeaderIndex?: number; /** * Index to indicate the selected footer * This logic must be driven by parent component * Should be used with the footerItemProps on the pickerSuggestionProps */ selectedFooterIndex?: number; /** * A callback for when the floating suggestions are shown */ onSuggestionsShown?: () => void; /** * A callback for when the floating suggestions are hidden (on dismiss or selection) */ onSuggestionsHidden?: () => void; } export interface IBaseFloatingPickerHeaderFooterProps { /** * An ARIA label for the container that is the parent of the suggestions header items. */ suggestionsHeaderContainerAriaLabel?: string; /** * An ARIA label for the container that is the parent of the suggestions footer items. */ suggestionsFooterContainerAriaLabel?: string; /** * The header items props */ headerItemsProps?: IFloatingSuggestionsHeaderFooterProps[]; /** * The footer items props */ footerItemsProps?: IFloatingSuggestionsHeaderFooterProps[]; } /** * FLoatingSuggestions style props */ export interface IBaseFloatingSuggestionsStylesProps {} /** * FLoatingSuggestions styles */ export interface IBaseFloatingSuggestionsStyles { root: IStyle; callout: IStyle; }