mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 12:20:31 +00:00
122 lines
3.3 KiB
TypeScript
122 lines
3.3 KiB
TypeScript
// @ts-nocheck
|
|
import React, { useContext } from 'react';
|
|
import classNames from 'classnames';
|
|
import { camelCase } from 'lodash';
|
|
|
|
import { If, Skeleton } from '@/components';
|
|
import { useAppIntlContext } from '@/components/AppIntlProvider';
|
|
import TableContext from './TableContext';
|
|
import { saveInvoke, ignoreEventFromSelectors } from '@/utils';
|
|
import { isCellLoading } from './utils';
|
|
import { MoneyDisplay } from '../Money/MoneyDisplay';
|
|
|
|
const ROW_CLICK_SELECTORS_INGORED = ['.expand-toggle', '.selection-checkbox'];
|
|
|
|
/**
|
|
* Table cell.
|
|
*/
|
|
export default function TableCell({ cell, row, index }) {
|
|
const { index: rowIndex, depth, getToggleRowExpandedProps, isExpanded } = row;
|
|
const {
|
|
props: {
|
|
expandToggleColumn,
|
|
expandColumnSpace,
|
|
expandable,
|
|
cellsLoading,
|
|
cellsLoadingCoords,
|
|
onCellClick,
|
|
},
|
|
} = useContext(TableContext);
|
|
|
|
const isExpandColumn = expandToggleColumn === index;
|
|
const { skeletonWidthMax = 100, skeletonWidthMin = 40 } = {};
|
|
|
|
// Application intl context.
|
|
const { isRTL } = useAppIntlContext();
|
|
|
|
// Detarmines whether the current cell is loading.
|
|
const cellLoading = isCellLoading(
|
|
cellsLoading,
|
|
cellsLoadingCoords,
|
|
rowIndex,
|
|
cell.column.id,
|
|
);
|
|
|
|
if (cellLoading) {
|
|
return (
|
|
<div
|
|
{...cell.getCellProps({
|
|
className: classNames(cell.column.className, 'td'),
|
|
})}
|
|
>
|
|
<Skeleton minWidth={skeletonWidthMin} maxWidth={skeletonWidthMax} />
|
|
</div>
|
|
);
|
|
}
|
|
// Handle cell click action.
|
|
const handleCellClick = (event) => {
|
|
if (ignoreEventFromSelectors(event, ROW_CLICK_SELECTORS_INGORED)) {
|
|
return;
|
|
}
|
|
saveInvoke(onCellClick, cell, event);
|
|
};
|
|
const cellType = camelCase(cell.column.Cell.cellType) || 'text';
|
|
|
|
return (
|
|
<div
|
|
{...cell.getCellProps({
|
|
className: classNames(cell.column.className, 'td', {
|
|
'is-text-overview': cell.column.textOverview,
|
|
clickable: cell.column.clickable,
|
|
'align-right': cell.column.align === 'right',
|
|
'align-center': cell.column.align === 'center',
|
|
[`td-${cell.column.id}`]: cell.column.id,
|
|
[`td-${cellType}-type`]: !!cellType,
|
|
}),
|
|
tabindex: 0,
|
|
onClick: handleCellClick,
|
|
})}
|
|
>
|
|
<div
|
|
className={classNames(
|
|
{
|
|
'text-overview': cell.column.textOverview,
|
|
},
|
|
'cell-inner',
|
|
)}
|
|
style={{
|
|
[isRTL ? 'paddingRight' : 'paddingLeft']:
|
|
isExpandColumn && expandable
|
|
? `${depth * expandColumnSpace}rem`
|
|
: '',
|
|
}}
|
|
>
|
|
{
|
|
// Use the row.canExpand and row.getToggleRowExpandedProps prop getter
|
|
// to build the toggle for expanding a row
|
|
}
|
|
<If condition={cell.row.canExpand && expandable && isExpandColumn}>
|
|
<span
|
|
{...getToggleRowExpandedProps({
|
|
className: 'expand-toggle',
|
|
})}
|
|
style={{}}
|
|
>
|
|
<span
|
|
className={classNames('expand-arrow', {
|
|
'is-expanded': isExpanded,
|
|
})}
|
|
/>
|
|
</span>
|
|
</If>
|
|
|
|
{cell.column?.money ? (
|
|
<MoneyDisplay>{cell.render('Cell')}</MoneyDisplay>
|
|
) : (
|
|
<>{cell.render('Cell')}</>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|