office-ui-fabric-react
Version:
Reusable React components for building experiences for Office 365.
303 lines (302 loc) • 10.7 kB
TypeScript
import * as React from 'react';
import { IIconProps } from '../../Icon';
import { ISelectableOption } from '../../utilities/selectableOption/SelectableOption.types';
import { ISelectableDroppableTextProps } from '../../utilities/selectableOption/SelectableDroppableText.types';
import { IStyle, ITheme } from '../../Styling';
import { IButtonStyles } from '../../Button';
import { IRefObject, IRenderFunction } from '../../Utilities';
import { IComboBoxClassNames } from './ComboBox.classNames';
import { IKeytipProps } from '../../Keytip';
import { IAutofillProps } from '../pickers/AutoFill/BaseAutoFill.types';
import { IButtonProps } from '../Button/Button.types';
/**
* {@docCategory ComboBox}
*/
export interface IComboBox {
/**
* All selected options
*/
readonly selectedOptions: IComboBoxOption[];
/**
* If there is a menu open this will dismiss the menu
*/
dismissMenu: () => void;
/**
* Sets focus to the input in the comboBox
* @param shouldOpenOnFocus - Determines if we should open the ComboBox menu when the input gets focus
* @param useFocusAsync - Determines if we should focus the input asynchronously
* @returns True if focus could be set, false if no operation was taken.
*/
focus(shouldOpenOnFocus?: boolean, useFocusAsync?: boolean): boolean;
}
/**
* {@docCategory ComboBox}
*/
export interface IComboBoxOption extends ISelectableOption {
/**
* Specific styles for each comboBox option. If you intend to give
* common styles to all comboBox option please use
* the prop comboBoxOptionStyles
*/
styles?: Partial<IComboBoxOptionStyles>;
/**
* In scenarios where embedded data is used at the text prop, we will use the ariaLabel prop
* to set the aria-label and preview text. Default to false
* @defaultvalue false;
*/
useAriaLabelAsText?: boolean;
}
/**
* {@docCategory ComboBox}
*/
export interface IComboBoxProps extends ISelectableDroppableTextProps<IComboBox, IComboBox> {
/**
* Optional callback to access the IComboBox interface. Use this instead of ref for accessing
* the public methods and properties of the component.
*/
componentRef?: IRefObject<IComboBox>;
/**
* Collection of options for this ComboBox
*/
options: IComboBoxOption[];
/**
* Callback issued when a ComboBox item is clicked.
*/
onItemClick?: (event: React.FormEvent<IComboBox>, option?: IComboBoxOption, index?: number) => void;
/**
* Callback issued when either:
* 1) the selected option changes
* 2) a manually edited value is submitted. In this case there may not be a matched option if allowFreeform is also true
* (and hence only value would be true, the other parameter would be null in this case)
*/
onChange?: (event: React.FormEvent<IComboBox>, option?: IComboBoxOption, index?: number, value?: string) => void;
/**
* Callback issued when the user changes the pending value in ComboBox
*/
onPendingValueChanged?: (option?: IComboBoxOption, index?: number, value?: string) => void;
/**
* Function that gets invoked when the ComboBox menu is launched
*/
onMenuOpen?: () => void;
/**
* Function that gets invoked when the ComboBox menu is dismissed
*/
onMenuDismissed?: () => void;
/**
* Function that gets invoked before the menu gets dismissed
*/
onMenuDismiss?: () => void;
/**
* Callback issued when the options should be resolved, if they have been updated or
* if they need to be passed in the first time
*/
onResolveOptions?: (options: IComboBoxOption[]) => IComboBoxOption[] | PromiseLike<IComboBoxOption[]>;
/**
* Callback issued when the ComboBox requests the list to scroll to a specific element
*/
onScrollToItem?: (itemIndex: number) => void;
/**
* Whether the ComboBox is free form, meaning that the user input is not bound to provided options. Defaults to false.
*/
allowFreeform?: boolean;
/**
* Whether the ComboBox auto completes. As the user is inputing text, it will be suggested potential matches from the list of options. If
* the combo box is expanded, this will also scroll to the suggested option, and give it a selected style.
*
* @defaultvalue "on"
*/
autoComplete?: 'on' | 'off';
/**
* Value to show in the input, does not have to map to a combobox option
*/
text?: string;
/**
* The IconProps to use for the button aspect of the combobox
*/
buttonIconProps?: IIconProps;
/**
* The AutofillProps to be passed into the Autofill component inside combobox
*/
autofill?: IAutofillProps;
/**
* Theme provided by HOC.
*/
theme?: ITheme;
/**
* Custom styles for this component
*/
styles?: Partial<IComboBoxStyles>;
/**
* Custom function for providing the classNames for the ComboBox. Can be used to provide
* all styles for the component instead of applying them on top of the default styles.
*/
getClassNames?: (theme: ITheme, isOpen: boolean, disabled: boolean, required: boolean, focused: boolean, allowFreeForm: boolean, hasErrorMessage: boolean, className?: string) => IComboBoxClassNames;
/**
* Styles for the caret down button.
*/
caretDownButtonStyles?: Partial<IButtonStyles>;
/**
* Default styles that should be applied to ComboBox options,
* in case an option does not come with user-defined custom styles
*/
comboBoxOptionStyles?: Partial<IComboBoxOptionStyles>;
/**
* When options are scrollable the selected option is positioned at the top of the callout when it is opened
* (unless it has reached the end of the scrollbar).
* @defaultvalue false;
*/
scrollSelectedToTop?: boolean;
/**
* Add additional content below the callout list.
*/
onRenderLowerContent?: IRenderFunction<IComboBoxProps>;
/**
* Custom width for dropdown (unless useComboBoxAsMenuWidth is undefined or false)
*/
dropdownWidth?: number;
/**
* Whether to use the ComboBoxes width as the menu's width
*/
useComboBoxAsMenuWidth?: boolean;
/**
* Custom max width for dropdown
*/
dropdownMaxWidth?: number;
/**
* Optional mode indicates if multi-choice selections is allowed. Default to false
*/
multiSelect?: boolean;
/**
* Sets the 'aria-hidden' attribute on the ComboBox's button element instructing screen readers how to handle the element.
* This element is hidden by default because all functionality is handled by the input element and the arrow button is
* only meant to be decorative.
* @defaultvalue true
*/
isButtonAriaHidden?: boolean;
/**
* Optional prop to add a string id that can be referenced inside the aria-describedby attribute
*/
ariaDescribedBy?: string;
/**
* Optional keytip for this combo box
*/
keytipProps?: IKeytipProps;
/**
* Menu will not be created or destroyed when opened or closed, instead it
* will be hidden. This will improve perf of the menu opening but could potentially
* impact overall perf by having more elemnts in the dom. Should only be used
* when perf is important.
* Note: This may increase the amount of time it takes for the comboBox itself to mount.
*/
persistMenu?: boolean;
/**
* When specified, determines whether the callout (the menu which drops down) should
* restore the focus after being dismissed or not. If false, then the menu will not try
* to set focus to whichever element had focus before the menu was opened.
* @defaultvalue true;
*/
shouldRestoreFocus?: boolean;
/**
* Optional iconButton props on combo box
*/
iconButtonProps?: IButtonProps;
}
/**
* {@docCategory ComboBox}
*/
export interface IComboBoxStyles {
/**
* Style for the container which has the ComboBox and the label
*/
container: IStyle;
/**
* Style for the label element of the ComboBox.
*/
label: IStyle;
/**
* Style for the label element of the ComboBox in the disabled state.
*/
labelDisabled: IStyle;
/**
* Base styles for the root element of all ComboBoxes.
*/
root: IStyle;
/**
* Styles for the root element for variant of ComboBox with an errorMessage in the props.
*/
rootError: IStyle;
/**
* Styles for variant of ComboBox where allowFreeForm is false in the props.
*/
rootDisallowFreeForm: IStyle;
/**
* Styles for when the ComboBox is hovered. These styles are applied for all comboBoxes except when
* the comboBox is disabled.
*/
rootHovered: IStyle;
/**
* Styles for when the ComboBox is active. These styles are applied for all comboBoxes except when
* the comboBox is disabled.
*/
rootPressed: IStyle;
/**
* Styles for when the ComboBox is focused. These styles are applied for all comboBoxes except when
* the comboBox is disabled.
*/
rootFocused: IStyle;
/**
* Styles for when the comboBox is disabled. These styles override all the other styles.
* NOTE : Hover (or) Focused (or) active styles are not applied for disabled comboBoxes.
*/
rootDisabled: IStyle;
/**
* Base styles for the input element - which contains the currently selected
* option.
*/
input: IStyle;
/**
* Style override for the input element when comboBox is disabled.
*/
inputDisabled: IStyle;
/**
* Styles for the error Message text of the comboBox.
*/
errorMessage: IStyle;
/**
* Styles for the callout.
*/
callout: IStyle;
/**
* Styles for the optionsContainerWrapper.
*/
optionsContainerWrapper: IStyle;
/**
* Styles for the container of all the Combobox options
* Includes the headers and dividers.
*/
optionsContainer: IStyle;
/**
* Styles for a header in the options.
*/
header: IStyle;
/**
* Styles for a divider in the options.
*/
divider: IStyle;
}
/**
* {@docCategory ComboBox}
*/
export interface IComboBoxOptionStyles extends IButtonStyles {
/**
* Styles for the text inside the comboBox option.
* This should be used instead of the description
* inside IButtonStyles because we custom render the text
* in the comboBox options.
*/
optionText: IStyle;
/**
* Styles for the comboBox option text's wrapper.
*/
optionTextWrapper: IStyle;
}