import React, { useState, useEffect } from "react";
import { ChevronDown, Edit, MoreVertical, Plus, Trash } from "react-feather";
import {
Card,
CardHeader,
CardTitle,
Input,
Label,
Row,
Col,
Button,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
UncontrolledDropdown,
DropdownToggle,
DropdownMenu,
DropdownItem,
} from "reactstrap";
import Select from "react-select";
import DataTable from "react-data-table-component";
import ReactPaginate from "react-paginate";
import { useSnackbar } from "notistack";
import { useDispatch, useSelector } from "react-redux";
import withReactContent from "sweetalert2-react-content";
import { default as SweetAlert } from "sweetalert2";
import { useTranslation } from "react-i18next";
import {
getEmissionSourcesWithPaginate,
addEmissionSource,
updateEmissionSource,
updateEmissionSourceOfWaste,
deleteEmissionSource,
} from "../../redux/actions/emissionSources/index";
import {
getSectors,
getSectorById,
getConsuptionUnits,
} from "../../redux/actions/datas";
import Factors from "../../components/emission-source/factors";
import { permissionCheck } from "../../components/permission-check";
import { customFilterForSelect } from "../../utility/Utils";
const Swal = withReactContent(SweetAlert);
const EmissionSource = () => {
const { t } = useTranslation();
const initialColumns = [
{
name: t("EmissionSources.emissionSourceName"),
selector: (row) => row.tag,
sortable: true,
minWidth: "250px",
},
{
name: t("EmissionSources.subSector"),
selector: (row) => row.subsector,
sortable: false,
minWidth: "250px",
cell: (row) => {row.subSector?.tag || "-"},
},
{
name: t("EmissionSources.sector"),
selector: (row) => row.subsector,
sortable: false,
minWidth: "250px",
cell: (row) => {row.subSector?.sector?.tag || "-"},
},
{
name: t("EmissionSources.emissionScopes"),
selector: (row) => row.emissionScope,
sortable: false,
minWidth: "250px",
cell: (row) => (
{row.emissionScope && row.emissionScope != "null"
? "Kapsam-" + row.emissionScope
: "-"}
),
},
{
name: t("Actions"),
allowOverflow: false,
maxWidth: "100px",
cell: (row) => {
return (
{permissionCheck("emission_source_update") && (
handleEditEmissionSource(row)}
>
{t("Cruds.edit")}
)}
{permissionCheck("emission_source_delete") && (
handleDeleteEmissionSource(row)}
>
{t("Cruds.delete")}
)}
);
},
},
];
useEffect(() => {
if (
!(
permissionCheck("emission_source_delete") ||
permissionCheck("emission_source_update")
)
) {
const updatedColumns = initialColumns.filter(
(column) => column.name !== ("Aksiyonlar" || "Actions")
);
setServerSideColumns(updatedColumns);
}
}, []);
const dispatch = useDispatch();
const { enqueueSnackbar } = useSnackbar();
const [currentPage, setCurrentPage] = useState(1);
const [rowsPerPage, setRowsPerPage] = useState(5);
const [loading, setLoading] = useState(false);
const [serverSideColumns, setServerSideColumns] = useState(initialColumns);
const emissionSourceStore = useSelector((state) => state.emissionSources);
const datasStore = useSelector((state) => state.datas);
const [emissionSources, setEmissionSources] = useState([]);
const [selectedSector, setSelectedSector] = useState(null);
const [sectorsOptions, setSectorsOptions] = useState([]);
const [subSectorsOptions, setSubSectorsOptions] = useState([]);
const [showAddEmissionSourceModal, setShowAddEmissionSourceModal] =
useState(false);
const [editingEmissionSourceData, setEditingEmissionSourceData] = useState(
{}
);
const [searchValue, setSearchValue] = useState("");
const [selectedSectorFilter, setSelectedSectorFilter] = useState("");
const [showDeletedEmissionSource, setShowDeletedEmissionSource] =
useState(false);
useEffect(() => {
dispatch(
getEmissionSourcesWithPaginate({
currentPage,
rowsPerPage,
selectedSectorFilter,
showDeletedEmissionSource,
})
);
}, [
currentPage,
rowsPerPage,
selectedSectorFilter,
showDeletedEmissionSource,
]);
useEffect(() => {
dispatch(getSectors());
dispatch(getConsuptionUnits({ sector: "Atık" }));
}, []);
useEffect(() => {
if (selectedSector != null) dispatch(getSectorById(selectedSector));
}, [selectedSector]);
useEffect(() => {
if (emissionSourceStore?.emissionSourcesWithPaginate?.content) {
setEmissionSources(
emissionSourceStore?.emissionSourcesWithPaginate?.content
);
}
}, [emissionSourceStore.emissionSourcesWithPaginate?.content]);
useEffect(() => {
setSectorsOptions(
datasStore?.sectors.map((sector) => {
return {
value: sector?.id,
label: sector?.tag,
};
})
);
}, [datasStore?.sectors]);
useEffect(() => {
setSubSectorsOptions(
datasStore?.sector?.subSectors?.map((subSector) => {
return {
value: subSector?.id,
label: subSector?.tag,
};
})
);
}, [datasStore?.sector]);
const handleFilter = (e) => {
setSearchValue(e.target.value);
if (e.target.value !== "") {
setEmissionSources(
emissionSourceStore.emissionSourcesWithPaginate?.content?.filter(
(source) =>
source.tag
.toUpperCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.includes(
e.target.value
.toUpperCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
)
)
);
} else {
setEmissionSources(
emissionSourceStore.emissionSourcesWithPaginate?.content
);
}
};
const handlePagination = (page) => {
setCurrentPage(page.selected + 1);
setEmissionSources(emissionSources.emissionSourcesWithPaginate?.content);
};
const handlePerPage = (e) => {
setCurrentPage(1);
setRowsPerPage(parseInt(e.target.value));
setEmissionSources(emissionSources.emissionSourcesWithPaginate?.content);
};
const CustomPagination = () => {
const count = Number(
(
emissionSourceStore?.emissionSourcesWithPaginate?.pageInfo
?.totalElements / rowsPerPage
).toFixed(1)
);
//asdaasdasd
return (
handlePagination(page)}
pageClassName={"page-item"}
nextLinkClassName={"page-link"}
nextClassName={"page-item next"}
previousClassName={"page-item prev"}
previousLinkClassName={"page-link"}
pageLinkClassName={"page-link"}
breakClassName="page-item"
breakLinkClassName="page-link"
containerClassName={
"pagination react-paginate separated-pagination pagination-sm justify-content-end pr-1 mt-1"
}
/>
);
};
const onAddEmissionSourceButtonPressed = () => {
setEditingEmissionSourceData({
emissionSourceConvertUnits: datasStore?.consuptionUnits?.map(
(consuptionUnit) => {
return {
unit: {
id: consuptionUnit.id,
tag: consuptionUnit.tag,
},
value: "",
};
}
),
});
setShowAddEmissionSourceModal(true);
};
function convertToDesiredFormatAndStringify(arr) {
const cleanedArray = arr
.filter((item) => item.unit.tag !== "TJ")
.filter((item) => item.value !== "")
.map((item) => ({
unitId: item.unit?.id || "",
convertValue: item.value || "",
}));
return JSON.stringify(cleanedArray).replace(/"([^"]+)":/g, "$1:");
}
const onAddEmissionSourceModalButtonPressed = () => {
setLoading(true);
if (!editingEmissionSourceData.id) {
const newEmissionSourceData = {
tag: editingEmissionSourceData?.tag,
description: editingEmissionSourceData?.description || "-",
emissionScope: editingEmissionSourceData?.emissionScope?.value,
subSector: editingEmissionSourceData?.subSector?.value,
co2: editingEmissionSourceData?.co2 || 0,
ch4: editingEmissionSourceData?.ch4 || 0,
n2o: editingEmissionSourceData?.n2o || 0,
emissionSourceConvertUnits: convertToDesiredFormatAndStringify(
editingEmissionSourceData.emissionSourceConvertUnits
),
};
dispatch(addEmissionSource(newEmissionSourceData))
.then(() => {
setLoading(false);
setSelectedSector(null);
setShowAddEmissionSourceModal(false);
enqueueSnackbar(t("Warnings.addedSuccessfully"), {
variant: "success",
preventDuplicate: true,
});
})
.catch(() => {
setLoading(false);
setShowAddEmissionSourceModal(false);
enqueueSnackbar(t("Warnings.addedFail"), {
variant: "error",
preventDuplicate: true,
});
});
} else {
const updateEmissionSourceData = {
id: editingEmissionSourceData.id,
tag: editingEmissionSourceData?.tag,
description: editingEmissionSourceData?.description || "-",
emissionScope: editingEmissionSourceData?.emissionScope?.value,
subSector: editingEmissionSourceData?.subSector?.value,
co2: editingEmissionSourceData?.co2 || 0,
ch4: editingEmissionSourceData?.ch4 || 0,
n2o: editingEmissionSourceData?.n2o || 0,
emissionSourceConvertUnits: convertToDesiredFormatAndStringify(
editingEmissionSourceData.emissionSourceConvertUnits
),
...editingEmissionSourceData.wasteEmissionSourceSupplement,
};
dispatch(
editingEmissionSourceData?.sector?.label != "Atık"
? updateEmissionSource(updateEmissionSourceData)
: updateEmissionSourceOfWaste(updateEmissionSourceData)
)
.then(() => {
enqueueSnackbar(t("Warnings.updatedSuccessfully"), {
variant: "success",
});
setLoading(false);
setSelectedSector(null);
setEditingEmissionSourceData(null);
setShowAddEmissionSourceModal(false);
})
.catch(() => {
enqueueSnackbar(
`${updateEmissionSourceData.tag}, ${t("Warnings.updatedFail")}`,
{
variant: "error",
}
);
setLoading(false);
});
}
};
const renderEmissionSourceModal = () => {
//Atık için Modal
if (editingEmissionSourceData?.sector?.label === "Atık") {
return (
setShowAddEmissionSourceModal(!showAddEmissionSourceModal)
}
className="modal-dialog-centered"
>
setShowAddEmissionSourceModal(!showAddEmissionSourceModal)
}
>
{editingEmissionSourceData?.id
? editingEmissionSourceData.tag
: t("EmissionSources.addEmissionSource")}
setEditingEmissionSourceData({
...editingEmissionSourceData,
tag: e.target.value,
})
}
/>
{editingEmissionSourceData?.subSector?.label !=
"Yakma ve Açık Yanma" ? (
{editingEmissionSourceData?.subSector?.label !=
"Atık Su Arıtma ve Deşarjı" ? (
) : (
)}
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
dryWeightCH4: inputValue,
},
});
}
}}
/>
{editingEmissionSourceData?.subSector?.label !=
"Atık Su Arıtma ve Deşarjı" && (
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
wetWeightCH4: inputValue,
},
});
}
}}
/>
)}
{editingEmissionSourceData?.subSector?.label !=
"Atık Su Arıtma ve Deşarjı" ? (
) : (
)}
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
dryWeightN2O: inputValue,
},
});
}
}}
/>
{editingEmissionSourceData?.subSector?.label !=
"Atık Su Arıtma ve Deşarjı" && (
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
wetWeightN2O: inputValue,
},
});
}
}}
/>
)}
) : (
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
dryWeightCH4:
editingEmissionSourceData
?.wasteEmissionSourceSupplement
.dryWeightCH4 != 0 && inputValue,
dampWeightCH4:
editingEmissionSourceData
?.wasteEmissionSourceSupplement
.dampWeightCH4 != 0 && inputValue,
},
});
}
}}
/>
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
wetWeightN2O: inputValue,
},
});
}
}}
/>
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
wetWeightCH4: inputValue,
},
});
}
}}
/>
{
const inputValue = e.target.value;
if (
/^\d*\.?\d*$/.test(inputValue) ||
inputValue === ""
) {
setEditingEmissionSourceData({
...editingEmissionSourceData,
wasteEmissionSourceSupplement: {
...editingEmissionSourceData.wasteEmissionSourceSupplement,
dryWeightN2O: inputValue,
},
});
}
}}
/>
)}
);
}
//Atık hariç diğer sektörler için Modal
const convertedUnits = handleConvertUnits(
editingEmissionSourceData?.emissionSourceConvertUnits
);
return (
setShowAddEmissionSourceModal(!showAddEmissionSourceModal)
}
className="modal-dialog-centered"
>
setShowAddEmissionSourceModal(!showAddEmissionSourceModal)
}
>
{editingEmissionSourceData?.id
? editingEmissionSourceData.tag
: t("EmissionSources.addEmissionSource")}
setEditingEmissionSourceData({
...editingEmissionSourceData,
tag: e.target.value,
})
}
/>
{convertedUnits?.map((item, index) => {
return (
{
return null;
}}
/>
{
const inputValue = e.target.value;
if (/^\d*\.?\d*$/.test(inputValue) || inputValue === "") {
const updatedConvertUnits = [...convertedUnits];
updatedConvertUnits[index] = {
...item,
value: inputValue,
};
setEditingEmissionSourceData({
...editingEmissionSourceData,
emissionSourceConvertUnits: updatedConvertUnits,
});
}
}}
/>
);
})}
{/* */}
);
};
const handleConvertUnits = (emissionSourceConvertUnits) => {
const existingUnitIds =
emissionSourceConvertUnits?.map((item) => item.unit.id) || [];
const missingUnits = datasStore.consuptionUnits.filter(
(unit) => !existingUnitIds.includes(unit.id)
);
const convertUnitsOfSelectedSource = [
...(emissionSourceConvertUnits || []),
...missingUnits.map((unit) => ({
unit: { id: unit.id, tag: unit.tag },
value: "", // You can set the default value for missing units here
})),
];
return convertUnitsOfSelectedSource;
};
const handleEditEmissionSource = (selectedSource) => {
const sectorOfSelectedSource = {
value: selectedSource?.subSector?.sector?.id,
label: selectedSource?.subSector?.sector?.tag,
};
const subSectorOfSelectedSource = {
value: selectedSource?.subSector?.id,
label: selectedSource?.subSector?.tag,
};
const emissionScopeOfSelectedSource = {
value: selectedSource?.emissionScope,
label: selectedSource?.emissionScope
? "Kapsam-" + selectedSource?.emissionScope
: "",
};
const convertUnitsOfSelectedSource =
selectedSource?.emissionSourceConvertUnits?.map((item) => ({
...item,
value: item.value.toString(),
}));
const wasteEmissionSourceSupplementOfSelectedSource = {
dryWeightCH4:
selectedSource?.wasteEmissionSourceSupplement?.dryWeightCH4 || 0,
wetWeightCH4:
selectedSource?.wasteEmissionSourceSupplement?.wetWeightCH4 || 0,
dryWeightN2O:
selectedSource?.wasteEmissionSourceSupplement?.dryWeightN2O || 0,
wetWeightN2O:
selectedSource?.wasteEmissionSourceSupplement?.wetWeightN2O || 0,
dampWeightCH4:
selectedSource?.wasteEmissionSourceSupplement?.dampWeightCH4 || 0,
};
setSelectedSector(selectedSource?.subSector?.sector?.id);
setShowAddEmissionSourceModal(true);
setEditingEmissionSourceData({
id: selectedSource.id,
tag: selectedSource?.tag,
description: selectedSource?.description || "-",
subSector: selectedSource?.subSector,
co2: selectedSource?.co2,
ch4: selectedSource?.ch4,
n2o: selectedSource?.n2o,
sector: sectorOfSelectedSource,
subSector: subSectorOfSelectedSource,
emissionScope: emissionScopeOfSelectedSource,
emissionSourceConvertUnits: convertUnitsOfSelectedSource,
wasteEmissionSourceSupplement:
wasteEmissionSourceSupplementOfSelectedSource,
});
};
const handleDeleteEmissionSource = async (selectedSource) => {
const result = await Swal.fire({
title: `${selectedSource.tag}, ${t("Warnings.sureForDelete")}`,
text: t("Warnings.notUndone"),
icon: "warning",
showCancelButton: true,
confirmButtonText: t("Cruds.delete"),
cancelButtonText: t("Cruds.cancel"),
customClass: {
confirmButton: "btn btn-primary",
cancelButton: "btn btn-danger ml-1",
},
buttonsStyling: false,
});
if (result.value !== null && result.value === true) {
dispatch(deleteEmissionSource(selectedSource.id));
}
};
return (
);
};
export default EmissionSource;