office-ui-fabric-react
Version:
Reusable React components for building experiences for Microsoft 365.
529 lines (528 loc) • 23.5 kB
TypeScript
import * as React from 'react';
import { DetailsListBase } from './DetailsList.base';
import { ISelection, SelectionMode, ISelectionZoneProps } from '../../utilities/selection/index';
import { IRefObject, IBaseProps, IRenderFunction, IStyleFunctionOrObject, IComponentAs } from '../../Utilities';
import { IDragDropEvents, IDragDropContext, IDragDropHelper, IDragDropOptions } from './../../utilities/dragdrop/index';
import { IGroup, IGroupRenderProps, IGroupDividerProps, IGroupedListProps } from '../GroupedList/index';
import { IDetailsRowProps, IDetailsRowBaseProps } from '../DetailsList/DetailsRow';
import { IDetailsHeaderProps, IDetailsHeaderBaseProps } from './DetailsHeader';
import { IDetailsFooterProps, IDetailsFooterBaseProps } from './DetailsFooter.types';
import { IWithViewportProps, IViewport } from '../../utilities/decorators/withViewport';
import { IList, IListProps, ScrollToMode } from '../List/index';
import { ITheme, IStyle } from '../../Styling';
import { ICellStyleProps, IDetailsItemProps } from './DetailsRow.types';
import { IDetailsCheckboxProps } from './DetailsRowCheck.types';
import { IDetailsColumnStyleProps, IDetailsColumnProps, IDetailsColumnStyles, IDetailsColumnFilterIconProps } from './DetailsColumn.types';
export { IDetailsHeaderProps, IDetailsRowBaseProps, IDetailsHeaderBaseProps, IDetailsFooterBaseProps, IDragDropContext, IDragDropEvents, IDragDropHelper, IDragDropOptions, IViewport, IWithViewportProps, };
/**
* {@docCategory DetailsList}
*/
export interface IDetailsList extends IList {
/**
* Ensures that the list content is updated. Call this in cases where the list prop updates don't change, but the list
* still needs to be re-evaluated. For example, if a sizer bar is adjusted and causes the list width to change,
* you can call this to force a re-evaluation. Be aware that this can be an expensive operation and should be
* done sparingly.
*/
forceUpdate: () => void;
/**
* Scroll to and focus the item at the given index. focusIndex will call scrollToIndex on the specified index.
*
* @param index - Index of item to scroll to
* @param forceIntoFirstElement - If true, focus will be set to the first focusable child element of the item rather
* than the item itself.
* @param measureItem - Optional callback to measure the height of an individual item
* @param scrollToMode - Optional setting to determine where in the window the item should be scrolled to
* when focused.
*/
focusIndex: (index: number, forceIntoFirstElement?: boolean, measureItem?: (itemIndex: number) => number, scrollToMode?: ScrollToMode) => void;
/**
* Get the start index of the page that is currently in view
*/
getStartItemIndexInView: () => number;
}
/**
* {@docCategory DetailsList}
*/
export interface IDetailsListProps extends IBaseProps<IDetailsList>, IWithViewportProps {
/** Theme provided by a higher-order component. */
theme?: ITheme;
/** Custom overrides to the themed or default styles. */
styles?: IStyleFunctionOrObject<IDetailsListStyleProps, IDetailsListStyles>;
/**
* Callback to access the IDetailsList interface. Use this instead of ref for accessing
* the public methods and properties of the component.
*/
componentRef?: IRefObject<IDetailsList>;
/** A key that uniquely identifies the given items. If provided, the selection will be reset when the key changes. */
setKey?: string;
/** The items to render. */
items: any[];
/** Set this to true to indicate that the items being displayed are placeholder data. */
isPlaceholderData?: boolean;
/** Properties to pass through to the List components being rendered. */
listProps?: IListProps;
/** Default index to set focus to once the items have rendered and the index exists. */
initialFocusedIndex?: number;
/** Class name to add to the root element. */
className?: string;
/** Grouping instructions. */
groups?: IGroup[];
/** Override properties to render groups. */
groupProps?: IDetailsGroupRenderProps;
/** Override for the indent width used for group nesting. */
indentWidth?: number;
/** Selection model to track selection state. */
selection?: ISelection;
/** Controls how/if the details list manages selection. Options include none, single, multiple */
selectionMode?: SelectionMode;
/**
* By default, selection is cleared when clicking on an empty (non-focusable) section of the screen.
* Setting this value to true overrides that behavior and maintains selection.
* @defaultvalue false
**/
selectionPreservedOnEmptyClick?: boolean;
/**
* Additional props to pass through to the SelectionZone created by default.
*/
selectionZoneProps?: ISelectionZoneProps;
/** Controls how the columns are adjusted. */
layoutMode?: DetailsListLayoutMode;
/**
* Controls the visibility of selection check box.
* @defaultvalue CheckboxVisibility.onHover
*/
checkboxVisibility?: CheckboxVisibility;
/**
* Controls the visibility of the header.
* @defaultvalue true
*/
isHeaderVisible?: boolean;
/** column defitions. If none are provided, default columns will be created based on the items' properties. */
columns?: IColumn[];
/** Controls how the list contrains overflow. */
constrainMode?: ConstrainMode;
/** Event names and corresponding callbacks that will be registered to rendered row elements. */
rowElementEventMap?: {
eventName: string;
callback: (context: IDragDropContext, event?: any) => void;
}[];
/** Callback for when the list has been updated. Useful for telemetry tracking externally. */
onDidUpdate?: (detailsList?: DetailsListBase) => void;
/**
* Callback for when a given row has been mounted. Useful for identifying when a row has been rendered on the page.
*/
onRowDidMount?: (item?: any, index?: number) => void;
/**
* Callback for when a given row has been unmounted.
* Useful for identifying when a row has been removed from the page.
*/
onRowWillUnmount?: (item?: any, index?: number) => void;
/** Callback for when the user clicks on the column header. */
onColumnHeaderClick?: (ev?: React.MouseEvent<HTMLElement>, column?: IColumn) => void;
/** Callback for when the user asks for a contextual menu (usually via right click) from a column header. */
onColumnHeaderContextMenu?: (column?: IColumn, ev?: React.MouseEvent<HTMLElement>) => void;
/** Callback fired on column resize */
onColumnResize?: (column?: IColumn, newWidth?: number, columnIndex?: number) => void;
/** Callback for when a given row has been invoked (by pressing enter while it is selected.) */
onItemInvoked?: (item?: any, index?: number, ev?: Event) => void;
/**
* Callback for when the context menu of an item has been accessed.
* If undefined or false is returned, `ev.preventDefault()` will be called.
*/
onItemContextMenu?: (item?: any, index?: number, ev?: Event) => void | boolean;
/**
* Callback to override the default row rendering.
*/
onRenderRow?: IRenderFunction<IDetailsRowProps>;
/**
* If provided, will be the "default" item column renderer method.
* This affects cells within the rows, not the rows themselves.
* If a column definition provides its own `onRender` method, that will be used instead of this.
*/
onRenderItemColumn?: (item?: any, index?: number, column?: IColumn) => React.ReactNode;
/**
* If provided, will be the "default" item column cell value return.
* A column's `getValueKey` can override `getCellValueKey`.
*/
getCellValueKey?: (item?: any, index?: number, column?: IColumn) => string;
/** Map of callback functions related to row drag and drop functionality. */
dragDropEvents?: IDragDropEvents;
/** Callback for what to render when the item is missing. */
onRenderMissingItem?: (index?: number, rowProps?: IDetailsRowProps) => React.ReactNode;
/** An override to render the details header. */
onRenderDetailsHeader?: IRenderFunction<IDetailsHeaderProps>;
/** An override to render the details footer. */
onRenderDetailsFooter?: IRenderFunction<IDetailsFooterProps>;
/** If provided, can be used to render a custom checkbox. */
onRenderCheckbox?: IRenderFunction<IDetailsListCheckboxProps>;
/** Viewport info, provided by the `withViewport` decorator. */
viewport?: IViewport;
/**
* Callback for when an item in the list becomes active by clicking anywhere inside the row or navigating to it
* with the keyboard.
*/
onActiveItemChanged?: (item?: any, index?: number, ev?: React.FocusEvent<HTMLElement>) => void;
/** Accessible label for the list header. */
ariaLabelForListHeader?: string;
/** Accessible label for the select all checkbox. */
ariaLabelForSelectAllCheckbox?: string;
/** Accessible label for the name of the selection column. */
ariaLabelForSelectionColumn?: string;
/** Callback to get the aria-label string for a given item. */
getRowAriaLabel?: (item: any) => string;
/** Callback to get the aria-describedby IDs (space-separated strings) of elements that describe the item. */
getRowAriaDescribedBy?: (item: any) => string;
/**
* Callback to get the item key, to be used in the selection and on render.
* Must be provided if sorting or filtering is enabled.
*/
getKey?: (item: any, index?: number) => string;
/** Accessible label describing or summarizing the list. */
ariaLabel?: string;
/** Accessible label for the row check button, e.g. "select row" */
checkButtonAriaLabel?: string;
/** Accessible label for the group header check button, e.g. "select section". */
checkButtonGroupAriaLabel?: string;
/** Accessible label for the grid within the list. */
ariaLabelForGrid?: string;
/** An optional margin for proportional columns, to e.g. account for scrollbars when laying out width. */
flexMargin?: number;
/**
* Whether the role `application` should be applied to the list.
* @defaultvalue false
*/
shouldApplyApplicationRole?: boolean;
/**
* The minimum mouse move distance to interpret the action as drag event.
* @defaultvalue 5
*/
minimumPixelsForDrag?: number;
/**
* Whether to render in compact mode.
* @defaultvalue false
*/
compact?: boolean;
/**
* Whether to enable render page caching. This is an experimental performance optimization that is off by default.
* @defaultvalue false
*/
usePageCache?: boolean;
/**
* Callback to determine whether the list should be rendered in full, or virtualized.
*
* Virtualization will add and remove pages of items as the user scrolls them into the visible range.
* This benefits larger list scenarios by reducing the DOM on the screen, but can negatively affect performance
* for smaller lists.
*
* The default implementation will virtualize when this callback is not provided.
*/
onShouldVirtualize?: (props: IListProps) => boolean;
/** Class name to add to the cell of a checkbox. */
checkboxCellClassName?: string;
/** Whether the selection zone should enter modal state on touch. */
enterModalSelectionOnTouch?: boolean;
/** Options for column reordering using drag and drop. */
columnReorderOptions?: IColumnReorderOptions;
/** Callback to override default group height calculation used by list virtualization. */
getGroupHeight?: IGroupedListProps['getGroupHeight'];
/**
* Whether to re-render a row only when props changed. Might cause regression when depending on external updates.
* @defaultvalue false
*/
useReducedRowRenderer?: boolean;
/**
* Props impacting the render style of cells. Since these have an impact on calculated column widths, they are
* handled separately from normal theme styling, but they are passed to the styling system.
*/
cellStyleProps?: ICellStyleProps;
/** Whether to disable the built-in SelectionZone, so the host component can provide its own. */
disableSelectionZone?: boolean;
/**
* Determines if an item is selected on focus.
*
* @defaultvalue true
*/
isSelectedOnFocus?: boolean;
/** Whether to animate updates */
enableUpdateAnimations?: boolean;
/**
* Whether to use fast icon and check components. The icons can't be targeted by customization
* but are still customizable via class names.
* @defaultvalue true
*/
useFastIcons?: boolean;
/** Role for the list. */
role?: string;
}
/**
* {@docCategory DetailsList}
*/
export interface IColumn {
/** A unique key for identifying the column. */
key: string;
/** Name to render on the column header. */
name: string;
/**
* The field to pull the text value from for the column.
* Can be unset if a custom `onRender` method is provided.
*/
fieldName?: string;
/**
* If specified, the width of the column is a portion of the available space equal to this value divided by the sum
* of all proportional column widths in the list. For example, if there is a list with two proportional columns that
* have widths of 1 and 3, they will respectively occupy (1/4) = 25% and (3/4) = 75% of the remaining space. Note that
* this relies on viewport measures and will not work well with skipViewportMeasures.
*/
flexGrow?: number;
/** Class name to apply to the column cell within each row. */
className?: string;
/** Custom overrides to the themed or default styles. */
styles?: IStyleFunctionOrObject<IDetailsColumnStyleProps, IDetailsColumnStyles>;
/** Minimum width for the column. */
minWidth: number;
/**
* If specified, the width of the column is a portion of the available space equal to this value divided by the sum
* of all proportional column widths in the list. For example, if there is a list with two proportional columns that
* have widths of 1 and 3, they will respectively occupy (1/4) = 25% and (2/4) = 75% of the remaining space. Note that
* this relies on viewport measures and will not work well with skipViewportMeasures.
*/
targetWidthProportion?: number;
/**
* Accessible label for the column. The column name will still be used as the primary label,
* but this text (if specified) will be read after the column name.
*/
ariaLabel?: string;
/** Whether the column is a header for the given row. There should be only one column with this set to true. */
isRowHeader?: boolean;
/** Maximum width for the column, if stretching is allowed in justified scenarios. */
maxWidth?: number;
/**
* Defines how the column's header should render.
* @defaultvalue ColumnActionsMode.clickable
*/
columnActionsMode?: ColumnActionsMode;
/** Custom icon to use in the column header. */
iconName?: string;
/**
* Whether only the icon should be displayed in the column header.
* If true, the column name and dropdown chevron will not be displayed.
*/
isIconOnly?: boolean;
/** Class name for the icon within the header. */
iconClassName?: string;
/**
* If true, allow the column to be collapsed when rendered in justified layout.
* @deprecated Use `isCollapsible`
*/
isCollapsable?: boolean;
/** If true, allow the column to be collapsed when rendered in justified layout. */
isCollapsible?: boolean;
/** Determines if the column is currently sorted. Renders a sort arrow in the column header. */
isSorted?: boolean;
/** Determines if the sort arrow is pointed down (descending) or up. */
isSortedDescending?: boolean;
/** Determines if the column can be resized. */
isResizable?: boolean;
/** Determines if the column can render multi-line text. */
isMultiline?: boolean;
/** Custom renderer for cell content, instead of the default text rendering. */
onRender?: (item?: any, index?: number, column?: IColumn) => any;
/** Custom override for the parent list's `getCellValueKey`. */
getValueKey?: (item?: any, index?: number, column?: IColumn) => string;
/** Custom renderer for column header divider. */
onRenderDivider?: IRenderFunction<IDetailsColumnProps>;
/** Custom renderer for filter icon. */
onRenderFilterIcon?: IRenderFunction<IDetailsColumnFilterIconProps>;
/** Custom renderer for column header content, instead of the default text rendering. */
onRenderHeader?: IRenderFunction<IDetailsColumnProps>;
/** Whether the list is filtered by this column. If true, shows a filter icon next to this column's name. */
isFiltered?: boolean;
/** Callback for when the user clicks on the column header. */
onColumnClick?: (ev: React.MouseEvent<HTMLElement>, column: IColumn) => void;
/** Callback for when the user opens the column header context menu. */
onColumnContextMenu?: (column?: IColumn, ev?: React.MouseEvent<HTMLElement>) => void;
/**
* Callback for when the column is resized (`width` is the current width).
*
* Prefer this over `DetailsList`'s `onColumnResize` if you require the `IColumn` to report its width
* after every resize event. Consider debouncing the callback if resize events occur frequently.
*/
onColumnResize?: (width?: number) => void;
/** Whether the list is grouped by this column. If true, shows a grouped icon next to this column's name. */
isGrouped?: boolean;
/** Arbitrary data passthrough which can be used by the caller. */
data?: any;
/** Internal only value. */
calculatedWidth?: number;
/**
* Internal only value.
* Remembers the actual width of the column in any case.
* `calculatedWidth` is only saved when it's defined by user, not for justified calculations.
*/
currentWidth?: number;
/** Class name to apply to the column header cell. */
headerClassName?: string;
/** If true, add additional LTR padding-right to column and cells. */
isPadded?: boolean;
/**
* Accessible label for indicating that the list is sorted by this column in ascending order.
* This will be read after the main column header label.
*/
sortAscendingAriaLabel?: string;
/**
* Accessible label for indicating that the list is sorted by this column in descending order.
* This will be read after the main column header label.
*/
sortDescendingAriaLabel?: string;
/** Accessible label for the status of this column when grouped. */
groupAriaLabel?: string;
/** Accessible label for the status of this column when filtered. */
filterAriaLabel?: string;
/** Whether a dropdown menu is open so that the appropriate ARIA attributes are rendered. */
isMenuOpen?: boolean;
}
/**
* Enum to describe how a particular column header behaves.
* This is used to to specify the property `IColumn.columnActionsMode`.
* If `IColumn.columnActionsMode` is undefined, it's equivalent to `ColumnActionsMode.clickable`.
* {@docCategory DetailsList}
*/
export declare enum ColumnActionsMode {
/** Renders the column header as disabled. */
disabled = 0,
/** Renders the column header as clickable. Default value. */
clickable = 1,
/** Renders the column header as clickable and displays the dropdown chevron. */
hasDropdown = 2
}
/**
* {@docCategory DetailsList}
*/
export declare enum ConstrainMode {
/** Lets the content grow which allows the page to manage scrolling. */
unconstrained = 0,
/** Constrains the list to the given layout space. */
horizontalConstrained = 1
}
/**
* {@docCategory DetailsList}
*/
export interface IColumnReorderOptions {
/**
* Specifies the number fixed columns from left
* @defaultvalue 0
*/
frozenColumnCountFromStart?: number;
/**
* Specifies the number fixed columns from right
* @defaultvalue 0
*/
frozenColumnCountFromEnd?: number;
/**
* Callback to handle when dragging on this column's DetailsHeader has started.
*/
onColumnDragStart?: (dragStarted: boolean) => void;
/**
* Callback to handle column reordering.
* `draggedIndex` is the source column index, which should be placed at `targetIndex`.
* @deprecated Use `onColumnDrop` instead.
*/
handleColumnReorder?: (draggedIndex: number, targetIndex: number) => void;
/**
* Callback to handle column reordering.
* `draggedIndex` is the source column index, which should be placed at `targetIndex`.
*/
onColumnDrop?: (dragDropDetails: IColumnDragDropDetails) => void;
/**
* Callback to handle when dragging on this column's DetailsHeader has finished.
*/
onDragEnd?: (columnDropLocationDetails: ColumnDragEndLocation) => void;
}
/**
* {@docCategory DetailsList}
*/
export interface IColumnDragDropDetails {
/**
* Specifies the source column index
* @defaultvalue -1
*/
draggedIndex: number;
/**
* Specifies the target column index
* @defaultvalue -1
*/
targetIndex: number;
}
/**
* Enum to describe where the column has been dropped, after starting the drag
* {@docCategory DetailsList}
*/
export declare enum ColumnDragEndLocation {
/** Drag ended outside of current list */
outside = 0,
/** Drag ended within current list */
surface = 1,
/** Drag ended on header */
header = 2
}
/**
* {@docCategory DetailsList}
*/
export declare enum DetailsListLayoutMode {
/**
* Lets the user resize columns and makes not attempt to fit them.
*/
fixedColumns = 0,
/**
* Manages which columns are visible, tries to size them according to their min/max rules and drops
* off columns that can't fit and have isCollapsible set.
*/
justified = 1
}
/**
* {@docCategory DetailsList}
*/
export declare enum CheckboxVisibility {
/** Visible on hover. */
onHover = 0,
/** Visible always. */
always = 1,
/** Hide checkboxes. */
hidden = 2
}
/**
* {@docCategory DetailsList}
*/
export declare type IDetailsListStyleProps = Required<Pick<IDetailsListProps, 'theme'>> & Pick<IDetailsListProps, 'className'> & {
/** Whether the list is horizontally constrained */
isHorizontalConstrained?: boolean;
/** Whether the list is in compact mode */
compact?: boolean;
/** Whether the list is fixed in size */
isFixed?: boolean;
};
/**
* {@docCategory DetailsList}
*/
export interface IDetailsListStyles {
root: IStyle;
focusZone: IStyle;
headerWrapper: IStyle;
contentWrapper: IStyle;
}
/**
* {@docCategory DetailsList}
*/
export interface IDetailsGroupRenderProps extends IGroupRenderProps {
onRenderFooter?: IRenderFunction<IDetailsGroupDividerProps>;
onRenderHeader?: IRenderFunction<IDetailsGroupDividerProps>;
groupedListAs?: IComponentAs<IGroupedListProps>;
}
/**
* {@docCategory DetailsList}
*/
export interface IDetailsGroupDividerProps extends IGroupDividerProps, IDetailsItemProps {
}
export interface IDetailsListCheckboxProps extends IDetailsCheckboxProps {
}