update deploy

This commit is contained in:
bulut
2026-03-27 10:41:54 +03:00
parent 69d19c0176
commit 6f6448aa06
422 changed files with 37956 additions and 0 deletions

View File

@@ -0,0 +1,209 @@
# Admin Panel — Eğitim Blokları (Course Blocks)
## Genel Bakış
Eğitim detay sayfalarında artık **Page Builder** mantığı var. Her eğitimin altına sıralı bloklar eklenebilir. Yapı, Page Blocks ile birebir aynı — aynı blok tipleri, aynı `_width` desteği, aynı content JSON formatı.
---
## API Endpoints
Tüm endpoint'ler `auth:sanctum` ile korunuyor. Base URL: `{API_URL}/api/admin`
| Method | Endpoint | Açıklama |
|--------|----------|----------|
| `GET` | `/admin/courses/{course}/blocks` | Eğitimin bloklarını listele |
| `POST` | `/admin/courses/{course}/blocks` | Yeni blok oluştur |
| `GET` | `/admin/courses/{course}/blocks/{block}` | Blok detayı |
| `PUT` | `/admin/courses/{course}/blocks/{block}` | Blok güncelle |
| `DELETE` | `/admin/courses/{course}/blocks/{block}` | Blok sil |
| `POST` | `/admin/courses/{course}/blocks/reorder` | Sıralama güncelle |
---
## GET /admin/courses/{course}/blocks
```json
{
"data": [
{
"id": 1,
"type": "hero",
"content": {
"title": "Köprüüstü Kaynak Yönetimi",
"subtitle": "BRM",
"description": "STCW uyumlu ileri düzey eğitim..."
},
"order_index": 0
},
{
"id": 2,
"type": "text",
"content": {
"_width": "half",
"title": "Eğitim Kapsamı",
"body": "<ul><li>Liderlik</li><li>İletişim</li></ul>"
},
"order_index": 1
}
]
}
```
---
## POST /admin/courses/{course}/blocks — Yeni Blok
### Request:
```json
{
"type": "hero",
"content": {
"title": "Blok başlığı",
"description": "Açıklama..."
},
"order_index": 0,
"is_active": true
}
```
### Response (201):
```json
{
"id": 5,
"type": "hero",
"content": { "title": "Blok başlığı", "description": "Açıklama..." },
"order_index": 0
}
```
### Validation Kuralları:
| Alan | Kural |
|------|-------|
| `type` | required, string, max:50 |
| `content` | present, array (boş obje `{}` gönderilebilir) |
| `order_index` | optional, integer, min:0 (gönderilmezse otomatik son sıraya eklenir) |
| `is_active` | optional, boolean |
---
## PUT /admin/courses/{course}/blocks/{block} — Güncelle
Sadece değişen alanları gönder:
```json
{
"content": {
"_width": "half",
"title": "Güncel Başlık",
"body": "<p>Yeni içerik</p>"
}
}
```
---
## DELETE /admin/courses/{course}/blocks/{block}
```json
{ "message": "Blok silindi." }
```
---
## POST /admin/courses/{course}/blocks/reorder — Sıralama
```json
{
"items": [
{ "id": 3, "order_index": 0 },
{ "id": 1, "order_index": 1 },
{ "id": 2, "order_index": 2 }
]
}
```
```json
{ "message": "Blok sıralaması güncellendi." }
```
---
## Blok Tipleri
Page Blocks ile aynı blok tipleri kullanılır:
| type | Açıklama | Örnek Kullanım |
|------|----------|----------------|
| `hero` | Üst banner/başlık alanı | Eğitim hero bölümü |
| `text` | Zengin metin bloğu | Eğitim kapsamı, açıklama |
| `text_image` | Metin + görsel yan yana | Eğitim tanıtımı |
| `cards` | Kart grid | Özellikler, sertifikalar |
| `stats_grid` | İstatistik/adım kartları | Süre, katılımcı, başarı oranı |
| `cta` | Call-to-action | Kayıt ol butonu |
| `faq` | Sıkça sorulan sorular | Eğitimle ilgili SSS |
| `gallery` | Görsel galeri | Eğitim ortamı fotoğrafları |
| `video` | Video embed | Tanıtım videosu |
| `testimonials` | Yorumlar/referanslar | Mezun görüşleri |
| `html` | Serbest HTML | Özel içerik |
---
## `_width` Desteği
`content` JSON içinde `_width` key'i blok genişliğini belirler:
| Değer | Açıklama |
|-------|----------|
| `"full"` | Tam genişlik (varsayılan — key gönderilmezse otomatik full) |
| `"half"` | Yarım genişlik — ardışık iki half blok yan yana render edilir |
```json
// Yan yana iki blok
{ "type": "text", "content": { "_width": "half", "title": "Sol", "body": "..." }, "order_index": 0 }
{ "type": "stats_grid", "content": { "_width": "half", "title": "Sağ", ... }, "order_index": 1 }
```
---
## Public API — Frontend
`GET /api/v1/courses/{slug}` artık `blocks` array'ini de döner:
```json
{
"data": {
"id": 1,
"slug": "kopruustu-kaynak-yonetimi",
"title": "Köprüüstü Kaynak Yönetimi (BRM)",
"category": { ... },
"blocks": [
{ "id": 1, "type": "hero", "content": { ... }, "order_index": 0 },
{ "id": 2, "type": "text", "content": { "_width": "half", ... }, "order_index": 1 },
{ "id": 3, "type": "stats_grid", "content": { "_width": "half", ... }, "order_index": 2 }
],
"schedules": [ ... ],
...
}
}
```
Frontend, sayfa blokları ile aynı `BlockRenderer` bileşenini kullanabilir.
---
## Admin Panel Entegrasyonu
### Önerilen UI:
Eğitim düzenleme sayfasında (`/admin/courses/{id}/edit`) mevcut form alanlarının altına bir **"Bloklar"** sekmesi/bölümü ekle. Bu bölüm Page Builder ile aynı mantıkta çalışır:
1. Blok listesi `order_index` sıralı gösterilir
2. Sürükle-bırak ile sıralama → `POST .../reorder`
3. "Blok Ekle" butonu → tip seçimi → `POST .../blocks`
4. Blok düzenleme → inline edit veya modal → `PUT .../blocks/{id}`
5. Blok silme → onay dialog → `DELETE .../blocks/{id}`
### Aynı bileşenleri paylaşabilirsin:
Page Blocks için yazdığın `BlockEditor`, `BlockTypeSelector`, `ContentEditor` bileşenlerini **doğrudan** course blocks için de kullan. Sadece API endpoint prefix'i değişir:
- Page: `/admin/pages/{id}/blocks`
- Course: `/admin/courses/{id}/blocks`