in packages/react/src/components/DetailsList/DetailsColumn.base.tsx [57:196]
public render(): JSX.Element {
const {
column,
columnIndex,
parentId,
isDraggable,
styles,
theme,
cellStyleProps = DEFAULT_CELL_STYLE_PROPS,
useFastIcons = true,
} = this.props;
const { onRenderColumnHeaderTooltip = this._onRenderColumnHeaderTooltip } = this.props;
this._classNames = getClassNames(styles, {
theme: theme!,
headerClassName: column.headerClassName,
iconClassName: column.iconClassName,
isActionable: column.columnActionsMode !== ColumnActionsMode.disabled,
isEmpty: !column.name,
isIconVisible: column.isSorted || column.isGrouped || column.isFiltered,
isPadded: column.isPadded,
isIconOnly: column.isIconOnly,
cellStyleProps,
transitionDurationDrag: TRANSITION_DURATION_DRAG,
transitionDurationDrop: TRANSITION_DURATION_DROP,
});
const classNames = this._classNames;
const IconComponent = useFastIcons ? FontIcon : Icon;
const onRenderFilterIcon = column.onRenderFilterIcon
? composeRenderFunction(column.onRenderFilterIcon, this._onRenderFilterIcon(this._classNames))
: this._onRenderFilterIcon(this._classNames);
const onRenderHeader = column.onRenderHeader
? composeRenderFunction(column.onRenderHeader, defaultOnRenderHeader(this._classNames))
: defaultOnRenderHeader(this._classNames);
const hasInnerButton =
column.columnActionsMode !== ColumnActionsMode.disabled &&
(column.onColumnClick !== undefined || this.props.onColumnClick !== undefined);
const accNameDescription = {
'aria-label': column.isIconOnly ? column.name : undefined,
'aria-labelledby': column.isIconOnly ? undefined : `${parentId}-${column.key}-name`,
'aria-describedby':
!this.props.onRenderColumnHeaderTooltip && this._hasAccessibleLabel()
? `${parentId}-${column.key}-tooltip`
: undefined,
};
return (
<>
<div
key={column.key}
ref={this._root}
role={'columnheader'}
{...(!hasInnerButton && accNameDescription)}
aria-sort={column.isSorted ? (column.isSortedDescending ? 'descending' : 'ascending') : 'none'}
aria-colindex={columnIndex}
// when the column is not disabled and has no inner button, this node should be in the focus order
data-is-focusable={
!hasInnerButton && column.columnActionsMode !== ColumnActionsMode.disabled ? 'true' : undefined
}
className={classNames.root}
data-is-draggable={isDraggable}
draggable={isDraggable}
style={{
width:
column.calculatedWidth! +
cellStyleProps.cellLeftPadding +
cellStyleProps.cellRightPadding +
(column.isPadded ? cellStyleProps.cellExtraRightPadding : 0),
}}
data-automationid={'ColumnsHeaderColumn'}
data-item-key={column.key}
>
{isDraggable && (
<IconComponent iconName="GripperBarVertical" className={classNames.gripperBarVerticalStyle} />
)}
{onRenderColumnHeaderTooltip(
{
hostClassName: classNames.cellTooltip,
id: `${parentId}-${column.key}-tooltip`,
setAriaDescribedBy: false,
column,
content: column.columnActionsMode !== ColumnActionsMode.disabled ? column.ariaLabel : '',
children: (
<span
id={`${parentId}-${column.key}`}
className={classNames.cellTitle}
// this node should only be focusable when it is a button
data-is-focusable={
hasInnerButton && column.columnActionsMode !== ColumnActionsMode.disabled ? 'true' : undefined
}
role={hasInnerButton ? 'button' : undefined}
{...(hasInnerButton && accNameDescription)}
onContextMenu={this._onColumnContextMenu}
onClick={this._onColumnClick}
aria-haspopup={column.columnActionsMode === ColumnActionsMode.hasDropdown ? 'menu' : undefined}
aria-expanded={
column.columnActionsMode === ColumnActionsMode.hasDropdown ? !!column.isMenuOpen : undefined
}
>
<span id={`${parentId}-${column.key}-name`} className={classNames.cellName}>
{(column.iconName || column.iconClassName) && (
<IconComponent className={classNames.iconClassName} iconName={column.iconName} />
)}
{onRenderHeader(this.props)}
</span>
{column.isFiltered && <IconComponent className={classNames.nearIcon} iconName="Filter" />}
{column.isSorted && (
<IconComponent
className={classNames.sortIcon}
iconName={column.isSortedDescending ? 'SortDown' : 'SortUp'}
/>
)}
{column.isGrouped && <IconComponent className={classNames.nearIcon} iconName="GroupedDescending" />}
{column.columnActionsMode === ColumnActionsMode.hasDropdown &&
!column.isIconOnly &&
onRenderFilterIcon({
'aria-hidden': true,
columnProps: this.props,
className: classNames.filterChevron,
iconName: 'ChevronDown',
})}
</span>
),
},
this._onRenderColumnHeaderTooltip,
)}
</div>
{!this.props.onRenderColumnHeaderTooltip ? this._renderAccessibleLabel() : null}
</>
);
}