Numex yayın: public/admin.js
This commit is contained in:
parent
5fcc4fe3d5
commit
fd2440115b
99
public/admin.js
Normal file
99
public/admin.js
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
// admin.js — Admin paneli günlük liste mantığı
|
||||||
|
(function () {
|
||||||
|
const filterDate = document.getElementById('filterDate');
|
||||||
|
const refreshBtn = document.getElementById('refreshBtn');
|
||||||
|
const listEl = document.getElementById('appointmentList');
|
||||||
|
const summaryEl = document.getElementById('summary');
|
||||||
|
|
||||||
|
function todayISO() {
|
||||||
|
return new Date().toISOString().split('T')[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Günün randevularını yükle
|
||||||
|
async function loadAppointments(date) {
|
||||||
|
listEl.innerHTML = '<p>Yükleniyor...</p>';
|
||||||
|
try {
|
||||||
|
const res = await fetch(`/api/appointments?date=${encodeURIComponent(date)}`);
|
||||||
|
const list = await res.json();
|
||||||
|
renderList(list, date);
|
||||||
|
} catch (err) {
|
||||||
|
listEl.innerHTML = '<p class="empty-state">Liste yüklenemedi.</p>';
|
||||||
|
summaryEl.textContent = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderList(list, date) {
|
||||||
|
if (!Array.isArray(list) || list.length === 0) {
|
||||||
|
listEl.innerHTML = '<p class="empty-state">Bu gün için randevu bulunmuyor. 🎉</p>';
|
||||||
|
summaryEl.textContent = `${date} — toplam 0 randevu`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
summaryEl.textContent = `${date} — toplam ${list.length} randevu`;
|
||||||
|
|
||||||
|
listEl.innerHTML = '';
|
||||||
|
list.forEach(a => {
|
||||||
|
const item = document.createElement('div');
|
||||||
|
item.className = 'appointment-item';
|
||||||
|
|
||||||
|
const timeBadge = document.createElement('span');
|
||||||
|
timeBadge.className = 'time-badge';
|
||||||
|
timeBadge.textContent = a.time;
|
||||||
|
|
||||||
|
const info = document.createElement('div');
|
||||||
|
info.className = 'info';
|
||||||
|
info.innerHTML = `
|
||||||
|
<div class="name">${escapeHtml(a.name)}</div>
|
||||||
|
<div class="detail">${escapeHtml(a.service || 'Genel')} • Tel: ${escapeHtml(a.phone)}</div>
|
||||||
|
${a.notes ? `<div class="detail">📝 ${escapeHtml(a.notes)}</div>` : ''}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const actions = document.createElement('div');
|
||||||
|
actions.className = 'actions';
|
||||||
|
const delBtn = document.createElement('button');
|
||||||
|
delBtn.className = 'btn btn-danger';
|
||||||
|
delBtn.textContent = 'Sil';
|
||||||
|
delBtn.addEventListener('click', () => deleteAppointment(a.id));
|
||||||
|
actions.appendChild(delBtn);
|
||||||
|
|
||||||
|
item.appendChild(timeBadge);
|
||||||
|
item.appendChild(info);
|
||||||
|
item.appendChild(actions);
|
||||||
|
listEl.appendChild(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function deleteAppointment(id) {
|
||||||
|
if (!confirm('Bu randevuyu silmek istediğinize emin misiniz?')) return;
|
||||||
|
try {
|
||||||
|
const res = await fetch(`/api/appointments/${id}`, { method: 'DELETE' });
|
||||||
|
if (res.ok) {
|
||||||
|
loadAppointments(filterDate.value || todayISO());
|
||||||
|
} else {
|
||||||
|
alert('Silme sırasında hata oluştu.');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
alert('Bağlantı hatası.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeHtml(str) {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.textContent = str;
|
||||||
|
return div.innerHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Varsayılan: bugün
|
||||||
|
filterDate.value = todayISO();
|
||||||
|
|
||||||
|
refreshBtn.addEventListener('click', () => {
|
||||||
|
loadAppointments(filterDate.value || todayISO());
|
||||||
|
});
|
||||||
|
|
||||||
|
filterDate.addEventListener('change', () => {
|
||||||
|
loadAppointments(filterDate.value || todayISO());
|
||||||
|
});
|
||||||
|
|
||||||
|
// İlk yükleme
|
||||||
|
loadAppointments(todayISO());
|
||||||
|
})();
|
||||||
Loading…
Reference in New Issue
Block a user