UNPKG

es-grid-template

Version:

es-grid-template

324 lines (305 loc) 11.9 kB
// import { useSortable } from "@dnd-kit/sortable" import { flexRender } from '@tanstack/react-table'; import React, { useContext } from 'react'; // import { CSS } from '@dnd-kit/utilities' import { Button, Space } from 'antd'; import { ArrowDown, ArrowUp, FilterFill, SortCancel } from 'becoxy-icons'; import classNames from 'classnames'; import { Checkbox, Dropdown, Select } from 'rc-master-ui'; import { booleanOperator, nonActionColumn, numberOperator, stringOperator, translateOption } from "../hook/constant"; import { extendsObject, getCommonPinningStyles, getDefaultOperator, getTypeFilter } from "../hook/utils"; import { TableContext } from "../useContext"; import { renderFilter } from "./renderFilter"; // import { ColumnTable } from "../type"; // import { Tooltip } from 'react-tooltip' const TableHeadCell = props => { const { header, getPopupContainer, table, t, columnVirtualizer, rowHeaderVirtualizer } = props; const { prefix, setSorterChange, setFilterChange, wrapSettings, selectionSettings, setIsSelectionChange, id } = useContext(TableContext); const isPinned = header.column.getIsPinned(); const isLastLeftPinnedColumn = isPinned === 'left' && header.column.getIsLastColumn('left'); const isFirstRightPinnedColumn = isPinned === 'right' && header.column.getIsFirstColumn('right'); const [selectedKeys, setSelectedKeys] = React.useState([]); const [visible, setVisible] = React.useState(false); const { filterIcon } = header.column.columnDef.meta ?? {}; // const column = (header.column.columnDef ?? {}) as ColumnTable const column = header.column.columnDef; const originalColumn = header.column.columnDef.meta ?? {}; const filtered = (header.column.getFilterValue() ?? []).length > 0; // const filtered = header.column.getIsFiltered() // const { attributes, isDragging, listeners, setNodeRef, transform } = // useSortable({ // id: header.column.id, // }) const style = { // opacity: isDragging ? 0.8 : 1, // position: 'relative', // transform: CSS.Translate.toString(transform), // translate instead of transform to avoid squishing transition: 'width transform 0.2s ease-in-out', whiteSpace: 'nowrap' // width: header.column.getSize(), // zIndex: isDragging ? 1 : 0, }; const getDropdownTrigger = () => { let iconFilter; if (typeof filterIcon === 'function') { iconFilter = filterIcon(filtered); } else if (filterIcon) { iconFilter = filterIcon; } else { iconFilter = /*#__PURE__*/React.createElement(FilterFill, { style: { color: filtered ? '#E3165B' : '#283046' }, fontSize: 12 }); } return /*#__PURE__*/React.createElement("span", { role: "button", tabIndex: -1, className: classNames(`${prefix}-trigger`, { active: filtered }), onClick: e => { e.stopPropagation(); } }, iconFilter); }; const triggerVisible = newVisible => { setVisible(newVisible); }; const onVisibleChange = (newVisible, info) => { if (info.source === 'trigger') { if (newVisible) { const filterValue = header.column.getFilterValue() ?? []; const operatorValue = header.column.getFilterOperator() ?? getDefaultOperator(column?.meta ?? {}); setSelectedKeys(filterValue); header.column.setFilterOperator?.(operatorValue); } else {} triggerVisible(newVisible); } }; const doFilter = type => { if (type) { header.column.setFilterValue(selectedKeys); } else { header.column.setFilterValue(''); setSelectedKeys([]); } setFilterChange(true); triggerVisible(false); }; const mergedDropdownProps = extendsObject({ trigger: ['click'], placement: 'bottomRight', // placement: direction === 'rtl' ? 'bottomLeft' : 'bottomRight', children: getDropdownTrigger(), getPopupContainer }, { // ...filterDropdownProps, // rootClassName: classNames(rootClassName, filterDropdownProps.rootClassName), open: visible, onOpenChange: onVisibleChange, destroyPopupOnHide: true, dropdownRender: () => { const type = getTypeFilter(originalColumn); const operatorValue = header.column.getFilterOperator() ?? getDefaultOperator(originalColumn); const operatorOptions = ['Checkbox', 'Dropdown', 'DropTree', 'CheckboxDropdown'].includes(type) ? booleanOperator : !type || type === 'Text' ? stringOperator : numberOperator; return /*#__PURE__*/React.createElement("div", { // className='ui-rc-table-filter-dropdown' className: classNames(`${prefix}-grid-filter-dropdown`, {}), style: {} }, /*#__PURE__*/React.createElement("div", { style: { minWidth: 275, padding: '8px' } }, /*#__PURE__*/React.createElement("div", null), column.meta?.showOperator !== false && column.meta?.typeFilter !== 'DateRange' && column.meta?.typeFilter !== 'NumberRange' && /*#__PURE__*/React.createElement("div", { className: 'mb-1' }, /*#__PURE__*/React.createElement(Select, { options: translateOption(operatorOptions, t), style: { width: '100%', marginBottom: 8 }, value: operatorValue, onChange: val => { header.column.setFilterOperator(val); } })), /*#__PURE__*/React.createElement("div", { style: { marginBottom: 8 } }, renderFilter({ column: column, selectedKeys, setSelectedKeys // selectedKeys: (header.column.getFilterValue() ?? []) as string[], // setSelectedKeys: header.column.setFilterValue, })), /*#__PURE__*/React.createElement(Space, { style: { justifyContent: 'end', width: '100%' } }, /*#__PURE__*/React.createElement(Button, { type: "primary", onClick: () => { // header.column.setFilterValue(selectedKeys) doFilter(true); }, size: "small", style: { width: 90 } }, t ? t('Filter') : 'Filter'), /*#__PURE__*/React.createElement(Button, { type: "link", size: "small", onClick: () => { // header.column.setFilterValue([]) // header.column.setFilterOperator('') setSelectedKeys([]); doFilter(false); } }, t ? t('Clear') : 'Clear')))); // if (typeof filterDropdownProps?.dropdownRender === 'function') { // return filterDropdownProps.dropdownRender(dropdownContent); // } // return dropdownContent; } }); // if (header.column.id === "#" || header.column.id === "selection_column") { // return ( // <th // ref={el => { // if (el) columnVirtualizer.measureElement(el) // }} // data-index={header.id} // // ref={setNodeRef} // key={header.id} // colSpan={header.colSpan} // style={{ // display: 'flex', // ...getCommonPinningStyles(header.column), // ...style, // width: header?.getSize() ?? header.column.getSize() // }} // > // {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} // {/* <div> */} // <div // {...{ // onDoubleClick: () => header.column.resetSize(), // onMouseDown: header.getResizeHandler(), // onTouchStart: header.getResizeHandler(), // className: `resizer ${header.column.getIsResizing() ? "isResizing" : "" // }`, // }} // /> // {/* </div> */} // </th> // ) // } return /*#__PURE__*/React.createElement("th", { // ref={setNodeRef} className: classNames(`${prefix}-grid-cell`, { [`${prefix}-grid-cell-ellipsis`]: !wrapSettings || !(wrapSettings && (wrapSettings.wrapMode === 'Both' || wrapSettings.wrapMode === 'Header')), [`${prefix}-grid-cell-wrap`]: wrapSettings && (wrapSettings.wrapMode === 'Both' || wrapSettings.wrapMode === 'Header'), [`${prefix}-grid-cell-fix-left-last`]: isLastLeftPinnedColumn, [`${prefix}-grid-cell-fix-right-first`]: isFirstRightPinnedColumn }), key: header.id, style: { display: 'flex', width: header.getSize(), ...getCommonPinningStyles(header.column), ...style } }, /*#__PURE__*/React.createElement("div", { className: classNames('', { [`${prefix}-grid-filter-column`]: header.column.id !== 'selection_column', [`${prefix}-grid-selection-column`]: header.column.id === 'selection_column' }) }, header.column.id === 'selection_column' && selectionSettings && selectionSettings.hideSelectAll !== false && selectionSettings.type !== 'single' && selectionSettings.mode !== 'radio' && /*#__PURE__*/React.createElement(Checkbox, { checked: table.getIsAllRowsSelected(), indeterminate: table.getIsSomeRowsSelected(), onChange: e => { setIsSelectionChange({ isChange: true, type: 'all', rowData: {} }); table.getToggleAllRowsSelectedHandler()(e); } }), header.column.id !== 'selection_column' && /*#__PURE__*/React.createElement("span", { className: "ui-rc-table-column-title", style: { flex: 1 } }, /*#__PURE__*/React.createElement("div", { className: classNames('', { [`${prefix}-grid-cell-ellipsis`]: !wrapSettings || !(wrapSettings && (wrapSettings.wrapMode === 'Both' || wrapSettings.wrapMode === 'Header')), [`${prefix}-grid-cell-text-wrap`]: wrapSettings && (wrapSettings.wrapMode === 'Both' || wrapSettings.wrapMode === 'Header') }) }, flexRender(header.column.columnDef.header, header.getContext()))), !nonActionColumn.includes(header.id) && /*#__PURE__*/React.createElement("span", { className: "ui-rc-header-trigger" }, header.column.getCanSort() && /*#__PURE__*/React.createElement("div", { style: { marginInlineEnd: 6 }, onClick: e => { setSorterChange(true); const toggleSortingHandler = header.column.getToggleSortingHandler(); if (typeof toggleSortingHandler === 'function') { toggleSortingHandler(e); } } }, header.column.getIsSorted() ? header.column.getIsSorted() === 'asc' ? /*#__PURE__*/React.createElement(ArrowUp, { fontSize: 15, color: '#000', "data-tooltip-id": `${id}-tooltip-header-trigger`, "data-tooltip-content": "Nh\u1EA5p \u0111\u1EC3 s\u1EAFp x\u1EBFp gi\u1EA3m d\u1EA7n" }) : /*#__PURE__*/React.createElement(ArrowDown, { fontSize: 15, color: '#000', "data-tooltip-id": `${id}-tooltip-header-trigger`, "data-tooltip-content": "Nh\u1EA5p \u0111\u1EC3 h\u1EE7y s\u1EAFp x\u1EBFp" }) : /*#__PURE__*/React.createElement(SortCancel, { "data-tooltip-id": `${id}-tooltip-header-trigger`, "data-tooltip-content": "Nh\u1EA5p \u0111\u1EC3 s\u1EAFp x\u1EBFp t\u0103ng d\u1EA7n", fontSize: 15, style: { display: 'flex' }, className: classNames(`ui-rc-table-column-sorter-cancel`, { active: true }) })), header.column.getCanFilter() && /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Dropdown, mergedDropdownProps)))), header.column.getCanResize() && /*#__PURE__*/React.createElement("div", { onDoubleClick: () => header.column.resetSize(), onMouseDown: header.getResizeHandler(), onTouchStart: header.getResizeHandler(), onMouseUp: () => { requestAnimationFrame(() => { columnVirtualizer.measure(); rowHeaderVirtualizer.measure(); }); }, className: `resizer ${header.column.getIsResizing() ? 'isResizing' : ''}` })); }; export default TableHeadCell;