Admin Bileşenleri Stil Rehberi
resources/js/pages/Admin/* altındaki sayfalar için kurallar. Yeni modüllerin mevcut User / Role / ActivityLog / Settings / Files sayfalarıyla aynı görünüm ve davranışı sergilemesi için bu rehberi izle.
Sayfa yerleşimi
resources/js/pages/Admin/<Modül>/
├── Index.vue # Liste (SkDatatable)
├── Create.vue # Opsiyonel — yalnızca ayrı rota gerekiyorsa
├── Edit.vue # Opsiyonel — yalnızca ayrı rota gerekiyorsa
└── components/
└── <Modül>Form.vue # Create/Edit tarafından kullanılan SkForm sarmalayıcı
Çoğu modül dialog tabanlı create/edit ile Index.vue içinde çözülür (bkz. Users/Index.vue). Form dialog'a sığmıyorsa (çok adımlı, medya, uzun form) Create.vue / Edit.vue'ye geç.
Form akışları — birini seç, karıştırma
| Durum | Kullan | Endpoint tipi | Neden |
|---|---|---|---|
| Dialog veya Inertia sayfasında admin CRUD | SkForm + FormBuilder |
back() / redirect() dönen Inertia controller |
SkForm içeride Inertia'nın useForm'unu sarmalar; validation hataları Laravel FormRequest yanıtından otomatik gelir; success/cancel event'leri dialog yaşam döngüsünü yönetir |
| Programatik tek-seferlik API çağrısı (satır aksiyonu, toplu işlem, form dışı mutation) | useApi() |
to_api() / ApiResponse dönen controller |
Unwrap'lı data döner, başarısızlıkta toast + ApiError fırlatır |
| Küçük JSON payload okuma (select seçenekleri, stat widget) | useApi().get() |
ApiResponse::success(...) |
Aynısı; veri zaten Inertia prop'uyla geliyorsa atla |
SkForm submit etmek için useApi() kullanma. Elle fetch() yazma — toast/hata hattını atlar.
Datatable
- Frontend:
SkDatatable+DB.table<T>()builder (bkz. datatable.tr.md) - Backend:
app/Domain/<Modül>/Queries/altında bir*DatatableQuerysınıfındaDatatableQueryBuilder::for(Model::class) - Benzersiz bir
refresh-keyver ki dialoglar mutation sonrasıuseRefreshBus().refresh(key)çağırabilsin
Zengin metin içeriği
Kullanıcı tarafından yazılan her HTML içerik için (hoş geldin mesajı, duyuru banner'ları, pazarlama metni, zengin açıklamalar) FB.editor() alanını backend'deki App\Support\HtmlSanitizer ile birlikte kullan. İçeriği hem yazma yolunda (FormRequest prepareForValidation hook'u) hem de okuma yolunda (controller'da Inertia'ya paylaşmadan önce) sanitize et; sk-prose konteyneri içinde v-html ile render et. DB'deki ham editor HTML'ini asla doğrudan tarayıcıya aktarma — bkz. FormBuilder Editor alan API'si.
Dialog ve onaylar
- Modal formlar için
@lvntr/components/ui/AppDialog.vue'denAppDialog - Yıkıcı aksiyonlar (silme, pasifleştirme) için
useConfirm().accept'i mutation'a bağla. - Template-level
v-modelistemiyorsan imperatif dialog state içinuseDialog()
Geri bildirim
- Mutation başarı toast'ı: ya component'ten emit et, ya da Laravel flash session kullan (Inertia yanıtında
useFlash()otomatik yakalıyor) - Mutation başarısızlık toast'ı: zaten
useApi()/SkFormyönetiyor — ikinci toast ekleme - Validation hataları:
SkFormsatır içinde gösteriyor; toast'ta tekrarlama
İzin kontrolleri
- Template'te:
v-can="'users.update'"/v-role="'admin'"direktifleri - Script'te:
const { can, hasRole } = useCan() - Otoriter kontrol sunucu tarafında — client check sadece UX içindir
Definitions (enum / dropdown)
-
useDefinition()çağrısını sayfaonMounted'inde yap, loop içinde değil -
Bir mutation definition setini geçersiz kılıyorsa (örn. rol listesi değişti),
useDefinition().invalidate('roles')çağır veya refresh bus'a bağla:const { invalidate } = useDefinition(); const bus = useRefreshBus(); bus.on('roles-updated', () => invalidate('roles'));
Frontend'de rotalar
Her zaman Wayfinder fonksiyonlarını kullan — asla /admin/... string'i yazma.
import users from '@/routes/users';
DB.table<UserRow>().route(users.dtApi.url());
Yeni admin modül için hızlı kontrol listesi
- Domain scaffold:
php artisan make:sk-domain <İsim> - Backend:
*DatatableQuery+ FormRequest + Action'lar + Event'ler - Frontend
Index.vue:refresh-key'liSkDatatable, aksiyonlar dialog'lara bağlı <Modül>Form.vue: FormBuilder config'liSkForm;success/cancelemit'leri- İzinler:
config/permission-resources.php'ye resource girişi,sk:seed-permissions --fresh - Çeviriler:
lang/{en,tr}/<modül>.php - Testler: liste + create + update + delete için Feature test