uui/components/tables/DataTableCell.tsx (58 lines of code) (raw):
import * as React from 'react';
import { DataTableCellProps } from '@epam/uui-core';
import { DataTableCell as UuiDataTableCell } from '@epam/uui-components';
import { DataRowAddons } from '../widgets';
import { DataTableCellMods } from './types';
import { TextPlaceholder, Text, TextProps } from '../typography';
import { Tooltip } from '../overlays';
import { settings } from '../../settings';
import './variables.scss';
import css from './DataTableCell.module.scss';
export function DataTableCell<TItem, TId, TCellValue>(initialProps : DataTableCellProps<TItem, TId, TCellValue> & DataTableCellMods) {
const props = { ...initialProps };
if (props.isFirstColumn) {
props.addons = <DataRowAddons size={ props.size } { ...props } />;
}
props.renderPlaceholder = props.renderPlaceholder
|| (() => (
<Text key="t" size={ settings.sizes.dataTable.body.row.cell.text[props.size] as TextProps['size'] }>
<TextPlaceholder isNotAnimated />
</Text>
));
props.renderUnknown = props.renderUnknown
|| (() => (
<Text key="t" size={ settings.sizes.dataTable.body.row.cell.text[props.size] as TextProps['size'] }>
Unknown
</Text>
));
props.renderTooltip = (tooltipProps) => <Tooltip color="critical" { ...tooltipProps } />;
const isEditable = !!props.onValueChange;
const getLeftPadding = () => {
const { rowProps: { isLoading }, columnsGap, isFirstColumn } = props;
if (isFirstColumn && isEditable && !isLoading) return settings.sizes.dataTable.body.row.cell.defaults.padding;
if (isEditable && !isLoading) return '0';
if (columnsGap) return isFirstColumn ? columnsGap : +columnsGap / 2;
return isFirstColumn ? settings.sizes.dataTable.body.row.cell.defaults.paddingEdge : settings.sizes.dataTable.body.row.cell.defaults.padding;
};
const getRightPadding = () => {
const { rowProps: { isLoading }, columnsGap, isLastColumn } = props;
if (isEditable && !isLoading) return '0';
if (columnsGap) return isLastColumn ? columnsGap : +columnsGap / 2;
return isLastColumn ? settings.sizes.dataTable.body.row.cell.defaults.paddingEdge : settings.sizes.dataTable.body.row.cell.defaults.padding;
};
props.cx = [
'data-table-cell',
css.root,
props.cx,
'uui-size-' + (props.size || settings.sizes.dataTable.body.row.cell.defaults.size),
props.isFirstColumn && 'uui-dt-first-column',
props.isLastColumn && 'uui-dt-last-column',
css[`align-widgets-${props.alignActions || 'top'}`],
(props.border || isEditable) && 'uui-dt-vertical-cell-border',
];
props.style = {
'--uui-dt-cell-padding-start': `${getLeftPadding()}px`,
'--uui-dt-cell-padding-end': `${getRightPadding()}px`,
} as React.CSSProperties;
return <UuiDataTableCell { ...props } />;
}