Scanner: Altersfenster "älter als / jünger als" (Tage)
Ersetzt die feste Auswahl bis/über 21 Tage durch zwei freie Felder, einzeln oder kombiniert (z. B. älter 14, jünger 30). API: olderThan, youngerThan; age=recent|old bleibt für Altaufrufe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
651ad2b954
commit
1e273ddd92
@@ -65,8 +65,9 @@ export const ScannerDashboard: React.FC = () => {
|
||||
const [showDiscarded, setShowDiscarded] = useState(false);
|
||||
const [search, setSearch] = useState('');
|
||||
const [sort, setSort] = useState<SortState>({ key: 'known', dir: 'desc' });
|
||||
/** Alter der Anzeige: alle | bis 21 Tage | älter als 21 Tage */
|
||||
const [age, setAge] = useState<'' | 'recent' | 'old'>('');
|
||||
/** Altersfenster der Anzeige in Tagen; leer = keine Grenze. */
|
||||
const [olderThan, setOlderThan] = useState('');
|
||||
const [youngerThan, setYoungerThan] = useState('');
|
||||
const [alarmOnly, setAlarmOnly] = useState(false);
|
||||
|
||||
const wasRunning = useRef(false);
|
||||
@@ -81,7 +82,8 @@ export const ScannerDashboard: React.FC = () => {
|
||||
known: knownOnly ? 1 : undefined,
|
||||
status: showDiscarded ? 'alle' : undefined,
|
||||
q: search.trim() || undefined,
|
||||
age: age || undefined,
|
||||
olderThan: Number(olderThan) > 0 ? Number(olderThan) : undefined,
|
||||
youngerThan: Number(youngerThan) > 0 ? Number(youngerThan) : undefined,
|
||||
alarm: alarmOnly ? 1 : undefined,
|
||||
sort: sort.key,
|
||||
dir: sort.dir,
|
||||
@@ -91,7 +93,7 @@ export const ScannerDashboard: React.FC = () => {
|
||||
} catch (err) {
|
||||
toast(err instanceof Error ? err.message : 'Treffer nicht ladbar.', 'error');
|
||||
}
|
||||
}, [hours, agentId, source, minScore, knownOnly, showDiscarded, search, age, alarmOnly, sort, toast]);
|
||||
}, [hours, agentId, source, minScore, knownOnly, showDiscarded, search, olderThan, youngerThan, alarmOnly, sort, toast]);
|
||||
|
||||
const loadOverview = useCallback(async () => {
|
||||
try {
|
||||
@@ -175,7 +177,7 @@ export const ScannerDashboard: React.FC = () => {
|
||||
<div className="flex flex-wrap items-start justify-between gap-3">
|
||||
<div>
|
||||
<p className="text-sm text-ink-500">
|
||||
Offene Stellen aus Jobbörsen in DACH – jedes Alter, gefiltert wird unten nach „Anzeigenalter“.
|
||||
Offene Stellen aus Jobbörsen in DACH – jedes Alter, eingrenzen unten mit „Älter als“ / „Jünger als“.
|
||||
</p>
|
||||
<div className="mt-2 flex flex-wrap items-center gap-2 text-xs">
|
||||
<span
|
||||
@@ -272,12 +274,31 @@ export const ScannerDashboard: React.FC = () => {
|
||||
))}
|
||||
</select>
|
||||
</Filter>
|
||||
<Filter label="Anzeigenalter" className="w-44">
|
||||
<select value={age} onChange={(event) => setAge(event.target.value as typeof age)} className={inputClass}>
|
||||
<option value="">alle</option>
|
||||
<option value="recent">bis 21 Tage</option>
|
||||
<option value="old">älter als 21 Tage</option>
|
||||
</select>
|
||||
<Filter label="Älter als (Tage)" className="w-28">
|
||||
<input
|
||||
type="number"
|
||||
min={0}
|
||||
value={olderThan}
|
||||
onChange={(event) => setOlderThan(event.target.value)}
|
||||
placeholder="–"
|
||||
title="Nur Anzeigen, die mindestens so viele Tage alt sind"
|
||||
className={inputClass}
|
||||
/>
|
||||
</Filter>
|
||||
<Filter label="Jünger als (Tage)" className="w-28">
|
||||
<input
|
||||
type="number"
|
||||
min={0}
|
||||
value={youngerThan}
|
||||
onChange={(event) => setYoungerThan(event.target.value)}
|
||||
placeholder="–"
|
||||
title="Nur Anzeigen, die höchstens so viele Tage alt sind"
|
||||
className={`${inputClass} ${
|
||||
Number(olderThan) > 0 && Number(youngerThan) > 0 && Number(youngerThan) <= Number(olderThan)
|
||||
? 'border-red-400'
|
||||
: ''
|
||||
}`}
|
||||
/>
|
||||
</Filter>
|
||||
<Filter label="Ab %" className="w-20">
|
||||
<input
|
||||
|
||||
Reference in New Issue
Block a user