脕lvaro Valenzuela Valdes commited on
Commit 路
434a703
1
Parent(s): cb1e16d
feat: make Dashboard pipeline items clickable with View button
Browse files- frontend/app/page.tsx +1 -0
- frontend/components/Dashboard.tsx +16 -5
frontend/app/page.tsx
CHANGED
|
@@ -277,6 +277,7 @@ export default function HomePage() {
|
|
| 277 |
followedTendersCount={followedCount}
|
| 278 |
tenders={tenders}
|
| 279 |
onFilterClick={handleFilterClick}
|
|
|
|
| 280 |
lang={lang}
|
| 281 |
/>
|
| 282 |
)}
|
|
|
|
| 277 |
followedTendersCount={followedCount}
|
| 278 |
tenders={tenders}
|
| 279 |
onFilterClick={handleFilterClick}
|
| 280 |
+
onTenderClick={handleTenderSelect}
|
| 281 |
lang={lang}
|
| 282 |
/>
|
| 283 |
)}
|
frontend/components/Dashboard.tsx
CHANGED
|
@@ -14,6 +14,7 @@ type Props = {
|
|
| 14 |
followedTendersCount: number;
|
| 15 |
tenders: Tender[];
|
| 16 |
onFilterClick?: (type: "sector" | "region", value: string) => void;
|
|
|
|
| 17 |
lang: Language;
|
| 18 |
};
|
| 19 |
|
|
@@ -25,6 +26,7 @@ export default function Dashboard({
|
|
| 25 |
followedTendersCount,
|
| 26 |
tenders,
|
| 27 |
onFilterClick,
|
|
|
|
| 28 |
lang
|
| 29 |
}: Props) {
|
| 30 |
const t = translations[lang];
|
|
@@ -298,25 +300,34 @@ export default function Dashboard({
|
|
| 298 |
{tenders.length > 0 ? (
|
| 299 |
tenders.slice(0, 5).map((t) => (
|
| 300 |
// ... existing map logic ...
|
| 301 |
-
<div
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
<div className="flex items-center gap-4 overflow-hidden">
|
| 303 |
<div className="h-10 w-10 flex-shrink-0 rounded-full bg-slate-800 flex items-center justify-center text-cyan group-hover:scale-110 transition">
|
| 304 |
{t.sector?.charAt(0) || "T"}
|
| 305 |
</div>
|
| 306 |
<div className="overflow-hidden">
|
| 307 |
-
<div className="text-sm font-medium text-white truncate">{t.name}</div>
|
| 308 |
<div className="text-xs text-slate-500 truncate">{t.buyer}</div>
|
| 309 |
</div>
|
| 310 |
</div>
|
| 311 |
<div className="flex items-center gap-6 text-right">
|
| 312 |
-
<div className="hidden
|
| 313 |
-
<div className="text-
|
| 314 |
<div className="text-xs text-slate-300">{t.region || "N/A"}</div>
|
| 315 |
</div>
|
| 316 |
<div className="min-w-[80px]">
|
| 317 |
-
<div className="text-
|
| 318 |
<div className="text-xs font-mono text-cyan">{t.code}</div>
|
| 319 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 320 |
</div>
|
| 321 |
</div>
|
| 322 |
))
|
|
|
|
| 14 |
followedTendersCount: number;
|
| 15 |
tenders: Tender[];
|
| 16 |
onFilterClick?: (type: "sector" | "region", value: string) => void;
|
| 17 |
+
onTenderClick?: (tender: Tender) => void;
|
| 18 |
lang: Language;
|
| 19 |
};
|
| 20 |
|
|
|
|
| 26 |
followedTendersCount,
|
| 27 |
tenders,
|
| 28 |
onFilterClick,
|
| 29 |
+
onTenderClick,
|
| 30 |
lang
|
| 31 |
}: Props) {
|
| 32 |
const t = translations[lang];
|
|
|
|
| 300 |
{tenders.length > 0 ? (
|
| 301 |
tenders.slice(0, 5).map((t) => (
|
| 302 |
// ... existing map logic ...
|
| 303 |
+
<div
|
| 304 |
+
key={t.code}
|
| 305 |
+
onClick={() => onTenderClick?.(t)}
|
| 306 |
+
className="flex items-center justify-between p-4 rounded-2xl bg-slate-900/40 border border-slate-800/50 hover:bg-slate-900/60 transition group cursor-pointer"
|
| 307 |
+
>
|
| 308 |
<div className="flex items-center gap-4 overflow-hidden">
|
| 309 |
<div className="h-10 w-10 flex-shrink-0 rounded-full bg-slate-800 flex items-center justify-center text-cyan group-hover:scale-110 transition">
|
| 310 |
{t.sector?.charAt(0) || "T"}
|
| 311 |
</div>
|
| 312 |
<div className="overflow-hidden">
|
| 313 |
+
<div className="text-sm font-medium text-white truncate max-w-[200px] md:max-w-[400px]">{t.name}</div>
|
| 314 |
<div className="text-xs text-slate-500 truncate">{t.buyer}</div>
|
| 315 |
</div>
|
| 316 |
</div>
|
| 317 |
<div className="flex items-center gap-6 text-right">
|
| 318 |
+
<div className="hidden lg:block min-w-[100px]">
|
| 319 |
+
<div className="text-[10px] uppercase font-bold text-slate-500">Regi贸n</div>
|
| 320 |
<div className="text-xs text-slate-300">{t.region || "N/A"}</div>
|
| 321 |
</div>
|
| 322 |
<div className="min-w-[80px]">
|
| 323 |
+
<div className="text-[10px] uppercase font-bold text-slate-500">C贸digo</div>
|
| 324 |
<div className="text-xs font-mono text-cyan">{t.code}</div>
|
| 325 |
</div>
|
| 326 |
+
<button
|
| 327 |
+
className="px-4 py-2 rounded-xl bg-cyan/10 border border-cyan/20 text-[10px] font-black text-cyan uppercase tracking-widest group-hover:bg-cyan group-hover:text-black transition-all"
|
| 328 |
+
>
|
| 329 |
+
View
|
| 330 |
+
</button>
|
| 331 |
</div>
|
| 332 |
</div>
|
| 333 |
))
|