import React, { useState } from "react";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "@/components/ui/select";
import { Copy } from "lucide-react";
const dummyKommerse = [
{
id: 1,
title: "Upphandling av byggtjänster i Stockholm",
link: "https://www.kommerse.se/upphandling/1",
responseDeadline: "2025-05-10",
responseText: "Anbud ska skickas via e-post till inkop@stockholm.se"
},
{
id: 2,
title: "IT-konsulttjänster för kommuner",
link: "https://www.kommerse.se/upphandling/2",
responseDeadline: "2025-05-15",
responseText: "Logga in på Kommerse.se och lämna anbud via portalen."
}
];
const dummyAvrop = [
{
id: 101,
title: "Ramavtal för IT-supporttjänster",
link: "https://www.avrop.se/upphandling/101",
responseDeadline: "2025-05-05",
responseText: "Anbud lämnas via Avrop.se:s upphandlingsverktyg."
},
{
id: 102,
title: "Upphandling av städtjänster",
link: "https://www.avrop.se/upphandling/102",
responseDeadline: "2025-05-20",
responseText: "Maila ditt anbud till upphandling@avrop.se före deadline."
}
];
const dummyKommun = [
{
id: 201,
title: "Direktupphandling – lekplatsutrustning, Nacka kommun",
link: "https://www.nacka.se/upphandling/201",
responseDeadline: "2025-04-28",
responseText: "Skicka offert till upphandling@nacka.se enligt instruktioner.",
kommun: "Nacka"
},
{
id: 202,
title: "Direktupphandling – kontorsmöbler, Uppsala kommun",
link: "https://www.uppsala.se/upphandling/202",
responseDeadline: "2025-05-03",
responseText: "Offert lämnas via Uppsala kommuns e-portal.",
kommun: "Uppsala"
},
{
id: 203,
title: "Direktupphandling – transporttjänster, Malmö kommun",
link: "https://www.malmo.se/upphandling/203",
responseDeadline: "2025-05-08",
responseText: "Svara via Malmö stads upphandlingssystem. Se länk.",
kommun: "Malmö"
},
{
id: 204,
title: "Direktupphandling – AV-utrustning, Göteborg kommun",
link: "https://www.goteborg.se/upphandling/204",
responseDeadline: "2025-05-12",
responseText: "Anbud lämnas via TendSign. Följ instruktionerna i annonsen.",
kommun: "Göteborg"
}
];
const kommuner = ["Nacka", "Uppsala", "Malmö", "Göteborg"];
export default function UpphandlingSearch() {
const [query, setQuery] = useState("");
const [source, setSource] = useState("kommerse");
const [kommunFilter, setKommunFilter] = useState("");
const [dateFrom, setDateFrom] = useState("");
const [dateTo, setDateTo] = useState("");
const [results, setResults] = useState([]);
const handleSearch = () => {
let data = [];
if (source === "kommerse") data = dummyKommerse;
else if (source === "avrop") data = dummyAvrop;
else if (source === "kommun") data = dummyKommun;
const filtered = data
.filter(r => {
const matchesQuery = r.title.toLowerCase().includes(query.toLowerCase());
const deadline = new Date(r.responseDeadline);
const fromDateValid = dateFrom ? deadline >= new Date(dateFrom) : true;
const toDateValid = dateTo ? deadline <= new Date(dateTo) : true;
const matchesKommun = source !== "kommun" || kommunFilter === "" || r.kommun?.toLowerCase() === kommunFilter.toLowerCase();
return matchesQuery && fromDateValid && toDateValid && matchesKommun;
})
.sort((a, b) => new Date(a.responseDeadline) - new Date(b.responseDeadline));
setResults(filtered);
};
const getDeadlineClass = (date) => {
const today = new Date();
const deadline = new Date(date);
const diffDays = (deadline - today) / (1000 * 60 * 60 * 24);
if (diffDays <= 3) return "text-red-600 font-semibold";
if (diffDays <= 7) return "text-yellow-600 font-medium";
return "text-gray-600";
};
const formatDeadlineText = (date) => {
const today = new Date();
const deadline = new Date(date);
const diffDays = Math.ceil((deadline - today) / (1000 * 60 * 60 * 24));
return `${date} (${diffDays} dagar kvar)`;
};
const copyToClipboard = (text) => {
navigator.clipboard.writeText(text);
};
return (
);
}
Sök upphandlingar
setQuery(e.target.value)}
/>
{source === "kommun" && (
)}
setDateFrom(e.target.value)}
className="w-1/2"
placeholder="Från datum"
/>
setDateTo(e.target.value)}
className="w-1/2"
placeholder="Till datum"
/>
{results.length === 0 &&
{result.title}
))}
Inga resultat än. Sök något!
} {results.map(result => (Sista svarsdag: {formatDeadlineText(result.responseDeadline)}
Så här svarar du: {result.responseText}