Álvaro Valenzuela Valdes commited on
Commit ·
a7c74bb
1
Parent(s): c5a34a3
feat: Intelligent dual-mode search (Code vs Keyword) and UI fixes
Browse files
frontend/components/TenderSearch.tsx
CHANGED
|
@@ -69,18 +69,23 @@ export default function TenderSearch({ tenders, onSearch, onAnalyze, forceShowFo
|
|
| 69 |
}, 2500);
|
| 70 |
};
|
| 71 |
|
| 72 |
-
const
|
| 73 |
-
e
|
| 74 |
-
setShowOnlyFollowed(false);
|
| 75 |
setIsLoading(true);
|
| 76 |
try {
|
|
|
|
|
|
|
|
|
|
| 77 |
await onSearch({
|
| 78 |
-
keyword
|
|
|
|
| 79 |
buyer: buyerCode,
|
| 80 |
date,
|
| 81 |
-
skip:
|
| 82 |
limit: itemsPerPage
|
| 83 |
});
|
|
|
|
|
|
|
| 84 |
} finally {
|
| 85 |
setIsLoading(false);
|
| 86 |
}
|
|
@@ -126,7 +131,8 @@ export default function TenderSearch({ tenders, onSearch, onAnalyze, forceShowFo
|
|
| 126 |
</div>
|
| 127 |
|
| 128 |
{!forceShowFollowed && (
|
| 129 |
-
<form onSubmit={
|
|
|
|
| 130 |
<div className="space-y-2">
|
| 131 |
<label className="text-[10px] uppercase tracking-wider text-slate-500 font-bold px-1">Keyword</label>
|
| 132 |
<input
|
|
@@ -255,7 +261,7 @@ export default function TenderSearch({ tenders, onSearch, onAnalyze, forceShowFo
|
|
| 255 |
<span className="text-[8px] px-1.5 py-0.5 rounded-md bg-white/5 text-slate-600 border border-white/5 uppercase tracking-tighter">{tender.sector}</span>
|
| 256 |
</div>
|
| 257 |
</td>
|
| 258 |
-
<td className="px-4 py-5 text-slate-400 text-[
|
| 259 |
<td className="px-4 py-5 text-center">
|
| 260 |
<span className={`inline-block rounded-full px-2 py-0.5 text-[9px] font-bold ${
|
| 261 |
tender.status.toLowerCase().includes('publicada') ? 'bg-green-500/10 text-green-400 border border-green-500/20' : 'bg-slate-800/50 text-slate-500'
|
|
|
|
| 69 |
}, 2500);
|
| 70 |
};
|
| 71 |
|
| 72 |
+
const handleSearch = async (e?: React.FormEvent) => {
|
| 73 |
+
if (e) e.preventDefault();
|
|
|
|
| 74 |
setIsLoading(true);
|
| 75 |
try {
|
| 76 |
+
// Logic: If the query looks like a code (contains hyphens), prioritize code search
|
| 77 |
+
const isCode = /^[0-9]+-[0-9]+-[A-Z0-9]+$/i.test(keyword);
|
| 78 |
+
|
| 79 |
await onSearch({
|
| 80 |
+
keyword: isCode ? undefined : keyword,
|
| 81 |
+
provider_code: isCode ? keyword : undefined,
|
| 82 |
buyer: buyerCode,
|
| 83 |
date,
|
| 84 |
+
skip: 0,
|
| 85 |
limit: itemsPerPage
|
| 86 |
});
|
| 87 |
+
} catch (error) {
|
| 88 |
+
console.error(error);
|
| 89 |
} finally {
|
| 90 |
setIsLoading(false);
|
| 91 |
}
|
|
|
|
| 131 |
</div>
|
| 132 |
|
| 133 |
{!forceShowFollowed && (
|
| 134 |
+
<form onSubmit={handleSearch} className="grid grid-cols-1 md:grid-cols-4 gap-6 animate-in slide-in-from-top-4 duration-500">
|
| 135 |
+
|
| 136 |
<div className="space-y-2">
|
| 137 |
<label className="text-[10px] uppercase tracking-wider text-slate-500 font-bold px-1">Keyword</label>
|
| 138 |
<input
|
|
|
|
| 261 |
<span className="text-[8px] px-1.5 py-0.5 rounded-md bg-white/5 text-slate-600 border border-white/5 uppercase tracking-tighter">{tender.sector}</span>
|
| 262 |
</div>
|
| 263 |
</td>
|
| 264 |
+
<td className="px-4 py-5 text-slate-400 text-[11px] truncate">{tender.buyer}</td>
|
| 265 |
<td className="px-4 py-5 text-center">
|
| 266 |
<span className={`inline-block rounded-full px-2 py-0.5 text-[9px] font-bold ${
|
| 267 |
tender.status.toLowerCase().includes('publicada') ? 'bg-green-500/10 text-green-400 border border-green-500/20' : 'bg-slate-800/50 text-slate-500'
|