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, }) } />
subSector.label != "Katı Atık Bertarafı" )} className="react-select" placeholder="" filterOption={customFilterForSelect} defaultValue={editingEmissionSourceData?.subSector} onChange={(value) => { setEditingEmissionSourceData({ ...editingEmissionSourceData, subSector: 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, }) } />
{ setEditingEmissionSourceData({ ...editingEmissionSourceData, subSector: value, }); }} />
{ 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 (
{t("EmissionSources.emissionSources")} {permissionCheck("emission_source_create") && ( )}
handlePerPage(e)} >
{permissionCheck("deleted_items") && (
{ setShowDeletedEmissionSource(e.target.checked); setCurrentPage(1); }} />
)} { setSelectedSectorFilter(e.target.value); setCurrentPage(1); }} > {sectorsOptions.map((sector, index) => ( ))}
} paginationComponent={CustomPagination} data={emissionSources} noDataComponent={

{t("EmissionSources.emissionSource")} {t("Warnings.notFound")}

} />
{renderEmissionSourceModal()}
); }; export default EmissionSource;