${description}
+${descText}
Informasi Tambahan (Bersifat Opsional): ${additionalInfo}
+${t('grp_c4a_label_additional_info', 'Informasi Tambahan (Bersifat Opsional):')} ${additionalInfoText}
${title}
-${description}
+${titleText}
+${descText}
diff --git a/assets/global/localization.js b/assets/global/localization.js
index 82d1ca7..dfcc686 100644
--- a/assets/global/localization.js
+++ b/assets/global/localization.js
@@ -569,6 +569,46 @@ const translations = {
kontrib_guideline_3: "Sertakan fakta dan data yang akurat dan dapat diverifikasi.",
kontrib_guideline_4: "Hindari plagiarisme. Karya harus orisinal.",
kontrib_guideline_5: "Tim redaksi berhak menyunting konten untuk keperluan editorial.",
+
+ // --- Group C4A: Staf Pendukung & SOP ---
+ grp_c4a_hero_tag: "LAYANAN AKADEMIK \u2022 INFORMATIKA UNTAN",
+ grp_c4a_hero_title: "Staf Pendukung &
Standar Operasional Prosedur (SOP)",
+ grp_c4a_hero_desc: "Halaman ini menampilkan informasi petugas layanan akademik serta prosedur administrasi mahasiswa Program Studi Informatika UNTAN.",
+ grp_c4a_stat_staf: "Staf Aktif",
+ grp_c4a_stat_sop: "Jenis SOP",
+ grp_c4a_staff_tag: "Tim Kami",
+ grp_c4a_staff_title: "Staf Pendukung",
+ grp_c4a_staff_subtitle: "Staf yang siap melayani kebutuhan akademik dan operasional laboratorium di Prodi Informatika UNTAN.",
+ grp_c4a_sop_tag: "Prosedur Resmi",
+ grp_c4a_sop_title: "Standar Operasional Prosedur (SOP)",
+ grp_c4a_sop_subtitle: "Standar Operasional Prosedur untuk berbagai kebutuhan administrasi akademik mahasiswa. Gunakan pencarian atau filter untuk menemukan SOP yang Anda butuhkan.",
+ grp_c4a_sop_search_placeholder: "Cari SOP berdasarkan judul...",
+ grp_c4a_sop_chip_semua: "Semua",
+ grp_c4a_sop_chip_akademik: "Akademik",
+ grp_c4a_sop_chip_praktikum: "Praktikum",
+ grp_c4a_sop_empty_title: "SOP tidak ditemukan",
+ grp_c4a_sop_empty_desc: "Coba kata kunci lain atau reset filter pencarian.",
+ grp_c4a_sop_reset_btn: "Reset Pencarian",
+ grp_c4a_faq_tag: "Pertanyaan Umum",
+ grp_c4a_faq_title: "Pertanyaan yang Sering Diajukan",
+ grp_c4a_faq_subtitle: "Temukan jawaban cepat atas pertanyaan umum mahasiswa seputar layanan akademik prodi.",
+ grp_c4a_empty_staff: "Data staf pendukung tidak tersedia saat ini.",
+ grp_c4a_empty_sop: "Data SOP tidak tersedia saat ini.",
+ grp_c4a_empty_faq: "Data FAQ tidak tersedia saat ini.",
+ grp_c4a_label_location: "Lokasi",
+ grp_c4a_label_service_hours: "Jam Layanan",
+ grp_c4a_label_wa_contact: "Kontak WhatsApp",
+ grp_c4a_label_tasks: "Tugas & Tanggung Jawab",
+ grp_c4a_label_send_wa: "Kirim Pesan WA",
+ grp_c4a_label_steps: "Langkah",
+ grp_c4a_label_view_detail: "Lihat Detail",
+ grp_c4a_label_responsible_staff: "Staf Bertanggung Jawab (Bersifat Opsional)",
+ grp_c4a_label_additional_info: "Informasi Tambahan (Bersifat Opsional):",
+ grp_c4a_label_purpose: "Tujuan",
+ grp_c4a_label_requirements: "Persyaratan",
+ grp_c4a_label_procedure: "Alur Prosedur",
+ grp_c4a_sop_showing_all: "Menampilkan {total} SOP",
+ grp_c4a_sop_showing_filtered: "Menampilkan {shown} dari {total} SOP",
},
en: {
@@ -1135,6 +1175,46 @@ const translations = {
kontrib_guideline_3: "Include accurate and verifiable facts and data.",
kontrib_guideline_4: "Avoid plagiarism. Work must be original.",
kontrib_guideline_5: "The editorial team reserves the right to edit content for editorial purposes.",
+
+ // --- Group C4A: Supporting Staff & SOP ---
+ grp_c4a_hero_tag: "ACADEMIC SERVICES \u2022 INFORMATICS UNTAN",
+ grp_c4a_hero_title: "Supporting Staff &
Standard Operating Procedures (SOP)",
+ grp_c4a_hero_desc: "This page presents information about academic service officers and administrative procedures for students of the Informatics Study Program at UNTAN.",
+ grp_c4a_stat_staf: "Active Staff",
+ grp_c4a_stat_sop: "SOP Types",
+ grp_c4a_staff_tag: "Our Team",
+ grp_c4a_staff_title: "Supporting Staff",
+ grp_c4a_staff_subtitle: "Staff ready to serve academic and laboratory operational needs at the Informatics Study Program, UNTAN.",
+ grp_c4a_sop_tag: "Official Procedures",
+ grp_c4a_sop_title: "Standard Operating Procedures (SOP)",
+ grp_c4a_sop_subtitle: "Standard Operating Procedures for various student academic administration needs. Use search or filter to find the SOP you need.",
+ grp_c4a_sop_search_placeholder: "Search SOP by title...",
+ grp_c4a_sop_chip_semua: "All",
+ grp_c4a_sop_chip_akademik: "Academic",
+ grp_c4a_sop_chip_praktikum: "Practicum",
+ grp_c4a_sop_empty_title: "No SOP found",
+ grp_c4a_sop_empty_desc: "Try another keyword or reset the search filter.",
+ grp_c4a_sop_reset_btn: "Reset Search",
+ grp_c4a_faq_tag: "Frequently Asked",
+ grp_c4a_faq_title: "Frequently Asked Questions",
+ grp_c4a_faq_subtitle: "Find quick answers to common student questions about the study program's academic services.",
+ grp_c4a_empty_staff: "Staff data is currently unavailable.",
+ grp_c4a_empty_sop: "SOP data is currently unavailable.",
+ grp_c4a_empty_faq: "FAQ data is currently unavailable.",
+ grp_c4a_label_location: "Location",
+ grp_c4a_label_service_hours: "Service Hours",
+ grp_c4a_label_wa_contact: "WhatsApp Contact",
+ grp_c4a_label_tasks: "Tasks & Responsibilities",
+ grp_c4a_label_send_wa: "Send WA Message",
+ grp_c4a_label_steps: "Steps",
+ grp_c4a_label_view_detail: "View Details",
+ grp_c4a_label_responsible_staff: "Responsible Staff (Optional)",
+ grp_c4a_label_additional_info: "Additional Information (Optional):",
+ grp_c4a_label_purpose: "Purpose",
+ grp_c4a_label_requirements: "Requirements",
+ grp_c4a_label_procedure: "Procedure Flow",
+ grp_c4a_sop_showing_all: "Showing {total} SOP",
+ grp_c4a_sop_showing_filtered: "Showing {shown} of {total} SOP",
}
};
diff --git a/groups/C4A/README.md b/groups/C4A/README.md
new file mode 100644
index 0000000..abb90fa
--- /dev/null
+++ b/groups/C4A/README.md
@@ -0,0 +1,125 @@
+# Panduan Pengelolaan Data Kelompok C4A
+
+Dokumentasi ini dibuat untuk memudahkan pengembang atau pengguna berikutnya dalam mengelola data Staf Pendukung, SOP, dan FAQ pada halaman C4A.
+
+---
+
+## đ Aturan Umum Pengelolaan Data
+
+1. **Lokasi Berkas Data**:
+ Seluruh data disimpan dalam format JSON di direktori `groups/C4A/data/`:
+ - Data Staf: `groups/C4A/data/data-staff.json`
+ - Data SOP: `groups/C4A/data/data-sop.json`
+ - Data FAQ: `groups/C4A/data/data-faq.json`
+
+2. **Dukungan Bilingual (ID/EN)**:
+ Semua teks konten yang ditampilkan ke pengguna mendukung dua bahasa. Anda perlu menggunakan objek dengan properti `id` (Bahasa Indonesia) dan `en` (Bahasa Inggris) pada setiap field teks. Jika properti `en` tidak diisi atau data masih berupa *string* biasa, sistem akan otomatis menggunakan Bahasa Indonesia sebagai *fallback*.
+
+3. **Ikon FontAwesome (v4)**:
+ Jika ingin mengubah atau menambahkan logo/ikon pada data SOP, harap gunakan daftar ikon dari **FontAwesome v4** melalui tautan berikut:
+ đ **[FontAwesome v4 Icons](https://fontawesome.com/v4/icons/)** (Contoh penggunaan: `fa-dot-circle-o`, `fa-graduation-cap`, `fa-flask`).
+
+4. **Field Opsional**:
+ Pada data SOP, properti **`staff_responsible`** (Staf Bertanggung Jawab) dan **`additional_info`** (Informasi Tambahan) bersifat **opsional**. Jika informasi tersebut tidak tersedia, kosongkan nilainya atau hapus propertinya dari JSON agar UI secara otomatis menyembunyikan bloknya.
+
+---
+
+## đ ī¸ Template Penambahan Data
+
+Silakan salin-tempel (copy-paste) format di bawah ini ke dalam array JSON yang sesuai di folder `data/` untuk menambahkan data baru.
+
+### 1. Template Data Staf (`data-staff.json`)
+```json
+{
+ "id": 3,
+ "name": "Nama Staf Beserta Gelar",
+ "role": {
+ "id": "Peran / Jabatan Staf",
+ "en": "Staff Role / Title"
+ },
+ "image": "assets/images/nama-file-foto.png",
+ "location": {
+ "id": "Lokasi Ruang Kerja / Kantor Staf",
+ "en": "Staff Workspace / Office Location"
+ },
+ "contact_consent": true,
+ "phone": "628xxxxxxxxxx",
+ "schedule": [
+ {
+ "day": {
+ "id": "Hari Kerja (contoh: Senin â Jumat)",
+ "en": "Work Days (e.g., Monday â Friday)"
+ },
+ "time": "07.30â16.00 WIB",
+ "break": {
+ "id": "Jam Istirahat (contoh: istirahat 12.00â13.00 WIB)",
+ "en": "Break Time (e.g., break 12.00â13.00 WIB)"
+ }
+ }
+ ],
+ "tasks": [
+ {
+ "id": "Tugas dan tanggung jawab utama 1",
+ "en": "Main task and responsibility 1"
+ },
+ {
+ "id": "Tugas dan tanggung jawab utama 2",
+ "en": "Main task and responsibility 2"
+ }
+ ]
+}
+```
+*Catatan: Letakkan file gambar/foto staf ke dalam direktori `groups/C4A/assets/images/` dan masukkan nama berkas fotonya pada properti `image` di atas. Untuk nomor telepon (`phone`), Anda dapat menggunakan format `08xxxxxxxxxx` atau `628xxxxxxxxxx` karena skrip JavaScript akan melakukan normalisasi secara otomatis.*
+
+### 2. Template Data SOP (`data-sop.json`)
+```json
+{
+ "tab_id": "id-unik-sop-tanpa-spasi",
+ "tab_number": 9,
+ "category": "akademik",
+ "icon": "fa-file-text",
+ "title": {
+ "id": "Judul Lengkap SOP",
+ "en": "Full SOP Title"
+ },
+ "description": {
+ "id": "Deskripsi singkat mengenai SOP ini.",
+ "en": "Brief description of this SOP."
+ },
+ "purpose": {
+ "id": "Tujuan dibuatnya standar operasional prosedur ini.",
+ "en": "The purpose of creating this standard operating procedure."
+ },
+ "requirements": [
+ { "id": "Persyaratan administratif/akademik 1", "en": "Administrative/academic requirement 1" },
+ { "id": "Persyaratan administratif/akademik 2", "en": "Administrative/academic requirement 2" }
+ ],
+ "procedures": [
+ { "id": "Langkah alur prosedur ke-1", "en": "Procedure flow step 1" },
+ { "id": "Langkah alur prosedur ke-2", "en": "Procedure flow step 2" }
+ ],
+ "staff_responsible": [
+ "đ¤ Staf Administrasi Informatika / Informatics Administrative Staff"
+ ],
+ "additional_info": {
+ "id": "Informasi tambahan penting.",
+ "en": "Important additional information."
+ }
+}
+```
+*Catatan: Properti `category` bernilai antara `"akademik"` atau `"praktikum"`. Properti `staff_responsible` dan `additional_info` bersifat opsional.*
+
+### 3. Template Data FAQ (`data-faq.json`)
+```json
+{
+ "id": 11,
+ "question": {
+ "id": "Pertanyaan yang sering diajukan?",
+ "en": "Frequently asked question?"
+ },
+ "answer": {
+ "id": "Jawaban dari pertanyaan tersebut. Boleh menggunakan tag HTML seperti tebal.",
+ "en": "Answer to the question. HTML tags like bold can be used."
+ }
+}
+```
diff --git a/groups/C4A/index.html b/groups/C4A/index.html
index c89bb6f..6652060 100644
--- a/groups/C4A/index.html
+++ b/groups/C4A/index.html
@@ -1,4 +1,4 @@
-īģŋ
+
Halaman ini menampilkan informasi petugas +
Halaman ini menampilkan informasi petugas layanan akademik serta prosedur administrasi mahasiswa @@ -1174,12 +1174,12 @@
Staf yang siap melayani kebutuhan +
Staf yang siap melayani kebutuhan akademik dan operasional laboratorium di Prodi Informatika UNTAN.
Standar Operasional Prosedur untuk +
Standar Operasional Prosedur untuk berbagai kebutuhan administrasi akademik mahasiswa. Gunakan pencarian atau filter untuk menemukan SOP yang Anda butuhkan.
@@ -1217,6 +1217,7 @@${description}
+${descText}
Informasi Tambahan (Bersifat Opsional): ${additionalInfo}
+${t('grp_c4a_label_additional_info', 'Informasi Tambahan (Bersifat Opsional):')} ${additionalInfoText}
${description}
+${descText}
${purpose}
+${purposeText}
Data SOP tidak tersedia saat ini.
`; + container.innerHTML = `${t('grp_c4a_empty_sop', 'Data SOP tidak tersedia saat ini.')}
`; updateResultInfo(0, 0); + if (emptyState) emptyState.style.display = 'none'; return; } container.innerHTML = sops.map(buildSopCard).join(''); updateResultInfo(sops.length, sops.length); + if (emptyState) emptyState.style.display = 'none'; } /** Update teks info jumlah hasil */ @@ -276,16 +360,18 @@ function updateResultInfo(shown, total) { const el = document.getElementById('sop-result-info'); if (!el) return; if (shown === total) { - el.textContent = `Menampilkan ${total} SOP`; + const allTemplate = t('grp_c4a_sop_showing_all', 'Menampilkan {total} SOP'); + el.textContent = allTemplate.replace('{total}', total); } else { - el.textContent = `Menampilkan ${shown} dari ${total} SOP`; + const filteredTemplate = t('grp_c4a_sop_showing_filtered', 'Menampilkan {shown} dari {total} SOP'); + el.textContent = filteredTemplate.replace('{shown}', shown).replace('{total}', total); } } /** * Memfilter dan menyaring kartu SOP berdasarkan query pencarian dan chip filter aktif. */ -function applySopFilter() { +export function applySopFilter() { const container = document.getElementById('sop-cards-container'); if (!container) return; @@ -310,11 +396,17 @@ function applySopFilter() { }); const emptyState = document.getElementById('sop-empty-state'); - if (emptyState) emptyState.style.display = visibleCount === 0 ? 'flex' : 'none'; + if (emptyState) { + // Tampilkan "SOP tidak ditemukan" HANYA jika memang ada data SOP tetapi hasil filter 0. + // Jika data SOP memang kosong (tidak ada card sama sekali di data source), sembunyikan. + const hasData = container._sopData && container._sopData.length > 0; + emptyState.style.display = (hasData && visibleCount === 0) ? 'flex' : 'none'; + } updateResultInfo(visibleCount, cards.length); } + /** * Membuka modal detail untuk SOP tertentu berdasarkan tab_id. * @param {string} tabId - ID unik tab/SOP yang ingin ditampilkan @@ -552,10 +644,11 @@ export function renderFaqSection(faqs) { if (!container) return; if (!faqs || faqs.length === 0) { - container.innerHTML = `Data FAQ tidak tersedia saat ini.
`; + container.innerHTML = `${t('grp_c4a_empty_faq', 'Data FAQ tidak tersedia saat ini.')}
`; return; } + const delayClasses = ['reveal-delay-1', 'reveal-delay-2', 'reveal-delay-3']; const itemsHTML = faqs.map((faq, index) => { @@ -563,11 +656,11 @@ export function renderFaqSection(faqs) { return `