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/core/utils/routes.js b/src/core/utils/routes.js index a2e7f01..bd25977 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -95,6 +95,7 @@ export const GET_RECEIPT_DAMAGE_ITEMS_LIST = api + "/api/v3/damages"; export const CREATE_RECEIPT_DAMAGE_ITEMS = api + "/api/v3/damages"; export const UPDATE_RECEIPT_DAMAGE_ITEMS = api + "/api/v3/damages"; export const ATIVITY_RECEIPT_DAMAGE_ITEMS = api + "/api/v3/damages/activate"; +export const EXPORT_DAMAGES_ITEMS = api + "/api/v3/damages/excel"; // damage receipt export const GET_TECHNICAL_DAMAGE_OPERATOR_LIST = api + "/api/v3/receipts";