Fixed skeleton bug
This commit is contained in:
parent
9ba65075be
commit
eb7f285eef
@ -45,7 +45,6 @@ const ObjectTable = forwardRef(
|
|||||||
(
|
(
|
||||||
{
|
{
|
||||||
type,
|
type,
|
||||||
url,
|
|
||||||
pageSize = 25,
|
pageSize = 25,
|
||||||
scrollHeight = 'calc(var(--unit-100vh) - 270px)',
|
scrollHeight = 'calc(var(--unit-100vh) - 270px)',
|
||||||
onDataChange,
|
onDataChange,
|
||||||
@ -57,7 +56,8 @@ const ObjectTable = forwardRef(
|
|||||||
ref
|
ref
|
||||||
) => {
|
) => {
|
||||||
const { authenticated } = useContext(AuthContext)
|
const { authenticated } = useContext(AuthContext)
|
||||||
const { fetchTableData } = useContext(ApiServerContext)
|
const { fetchObjects, connected, subscribeToObject, subscribeToType } =
|
||||||
|
useContext(ApiServerContext)
|
||||||
const isMobile = useMediaQuery({ maxWidth: 768 })
|
const isMobile = useMediaQuery({ maxWidth: 768 })
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
var adjustedScrollHeight = scrollHeight
|
var adjustedScrollHeight = scrollHeight
|
||||||
@ -135,9 +135,15 @@ const ObjectTable = forwardRef(
|
|||||||
order: sorter.order
|
order: sorter.order
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
console.log('filter 2', filter)
|
console.log('Fetching Objects', {
|
||||||
|
page: pageNum,
|
||||||
|
limit: pageSize,
|
||||||
|
filter: { ...filter, ...masterFilter },
|
||||||
|
sorter,
|
||||||
|
onDataChange
|
||||||
|
})
|
||||||
try {
|
try {
|
||||||
const result = await fetchTableData(type, {
|
const result = await fetchObjects(type, {
|
||||||
page: pageNum,
|
page: pageNum,
|
||||||
limit: pageSize,
|
limit: pageSize,
|
||||||
filter: { ...filter, ...masterFilter },
|
filter: { ...filter, ...masterFilter },
|
||||||
@ -177,7 +183,15 @@ const ObjectTable = forwardRef(
|
|||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[url, pageSize, tableFilter, tableSorter, onDataChange, fetchTableData]
|
[
|
||||||
|
type,
|
||||||
|
masterFilter,
|
||||||
|
pageSize,
|
||||||
|
tableFilter,
|
||||||
|
tableSorter,
|
||||||
|
onDataChange,
|
||||||
|
fetchObjects
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
const loadNextPage = useCallback(() => {
|
const loadNextPage = useCallback(() => {
|
||||||
@ -266,20 +280,81 @@ const ObjectTable = forwardRef(
|
|||||||
)
|
)
|
||||||
|
|
||||||
const reload = useCallback(() => {
|
const reload = useCallback(() => {
|
||||||
return fetchData(1)
|
for (let i = 0; i < pages.length; i++) {
|
||||||
}, [fetchData])
|
const page = pages[i]
|
||||||
|
fetchData(page.pageNum)
|
||||||
|
}
|
||||||
|
}, [fetchData, pages])
|
||||||
|
|
||||||
const updateData = useCallback((_id, updatedData) => {
|
// Update event handler for real-time updates
|
||||||
|
const updateEventHandler = useCallback((updatedData) => {
|
||||||
setPages((prevPages) =>
|
setPages((prevPages) =>
|
||||||
prevPages.map((page) => ({
|
prevPages.map((page) => ({
|
||||||
...page,
|
...page,
|
||||||
items: page.items.map((item) =>
|
items: page.items.map((item) =>
|
||||||
item._id === _id ? { ...item, ...updatedData } : item
|
item._id === updatedData._id ? { ...item, ...updatedData } : item
|
||||||
)
|
)
|
||||||
}))
|
}))
|
||||||
)
|
)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
const newEventHandler = useCallback(
|
||||||
|
(newData) => {
|
||||||
|
if (newData.type == type) {
|
||||||
|
reload()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[reload, type]
|
||||||
|
)
|
||||||
|
|
||||||
|
// Subscribe to real-time updates for all items
|
||||||
|
useEffect(() => {
|
||||||
|
if (pages.length > 0 && connected) {
|
||||||
|
const unsubscribes = []
|
||||||
|
|
||||||
|
// Subscribe to each item in all pages
|
||||||
|
pages.forEach((page) => {
|
||||||
|
page.items.forEach((item) => {
|
||||||
|
if (!item.isSkeleton) {
|
||||||
|
const unsubscribe = subscribeToObject(
|
||||||
|
item._id,
|
||||||
|
type,
|
||||||
|
updateEventHandler
|
||||||
|
)
|
||||||
|
if (unsubscribe) {
|
||||||
|
unsubscribes.push(unsubscribe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
// Clean up all subscriptions
|
||||||
|
unsubscribes.forEach((unsubscribe) => {
|
||||||
|
if (unsubscribe) unsubscribe()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [pages, type, subscribeToObject, updateEventHandler, connected])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (connected == true) {
|
||||||
|
const unsubscribe = subscribeToType(type, newEventHandler)
|
||||||
|
return () => {
|
||||||
|
if (unsubscribe) {
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [type, subscribeToType, connected, newEventHandler])
|
||||||
|
|
||||||
|
const updateData = useCallback(
|
||||||
|
(_id, updatedData) => {
|
||||||
|
updateEventHandler({ _id, ...updatedData })
|
||||||
|
},
|
||||||
|
[updateEventHandler]
|
||||||
|
)
|
||||||
|
|
||||||
const loadPage = useCallback(
|
const loadPage = useCallback(
|
||||||
async (pageNum, filter = null, sorter = null) => {
|
async (pageNum, filter = null, sorter = null) => {
|
||||||
// Create initial page with skeletons
|
// Create initial page with skeletons
|
||||||
@ -288,10 +363,14 @@ const ObjectTable = forwardRef(
|
|||||||
const items = await fetchData(pageNum, filter, sorter)
|
const items = await fetchData(pageNum, filter, sorter)
|
||||||
|
|
||||||
if (items.length >= 25) {
|
if (items.length >= 25) {
|
||||||
setPages((prev) => [
|
setPages((prev) => {
|
||||||
...prev,
|
// Remove any existing page with the same pageNum
|
||||||
|
const filtered = prev.filter((p) => p.pageNum !== pageNum + 1)
|
||||||
|
return [
|
||||||
|
...filtered,
|
||||||
{ pageNum: pageNum + 1, items: createSkeletonData() }
|
{ pageNum: pageNum + 1, items: createSkeletonData() }
|
||||||
])
|
]
|
||||||
|
})
|
||||||
await fetchData(pageNum + 1, filter, sorter)
|
await fetchData(pageNum + 1, filter, sorter)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -378,7 +457,7 @@ const ObjectTable = forwardRef(
|
|||||||
key: 'icon',
|
key: 'icon',
|
||||||
width: 45,
|
width: 45,
|
||||||
fixed: 'left',
|
fixed: 'left',
|
||||||
render: model.icon
|
render: () => React.createElement(model.icon)
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -638,11 +717,9 @@ ObjectTable.displayName = 'ObjectTable'
|
|||||||
|
|
||||||
ObjectTable.propTypes = {
|
ObjectTable.propTypes = {
|
||||||
type: PropTypes.string.isRequired,
|
type: PropTypes.string.isRequired,
|
||||||
url: PropTypes.string.isRequired,
|
|
||||||
pageSize: PropTypes.number,
|
pageSize: PropTypes.number,
|
||||||
scrollHeight: PropTypes.string,
|
scrollHeight: PropTypes.string,
|
||||||
onDataChange: PropTypes.func,
|
onDataChange: PropTypes.func,
|
||||||
authenticated: PropTypes.bool.isRequired,
|
|
||||||
initialPage: PropTypes.number,
|
initialPage: PropTypes.number,
|
||||||
cards: PropTypes.bool,
|
cards: PropTypes.bool,
|
||||||
cardRenderer: PropTypes.func,
|
cardRenderer: PropTypes.func,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user