import { forwardRef, useImperativeHandle, useRef, useEffect, useState, useCallback, createElement } from 'react' import { Table, message, Skeleton, Card, Row, Col, Descriptions, Flex, Spin, Button, Input, Space, Tooltip } from 'antd' import { LoadingOutlined } from '@ant-design/icons' import PropTypes from 'prop-types' import { useMediaQuery } from 'react-responsive' import { useContext } from 'react' import { ApiServerContext } from '../context/ApiServerContext' import config from '../../../config' import loglevel from 'loglevel' import { getModelProperties, getModelByName } from '../../../database/ObjectModels' import ObjectProperty from './ObjectProperty' import XMarkIcon from '../../Icons/XMarkIcon' import CheckIcon from '../../Icons/CheckIcon' import { useNavigate } from 'react-router-dom' import QuestionCircleIcon from '../../Icons/QuestionCircleIcon' import { AuthContext } from '../context/AuthContext' import unionBy from 'lodash/unionBy' const logger = loglevel.getLogger('DasboardTable') logger.setLevel(config.logLevel) const ObjectTable = forwardRef( ( { type, pageSize = 25, scrollHeight = 'calc(var(--unit-100vh) - 270px)', onDataChange, initialPage = 1, cards = false, visibleColumns = {}, masterFilter = {} }, ref ) => { const { token } = useContext(AuthContext) const { fetchObjects, connected, subscribeToObjectUpdates, subscribeToObjectTypeUpdates } = useContext(ApiServerContext) const isMobile = useMediaQuery({ maxWidth: 768 }) const navigate = useNavigate() var adjustedScrollHeight = scrollHeight if (isMobile) { adjustedScrollHeight = 'calc(var(--unit-100vh) - 316px)' } if (cards) { adjustedScrollHeight = 'calc(var(--unit-100vh) - 280px)' } const [, contextHolder] = message.useMessage() const tableRef = useRef(null) const model = getModelByName(type) const [tableFilter, setTableFilter] = useState({}) const [tableSorter, setTableSorter] = useState({}) const [initialized, setInitialized] = useState(false) // Table state const [pages, setPages] = useState([]) const pagesRef = useRef(pages) const [hasMore, setHasMore] = useState(true) const [loading, setLoading] = useState(true) const [lazyLoading, setLazyLoading] = useState(false) const subscribedIdsRef = useRef([]) // const [typeSubscribed, setTypeSubscribed] = useState(false) const unsubscribesRef = useRef([]) const updateEventHandlerRef = useRef() const subscribeToObjectTypeUpdatesRef = useRef(null) const rowActions = model.actions?.filter((action) => action.row == true) || [] const createSkeletonData = useCallback(() => { return Array(pageSize) .fill(null) .map(() => ({ _id: `skeleton-${Math.random().toString(36).substring(2, 15)}`, isSkeleton: true })) }, [pageSize]) const renderActions = (objectData) => { return ( {rowActions.map((action, index) => (