make non submit buttons explicit
This commit is contained in:
@@ -98,7 +98,7 @@ export const AiModelSettings = () => {
|
||||
<p className="text-xs text-indigo-200 mt-0.5">Şartname analizi ve AI özelliklerinde kullanılacak modeli ve yedek (fallback) sırasını belirleyin.</p>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={handleSave}
|
||||
className={`px-4 py-2.5 rounded-xl font-bold text-sm flex items-center gap-2 transition ${saved ? 'bg-emerald-500 text-white' : 'bg-white text-indigo-900 hover:bg-indigo-50'}`}
|
||||
>
|
||||
@@ -127,11 +127,11 @@ export const AiModelSettings = () => {
|
||||
className={`flex items-center gap-4 p-4 rounded-xl border ${idx === 0 ? 'border-indigo-300 bg-indigo-50/40 ring-1 ring-indigo-200' : 'border-slate-200 bg-slate-50/60'}`}
|
||||
>
|
||||
<div className="flex flex-col items-center gap-1 w-8">
|
||||
<button onClick={() => move(idx, -1)} disabled={idx === 0} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
|
||||
<button type="button" onClick={() => move(idx, -1)} disabled={idx === 0} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
|
||||
<ArrowUp className="w-4 h-4" />
|
||||
</button>
|
||||
<span className="text-xs font-black text-slate-400">{idx + 1}</span>
|
||||
<button onClick={() => move(idx, 1)} disabled={idx === chain.length - 1} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
|
||||
<button type="button" onClick={() => move(idx, 1)} disabled={idx === chain.length - 1} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
|
||||
<ArrowDown className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
@@ -155,11 +155,11 @@ export const AiModelSettings = () => {
|
||||
|
||||
<div className="flex items-center gap-2">
|
||||
{idx !== 0 && (
|
||||
<button onClick={() => setPrimary(idx)} className="text-[11px] font-bold text-indigo-600 hover:text-indigo-800 border border-indigo-200 rounded-lg px-2.5 py-1.5">
|
||||
<button type="button" onClick={() => setPrimary(idx)} className="text-[11px] font-bold text-indigo-600 hover:text-indigo-800 border border-indigo-200 rounded-lg px-2.5 py-1.5">
|
||||
Birincil yap
|
||||
</button>
|
||||
)}
|
||||
<button onClick={() => remove(idx)} disabled={chain.length <= 1} className="text-slate-400 hover:text-red-500 disabled:opacity-30 p-1.5">
|
||||
<button type="button" onClick={() => remove(idx)} disabled={chain.length <= 1} className="text-slate-400 hover:text-red-500 disabled:opacity-30 p-1.5">
|
||||
<X className="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
@@ -178,7 +178,7 @@ export const AiModelSettings = () => {
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3">
|
||||
{available.map(m => (
|
||||
<button
|
||||
<button type="button"
|
||||
key={m.id}
|
||||
onClick={() => add(m.id)}
|
||||
className="text-left p-4 rounded-xl border border-slate-200 hover:border-indigo-300 hover:bg-indigo-50/40 transition group"
|
||||
|
||||
@@ -89,7 +89,7 @@ const ApiKeySession = () => {
|
||||
|
||||
return (
|
||||
<div className="space-y-6 animate-fade-in">
|
||||
{hata && <button disabled={busy || loading} onClick={yukle} className="px-4 py-2 border rounded-lg">Yeniden dene</button>}
|
||||
{hata && <button type="button" disabled={busy || loading} onClick={yukle} className="px-4 py-2 border rounded-lg">Yeniden dene</button>}
|
||||
<div className="bg-linear-to-r from-slate-900 via-violet-950 to-indigo-900 text-white p-6 rounded-2xl shadow-lg border border-violet-800/40">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-12 h-12 rounded-2xl bg-violet-600 flex items-center justify-center shadow-md">
|
||||
@@ -124,7 +124,7 @@ const ApiKeySession = () => {
|
||||
<code className="flex-1 bg-white border border-emerald-200 rounded-lg px-3 py-2 text-[11px] font-mono break-all">
|
||||
{yeniAnahtar.anahtar}
|
||||
</code>
|
||||
<button onClick={() => kopyala(yeniAnahtar.anahtar)}
|
||||
<button type="button" onClick={() => kopyala(yeniAnahtar.anahtar)}
|
||||
className="bg-emerald-600 hover:bg-emerald-500 text-white font-bold text-xs px-3 py-2 rounded-lg flex items-center gap-1.5 shrink-0">
|
||||
{kopyalandi ? <Check className="w-3.5 h-3.5" /> : <Copy className="w-3.5 h-3.5" />}
|
||||
{kopyalandi ? 'Kopyalandı' : 'Kopyala'}
|
||||
@@ -167,7 +167,7 @@ const ApiKeySession = () => {
|
||||
{k.son_kullanim ? `son kullanım: ${new Date(k.son_kullanim).toLocaleString('tr-TR')}` : 'hiç kullanılmadı'}
|
||||
</p>
|
||||
</div>
|
||||
<button onClick={() => iptal(k.id)} disabled={busy || loading}
|
||||
<button type="button" onClick={() => iptal(k.id)} disabled={busy || loading}
|
||||
className="text-slate-400 hover:text-red-500 shrink-0" title="Anahtarı iptal et">
|
||||
<Trash2 className="w-4 h-4" />
|
||||
</button>
|
||||
@@ -180,7 +180,7 @@ const ApiKeySession = () => {
|
||||
<input value={yeniAd} onChange={(e) => setYeniAd(e.target.value)}
|
||||
aria-label="Anahtar adı" placeholder="Anahtar adı (ör. ERP Entegrasyonu)" disabled={kilitli || busy || loading || !durum}
|
||||
className="min-w-0 flex-1 bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs disabled:opacity-50" />
|
||||
<button onClick={olustur} disabled={busy || loading || !durum || kilitli || (limit != null && durum.anahtarlar.length >= limit)}
|
||||
<button type="button" onClick={olustur} disabled={busy || loading || !durum || kilitli || (limit != null && durum.anahtarlar.length >= limit)}
|
||||
className="bg-violet-600 hover:bg-violet-500 disabled:opacity-40 text-white font-bold text-xs px-4 rounded-lg flex items-center gap-1.5">
|
||||
{busy ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Plus className="w-3.5 h-3.5" />} Oluştur
|
||||
</button>
|
||||
|
||||
@@ -34,9 +34,9 @@ function BriefPanel(){
|
||||
<h3 className="font-bold text-sm flex gap-2"><CalendarClock className="w-4 h-4"/>Haftalık Brief</h3>
|
||||
<p className="text-xs text-slate-500">Haftanın takipli ihaleleri ve geçen hafta sonuçlanan takipliler için özet tercihi. Gönderim, sunucu zamanlayıcısının ve ilgili e-posta/Telegram hizmetinin etkin olmasına bağlıdır.</p>
|
||||
<div className="flex gap-3 flex-wrap">
|
||||
{value&&<button role="switch" aria-label="Haftalık özet gönderimi" aria-checked={!value.kapali} disabled={busy} onClick={()=>run(false)} className="border rounded px-3 py-2 text-xs">{value.kapali?'Haftalık özet kapalı':'Haftalık özet açık'}</button>}
|
||||
<button disabled={busy||!value} onClick={()=>run(true)} className="border rounded px-3 py-2 text-xs">Önizle</button>
|
||||
<button disabled={busy} onClick={()=>setAttempt(n=>n+1)} className="border rounded px-3 py-2 text-xs">Özet ayarını yenile</button>
|
||||
{value&&<button type="button" role="switch" aria-label="Haftalık özet gönderimi" aria-checked={!value.kapali} disabled={busy} onClick={()=>run(false)} className="border rounded px-3 py-2 text-xs">{value.kapali?'Haftalık özet kapalı':'Haftalık özet açık'}</button>}
|
||||
<button type="button" disabled={busy||!value} onClick={()=>run(true)} className="border rounded px-3 py-2 text-xs">Önizle</button>
|
||||
<button type="button" disabled={busy} onClick={()=>setAttempt(n=>n+1)} className="border rounded px-3 py-2 text-xs">Özet ayarını yenile</button>
|
||||
</div>
|
||||
{busy&&<p role="status" className="text-xs">Haftalık özet işlemi sürüyor…</p>}
|
||||
{error&&<p role="alert" className="text-xs text-red-700">{error}</p>}
|
||||
|
||||
@@ -59,7 +59,7 @@ export const CompetitorRadar = () => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => setActiveTab('sozlesme')}
|
||||
className="bg-white/10 hover:bg-white/20 text-white font-bold text-xs px-4 py-2.5 rounded-xl border border-white/20 transition-colors flex items-center gap-2 shrink-0"
|
||||
>
|
||||
@@ -120,7 +120,7 @@ export const CompetitorRadar = () => {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => addFromReal(f)}
|
||||
disabled={competitorSaving || watched.has(f.name.trim().toLocaleLowerCase('tr-TR'))}
|
||||
className="text-[11px] font-bold px-3 py-1.5 rounded-lg border border-indigo-200 text-indigo-700 hover:bg-indigo-50 disabled:opacity-40 shrink-0"
|
||||
@@ -207,7 +207,7 @@ export const CompetitorRadar = () => {
|
||||
|
||||
{/* Notification Toggles & Actions */}
|
||||
<div className="flex items-center gap-3 shrink-0">
|
||||
<button
|
||||
<button type="button"
|
||||
disabled title="Rakip teklif bildirimleri henüz etkin değil"
|
||||
className="text-xs font-extrabold px-3 py-1.5 rounded-xl border flex items-center gap-1.5 bg-slate-100 text-slate-400 border-slate-200"
|
||||
>
|
||||
@@ -215,7 +215,7 @@ export const CompetitorRadar = () => {
|
||||
<span>Teklif uyarısı etkin değil</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
<button type="button"
|
||||
disabled title="Rakip kazanım bildirimleri henüz etkin değil"
|
||||
className="text-xs font-extrabold px-3 py-1.5 rounded-xl border flex items-center gap-1.5 bg-slate-100 text-slate-400 border-slate-200"
|
||||
>
|
||||
@@ -223,7 +223,7 @@ export const CompetitorRadar = () => {
|
||||
<span>Kazanım uyarısı etkin değil</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
<button type="button"
|
||||
disabled={competitorSaving} aria-label={`${comp.name} radardan çıkar`} onClick={() => removeCompetitor(comp.id)}
|
||||
className="p-2 text-slate-400 hover:text-red-600 rounded-lg transition-colors"
|
||||
title="Radardan Çıkar"
|
||||
|
||||
@@ -61,7 +61,7 @@ export const KikDecisions = () => {
|
||||
/>
|
||||
<Search className="w-4 h-4 text-slate-400 absolute left-3 top-1/2 -translate-y-1/2" />
|
||||
</div>
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => ara()}
|
||||
disabled={loading || !q.trim()}
|
||||
className="bg-amber-600 hover:bg-amber-500 disabled:opacity-40 text-white font-bold text-xs px-5 rounded-lg flex items-center gap-2"
|
||||
@@ -74,7 +74,7 @@ export const KikDecisions = () => {
|
||||
<div className="flex gap-2 flex-wrap items-center">
|
||||
<span className="text-[11px] text-slate-400 font-semibold">Takibinizdeki idareler:</span>
|
||||
{oneriler.map((k) => (
|
||||
<button key={k} onClick={() => { setQ(k); ara(k); }}
|
||||
<button type="button" key={k} onClick={() => { setQ(k); ara(k); }}
|
||||
className="text-[11px] bg-slate-100 hover:bg-slate-200 text-slate-700 px-2 py-1 rounded-md font-medium truncate max-w-[220px]">
|
||||
{k}
|
||||
</button>
|
||||
|
||||
@@ -24,7 +24,7 @@ export const McpRssKarti = () => {
|
||||
<div key={o.k} className="space-y-1">
|
||||
<div className="flex items-center justify-between">
|
||||
<p className="text-xs font-bold text-slate-800">{o.ad} <span className="font-normal text-slate-500">— {o.not}</span></p>
|
||||
<button onClick={() => kopyala(o.k, o.kod)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === o.k ? <Check className="w-3 h-3 text-emerald-600" /> : <Copy className="w-3 h-3" />} Kopyala</button>
|
||||
<button type="button" onClick={() => kopyala(o.k, o.kod)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === o.k ? <Check className="w-3 h-3 text-emerald-600" /> : <Copy className="w-3 h-3" />} Kopyala</button>
|
||||
</div>
|
||||
<pre className="overflow-x-auto rounded-lg bg-slate-900 text-slate-100 p-2 text-[11px]">{o.kod}</pre>
|
||||
</div>
|
||||
@@ -32,7 +32,7 @@ export const McpRssKarti = () => {
|
||||
<div className="border-t border-slate-100 pt-3 space-y-1">
|
||||
<div className="flex items-center justify-between">
|
||||
<p className="text-xs font-bold text-slate-800 flex items-center gap-1"><Rss className="w-3.5 h-3.5 text-orange-500" /> RSS beslemesi <span className="font-normal text-slate-500">— Feedly, Outlook, Slack RSS, n8n… (il, sektor, q filtreleri)</span></p>
|
||||
<button onClick={() => kopyala('rss', rss)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === 'rss' ? <Check className="w-3 h-3 text-emerald-600" /> : <Copy className="w-3 h-3" />} Kopyala</button>
|
||||
<button type="button" onClick={() => kopyala('rss', rss)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === 'rss' ? <Check className="w-3 h-3 text-emerald-600" /> : <Copy className="w-3 h-3" />} Kopyala</button>
|
||||
</div>
|
||||
<pre className="overflow-x-auto rounded-lg bg-slate-900 text-slate-100 p-2 text-[11px]">{rss}</pre>
|
||||
<p className="text-[11px] text-slate-500">Sonuç ilanları beslemesi anahtarsız: <code>{origin}/api/feeds/sonuc.rss</code> (firma, idare, il filtreleri). Anahtarı <code>ih_live_ANAHTARINIZ</code> yerine yazın.</p>
|
||||
|
||||
@@ -126,7 +126,7 @@ const SubscriptionForm = () => {
|
||||
{a.deliveryStatus && <span className="block text-amber-700">{a.deliveryStatus.state==='uncertain'?'Gönderim sonucu belirsiz. Uygulama yöneticisinin sağlayıcı kaydını kontrol etmesi gerekiyor.':'E-posta gönderimi bekliyor.'}</span>}
|
||||
</p>
|
||||
</div>
|
||||
<button onClick={() => sil(a.id)} disabled={busy} className="text-slate-400 hover:text-red-500 shrink-0 mt-0.5" aria-label={`Aboneliği sil: ${ozet(a)}`} title="Sil">
|
||||
<button type="button" onClick={() => sil(a.id)} disabled={busy} className="text-slate-400 hover:text-red-500 shrink-0 mt-0.5" aria-label={`Aboneliği sil: ${ozet(a)}`} title="Sil">
|
||||
<Trash2 className="w-3.5 h-3.5" />
|
||||
</button>
|
||||
</div>
|
||||
@@ -143,7 +143,7 @@ const SubscriptionForm = () => {
|
||||
<input value={site} onChange={(e) => setSite(e.target.value)}
|
||||
placeholder="firmasitesi.com"
|
||||
className="flex-1 bg-white border border-blue-200 rounded-lg px-2.5 py-2 text-xs" />
|
||||
<button onClick={siteyiTara} disabled={taraniyor || !site.trim()}
|
||||
<button type="button" onClick={siteyiTara} disabled={taraniyor || !site.trim()}
|
||||
className="bg-blue-600 hover:bg-blue-500 disabled:opacity-40 text-white font-bold text-xs px-3.5 rounded-lg flex items-center gap-1.5">
|
||||
{taraniyor ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Sparkles className="w-3.5 h-3.5" />}
|
||||
{taraniyor ? 'Taranıyor…' : 'Tara'}
|
||||
@@ -163,7 +163,7 @@ const SubscriptionForm = () => {
|
||||
<p className="text-[10px] text-blue-700 font-semibold">Önerilen konular — eklemek için tıklayın:</p>
|
||||
<div className="flex flex-wrap gap-1.5">
|
||||
{oneriler.map((k) => (
|
||||
<button key={k} onClick={() => konuEkle(k)}
|
||||
<button type="button" key={k} onClick={() => konuEkle(k)}
|
||||
className="text-[11px] bg-white hover:bg-blue-100 border border-blue-300 text-blue-900 px-2 py-1 rounded-md font-medium">
|
||||
+ {k}
|
||||
</button>
|
||||
@@ -185,7 +185,7 @@ const SubscriptionForm = () => {
|
||||
{konular.map((k) => (
|
||||
<span key={k} className="text-[11px] bg-emerald-50 border border-emerald-300 text-emerald-900 px-2 py-1 rounded-md font-semibold flex items-center gap-1">
|
||||
{k}
|
||||
<button onClick={() => konuCikar(k)} className="text-emerald-700 hover:text-red-600"><X className="w-3 h-3" /></button>
|
||||
<button type="button" onClick={() => konuCikar(k)} className="text-emerald-700 hover:text-red-600"><X className="w-3 h-3" /></button>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
@@ -196,14 +196,14 @@ const SubscriptionForm = () => {
|
||||
onKeyDown={(e) => { if (e.key === 'Enter') { konuEkle(ozelKonu); setOzelKonu(''); } }}
|
||||
placeholder="Kendi konunuzu yazın ve Enter'a basın"
|
||||
className="flex-1 bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs" />
|
||||
<button onClick={() => { konuEkle(ozelKonu); setOzelKonu(''); }}
|
||||
<button type="button" onClick={() => { konuEkle(ozelKonu); setOzelKonu(''); }}
|
||||
className="bg-slate-800 hover:bg-slate-700 text-white font-bold text-xs px-3 rounded-lg">Ekle</button>
|
||||
</div>
|
||||
|
||||
<p className="text-[10px] text-slate-400 pt-1">Hazır sektörler:</p>
|
||||
<div className="flex flex-wrap gap-1.5">
|
||||
{sektorListesi.map((s) => (
|
||||
<button key={s} onClick={() => konuEkle(s)}
|
||||
<button type="button" key={s} onClick={() => konuEkle(s)}
|
||||
className="text-[11px] bg-slate-100 hover:bg-slate-200 text-slate-700 px-2 py-1 rounded-md">
|
||||
+ {s}
|
||||
</button>
|
||||
@@ -213,7 +213,7 @@ const SubscriptionForm = () => {
|
||||
|
||||
{/* Gelişmiş daraltma (isteğe bağlı) */}
|
||||
<div>
|
||||
<button onClick={() => setGelismis(!gelismis)} className="text-[11px] font-bold text-slate-500 hover:text-slate-800 flex items-center gap-1">
|
||||
<button type="button" onClick={() => setGelismis(!gelismis)} className="text-[11px] font-bold text-slate-500 hover:text-slate-800 flex items-center gap-1">
|
||||
{gelismis ? <ChevronUp className="w-3.5 h-3.5" /> : <ChevronDown className="w-3.5 h-3.5" />}
|
||||
Daha da daralt (isteğe bağlı) — varsayılan: tüm Türkiye
|
||||
</button>
|
||||
@@ -235,7 +235,7 @@ const SubscriptionForm = () => {
|
||||
)}
|
||||
</div>
|
||||
|
||||
<button onClick={kaydet} disabled={busy || abonelikler===null || !konular.length}
|
||||
<button type="button" onClick={kaydet} disabled={busy || abonelikler===null || !konular.length}
|
||||
className="w-full bg-emerald-600 hover:bg-emerald-500 disabled:opacity-40 text-white font-bold text-xs py-2.5 rounded-xl flex items-center justify-center gap-2">
|
||||
{busy ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Plus className="w-3.5 h-3.5" />}
|
||||
Bildirimi Kaydet
|
||||
@@ -244,7 +244,7 @@ const SubscriptionForm = () => {
|
||||
{error && (
|
||||
<div role="alert" className="bg-red-50 border border-red-200 rounded-lg p-2.5 flex gap-2">
|
||||
<AlertTriangle className="w-3.5 h-3.5 text-red-600 shrink-0 mt-0.5" />
|
||||
<p className="text-[11px] text-red-800">{error} <button disabled={busy} onClick={yukle} className="underline">Abonelikleri yeniden yükle</button></p>
|
||||
<p className="text-[11px] text-red-800">{error} <button type="button" disabled={busy} onClick={yukle} className="underline">Abonelikleri yeniden yükle</button></p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -62,10 +62,10 @@ export const Pricing = () => {
|
||||
{/* Aylık / Yıllık */}
|
||||
<div className="flex justify-center">
|
||||
<div className="bg-white border border-slate-200 rounded-xl p-1 inline-flex text-xs font-bold shadow-xs">
|
||||
<button onClick={() => setYillik(true)} className={`px-4 py-2 rounded-lg transition-colors flex items-center gap-1.5 ${yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
|
||||
<button type="button" onClick={() => setYillik(true)} className={`px-4 py-2 rounded-lg transition-colors flex items-center gap-1.5 ${yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
|
||||
Yıllık <span className={`text-[10px] px-1.5 py-0.5 rounded-full ${yillik ? 'bg-amber-400 text-slate-900' : 'bg-emerald-100 text-emerald-800'}`}>%17 indirim</span>
|
||||
</button>
|
||||
<button onClick={() => setYillik(false)} className={`px-4 py-2 rounded-lg transition-colors ${!yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
|
||||
<button type="button" onClick={() => setYillik(false)} className={`px-4 py-2 rounded-lg transition-colors ${!yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
|
||||
Aylık
|
||||
</button>
|
||||
</div>
|
||||
@@ -107,7 +107,7 @@ export const Pricing = () => {
|
||||
</div>
|
||||
</div>
|
||||
{plan.iptalEdilebilir && (
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => setIptalAcik(true)}
|
||||
className="text-xs font-bold text-red-600 hover:text-red-700 hover:bg-red-50 border border-red-200 px-3 py-2 rounded-xl flex items-center gap-1.5 transition-colors"
|
||||
>
|
||||
@@ -183,7 +183,7 @@ export const Pricing = () => {
|
||||
Mevcut planınız
|
||||
</div>
|
||||
) : (
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => upgrade(p.id)}
|
||||
disabled={!(yillik ? p.satinAlinabilirYillik : p.satinAlinabilir) || busy === p.id || !authUser}
|
||||
title={!authUser ? 'Önce giriş yapın' : !(yillik ? p.satinAlinabilirYillik : p.satinAlinabilir) ? 'Ödeme altyapısı bağlanmadı' : ''}
|
||||
|
||||
@@ -162,7 +162,7 @@ const PwaPanel = () => {
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={refreshCacheStatus} disabled={cacheLoading}
|
||||
className="w-full bg-slate-100 hover:bg-slate-200 text-slate-800 font-bold text-xs py-2.5 rounded-xl border border-slate-200 transition-colors"
|
||||
>
|
||||
@@ -192,17 +192,17 @@ const PwaPanel = () => {
|
||||
{permission === 'denied' ? (
|
||||
<div className="space-y-2 text-xs text-slate-700">
|
||||
<p>Bu site için bildirimler tarayıcı tarafından engellenmiş. Adres çubuğundaki site bilgileri veya tarayıcının site ayarlarından bildirim iznini değiştirin, ardından buraya dönün.</p>
|
||||
<button onClick={refreshPermission} className="border rounded px-3 py-2">Bildirim iznini yeniden kontrol et</button>
|
||||
<button type="button" onClick={refreshPermission} className="border rounded px-3 py-2">Bildirim iznini yeniden kontrol et</button>
|
||||
</div>
|
||||
) : permission === 'unsupported' ? (
|
||||
<p className="text-xs text-slate-700">Bu tarayıcıda bildirim özelliği kullanılamıyor. Uygulama içindeki bildirim listesini kullanabilirsiniz.</p>
|
||||
) : permission !== 'granted' ? (
|
||||
<button onClick={handleEnablePush} disabled={reminderSaving || permissionBusy}
|
||||
<button type="button" onClick={handleEnablePush} disabled={reminderSaving || permissionBusy}
|
||||
className="w-full bg-amber-500 hover:bg-amber-400 disabled:opacity-40 text-white font-bold text-xs py-2.5 rounded-xl">
|
||||
{permissionBusy?'İzin yanıtı bekleniyor…':'Bildirimlere İzin Ver'}
|
||||
</button>
|
||||
) : (
|
||||
<button onClick={() => notify('Test bildirimi', isQuietNow() || !reminderSettings.pushEnabled ? 'Tarayıcı bildirimi kapalı veya sessiz saatte — listeye eklendi.' : 'Tarayıcı bildirimi gösterim denemesi.')}
|
||||
<button type="button" onClick={() => notify('Test bildirimi', isQuietNow() || !reminderSettings.pushEnabled ? 'Tarayıcı bildirimi kapalı veya sessiz saatte — listeye eklendi.' : 'Tarayıcı bildirimi gösterim denemesi.')}
|
||||
className="w-full bg-emerald-600 hover:bg-emerald-500 text-white font-bold text-xs py-2.5 rounded-xl">
|
||||
Test Bildirimi Gönder
|
||||
</button>
|
||||
@@ -268,7 +268,7 @@ const PwaPanel = () => {
|
||||
<button type="button" disabled={emailSending} onClick={()=>setEmailConfigAttempt(n=>n+1)} className="text-xs underline">E-posta durumunu yenile</button>
|
||||
<p className="text-xs text-slate-600">E-posta gönderimlerini aşağıdaki bildirim aboneliklerinden yönetin. Tarayıcı bildirim seçimi ve sessiz saatler e-posta aboneliklerini kapatmaz.</p>
|
||||
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={sendTestEmail}
|
||||
disabled={emailSending || emailCfg !== true || !authUser}
|
||||
className="w-full bg-blue-600 hover:bg-blue-500 disabled:opacity-40 text-white font-bold text-xs py-2.5 rounded-xl flex items-center justify-center gap-2"
|
||||
@@ -300,7 +300,7 @@ const PwaPanel = () => {
|
||||
İhaleist'i iOS, Android, Windows veya Mac cihazınıza bir tıklama ile uygulama olarak kurun.
|
||||
</p>
|
||||
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={handleInstallPwa}
|
||||
disabled={installed}
|
||||
className="w-full bg-cyan-500 hover:bg-cyan-400 disabled:bg-slate-700 text-slate-950 font-black text-xs py-3 rounded-xl flex items-center justify-center gap-2 shadow-md transition-colors cursor-pointer"
|
||||
|
||||
@@ -102,7 +102,7 @@ export const RedFlags = () => {
|
||||
</div>
|
||||
<p className="text-xs text-slate-700 mt-1.5 leading-relaxed">{f.aciklama}</p>
|
||||
{f.tender ? (
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => setActiveTenderDetail(f.tender)}
|
||||
className="text-[11px] font-bold text-blue-700 hover:underline mt-1.5 text-left"
|
||||
>
|
||||
|
||||
@@ -65,7 +65,7 @@ export const TedTenders = () => {
|
||||
{/* Mod seçici */}
|
||||
<div className="flex gap-2 flex-wrap">
|
||||
{MODLAR.map((m) => (
|
||||
<button
|
||||
<button type="button"
|
||||
key={m.id}
|
||||
onClick={() => setMod(m.id)}
|
||||
className={`px-4 py-2 rounded-xl text-xs font-bold border transition-colors ${
|
||||
@@ -75,7 +75,7 @@ export const TedTenders = () => {
|
||||
{m.label}
|
||||
</button>
|
||||
))}
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => yukle(mod)}
|
||||
disabled={loading}
|
||||
className="px-3 py-2 rounded-xl text-xs font-bold border border-slate-200 bg-white text-slate-600 hover:bg-slate-50 flex items-center gap-1.5 disabled:opacity-50"
|
||||
|
||||
@@ -61,7 +61,7 @@ export const TurkeyHeatMap = () => {
|
||||
const c = density.get(normProvince(il)) || 0;
|
||||
const { bg, fg } = heat(c, max);
|
||||
return (
|
||||
<button
|
||||
<button type="button"
|
||||
key={il}
|
||||
onClick={() => c && openCity(il)}
|
||||
disabled={!c}
|
||||
|
||||
@@ -58,7 +58,7 @@ export const VatCalculator = () => {
|
||||
|
||||
{/* Mode Selector */}
|
||||
<div className="grid grid-cols-2 gap-3 p-1 bg-slate-100 rounded-xl">
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => setMode('haric')}
|
||||
className={`py-2.5 rounded-lg text-xs font-extrabold transition-all ${
|
||||
mode === 'haric' ? 'bg-white text-blue-700 shadow-2xs' : 'text-slate-600 hover:text-slate-900'
|
||||
@@ -66,7 +66,7 @@ export const VatCalculator = () => {
|
||||
>
|
||||
KDV Hariç ➔ KDV Dahil Hesapla
|
||||
</button>
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={() => setMode('dahil')}
|
||||
className={`py-2.5 rounded-lg text-xs font-extrabold transition-all ${
|
||||
mode === 'dahil' ? 'bg-white text-blue-700 shadow-2xs' : 'text-slate-600 hover:text-slate-900'
|
||||
@@ -130,7 +130,7 @@ export const VatCalculator = () => {
|
||||
<div className="bg-slate-900 text-white p-6 rounded-xl space-y-4 shadow-lg">
|
||||
<div className="flex items-center justify-between border-b border-slate-800 pb-3">
|
||||
<span className="font-bold text-xs uppercase tracking-wider text-slate-300">Hesaplama Sonucu</span>
|
||||
<button
|
||||
<button type="button"
|
||||
onClick={handleCopy}
|
||||
className="bg-slate-800 hover:bg-slate-700 text-blue-400 font-semibold px-3 py-1.5 rounded-lg text-xs flex items-center gap-1.5 transition-colors border border-slate-700"
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user