import React, { useRef } from "react"; import { Modal, Slider, Button, Select, Row, Col, Form, Divider, RadioChangeEvent, Radio, InputNumber, Collapse, Space, } from "antd"; import ReactToPrint from "react-to-print"; import { useSavedState } from "../../utils/saveload"; import { useTranslate } from "@refinedev/core"; import { PrintSettings } from "./printing"; import { PrinterOutlined } from "@ant-design/icons"; interface PrintingDialogProps { items: JSX.Element[]; printSettings: PrintSettings; setPrintSettings: (setPrintSettings: PrintSettings) => void; style?: string; extraSettings?: JSX.Element; extraSettingsStart?: JSX.Element; extraButtons?: JSX.Element; } 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, printSettings, setPrintSettings, style, extraSettings, extraSettingsStart, extraButtons, }) => { const t = useTranslate(); const [collapseState, setCollapseState] = useSavedState("print-collapseState", []); const [previewScale, setPreviewScale] = useSavedState("print-previewScale", 0.6); const margin = printSettings?.margin || { top: 10, bottom: 10, left: 10, right: 10 }; const printerMargin = printSettings?.printerMargin || { top: 5, bottom: 5, left: 5, right: 5 }; const spacing = printSettings?.spacing || { horizontal: 0, vertical: 0 }; const paperColumns = printSettings?.columns || 3; const paperRows = printSettings?.rows || 8; const skipItems = printSettings?.skipItems || 0; const itemCopies = printSettings?.itemCopies || 1; const paperSize = printSettings?.paperSize || "A4"; const customPaperSize = printSettings?.customPaperSize || { width: 210, height: 297 }; const borderShowMode = printSettings?.borderShowMode || "grid"; const paperWidth = paperSize === "custom" ? customPaperSize.width : paperDimensions[paperSize].width; const paperHeight = paperSize === "custom" ? customPaperSize.height : paperDimensions[paperSize].height; const printRef = useRef(null); const itemWidth = (paperWidth - margin.left - margin.right - spacing.horizontal) / paperColumns - spacing.horizontal; const itemHeight = (paperHeight - margin.top - margin.bottom - spacing.vertical) / paperRows - spacing.vertical; const itemsPerRow = paperColumns; const itemsPerPage = itemsPerRow * paperRows; const itemsIncludingSkipped = [...Array(skipItems).fill(<>)]; for (const item of items) { for (let i = 0; i < itemCopies; i += 1) { itemsIncludingSkipped.push(item); } } const pageBlocks = []; for (let page_idx = 0; page_idx < itemsIncludingSkipped.length / itemsPerPage; page_idx += 1) { pageBlocks.push(itemsIncludingSkipped.slice(page_idx * itemsPerPage, (page_idx + 1) * itemsPerPage)); } const pages = pageBlocks.map(function (items, pageIdx) { const itemDivs = items.map((item, itemIdx) => { const isFirstColumn = itemIdx % itemsPerRow === 0; const isLastColumn = (itemIdx + 1) % itemsPerRow === 0; const isFirstRow = itemIdx < itemsPerRow; const isLastRow = itemsPerPage - itemIdx <= itemsPerRow; return (
{item}
); }); return (
{itemDivs}
); }); return ( <>
{pages}
{extraSettingsStart} { printSettings.skipItems = value; setPrintSettings(printSettings); }} /> { printSettings.skipItems = value ?? 1; setPrintSettings(printSettings); }} /> { printSettings.itemCopies = value; setPrintSettings(printSettings); }} /> { printSettings.itemCopies = value ?? 1; setPrintSettings(printSettings); }} /> { printSettings.borderShowMode = e.target.value; setPrintSettings(printSettings); }} value={borderShowMode} optionType="button" buttonStyle="solid" /> { setPreviewScale(value); }} /> { setPreviewScale(value ?? 0.1); }} /> { if (Array.isArray(key)) { setCollapseState(key); } }} > {extraSettings} {t("printing.generic.description")} { printSettings.columns = value; setPrintSettings(printSettings); }} /> { printSettings.columns = value ?? 1; setPrintSettings(printSettings); }} /> { printSettings.rows = value; setPrintSettings(printSettings); }} /> { printSettings.rows = value ?? 1; setPrintSettings(printSettings); }} />

{t("printing.generic.helpMargin")}

`${value} mm` }} value={margin.left} onChange={(value) => { margin.left = value; printSettings.margin = margin; setPrintSettings(printSettings); }} /> { margin.left = value ?? 0; printSettings.margin = margin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={margin.top} onChange={(value) => { margin.top = value; printSettings.margin = margin; setPrintSettings(printSettings); }} /> { margin.top = value ?? 0; printSettings.margin = margin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={margin.right} onChange={(value) => { margin.right = value; printSettings.margin = margin; setPrintSettings(printSettings); }} /> { margin.right = value ?? 0; printSettings.margin = margin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={margin.bottom} onChange={(value) => { margin.bottom = value; printSettings.margin = margin; setPrintSettings(printSettings); }} /> { margin.bottom = value ?? 0; printSettings.margin = margin; setPrintSettings(printSettings); }} />

{t("printing.generic.helpPrinterMargin")}

`${value} mm` }} value={printerMargin.left} onChange={(value) => { printerMargin.left = value; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> { printerMargin.left = value ?? 0; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={printerMargin.top} onChange={(value) => { printerMargin.top = value; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> { printerMargin.top = value ?? 0; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={printerMargin.right} onChange={(value) => { printerMargin.right = value; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> { printerMargin.right = value ?? 0; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={printerMargin.bottom} onChange={(value) => { printerMargin.bottom = value; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> { printerMargin.bottom = value ?? 0; printSettings.printerMargin = printerMargin; setPrintSettings(printSettings); }} /> `${value} mm` }} value={spacing.horizontal} onChange={(value) => { spacing.horizontal = value; printSettings.spacing = spacing; setPrintSettings(printSettings); }} /> { spacing.horizontal = value ?? 0; printSettings.spacing = spacing; setPrintSettings(printSettings); }} /> `${value} mm` }} value={spacing.vertical} onChange={(value) => { spacing.vertical = value; printSettings.spacing = spacing; setPrintSettings(printSettings); }} /> { spacing.vertical = value ?? 0; printSettings.spacing = spacing; setPrintSettings(printSettings); }} />
{extraButtons} ( )} content={() => printRef.current} /> ); }; export default PrintingDialog;