prevent action buttons from submitting forms

This commit is contained in:
2026-09-06 17:22:28 +03:00
parent a468b3312f
commit dd20c68aef
3 changed files with 10 additions and 10 deletions
+1 -1
View File
@@ -100,7 +100,7 @@ export const LoginPage = ({ onLogin }) => {
{signingIn&&<p role="status" className="mt-4 text-sm">Giriş doğrulanıyor…</p>}
{err && <p role="alert" className="mt-4 text-sm text-red-600">{err}</p>}
{(err||noConfig)&&<button disabled={signingIn} onClick={()=>setAttempt(n=>n+1)} className="border rounded px-4 py-2 mt-3 text-sm">Girişi yeniden dene</button>}
{(err||noConfig)&&<button type="button" disabled={signingIn} onClick={()=>setAttempt(n=>n+1)} className="border rounded px-4 py-2 mt-3 text-sm">Girişi yeniden dene</button>}
<p className="mt-8 text-[11px] text-slate-400 flex items-center justify-center gap-1">
<ShieldCheck className="w-3.5 h-3.5" /> Girişin Google tarafından güvenle doğrulanır.
+3 -3
View File
@@ -16,7 +16,7 @@ function Queue({weekly}){
return <section aria-label={weekly?'Haftalık özet gönderim incelemesi':'E-posta gönderim incelemesi'} className="bg-white border rounded-xl p-5 space-y-3">
<h3 className="font-bold">{weekly?'Haftalık özet gönderim incelemesi':'E-posta gönderim incelemesi'} · Yönetici</h3>
<p className="text-sm">{weekly?'Haftalık özetin bekleyen mesajları ve inceleme kararları gösterilir.':'Bekleyen işler ve son inceleme kararları gösterilir (en fazla 50).'} Belirsiz gönderimi sağlayıcı kaydıyla karşılaştırın. Bu işlemler yeni mesaj göndermez.</p>
<button disabled={busy} onClick={()=>act(load)} className="border rounded px-3 py-2">Gönderim listesini yenile</button>
<button type="button" disabled={busy} onClick={()=>act(load)} className="border rounded px-3 py-2">Gönderim listesini yenile</button>
{busy&&<p role="status">Gönderim kayıtları işleniyor…</p>}
{error&&<p role="alert" className="text-red-700">{error}</p>}
{rows?.length===0&&<p>İncelenecek veya bekleyen gönderim yok.</p>}
@@ -35,8 +35,8 @@ function Review({row,weekly,busy,resolve}){
<label className="block">Kontrol açıklaması<textarea className="block border w-full p-2" value={note} onChange={e=>setNote(e.target.value)} minLength={20}/></label>
<label className="block">Sağlayıcı gönderim kimliği<input className="block border w-full p-2" value={providerId} onChange={e=>setProviderId(e.target.value)}/></label>
<label className="block"><input type="checkbox" checked={confirmed} onChange={e=>setConfirmed(e.target.checked)}/> Sağlayıcı kaydında bu gönderimin kabul edildiğini kontrol ettim.</label>
<button disabled={note.trim().length<20||!providerId.trim()||!confirmed} onClick={()=>resolve({action:'confirmed_sent',note,providerId,confirmed})} className="border rounded p-2 mr-2">Gönderildi olarak kapat</button>
<button disabled={note.trim().length<20} onClick={()=>resolve({action:'skip',note})} className="border rounded p-2">Yeniden göndermeden kapat</button>
<button type="button" disabled={note.trim().length<20||!providerId.trim()||!confirmed} onClick={()=>resolve({action:'confirmed_sent',note,providerId,confirmed})} className="border rounded p-2 mr-2">Gönderildi olarak kapat</button>
<button type="button" disabled={note.trim().length<20} onClick={()=>resolve({action:'skip',note})} className="border rounded p-2">Yeniden göndermeden kapat</button>
<p>{weekly?'İkinci seçenek bu mesajı yeniden göndermeden kapatır; teslim edildiği iddia edilmez. Diğer bekleyen mesajlar ve sonraki haftalar bu kararla kapatılmaz.':'İkinci seçenek bu grubu tekrar göndermez; teslim edildiği iddia edilmez. Sonraki yeni ihaleler için abonelik devam eder.'}</p>
</fieldset>}
</div>;
+6 -6
View File
@@ -41,7 +41,7 @@ const TelegramPanel = ({isAdmin}) => {
<h3 className="font-bold text-sm">Telegram Bildirimi</h3>
{busy&&<p role="status" className="text-sm">Bağlantı durumu yükleniyor…</p>}
{mesaj&&<p role="alert" className="text-red-700 text-sm">{mesaj.metin}</p>}
<button disabled={!!busy} onClick={()=>calistir('load',yenile)} className="border rounded p-2 text-sm">Telegram durumunu yeniden dene</button>
<button type="button" disabled={!!busy} onClick={()=>calistir('load',yenile)} className="border rounded p-2 text-sm">Telegram durumunu yeniden dene</button>
</section>;
return (
@@ -71,11 +71,11 @@ const TelegramPanel = ({isAdmin}) => {
</div>
) : d.bagli ? (
<div className="flex flex-wrap gap-2">
<button onClick={() => calistir('test', telegramTest, 'Telegram sağlayıcısı test mesajını kabul etti. Sohbetinizde kontrol edin.')} disabled={!!busy}
<button type="button" onClick={() => calistir('test', telegramTest, 'Telegram sağlayıcısı test mesajını kabul etti. Sohbetinizde kontrol edin.')} disabled={!!busy}
className="bg-sky-600 hover:bg-sky-500 disabled:opacity-40 text-white font-bold text-xs px-4 py-2 rounded-lg flex items-center gap-1.5">
{busy === 'test' ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Send className="w-3.5 h-3.5" />} Test mesajı gönder
</button>
<button onClick={() => calistir('sil', telegramSil, 'Telegram bağlantısı kaldırıldı.')} disabled={!!busy}
<button type="button" onClick={() => calistir('sil', telegramSil, 'Telegram bağlantısı kaldırıldı.')} disabled={!!busy}
className="bg-white hover:bg-slate-50 disabled:opacity-40 text-slate-700 font-bold text-xs px-4 py-2 rounded-lg border border-slate-300 flex items-center gap-1.5">
<Unplug className="w-3.5 h-3.5" /> Bağlantıyı kaldır
</button>
@@ -94,21 +94,21 @@ const TelegramPanel = ({isAdmin}) => {
<li>Yeni kod oluşturun ve bota kodun tamamını gönderin: <code className="bg-white border border-sky-300 px-2 py-0.5 rounded font-mono text-sm font-black break-all">{kod || 'Henüz kod oluşturulmadı'}</code></li>
<li>Sonra buraya dönüp <strong>Doğrula</strong>'ya basın.</li>
</ol>
<button disabled={!!busy} className="border rounded px-3 py-2" onClick={()=>calistir('kod',async()=>{
<button type="button" disabled={!!busy} className="border rounded px-3 py-2" onClick={()=>calistir('kod',async()=>{
setChallenge(null);
const data=await telegramKodOlustur();
if(typeof data.kod!=='string'||!/^[a-f0-9]{48}$/.test(data.kod)||!Number.isFinite(data.expiresAt))throw new Error('Bağlama kodu doğrulanamadı.');
if(alive.current)setChallenge(data);
})}>Yeni bağlama kodu oluştur</button>
{challenge&&<p>Kod 10 dakika geçerlidir. Son geçerlilik: {new Date(challenge.expiresAt).toLocaleTimeString('tr-TR')}. Yeni kod oluşturmak önceki kodu geçersiz kılar.</p>}
<button onClick={() => calistir('bagla', () => telegramBagla(kod), 'Telegram bağlantısı kaydedildi.')} disabled={!!busy || !kod}
<button type="button" onClick={() => calistir('bagla', () => telegramBagla(kod), 'Telegram bağlantısı kaydedildi.')} disabled={!!busy || !kod}
className="bg-sky-600 hover:bg-sky-500 disabled:opacity-40 text-white font-bold text-xs px-5 py-2 rounded-lg flex items-center gap-1.5">
{busy === 'bagla' ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <CheckCircle2 className="w-3.5 h-3.5" />} Doğrula
</button>
</div>
)}
<button disabled={!!busy} onClick={()=>calistir('load',yenile)} className="border rounded p-2 text-xs">Telegram durumunu yenile</button>
<button type="button" disabled={!!busy} onClick={()=>calistir('load',yenile)} className="border rounded p-2 text-xs">Telegram durumunu yenile</button>
{mesaj && (
<div role={mesaj.tur === 'ok' ? 'status' : 'alert'} className={`rounded-lg p-3 flex gap-2 text-xs ${mesaj.tur === 'ok' ? 'bg-emerald-50 border border-emerald-200 text-emerald-900' : 'bg-red-50 border border-red-200 text-red-800'}`}>
{mesaj.tur === 'ok' ? <CheckCircle2 className="w-4 h-4 shrink-0" /> : <AlertTriangle className="w-4 h-4 shrink-0" />}