Proje: Okul.com.tr CRM · Hub: Okul.com.tr CRM — Domain

CRM Konum Sistemi

Location Entity

interface Location {
    id: number;
    name: string;
    slug: string;
    status: boolean;
    parent_id: number | null;  // üst konum
    view_order?: number;
    parent?: Location | null;
    children?: Location[];
}

Hiyerarşi

Konum 3 seviyeli ağaç yapısındadır:

  • Seviye 1 (location-1): Şehir (il)
  • Seviye 2 (location-2): İlçe
  • Seviye 3 (location-3): Mahalle

parent_id null → üst seviye konum (şehir).

NULL Filtresi — Önemli API Değişikliği (2026-04-17)

filter[parent_id]='' artık çalışmıyor. Şehirleri (parent_id IS NULL) çekmek için:

// YANLIŞ — API ignore ediyor
'filter[parent_id]': ''
 
// DOĞRU
'nulls[]': 'parent_id'

Bu API genelinde geçerli: HasNulls trait + includeNulls() olan tüm endpoint’lerde aynı pattern. → 2026-04-17-null-filter-api-degisimi

API Filter Eşlemesi

Okul filtrelemede:

filter[location-1] → şehir ID
filter[location-2] → ilçe ID
filter[location-3] → mahalle ID

HierarchicalLocationForm

src/components/common/HierarchicalLocationForm.tsx — üç seviyeli cascading select. Parent seçilince child seçenekleri yüklenir.

LocationSelector

src/components/common/LocationSelector.tsx — tek konum seçme bileşeni. Province/county/neighbourhood üçlüsü.

Okul Konumu Include’ları

location
location.province      → il (şehir)
location.county        → ilçe
location.neighbourhood → mahalle

useLocationFilter / useLocationSelector Hooks

src/hooks/useLocationFilter.ts — liste sayfalarında şehir/ilçe/mahalle hiyerarşik filtresi için. src/hooks/useLocationSelector.ts — form’larda konum seçimi için.