UNPKG

office-ui-fabric-react

Version:

Reusable React components for building experiences for Microsoft 365.

255 lines (254 loc) • 10.4 kB
import * as React from 'react'; import { IPickerItemProps } from './PickerItem.types'; import { IRefObject, IStyleFunctionOrObject } from '../../Utilities'; import { ISuggestionModel, ISuggestionsProps } from './Suggestions/Suggestions.types'; import { Autofill } from '../../Autofill'; import { ICalloutProps } from '../../Callout'; import { ITheme, IStyle } from '../../Styling'; import { ISuggestionItemProps } from '../pickers/Suggestions/SuggestionsItem.types'; /** * BasePicker component. * {@docCategory Pickers} */ export interface IBasePicker<T> { /** Gets the current value of the input. */ items: T[] | undefined; /** Sets focus to the focus zone. */ focus: () => void; /** Set focus to the input */ focusInput: () => void; /** * When called, will take the currently selected suggestion and complete it. * If called with forceComplete true, it will attempt to force the current suggestion * to complete, must provide both createGenericSuggestion, so the text can be turned into * an object in the right shape, and onValidateInput, so the object knows if it's correct or not. */ completeSuggestion: (forceComplete?: boolean) => void; } /** * Type T is the type of the item that is displayed * and searched for by the picker. For example, if the picker is * displaying persona's then type T could either be of Persona or IPersona props * {@docCategory Pickers} */ export interface IBasePickerProps<T> extends React.Props<any> { /** * Optional callback to access the IBasePicker interface. Use this instead of ref for accessing * the public methods and properties of the component. */ componentRef?: IRefObject<IBasePicker<T>>; /** * Function that specifies how the selected item will appear. */ onRenderItem?: (props: IPickerItemProps<T>) => JSX.Element; /** * Function that specifies how an individual suggestion item will appear. */ onRenderSuggestionsItem?: (props: T, itemProps: ISuggestionItemProps<T>) => JSX.Element; /** * A callback for what should happen when a person types text into the input. * Returns the already selected items so the resolver can filter them out. * If used in conjunction with resolveDelay this will only kick off after the delay throttle. */ onResolveSuggestions: (filter: string, selectedItems?: T[]) => T[] | PromiseLike<T[]>; /** * The delay time in ms before resolving suggestions, which is kicked off when input has been changed. * e.g. If a second input change happens within the resolveDelay time, the timer will start over. * Only until after the timer completes will onResolveSuggestions be called. */ resolveDelay?: number; /** * A callback for what should happen when a user clicks within the input area. * @deprecated Please use onEmptyResolveSuggestions instead, as the suggestions aren't about * setting focus as they are about resolving suggestions when there is no input. */ onEmptyInputFocus?: (selectedItems?: T[]) => T[] | PromiseLike<T[]>; /** * A callback for what should happen when suggestions are shown without * input provided. * Returns the already selected items so the resolver can filter them out. * If used in conjunction with resolveDelay this will only kick off after the delay throttle. */ onEmptyResolveSuggestions?: (selectedItems?: T[]) => T[] | PromiseLike<T[]>; /** * Initial items that have already been selected and should appear in the people picker. */ defaultSelectedItems?: T[]; /** * A callback for when the selected list of items changes. */ onChange?: (items?: T[]) => void; /** * A callback for when the user put focus on the picker * @deprecated Use `inputProps.onFocus` instead */ onFocus?: React.FocusEventHandler<HTMLInputElement | Autofill>; /** * A callback for when the user moves the focus away from the picker */ onBlur?: React.FocusEventHandler<HTMLInputElement | Autofill>; /** * A callback to get text from an item. Used to autofill text in the pickers. */ getTextFromItem?: (item: T, currentValue?: string) => string; /** * A callback that gets the rest of the results when a user clicks get more results. */ onGetMoreResults?: (filter: string, selectedItems?: T[]) => T[] | PromiseLike<T[]>; /** * ClassName for the picker. */ className?: string; /** * The properties that will get passed to the Suggestions component. */ pickerSuggestionsProps?: IBasePickerSuggestionsProps; /** * The properties that will get passed to the Callout component. */ pickerCalloutProps?: ICalloutProps; /** * AutoFill input native props * @defaultvalue undefined */ inputProps?: IInputProps; /** * A callback for when an item is removed from the suggestion list */ onRemoveSuggestion?: (item: T) => void; /** * A function used to validate if raw text entered into the well can be added into the selected items list */ onValidateInput?: (input: string) => ValidationState; /** * The text to display while searching for more results in a limited suggestions list */ searchingText?: ((props: { input: string; }) => string) | string; /** * Flag for disabling the picker. * @defaultvalue false */ disabled?: boolean; /** * Restrict the amount of selectable items. * @defaultvalue undefined */ itemLimit?: number; /** * Function that specifies how arbitrary text entered into the well is handled. */ createGenericItem?: (input: string, ValidationState: ValidationState) => ISuggestionModel<T> | T; /** * Aria label for the "X" button in the selected item component. * @defaultvalue '' */ removeButtonAriaLabel?: string; /** * Aria label for the picker component. Will be applied to the element with role="combobox" * If it's supplied, the input element with also have aria-labelledby added and point to the * element with role=combobox * @defaultvalue undefined */ ['aria-label']?: string; /** * A callback to process a selection after the user selects something from the picker. If the callback returns null, * the item will not be added to the picker. */ onItemSelected?: (selectedItem?: T) => T | PromiseLike<T> | null; /** * The items that the base picker should currently display as selected. * If this is provided then the picker will act as a controlled component. */ selectedItems?: T[]; /** * A callback used to modify the input string. */ onInputChange?: (input: string) => string; /** * A callback to override the default behavior of adding the selected suggestion on dismiss. If it returns true or * nothing, the selected item will be added on dismiss. If false, the selected item will not be added on dismiss. * */ onDismiss?: (ev?: any, selectedItem?: T) => boolean | void; /** * Adds an additional alert for the currently selected suggestion. This prop should be set to true for IE11 and below, * as it enables proper screen reader behavior for each suggestion (since aria-activedescendant does not work * with IE11). It should not be set for modern browsers (Edge, Chrome). * @defaultvalue false */ enableSelectedSuggestionAlert?: boolean; /** * Call to provide customized styling that will layer on top of the variant rules. */ styles?: IStyleFunctionOrObject<IBasePickerStyleProps, IBasePickerStyles>; /** * Theme provided by styled() function. */ theme?: ITheme; } /** * Subset of picker options that may be legally passed through a picker to its * internal Suggestions component. * {@docCategory Pickers} */ export interface IBasePickerSuggestionsProps<T = any> extends Pick<ISuggestionsProps<T>, 'onRenderNoResultFound' | 'suggestionsHeaderText' | 'mostRecentlyUsedHeaderText' | 'noResultsFoundText' | 'className' | 'suggestionsClassName' | 'suggestionsItemClassName' | 'searchForMoreIcon' | 'searchForMoreText' | 'forceResolveText' | 'loadingText' | 'searchingText' | 'resultsFooterFull' | 'resultsFooter' | 'resultsMaximumNumber' | 'showRemoveButtons' | 'suggestionsAvailableAlertText' | 'suggestionsContainerAriaLabel' | 'showForceResolve'> { } /** * Validation state of the user's input. * {@docCategory Pickers} */ export declare enum ValidationState { /** User input is valid. */ valid = 0, /** User input could be valid or invalid, its state is not known yet. */ warning = 1, /** User input is invalid. */ invalid = 2 } /** * Pickers' input props interface * {@docCategory Pickers} */ export interface IInputProps extends React.InputHTMLAttributes<HTMLInputElement> { /** * Screen reader label to apply to an input element. */ 'aria-label'?: string; /** * The default value to be visible when the autofill first created. * This is different than placeholder text because the placeholder text will disappear and re-appear. This * text persists until deleted or changed. */ defaultVisibleValue?: string; } /** * The props needed to construct styles. * {@docCategory Pickers} */ export declare type IBasePickerStyleProps = Pick<IBasePickerProps<any>, 'theme' | 'className' | 'disabled'> & { /** Whether text style area is focused */ isFocused?: boolean; /** Optional pickerInput className */ inputClassName?: string; }; /** * Represents the stylable areas of the control. * {@docCategory Pickers} */ export interface IBasePickerStyles { /** Root element of any picker extending from BasePicker (wraps all the elements). */ root: IStyle; /** * Refers to the elements already selected (picked) wrapped by `itemsWrapper` along with the input to type * a new selection. */ text: IStyle; /** Refers to the items already selected (picked). */ itemsWrapper: IStyle; /** Refers to the input were to type new selections (picks). */ input: IStyle; /** Refers to helper element used for accessibility tools (hidden from view on screen). */ screenReaderText: IStyle; }