Enhance SortSidebarButton with Badge and Sorting State Management
Some checks failed
farmcontrol/farmcontrol-ui/pipeline/head There was a failure building this commit
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:
parent
e49c7c23ed
commit
aef6ec8749
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user