Proje: Okul.com.tr CRM · Hub: Okul.com.tr CRM — Conventions
CRM URL Tabanlı Filtreleme
Neden URL Tabanlı
- Filtreler, arama, sayfa, sıralama URL’e yazılır
- Paylaşılabilir/bookmarkable link’ler
- Browser geri/ileri navigasyonu çalışır
useUrlFilters Hook
useListFilters’ın alt katmanı. Doğrudan kullanmak yerine useListFilters tercih edilir.
URL Parametreleri
search→ arama metnipage→ mevcut sayfaper_page→ sayfa boyutusort_col+sort_dir→ sıralamafilter[<name>]→ her filtre için ayrı parametre
Metotlar
updateSearch(value: string)
updatePage(page: number)
updatePageCount(count: number)
updateSort({ column, direction })
updateFilters(filters: Record<string, string>)
clearFilters()
initializeFiltersFromUrl(initialFilters) → GenericFilter[]buildApiParams Dönüşümü
URL’deki filter[school-type] → API’ye filter[school-type]: value olarak gönderilir.
dateRange tipi filtreler özel işlenir:
- URL değeri:
"2024-01-01,2024-12-31"(virgülle ayrılmış min,max) - API’ye:
filter[date][min]vefilter[date][max]olarak iki ayrı parametre
ISO format tarihler otomatik YYYY-MM-DD’ye dönüştürülür.
filterKeyMappings Kullanım Amacı
UI’da kullanıcı dostu isimler ile API’nin beklediği parametre adları farklı olabilir:
// Okullar sayfasındaki örnek
const FILTER_KEY_MAPPINGS = {
'city': 'location-1', // Şehir → location level 1
'district': 'location-2', // İlçe → location level 2
'neighborhood': 'location-3', // Mahalle → location level 3
'school_name': 'school-name' // underscore → kebab-case
};displayFilters (Aktif Filtre Badge’leri)
UI’da gösterilen aktif filtreler için:
interface DisplayFilter {
id: string; // filter key
filterLabel: string; // human-readable label (örn: "Şehir")
value: string; // raw value
label: string; // display value (select'lerde option.label kullanılır)
}user-search, admin-search, school-search tipi filtreler için filter.displayValue kullanılır (ID değil isim gösterilir).
Sync Mantığı
URL değiştiğinde (back/forward), useEffect ile setFilters tekrar çağrılır. Sonsuz döngü önlemek için prevUrlFiltersRef ve prevInitialFiltersRef ref’leri kullanılır.
Related
- liste-sayfasi-pattern — useListFilters kullanımı
- servis-katmani — buildApiParams sonucunu kullanan getWithParams