Enhance SortSidebarButton with Badge and Sorting State Management
Some checks failed
farmcontrol/farmcontrol-ui/pipeline/head There was a failure building this commit

- Integrated Badge component to display the count of active sorters in the SortSidebarButton.
- Utilized useLocation and useTableState hooks to manage sorting state based on the current route.
- Updated TableStateContext to include pageSorters state and setPageSorter function for improved sorting functionality across the dashboard.
This commit is contained in:
Tom Butcher 2026-09-01 20:14:03 +01:00
parent e49c7c23ed
commit aef6ec8749
2 changed files with 64 additions and 19 deletions

View File

@ -1,23 +1,39 @@
import PropTypes from 'prop-types'
import { Button } from 'antd'
import { Badge, Button } from 'antd'
import { useLocation } from 'react-router-dom'
import SortCircleFilledIcon from '../../Icons/SortCircleFilledIcon'
import SortCircleIcon from '../../Icons/SortCircleIcon'
import { useTableState } from '../context/TableStateContext'
const SortSidebarButton = ({ active, onClick, ...buttonProps }) => (
<Button
icon={
active ? (
<SortCircleFilledIcon style={{ color: 'var(--color-primary)' }} />
) : (
<SortCircleIcon />
)
}
onClick={onClick}
type={'default'}
title={active ? 'Hide sort sidebar' : 'Show sort sidebar'}
{...buttonProps}
/>
)
const SortSidebarButton = ({ active, onClick, ...buttonProps }) => {
const location = useLocation()
const { pageSorters } = useTableState()
const sorter = pageSorters[location.pathname]
const count = sorter?.field && sorter?.order ? 1 : 0
return (
<Badge
count={count}
size='small'
offset={[-4, 4]}
style={{ padding: 0, fontWeight: 600 }}
>
<Button
icon={
active ? (
<SortCircleFilledIcon style={{ color: 'var(--color-primary)' }} />
) : (
<SortCircleIcon />
)
}
onClick={onClick}
type={'default'}
title={active ? 'Hide sort sidebar' : 'Show sort sidebar'}
{...buttonProps}
/>
</Badge>
)
}
SortSidebarButton.propTypes = {
active: PropTypes.bool.isRequired,

View File

@ -96,6 +96,7 @@ const normalizeSorter = (sorter) => {
export const TableStateProvider = ({ children }) => {
const [searchParams, setSearchParams] = useSearchParams()
const [pageFilters, setPageFilters] = useState({})
const [pageSorters, setPageSorters] = useState({})
const getPersistedFilter = useCallback(
(scope, { useFilterInUrl = false, useFilterInSession = false } = {}) => {
@ -231,6 +232,19 @@ export const TableStateProvider = ({ children }) => {
})
}, [])
const setPageSorter = useCallback((path, sorter) => {
const hasSort = sorter?.field && sorter?.order
setPageSorters((prev) => {
if (!hasSort) {
if (!(path in prev)) return prev
const next = { ...prev }
delete next[path]
return next
}
return { ...prev, [path]: { field: sorter.field, order: sorter.order } }
})
}, [])
const hasPageFilter = useCallback(
(path) => Object.keys(pageFilters[path] || {}).length > 0,
[pageFilters]
@ -246,9 +260,11 @@ export const TableStateProvider = ({ children }) => {
persistSort,
persistTableState,
setPageFilter,
setPageSorter,
hasPageFilter,
hasStoredFilter,
pageFilters
pageFilters,
pageSorters
}),
[
getPersistedFilter,
@ -257,9 +273,11 @@ export const TableStateProvider = ({ children }) => {
persistSort,
persistTableState,
setPageFilter,
setPageSorter,
hasPageFilter,
hasStoredFilter,
pageFilters
pageFilters,
pageSorters
]
)
@ -298,7 +316,8 @@ export const useTableStatePersistence = ({
persistFilter: persistFilterCtx,
persistSort: persistSortCtx,
persistTableState: persistTableStateCtx,
setPageFilter
setPageFilter,
setPageSorter
} = useTableState()
const readOptions = useMemo(
@ -351,6 +370,15 @@ export const useTableStatePersistence = ({
[pagePath, setPageFilter]
)
const registerPageSorter = useCallback(
(sorter) => {
if (pagePath) {
setPageSorter(pagePath, sorter)
}
},
[pagePath, setPageSorter]
)
return {
getPersistedFilter,
getPersistedSorter,
@ -358,6 +386,7 @@ export const useTableStatePersistence = ({
persistSort,
persistTableState,
registerPageFilter,
registerPageSorter,
getActiveFilterValues
}
}