// Mengurutkan data logbook berdasarkan tanggal awal (kronologis) function selected() { let type = $('rtype').value, y = Number($('ryear').value), m = Number($('rmonth').value), q = Number($('rquarter').value); return entries.filter(x => { if (type === 'all') return true; let d = new Date(x.date + 'T12:00:00'); if (d.getFullYear() !== y) return false; if (type === 'year') return true; if (type === 'month') return d.getMonth() + 1 === m; if (type === 'quarter') return Math.floor(d.getMonth() / 3) + 1 === q; return true; }).sort((a, b) => a.date.localeCompare(b.date)); // Diurutkan dari tanggal terawal ke terbaru } // Pengambilan foto yang benar-benar berurutan berdasarkan tanggal logbook async function getReportPhotos(a, limit = 50) { let out = []; // Urutkan catatan logbook dari tanggal paling awal let sortedEntries = [...a].sort((x, y) => x.date.localeCompare(y.date)); for (const x of sortedEntries) { for (const [key, label] of [['before_path', 'Sebelum Kegiatan'], ['after_path', 'Sesudah Kegiatan']]) { for (const [i, path] of storedPaths(x[key]).entries()) { if (out.length >= limit) return out; try { let { data, error } = await supa.storage.from('logbook-photos').createSignedUrl(path, 900); if (!error && data?.signedUrl) { out.push({ url: data.signedUrl, caption: `${dateFmt(x.date)} - ${x.activity} (${label} ${i + 1})`, date: x.date, activity: x.activity }); } } catch (e) { console.error(e); } } } } return out; } // Template Laporan Resmi (Menggunakan Font Arial, Justify, A4, & Cover Operasional Kantor) function reportDocHtml(a, photos = []) { let p = profile, info = periodInfo(), sum = summaryRows(a), title = info.type === 'year' ? 'TAHUNAN' : info.type === 'quarter' ? 'TRIWULAN' : 'BULANAN'; let range = info.type === 'month' ? info.months[info.month - 1] + ' ' + info.year : info.type === 'quarter' ? info.label : info.type === 'year' ? 'Tahun ' + info.year : info.label; let td = (v) => `
Disusun oleh:
NIP/ID: 199808272025211042
${esc(p.role || '')}
${esc(p.position || 'Operator Layanan Operasional')}
Dalam rangka mendukung kelancaran pelaksanaan tugas dan fungsi organisasi, diperlukan dukungan sumber daya manusia yang mampu melaksanakan kegiatan operasional dan pelayanan perkantoran secara efektif, tertib, dan berkesinambungan. Pelaksanaan tugas pada jabatan ${esc(p.position || 'Operator Layanan Operasional')} memiliki peran penting dalam membantu kegiatan administrasi, pengelolaan sarana dan prasarana, serta dukungan operasional kantor secara menyeluruh.
Oleh karena itu, laporan ini disusun sebagai bentuk uraian pelaksanaan kegiatan dan hasil pekerjaan berdasarkan data logbook harian pada periode ${esc(range)} sebagai bahan pertanggungjawaban, pemantauan, dan evaluasi kinerja pegawai.
Tujuan penyusunan laporan ini adalah sebagai pertanggungjawaban pelaksanaan tugas operasional kantor serta menyajikan rangkuman hasil kegiatan secara terstruktur berdasarkan catatan kinerja harian.
Kegiatan dilaksanakan di unit kerja ${esc(p.office || '-')} pada periode ${esc(range)}.
Berikut adalah rincian pelaksanaan kegiatan operasional kantor periode ${esc(range)}:
Tabel 1. Rincian Kegiatan Logbook Kinerja
| No. | Tanggal / Periode | Rincian Pekerjaan | Keterangan / Lokasi |
|---|---|---|---|
| Belum ada data pada periode ini. | |||
Tabel 2. Dokumentasi Foto Kegiatan (Urut dari Tanggal Awal)
| Foto Dokumentasi | Keterangan Kegiatan |
|---|---|
| Tidak ada foto dokumentasi pada periode ini. | |
${conclusion}
Pencatatan logbook kinerja harian dan pendokumentasian foto kegiatan hendaknya terus dilakukan secara konsisten dan teratur agar penyusunan laporan bulanan maupun tahunan berjalan lancar dan akurat.
Bandung Barat, ${dateFmt(iso(new Date()))}
${esc(p.position || 'Operator Layanan Operasional')}
${esc(p.name || 'Riki Subagja')}
NIP: 199808272025211042
Memuat pratinjau laporan dan foto dokumentasi...
'; modal.style.display = 'block'; try { let photos = await getReportPhotos(a, 50); // Mendapatkan foto terurut dari tanggal awal modalBody.innerHTML = reportDocHtml(a, photos); } catch (e) { modalBody.innerHTML = 'Gagal memuat pratinjau: ' + e.message + '
'; } } // Hubungkan Tombol Preview dan Tutup Modal $('previewReportBtn').onclick = showReportPreview; $('closeModalBtn').onclick = () => {$('previewModal').style.display = 'none'; }; window.onclick = (e) => { if (e.target === $('previewModal'))$('previewModal').style.display = 'none'; };