import React, { useRef } from "react"; import { Modal, Slider, Button, Select, Row, Col, Form, Divider, Switch, } from "antd"; import ReactToPrint from "react-to-print"; import { useSavedState } from "../../utils/saveload"; import { useTranslate } from "@refinedev/core"; interface PrintingDialogProps { items: JSX.Element[]; style?: string; extraSettings?: JSX.Element; visible: boolean; onCancel: () => void; title?: string; } interface PaperDimensions { width: number; height: number; } const paperDimensions: { [key: string]: PaperDimensions } = { A3: { width: 297, height: 420, }, A4: { width: 210, height: 297, }, A5: { width: 148, height: 210, }, Letter: { width: 216, height: 279, }, Legal: { width: 216, height: 356, }, Tabloid: { width: 279, height: 432, }, }; const PrintingDialog: React.FC = ({ items, style, extraSettings, visible, onCancel, title, }) => { const t = useTranslate(); const [marginLeft, setMarginLeft] = useSavedState("print-marginLeft", 10); const [marginTop, setMarginTop] = useSavedState("print-marginTop", 10); const [marginRight, setMarginRight] = useSavedState("print-marginRight", 10); const [marginBottom, setMarginBottom] = useSavedState( "print-marginBottom", 10 ); const [itemsPerRow, setItemsPerRow] = useSavedState("print-itemsPerRow", 3); const [paperSize, setPaperSize] = useSavedState("print-paperSize", "A4"); const [rowHeight, setRowHeight] = useSavedState("print-rowHeight", 70); const [previewScale, setPreviewScale] = useSavedState( "print-previewScale", 0.6 ); const [showBorder, setShowBorder] = useSavedState("print-showBorder", true); const paperWidth = paperDimensions[paperSize].width; const paperHeight = paperDimensions[paperSize].height; const printRef = useRef(null); const itemsPerPage = itemsPerRow * Math.floor((paperHeight - marginTop - marginBottom) / rowHeight); const pageBlocks = []; for (let i = 0; i < items.length; i += 1) { if (i % itemsPerPage === 0) { pageBlocks.push(items.slice(i, i + itemsPerPage)); } } const rowBlocks = pageBlocks.map((pageBlock, idx) => (
{pageBlock.map((item, index) => (
{item}
))}
)); return ( ( )} content={() => printRef.current} />, ]} width={1000} // Set the modal width to accommodate the preview >
{rowBlocks}
`${value} mm` }} value={marginLeft} onChange={(value) => { setMarginLeft(value); }} /> `${value} mm` }} value={marginTop} onChange={(value) => { setMarginTop(value); }} /> `${value} mm` }} value={marginRight} onChange={(value) => { setMarginRight(value); }} /> `${value} mm` }} value={marginBottom} onChange={(value) => { setMarginBottom(value); }} /> { setItemsPerRow(value); }} /> `${value} mm` }} value={rowHeight} onChange={(value) => { setRowHeight(value); }} /> setShowBorder(checked)} /> {extraSettings && } {extraSettings} { setPreviewScale(value); }} />
); }; export default PrintingDialog;