/* berkas.js — Halaman daftar & unggah berkas pelamar */ (function () { 'use strict'; var $ = function (s, r) { return (r || document).querySelector(s); }; var SLOTS = [ { key: 'cv', label: 'CV' }, { key: 'test', label: 'Hasil Test' }, { key: 'portofolio', label: 'Portofolio' } ]; var MAX_FILE = 5 * 1024 * 1024; // 5 MB var q = ''; function esc(v) { return UI.escape(v); } function init() { Store.init(); render(); $('#bSearch').addEventListener('input', function (e) { q = e.target.value.toLowerCase(); render(); }); } function slotCell(c, slot) { var b = c.berkas && c.berkas[slot.key]; var value = 'Belum ada'; if (b) { var label = b.mode === 'file' ? b.name : (b.url.length > 34 ? b.url.slice(0, 34) + '…' : b.url); value = '
' + (b.mode === 'file' ? '📎 ' : '🔗 ') + esc(label) + (b.mode === 'file' ? ' (' + UI.formatBytes(b.size) + ')' : '') + '
'; } return '' + value + '
' + (b ? '' : '') + '' + '' + (b ? '' : '') + '
'; } function render() { var list = Store.get().candidates.filter(function (c) { if (!q) return true; return (c.nama || '').toLowerCase().indexOf(q) >= 0 || (c.posisi || '').toLowerCase().indexOf(q) >= 0; }); if (!list.length) { $('#bBody').innerHTML = ''; $('#bEmpty').classList.remove('hidden'); $('.table-wrap').classList.add('hidden'); return; } $('#bEmpty').classList.add('hidden'); $('.table-wrap').classList.remove('hidden'); $('#bBody').innerHTML = list.map(function (c) { return '' + '' + esc(c.nama) + '
' + esc(c.posisi) + '
' + SLOTS.map(function (s) { return slotCell(c, s); }).join('') + ''; }).join(''); } function setBerkas(id, slot, value) { var c = Store.candidateById(id); if (!c) return; c.berkas = c.berkas || { cv: null, test: null, portofolio: null }; var old = c.berkas[slot]; if (old && old.mode === 'file' && old.fileId && (!value || value.fileId !== old.fileId)) { Store.deleteFile(old.fileId).catch(function () {}); } c.berkas[slot] = value; Store.save(); } function handleFile(input) { var file = input.files && input.files[0]; if (!file) return; var id = input.getAttribute('data-id'); var slot = input.getAttribute('data-berkas-file'); if (file.size > MAX_FILE) { UI.toast('Ukuran berkas maksimal 5 MB.', 'err'); input.value = ''; return; } UI.toast('Menyimpan berkas...'); Store.saveFile(file).then(function (meta) { setBerkas(id, slot, { mode: 'file', fileId: meta.id, name: meta.name, size: meta.size, type: meta.type }); UI.toast('Berkas tersimpan.', 'ok'); render(); }).catch(function (err) { UI.toast('Gagal menyimpan berkas: ' + err.message, 'err'); }); input.value = ''; } document.addEventListener('click', function (e) { var openBtn = e.target.closest('[data-open]'); if (openBtn) { var c = Store.candidateById(openBtn.getAttribute('data-id')); var b = c && c.berkas && c.berkas[openBtn.getAttribute('data-open')]; if (!b) return; if (b.mode === 'link') { window.open(b.url, '_blank', 'noopener'); return; } Store.getFileUrl(b.fileId).then(function (url) { window.open(url, '_blank', 'noopener'); }) .catch(function () { UI.toast('Berkas tidak ditemukan.', 'err'); }); return; } var linkBtn = e.target.closest('[data-berkas-link]'); if (linkBtn) { var id = linkBtn.getAttribute('data-id'); var slot = linkBtn.getAttribute('data-berkas-link'); var url = window.prompt('Masukkan URL berkas (Google Drive, dll):'); if (url && url.trim()) { setBerkas(id, slot, { mode: 'link', url: url.trim() }); UI.toast('Link tersimpan.', 'ok'); render(); } return; } var delBtn = e.target.closest('[data-berkas-del]'); if (delBtn) { if (UI.confirmDialog('Hapus berkas ini?')) { setBerkas(delBtn.getAttribute('data-id'), delBtn.getAttribute('data-berkas-del'), null); UI.toast('Berkas dihapus.', 'ok'); render(); } } }); document.addEventListener('change', function (e) { var input = e.target.closest('[data-berkas-file]'); if (input) handleFile(input); }); document.addEventListener('DOMContentLoaded', init); })();