@nar-bus/ui-kit 1.34.1 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Button-B_PvZOyI.js → Button-QiaEzRWh.js} +1 -0
- package/dist/atoms/Badge.d.ts.map +1 -1
- package/dist/atoms/Button.d.ts +2 -0
- package/dist/atoms/Button.d.ts.map +1 -1
- package/dist/atoms/Icon.d.ts +5 -3
- package/dist/atoms/Icon.d.ts.map +1 -1
- package/dist/atoms/Input.d.ts.map +1 -1
- package/dist/atoms/RadioGroup.d.ts +6 -0
- package/dist/atoms/RadioGroup.d.ts.map +1 -1
- package/dist/atoms/Select.d.ts +8 -0
- package/dist/atoms/Select.d.ts.map +1 -1
- package/dist/atoms/Tooltip.d.ts +21 -1
- package/dist/atoms/Tooltip.d.ts.map +1 -1
- package/dist/atoms/index.d.ts +1 -1
- package/dist/atoms/index.d.ts.map +1 -1
- package/dist/hooks/useBreadcrumb.d.ts +1 -0
- package/dist/hooks/useBreadcrumb.d.ts.map +1 -1
- package/dist/i18n/en.json.d.ts +1103 -1071
- package/dist/i18n/resources.d.ts +64 -0
- package/dist/i18n/resources.d.ts.map +1 -1
- package/dist/i18n/resources.js +1 -1
- package/dist/i18n/tr.json.d.ts +1103 -1071
- package/dist/index.d.ts +8 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6600 -4721
- package/dist/map.js +1 -1
- package/dist/molecules/ChartFrame.d.ts +37 -0
- package/dist/molecules/ChartFrame.d.ts.map +1 -0
- package/dist/molecules/CopyableText.d.ts.map +1 -1
- package/dist/molecules/DetailPanel.d.ts +16 -0
- package/dist/molecules/DetailPanel.d.ts.map +1 -0
- package/dist/molecules/DetailTabs.d.ts +32 -0
- package/dist/molecules/DetailTabs.d.ts.map +1 -0
- package/dist/molecules/DistributionBar.d.ts +15 -0
- package/dist/molecules/DistributionBar.d.ts.map +1 -0
- package/dist/molecules/DistributionPanel.d.ts +34 -0
- package/dist/molecules/DistributionPanel.d.ts.map +1 -0
- package/dist/molecules/HtmlPreview.d.ts +13 -0
- package/dist/molecules/HtmlPreview.d.ts.map +1 -0
- package/dist/molecules/KpiCard.d.ts.map +1 -1
- package/dist/molecules/LaneChart.d.ts +71 -0
- package/dist/molecules/LaneChart.d.ts.map +1 -0
- package/dist/molecules/MetricTile.d.ts.map +1 -1
- package/dist/molecules/MiniBars.d.ts +17 -0
- package/dist/molecules/MiniBars.d.ts.map +1 -0
- package/dist/molecules/PulseRail.d.ts +15 -0
- package/dist/molecules/PulseRail.d.ts.map +1 -0
- package/dist/molecules/RecordHeaderActions.d.ts +17 -0
- package/dist/molecules/RecordHeaderActions.d.ts.map +1 -0
- package/dist/molecules/RhythmGrid.d.ts +54 -0
- package/dist/molecules/RhythmGrid.d.ts.map +1 -0
- package/dist/molecules/RitimStrip.d.ts +13 -0
- package/dist/molecules/RitimStrip.d.ts.map +1 -0
- package/dist/molecules/SegmentedChoice.d.ts +14 -0
- package/dist/molecules/SegmentedChoice.d.ts.map +1 -0
- package/dist/molecules/StatusGlyph.d.ts +10 -0
- package/dist/molecules/StatusGlyph.d.ts.map +1 -0
- package/dist/molecules/ToggleChips.d.ts +22 -0
- package/dist/molecules/ToggleChips.d.ts.map +1 -0
- package/dist/molecules/comboboxPanel.d.ts.map +1 -1
- package/dist/molecules/index.d.ts +15 -0
- package/dist/molecules/index.d.ts.map +1 -1
- package/dist/organisms/DataTable/DataTableHeader.d.ts.map +1 -1
- package/dist/organisms/DataTable/DataTableRow.d.ts +2 -1
- package/dist/organisms/DataTable/DataTableRow.d.ts.map +1 -1
- package/dist/organisms/DataTable/DataTableSelection.d.ts.map +1 -1
- package/dist/organisms/DataTable/RowActionsCell.d.ts.map +1 -1
- package/dist/organisms/DataTable/cellFilter.d.ts +18 -0
- package/dist/organisms/DataTable/cellFilter.d.ts.map +1 -0
- package/dist/organisms/DataTable.d.ts +4 -1
- package/dist/organisms/DataTable.d.ts.map +1 -1
- package/dist/organisms/DataTable.types.d.ts +8 -0
- package/dist/organisms/DataTable.types.d.ts.map +1 -1
- package/dist/organisms/EditableGrid/EditableGrid.d.ts +12 -1
- package/dist/organisms/EditableGrid/EditableGrid.d.ts.map +1 -1
- package/dist/organisms/EditableGrid/EditableGridCell.d.ts.map +1 -1
- package/dist/organisms/EditableGrid/index.d.ts +1 -1
- package/dist/organisms/EditableGrid/index.d.ts.map +1 -1
- package/dist/organisms/FilterPanel.d.ts +51 -1
- package/dist/organisms/FilterPanel.d.ts.map +1 -1
- package/dist/organisms/JsonEditor.d.ts +16 -0
- package/dist/organisms/JsonEditor.d.ts.map +1 -1
- package/dist/organisms/JsonFormView.d.ts +25 -0
- package/dist/organisms/JsonFormView.d.ts.map +1 -0
- package/dist/organisms/Sheet.d.ts +5 -0
- package/dist/organisms/Sheet.d.ts.map +1 -1
- package/dist/organisms/Sidebar.d.ts.map +1 -1
- package/dist/organisms/Tabs.d.ts +6 -1
- package/dist/organisms/Tabs.d.ts.map +1 -1
- package/dist/organisms/Toast.d.ts +20 -2
- package/dist/organisms/Toast.d.ts.map +1 -1
- package/dist/organisms/filterOperators.d.ts +9 -1
- package/dist/organisms/filterOperators.d.ts.map +1 -1
- package/dist/organisms/index.d.ts +3 -1
- package/dist/organisms/index.d.ts.map +1 -1
- package/dist/resources-CqpCpxo8.js +86 -0
- package/dist/templates/DetailHero.d.ts +51 -0
- package/dist/templates/DetailHero.d.ts.map +1 -0
- package/dist/templates/DetailHeroFacts.d.ts +23 -0
- package/dist/templates/DetailHeroFacts.d.ts.map +1 -0
- package/dist/templates/ListPageLayout.d.ts +55 -9
- package/dist/templates/ListPageLayout.d.ts.map +1 -1
- package/dist/templates/MasterDetailLayout.d.ts +52 -0
- package/dist/templates/MasterDetailLayout.d.ts.map +1 -0
- package/dist/templates/PageHeading.d.ts +14 -0
- package/dist/templates/PageHeading.d.ts.map +1 -0
- package/dist/templates/PageLayout.d.ts +21 -0
- package/dist/templates/PageLayout.d.ts.map +1 -0
- package/dist/templates/RecordPanel.d.ts +13 -0
- package/dist/templates/RecordPanel.d.ts.map +1 -0
- package/dist/templates/SummarySheet.d.ts +71 -0
- package/dist/templates/SummarySheet.d.ts.map +1 -0
- package/dist/templates/index.d.ts +10 -0
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/listFilters.d.ts +21 -0
- package/dist/templates/listFilters.d.ts.map +1 -0
- package/dist/templates/ritimIdentity.d.ts +26 -0
- package/dist/templates/ritimIdentity.d.ts.map +1 -0
- package/dist/templates/useViewportFillHeight.d.ts +10 -0
- package/dist/templates/useViewportFillHeight.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +3 -2
- package/dist/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/themeContext.d.ts +3 -0
- package/dist/theme/themeContext.d.ts.map +1 -1
- package/dist/theme.css +1 -1
- package/dist/ui-kit.css +1 -1
- package/dist/utils/formatters.d.ts +12 -1
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/sheetInset.d.ts +50 -0
- package/dist/utils/sheetInset.d.ts.map +1 -0
- package/package.json +2 -1
- package/dist/resources-B3pLCPDz.js +0 -86
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const l = { ara: "Ara...", filtre: "Filtre", kaydet: "Kaydet", iptal: "İptal", sil: "Sil", duzenle: "Düzenle", ekle: "Ekle", kapat: "Kapat", daha_fazla: "Daha fazla", temizle: "Temizle", tamam: "Tamam", geri: "Geri", ileri: "İleri", devam: "Devam", calistir: "Çalıştır", onayla: "Onayla", gonder: "Gönder", yukle: "Yükle", indir: "İndir", kopyala: "Kopyala", kopyalandi: "Kopyalandı", yapistir: "Yapıştır", sec: "Seç", vazgec: "Vazgeç", detay: "Detay", detaya_git: "Detaya Git", yenile: "Yenile", disa_aktar: "Dışa Aktar", evet: "Evet", hayir: "Hayır", tumu: "Tümü", yok: "Yok", olustur: '"{{value}}" oluştur', modem: "Modem", meter: "Sayaç", error: "Bir hata oluştu", retry: "Yeniden dene", cancel: "İptal", loading: "Yükleniyor...", kaldir: "Kaldır", yukleniyor: "Yükleniyor", previousMonth: "Önceki ay", nextMonth: "Sonraki ay", yes: "Evet", no: "Hayır", duration: { month: "{{n}} ay", day: "{{n}} gün", hour: "{{n}} sa", minute: "{{n}} dk" } }, s = { sayfa: "Sayfa", toplam: "Toplam", secili: "Seçili", kayit_bulunamadi: "Kayıt bulunamadı", siralama: "Sıralama", filtrele: "Filtrele", tumunu_sec: "Tümünü Seç", secimi_kaldir: "Seçimi Kaldır", satirlar: "satır", sayfa_basina: "sayfa başına", eylemler: "Eylemler", satiri_sec: "Satırı seç", satiri_sec_etiketli: "{{label}} seç", cell_filter_hint: "Bu değere göre süz: {{value}}" }, d = { zorunlu_alan: "Bu alan zorunludur", gecersiz_deger: "Geçersiz değer", min_karakter: "En az {{min}} karakter olmalıdır", max_karakter: "En fazla {{max}} karakter olmalıdır", email_gecersiz: "Geçerli bir e-posta adresi giriniz", sayi_gecersiz: "Geçerli bir sayı giriniz" }, m = { emin_misiniz: "Emin misiniz?", bu_islem_geri_alinamaz: "Bu işlem geri alınamaz.", onay: "Onayla", vazgec: "Vazgeç", silme_onay: "Bu kaydı silmek istediğinize emin misiniz?", silme_baslik: "Kaydı Sil", entity_silme_onay: "kalıcı olarak silinecek. Bu işlem geri alınamaz.", kaydedilmemis_baslik: "Kaydedilmemiş değişiklikler", kaydedilmemis_aciklama: "Girdiğiniz bilgiler kaybolacak. Kapatmak istediğinize emin misiniz?", kaydetmeden_kapat: "Kaydetmeden kapat" }, u = { clearType: "Seçimi kaldır", detail: "Komut Detayı", statusTimeline: "Durum Akışı", reasonTitle: { FAILED: "Başarısızlık nedeni", TIMEOUT: "Zaman aşımı nedeni", CANCELLED: "İptal nedeni", RETRY: "Tekrar deneme nedeni", COMPLETED: "Tamamlanma notu" }, target: "Hedef", traffic: "Trafik Bilgisi", createdAt: "Oluşturulma", sentAt: "Gönderilme", completedAt: "Tamamlanma", duration: "Süre", retryCount: "Deneme Sayısı", params: "Parametreler", modemResponse: "İş Emri İçeriği", responseLoadError: "Cevap yüklenemedi", retry: "Tekrar Dene", cancel: "İptal Et", apnConfig: "APN Ayarı", astroClose: "Kapat (HH:DD)", astroDay: "Gün", astroIoInterface: "IO Arayüz ID", astroLat: "Enlem", astroLoadingModem: "Modem detayları yükleniyor...", astroLocation: "Konum", astroLocationMissing: "Modem konumu tanımsız — Lokasyon ekrandan bağlayın", astroLon: "Boylam", astroModemLoadError: "Modem detayları alınamadı — sayfayı yenileyin", astroOpen: "Aç (HH:DD)", astroSchedule: "Günlük Program (HH/DD)", astroStartDate: "Başlangıç Tarihi", calendarEmptyRegistry: "Kayıtlı takvim bulunamadı — önce Takvim oluşturun.", calendarSelectAtLeastOne: "En az bir takvim seçmelisiniz.", calendarSelection: "Takvim Seçimi", closeRelayOffset: "Gün Batımı Ofset (dk)", create: "İş Emri Oluştur", dateValidation: "Başlangıç tarihi bitiş tarihinden önce olmalıdır", daylightActive: "Aktif", daylightEnabled: "İleri/Geri Saat", daylightPassive: "Pasif", directiveAll: "Tümü", directiveLoadError: "Direktif listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", directiveName: "Direktif", directiveNone: "Tanımlı direktif yok.", directivesSelected: "{{count}} direktif seçildi", endDate: "Bitiş", energyOff: "Enerji Kes", energyOn: "Enerji Aç", energyState: "Enerji Durumu", firmwareLoadError: "Firmware listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", firmwareNoModel: "Ünitenin marka/model bilgisi yok; uygun firmware paketi listelenemiyor.", firmwareNone: "Bu ünitenin marka/modeline uygun firmware paketi yok.", firmwareVersion: "Firmware Versiyonu", noParams: "Bu komut parametre gerektirmez. Doğrudan gönderilebilir.", ntpConfig: "NTP Ayarı", obisCodes: "OBIS Kodları", obisEmpty: "En az 1 OBIS kodu ekleyin", openRelayOffset: "Gün Doğumu Ofset (dk)", priority: { bulk: "Toplu", label: "Öncelik", normal: "Normal", urgent: "Acil" }, readDataLifeSpan: "Veri Ömrü (gün)", readingType: "Okuma Tipi", readingValue: "Değer", relayAdd: "Röle Ekle", relayAll: "Tümü", relayLoadError: "Röle listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", relayNo: "Röle Seçimi", relayRemove: "{{name}} satırını kaldır", relaySelect: "Röle", relayStatus: "Durum", respondedAt: "Yanıt Alındı", responseEmpty: "İş emri içeriği henüz hazır değil", responseFunction: "Fonksiyon", responsePackageNo: "Paket No", responseStreaming: "Streaming", retryInterval: "Tekrar Aralığı (dk)", savedScripts: "Kayıtlı Scriptler", scriptContent: "JSON İçerik", scriptName: "Script Adı", scriptNamePlaceholder: "Kayıt için isim...", searchType: "Tip ara...", selectConfig: "Seçin...", selectEnergyState: "Seçin...", selectDirective: "Seçin...", selectFirmware: "Seçin...", selectMeter: "Sayaç seçin...", selectModem: "Modem seçin...", selectRelay: "Seçin...", selectTypeHint: "Sol menüden bir işlem tipi seçin", serverConfig: "Sunucu Ayarı", startDate: "Başlangıç", submit: "İş Emri Oluştur", targetMeter: "Hedef Sayaç", targetModem: "Hedef Haberleşme Ünitesi", threshold: "Eşik Değer (Watt)", whitelistEmpty: "Whitelist kayıt bulunamadı — önce Whitelist Konfigürasyonu oluşturun.", whitelistEntries: "Whitelist Girişleri", whitelistOperation: "İşlem", operation_add: "Ekle", operation_remove: "Kaldır", preset_1h: "Son 1 saat", preset_6h: "Son 6 saat", preset_24h: "Son 24 saat", preset_7d: "Son 7 gün", preset_30d: "Son 30 gün", readingType_lastHours: "Son Saatler", readingType_lastDays: "Son Günler", readingType_lastMonths: "Son Aylar", readingType_between: "Tarih Aralığı", readingType_dayCompletion: "Gün Tamamlama", type: { METER_READOUT_LONG: "Uzun Okuma", METER_READOUT_SHORT: "Kısa Okuma", METER_LOAD_PROFILE: "Yük Profili", METER_READOUT_HISTORY: "Geçmiş Veriler", METER_READOUT_WARNING: "Uyarılar", METER_READOUT_OUTAGE: "Kesintiler", METER_OBIS_READ: "OBIS Okuma", METER_DIRECTIVE_QUERY: "Direktif Okuma", METER_PING_QUERY: "Ping Kontrol", METER_EVENT_LOG: "Olay Kayıt", METER_TIME_SYNC: "Zaman Senkron", METER_CONN_DISCONN_QUERY: "Enerji Sorgulama", METER_CONN_DISCONN_CHANGE: "Enerji Aç/Kapat", METER_LOAD_LIMIT: "Yük Sınırlama", METER_DAY_LIGHT_CHANGE: "İleri/Geri Saat", METER_CONFIG_QUERY: "Konfigürasyon Sorgulama", GATEWAY_RESET: "Ünite Reset", GATEWAY_TIME_SYNC: "Zaman Güncelleme", GATEWAY_FIRMWARE_UPDATE: "Firmware Güncelleme", GATEWAY_ASTRO_CONFIG: "Astro Konfigürasyonu", GATEWAY_METER_CONFIG: "Sayaç Konfigürasyonu", GATEWAY_SERVER_CONFIG: "Sunucu Ayarları", GATEWAY_NTP_CONFIG: "NTP Konfigürasyonu", GATEWAY_APN_CONFIG: "APN Konfigürasyonu", GATEWAY_CUSTOM_CONFIG: "Özel Ayarlar", GATEWAY_CONFIG_QUERY: "Konfig Sorgulama", GATEWAY_RELAY_QUERY: "Röle Sorgulama", GATEWAY_RELAY_CHANGE: "Röle Değiştirme", GATEWAY_CALENDAR_QUERY: "Takvim Sorgulama", GATEWAY_CALENDAR_CHANGE: "Takvim Güncelleme", GATEWAY_DIRECTIVE_QUERY: "Yönerge Sorgulama", GATEWAY_DIRECTIVE_CHANGE: "Yönerge Güncelleme", GATEWAY_EVENT_LOG: "Log Sorgulama", GATEWAY_ALARM: "Alarm Sorgulama", GATEWAY_SCRIPT_EXECUTION: "Script Çalıştır", GATEWAY_DIRECTIVE_EXECUTE: "Direktif Çalıştır" }, category: { METER_READOUT: "Sayaç Okuma", METER_UPDATE: "Sayaç Güncelleme", GATEWAY_SETTINGS: "Ünite Ayarları", OTHER: "Diğer" }, createBulk: "Toplu İş Emri Oluştur", submitBulk: "Toplu İş Emri Oluştur", directiveNamePlural: "Yönergeler", searchDirective: "Direktif ara ve seç...", durationMinutes: "Süre (dakika)", calendarUpdateInfo: "{{count}} takvim seçildi. Adım 1: mevcut takvimler silinir. Adım 2: seçilen takvimler eklenir.", directivesSelected_one: "{{count}} direktif seçildi", directivesSelected_other: "{{count}} direktif seçildi", bulkHeaderMeters: "{{count}} sayaç seçili — hepsi için aynı iş emri oluşturulacak", bulkHeaderModems: "{{count}} modem seçili — hepsi için aynı iş emri oluşturulacak", meterNumbered: "Sayaç #{{id}}", calendarUpdateInfo_one: "{{count}} takvim seçildi. Adım 1: mevcut takvimler silinir. Adım 2: seçilen takvimler eklenir.", calendarUpdateInfo_other: "{{count}} takvim seçildi. Adım 1: mevcut takvimler silinir. Adım 2: seçilen takvimler eklenir.", directiveParamsHint: "Yalnız yönergenin kullandığı alanları doldurun.", targetMeterLoadError: "Sayaç listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", targetMeterNoneBonded: "Bu üniteye bağlı sayaç yok.", obisAdd: "OBIS kodu ekle", obisRemove: "{{code}} kodunu kaldır", firmwareBulkNoModel: "Seçimde marka/model bilgisi olmayan ünite var; firmware paketi listelenemiyor.", firmwareBulkMultiBrand: "Seçimde birden fazla marka var; ortak firmware paketi listelenemiyor.", firmwareBulkMixedModels: "Seçilen üniteler farklı modellerde; yalnız markanın bütün modellerine tanımlı paketler listeleniyor.", firmwareBulkMixedModelsNone: "Seçilen üniteler farklı modellerde ve markanın bütün modellerine tanımlı firmware paketi yok.", firmwareBulkNone: "Seçilen ünitelerin marka/modeline uygun firmware paketi yok.", configLoadError: "Liste yüklenemedi. Sayfayı yenileyip tekrar deneyin.", apnConfigNone: "Tanımlı APN ayarı yok.", serverConfigNone: "Tanımlı sunucu ayarı yok.", ntpConfigNone: "Tanımlı NTP ayarı yok.", firmwareTruncated: "Firmware listesi sunucu sınırına ulaştı; bazı paketler listede olmayabilir.", configIncomplete: "Liste çok uzun; tamamı gösterilemiyor." }, y = { window: { "1h": "1 sa", "24h": "24 sa", "7d": "7g", "30d": "30g", aria: "Zaman penceresi" }, gauge: { aria: "Sağlık skoru göstergesi", details: "Skor detayı", computing: "Hesaplanıyor...", no_data: "Aktif veri yok", error: "Veri çekilemedi", band: { critical: "KRİTİK", warning: "UYARI", healthy: "SAĞLIKLI", excellent: "MÜKEMMEL" } }, dataPerf: { no_errors: "Hata yok", top_error_codes: "Sık Hata Kodları", error_code_row_aria: "{{code}} hata kodu detayını görüntüle" } }, c = { apr: "Nisan", aug: "Ağustos", dec: "Aralık", feb: "Şubat", jan: "Ocak", jul: "Temmuz", jun: "Haziran", mar: "Mart", may: "Mayıs", nov: "Kasım", oct: "Ekim", sep: "Eylül", short: { jan: "Oca", feb: "Şub", mar: "Mar", apr: "Nis", may: "May", jun: "Haz", jul: "Tem", aug: "Ağu", sep: "Eyl", oct: "Eki", nov: "Kas", dec: "Ara" } }, _ = { fri: "Cum", mon: "Pzt", sat: "Cmt", sun: "Paz", thu: "Per", tue: "Sal", wed: "Çar", long: { mon: "Pazartesi", tue: "Salı", wed: "Çarşamba", thu: "Perşembe", fri: "Cuma", sat: "Cumartesi", sun: "Pazar" } }, k = { dayOfMonth: "Gün", dayOfWeek: "Hafta Günü", expression: "İfade", hour: "Saat", minute: "Dakika", month: "Ay", second: "Saniye", opt: { every_second: "Her saniye", every_5s: "Her 5 sn", every_10s: "Her 10 sn", every_15s: "Her 15 sn", every_30s: "Her 30 sn", every_minute: "Her dakika", every_5m: "Her 5 dk", every_10m: "Her 10 dk", every_15m: "Her 15 dk", every_30m: "Her 30 dk", every_hour: "Her saat", every_2h: "Her 2 saat", every_4h: "Her 4 saat", every_6h: "Her 6 saat", every_12h: "Her 12 saat", every_day: "Her gün", every_month: "Her ay", weekdays: "Hafta içi", weekend: "Hafta sonu", last_day: "Son gün" }, desc: { every_minute: "Her dakika", every_n_minutes: "Her {{n}} dakikada", hourly_at_minute: "Her saat {{minute}}. dakikada", every_n_hours_at_minute: "Her {{n}} saatte, {{minute}}. dakikada", at_time: "Saat {{time}}'de", on_day_of_month: "ayın {{day}}. günü", last_day_of_month: "ayın son günü", day_or: "{{dom}} VEYA {{dow}}", every_second: "Her saniye", every_n_seconds: "Her {{n}} saniyede", at_second: "Her dakikanın {{second}}. saniyesinde", and_every_second: "her saniye", and_every_n_seconds: "her {{n}} saniyede", and_at_second: "{{second}}. saniyede", last_weekday_of_month: "ayın son iş günü", days_before_last_day: "ayın son gününden {{n}} gün önce", nearest_weekday: "ayın {{day}}. gününe en yakın iş günü", last_dow_of_month: "ayın son {{dow}} günü", nth_dow_of_month: "ayın {{n}}. {{dow}} günü", dow: { mon: "Pazartesi", tue: "Salı", wed: "Çarşamba", thu: "Perşembe", fri: "Cuma", sat: "Cumartesi", sun: "Pazar", weekdays: "hafta içi", weekend: "hafta sonu" } }, day_or_title: "Gün ve Hafta Günü birlikte seçili", day_or_body: "Program bu ikisinin kesişiminde değil, herhangi birinde çalışır: seçtiğiniz ayın günü VEYA seçtiğiniz hafta günü. Yalnızca birini istiyorsanız diğerini “Her gün” yapın.", day_exclusive_hint: "Ayın günü ile hafta günü birlikte kullanılamaz — birini seçince diğeri “Her gün” olur.", day_conflict: "Ayın günü ile hafta günü birlikte planlanamaz — yalnızca birini seçin.", invalid: "Geçersiz ifade", invalid_quartz_day: "Geçersiz ifade — ayın günü ile hafta gününden yalnızca biri “?” olmalı." }, g = { empty: "Henüz olay yok", emptyDescription: "Bu modem için henüz bir olay kaydedilmemiş.", filterSource: "Kaynak", filterType: "Olay Tipi", sourceSystem: "Sistem", sourceUser: "Kullanıcı", emptyRecords: "Henüz kayıt yok", event: { ORDER: "Komut", HEARTBEAT: "Heartbeat", ALARM: "Alarm", CONFIG: "Konfigürasyon", CONNECTION: "Bağlantı", POWER: "Enerji", LIFECYCLE: "Yaşam Döngüsü" }, source: { USER: "Kullanıcı", SYSTEM: "Sistem" } }, p = { connecting: "Bağlanıyor...", selectModem: "Canlı izleme için modem seçin", title: "Canlı İzleme", waiting: "Olay bekleniyor...", metric: { throughput: "mesaj{{unit}}", throughputUnit: "/sa", onlineModems: "Çevrimiçi", outages: "Kesinti", dlqCount: "DLQ" } }, h = { empty: "Bildirim yok", markAllRead: "Tümünü oku", title: "Bildirimler", viewAll: "Tüm bildirimleri gör", task: { opened: "Yeni görevler", opened_one: "{{typeLabelTr}}: {{formattedCount}} yeni görev", opened_other: "{{typeLabelTr}}: {{formattedCount}} yeni görev", critical: "Kritik görev: {{typeLabelTr}} · {{entitySlug}}", critical_untargeted: "Kritik görev: {{typeLabelTr}}" }, type: { INTEGRATION_HUB_DELIVERY_FAILED: { title: "Entegrasyon teslimi başarısız", title_one: "{{formattedCount}} entegrasyon teslimi başarısız", title_other: "{{formattedCount}} entegrasyon teslimi başarısız", body: "Dış sisteme yapılan gönderim teslim edilemedi." }, INTEGRATION_HUB_CIRCUIT_OPEN: { title: "Entegrasyon devre kesicisi açıldı", body: "Art arda başarısız gönderimler nedeniyle gönderimler geçici olarak durduruldu." }, INTEGRATION_HUB_LIMITER_UNAVAILABLE: { title: "Gönderim hız sınırlayıcısına ulaşılamadı", body: "Bu sürede gönderimler bekletildi." }, INTEGRATION_HUB_SOURCE_WARNING: { title: "Olay kaynağı uyarısı", body: "Bir olay kaynağı uyarı bildirdi." }, INTEGRATION_HUB_SOURCE_OFFSET_EXPIRED: { title: "Olay kaynağının offset süresi doldu", body: "Kaynak, kurtarma yapılana kadar okuma yapmaz." } } }, E = { groupCount: "{{count}} grup", placeholder: "Harita yükleniyor...", groupCount_one: "{{count}} grup", groupCount_other: "{{count}} grup" }, f = { karanlik_mod: "Karanlık Mod", aydinlik_mod: "Aydınlık Mod", tema_degistir: "Tema Değiştir" }, T = { bugun: "Bugün", dun: "Dün", bu_hafta: "Bu Hafta", bu_ay: "Bu Ay", gecen_ay: "Geçen Ay", son_7_gun: "Son 7 Gün", son_30_gun: "Son 30 Gün", son_90_gun: "Son 90 Gün", bu_yil: "Bu Yıl", gecen_yil: "Geçen Yıl", baslangic: "Başlangıç", bitis: "Bitiş", tarih_sec: "Tarih Seçiniz", saat: "Saat", baslangic_saati: "Başlangıç saati", bitis_saati: "Bitiş saati", hazir_araliklar: "Hazır Aralıklar" }, S = { onceki_sayfa: "Önceki Sayfa", sonraki_sayfa: "Sonraki Sayfa", previous_page: "Önceki sayfa", next_page: "Sonraki sayfa", sayfa_x_y: "Sayfa {{current}} / {{total}}", kayit_gosteriliyor: "{{from}}-{{to}} / {{total}} kayıt gösteriliyor", ilk_sayfa: "İlk Sayfa", son_sayfa: "Son Sayfa" }, A = { kayit_bulunamadi: "Kayıt bulunamadı", henuz_veri_yok: "Henüz veri yok", sonuc_bulunamadi: "Aradığınız kriterlere uygun sonuç bulunamadı" }, b = { basarili: "Başarılı", hata: "Hata", uyari: "Uyarı", bilgi: "Bilgi", yukleniyor: "Yükleniyor...", kaydediliyor: "Kaydediliyor...", siliniyor: "Siliniyor..." }, v = { status_pending: "Bekliyor", status_valid: "Geçerli", status_invalid: "Geçersiz" }, N = { filtre_uygula: "Filtreyi Uygula", filtreleri_temizle: "Filtreleri Temizle", aktif_filtre: "{{count}} aktif filtre", yes: "Evet", no: "Hayır", op_contains: "İçerir", op_equals: "Eşittir", op_not_equals: "Eşit Değil", op_starts_with: "Başlar", op_ends_with: "Biter", op_greater: "Büyüktür", op_less: "Küçüktür", op_greater_eq: "Büyük Eşit", op_less_eq: "Küçük Eşit", op_is_empty: "Boş", op_is_not_empty: "Boş Değil", op_between: "Arasında", operator_sec: "Operatör seçin", secili: "Seçili", op_any_of: "Herhangi Biri", op_none_of: "Hiçbiri", op_all: "Tümü", chip_more: "+{{count}}" }, R = { ham_json: "Ham JSON", form_gorunumu: "Form Görünümü", formatla: "Formatla", gecersiz_json: "Geçersiz JSON formatı", kopyalandi: "Kopyalandı!", kopyala: "Kopyala", icerik: "JSON içeriği", duzenle: "Düzenle", goruntule: "Görüntüle", sozdizimi_hatasi: "Geçersiz JSON — satır {{line}}, sütun {{column}}", sorunlar: "Sorunlar ({{count}})", satir: "Satır {{line}}", konumsuz: "Genel", yaklasik_konum: "Bu yol belgede yok; en yakın üst öğe işaretlendi", ic_ice_deger: "İç içe değer — Ham JSON sekmesinde düzenleyin", form: "Form", json: "JSON" }, O = { bold: "Kalın", italic: "İtalik", strike: "Üstü çizili", h2: "Başlık 2", h3: "Başlık 3", bulletList: "Madde işaretli liste", orderedList: "Numaralı liste", link: "Bağlantı", unlink: "Bağlantıyı kaldır", blockquote: "Alıntı", code: "Kod", undo: "Geri al", redo: "Yinele", linkUrl: "https://…", linkApply: "Bağlantıyı uygula", linkCancel: "İptal", toolbar: "Biçimlendirme", editor: "Zengin metin editörü", linkInput: "Bağlantı adresi" }, C = { webglTitle: "WebGL kullanılamıyor", webglBody: "Bu harita yüzeyi render için WebGL gerektirir. Lütfen farklı bir tarayıcı deneyin veya yöneticinizle iletişime geçin.", layerControl: "Harita katmanları" }, D = { sifreyi_goster: "Şifreyi göster", sifreyi_gizle: "Şifreyi gizle", onceki_ay: "Önceki ay", sonraki_ay: "Sonraki ay", filtreyi_kaldir: "{{name}} filtresini kaldır", kopyala: "Kopyala", panel: "Panel", iletisim_kutusu: "İletişim kutusu", kaldir: "{{label}} seçimini kaldır", secili_sayisi: "{{count}} seçili", alani_temizle: "{{label}} alanını temizle", filtrele: "Seçenekleri filtrele", filtreler: "Filtreler", breadcrumb: "Yol haritası", pagination: "Sayfalama", detay_sayfasi: "Detay sayfası", filtreler_kenar: "Filtre kenar çubuğu", giris: "Giriş", rapor_kriterleri: "Rapor kriterleri", tam_ekran: "Tam ekran", tam_ekrandan_cik: "Tam ekrandan çık", hakkinda: "{{label}} hakkında" }, I = { lifecycle: { ACTIVE: "Aktif", INACTIVE: "Pasif", MAINTENANCE: "Bakımda", FAULTY: "Arızalı", DEFINED: "Tanımlama", INSTALLING: "Kurulum", SCRAPPED: "Hurda", UNKNOWN: "Bilinmiyor" }, network: { CONNECTED: "Çevrimiçi", DISCONNECTED: "Çevrimdışı", UNKNOWN: "Bilinmiyor" }, power: { ON: "Enerjili", OFF: "Enerji Yok", UNKNOWN: "Bilinmiyor" }, disconnection: { ON: "Enerji Var", OFF: "Enerji Yok", UNKNOWN: "Bilinmiyor", OPENING: "Açılıyor", CLOSING: "Kapanıyor" } }, L = { hero: { live: "CANLI", tickerMetrics: "Canlı metrikler", fleetOnline: "AKTİF SAYAÇLAR", online: "aktif", vs1h: "vs 1 sa", fleet: { online: "AKTİF", offline: "PASİF", unknown: "ENERJİSİZ" }, readingSla24h: "OKUMA SLA · 24S", target: "hedef", activeOutages: "AKTİF KESİNTİLER", affectedMeters: "etkilenen sayaç", alarm: { crit: "KRİTİK", warn: "UYARI", viewDetails: "{{slug}} detaylarını görüntüle" }, tape: { ariaLabel: "Son sistem olayları" }, tapePrefix: "BANT", fleetActive: "Aktif Haberleşme Ünitesi · 24 sa", fleetTotal: "/ {{total}}", fleetOnlinePct: "%{{pct}}", fleetDeltaHourly: "+{{delta}} ↑ 1 sa", slaToday: "Okuma Oranı · Bugün", slaTargetCaption: "Hedef %{{target}}", outagesAffected: "{{count}} sayaç", outagesWorstRegion: "En kötü bölge: {{region}}", outagesWorstRegionLabel: "En kötü bölge:", ticker: { throughput: "İŞLEM/s", online: "ÇEVRİMİÇİ", outages: "KESİNTİ", dlq: "DLQ", parseRate: "ÇÖZÜM/s", queue: "KUYRUK" } }, zoneA: { mapTitle: "Coğrafi Komuta", mapSubtitle: "Türkiye · 81 il", mapLoading: "Yükleniyor...", popupLabels: { outage: "Kesinti", rssi: "RSSI", sla: "SLA %", simOperator: "SIM Op", reason: "Sebep" }, layerButton: { kesinti: "Kesinti", sinyal: "Sinyal", sim: "SIM Op", sla: "Okuma Oranı" }, layerHint: { outage: "kesinti yoğunluğu", rssi: "RSSI medyan", sim: "en iyi operatör", sla: "okuma yüzdesi" }, legend: { label: "Açıklama", noData: "Veri yok" }, popup: { dataMissing: "Veri bekleniyor (STORY-218)" }, panelHeader: { eyebrow: "BÖLGE", modemSuffix: "haberleşme ünitesi", meterSuffix: "sayaç", noDataCaption: "Veri bekleniyor — STORY-218 sonrası aktif" }, panelBody: { noDataPlaceholder: "Bu il için henüz veri yok." }, panelFooter: { bestSim: "{{operator}} en iyi — RSSI {{rssi}} dBm", bestSimNoSignal: "{{operator}} en iyi — RSSI veri yok", noWinner: "En iyi operatör verisi yok", cta: "Rapor Aç →" }, noValue: "—", kesinti: { activeLabel: "Aktif Kesinti", affectedSuffix: "etk.", affectedNoData: "etkilenen sayaç verisi yok", longestLabel: "En Uzun Kesinti", noOutage: "kesinti yok", trendTitle: "Kesinti Trend · 7 Gün", legendCount: "Adet", legendDuration: "Süre (dk)", activeListTitle: "Aktif En Uzun Kesintiler", emptyList: "{{province}} bölgesinde aktif kesinti yok.", trendSummary: "{{maxCount}} max adet, {{maxMinutes}} dk max süre." }, sinyal: { title: "SIM Operatör · Medyan Sinyal (dBm) · {{province}}", noData: "Sinyal verisi yok", footer: "Sinyal tab seçili — detaylı bölge RSSI dağılımı yakında" }, sim: { title: "En İyi SIM Operatör · {{province}}", noData: "SIM operatör verisi yok" }, sla: { todayLabel: "Okuma Oranı · 24 sa", targetCaption: "hedef %99,0", missingLabel: "Eksik Okuma", meterSuffix: "sayaç", noData: "Okuma oranı verisi yok", footer: "Okuma Oranı tab seçili — sayaç bazlı kırılım yakında", rateAria: "Okuma oranı: yüzde {{value}}", missingAria: "Eksik okuma: {{value}} sayaç" }, outageReason: { POWER_LOSS: "Güç Kaybı", NETWORK_OUTAGE: "Şebeke Kesintisi", HARDWARE_FAILURE: "Donanım Arızası", HIGH_TEMP: "Yüksek Sıcaklık", CONNECTION_LOST: "Bağlantı Kopması", noOutage: "Kesinti yok", noData: "Sebep bilinmiyor" }, webglFallback: { title: "Tarayıcınız WebGL desteklemiyor", body: "Coğrafi komuta yüzeyi 81-il çoklu-katman harita render etmek için WebGL gerektirir. Lütfen yöneticinizle iletişime geçin." } }, zones: { zoneAPlaceholder: "Zone A — Çok Katmanlı Harita (STORY-217)", pipelineFunnel: { title: "Veri Hattı · mesaj{{unit}}", unit: "/sa", empty: "Veri akışı bekleniyor", stage: { kalpAtisi: "Kalp Atışı", hamVeri: "Ham Veri", cozumleyici: "Çözümleyici", clickHouse: "ClickHouse" } }, parseErrors: { title: "Çözümleme Hataları", centerCaption: "HATA", empty: "Hata yok", ariaLabel: "Toplam {{count}} çözümleme hatası" }, simRanking: { title: "SIM Operatör TR · Çevrimiçi %", empty: "Operatör verisi yok" }, integrationHealth: { title: "Entegrasyon · Nabız", empty: "Servis verisi yok", status: { ok: "Sağlıklı", warn: "Uyarı", crit: "Kritik" }, metric: { unreachable: "erişilemiyor", connections: "{{value}} bağlı", brokers: "{{value}} broker", dlq_messages: "{{value}} mesaj", active_streams: "{{value}} aktif" } }, slaTopBottom: { title: "SLA · En Düşük 4 / En Yüksek 4", lowLabel: "▼ Düşük", highLabel: "▲ Yüksek", empty: "Veri yok" }, outageTrend24h: { title: "Kesinti · 24 sa Trend", hint: "bölgeye göre", empty: "Kesinti yok", regions: { marmara: "Marmara", ic: "İç Anadolu", karadeniz: "Karadeniz", ege: "Ege", akdeniz: "Akdeniz", diger: "Diğer" } }, calendarRings: { title: "Takvim · İlerleme", empty: "Veri yok" } } }, w = { serial: "Seri Numarası", protocol: "Protokol", port: "Port", protocolDefaultPort: "Protokol varsayılan portu", reportedPort: "Cihazın bildirdiği port", firmware: "Firmware", type: "Tip", modem: "Modem", location: "Konum", lastReading: "son okuma", lastCommunication: "Son İletişim", monthlySuccessRate: "Aylık başarı oranı", quickStatus: "Hızlı durum", meterCount: "Sayaç", activeAlarms: "Aktif Alarm", activeOrders: "Aktif İş Emri", orderSuitability: { title: "Emir işleme", accessYes: "Erişim Var", accessNo: "Erişim Yok", tiers: "Bekleyen emir — Acil {{urgent}} · Normal {{normal}} · Toplu {{bulk}}", status: { SUITABLE: "Uygun", NO_ORDERS: "Bekleyen Emir Yok", NOT_SUITABLE: "Uygun Değil", UNKNOWN: "Belirsiz" }, hint: { SUITABLE: "Emir işlemeye engel yok. Erişim durumu ayrıca gösterilir.", NO_ORDERS: "Emir işlemeye engel yok, bekleyen emir de yok.", NOT_SUITABLE: "Emir işlemeye engel var.", UNKNOWN: "Ünitenin durum veya iletişim tipi bilinmediği için değerlendirilemedi." }, reason: { PROTOCOL_MISSING: "Haberleşme ünitesinde protokol tanımlı değil; emirler gönderilemez.", IP_INVALID: "TCP ünitenin IP adresi yok ya da geçersiz; bağlantı kurulamaz.", PORT_INVALID: "TCP ünitenin portu geçersiz (1–65535 dışında).", POWER_OUTAGE: "Ünitede aktif enerji kesintisi var; emirler kesinti bitene kadar reddedilir.", NOT_INSTALLED: 'Ünite sahada kurulu değil; yalnız "Sahada Kurulu" ünitelere emir oluşturulur.' } }, uptime: "Uptime", signal: "Sinyal", readingRate: "Okuma Oranı", calendar: { title: "Okuma takvimi", prevMonth: "Önceki ay", nextMonth: "Sonraki ay", months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], dayLabels: ["P", "S", "Ç", "P", "C", "C", "P"], status: { ok: "Okundu", warn: "Eksik okuma", crit: "Okuma hatası", noData: "Veri yok" }, legend: { ok: "Tam", warn: "Eksik", crit: "Hata", noData: "Veri yok" }, cellAria: "{{date}} — {{status}}, {{count}}/{{expected}} okuma" }, valueUnknown: "Bilinmiyor", recentAlarms: { title: "Son alarmlar", severity: { crit: "Kritik", warn: "Uyarı", info: "Bilgi" } } }, M = { kirmizi: "Kırmızı", turuncu: "Turuncu", sari: "Sarı", yesil: "Yeşil", mavi: "Mavi", mor: "Mor", indigo: "İndigo", pembe: "Pembe" }, z = { day: "Gün", total: "Toplam", legend_low: "Az", legend_high: "Çok" }, G = { tabs_aria: "Detay sekmeleri" }, H = { topology: { erp_sub: "Kurumsal", epias_sub: "Enerji Piyasası", mobile_label: "Mobil", mobile_sub: "Müşteri App", meters_stat: "5M Sayaç · 220 GB/gün · 99% SLA", modem_label: "1M Modem" } }, P = { once: "Önce", sonra: "Sonra", eklendi: "eklendi", silindi: "silindi", eklenen_satir: "Eklenen satır: {{count}}", silinen_satir: "Silinen satır: {{count}}", gorunum: "Fark görünümü", birlesik: "Birleşik", yan_yana: "Yan yana", alanlar: "Alanlar ({{count}})", fark_yok: "Fark yok — iki belge aynı.", fark: "Satır farkı", degismeyen_satirlar: "⋯ Değişmeyen {{count}} satır — göster", tur_added: "Eklendi", tur_removed: "Silindi", tur_changed: "Değişti" }, B = { zorunlu: "Bu alan zorunlu", desen_uyumsuz: "Biçim uygun değil ({{pattern}})", varsayilan: "Varsayılan: {{value}}", desen_ipucu: "Biçim uygun değil: {{hint}}" }, U = { anahtar: "Anahtar", deger: "Değer", islemler: "İşlemler", anahtar_zorunlu: "Anahtar zorunlu", anahtar_tekrar: "Bu anahtar birden fazla satırda var", anahtar_desen: "Anahtar biçimi uygun değil ({{pattern}})", deger_zorunlu: "Değer zorunlu", deger_kisa: "Değer çok kısa (en az {{count}} karakter)", deger_uzun: "Değer çok uzun (en çok {{count}} karakter)", satiri_sil: "{{key}} satırını sil", ekle: "Satır ekle", bos: "Kayıt yok.", anahtar_desen_ipucu: "Anahtar biçimi uygun değil: {{hint}}" }, Y = { disa_aktar: "Dışa Aktar", format_sec: "Dosya biçimi seçin", format_xlsx: "Excel (XLSX)", format_csv: "CSV", format_pdf: "PDF", pdf_limit: "En fazla {{limit}} satır", hazirlaniyor: "Hazırlanıyor…", hazirlaniyor_yuzde: "Hazırlanıyor… {{progress}}", indirme_basladi: "İndirme başlatıldı. Dosya inmezse İndirme Geçmişi'nden tekrar deneyin.", arka_planda: "Dosya hazırlanmaya devam ediyor. Hazır olunca İndirme Geçmişi'nden indirebilirsiniz.", indirme_basarisiz: "Dosya indirilemedi. Biraz sonra İndirme Geçmişi'nden tekrar deneyin.", gecmisi_ac: "İndirme Geçmişi'ni aç", gecmis_indirme_basladi: "İndirme başlatıldı. Dosya inmezse tekrar deneyin.", gecmis_indirme_basarisiz: "Dosya indirilemedi. Biraz sonra tekrar deneyin.", iptal_edildi: "Dışa aktarma iptal edildi.", status_queued: "Sırada", status_running: "Hazırlanıyor", status_completed: "Tamamlandı", status_failed: "Başarısız", status_cancelled: "İptal Edildi", status_expired: "Süresi Doldu", iptal_istendi: "İptal istendi", kolon_rapor: "Rapor Adı", kolon_olusturan: "Oluşturan", kolon_talep: "Talep Tarihi", kolon_bitis: "Bitiş Tarihi", kolon_durum: "Durum", kolon_ilerleme: "İlerleme", kolon_kayit: "Kayıt", kolon_boyut: "Boyut", kolon_hata: "Hata", kolon_islemler: "İşlemler", indir: "İndir", indir_aria: "{{name}} dosyasını indir", iptal_et: "İptal Et", iptal_aria: "{{name}} dışa aktarmasını iptal et", adsiz: "Adsız dışa aktarma", bos_baslik: "Dışa aktarma bulunamadı", bos_aciklama: "Henüz dışa aktarma yapılmamış.", liste_hata: "İndirme geçmişi yüklenemedi.", hata_satiri: "Kod: {{code}}, Hata: {{message}}", hata_export_001: "Dışa aktarma bulunamadı.", hata_export_002: "Dosyanın süresi dolmuş, artık indirilemiyor.", hata_export_003: "Aynı rapor için aynı kriterler ile devam eden işleminiz bulunmaktadır. Lütfen İndirme Geçmişi'ni kontrol ediniz.", hata_export_004: "Aynı anda en fazla {{limit}} dışa aktarma çalıştırabilirsiniz. Birinin bitmesini bekleyin.", hata_export_005: "Sistem şu anda yoğun. Lütfen biraz sonra tekrar deneyin.", hata_export_006: "Bu liste dışa aktarılamıyor.", hata_export_007: "Dışa aktarılacak kayıt bulunamadı.", hata_export_008: "Dışa aktarma süre sınırını ya da deneme hakkını aştı.", hata_export_009: "Bu verilere erişim yetkiniz olmadığı için dışa aktarma durduruldu.", hata_export_010: "Dosya deposuna ulaşılamadı. Lütfen tekrar deneyin.", hata_export_011: "Bu işlem dışa aktarmanın şu anki durumunda yapılamaz.", hata_export_012: "Liste servisi beklenmeyen bir yanıt verdi; dışa aktarma tamamlanamadı.", hata_export_013: "Dışa aktarma kolonları geçersiz.", hata_export_014: "PDF en fazla {{limit}} satır alabilir. Excel ya da CSV seçin.", hata_dogrulama: "Dışa aktarma isteği geçersiz.", hata_yetki: "Tüm kullanıcıların dışa aktarmalarını görme yetkiniz yok.", hata_genel: "Dışa aktarma başarısız oldu." }, r = {
|
|
2
|
+
common: l,
|
|
3
|
+
table: s,
|
|
4
|
+
form: d,
|
|
5
|
+
dialog: m,
|
|
6
|
+
order: u,
|
|
7
|
+
monitoring: y,
|
|
8
|
+
months: c,
|
|
9
|
+
weekDays: _,
|
|
10
|
+
cron: k,
|
|
11
|
+
timeline: g,
|
|
12
|
+
live: p,
|
|
13
|
+
notifications: h,
|
|
14
|
+
map: E,
|
|
15
|
+
theme: f,
|
|
16
|
+
date: T,
|
|
17
|
+
pagination: S,
|
|
18
|
+
empty: A,
|
|
19
|
+
status: b,
|
|
20
|
+
editablegrid: v,
|
|
21
|
+
filter: N,
|
|
22
|
+
json_editor: R,
|
|
23
|
+
rich_text_editor: O,
|
|
24
|
+
map_shell: C,
|
|
25
|
+
aria: D,
|
|
26
|
+
detail_status: I,
|
|
27
|
+
dashboard: L,
|
|
28
|
+
detail_hero: w,
|
|
29
|
+
color: M,
|
|
30
|
+
grid: z,
|
|
31
|
+
detail: G,
|
|
32
|
+
auth: H,
|
|
33
|
+
json_diff: P,
|
|
34
|
+
parameter_form: B,
|
|
35
|
+
key_value_editor: U,
|
|
36
|
+
export_job: Y
|
|
37
|
+
}, x = { ara: "Search...", filtre: "Filter", kaydet: "Save", iptal: "Cancel", sil: "Delete", duzenle: "Edit", ekle: "Add", kapat: "Close", daha_fazla: "More", temizle: "Clear", tamam: "OK", geri: "Back", ileri: "Next", devam: "Continue", calistir: "Execute", onayla: "Confirm", gonder: "Send", yukle: "Upload", indir: "Download", kopyala: "Copy", kopyalandi: "Copied", yapistir: "Paste", sec: "Select", vazgec: "Cancel", detay: "Detail", detaya_git: "Go to Detail", yenile: "Refresh", disa_aktar: "Export", evet: "Yes", hayir: "No", tumu: "All", yok: "None", olustur: 'Create "{{value}}"', modem: "Modem", meter: "Meter", error: "An error occurred", retry: "Retry", cancel: "Cancel", loading: "Loading...", kaldir: "Remove", yukleniyor: "Loading", previousMonth: "Previous month", nextMonth: "Next month", yes: "Yes", no: "No", duration: { month: "{{n}} mo", day: "{{n}} d", hour: "{{n}} h", minute: "{{n}} min" } }, W = { sayfa: "Page", toplam: "Total", secili: "Selected", kayit_bulunamadi: "No records found", siralama: "Sort", filtrele: "Filter", tumunu_sec: "Select All", secimi_kaldir: "Deselect All", satirlar: "rows", sayfa_basina: "per page", eylemler: "Actions", satiri_sec: "Select row", satiri_sec_etiketli: "Select {{label}}", cell_filter_hint: "Narrow the list to: {{value}}" }, F = { zorunlu_alan: "This field is required", gecersiz_deger: "Invalid value", min_karakter: "Must be at least {{min}} characters", max_karakter: "Must be at most {{max}} characters", email_gecersiz: "Please enter a valid email address", sayi_gecersiz: "Please enter a valid number" }, K = { emin_misiniz: "Are you sure?", bu_islem_geri_alinamaz: "This action cannot be undone.", onay: "Confirm", vazgec: "Cancel", silme_onay: "Are you sure you want to delete this record?", silme_baslik: "Delete Record", entity_silme_onay: "will be permanently deleted. This action cannot be undone.", kaydedilmemis_baslik: "Unsaved changes", kaydedilmemis_aciklama: "The information you entered will be lost. Are you sure you want to close?", kaydetmeden_kapat: "Close without saving" }, V = { clearType: "Clear selection", detail: "Order Detail", statusTimeline: "Status Flow", reasonTitle: { FAILED: "Failure reason", TIMEOUT: "Timeout reason", CANCELLED: "Cancellation reason", RETRY: "Retry reason", COMPLETED: "Completion note" }, target: "Target", traffic: "Traffic Info", createdAt: "Created", sentAt: "Sent", completedAt: "Completed", duration: "Duration", retryCount: "Retry Count", params: "Parameters", modemResponse: "Order Content", responseLoadError: "Could not load the response", retry: "Retry", cancel: "Cancel", apnConfig: "APN Configuration", astroClose: "Close (HH:MM)", astroDay: "Day", astroIoInterface: "IO Interface ID", astroLat: "Latitude", astroLoadingModem: "Loading modem details...", astroLocation: "Location", astroLocationMissing: "Modem location is not set — assign it from the Location screen", astroLon: "Longitude", astroModemLoadError: "Could not load modem details — refresh the page", astroOpen: "Open (HH:MM)", astroSchedule: "Daily Schedule (HH/MM)", astroStartDate: "Start Date", calendarEmptyRegistry: "No saved calendars found — create a Calendar first.", calendarSelectAtLeastOne: "You must select at least one calendar.", calendarSelection: "Calendar Selection", closeRelayOffset: "Sunset Offset (min)", create: "Create Work Order", dateValidation: "Start date must be before the end date", daylightActive: "Active", daylightEnabled: "Daylight Saving Time", daylightPassive: "Passive", directiveAll: "All", directiveLoadError: "Could not load the directive list. Refresh the page and try again.", directiveName: "Directive", directiveNone: "No directives are defined.", directivesSelected: "{{count}} directives selected", endDate: "End", energyOff: "Disconnect Energy", energyOn: "Connect Energy", energyState: "Energy State", firmwareLoadError: "Could not load the firmware list. Refresh the page and try again.", firmwareNoModel: "The unit has no brand/model, so no matching firmware package can be listed.", firmwareNone: "No firmware package matches this unit's brand and model.", firmwareVersion: "Firmware Version", noParams: "This command takes no parameters. It can be sent directly.", ntpConfig: "NTP Configuration", obisCodes: "OBIS Codes", obisEmpty: "Add at least 1 OBIS code", openRelayOffset: "Sunrise Offset (min)", priority: { bulk: "Bulk", label: "Priority", normal: "Normal", urgent: "Urgent" }, readDataLifeSpan: "Data Lifespan (days)", readingType: "Reading Type", readingValue: "Value", relayAdd: "Add relay", relayAll: "All", relayLoadError: "Could not load the relay list. Refresh the page and try again.", relayNo: "Relay Selection", relayRemove: "Remove {{name}} row", relaySelect: "Relay", relayStatus: "Status", respondedAt: "Responded", responseEmpty: "Work order content is not ready yet", responseFunction: "Function", responsePackageNo: "Package No", responseStreaming: "Streaming", retryInterval: "Retry Interval (min)", savedScripts: "Saved Scripts", scriptContent: "JSON Content", scriptName: "Script Name", scriptNamePlaceholder: "Name to save as...", searchType: "Search type...", selectConfig: "Select...", selectEnergyState: "Select...", selectDirective: "Select...", selectFirmware: "Select...", selectMeter: "Select a meter...", selectModem: "Select a modem...", selectRelay: "Select...", selectTypeHint: "Select an operation type from the left menu", serverConfig: "Server Configuration", startDate: "Start", submit: "Create Work Order", targetMeter: "Target Meter", targetModem: "Target Communication Unit", threshold: "Threshold (Watt)", whitelistEmpty: "No whitelist records found — create a Whitelist Configuration first.", whitelistEntries: "Whitelist Entries", whitelistOperation: "Operation", operation_add: "Add", operation_remove: "Remove", preset_1h: "Last 1 hour", preset_6h: "Last 6 hours", preset_24h: "Last 24 hours", preset_7d: "Last 7 days", preset_30d: "Last 30 days", readingType_lastHours: "Last Hours", readingType_lastDays: "Last Days", readingType_lastMonths: "Last Months", readingType_between: "Date Range", readingType_dayCompletion: "Day Completion", type: { METER_READOUT_LONG: "Long Readout", METER_READOUT_SHORT: "Short Readout", METER_LOAD_PROFILE: "Load Profile", METER_READOUT_HISTORY: "Historical Data", METER_READOUT_WARNING: "Warnings", METER_READOUT_OUTAGE: "Outages", METER_OBIS_READ: "OBIS Read", METER_DIRECTIVE_QUERY: "Directive Read", METER_PING_QUERY: "Ping Check", METER_EVENT_LOG: "Event Log", METER_TIME_SYNC: "Time Sync", METER_CONN_DISCONN_QUERY: "Energy Status Query", METER_CONN_DISCONN_CHANGE: "Connect/Disconnect Energy", METER_LOAD_LIMIT: "Load Limit", METER_DAY_LIGHT_CHANGE: "Daylight Saving Time", METER_CONFIG_QUERY: "Configuration Query", GATEWAY_RESET: "Unit Reset", GATEWAY_TIME_SYNC: "Communication Unit Time Sync", GATEWAY_FIRMWARE_UPDATE: "Firmware Update", GATEWAY_ASTRO_CONFIG: "Astro Configuration", GATEWAY_METER_CONFIG: "Meter Configuration", GATEWAY_SERVER_CONFIG: "Server Settings", GATEWAY_NTP_CONFIG: "NTP Configuration", GATEWAY_APN_CONFIG: "APN Configuration", GATEWAY_CUSTOM_CONFIG: "Custom Settings", GATEWAY_CONFIG_QUERY: "Config Query", GATEWAY_RELAY_QUERY: "Relay Query", GATEWAY_RELAY_CHANGE: "Relay Change", GATEWAY_CALENDAR_QUERY: "Calendar Query", GATEWAY_CALENDAR_CHANGE: "Calendar Update", GATEWAY_DIRECTIVE_QUERY: "Directive Query", GATEWAY_DIRECTIVE_CHANGE: "Directive Update", GATEWAY_EVENT_LOG: "Log Query", GATEWAY_ALARM: "Alarm Query", GATEWAY_SCRIPT_EXECUTION: "Run Script", GATEWAY_DIRECTIVE_EXECUTE: "Run Directive" }, category: { METER_READOUT: "Meter Readout", METER_UPDATE: "Meter Update", GATEWAY_SETTINGS: "Unit Settings", OTHER: "Other" }, createBulk: "Create Bulk Work Order", submitBulk: "Create Bulk Work Order", directiveNamePlural: "Directives", searchDirective: "Search and select a directive...", durationMinutes: "Duration (minutes)", directivesSelected_one: "{{count}} directive selected", directivesSelected_other: "{{count}} directives selected", calendarUpdateInfo: "{{count}} calendar(s) selected. Step 1: existing calendars are removed. Step 2: the selected calendars are added.", bulkHeaderMeters: "{{count}} meters selected — the same work order will be created for all of them", bulkHeaderModems: "{{count}} modems selected — the same work order will be created for all of them", meterNumbered: "Meter #{{id}}", calendarUpdateInfo_one: "{{count}} calendar selected. Step 1: existing calendars are removed. Step 2: the selected calendars are added.", calendarUpdateInfo_other: "{{count}} calendars selected. Step 1: existing calendars are removed. Step 2: the selected calendars are added.", directiveParamsHint: "Fill in only the fields the directive uses.", targetMeterLoadError: "Could not load the meter list. Refresh the page and try again.", targetMeterNoneBonded: "No meter is connected to this unit.", obisAdd: "Add OBIS code", obisRemove: "Remove {{code}}", firmwareBulkNoModel: "Some selected units have no brand/model, so no firmware package can be listed.", firmwareBulkMultiBrand: "The selection contains more than one brand, so no common firmware package can be listed.", firmwareBulkMixedModels: "The selected units are of different models; only packages defined for every model of the brand are listed.", firmwareBulkMixedModelsNone: "The selected units are of different models and no firmware package is defined for every model of the brand.", firmwareBulkNone: "No firmware package matches the selected units' brand and model.", configLoadError: "Could not load the list. Refresh the page and try again.", apnConfigNone: "No APN configuration is defined.", serverConfigNone: "No server configuration is defined.", ntpConfigNone: "No NTP configuration is defined.", firmwareTruncated: "The firmware list reached the server's limit; some packages may be missing from it.", configIncomplete: "The list is too long to show in full." }, j = { window: { "1h": "1h", "24h": "24h", "7d": "7d", "30d": "30d", aria: "Time window" }, gauge: { aria: "Health score gauge", details: "Score details", computing: "Computing...", no_data: "No active data", error: "Failed to fetch data", band: { critical: "CRITICAL", warning: "WARNING", healthy: "HEALTHY", excellent: "EXCELLENT" } }, dataPerf: { no_errors: "No errors", top_error_codes: "Top Error Codes", error_code_row_aria: "View details for {{code}} error code" } }, q = { apr: "April", aug: "August", dec: "December", feb: "February", jan: "January", jul: "July", jun: "June", mar: "March", may: "May", nov: "November", oct: "October", sep: "September", short: { jan: "Jan", feb: "Feb", mar: "Mar", apr: "Apr", may: "May", jun: "Jun", jul: "Jul", aug: "Aug", sep: "Sep", oct: "Oct", nov: "Nov", dec: "Dec" } }, $ = { fri: "Fri", mon: "Mon", sat: "Sat", sun: "Sun", thu: "Thu", tue: "Tue", wed: "Wed", long: { mon: "Monday", tue: "Tuesday", wed: "Wednesday", thu: "Thursday", fri: "Friday", sat: "Saturday", sun: "Sunday" } }, Q = { dayOfMonth: "Day of Month", dayOfWeek: "Day of Week", expression: "Expression", hour: "Hour", minute: "Minute", month: "Month", second: "Second", opt: { every_second: "Every second", every_5s: "Every 5 sec", every_10s: "Every 10 sec", every_15s: "Every 15 sec", every_30s: "Every 30 sec", every_minute: "Every minute", every_5m: "Every 5 min", every_10m: "Every 10 min", every_15m: "Every 15 min", every_30m: "Every 30 min", every_hour: "Every hour", every_2h: "Every 2 hours", every_4h: "Every 4 hours", every_6h: "Every 6 hours", every_12h: "Every 12 hours", every_day: "Every day", every_month: "Every month", weekdays: "Weekdays", weekend: "Weekend", last_day: "Last day" }, desc: { every_minute: "Every minute", every_n_minutes: "Every {{n}} minutes", hourly_at_minute: "Hourly at minute {{minute}}", every_n_hours_at_minute: "Every {{n}} hours at minute {{minute}}", at_time: "At {{time}}", on_day_of_month: "on day {{day}} of the month", last_day_of_month: "on the last day of the month", day_or: "{{dom}} OR {{dow}}", every_second: "Every second", every_n_seconds: "Every {{n}} seconds", at_second: "Every minute at second {{second}}", and_every_second: "every second", and_every_n_seconds: "every {{n}} seconds", and_at_second: "at second {{second}}", last_weekday_of_month: "on the last weekday of the month", days_before_last_day: "{{n}} days before the last day of the month", nearest_weekday: "on the weekday nearest day {{day}} of the month", last_dow_of_month: "on the last {{dow}} of the month", nth_dow_of_month: "on {{dow}} #{{n}} of the month", dow: { mon: "on Monday", tue: "on Tuesday", wed: "on Wednesday", thu: "on Thursday", fri: "on Friday", sat: "on Saturday", sun: "on Sunday", weekdays: "on weekdays", weekend: "on weekends" } }, day_or_title: "Day of Month and Day of Week are both set", day_or_body: "The schedule runs on EITHER of them, not on their intersection: the day of month you picked OR the weekday you picked. To use only one, set the other back to “Every day”.", day_exclusive_hint: "Day of month and day of week cannot be combined — picking one resets the other to “Every day”.", day_conflict: "Day of month and day of week cannot both be scheduled — pick only one.", invalid: "Invalid expression", invalid_quartz_day: "Invalid expression — exactly one of day of month and day of week must be “?”." }, J = { empty: "No events yet", emptyDescription: "No events have been recorded for this modem yet.", filterSource: "Source", filterType: "Event Type", sourceSystem: "System", sourceUser: "User", emptyRecords: "No records yet", event: { ORDER: "Command", HEARTBEAT: "Heartbeat", ALARM: "Alarm", CONFIG: "Configuration", CONNECTION: "Connection", POWER: "Power", LIFECYCLE: "Lifecycle" }, source: { USER: "User", SYSTEM: "System" } }, X = { connecting: "Connecting...", selectModem: "Select a modem for live monitoring", title: "Live Monitoring", waiting: "Waiting for events...", metric: { throughput: "msg{{unit}}", throughputUnit: "/h", onlineModems: "Online", outages: "Outages", dlqCount: "DLQ" } }, Z = { empty: "No notifications", markAllRead: "Mark all as read", title: "Notifications", viewAll: "View all notifications", task: { opened: "New tasks", opened_one: "{{typeLabelEn}}: {{formattedCount}} new task", opened_other: "{{typeLabelEn}}: {{formattedCount}} new tasks", critical: "Critical task: {{typeLabelEn}} · {{entitySlug}}", critical_untargeted: "Critical task: {{typeLabelEn}}" }, type: { INTEGRATION_HUB_DELIVERY_FAILED: { title: "Integration delivery failed", title_one: "{{formattedCount}} integration delivery failed", title_other: "{{formattedCount}} integration deliveries failed", body: "A send to an external system could not be delivered." }, INTEGRATION_HUB_CIRCUIT_OPEN: { title: "Integration circuit breaker opened", body: "Sending is paused for a while after repeated failed sends." }, INTEGRATION_HUB_LIMITER_UNAVAILABLE: { title: "The send rate limiter was unavailable", body: "Sending was held meanwhile." }, INTEGRATION_HUB_SOURCE_WARNING: { title: "Event source warning", body: "An event source reported a warning." }, INTEGRATION_HUB_SOURCE_OFFSET_EXPIRED: { title: "Event source offset expired", body: "The source does not read until it is recovered." } } }, ee = { groupCount: "{{count}} groups", placeholder: "Loading map...", groupCount_one: "{{count}} group", groupCount_other: "{{count}} groups" }, ae = { karanlik_mod: "Dark Mode", aydinlik_mod: "Light Mode", tema_degistir: "Toggle Theme" }, te = { bugun: "Today", dun: "Yesterday", bu_hafta: "This Week", bu_ay: "This Month", gecen_ay: "Last Month", son_7_gun: "Last 7 Days", son_30_gun: "Last 30 Days", son_90_gun: "Last 90 Days", bu_yil: "This Year", gecen_yil: "Last Year", baslangic: "Start", bitis: "End", tarih_sec: "Select Date", saat: "Time", baslangic_saati: "Start time", bitis_saati: "End time", hazir_araliklar: "Quick Ranges" }, ie = { onceki_sayfa: "Previous Page", sonraki_sayfa: "Next Page", previous_page: "Previous page", next_page: "Next page", sayfa_x_y: "Page {{current}} / {{total}}", kayit_gosteriliyor: "Showing {{from}}-{{to}} of {{total}} records", ilk_sayfa: "First Page", son_sayfa: "Last Page" }, re = { kayit_bulunamadi: "No records found", henuz_veri_yok: "No data yet", sonuc_bulunamadi: "No results matching your criteria" }, ne = { basarili: "Success", hata: "Error", uyari: "Warning", bilgi: "Info", yukleniyor: "Loading...", kaydediliyor: "Saving...", siliniyor: "Deleting..." }, oe = { status_pending: "Pending", status_valid: "Valid", status_invalid: "Invalid" }, le = { filtre_uygula: "Apply Filter", filtreleri_temizle: "Clear Filters", aktif_filtre: "{{count}} active filter(s)", yes: "Yes", no: "No", op_contains: "Contains", op_equals: "Equals", op_not_equals: "Not Equals", op_starts_with: "Starts With", op_ends_with: "Ends With", op_greater: "Greater Than", op_less: "Less Than", op_greater_eq: "Greater or Equal", op_less_eq: "Less or Equal", op_is_empty: "Is Empty", op_is_not_empty: "Is Not Empty", op_between: "Between", operator_sec: "Select operator", secili: "Selected", op_any_of: "Is Any Of", op_none_of: "Is None Of", op_all: "All Of", chip_more: "+{{count}}" }, se = { ham_json: "Raw JSON", form_gorunumu: "Form View", formatla: "Format", gecersiz_json: "Invalid JSON format", kopyalandi: "Copied!", kopyala: "Copy", icerik: "JSON content", duzenle: "Edit", goruntule: "View", sozdizimi_hatasi: "Invalid JSON — line {{line}}, column {{column}}", sorunlar: "Problems ({{count}})", satir: "Line {{line}}", konumsuz: "General", yaklasik_konum: "This path is not in the document; its nearest parent is marked", ic_ice_deger: "Nested value — edit it in the Raw JSON tab", form: "Form", json: "JSON" }, de = { bold: "Bold", italic: "Italic", strike: "Strikethrough", h2: "Heading 2", h3: "Heading 3", bulletList: "Bullet list", orderedList: "Numbered list", link: "Link", unlink: "Remove link", blockquote: "Quote", code: "Code", undo: "Undo", redo: "Redo", linkUrl: "https://…", linkApply: "Apply link", linkCancel: "Cancel", toolbar: "Formatting", editor: "Rich text editor", linkInput: "Link URL" }, me = { webglTitle: "WebGL is not available", webglBody: "This map surface needs WebGL to render. Please try a different browser or contact your administrator.", layerControl: "Map layers" }, ue = { sifreyi_goster: "Show password", sifreyi_gizle: "Hide password", onceki_ay: "Previous month", sonraki_ay: "Next month", filtreyi_kaldir: "Remove {{name}} filter", kopyala: "Copy", panel: "Panel", iletisim_kutusu: "Dialog", kaldir: "Remove {{label}}", secili_sayisi: "{{count}} selected", alani_temizle: "Clear {{label}}", filtrele: "Filter options", filtreler: "Filters", breadcrumb: "Breadcrumb", pagination: "Pagination", detay_sayfasi: "Detail page", filtreler_kenar: "Filter sidebar", giris: "Sign in", rapor_kriterleri: "Report criteria", tam_ekran: "Fullscreen", tam_ekrandan_cik: "Exit fullscreen", hakkinda: "About {{label}}" }, ye = { lifecycle: { ACTIVE: "Active", INACTIVE: "Inactive", MAINTENANCE: "Maintenance", FAULTY: "Faulty", DEFINED: "Defined", INSTALLING: "Installation", SCRAPPED: "Scrapped", UNKNOWN: "Unknown" }, network: { CONNECTED: "Online", DISCONNECTED: "Offline", UNKNOWN: "Unknown" }, power: { ON: "Energized", OFF: "No Energy", UNKNOWN: "Unknown" }, disconnection: { ON: "Power OK", OFF: "No Power", UNKNOWN: "Unknown", OPENING: "Opening", CLOSING: "Closing" } }, ce = { hero: { live: "LIVE", tickerMetrics: "Live metrics", fleetOnline: "FLEET ONLINE", online: "online", vs1h: "vs 1h", fleet: { online: "ONLINE", offline: "OFF", unknown: "UNK" }, readingSla24h: "READING SLA · 24h", target: "target", activeOutages: "ACTIVE OUTAGES", affectedMeters: "meters affected", alarm: { crit: "CRIT", warn: "WARN", viewDetails: "View {{slug}} details" }, tape: { ariaLabel: "Recent system events" }, tapePrefix: "TAPE", fleetActive: "Active Comm. Units · 24h", fleetTotal: "/ {{total}}", fleetOnlinePct: "{{pct}}%", fleetDeltaHourly: "+{{delta}} ↑ 1h", slaToday: "Read Rate · Today", slaTargetCaption: "Target {{target}}%", outagesAffected: "{{count}} meters", outagesWorstRegion: "Worst region: {{region}}", outagesWorstRegionLabel: "Worst region:", ticker: { throughput: "OPS/s", online: "ONLINE", outages: "OUTAGE", dlq: "DLQ", parseRate: "PARSE/s", queue: "QUEUE" } }, zoneA: { mapTitle: "Geographic Command", mapSubtitle: "Turkey · 81 provinces", mapLoading: "Loading...", popupLabels: { outage: "Outage", rssi: "RSSI", sla: "SLA %", simOperator: "SIM Op", reason: "Reason" }, layerButton: { kesinti: "Outage", sinyal: "Signal", sim: "SIM Op", sla: "Reading SLA" }, layerHint: { outage: "outage density", rssi: "RSSI median", sim: "best operator", sla: "reading percent" }, legend: { label: "Legend", noData: "No data" }, popup: { dataMissing: "Awaiting data (STORY-218)" }, panelHeader: { eyebrow: "REGION", modemSuffix: "communication unit", meterSuffix: "meter", noDataCaption: "Awaiting data — active after STORY-218" }, panelBody: { noDataPlaceholder: "No data for this province yet." }, panelFooter: { bestSim: "{{operator}} best — RSSI {{rssi}} dBm", bestSimNoSignal: "{{operator}} best — RSSI no data", noWinner: "No best-operator data", cta: "Open Report →" }, noValue: "—", kesinti: { activeLabel: "Active Outages", affectedSuffix: "affected", affectedNoData: "no affected-meter data", longestLabel: "Longest Outage", noOutage: "no outage", trendTitle: "Outage Trend · 7 Days", legendCount: "Count", legendDuration: "Duration (min)", activeListTitle: "Top Active Outages", emptyList: "No active outages in {{province}}.", trendSummary: "Maximum count: {{maxCount}}; maximum duration: {{maxMinutes}} min." }, sinyal: { title: "SIM Operator · Median Signal (dBm) · {{province}}", noData: "No signal data", footer: "Signal tab selected — detailed regional RSSI breakdown coming soon" }, sim: { title: "Best SIM Operator · {{province}}", noData: "No SIM operator data" }, sla: { todayLabel: "Reading SLA · 24h", targetCaption: "target 99.0%", missingLabel: "Missing Reads", meterSuffix: "meter", noData: "No reading-rate data", footer: "Reading SLA tab selected — meter-level breakdown coming soon", rateAria: "Reading rate: {{value}} percent", missingAria: "Missing reads: {{value}} meters" }, outageReason: { POWER_LOSS: "Power Loss", NETWORK_OUTAGE: "Network Outage", HARDWARE_FAILURE: "Hardware Failure", HIGH_TEMP: "High Temperature", CONNECTION_LOST: "Connection Lost", noOutage: "No outage", noData: "Reason unknown" }, webglFallback: { title: "Your browser does not support WebGL", body: "The geographic command surface requires WebGL to render the 81-province multi-layer map. Please contact your administrator." } }, zones: { zoneAPlaceholder: "Zone A — Multi-Layer Map (STORY-217)", pipelineFunnel: { title: "Pipeline · msg{{unit}}", unit: "/h", empty: "Waiting for data flow", stage: { kalpAtisi: "Heartbeat", hamVeri: "Raw Data", cozumleyici: "Parser", clickHouse: "ClickHouse" } }, parseErrors: { title: "Parse Errors", centerCaption: "ERRORS", empty: "No errors", ariaLabel: "Total {{count}} parse errors" }, simRanking: { title: "SIM Operator TR · Online %", empty: "No operator data" }, integrationHealth: { title: "Integration · Pulse", empty: "No service data", status: { ok: "Healthy", warn: "Warning", crit: "Critical" }, metric: { unreachable: "unreachable", connections: "{{value}} connected", brokers: "{{value}} brokers", dlq_messages: "{{value}} messages", active_streams: "{{value}} active" } }, slaTopBottom: { title: "SLA · Lowest 4 / Highest 4", lowLabel: "▼ Low", highLabel: "▲ High", empty: "No data" }, outageTrend24h: { title: "Outage · 24h Trend", hint: "by region", empty: "No outages", regions: { marmara: "Marmara", ic: "Central Anatolia", karadeniz: "Black Sea", ege: "Aegean", akdeniz: "Mediterranean", diger: "Other" } }, calendarRings: { title: "Calendar · Progress", empty: "No data" } } }, _e = { serial: "Serial Number", protocol: "Protocol", port: "Port", protocolDefaultPort: "Protocol default port", reportedPort: "Port reported by device", firmware: "Firmware", type: "Type", modem: "Modem", location: "Location", lastReading: "last reading", lastCommunication: "Last communication", monthlySuccessRate: "Monthly success rate", quickStatus: "Quick status", meterCount: "Meters", activeAlarms: "Active Alarms", activeOrders: "Active Orders", orderSuitability: { title: "Order processing", accessYes: "Reachable", accessNo: "Unreachable", tiers: "Waiting orders — Urgent {{urgent}} · Normal {{normal}} · Bulk {{bulk}}", status: { SUITABLE: "Suitable", NO_ORDERS: "No Waiting Orders", NOT_SUITABLE: "Not Suitable", UNKNOWN: "Unknown" }, hint: { SUITABLE: "Nothing blocks order processing. Reachability is shown separately.", NO_ORDERS: "Nothing blocks order processing, and no orders are waiting.", NOT_SUITABLE: "Something blocks order processing.", UNKNOWN: "Could not be judged: the unit's status or transport type is unknown." }, reason: { PROTOCOL_MISSING: "No protocol is defined on the unit; orders cannot be sent.", IP_INVALID: "The TCP unit has no or an invalid IP address; no connection can be made.", PORT_INVALID: "The TCP unit's port is invalid (outside 1–65535).", POWER_OUTAGE: "The unit has an active power outage; orders are rejected until it ends.", NOT_INSTALLED: "The unit is not installed; orders are only created for installed units." } }, uptime: "Uptime", signal: "Signal", readingRate: "Reading Rate", calendar: { title: "Reading calendar", prevMonth: "Previous month", nextMonth: "Next month", months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], dayLabels: ["M", "T", "W", "T", "F", "S", "S"], status: { ok: "Read", warn: "Missing reading", crit: "Reading error", noData: "No data" }, legend: { ok: "Full", warn: "Missing", crit: "Error", noData: "No data" }, cellAria: "{{date}} — {{status}}, {{count}}/{{expected}} readings" }, valueUnknown: "Unknown", recentAlarms: { title: "Recent alarms", severity: { crit: "Critical", warn: "Warning", info: "Info" } } }, ke = { kirmizi: "Red", turuncu: "Orange", sari: "Yellow", yesil: "Green", mavi: "Blue", mor: "Purple", indigo: "Indigo", pembe: "Pink" }, ge = { day: "Day", total: "Total", legend_low: "Low", legend_high: "High" }, pe = { tabs_aria: "Detail tabs" }, he = { topology: { erp_sub: "Enterprise", epias_sub: "Energy Market", mobile_label: "Mobile", mobile_sub: "Customer App", meters_stat: "5M Meters · 220 GB/day · 99% SLA", modem_label: "1M Modems" } }, Ee = { once: "Before", sonra: "After", eklendi: "added", silindi: "removed", eklenen_satir: "Lines added: {{count}}", silinen_satir: "Lines removed: {{count}}", gorunum: "Diff view", birlesik: "Unified", yan_yana: "Side by side", alanlar: "Fields ({{count}})", fark_yok: "No differences — the documents are equal.", fark: "Line diff", degismeyen_satirlar: "⋯ Unchanged lines: {{count}} — show", tur_added: "Added", tur_removed: "Removed", tur_changed: "Changed" }, fe = { zorunlu: "This field is required", desen_uyumsuz: "Invalid format ({{pattern}})", varsayilan: "Default: {{value}}", desen_ipucu: "Invalid format: {{hint}}" }, Te = { anahtar: "Key", deger: "Value", islemler: "Actions", anahtar_zorunlu: "Key is required", anahtar_tekrar: "This key is on more than one row", anahtar_desen: "Invalid key format ({{pattern}})", deger_zorunlu: "Value is required", deger_kisa: "Value is too short (minimum {{count}})", deger_uzun: "Value is too long (maximum {{count}})", satiri_sil: "Remove row {{key}}", ekle: "Add row", bos: "No entries.", anahtar_desen_ipucu: "Invalid key format: {{hint}}" }, Se = { disa_aktar: "Export", format_sec: "Choose a file format", format_xlsx: "Excel (XLSX)", format_csv: "CSV", format_pdf: "PDF", pdf_limit: "Up to {{limit}} rows", hazirlaniyor: "Preparing…", hazirlaniyor_yuzde: "Preparing… {{progress}}", indirme_basladi: "Download started. If the file does not arrive, download it again from Download History.", arka_planda: "The file is still being prepared. Download it from Download History when it is ready.", indirme_basarisiz: "The file could not be downloaded. Try again from Download History in a moment.", gecmisi_ac: "Open Download History", gecmis_indirme_basladi: "Download started. If the file does not arrive, try again.", gecmis_indirme_basarisiz: "The file could not be downloaded. Try again in a moment.", iptal_edildi: "The export was cancelled.", status_queued: "Queued", status_running: "Running", status_completed: "Completed", status_failed: "Failed", status_cancelled: "Cancelled", status_expired: "Expired", iptal_istendi: "Cancel requested", kolon_rapor: "Report", kolon_olusturan: "Created by", kolon_talep: "Requested", kolon_bitis: "Finished", kolon_durum: "Status", kolon_ilerleme: "Progress", kolon_kayit: "Rows", kolon_boyut: "Size", kolon_hata: "Error", kolon_islemler: "Actions", indir: "Download", indir_aria: "Download {{name}}", iptal_et: "Cancel", iptal_aria: "Cancel export {{name}}", adsiz: "Untitled export", bos_baslik: "No exports", bos_aciklama: "No export has been started yet.", liste_hata: "Could not load the download history.", hata_satiri: "Code: {{code}}, Error: {{message}}", hata_export_001: "Export not found.", hata_export_002: "The file has expired and can no longer be downloaded.", hata_export_003: "An identical export is already in progress. Please check Download History.", hata_export_004: "You can run at most {{limit}} exports at a time. Wait for one to finish.", hata_export_005: "The system is busy. Please try again shortly.", hata_export_006: "This list cannot be exported.", hata_export_007: "There were no rows to export.", hata_export_008: "The export ran out of time or retries.", hata_export_009: "The export stopped because you no longer have access to this data.", hata_export_010: "File storage is unavailable. Please try again.", hata_export_011: "This is not possible in the export's current state.", hata_export_012: "The list service answered unexpectedly; the export could not finish.", hata_export_013: "The export columns are invalid.", hata_export_014: "PDF is limited to {{limit}} rows. Choose Excel or CSV.", hata_dogrulama: "The export request is invalid.", hata_yetki: "You are not allowed to see everyone's exports.", hata_genel: "The export failed." }, n = {
|
|
38
|
+
common: x,
|
|
39
|
+
table: W,
|
|
40
|
+
form: F,
|
|
41
|
+
dialog: K,
|
|
42
|
+
order: V,
|
|
43
|
+
monitoring: j,
|
|
44
|
+
months: q,
|
|
45
|
+
weekDays: $,
|
|
46
|
+
cron: Q,
|
|
47
|
+
timeline: J,
|
|
48
|
+
live: X,
|
|
49
|
+
notifications: Z,
|
|
50
|
+
map: ee,
|
|
51
|
+
theme: ae,
|
|
52
|
+
date: te,
|
|
53
|
+
pagination: ie,
|
|
54
|
+
empty: re,
|
|
55
|
+
status: ne,
|
|
56
|
+
editablegrid: oe,
|
|
57
|
+
filter: le,
|
|
58
|
+
json_editor: se,
|
|
59
|
+
rich_text_editor: de,
|
|
60
|
+
map_shell: me,
|
|
61
|
+
aria: ue,
|
|
62
|
+
detail_status: ye,
|
|
63
|
+
dashboard: ce,
|
|
64
|
+
detail_hero: _e,
|
|
65
|
+
color: ke,
|
|
66
|
+
grid: ge,
|
|
67
|
+
detail: pe,
|
|
68
|
+
auth: he,
|
|
69
|
+
json_diff: Ee,
|
|
70
|
+
parameter_form: fe,
|
|
71
|
+
key_value_editor: Te,
|
|
72
|
+
export_job: Se
|
|
73
|
+
}, Ae = {
|
|
74
|
+
tr: { common: r },
|
|
75
|
+
en: { common: n }
|
|
76
|
+
};
|
|
77
|
+
function be(e, o = {}) {
|
|
78
|
+
const { namespace: a = "common", overwrite: t = !1, deep: i = !0 } = o;
|
|
79
|
+
return e.addResourceBundle("tr", a, r, i, t), e.addResourceBundle("en", a, n, i, t), e;
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
n as e,
|
|
83
|
+
be as r,
|
|
84
|
+
r as t,
|
|
85
|
+
Ae as u
|
|
86
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { RitimTone } from '../molecules/StatusGlyph';
|
|
3
|
+
import { RitimStatus, RitimTag } from './ritimIdentity';
|
|
4
|
+
export interface DetailHeroFigure {
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
/** `undefined` while unknown or loading: the cell reads "—". */
|
|
8
|
+
value: ReactNode | undefined;
|
|
9
|
+
/** A failing or warning figure is drawn in its tone while above zero; the others stay in ink. */
|
|
10
|
+
tone?: RitimTone;
|
|
11
|
+
/** Quiet context under the value (e.g. why it is unknown, how it splits); one or two short lines. */
|
|
12
|
+
note?: ReactNode;
|
|
13
|
+
/** Makes the whole cell open what the figure counts (e.g. its tab); announced with the label. */
|
|
14
|
+
onSelect?: () => void;
|
|
15
|
+
}
|
|
16
|
+
export interface DetailHeroMeta {
|
|
17
|
+
key: string;
|
|
18
|
+
label: string;
|
|
19
|
+
value: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
export interface DetailHeroProps {
|
|
22
|
+
/** Who it is (e.g. the slug) — the page's largest line. */
|
|
23
|
+
title: ReactNode;
|
|
24
|
+
/** Quiet content on the title's line, after it (e.g. a copyable IMEI). */
|
|
25
|
+
titleAside?: ReactNode;
|
|
26
|
+
/** One quiet identity line (brand model, protocol, firmware). */
|
|
27
|
+
subtitle?: ReactNode;
|
|
28
|
+
/** Names the states list for screen readers (e.g. "Haberleşme ünitesi durumu"). */
|
|
29
|
+
statusLabel: string;
|
|
30
|
+
statuses?: RitimStatus[];
|
|
31
|
+
tags?: RitimTag[];
|
|
32
|
+
/** Short facts under the states (e.g. location, address, last reading). */
|
|
33
|
+
facts?: ReactNode;
|
|
34
|
+
/** The record's own actions (primary first). */
|
|
35
|
+
actions?: ReactNode;
|
|
36
|
+
/** The middle column: what the record has been doing lately (e.g. its reading rhythm). */
|
|
37
|
+
activity?: ReactNode;
|
|
38
|
+
/** Key figures in a two-column grid, right of the activity. */
|
|
39
|
+
figures?: DetailHeroFigure[];
|
|
40
|
+
/** Identity facts in one row under the columns (serial, IMEI, IP, location, …). */
|
|
41
|
+
meta?: DetailHeroMeta[];
|
|
42
|
+
/** The record's sections (kit DetailTabs), drawn along the bottom edge of the hero. */
|
|
43
|
+
tabs?: ReactNode;
|
|
44
|
+
className?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Faz 7 detail page standard (Lena Ritmi, unit detail): one panel holding the record's identity, its states and
|
|
48
|
+
* actions, its recent activity, a few figures and its identity facts, with the section tabs along its bottom edge.
|
|
49
|
+
*/
|
|
50
|
+
export declare function DetailHero({ title, titleAside, subtitle, statusLabel, statuses, tags, facts, actions, activity, figures, meta, tabs, className, }: DetailHeroProps): import("react").JSX.Element;
|
|
51
|
+
//# sourceMappingURL=DetailHero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailHero.d.ts","sourceRoot":"","sources":["../../src/templates/DetailHero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAmD,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,iGAAiG;IACjG,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qGAAqG;IACrG,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,KAAK,EAAE,SAAS,CAAC;IACjB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mFAAmF;IACnF,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,SAAS,GACV,EAAE,eAAe,+BAiGjB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface DetailHeroFact {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** The value line; `null` / `undefined` reads "—". */
|
|
6
|
+
value: ReactNode;
|
|
7
|
+
/** One quiet line under the value (e.g. an exact date, coordinates). */
|
|
8
|
+
detail?: ReactNode;
|
|
9
|
+
/** `"full"` spans every column (e.g. a list of tags whose names run long). */
|
|
10
|
+
span?: "full";
|
|
11
|
+
}
|
|
12
|
+
export interface DetailHeroFactsProps {
|
|
13
|
+
facts: DetailHeroFact[];
|
|
14
|
+
/** Columns from the `sm` breakpoint up; one below it. Default 2. */
|
|
15
|
+
columns?: 2 | 3;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Faz 7 detail hero facts: label over value in two or three even columns (one on narrow screens), read row by row — the same
|
|
20
|
+
* label / value voice as the hero's figures, so every value starts at the same edge.
|
|
21
|
+
*/
|
|
22
|
+
export declare function DetailHeroFacts({ facts, columns, className }: DetailHeroFactsProps): import("react").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=DetailHeroFacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailHeroFacts.d.ts","sourceRoot":"","sources":["../../src/templates/DetailHeroFacts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,EAAE,SAAS,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAW,EAAE,SAAS,EAAE,EAAE,oBAAoB,+BAuBtF"}
|
|
@@ -9,9 +9,17 @@ export interface ActiveFilter {
|
|
|
9
9
|
* whatever `FilterPanel` applied. The chip used to hardcode `"="`, so a user who
|
|
10
10
|
* filtered "Status ≠ Timeout" read it back as "Status=TIMEOUT" and could not tell
|
|
11
11
|
* which operator was live. Use the SYMBOL, not the wire operator name.
|
|
12
|
+
* (NB-CHIP-OPERATOR-01)
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* Spacing (NB-ACTIVEFILTER-SPACING-01): the chip owns it. The three parts are
|
|
15
|
+
* trimmed and joined with one space — "Kayıt Tarihi ≥ 01.10.2026" — so an
|
|
16
|
+
* operator handed in already spaced (`" ≥ "`) reads the same as a tight one,
|
|
17
|
+
* and a word operator keeps its own punctuation (`" tümü: "` → "Etiketler
|
|
18
|
+
* tümü: Pilot"). A bare `":"` hugs the label: "Tarih: 01.10.2026".
|
|
19
|
+
* Without an `operator` the chip reads "label: value" — the old implicit
|
|
20
|
+
* `"="` claimed an equality the caller never stated (a range chip read
|
|
21
|
+
* "Tarih=01.10 – 26.10"). The remove button's `aria-label` carries the same
|
|
22
|
+
* spaced text.
|
|
15
23
|
*
|
|
16
24
|
* `value` stays the caller's to format: the package cannot know that `TIMEOUT`
|
|
17
25
|
* displays as "Zaman Aşımı".
|
|
@@ -20,8 +28,6 @@ export interface ActiveFilter {
|
|
|
20
28
|
* (`getFilterOperatorSymbol("IS_EMPTY")`) — or the wire code itself — with
|
|
21
29
|
* `value: ""`, and the chip reads the test in words, "Durum: Boş" /
|
|
22
30
|
* "Status: Is Empty", instead of a bare symbol with nothing after it.
|
|
23
|
-
*
|
|
24
|
-
* @default "="
|
|
25
31
|
*/
|
|
26
32
|
operator?: string;
|
|
27
33
|
}
|
|
@@ -35,12 +41,34 @@ export interface ListPageLayoutProps {
|
|
|
35
41
|
searchSlot?: ReactNode;
|
|
36
42
|
filterCount?: number;
|
|
37
43
|
/**
|
|
38
|
-
* Optional callback for
|
|
39
|
-
*
|
|
40
|
-
*
|
|
44
|
+
* Optional callback for the [Filtre] toggle the template renders. Pass
|
|
45
|
+
* {@link ListPageLayoutProps.filterOpen} with it so the button announces its
|
|
46
|
+
* state. (NB-LISTLAYOUT-FILTER-A11Y-01)
|
|
41
47
|
*/
|
|
42
48
|
onFilterToggle?: () => void;
|
|
49
|
+
/**
|
|
50
|
+
* Whether the filter rail the [Filtre] toggle opens is open — set on the
|
|
51
|
+
* button as `aria-expanded`. While the template renders a `sidePanel`, the
|
|
52
|
+
* button also points at it with `aria-controls` (the rail's `id`). Omitted →
|
|
53
|
+
* no `aria-expanded`, exactly as before: the template cannot know the state.
|
|
54
|
+
* (NB-LISTLAYOUT-FILTER-A11Y-01)
|
|
55
|
+
*/
|
|
56
|
+
filterOpen?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* `id` of the `sidePanel` rail (`<aside>`), which the [Filtre] toggle's
|
|
59
|
+
* `aria-controls` names. @default a generated unique id
|
|
60
|
+
* (NB-LISTLAYOUT-FILTER-A11Y-01)
|
|
61
|
+
*/
|
|
62
|
+
sidePanelId?: string;
|
|
43
63
|
activeFilters?: ActiveFilter[];
|
|
64
|
+
/**
|
|
65
|
+
* Content rendered FIRST in the active-filter row, before the chips, sharing
|
|
66
|
+
* the row's wrapping — e.g. a loaded saved filter's chip with its own
|
|
67
|
+
* buttons. While it is set the row is drawn even with no `activeFilters`;
|
|
68
|
+
* [Temizle] is still shown only while there are chips to clear (the slot's
|
|
69
|
+
* own controls are the caller's). (NB-LISTLAYOUT-FILTERROW-SLOT-01)
|
|
70
|
+
*/
|
|
71
|
+
activeFiltersLeading?: ReactNode;
|
|
44
72
|
onRemoveFilter?: (key: string) => void;
|
|
45
73
|
onClearFilters?: () => void;
|
|
46
74
|
/**
|
|
@@ -54,7 +82,11 @@ export interface ListPageLayoutProps {
|
|
|
54
82
|
* does not catch it). All MDM + HES list pages already carry this wrapper.
|
|
55
83
|
*/
|
|
56
84
|
sidePanel?: ReactNode;
|
|
57
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* Optional tab strip rendered above the toolbar row (primary in-page navigation). Pass your own `<Tabs>`/`<UnifiedTabs>`.
|
|
87
|
+
* With `showTitle`, the tabs sit right under the heading and everything tab-scoped follows them: the summary, then
|
|
88
|
+
* one row of Filtre / search / chips … and the action group (create, export) at its end — each tab its own toolbar.
|
|
89
|
+
*/
|
|
58
90
|
tabsSlot?: ReactNode;
|
|
59
91
|
/** Leading toolbar content — entity label + count, or informational metadata (e.g. "Modemler · 1.234", last-updated). Rendered at the start of the toolbar row. */
|
|
60
92
|
toolbarMeta?: ReactNode;
|
|
@@ -69,8 +101,22 @@ export interface ListPageLayoutProps {
|
|
|
69
101
|
* directly before the create button.
|
|
70
102
|
*/
|
|
71
103
|
beforeFilterActions?: ReactNode;
|
|
104
|
+
/**
|
|
105
|
+
* Lena Ritmi list template: draws `title` as the page heading, with `titleMeta` beside it and the action group
|
|
106
|
+
* on the same row; the search and the chips follow on the next row. Off → the toolbar row as before.
|
|
107
|
+
*/
|
|
108
|
+
showTitle?: boolean;
|
|
109
|
+
/** Quiet text after the heading while `showTitle` is on — e.g. "1.000.000 ünite, filtreyle 128". */
|
|
110
|
+
titleMeta?: ReactNode;
|
|
111
|
+
/** The list's summary (e.g. a `DistributionPanel`), between the heading and the search row. */
|
|
112
|
+
summary?: ReactNode;
|
|
113
|
+
/**
|
|
114
|
+
* While `showTitle` is on: controls at the end of the filter row (e.g. saved filters) — everything about filtering
|
|
115
|
+
* sits on that one row, the heading keeps the page's own actions.
|
|
116
|
+
*/
|
|
117
|
+
filterActions?: ReactNode;
|
|
72
118
|
children: ReactNode;
|
|
73
119
|
className?: string;
|
|
74
120
|
}
|
|
75
|
-
export declare function ListPageLayout({ breadcrumbs, createButton, searchSlot, filterCount, onFilterToggle, activeFilters, onRemoveFilter, onClearFilters, sidePanel, tabsSlot, toolbarMeta, secondaryActions, beforeFilterActions, children, className, }: ListPageLayoutProps): import("react").JSX.Element;
|
|
121
|
+
export declare function ListPageLayout({ title, breadcrumbs, createButton, searchSlot, filterCount, onFilterToggle, filterOpen, sidePanelId, activeFilters, activeFiltersLeading, onRemoveFilter, onClearFilters, sidePanel, tabsSlot, toolbarMeta, secondaryActions, beforeFilterActions, showTitle, titleMeta, summary, filterActions, children, className, }: ListPageLayoutProps): import("react").JSX.Element;
|
|
76
122
|
//# sourceMappingURL=ListPageLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListPageLayout.d.ts","sourceRoot":"","sources":["../../src/templates/ListPageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ListPageLayout.d.ts","sourceRoot":"","sources":["../../src/templates/ListPageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAiB9D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACtD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,mKAAmK;IACnK,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,yIAAyI;IACzI,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oGAAoG;IACpG,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,+FAA+F;IAC/F,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,SAAS,EACT,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,SAAiB,EACjB,SAAS,EACT,OAAO,EACP,aAAa,EACb,QAAQ,EACR,SAAS,GACV,EAAE,mBAAmB,+BAiNrB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ButtonHTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import { BreadcrumbItem } from '../organisms/Breadcrumb';
|
|
3
|
+
export interface MasterDetailLayoutProps {
|
|
4
|
+
title: string;
|
|
5
|
+
/** Quiet text after the title. */
|
|
6
|
+
titleMeta?: ReactNode;
|
|
7
|
+
/** Written to the app header (the page draws none itself). */
|
|
8
|
+
breadcrumbs: BreadcrumbItem[];
|
|
9
|
+
/** The page's own actions, at the end of the heading row. */
|
|
10
|
+
actions?: ReactNode;
|
|
11
|
+
/** Primary in-page navigation, right under the heading. */
|
|
12
|
+
tabsSlot?: ReactNode;
|
|
13
|
+
/** Accessible name of the master pane. */
|
|
14
|
+
masterLabel: string;
|
|
15
|
+
/** Pinned at the top of the master pane (search, a scope switch). */
|
|
16
|
+
masterSearch?: ReactNode;
|
|
17
|
+
/** The master list; it scrolls inside the pane. */
|
|
18
|
+
master: ReactNode;
|
|
19
|
+
/** Pinned at the bottom of the master pane (e.g. "82 / 82 il"). */
|
|
20
|
+
masterFooter?: ReactNode;
|
|
21
|
+
/** The selected record, or the empty state that asks for one. */
|
|
22
|
+
detail: ReactNode;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Lena Ritmi master-detail template: the shared heading, then the master list in a pane as tall as the window that
|
|
27
|
+
* sticks under the app header and scrolls inside itself, and the detail beside it — a long master list never leaves
|
|
28
|
+
* the detail behind at the top. The page's own width decides (a container query, so an open app menu counts): when
|
|
29
|
+
* it is too narrow for both, a short list sits above the detail and the detail stays in view.
|
|
30
|
+
*/
|
|
31
|
+
export declare function MasterDetailLayout({ title, titleMeta, breadcrumbs, actions, tabsSlot, masterLabel, masterSearch, master, masterFooter, detail, className, }: MasterDetailLayoutProps): import("react").JSX.Element;
|
|
32
|
+
export interface MasterListItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type"> {
|
|
33
|
+
/** The record the detail shows. */
|
|
34
|
+
selected: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* The standard row: the record's code or name. With it the row draws `primary` (and `primaryMeta` after it) over
|
|
37
|
+
* `secondary`, and `trailing` at the end — every master list of this kind then has the same height and rhythm.
|
|
38
|
+
* Without it the row renders its `children`.
|
|
39
|
+
*/
|
|
40
|
+
primary?: ReactNode;
|
|
41
|
+
/** Quiet figure after the primary text (e.g. the value count). */
|
|
42
|
+
primaryMeta?: ReactNode;
|
|
43
|
+
/** Second line under the primary text. */
|
|
44
|
+
secondary?: ReactNode;
|
|
45
|
+
/** At the end of the row (owner badges, markers). */
|
|
46
|
+
trailing?: ReactNode;
|
|
47
|
+
/** The primary text is a code: monospace. */
|
|
48
|
+
mono?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** One row of a master list: the whole row selects it, the selected one carries the primary edge and tint. */
|
|
51
|
+
export declare function MasterListItem({ selected, primary, primaryMeta, secondary, trailing, mono, className, children, ...rest }: MasterListItemProps): import("react").JSX.Element;
|
|
52
|
+
//# sourceMappingURL=MasterDetailLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MasterDetailLayout.d.ts","sourceRoot":"","sources":["../../src/templates/MasterDetailLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM9D,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8DAA8D;IAC9D,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,mDAAmD;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,mEAAmE;IACnE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,iEAAiE;IACjE,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,SAAS,EACT,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,MAAM,EACN,SAAS,GACV,EAAE,uBAAuB,+BAwCzB;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAChG,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kEAAkE;IAClE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,8GAA8G;AAC9G,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,mBAAmB,+BA+CrB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface PageHeadingProps {
|
|
3
|
+
title: ReactNode;
|
|
4
|
+
/** Quiet text after the title — e.g. "1.000.000 ünite, filtreyle 128". */
|
|
5
|
+
meta?: ReactNode;
|
|
6
|
+
/** The page's own actions, at the end of the row. */
|
|
7
|
+
actions?: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Lena Ritmi page heading: the one title row every page template draws (list, master-detail, plain page), so the
|
|
11
|
+
* screens share their type, spacing and action placement.
|
|
12
|
+
*/
|
|
13
|
+
export declare function PageHeading({ title, meta, actions }: PageHeadingProps): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=PageHeading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeading.d.ts","sourceRoot":"","sources":["../../src/templates/PageHeading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,gBAAgB,+BAUrE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { BreadcrumbItem } from '../organisms/Breadcrumb';
|
|
3
|
+
export interface PageLayoutProps {
|
|
4
|
+
title: string;
|
|
5
|
+
/** Quiet text after the title. */
|
|
6
|
+
titleMeta?: ReactNode;
|
|
7
|
+
/** Written to the app header (the page draws none itself). */
|
|
8
|
+
breadcrumbs: BreadcrumbItem[];
|
|
9
|
+
/** The page's own actions, at the end of the heading row. */
|
|
10
|
+
actions?: ReactNode;
|
|
11
|
+
/** Primary in-page navigation, right under the heading. */
|
|
12
|
+
tabsSlot?: ReactNode;
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Lena Ritmi page template for a screen that is not a list — a status board, a summary, a settings form: the same
|
|
18
|
+
* heading as `ListPageLayout` and `MasterDetailLayout`, then the tabs, then the content on the page's rhythm.
|
|
19
|
+
*/
|
|
20
|
+
export declare function PageLayout({ title, titleMeta, breadcrumbs, actions, tabsSlot, children, className }: PageLayoutProps): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=PageLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageLayout.d.ts","sourceRoot":"","sources":["../../src/templates/PageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8DAA8D;IAC9D,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,+BASpH"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SummaryBodyProps } from './SummarySheet';
|
|
3
|
+
export interface RecordPanelProps extends Omit<SummaryBodyProps, "figureColumns"> {
|
|
4
|
+
/** Actions of the record at the end of the header row (edit, move, delete). */
|
|
5
|
+
headerActions?: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Lena Ritmi in-page record — the detail pane of a master-detail page: the slide panel's frame (`SummarySheet`) in a
|
|
9
|
+
* card. The kind and the record's actions share the header row; the identity, states and figures follow, then the
|
|
10
|
+
* page's own sections.
|
|
11
|
+
*/
|
|
12
|
+
export declare function RecordPanel({ kind, headerActions, className, ...body }: RecordPanelProps): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=RecordPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordPanel.d.ts","sourceRoot":"","sources":["../../src/templates/RecordPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC/E,+EAA+E;IAC/E,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,+BAmBxF"}
|