UNPKG

office-ui-fabric-react

Version:

Reusable React components for building experiences for Microsoft 365.

252 lines (251 loc) • 9.56 kB
import * as React from 'react'; import { IRefObject, IRenderFunction, KeyCodes, IStyleFunctionOrObject } from '../../../Utilities'; import { IPersonaProps } from '../../Persona/Persona.types'; import { IStyle, ITheme } from '../../../Styling'; import { ISpinnerStyleProps } from '../../Spinner/Spinner.types'; import { ISuggestionItemProps } from './SuggestionsItem.types'; import { IIconProps } from '../../Icon/Icon.types'; /** * Suggestions component. * {@docCategory Pickers} */ export interface ISuggestions<T> { /** Execute the action selected. Can be SearchMore or ForceResolve actions. */ executeSelectedAction: () => void; /** Focus on the ForceResolve action above the suggestions. If not available then focus on SearchMore action. */ focusAboveSuggestions: () => void; /** Focus on the SearchMore action below the suggestions. If not available then focus on ForceResolve action. */ focusBelowSuggestions: () => void; /** Focus the SearchMore action button. */ focusSearchForMoreButton: () => void; /** Whether it has any suggested actions like ForceResolve or SearchMore. */ hasSuggestedAction: () => boolean; /** Whether any of the suggested actions (ForceResolve or SearchMore) is selected. */ hasSuggestedActionSelected: () => boolean; /** Returns true if the event was handled, false otherwise. */ tryHandleKeyDown: (keyCode: number, currentSuggestionIndex: number) => boolean; } /** * Suggestions props interface. Refers to the entire container holding all the suggestions. * Type T is the type of the items that are displayed. * {@docCategory Pickers} */ export interface ISuggestionsProps<T> extends React.Props<any> { /** * Optional callback to access the ISuggestions interface. Use this instead of ref for accessing * the public methods and properties of the component. */ componentRef?: IRefObject<ISuggestions<T>>; /** * How the suggestion should look in the suggestion list. */ onRenderSuggestion: (props: T, suggestionItemProps: ISuggestionItemProps<T>) => JSX.Element; /** * What should occur when a suggestion is clicked */ onSuggestionClick: (ev?: React.MouseEvent<HTMLElement>, item?: any, index?: number) => void; /** * The list of Suggestions that will be displayed */ suggestions: ISuggestionModel<T>[]; /** * How the "no result found" should look in the suggestion list. */ onRenderNoResultFound?: IRenderFunction<void>; /** * The text that appears at the top of the suggestions list. */ suggestionsHeaderText?: string; /** * The text that should appear at the top of the most recently used box. */ mostRecentlyUsedHeaderText?: string; /** * The icon that appears indicating to the user that they can search for more results. */ searchForMoreIcon?: IIconProps; /** * The text that appears indicating to the user that they can search for more results. */ searchForMoreText?: string; /** * The callback that should be called when the user attempts to get more results */ onGetMoreResults?: () => void; /** * The text that appears indicating to the use to force resolve the input */ forceResolveText?: string; /** * The callback that should be called to see if the force resolve command should be shown */ showForceResolve?: () => boolean; /** * The callback that should be called when the user attempts to use the input text as as item */ createGenericItem?: () => void; /** * The CSS className of the suggestions root. */ className?: string; /** * The CSS className of the suggestions list */ suggestionsClassName?: string; /** * The text that should appear if there is a search error. * * @deprecated Use noResultsFoundText instead. */ searchErrorText?: string; /** * The text that should appear if no results are found when searching. */ noResultsFoundText?: string; /** * The className of the suggestion item. */ suggestionsItemClassName?: string; /** * Used to indicate whether or not the user can request more suggestions. * Dictates whether or not the searchForMore button is displayed. */ moreSuggestionsAvailable?: boolean; /** * Used to indicate whether or not the suggestions are loading. */ isLoading?: boolean; /** * Used to indicate whether or not the component is searching for more results. */ isSearching?: boolean; /** * The text to display while the results are loading. */ loadingText?: string; /** * The text to display while searching for more results in a limited suggestions list. */ searchingText?: string; /** * Indicates if a short list of recent suggestions should be shown. */ isMostRecentlyUsedVisible?: boolean; /** * Function to fire when one of the optional remove buttons on a suggestion is clicked. * * TODO (adjective-object) remove IPersonaprops before the next major version bump */ onSuggestionRemove?: (ev?: React.MouseEvent<HTMLElement>, item?: T | IPersonaProps, index?: number) => void; /** * Indicates if the text in resultsFooter or resultsFooterFull should be shown at the end of the suggestion list. * @defaultvalue true */ isResultsFooterVisible?: boolean; /** * Maximum number of suggestions to show in the full suggestion list. */ resultsMaximumNumber?: number; /** * A renderer that adds an element at the end of the suggestions list it has more items than resultsMaximumNumber. */ resultsFooterFull?: (props: ISuggestionsProps<T>) => JSX.Element; /** * A renderer that adds an element at the end of the suggestions list it has fewer items than resultsMaximumNumber. */ resultsFooter?: (props: ISuggestionsProps<T>) => JSX.Element; /** * Indicates whether to show a button with each suggestion to remove that suggestion. */ showRemoveButtons?: boolean; /** * Screen reader message to read when there are suggestions available. */ suggestionsAvailableAlertText?: string; /** * A function that resets focus to the expected item in the suggestion list */ refocusSuggestions?: (keyCode: KeyCodes) => void; /** * An ARIA label for the container that is the parent of the suggestions. */ suggestionsContainerAriaLabel?: string; /** * An ARIA label to use for the buttons to remove individual suggestions. */ removeSuggestionAriaLabel?: string; /** * The string that will be used as the suggestionsListId. * Will be used by the BasePicker to keep track of the list for aria. */ suggestionsListId?: string; /** Call to provide customized styling that will layer on top of the variant rules. */ styles?: IStyleFunctionOrObject<any, any>; /** Theme provided by High-Order Component. */ theme?: ITheme; } /** * The props needed to construct Suggestions styles. * {@docCategory Pickers} */ export declare type ISuggestionsStyleProps = Required<Pick<ISuggestionsProps<any>, 'theme'>> & Pick<ISuggestionsProps<any>, 'className' | 'suggestionsClassName'> & { /** Whether the forceResolve actionButton is selected. */ forceResolveButtonSelected?: boolean; /** Whether the searchForMore actionButton is selected. */ searchForMoreButtonSelected?: boolean; }; /** * Represents the stylable areas of the Suggestions. * {@docCategory Pickers} */ export interface ISuggestionsStyles { /** Root element of the suggestions outer wrapper. */ root: IStyle; /** Refers to the suggestions container. */ suggestionsContainer: IStyle; /** Refers to the title rendered for suggestions container header and/or footer (if provided). */ title: IStyle; /** Refers to the 'Force resolve' actionButton. */ forceResolveButton: IStyle; /** Refers to the 'Search for more' actionButton. */ searchForMoreButton: IStyle; /** Refers to the text rendered when no suggestions are found. */ noSuggestions: IStyle; /** Refers to the text displaying if more suggestions available. */ suggestionsAvailable: IStyle; /** SubComponents (Spinner) styles. */ subComponentStyles: ISuggestionsSubComponentStyles; } /** * Styles interface of the SubComponents rendered within PeoplePickerItemSelected. * {@docCategory Pickers} */ export interface ISuggestionsSubComponentStyles { /** Refers to the Spinner rendered within the Suggestions when searching or loading suggestions. */ spinner: IStyleFunctionOrObject<ISpinnerStyleProps, any>; } /** * SuggestionModel interface. * Type T is the type of the item that is suggested (Persona, Tag or any other custom picker). * {@docCategory Pickers} */ export interface ISuggestionModel<T> { /** The suggested item of the type T */ item: T; /** Whether the suggested item is selected or not. */ selected: boolean; /** Aria-label string for each suggested item. */ ariaLabel?: string; } /** * Enum to help identify which suggestions action button is selected. * {@docCategory Pickers} */ export declare enum SuggestionActionType { /** None of the actions is selected. */ none = 0, /** ForceResolve action is selected. */ forceResolve = 1, /** SearchMore action is selected. */ searchMore = 2 }