import classnames from 'classnames' import * as R from 'ramda' import React, { useContext } from 'react' import { Td, THead, TDoubleLevelHead, ThDoubleLevel } from '../fake-table/Table' import { sentenceCase } from '../../utils/string' import TableCtx from './Context' const groupSecondHeader = elements => { const doubleHeader = R.prop('doubleHeader') const sameDoubleHeader = (a, b) => doubleHeader(a) === doubleHeader(b) const group = R.pipe( R.groupWith(sameDoubleHeader), R.map(group => R.isNil(doubleHeader(group[0])) // No doubleHeader ? group : [ { width: R.sum(R.map(R.prop('width'), group)), elements: group, name: doubleHeader(group[0]), }, ], ), R.reduce(R.concat, []), ) return R.all(R.pipe(doubleHeader, R.isNil), elements) ? [elements, THead] : [group(elements), TDoubleLevelHead] } const Header = () => { const { elements, enableEdit, enableEditText, editWidth, enableDelete, deleteWidth, enableToggle, toggleWidth, orderedBy, DEFAULT_COL_SIZE, } = useContext(TableCtx) const mapElement2 = (it, idx) => { const { width, elements, name } = it if (elements && elements.length) { return ( {elements.map(mapElement)} ) } return mapElement(it, idx) } const mapElement = ( { name, display, width = DEFAULT_COL_SIZE, header, textAlign }, idx, ) => { const orderClasses = classnames({ 'whitespace-nowrap': R.isNil(header) && !R.isNil(orderedBy) && R.equals(name, orderedBy.code), }) const attachOrderedByToComplexHeader = header => { if (!R.isNil(orderedBy) && R.equals(name, orderedBy.code)) { try { const cloneHeader = R.clone(header) const children = R.path(['props', 'children'], cloneHeader) const spanChild = R.find(it => R.equals(it.type, 'span'), children) spanChild.props.children = R.append(' -', spanChild.props.children) return cloneHeader } catch (e) { console.error(e) return header } } return header } return ( {!R.isNil(header) ? ( <>{attachOrderedByToComplexHeader(header) ?? header} ) : ( {!R.isNil(display) ? display : sentenceCase(name)}{' '} {!R.isNil(orderedBy) && R.equals(name, orderedBy.code) && '-'} )} ) } const [innerElements, HeaderElement] = groupSecondHeader(elements) return ( {innerElements.map(mapElement2)} {enableEdit && ( {enableEditText ?? `Edit`} )} {enableDelete && ( Delete )} {enableToggle && ( Enable )} ) } export default Header