Scanner: 0 Treffer durch Anführungszeichen in Schlagwörtern behoben

- Anführungszeichen um Begriffe beim Eingeben, Speichern und Lesen
  entfernen; der Agent vom 29.09. suchte nach "Interim" samt Zeichen
- Umlaute in Such-URLs umschreiben, karriere.at-404 = keine Treffer
- Filterleiste mit festen Breiten, bricht um statt überzulaufen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-09-29 13:19:16 +02:00
co-authored by Claude Opus 5.5
parent 33c9dbdb2b
commit b34a1968df
7 changed files with 51 additions and 16 deletions
+10 -10
View File
@@ -236,7 +236,7 @@ export const ScannerDashboard: React.FC = () => {
<div className="flex flex-wrap items-end gap-3 border-b border-ink-200 p-4">
<h2 className="mr-auto text-sm font-bold uppercase tracking-wider text-ink-900">Stellen-Treffer</h2>
<Filter label="Zeitraum">
<Filter label="Zeitraum" className="w-44">
<select value={hours} onChange={(event) => setHours(Number(event.target.value))} className={inputClass}>
{PERIODS.map((period) => (
<option key={period.value} value={period.value}>
@@ -245,7 +245,7 @@ export const ScannerDashboard: React.FC = () => {
))}
</select>
</Filter>
<Filter label="Agent">
<Filter label="Agent" className="w-44">
<select value={agentId} onChange={(event) => setAgentId(event.target.value)} className={inputClass}>
<option value="">alle</option>
{agents.map((agent) => (
@@ -255,7 +255,7 @@ export const ScannerDashboard: React.FC = () => {
))}
</select>
</Filter>
<Filter label="Börse">
<Filter label="Börse" className="w-40">
<select value={source} onChange={(event) => setSource(event.target.value)} className={inputClass}>
<option value="">alle</option>
{SOURCE_ORDER.map((id) => (
@@ -265,7 +265,7 @@ export const ScannerDashboard: React.FC = () => {
))}
</select>
</Filter>
<Filter label="Ab %">
<Filter label="Ab %" className="w-20">
<input
type="number"
min={0}
@@ -273,22 +273,22 @@ export const ScannerDashboard: React.FC = () => {
step={5}
value={minScore}
onChange={(event) => setMinScore(Number(event.target.value) || 0)}
className={`${inputClass} w-20`}
className={inputClass}
/>
</Filter>
<Filter label="Sortierung">
<Filter label="Sortierung" className="w-48">
<select value={sort} onChange={(event) => setSort(event.target.value as typeof sort)} className={inputClass}>
<option value="known">bekannte Firmen zuerst</option>
<option value="score">beste Quote</option>
<option value="published">neueste Anzeige</option>
</select>
</Filter>
<Filter label="Suche">
<Filter label="Suche" className="w-44">
<input
value={search}
onChange={(event) => setSearch(event.target.value)}
placeholder="Titel, Firma, Ort"
className={`${inputClass} w-44`}
className={inputClass}
/>
</Filter>
<div className="flex flex-col gap-1 pb-1 text-sm text-ink-600">
@@ -422,8 +422,8 @@ const Kpi: React.FC<{ value: React.ReactNode; label: string; icon: string }> = (
</div>
);
const Filter: React.FC<{ label: string; children: React.ReactNode }> = ({ label, children }) => (
<label className="flex flex-col gap-1">
const Filter: React.FC<{ label: string; className?: string; children: React.ReactNode }> = ({ label, className = '', children }) => (
<label className={`flex shrink-0 flex-col gap-1 ${className}`}>
<span className="text-[11px] font-semibold uppercase tracking-wider text-ink-500">{label}</span>
{children}
</label>
+2 -1
View File
@@ -88,9 +88,10 @@ export const TermInput: React.FC<{
const [draft, setDraft] = React.useState('');
const add = (text: string) => {
// Anführungszeichen gehören nicht zum Begriff ("Interim" -> Interim).
const terms = text
.split(',')
.map((term) => term.trim())
.map((term) => term.trim().replace(/^["'„“”‚‘’«»]+|["'„“”‚‘’«»]+$/g, '').trim())
.filter(Boolean)
.filter((term) => !value.some((existing) => existing.toLowerCase() === term.toLowerCase()));
if (terms.length) onChange([...value, ...terms]);