diff --git a/_legacy/index.html b/_legacy/index.html index 027dc0d..a886f10 100644 --- a/_legacy/index.html +++ b/_legacy/index.html @@ -1,9 +1,10 @@ + - WebGIS Miskin & Ibadah + WebGIS Pemetaan Kemiskinan @@ -16,19 +17,31 @@ - - + + + - +
@@ -68,9 +85,9 @@
🏘️
-

WebGIS Miskin & Ibadah

+

WebGIS Pemetaan Kemiskinan

- Sistem Informasi Geografis untuk pemetaan rumah ibadah dan + Sistem Informasi Geografis untuk pemetaan rumah ibadah dan analisis sebaran keluarga kurang mampu.

@@ -99,7 +116,7 @@ let val = 0; const bar = document.getElementById('redirectProgress'); const tick = setInterval(() => { - val += 100 / 50; + val += 100 / 50; bar.value = val; if (val >= 100) clearInterval(tick); }, 100); @@ -133,7 +150,7 @@ fetch('api/get_miskin.php').then(r => r.json()) ]).then(([ibadah, miskin]) => { const markers = []; - + ibadah.forEach(item => { L.circleMarker([+item.latitude, +item.longitude], { radius: 7, fillColor: "#22c55e", color: "#fff", weight: 2, opacity: 1, fillOpacity: 0.8 @@ -151,14 +168,15 @@ if (markers.length) { map.fitBounds(markers, { padding: [50, 50] }); } - + // Subtle animation: slow pan let lat = map.getCenter().lat; setInterval(() => { lat += 0.000005; map.panTo([lat, map.getCenter().lng], { animate: true, duration: 1 }); }, 1000); - }).catch(() => {}); + }).catch(() => { }); - + + \ No newline at end of file diff --git a/_legacy/pages/data.html b/_legacy/pages/data.html index bed0154..d6368d1 100644 --- a/_legacy/pages/data.html +++ b/_legacy/pages/data.html @@ -1,9 +1,10 @@ + - Data Tabular - WebGIS Miskin & Ibadah + Data Tabular - WebGIS Pemetaan Kemiskinan @@ -13,14 +14,34 @@ - + + @@ -28,20 +49,21 @@
- WebGIS Miskin & Ibadah + WebGIS Pemetaan Kemiskinan
- +
@@ -52,7 +74,8 @@

Daftar rumah ibadah dan keluarga miskin dalam matriks tabular.

@@ -77,7 +100,8 @@
- +
@@ -189,8 +213,8 @@ document.getElementById('confirmDeleteBtn').onclick = async () => { const { type, id } = deleteTarget; - const res = await fetch(`../api/delete_${type}.php`, { - method: 'POST', body: JSON.stringify(type === 'ibadah' ? { id } : { id_rumah: id }) + const res = await fetch(`../api/delete_${type}.php`, { + method: 'POST', body: JSON.stringify(type === 'ibadah' ? { id } : { id_rumah: id }) }); const resJson = await res.json(); if (resJson.success) { @@ -210,4 +234,5 @@ } - + + \ No newline at end of file diff --git a/_legacy/pages/map.html b/_legacy/pages/map.html index 86c022c..8c3f993 100644 --- a/_legacy/pages/map.html +++ b/_legacy/pages/map.html @@ -1,9 +1,10 @@ + - Peta Interaktif - WebGIS Miskin & Ibadah + Peta Interaktif - WebGIS Pemetaan Kemiskinan @@ -18,15 +19,46 @@ - + + @@ -72,7 +106,7 @@
@@ -104,13 +138,16 @@ Mode Operasi
- - -
@@ -130,12 +167,13 @@
Nama Ibadah
Alamat
- +
- +
@@ -168,7 +206,7 @@
- +
+
diff --git a/resources/views/admin/settings.blade.php b/resources/views/admin/settings.blade.php index 59abc29..3cc4c59 100644 --- a/resources/views/admin/settings.blade.php +++ b/resources/views/admin/settings.blade.php @@ -14,38 +14,13 @@ body { font-weight: 500; background-color: #f8fafc; } h1, h2, h3, .btn { font-weight: 700 !important; letter-spacing: -0.01em; } + - - + + @include('partials.sidebar') -
+
+

Konfigurasi Sistem

Atur parameter peta dan analisis. Perubahan berlaku setelah halaman peta di-refresh.

@@ -54,6 +29,7 @@

Memuat pengaturan...

+
diff --git a/resources/views/admin/users.blade.php b/resources/views/admin/users.blade.php index 1ab9f67..48887f7 100644 --- a/resources/views/admin/users.blade.php +++ b/resources/views/admin/users.blade.php @@ -16,82 +16,15 @@ body { font-weight: 500; background-color: #f8fafc; } h1, h2, h3, h4, h5, h6, .btn, .card-title, .stat-value { font-weight: 700 !important; letter-spacing: -0.01em; } + - + - - + @include('partials.sidebar') -
+
+
@@ -159,6 +92,7 @@
+
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index dd3fa32..2eb8e88 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -20,44 +20,60 @@ + - +
+
@@ -231,19 +207,22 @@ return turf.distance(p1, p2, { units: 'meters' }) <= radius; } - let ibadahData = [], miskinData = []; + let ibadahData = [], miskinData = [], dosenSummary = null; let chartJenis = null, chartKondisi = null, chartGap = null; + let chartPendidikan = null, chartBantuanJenis = null, chartTransfer = null; document.addEventListener('DOMContentLoaded', loadDashboard); async function loadDashboard() { try { - const [ri, rm] = await Promise.all([ + const [ri, rm, ds] = await Promise.all([ fetch('{{ url('/api/ibadah') }}').then(r => r.json()), fetch('{{ url('/api/miskin') }}').then(r => r.json()), + fetch('{{ url('/api/dashboard/dosen-summary') }}').then(r => r.json()), ]); ibadahData = ri; miskinData = rm; + dosenSummary = ds; renderDashboard(); } catch (e) { showToast('Gagal memuat data', 'error'); @@ -256,6 +235,7 @@ document.getElementById('statTotalIbadah').textContent = ibadahData.length; document.getElementById('statTotalMiskin').textContent = miskinData.length; document.getElementById('statTotalJiwa').textContent = totalJiwa; + renderDosenSummary(); // ── 2. GAP ANALYSIS ────────────────────────────────────── const coveredSet = new Set(); @@ -388,7 +368,7 @@ ${esc(m.kondisi_rumah || '-')} ${m.jumlah_orang || 0} `).join('') - : 'Semua keluarga miskin terjangkau! 🎉'; + : 'Semua keluarga miskin terjangkau.'; } function renderOrUpdateChart(canvasId, existingChart, config, setter) { @@ -397,15 +377,125 @@ setter(new Chart(ctx, config)); } + function renderDosenSummary() { + if (!dosenSummary) return; + + const anggota = dosenSummary.anggota || {}; + const bantuan = dosenSummary.bantuan || {}; + const transfer = dosenSummary.transfer || {}; + const statusHidup = anggota.status_hidup || {}; + const pendidikan = anggota.pendidikan || {}; + + const pendidikanTerdata = Object.entries(pendidikan) + .filter(([key]) => key !== 'tidak_diketahui') + .reduce((total, [, value]) => total + Number(value || 0), 0); + + document.getElementById('statTotalAnggota').textContent = anggota.total || 0; + document.getElementById('statAnggotaDesc').textContent = `${statusHidup.hidup || 0} hidup / ${statusHidup.meninggal || 0} meninggal`; + document.getElementById('statPendidikanTerdata').textContent = pendidikanTerdata; + document.getElementById('statBantuanBulanIni').textContent = bantuan.bulan_ini || 0; + document.getElementById('statBantuanTotal').textContent = `${bantuan.total || 0} total bantuan`; + document.getElementById('statTransferPending').textContent = transfer.pending || 0; + document.getElementById('statTransferDesc').textContent = `${transfer.disetujui || 0} disetujui / ${transfer.ditolak || 0} ditolak`; + + const pendidikanLabels = { + tidak_sekolah: 'Tidak Sekolah', + sd: 'SD', + smp: 'SMP', + sma: 'SMA', + d3: 'D3', + s1_plus: 'S1+', + tidak_diketahui: 'Tidak Diketahui', + }; + const pendidikanEntries = chartEntries(pendidikan, pendidikanLabels); + renderOrUpdateChart('chartPendidikan', chartPendidikan, { + type: 'bar', + data: { + labels: pendidikanEntries.labels, + datasets: [{ + label: 'Anggota', + data: pendidikanEntries.values, + backgroundColor: '#14b8a6', + borderRadius: 6, + }], + }, + options: { + plugins: { legend: { display: false } }, + scales: { y: { beginAtZero: true, ticks: { stepSize: 1 } } }, + }, + }, c => chartPendidikan = c); + + const bantuanEntries = chartEntries(bantuan.per_jenis || {}, {}); + renderOrUpdateChart('chartBantuanJenis', chartBantuanJenis, { + type: 'doughnut', + data: { + labels: bantuanEntries.labels, + datasets: [{ + data: bantuanEntries.values, + backgroundColor: ['#22c55e', '#3b82f6', '#f97316', '#8b5cf6', '#ef4444', '#64748b'], + borderWidth: 2, + borderColor: '#fff', + }], + }, + options: { plugins: { legend: { position: 'bottom' } }, cutout: '55%' }, + }, c => chartBantuanJenis = c); + + const transferEntries = chartEntries(transfer, { + pending: 'Pending', + disetujui: 'Disetujui', + ditolak: 'Ditolak', + }); + renderOrUpdateChart('chartTransfer', chartTransfer, { + type: 'doughnut', + data: { + labels: transferEntries.labels, + datasets: [{ + data: transferEntries.values, + backgroundColor: ['#f59e0b', '#22c55e', '#ef4444'], + borderWidth: 2, + borderColor: '#fff', + }], + }, + options: { plugins: { legend: { position: 'bottom' } }, cutout: '55%' }, + }, c => chartTransfer = c); + } + + function chartEntries(source, labels) { + const entries = Object.entries(source || {}).filter(([, value]) => Number(value || 0) > 0); + if (!entries.length) return { labels: ['Belum ada'], values: [0] }; + + return { + labels: entries.map(([key]) => labels[key] || key.replace(/_/g, ' ')), + values: entries.map(([, value]) => Number(value || 0)), + }; + } + // ── NOTIFIKASI PERUBAHAN DATA ──────────────────────────────────────── + function updateTransferBadge(count) { + document.querySelectorAll('a[href$="/permohonan"]').forEach(link => { + let badge = link.querySelector('.transfer-pending-badge'); + if (count > 0) { + if (!badge) { + badge = document.createElement('span'); + badge.className = 'badge badge-error badge-xs transfer-pending-badge'; + link.appendChild(document.createTextNode(' ')); + link.appendChild(badge); + } + badge.textContent = count; + badge.classList.remove('hidden'); + } else if (badge) { + badge.classList.add('hidden'); + } + }); + } + (function initNotifPolling() { const POLL_MS = 30000; - const KEY_IBADAH = 'notif_latest_ibadah'; - const KEY_MISKIN = 'notif_latest_miskin'; + const KEY_SEEN = 'notif_latest_seen'; async function pollNotifications() { try { - const since = localStorage.getItem(KEY_IBADAH) || new Date(0).toISOString(); + const since = localStorage.getItem(KEY_SEEN) || new Date(0).toISOString(); const res = await fetch( `{{ url('/api/notifications') }}?since=${encodeURIComponent(since)}`, { headers: { 'X-CSRF-TOKEN': csrfToken } } @@ -413,19 +503,27 @@ if (!res.ok) return; const data = await res.json(); - if (data.new_ibadah > 0 || data.new_miskin > 0) { + updateTransferBadge(Number(data.pending_transfer || 0)); + + const hasChanges = data.new_ibadah > 0 || data.new_miskin > 0 || data.new_anggota > 0 || data.new_bantuan > 0 || data.new_transfer > 0; + if (hasChanges) { if (data.new_ibadah > 0) showToast(`${data.new_ibadah} rumah ibadah baru ditambahkan`, 'info'); if (data.new_miskin > 0) showToast(`${data.new_miskin} keluarga miskin baru ditambahkan`, 'info'); + if (data.new_anggota > 0) showToast(`${data.new_anggota} anggota keluarga baru ditambahkan`, 'info'); + if (data.new_bantuan > 0) showToast(`${data.new_bantuan} bantuan baru dicatat`, 'info'); + if (data.new_transfer > 0) showToast(`${data.new_transfer} permohonan transfer baru`, 'info'); if (typeof loadDashboard !== 'undefined') loadDashboard(); } - if (data.latest_ibadah) localStorage.setItem(KEY_IBADAH, data.latest_ibadah); - if (data.latest_miskin) localStorage.setItem(KEY_MISKIN, data.latest_miskin); + const latest = [data.latest_ibadah, data.latest_miskin, data.latest_anggota, data.latest_bantuan, data.latest_transfer] + .filter(Boolean) + .sort() + .pop(); + if (latest) localStorage.setItem(KEY_SEEN, latest); } catch (e) { /* silent */ } } document.addEventListener('DOMContentLoaded', () => { - if (!localStorage.getItem(KEY_IBADAH)) localStorage.setItem(KEY_IBADAH, new Date().toISOString()); - if (!localStorage.getItem(KEY_MISKIN)) localStorage.setItem(KEY_MISKIN, new Date().toISOString()); + if (!localStorage.getItem(KEY_SEEN)) localStorage.setItem(KEY_SEEN, new Date().toISOString()); setInterval(pollNotifications, POLL_MS); }); })(); diff --git a/resources/views/data.blade.php b/resources/views/data.blade.php index 098ead5..43dfb44 100644 --- a/resources/views/data.blade.php +++ b/resources/views/data.blade.php @@ -21,76 +21,15 @@ body { font-weight: 500; background-color: #f8fafc; } h1, h2, h3, h4, h5, h6, .btn, .card-title, .stat-value { font-weight: 700 !important; letter-spacing: -0.01em; } + - + - - + @include('partials.sidebar') -
+
+
@@ -145,9 +84,17 @@
-
- -
+
+
+ + +
+ +
@if(auth()->user()->hasRole('administrator'))
- -
+
+
@@ -374,8 +321,9 @@ @if(auth()->user()->hasRole('administrator') || auth()->user()->hasRole('petugas_pendataan'))
-
Tambah Anggota
+
Tambah Anggota
+
@@ -423,7 +371,10 @@
- +
+ + +
@endif @@ -495,9 +446,21 @@ let selectedMiskin = new Set(); let ibadahData = [], miskinData = []; + let activeDataTab = 'ibadah'; document.addEventListener('DOMContentLoaded', loadAllData); const searchInput = document.getElementById('searchInput'); + function setDataTab(type) { + activeDataTab = type; + const isIbadah = type === 'ibadah'; + document.getElementById('tab_ibadah').classList.toggle('is-active', isIbadah); + document.getElementById('tab_miskin').classList.toggle('is-active', !isIbadah); + document.getElementById('tab_ibadah').setAttribute('aria-selected', isIbadah ? 'true' : 'false'); + document.getElementById('tab_miskin').setAttribute('aria-selected', isIbadah ? 'false' : 'true'); + document.getElementById('panel_ibadah').classList.toggle('hidden', !isIbadah); + document.getElementById('panel_miskin').classList.toggle('hidden', isIbadah); + } + async function loadAllData() { try { const [ri, rm] = await Promise.all([ @@ -592,10 +555,9 @@ } function exportCSV() { - const activeTab = document.querySelector('input[name="data_tabs"]:checked').getAttribute('aria-label'); let csvContent = "data:text/csv;charset=utf-8,"; - if (activeTab.includes("Ibadah")) { + if (activeDataTab === 'ibadah') { csvContent += "ID,Nama,Jenis,Alamat,Radius,Jemaah,Pengurus,Telepon,Lat,Lon\n"; ibadahData.forEach(i => { csvContent += `${i.id},"${i.nama}","${i.jenis}","${i.alamat}",${i.radius},${i.jumlah_jemaah},"${i.pengurus}","${i.telepon}",${i.latitude},${i.longitude}\n`; @@ -837,20 +799,22 @@ // ── ANGGOTA KELUARGA ─────────────────────────────────────────────────── let currentAnggotaRumah = null; + let anggotaData = []; const canEditAnggota = {{ auth()->user()->hasRole('administrator') || auth()->user()->hasRole('petugas_pendataan') ? 'true' : 'false' }}; async function openAnggotaModal(idRumah) { currentAnggotaRumah = idRumah; const rm = miskinData.find(m => m.id_rumah === idRumah); document.getElementById('anggota_rumah_label').textContent = `ID: ${idRumah} — ${rm?.nama_kk || '-'}`; + resetAnggotaForm(); document.getElementById('modal_anggota').showModal(); await loadAnggota(idRumah); } async function loadAnggota(idRumah) { const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(idRumah)}/anggota`, { headers: { 'X-CSRF-TOKEN': csrfToken } }); - const list = await res.json(); - document.getElementById('bodyAnggota').innerHTML = list.length ? list.map(a => ` + anggotaData = await res.json(); + document.getElementById('bodyAnggota').innerHTML = anggotaData.length ? anggotaData.map(a => ` ${esc(a.nama)} ${esc(a.hubungan.replace('_', ' '))} @@ -858,12 +822,45 @@ ${a.umur !== null ? esc(String(a.umur)) + ' th' : '-'} ${a.pendidikan ? esc(a.pendidikan.replace(/_/g, ' ')) : '-'} ${esc(a.status_hidup)} - ${canEditAnggota ? `` : ''} + ${canEditAnggota ? `
+ + +
` : ''} `).join('') : 'Belum ada anggota'; } + function resetAnggotaForm() { + const editId = document.getElementById('anggota_edit_id'); + if (!editId) return; + editId.value = ''; + document.getElementById('formAnggotaTitle').textContent = 'Tambah Anggota'; + document.getElementById('btnSimpanAnggotaText').textContent = 'Simpan Anggota'; + document.getElementById('anggota_nama').value = ''; + document.getElementById('anggota_hubungan').value = 'lainnya'; + document.getElementById('anggota_kelamin').value = ''; + document.getElementById('anggota_tgl_lahir').value = ''; + document.getElementById('anggota_pendidikan').value = ''; + document.getElementById('anggota_status').value = 'hidup'; + } + + function editAnggota(id) { + const item = anggotaData.find(a => Number(a.id) === Number(id)); + if (!item) return; + document.getElementById('anggota_edit_id').value = item.id; + document.getElementById('formAnggotaTitle').textContent = 'Edit Anggota'; + document.getElementById('btnSimpanAnggotaText').textContent = 'Simpan Perubahan'; + document.getElementById('anggota_nama').value = item.nama || ''; + document.getElementById('anggota_hubungan').value = item.hubungan || 'lainnya'; + document.getElementById('anggota_kelamin').value = item.jenis_kelamin || ''; + document.getElementById('anggota_tgl_lahir').value = item.tanggal_lahir || ''; + document.getElementById('anggota_pendidikan').value = item.pendidikan || ''; + document.getElementById('anggota_status').value = item.status_hidup || 'hidup'; + document.getElementById('toggleFormAnggota').checked = true; + } + async function simpanAnggota() { + const editId = document.getElementById('anggota_edit_id')?.value || ''; const body = { nama: document.getElementById('anggota_nama').value.trim(), hubungan: document.getElementById('anggota_hubungan').value, @@ -873,14 +870,22 @@ status_hidup: document.getElementById('anggota_status').value, }; if (!body.nama) { showToast('Nama wajib diisi', 'error'); return; } - const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota`, { - method: 'POST', + const url = editId + ? `{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota/${editId}` + : `{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota`; + const res = await fetch(url, { + method: editId ? 'PUT' : 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken }, body: JSON.stringify(body), }); const json = await res.json(); - if (json.success) { showToast('Anggota ditambahkan', 'success'); loadAnggota(currentAnggotaRumah); } - else showToast('Gagal menambah anggota', 'error'); + if (json.success) { + showToast(editId ? 'Anggota diperbarui' : 'Anggota ditambahkan', 'success'); + resetAnggotaForm(); + loadAnggota(currentAnggotaRumah); + } else { + showToast(editId ? 'Gagal memperbarui anggota' : 'Gagal menambah anggota', 'error'); + } } async function deleteAnggota(id) { @@ -896,6 +901,8 @@ // ── RIWAYAT BANTUAN ──────────────────────────────────────────────────── let currentBantuanRumah = null; const canDeleteBantuan = {{ auth()->user()->hasRole('administrator') ? 'true' : 'false' }}; + const currentUserId = Number({{ auth()->id() ?? 0 }}); + const isPengurusIbadah = {{ auth()->user()->hasRole('pengurus_ibadah') ? 'true' : 'false' }}; async function openBantuanModal(idRumah) { currentBantuanRumah = idRumah; @@ -904,8 +911,11 @@ const sel = document.getElementById('bantuan_ibadah'); if (sel) { + const availableIbadah = isPengurusIbadah + ? ibadahData.filter(ib => Number(ib.user_id) === currentUserId) + : ibadahData; sel.innerHTML = '' + - ibadahData.map(ib => ``).join(''); + availableIbadah.map(ib => ``).join(''); } const tgl = document.getElementById('bantuan_tanggal'); @@ -958,14 +968,31 @@ } // ── NOTIFIKASI PERUBAHAN DATA ──────────────────────────────────────── + function updateTransferBadge(count) { + document.querySelectorAll('a[href$="/permohonan"]').forEach(link => { + let badge = link.querySelector('.transfer-pending-badge'); + if (count > 0) { + if (!badge) { + badge = document.createElement('span'); + badge.className = 'badge badge-error badge-xs transfer-pending-badge'; + link.appendChild(document.createTextNode(' ')); + link.appendChild(badge); + } + badge.textContent = count; + badge.classList.remove('hidden'); + } else if (badge) { + badge.classList.add('hidden'); + } + }); + } + (function initNotifPolling() { const POLL_MS = 30000; - const KEY_IBADAH = 'notif_latest_ibadah'; - const KEY_MISKIN = 'notif_latest_miskin'; + const KEY_SEEN = 'notif_latest_seen'; async function pollNotifications() { try { - const since = localStorage.getItem(KEY_IBADAH) || new Date(0).toISOString(); + const since = localStorage.getItem(KEY_SEEN) || new Date(0).toISOString(); const res = await fetch( `{{ url('/api/notifications') }}?since=${encodeURIComponent(since)}`, { headers: { 'X-CSRF-TOKEN': csrfToken } } @@ -973,22 +1000,30 @@ if (!res.ok) return; const data = await res.json(); - if (data.new_ibadah > 0 || data.new_miskin > 0) { + updateTransferBadge(Number(data.pending_transfer || 0)); + + const hasChanges = data.new_ibadah > 0 || data.new_miskin > 0 || data.new_anggota > 0 || data.new_bantuan > 0 || data.new_transfer > 0; + if (hasChanges) { if (data.new_ibadah > 0) showToast(`${data.new_ibadah} rumah ibadah baru ditambahkan`, 'info'); if (data.new_miskin > 0) showToast(`${data.new_miskin} keluarga miskin baru ditambahkan`, 'info'); + if (data.new_anggota > 0) showToast(`${data.new_anggota} anggota keluarga baru ditambahkan`, 'info'); + if (data.new_bantuan > 0) showToast(`${data.new_bantuan} bantuan baru dicatat`, 'info'); + if (data.new_transfer > 0) showToast(`${data.new_transfer} permohonan transfer baru`, 'info'); const fn = typeof loadAllData !== 'undefined' ? loadAllData : typeof loadData !== 'undefined' ? loadData : null; if (fn) fn(); } - if (data.latest_ibadah) localStorage.setItem(KEY_IBADAH, data.latest_ibadah); - if (data.latest_miskin) localStorage.setItem(KEY_MISKIN, data.latest_miskin); + const latest = [data.latest_ibadah, data.latest_miskin, data.latest_anggota, data.latest_bantuan, data.latest_transfer] + .filter(Boolean) + .sort() + .pop(); + if (latest) localStorage.setItem(KEY_SEEN, latest); } catch (e) { /* silent */ } } document.addEventListener('DOMContentLoaded', () => { - if (!localStorage.getItem(KEY_IBADAH)) localStorage.setItem(KEY_IBADAH, new Date().toISOString()); - if (!localStorage.getItem(KEY_MISKIN)) localStorage.setItem(KEY_MISKIN, new Date().toISOString()); + if (!localStorage.getItem(KEY_SEEN)) localStorage.setItem(KEY_SEEN, new Date().toISOString()); setInterval(pollNotifications, POLL_MS); }); })(); diff --git a/resources/views/map.blade.php b/resources/views/map.blade.php index 9ee6836..acd13cf 100644 --- a/resources/views/map.blade.php +++ b/resources/views/map.blade.php @@ -22,28 +22,25 @@ + - + - - + @include('partials.sidebar') -
+
-
+

Mode Operasi @@ -161,17 +83,17 @@ - -

-