diff --git a/docs/quality/qa-kanban-controls.json b/docs/quality/qa-kanban-controls.json new file mode 100644 index 0000000..be47c26 --- /dev/null +++ b/docs/quality/qa-kanban-controls.json @@ -0,0 +1,17 @@ +{ + "date": "2026-09-06", + "environment": "localhost:5182 synthetic fixture", + "checks": { + "fakeSendRemoved": true, + "unavailableExplained": true, + "statusSaved": true, + "survivesReload": true, + "accessibleCardControls": true + }, + "limits": [ + "Single tender status selection and reload tested", + "No outgoing Slack or Teams message", + "No save-failure injection or full keyboard-only walkthrough in this run", + "Five-tender missing-document overview still incomplete" + ] +} diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 2ea192f..053f593 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -867,3 +867,10 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - İnceleme mevcut yönetici outbox akışını kullanır: sağlayıcı kaydıyla gönderildiğini doğrulama veya yeniden göndermeden kapatma. Tarihi değişen grubun içeriği aynı idempotency key altında yeniden yazılmaz. - 197 otomatik test geçti. Eksik ilan, iptal, süre aşımı, eksik saat, ileri alınmış tarih; provider/ack çağrısının yapılmaması; hold lease sınırı; sonraki turda gerekçenin korunması doğrulandı. Önceki gerçek süreç kesintisi ve aynı anahtarla tekrar testleri de geçti. Dış sağlayıcıya gönderim yapılmadı. - Kontrol o turda alınan kaynak görünümüne dayanır; canlı kaynağın sonradan değişmesini veya geçerli şekle sahip eski beslemeyi tespit garantisi vermez. Başlık değişikliği tek başına tekrar anahtarını bozmaz. UI değişmediğinden frontend derlemesi tekrarlanmadı. + +### Kanban durum seçimi ve sahte gönderim mesajı — 6 Eylül 2026 +- Panoda hiçbir entegrasyon çağrısı yapmadan Slack/Teams'e başarıyla gönderildi alert'i üreten düğme kaldırıldı. Bu panoda gönderimin desteklenmediği açıkça belirtilir; dış mesaj gönderilmedi. +- Her karta iş akışı durumu select'i eklendi. Sürükleme dışında yerel seçim kontrolüyle durum güncellenir; sorumlu filtresi/ataması ve detay düğmesi erişilebilir adlarla tanımlanır. Tıklanabilir başlık gerçek button oldu. +- Kayıt sırasında durum/atama/sürükleme kilitlenir; mevcut sunucu kayıt hatası panoda gösterilir. Durum iyimser olarak değiştirilmez, mevcut mutateTender kalıcılık akışı korunur. +- Yerel 5182 sentetik Giresun görevinde 5 kontrol geçti: sahte düğmenin kalkması, desteklenmeme açıklaması, durum seçimi, yenileme sonrası durumun korunması ve erişilebilir kontrol adları. Kanıt qa-kanban-controls.json. Derleme geçti. Önceki 197 test tekrar çalıştırılmadı; sunucu değişmedi. +- Bu tur atama mutasyonu, hata enjeksiyonu, yalnız klavyeyle tam gezinme veya beş dosyalı eksik/sorumlu/sonraki işlem özetinin kabulünü kanıtlamaz. D07'nin ortak hazırlık özeti açık. diff --git a/src/components/KanbanBoard.jsx b/src/components/KanbanBoard.jsx index 2adf4ab..533cea1 100644 --- a/src/components/KanbanBoard.jsx +++ b/src/components/KanbanBoard.jsx @@ -2,11 +2,11 @@ import { useDeadlineClock } from '../hooks/useDeadlineClock'; import { deadlineInfo } from '../services/tenderCalendar'; import React, { useState } from 'react'; import { useApp } from '../context/AppContext'; -import { Kanban, User, Calendar, MapPin, Star, Plus, ArrowRight, Eye } from 'lucide-react'; +import { Kanban, User, Calendar, MapPin, Eye } from 'lucide-react'; export const KanbanBoard = () => { const now = useDeadlineClock(); - const { tenders, updateKanbanStatus, setActiveTenderDetail, teamMembers } = useApp(); + const { tenders, updateKanbanStatus, setActiveTenderDetail, teamMembers, savingCount, saveError } = useApp(); const [selectedPersonel, setSelectedPersonel] = useState(''); const [draggedTenderId, setDraggedTenderId] = useState(null); @@ -36,6 +36,7 @@ export const KanbanBoard = () => { }); const handleDragStart = (e, id) => { + if(savingCount > 0){e.preventDefault();return;} e.dataTransfer.setData('tenderId', id); setDraggedTenderId(id); }; @@ -46,6 +47,7 @@ export const KanbanBoard = () => { const handleDrop = (e, columnId) => { e.preventDefault(); + if(savingCount > 0)return; const id = e.dataTransfer.getData('tenderId') || draggedTenderId; if (id) { updateKanbanStatus(id, columnId); @@ -64,15 +66,16 @@ export const KanbanBoard = () => {
Kartları kolonlar arasında sürükleyerek ihale süreçlerinizi yönetin.
+Kartın durumunu seçerek veya kartı kolonlar arasında sürükleyerek süreci yönetin.
Slack/Teams gönderimi bu panoda desteklenmiyor.
Değişiklik kaydediliyor…
} + {saveError &&{saveError}
} {/* Kanban Columns Grid */}