feat: demo özelliklerini gerçekleştir — canlı veri + localStorage

- analytics.js: firmStats/itemStats/provinceDensity (gerçek hesaplama)
- Rakip Radar: canlı veriden kazanan firma analizi (mock 3 firma kaldırıldı)
- Fiyat Analizi: gerçek kalem min/medyan/ort/maks + CSV export
- TurkeyHeatMap: 81 il gerçek interaktif yoğunluk haritası (tıkla→filtrele)
- Favori kurumlar: kart yıldızı + hızlı filtre (localStorage)
- Ekip yönetimi: gerçek CRUD (RightSidebar) + Kanban ataması ekipten
- Bildirimler: gerçek Notification API + izin + test + sessiz saatler
- PDF: jsPDF ile gerçek birim fiyat teklif cetveli (kaşe/imza alanı)
This commit is contained in:
2026-08-28 01:58:46 +03:00
parent 512d529af2
commit 0ab74143c0
16 changed files with 895 additions and 154 deletions
+9 -1
View File
@@ -3,7 +3,8 @@ import { useApp } from '../context/AppContext';
import { Star, MapPin, Clock, Tag, Package, Building2, AlertTriangle, Sparkles } from 'lucide-react';
export const TenderCard = ({ tender }) => {
const { toggleTrackTender, setActiveTenderDetail } = useApp();
const { toggleTrackTender, setActiveTenderDetail, favoriteKurumlar, toggleFavoriteKurum } = useApp();
const isFavKurum = favoriteKurumlar?.includes((tender.kurum || '').trim());
const [day, monthYear] = tender.tarih ? tender.tarih.split('.') : ['01', '01.2026'];
const monthYearFormatted = monthYear ? `${monthYear}` : '08.2026';
@@ -62,6 +63,13 @@ export const TenderCard = ({ tender }) => {
<span className="flex items-center gap-1 text-slate-700 font-semibold truncate max-w-md">
<Building2 className="w-3.5 h-3.5 text-slate-400 shrink-0" />
<span className="truncate">{tender.kurum}</span>
<button
onClick={(e) => { e.stopPropagation(); toggleFavoriteKurum(tender.kurum); }}
title={isFavKurum ? 'Favori kurumdan çıkar' : 'Kurumu favorilere ekle'}
className="shrink-0 p-0.5"
>
<Star className={`w-3.5 h-3.5 ${isFavKurum ? 'text-amber-500 fill-amber-500' : 'text-slate-300 hover:text-amber-400'}`} />
</button>
</span>
<span className="flex items-center gap-1 text-slate-600">
<MapPin className="w-3.5 h-3.5 text-rose-500 shrink-0" />