Client: Add ability to block rows/columns in print

Also fixed some issues with drawing the border
This commit is contained in:
Donkie
2023-08-02 21:55:46 +02:00
parent 437213c7d4
commit d7ccd24257
3 changed files with 182 additions and 15 deletions

View File

@@ -67,6 +67,10 @@
"marginRight": "Right Margin", "marginRight": "Right Margin",
"marginTop": "Top Margin", "marginTop": "Top Margin",
"marginBottom": "Bottom Margin", "marginBottom": "Bottom Margin",
"blockRowsTop": "Block Rows Top",
"blockRowsBottom": "Block Rows Bottom",
"blockColumnsLeft": "Block Columns Left",
"blockColumnsRight": "Block Columns Right",
"borders": { "borders": {
"none": "None", "none": "None",
"border": "Border", "border": "Border",

View File

@@ -67,6 +67,10 @@
"marginRight": "Marginal - höger", "marginRight": "Marginal - höger",
"marginTop": "Marginal - topp", "marginTop": "Marginal - topp",
"marginBottom": "Marginal - botten", "marginBottom": "Marginal - botten",
"blockRowsTop": "Blockera rader - topp",
"blockRowsBottom": "Blockera rader - botten",
"blockColumnsLeft": "Blockera kolumner - vänster",
"blockColumnsRight": "Blockera kolumner - höger",
"borders": { "borders": {
"none": "Ingen", "none": "Ingen",
"border": "Ram", "border": "Ram",

View File

@@ -74,8 +74,24 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
"print-marginBottom", "print-marginBottom",
10 10
); );
const [itemsPerRow, setItemsPerRow] = useSavedState("print-itemsPerRow", 3); const [blockRowsTop, setBlockRowsTop] = useSavedState(
const [rowsPerPage, setRowsPerPage] = useSavedState("print-rowsPerPage", 8); "print-blockRowsTop",
0
);
const [blockRowsBottom, setBlockRowsBottom] = useSavedState(
"print-blockRowsBottom",
0
);
const [blockColumnsLeft, setBlockColumnsLeft] = useSavedState(
"print-blockColumnsLeft",
0
);
const [blockColumnsRight, setBlockColumnsRight] = useSavedState(
"print-blockColumnsRight",
0
);
const [paperColumns, setPaperColumns] = useSavedState("print-itemsPerRow", 3);
const [paperRows, setPaperRows] = useSavedState("print-rowsPerPage", 8);
const [paperSize, setPaperSize] = useSavedState("print-paperSize", "A4"); const [paperSize, setPaperSize] = useSavedState("print-paperSize", "A4");
const [previewScale, setPreviewScale] = useSavedState( const [previewScale, setPreviewScale] = useSavedState(
"print-previewScale", "print-previewScale",
@@ -91,7 +107,10 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
const printRef = useRef<HTMLDivElement>(null); const printRef = useRef<HTMLDivElement>(null);
const calculatedRowHeight = const calculatedRowHeight =
(paperHeight - marginTop - marginBottom) / rowsPerPage; (paperHeight - marginTop - marginBottom) / paperRows;
const itemsPerRow = paperColumns - blockColumnsLeft - blockColumnsRight;
const rowsPerPage = paperRows - blockRowsTop - blockRowsBottom;
const rowsOfItems = []; const rowsOfItems = [];
for (let row_idx = 0; row_idx <= items.length / itemsPerRow; row_idx += 1) { for (let row_idx = 0; row_idx <= items.length / itemsPerRow; row_idx += 1) {
@@ -112,9 +131,30 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
} }
const pages = pageBlocks.map(function (rows, idx) { const pages = pageBlocks.map(function (rows, idx) {
const itemRowsBlockTop = [...Array(blockRowsTop).keys()].map((row) => (
<tr key={row}>
<td>
<div style={{ height: `${calculatedRowHeight}mm` }}></div>
</td>
</tr>
));
const itemRows = rows.map((row, idx) => { const itemRows = rows.map((row, idx) => {
const itemColumnsBlockLeft = [...Array(blockColumnsLeft).keys()].map(
(col) => (
<td key={col}>
<div
style={{
width: `${
(paperWidth - marginLeft - marginRight) / paperColumns
}mm`,
}}
></div>
</td>
)
);
return ( return (
<tr key={idx}> <tr key={idx}>
{itemColumnsBlockLeft}
{row.map((item, index) => ( {row.map((item, index) => (
<td> <td>
<div <div
@@ -124,7 +164,7 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
justifyContent: "center", justifyContent: "center",
alignItems: "center", alignItems: "center",
width: `${ width: `${
(paperWidth - marginLeft - marginRight) / itemsPerRow (paperWidth - marginLeft - marginRight) / paperColumns
}mm`, }mm`,
height: `${calculatedRowHeight}mm`, height: `${calculatedRowHeight}mm`,
flexDirection: "column", flexDirection: "column",
@@ -153,6 +193,9 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
<div <div
className="print-page-area" className="print-page-area"
style={{ style={{
border: borderShowMode !== "none" ? "1px solid #000" : "none",
height: `${paperHeight - marginTop - marginBottom}mm`,
width: `${paperWidth - marginLeft - marginRight}mm`,
marginTop: `calc(${marginTop}mm - ${ marginTop: `calc(${marginTop}mm - ${
borderShowMode !== "none" ? "1px" : "0px" borderShowMode !== "none" ? "1px" : "0px"
})`, })`,
@@ -169,12 +212,10 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
> >
<table <table
style={{ style={{
border: borderShowMode !== "none" ? "1px solid #000" : "none",
width: "100%",
height: "100%",
alignContent: "flex-start", alignContent: "flex-start",
}} }}
> >
{itemRowsBlockTop}
{itemRows} {itemRows}
</table> </table>
</div> </div>
@@ -252,6 +293,7 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
<Form <Form
labelAlign="left" labelAlign="left"
colon={false} colon={false}
labelWrap={true}
labelCol={{ span: 8 }} labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }} wrapperCol={{ span: 16 }}
> >
@@ -369,9 +411,11 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
<Slider <Slider
min={1} min={1}
max={5} max={5}
value={itemsPerRow} value={paperColumns}
onChange={(value) => { onChange={(value) => {
setItemsPerRow(value); if (value - blockColumnsLeft - blockColumnsRight < 1)
return;
setPaperColumns(value);
}} }}
/> />
</Col> </Col>
@@ -379,9 +423,14 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
<InputNumber <InputNumber
min={1} min={1}
style={{ margin: "0 16px" }} style={{ margin: "0 16px" }}
value={itemsPerRow} value={paperColumns}
onChange={(value) => { onChange={(value) => {
setItemsPerRow(value ?? 1); if (
(value ?? 1) - blockColumnsLeft - blockColumnsRight <
1
)
return;
setPaperColumns(value ?? 1);
}} }}
/> />
</Col> </Col>
@@ -393,9 +442,10 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
<Slider <Slider
min={1} min={1}
max={15} max={15}
value={rowsPerPage} value={paperRows}
onChange={(value) => { onChange={(value) => {
setRowsPerPage(value); if (value - blockRowsTop - blockRowsBottom < 1) return;
setPaperRows(value);
}} }}
/> />
</Col> </Col>
@@ -403,9 +453,11 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
<InputNumber <InputNumber
min={1} min={1}
style={{ margin: "0 16px" }} style={{ margin: "0 16px" }}
value={rowsPerPage} value={paperRows}
onChange={(value) => { onChange={(value) => {
setRowsPerPage(value ?? 1); if ((value ?? 1) - blockRowsTop - blockRowsBottom < 1)
return;
setPaperRows(value ?? 1);
}} }}
/> />
</Col> </Col>
@@ -441,6 +493,113 @@ const PrintingDialog: React.FC<PrintingDialogProps> = ({
buttonStyle="solid" buttonStyle="solid"
/> />
</Form.Item> </Form.Item>
<Form.Item label={t("printing.generic.blockRowsTop")}>
<Row>
<Col span={12}>
<Slider
min={0}
max={3}
value={blockRowsTop}
onChange={(value) => {
if (paperRows - value - blockRowsBottom < 1) return;
setBlockRowsTop(value);
}}
/>
</Col>
<Col span={12}>
<InputNumber
min={0}
style={{ margin: "0 16px" }}
value={blockRowsTop}
onChange={(value) => {
if (paperRows - (value ?? 0) - blockRowsBottom < 1)
return;
setBlockRowsTop(value ?? 0);
}}
/>
</Col>
</Row>
</Form.Item>
<Form.Item label={t("printing.generic.blockRowsBottom")}>
<Row>
<Col span={12}>
<Slider
min={0}
max={3}
value={blockRowsBottom}
onChange={(value) => {
if (paperRows - value - blockRowsTop < 1) return;
setBlockRowsBottom(value);
}}
/>
</Col>
<Col span={12}>
<InputNumber
min={0}
style={{ margin: "0 16px" }}
value={blockRowsBottom}
onChange={(value) => {
if (paperRows - (value ?? 0) - blockRowsTop < 1) return;
setBlockRowsBottom(value ?? 0);
}}
/>
</Col>
</Row>
</Form.Item>
<Form.Item label={t("printing.generic.blockColumnsLeft")}>
<Row>
<Col span={12}>
<Slider
min={0}
max={3}
value={blockColumnsLeft}
onChange={(value) => {
if (paperColumns - value - blockColumnsRight < 1) return;
setBlockColumnsLeft(value);
}}
/>
</Col>
<Col span={12}>
<InputNumber
min={0}
style={{ margin: "0 16px" }}
value={blockColumnsLeft}
onChange={(value) => {
if (paperColumns - (value ?? 0) - blockColumnsRight < 1)
return;
setBlockColumnsLeft(value ?? 0);
}}
/>
</Col>
</Row>
</Form.Item>
<Form.Item label={t("printing.generic.blockColumnsRight")}>
<Row>
<Col span={12}>
<Slider
min={0}
max={3}
value={blockColumnsRight}
onChange={(value) => {
if (paperColumns - value - blockColumnsLeft < 1) return;
setBlockColumnsRight(value);
}}
/>
</Col>
<Col span={12}>
<InputNumber
min={0}
style={{ margin: "0 16px" }}
value={blockColumnsRight}
onChange={(value) => {
if (paperColumns - (value ?? 0) - blockColumnsLeft < 1)
return;
setBlockColumnsRight(value ?? 0);
}}
/>
</Col>
</Row>
</Form.Item>
{extraSettings && <Divider />} {extraSettings && <Divider />}
{extraSettings} {extraSettings}
<Divider /> <Divider />