From 2e98e5ad4f7840956a9f5f30973abbc3dd1d8960 Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 13:22:16 +0300 Subject: [PATCH] Make Kanban status changes accessible and remove false send success --- docs/quality/qa-kanban-controls.json | 17 ++++++++++++ docs/quality/uygulama-durumu.md | 7 +++++ src/components/KanbanBoard.jsx | 39 +++++++++++++++++----------- 3 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 docs/quality/qa-kanban-controls.json 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 = () => {

Ekip Kanban Takip Panosu

-

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.

- {/* Personnel Filter & Slack Notification Buttons */} + {/* Personnel filter */}
- +

Slack/Teams gönderimi bu panoda desteklenmiyor.

+ {savingCount > 0 &&

Değişiklik kaydediliyor…

} + {saveError &&

{saveError}

} {/* Kanban Columns Grid */}
{columns.map(col => { @@ -122,7 +121,7 @@ export const KanbanBoard = () => { colTenders.map(t => (
handleDragStart(e, t.id)} className="bg-white rounded-xl p-3 border border-slate-200 shadow-xs hover:shadow-md cursor-grab active:cursor-grabbing space-y-2 transition-all group" > @@ -141,18 +140,19 @@ export const KanbanBoard = () => {
-

setActiveTenderDetail(t)} - className="font-bold text-xs text-slate-900 line-clamp-2 hover:text-blue-600 cursor-pointer leading-snug" + className="text-left font-bold text-xs text-slate-900 line-clamp-2 hover:text-blue-600 cursor-pointer leading-snug" > {t.baslik} -

+
@@ -163,10 +163,19 @@ export const KanbanBoard = () => {
+ {/* Personnel Select on Card */}
Atanan: