feat: implement queue display system with localized store, composables, and administrative dashboard pages

This commit is contained in:
Fanrouver
2026-06-02 09:14:38 +07:00
parent ffdb88d13c
commit 047b39064d
12 changed files with 2345 additions and 46 deletions
+581
View File
@@ -0,0 +1,581 @@
# 📓 DEVLOG — Development Log
**Project:** Web Antrean — Sistem Manajemen Antrean Rawat Jalan RSSA
**Author:** Akbar
**Stack:** JavaScript · Vue 3 · TypeScript · Nuxt 3 · Vuetify 3 · Pinia
---
## 🧠 AI Prompt — Cara Menggunakan Dokumen Ini
> Salin prompt berikut ke Claude untuk membantu mengisi DEVLOG harian:
```
Kamu adalah technical writer. Bantu aku menulis DEVLOG untuk hari ini.
Context:
- Project: Web Antrean — Sistem Manajemen Antrean Rawat Jalan RSSA
- Stack: Nuxt 3, Vue 3, TypeScript, Vuetify 3, Pinia, WebSocket, Keycloak
- Yang dikerjakan hari ini: [ceritakan bebas]
- Masalah yang ditemui: [ceritakan]
- Solusi yang diterapkan: [ceritakan]
Format output:
## [Tanggal] — [Judul Singkat]
**Yang dikerjakan:** ...
**Keputusan teknis:** ...
**Masalah & solusi:** ...
**Besok:** ...
```
---
## Format Entry
```markdown
## [YYYY-MM-DD] — [Judul Singkat Pekerjaan]
**Sprint/Phase:** [nama sprint atau fase]
**Durasi:** [X jam]
**Status:** ✅ Done | 🔄 In Progress | ⏸ Blocked
### Yang Dikerjakan
- ...
### Keputusan Teknis
> Jelaskan keputusan arsitektur/implementasi penting dan alasannya
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| | | |
### Besok
- [ ] ...
### Referensi
- [link]
```
---
## Log Entries
<!-- Tambahkan entry baru di bawah baris ini, urutan terbaru di atas -->
---
## 2026-05-25 — Perbaikan & Dokumentasi Project
**Sprint/Phase:** Phase 5 — Stabilisasi & Dokumentasi
**Durasi:** ~4 jam
**Status:** 🔄 In Progress
### Yang Dikerjakan
- Push perbaikan berbagai bug (`ffdb88d`)
- Pembuatan dokumentasi project: PRD, QMD, DEVLOG
- Stabilisasi WebSocket sync dengan deterministic client ID
- Penambahan polling fallback 30 detik di semua admin interface
### Keputusan Teknis
> Membuat dokumentasi lengkap (PRD, QMD, DEVLOG) untuk meningkatkan maintainability project ke depan. Semua dokumen diisi berdasarkan kondisi aktual project, bukan template kosong.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Dokumentasi project belum ada | Buat PRD, QMD, DEVLOG di folder `docs/` | — |
### Besok
- [ ] Review dan finalisasi dokumen
- [ ] Lanjutkan stabilisasi fitur penunjang
---
## 2026-05-22 — Stabilisasi WebSocket & Tooltips Dashboard
**Sprint/Phase:** Phase 5 — Stabilisasi
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Standardisasi header konfigurasi (origin & referer) di `stats-api`, `visit-api`, `klinik-api` ke `http://10.10.150.175:3000`
- Penambahan tooltips di komponen Dashboard
- Standardisasi WebSocket client ID menjadi deterministic untuk reliable cross-device messaging
- Implementasi polling fallback 30 detik di semua admin interface
- Audit semua halaman yang bergantung WebSocket
### Keputusan Teknis
> WebSocket client ID diubah dari random ke deterministic agar server bisa menargetkan pesan ke device tertentu. Polling 30 detik ditambahkan sebagai safety net jika WebSocket disconnect — ini menghindari data drift antar display.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Header origin/referer tidak konsisten antar proxy route | Standardisasi ke `http://10.10.150.175:3000` di semua route handler | `server/routes/` |
| Data antrean tidak sinkron antar display saat WS drop | Polling fallback 30 detik + deterministic WS client ID | `useWebSocket.ts` |
---
## 2026-05-21 — Perbaikan Layar Info & Isolasi Loket
**Sprint/Phase:** Phase 5 — Stabilisasi
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Fix: info klinik ruang tidak muncul di layar informasi (`ec9dac0`)
- Isolasi state `currentProcessingPatient` menggunakan unique storage key per loket
- Perbaikan `processNextQueue` dan `callNext` — strict filter berdasarkan `loketId`
- Validasi WebSocket event handler agar tidak ada update lintas loket yang tidak sah
- Memastikan `allPatients` tetap single source of truth
### Keputusan Teknis
> Masalah kritis: loket A memproses pasien loket B karena `currentProcessingPatient` menggunakan key yang sama. Solusi: setiap loket mendapat unique persisted state key (`currentPatient_loket_{id}`).
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Cross-loket interference pada `currentProcessingPatient` | Unique storage key per loket di persisted state | `queueStore.js` |
| `processNextQueue` memproses pasien dari loket lain | Strict filter berdasarkan `loketId` dan service mapping | `useQueue.js` |
| WebSocket event mengupdate loket yang salah | Guard check di event handler | `useWebSocket.ts` |
---
## 2026-05-20 — Subspesialis & Perbaikan Bug Loket
**Sprint/Phase:** Phase 4 — Fitur Eksekutif
**Durasi:** ~7 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Penambahan fitur subspesialis di PatientCard (`1446e87`)
- Display subspesialis sebagai pill/chip di samping status badge
- Perbaikan bug tampilan loket (`f622052`)
- UI enhancement: PatientCard menampilkan info ruang/subspesialis secara kondisional
### Keputusan Teknis
> Subspesialis ditampilkan sebagai pill/chip di PatientCard agar admin klinik bisa langsung melihat spesialisasi pasien tanpa perlu buka detail. Conditional rendering — tampilkan ruang ATAU subspesialis, tergantung data yang tersedia.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Info subspesialis tidak tampil di card pasien | Tambah conditional pill/chip di `PatientCard.vue` | `components/features/queue/PatientCard.vue` |
| Bug tampilan loket | Fix layout dan data binding | `pages/AdminLoket.vue` |
---
## 2026-05-19 — Docker & Anjungan Eksekutif
**Sprint/Phase:** Phase 4 — Fitur Eksekutif & Deployment
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Penambahan Dockerfile dan docker-compose untuk deployment (`bc74b98`)
- Refinement UI anjungan eksekutif — pilihan subspesialis
- Peningkatan kontras dan visibilitas button seleksi (border tebal, shadow, hover state)
- Implementasi handler function untuk selection state yang robust
### Keputusan Teknis
> Docker ditambahkan untuk standardisasi deployment. Anjungan eksekutif mendapat UI khusus dengan radio-style button yang lebih intuitif — target user adalah pasien dengan tech level rendah, jadi kontras dan ukuran harus maksimal.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Deployment manual dan tidak konsisten | Dockerfile + docker-compose | `Dockerfile`, `docker-compose.yml` |
| Button seleksi subspesialis kurang kontras | Thicker border, deeper shadow, distinct hover/selected state | Anjungan pages |
---
## 2026-05-18 — Optimasi Performa & Memory
**Sprint/Phase:** Phase 5 — Stabilisasi
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Perbaikan memory usage dan load performance (`cb3310b`)
- Verifikasi status kunjungan operasi
- Pengecekan semua API endpoint yang sudah terintegrasi
- Pembersihan `console.log` verbose di high-frequency path
### Keputusan Teknis
> Mengurangi memory footprint dengan: (1) membersihkan verbose logging di WebSocket handler dan QR scanner, (2) implementasi blacklist untuk endpoint yang terus-menerus gagal agar tidak spam request.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| `doctorStore.js` terus retry endpoint yang 500 | Implementasi blacklist endpoint gagal | `stores/doctorStore.js` |
| `console.log` verbose di `useWebSocket.ts` | Cleanup logging di high-frequency path | `composables/useWebSocket.ts` |
| Memory usage terus naik | Reduce excessive API retry + cleanup logging | — |
---
## 2026-04-20 — Update Hak Akses & Perbaikan Tiket
**Sprint/Phase:** Phase 3 — Hak Akses & Permission
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Update sistem hak akses berbasis Keycloak role & group (`2bf00ef`)
- Perbaikan API pembuatan tiket antrean
- Standardisasi user role slugs dari Keycloak groups
- Implementasi slugification utility untuk role normalization
### Keputusan Teknis
> Role dari Keycloak group path (`/Instalasi STIM/Devops/Superadmin`) di-slugify menjadi URL-friendly (`instalasi-stim-devops-superadmin`) untuk konsistensi di permission API dan internal user data.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Role dari Keycloak tidak URL-friendly | Implementasi slugification utility | `composables/useHakAkses.ts` |
| Tiket antrean gagal digenerate | Perbaikan API endpoint pembuatan tiket | `server/api/` |
---
## 2026-04-15 — Update Favicon
**Sprint/Phase:** Phase 3 — Polish
**Durasi:** ~1 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Ganti favicon aplikasi web-antrean
- Update konfigurasi `app.head` di `nuxt.config.ts` untuk mengarah ke file icon baru
### Keputusan Teknis
> Favicon diletakkan di folder `public/` dan direferensi via `nuxt.config.ts` → `app.head.link`.
---
## 2026-04-13 — Integrasi Keycloak Role Access
**Sprint/Phase:** Phase 3 — Hak Akses & Permission
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Verifikasi dan standardisasi akses Keycloak role
- Implementasi middleware `auth.ts`, `guest.ts`, `permissions.ts`, `checkPageAccess.ts`
- Setup permission store (`permissionStore.ts`)
- Integrasi permission API endpoint (`server/api/permission.get.ts`)
### Keputusan Teknis
> Menggunakan 4 layer middleware: (1) `auth.ts` — cek login, (2) `guest.ts` — redirect jika sudah login, (3) `permissions.ts` — cek hak akses halaman, (4) `checkPageAccess.ts` — validasi granular per page. Model ini memastikan defense-in-depth untuk access control.
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Role dari Keycloak format path, bukan slug | Konversi ke slug untuk matching di permission API | `middleware/permissions.ts` |
---
## 2026-02-24 — Perbaikan Ambil Tiket
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~4 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Fix bug pengambilan tiket antrean di anjungan (`94ff9f5`)
- Perbaikan flow generate nomor antrean
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Tiket gagal digenerate pada kondisi tertentu | Fix logic generate nomor antrean | `composables/useQRGenerator.ts` |
---
## 2026-02-19 — Implementasi Anjungan (Kiosk) & Queue Store
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~10 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi modul Anjungan (Kiosk) lengkap (`0c4019c`)
- Halaman pilih klinik, klinik ruang, penunjang
- Halaman antrian per klinik, klinik ruang, penunjang
- Check-in pasien via QR
- Admin anjungan
- Implementasi Pinia store baru untuk queue management (`4342cdc`)
- Integrasi dengan Visit API dan Antrian API
- WebSocket integration untuk real-time update
- Halaman admin dan kiosk display
### Keputusan Teknis
> `queueStore.js` dibuat sebagai central store untuk semua operasi antrean — ini menjadi single source of truth untuk `allPatients`. Keputusan ini mempermudah sinkronisasi real-time tapi membuat file menjadi sangat besar (saat ini 141KB). Perlu dipecah di masa depan.
---
## 2026-02-18 — Core Anjungan Display & Verification
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi core display system anjungan (`7d07a4f`)
- Display antrean klinik ruang
- Display antrean masuk
- Display antrean loket
- Tambah verification store dan konfigurasi endpoint baru (`f78bbea`)
- `verificationApiBaseUrl``http://10.10.123.140:8089/api/v1`
- `ekstrakExpertiseUrl` endpoint
- Fix wsBaseUrl fallback di Nuxt config (`d03fa63`)
### Keputusan Teknis
> Dual backend API architecture: Visit API (port 8084) untuk data kunjungan utama, Antrian API (port 8089) untuk verifikasi dan data klinik/dokter. Proxy layer Nitro digunakan untuk bypass CORS dan menyembunyikan IP backend dari client.
---
## 2026-02-13 — Admin Loket, Klinik Ruang & Queue Management
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~10 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi halaman Admin Loket detail (`8c6b3fd`)
- Manajemen antrian pasien per loket
- Aksi pasien: panggil, skip, recall, selesai
- Dialog seleksi (pilih loket, pilih layanan)
- Implementasi `AdminKlinikRuang` page (`67a5514`)
- Manajemen antrian per klinik ruang
- Processing, calling, filtering, global search
- Implementasi komprehensif patient queue management (`dbc9054`)
- Pinia store untuk queue
- API integration
- Admin counter page
- Tambah komponen `PatientCard`, `CurrentPatientCard` (`95ff830`)
- Fitur queue management untuk klinik ruang dan counter (`4df13cb`)
### Keputusan Teknis
> Memisahkan queue components menjadi 4 komponen: `PatientCard` (card per pasien), `CurrentPatientCard` (pasien sedang dilayani), `QueueActionsCard` (tombol aksi), `TabelPatientData` (tabel lengkap). Ini memastikan reusability di halaman admin loket, klinik, dan penunjang.
---
## 2026-02-12 — Anjungan Pages, WebSocket & Queue API
**Sprint/Phase:** Phase 2 — Fitur Inti
**Durasi:** ~10 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Introduce halaman Anjungan untuk antrian klinik, klinik ruang, dan counter (`a5ab338`)
- Tambah halaman check-in pasien
- Implementasi core queue management system dengan WebSocket (`0e3ee37`)
- Pinia store untuk queue
- WebSocket integration
- Halaman check-in dan kiosk display
- Update post API klinik dan loket di queueStore (`4985aef`)
- Fix status pasien selesai di klinik ruang (`c08941a`)
- Various merge dan bugfix
### Keputusan Teknis
> WebSocket dipilih sebagai primary communication channel untuk real-time sync karena latensi < 2 detik krusial di rumah sakit — pasien harus langsung melihat nomor panggil berubah di layar display.
---
## 2026-02-1011 — WebSocket Bug Fixing
**Sprint/Phase:** Phase 2 — Stabilisasi WebSocket
**Durasi:** ~12 jam (2 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Fix bug WebSocket di check-in loket (`b6dc252`)
- Fix socket check-in flow (`e686dda`)
- Update socket data dan token handling (`fb70237`)
- Fix duplikasi data dan ticket menghilang di admin klinik loket (`c02905e`)
- Update WS untuk admin loket dan check-in (`a7a654b`)
- Fix missing function error (`23164bc`)
- Perbaikan sorting pasien di next process (`6af3f58`)
### Masalah & Solusi
| Masalah | Solusi | Referensi |
|---------|--------|-----------|
| Duplikasi tiket di admin klinik | Fix logic deduplication di WebSocket handler | `useWebSocket.ts` |
| Tiket menghilang setelah check-in | Fix state update flow — pastikan re-render setelah WS event | `queueStore.js` |
| Socket check-in tidak trigger update | Fix event listener binding | `composables/useCheckIn.ts` |
---
## 2026-02-09 — Integrasi WebSocket
**Sprint/Phase:** Phase 2 — Real-time
**Durasi:** ~6 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Setup dan implementasi WebSocket client (`101dc38`)
- Koneksi ke `ws://10.10.123.135:8084/api/v1/ws`
- Implementasi `useWebSocket.ts` composable
### Keputusan Teknis
> Menggunakan native browser WebSocket API dibungkus composable (`useWebSocket.ts`) daripada library seperti `socket.io` — mengurangi dependency dan lebih ringan untuk environment LAN internal.
---
## 2026-02-0206 — API Integration & Display Screen
**Sprint/Phase:** Phase 2 — Integrasi API
**Durasi:** ~20 jam (5 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update tampilan layar screen display (`cf54ded`)
- Penambahan API klinik ruang (`a29838e`, `b327997`, `c2d9023`)
- Update logika pemanggilan admin loket by payment (`efeb42e`)
- Fix HTTPS implementation dan check-in (`c899a71`)
- Update session dan WebSocket (`0428017`)
- Update status klinik ruang (`6696881`)
- Update tampilan anjungan (`329ac9c`)
- Fixing admin loket dan blokade loket yang tidak tersedia (`5d139c8`)
- Update verifikasi dan lainnya (`2838016`)
- Update post API status dan data pasien ruang (`e2a5d43`)
### Keputusan Teknis
> Logika pemanggilan admin loket diubah menjadi payment-based — pasien yang sudah bayar diprioritaskan. Loket yang tidak tersedia di-blokade otomatis agar petugas tidak melihat loket yang bukan tanggung jawabnya.
---
## 2026-01-2830 — Master Data & API Queue Store
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~12 jam (3 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update master data berdasarkan jenis layanan (`9f0f6a7`)
- Update API antrean masuk dan minor changes (`507f415`)
- Fix session dan tampilan screen (`8dd94ed`)
- Fix loop dan duplikasi data (`0bd5311`)
- Update fetch API (`cccefb0`)
- Update layout semua halaman (`ae8b06d`)
- Update queueStore dari API (`19633af`)
- Minor update anjungan (`59e42f3`)
---
## 2026-01-2227 — Admin Loket & API Integrasi
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~16 jam (4 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update logika penarikan API dan tampilan anjungan (`e900c5a`)
- Update No RM dan desain (`2ccb378`)
- Update API master loket dan antrian loket (`75a9638`)
- Update anjungan (`8de89cb`)
- Update master klinik ruang (`6c08352`)
- Update sidebar check-in dan antrian loket (`525322b`)
- Update API loket admin (`083fe3e`)
- Push update admin loket (`f606045`)
---
## 2026-01-1921 — Layout, Sidebar, Dashboard & Monitoring
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~20 jam (3 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update flow klinik ruang dan design consistency (`cbd8f44`)
- Update sidebar, profile, dan loket (`f2efd83`)
- Update loket dan monitoring (`81b877b`, `c00c18e`)
- Update page header komponen (`00bb954`)
- Sidebar change (`3db912a`)
- Update header, card, dialog (`fde7111`, `531ca10`, `f7a3b20`)
- Perubahan update sidebar, dashboard, monitoring, antrean loket, verifikasi (`bb71955`)
- Update check-in tampilan dan function (`482294b`)
### Keputusan Teknis
> Layout system menggunakan Vuetify navigation drawer (`SideBar.vue`) + custom `PageHeader.vue`. Design consistency diterapkan via SCSS variables (`_variables.scss`, `_colors.scss`) untuk warna, spacing, dan typography.
---
## 2026-01-15 — Login Page, Check-in & Antrean Masuk
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~8 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi login page dan check-in (`e99a0ab`)
- Update color palette dan konsultasi pasien (`a8a55b9`)
- Tampilan antrean masuk (`ed57e2d`)
- Edit manual check-in (`928be7c`)
- Update logika pemanggilan, sticky konten, tampilan card (`96c6376`)
- Perbaikan generate dan scan tiket QR (`8aa5ab2`)
### Keputusan Teknis
> QR code digunakan untuk tiket antrean — pasien mendapat QR saat ambil antrean, lalu scan QR saat check-in. Library `html5-qrcode` dipilih untuk scanner dan `qrcode.vue` untuk generator.
---
## 2026-01-1214 — Loket, Klinik Ruang & Fast Track
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~16 jam (3 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Update layout klinik dan WebSocket layar klinik (`6e7160c`)
- Update klinik ruang dan status fast track (`27209de`)
- Perubahan tiket dan alur antrean (`5c14227`)
- Push loket baru (`42fe62c`)
- Loket perbaikan "sedang dilayani" (`48e4aab`)
- Anjungan fast track dan tampilan ruang (`3817b2d`)
- Perbaikan loket dan total antrean (`a000ba0`, `0a8e11a`, `9ccbaba`)
- Check-in tampilan (`0c7b33a`)
- Fixing layar loket dan status pasien (`e80032f`)
- QRcode update (`6c80c08`)
- Update warna dan klinik ruang (`f3e90ad`)
- Perubahan antrean masuk (`c5b623f`)
- Update seed data dan fungsi pindah/konsul klinik (`89c3549`)
---
## 2026-01-0809 — Klinik Ruang, QR & Print
**Sprint/Phase:** Phase 1 — Fondasi
**Durasi:** ~12 jam (2 hari)
**Status:** ✅ Done
### Yang Dikerjakan
- Layar baru antrean klinik dan antrean masuk (`2d3d589`)
- Update klinik ruang (`ca5913c`)
- Nav items (`8a4bb44`)
- Update print admin loket, logika klinik ruang, numbering antrian baru (`676bdc0`)
- Update QR function (`22d7205`)
- Perubahan format No Antrean (`6d5d565`)
- Check-in footers detail (`1b7a142`)
- Klinik ruang dan update admin loket (`9ea8300`)
### Keputusan Teknis
> Format nomor antrean: `[KodeKlinik]-[NomorUrut]` (contoh: `PDL-001`). Thermal print diimplementasi via `useThermalPrint.ts` composable untuk cetak tiket langsung dari browser ke printer thermal via Web API.
---
<!-- Tambahkan entry baru di atas baris ini, urutan terbaru di atas -->
---
## 📊 Summary Stats
| Metrik | Value |
|--------|-------|
| Total hari dev | ~50+ hari (Jan 2026 — Mei 2026) |
| Fase project | 5 fase (Setup → Fondasi → Hak Akses → Eksekutif → Stabilisasi) |
| Fitur selesai | 8 modul utama (Anjungan, Check-in, Loket, Klinik, Penunjang, Dashboard, Setting, Hak Akses) |
| Total commits | 80+ commits |
| Bug ditemukan | 15+ (WebSocket, loket interference, memory, display sync) |
| Bug diselesaikan | 15+ |
| Halaman dibuat | 28 halaman |
| Composables | 16 composable |
| Pinia Stores | 13 stores |
| Komponen | 20+ komponen |