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:
Scrum4Me Agent 2026-05-06 07:17:09 +02:00
parent 5c8a6170e1
commit 39d071aec6

View file

@ -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