import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import Report from "../Report/Report";
import { MetaButton, StyledPagination } from "../Report/MetaButtons";
import Stack from "@mui/material/Stack";
import { AddItemsSpeeedDial } from "../InterfaceComponents/AddItemsSpeedDial";
import { ZoomInMap, ZoomOutMap, CropFree } from "@mui/icons-material";
import { ButtonContainer } from "../Report/LayoutContainer";
import { reportSelectors, reportActions } from '../../../../stores/reportStore'
const { selectCurrentPage, selectCurrentReport } = reportSelectors;
const { addReportPage, addReportItem, setReportPage } = reportActions;
/**
* Report builder outermost component
*
* @param {Object} props
* @param {number} props.activeStep Current step of report - step are:
* 1. Select preset or previous report
* 2. select report settings (eg. county)
* 3. Edit items
* 4. Print / export
* @param {function} props.handleStep handle change step (step: Number) => void
* @component
* @category Components/ReportBuilder
*/
function ReportEditor({ activeStep, handleStep }){
const dispatch = useDispatch();
const currPage = useSelector(selectCurrentPage);
const reportName = useSelector(selectCurrentReport);
const layouts = useSelector(
({ report }) => report.reports?.[reportName]?.layout
);
const pageLength = layouts?.length;
const layout = layouts?.[currPage];
const [zoomMultiplier, setZoomMultiplier] = useState(1);
const handleZoom = (action) => {
switch (action) {
case "zoomIn":
setZoomMultiplier((prev) => prev + 0.1);
break;
case "zoomOut":
setZoomMultiplier((prev) => prev - 0.1);
break;
case "reset":
setZoomMultiplier(1);
break;
default:
break;
}
};
const handleAddItem = (item) => {
if (item.type === "page") {
handleAddPage();
} else {
dispatch(
addReportItem({
reportName,
pageIdx: currPage,
item,
}))
}
};
const handleAddPage = () => dispatch(addReportPage(reportName));
const handleChangePage = (_e, value) => {
dispatch(setReportPage(value - 1))
};
const canAddItem = !layout?.find(
(item) => item.y + item.h >= 70 && item.x + item.w >= 80
);
return (
<>
<Stack sx={{ maxHeight: "100%" }}>
<Report
reportName={reportName}
activeStep={activeStep}
zoomMultiplier={zoomMultiplier}
handleStep={handleStep}
/>
<ButtonContainer>
<Stack
spacing={2}
width="100%"
alignItems="flex-end"
justifyContent="space-between"
direction="row"
sx={{
mt: 2,
}}
>
<Stack direction="row" spacing={2} alignItems="center">
<p>Page Zoom</p>
<MetaButton
variant="text"
aria-label="Zoom in report page"
title="Zoom in report page"
onClick={() => handleZoom("zoomIn")}
>
<ZoomInMap />
</MetaButton>
<MetaButton
variant="text"
aria-label="Zoom out report page"
title="Zoom out report page"
onClick={() => handleZoom("zoomOut")}
>
<ZoomOutMap />
</MetaButton>
<MetaButton
variant="text"
aria-label="Reset zoom"
title="Reset zoom"
onClick={() => handleZoom("reset")}
>
<CropFree />
</MetaButton>
</Stack>
<Stack alignItems="center" sx={{
mt: 2,
justifySelf: "center",
marginRight: "-15%"
}}>
<StyledPagination
variant="outlined"
shape="rounded"
count={pageLength}
page={currPage + 1}
onChange={handleChangePage}
/>
</Stack>
<Stack justifyContent="flex-end" sx={{ maxHeight: 20 }}>
<AddItemsSpeeedDial
canAddItem={canAddItem}
handleAddItem={handleAddItem}
/>
</Stack>
</Stack>
</ButtonContainer>
</Stack>
</>
);
};
export { ReportEditor };
Source