Skip to content

Commit

Permalink
slimmer category filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
jlarsson committed Feb 20, 2025
1 parent 972ea3a commit d853d37
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 22 deletions.
12 changes: 11 additions & 1 deletion src/adverts/components/filter/filters/FilterDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { TagsContext } from 'tags'
import { AuthContext } from 'auth'
import { CategoriesFilter } from './CategoriesFilter'
import { StringArrayFilter } from './StringArrayFilter'
import { CategoriesFilter2 } from './experimental/CategoriesFilter2'

export interface SelectedFilters {
categories: string[]
Expand Down Expand Up @@ -119,10 +120,19 @@ export const FilterDialog: FC<{
onChange={setSizes}
/>
)}
<CategoriesFilter
<CategoriesFilter2
selected={categories}
onCategoriesChanged={setCategories}
/>
{
// disable previous version of category filter
false && (
<CategoriesFilter
selected={categories}
onCategoriesChanged={setCategories}
/>
)
}
{model.tags.length > 0 && (
<StringArrayFilter
label={phrase('TERMS_FIELD_TAGS', 'Taggar')}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { FC, Fragment, useContext, useState } from 'react'
import { CategoriesContext } from 'categories'
import useAsync from 'hooks/use-async'
import { Category } from 'categories/types'
import { Typography } from '@mui/material'
import { TreeSelect } from './TreeSelect'

// Take a list of categories and recursively trim list to only contain
Expand Down Expand Up @@ -66,11 +67,16 @@ export const CategoriesFilter2: FC<{
pending: () => <Fragment key="pending" />,
rejected: () => <Fragment key="rejected" />,
resolved: (categories) => (
<CategoriesTree
categories={categories}
selected={selected}
onCategoriesChanged={onCategoriesChanged}
/>
<>
<Typography variant="subtitle1" gutterBottom>
Kategorier
</Typography>
<CategoriesTree
categories={categories}
selected={selected}
onCategoriesChanged={onCategoriesChanged}
/>
</>
),
})
}
46 changes: 30 additions & 16 deletions src/adverts/components/filter/filters/experimental/TreeSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export function TreeSelect<T>({
value: T
selected: boolean
pselected: boolean
cselected: boolean
expanded: boolean
children: Node[]
canExpand: boolean
Expand All @@ -40,21 +41,32 @@ export function TreeSelect<T>({
const selectedSet = new Set(selected)
const expandedSet = new Set(expanded)

const buildNode = (item: T, pselected: boolean): Node => ({
label: getLabel(item),
value: item,
selected: selectedSet.has(getKey(item)),
expanded: expandedSet.has(getKey(item)),
canExpand:
!expandedSet.has(getKey(item)) && getChildren(item).length > 0,
canCollapse:
expandedSet.has(getKey(item)) && getChildren(item).length > 0,
pselected,
children: getChildren(item).map((child) =>
buildNode(child, pselected || selectedSet.has(getKey(item)))
),
})
// From input items, construct display nodes that can feed ourr recursive rendering
const buildNode = (item: T, pselected: boolean): Node =>
((n: Node) => ({
...n,
cselected: n.children.some((c) => c.selected || c.cselected),
}))({
label: getLabel(item),
value: item,
selected: selectedSet.has(getKey(item)),
pselected,
cselected: false,
expanded: expandedSet.has(getKey(item)),
canExpand:
!expandedSet.has(getKey(item)) && getChildren(item).length > 0,
canCollapse:
expandedSet.has(getKey(item)) && getChildren(item).length > 0,
children: getChildren(item).map((child) =>
buildNode(child, pselected || selectedSet.has(getKey(item)))
),
})

const flexCells = 16
// Render a node using some neat flex trix
// - indentation is done by flex={level}
// - buttons and checkboxes have flex={1}
// - content fills out with flex={flexCells - level}
const renderNode = (node: Node, level: number) => (
<Fragment key={getKey(node.value)}>
<Grid container spacing={0} key={getKey(node.value)}>
Expand Down Expand Up @@ -91,7 +103,9 @@ export function TreeSelect<T>({
<Checkbox
checked={node.selected}
indeterminate={
node.pselected && !node.selected ? true : undefined
(node.cselected || node.pselected) && !node.selected
? true
: undefined
}
onChange={() =>
onSelected(
Expand All @@ -104,7 +118,7 @@ export function TreeSelect<T>({
}
/>
</Grid>
<Grid item flex={16 - level} alignContent="center">
<Grid item flex={flexCells - level} alignContent="center">
<Box>{node.label}</Box>
</Grid>
</Grid>
Expand Down

0 comments on commit d853d37

Please sign in to comment.