uui/components/tables/DataTableHeaderGroupCell.tsx (123 lines of code) (raw):
import * as React from 'react';
import { cx, DataColumnGroupProps, DataTableHeaderGroupCellProps, Overwrite, uuiDataTableHeaderGroupCell } from '@epam/uui-core';
import { DataTableCellContainer, HeaderCellContentProps } from '@epam/uui-components';
import { DataTableHeaderCellMods } from './types';
import { Tooltip } from '../overlays';
import { Text, TextProps } from '../typography';
import { settings } from '../../settings';
import './variables.scss';
import css from './DataTableHeaderGroupCell.module.scss';
export interface DataTableHeaderGroupCellModsOverride {
}
export class DataTableHeaderGroupCell extends
React.Component<
DataTableHeaderGroupCellProps & Overwrite<DataTableHeaderCellMods,
DataTableHeaderGroupCellModsOverride>
> {
getTooltipContent = (column: DataColumnGroupProps) => (
<div className={ cx(css.groupCellTooltipWrapper, uuiDataTableHeaderGroupCell.uuiTableHeaderGroupCaptionTooltip) }>
<Text cx={ [css.groupCellTooltipText, css.tooltipCaption] }>
{ column.caption }
</Text>
{ column.info && (
<Text cx={ [css.groupCellTooltipText, css.tooltipInfo] }>
{ column.info }
</Text>
) }
</div>
);
getColumnCaption = () => {
const renderTooltip = this.props.group.renderTooltip || this.getTooltipContent;
const captionCx = [
css.caption,
this.props.textCase === 'upper' && css.upperCase,
uuiDataTableHeaderGroupCell.uuiTableHeaderGroupCaption,
settings.sizes.dataTable.header.row.groupCell.truncate.includes(this.props.size) && css.truncate,
];
return (
<div
className={ cx(css.captionWrapper, css['align-' + this.props.group.textAlign], uuiDataTableHeaderGroupCell.uuiTableHeaderGroupCaptionWrapper) }
>
<Tooltip
placement="top"
color="inverted"
content={ renderTooltip(this.props.group) }
cx={ css.groupCellTooltip }
openDelay={ 600 }
>
<Text
key="text"
fontSize={ settings.sizes.dataTable.header.row.groupCell.columnCaption[this.props.textCase === 'upper' ? 'uppercase' : 'fontSize'] as TextProps['fontSize'] }
size={ settings.sizes.dataTable.header.row.groupCell.columnCaption.size as TextProps['size'] }
cx={ captionCx }
>
{ this.props.group.caption }
</Text>
</Tooltip>
</div>
);
};
getLeftPadding = () => {
const { columnsGap, isFirstCell } = this.props;
if (columnsGap) return isFirstCell ? columnsGap : +columnsGap / 2;
return isFirstCell ? settings.sizes.dataTable.header.row.groupCell.defaults.paddingEdge : settings.sizes.dataTable.header.row.groupCell.defaults.padding;
};
getRightPadding = () => {
const { columnsGap, isLastCell } = this.props;
if (columnsGap) return isLastCell ? columnsGap : +columnsGap / 2;
return isLastCell ? settings.sizes.dataTable.header.row.groupCell.defaults.paddingEdge : settings.sizes.dataTable.header.row.groupCell.defaults.padding;
};
renderCellContent = (props: HeaderCellContentProps) => {
const computeStyles = {
'--uui-dt-header-group-cell-padding-start': `${this.getLeftPadding()}px`,
'--uui-dt-header-group-cell-padding-end': `${this.getRightPadding()}px`,
} as React.CSSProperties;
return (
<DataTableCellContainer
column={ this.props.group }
ref={ (ref) => {
(props.ref as React.RefCallback<HTMLElement>)(ref);
} }
cx={ cx(
uuiDataTableHeaderGroupCell.uuiTableHeaderGroupCell,
css.root,
`uui-size-${this.props.size || settings.sizes.dataTable.header.row.groupCell.defaults.size}`,
this.props.isFirstCell && 'uui-dt-header-first-column',
this.props.isLastCell && 'uui-dt-header-last-column',
) }
rawProps={ {
role: 'columnheader',
...props.eventHandlers,
} }
style={ computeStyles }
>
{ this.getColumnCaption() }
</DataTableCellContainer>
);
};
render() {
if (this.props.group.renderHeaderCell) {
return this.props.group.renderHeaderCell(this.props);
}
const computeStyles = {
'--uui-dt-header-group-cell-padding-start': `${this.getLeftPadding()}px`,
'--uui-dt-header-group-cell-padding-end': `${this.getRightPadding()}px`,
} as React.CSSProperties;
return (
<DataTableCellContainer
column={ this.props.group }
cx={ cx(
uuiDataTableHeaderGroupCell.uuiTableHeaderGroupCell,
css.root,
`uui-size-${this.props.size || settings.sizes.dataTable.header.row.groupCell.defaults.size}`,
this.props.isFirstCell && 'uui-dt-header-first-column',
this.props.isLastCell && 'uui-dt-header-last-column',
) }
rawProps={ { role: 'columnheader' } }
style={ computeStyles }
>
{ this.getColumnCaption() }
</DataTableCellContainer>
);
}
}