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
+6 -2
View File
@@ -3,7 +3,7 @@ import { useApp } from '../context/AppContext';
import { Kanban, User, Calendar, MapPin, Star, Plus, ArrowRight, Eye } from 'lucide-react';
export const KanbanBoard = () => {
const { tenders, updateKanbanStatus, setActiveTenderDetail } = useApp();
const { tenders, updateKanbanStatus, setActiveTenderDetail, teamMembers } = useApp();
const [selectedPersonel, setSelectedPersonel] = useState('');
const [draggedTenderId, setDraggedTenderId] = useState(null);
@@ -16,7 +16,11 @@ export const KanbanBoard = () => {
{ id: 'kaybedildi', title: 'Kaybedildi', color: 'bg-rose-50 border-rose-200 text-rose-900' }
];
const personnelList = ['Hikmet Tanrıverdi', 'Ahmet Yılmaz', 'Zeynep Kaya', 'Mehmet Demir'];
// Gerçek ekip üyelerinden (Ekip Yönetimi paneli) + atanmış eski isimler
const personnelList = [...new Set([
...teamMembers.map((m) => m.name),
...tenders.map((t) => t.atananPersonel).filter(Boolean),
])];
const filteredTenders = tenders.filter(t => {
if (!t.takipte && !t.kanbanStatus) return false;