public render()

in packages/react/src/components/DetailsList/DetailsHeader.base.tsx [156:336]


  public render(): JSX.Element {
    const {
      columns = NO_COLUMNS,
      ariaLabel,
      ariaLabelForToggleAllGroupsButton,
      ariaLabelForSelectAllCheckbox,
      selectAllVisibility,
      ariaLabelForSelectionColumn,
      indentWidth,
      onColumnClick,
      onColumnContextMenu,
      onRenderColumnHeaderTooltip = this._onRenderColumnHeaderTooltip,
      styles,
      selectionMode,
      theme,
      onRenderDetailsCheckbox,
      groupNestingDepth,
      useFastIcons,
      checkboxVisibility,
      className,
    } = this.props;
    const { isAllSelected, columnResizeDetails, isSizing, isAllCollapsed } = this.state;
    const showCheckbox = selectAllVisibility !== SelectAllVisibility.none;
    const isCheckboxHidden = selectAllVisibility === SelectAllVisibility.hidden;
    const isCheckboxAlwaysVisible = checkboxVisibility === CheckboxVisibility.always;

    const columnReorderProps = this._getColumnReorderProps();
    const frozenColumnCountFromStart =
      columnReorderProps && columnReorderProps.frozenColumnCountFromStart
        ? columnReorderProps.frozenColumnCountFromStart
        : 0;
    const frozenColumnCountFromEnd =
      columnReorderProps && columnReorderProps.frozenColumnCountFromEnd
        ? columnReorderProps.frozenColumnCountFromEnd
        : 0;

    this._classNames = getClassNames(styles, {
      theme: theme!,
      isAllSelected,
      isSelectAllHidden: selectAllVisibility === SelectAllVisibility.hidden,
      isResizingColumn: !!columnResizeDetails && isSizing,
      isSizing,
      isAllCollapsed,
      isCheckboxHidden,
      className,
    });

    const classNames = this._classNames;
    const IconComponent = useFastIcons ? FontIcon : Icon;

    const isRTL = getRTL(theme);
    return (
      <FocusZone
        role="row"
        aria-label={ariaLabel}
        className={classNames.root}
        componentRef={this._rootComponent}
        elementRef={this._rootElement}
        onMouseMove={this._onRootMouseMove}
        data-automationid="DetailsHeader"
        direction={FocusZoneDirection.horizontal}
      >
        {showCheckbox
          ? [
              <div
                key="__checkbox"
                className={classNames.cellIsCheck}
                aria-labelledby={`${this._id}-checkTooltip`}
                onClick={!isCheckboxHidden ? this._onSelectAllClicked : undefined}
                aria-colindex={1}
                role={'columnheader'}
              >
                {onRenderColumnHeaderTooltip(
                  {
                    hostClassName: classNames.checkTooltip,
                    id: `${this._id}-checkTooltip`,
                    setAriaDescribedBy: false,
                    content: ariaLabelForSelectAllCheckbox,
                    children: (
                      <DetailsRowCheck
                        id={`${this._id}-check`}
                        aria-label={
                          selectionMode === SelectionMode.multiple
                            ? ariaLabelForSelectAllCheckbox
                            : ariaLabelForSelectionColumn
                        }
                        data-is-focusable={!isCheckboxHidden || undefined}
                        isHeader={true}
                        selected={isAllSelected}
                        anySelected={false}
                        canSelect={!isCheckboxHidden}
                        className={classNames.check}
                        onRenderDetailsCheckbox={onRenderDetailsCheckbox}
                        useFastIcons={useFastIcons}
                        isVisible={isCheckboxAlwaysVisible}
                      />
                    ),
                  },
                  this._onRenderColumnHeaderTooltip,
                )}
              </div>,
              !this.props.onRenderColumnHeaderTooltip ? (
                ariaLabelForSelectAllCheckbox && !isCheckboxHidden ? (
                  <label
                    key="__checkboxLabel"
                    id={`${this._id}-checkTooltip`}
                    className={classNames.accessibleLabel}
                    aria-hidden={true}
                  >
                    {ariaLabelForSelectAllCheckbox}
                  </label>
                ) : ariaLabelForSelectionColumn && isCheckboxHidden ? (
                  <label
                    key="__checkboxLabel"
                    id={`${this._id}-checkTooltip`}
                    className={classNames.accessibleLabel}
                    aria-hidden={true}
                  >
                    {ariaLabelForSelectionColumn}
                  </label>
                ) : null
              ) : null,
            ]
          : null}
        {groupNestingDepth! > 0 && this.props.collapseAllVisibility === CollapseAllVisibility.visible ? (
          <div
            className={classNames.cellIsGroupExpander}
            onClick={this._onToggleCollapseAll}
            data-is-focusable={true}
            aria-label={ariaLabelForToggleAllGroupsButton}
            aria-expanded={!isAllCollapsed}
            role="columnheader"
          >
            <IconComponent
              className={classNames.collapseButton}
              iconName={isRTL ? 'ChevronLeftMed' : 'ChevronRightMed'}
            />
          </div>
        ) : null}
        <GroupSpacer indentWidth={indentWidth} role="gridcell" count={groupNestingDepth! - 1} />
        {columns.map((column: IColumn, columnIndex: number) => {
          const _isDraggable = columnReorderProps
            ? columnIndex >= frozenColumnCountFromStart && columnIndex < columns.length - frozenColumnCountFromEnd
            : false;
          return [
            columnReorderProps &&
              (_isDraggable || columnIndex === columns.length - frozenColumnCountFromEnd) &&
              this._renderDropHint(columnIndex),
            <DetailsColumn
              column={column}
              styles={column.styles}
              key={column.key}
              columnIndex={(showCheckbox ? 2 : 1) + columnIndex}
              parentId={this._id}
              isDraggable={_isDraggable}
              updateDragInfo={this._updateDragInfo}
              dragDropHelper={this._dragDropHelper}
              onColumnClick={onColumnClick}
              onColumnContextMenu={onColumnContextMenu}
              // Do not render tooltips by default, but allow for override via props.
              onRenderColumnHeaderTooltip={this.props.onRenderColumnHeaderTooltip}
              isDropped={this._onDropIndexInfo.targetIndex === columnIndex}
              cellStyleProps={this.props.cellStyleProps}
              useFastIcons={useFastIcons}
            />,
            this._renderColumnDivider(columnIndex),
          ];
        })}
        {columnReorderProps && frozenColumnCountFromEnd === 0 && this._renderDropHint(columns.length)}
        {isSizing && (
          <Layer>
            <div
              className={classNames.sizingOverlay}
              onMouseMove={this._onSizerMouseMove}
              onMouseUp={this._onSizerMouseUp}
            />
          </Layer>
        )}
      </FocusZone>
    );
  }