import { makeStyles } from '@material-ui/core' import classnames from 'classnames' import { Field, useFormikContext } from 'formik' import * as R from 'ramda' import React, { useContext } from 'react' import { Link, IconButton } from 'src/components/buttons' import { Td, Tr } from 'src/components/fake-table/Table' import { Switch } from 'src/components/inputs' import { TL2 } from 'src/components/typography' import { ReactComponent as DisabledDeleteIcon } from 'src/styling/icons/action/delete/disabled.svg' import { ReactComponent as DeleteIcon } from 'src/styling/icons/action/delete/enabled.svg' import { ReactComponent as DisabledEditIcon } from 'src/styling/icons/action/edit/disabled.svg' import { ReactComponent as EditIcon } from 'src/styling/icons/action/edit/enabled.svg' import { ReactComponent as StripesSvg } from 'src/styling/icons/stripes.svg' import TableCtx from './Context' import styles from './Row.styles' const useStyles = makeStyles(styles) const ActionCol = ({ disabled, editing }) => { const classes = useStyles() const { values, submitForm, resetForm } = useFormikContext() const { editWidth, onEdit, enableEdit, enableDelete, disableRowEdit, onDelete, deleteWidth, enableToggle, onToggle, toggleWidth, actionColSize } = useContext(TableCtx) const disableEdit = disabled || (disableRowEdit && disableRowEdit(values)) return ( <> {editing && ( Cancel Save )} {!editing && enableEdit && ( onEdit && onEdit(values.id)}> {disableEdit ? : } )} {!editing && enableDelete && ( onDelete(values.id)}> {disabled ? : } )} {!editing && enableToggle && ( onToggle(values.id)} /> )} ) } const ECol = ({ editing, focus, config, extraPaddingRight, extraPaddingLeft }) => { const { name, input, editable = true, size, bold, width, textAlign, suffix, view = it => it?.toString(), inputProps = {} } = config const { values } = useFormikContext() const classes = useStyles({ textAlign, size }) const innerProps = { fullWidth: true, autoFocus: focus, size, bold, textAlign, ...inputProps } // Autocomplete if (innerProps.options && !innerProps.getLabel) { innerProps.getLabel = view } return ( {editing && editable ? ( ) : ( values && <>{view(values[name])} )} {suffix && {suffix}} ) } const groupStriped = elements => { const [toStripe, noStripe] = R.partition(R.has('stripe'))(elements) if (!toStripe.length) { return elements } const index = R.indexOf(toStripe[0], elements) const width = R.compose(R.sum, R.map(R.path(['width'])))(toStripe) return R.insert( index, { width, editable: false, view: () => }, noStripe ) } const ERow = ({ editing, disabled, lastOfGroup }) => { const { errors } = useFormikContext() const { elements, enableEdit, enableDelete, enableToggle, rowSize, stripeWhen } = useContext(TableCtx) const classes = useStyles() const { values } = useFormikContext() const shouldStripe = stripeWhen && stripeWhen(values) && !editing const innerElements = shouldStripe ? groupStriped(elements) : elements const [toSHeader] = R.partition(R.has('doubleHeader'))(elements) const extraPaddingLeftIndex = toSHeader?.length ? R.indexOf(toSHeader[0], elements) : -1 const extraPaddingRightIndex = toSHeader?.length ? R.indexOf(toSHeader[toSHeader.length - 1], elements) : -1 const elementToFocusIndex = innerElements.findIndex( it => it.editable === undefined || it.editable ) const classNames = { [classes.lastOfGroup]: lastOfGroup } return ( {innerElements.map((it, idx) => { return ( ) })} {(enableEdit || enableDelete || enableToggle) && ( )} ) } export default ERow