Refactor ObjectTable and ObjectListViewContext for Simplified Filter Management

- Removed unnecessary state management for masterFilter and masterSort in ObjectTable, streamlining filter handling.
- Updated ObjectListViewContext to simplify view state restoration logic, enhancing clarity and maintainability.
- Adjusted references to masterFilter throughout ObjectTable to ensure consistent filter application.
This commit is contained in:
Tom Butcher 2026-09-02 21:35:56 +01:00
parent 73de7ac8ee
commit b6834fecc6
2 changed files with 17 additions and 80 deletions

View File

@ -323,11 +323,6 @@ const ObjectTable = forwardRef(
activeObjectViewRef.current = activeObjectView
const onObjectViewFilterSortChangeRef = useRef(onObjectViewFilterSortChange)
onObjectViewFilterSortChangeRef.current = onObjectViewFilterSortChange
const listViewMastersRef = useRef({ masterFilter: {}, masterSort: {} })
const [listViewMasters, setListViewMastersState] = useState({
masterFilter: {},
masterSort: {}
})
const [sidebarFilter, setSidebarFilter] = useState({})
const [tableSorter, setTableSorter] = useState({})
const [initialized, setInitialized] = useState(false)
@ -380,30 +375,12 @@ const ObjectTable = forwardRef(
)
const prevValuesRef = useRef({ type, masterFilter })
const effectiveMasterFilter = useMemo(
() => ({
...listViewMasters.masterFilter,
...masterFilter
}),
[listViewMasters.masterFilter, masterFilter]
)
const getEffectiveMasterFilter = useCallback(
() => ({
...listViewMastersRef.current.masterFilter,
...masterFilter
}),
[masterFilter]
)
const getMasterFilter = useCallback(() => masterFilter || {}, [masterFilter])
const resolveSorter = useCallback((userSorter) => {
if (userSorter?.field && userSorter?.order) {
return { field: userSorter.field, order: userSorter.order }
}
const masterSort = listViewMastersRef.current.masterSort
if (masterSort?.field && masterSort?.order) {
return { field: masterSort.field, order: masterSort.order }
}
return {}
}, [])
@ -546,14 +523,14 @@ const ObjectTable = forwardRef(
return fetchObjects(type, {
page: pageNum,
limit: pageSize,
filter: { ...getEffectiveMasterFilter(), ...filter },
filter: { ...getMasterFilter(), ...filter },
sorter: resolveSorter(sorter),
onDataChange
})
},
[
type,
getEffectiveMasterFilter,
getMasterFilter,
pageSize,
onDataChange,
fetchObjects,
@ -916,15 +893,15 @@ const ObjectTable = forwardRef(
Object.entries(sidebarFilter).forEach(([k, v]) => {
if (v !== '' && v !== undefined) active[k] = v
})
return { ...effectiveMasterFilter, ...active }
}, [sidebarFilter, effectiveMasterFilter])
return { ...masterFilter, ...active }
}, [sidebarFilter, masterFilter])
const tableFilterContextValue = useMemo(
() => ({
filter: getActiveFilterValues(sidebarFilter),
masterFilter: effectiveMasterFilter
masterFilter
}),
[sidebarFilter, effectiveMasterFilter]
[sidebarFilter, masterFilter]
)
newEventHandlerRef.current = newEventHandler
@ -1111,20 +1088,6 @@ const ObjectTable = forwardRef(
resolveSorter
])
const setListViewMasters = useCallback(
({ masterFilter: nextMasterFilter = {}, masterSort: nextMasterSort = {} }) => {
listViewMastersRef.current = {
masterFilter: nextMasterFilter,
masterSort: nextMasterSort
}
setListViewMastersState({
masterFilter: nextMasterFilter,
masterSort: nextMasterSort
})
},
[]
)
const applyViewState = useCallback(
(filterState, sorterState) => {
if (filterState == null && sorterState == null) {
@ -1170,7 +1133,6 @@ const ObjectTable = forwardRef(
useImperativeHandle(ref, () => ({
reload,
applyViewState,
setListViewMasters,
setData: (newData) => {
setPages([{ pageNum: 1, items: newData }])
},
@ -1246,7 +1208,7 @@ const ObjectTable = forwardRef(
propertyLabel={propertyLabel}
modelType={type}
filter={sidebarFilter}
masterFilter={effectiveMasterFilter}
masterFilter={masterFilter}
/>
)
@ -1440,7 +1402,7 @@ const ObjectTable = forwardRef(
}
}
if (isFilterable && !Object.keys(effectiveMasterFilter).includes(prop.name)) {
if (isFilterable && !Object.keys(masterFilter).includes(prop.name)) {
columnConfig.filterDropdown = ({
setSelectedKeys,
selectedKeys,
@ -1719,7 +1681,7 @@ const ObjectTable = forwardRef(
type={type}
filter={sidebarFilter}
onFilterChange={handleSidebarFilterChange}
masterFilter={effectiveMasterFilter}
masterFilter={masterFilter}
/>
</Flex>
)}

View File

@ -140,23 +140,16 @@ export const ObjectListViewProvider = ({
if (tabKey !== ALL_TAB_KEY && !view) return
if (editing) {
tableRef.current.setListViewMasters?.({
masterFilter: {},
masterSort: {}
})
tableRef.current.applyViewState(
view?.filter || {},
view?.sort?.field ? view.sort : {}
)
// "All" outside edit mode restores the user's persisted filter/sort
if (tabKey === ALL_TAB_KEY && !editing) {
tableRef.current.applyViewState(null, null)
return
}
tableRef.current.setListViewMasters?.({
masterFilter: view?.filter || {},
masterSort: view?.sort?.field ? view.sort : {}
})
tableRef.current.applyViewState(null, null)
tableRef.current.applyViewState(
view?.filter || {},
view?.sort?.field ? view.sort : {}
)
},
[tableRef]
)
@ -698,16 +691,6 @@ export const ObjectListViewProvider = ({
const lastSyncedViewKeyRef = useRef(null)
const masterFilter = useMemo(() => {
if (isEditing || !activeView) return {}
return activeView.filter || {}
}, [activeView, isEditing])
const masterSort = useMemo(() => {
if (isEditing || !activeView?.sort?.field) return {}
return activeView.sort
}, [activeView, isEditing])
useEffect(() => {
const viewKey = isEditing
? `edit:${activeView?._id ?? activeTabKey}`
@ -722,8 +705,6 @@ export const ObjectListViewProvider = ({
onViewStateChange?.({
activeView: isEditing ? activeViewRef.current : null,
masterFilter,
masterSort,
isEditing,
handleFilterSortChange: isEditing
? stableFilterSortHandlerRef.current
@ -733,8 +714,6 @@ export const ObjectListViewProvider = ({
activeTabKey,
activeView?._id,
isEditing,
masterFilter,
masterSort,
onViewStateChange
])
@ -750,8 +729,6 @@ export const ObjectListViewProvider = ({
views: displayedViews,
activeView,
activeTabKey,
masterFilter,
masterSort,
initialLoading,
saving,
isEditing,
@ -773,8 +750,6 @@ export const ObjectListViewProvider = ({
displayedViews,
activeView,
activeTabKey,
masterFilter,
masterSort,
initialLoading,
saving,
isEditing,