{"version":3,"file":"useTable.hook.mjs","sources":["../../src/lib/hooks/useTable.hook.jsx"],"sourcesContent":["/*\nCopyright 2019 Iguazio Systems Ltd.\n\nLicensed under the Apache License, Version 2.0 (the \"License\") with\nan addition restriction as set forth herein. You may not use this\nfile except in compliance with the License. You may obtain a copy of\nthe License at http://www.apache.org/licenses/LICENSE-2.0.\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing\npermissions and limitations under the License.\n\nIn addition, you may not use the software for any purposes that are\nillegal under applicable law, and the grant of the foregoing license\nunder the Apache 2.0 license is conditioned upon your compliance with\nsuch restriction.\n*/\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport classnames from 'classnames'\nimport { useSelector } from 'react-redux'\nimport { isEmpty } from 'lodash'\n\nimport TableHead from '../elements/TableHead/TableHead'\n\nimport { MAIN_TABLE_BODY_ID, MAIN_TABLE_ID } from '../constants'\nimport { SORT_PROPS } from '../types'\nimport { VIRTUALIZATION_CONFIG } from '../types'\n\nconst TableContainer = ({\n  children,\n  hideActionsMenu = false,\n  mainRowItemsCount = 1,\n  pageData = null,\n  renderDetails = null,\n  selectedItem = {},\n  sortProps = null,\n  tableBodyRef,\n  tableClass,\n  tableContentRef,\n  tableHeadRef,\n  tableHeaders,\n  tablePanelRef,\n  tableRef,\n  tableStore = null,\n  tableWrapperClass,\n  virtualizationConfig = {\n    tableBodyPaddingTop: 0,\n    startIndex: -1,\n    endIndex: -1\n  }\n}) => {\n  return (\n    <div className=\"table__flex\">\n      <div className=\"table__content\" id=\"table-content\" ref={tableContentRef}>\n        <div className={tableWrapperClass}>\n          <table\n            id={MAIN_TABLE_ID}\n            className={tableClass}\n            cellPadding=\"0\"\n            cellSpacing=\"0\"\n            ref={tableRef}\n          >\n            {tableHeaders?.length > 0 && (\n              <TableHead\n                content={tableHeaders}\n                hideActionsMenu={hideActionsMenu}\n                mainRowItemsCount={mainRowItemsCount}\n                ref={tableHeadRef}\n                selectedItem={selectedItem}\n                sortProps={sortProps}\n              />\n            )}\n            <tbody\n              className=\"table-body\"\n              id={MAIN_TABLE_BODY_ID}\n              style={{ paddingTop: virtualizationConfig.tableBodyPaddingTop }}\n              ref={tableBodyRef}\n            >\n              {children}\n            </tbody>\n          </table>\n          {tableStore?.isTablePanelOpen && pageData?.tablePanel && (\n            <div className=\"table__panel-container\" ref={tablePanelRef}>\n              <div className=\"table__panel\">{pageData.tablePanel}</div>\n            </div>\n          )}\n        </div>\n        {renderDetails && renderDetails()}\n      </div>\n    </div>\n  )\n}\n\nTableContainer.propTypes = {\n  children: PropTypes.node.isRequired,\n  hideActionsMenu: PropTypes.bool,\n  mainRowItemsCount: PropTypes.number,\n  pageData: PropTypes.object,\n  renderDetails: PropTypes.func,\n  selectedItem: PropTypes.object,\n  sortProps: SORT_PROPS,\n  tableBodyRef: PropTypes.object.isRequired,\n  tableClass: PropTypes.string.isRequired,\n  tableContentRef: PropTypes.object.isRequired,\n  tableHeadRef: PropTypes.object.isRequired,\n  tableHeaders: PropTypes.arrayOf(PropTypes.object).isRequired,\n  tablePanelRef: PropTypes.object.isRequired,\n  tableRef: PropTypes.object.isRequired,\n  tableStore: PropTypes.object,\n  tableWrapperClass: PropTypes.string.isRequired,\n  virtualizationConfig: VIRTUALIZATION_CONFIG\n}\n\nexport const useTable = ({ ref, selectedItem, skipTableWrapper = false, tableClassName = '' }) => {\n  const tableRefLocal = useRef(null)\n  const tableBodyRefLocal = useRef(null)\n  const tableRef = ref?.tableRef ?? tableRefLocal\n  const tableBodyRef = ref?.tableBodyRef ?? tableBodyRefLocal\n  const tableContentRef = useRef(null)\n  const tablePanelRef = useRef(null)\n  const tableHeadRef = useRef(null)\n  const tableStore = useSelector(store => store.tableStore) ?? {}\n\n  const tableClass = classnames(\n    'table',\n    'table-main',\n    !isEmpty(selectedItem) && 'table-with-details',\n    tableClassName && tableClassName\n  )\n  const tableWrapperClass = classnames(!skipTableWrapper && 'table__wrapper')\n\n  useEffect(() => {\n    const calculatePanelHeight = () => {\n      if (tableHeadRef?.current && tableContentRef?.current && tablePanelRef?.current) {\n        const tableContentHeight = tableContentRef.current.getBoundingClientRect().height\n        const tableHeadCords = tableHeadRef.current.getBoundingClientRect()\n        const panelHeight = window.innerHeight - tableHeadCords.top\n\n        tablePanelRef.current.style.height =\n          tableContentHeight > panelHeight\n            ? `${panelHeight}px`\n            : `${panelHeight - (panelHeight - tableContentHeight)}px`\n      }\n    }\n\n    if (tableStore.isTablePanelOpen && tablePanelRef.current) {\n      calculatePanelHeight()\n\n      document.getElementById('main-wrapper').addEventListener('scroll', calculatePanelHeight)\n      window.addEventListener('resize', calculatePanelHeight)\n    }\n    return () => {\n      window.removeEventListener('scroll', calculatePanelHeight)\n      window.removeEventListener('resize', calculatePanelHeight)\n    }\n  }, [tableStore.isTablePanelOpen])\n\n  const handleTableHScroll = useCallback(\n    e => {\n      if (tableRef.current) {\n        const tableScrollPosition = e.target.scrollLeft\n\n        if (tableScrollPosition > 0) {\n          tableRef.current.classList.add('table__scrolled')\n        } else {\n          tableRef.current.classList.remove('table__scrolled')\n        }\n      }\n    },\n    [tableRef]\n  )\n\n  useEffect(() => {\n    window.addEventListener('scroll', handleTableHScroll, true)\n\n    return () => window.removeEventListener('scroll', handleTableHScroll, true)\n  }, [handleTableHScroll])\n\n  return {\n    TableContainer,\n    tableBodyRef,\n    tableClass,\n    tableContentRef,\n    tableHeadRef,\n    tablePanelRef,\n    tableRef,\n    tableStore,\n    tableWrapperClass\n  }\n}\n\nexport const useTableScroll = ({\n  content,\n  selectedItem,\n  isAllVersions,\n  tableId = MAIN_TABLE_ID\n}) => {\n  const lastSelectedItemDataRef = useRef(null)\n  const itemIdentifierKey = useMemo(\n    () => (isAllVersions ? 'identifierUnique' : 'identifier'),\n    [isAllVersions]\n  )\n\n  const handleSelectItemChanges = useCallback(\n    (identifier, content, async = false) => {\n      const selectedItemIndex = content?.findIndex(\n        item => item?.ui?.[itemIdentifierKey] === identifier\n      )\n\n      const triggerScroll = () => {\n        const tableElement = document.getElementById(tableId)\n\n        if (selectedItemIndex && tableElement) {\n          const rows = tableElement.getElementsByTagName('tr')\n\n          if (selectedItemIndex <= rows.length) {\n            const theadHeight =\n              tableElement.querySelector('thead')?.getBoundingClientRect().height ?? 0\n            const rowRect = rows[selectedItemIndex].getBoundingClientRect()\n            const tableRect = tableElement.getBoundingClientRect()\n            const rowCenterY = rowRect.height / 2\n            const tableCenterY = (tableRect.height - theadHeight) / 2\n            const heightToRow = rowRect.height * (selectedItemIndex + 1)\n            const scrollY = heightToRow - rowCenterY - tableCenterY\n\n            tableElement.scrollTo({\n              top: scrollY\n            })\n          }\n        }\n      }\n\n      if (selectedItemIndex >= 0) {\n        if (async) {\n          requestAnimationFrame(() => {\n            triggerScroll()\n          })\n        } else {\n          triggerScroll()\n        }\n      }\n    },\n    [itemIdentifierKey, tableId]\n  )\n\n  useEffect(() => {\n    try {\n      if (!isEmpty(selectedItem)) {\n        if (!lastSelectedItemDataRef.current) {\n          lastSelectedItemDataRef.current = selectedItem.ui\n          handleSelectItemChanges(selectedItem?.ui?.[itemIdentifierKey], content, true)\n        } else {\n          lastSelectedItemDataRef.current = selectedItem.ui\n        }\n      } else if (lastSelectedItemDataRef.current) {\n        handleSelectItemChanges(lastSelectedItemDataRef.current?.[itemIdentifierKey], content)\n\n        lastSelectedItemDataRef.current = null\n      }\n    } catch {\n      lastSelectedItemDataRef.current = null\n    }\n  }, [selectedItem, content, handleSelectItemChanges, itemIdentifierKey])\n\n  useEffect(() => {\n    return () => {\n      lastSelectedItemDataRef.current = null\n    }\n  }, [content])\n}\n"],"names":["TableContainer","children","hideActionsMenu","mainRowItemsCount","pageData","renderDetails","selectedItem","sortProps","tableBodyRef","tableClass","tableContentRef","tableHeadRef","tableHeaders","tablePanelRef","tableRef","tableStore","tableWrapperClass","virtualizationConfig","jsx","jsxs","MAIN_TABLE_ID","TableHead","MAIN_TABLE_BODY_ID","PropTypes","SORT_PROPS","VIRTUALIZATION_CONFIG","useTable","ref","skipTableWrapper","tableClassName","tableRefLocal","useRef","tableBodyRefLocal","useSelector","store","classnames","isEmpty","useEffect","calculatePanelHeight","tableContentHeight","tableHeadCords","panelHeight","handleTableHScroll","useCallback","e","useTableScroll","content","isAllVersions","tableId","lastSelectedItemDataRef","itemIdentifierKey","useMemo","handleSelectItemChanges","identifier","async","selectedItemIndex","item","_a","triggerScroll","tableElement","rows","theadHeight","rowRect","tableRect","rowCenterY","tableCenterY","scrollY","_b"],"mappings":"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"}