import _ from 'lodash'; import { HTML5toTouch } from 'rdndmb-html5-to-touch'; import React, { useCallback, useEffect, useState } from 'react'; import { DndProvider } from 'react-dnd-multi-backend'; import Form from 'Components/Form/Form'; import FormGroup from 'Components/Form/FormGroup'; import FormInputGroup from 'Components/Form/FormInputGroup'; import FormInputHelpText from 'Components/Form/FormInputHelpText'; import FormLabel from 'Components/Form/FormLabel'; import Button from 'Components/Link/Button'; import Modal from 'Components/Modal/Modal'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes } from 'Helpers/Props'; import { CheckInputChanged, InputChanged } from 'typings/inputs'; import { TableOptionsChangePayload } from 'typings/Table'; import translate from 'Utilities/String/translate'; import Column from '../Column'; import TableOptionsColumn from './TableOptionsColumn'; import styles from './TableOptionsModal.css'; export interface TableOptionsModalProps { isOpen: boolean; columns: Column[]; pageSize?: number; maxPageSize?: number; canModifyColumns?: boolean; optionsComponent?: React.ElementType; onTableOptionChange: (payload: TableOptionsChangePayload) => void; onModalClose: () => void; } function TableOptionsModal({ isOpen, columns, canModifyColumns = true, optionsComponent: OptionsComponent, pageSize: propsPageSize, maxPageSize = 250, onTableOptionChange, onModalClose, }: TableOptionsModalProps) { const [pageSize, setPageSize] = useState(propsPageSize); const [pageSizeError, setPageSizeError] = useState(null); const [dragIndex, setDragIndex] = useState(null); const [dropIndex, setDropIndex] = useState(null); const hasPageSize = !!propsPageSize; const isDragging = dropIndex !== null; const isDraggingUp = isDragging && dropIndex != null && dragIndex != null && dropIndex < dragIndex; const isDraggingDown = isDragging && dropIndex != null && dragIndex != null && dropIndex > dragIndex; const handlePageSizeChange = useCallback( ({ value }: InputChanged) => { let error: string | null = null; if (value === null || value < 5) { error = translate('TablePageSizeMinimum', { minimumValue: '5', }); } else if (value > maxPageSize) { error = translate('TablePageSizeMaximum', { maximumValue: `${maxPageSize}`, }); } else { onTableOptionChange({ pageSize: value }); } setPageSize(value ?? 0); setPageSizeError(error); }, [maxPageSize, onTableOptionChange] ); const handleVisibleChange = useCallback( ({ name, value }: CheckInputChanged) => { const newColumns = columns.map((column) => { if (column.name === name) { return { ...column, isVisible: value, }; } return column; }); onTableOptionChange({ columns: newColumns }); }, [columns, onTableOptionChange] ); const handleColumnDragMove = useCallback( (newDragIndex: number, newDropIndex: number) => { setDropIndex(newDropIndex); setDragIndex(newDragIndex); }, [] ); const handleColumnDragEnd = useCallback( (didDrop: boolean) => { if (didDrop && dragIndex !== null && dropIndex !== null) { const newColumns = [...columns]; const items = newColumns.splice(dragIndex, 1); newColumns.splice(dropIndex, 0, items[0]); onTableOptionChange({ columns: newColumns }); } setDragIndex(null); setDropIndex(null); }, [dragIndex, dropIndex, columns, onTableOptionChange] ); useEffect(() => { setPageSize(propsPageSize); }, [propsPageSize]); return ( {isOpen ? ( {translate('TableOptions')} {hasPageSize ? ( {translate('TablePageSize')} ) : null} {OptionsComponent ? ( ) : null} {canModifyColumns ? ( {translate('TableColumns')} {columns.map((column, index) => { const { name, label, columnLabel, isVisible, isModifiable = true, } = column; return ( ); })} ) : null} {translate('Close')} ) : null} ); } export default TableOptionsModal;