Admin Panel
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-09-29 14:57:37 +07:00
parent 04fbddba13
commit 8c6dad2a31
94 changed files with 4864 additions and 1151 deletions
+67 -10
View File
@@ -80,13 +80,33 @@ DB_PASSWORD=password_anda
Sesuaikan `DB_PORT`, `DB_USERNAME`, dan `DB_PASSWORD` dengan instalasi PostgreSQL di komputer Anda.
### 5. Jalankan migrasi
### 5. Atur akun admin pertama
```bash
php artisan migrate
Di `.env`, isi akun admin yang akan dibuat oleh seeder:
```env
ADMIN_NAME=Administrator
ADMIN_EMAIL=admin@probindo.com
ADMIN_PASSWORD=isi-password-yang-kuat
```
### 6. Jalankan aplikasi
Jika `ADMIN_PASSWORD` dikosongkan, seeder membuat password acak dan menampilkannya **sekali** di terminal, jadi segera simpan.
### 6. Jalankan migrasi & isi data awal
```bash
php artisan migrate --seed
```
Seeder membuat:
- akun **Admin** dari `ADMIN_*` di atas (langsung bisa login di **/login**, atau lewat tautan "Admin Panel" di footer website),
- 61 proyek portofolio, 2 kantor, dan kontak perusahaan.
Seeder aman dijalankan ulang: akun admin yang sudah ada tidak diubah (password yang sudah diganti tidak di-reset), dan data konten hanya diisi jika tabelnya masih kosong.
Akun berikutnya ditambahkan dari menu **Pengguna** di admin panel, atau lewat terminal dengan `php artisan admin:create`.
### 7. Jalankan aplikasi
Cara termudah, satu perintah untuk menjalankan server Laravel, queue worker, dan Vite sekaligus:
@@ -124,21 +144,52 @@ Route didefinisikan di `routes/web.php`.
```
resources/js/
├── data/site.ts # Info perusahaan, 2 lokasi kantor, 8 jasa, opsi form
├── data/ # Konstanta perusahaan & helper hitung portofolio
├── layouts/site-layout.tsx # Kerangka halaman: header + konten + footer
├── components/site/ # Komponen UI yang dipakai ulang
│ ├── section.tsx, container.tsx, section-header.tsx, page-hero.tsx
│ ├── button.tsx, card.tsx, feature-card.tsx, step-card.tsx, ...
│ ├── site-header.tsx, site-footer.tsx, theme-toggle.tsx
│ └── sections/ # Section bersama (form konsultasi, grid jasa, CTA)
└── pages/site/ # Halaman, tinggal menyusun section + data
├── pages/site/ # Halaman website, tinggal menyusun section + data
└── pages/admin/ # Halaman admin panel (CMS)
```
- **Ubah kontak atau alamat kantor** cukup di `resources/js/data/site.ts`, otomatis berlaku di semua halaman.
- **Kontak, kantor, portofolio, dan testimoni** disimpan di database dan dikelola dari admin panel (lihat bagian Admin Panel). Jumlah proyek dan klien di website dihitung otomatis dari tabel `projects`.
- **Teks website (Bahasa Indonesia & Inggris)** ada di `resources/js/content/`: satu file per halaman (`home.ts`, `about.ts`, ...) plus `common.ts` untuk navbar, footer, form, dan 8 jasa. Setiap file berisi objek `id` dan `en`; TypeScript akan error bila versi `en` tidak lengkap. Gunakan `**teks**` untuk penekanan dan `==teks==` untuk highlight merah di judul.
- **Bahasa** dipilih lewat tombol ID/EN di navbar dan disimpan di cookie `locale` (default `id`), dibaca oleh middleware `app/Http/Middleware/HandleLocale.php`.
- **Warna tema (light & dark)** ada di `resources/css/app.css`, pada blok `.probindo-site` (light) dan `.dark .probindo-site` (dark).
## Admin Panel (CMS)
Login di `/login`, lalu kelola konten dari sidebar:
| Menu | Fungsi | Tabel |
|---|---|---|
| Inbox Konsultasi | Permintaan dari form konsultasi di Beranda, Jasa, dan Kontak. Status: Baru, Dihubungi, Selesai, plus catatan internal | `consultations` |
| Portofolio | Tambah, ubah, dan hapus proyek. Angka "proyek" dan "klien" di website ikut berubah | `projects` |
| Info Perusahaan | Telepon, WhatsApp, email, dan alamat kantor | `site_settings`, `offices` |
| Testimoni | Testimoni dua bahasa. Bagian testimoni di halaman Klien hanya tampil jika ada yang dipublikasikan | `testimonials` |
| Pengguna | Kelola akun admin panel (hanya Admin) | `users` |
**Peran:** *Admin* bisa mengakses semua menu, termasuk Pengguna. *Editor* bisa mengakses konten dan inbox konsultasi.
### Notifikasi email konsultasi
Setiap permintaan konsultasi baru dikirim ke email busdev (diatur di Info Perusahaan). Email dikirim lewat **queue**, jadi queue worker harus berjalan. `composer dev` sudah menjalankannya; di server jalankan `php artisan queue:work` (misalnya lewat Supervisor).
Secara default `MAIL_MAILER=log`, sehingga email hanya ditulis ke `storage/logs/laravel.log`. Untuk benar-benar mengirim email, isi SMTP di `.env`:
```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=user@probindo.com
MAIL_PASSWORD=********
MAIL_FROM_ADDRESS="no-reply@probindo.com"
MAIL_FROM_NAME="Probindo Website"
```
## Perintah yang Sering Dipakai
| Perintah | Fungsi |
@@ -157,7 +208,11 @@ resources/js/
File `public/hot` tertinggal dari sesi `npm run dev` sebelumnya. Jalankan lagi `npm run dev`, atau hapus `public/hot` lalu `npm run build`.
**Error `could not find driver` saat test**
Ekstensi `pdo_sqlite` belum aktif. Buka `php.ini`, aktifkan `extension=pdo_sqlite`, lalu restart terminal.
Ekstensi `pdo_sqlite` belum aktif. Buka `php.ini`, aktifkan `extension=pdo_sqlite`, lalu restart terminal. Alternatifnya, jalankan test di database PostgreSQL terpisah (jangan pakai database utama, karena test mengosongkan tabel):
```bash
DB_CONNECTION=pgsql DB_DATABASE=probindo_test php artisan test
```
**Error koneksi database saat migrate**
Pastikan PostgreSQL berjalan, database sudah dibuat, dan `DB_*` di `.env` sudah benar. Setelah mengubah `.env`, jalankan `php artisan config:clear`.
@@ -165,6 +220,8 @@ Pastikan PostgreSQL berjalan, database sudah dibuat, dan `DB_*` di `.env` sudah
**Import `@/routes` error di editor**
File route TypeScript di-generate otomatis. Jalankan `php artisan wayfinder:generate` atau `npm run dev`.
## Catatan
**Perubahan kontak/kantor tidak muncul di website**
Info perusahaan di-cache dan otomatis diperbarui saat disimpan dari admin panel. Jika data diubah langsung di database, jalankan `php artisan cache:forget site-info`.
Form konsultasi di halaman Beranda, Jasa, dan Kontak **belum terhubung ke backend**: saat ini hanya menampilkan pesan sukses di browser tanpa menyimpan atau mengirim data.
**Email konsultasi tidak terkirim**
Pastikan queue worker berjalan dan SMTP sudah diisi (lihat Notifikasi email konsultasi). Job yang gagal bisa dilihat dengan `php artisan queue:failed`.