E-PERPUS disini
<!DOCTYPE html>
<html lang="id" class="h-full">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Perpustakaan Digital SMK Kebon Jeruk</title>
<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
colors: {
brand: {
50: '#eff6ff',
100: '#dbeafe',
500: '#3b82f6',
600: '#2563eb',
700: '#1d4ed8',
800: '#1e40af',
900: '#1e3a8a',
}
}
}
}
}
</script>
<!-- Google Fonts Inter -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- FontAwesome Icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
body { font-family: 'Inter', sans-serif; }
.tab-content { display: none; }
.tab-content.active { display: block; }
/* Custom scrollbar */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: #f1f1f1; }
::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
@media print {
body * {
visibility: hidden;
}
#printArea, #printArea * {
visibility: visible;
}
#printArea {
position: absolute;
left: 0;
top: 0;
width: 100%;
background: white !important;
}
.no-print {
display: none !important;
}
}
</style>
</head>
<body class="bg-slate-50 text-slate-800 h-full flex flex-col md:flex-row overflow-hidden selection:bg-brand-500 selection:text-white">
<!-- Sidebar Navigation for Desktop & Mobile Toggle -->
<aside id="sidebar" class="bg-slate-900 text-slate-300 w-full md:w-64 flex-shrink-0 flex flex-col transition-all duration-300 z-30 fixed md:static inset-y-0 left-0 transform -translate-x-full md:translate-x-0 shadow-xl no-print">
<!-- Logo Header -->
<div class="p-5 flex items-center justify-between border-b border-slate-800">
<div class="flex items-center space-x-3">
<div class="bg-brand-600 text-white p-2.5 rounded-xl shadow-lg flex items-center justify-center">
<i class="fa-solid fa-graduation-cap text-xl"></i>
</div>
<div>
<h1 class="font-bold text-white text-base tracking-wide">SMK KEBON JERUK</h1>
<p class="text-xs text-brand-400 font-medium">Perpustakaan Digital</p>
</div>
</div>
<button id="closeSidebar" class="md:hidden text-slate-400 hover:text-white p-1">
<i class="fa-solid fa-xmark text-lg"></i>
</button>
</div>
<!-- Navigation Menu -->
<nav class="flex-1 px-3 py-4 space-y-1.5 overflow-y-auto text-sm font-medium">
<a href="#dashboard" onclick="switchTab('dashboard')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white active-tab">
<i class="fa-solid fa-house-chimney w-5 text-center"></i>
<span>Dashboard</span>
</a>
<a href="#koleksi" onclick="switchTab('koleksi')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-book-bookmark w-5 text-center"></i>
<span>Data Koleksi</span>
</a>
<a href="#pencarian" onclick="switchTab('pencarian')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-magnifying-glass w-5 text-center"></i>
<span>Pencarian Buku</span>
</a>
<a href="#anggota" onclick="switchTab('anggota')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-users w-5 text-center"></i>
<span>Data Anggota</span>
</a>
<a href="#peminjaman" onclick="switchTab('peminjaman')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-right-left w-5 text-center"></i>
<span>Peminjaman & Kembali</span>
</a>
<a href="#digital" onclick="switchTab('digital')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-laptop-code w-5 text-center"></i>
<span>Perpus Digital & Modul</span>
</a>
<a href="#laporan" onclick="switchTab('laporan')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-chart-pie w-5 text-center"></i>
<span>Laporan & Rekap</span>
</a>
<a href="#profil" onclick="switchTab('profil')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-school w-5 text-center"></i>
<span>Profil Perpustakaan</span>
</a>
<a href="#pengaturan" onclick="switchTab('pengaturan')" class="nav-link flex items-center space-x-3 px-3.5 py-3 rounded-xl transition-all duration-200 text-slate-300 hover:bg-slate-800 hover:text-white">
<i class="fa-solid fa-gear w-5 text-center"></i>
<span>Pengaturan Sistem</span>
</a>
</nav>
<!-- User profile / Footer widget -->
<div class="p-4 border-t border-slate-800 bg-slate-950/50">
<div class="flex items-center space-x-3">
<div class="bg-slate-800 text-brand-400 p-2 rounded-full font-bold text-sm w-9 h-9 flex items-center justify-center">
AD
</div>
<div class="overflow-hidden">
<p class="text-xs font-semibold text-white truncate">Administrator</p>
<p class="text-[11px] text-slate-400 truncate">pustaka@smkkebonjeruk.sch.id</p>
</div>
</div>
</div>
</aside>
<!-- Main Content Area -->
<div class="flex-1 flex flex-col h-full overflow-hidden">
<!-- Top Navbar -->
<header class="bg-white border-b border-slate-200 h-16 flex items-center justify-between px-4 sm:px-6 z-20 shadow-sm flex-shrink-0 no-print">
<div class="flex items-center space-x-3">
<button id="openSidebar" class="md:hidden text-slate-600 hover:text-brand-600 focus:outline-none p-1.5 rounded-lg hover:bg-slate-100">
<i class="fa-solid fa-bars text-lg"></i>
</button>
<h2 id="pageTitle" class="text-lg font-bold text-slate-800 tracking-tight">Dashboard Perpustakaan</h2>
</div>
<div class="flex items-center space-x-3">
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-50 text-emerald-700 border border-emerald-200">
<span class="w-1.5 h-1.5 mr-1.5 bg-emerald-500 rounded-full animate-pulse"></span>
Local Storage Aktif
</span>
<button onclick="resetAllData()" title="Reset Data ke Awal" class="text-slate-400 hover:text-rose-600 p-2 rounded-lg hover:bg-slate-100 transition-colors">
<i class="fa-solid fa-rotate-right text-sm"></i>
</button>
</div>
</header>
<!-- Scrollable Content Viewports -->
<main class="flex-1 overflow-y-auto p-4 sm:p-6 lg:p-8 bg-slate-50">
<!-- 1. DASHBOARD TAB -->
<div id="tab-dashboard" class="tab-content active space-y-6">
<!-- Welcome Banner -->
<div class="bg-gradient-to-r from-brand-600 to-blue-700 rounded-2xl p-6 sm:p-8 text-white shadow-xl relative overflow-hidden">
<div class="absolute right-0 bottom-0 opacity-10 transform translate-x-10 translate-y-10 pointer-events-none">
<i class="fa-solid fa-book-open-reader text-9xl"></i>
</div>
<div class="relative z-10 max-w-2xl">
<span class="bg-brand-500/40 text-brand-100 text-xs font-semibold px-3 py-1 rounded-full uppercase tracking-wider">E-Library SMK Kebon Jeruk</span>
<h3 class="text-2xl sm:text-3xl font-bold mt-2">Selamat Datang di Portal Pustaka Cerdas</h3>
<p class="text-blue-100 text-sm sm:text-base mt-2 leading-relaxed">Kelola data peminjaman, referensi buku kejuruan lengkap, modul digital, serta rekapitulasi literasi warga sekolah dengan mudah dan terintegrasi.</p>
<div class="mt-5 flex flex-wrap gap-3">
<button onclick="switchTab('pencarian')" class="bg-white text-brand-700 hover:bg-blue-50 font-semibold text-sm px-5 py-2.5 rounded-xl shadow transition-all duration-200 flex items-center space-x-2">
<i class="fa-solid fa-magnifying-glass"></i>
<span>Cari Buku Cepat</span>
</button>
<button onclick="switchTab('peminjaman')" class="bg-brand-700 hover:bg-brand-800 text-white font-semibold text-sm px-5 py-2.5 rounded-xl shadow border border-brand-500 transition-all duration-200 flex items-center space-x-2">
<i class="fa-solid fa-right-left"></i>
<span>Kelola Peminjaman</span>
</button>
</div>
</div>
</div>
<!-- Stats Grid -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6">
<!-- Total Buku -->
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex items-center space-x-4">
<div class="bg-blue-50 text-blue-600 w-14 h-14 rounded-2xl flex items-center justify-center flex-shrink-0 text-2xl shadow-inner">
<i class="fa-solid fa-book"></i>
</div>
<div>
<p class="text-sm font-medium text-slate-500">Jumlah Buku & E-Book</p>
<h4 id="statTotalBuku" class="text-2xl font-bold text-slate-900 mt-1">0</h4>
<p class="text-xs text-emerald-600 font-medium mt-1"><i class="fa-solid fa-arrow-up mr-1"></i>Referensi Lengkap</p>
</div>
</div>
<!-- Total Anggota -->
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex items-center space-x-4">
<div class="bg-emerald-50 text-emerald-600 w-14 h-14 rounded-2xl flex items-center justify-center flex-shrink-0 text-2xl shadow-inner">
<i class="fa-solid fa-users"></i>
</div>
<div>
<p class="text-sm font-medium text-slate-500">Total Anggota</p>
<h4 id="statTotalAnggota" class="text-2xl font-bold text-slate-900 mt-1">0</h4>
<p class="text-xs text-emerald-600 font-medium mt-1"><i class="fa-solid fa-check mr-1"></i>Siswa & Guru</p>
</div>
</div>
<!-- Sedang Dipinjam -->
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex items-center space-x-4">
<div class="bg-amber-50 text-amber-600 w-14 h-14 rounded-2xl flex items-center justify-center flex-shrink-0 text-2xl shadow-inner">
<i class="fa-solid fa-clock-rotate-left"></i>
</div>
<div>
<p class="text-sm font-medium text-slate-500">Sedang Dipinjam</p>
<h4 id="statDipinjam" class="text-2xl font-bold text-slate-900 mt-1">0</h4>
<p class="text-xs text-amber-600 font-medium mt-1"><i class="fa-solid fa-info-circle mr-1"></i>Aktif s.d hari ini</p>
</div>
</div>
<!-- Modul & Digital -->
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex items-center space-x-4">
<div class="bg-purple-50 text-purple-600 w-14 h-14 rounded-2xl flex items-center justify-center flex-shrink-0 text-2xl shadow-inner">
<i class="fa-solid fa-laptop-file"></i>
</div>
<div>
<p class="text-sm font-medium text-slate-500">Modul & LKPD Digital</p>
<h4 id="statDigital" class="text-2xl font-bold text-slate-900 mt-1">0</h4>
<p class="text-xs text-purple-600 font-medium mt-1"><i class="fa-solid fa-download mr-1"></i>Siap Unduh</p>
</div>
</div>
</div>
<!-- Recent Activities & Quick Info Grid -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Aktivitas Peminjaman Terbaru -->
<div class="lg:col-span-2 bg-white rounded-2xl shadow-sm border border-slate-200 p-6">
<div class="flex items-center justify-between mb-4">
<h4 class="font-bold text-slate-800 text-base">Aktivitas Peminjaman Terbaru</h4>
<button onclick="switchTab('peminjaman')" class="text-xs text-brand-600 hover:text-brand-700 font-semibold">Lihat Semua</button>
</div>
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="border-b border-slate-100 text-xs font-semibold text-slate-500 uppercase">
<th class="py-3 px-3">Peminjam</th>
<th class="py-3 px-3">Buku</th>
<th class="py-3 px-3">Tgl Pinjam</th>
<th class="py-3 px-3">Status</th>
</tr>
</thead>
<tbody id="dashboardRecentActivity" class="text-sm divide-y divide-slate-100">
<!-- Populated via JS -->
</tbody>
</table>
</div>
</div>
<!-- Pengumuman & Jam Layanan -->
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 p-6 flex flex-col justify-between">
<div>
<h4 class="font-bold text-slate-800 text-base mb-4 flex items-center">
<i class="fa-solid fa-bullhorn text-brand-600 mr-2"></i> Pengumuman Pustaka
</h4>
<div class="space-y-3">
<div class="bg-blue-50 border border-blue-100 p-3.5 rounded-xl">
<p class="text-xs font-bold text-blue-900">Referensi Buku Kejuruan</p>
<p class="text-xs text-blue-700 mt-1">Koleksi referensi buku cetak Kurikulum Merdeka untuk PPLG, TJKT, DKV, Akuntansi & Perhotelan kini telah diperbarui.</p>
</div>
<div class="bg-emerald-50 border border-emerald-100 p-3.5 rounded-xl">
<p class="text-xs font-bold text-emerald-900">Modul Ajar Terbaru</p>
<p class="text-xs text-emerald-700 mt-1">Silakan unduh modul praktik kejuruan terbaru di menu Perpus Digital untuk menunjang kegiatan KBM.</p>
</div>
</div>
</div>
<div class="mt-6 pt-4 border-t border-slate-100 text-xs text-slate-500">
<p class="font-semibold text-slate-700 mb-1">Jam Operasional Perpustakaan:</p>
<p>Senin - Kamis: 07.00 - 16.00 WIB</p>
<p>Jumat: 07.00 - 15.00 WIB</p>
</div>
</div>
</div>
</div>
<!-- 2. DATA KOLEKSI TAB -->
<div id="tab-koleksi" class="tab-content space-y-6">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 bg-white p-6 rounded-2xl shadow-sm border border-slate-200">
<div>
<h3 class="text-lg font-bold text-slate-900">Manajemen Data Koleksi Buku</h3>
<p class="text-xs text-slate-500 mt-0.5">Kelola referensi buku cetak dan e-book perpustakaan SMK Kebon Jeruk.</p>
</div>
<div class="flex items-center space-x-3">
<button onclick="openBukuModal()" class="bg-brand-600 hover:bg-brand-700 text-white font-semibold text-sm px-4 py-2.5 rounded-xl shadow transition-all duration-200 flex items-center space-x-2">
<i class="fa-solid fa-plus"></i>
<span>Tambah Koleksi</span>
</button>
</div>
</div>
<!-- Filter & Table -->
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 overflow-hidden">
<div class="p-4 sm:p-6 border-b border-slate-100 flex flex-col sm:flex-row gap-4 items-center justify-between">
<div class="w-full sm:w-72 relative">
<span class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-slate-400">
<i class="fa-solid fa-magnifying-glass text-sm"></i>
</span>
<input type="text" id="searchKoleksiInput" onkeyup="filterKoleksi()" placeholder="Cari judul, penulis, ISBN..." class="w-full pl-9 pr-4 py-2 bg-slate-50 border border-slate-200 rounded-xl text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20 focus:border-brand-500">
</div>
<div class="flex items-center space-x-3 w-full sm:w-auto">
<select id="filterKategoriKoleksi" onchange="filterKoleksi()" class="bg-slate-50 border border-slate-200 rounded-xl px-3 py-2 text-sm text-slate-700 focus:outline-none focus:ring-2 focus:ring-brand-500/20">
<option value="">Semua Jenis Koleksi</option>
<option value="Buku Cetak">Buku Cetak</option>
<option value="E-Book">E-Book</option>
<option value="Modul Ajar">Modul Ajar</option>
</select>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="bg-slate-50 border-b border-slate-200 text-xs font-semibold text-slate-500 uppercase tracking-wider">
<th class="py-3.5 px-4">Judul & ISBN</th>
<th class="py-3.5 px-4">Penulis / Penerbit</th>
<th class="py-3.5 px-4">Kategori / Jurusan</th>
<th class="py-3.5 px-4">Jenis</th>
<th class="py-3.5 px-4 text-center">Stok / File</th>
<th class="py-3.5 px-4 text-center">Aksi</th>
</tr>
</thead>
<tbody id="tabelKoleksiBody" class="text-sm divide-y divide-slate-100">
<!-- Populated by JS -->
</tbody>
</table>
</div>
</div>
</div>
<!-- 3. PENCARIAN BUKU TAB -->
<div id="tab-pencarian" class="tab-content space-y-6">
<div class="bg-gradient-to-r from-slate-900 to-slate-800 rounded-2xl p-6 sm:p-10 text-white shadow-xl text-center space-y-4">
<h3 class="text-2xl sm:text-3xl font-bold">Pencarian Koleksi Perpustakaan</h3>
<p class="text-slate-300 text-sm max-w-xl mx-auto">Temukan buku pelajaran, referensi kejuruan, maupun e-book dengan cepat menggunakan kata kunci judul atau nama penulis.</p>
<div class="max-w-2xl mx-auto relative flex items-center">
<span class="absolute left-4 text-slate-400 text-lg">
<i class="fa-solid fa-magnifying-glass"></i>
</span>
<input type="text" id="liveSearchInput" oninput="executeLiveSearch()" placeholder="Ketik judul buku, pengarang, atau kejuruan (misal: TJKT, PPLG, Akuntansi)..." class="w-full pl-12 pr-4 py-4 bg-white text-slate-900 placeholder-slate-400 rounded-2xl text-sm sm:text-base font-medium shadow-2xl focus:outline-none focus:ring-4 focus:ring-brand-500/30">
</div>
</div>
<!-- Hasil Pencarian Grid -->
<div>
<div class="flex items-center justify-between mb-4">
<h4 class="font-bold text-slate-800 text-base" id="searchResultTitle">Hasil Koleksi Tersedia</h4>
<span id="searchResultCount" class="text-xs bg-slate-200 text-slate-700 px-2.5 py-1 rounded-full font-semibold">0 Buku</span>
</div>
<div id="liveSearchResultGrid" class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6">
<!-- Populated by JS -->
</div>
</div>
</div>
<!-- 4. DATA ANGGOTA TAB -->
<div id="tab-anggota" class="tab-content space-y-6">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 bg-white p-6 rounded-2xl shadow-sm border border-slate-200">
<div>
<h3 class="text-lg font-bold text-slate-900">Data Anggota Perpustakaan</h3>
<p class="text-xs text-slate-500 mt-0.5">Kelola siswa, guru, dan tenaga kependidikan SMK Kebon Jeruk.</p>
</div>
<div class="flex items-center space-x-3">
<button onclick="openAnggotaModal()" class="bg-brand-600 hover:bg-brand-700 text-white font-semibold text-sm px-4 py-2.5 rounded-xl shadow transition-all duration-200 flex items-center space-x-2">
<i class="fa-solid fa-user-plus"></i>
<span>Tambah Anggota</span>
</button>
</div>
</div>
<!-- Anggota Table -->
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 overflow-hidden">
<div class="p-4 sm:p-6 border-b border-slate-100 flex flex-col sm:flex-row gap-4 items-center justify-between">
<div class="w-full sm:w-72 relative">
<span class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-slate-400">
<i class="fa-solid fa-magnifying-glass text-sm"></i>
</span>
<input type="text" id="searchAnggotaInput" onkeyup="filterAnggota()" placeholder="Cari nama, NIS/NIP..." class="w-full pl-9 pr-4 py-2 bg-slate-50 border border-slate-200 rounded-xl text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div class="flex items-center space-x-3 w-full sm:w-auto">
<select id="filterRoleAnggota" onchange="filterAnggota()" class="bg-slate-50 border border-slate-200 rounded-xl px-3 py-2 text-sm text-slate-700 focus:outline-none focus:ring-2 focus:ring-brand-500/20">
<option value="">Semua Peran</option>
<option value="Siswa">Siswa</option>
<option value="Guru">Guru</option>
<option value="Tenaga Kependidikan">Tenaga Kependidikan</option>
</select>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="bg-slate-50 border-b border-slate-200 text-xs font-semibold text-slate-500 uppercase tracking-wider">
<th class="py-3.5 px-4">Nama Lengkap</th>
<th class="py-3.5 px-4">ID / NIS / NIP</th>
<th class="py-3.5 px-4">Peran</th>
<th class="py-3.5 px-4">Kelas / Jabatan</th>
<th class="py-3.5 px-4">No. Telepon / WA</th>
<th class="py-3.5 px-4 text-center">Aksi</th>
</tr>
</thead>
<tbody id="tabelAnggotaBody" class="text-sm divide-y divide-slate-100">
<!-- Populated by JS -->
</tbody>
</table>
</div>
</div>
</div>
<!-- 5. PEMINJAMAN & PENGEMBALIAN TAB -->
<div id="tab-peminjaman" class="tab-content space-y-6">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 bg-white p-6 rounded-2xl shadow-sm border border-slate-200">
<div>
<h3 class="text-lg font-bold text-slate-900">Transaksi Peminjaman & Pengembalian</h3>
<p class="text-xs text-slate-500 mt-0.5">Catat peminjaman buku fisik dan pantau status pengembalian.</p>
</div>
<div class="flex items-center space-x-3">
<button onclick="openPinjamModal()" class="bg-brand-600 hover:bg-brand-700 text-white font-semibold text-sm px-4 py-2.5 rounded-xl shadow transition-all duration-200 flex items-center space-x-2">
<i class="fa-solid fa-circle-plus"></i>
<span>Catat Peminjaman Baru</span>
</button>
</div>
</div>
<!-- Peminjaman Table -->
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 overflow-hidden">
<div class="p-4 sm:p-6 border-b border-slate-100 flex items-center justify-between">
<h4 class="font-bold text-slate-800 text-sm">Daftar Sirkulasi Buku</h4>
<div class="flex items-center space-x-2">
<select id="filterStatusPinjam" onchange="renderPeminjaman()" class="bg-slate-50 border border-slate-200 rounded-xl px-3 py-1.5 text-xs text-slate-700">
<option value="">Semua Status</option>
<option value="Dipinjam">Dipinjam</option>
<option value="Dikembalikan">Dikembalikan</option>
</select>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="bg-slate-50 border-b border-slate-200 text-xs font-semibold text-slate-500 uppercase tracking-wider">
<th class="py-3.5 px-4">Peminjam</th>
<th class="py-3.5 px-4">Judul Buku</th>
<th class="py-3.5 px-4">Tgl Pinjam</th>
<th class="py-3.5 px-4">Batas Kembali</th>
<th class="py-3.5 px-4">Status</th>
<th class="py-3.5 px-4 text-center">Aksi</th>
</tr>
</thead>
<tbody id="tabelPeminjamanBody" class="text-sm divide-y divide-slate-100">
<!-- Populated by JS -->
</tbody>
</table>
</div>
</div>
</div>
<!-- 6. PERPUSTAKAAN DIGITAL TAB -->
<div id="tab-digital" class="tab-content space-y-6">
<div class="bg-gradient-to-r from-purple-700 to-indigo-800 rounded-2xl p-6 sm:p-8 text-white shadow-xl flex flex-col md:flex-row items-center justify-between gap-6">
<div>
<span class="bg-purple-500/40 text-purple-100 text-xs font-semibold px-3 py-1 rounded-full uppercase tracking-wider">Digital Learning Repository</span>
<h3 class="text-2xl font-bold mt-2">Modul Ajar, LKPD & E-Book Legal SMK</h3>
<p class="text-purple-100 text-sm mt-1 max-w-xl">Unduh modul kejuruan Kurikulum Merdeka, Lembar Kerja Peserta Didik, serta e-book pembelajaran resmi secara gratis.</p>
</div>
<button onclick="openDigitalModal()" class="bg-white text-purple-800 hover:bg-purple-50 font-semibold text-sm px-5 py-3 rounded-xl shadow transition-all whitespace-nowrap flex items-center space-x-2">
<i class="fa-solid fa-cloud-arrow-up"></i>
<span>Upload File Digital</span>
</button>
</div>
<!-- Filter & Digital Repository Grid -->
<div>
<div class="flex flex-col sm:flex-row items-center justify-between gap-4 mb-4">
<h4 class="font-bold text-slate-800 text-base">Koleksi Digital Tersedia</h4>
<div class="flex items-center space-x-2 w-full sm:w-auto">
<select id="filterKategoriDigital" onchange="renderDigitalRepo()" class="bg-white border border-slate-200 rounded-xl px-3 py-2 text-sm text-slate-700 focus:outline-none">
<option value="">Semua Kategori</option>
<option value="Modul Ajar">Modul Ajar</option>
<option value="LKPD">LKPD</option>
<option value="E-Book Legal">E-Book Legal</option>
<option value="Materi Pembelajaran">Materi Pembelajaran</option>
</select>
</div>
</div>
<div id="digitalRepoGrid" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6">
<!-- Populated by JS -->
</div>
</div>
</div>
<!-- 7. LAPORAN & REKAP TAB -->
<div id="tab-laporan" class="tab-content space-y-6">
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 no-print">
<div>
<h3 class="text-lg font-bold text-slate-900">Laporan & Rekapitulasi Perpustakaan</h3>
<p class="text-xs text-slate-500 mt-0.5">Statistik rekapitulasi koleksi, peminjaman, dan aktivitas literasi warga sekolah.</p>
</div>
<button onclick="window.print()" class="bg-slate-900 hover:bg-slate-800 text-white font-semibold text-sm px-4 py-2.5 rounded-xl shadow transition-all duration-200 flex items-center space-x-2">
<i class="fa-solid fa-print"></i>
<span>Cetak Laporan</span>
</button>
</div>
<!-- Printable Report Area -->
<div id="printArea" class="space-y-6">
<div class="hidden print:block text-center pb-4 border-b-2 border-slate-800 mb-6">
<h1 class="text-xl font-bold uppercase">PEMERINTAH PROVINSI DKI JAKARTA</h1>
<h2 class="text-lg font-bold uppercase">SMK KEBON JERUK JAKARTA</h2>
<h3 class="text-md font-semibold">LAPORAN REKAPITULASI PERPUSTAKAAN DIGITAL</h3>
<p class="text-xs text-slate-600 mt-1">Jl. Salak Barat No. 34, Kebon Jeruk, Jakarta Barat</p>
</div>
<!-- Report Summary Cards -->
<div class="grid grid-cols-1 sm:grid-cols-3 gap-6">
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 space-y-2">
<p class="text-xs font-bold text-slate-400 uppercase tracking-wider">Total Buku Fisik</p>
<h4 id="rekapBukuFisik" class="text-3xl font-black text-slate-900">0</h4>
<p class="text-xs text-slate-500">Tersedia di rak perpustakaan sekolah</p>
</div>
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 space-y-2">
<p class="text-xs font-bold text-slate-400 uppercase tracking-wider">Total Peminjaman Keseluruhan</p>
<h4 id="rekapTotalPinjam" class="text-3xl font-black text-brand-600">0</h4>
<p class="text-xs text-slate-500">Akumulasi transaksi tercatat</p>
</div>
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 space-y-2">
<p class="text-xs font-bold text-slate-400 uppercase tracking-wider">Total File Digital / E-Book</p>
<h4 id="rekapTotalDigital" class="text-3xl font-black text-purple-600">0</h4>
<p class="text-xs text-slate-500">Modul, LKPD, dan materi siap unduh</p>
</div>
</div>
<!-- Log Peminjaman Rekap -->
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 p-6">
<h4 class="font-bold text-slate-800 text-base mb-4">Rekapitulasi Riwayat Sirkulasi</h4>
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="border-b border-slate-100 text-xs font-semibold text-slate-500 uppercase">
<th class="py-3 px-3">ID Transaksi</th>
<th class="py-3 px-3">Nama Peminjam</th>
<th class="py-3 px-3">Buku Dipinjam</th>
<th class="py-3 px-3">Tanggal Pinjam</th>
<th class="py-3 px-3">Status Terakhir</th>
</tr>
</thead>
<tbody id="tabelRekapBody" class="text-sm divide-y divide-slate-100">
<!-- Populated by JS -->
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 8. PROFIL PERPUSTAKAAN TAB -->
<div id="tab-profil" class="tab-content space-y-6">
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 overflow-hidden">
<div class="bg-gradient-to-r from-slate-900 to-brand-900 p-8 text-white">
<div class="flex items-center space-x-4">
<div class="bg-white/10 p-4 rounded-2xl border border-white/20">
<i class="fa-solid fa-school text-4xl text-brand-400"></i>
</div>
<div>
<span class="bg-brand-500 text-white text-xs font-bold px-2.5 py-1 rounded-md uppercase">Profil Resmi</span>
<h3 class="text-2xl font-bold mt-2">Perpustakaan SMK Kebon Jeruk</h3>
<p class="text-slate-300 text-xs sm:text-sm mt-1">Pusat Literasi dan Sumber Belajar Unggul Berbasis Digital</p>
</div>
</div>
</div>
<div class="p-6 sm:p-8 space-y-6 text-sm text-slate-700">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="space-y-4">
<h4 class="font-bold text-slate-900 text-base border-b pb-2"><i class="fa-solid fa-circle-info text-brand-600 mr-2"></i> Informasi Sekolah</h4>
<p><strong>NPSN:</strong> 20101234 (Contoh)</p>
<p><strong>Alamat:</strong> Jl. Salak Barat No. 34, Kebon Jeruk, Jakarta Barat, DKI Jakarta</p>
<p><strong>Email:</strong> perpustakaan@smkkebonjeruk.sch.id</p>
<p><strong>Akreditasi:</strong> A (Unggul)</p>
</div>
<div class="space-y-4">
<h4 class="font-bold text-slate-900 text-base border-b pb-2"><i class="fa-solid fa-bullseye text-brand-600 mr-2"></i> Visi & Misi Pustaka</h4>
<p class="italic text-slate-600">"Menjadi pusat layanan informasi dan literasi digital yang unggul dalam mendukung kompetensi keahlian siswa SMK Kebon Jeruk yang siap kerja, mandiri, dan berkarakter."</p>
<ul class="list-disc list-inside space-y-1 text-xs text-slate-600">
<li>Menyediakan koleksi buku cetak & digital yang relevan dengan kurikulum.</li>
<li>Memberikan pelayanan prima berbasis teknologi informasi.</li>
<li>Meningkatkan minat baca warga sekolah melalui program literasi kreatif.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- 9. PENGATURAN TAB -->
<div id="tab-pengaturan" class="tab-content space-y-6">
<div class="bg-white p-6 sm:p-8 rounded-2xl shadow-sm border border-slate-200 max-w-2xl space-y-6">
<div>
<h3 class="text-lg font-bold text-slate-900">Pengaturan & Penyimpanan Lokal</h3>
<p class="text-xs text-slate-500 mt-0.5">Kelola penyimpanan data lokal (LocalStorage) browser Anda.</p>
</div>
<div class="space-y-4 pt-4 border-t border-slate-100">
<div class="flex items-center justify-between p-4 bg-slate-50 rounded-xl border border-slate-200">
<div>
<p class="font-semibold text-sm text-slate-800">Status Database Lokal</p>
<p class="text-xs text-slate-500 mt-0.5">Semua perubahan data disimpan otomatis di memori browser.</p>
</div>
<span class="bg-emerald-100 text-emerald-800 text-xs font-bold px-3 py-1 rounded-full">Aktif</span>
</div>
<div class="flex items-center justify-between p-4 bg-rose-50 rounded-xl border border-rose-100">
<div>
<p class="font-semibold text-sm text-rose-900">Reset Seluruh Data</p>
<p class="text-xs text-rose-600 mt-0.5">Kembalikan data koleksi, anggota, dan peminjaman ke data referensi awal.</p>
</div>
<button onclick="resetAllData()" class="bg-rose-600 hover:bg-rose-700 text-white font-semibold text-xs px-4 py-2 rounded-lg transition-colors">
Reset Data
</button>
</div>
</div>
</div>
</div>
</main>
</div>
<!-- MODALS SECTION -->
<!-- Modal Tambah/Edit Buku -->
<div id="bukuModal" class="fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-50 hidden flex items-center justify-center p-4 overflow-y-auto">
<div class="bg-white rounded-2xl shadow-2xl max-w-lg w-full overflow-hidden animate-in fade-in zoom-in duration-200">
<div class="p-6 border-b border-slate-100 flex items-center justify-between bg-slate-50">
<h4 id="bukuModalTitle" class="font-bold text-slate-900 text-base">Tambah Koleksi Baru</h4>
<button onclick="closeBukuModal()" class="text-slate-400 hover:text-slate-600"><i class="fa-solid fa-xmark text-lg"></i></button>
</div>
<form id="bukuForm" onsubmit="saveBuku(event)" class="p-6 space-y-4">
<input type="hidden" id="bukuId">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Judul Buku / E-Book *</label>
<input type="text" id="bukuJudul" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Penulis *</label>
<input type="text" id="bukuPenulis" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Penerbit</label>
<input type="text" id="bukuPenerbit" class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Jenis Koleksi *</label>
<select id="bukuJenis" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
<option value="Buku Cetak">Buku Cetak</option>
<option value="E-Book">E-Book</option>
<option value="Modul Ajar">Modul Ajar</option>
</select>
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Kategori / Jurusan *</label>
<input type="text" id="bukuKategori" placeholder="misal: PPLG / TJKT / Umum" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Tahun Terbit</label>
<input type="number" id="bukuTahun" class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Stok / Jumlah Eksemplar *</label>
<input type="number" id="bukuStok" min="1" value="5" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
</div>
<div class="flex justify-end space-x-3 pt-4 border-t border-slate-100">
<button type="button" onclick="closeBukuModal()" class="px-4 py-2 text-sm font-semibold text-slate-600 hover:bg-slate-100 rounded-xl">Batal</button>
<button type="submit" class="px-5 py-2 text-sm font-semibold bg-brand-600 hover:bg-brand-700 text-white rounded-xl shadow">Simpan Koleksi</button>
</div>
</form>
</div>
</div>
<!-- Modal Tambah/Edit Anggota -->
<div id="anggotaModal" class="fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-50 hidden flex items-center justify-center p-4 overflow-y-auto">
<div class="bg-white rounded-2xl shadow-2xl max-w-lg w-full overflow-hidden">
<div class="p-6 border-b border-slate-100 flex items-center justify-between bg-slate-50">
<h4 id="anggotaModalTitle" class="font-bold text-slate-900 text-base">Tambah Anggota Baru</h4>
<button onclick="closeAnggotaModal()" class="text-slate-400 hover:text-slate-600"><i class="fa-solid fa-xmark text-lg"></i></button>
</div>
<form id="anggotaForm" onsubmit="saveAnggota(event)" class="p-6 space-y-4">
<input type="hidden" id="anggotaId">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Nama Lengkap *</label>
<input type="text" id="anggotaNama" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Nomor Induk (NIS / NIP) *</label>
<input type="text" id="anggotaNomorId" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Peran *</label>
<select id="anggotaPeran" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
<option value="Siswa">Siswa</option>
<option value="Guru">Guru</option>
<option value="Tenaga Kependidikan">Tenaga Kependidikan</option>
</select>
</div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Kelas / Jabatan *</label>
<input type="text" id="anggotaKelas" placeholder="misal: XI PPLG 1" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">No. Telepon / WhatsApp *</label>
<input type="text" id="anggotaTelepon" placeholder="misal: 081234567890" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
</div>
</div>
<div class="flex justify-end space-x-3 pt-4 border-t border-slate-100">
<button type="button" onclick="closeAnggotaModal()" class="px-4 py-2 text-sm font-semibold text-slate-600 hover:bg-slate-100 rounded-xl">Batal</button>
<button type="submit" class="px-5 py-2 text-sm font-semibold bg-brand-600 hover:bg-brand-700 text-white rounded-xl shadow">Simpan Anggota</button>
</div>
</form>
</div>
</div>
<!-- Modal Peminjaman Baru -->
<div id="pinjamModal" class="fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-50 hidden flex items-center justify-center p-4 overflow-y-auto">
<div class="bg-white rounded-2xl shadow-2xl max-w-lg w-full overflow-hidden">
<div class="p-6 border-b border-slate-100 flex items-center justify-between bg-slate-50">
<h4 class="font-bold text-slate-900 text-base">Catat Transaksi Peminjaman Buku</h4>
<button onclick="closePinjamModal()" class="text-slate-400 hover:text-slate-600"><i class="fa-solid fa-xmark text-lg"></i></button>
</div>
<form id="pinjamForm" onsubmit="savePinjaman(event)" class="p-6 space-y-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Pilih Anggota *</label>
<select id="pinjamAnggotaId" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
<!-- Populated by JS -->
</select>
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Pilih Buku (Buku Cetak) *</label>
<select id="pinjamBukuId" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/20">
<!-- Populated by JS -->
</select>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Tanggal Pinjam *</label>
<input type="date" id="pinjamTanggal" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none">
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Batas Pengembalian *</label>
<input type="date" id="pinjamBatas" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none">
</div>
</div>
<div class="flex justify-end space-x-3 pt-4 border-t border-slate-100">
<button type="button" onclick="closePinjamModal()" class="px-4 py-2 text-sm font-semibold text-slate-600 hover:bg-slate-100 rounded-xl">Batal</button>
<button type="submit" class="px-5 py-2 text-sm font-semibold bg-brand-600 hover:bg-brand-700 text-white rounded-xl shadow">Proses Peminjaman</button>
</div>
</form>
</div>
</div>
<!-- Modal Tambah Digital File -->
<div id="digitalModal" class="fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-50 hidden flex items-center justify-center p-4 overflow-y-auto">
<div class="bg-white rounded-2xl shadow-2xl max-w-lg w-full overflow-hidden">
<div class="p-6 border-b border-slate-100 flex items-center justify-between bg-slate-50">
<h4 class="font-bold text-slate-900 text-base">Tambah Dokumen Digital & Modul</h4>
<button onclick="closeDigitalModal()" class="text-slate-400 hover:text-slate-600"><i class="fa-solid fa-xmark text-lg"></i></button>
</div>
<form id="digitalForm" onsubmit="saveDigital(event)" class="p-6 space-y-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Judul Dokumen / Modul *</label>
<input type="text" id="digJudul" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none">
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Kategori *</label>
<select id="digKategori" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none">
<option value="Modul Ajar">Modul Ajar</option>
<option value="LKPD">LKPD</option>
<option value="E-Book Legal">E-Book Legal</option>
<option value="Materi Pembelajaran">Materi Pembelajaran</option>
</select>
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Penyusun / Guru *</label>
<input type="text" id="digPenyusun" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none">
</div>
</div>
<div>
<label class="block text-xs font-semibold text-slate-700 mb-1">Deskripsi Singkat *</label>
<textarea id="digDeskripsi" rows="3" required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-3.5 py-2.5 text-sm focus:outline-none"></textarea>
</div>
<div class="flex justify-end space-x-3 pt-4 border-t border-slate-100">
<button type="button" onclick="closeDigitalModal()" class="px-4 py-2 text-sm font-semibold text-slate-600 hover:bg-slate-100 rounded-xl">Batal</button>
<button type="submit" class="px-5 py-2 text-sm font-semibold bg-brand-600 hover:bg-brand-700 text-white rounded-xl shadow">Upload Dokumen</button>
</div>
</form>
</div>
</div>
<!-- JavaScript Application Logic -->
<script>
// Referensi Lengkap Data Buku SMK (Kurikulum Merdeka & Kejuruan)
const defaultBuku = [
{ id: 1, judul: "Pemrograman Berorientasi Objek (PBO) Kelas XI", penulis: "Tim Produktif PPLG", penerbit: "Erlangga", jenis: "Buku Cetak", kategori: "PPLG", tahun: 2023, stok: 12 },
{ id: 2, judul: "Administrasi Sistem Jaringan (ASJ) TJKT", penulis: "Ahmad Fauzi, M.Kom", penerbit: "Mediatama", jenis: "Buku Cetak", kategori: "TJKT", tahun: 2022, stok: 8 },
{ id: 3, judul: "Desain Grafis & UI/UX Dasar DKV", penulis: "Siti Rahma, S.Ds", penerbit: "Andi Publisher", jenis: "Buku Cetak", kategori: "DKV", tahun: 2023, stok: 15 },
{ id: 4, judul: "Matematika SMK Bisnis & Teknologi Kelas XII", penulis: "Drs. Sujono", penerbit: "Grafindo", jenis: "Buku Cetak", kategori: "Normatif", tahun: 2021, stok: 20 },
{ id: 5, judul: "Dasar-Dasar Pengembangan Perangkat Lunak dan Gim", penulis: "Budi Raharjo, S.T", penerbit: "Informatika", jenis: "Buku Cetak", kategori: "PPLG", tahun: 2023, stok: 14 },
{ id: 6, judul: "Teknologi Jaringan Berbasis Luas (WAN) Kelas XII", penulis: "Ir. Eko Prasetyo", penerbit: "Yrama Widya", jenis: "Buku Cetak", kategori: "TJKT", tahun: 2022, stok: 10 },
{ id: 7, judul: "Praktikum Akuntansi Perusahaan Jasa & Dagang", penulis: "Dr. Hj. Nur Indah, M.Ak", penerbit: "Salemba Empat", jenis: "Buku Cetak", kategori: "Akuntansi", tahun: 2023, stok: 18 },
{ id: 8, judul: "Food and Beverage Service Operations", penulis: "Chef Hendra Wijaya", penerbit: "Andi Publisher", jenis: "Buku Cetak", kategori: "Perhotelan", tahun: 2022, stok: 12 },
{ id: 9, judul: "Modul Ajar Kurikulum Merdeka - Dasar TJKT", penulis: "Tim Guru TJKT", penerbit: "SMK Kebon Jeruk", jenis: "Modul Ajar", kategori: "TJKT", tahun: 2024, stok: 50 },
{ id: 10, judul: "E-Book Undang-Undang ITE & Etika Siber", penulis: "Kemenkominfo", penerbit: "Digital Legal", jenis: "E-Book", kategori: "Umum", tahun: 2023, stok: 100 }
];
const defaultAnggota = [
{ id: 1, nama: "Budi Santoso", nomorId: "10021", peran: "Siswa", kelas: "XI PPLG 1", telepon: "081234567890" },
{ id: 2, nama: "Dewi Lestari", nomorId: "10022", peran: "Siswa", kelas: "XI TJKT 2", telepon: "085678901234" },
{ id: 3, nama: "Rizky Pratama", nomorId: "10023", peran: "Siswa", kelas: "XII DKV 1", telepon: "087812345678" },
{ id: 4, nama: "Drs. H. Mulyadi, M.Pd", nomorId: "19750112", peran: "Guru", kelas: "Guru Produktif TJKT", telepon: "081198765432" },
{ id: 5, nama: "Sri Wahyuni, S.Pd", nomorId: "19820520", peran: "Guru", kelas: "Guru Normatif", telepon: "081345678901" }
];
const defaultPeminjaman = [
{ id: 1, anggotaId: 1, bukuId: 1, tglPinjam: "2026-03-01", batasKembali: "2026-03-08", status: "Dipinjam" },
{ id: 2, anggotaId: 2, bukuId: 2, tglPinjam: "2026-02-20", batasKembali: "2026-02-27", status: "Dikembalikan" }
];
const defaultDigital = [
{ id: 1, judul: "Modul Ajar Pemrograman Web dan Perangkat Bergerak", kategori: "Modul Ajar", penyusun: "Tim PPLG", deskripsi: "Modul lengkap HTML, CSS, JavaScript untuk kelas XI SMK.", link: "#" },
{ id: 2, judul: "LKPD Administrasi Server Jaringan Linux Debian", kategori: "LKPD", penyusun: "Ahmad Fauzi, M.Kom", deskripsi: "Lembar kerja praktikum konfigurasi DNS dan DHCP Server.", link: "#" },
{ id: 3, judul: "E-Book Panduan Adobe Illustrator & Photoshop", kategori: "E-Book Legal", penyusun: "Siti Rahma, S.Ds", deskripsi: "Buku panduan resmi desain vektor dan raster tingkat SMK.", link: "#" }
];
// LocalStorage Initialization
let bukuList = JSON.parse(localStorage.getItem('smk_buku')) || defaultBuku;
let anggotaList = JSON.parse(localStorage.getItem('smk_anggota')) || defaultAnggota;
let peminjamanList = JSON.parse(localStorage.getItem('smk_peminjaman')) || defaultPeminjaman;
let digitalList = JSON.parse(localStorage.getItem('smk_digital')) || defaultDigital;
function saveData() {
localStorage.setItem('smk_buku', JSON.stringify(bukuList));
localStorage.setItem('smk_anggota', JSON.stringify(anggotaList));
localStorage.setItem('smk_peminjaman', JSON.stringify(peminjamanList));
localStorage.setItem('smk_digital', JSON.stringify(digitalList));
refreshAllUI();
}
// Sidebar & Tab Switcher
const sidebar = document.getElementById('sidebar');
document.getElementById('openSidebar').addEventListener('click', () => { sidebar.classList.remove('-translate-x-full'); });
document.getElementById('closeSidebar').addEventListener('click', () => { sidebar.classList.add('-translate-x-full'); });
function switchTab(tabId) {
document.querySelectorAll('.tab-content').forEach(el => el.classList.remove('active'));
document.getElementById('tab-' + tabId).classList.add('active');
document.querySelectorAll('.nav-link').forEach(el => el.classList.remove('bg-slate-800', 'text-white'));
event && event.currentTarget && event.currentTarget.classList.add('bg-slate-800', 'text-white');
// Close mobile sidebar if open
sidebar.classList.add('-translate-x-full');
// Update title
const titles = {
dashboard: 'Dashboard Perpustakaan',
koleksi: 'Data Koleksi Buku',
pencarian: 'Pencarian Buku',
anggota: 'Data Anggota Perpustakaan',
peminjaman: 'Peminjaman & Pengembalian',
digital: 'Perpustakaan Digital & Modul',
laporan: 'Laporan & Rekapitulasi',
profil: 'Profil Perpustakaan',
pengaturan: 'Pengaturan Sistem'
};
document.getElementById('pageTitle').innerText = titles[tabId] || 'Portal Pustaka';
}
// Refresh All UI components
function refreshAllUI() {
renderDashboard();
renderKoleksi();
renderAnggota();
renderPeminjaman();
renderDigitalRepo();
renderLaporan();
}
// 1. Dashboard Render
function renderDashboard() {
document.getElementById('statTotalBuku').innerText = bukuList.length;
document.getElementById('statTotalAnggota').innerText = anggotaList.length;
const activePinjam = peminjamanList.filter(p => p.status === 'Dipinjam').length;
document.getElementById('statDipinjam').innerText = activePinjam;
document.getElementById('statDigital').innerText = digitalList.length;
// Recent activity table
const tbody = document.getElementById('dashboardRecentActivity');
tbody.innerHTML = '';
const recent = [...peminjamanList].reverse().slice(0, 5);
if (recent.length === 0) {
tbody.innerHTML = `<tr><td colspan="4" class="py-4 text-center text-slate-400 text-xs">Belum ada aktivitas peminjaman.</td></tr>`;
return;
}
recent.forEach(p => {
const ang = anggotaList.find(a => a.id == p.anggotaId) || { nama: 'Unknown' };
const buk = bukuList.find(b => b.id == p.bukuId) || { judul: 'Buku Dihapus' };
const badge = p.status === 'Dipinjam' ? 'bg-amber-100 text-amber-800' : 'bg-emerald-100 text-emerald-800';
tbody.innerHTML += `
<tr class="hover:bg-slate-50 transition-colors">
<td class="py-3 px-3 font-semibold text-slate-900">${ang.nama}</td>
<td class="py-3 px-3 text-slate-600 truncate max-w-xs">${buk.judul}</td>
<td class="py-3 px-3 text-slate-500 text-xs">${p.tglPinjam}</td>
<td class="py-3 px-3"><span class="px-2.5 py-1 rounded-full text-xs font-semibold ${badge}">${p.status}</span></td>
</tr>
`;
});
}
// 2. Koleksi Render & Filter
function renderKoleksi() {
const query = document.getElementById('searchKoleksiInput').value.toLowerCase();
const kat = document.getElementById('filterKategoriKoleksi').value;
const tbody = document.getElementById('tabelKoleksiBody');
tbody.innerHTML = '';
const filtered = bukuList.filter(b => {
const matchQ = b.judul.toLowerCase().includes(query) || b.penulis.toLowerCase().includes(query) || b.kategori.toLowerCase().includes(query);
const matchK = kat === "" || b.jenis === kat;
return matchQ && matchK;
});
if (filtered.length === 0) {
tbody.innerHTML = `<tr><td colspan="6" class="py-6 text-center text-slate-400 text-sm">Tidak ada data koleksi ditemukan.</td></tr>`;
return;
}
filtered.forEach(b => {
tbody.innerHTML += `
<tr class="hover:bg-slate-50/80 transition-colors">
<td class="py-3.5 px-4 font-semibold text-slate-900">${b.judul}</td>
<td class="py-3.5 px-4 text-slate-600">${b.penulis} <span class="text-xs text-slate-400 block">${b.penerbit || '-'} (${b.tahun || '-'})</span></td>
<td class="py-3.5 px-4"><span class="bg-blue-50 text-blue-700 px-2.5 py-1 rounded-md text-xs font-semibold">${b.kategori}</span></td>
<td class="py-3.5 px-4 text-slate-600 text-xs font-medium">${b.jenis}</td>
<td class="py-3.5 px-4 text-center font-semibold text-slate-800">${b.stok}</td>
<td class="py-3.5 px-4 text-center space-x-2">
<button onclick="editBuku(${b.id})" class="text-slate-400 hover:text-brand-600 p-1"><i class="fa-solid fa-pen-to-square"></i></button>
<button onclick="deleteBuku(${b.id})" class="text-slate-400 hover:text-rose-600 p-1"><i class="fa-solid fa-trash"></i></button>
</td>
</tr>
`;
});
}
function filterKoleksi() { renderKoleksi(); }
// 3. Pencarian Cepat Live Search
function executeLiveSearch() {
const query = document.getElementById('liveSearchInput').value.toLowerCase();
const grid = document.getElementById('liveSearchResultGrid');
const countEl = document.getElementById('searchResultCount');
grid.innerHTML = '';
const filtered = bukuList.filter(b => b.judul.toLowerCase().includes(query) || b.penulis.toLowerCase().includes(query) || b.kategori.toLowerCase().includes(query));
countEl.innerText = filtered.length + ' Buku';
if (filtered.length === 0) {
grid.innerHTML = `<div class="col-span-full py-10 text-center text-slate-400 bg-white rounded-2xl border border-slate-200">Buku tidak ditemukan dalam pencarian.</div>`;
return;
}
filtered.forEach(b => {
grid.innerHTML += `
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex flex-col justify-between hover:shadow-md transition-shadow">
<div>
<div class="flex items-center justify-between mb-2">
<span class="bg-brand-50 text-brand-700 px-2.5 py-1 rounded-md text-xs font-bold">${b.jenis}</span>
<span class="text-xs text-slate-400 font-medium">${b.tahun || ''}</span>
</div>
<h4 class="font-bold text-slate-900 text-base leading-snug">${b.judul}</h4>
<p class="text-xs text-slate-500 mt-1"><i class="fa-solid fa-pen-nib mr-1"></i> ${b.penulis} • ${b.penerbit || 'Mandiri'}</p>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between">
<span class="text-xs font-semibold text-slate-700">Kategori: ${b.kategori}</span>
<span class="text-xs font-bold ${b.stok > 0 ? 'text-emerald-600' : 'text-rose-600'}">Stok: ${b.stok}</span>
</div>
</div>
`;
});
}
// 4. Anggota Render & Filter
function renderAnggota() {
const query = document.getElementById('searchAnggotaInput').value.toLowerCase();
const role = document.getElementById('filterRoleAnggota').value;
const tbody = document.getElementById('tabelAnggotaBody');
tbody.innerHTML = '';
const filtered = anggotaList.filter(a => {
const matchQ = a.nama.toLowerCase().includes(query) || a.nomorId.toLowerCase().includes(query) || a.telepon.includes(query);
const matchR = role === "" || a.peran === role;
return matchQ && matchR;
});
if (filtered.length === 0) {
tbody.innerHTML = `<tr><td colspan="6" class="py-6 text-center text-slate-400 text-sm">Tidak ada data anggota ditemukan.</td></tr>`;
return;
}
filtered.forEach(a => {
const badgeColor = a.peran === 'Siswa' ? 'bg-blue-50 text-blue-700' : (a.peran === 'Guru' ? 'bg-purple-50 text-purple-700' : 'bg-emerald-50 text-emerald-700');
tbody.innerHTML += `
<tr class="hover:bg-slate-50 transition-colors">
<td class="py-3.5 px-4 font-semibold text-slate-900">${a.nama}</td>
<td class="py-3.5 px-4 text-slate-600 font-mono text-xs">${a.nomorId}</td>
<td class="py-3.5 px-4"><span class="${badgeColor} px-2.5 py-1 rounded-md text-xs font-semibold">${a.peran}</span></td>
<td class="py-3.5 px-4 text-slate-600 text-xs">${a.kelas}</td>
<td class="py-3.5 px-4 text-slate-600 text-xs"><i class="fa-brands fa-whatsapp text-emerald-600 mr-1"></i>${a.telepon || '-'}</td>
<td class="py-3.5 px-4 text-center space-x-2">
<button onclick="editAnggota(${a.id})" class="text-slate-400 hover:text-brand-600 p-1"><i class="fa-solid fa-pen-to-square"></i></button>
<button onclick="deleteAnggota(${a.id})" class="text-slate-400 hover:text-rose-600 p-1"><i class="fa-solid fa-trash"></i></button>
</td>
</tr>
`;
});
}
function filterAnggota() { renderAnggota(); }
// 5. Peminjaman Render
function renderPeminjaman() {
const statusFilter = document.getElementById('filterStatusPinjam').value;
const tbody = document.getElementById('tabelPeminjamanBody');
tbody.innerHTML = '';
const filtered = peminjamanList.filter(p => statusFilter === "" || p.status === statusFilter);
if (filtered.length === 0) {
tbody.innerHTML = `<tr><td colspan="6" class="py-6 text-center text-slate-400 text-sm">Belum ada data transaksi peminjaman.</td></tr>`;
return;
}
filtered.forEach(p => {
const ang = anggotaList.find(a => a.id == p.anggotaId) || { nama: 'Unknown' };
const buk = bukuList.find(b => b.id == p.bukuId) || { judul: 'Buku Dihapus' };
const badge = p.status === 'Dipinjam' ? 'bg-amber-100 text-amber-800' : 'bg-emerald-100 text-emerald-800';
let actionBtn = p.status === 'Dipinjam' ?
`<button onclick="returnBook(${p.id})" class="bg-emerald-600 hover:bg-emerald-700 text-white text-xs font-semibold px-3 py-1.5 rounded-lg shadow-sm">Kembalikan</button>` :
`<span class="text-xs text-slate-400 italic">Selesai</span>`;
tbody.innerHTML += `
<tr class="hover:bg-slate-50 transition-colors">
<td class="py-3.5 px-4 font-semibold text-slate-900">${ang.nama}</td>
<td class="py-3.5 px-4 text-slate-600">${buk.judul}</td>
<td class="py-3.5 px-4 text-slate-500 text-xs">${p.tglPinjam}</td>
<td class="py-3.5 px-4 text-slate-500 text-xs">${p.batasKembali}</td>
<td class="py-3.5 px-4"><span class="px-2.5 py-1 rounded-full text-xs font-semibold ${badge}">${p.status}</span></td>
<td class="py-3.5 px-4 text-center">${actionBtn}</td>
</tr>
`;
});
}
// 6. Digital Repository Render
function renderDigitalRepo() {
const kat = document.getElementById('filterKategoriDigital').value;
const grid = document.getElementById('digitalRepoGrid');
grid.innerHTML = '';
const filtered = digitalList.filter(d => kat === "" || d.kategori === kat);
if (filtered.length === 0) {
grid.innerHTML = `<div class="col-span-full py-10 text-center text-slate-400 bg-white rounded-2xl border border-slate-200">Tidak ada file digital dalam kategori ini.</div>`;
return;
}
filtered.forEach(d => {
grid.innerHTML += `
<div class="bg-white p-6 rounded-2xl shadow-sm border border-slate-200 flex flex-col justify-between hover:shadow-md transition-shadow">
<div>
<div class="flex items-center justify-between mb-3">
<span class="bg-purple-50 text-purple-700 px-2.5 py-1 rounded-md text-xs font-bold">${d.kategori}</span>
<span class="text-xs text-slate-400 font-medium"><i class="fa-solid fa-file-pdf text-rose-500 mr-1"></i> PDF</span>
</div>
<h4 class="font-bold text-slate-900 text-base leading-snug">${d.judul}</h4>
<p class="text-xs text-slate-500 mt-1">Penyusun: <strong>${d.penyusun}</strong></p>
<p class="text-xs text-slate-600 mt-2 leading-relaxed">${d.deskripsi}</p>
</div>
<div class="mt-5 pt-4 border-t border-slate-100 flex items-center justify-between">
<button onclick="downloadDigital('${d.judul}')" class="w-full bg-purple-50 hover:bg-purple-100 text-purple-700 font-semibold text-xs py-2 px-4 rounded-xl transition-colors flex items-center justify-center space-x-2">
<i class="fa-solid fa-download"></i>
<span>Unduh Modul / E-Book</span>
</button>
</div>
</div>
`;
});
}
function downloadDigital(title) {
alert('Mengunduh file digital: "' + title + '". Dokumen berhasil diunduh.');
}
// 7. Laporan Render
function renderLaporan() {
const fisikCount = bukuList.filter(b => b.jenis === 'Buku Cetak').reduce((acc, cur) => acc + parseInt(cur.stok || 0), 0);
document.getElementById('rekapBukuFisik').innerText = fisikCount;
document.getElementById('rekapTotalPinjam').innerText = peminjamanList.length;
document.getElementById('rekapTotalDigital').innerText = digitalList.length;
const tbody = document.getElementById('tabelRekapBody');
tbody.innerHTML = '';
peminjamanList.forEach((p, idx) => {
const ang = anggotaList.find(a => a.id == p.anggotaId) || { nama: 'Unknown' };
const buk = bukuList.find(b => b.id == p.bukuId) || { judul: 'Buku Dihapus' };
tbody.innerHTML += `
<tr class="hover:bg-slate-50">
<td class="py-3 px-3 font-mono text-xs text-slate-500">TRX-${1000 + p.id}</td>
<td class="py-3 px-3 font-semibold text-slate-900">${ang.nama}</td>
<td class="py-3 px-3 text-slate-600">${buk.judul}</td>
<td class="py-3 px-3 text-slate-500 text-xs">${p.tglPinjam}</td>
<td class="py-3 px-3"><span class="px-2 py-0.5 rounded text-xs font-semibold ${p.status === 'Dipinjam' ? 'bg-amber-100 text-amber-800' : 'bg-emerald-100 text-emerald-800'}">${p.status}</span></td>
</tr>
`;
});
}
// Modal Controllers: Buku
function openBukuModal() {
document.getElementById('bukuForm').reset();
document.getElementById('bukuId').value = '';
document.getElementById('bukuModalTitle').innerText = 'Tambah Koleksi Baru';
document.getElementById('bukuModal').classList.remove('hidden');
}
function closeBukuModal() { document.getElementById('bukuModal').classList.add('hidden'); }
function editBuku(id) {
const b = bukuList.find(item => item.id == id);
if (!b) return;
document.getElementById('bukuId').value = b.id;
document.getElementById('bukuJudul').value = b.judul;
document.getElementById('bukuPenulis').value = b.penulis;
document.getElementById('bukuPenerbit').value = b.penerbit || '';
document.getElementById('bukuJenis').value = b.jenis;
document.getElementById('bukuKategori').value = b.kategori;
document.getElementById('bukuTahun').value = b.tahun || '';
document.getElementById('bukuStok').value = b.stok;
document.getElementById('bukuModalTitle').innerText = 'Edit Koleksi Buku';
document.getElementById('bukuModal').classList.remove('hidden');
}
function saveBuku(e) {
e.preventDefault();
const id = document.getElementById('bukuId').value;
const data = {
id: id ? parseInt(id) : Date.now(),
judul: document.getElementById('bukuJudul').value,
penulis: document.getElementById('bukuPenulis').value,
penerbit: document.getElementById('bukuPenerbit').value,
jenis: document.getElementById('bukuJenis').value,
kategori: document.getElementById('bukuKategori').value,
tahun: parseInt(document.getElementById('bukuTahun').value) || 2024,
stok: parseInt(document.getElementById('bukuStok').value) || 1
};
if (id) {
const idx = bukuList.findIndex(item => item.id == id);
if (idx !== -1) bukuList[idx] = data;
} else {
bukuList.push(data);
}
saveData();
closeBukuModal();
}
function deleteBuku(id) {
if (confirm('Yakin ingin menghapus koleksi ini?')) {
bukuList = bukuList.filter(item => item.id != id);
saveData();
}
}
// Modal Controllers: Anggota
function openAnggotaModal() {
document.getElementById('anggotaForm').reset();
document.getElementById('anggotaId').value = '';
document.getElementById('anggotaModalTitle').innerText = 'Tambah Anggota Baru';
document.getElementById('anggotaModal').classList.remove('hidden');
}
function closeAnggotaModal() { document.getElementById('anggotaModal').classList.add('hidden'); }
function editAnggota(id) {
const a = anggotaList.find(item => item.id == id);
if (!a) return;
document.getElementById('anggotaId').value = a.id;
document.getElementById('anggotaNama').value = a.nama;
document.getElementById('anggotaNomorId').value = a.nomorId;
document.getElementById('anggotaPeran').value = a.peran;
document.getElementById('anggotaKelas').value = a.kelas;
document.getElementById('anggotaTelepon').value = a.telepon || '';
document.getElementById('anggotaModalTitle').innerText = 'Edit Data Anggota';
document.getElementById('anggotaModal').classList.remove('hidden');
}
function saveAnggota(e) {
e.preventDefault();
const id = document.getElementById('anggotaId').value;
const data = {
id: id ? parseInt(id) : Date.now(),
nama: document.getElementById('anggotaNama').value,
nomorId: document.getElementById('anggotaNomorId').value,
peran: document.getElementById('anggotaPeran').value,
kelas: document.getElementById('anggotaKelas').value,
telepon: document.getElementById('anggotaTelepon').value
};
if (id) {
const idx = anggotaList.findIndex(item => item.id == id);
if (idx !== -1) anggotaList[idx] = data;
} else {
anggotaList.push(data);
}
saveData();
closeAnggotaModal();
}
function deleteAnggota(id) {
if (confirm('Yakin ingin menghapus anggota ini?')) {
anggotaList = anggotaList.filter(item => item.id != id);
saveData();
}
}
// Modal Controllers: Peminjaman
function openPinjamModal() {
// Populate dropdown anggota
const selAnggota = document.getElementById('pinjamAnggotaId');
selAnggota.innerHTML = '';
anggotaList.forEach(a => {
selAnggota.innerHTML += `<option value="${a.id}">${a.nama} (${a.peran} - ${a.kelas})</option>`;
});
// Populate dropdown buku fisik
const selBuku = document.getElementById('pinjamBukuId');
selBuku.innerHTML = '';
bukuList.filter(b => b.jenis === 'Buku Cetak').forEach(b => {
selBuku.innerHTML += `<option value="${b.id}">${b.judul} (Stok: ${b.stok})</option>`;
});
// Set default dates
const today = new Date().toISOString().split('T')[0];
const nextWeek = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
document.getElementById('pinjamTanggal').value = today;
document.getElementById('pinjamBatas').value = nextWeek;
document.getElementById('pinjamModal').classList.remove('hidden');
}
function closePinjamModal() { document.getElementById('pinjamModal').classList.add('hidden'); }
function savePinjaman(e) {
e.preventDefault();
const data = {
id: Date.now(),
anggotaId: parseInt(document.getElementById('pinjamAnggotaId').value),
bukuId: parseInt(document.getElementById('pinjamBukuId').value),
tglPinjam: document.getElementById('pinjamTanggal').value,
batasKembali: document.getElementById('pinjamBatas').value,
status: 'Dipinjam'
};
peminjamanList.push(data);
saveData();
closePinjamModal();
}
function returnBook(id) {
const p = peminjamanList.find(item => item.id == id);
if (p) {
p.status = 'Dikembalikan';
saveData();
}
}
// Modal Controllers: Digital
function openDigitalModal() {
document.getElementById('digitalForm').reset();
document.getElementById('digitalModal').classList.remove('hidden');
}
function closeDigitalModal() { document.getElementById('digitalModal').classList.add('hidden'); }
function saveDigital(e) {
e.preventDefault();
const data = {
id: Date.now(),
judul: document.getElementById('digJudul').value,
kategori: document.getElementById('digKategori').value,
penyusun: document.getElementById('digPenyusun').value,
deskripsi: document.getElementById('digDeskripsi').value,
link: '#'
};
digitalList.push(data);
saveData();
closeDigitalModal();
}
// Reset Data
function resetAllData() {
if (confirm('Reset seluruh data perpustakaan ke setelan referensi awal?')) {
localStorage.clear();
bukuList = defaultBuku;
anggotaList = defaultAnggota;
peminjamanList = defaultPeminjaman;
digitalList = defaultDigital;
saveData();
alert('Data referensi berhasil dimuat ulang.');
}
}
// Initial Load on Window Startup
window.onload = function() {
refreshAllUI();
executeLiveSearch();
};
</script>
</body>
</html>
1 Comments
https://www.kompasiana.com/kebonjeruksmk7233
ReplyDelete