From dd7458093caf41e0d2611f82bd254c9f787156d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 17 Aug 2025 15:51:31 +0300 Subject: [PATCH] =?UTF-8?q?Dil=20Deste=C4=9Fi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Seeds/SeederData.json | 1099 +++++++++++++++-- .../importManager/FileUploadArea.tsx | 28 +- .../importManager/ImportDashboard.tsx | 91 +- .../importManager/ImportPreview.tsx | 59 +- .../importManager/ImportProgress.tsx | 24 +- ui/src/components/reports/Dashboard.tsx | 76 +- ui/src/components/reports/ReportGenerator.tsx | 33 +- .../components/reports/ReportHtmlEditor.tsx | 6 +- ui/src/components/reports/ReportViewer.tsx | 31 +- ui/src/components/reports/TemplateCard.tsx | 9 +- ui/src/components/reports/TemplateEditor.tsx | 63 +- 11 files changed, 1282 insertions(+), 237 deletions(-) diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json index f0d40e8d..32726ce0 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json @@ -1279,6 +1279,372 @@ "en": "Report Categories", "tr": "Rapor Kategorileri" }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.All", + "en": "All", + "tr": "Tümü" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.AllDescription", + "en": "Reports from all categories", + "tr": "Tüm kategorilere ait raporlar" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.Loading", + "en": "Loading...", + "tr": "Yükleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.SearchTemplate", + "en": "Search template...", + "tr": "Şablon ara..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.NewTemplate", + "en": "New Template", + "tr": "Yeni Şablon" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.TotalTemplates", + "en": "Total Templates", + "tr": "Toplam Şablon" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.CategoryTemplates", + "en": "Category Templates", + "tr": "Kategori Şablonları" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.ActiveCategories", + "en": "Active Categories", + "tr": "Aktif Kategoriler" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.TotalParameters", + "en": "Total Parameters", + "tr": "Toplam Parametre" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.CategoryParameters", + "en": "Category Parameters", + "tr": "Kategori Parametreleri" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.NoTemplates", + "en": "No templates created yet", + "tr": "Henüz şablon oluşturulmamış" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.TemplateNotFound", + "en": "No template found", + "tr": "Şablon bulunamadı" + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.CreateFirstTemplate", + "en": "Start by creating your first report template.", + "tr": "İlk rapor şablonunuzu oluşturarak başlayın." + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.NoSearchResults", + "en": "No templates match your search criteria.", + "tr": "Arama kriterlerinize uygun şablon bulunamadı." + }, + { + "resourceName": "Platform", + "key": "App.Reports.Dashboard.DeleteTemplateConfirmation", + "en": "Are you sure you want to delete this template?", + "tr": "Bu şablonu silmek istediğinizden emin misiniz?" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.ReportParameters", + "en": "Report Parameters", + "tr": "Rapor Parametreleri" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.ParameterValues", + "en": "Parameter Values", + "tr": "Parametre Değerleri" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.RequiredFieldsNote", + "en": "* Required fields", + "tr": "* Zorunlu alanlar" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.NoParameters", + "en": "No parameters defined for this template.", + "tr": "Bu şablon için parametre tanımlanmamış." + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.DirectGenerate", + "en": "You can directly generate the report.", + "tr": "Direkt rapor oluşturabilirsiniz." + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.Cancel", + "en": "Cancel", + "tr": "İptal" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.Generating", + "en": "Generating...", + "tr": "Oluşturuluyor..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportGenerator.GenerateReport", + "en": "Generate Report", + "tr": "Rapor Oluştur" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportHtmlViewer.Placeholder", + "en": "Write your report template here...", + "tr": "Rapor şablonunuzu buraya yazın..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.LoadingTitle", + "en": "Loading report...", + "tr": "Rapor yükleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.LoadingSubtitle", + "en": "Please wait", + "tr": "Lütfen bekleyin" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.ErrorNotFound", + "en": "Report not found", + "tr": "Rapor bulunamadı" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.ErrorNotFoundDescription", + "en": "The report you are looking for may not exist or has been deleted.", + "tr": "Aradığınız rapor mevcut değil veya silinmiş olabilir." + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.BackToDashboard", + "en": "Back to Dashboard", + "tr": "Ana Sayfaya Dön" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.DownloadPDF", + "en": "Download PDF", + "tr": "PDF İndir" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.Print", + "en": "Print", + "tr": "Yazdır" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.Page", + "en": "Page", + "tr": "Sayfa" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateCard.Show", + "en": "Show", + "tr": "Göster" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateCard.Edit", + "en": "Edit", + "tr": "Düzenle" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateCard.Delete", + "en": "Delete", + "tr": "Sil" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.TitleEdit", + "en": "Edit Template", + "tr": "Şablon Düzenle" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.TitleNew", + "en": "Create New Template", + "tr": "Yeni Şablon Oluştur" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Tab.Info", + "en": "Template Info", + "tr": "Şablon Bilgileri" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Tab.Parameters", + "en": "Parameters", + "tr": "Parametreler" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Tab.Content", + "en": "HTML Content", + "tr": "HTML İçerik" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Label.Name", + "en": "Template Name", + "tr": "Şablon Adı" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Placeholder.Name", + "en": "Report template name", + "tr": "Rapor şablonu adı" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Label.Category", + "en": "Category", + "tr": "Kategori" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Label.Tags", + "en": "Tags", + "tr": "Etiketler" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Placeholder.AddTag", + "en": "Add tag...", + "tr": "Etiket ekle..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Button.Add", + "en": "Add", + "tr": "Ekle" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Label.Description", + "en": "Template Description", + "tr": "Şablon Açıklaması" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Placeholder.Description", + "en": "Write detailed description about the template...", + "tr": "Şablon hakkında detaylı açıklama yazın..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.NoParameters", + "en": "No parameters detected yet", + "tr": "Henüz parametre algılanmadı" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.NoParametersDescription", + "en": "When you use parameters in the format @@PARAMETER in HTML content, they will appear here.", + "tr": "HTML içeriğinde @@PARAMETRE formatında parametreler kullandığınızda burada görünecek." + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Placeholder.ParameterDescription", + "en": "Parameter description", + "tr": "Parametre açıklaması" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Placeholder.DefaultValue", + "en": "Default value", + "tr": "Varsayılan değer" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Label.Required", + "en": "Required", + "tr": "Zorunlu" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Button.Cancel", + "en": "Cancel", + "tr": "İptal" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Button.Saving", + "en": "Saving...", + "tr": "Kaydediliyor..." + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Button.Update", + "en": "Update", + "tr": "Güncelle" + }, + { + "resourceName": "Platform", + "key": "App.Reports.TemplateEditor.Button.Save", + "en": "Save", + "tr": "Kaydet" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.ReportIdMissing", + "en": "Report ID not found", + "tr": "Rapor ID'si bulunamadı" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.ReportLoadError", + "en": "An error occurred while loading the report", + "tr": "Rapor yüklenirken bir hata oluştu" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.ZoomIn", + "en": "Zoom In", + "tr": "Yakınlaştır" + }, + { + "resourceName": "Platform", + "key": "App.Reports.ReportViewer.ZoomOut", + "en": "Zoom Out", + "tr": "Uzaklaştır" + }, { "resourceName": "Platform", "key": "App.Menus.Menu", @@ -1339,6 +1705,360 @@ "en": "Charts", "tr": "Grafikler" }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.DropHere", + "en": "Drop the file here", + "tr": "Dosyayı buraya bırakın" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.UploadYourFile", + "en": "Upload your file", + "tr": "Dosyanızı yükleyin" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.DragOrClick", + "en": "Drag & drop or click to select", + "tr": "Sürükleyip bırakın veya seçmek için tıklayın" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.SupportedFormats", + "en": "Supported formats", + "tr": "Desteklenen formatlar" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.FileTypeError", + "en": "File type not supported. Accepted formats:", + "tr": "Dosya türü desteklenmiyor. Kabul edilen formatlar:" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Uploading", + "en": "Uploading...", + "tr": "Yükleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.UploadFile", + "en": "Upload File", + "tr": "Dosya Yükle" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Tab.Import", + "en": "Import", + "tr": "İçe Aktar" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Tab.Preview", + "en": "Preview", + "tr": "Önizleme" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Tab.History", + "en": "History", + "tr": "Geçmiş" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.TemplateColumns", + "en": "Template Columns", + "tr": "Şablon Kolonları" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ExcelTemplate", + "en": "Excel Template", + "tr": "Excel Şablonu" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.CsvTemplate", + "en": "CSV Template", + "tr": "CSV Şablonu" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Column", + "en": "Column", + "tr": "Kolon" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Type", + "en": "Type", + "tr": "Tip" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Required", + "en": "Required", + "tr": "Zorunlu" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Default", + "en": "Default", + "tr": "Varsayılan" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Yes", + "en": "Yes", + "tr": "Evet" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.No", + "en": "No", + "tr": "Hayır" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.GeneratingTemplate", + "en": "Generating template...", + "tr": "Şablon oluşturuluyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.UploadData", + "en": "Upload Data", + "tr": "Veri Yükle" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.NoDataToPreview", + "en": "No Data to Preview", + "tr": "Önizlenecek Veri Yok" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.UploadFileToPreview", + "en": "Upload a file to see the preview here", + "tr": "Önizlemeyi görmek için bir dosya yükleyin" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportHistory", + "en": "Import History", + "tr": "İçe Aktarma Geçmişi" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Active", + "en": "Active", + "tr": "Aktif" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ViewExecutionDetails", + "en": "View execution details", + "tr": "Çalıştırma detaylarını gör" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.RefreshExecutionDetails", + "en": "Refresh execution details", + "tr": "Çalıştırma detaylarını yenile" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.CannotDeleteActiveSession", + "en": "Cannot delete the current active session", + "tr": "Aktif oturum silinemez" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.DeleteImportSession", + "en": "Delete this import session", + "tr": "Bu içe aktarma oturumunu sil" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.LoadingExecutionDetails", + "en": "Loading execution details...", + "tr": "Çalıştırma detayları yükleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Executed", + "en": "executed", + "tr": "çalıştırıldı" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Valid", + "en": "valid", + "tr": "geçerli" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Errors", + "en": "errors", + "tr": "hata" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.NoExecutionRecords", + "en": "No execution records found", + "tr": "Çalıştırma kaydı bulunamadı" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.NoImportHistory", + "en": "No import history", + "tr": "İçe aktarma geçmişi yok" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportHistoryHint", + "en": "Your import history will appear here", + "tr": "İçe aktarma geçmişiniz burada görünecek" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportPreviewTitle", + "en": "Import Preview", + "tr": "İçe Aktarma Önizlemesi" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.TotalRows", + "en": " Total Rows", + "tr": " Toplam Satır" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Status.Processing", + "en": "Processing", + "tr": "İşleniyor" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.DataPreviewTitle", + "en": "Data Preview", + "tr": "Veri Önizleme" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.NoDataFoundTitle", + "en": "No Data Found", + "tr": "Veri Bulunamadı" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.NoDataFoundDescription", + "en": "Unable to parse data from the uploaded file. Please check the file format and content.", + "tr": "Yüklenen dosyadan veri alınamadı. Lütfen dosya biçimini ve içeriğini kontrol edin." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.LoadingPreviewTitle", + "en": "Loading Preview...", + "tr": "Önizleme Yükleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.LoadingPreviewDescription", + "en": "Analyzing uploaded file content...", + "tr": "Yüklenen dosya içeriği analiz ediliyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportSuccessMessage", + "en": "Import completed successfully!", + "tr": "İçe aktarma başarıyla tamamlandı!" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.SelectRowsWarning", + "en": "Please select rows to import using checkboxes", + "tr": "Lütfen içe aktarmak için kutucukları kullanarak satırları seçin" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.RowsSelected", + "en": " rows selected for import", + "tr": " satır içe aktarılmak üzere seçildi" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.NoRowsAvailable", + "en": "No data available for import", + "tr": "İçe aktarılacak veri yok" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Button.Cancel", + "en": "Cancel", + "tr": "İptal" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Button.ExecuteImport", + "en": "Execute Import", + "tr": "İçe Aktarımı Başlat" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.Button.Processing", + "en": "Processing...", + "tr": "İşleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.Status.Uploading", + "en": "Uploading file...", + "tr": "Dosya yükleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.Status.Validating", + "en": "Validating data...", + "tr": "Veriler doğrulanıyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.Status.Processing", + "en": "Processing import...", + "tr": "İçe aktarma işleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.Status.Uploaded", + "en": "Import completed successfully!", + "tr": "İçe aktarma başarıyla tamamlandı!" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.Status.Failed", + "en": "Import failed. Please check the errors.", + "tr": "İçe aktarma başarısız. Lütfen hataları kontrol edin." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.Status.Default", + "en": "Processing...", + "tr": "İşleniyor..." + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.ProcessingFile", + "en": "Processing", + "tr": "İşleniyor" + }, + { + "resourceName": "Platform", + "key": "App.Listforms.ImportManager.ImportProgress.ProgressLabel", + "en": "Progress", + "tr": "İlerleme" + }, { "resourceName": "Platform", "key": "App.BackgroundWorkers", @@ -8697,7 +9417,10 @@ "descriptionKey": "Abp.Localization.DefaultLanguage.Description", "defaultValue": "en", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -8731,7 +9454,10 @@ "descriptionKey": "Abp.Localization.Timezone.Description", "defaultValue": "UTC", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -8887,7 +9613,11 @@ "descriptionKey": "App.SiteManagement.Theme.Style.Description", "defaultValue": "dx.light.compact", "isVisibleToClients": true, - "providers": ["U", "G", "D"], + "providers": [ + "U", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -8935,7 +9665,10 @@ "descriptionKey": "App.SiteManagement.General.NewMemberNotificationEmails.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -8951,7 +9684,10 @@ "descriptionKey": "App.SiteManagement.General.TimedLoginEmails.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.SiteManagement", @@ -8967,7 +9703,11 @@ "descriptionKey": "App.Sender.Sms.PostaGuvercini.Url.Description", "defaultValue": "https://www.postaguvercini.com/api_http", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -8983,7 +9723,11 @@ "descriptionKey": "App.Sender.Sms.PostaGuvercini.Username.Description", "defaultValue": "2AIlj4QlCrvlbDDBS/712A==", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": true, "mainGroupKey": "App.Sender", @@ -8999,7 +9743,11 @@ "descriptionKey": "App.Sender.Sms.PostaGuvercini.Password.Description", "defaultValue": "oTuwyZM9sxfJI+jDH5wJAw==", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": true, "mainGroupKey": "App.Sender", @@ -9015,7 +9763,11 @@ "descriptionKey": "App.Sender.WhatsApp.Url.Description", "defaultValue": "https://graph.facebook.com/v21.0", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9031,7 +9783,11 @@ "descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description", "defaultValue": "442035112335974", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9047,7 +9803,11 @@ "descriptionKey": "App.Sender.WhatsApp.Token.Description", "defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9063,7 +9823,11 @@ "descriptionKey": "App.Sender.WhatsApp.TemplateName.Description", "defaultValue": "kurs_platform_notification", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9079,7 +9843,10 @@ "descriptionKey": "App.Sender.Rocket.Url.Description", "defaultValue": "https://chat.sozsoft.com/api/v1", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9095,7 +9862,10 @@ "descriptionKey": "App.Sender.Rocket.UserId.Description", "defaultValue": "LfpzPjzag4QJXm84N", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9111,7 +9881,10 @@ "descriptionKey": "App.Sender.Rocket.Token.Description", "defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "App.Sender", @@ -9127,7 +9900,11 @@ "descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description", "defaultValue": "Kurs", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9143,7 +9920,11 @@ "descriptionKey": "Abp.Mailing.DefaultFromAddress.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9159,7 +9940,11 @@ "descriptionKey": "Abp.Mailing.Smtp.UserName.Description", "defaultValue": "system@sozsoft.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9175,7 +9960,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Password.Description", "defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": true, "mainGroupKey": "Abp.Mailing", @@ -9191,7 +9980,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Host.Description", "defaultValue": "127.0.0.1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9207,7 +10000,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Port.Description", "defaultValue": "25", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9223,7 +10020,11 @@ "descriptionKey": "Abp.Mailing.Smtp.Domain.Description", "defaultValue": "sozsoft.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9239,7 +10040,11 @@ "descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9255,7 +10060,11 @@ "descriptionKey": "Abp.Mailing.AWS.Profile.Description", "defaultValue": "mail-sdk-user", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9271,7 +10080,11 @@ "descriptionKey": "Abp.Mailing.AWS.Region.Description", "defaultValue": "eu-central-1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9287,7 +10100,11 @@ "descriptionKey": "Abp.Mailing.AWS.AccessKey.Description", "defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9303,7 +10120,11 @@ "descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description", "defaultValue": "AKIATULUYBLX4IY3S2P1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Mailing", @@ -9319,7 +10140,10 @@ "descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9335,7 +10159,10 @@ "descriptionKey": "Abp.Account.EnableLocalLogin.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9351,7 +10178,11 @@ "descriptionKey": "Abp.Account.TwoFactor.Enabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9367,7 +10198,10 @@ "descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description", "defaultValue": "3", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9383,7 +10217,10 @@ "descriptionKey": "Abp.Account.Captcha.EndPoint.Description", "defaultValue": "https://challenges.cloudflare.com/turnstile/v0/siteverify", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9399,7 +10236,10 @@ "descriptionKey": "Abp.Account.Captcha.SiteKey.Description", "defaultValue": "0x4AAAAAAAGadwQME-GSYuJU", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9415,7 +10255,10 @@ "descriptionKey": "Abp.Account.Captcha.SecretKey.Description", "defaultValue": "0x4AAAAAAAGad_f_WP47IcNBs9FTu5DhNX8", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Account", @@ -9431,7 +10274,11 @@ "descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9447,7 +10294,11 @@ "descriptionKey": "Abp.Identity.Profile.General.BlacklistedEmailProviders.Description", "defaultValue": "gmail.com\r\nyahoo.com\r\nhotmail.com", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9463,7 +10314,11 @@ "descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9479,7 +10334,11 @@ "descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description", "defaultValue": "0", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9495,7 +10354,11 @@ "descriptionKey": "Abp.Identity.Password.RequiredLength.Description", "defaultValue": "6", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9511,7 +10374,11 @@ "descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description", "defaultValue": "1", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9527,7 +10394,11 @@ "descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9543,7 +10414,11 @@ "descriptionKey": "Abp.Identity.Password.RequireLowercase.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9559,7 +10434,11 @@ "descriptionKey": "Abp.Identity.Password.RequireUppercase.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9575,7 +10454,11 @@ "descriptionKey": "Abp.Identity.Password.RequireDigit.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9591,7 +10474,11 @@ "descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9607,7 +10494,11 @@ "descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description", "defaultValue": "300", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9623,7 +10514,11 @@ "descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description", "defaultValue": "5", "isVisibleToClients": false, - "providers": ["T", "G", "D"], + "providers": [ + "T", + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9639,7 +10534,10 @@ "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9655,7 +10553,10 @@ "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description", "defaultValue": "False", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9671,7 +10572,10 @@ "descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -9687,7 +10591,10 @@ "descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description", "defaultValue": "True", "isVisibleToClients": false, - "providers": ["G", "D"], + "providers": [ + "G", + "D" + ], "isInherited": false, "isEncrypted": false, "mainGroupKey": "Abp.Identity", @@ -10107,7 +11014,6 @@ "RequiredPermissionName": "App.DeveloperKit", "IsDisabled": false }, - { "ParentCode": "App.Saas", "Code": "App.Reports", @@ -10138,7 +11044,6 @@ "RequiredPermissionName": "App.Reports.Management", "IsDisabled": false }, - { "ParentCode": null, "Code": "App.Administration", @@ -12713,7 +13618,6 @@ "IsEnabled": true, "MultiTenancySide": 2 }, - { "GroupName": "App.Reports", "Name": "App.Reports.Management", @@ -12762,7 +13666,6 @@ "IsEnabled": true, "MultiTenancySide": 2 }, - { "GroupName": "App.Reports", "Name": "App.Reports.Categories", @@ -25528,14 +26431,18 @@ "path": "/admin/menuManager", "componentPath": "@/views/menu/MenuManager", "routeType": "protected", - "authority": ["App.Menus.Manager"] + "authority": [ + "App.Menus.Manager" + ] }, { "key": "admin.listFormManagement.wizard", "path": "/admin/listform/wizard", "componentPath": "@/views/admin/listForm/Wizard", "routeType": "protected", - "authority": ["App.Listforms.Wizard"] + "authority": [ + "App.Listforms.Wizard" + ] }, { "key": "admin.listFormManagement.edit", @@ -25556,14 +26463,18 @@ "path": "/admin/forumManagement", "componentPath": "@/views/forum/Management", "routeType": "protected", - "authority": ["App.ForumManagement"] + "authority": [ + "App.ForumManagement" + ] }, { "key": "admin.ai", "path": "/admin/ai", "componentPath": "@/views/ai/Assistant", "routeType": "protected", - "authority": ["Abp.Identity.Ai"] + "authority": [ + "Abp.Identity.Ai" + ] }, { "key": "admin.profile.general", @@ -25605,28 +26516,36 @@ "path": "/admin/settings", "componentPath": "@/views/settings/Settings", "routeType": "protected", - "authority": ["App.Setting"] + "authority": [ + "App.Setting" + ] }, { "key": "admin.identity.user.detail", "path": "/admin/users/detail/:userId", "componentPath": "@/views/admin/user-management/Details", "routeType": "protected", - "authority": ["AbpIdentity.Users.Update"] + "authority": [ + "AbpIdentity.Users.Update" + ] }, { "key": "admin.identity.ous", "path": "/admin/ous", "componentPath": "@/views/admin/organization-unit/OrganizationUnits", "routeType": "protected", - "authority": ["Abp.Identity.OrganizationUnits"] + "authority": [ + "Abp.Identity.OrganizationUnits" + ] }, { "key": "admin.forum", "path": "/admin/forum", "componentPath": "@/views/forum/Forum", "routeType": "protected", - "authority": ["App.ForumManagement.Publish"] + "authority": [ + "App.ForumManagement.Publish" + ] }, { "key": "admin.list", @@ -25675,84 +26594,108 @@ "path": "/admin/developerkit", "componentPath": "@/views/developerKit/DashboardPage", "routeType": "protected", - "authority": ["App.DeveloperKit"] + "authority": [ + "App.DeveloperKit" + ] }, { "key": "admin.developerkit.entities", "path": "/admin/developerkit/entities", "componentPath": "@/views/developerKit/EntityPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Entity"] + "authority": [ + "App.DeveloperKit.Entity" + ] }, { "key": "admin.developerkit.entities.new", "path": "/admin/developerkit/entities/new", "componentPath": "@/views/developerKit/EntityDetailPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Entity"] + "authority": [ + "App.DeveloperKit.Entity" + ] }, { "key": "admin.developerkit.entities.edit", "path": "/admin/developerkit/entities/edit/:id", "componentPath": "@/views/developerKit/EntityDetailPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Entity"] + "authority": [ + "App.DeveloperKit.Entity" + ] }, { "key": "admin.developerkit.migrations", "path": "/admin/developerkit/migrations", "componentPath": "@/views/developerKit/MigrationPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Migrations"] + "authority": [ + "App.DeveloperKit.Migrations" + ] }, { "key": "admin.developerkit.endpoints", "path": "/admin/developerkit/endpoints", "componentPath": "@/views/developerKit/EndpointPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Endpoints"] + "authority": [ + "App.DeveloperKit.Endpoints" + ] }, { "key": "admin.developerkit.components", "path": "/admin/developerkit/components", "componentPath": "@/views/developerKit/ComponentPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Components"] + "authority": [ + "App.DeveloperKit.Components" + ] }, { "key": "admin.developerkit.components.new", "path": "/admin/developerkit/components/new", "componentPath": "@/views/developerKit/ComponentDetailPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Components"] + "authority": [ + "App.DeveloperKit.Components" + ] }, { "key": "admin.developerkit.components.view", "path": "/admin/developerkit/components/view/:id", "componentPath": "@/views/developerKit/ComponentDetailPage", "routeType": "protected", - "authority": ["App.DeveloperKit.Components"] + "authority": [ + "App.DeveloperKit.Components" + ] }, { "key": "admin.developerkit.components.edit", "path": "/admin/developerkit/components/edit/:id", "componentPath": "@/views/developerKit/CodePage", "routeType": "protected", - "authority": ["App.DeveloperKit.Components"] + "authority": [ + "App.DeveloperKit.Components" + ] }, { "key": "admin.reportManagement", "path": "/admin/reports/management", "componentPath": "@/views/report/DashboardPage", "routeType": "protected", - "authority": ["App.Reports.Management"] + "authority": [ + "App.Reports.Management" + ] }, { "key": "admin.reports.view", "path": "/admin/reports/:id", "componentPath": "@/views/report/ReportViewerPage", "routeType": "protected", - "authority": ["App.Reports.Categories"] + "authority": [ + "App.Reports.Categories" + ] } ], "CustomEndpoints": [ @@ -26001,7 +26944,9 @@ "props": null, "description": null, "isActive": true, - "dependencies": ["AxiosListComponent"] + "dependencies": [ + "AxiosListComponent" + ] } ], "ReportCategories": [ @@ -26024,4 +26969,4 @@ "icon": "📜" } ] -} +} \ No newline at end of file diff --git a/ui/src/components/importManager/FileUploadArea.tsx b/ui/src/components/importManager/FileUploadArea.tsx index fabc7376..1c56dfa6 100644 --- a/ui/src/components/importManager/FileUploadArea.tsx +++ b/ui/src/components/importManager/FileUploadArea.tsx @@ -1,10 +1,6 @@ +import { useLocalization } from '@/utils/hooks/useLocalization' import React, { useCallback, useState } from 'react' -import { - FaUpload, - FaFile, - FaTimes, - FaRegCircle -} from 'react-icons/fa'; +import { FaUpload, FaFile, FaTimes, FaRegCircle } from 'react-icons/fa' interface FileUploadAreaProps { onFileUpload: (file: File) => void @@ -22,6 +18,7 @@ export const FileUploadArea: React.FC = ({ const [dragActive, setDragActive] = useState(false) const [selectedFile, setSelectedFile] = useState(null) const [error, setError] = useState(null) + const { translate } = useLocalization() const validateFile = (file: File): boolean => { setError(null) @@ -35,7 +32,9 @@ export const FileUploadArea: React.FC = ({ // Check file type const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase() if (!acceptedFormats.includes(fileExtension)) { - setError(`File type not supported. Accepted formats: ${acceptedFormats.join(', ')}`) + setError( + translate('::App.Listforms.ImportManager.FileTypeError') + `${acceptedFormats.join(', ')}`, + ) return false } @@ -121,11 +120,16 @@ export const FileUploadArea: React.FC = ({ className={`mx-auto h-3 w-3 ${dragActive ? 'text-blue-500' : 'text-slate-400'}`} />
- {dragActive ? 'Drop the file here' : 'Upload your file'} + {dragActive + ? translate('::App.Listforms.ImportManager.DropHere') + : translate('::App.Listforms.ImportManager.UploadYourFile')}
-

Drag & drop or click to select

+

+ {translate('::App.Listforms.ImportManager.DragOrClick')} +

- Supported formats: {acceptedFormats.join(', ')} • Max size: {maxSize}MB + {translate('::App.Listforms.ImportManager.SupportedFormats')}{' '} + {acceptedFormats.join(', ')} • Max size: {maxSize}MB
@@ -165,12 +169,12 @@ export const FileUploadArea: React.FC = ({ {loading ? ( <>
- Uploading... + {translate('::App.Listforms.ImportManager.Uploading')} ) : ( <> - Upload File + {translate('::App.Listforms.ImportManager.UploadFile')} )} diff --git a/ui/src/components/importManager/ImportDashboard.tsx b/ui/src/components/importManager/ImportDashboard.tsx index 0edf53fd..e48b42c4 100644 --- a/ui/src/components/importManager/ImportDashboard.tsx +++ b/ui/src/components/importManager/ImportDashboard.tsx @@ -9,15 +9,15 @@ import { FaTrashAlt, FaDownload, FaFileExcel, - FaFileAlt -} from 'react-icons/fa'; + FaFileAlt, +} from 'react-icons/fa' import { FileUploadArea } from './FileUploadArea' import { ImportPreview } from './ImportPreview' import { ImportProgress } from './ImportProgress' import { ListFormImportDto, ListFormImportExecuteDto } from '@/proxy/imports/models' import { ImportService } from '@/services/import.service' import { GridDto } from '@/proxy/form/models' -import { ColumnFormatEditDto } from '@/proxy/admin/list-form-field/models'; +import { useLocalization } from '@/utils/hooks/useLocalization' interface ImportDashboardProps { gridDto: GridDto @@ -26,6 +26,8 @@ interface ImportDashboardProps { export type TabNames = 'import' | 'preview' | 'history' export const ImportDashboard: React.FC = ({ gridDto }) => { + const { translate } = useLocalization() + const [activeTab, setActiveTab] = useState('import') const [currentSession, setCurrentSession] = useState(null) const [importHistory, setImportHistory] = useState([]) @@ -208,11 +210,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) => } const getEditableColumns = () => { - return gridDto.columnFormats.filter( - (col: any) => - col.permissionDto.i && - col.fieldName !== 'Id', - ) + return gridDto.columnFormats.filter((col: any) => col.permissionDto.i && col.fieldName !== 'Id') } const editableColumns = getEditableColumns() @@ -250,7 +248,8 @@ export const ImportDashboard: React.FC = ({ gridDto }) =>

- Template Columns ({editableColumns.length}) + {translate('::App.Listforms.ImportManager.TemplateColumns')} ( + {editableColumns.length})

{/* Template Options */} @@ -261,7 +260,9 @@ export const ImportDashboard: React.FC = ({ gridDto }) => className="flex items-center gap-1.5 px-3 py-1.5 border border-green-200 rounded-md hover:border-green-300 hover:bg-green-50 transition-all duration-200 group disabled:opacity-50 disabled:cursor-not-allowed bg-white text-xs" > - Excel Template + + {translate('::App.Listforms.ImportManager.ExcelTemplate')} +
@@ -280,16 +283,16 @@ export const ImportDashboard: React.FC = ({ gridDto }) => - Column + {translate('::App.Listforms.ImportManager.Column')} - Type + {translate('::App.Listforms.ImportManager.Type')} - Required + {translate('::App.Listforms.ImportManager.Required')} - Default + {translate('::App.Listforms.ImportManager.Default')} @@ -318,9 +321,13 @@ export const ImportDashboard: React.FC = ({ gridDto }) => {column.validationRuleDto.some( (rule: any) => rule.type === 'required', ) ? ( - Yes + + {translate('::App.Listforms.ImportManager.Yes')} + ) : ( - No + + {translate('::App.Listforms.ImportManager.No')} + )} @@ -337,7 +344,9 @@ export const ImportDashboard: React.FC = ({ gridDto }) => {generating && (
- Generating template... + + {translate('::App.Listforms.ImportManager.GeneratingTemplate')} +
)} @@ -348,7 +357,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) =>

- Upload Data + {translate('::App.Listforms.ImportManager.UploadData')}

= ({ gridDto }) =>
-
No Data to Preview
-
Upload a file to see the preview here
+
+ {translate('::App.Listforms.ImportManager.NoDataToPreview')} +
+
{translate('::App.Listforms.ImportManager.UploadFileToPreview')}
)} @@ -399,7 +410,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) =>

- Import History + {translate('::App.Listforms.ImportManager.ImportHistory')}

@@ -425,7 +436,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) =>
{currentSession?.id === session.id && ( - Aktif + {translate('::App.Listforms.ImportManager.Active')} )} @@ -434,7 +445,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) =>
- {session.totalRows} total rows + {session.totalRows} {translate('::App.Listforms.ImportManager.TotalRows')}
@@ -454,7 +465,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) => ? 'text-red-500 bg-red-50 hover:text-red-600 hover:bg-red-100' : 'text-slate-400 hover:text-slate-600 hover:bg-slate-100' }`} - title="View execution details" + title={translate('::App.Listforms.ImportManager.ViewExecutionDetails')} > @@ -483,7 +494,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) => } }} className="p-2 rounded-lg transition-colors text-slate-400 hover:text-blue-500 hover:bg-blue-50" - title="Refresh execution details" + title={translate('::App.Listforms.ImportManager.RefreshExecutionDetails')} > @@ -503,8 +514,8 @@ export const ImportDashboard: React.FC = ({ gridDto }) => }`} title={ currentSession?.id === session.id - ? 'Cannot delete the current active session' - : 'Delete this import session' + ? translate('::App.Listforms.ImportManager.CannotDeleteActiveSession') + : translate('::App.Listforms.ImportManager.DeleteImportSession') } > @@ -520,7 +531,9 @@ export const ImportDashboard: React.FC = ({ gridDto }) => {loadingExecutes.has(session.id) ? (
- Loading execution details... + + {translate('::App.Listforms.ImportManager.LoadingExecutionDetails')} +
) : sessionExecutes[session.id] && sessionExecutes[session.id].length > 0 ? (
@@ -540,19 +553,25 @@ export const ImportDashboard: React.FC = ({ gridDto }) =>
{execute.execRows}
-
executed
+
+ {translate('::App.Listforms.ImportManager.Executed')} +
{execute.validRows}
-
valid
+
+ {translate('::App.Listforms.ImportManager.Valid')} +
{execute.errorRows}
-
errors
+
+ {translate('::App.Listforms.ImportManager.Errors')} +
@@ -592,7 +611,7 @@ export const ImportDashboard: React.FC = ({ gridDto }) => ) : (
- No execution records found + {translate('::App.Listforms.ImportManager.NoExecutionRecords')}
)} @@ -604,8 +623,10 @@ export const ImportDashboard: React.FC = ({ gridDto }) => {importHistory.length === 0 && (
-
No import history
-
Your import history will appear here
+
+ {translate('::App.Listforms.ImportManager.NoImportHistory')} +
+
{translate('::App.Listforms.ImportManager.ImportHistoryHint')}
)} diff --git a/ui/src/components/importManager/ImportPreview.tsx b/ui/src/components/importManager/ImportPreview.tsx index 6c8f5bbe..ff95b916 100644 --- a/ui/src/components/importManager/ImportPreview.tsx +++ b/ui/src/components/importManager/ImportPreview.tsx @@ -1,14 +1,9 @@ import React, { useState, useEffect, useRef } from 'react' -import { - FaCheckCircle, - FaExclamationTriangle, - FaEye, - FaPlay, - FaTimes -} from 'react-icons/fa'; +import { FaCheckCircle, FaExclamationTriangle, FaEye, FaPlay, FaTimes } from 'react-icons/fa' import { ListFormImportDto } from '@/proxy/imports/models' import { GridDto } from '@/proxy/form/models' import { ImportService } from '@/services/import.service' +import { useLocalization } from '@/utils/hooks/useLocalization' interface ImportPreviewProps { session: ListFormImportDto @@ -40,6 +35,7 @@ export const ImportPreview: React.FC = ({ successCount: number } | null>(null) const hasCalledOnPreviewLoaded = useRef(false) + const { translate } = useLocalization() // Selection handlers const handleRowSelect = (rowIndex: number) => { @@ -156,7 +152,9 @@ export const ImportPreview: React.FC = ({ {/* Başlık kısmı - Üstte mobile, solda desktop */}
-

Import Preview

+

+ {translate('::App.Listforms.ImportManager.ImportPreviewTitle')} +

{/* İstatistik kartları - Mobile'da alt alta, desktop'ta yan yana */} @@ -164,7 +162,9 @@ export const ImportPreview: React.FC = ({
{previewData?.rows?.length || session.totalRows || 0}{' '} - Total Rows + + {translate('::App.Listforms.ImportManager.TotalRows')} +
@@ -185,7 +185,9 @@ export const ImportPreview: React.FC = ({ {/* Preview Data */} {previewData && previewData.headers && previewData.headers.length > 0 ? (
-

Data Preview

+

+ {translate('::App.Listforms.ImportManager.DataPreviewTitle')} +

@@ -243,9 +245,11 @@ export const ImportPreview: React.FC = ({
-

No Data Found

+

+ {translate('::App.Listforms.ImportManager.NoDataFoundTitle')} +

- Unable to parse data from the uploaded file. Please check the file format and content. + {translate('::App.Listforms.ImportManager.NoDataFoundDescription')}

@@ -253,8 +257,12 @@ export const ImportPreview: React.FC = ({
-

Loading Preview...

-

Analyzing uploaded file content...

+

+ {translate('::App.Listforms.ImportManager.LoadingPreviewTitle')} +

+

+ {translate('::App.Listforms.ImportManager.LoadingPreviewDescription')} +

)} @@ -267,8 +275,9 @@ export const ImportPreview: React.FC = ({
- Import completed successfully! {lastExecutionResult.successCount} of{' '} - {lastExecutionResult.selectedCount} rows were imported. + {translate('::App.Listforms.ImportManager.ImportSuccessMessage')}{' '} + {lastExecutionResult.successCount} of {lastExecutionResult.selectedCount} rows were + imported.
@@ -279,21 +288,27 @@ export const ImportPreview: React.FC = ({ {selectedRows.length === 0 && (previewData?.rows?.length || 0) > 0 && (
- Please select rows to import using checkboxes + + {translate('::App.Listforms.ImportManager.SelectRowsWarning')} +
)} {selectedRows.length > 0 && (
- {selectedRows.length} rows selected for import + + {selectedRows.length} {translate('::App.Listforms.ImportManager.RowsSelected')} +
)} {(previewData?.rows?.length || 0) === 0 && (
- No data available for import + + {translate('::App.Listforms.ImportManager.NoRowsAvailable')} +
)} @@ -301,7 +316,7 @@ export const ImportPreview: React.FC = ({
diff --git a/ui/src/components/importManager/ImportProgress.tsx b/ui/src/components/importManager/ImportProgress.tsx index 0cf3843c..43ad0503 100644 --- a/ui/src/components/importManager/ImportProgress.tsx +++ b/ui/src/components/importManager/ImportProgress.tsx @@ -1,12 +1,15 @@ import React from 'react' -import { FaSync, FaUpload, FaCheckCircle } from 'react-icons/fa'; +import { FaSync, FaUpload, FaCheckCircle } from 'react-icons/fa' import { ListFormImportDto } from '@/proxy/imports/models' +import { useLocalization } from '@/utils/hooks/useLocalization' interface ImportProgressProps { session: ListFormImportDto } export const ImportProgress: React.FC = ({ session }) => { + const { translate } = useLocalization() + const getProgressPercentage = () => { if (session.status === 'uploaded') return 100 if (session.status === 'failed') return 0 @@ -27,17 +30,17 @@ export const ImportProgress: React.FC = ({ session }) => { const getStatusMessage = () => { switch (session.status) { case 'uploading': - return 'Uploading file...' + return translate('::App.Listforms.ImportManager.ImportProgress.Status.Uploading') case 'validating': - return 'Validating data...' + return translate('::App.Listforms.ImportManager.ImportProgress.Status.Validating') case 'processing': - return 'Processing import...' + return translate('::App.Listforms.ImportManager.ImportProgress.Status.Processing') case 'uploaded': - return 'Import completed successfully!' + return translate('::App.Listforms.ImportManager.ImportProgress.Status.Uploaded') case 'failed': - return 'Import failed. Please check the errors.' + return translate('::App.Listforms.ImportManager.ImportProgress.Status.Failed') default: - return 'Processing...' + return translate('::App.Listforms.ImportManager.ImportProgress.Status.Default') } } @@ -64,13 +67,16 @@ export const ImportProgress: React.FC = ({ session }) => { {/* Status Message */}

{getStatusMessage()}

-

Processing {session.blobName}

+

+ {translate('::App.Listforms.ImportManager.ImportProgress.ProcessingFile')}{' '} + {session.blobName} +

{/* Progress Bar */}
- Progress + {translate('::App.Listforms.ImportManager.ImportProgress.ProgressLabel')} {Math.round(getProgressPercentage())}%
diff --git a/ui/src/components/reports/Dashboard.tsx b/ui/src/components/reports/Dashboard.tsx index 3fd5dde7..59326c42 100644 --- a/ui/src/components/reports/Dashboard.tsx +++ b/ui/src/components/reports/Dashboard.tsx @@ -2,14 +2,8 @@ import React, { useState, useMemo, useEffect } from 'react' import { TemplateEditor } from '../reports/TemplateEditor' import { ReportGenerator } from '../reports/ReportGenerator' import { TemplateCard } from './TemplateCard' -import { Button, Input} from '../ui' -import { - FaPlus, - FaSearch, - FaFilter, - FaFileAlt, - FaChartBar -} from 'react-icons/fa'; +import { Button, Input } from '../ui' +import { FaPlus, FaSearch, FaFilter, FaFileAlt, FaChartBar } from 'react-icons/fa' import { ReportCategoryDto, ReportTemplateDto } from '@/proxy/reports/models' import { useReports } from '@/utils/hooks/useReports' import { useLocalization } from '@/utils/hooks/useLocalization' @@ -25,14 +19,16 @@ export const Dashboard: React.FC = () => { generateReport, } = useReports() + const { translate } = useLocalization() + const tumuCategory = useMemo( () => ({ id: 'tumu-category', - name: 'Tümü', - description: 'Tüm kategorilere ait raporlar', + name: translate('::App.Reports.Dashboard.All'), + description: translate('::App.Reports.Dashboard.AllDescription'), icon: '📋', }), - [], + [translate], ) const [showEditor, setShowEditor] = useState(false) @@ -40,10 +36,16 @@ export const Dashboard: React.FC = () => { const [editingTemplate, setEditingTemplate] = useState(null) const [generatingTemplate, setGeneratingTemplate] = useState(null) const [searchQuery, setSearchQuery] = useState('') - const [selectedCategory, setSelectedCategory] = useState(tumuCategory) - const { translate } = useLocalization() + const [selectedCategory, setSelectedCategory] = useState(null) - // Create category options with "Tümü" at the top + // Set initial selected category to tumuCategory + useEffect(() => { + if (!selectedCategory) { + setSelectedCategory(tumuCategory) + } + }, [tumuCategory, selectedCategory]) + + // Create category options with "tumu-category" at the top const categoryOptions = useMemo(() => { const categoryNames = [tumuCategory, ...categories.map((cat) => cat)] return categoryNames @@ -52,12 +54,12 @@ export const Dashboard: React.FC = () => { // Filter templates based on selected category and search query const filteredTemplates = useMemo(() => { let filtered = templates - - // Filter by category (if not "Tümü") - if (selectedCategory && selectedCategory.name !== 'Tümü') { - filtered = filtered.filter(template => template.categoryName === selectedCategory.name) + + // Filter by category (if not "tumu-category") + if (selectedCategory && selectedCategory.id !== 'tumu-category') { + filtered = filtered.filter((template) => template.categoryName === selectedCategory.name) } - + // Filter by search query if (searchQuery) { filtered = filtered.filter((template) => { @@ -106,7 +108,7 @@ export const Dashboard: React.FC = () => { } const handleDeleteTemplate = async (id: string) => { - if (window.confirm('Bu şablonu silmek istediğinizden emin misiniz?')) { + if (window.confirm(translate('::App.Reports.Dashboard.DeleteTemplateConfirmation'))) { try { await deleteTemplate(id) } catch (error) { @@ -140,7 +142,7 @@ export const Dashboard: React.FC = () => {
-

Yükleniyor...

+

{translate('::App.Reports.Dashboard.Loading')}

) : ( @@ -163,12 +165,12 @@ export const Dashboard: React.FC = () => { {category.icon && {category.icon}} {category.name}
- {category.name !== 'Tümü' && ( + {category.id !== 'tumu-category' && ( ({templates.filter((t) => t.categoryName === category.name).length}) )} - {category.name === 'Tümü' && ( + {category.id === 'tumu-category' && ( ({templates.length}) )} @@ -188,19 +190,19 @@ export const Dashboard: React.FC = () => { {translate('::' + selectedCategory?.description)}
- +
{/* Search Input */}
setSearchQuery(e.target.value)} className="pl-10 w-64" />
- + {/* New Template Button */}
@@ -219,7 +221,9 @@ export const Dashboard: React.FC = () => {

- {selectedCategory?.name === 'Tümü' ? 'Toplam Şablon' : 'Kategori Şablonları'} + {selectedCategory?.id === 'tumu-category' + ? translate('::App.Reports.Dashboard.TotalTemplates') + : translate('::App.Reports.Dashboard.CategoryTemplates')}

{filteredTemplates.length}

@@ -232,7 +236,7 @@ export const Dashboard: React.FC = () => {
-

Aktif Kategoriler

+

{translate('::App.Reports.Dashboard.ActiveCategories')}

{categories.length}

@@ -245,11 +249,11 @@ export const Dashboard: React.FC = () => {

- {selectedCategory?.name === 'Tümü' ? 'Toplam Parametre' : 'Kategori Parametreleri'} -

-

- {totalParameters} + {selectedCategory?.id === 'tumu-category' + ? translate('::App.Reports.Dashboard.TotalParameters') + : translate('::App.Reports.Dashboard.CategoryParameters')}

+

{totalParameters}

@@ -257,7 +261,7 @@ export const Dashboard: React.FC = () => {
- + {/* Templates Grid */} {filteredTemplates.length === 0 ? (
@@ -267,8 +271,8 @@ export const Dashboard: React.FC = () => {

{templates.length === 0 - ? 'İlk rapor şablonunuzu oluşturarak başlayın.' - : 'Arama kriterlerinize uygun şablon bulunamadı.'} + ? translate('::App.Reports.Dashboard.CreateFirstTemplate') + : translate('::App.Reports.Dashboard.NoSearchResults')}

) : ( diff --git a/ui/src/components/reports/ReportGenerator.tsx b/ui/src/components/reports/ReportGenerator.tsx index 79ffacc1..f88c3095 100644 --- a/ui/src/components/reports/ReportGenerator.tsx +++ b/ui/src/components/reports/ReportGenerator.tsx @@ -1,7 +1,8 @@ import React, { useState } from 'react' import { Button, Input, Dialog } from '../ui' -import { FaFileAlt } from 'react-icons/fa'; +import { FaFileAlt } from 'react-icons/fa' import { ReportTemplateDto } from '@/proxy/reports/models' +import { useLocalization } from '@/utils/hooks/useLocalization' interface ReportGeneratorProps { isOpen: boolean @@ -18,6 +19,8 @@ export const ReportGenerator: React.FC = ({ }) => { const [parameterValues, setParameterValues] = useState>({}) const [isGenerating, setIsGenerating] = useState(false) + const { translate } = useLocalization() + // const [showPrintPreview, setShowPrintPreview] = useState(false); React.useEffect(() => { @@ -69,7 +72,7 @@ export const ReportGenerator: React.FC = ({ return ( <> -
{`${template.name} - Rapor Parametreleri`}
+
{`${template.name} - ${translate('::App.Reports.ReportGenerator.ReportParameters')}`}

{template.name}

@@ -88,7 +91,9 @@ export const ReportGenerator: React.FC = ({ {template.parameters.length > 0 ? (
-

Parametre Değerleri

+

+ {translate('::App.Reports.ReportGenerator.ParameterValues')} +

{template.parameters.map((param) => ( = ({ ))}
{template.parameters.some((p) => p.required) && ( -

* Zorunlu alanlar

+

+ {translate('::App.Reports.ReportGenerator.RequiredFieldsNote')} +

)}
) : (
-

Bu şablon için parametre tanımlanmamış.

-

Direkt rapor oluşturabilirsiniz.

+

{translate('::App.Reports.ReportGenerator.NoParameters')}

+

{translate('::App.Reports.ReportGenerator.DirectGenerate')}

)}
- -
diff --git a/ui/src/components/reports/ReportHtmlEditor.tsx b/ui/src/components/reports/ReportHtmlEditor.tsx index 90a53b14..93aea8c3 100644 --- a/ui/src/components/reports/ReportHtmlEditor.tsx +++ b/ui/src/components/reports/ReportHtmlEditor.tsx @@ -9,6 +9,7 @@ import { headerValues, sizeValues, } from '@/proxy/reports/data' +import { useLocalization } from '@/utils/hooks/useLocalization' interface ReportHtmlEditorProps { value: string @@ -20,16 +21,17 @@ interface ReportHtmlEditorProps { export const ReportHtmlEditor: React.FC = ({ value, onChange, - placeholder = 'Rapor şablonunuzu buraya yazın...', height = '100%', }) => { + const { translate } = useLocalization() + return (
onChange(e.value)} height={height || '400px'} - placeholder={placeholder} + placeholder={translate('::App.Reports.ReportHtmlViewer.Placeholder')} > diff --git a/ui/src/components/reports/ReportViewer.tsx b/ui/src/components/reports/ReportViewer.tsx index 233ebda4..f114b368 100644 --- a/ui/src/components/reports/ReportViewer.tsx +++ b/ui/src/components/reports/ReportViewer.tsx @@ -14,6 +14,7 @@ import jsPDF from 'jspdf' import { ReportGeneratedDto, ReportTemplateDto } from '@/proxy/reports/models' import { useReports } from '@/utils/hooks/useReports' import { ROUTES_ENUM } from '@/routes/route.constant' +import { useLocalization } from '@/utils/hooks/useLocalization' export const ReportViewer: React.FC = () => { const { id } = useParams<{ id: string }>() @@ -23,6 +24,7 @@ export const ReportViewer: React.FC = () => { const [template, setTemplate] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) + const { translate } = useLocalization() const { getReportById, getTemplateById } = useReports() @@ -124,8 +126,10 @@ export const ReportViewer: React.FC = () => {
-

Rapor yükleniyor...

-

Lütfen bekleyin

+

+ {translate('::App.Reports.ReportViewer.LoadingTitle')} +

+

{translate('::App.Reports.ReportViewer.LoadingSubtitle')}

) @@ -136,7 +140,9 @@ export const ReportViewer: React.FC = () => { return (
-

{error || 'Rapor bulunamadı'}

+

+ {error || translate('::App.Reports.ReportViewer.ErrorNotFound')} +

@@ -284,10 +294,10 @@ export const ReportViewer: React.FC = () => { className="bg-white-600 hover:bg-white-700 font-medium px-2 sm:px-3 py-1.5 rounded text-xs flex items-center gap-1" > - PDF İndir + {translate('::App.Reports.ReportViewer.DownloadPDF')}
@@ -473,7 +483,8 @@ export const ReportViewer: React.FC = () => { {/* Sayfa Footer - Sayfa Numarası */}
- Sayfa {index + 1} / {splitContentIntoPages(report.generatedContent).length} + {translate('::App.Reports.ReportViewer.Page')} {index + 1} /{' '} + {splitContentIntoPages(report.generatedContent).length}
))} diff --git a/ui/src/components/reports/TemplateCard.tsx b/ui/src/components/reports/TemplateCard.tsx index d584f7d2..8924e12c 100644 --- a/ui/src/components/reports/TemplateCard.tsx +++ b/ui/src/components/reports/TemplateCard.tsx @@ -2,6 +2,7 @@ import React from 'react' import { Button } from '../ui/Button' import { FaFileAlt, FaEdit, FaTrash, FaPlay } from 'react-icons/fa'; import { ReportTemplateDto } from '@/proxy/reports/models' +import { useLocalization } from '@/utils/hooks/useLocalization'; interface TemplateCardProps { template: ReportTemplateDto @@ -16,6 +17,8 @@ export const TemplateCard: React.FC = ({ onDelete, onGenerate, }) => { + const { translate } = useLocalization() + return (
@@ -70,7 +73,7 @@ export const TemplateCard: React.FC = ({ className="bg-gray-600 hover:bg-gray-700 font-medium px-3 py-1.5 rounded text-xs flex items-center gap-1 flex-1 justify-center min-w-0" > - Göster + {translate('::App.Reports.TemplateCard.Show')}
diff --git a/ui/src/components/reports/TemplateEditor.tsx b/ui/src/components/reports/TemplateEditor.tsx index 7c71fe32..587afdfd 100644 --- a/ui/src/components/reports/TemplateEditor.tsx +++ b/ui/src/components/reports/TemplateEditor.tsx @@ -138,15 +138,23 @@ export const TemplateEditor: React.FC = ({ } const tabs = [ - { id: 'info', label: translate('::Şablon Bilgileri'), icon: FaFileAlt }, - { id: 'parameters', label: translate('::Parametreler'), icon: FaCog }, - { id: 'content', label: translate('::HTML İçerik'), icon: FaCode }, + { id: 'info', label: translate('::App.Reports.TemplateEditor.Tab.Info'), icon: FaFileAlt }, + { + id: 'parameters', + label: translate('::App.Reports.TemplateEditor.Tab.Parameters'), + icon: FaCog, + }, + { id: 'content', label: translate('::App.Reports.TemplateEditor.Tab.Content'), icon: FaCode }, ] return ( <> -
{template ? 'Şablon Düzenle' : 'Yeni Şablon Oluştur'}
+
+ {template + ? translate('::App.Reports.TemplateEditor.TitleEdit') + : translate('::App.Reports.TemplateEditor.TitleNew')} +
{/* Tab Navigation */}
@@ -184,7 +192,7 @@ export const TemplateEditor: React.FC = ({
= ({ name: e.target.value, })) } - placeholder="Rapor şablonu adı" + placeholder={translate('::App.Reports.TemplateEditor.Placeholder.Name')} className="w-full flex-1 px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
= ({ value={tagInput} onChange={(e) => setTagInput(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && addTag()} - placeholder="Etiket ekle..." + placeholder={translate( + '::App.Reports.TemplateEditor.Placeholder.AddTag', + )} className="flex-1 px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
@@ -262,7 +272,7 @@ export const TemplateEditor: React.FC = ({
= ({ description: e.target.value, })) } - placeholder="Şablon hakkında detaylı açıklama yazın..." + placeholder={translate( + '::App.Reports.TemplateEditor.Placeholder.Description', + )} textArea={true} rows={12} className="text-left h-full" @@ -304,10 +316,11 @@ export const TemplateEditor: React.FC = ({ {formData.parameters.length === 0 ? (
-

Henüz parametre algılanmadı

+

+ {translate('::App.Reports.TemplateEditor.NoParameters')} +

- HTML içeriğinde @@PARAMETRE formatında parametreler kullandığınızda burada - görünecek. + {translate('::App.Reports.TemplateEditor.NoParametersDescription')}

) : ( @@ -346,7 +359,9 @@ export const TemplateEditor: React.FC = ({ onChange={(e) => updateParameter(param.id, { description: e.target.value }) } - placeholder="Parametre açıklaması" + placeholder={translate( + '::App.Reports.TemplateEditor.Placeholder.ParameterDescription', + )} className="w-full text-xs text-gray-600 bg-transparent border-none outline-none resize-none" />
@@ -358,7 +373,9 @@ export const TemplateEditor: React.FC = ({ onChange={(e) => updateParameter(param.id, { defaultValue: e.target.value }) } - placeholder="Varsayılan değer" + placeholder={translate( + '::App.Reports.TemplateEditor.Placeholder.DefaultValue', + )} className="w-full text-xs bg-gray-50 px-1.5 py-0.5 rounded border border-gray-200 outline-none" />
@@ -373,7 +390,9 @@ export const TemplateEditor: React.FC = ({ } className="w-3 h-3 text-red-600 rounded border-gray-300 focus:ring-red-500" /> - Zorunlu + + {translate('::App.Reports.TemplateEditor.Label.Required')} +
@@ -388,7 +407,7 @@ export const TemplateEditor: React.FC = ({ {/* Tab Footer */}