feat(ideas): sorted useMemo + tabel-render koppelen (ST-cmotjj9uf000104l5i70so19b)
- Voeg sorted useMemo toe na filtered: locale-aware sort met STATUS_SORT_ORDER - Ideeën zonder product sorteren achteraan bij oplopende productsortering - Vervang filtered.length/filtered.map door sorted in tabel-render Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
5c8a6170e1
commit
39d071aec6
1 changed files with 22 additions and 2 deletions
|
|
@ -154,6 +154,26 @@ export function IdeaList({ ideas, products, isDemo }: IdeaListProps) {
|
|||
})
|
||||
}, [ideas, search, productFilter, statusFilter, sortKey, sortDir])
|
||||
|
||||
const sorted = useMemo(() => {
|
||||
return [...filtered].sort((a, b) => {
|
||||
let cmp = 0
|
||||
if (sortKey === 'code') {
|
||||
cmp = (a.code ?? '').localeCompare(b.code ?? '', 'nl', { numeric: true })
|
||||
} else if (sortKey === 'title') {
|
||||
cmp = a.title.localeCompare(b.title, 'nl')
|
||||
} else if (sortKey === 'product') {
|
||||
const aN = a.product?.name ?? ''
|
||||
const bN = b.product?.name ?? ''
|
||||
if (!aN && bN) return sortDir === 'asc' ? 1 : -1
|
||||
if (aN && !bN) return sortDir === 'asc' ? -1 : 1
|
||||
cmp = aN.localeCompare(bN, 'nl')
|
||||
} else {
|
||||
cmp = (STATUS_SORT_ORDER[a.status] ?? 99) - (STATUS_SORT_ORDER[b.status] ?? 99)
|
||||
}
|
||||
return sortDir === 'asc' ? cmp : -cmp
|
||||
})
|
||||
}, [filtered, sortKey, sortDir])
|
||||
|
||||
function handleSort(col: SortKey) {
|
||||
if (sortKey === col) {
|
||||
setSortDir((d) => (d === 'asc' ? 'desc' : 'asc'))
|
||||
|
|
@ -316,7 +336,7 @@ export function IdeaList({ ideas, products, isDemo }: IdeaListProps) {
|
|||
)}
|
||||
|
||||
{/* Tabel */}
|
||||
{filtered.length === 0 ? (
|
||||
{sorted.length === 0 ? (
|
||||
<p className="text-sm text-muted-foreground py-8 text-center">
|
||||
{ideas.length === 0
|
||||
? 'Nog geen ideeën — start hierboven met "Nieuw idee".'
|
||||
|
|
@ -334,7 +354,7 @@ export function IdeaList({ ideas, products, isDemo }: IdeaListProps) {
|
|||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{filtered.map((idea) => {
|
||||
{sorted.map((idea) => {
|
||||
const badge = getIdeaStatusBadge(API_TO_DB[idea.status])
|
||||
return (
|
||||
<TableRow
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue