diff --git a/client/src/App.tsx b/client/src/App.tsx index 85f5ad4..f5438da 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -192,6 +192,7 @@ function App() { /> } /> } /> + } /> } /> diff --git a/client/src/components/selectAndPrintDialog.tsx b/client/src/components/selectAndPrintDialog.tsx deleted file mode 100644 index cb3af08..0000000 --- a/client/src/components/selectAndPrintDialog.tsx +++ /dev/null @@ -1,50 +0,0 @@ -// React FC that combines the functionality of first selecting what spools to print QR code for, and then opens up the QR code printing dialog. - -import React from "react"; -import SpoolSelectModal from "./spoolSelectModal"; -import { Button } from "antd"; -import { ISpool } from "../pages/spools/model"; -import { PrinterOutlined } from "@ant-design/icons"; -import { useTranslate } from "@refinedev/core"; -import SpoolQRCodePrintingDialog from "./printing/spoolQrCodePrintingDialog"; - -const SelectAndPrint: React.FC = () => { - const t = useTranslate(); - - const [step, setStep] = React.useState(0); - const [selectedSpools, setSelectedSpools] = React.useState([]); - - return ( - <> - - { - setStep(0); - }} - onContinue={(spools) => { - setSelectedSpools(spools); - setStep(2); - }} - /> - { - setStep(0); - }} - items={selectedSpools} - /> - - ); -}; - -export default SelectAndPrint; diff --git a/client/src/pages/printing/index.tsx b/client/src/pages/printing/index.tsx new file mode 100644 index 0000000..3e132dd --- /dev/null +++ b/client/src/pages/printing/index.tsx @@ -0,0 +1,50 @@ +import React from "react"; +import { IResourceComponentsProps, useTranslate } from "@refinedev/core"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { Content } from "antd/es/layout/layout"; +import { theme } from "antd"; +import SpoolQRCodePrintingDialog from "./spoolQrCodePrintingDialog"; +import SpoolSelectModal from "./spoolSelectModal"; +import { ISpool } from "../spools/model"; + +dayjs.extend(utc); + +const { useToken } = theme; + +export const Printing: React.FC = () => { + const { token } = useToken(); + const t = useTranslate(); + + const [step, setStep] = React.useState<0 | 1>(0); + const [selectedSpools, setSelectedSpools] = React.useState([]); + + return ( + + {step === 0 && ( + { + setSelectedSpools(spools); + setStep(1); + }} + /> + )} + {step === 1 && } + + ); +}; + +export default Printing; diff --git a/client/src/components/printing/printing.tsx b/client/src/pages/printing/printing.tsx similarity index 98% rename from client/src/components/printing/printing.tsx rename to client/src/pages/printing/printing.tsx index 33ff40d..7266a85 100644 --- a/client/src/components/printing/printing.tsx +++ b/client/src/pages/printing/printing.tsx @@ -1,5 +1,5 @@ import React, { ReactNode } from "react"; -import { ISpool } from "../../pages/spools/model"; +import { ISpool } from "../spools/model"; import { useGetSetting, useSetSetting } from "../../utils/querySettings"; import { v4 as uuidv4 } from "uuid"; diff --git a/client/src/components/printing/printingDialog.tsx b/client/src/pages/printing/printingDialog.tsx similarity index 89% rename from client/src/components/printing/printingDialog.tsx rename to client/src/pages/printing/printingDialog.tsx index abfb2d2..952ae18 100644 --- a/client/src/components/printing/printingDialog.tsx +++ b/client/src/pages/printing/printingDialog.tsx @@ -25,9 +25,6 @@ interface PrintingDialogProps { style?: string; extraSettings?: JSX.Element; extraSettingsStart?: JSX.Element; - visible: boolean; - onCancel: () => void; - title?: string; } interface PaperDimensions { @@ -69,9 +66,6 @@ const PrintingDialog: React.FC = ({ style, extraSettings, extraSettingsStart, - visible, - onCancel, - title, }) => { const t = useTranslate(); @@ -98,7 +92,7 @@ const PrintingDialog: React.FC = ({ const itemHeight = (paperHeight - margin.top - margin.bottom - spacing.vertical) / paperRows - spacing.vertical; const itemsPerRow = paperColumns; - const rowsPerPage = paperRows; + const itemsPerPage = itemsPerRow * paperRows; const itemsIncludingSkipped = [...Array(skipItems).fill(<>)]; for (const item of items) { @@ -107,42 +101,33 @@ const PrintingDialog: React.FC = ({ } } - const rowsOfItems = []; - for (let row_idx = 0; row_idx < itemsIncludingSkipped.length / itemsPerRow; row_idx += 1) { - rowsOfItems.push(itemsIncludingSkipped.slice(row_idx * itemsPerRow, (row_idx + 1) * itemsPerRow)); - } - const pageBlocks = []; - for (let page_idx = 0; page_idx < rowsOfItems.length / rowsPerPage; page_idx += 1) { - pageBlocks.push(rowsOfItems.slice(page_idx * rowsPerPage, (page_idx + 1) * rowsPerPage)); + 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 (rows, pageIdx) { - const itemRows = rows.map((row, rowIdx) => { + 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 ( - - {row.map(function (item, colIdx) { - return ( - -
- {item} -
- - ); - })} - +
+ {item} +
); }); @@ -160,7 +145,8 @@ const PrintingDialog: React.FC = ({
= ({ marginBottom: `calc(${margin.bottom}mm - ${borderShowMode !== "none" ? "1px" : "0px"})`, }} > - - {itemRows} -
+ {itemDivs} +
); }); return ( - } - content={() => printRef.current} - />, - ]} - width={1200} // Set the modal width to accommodate the preview - > + <> - {t("printing.generic.description")}
= ({ style={{ transform: `scale(${previewScale})`, transformOrigin: "top left", - display: "block", }} > @@ -367,6 +351,8 @@ const PrintingDialog: React.FC = ({ {extraSettings} + {t("printing.generic.description")} +