Scrum4Me/components/jobs/jobs-time-filter.tsx
Janpeter Visser 3ad352c10f
Sprint: ll (#206)
* feat(jobs): voeg lib/jobs-time-filter.ts toe met tijdvenster-predikaat

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(user-settings): voeg views.jobs.timeFilter toe aan UserSettingsSchema

Breidt ViewsPrefs uit met een jobs-object (JobsViewPrefs) dat timeFilter
accepteert met waarden '1h' | '24h' | 'all'. ViewsPrefs blijft .strict().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(jobs-time-filter): voeg unit-tests toe voor isWithinTimeWindow en UserSettings-schema

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(jobs-time-filter): voeg JobsTimeFilterControl component toe

Nieuw client-component dat views.jobs.timeFilter leest/schrijft
via useUserSettingsStore met pill-stijl (MD3-tokens).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(jobs): wire JobsTimeFilter in jobs page header

Plaatst het tijdfilter-component rechts van de Jobs-kop via justify-between op de header-div.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(jobs): pas tijdvenster-filter toe in JobsColumn

Lees views.jobs.timeFilter uit de store en filter jobs op createdAt via isWithinTimeWindow, als eerste check vóór de bestaande kind/status-filters.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 21:06:59 +02:00

48 lines
1.4 KiB
TypeScript

'use client'
import { useShallow } from 'zustand/react/shallow'
import { useUserSettingsStore } from '@/stores/user-settings/store'
import { cn } from '@/lib/utils'
import { debugProps } from '@/lib/debug'
import {
JOBS_TIME_FILTER_VALUES,
DEFAULT_JOBS_TIME_FILTER,
type JobsTimeFilter,
} from '@/lib/jobs-time-filter'
const LABELS: Record<JobsTimeFilter, string> = {
'1h': '1 uur',
'24h': '24 uur',
all: 'Alles',
}
export default function JobsTimeFilterControl() {
const current =
useUserSettingsStore(
useShallow((s) => s.entities.settings.views?.jobs?.timeFilter),
) ?? DEFAULT_JOBS_TIME_FILTER
const setPref = useUserSettingsStore((s) => s.setPref)
return (
<div
className="flex items-center gap-1.5"
{...debugProps('jobs-time-filter', 'JobsTimeFilter', 'components/jobs/jobs-time-filter.tsx')}
>
{JOBS_TIME_FILTER_VALUES.map((v) => (
<button
key={v}
type="button"
onClick={() => void setPref(['views', 'jobs', 'timeFilter'], v)}
className={cn(
'text-xs px-2.5 py-1 rounded-full border transition-colors',
current === v
? 'bg-primary text-primary-foreground border-primary'
: 'bg-transparent border-border hover:bg-surface-container',
)}
>
{LABELS[v]}
</button>
))}
</div>
)
}