few translation edits and changing it to use vmEmission query

This commit is contained in:
2025-08-09 20:08:56 +03:00
parent 39fffadbd2
commit 89b4644983
5 changed files with 422 additions and 418 deletions

View File

@@ -27,4 +27,7 @@ spring.rabbitmq.template.retry.enabled=true
spring.rabbitmq.template.retry.max-attempts=3 spring.rabbitmq.template.retry.max-attempts=3
spring.rabbitmq.template.retry.initial-interval=1000ms spring.rabbitmq.template.retry.initial-interval=1000ms
logging.level.org.springframework.amqp=DEBUG logging.level.org.springframework.amqp=DEBUG
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

View File

@@ -67,7 +67,11 @@
"Common": { "Common": {
"save": "Save", "save": "Save",
"cancel": "Cancel" "cancel": "Cancel",
"yes": "Yes",
"no": "No",
"areYouSure": "Are you sure?",
"cantRevert": "This action cannot be undone!"
}, },
"DataInput": { "DataInput": {

View File

@@ -1,311 +1,315 @@
{ {
"Actions": "Aksiyonlar", "Actions": "Aksiyonlar",
"Active": "Aktif", "Active": "Aktif",
"ByName": "İsme Göre", "ByName": "İsme Göre",
"CreatedTime": "Oluşturulma Zamanı", "CreatedTime": "Oluşturulma Zamanı",
"Description": " Açıklaması", "Description": " Açıklaması",
"Filter": "Filtrele", "Filter": "Filtrele",
"Management": "Yönetim", "Management": "Yönetim",
"Passive": "Pasif", "Passive": "Pasif",
"Show": "Göster", "Show": "Göster",
"Status": "Durum", "Status": "Durum",
"Time": "Zaman ", "Time": "Zaman ",
"Activities": { "Activities": {
"activity": "Aktivite ", "activity": "Aktivite ",
"activities": "Aktiviteler ", "activities": "Aktiviteler ",
"type": "Log Tipi", "type": "Log Tipi",
"message": "Log Mesajı" "message": "Log Mesajı"
}, },
"Areas": { "Areas": {
"addArea": "Alan Ekle", "addArea": "Alan Ekle",
"area": "Alan ", "area": "Alan ",
"areas": "Alanlar ", "areas": "Alanlar ",
"areaName": "Alan Adı ", "areaName": "Alan Adı ",
"city": "Şehir ", "city": "Şehir ",
"cities": "Şehirler ", "cities": "Şehirler ",
"cityName": "Şehir Adı ", "cityName": "Şehir Adı ",
"country": "Ülke ", "country": "Ülke ",
"countries": "Ülkeler ", "countries": "Ülkeler ",
"countryName": "Ülke Adı ", "countryName": "Ülke Adı ",
"countryCode": "Ülke Kodu ", "countryCode": "Ülke Kodu ",
"district": "İlçe ", "district": "İlçe ",
"districts": "İlçeler", "districts": "İlçeler",
"districtName": "İlçe Adı", "districtName": "İlçe Adı",
"neighborhood": "Mahalle ", "neighborhood": "Mahalle ",
"neighborhoods": "Mahalleler ", "neighborhoods": "Mahalleler ",
"neighborhoodName": "Mahalle Adı", "neighborhoodName": "Mahalle Adı",
"addNeighborhood": "Mahalle Ekle", "addNeighborhood": "Mahalle Ekle",
"latitude": "Enlem", "latitude": "Enlem",
"longitude": "Boylam" "longitude": "Boylam"
}, },
"Auth": { "Auth": {
"authorized": "Devam etmek için yetkilendirilmiş kullanıcı bilgilerinizi giriniz.", "authorized": "Devam etmek için yetkilendirilmiş kullanıcı bilgilerinizi giriniz.",
"didUForgotPassword": "Şifrenizi mi unuttunuz?", "didUForgotPassword": "Şifrenizi mi unuttunuz?",
"logout": ıkış Yap", "logout": ıkış Yap",
"logoutMessage": " Çıkış yaptınız. Yönlendiriliyorsunuz...", "logoutMessage": " Çıkış yaptınız. Yönlendiriliyorsunuz...",
"login": "Giriş Yap", "login": "Giriş Yap",
"loginMessage": " Giriş başarılı yönlendiriliyorsunuz...", "loginMessage": " Giriş başarılı yönlendiriliyorsunuz...",
"password": "Şifre ", "password": "Şifre ",
"welcome": "Hoşgeldiniz", "welcome": "Hoşgeldiniz",
"incorrectForm": "Kullanıcı bilgileri hatalıdır. Lütfen tekrar deneyiniz." "incorrectForm": "Kullanıcı bilgileri hatalıdır. Lütfen tekrar deneyiniz."
}, },
"Cruds": { "Cruds": {
"add": " Ekle", "add": " Ekle",
"cancel": " İptal", "cancel": " İptal",
"delete": "Sil", "delete": "Sil",
"edit": "Düzenle", "edit": "Düzenle",
"reactive": "Aktif Et", "reactive": "Aktif Et",
"save": "Kaydet", "save": "Kaydet",
"saving": "Kaydediliyor..", "saving": "Kaydediliyor..",
"update": "Güncelle" "update": "Güncelle"
}, },
"Common": { "Common": {
"save": "Kaydet", "save": "Kaydet",
"cancel": " İptal" "cancel": "İptal",
}, "yes": "Evet",
"no": "Hayır",
"DataInput": { "areYouSure": "Emin misiniz?",
"area": "Bölge ", "cantRevert": "Bu işlem geri alınamaz!"
"report": "Rapor ", },
"reports": "Raw Data",
"data": "Veri ", "DataInput": {
"datas": "Veriler ", "area": "Bölge ",
"dataInput": "Veri Girişi", "report": "Rapor ",
"year": "Yıl", "reports": "Raw Data",
"month": "Ay", "data": "Veri ",
"consumptionAmount": "Tüketim Miktarı", "datas": "Veriler ",
"consumptionUnit": "Tüketim Birimi", "dataInput": "Veri Girişi",
"gpcReference": "GPC Referans", "year": "Yıl",
"total": "Toplam ", "month": "Ay",
"save": "Veriyi Kaydet", "consumptionAmount": "Tüketim Miktarı",
"update": "Veriyi Güncelle", "consumptionUnit": "Tüketim Birimi",
"showDeleted": "Silinen Raporları Göster", "gpcReference": "GPC Referans",
"result": "Sonuç", "total": "Toplam ",
"directToAllDatas": "Tüm Verileri Gör", "save": "Veriyi Kaydet",
"addNewData": "Yeni Veri Ekle", "update": "Veriyi Güncelle",
"failUploadExcel": "Dosya yüklenirken hata oluştu!" "showDeleted": "Silinen Raporları Göster",
}, "result": "Sonuç",
"directToAllDatas": "Tüm Verileri Gör",
"Graphics": { "addNewData": "Yeni Veri Ekle",
"graphics": "Raporlar", "failUploadExcel": "Dosya yüklenirken hata oluştu!"
"reports": "Raporlar" },
},
"Graphics": {
"EmissionSources": { "graphics": "Raporlar",
"dataSet": "Veri Seti", "reports": "Raporlar"
"emissionSource": "Emisyon Kaynağı ", },
"emissionSources": "Emisyon Kaynakları ",
"emissionSourceName": "Emisyon Kaynağı Adı", "EmissionSources": {
"addEmissionSource": "Emisyon Kaynağı Ekle", "dataSet": "Veri Seti",
"existingEmissionName": "Bu isimde bir emisyon kaynağı mevcuttur!", "emissionSource": "Emisyon Kaynağı ",
"sector": "Veri Sektörü ", "emissionSources": "Emisyon Kaynakları ",
"sectors": "Veri Sektörleri ", "emissionSourceName": "Emisyon Kaynağı Adı",
"subSector": "Sektör Alt Birimi ", "addEmissionSource": "Emisyon Kaynağı Ekle",
"subSectors": "Sektör Alt Birimleri ", "existingEmissionName": "Bu isimde bir emisyon kaynağı mevcuttur!",
"subUnit": "Faaliyet Alt Birimi ", "sector": "Veri Sektörü ",
"subUnits": "Faaliyet Alt Birimleri ", "sectors": "Veri Sektörleri ",
"emissionScopes": "Emisyon Kapsamı ", "subSector": "Sektör Alt Birimi ",
"emissionFactors": "Emisyon Faktörleri ", "subSectors": "Sektör Alt Birimleri ",
"showDeletedEmissionSource": "Silinen Emisyon Kaynaklarını Göster" "subUnit": "Faaliyet Alt Birimi ",
}, "subUnits": "Faaliyet Alt Birimleri ",
"emissionScopes": "Emisyon Kapsamı ",
"Map": { "emissionFactors": "Emisyon Faktörleri ",
"map": "Harita", "showDeletedEmissionSource": "Silinen Emisyon Kaynaklarını Göster"
"goBack": "Geri dön", },
"reference": "Referans",
"title": "Harita" "Map": {
}, "map": "Harita",
"goBack": "Geri dön",
"Months": { "reference": "Referans",
"1": "Ocak", "title": "Harita"
"2": "Şubat", },
"3": "Mart",
"4": "Nisan", "Months": {
"5": "Mayıs", "1": "Ocak",
"6": "Haziran", "2": "Şubat",
"7": "Temmuz", "3": "Mart",
"8": "Ağustos", "4": "Nisan",
"9": "Eylül", "5": "Mayıs",
"10": "Ekim", "6": "Haziran",
"11": "Kasım", "7": "Temmuz",
"12": "Aralık", "8": "Ağustos",
"null": "Yıl Geneli", "9": "Eylül",
"0": "Yıl Geneli" "10": "Ekim",
}, "11": "Kasım",
"12": "Aralık",
"Notifications": { "null": "Yıl Geneli",
"content": "İçerik ", "0": "Yıl Geneli"
"notification": "Bildirim ", },
"notifications": "Bildirimler ",
"showAll": "Tüm Bildirimleri Göster", "Notifications": {
"title": "Başlık ", "content": "İçerik ",
"notificationType": "Bildirim Tipi " "notification": "Bildirim ",
}, "notifications": "Bildirimler ",
"showAll": "Tüm Bildirimleri Göster",
"Organizations": { "title": "Başlık ",
"organization": "Organizasyon ", "notificationType": "Bildirim Tipi "
"organizations": "Organizasyonlar", },
"organizationName": "Organizasyon Adı",
"parentOrganization": "Bağlı Olduğu Organizasyon", "Organizations": {
"childOrganization": "Alt Organizasyonu", "organization": "Organizasyon ",
"addOrganization": "Organizasyon Ekle", "organizations": "Organizasyonlar",
"existingName": "Bu isimde bir organizasyon mevcuttur!.", "organizationName": "Organizasyon Adı",
"showDeletedOrganizations": "Silinen Organizasyonları Göster" "parentOrganization": "Bağlı Olduğu Organizasyon",
}, "childOrganization": "Alt Organizasyonu",
"addOrganization": "Organizasyon Ekle",
"PasswordLabel": { "existingName": "Bu isimde bir organizasyon mevcuttur!.",
"passwordLabel": "Şifre", "showDeletedOrganizations": "Silinen Organizasyonları Göster"
"confirmPassword": "Şifre Tekrar", },
"oldPassword": "Eski Şifre",
"newPassword": "Yeni Şifre", "PasswordLabel": {
"newConfirmPassword": "Yeni Şifre Tekrar", "passwordLabel": "Şifre",
"verificationCode": "Doğrulama Kodu", "confirmPassword": "Şifre Tekrar",
"cannotbeleftblank": " Boş Bırakılamaz ", "oldPassword": "Eski Şifre",
"passwordNotSame": "Şifreler aynı değil", "newPassword": "Yeni Şifre",
"passwordValidation": "Şifre 6-20 karakter uzunluğunda, en az 1 sayı, 1 büyük harf ve 1 küçük harf içermelidir!", "newConfirmPassword": "Yeni Şifre Tekrar",
"verificationCode": "Doğrulama Kodu",
"forgotPassword": "Şifremi Unuttum", "cannotbeleftblank": " Boş Bırakılamaz ",
"enterEmail": "Geçerli bir email giriniz.", "passwordNotSame": "Şifreler aynı değil",
"send": "Gönder", "passwordValidation": "Şifre 6-20 karakter uzunluğunda, en az 1 sayı, 1 büyük harf ve 1 küçük harf içermelidir!",
"redirectToReset": "Şifre sıfırlama ekranına yönlendiriliyorsunuz..",
"forgotPassword": "Şifremi Unuttum",
"resetPassword": "Şifre Sıfırlama", "enterEmail": "Geçerli bir email giriniz.",
"resend": "Doğrulama Kodunu Tekrar Gönder", "send": "Gönder",
"invalidVerificationCode": "Geçersiz doğrulama kodu!", "redirectToReset": "Şifre sıfırlama ekranına yönlendiriliyorsunuz..",
"redirectToLogin": "Giriş ekranına yönlendiriliyorsunuz.."
}, "resetPassword": "Şifre Sıfırlama",
"resend": "Doğrulama Kodunu Tekrar Gönder",
"Roles": { "invalidVerificationCode": "Geçersiz doğrulama kodu!",
"role": "Rol ", "redirectToLogin": "Giriş ekranına yönlendiriliyorsunuz.."
"roles": "Roller", },
"roleName": "Rol Adı",
"addRole": "Rol Ekle", "Roles": {
"permissions": "Yetkiler", "role": "Rol ",
"existingRole": "Bu rol zaten mevcuttur." "roles": "Roller",
}, "roleName": "Rol Adı",
"addRole": "Rol Ekle",
"Survey": { "permissions": "Yetkiler",
"addAnswer": "Cevap Ekle", "existingRole": "Bu rol zaten mevcuttur."
"addSurvey": "Anket Ekle", },
"addQuestion": "Soru Ekle",
"answer": "Cevap ", "Survey": {
"answers": "Cevaplar", "addAnswer": "Cevap Ekle",
"survey": "Anket", "addSurvey": "Anket Ekle",
"surveys": "Anketler ", "addQuestion": "Soru Ekle",
"surveyName": "Anket Adı", "answer": "Cevap ",
"question": "Soru ", "answers": "Cevaplar",
"questions": "Sorular", "survey": "Anket",
"tag": "Etiket", "surveys": "Anketler ",
"value": "Değer" "surveyName": "Anket Adı",
}, "question": "Soru ",
"questions": "Sorular",
"Contact": { "tag": "Etiket",
"contact": "İletişim", "value": "Değer"
"contactInfo": "İletişim Bilgileri", },
"contactEmail": "E-posta Adresi",
"contactPhoneNumber": "Telefon Numarası", "Contact": {
"contactAddress": "Adres" "contact": "İletişim",
}, "contactInfo": "İletişim Bilgileri",
"MailSettings": { "contactEmail": "E-posta Adresi",
"mailSettings": "E-posta Ayarları", "contactPhoneNumber": "Telefon Numarası",
"editMailInfo": "E-posta Bilgilerini Düzenle", "contactAddress": "Adres"
"hostName": "Sunucu Adı", },
"smtpPort": "SMTP Portu", "MailSettings": {
"emailAddress": "E-posta Adresi", "mailSettings": "E-posta Ayarları",
"emailPassword": "E-posta Şifresi", "editMailInfo": "E-posta Bilgilerini Düzenle",
"leaveBlankNote": "(Mevcut şifreyi korumak için boş bırakın)", "hostName": "Sunucu Adı",
"mainMail": "Ana e-posta yapılandırması olarak ayarla", "smtpPort": "SMTP Portu",
"saveSettings": "Ayarları Kaydet", "emailAddress": "E-posta Adresi",
"notConfigured": "E-posta yapılandırılmamış", "emailPassword": "E-posta Şifresi",
"noMailsRegistered": "Kayıtlı e-posta bulunamadı" "leaveBlankNote": "(Mevcut şifreyi korumak için boş bırakın)",
}, "mainMail": "Ana e-posta yapılandırması olarak ayarla",
"saveSettings": "Ayarları Kaydet",
"Timer": { "notConfigured": "E-posta yapılandırılmamış",
"continue": "Devam Et ", "noMailsRegistered": "Kayıtlı e-posta bulunamadı"
"expire": "Oturum süreniz dolmak üzeredir.." },
},
"Timer": {
"Users": { "continue": "Devam Et ",
"user": "Kullanıcı ", "expire": "Oturum süreniz dolmak üzeredir.."
"users": "Kullanıcılar ", },
"userName": "Kullanıcı Adı ",
"addUser": "Kullanıcı Ekle", "Users": {
"existingEmail": "Bu e-mail zaten mevcuttur.", "user": "Kullanıcı ",
"existingPhoneNumber": "Bu telefon numarası zaten mevcuttur.", "users": "Kullanıcılar ",
"showDeletedUsers": "Silinen Kullanıcıları Göster" "userName": "Kullanıcı Adı ",
}, "addUser": "Kullanıcı Ekle",
"existingEmail": "Bu e-mail zaten mevcuttur.",
"UserProfile": { "existingPhoneNumber": "Bu telefon numarası zaten mevcuttur.",
"myProfile": "Profilim", "showDeletedUsers": "Silinen Kullanıcıları Göster"
"firstName": "Ad", },
"lastName": "Soyad",
"phoneNumber": "Telefon Numarası", "UserProfile": {
"avatar": "Profil Fotoğrafı", "myProfile": "Profilim",
"status": "Durum", "firstName": "Ad",
"changePassword": "Şifre Değiştir", "lastName": "Soyad",
"communicationPreferences": "İletişim Tercihleri", "phoneNumber": "Telefon Numarası",
"updateAvatar": "Profil Resmini Güncelle" "avatar": "Profil Fotoğrafı",
}, "status": "Durum",
"changePassword": "Şifre Değiştir",
"Warnings": { "communicationPreferences": "İletişim Tercihleri",
"addedFail": " Eklenirken hata meydana geldi, lütfen tekrar deneyiniz.", "updateAvatar": "Profil Resmini Güncelle"
"addedSuccessfully": " Başarıyla Eklendi!", },
"updatedSuccessfully": " Başarıyla Güncellendi!", "Warnings": {
"updatedFail": " Güncellenirken hata meydana geldi, lütfen tekrar deneyiniz.", "addedFail": " Eklenirken hata meydana geldi, lütfen tekrar deneyiniz.",
"addedSuccessfully": " Başarıyla Eklendi!",
"deletedSuccessfully": " Başarıyla Silindi!",
"deletedFail": " Silinirken hata meydana geldi, lütfen tekrar deneyiniz.", "updatedSuccessfully": " Başarıyla Güncellendi!",
"updatedFail": " Güncellenirken hata meydana geldi, lütfen tekrar deneyiniz.",
"genericUpdateFailed": "Güncelleme başarısız oldu. Lütfen tekrar deneyiniz.",
"notFound": "Bulunamadı", "deletedSuccessfully": " Başarıyla Silindi!",
"notUndone": "Bu işlem geri alınamaz!", "deletedFail": " Silinirken hata meydana geldi, lütfen tekrar deneyiniz.",
"required": "Tüm Alanlar Zorunludur!",
"sureForDelete": " Silmek İstediğinize Emin Misiniz?", "genericUpdateFailed": "Güncelleme başarısız oldu. Lütfen tekrar deneyiniz.",
"uniqueName": " Benzersiz bir isim veriniz! " "notFound": "Bulunamadı",
}, "notUndone": "Bu işlem geri alınamaz!",
"required": "Tüm Alanlar Zorunludur!",
"UserActivities": { "sureForDelete": " Silmek İstediğinize Emin Misiniz?",
"title": "Kullanıcı Aktiviteleri" "uniqueName": " Benzersiz bir isim veriniz! "
}, },
"SystemActivities": {
"title": "Sistem Aktiviteleri" "UserActivities": {
}, "title": "Kullanıcı Aktiviteleri"
},
"DataCenter": { "SystemActivities": {
"title": "Veri Merkezleri", "title": "Sistem Aktiviteleri"
"create": "Veri Merkezi Ekle", },
"name": "İsim",
"namePlaceholder": "Veri merkezi ismini girin", "DataCenter": {
"externalId": "Harici ID", "title": "Veri Merkezleri",
"externalIdPlaceholder": "Harici ID girin", "create": "Veri Merkezi Ekle",
"number": "Numara", "name": "İsim",
"numberPlaceholder": "Numara girin", "namePlaceholder": "Veri merkezi ismini girin",
"url": "URL", "externalId": "Harici ID",
"urlPlaceholder": "URL girin", "externalIdPlaceholder": "Harici ID girin",
"createSuccess": "Veri merkezi başarıyla oluşturuldu", "number": "Numara",
"deleteSuccess": "Veri merkezi başarıyla silindi", "numberPlaceholder": "Numara girin",
"searchPlaceholder": "Veri merkezlerinde ara..." "url": "URL",
}, "urlPlaceholder": "URL girin",
"createSuccess": "Veri merkezi başarıyla oluşturuldu",
"DataCenters": { "deleteSuccess": "Veri merkezi başarıyla silindi",
"title": "Veri Merkezleri", "searchPlaceholder": "Veri merkezlerinde ara..."
"create": "Veri Merkezi Ekle", },
"name": "İsim",
"namePlaceholder": "Veri merkezi ismini girin", "DataCenters": {
"externalId": "Harici ID", "title": "Veri Merkezleri",
"externalIdPlaceholder": "Harici ID girin", "create": "Veri Merkezi Ekle",
"number": "Numara", "name": "İsim",
"numberPlaceholder": "Numara girin", "namePlaceholder": "Veri merkezi ismini girin",
"url": "URL", "externalId": "Harici ID",
"urlPlaceholder": "URL girin", "externalIdPlaceholder": "Harici ID girin",
"createSuccess": "Veri merkezi başarıyla oluşturuldu", "number": "Numara",
"deleteSuccess": "Veri merkezi başarıyla silindi", "numberPlaceholder": "Numara girin",
"searchPlaceholder": "Veri merkezlerinde ara..." "url": "URL",
} "urlPlaceholder": "URL girin",
} "createSuccess": "Veri merkezi başarıyla oluşturuldu",
"deleteSuccess": "Veri merkezi başarıyla silindi",
"searchPlaceholder": "Veri merkezlerinde ara..."
}
}

View File

@@ -122,7 +122,10 @@ const DataCenterManagement = () => {
const [mapPosition, setMapPosition] = useState(null); const [mapPosition, setMapPosition] = useState(null);
const dataCenterStore = useSelector((state) => state.dataCenter); const dataCenterStore = useSelector((state) => {
console.log('DataCenter Store:', state.dataCenter);
return state.dataCenter;
});
const emissionScopeStore = useSelector((state) => state.emissionScope); const emissionScopeStore = useSelector((state) => state.emissionScope);
const datasStore = useSelector((state) => state.datas); const datasStore = useSelector((state) => state.datas);
const emissionSourceStore = useSelector((state) => state.emissionSources); const emissionSourceStore = useSelector((state) => state.emissionSources);
@@ -179,8 +182,9 @@ const DataCenterManagement = () => {
}, },
{ {
name: t("Actions"), name: t("Actions"),
allowOverflow: false, allowOverflow: true,
maxWidth: "150px", width: "150px",
center: true,
cell: (row) => { cell: (row) => {
return ( return (
<div className="d-flex"> <div className="d-flex">
@@ -189,7 +193,7 @@ const DataCenterManagement = () => {
<MoreVertical size={15} /> <MoreVertical size={15} />
</DropdownToggle> </DropdownToggle>
<DropdownMenu container={"body"} end> <DropdownMenu container={"body"} end>
{permissionCheck("datacenter_update") && ( {permissionCheck("data_center_update") && (
<DropdownItem <DropdownItem
tag="a" tag="a"
className="w-100" className="w-100"
@@ -199,7 +203,7 @@ const DataCenterManagement = () => {
<span className="align-middle ml-50">{t("Cruds.edit")}</span> <span className="align-middle ml-50">{t("Cruds.edit")}</span>
</DropdownItem> </DropdownItem>
)} )}
{permissionCheck("datacenter_delete") && ( {permissionCheck("data_center_delete") && (
<DropdownItem <DropdownItem
tag="a" tag="a"
className="w-100" className="w-100"
@@ -348,24 +352,25 @@ const DataCenterManagement = () => {
}, [selectedDataCenter.areaId, areasStore?.areas]); }, [selectedDataCenter.areaId, areasStore?.areas]);
const handleEditDataCenter = (row) => { const handleEditDataCenter = (row) => {
console.log('Editing data center:', row);
setEditingDataCenter(row); setEditingDataCenter(row);
setSelectedDataCenter({ setSelectedDataCenter({
name: row.dataCenter, name: row.dataCenter,
externalId: row.externalId, externalId: row.externalId?.toString(),
number: row.number, number: row.number?.toString(),
address: row.address, address: row.address || "",
areaId: row.area?.id, areaId: row.area?.id || null,
cityId: null, // City is a string in the backend, not an object cityId: null,
latitude: row.latitude, latitude: row.latitude,
longitude: row.longitude, longitude: row.longitude,
ayposURL: row.ayposURL, ayposURL: row.ayposURL || "",
city: row.city || "", city: row.city || "",
emissionScopeId: row.emissionScope?.id, emissionScopeId: row.emissionScope?.id || null,
sectorId: row.sector?.id, sectorId: row.sector?.id || null,
subSectorId: row.subSector?.id, subSectorId: row.subSector?.id || null,
emissionSourceId: row.emissionSource?.id, emissionSourceId: row.emissionSource?.id || null,
consuptionUnitId: row.consuptionUnit?.id, consuptionUnitId: row.consuptionUnit?.id || null,
activitySubUnitId: row.activitySubUnit?.id activitySubUnitId: row.activitySubUnit?.id || null
}); });
// Set the selected sector and sub sector for cascading dropdowns // Set the selected sector and sub sector for cascading dropdowns
@@ -409,34 +414,62 @@ const DataCenterManagement = () => {
const validateForm = () => { const validateForm = () => {
const errors = []; const errors = [];
// Required fields // Required fields validation
if (!selectedDataCenter.name) { if (!selectedDataCenter.name?.trim()) {
errors.push(t("DataCenter.nameRequired")); errors.push(t("DataCenter.nameRequired"));
} }
if (!selectedDataCenter.externalId) { if (!selectedDataCenter.externalId?.trim()) {
errors.push(t("DataCenter.externalIdRequired")); errors.push(t("DataCenter.externalIdRequired"));
} }
if (!selectedDataCenter.sectorId) { if (!selectedDataCenter.sectorId) {
errors.push(t("DataCenter.sectorRequired")); errors.push(t("DataCenter.sectorRequired"));
} }
// Validate external ID is a number // Number validations
if (selectedDataCenter.externalId && isNaN(parseInt(selectedDataCenter.externalId))) { try {
errors.push(t("DataCenter.externalIdMustBeNumber")); if (selectedDataCenter.externalId) {
const externalId = parseInt(selectedDataCenter.externalId);
if (isNaN(externalId) || externalId < 0) {
errors.push(t("DataCenter.externalIdMustBePositiveNumber"));
}
}
if (selectedDataCenter.number) {
const number = parseInt(selectedDataCenter.number);
if (isNaN(number) || number < 1) {
errors.push(t("DataCenter.numberMustBePositive"));
}
}
} catch (e) {
errors.push(t("DataCenter.invalidNumberFormat"));
} }
// Validate coordinates if either is provided // Coordinate validations
if ((selectedDataCenter.latitude && !selectedDataCenter.longitude) || if (selectedDataCenter.latitude || selectedDataCenter.longitude) {
(!selectedDataCenter.latitude && selectedDataCenter.longitude)) { try {
errors.push(t("DataCenter.bothCoordinatesRequired")); const lat = parseFloat(selectedDataCenter.latitude);
const lng = parseFloat(selectedDataCenter.longitude);
if (isNaN(lat) || lat < -90 || lat > 90) {
errors.push(t("DataCenter.invalidLatitude"));
}
if (isNaN(lng) || lng < -180 || lng > 180) {
errors.push(t("DataCenter.invalidLongitude"));
}
} catch (e) {
errors.push(t("DataCenter.invalidCoordinates"));
}
} }
// Validate area and city are selected together // URL validation
if (selectedDataCenter.areaId && !selectedDataCenter.cityId) { if (selectedDataCenter.ayposURL?.trim()) {
errors.push(t("DataCenter.cityRequired")); try {
new URL(selectedDataCenter.ayposURL);
} catch (e) {
errors.push(t("DataCenter.invalidURL"));
}
} }
// Validate sector hierarchy // Relationship validations
if (selectedDataCenter.subSectorId && !selectedDataCenter.sectorId) { if (selectedDataCenter.subSectorId && !selectedDataCenter.sectorId) {
errors.push(t("DataCenter.sectorRequired")); errors.push(t("DataCenter.sectorRequired"));
} }
@@ -446,6 +479,9 @@ const DataCenterManagement = () => {
if (selectedDataCenter.consuptionUnitId && !selectedDataCenter.emissionSourceId) { if (selectedDataCenter.consuptionUnitId && !selectedDataCenter.emissionSourceId) {
errors.push(t("DataCenter.emissionSourceRequired")); errors.push(t("DataCenter.emissionSourceRequired"));
} }
if (selectedDataCenter.activitySubUnitId && !selectedDataCenter.subSectorId) {
errors.push(t("DataCenter.subSectorRequiredForActivity"));
}
return errors; return errors;
}; };
@@ -460,11 +496,16 @@ const DataCenterManagement = () => {
} }
try { try {
// Ensure number is set for new data centers // Format data according to GraphQL input type
const dataToSubmit = { const dataToSubmit = {
...selectedDataCenter, dataCenter: selectedDataCenter.name,
number: selectedDataCenter.number || 1, // Default to 1 if not set externalId: parseInt(selectedDataCenter.externalId),
city: selectedDataCenter.city, // Add city to the payload number: parseInt(selectedDataCenter.number || "1"),
address: selectedDataCenter.address,
areaId: selectedDataCenter.areaId,
latitude: selectedDataCenter.latitude ? parseFloat(selectedDataCenter.latitude) : null,
longitude: selectedDataCenter.longitude ? parseFloat(selectedDataCenter.longitude) : null,
ayposURL: selectedDataCenter.ayposURL,
emissionScopeId: selectedDataCenter.emissionScopeId, emissionScopeId: selectedDataCenter.emissionScopeId,
sectorId: selectedDataCenter.sectorId, sectorId: selectedDataCenter.sectorId,
subSectorId: selectedDataCenter.subSectorId, subSectorId: selectedDataCenter.subSectorId,
@@ -482,6 +523,9 @@ const DataCenterManagement = () => {
await dispatch(createDataCenter(dataToSubmit)); await dispatch(createDataCenter(dataToSubmit));
enqueueSnackbar(t("DataCenter.createSuccess"), { variant: "success" }); enqueueSnackbar(t("DataCenter.createSuccess"), { variant: "success" });
} }
// Refresh the data centers list
await dispatch(getDataCenters());
handleCloseModal(); handleCloseModal();
} catch (error) { } catch (error) {
@@ -1035,7 +1079,9 @@ const DataCenterManagement = () => {
sortIcon={<ChevronDown size={10} />} sortIcon={<ChevronDown size={10} />}
paginationDefaultPage={currentPage} paginationDefaultPage={currentPage}
paginationComponent={CustomPagination} paginationComponent={CustomPagination}
data={dataCenterStore.dataCenters} data={dataCenterStore?.dataCenters || []}
progressPending={dataCenterStore?.loading}
progressComponent={<div className="text-center p-3">Loading...</div>}
noDataComponent={ noDataComponent={
<div className="p-2 text-center"> <div className="p-2 text-center">
{t("Common.noDataAvailable")} {t("Common.noDataAvailable")}

View File

@@ -3,7 +3,7 @@ import { MaterialReactTable } from "material-react-table";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Card, CardHeader, CardTitle, Alert } from "reactstrap"; import { Card, CardHeader, CardTitle, Alert } from "reactstrap";
import { getMainDataTablesWithPaginate } from "../../redux/actions/mainDataTables/index"; import { getVMEmissionSummary } from "../../redux/actions/mainDataTables/index";
import { editNumbers } from "../../components/edit-numbers"; import { editNumbers } from "../../components/edit-numbers";
function MainDataTables() { function MainDataTables() {
@@ -16,7 +16,7 @@ function MainDataTables() {
const fetchData = async () => { const fetchData = async () => {
try { try {
setLoading(true); setLoading(true);
await dispatch(getMainDataTablesWithPaginate()); await dispatch(getVMEmissionSummary());
} catch (err) { } catch (err) {
console.error('Error in MainDataTables:', err); console.error('Error in MainDataTables:', err);
setError(err.message); setError(err.message);
@@ -35,74 +35,21 @@ function MainDataTables() {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const columns = [ const columns = [
{ { header: t("VM ID"), accessorKey: "vmId", Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span> },
header: t("ID"), { header: t("VM Name"), accessorKey: "vmName", Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span> },
accessorKey: "id", { header: t("VM Power"), accessorKey: "vmPower", Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span> },
Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span>, { header: t("VM Status"), accessorKey: "vmStatus", Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span> },
}, { header: t("Total Emission"), accessorKey: "totalEmission", Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span> },
{ { header: t("Created Date"), accessorKey: "createdDate", Cell: ({ cell }) => (<span>{cell.getValue() ? new Date(cell.getValue()).toLocaleString() : "-"}</span>), sortable: true },
header: t("Year"), { header: t("Physical Machine"), accessorKey: "physicalMachine", Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span> },
accessorKey: "year", { header: t("Project"), accessorKey: "project", Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span> },
Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span>, { header: t("Data Center"), accessorKey: "dataCenter", Cell: ({ cell }) => <span>{cell.getValue() || "-"}</span> },
}, { header: "CO2", accessorKey: "co2", Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span> },
{ { header: "CH4", accessorKey: "ch4", Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span> },
header: t("Sector"), { header: "N2O", accessorKey: "n2o", Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span> },
accessorKey: "sector",
Cell: ({ cell, row }) => <span>{row.original?.sector?.tag || "-"}</span>,
},
{
header: t("Sub Sector"),
accessorKey: "subSector",
Cell: ({ cell, row }) => <span>{row.original?.subSector?.tag || "-"}</span>,
},
{
header: t("Activity Sub Unit"),
accessorKey: "activitySubUnit",
Cell: ({ cell, row }) => <span>{row.original?.activitySubUnit?.tag || "-"}</span>,
},
{
header: t("Emission Source"),
accessorKey: "emissionSource",
Cell: ({ cell, row }) => <span>{row.original?.emissionSource?.tag || "-"}</span>,
},
{
header: t("Emission Scope"),
accessorKey: "emissionScope",
Cell: ({ cell, row }) => <span>{row.original?.emissionScope?.tag || "-"}</span>,
},
{
header: t("Total Emission"),
accessorKey: "totalEmission",
Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span>,
},
{
header: "CO2",
accessorKey: "co2",
Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span>,
},
{
header: "CH4",
accessorKey: "ch4",
Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span>,
},
{
header: "N2O",
accessorKey: "n2o",
Cell: ({ cell }) => <span>{editNumbers(cell.getValue()) || "-"}</span>,
},
{
header: t("Created Date"),
accessorKey: "createdDate",
Cell: ({ cell }) => (
<span>
{cell.getValue() ? new Date(cell.getValue()).toLocaleString() : "-"}
</span>
),
sortable: true,
},
]; ];
const tableData = mainDataTablesStore?.mainDataTablesWithPaginate?.content || []; const tableData = mainDataTablesStore?.vmEmissionSummary || [];
console.log('VM Emission data:', tableData); console.log('VM Emission data:', tableData);
if (error) { if (error) {
@@ -140,7 +87,7 @@ function MainDataTables() {
pageIndex: 0 pageIndex: 0
}, },
sorting: [ sorting: [
{ id: 'dataCenter', desc: false } { id: 'createdDate', desc: true }
], ],
density: 'compact' density: 'compact'
}} }}