Á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 handleSubmit = async (e?: React.FormEvent, page = 1) => {
73
- e?.preventDefault();
74
- setShowOnlyFollowed(false);
75
  setIsLoading(true);
76
  try {
 
 
 
77
  await onSearch({
78
- keyword,
 
79
  buyer: buyerCode,
80
  date,
81
- skip: (page - 1) * itemsPerPage,
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={handleSubmit} className="grid grid-cols-1 md:grid-cols-4 gap-6 animate-in slide-in-from-top-4 duration-500">
 
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-[111px] truncate">{tender.buyer}</td>
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'