// ========================================== // PATCH SINKRONISASI CLOUDFLARE X APPS SCRIPT // ========================================== function apiFetch(action, payload = {}) { if (PREVIEW_MODE) return Promise.resolve(); return fetch(APP_URL, { method: 'POST', body: JSON.stringify({ action: action, payload: payload }) }).then(res => res.json()).catch(err => console.error("API Error", err)); } async function loadDataDariServer() { if (PREVIEW_MODE) return; try { const [resUsers, resPresensi, resTabungan, resEvents, resMitra] = await Promise.all([ apiFetch('getUsers'), apiFetch('getPresensi'), apiFetch('getTabungan'), apiFetch('getEvents'), apiFetch('getMitra') ]); if (resUsers && resUsers.users) mockUsers = resUsers.users; if (resPresensi && resPresensi.data) mockPresensi = resPresensi.data; if (resTabungan && resTabungan.data) mockTabungan = resTabungan.data; if (resEvents && resEvents.data) mockEvents = resEvents.data; if (resMitra && resMitra.data) mockMitra = resMitra.data; if(activeTab) switchTab(activeTab); } catch(e) {} } const oriLogin = handleLogin; handleLogin = function(e) { e.preventDefault(); const u = e.target.username.value.trim(); const p = e.target.password.value.trim(); if (PREVIEW_MODE) return oriLogin(e); showToast('Sedang verifikasi ke server...', 'info'); fetch(APP_URL, { method: 'POST', body: JSON.stringify({ action: 'login', payload: { username: u, password: p } }) }) .then(res => res.json()) .then(res => { if (res.status === 'success') { currentUser = res.user; if (e.target.rememberMe && e.target.rememberMe.checked) localStorage.setItem('azzam_saved_user', JSON.stringify(currentUser)); showToast(`Selamat datang, ${currentUser.name}!`); renderMainLayout(); loadDataDariServer(); } else showToast(res.message, 'error'); }).catch(() => showToast('Server tidak merespons', 'error')); } window.addEventListener('DOMContentLoaded', () => { const savedUser = localStorage.getItem('azzam_saved_user'); if (savedUser) { try { currentUser = JSON.parse(savedUser); renderMainLayout(); loadDataDariServer(); } catch(e) {} } }); const oriSaveEvent = handleSaveAgendaModal; handleSaveAgendaModal = function(e) { oriSaveEvent(e); apiFetch('saveEvent', mockEvents[mockEvents.length-1]); } const oriUpdateEvent = handleUpdateAgendaModal; handleUpdateAgendaModal = function(e, id) { oriUpdateEvent(e, id); apiFetch('updateEvent', mockEvents.find(x => x.id === id)); } deleteAgenda = function(id) { if(confirm('Hapus agenda?')) { mockEvents = mockEvents.filter(x => x.id !== id); apiFetch('deleteEvent', {id}); renderDashboardView(document.getElementById('main-content')); showToast('Terhapus'); } } const oriSavePresensi = handleSavePresensiForm; handleSavePresensiForm = function(e) { oriSavePresensi(e); const p = mockPresensi.find(x => x.date === e.target.date.value && x.userId === currentUser.id); if(p) apiFetch('savePresensi', p); } const oriToggleVal = togglePresensiValidation; togglePresensiValidation = function(id) { oriToggleVal(id); apiFetch('updatePresensiValidasi', {id, status: mockPresensi.find(x=>x.id===id).validated}); } const oriCheckAll = checkAllUserPresensi; checkAllUserPresensi = function(s) { oriCheckAll(s); apiFetch('updateSemuaValidasi', {userId: selectedAdminPegawaiId, status: s}); } const oriSaveTab = saveTabunganToState; saveTabunganToState = function(t, a, d, p) { oriSaveTab(t, a, d, p); apiFetch('saveTabungan', mockTabungan[mockTabungan.length-1]); } const oriSaveMitra = handleSaveMitraModal; handleSaveMitraModal = function(e, id) { oriSaveMitra(e, id); apiFetch(id ? 'updateMitra' : 'saveMitra', id ? mockMitra.find(m=>m.id===id) : mockMitra[mockMitra.length-1]); } deleteMitra = function(id) { if(confirm('Hapus mitra?')) { mockMitra = mockMitra.filter(m=>m.id!==id); apiFetch('deleteMitra', {id}); renderMitraAzzamView(document.getElementById('main-content')); } } const oriSavePegawai = handleSavePegawaiModal; handleSavePegawaiModal = function(e, id) { oriSavePegawai(e, id); apiFetch(id ? 'updateUser' : 'saveUser', id ? mockUsers.find(u=>u.id===id) : mockUsers[mockUsers.length-1]); } const oriToggleStatus = toggleUserStatus; toggleUserStatus = function(id) { oriToggleStatus(id); apiFetch('updateUserStatus', {id, status: mockUsers.find(u=>u.id===id).status}); } deletePegawai = function(id) { if(confirm('Hapus pegawai?')) { mockUsers = mockUsers.filter(u=>u.id!==id); apiFetch('deleteUser', {id}); renderKelolaPegawaiView(document.getElementById('main-content')); } } const oriSaveProfile = handleSaveProfileForm; handleSaveProfileForm = function(e) { oriSaveProfile(e); apiFetch('updateUser', currentUser); }