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

View File

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