diff --git a/.env.example b/.env.example index fd33e22..8efbc8c 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ HOST="rms.witel.ir" -NEXT_PUBLIC_VERSION="1.8.0" +NEXT_PUBLIC_VERSION="1.8.1" NEXT_PUBLIC_API_URL="https://rms.witel.ir" NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map" \ No newline at end of file diff --git a/src/components/dashboard/damageItems/ExcelPrint/index.jsx b/src/components/dashboard/damageItems/ExcelPrint/index.jsx new file mode 100644 index 0000000..4c6a825 --- /dev/null +++ b/src/components/dashboard/damageItems/ExcelPrint/index.jsx @@ -0,0 +1,75 @@ +"use client"; +import DataTableFilterDataStructure from "@/core/utils/DataTableFilterDataStructure"; +import isArrayEmpty from "@/core/utils/isArrayEmpty"; +import { EXPORT_DAMAGES_ITEMS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { useTheme } from "@emotion/react"; +import DescriptionIcon from "@mui/icons-material/Description"; +import { Button, CircularProgress, IconButton, useMediaQuery } from "@mui/material"; +import FileSaver from "file-saver"; +import moment from "jalali-moment"; +import { useMemo, useState } from "react"; + +const PrintExcel = ({ table, filterData }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [loading, setLoading] = useState(false); + const requestServer = useRequest({ notificationSuccess: true }); + const activeFilters = Object.entries(filterData).reduce((acc, [key, filter]) => { + if (filter.value && (!Array.isArray(filter.value) || filter.value.some((item) => item.trim() !== ""))) { + acc.push({ id: key, value: filter.value }); + } + return acc; + }, []); + + const filterParams = useMemo(() => { + const params = new URLSearchParams(); + if (activeFilters.length > 0) { + activeFilters.map((filter, index) => { + const filteredFilterData = DataTableFilterDataStructure(filterData, isArrayEmpty); + params.set("filters", JSON.stringify(filteredFilterData.length === 0 ? [] : filteredFilterData)); + }); + } else { + params.set("filters", JSON.stringify([])); + } + return params; + }, [activeFilters]); + + const clickHandler = () => { + setLoading(true); + requestServer(`${EXPORT_DAMAGES_ITEMS}?${filterParams}`, "get", { + requestOptions: { responseType: "blob" }, + }) + .then((response) => { + const filename = `خروجی لیست آیتم های خسارات وارده بر ابنیه فنی تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; + FileSaver.saveAs(response.data, filename); + }) + .catch(() => {}) + .finally(() => { + setLoading(false); + }); + }; + + return ( + <> + {isMobile ? ( + + + + ) : ( + + )} + + ); +}; +export default PrintExcel; diff --git a/src/components/dashboard/damageItems/Toolbar.jsx b/src/components/dashboard/damageItems/Toolbar.jsx index 065ecd8..ac74d58 100644 --- a/src/components/dashboard/damageItems/Toolbar.jsx +++ b/src/components/dashboard/damageItems/Toolbar.jsx @@ -1,10 +1,13 @@ +import { Box } from "@mui/material"; import CreateDamage from "./Actions/Create"; +import PrintExcel from "./ExcelPrint"; -const Toolbar = ({ mutate }) => { +const Toolbar = ({ table, filterData, mutate }) => { return ( - <> + + - + ); }; export default Toolbar; diff --git a/src/components/dashboard/damages/operator/ExcelPrint/index.jsx b/src/components/dashboard/damages/operator/ExcelPrint/index.jsx index 096389f..94e9bfa 100644 --- a/src/components/dashboard/damages/operator/ExcelPrint/index.jsx +++ b/src/components/dashboard/damages/operator/ExcelPrint/index.jsx @@ -53,12 +53,12 @@ const PrintExcel = ({ table, filterData }) => { return ( <> {isMobile ? ( - + ) : (