15 Commits

Author SHA1 Message Date
AufaHafizah 992bbd7684 Merge pull request 'chore(localization): merge upstream updates and preserve C4A keys' (#5) from feature/bilingual-support into main
Reviewed-on: #5
2026-06-05 04:11:15 +00:00
cygouw 0c9ece813a chore(localization): merge upstream updates and preserve C4A keys 2026-06-05 11:10:05 +07:00
AufaHafizah b31ba4ed34 Merge pull request 'docs/c4a-readme' (#4) from docs/c4a-readme into main
Reviewed-on: #4
2026-06-05 03:42:40 +00:00
AufaHafizah 83208bb622 Merge pull request 'feature/bilingual-support' (#3) from feature/bilingual-support into main
Reviewed-on: #3
2026-06-05 03:42:18 +00:00
cygouw d765783877 fix(C4A): resolve index.html conflict 2026-06-05 10:41:27 +07:00
cygouw f1cd7a8f5f merge branch 'main' into feature/bilingual-support 2026-06-05 10:33:20 +07:00
cygouw ce3c2e6ae8 fix(C4A): resolve merge conflict 2026-06-05 05:24:40 +02:00
cygouw 6430aee79e fix(C4A): resolve merge conflict on index.html - fix h1 title and remove BOM 2026-06-05 05:17:00 +02:00
cygouw 2fc6b7b6bc fix(C4A): resolve conflict - fix h1 title in index.html 2026-06-05 05:11:07 +02:00
cygouw d6db9cc464 chore(localization): sync translation keys with upstream main 2026-06-05 09:33:14 +07:00
cygouw ab4493e589 fix: resolve merge conflict from feature/bilingual-support 2026-06-05 09:10:14 +07:00
cygouw 154550d3b4 Merge branch 'feature/bilingual-support' 2026-06-05 08:33:51 +07:00
AufaHafizah 3975798ba2 Merge pull request 'feature/wa-link-protection' (#2) from feature/wa-link-protection into main
Reviewed-on: #2
2026-06-05 00:50:40 +00:00
AufaHafizah b943518500 Merge pull request 'feature/halaman-stafPendukung-SOP' (#1) from feature/halaman-stafPendukung-SOP into main
Reviewed-on: #1
2026-06-05 00:48:19 +00:00
cygouw 3ead384ec9 chore(c4a): update assignment page title 2026-06-05 01:46:57 +07:00
5 changed files with 692 additions and 218 deletions
File diff suppressed because it is too large Load Diff
+20 -59
View File
@@ -12,14 +12,11 @@ Dokumentasi ini dibuat untuk memudahkan pengembang atau pengguna berikutnya dala
- 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)**:
2. **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**:
3. **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.
---
@@ -33,39 +30,21 @@ Silakan salin-tempel (copy-paste) format di bawah ini ke dalam array JSON yang s
{
"id": 3,
"name": "Nama Staf Beserta Gelar",
"role": {
"id": "Peran / Jabatan Staf",
"en": "Staff Role / Title"
},
"role": "Peran / Jabatan Staf",
"image": "assets/images/nama-file-foto.png",
"location": {
"id": "Lokasi Ruang Kerja / Kantor Staf",
"en": "Staff Workspace / Office Location"
},
"location": "Lokasi Ruang Kerja / Kantor Staf",
"contact_consent": true,
"phone": "628xxxxxxxxxx",
"schedule": [
{
"day": {
"id": "Hari Kerja (contoh: Senin Jumat)",
"en": "Work Days (e.g., Monday Friday)"
},
"time": "07.3016.00 WIB",
"break": {
"id": "Jam Istirahat (contoh: istirahat 12.0013.00 WIB)",
"en": "Break Time (e.g., break 12.0013.00 WIB)"
}
"day": "Hari Kerja (contoh: Senin Jumat)",
"time": "Jam Kerja (contoh: 07.3016.00 WIB)",
"break": "Jam Istirahat (contoh: istirahat 12.0013.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"
}
"Tugas dan tanggung jawab utama 1",
"Tugas dan tanggung jawab utama 2"
]
}
```
@@ -78,33 +57,21 @@ Silakan salin-tempel (copy-paste) format di bawah ini ke dalam array JSON yang s
"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."
},
"title": "Judul Lengkap SOP",
"description": "Deskripsi singkat mengenai SOP ini.",
"purpose": "Tujuan dibuatnya standar operasional prosedur ini.",
"requirements": [
{ "id": "Persyaratan administratif/akademik 1", "en": "Administrative/academic requirement 1" },
{ "id": "Persyaratan administratif/akademik 2", "en": "Administrative/academic requirement 2" }
"Persyaratan administratif/akademik 1",
"Persyaratan administratif/akademik 2"
],
"procedures": [
{ "id": "Langkah alur prosedur ke-1", "en": "Procedure flow step 1" },
{ "id": "Langkah alur prosedur ke-2", "en": "Procedure flow step 2" }
"Langkah alur prosedur ke-1",
"Langkah alur prosedur ke-2"
],
"staff_responsible": [
"👤 Staf Administrasi Informatika / Informatics Administrative Staff"
"👤 Staf Administrasi Informatika"
],
"additional_info": {
"id": "Informasi tambahan penting.",
"en": "Important additional information."
}
"additional_info": "Informasi tambahan penting."
}
```
*Catatan: Properti `category` bernilai antara `"akademik"` atau `"praktikum"`. Properti `staff_responsible` dan `additional_info` bersifat opsional.*
@@ -113,13 +80,7 @@ Silakan salin-tempel (copy-paste) format di bawah ini ke dalam array JSON yang s
```json
{
"id": 11,
"question": {
"id": "Pertanyaan yang sering diajukan?",
"en": "Frequently asked question?"
},
"answer": {
"id": "Jawaban dari pertanyaan tersebut. Boleh menggunakan tag HTML seperti <strong>tebal</strong>.",
"en": "Answer to the question. HTML tags like <strong>bold</strong> can be used."
}
"question": "Pertanyaan yang sering diajukan?",
"answer": "Jawaban dari pertanyaan tersebut. Boleh menggunakan tag HTML seperti <strong>tebal</strong>."
}
```
+23 -24
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="id" class="scroll-smooth">
<head>
@@ -1150,7 +1150,8 @@
<span
class="bg-untan-yellow text-slate-900 text-[10px] font-bold uppercase tracking-widest px-2 py-0.5 inline-block mb-3">Tugas
Halaman Statis</span>
<h1 class="text-3xl lg:text-4xl font-bold text-slate-900 mb-2">Judul Halaman Group 04</h1>
<h1 class="text-3xl lg:text-4xl font-bold text-slate-900 mb-2">Staf Pendukung dan Standar Operasional
Prosedur (SOP)</h1>
<p class="text-slate-500 text-sm">Kelompok 04 &mdash; C4A &nbsp;&middot;&nbsp; Informatika UNTAN 2026
</p>
</div>
@@ -1159,13 +1160,13 @@
<!-- HERO SECTION -->
<section class="c4a-hero reveal">
<div class="c4a-hero-inner">
<div class="c4a-hero-tag" data-i18n="grp_c4a_hero_tag">LAYANAN AKADEMIK &bull; INFORMATIKA UNTAN
<div class="c4a-hero-tag">LAYANAN AKADEMIK &bull; INFORMATIKA UNTAN
</div>
<h1 class="c4a-hero-title" data-i18n-html="grp_c4a_hero_title">
Staf Pendukung &amp; <br/>
<h1 class="c4a-hero-title">
Staf Pendukung &amp; <br />
<span class="highlight-orange">Standar Operasional Prosedur (SOP)</span>
</h1>
<p class="c4a-hero-desc" data-i18n="grp_c4a_hero_desc">Halaman ini menampilkan informasi petugas
<p class="c4a-hero-desc">Halaman ini menampilkan informasi petugas
layanan akademik serta
prosedur administrasi
mahasiswa
@@ -1173,12 +1174,12 @@
<div class="hero-stats">
<div class="stat-item">
<div class="stat-number" id="stat-staf">0</div>
<div class="stat-label" data-i18n="grp_c4a_stat_staf">Staf Aktif</div>
<div class="stat-label">Staf Aktif</div>
</div>
<div class="stat-divider"></div>
<div class="stat-item">
<div class="stat-number" id="stat-sop">0</div>
<div class="stat-label" data-i18n="grp_c4a_stat_sop">Jenis SOP</div>
<div class="stat-label">Jenis SOP</div>
</div>
</div>
</div>
@@ -1187,10 +1188,10 @@
<!-- STAFF SECTION -->
<section class="content-section">
<div class="section-header">
<div class="section-tag"><span class="dot"></span> <span data-i18n="grp_c4a_staff_tag">Tim
<div class="section-tag"><span class="dot"></span> <span>Tim
Kami</span></div>
<h2 class="section-title" data-i18n="grp_c4a_staff_title">Staf Pendukung</h2>
<p class="section-subtitle" data-i18n="grp_c4a_staff_subtitle">Staf yang siap melayani kebutuhan
<h2 class="section-title">Staf Pendukung</h2>
<p class="section-subtitle">Staf yang siap melayani kebutuhan
akademik dan operasional
laboratorium di Prodi Informatika UNTAN.</p>
</div>
@@ -1202,10 +1203,10 @@
<!-- SOP SECTION -->
<section class="sop-section">
<div class="section-header">
<div class="section-tag"><span class="dot"></span> <span data-i18n="grp_c4a_sop_tag">Prosedur
<div class="section-tag"><span class="dot"></span> <span>Prosedur
Resmi</span></div>
<h2 class="section-title" data-i18n="grp_c4a_sop_title">Standar Operasional Prosedur (SOP)</h2>
<p class="section-subtitle" data-i18n="grp_c4a_sop_subtitle">Standar Operasional Prosedur untuk
<h2 class="section-title">Standar Operasional Prosedur (SOP)</h2>
<p class="section-subtitle">Standar Operasional Prosedur untuk
berbagai kebutuhan administrasi
akademik mahasiswa. Gunakan pencarian atau filter untuk menemukan SOP yang Anda butuhkan.
</p>
@@ -1216,7 +1217,6 @@
<div class="sop-search-wrap">
<i class="fas fa-search sop-search-icon"></i>
<input type="search" id="sop-search-input" class="sop-search-input"
data-i18n-placeholder="grp_c4a_sop_search_placeholder"
placeholder="Cari SOP berdasarkan judul..." autocomplete="off" aria-label="Cari SOP" />
<button class="sop-search-clear" id="sop-search-clear" aria-label="Hapus pencarian"
style="display:none;">
@@ -1225,12 +1225,12 @@
</div>
<div class="sop-filter-chips" id="sop-filter-chips" role="group"
aria-label="Filter kategori SOP">
<button class="sop-chip active" data-filter="semua" id="chip-semua" data-i18n="grp_c4a_sop_chip_semua">Semua</button>
<button class="sop-chip active" data-filter="semua" id="chip-semua">Semua</button>
<button class="sop-chip" data-filter="akademik" id="chip-akademik">
<i class="fas fa-graduation-cap"></i> <span data-i18n="grp_c4a_sop_chip_akademik">Akademik</span>
<i class="fas fa-graduation-cap"></i> <span>Akademik</span>
</button>
<button class="sop-chip" data-filter="praktikum" id="chip-praktikum">
<i class="fas fa-flask"></i> <span data-i18n="grp_c4a_sop_chip_praktikum">Praktikum</span>
<i class="fas fa-flask"></i> <span>Praktikum</span>
</button>
</div>
</div>
@@ -1244,8 +1244,8 @@
<!-- EMPTY STATE -->
<div class="sop-empty-state" id="sop-empty-state" style="display:none;">
<i class="fas fa-search-minus sop-empty-icon"></i>
<p class="sop-empty-title" data-i18n="grp_c4a_sop_empty_title">SOP tidak ditemukan</p>
<p class="sop-empty-desc" data-i18n="grp_c4a_sop_empty_desc">Coba kata kunci lain atau reset
<p class="sop-empty-title">SOP tidak ditemukan</p>
<p class="sop-empty-desc">Coba kata kunci lain atau reset
filter pencarian.</p>
<button class="sop-empty-reset" id="sop-empty-reset">
<i class="fas fa-undo"></i> <span data-i18n="grp_c4a_sop_reset_btn">Reset Pencarian</span>
@@ -1268,13 +1268,12 @@
<section class="faq-section-wrap">
<div class="faq-section-inner">
<div class="faq-header reveal">
<div class="section-tag"><span class="dot"></span> <span data-i18n="grp_c4a_faq_tag">Pertanyaan Umum</span></div>
<h2 data-i18n="grp_c4a_faq_title">Pertanyaan yang Sering Diajukan</h2>
<p data-i18n="grp_c4a_faq_subtitle">Temukan jawaban cepat atas pertanyaan umum mahasiswa
<div class="section-tag"><span class="dot"></span> <span>Pertanyaan Umum</span></div>
<h2>Pertanyaan yang Sering Diajukan</h2>
<p>Temukan jawaban cepat atas pertanyaan umum mahasiswa
seputar layanan akademik prodi.</p>
</div>
<div class="faq-wrap" id="faq-container">
<!-- Item FAQ diisi secara dinamis melalui main.js berdasarkan data-faq.json -->
</div>
+1 -1
View File
@@ -48,7 +48,7 @@ async function initApp() {
initAnimations();
}, 100);
} catch (error) {
console.error('Terjadi kesalahan saat menginisialisasi aplikasi C4A:', error);
console.error('Terjadi kesalahan saat menginisialisasi halaman:', error);
}
}
+2 -2
View File
@@ -100,8 +100,8 @@ export function renderStaffCards(staffs) {
const scheduleHTML = schedule.map(sched =>
`<div class="schedule-item">` +
`<span class="s-day">${sched.day}</span>` +
`<span class="s-time">${sched.time} <span class="s-break">| ${sched.break}</span></span>` +
`<span class="s-day">${sched.day}</span>` +
`<span class="s-time">${sched.time} <span class="s-break">| ${sched.break}</span></span>` +
`</div>`
).join('');