mükellef yaşı 12 olarak düzeltildi, masaüstüne ilerleme barı eklendi.

This commit is contained in:
2026-07-29 04:41:55 +02:00
parent 9b62e4b312
commit db33fdd963
4 changed files with 139 additions and 85 deletions
+19 -26
View File
@@ -54,41 +54,45 @@ async function render() {
selectedCity = city; selectedCity = city;
localStorage.setItem("selected_city", city); localStorage.setItem("selected_city", city);
render(); render();
}, }
); );
} else if (activeTab === "kaza") { } else if (activeTab === "kaza") {
currentPage = renderKaza(pb); currentPage = renderKaza(pb);
} else { } else {
currentPage = renderDesktop(selectedCity); currentPage = renderDesktop(selectedCity, pb);
} }
app.innerHTML = ` app.innerHTML = `
<div class="relative w-full h-screen overflow-hidden bg-slate-950 text-slate-100 flex"> <div class="relative w-full h-screen overflow-hidden bg-slate-950 text-slate-100 flex">
<div class="absolute inset-0 z-0 bg-center bg-no-repeat transition-all duration-700" <!-- Kristal Netliğinde Arka Plan (Blur Kaldırıldı) -->
style="background-image: url('${currentBg}'); background-size: cover;"> <div class="absolute inset-0 z-0 bg-center bg-cover bg-no-repeat transition-all duration-700"
style="background-image: url('${currentBg}');">
</div> </div>
<div class="absolute inset-0 z-10 bg-slate-950/60 backdrop-blur-[2px]"></div>
<button id="globalSidebarToggle" class="fixed top-4 left-4 z-50 bg-white/10 hover:bg-white/20 text-white p-2.5 rounded-xl backdrop-blur-md transition-all border border-white/10"> <!-- İnce Netlik Katmanı -->
<div class="absolute inset-0 z-10 bg-black/25"></div>
<!-- Sol Menü (Sidebar) -->
<button id="globalSidebarToggle" class="fixed top-4 left-4 z-50 bg-slate-900/80 hover:bg-slate-800 text-white p-2.5 rounded-xl transition-all border border-white/10 shadow-lg">
${sidebarOpen ? "◀" : "▶"} ${sidebarOpen ? "◀" : "▶"}
</button> </button>
${sidebarOpen ? `<div id="sidebarOverlay" class="fixed inset-0 bg-black/50 z-30 md:hidden"></div>` : ""} ${sidebarOpen ? `<div id="sidebarOverlay" class="fixed inset-0 bg-black/50 z-30 md:hidden"></div>` : ""}
<aside id="sidebar" class="fixed md:relative z-40 md:z-30 inset-y-0 left-0 ${sidebarOpen ? "w-72 translate-x-0 p-6" : "w-72 -translate-x-full md:w-20 md:translate-x-0 md:p-3"} h-screen bg-slate-900/80 backdrop-blur-xl border-r border-white/10 flex flex-col justify-between transition-all duration-300 overflow-hidden"> <aside id="sidebar" class="fixed md:relative z-40 md:z-30 inset-y-0 left-0 ${sidebarOpen ? "w-72 translate-x-0 p-6" : "w-72 -translate-x-full md:w-20 md:translate-x-0 md:p-3"} h-screen bg-slate-900/85 border-r border-white/10 flex flex-col justify-between transition-all duration-300 overflow-hidden shadow-2xl">
<div> <div>
<div class="flex items-center justify-between mb-8 mt-2"> <div class="flex items-center justify-between mb-8 mt-2">
<h1 class="font-bold text-white text-xl ${sidebarOpen ? "block" : "hidden md:hidden"}">Dashboard OS</h1> <h1 class="font-bold text-white text-xl ${sidebarOpen ? "block" : "hidden md:hidden"}">Dashboard OS</h1>
</div> </div>
<nav class="space-y-2 w-full"> <nav class="space-y-2 w-full">
<button id="navDesktop" class="w-full flex items-center ${sidebarOpen ? "" : "md:justify-center"} gap-3 px-4 py-3 rounded-xl font-medium ${activeTab === "desktop" ? "bg-indigo-600/30 text-indigo-300 border border-indigo-500/30" : "text-slate-400 hover:text-white hover:bg-white/5"}"> <button id="navDesktop" class="w-full flex items-center ${sidebarOpen ? "" : "md:justify-center"} gap-3 px-4 py-3 rounded-xl font-medium ${activeTab === "desktop" ? "bg-indigo-600/40 text-indigo-300 border border-indigo-500/40" : "text-slate-400 hover:text-white hover:bg-white/5"}">
<span>🏠</span> <span class="${sidebarOpen ? "block" : "hidden md:hidden"}">Masaüstü</span> <span>🏠</span> <span class="${sidebarOpen ? "block" : "hidden md:hidden"}">Masaüstü</span>
</button> </button>
<button id="navKaza" class="w-full flex items-center ${sidebarOpen ? "" : "md:justify-center"} gap-3 px-4 py-3 rounded-xl font-medium ${activeTab === "kaza" ? "bg-indigo-600/30 text-indigo-300 border border-indigo-500/30" : "text-slate-400 hover:text-white hover:bg-white/5"}"> <button id="navKaza" class="w-full flex items-center ${sidebarOpen ? "" : "md:justify-center"} gap-3 px-4 py-3 rounded-xl font-medium ${activeTab === "kaza" ? "bg-indigo-600/40 text-indigo-300 border border-indigo-500/40" : "text-slate-400 hover:text-white hover:bg-white/5"}">
<span>📿</span> <span class="${sidebarOpen ? "block" : "hidden md:hidden"}">Kaza Namazı</span> <span>📿</span> <span class="${sidebarOpen ? "block" : "hidden md:hidden"}">Kaza Namazı</span>
</button> </button>
<button id="navSettings" class="w-full flex items-center ${sidebarOpen ? "" : "md:justify-center"} gap-3 px-4 py-3 rounded-xl font-medium ${activeTab === "settings" ? "bg-indigo-600/30 text-indigo-300 border border-indigo-500/30" : "text-slate-400 hover:text-white hover:bg-white/5"}"> <button id="navSettings" class="w-full flex items-center ${sidebarOpen ? "" : "md:justify-center"} gap-3 px-4 py-3 rounded-xl font-medium ${activeTab === "settings" ? "bg-indigo-600/40 text-indigo-300 border border-indigo-500/40" : "text-slate-400 hover:text-white hover:bg-white/5"}">
<span>⚙️</span> <span class="${sidebarOpen ? "block" : "hidden md:hidden"}">Ayarlar</span> <span>⚙️</span> <span class="${sidebarOpen ? "block" : "hidden md:hidden"}">Ayarlar</span>
</button> </button>
</nav> </nav>
@@ -122,27 +126,16 @@ async function render() {
const mainContent = document.getElementById("mainContent"); const mainContent = document.getElementById("mainContent");
currentPage.initEvents(mainContent); currentPage.initEvents(mainContent);
document.getElementById("navDesktop")?.addEventListener("click", () => { document.getElementById("navDesktop")?.addEventListener("click", () => { activeTab = "desktop"; render(); });
activeTab = "desktop"; document.getElementById("navKaza")?.addEventListener("click", () => { activeTab = "kaza"; render(); });
render(); document.getElementById("navSettings")?.addEventListener("click", () => { activeTab = "settings"; render(); });
});
document.getElementById("navKaza")?.addEventListener("click", () => {
activeTab = "kaza";
render();
});
document.getElementById("navSettings")?.addEventListener("click", () => {
activeTab = "settings";
render();
});
document.getElementById("logoutBtn")?.addEventListener("click", () => { document.getElementById("logoutBtn")?.addEventListener("click", () => {
pb.authStore.clear(); pb.authStore.clear();
render(); render();
}); });
document document.getElementById("globalSidebarToggle")?.addEventListener("click", () => {
.getElementById("globalSidebarToggle")
?.addEventListener("click", () => {
sidebarOpen = !sidebarOpen; sidebarOpen = !sidebarOpen;
render(); render();
}); });
@@ -178,7 +171,7 @@ function renderLogin() {
.collection("users") .collection("users")
.authWithPassword( .authWithPassword(
document.getElementById("identity").value, document.getElementById("identity").value,
document.getElementById("password").value, document.getElementById("password").value
); );
render(); render();
} catch { } catch {
+87 -27
View File
@@ -1,8 +1,12 @@
import { gregorianToHijri } from "../utils/hijri.js"; import { gregorianToHijri, calculateMissedPrayers } from "../utils/hijri.js";
import { fetchWeather, getWeatherIcon, getWeatherDesc } from "../utils/weather.js"; import {
fetchWeather,
getWeatherIcon,
getWeatherDesc,
} from "../utils/weather.js";
import { fetchPrayerTimes } from "../utils/prayerTimes.js"; import { fetchPrayerTimes } from "../utils/prayerTimes.js";
export function renderDesktop(selectedCity = "Edremit") { export function renderDesktop(selectedCity = "Edremit", pb) {
const hijri = gregorianToHijri(); const hijri = gregorianToHijri();
const today = new Date(); const today = new Date();
const dateStr = today.toLocaleDateString("tr-TR", { const dateStr = today.toLocaleDateString("tr-TR", {
@@ -15,18 +19,32 @@ export function renderDesktop(selectedCity = "Edremit") {
const html = ` const html = `
<div class="flex justify-end w-full max-w-6xl h-full items-start pt-4"> <div class="flex justify-end w-full max-w-6xl h-full items-start pt-4">
<!-- Windows Vista Tarzı Entegre Tek Kolon Sidebar --> <!-- Windows Vista Tarzı Entegre Tek Kolon Sidebar -->
<div class="w-full max-w-sm bg-slate-900/50 backdrop-blur-2xl border border-white/10 rounded-3xl p-6 shadow-2xl space-y-6"> <div class="w-full max-w-sm bg-slate-900/80 border border-white/10 rounded-3xl p-6 shadow-2xl space-y-5">
<!-- Header --> <!-- Header -->
<div class="flex items-center justify-between pb-4 border-b border-white/10"> <div class="flex items-center justify-between pb-3 border-b border-white/10">
<h2 class="text-lg font-bold text-white flex items-center gap-2"> <h2 class="text-base font-bold text-white flex items-center gap-2">
<span>🖥️</span> Masaüstü Araçları <span>🖥️</span> Masaüstü Araçları
</h2> </h2>
<span class="text-xs text-slate-400 font-medium">${selectedCity}</span> <span class="text-xs text-slate-400 font-medium">${selectedCity}</span>
</div> </div>
<!-- YENİ: GENEL KAZA İLERLEME WİDGET'I -->
<div id="desktopKazaProgressWidget" class="bg-slate-950/60 border border-white/10 p-4 rounded-2xl space-y-2">
<div class="flex items-center justify-between text-xs">
<span class="font-bold text-indigo-300 flex items-center gap-1.5">
<span>🎯</span> KAZA İLERLEMESİ
</span>
<span id="desktopKazaPct" class="font-extrabold text-emerald-400">%0</span>
</div>
<div class="w-full h-3 bg-slate-900 rounded-full overflow-hidden border border-white/5 p-0.5">
<div id="desktopKazaBar" class="h-full bg-linear-to-r from-indigo-500 via-purple-500 to-emerald-400 rounded-full transition-all duration-700 ease-out w-[0%]"></div>
</div>
<p id="desktopKazaSub" class="text-[10px] text-slate-400 text-right">Yükleniyor...</p>
</div>
<!-- Bölüm 1: Hicri Takvim --> <!-- Bölüm 1: Hicri Takvim -->
<div class="space-y-1.5"> <div class="space-y-1">
<div class="flex items-center gap-2 text-xs font-semibold text-emerald-400"> <div class="flex items-center gap-2 text-xs font-semibold text-emerald-400">
<span>📅</span> HİCRİ TAKVİM <span>📅</span> HİCRİ TAKVİM
</div> </div>
@@ -37,32 +55,29 @@ export function renderDesktop(selectedCity = "Edremit") {
<hr class="border-white/5" /> <hr class="border-white/5" />
<!-- Bölüm 2: Hava Durumu --> <!-- Bölüm 2: Hava Durumu -->
<div class="space-y-1.5" id="weatherWidget"> <div class="space-y-1" id="weatherWidget">
<div class="flex items-center gap-2 text-xs font-semibold text-sky-400"> <div class="text-xs text-slate-400">Hava durumu yükleniyor...</div>
<span>Yükleniyor...</span>
</div>
</div> </div>
<hr class="border-white/5" /> <hr class="border-white/5" />
<!-- Bölüm 3: İmsakiye & Aktif Vakit --> <!-- Bölüm 3: İmsakiye -->
<div class="space-y-3" id="imsakiyeWidget"> <div class="space-y-2" id="imsakiyeWidget">
<div class="text-xs font-semibold text-orange-400">İMSAKİYE</div> <div class="text-xs text-slate-400">Namaz vakitleri yükleniyor...</div>
<p class="text-xs text-slate-400">Yükleniyor...</p>
</div> </div>
<hr class="border-white/5" /> <hr class="border-white/5" />
<!-- Bölüm 4: Kaza Namazı Kısayolu --> <!-- Bölüm 4: Kaza Kısayolu -->
<div id="kazaShortcut" class="bg-indigo-600/20 hover:bg-indigo-600/30 border border-indigo-500/30 p-4 rounded-2xl cursor-pointer transition-all group flex items-center justify-between"> <div id="kazaShortcut" class="bg-indigo-600/30 hover:bg-indigo-600/50 border border-indigo-500/30 p-3.5 rounded-2xl cursor-pointer transition-all group flex items-center justify-between">
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<span class="text-2xl group-hover:scale-110 transition-transform">📿</span> <span class="text-xl group-hover:scale-110 transition-transform">📿</span>
<div> <div>
<h3 class="text-sm font-bold text-white">Kaza Namazı Takibi</h3> <h3 class="text-xs font-bold text-white">Kaza Namazı Takibi</h3>
<p class="text-[11px] text-indigo-300">Kaydetmeye ve takibe başla</p> <p class="text-[10px] text-indigo-300">Detaylı sayaç & takip</p>
</div> </div>
</div> </div>
<span class="text-slate-400 group-hover:translate-x-1 transition-transform">➔</span> <span class="text-slate-400 group-hover:translate-x-1 transition-transform text-xs">➔</span>
</div> </div>
</div> </div>
@@ -74,14 +89,59 @@ export function renderDesktop(selectedCity = "Edremit") {
initEvents: (container) => { initEvents: (container) => {
loadWeather(container, selectedCity); loadWeather(container, selectedCity);
loadImsakiye(container, selectedCity); loadImsakiye(container, selectedCity);
if (pb) loadDesktopKazaProgress(container, pb);
container.querySelector("#kazaShortcut")?.addEventListener("click", () => { container
.querySelector("#kazaShortcut")
?.addEventListener("click", () => {
window.dispatchEvent(new CustomEvent("navigate", { detail: "kaza" })); window.dispatchEvent(new CustomEvent("navigate", { detail: "kaza" }));
}); });
}, },
}; };
} }
async function loadDesktopKazaProgress(container, pb) {
const user = pb.authStore.model;
if (!user) return;
const birthDate = user.birthDate || user.birthdate;
if (!birthDate) return;
const calc = calculateMissedPrayers(birthDate, user.gender || "male", 12);
let totalMissed =
calc.fajr + calc.dhuhr + calc.asr + calc.maghrib + calc.isha + calc.vitr ||
0;
let totalCompleted = 0;
try {
const record = await pb
.collection("kaza_logs")
.getFirstListItem(`user = "${user.id}"`);
if (record) {
totalCompleted =
(record.fajr || 0) +
(record.dhuhr || 0) +
(record.asr || 0) +
(record.maghrib || 0) +
(record.isha || 0) +
(record.vitr || 0);
}
} catch {}
const pct =
totalMissed > 0
? Math.min(100, Math.round((totalCompleted / totalMissed) * 100))
: 100;
const bar = container.querySelector("#desktopKazaBar");
const pctText = container.querySelector("#desktopKazaPct");
const subText = container.querySelector("#desktopKazaSub");
if (bar) bar.style.width = `${pct}%`;
if (pctText) pctText.textContent = `%${pct}`;
if (subText)
subText.textContent = `${totalCompleted} kılınan / ${Math.max(0, totalMissed - totalCompleted)} kalan`;
}
async function loadWeather(container, selectedCity) { async function loadWeather(container, selectedCity) {
const widget = container.querySelector("#weatherWidget"); const widget = container.querySelector("#weatherWidget");
if (!widget) return; if (!widget) return;
@@ -126,12 +186,12 @@ async function loadImsakiye(container, selectedCity) {
<span class="text-[10px] bg-indigo-500/20 text-indigo-300 border border-indigo-500/30 px-2 py-0.5 rounded-full">Şu an: ${times.currentPrayer?.name}</span> <span class="text-[10px] bg-indigo-500/20 text-indigo-300 border border-indigo-500/30 px-2 py-0.5 rounded-full">Şu an: ${times.currentPrayer?.name}</span>
</div> </div>
<div class="grid grid-cols-2 gap-2 text-xs"> <div class="grid grid-cols-2 gap-2 text-xs">
<div class="p-2 rounded-xl ${activeKey === 'fajr' ? 'bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold' : 'bg-slate-900/40 text-slate-300'}">İmsak: ${times.imsak}</div> <div class="p-2 rounded-xl ${activeKey === "fajr" ? "bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold" : "bg-slate-900/40 text-slate-300"}">İmsak: ${times.imsak}</div>
<div class="p-2 rounded-xl bg-slate-900/40 text-slate-300">Güneş: ${times.sunrise}</div> <div class="p-2 rounded-xl bg-slate-900/40 text-slate-300">Güneş: ${times.sunrise}</div>
<div class="p-2 rounded-xl ${activeKey === 'dhuhr' ? 'bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold' : 'bg-slate-900/40 text-slate-300'}">Öğle: ${times.dhuhr}</div> <div class="p-2 rounded-xl ${activeKey === "dhuhr" ? "bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold" : "bg-slate-900/40 text-slate-300"}">Öğle: ${times.dhuhr}</div>
<div class="p-2 rounded-xl ${activeKey === 'asr' ? 'bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold' : 'bg-slate-900/40 text-slate-300'}">İkindi: ${times.asr}</div> <div class="p-2 rounded-xl ${activeKey === "asr" ? "bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold" : "bg-slate-900/40 text-slate-300"}">İkindi: ${times.asr}</div>
<div class="p-2 rounded-xl ${activeKey === 'maghrib' ? 'bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold' : 'bg-slate-900/40 text-slate-300'}">Akşam: ${times.maghrib}</div> <div class="p-2 rounded-xl ${activeKey === "maghrib" ? "bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold" : "bg-slate-900/40 text-slate-300"}">Akşam: ${times.maghrib}</div>
<div class="p-2 rounded-xl ${activeKey === 'isha' ? 'bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold' : 'bg-slate-900/40 text-slate-300'}">Yatsı: ${times.isha}</div> <div class="p-2 rounded-xl ${activeKey === "isha" ? "bg-emerald-500/20 border border-emerald-500/40 text-emerald-300 font-bold" : "bg-slate-900/40 text-slate-300"}">Yatsı: ${times.isha}</div>
</div> </div>
`; `;
} }
+12 -19
View File
@@ -15,7 +15,7 @@ export function renderKaza(pb) {
const gender = user?.gender || "male"; const gender = user?.gender || "male";
const html = ` const html = `
<div class="relative bg-slate-900/70 backdrop-blur-2xl border border-white/10 p-6 md:p-8 rounded-3xl shadow-2xl max-w-4xl w-full h-[85vh] flex flex-col overflow-hidden"> <div class="relative bg-slate-900/80 border border-white/10 p-6 md:p-8 rounded-3xl shadow-2xl max-w-4xl w-full h-[85vh] flex flex-col overflow-hidden">
<button id="closeBtn" class="absolute top-4 right-4 bg-rose-500/20 hover:bg-rose-500/40 text-rose-300 border border-rose-500/30 w-8 h-8 rounded-full flex items-center justify-center font-bold text-xs transition-all"> <button id="closeBtn" class="absolute top-4 right-4 bg-rose-500/20 hover:bg-rose-500/40 text-rose-300 border border-rose-500/30 w-8 h-8 rounded-full flex items-center justify-center font-bold text-xs transition-all">
</button> </button>
@@ -31,17 +31,17 @@ export function renderKaza(pb) {
${ ${
!birthDate !birthDate
? ` ? `
<div class="bg-slate-900/50 border border-white/10 p-6 rounded-2xl my-auto text-center max-w-md mx-auto w-full"> <div class="bg-slate-950/50 border border-white/10 p-6 rounded-2xl my-auto text-center max-w-md mx-auto w-full">
<h3 class="text-base font-bold text-white mb-2">Doğum Tarihi Gerekli</h3> <h3 class="text-base font-bold text-white mb-2">Doğum Tarihi Gerekli</h3>
<p class="text-xs text-slate-400 mb-6">Kaza namazı borcunu hesaplayabilmemiz için profil bilgilerinizi girin.</p> <p class="text-xs text-slate-400 mb-6">Kaza namazı borcunu hesaplayabilmemiz için profil bilgilerinizi girin.</p>
<form id="profileForm" class="space-y-4"> <form id="profileForm" class="space-y-4">
<div class="text-left"> <div class="text-left">
<label class="block text-xs text-slate-300 mb-1">Doğum Tarihi</label> <label class="block text-xs text-slate-300 mb-1">Doğum Tarihi ve Saati</label>
<input type="date" id="birthDateInput" required class="w-full bg-slate-950 border border-slate-800 rounded-xl px-4 py-2.5 text-white text-sm focus:border-indigo-500 focus:outline-none" /> <input type="datetime-local" id="birthDateInput" required class="w-full bg-slate-900 border border-slate-800 rounded-xl px-4 py-2.5 text-white text-sm focus:border-indigo-500 focus:outline-none" />
</div> </div>
<div class="text-left"> <div class="text-left">
<label class="block text-xs text-slate-300 mb-1">Cinsiyet</label> <label class="block text-xs text-slate-300 mb-1">Cinsiyet</label>
<select id="genderInput" required class="w-full bg-slate-950 border border-slate-800 rounded-xl px-4 py-2.5 text-white text-sm focus:border-indigo-500 focus:outline-none"> <select id="genderInput" required class="w-full bg-slate-900 border border-slate-800 rounded-xl px-4 py-2.5 text-white text-sm focus:border-indigo-500 focus:outline-none">
<option value="male">Erkek</option> <option value="male">Erkek</option>
<option value="female">Kadın</option> <option value="female">Kadın</option>
</select> </select>
@@ -162,7 +162,6 @@ export function renderKaza(pb) {
}; };
} }
// PocketBase Tek Satır Güncelleme Mantığı
async function updateKazaCount(container, pb, birthDate, gender, direction) { async function updateKazaCount(container, pb, birthDate, gender, direction) {
const prayerId = container.querySelector("#kazaPrayerType").value; const prayerId = container.querySelector("#kazaPrayerType").value;
const countInput = container.querySelector("#kazaCount"); const countInput = container.querySelector("#kazaCount");
@@ -172,15 +171,13 @@ async function updateKazaCount(container, pb, birthDate, gender, direction) {
try { try {
const userId = pb.authStore.model.id; const userId = pb.authStore.model.id;
// Kullanıcının kaza sayacı kaydı var mı kontrol et
let userRecord = null; let userRecord = null;
try { try {
userRecord = await pb userRecord = await pb
.collection("kaza_logs") .collection("kaza_logs")
.getFirstListItem(`user = "${userId}"`); .getFirstListItem(`user = "${userId}"`);
} catch { } catch {
// Yoksa ilk kaydı oluştur
userRecord = await pb.collection("kaza_logs").create({ userRecord = await pb.collection("kaza_logs").create({
user: userId, user: userId,
fajr: 0, fajr: 0,
@@ -195,7 +192,6 @@ async function updateKazaCount(container, pb, birthDate, gender, direction) {
const currentCompleted = userRecord[prayerId] || 0; const currentCompleted = userRecord[prayerId] || 0;
const newCompleted = Math.max(0, currentCompleted + amount); const newCompleted = Math.max(0, currentCompleted + amount);
// Tek satır kaydı güncelle
await pb.collection("kaza_logs").update(userRecord.id, { await pb.collection("kaza_logs").update(userRecord.id, {
[prayerId]: newCompleted, [prayerId]: newCompleted,
}); });
@@ -213,14 +209,14 @@ async function updateKazaCount(container, pb, birthDate, gender, direction) {
console.error("Sayaç güncelleme hatası:", err); console.error("Sayaç güncelleme hatası:", err);
showKazaMsg( showKazaMsg(
msg, msg,
"Güncelleme başarısız! PocketBase alanlarını ve izinlerini kontrol edin.", "Güncelleme başarısız! PocketBase alanlarını kontrol edin.",
false, false,
); );
} }
} }
async function refreshKazaStats(container, pb, birthDate, gender) { async function refreshKazaStats(container, pb, birthDate, gender) {
const calc = calculateMissedPrayers(birthDate, gender); const calc = calculateMissedPrayers(birthDate, gender, 12);
const userId = pb.authStore.model.id; const userId = pb.authStore.model.id;
let userRecord = { fajr: 0, dhuhr: 0, asr: 0, maghrib: 0, isha: 0, vitr: 0 }; let userRecord = { fajr: 0, dhuhr: 0, asr: 0, maghrib: 0, isha: 0, vitr: 0 };
@@ -230,17 +226,15 @@ async function refreshKazaStats(container, pb, birthDate, gender) {
.collection("kaza_logs") .collection("kaza_logs")
.getFirstListItem(`user = "${userId}"`); .getFirstListItem(`user = "${userId}"`);
if (record) userRecord = record; if (record) userRecord = record;
} catch (err) { } catch (err) {}
// Kayıt yoksa sorun değil, varsayılan 0 değerleriyle devam eder
}
let grandTotalMissed = 0; let grandTotalMissed = 0;
let grandTotalCompleted = 0; let grandTotalCompleted = 0;
PRAYERS.forEach((p) => { PRAYERS.forEach((p) => {
const totalMissed = calc[p.id] || 0; // Doğumdan beri olan toplam borç const totalMissed = calc[p.id] || 0;
const completed = userRecord[p.id] || 0; // Kılınan miktar const completed = userRecord[p.id] || 0;
const remaining = Math.max(0, totalMissed - completed); // Kalan borç const remaining = Math.max(0, totalMissed - completed);
grandTotalMissed += totalMissed; grandTotalMissed += totalMissed;
grandTotalCompleted += completed; grandTotalCompleted += completed;
@@ -261,7 +255,6 @@ async function refreshKazaStats(container, pb, birthDate, gender) {
} }
}); });
// Genel İlerleme Hesabı
const overallPct = const overallPct =
grandTotalMissed > 0 grandTotalMissed > 0
? Math.min( ? Math.min(
+13 -5
View File
@@ -23,11 +23,19 @@ const DAYS = [
"Cumartesi", "Cumartesi",
]; ];
export function gregorianToHijri(date = new Date()) { export function gregorianToHijri(dateInput = new Date()) {
// Türkiye coğrafi hizalaması ve Hilal takvimi için +2 gün adjustment const date = new Date(dateInput);
const adjustment = 2;
// Akşam 19:00 ve sonrası doğumlarda Hicri takvim bir sonraki güne geçer
const hours = date.getHours();
let dayOffset = 2; // Türkiye coğrafi hilal düzeltmesi
if (hours >= 19) {
dayOffset += 1;
}
const adjustedDate = new Date( const adjustedDate = new Date(
date.getTime() + adjustment * 24 * 60 * 60 * 1000, date.getTime() + dayOffset * 24 * 60 * 60 * 1000,
); );
const year = adjustedDate.getFullYear(); const year = adjustedDate.getFullYear();
@@ -78,7 +86,7 @@ export function gregorianToHijri(date = new Date()) {
}; };
} }
export function calculateMissedPrayers(birthDate, gender, mukallafAge = 15) { export function calculateMissedPrayers(birthDate, gender, mukallafAge = 12) {
const birth = new Date(birthDate); const birth = new Date(birthDate);
const today = new Date(); const today = new Date();
today.setHours(0, 0, 0, 0); today.setHours(0, 0, 0, 0);