city, graphics page, errors on graphics still

This commit is contained in:
2025-07-27 21:10:01 +03:00
parent ff456b5f62
commit d730a58823
16 changed files with 1888 additions and 1052 deletions

View File

@@ -33,6 +33,7 @@ public class DataCenter extends BaseDomain {
private Double latitude; private Double latitude;
private Double longitude; private Double longitude;
private Area area; private Area area;
private String city;
private List<Project> projects = new ArrayList<>(); private List<Project> projects = new ArrayList<>();
private Sector sector; private Sector sector;
@@ -201,4 +202,12 @@ public class DataCenter extends BaseDomain {
public void setActivitySubUnit(ActivitySubUnit activitySubUnit) { public void setActivitySubUnit(ActivitySubUnit activitySubUnit) {
this.activitySubUnit = activitySubUnit; this.activitySubUnit = activitySubUnit;
} }
@Column(name = "city")
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
} }

View File

@@ -16,6 +16,7 @@ public class DataCenterDto {
private int id; private int id;
private Integer externalId; private Integer externalId;
private Integer number; private Integer number;
private String city;
private AreaDto area; private AreaDto area;
private List<ProjectDto> projects; private List<ProjectDto> projects;
@@ -61,6 +62,13 @@ public class DataCenterDto {
this.number = number; this.number = number;
} }
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public AreaDto getArea() { public AreaDto getArea() {
return area; return area;
} }

View File

@@ -11,6 +11,18 @@ import com.sgs.graphql.userHistory.mutation.UserLogger;
import com.sgs.graphql.userNotification.mutation.UserNotificationMutation; import com.sgs.graphql.userNotification.mutation.UserNotificationMutation;
import com.sgs.graphql.area.domain.Area; import com.sgs.graphql.area.domain.Area;
import com.sgs.graphql.area.service.AreaService; import com.sgs.graphql.area.service.AreaService;
import com.sgs.graphql.emissionScope.domain.EmissionScope;
import com.sgs.graphql.emissionScope.service.EmissionScopeService;
import com.sgs.graphql.sector.domain.Sector;
import com.sgs.graphql.sector.service.SectorService;
import com.sgs.graphql.subSector.domain.SubSector;
import com.sgs.graphql.subSector.service.SubSectorService;
import com.sgs.graphql.emissionSource.domain.EmissionSource;
import com.sgs.graphql.emissionSource.service.EmissionSourceService;
import com.sgs.graphql.consuptionUnit.domain.ConsuptionUnit;
import com.sgs.graphql.consuptionUnit.service.ConsuptionUnitService;
import com.sgs.graphql.activitySubUnit.domain.ActivitySubUnit;
import com.sgs.graphql.activitySubUnit.service.ActivitySubUnitService;
import graphql.kickstart.tools.GraphQLMutationResolver; import graphql.kickstart.tools.GraphQLMutationResolver;
import graphql.schema.DataFetchingEnvironment; import graphql.schema.DataFetchingEnvironment;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -27,17 +39,32 @@ public class DataCenterMutation implements GraphQLMutationResolver {
private final DataCenterService dataCenterService; private final DataCenterService dataCenterService;
private final DataCenterRepo dataCenterRepo; private final DataCenterRepo dataCenterRepo;
private final AreaService areaService; private final AreaService areaService;
private final EmissionScopeService emissionScopeService;
private final SectorService sectorService;
private final SubSectorService subSectorService;
private final EmissionSourceService emissionSourceService;
private final ConsuptionUnitService consuptionUnitService;
private final ActivitySubUnitService activitySubUnitService;
private final SystemLogger systemLogger; private final SystemLogger systemLogger;
private final UserLogger userLogger; private final UserLogger userLogger;
private final UserNotificationMutation notificationMutation; private final UserNotificationMutation notificationMutation;
@Autowired @Autowired
public DataCenterMutation(DataCenterService dataCenterService, DataCenterRepo dataCenterRepo, public DataCenterMutation(DataCenterService dataCenterService, DataCenterRepo dataCenterRepo,
AreaService areaService, SystemLogger systemLogger, AreaService areaService, EmissionScopeService emissionScopeService,
SectorService sectorService, SubSectorService subSectorService,
EmissionSourceService emissionSourceService, ConsuptionUnitService consuptionUnitService,
ActivitySubUnitService activitySubUnitService, SystemLogger systemLogger,
UserLogger userLogger, UserNotificationMutation notificationMutation) { UserLogger userLogger, UserNotificationMutation notificationMutation) {
this.dataCenterService = dataCenterService; this.dataCenterService = dataCenterService;
this.dataCenterRepo = dataCenterRepo; this.dataCenterRepo = dataCenterRepo;
this.areaService = areaService; this.areaService = areaService;
this.emissionScopeService = emissionScopeService;
this.sectorService = sectorService;
this.subSectorService = subSectorService;
this.emissionSourceService = emissionSourceService;
this.consuptionUnitService = consuptionUnitService;
this.activitySubUnitService = activitySubUnitService;
this.systemLogger = systemLogger; this.systemLogger = systemLogger;
this.userLogger = userLogger; this.userLogger = userLogger;
this.notificationMutation = notificationMutation; this.notificationMutation = notificationMutation;
@@ -57,6 +84,8 @@ public class DataCenterMutation implements GraphQLMutationResolver {
dataCenter.setAddress(input.getAddress()); dataCenter.setAddress(input.getAddress());
dataCenter.setLatitude(input.getLatitude()); dataCenter.setLatitude(input.getLatitude());
dataCenter.setLongitude(input.getLongitude()); dataCenter.setLongitude(input.getLongitude());
dataCenter.setCity(input.getCity());
dataCenter.setConsuptionAmount(input.getConsuptionAmount());
// Set area if provided // Set area if provided
if (input.getAreaId() != null) { if (input.getAreaId() != null) {
@@ -65,6 +94,48 @@ public class DataCenterMutation implements GraphQLMutationResolver {
dataCenter.setArea(area); dataCenter.setArea(area);
} }
// Set emission scope if provided
if (input.getEmissionScopeId() != null) {
EmissionScope emissionScope = emissionScopeService.findById(input.getEmissionScopeId())
.orElseThrow(() -> new NoSuchElementException("Emission scope not found with id: " + input.getEmissionScopeId()));
dataCenter.setEmissionScope(emissionScope);
}
// Set sector if provided
if (input.getSectorId() != null) {
Sector sector = sectorService.findById(input.getSectorId())
.orElseThrow(() -> new NoSuchElementException("Sector not found with id: " + input.getSectorId()));
dataCenter.setSector(sector);
}
// Set sub sector if provided
if (input.getSubSectorId() != null) {
SubSector subSector = subSectorService.findById(input.getSubSectorId())
.orElseThrow(() -> new NoSuchElementException("Sub sector not found with id: " + input.getSubSectorId()));
dataCenter.setSubSector(subSector);
}
// Set emission source if provided
if (input.getEmissionSourceId() != null) {
EmissionSource emissionSource = emissionSourceService.findById(input.getEmissionSourceId())
.orElseThrow(() -> new NoSuchElementException("Emission source not found with id: " + input.getEmissionSourceId()));
dataCenter.setEmissionSource(emissionSource);
}
// Set consumption unit if provided
if (input.getConsuptionUnitId() != null) {
ConsuptionUnit consuptionUnit = consuptionUnitService.findById(input.getConsuptionUnitId())
.orElseThrow(() -> new NoSuchElementException("Consumption unit not found with id: " + input.getConsuptionUnitId()));
dataCenter.setConsuptionUnit(consuptionUnit);
}
// Set activity sub unit if provided
if (input.getActivitySubUnitId() != null) {
ActivitySubUnit activitySubUnit = activitySubUnitService.findById(input.getActivitySubUnitId())
.orElseThrow(() -> new NoSuchElementException("Activity sub unit not found with id: " + input.getActivitySubUnitId()));
dataCenter.setActivitySubUnit(activitySubUnit);
}
// Set number if not provided // Set number if not provided
if (dataCenter.getNumber() == null) { if (dataCenter.getNumber() == null) {
Integer maxNumber = dataCenterRepo.findMaxNumber(); Integer maxNumber = dataCenterRepo.findMaxNumber();
@@ -121,6 +192,12 @@ public class DataCenterMutation implements GraphQLMutationResolver {
if (input.getLongitude() != null) { if (input.getLongitude() != null) {
dataCenter.setLongitude(input.getLongitude()); dataCenter.setLongitude(input.getLongitude());
} }
if (input.getCity() != null) {
dataCenter.setCity(input.getCity());
}
if (input.getConsuptionAmount() != null) {
dataCenter.setConsuptionAmount(input.getConsuptionAmount());
}
// Update area if provided // Update area if provided
if (input.getAreaId() != null) { if (input.getAreaId() != null) {
@@ -129,6 +206,48 @@ public class DataCenterMutation implements GraphQLMutationResolver {
dataCenter.setArea(area); dataCenter.setArea(area);
} }
// Update emission scope if provided
if (input.getEmissionScopeId() != null) {
EmissionScope emissionScope = emissionScopeService.findById(input.getEmissionScopeId())
.orElseThrow(() -> new NoSuchElementException("Emission scope not found with id: " + input.getEmissionScopeId()));
dataCenter.setEmissionScope(emissionScope);
}
// Update sector if provided
if (input.getSectorId() != null) {
Sector sector = sectorService.findById(input.getSectorId())
.orElseThrow(() -> new NoSuchElementException("Sector not found with id: " + input.getSectorId()));
dataCenter.setSector(sector);
}
// Update sub sector if provided
if (input.getSubSectorId() != null) {
SubSector subSector = subSectorService.findById(input.getSubSectorId())
.orElseThrow(() -> new NoSuchElementException("Sub sector not found with id: " + input.getSubSectorId()));
dataCenter.setSubSector(subSector);
}
// Update emission source if provided
if (input.getEmissionSourceId() != null) {
EmissionSource emissionSource = emissionSourceService.findById(input.getEmissionSourceId())
.orElseThrow(() -> new NoSuchElementException("Emission source not found with id: " + input.getEmissionSourceId()));
dataCenter.setEmissionSource(emissionSource);
}
// Update consumption unit if provided
if (input.getConsuptionUnitId() != null) {
ConsuptionUnit consuptionUnit = consuptionUnitService.findById(input.getConsuptionUnitId())
.orElseThrow(() -> new NoSuchElementException("Consumption unit not found with id: " + input.getConsuptionUnitId()));
dataCenter.setConsuptionUnit(consuptionUnit);
}
// Update activity sub unit if provided
if (input.getActivitySubUnitId() != null) {
ActivitySubUnit activitySubUnit = activitySubUnitService.findById(input.getActivitySubUnitId())
.orElseThrow(() -> new NoSuchElementException("Activity sub unit not found with id: " + input.getActivitySubUnitId()));
dataCenter.setActivitySubUnit(activitySubUnit);
}
// Save the updated data center // Save the updated data center
DataCenter updatedDataCenter = dataCenterService.save(dataCenter); DataCenter updatedDataCenter = dataCenterService.save(dataCenter);

View File

@@ -13,6 +13,14 @@ public class DataCenterInput extends BaseCreateInput {
private Double latitude; private Double latitude;
private Double longitude; private Double longitude;
private UUID areaId; private UUID areaId;
private String city;
private UUID emissionScopeId;
private UUID sectorId;
private UUID subSectorId;
private UUID emissionSourceId;
private UUID consuptionUnitId;
private Double consuptionAmount;
private UUID activitySubUnitId;
public String getDataCenter() { public String getDataCenter() {
return dataCenter; return dataCenter;
@@ -77,5 +85,69 @@ public class DataCenterInput extends BaseCreateInput {
public void setAreaId(UUID areaId) { public void setAreaId(UUID areaId) {
this.areaId = areaId; this.areaId = areaId;
} }
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public UUID getEmissionScopeId() {
return emissionScopeId;
}
public void setEmissionScopeId(UUID emissionScopeId) {
this.emissionScopeId = emissionScopeId;
}
public UUID getSectorId() {
return sectorId;
}
public void setSectorId(UUID sectorId) {
this.sectorId = sectorId;
}
public UUID getSubSectorId() {
return subSectorId;
}
public void setSubSectorId(UUID subSectorId) {
this.subSectorId = subSectorId;
}
public UUID getEmissionSourceId() {
return emissionSourceId;
}
public void setEmissionSourceId(UUID emissionSourceId) {
this.emissionSourceId = emissionSourceId;
}
public UUID getConsuptionUnitId() {
return consuptionUnitId;
}
public void setConsuptionUnitId(UUID consuptionUnitId) {
this.consuptionUnitId = consuptionUnitId;
}
public Double getConsuptionAmount() {
return consuptionAmount;
}
public void setConsuptionAmount(Double consuptionAmount) {
this.consuptionAmount = consuptionAmount;
}
public UUID getActivitySubUnitId() {
return activitySubUnitId;
}
public void setActivitySubUnitId(UUID activitySubUnitId) {
this.activitySubUnitId = activitySubUnitId;
}
} }

View File

@@ -12,6 +12,7 @@ public class MainDataTableCriteria extends BaseCriteria {
private UUID neighborhood; private UUID neighborhood;
private UUID organization; private UUID organization;
private String year; private String year;
private UUID vm;
public UUID getSector() { public UUID getSector() {
return sector; return sector;
@@ -68,4 +69,12 @@ public class MainDataTableCriteria extends BaseCriteria {
public void setYear(String year) { public void setYear(String year) {
this.year = year; this.year = year;
} }
public UUID getVm() {
return vm;
}
public void setVm(UUID vm) {
this.vm = vm;
}
} }

View File

@@ -38,6 +38,10 @@ public class MainDataTableCriteriaSpec extends BaseCriteriaSpec<MainDataTable, M
return (year == null) ? null : (Specification<MainDataTable>) (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("year"), year); return (year == null) ? null : (Specification<MainDataTable>) (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("year"), year);
} }
public static Specification<MainDataTable> vm(UUID vm) {
return (vm == null) ? null : (Specification<MainDataTable>) (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.join("vm").get("id"), vm);
}
@Override @Override
public Specification<MainDataTable> createForAll(MainDataTableCriteria criteria) { public Specification<MainDataTable> createForAll(MainDataTableCriteria criteria) {
return Specification.where(sector(criteria.getSector())) return Specification.where(sector(criteria.getSector()))
@@ -45,6 +49,7 @@ public class MainDataTableCriteriaSpec extends BaseCriteriaSpec<MainDataTable, M
.and(district(criteria.getDistrict())) .and(district(criteria.getDistrict()))
.and(neighborhood(criteria.getNeighborhood())) .and(neighborhood(criteria.getNeighborhood()))
.and(organization(criteria.getOrganization())) .and(organization(criteria.getOrganization()))
.and(year(criteria.getYear())); .and(year(criteria.getYear()))
.and(vm(criteria.getVm()));
} }
} }

View File

@@ -102,4 +102,12 @@ input DataCenterInput {
latitude: Float latitude: Float
longitude: Float longitude: Float
areaId: ID areaId: ID
city: String
emissionScopeId: ID
sectorId: ID
subSectorId: ID
emissionSourceId: ID
consuptionUnitId: ID
consuptionAmount: Float
activitySubUnitId: ID
} }

View File

@@ -6,4 +6,5 @@ input MainDataTableCriteria{
neighborhood:ID neighborhood:ID
organization:ID organization:ID
year:String year:String
vm:ID
} }

View File

@@ -26,23 +26,7 @@ type MainDataTable {
proteinAmount:Float proteinAmount:Float
burnOrOpenBurn:Boolean burnOrOpenBurn:Boolean
scopeCheck:Boolean scopeCheck:Boolean
vm: VM
}
type Vm {
id: ID
status: String
name: String
power: Float
calcOn: Boolean
config: Config
}
type Config {
id: ID
cpu: Int
ram: Int
disk: Int
} }
type VMEmissionSummary { type VMEmissionSummary {

View File

@@ -242,6 +242,117 @@ export const getAreasWithCriteria = (organizationId) => {
}; };
}; };
export const getAreasByDataCenter = (dataCenterId) => {
return async (dispatch) => {
// Don't make the request if dataCenterId is undefined, null, or empty
if (!dataCenterId || dataCenterId === "undefined") {
dispatch({
type: "GET_AREAS_WITH_CRITERIA",
payload: {
getAreasWithCriteria: [],
},
});
return;
}
ApplicationService.http()
.post(
"/graphql",
{
query: `
{
dataCenter(id: "${dataCenterId}") {
id
dataCenter
area {
id
tag
countries {
id
countryCode
name
}
cities {
id
name
coordinates
country{
id
name
}
}
districts {
id
name
coordinates
city{
id
name
country{
id
name
}
}
}
neighborhoods {
id
name
minLong
maxLong
minLat
maxLat
district{
id
name
city{
id
name
country{
id
name
}
}
}
}
isDeleted
}
}
}
`,
},
{
headers: {
Authorization: "Bearer " + localStorage.getItem("accessToken"),
},
}
)
.then((response) => {
const dataCenter = response?.data?.data?.dataCenter;
let areas = [];
if (dataCenter && dataCenter.area && !dataCenter.area.isDeleted) {
areas = [dataCenter.area];
}
dispatch({
type: "GET_AREAS_WITH_CRITERIA",
payload: {
getAreasWithCriteria: areas,
},
});
})
.catch((error) => {
console.error("Error fetching areas by data center:", error);
dispatch({
type: "GET_AREAS_WITH_CRITERIA",
payload: {
getAreasWithCriteria: [],
},
});
});
};
};
export const addArea = (data) => { export const addArea = (data) => {
const dataToJSON = JSON.stringify(data); const dataToJSON = JSON.stringify(data);
const deleteQuotesFromKey = dataToJSON.replace(/"([^(")"]+)":/g, "$1:"); const deleteQuotesFromKey = dataToJSON.replace(/"([^(")"]+)":/g, "$1:");

View File

@@ -170,7 +170,8 @@ export const createDataCenter = (dataCenterData) => {
areaId: dataCenterData.areaId, areaId: dataCenterData.areaId,
address: dataCenterData.address || "", address: dataCenterData.address || "",
latitude: dataCenterData.latitude ? parseFloat(dataCenterData.latitude) : null, latitude: dataCenterData.latitude ? parseFloat(dataCenterData.latitude) : null,
longitude: dataCenterData.longitude ? parseFloat(dataCenterData.longitude) : null longitude: dataCenterData.longitude ? parseFloat(dataCenterData.longitude) : null,
city: dataCenterData.city
} }
} }
}, },
@@ -254,7 +255,8 @@ export const updateDataCenter = (id, dataCenterData) => {
areaId: dataCenterData.areaId, areaId: dataCenterData.areaId,
address: dataCenterData.address || "", address: dataCenterData.address || "",
latitude: dataCenterData.latitude ? parseFloat(dataCenterData.latitude) : null, latitude: dataCenterData.latitude ? parseFloat(dataCenterData.latitude) : null,
longitude: dataCenterData.longitude ? parseFloat(dataCenterData.longitude) : null longitude: dataCenterData.longitude ? parseFloat(dataCenterData.longitude) : null,
city: dataCenterData.city
} }
} }
}, },
@@ -336,3 +338,87 @@ export const deleteDataCenter = (id) => {
} }
}; };
}; };
export const getDataCenterVMs = (dataCenterId) => {
return new Promise(async (resolve, reject) => {
// Don't make the request if dataCenterId is undefined, null, or empty
if (!dataCenterId || dataCenterId === "undefined") {
console.log('getDataCenterVMs: No dataCenterId provided');
resolve([]);
return;
}
try {
console.log('getDataCenterVMs: Fetching VMs for data center:', dataCenterId);
const response = await ApplicationService.http()
.post(
"/graphql",
{
query: `
{
dataCenter(id: "${dataCenterId}") {
id
dataCenter
projects {
id
name
physicalMachines {
id
name
vms {
active {
id
name
status
power
}
inactive {
id
name
status
power
}
}
}
}
}
}
`,
},
{
headers: {
Authorization: "Bearer " + localStorage.getItem("accessToken"),
},
}
);
const dataCenter = response?.data?.data?.dataCenter;
console.log('getDataCenterVMs: Data center response:', dataCenter);
let allVMs = [];
if (dataCenter && dataCenter.projects) {
dataCenter.projects.forEach(project => {
if (project.physicalMachines) {
project.physicalMachines.forEach(pm => {
if (pm.vms) {
if (pm.vms.active) {
allVMs = allVMs.concat(pm.vms.active);
}
if (pm.vms.inactive) {
allVMs = allVMs.concat(pm.vms.inactive);
}
}
});
}
});
}
console.log('getDataCenterVMs: Found VMs:', allVMs);
resolve(allVMs);
} catch (error) {
console.error("Error fetching VMs by data center:", error);
resolve([]);
}
});
};

View File

@@ -161,7 +161,7 @@ export const getSubSectorById = (id) => {
dispatch({ dispatch({
type: "GET_SUBSECTOR_BY_ID", type: "GET_SUBSECTOR_BY_ID",
payload: { payload: {
subSector, subSector: subSector || {},
}, },
}); });
}); });

View File

@@ -689,3 +689,119 @@ export const deleteDataInput = (dataId) => {
}); });
}; };
}; };
export const getMainDataTablesByVMs = (data) => {
return async (dispatch) => {
const { filterOptions } = data;
try {
const response = await ApplicationService.http()
.post(
"/graphql",
{
query: `
{
mainDataTables(
criteria: {
year: "${filterOptions?.year?.value}"
deleted: false
}
) {
year
sector { id tag }
subSector{ id tag }
activitySubUnit{ id tag }
totalEmission
emissionScope{ tag }
emissionSource{ id tag }
vm { id name status power }
}
}
`,
},
{
headers: {
Authorization: "Bearer " + localStorage.getItem("accessToken"),
},
}
);
const allMainDataTables = response.data.data.mainDataTables || [];
dispatch({
type: "GET_MAIN_TABLES",
payload: {
mainDataTables: allMainDataTables,
},
});
} catch (error) {
console.error("Error fetching main data tables:", error);
dispatch({
type: "GET_MAIN_TABLES",
payload: {
mainDataTables: [],
},
});
}
};
};
export const testMainDataTables = () => {
return async (dispatch) => {
try {
console.log('testMainDataTables: Testing basic mainDataTables query');
const response = await ApplicationService.http()
.post(
"/graphql",
{
query: `
{
mainDataTables(
criteria: {
deleted: false
}
) {
id
year
totalEmission
vm {
id
name
status
power
}
}
}
`,
},
{
headers: {
Authorization: "Bearer " + localStorage.getItem("accessToken"),
},
}
);
console.log('testMainDataTables: Response:', response.data);
if (response.data.errors) {
console.error('testMainDataTables: GraphQL Errors:', response.data.errors);
}
const allData = response.data.data.mainDataTables || [];
console.log('testMainDataTables: All mainDataTables:', allData);
console.log('testMainDataTables: Count:', allData.length);
// Check which records have VM data
const recordsWithVM = allData.filter(record => record.vm);
console.log('testMainDataTables: Records with VM:', recordsWithVM);
console.log('testMainDataTables: Records with VM count:', recordsWithVM.length);
dispatch({
type: "GET_MAIN_TABLES",
payload: {
mainDataTables: allData,
},
});
} catch (error) {
console.error("testMainDataTables: Error:", error);
}
};
};

View File

@@ -30,7 +30,7 @@ const datasReducer = (state = initialState, action) => {
case "GET_SUBSECTOR_BY_ID": case "GET_SUBSECTOR_BY_ID":
return { return {
...state, ...state,
subSector: action.payload.subSector, subSector: action.payload.subSector || {},
}; };
case "GET_ACTIVITY_SUBUNITS": case "GET_ACTIVITY_SUBUNITS":
return { return {

View File

@@ -31,6 +31,8 @@ import withReactContent from "sweetalert2-react-content";
import { getDataCenters, createDataCenter, updateDataCenter, deleteDataCenter } from "../redux/actions/dataCenter"; import { getDataCenters, createDataCenter, updateDataCenter, deleteDataCenter } from "../redux/actions/dataCenter";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { getAreas } from "../redux/actions/areas"; import { getAreas } from "../redux/actions/areas";
import { getSectors, getSectorById, getSubSectorById, getConsuptionUnits } from "../redux/actions/datas";
import { getAllEmissionSources } from "../redux/actions/emissionSources";
import { permissionCheck } from "../components/permission-check"; import { permissionCheck } from "../components/permission-check";
import { customFilterForSelect } from "../utility/Utils"; import { customFilterForSelect } from "../utility/Utils";
import { MapContainer, TileLayer, Marker, useMapEvents } from 'react-leaflet'; import { MapContainer, TileLayer, Marker, useMapEvents } from 'react-leaflet';
@@ -107,14 +109,33 @@ const DataCenterManagement = () => {
address: "", address: "",
latitude: null, latitude: null,
longitude: null, longitude: null,
ayposURL: "" ayposURL: "",
city: "",
emissionScopeId: null,
sectorId: null,
subSectorId: null,
emissionSourceId: null,
consuptionUnitId: null,
activitySubUnitId: null
}); });
const [mapPosition, setMapPosition] = useState(null); const [mapPosition, setMapPosition] = useState(null);
const dataCenterStore = useSelector((state) => state.dataCenter); const dataCenterStore = useSelector((state) => state.dataCenter);
const areasStore = useSelector((state) => state.areas); const areasStore = useSelector((state) => state.areas);
const datasStore = useSelector((state) => state.datas);
const emissionSourceStore = useSelector((state) => state.emissionSources);
const [areasOptions, setAreasOptions] = useState([]); const [areasOptions, setAreasOptions] = useState([]);
const [sectorsOptions, setSectorsOptions] = useState([]);
const [subSectorsOptions, setSubSectorsOptions] = useState([]);
const [emissionSourcesOptions, setEmissionSourcesOptions] = useState([]);
const [consuptionUnitsOptions, setConsuptionUnitsOptions] = useState([]);
const [activitySubUnitsOptions, setActivitySubUnitsOptions] = useState([]);
const [emissionScopesOptions, setEmissionScopesOptions] = useState([]);
// Add state for selected sector and sub sector like in data input
const [selectedSector, setSelectedSector] = useState(null);
const [selectedSubSector, setSelectedSubSector] = useState(null);
const [editingDataCenter, setEditingDataCenter] = useState(null); const [editingDataCenter, setEditingDataCenter] = useState(null);
@@ -205,6 +226,7 @@ const DataCenterManagement = () => {
useEffect(() => { useEffect(() => {
dispatch(getDataCenters()); dispatch(getDataCenters());
dispatch(getAreas()); dispatch(getAreas());
dispatch(getSectors());
}, [dispatch]); }, [dispatch]);
useEffect(() => { useEffect(() => {
@@ -216,6 +238,96 @@ const DataCenterManagement = () => {
); );
}, [areasStore]); }, [areasStore]);
useEffect(() => {
setSectorsOptions(
datasStore?.sectors?.map((sector) => ({
value: sector?.id,
label: sector?.tag,
}))
);
}, [datasStore?.sectors]);
useEffect(() => {
setSubSectorsOptions([]);
setSubSectorsOptions(
datasStore?.sector?.subSectors?.map((subSector) => ({
value: subSector?.id,
label: subSector?.tag,
}))
);
}, [datasStore?.sector]);
useEffect(() => {
setActivitySubUnitsOptions(
datasStore?.subSector?.activitySubUnits?.map((activitySubUnit) => ({
value: activitySubUnit?.id,
label: activitySubUnit?.tag,
}))
);
}, [datasStore?.subSector]);
useEffect(() => {
setEmissionSourcesOptions(
emissionSourceStore?.emissionSources
?.filter((source) => source.convertUnitCheck != false)
?.map((source) => ({
value: source?.id,
label: source?.tag,
}))
);
}, [emissionSourceStore?.emissionSources]);
useEffect(() => {
if (selectedDataCenter?.emissionSourceId) {
dispatch(
getConsuptionUnits({
id: selectedDataCenter?.emissionSourceId,
sector: selectedDataCenter?.sectorId,
})
);
}
}, [selectedDataCenter?.emissionSourceId]);
useEffect(() => {
if (selectedSubSector != null) {
dispatch(getAllEmissionSources(selectedSubSector));
}
}, [selectedSubSector]);
useEffect(() => {
if (selectedSector != null) {
dispatch(getSectorById(selectedSector));
}
}, [selectedSector]);
useEffect(() => {
if (selectedSubSector != null) {
dispatch(getSubSectorById(selectedSubSector));
}
}, [selectedSubSector]);
useEffect(() => {
setConsuptionUnitsOptions(
datasStore?.consuptionUnits?.map((consuptionUnit) => ({
value: consuptionUnit?.unit?.id,
label: consuptionUnit?.unit?.description,
}))
);
}, [datasStore?.consuptionUnits]);
useEffect(() => {
setEmissionScopesOptions([
{
label: "Şehir İçi",
value: false,
},
{
label: "Şehir Dışı",
value: true,
},
]);
}, []);
const handleEditDataCenter = (row) => { const handleEditDataCenter = (row) => {
setEditingDataCenter(row); setEditingDataCenter(row);
setSelectedDataCenter({ setSelectedDataCenter({
@@ -226,8 +338,20 @@ const DataCenterManagement = () => {
address: row.address, address: row.address,
latitude: row.latitude, latitude: row.latitude,
longitude: row.longitude, longitude: row.longitude,
ayposURL: row.ayposURL ayposURL: row.ayposURL,
city: row.city,
emissionScopeId: row.emissionScope?.id,
sectorId: row.sector?.id,
subSectorId: row.subSector?.id,
emissionSourceId: row.emissionSource?.id,
consuptionUnitId: row.consuptionUnit?.id,
activitySubUnitId: row.activitySubUnit?.id
}); });
// Set the selected sector and sub sector for cascading dropdowns
setSelectedSector(row.sector?.id);
setSelectedSubSector(row.subSector?.id);
// Only set map position if we have both address and valid coordinates // Only set map position if we have both address and valid coordinates
setMapPosition(row.address && row.latitude && row.longitude ? [row.latitude, row.longitude] : null); setMapPosition(row.address && row.latitude && row.longitude ? [row.latitude, row.longitude] : null);
setShowAddModal(true); setShowAddModal(true);
@@ -272,7 +396,14 @@ const DataCenterManagement = () => {
// Ensure number is set for new data centers // Ensure number is set for new data centers
const dataToSubmit = { const dataToSubmit = {
...selectedDataCenter, ...selectedDataCenter,
number: selectedDataCenter.number || 1 // Default to 1 if not set number: selectedDataCenter.number || 1, // Default to 1 if not set
city: selectedDataCenter.city, // Add city to the payload
emissionScopeId: selectedDataCenter.emissionScopeId,
sectorId: selectedDataCenter.sectorId,
subSectorId: selectedDataCenter.subSectorId,
emissionSourceId: selectedDataCenter.emissionSourceId,
consuptionUnitId: selectedDataCenter.consuptionUnitId,
activitySubUnitId: selectedDataCenter.activitySubUnitId
}; };
if (editingDataCenter) { if (editingDataCenter) {
@@ -287,9 +418,9 @@ const DataCenterManagement = () => {
handleCloseModal(); handleCloseModal();
} catch (error) { } catch (error) {
console.error("Operation error:", error); console.error("Submit error:", error);
enqueueSnackbar( enqueueSnackbar(
error?.message || (editingDataCenter ? t("DataCenter.updateError") : t("DataCenter.createError")), error?.message || t("DataCenter.submitError"),
{ variant: "error" } { variant: "error" }
); );
} }
@@ -305,7 +436,8 @@ const DataCenterManagement = () => {
address: "", address: "",
latitude: null, latitude: null,
longitude: null, longitude: null,
ayposURL: "" ayposURL: "",
city: ""
}); });
setMapPosition(null); setMapPosition(null);
setEditingDataCenter(null); setEditingDataCenter(null);
@@ -488,6 +620,24 @@ const DataCenterManagement = () => {
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col sm="6">
<FormGroup>
<Label for="city">{t("DataCenter.city")}</Label>
<Input
type="text"
name="city"
id="city"
placeholder={t("DataCenter.city")}
value={selectedDataCenter.city}
onChange={(e) =>
setSelectedDataCenter({
...selectedDataCenter,
city: e.target.value,
})
}
/>
</FormGroup>
</Col>
<Col sm="12"> <Col sm="12">
<FormGroup> <FormGroup>
<Label for="area">{t("DataCenter.area")}</Label> <Label for="area">{t("DataCenter.area")}</Label>
@@ -536,6 +686,158 @@ const DataCenterManagement = () => {
</div> </div>
</FormGroup> </FormGroup>
</Col> </Col>
{/* Emission Scope Section */}
<Col sm="12">
<h5 className="mt-3 mb-2 text-primary">Emission Scope Configuration</h5>
</Col>
<Col sm="6">
<FormGroup>
<Label for="emissionScope">Emission Scope</Label>
<Select
id="emissionScope"
name="emissionScope"
placeholder="Select emission scope"
options={emissionScopesOptions}
value={emissionScopesOptions?.find(
(option) => option.value === selectedDataCenter.emissionScopeId
)}
onChange={(option) =>
setSelectedDataCenter({
...selectedDataCenter,
emissionScopeId: option?.value,
})
}
isClearable
filterOption={customFilterForSelect}
/>
</FormGroup>
</Col>
<Col sm="6">
<FormGroup>
<Label for="sector">Sector</Label>
<Select
id="sector"
name="sector"
placeholder="Select sector"
options={sectorsOptions}
value={sectorsOptions?.find(
(option) => option.value === selectedDataCenter.sectorId
)}
onChange={(option) => {
setSelectedSector(option?.value);
setSelectedDataCenter({
...selectedDataCenter,
sectorId: option?.value,
subSectorId: null,
emissionSourceId: null,
consuptionUnitId: null,
activitySubUnitId: null,
});
}}
isClearable
filterOption={customFilterForSelect}
/>
</FormGroup>
</Col>
<Col sm="6">
<FormGroup>
<Label for="subSector">Sub Sector</Label>
<Select
id="subSector"
name="subSector"
placeholder="Select sub sector"
options={subSectorsOptions}
value={subSectorsOptions?.find(
(option) => option.value === selectedDataCenter.subSectorId
)}
onChange={(option) => {
setSelectedSubSector(option?.value);
setSelectedDataCenter({
...selectedDataCenter,
subSectorId: option?.value,
emissionSourceId: null,
consuptionUnitId: null,
activitySubUnitId: null,
});
}}
isClearable
filterOption={customFilterForSelect}
isDisabled={!selectedDataCenter.sectorId}
/>
</FormGroup>
</Col>
<Col sm="6">
<FormGroup>
<Label for="emissionSource">Emission Source</Label>
<Select
id="emissionSource"
name="emissionSource"
placeholder="Select emission source"
options={emissionSourcesOptions}
value={emissionSourcesOptions?.find(
(option) => option.value === selectedDataCenter.emissionSourceId
)}
onChange={(option) => {
setSelectedDataCenter({
...selectedDataCenter,
emissionSourceId: option?.value,
consuptionUnitId: null,
});
}}
isClearable
filterOption={customFilterForSelect}
isDisabled={!selectedDataCenter.subSectorId}
/>
</FormGroup>
</Col>
<Col sm="6">
<FormGroup>
<Label for="consuptionUnit">Consumption Unit</Label>
<Select
id="consuptionUnit"
name="consuptionUnit"
placeholder="Select consumption unit"
options={consuptionUnitsOptions}
value={consuptionUnitsOptions?.find(
(option) => option.value === selectedDataCenter.consuptionUnitId
)}
onChange={(option) => {
setSelectedDataCenter({
...selectedDataCenter,
consuptionUnitId: option?.value,
});
}}
isClearable
filterOption={customFilterForSelect}
isDisabled={!selectedDataCenter.emissionSourceId}
/>
</FormGroup>
</Col>
<Col sm="12">
<FormGroup>
<Label for="activitySubUnit">Activity Sub Unit</Label>
<Select
id="activitySubUnit"
name="activitySubUnit"
placeholder="Select activity sub unit"
options={activitySubUnitsOptions}
value={activitySubUnitsOptions?.find(
(option) => option.value === selectedDataCenter.activitySubUnitId
)}
onChange={(option) => {
setSelectedDataCenter({
...selectedDataCenter,
activitySubUnitId: option?.value,
});
}}
isClearable
filterOption={customFilterForSelect}
isDisabled={!selectedDataCenter.subSectorId}
/>
</FormGroup>
</Col>
<Col sm="12"> <Col sm="12">
<FormGroup> <FormGroup>
<Label>{t("DataCenter.location")}</Label> <Label>{t("DataCenter.location")}</Label>

View File

@@ -18,11 +18,11 @@ import { useSelector, useDispatch } from "react-redux";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import DataTable from "react-data-table-component"; import DataTable from "react-data-table-component";
import { import {
getOrganisations, getDataCenters,
getOrganisationById, getDataCenterVMs,
} from "../redux/actions/organisations"; } from "../redux/actions/dataCenter";
import { getAreasWithCriteria } from "../redux/actions/areas"; import { getAreasByDataCenter } from "../redux/actions/areas";
import { getMainDataTables } from "../redux/actions/mainDataTables"; import { getMainDataTablesByVMs, testMainDataTables } from "../redux/actions/mainDataTables";
import { editNumbers } from "../components/edit-numbers"; import { editNumbers } from "../components/edit-numbers";
import { PieChart } from "../components/graphics"; import { PieChart } from "../components/graphics";
import ConstantEnergyGraphics from "../components/subSector-graphics/ConstantEnergyGraphics"; import ConstantEnergyGraphics from "../components/subSector-graphics/ConstantEnergyGraphics";
@@ -126,7 +126,7 @@ const Graphics = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const dispatch = useDispatch(); const dispatch = useDispatch();
const OrganisationsStore = useSelector((state) => state.organizations); const dataCenterStore = useSelector((state) => state.dataCenter);
const areasStore = useSelector((state) => state.areas); const areasStore = useSelector((state) => state.areas);
const mainDataTablesStore = useSelector((state) => state.mainDataTables); const mainDataTablesStore = useSelector((state) => state.mainDataTables);
@@ -142,7 +142,7 @@ const Graphics = () => {
const [transportSubSectorData, setTransportSubSectorData] = useState([]); const [transportSubSectorData, setTransportSubSectorData] = useState([]);
const [wasteData, setWasteData] = useState([]); const [wasteData, setWasteData] = useState([]);
const [organizationOptions, setOrganizationOptions] = useState([]); const [dataCenterOptions, setDataCenterOptions] = useState([]);
const [areasOptions, setAreasOptions] = useState([]); const [areasOptions, setAreasOptions] = useState([]);
const [filter, setFilter] = useState(false); const [filter, setFilter] = useState(false);
const [filterOptions, setFilterOptions] = useState({ const [filterOptions, setFilterOptions] = useState({
@@ -154,8 +154,8 @@ const Graphics = () => {
year: "", year: "",
}); });
const [selectedOrganization, setSelectedOrganization] = useState(""); const [selectedDataCenter, setSelectedDataCenter] = useState("");
const organizationId = localStorage.getItem("organizationId"); const [dataCenterVMs, setDataCenterVMs] = useState([]);
const roleTag = localStorage.getItem("roleTag"); const roleTag = localStorage.getItem("roleTag");
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
@@ -241,68 +241,69 @@ const Graphics = () => {
]; ];
useEffect(() => { useEffect(() => {
if (roleTag != "SUPER_ADMIN") setSelectedOrganization(organizationId); dispatch(getDataCenters());
}, []); }, []);
useEffect(() => { useEffect(() => {
if (roleTag === "SUPER_ADMIN") { console.log('Data center selection changed:', selectedDataCenter);
dispatch(getOrganisations()); if (selectedDataCenter?.value) {
} else { console.log('Fetching data for data center:', selectedDataCenter.value);
dispatch(getOrganisationById(organizationId)); // Get areas for the selected data center
}
}, []);
useEffect(() => {
dispatch(
getAreasWithCriteria(
selectedOrganization?.value
? selectedOrganization.value
: organizationId
)
);
}, [selectedOrganization]);
useEffect(() => {
if (filterOptions?.year && filterOptions?.area)
dispatch( dispatch(
getMainDataTables({ getAreasByDataCenter(selectedDataCenter.value)
);
// Get VMs for the selected data center
getDataCenterVMs(selectedDataCenter.value).then(vms => {
console.log('VMs received for data center:', vms);
setDataCenterVMs(vms);
});
} else {
console.log('No data center selected');
setDataCenterVMs([]);
}
}, [selectedDataCenter]);
useEffect(() => {
console.log('Debug useEffect:', {
filterOptionsYear: filterOptions?.year,
selectedDataCenter: selectedDataCenter,
dataCenterVMsLength: dataCenterVMs.length,
filter: filter
});
if (filterOptions?.year && selectedDataCenter && dataCenterVMs.length > 0) {
const vmIds = dataCenterVMs.map(vm => vm.id);
console.log('Fetching main data tables with VM IDs:', vmIds);
console.log('Filter options:', filterOptions);
dispatch(
getMainDataTablesByVMs({
vmIds,
filterOptions, filterOptions,
}) })
); );
}, [filter]); } else {
console.log('Conditions not met for fetching data:', {
hasYear: !!filterOptions?.year,
hasSelectedDataCenter: !!selectedDataCenter,
vmCount: dataCenterVMs.length
});
}
}, [filter, dataCenterVMs, dispatch, filterOptions, selectedDataCenter]);
useEffect(() => { useEffect(() => {
let organizationOptions = []; let dataCenterOptions = [];
if ( if (dataCenterStore?.dataCenters && dataCenterStore.dataCenters.length > 0) {
OrganisationsStore.organization && dataCenterOptions = dataCenterStore.dataCenters.map((dataCenter) => ({
OrganisationsStore.organization.length !== 0 value: dataCenter.id,
) { label: dataCenter.dataCenter,
organizationOptions.push({ externalId: dataCenter.externalId,
value: OrganisationsStore.organization.id, }));
label: OrganisationsStore.organization.tag,
});
if (OrganisationsStore.organization.children) {
organizationOptions = [
...organizationOptions,
...OrganisationsStore.organization.children.map((organization) => ({
value: organization.child.id,
label: organization.child.tag,
})),
];
}
} else {
organizationOptions = OrganisationsStore.dataOrganization.map(
(organization) => ({
value: organization.id,
label: organization.tag,
})
);
} }
setOrganizationOptions(organizationOptions); setDataCenterOptions(dataCenterOptions);
}, [OrganisationsStore]); }, [dataCenterStore]);
useEffect(() => { useEffect(() => {
setAreasOptions([]); setAreasOptions([]);
@@ -359,18 +360,28 @@ const Graphics = () => {
}, [areasStore]); }, [areasStore]);
useEffect(() => { useEffect(() => {
console.log('mainDataTablesStore changed:', mainDataTablesStore?.mainDataTables);
console.log('mainDataTablesStore full state:', mainDataTablesStore);
if (mainDataTablesStore?.mainDataTables) { if (mainDataTablesStore?.mainDataTables) {
console.log('Setting mainDataTablesFilterByYear from store:', mainDataTablesStore.mainDataTables);
setMainDataTablesFilterByYear(mainDataTablesStore?.mainDataTables); setMainDataTablesFilterByYear(mainDataTablesStore?.mainDataTables);
} else {
console.log('No mainDataTables in store');
} }
}, [mainDataTablesStore.mainDataTables]); }, [mainDataTablesStore.mainDataTables]);
useEffect(() => { useEffect(() => {
console.log('mainDataTablesFilterByYear changed:', mainDataTablesFilterByYear);
console.log('mainDataTablesFilterByYear length:', mainDataTablesFilterByYear?.length);
console.log('mainDataTablesFilterByYear data:', mainDataTablesFilterByYear);
if (mainDataTablesFilterByYear?.length > 0) { if (mainDataTablesFilterByYear?.length > 0) {
let totalConstantEnergy = 0; let totalConstantEnergy = 0;
let totalTransport = 0; let totalTransport = 0;
let totalWaste = 0; let totalWaste = 0;
for (let i = 0; i < mainDataTablesFilterByYear?.length; i++) { for (let i = 0; i < mainDataTablesFilterByYear?.length; i++) {
console.log('Processing record:', mainDataTablesFilterByYear[i]);
if (mainDataTablesFilterByYear[i].sector?.tag === "Sabit Enerji") { if (mainDataTablesFilterByYear[i].sector?.tag === "Sabit Enerji") {
totalConstantEnergy += mainDataTablesFilterByYear[i].totalEmission; totalConstantEnergy += mainDataTablesFilterByYear[i].totalEmission;
} }
@@ -382,9 +393,11 @@ const Graphics = () => {
} }
} }
console.log('Calculated totals:', { totalConstantEnergy, totalTransport, totalWaste });
let total = totalConstantEnergy + totalTransport + totalWaste; let total = totalConstantEnergy + totalTransport + totalWaste;
setMainDataTables([ const processedData = [
{ {
sector: { tag: "Sabit Enerji" }, sector: { tag: "Sabit Enerji" },
totalEmission: totalConstantEnergy, totalEmission: totalConstantEnergy,
@@ -405,14 +418,22 @@ const Graphics = () => {
totalEmission: `${editNumbers(total)} tCO₂e`, totalEmission: `${editNumbers(total)} tCO₂e`,
percentage: "100,00%", percentage: "100,00%",
}, },
]); ];
console.log('Setting mainDataTables:', processedData);
setMainDataTables(processedData);
} else {
console.log('No mainDataTablesFilterByYear data found. Length:', mainDataTablesFilterByYear?.length);
console.log('mainDataTablesStore state:', mainDataTablesStore);
} }
}, [mainDataTablesFilterByYear]); }, [mainDataTablesFilterByYear]);
useEffect(() => { useEffect(() => {
console.log('mainDataTables changed for pie chart:', mainDataTables);
let newChartData = mainDataTables.filter( let newChartData = mainDataTables.filter(
(data) => data.sector.tag != "Genel Toplam" (data) => data.sector.tag != "Genel Toplam"
); );
console.log('Setting pieChartData:', newChartData);
setPieChartData(newChartData); setPieChartData(newChartData);
}, [mainDataTables]); }, [mainDataTables]);
@@ -426,7 +447,7 @@ const Graphics = () => {
); );
const summaryData = { const summaryData = {
areaName: filterOptions.area.label, areaName: selectedDataCenter?.label || "Seçili Veri Merkezi",
totalEmission: filteredData.find( totalEmission: filteredData.find(
(data) => data.sector.tag === "Genel Toplam" (data) => data.sector.tag === "Genel Toplam"
)?.totalEmission, )?.totalEmission,
@@ -443,7 +464,7 @@ const Graphics = () => {
}; };
setSummaryData(summaryData); setSummaryData(summaryData);
}, [mainDataTables, filterOptions.area.label]); }, [mainDataTables, selectedDataCenter]);
const calculateResult = (data, filterTag) => { const calculateResult = (data, filterTag) => {
const filteredData = data.filter((item) => item.sector?.tag === filterTag); const filteredData = data.filter((item) => item.sector?.tag === filterTag);
@@ -553,8 +574,15 @@ const Graphics = () => {
}; };
const handleBringButtonPressed = () => { const handleBringButtonPressed = () => {
console.log('Getir button pressed');
console.log('Current state:', {
selectedDataCenter,
filterOptions,
dataCenterVMs,
filter
});
setFilter(!filter); setFilter(!filter);
//setBringGraphics(true); setBringGraphics(true);
}; };
const handleSelect = () => { const handleSelect = () => {
@@ -688,27 +716,19 @@ const Graphics = () => {
</CardHeader> </CardHeader>
</Card> </Card>
<Row className="mx-0 mt-1 mb-50"> <Row className="mx-0 mt-1 mb-50">
<Col sm="6" md="5"> <Col sm="6" md="6">
<div className="d-flex align-items-center mb-1"> <div className="d-flex align-items-center mb-1">
<Label className="mr-1 h5" for="organization-filter"> <Label className="mr-1 h5" for="datacenter-filter">
{t("DataInput.area")} {t("DataCenter.title")}
</Label> </Label>
<Select <Select
className="react-select w-100 mr-1" className="react-select w-100"
id="organization-filter" id="datacenter-filter"
closeMenuOnSelect={true} closeMenuOnSelect={true}
menuPlacement="auto" menuPlacement="auto"
placeholder="" placeholder=""
filterOption={customFilterForSelect} filterOption={customFilterForSelect}
defaultValue={ options={dataCenterOptions}
selectedOrganization
? selectedOrganization
: {
label: localStorage.getItem("organizationName"),
value: organizationId,
}
}
options={organizationOptions}
onChange={(value) => { onChange={(value) => {
handleSelect(); handleSelect();
setFilterOptions({ setFilterOptions({
@@ -719,33 +739,12 @@ const Graphics = () => {
neighborhood: "", neighborhood: "",
year: filterOptions.year, year: filterOptions.year,
}); });
setSelectedOrganization(value); setSelectedDataCenter(value);
}}
/>
<Select
className="react-select w-100"
id="area-filter"
closeMenuOnSelect={true}
menuPlacement="auto"
placeholder=""
filterOption={customFilterForSelect}
value={filterOptions?.area}
options={areasOptions}
onChange={(value) => {
handleSelect();
setFilterOptions({
...filterOptions,
city: "",
district: "",
neighborhood: "",
area: value,
[value.type]: value.value,
});
}} }}
/> />
</div> </div>
</Col> </Col>
<Col sm="6" md="2"> <Col sm="6" md="3">
<div className="d-flex align-items-center mb-1"> <div className="d-flex align-items-center mb-1">
<Label className="mr-1 h5" for="year-select"> <Label className="mr-1 h5" for="year-select">
{t("DataInput.year")} {t("DataInput.year")}
@@ -776,10 +775,17 @@ const Graphics = () => {
<Button <Button
color="primary" color="primary"
onClick={handleBringButtonPressed} onClick={handleBringButtonPressed}
disabled={!(filterOptions.area && filterOptions.year)} disabled={!(selectedDataCenter && filterOptions.year)}
> >
<span className="align-middle ml-50">Getir</span> <span className="align-middle ml-50">Getir</span>
</Button> </Button>
<Button
color="secondary"
onClick={() => dispatch(testMainDataTables())}
className="ml-2"
>
<span className="align-middle ml-50">Test Data</span>
</Button>
</div> </div>
{mainDataTables?.length > 1 && ( {mainDataTables?.length > 1 && (
<div className="ml-2"> <div className="ml-2">
@@ -862,7 +868,7 @@ const Graphics = () => {
fontSize: `${isPDFDownloading ? "30px" : ""}`, fontSize: `${isPDFDownloading ? "30px" : ""}`,
}} }}
> >
{filterOptions.area.label} Sera Gazı Emisyon Dağılımı {selectedDataCenter?.label || "Seçili Veri Merkezi"} Sera Gazı Emisyon Dağılımı
</h5> </h5>
} }
className="react-dataTable mt-1 border-black" className="react-dataTable mt-1 border-black"