UNPKG

es-grid-template

Version:

es-grid-template

283 lines (273 loc) 10.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classnames = _interopRequireDefault(require("classnames")); var _TableHead = _interopRequireDefault(require("../header/TableHead")); var _TableBody = _interopRequireDefault(require("../body/TableBody")); var _TableFooter = _interopRequireDefault(require("../footer/TableFooter")); var _LoadingSpinner = _interopRequireDefault(require("../../grid-component/LoadingSpinner")); var _reactTooltip = require("react-tooltip"); var _ContextMenu = _interopRequireDefault(require("../ContextMenu")); var _react = _interopRequireWildcard(require("react")); var _useContext = require("../useContext"); var _utils = require("../hook/utils"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } const TableWrapper = props => { const { id, prefix, tableContainerRef, height, minHeight, summary, table, loading, commandClick, editAble, contextMenuItems: propContextMenuItems, contextMenuHidden, showEmptyText, contextMenuClick, contextMenuOpen, next, dataSource, pagination, infiniteScroll, onEndReachedThreshold, columnVirtualizer, fixedLeftColumns, fixedRightColumns, virtualPaddingLeft, virtualPaddingRight } = props; const menuRef = _react.default.useRef(null); const loadingRef = _react.default.useRef(false); const hasMoreRef = _react.default.useRef(true); const { windowSize } = (0, _react.useContext)(_useContext.TableContext); const { currentPage, pageSize, total } = pagination ?? {}; const [menuVisible, setMenuVisible] = _react.default.useState(false); const [selectedRowData, setSelectedRowData] = _react.default.useState(undefined); const [position, setPosition] = _react.default.useState({ x: 0, y: 0, viewportWidth: windowSize.innerWidth, viewportHeight: windowSize.innerHeight }); const contextMenuItems = _react.default.useMemo(() => { if (typeof contextMenuHidden === 'function' && propContextMenuItems && selectedRowData) { const hiddenItems = contextMenuHidden({ rowInfo: { rowData: selectedRowData.rowData }, field: selectedRowData.field }); return propContextMenuItems.filter(item => !hiddenItems.includes(item?.key)); } if (contextMenuHidden && typeof contextMenuHidden !== 'function' && propContextMenuItems) { return propContextMenuItems.filter(item => !contextMenuHidden.includes(item?.key)); } return propContextMenuItems; }, [propContextMenuItems, contextMenuHidden, selectedRowData]); const loadData = page => { if (!hasMoreRef.current || loadingRef.current || loading) return; loadingRef.current = true; setTimeout(() => { next?.(); if (page * pageSize >= total) { hasMoreRef.current = false; } loadingRef.current = false; }, 10); }; const handleNext = () => { loadData(currentPage + 1); }; const handleScroll = e => { if (infiniteScroll) { if (loadingRef.current || loading || dataSource?.length === 0) { e.stopPropagation(); e.preventDefault(); return; } const { scrollHeight: tbScrollHeight, scrollTop, clientHeight } = e.currentTarget; const abc = clientHeight * ((0, _utils.isNullOrUndefined)(onEndReachedThreshold) ? 0.1 : onEndReachedThreshold ?? 0); // const isEnd = scrollTop + clientHeight >= tbScrollHeight - 50; const isEnd = scrollTop + clientHeight >= tbScrollHeight - abc; if (isEnd && !loadingRef.current && hasMoreRef.current && dataSource?.length > 0) { handleNext(); } } if (e.target.scrollLeft >= 0 && e.target.scrollLeft + e.target.clientWidth < e.target.scrollWidth) { e.target.classList.add('ui-rc-table-ping-right'); } else { e.target.classList.remove('ui-rc-table-ping-right'); } if ((e.target.scrollLeft ?? 0) > 0) { e.target.classList.add('ui-rc-table-ping-left'); } else { e.target.classList.remove('ui-rc-table-ping-left'); } }; const onContextMenu = args => event => { event.preventDefault(); // Ngăn chặn menu mặc định của trình duyệt setSelectedRowData(args); contextMenuOpen?.({ rowInfo: { rowData: args.rowData }, field: args.field, event }); // Đợi DOM cập nhật và lấy kích thước menu setTimeout(() => { setMenuVisible(true); const menuElement = menuRef.current; // Lấy menu từ DOM const menuWidth = menuElement?.offsetWidth || 200; // Mặc định 200px nếu chưa render const menuHeight = menuElement?.offsetHeight; // Mặc định 450px nếu chưa render // Điều chỉnh vị trí menu let x = event.clientX; let y = event.clientY; if (x + menuWidth > windowSize.innerWidth) { x = x - menuWidth - 10; // Cách cạnh phải 10px } if (y + menuHeight > windowSize.innerHeight) { if (y < menuHeight) { y = 10; } else { y = y - 10 - menuHeight; // Cách cạnh dưới 10px } } setPosition(prevState => ({ ...prevState, x, y })); }, 100); // if (!menuVisible) { // document.addEventListener(`click`, function onClickOutside(e) { // const element: any = e.target // const menuContainer = document.querySelector('.popup-context-menu') // const isInsideContainer = element.closest('.popup-context-menu') && menuContainer // if (isInsideContainer) { // return // } // setMenuVisible(false) // setPosition(prevState => ({ ...prevState, x: undefined, y: undefined })) // document.removeEventListener(`click`, onClickOutside) // }) // } }; _react.default.useEffect(() => { const handleClickOutside = event => { const element = event.target; const containerContextMenu = document.querySelector(".popup-context-menu"); const isInsideContainerContext = containerContextMenu && element.closest(".popup-context-menu"); if (isInsideContainerContext) { return; } else { setMenuVisible(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); return /*#__PURE__*/_react.default.createElement("div", { style: { position: 'relative' }, className: (0, _classnames.default)(`${prefix}-grid-container`, { 'ui-rc-table-ping-right': tableContainerRef && (tableContainerRef.current?.scrollLeft ?? 0) >= 0 && (tableContainerRef.current?.scrollLeft ?? 0) + (tableContainerRef.current?.clientWidth ?? 0) < (tableContainerRef.current?.scrollWidth ?? 0), 'ui-rc-table-ping-left': tableContainerRef && (tableContainerRef.current?.scrollLeft ?? 0) > 0 }) }, /*#__PURE__*/_react.default.createElement("div", { // id={id} ref: tableContainerRef, style: { overflow: 'auto', //our scrollable table container position: 'relative', //needed for sticky header maxHeight: height, //should be a fixed height minHeight: minHeight ? height : undefined //should be a fixed height } // onScroll={infiniteScroll ? handleScroll : undefined} , onScroll: handleScroll }, /*#__PURE__*/_react.default.createElement("div", { style: { display: 'grid', minWidth: table.getTotalSize() } }, /*#__PURE__*/_react.default.createElement(_TableHead.default, { tableContainerRef: tableContainerRef, table: table, columnVirtualizer: columnVirtualizer, virtualPaddingLeft: virtualPaddingLeft, virtualPaddingRight: virtualPaddingRight, fixedLeftColumns: fixedLeftColumns, fixedRightColumns: fixedRightColumns }), /*#__PURE__*/_react.default.createElement(_TableBody.default, { tableId: id, table: table, tableContainerRef: tableContainerRef, commandClick: commandClick, editAble: editAble, contextMenuItems: contextMenuItems, showEmptyText: showEmptyText, onContextMenu: onContextMenu, columnVirtualizer: columnVirtualizer, virtualPaddingLeft: virtualPaddingLeft, virtualPaddingRight: virtualPaddingRight, fixedLeftColumns: fixedLeftColumns, fixedRightColumns: fixedRightColumns }), summary && /*#__PURE__*/_react.default.createElement(_TableFooter.default // columnVirtualizer={columnVirtualizer} , { table: table // virtualPaddingLeft={virtualPaddingLeft} // virtualPaddingRight={virtualPaddingRight} // fixedLeftColumns={fixedLeftColumns} // fixedRightColumns={fixedRightColumns} }))), loading && /*#__PURE__*/_react.default.createElement("div", { className: "spinner-loading" }, /*#__PURE__*/_react.default.createElement(_LoadingSpinner.default, null)), /*#__PURE__*/_react.default.createElement(_reactTooltip.Tooltip, { id: `${id}-tooltip-content`, style: { zIndex: 1999, maxWidth: 450 }, delayShow: 100 }), /*#__PURE__*/_react.default.createElement(_reactTooltip.Tooltip, { id: `${id}-tooltip-error`, style: { zIndex: 1999, maxWidth: 450 } }), menuVisible && /*#__PURE__*/_react.default.createElement(_ContextMenu.default, { open: menuVisible, pos: position, setOpen: setMenuVisible, menuRef: menuRef, contextMenuItems: contextMenuItems, contextMenuClick: contextMenuClick, rowData: selectedRowData })); }; var _default = exports.default = TableWrapper;