From 002bfbad6959db3f1766813bfc38aa758bdb5da2 Mon Sep 17 00:00:00 2001 From: YAOU Reda Date: Sun, 19 Oct 2025 14:39:41 +0200 Subject: [PATCH 01/36] Improve default layout for multi-page sheets --- .../controller/api/MultiPageLayoutController.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index dee51b75a..0fc888e86 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -68,7 +68,15 @@ public class MultiPageLayoutController { PDDocument sourceDocument = pdfDocumentFactory.load(file); PDDocument newDocument = pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument); - PDPage newPage = new PDPage(PDRectangle.A4); + + // Create a new A4 landscape rectangle that will be used when pagesPerSheet is 2 or 3 + PDRectangle a4Landscape = + new PDRectangle(PDRectangle.A4.getHeight(), PDRectangle.A4.getWidth()); + + PDPage newPage = + (pagesPerSheet == 2 || pagesPerSheet == 3) + ? new PDPage(a4Landscape) + : new PDPage(PDRectangle.A4); newDocument.addPage(newPage); int totalPages = sourceDocument.getNumberOfPages(); @@ -88,7 +96,10 @@ public class MultiPageLayoutController { if (i != 0 && i % pagesPerSheet == 0) { // Close the current content stream and create a new page and content stream contentStream.close(); - newPage = new PDPage(PDRectangle.A4); + newPage = + (pagesPerSheet == 2 || pagesPerSheet == 3) + ? new PDPage(a4Landscape) + : new PDPage(PDRectangle.A4); newDocument.addPage(newPage); contentStream = new PDPageContentStream( From 84db4e5f2e166483344e28430c76dc75199ae73f Mon Sep 17 00:00:00 2001 From: YAOU Reda Date: Sun, 19 Oct 2025 16:13:22 +0200 Subject: [PATCH 02/36] Feature: Choosing between Portrait and Landscape orientation for Multi Page Layout --- .../controller/api/MultiPageLayoutController.java | 15 ++++++++------- .../api/general/MergeMultiplePagesRequest.java | 7 +++++++ .../src/main/resources/messages_en_US.properties | 1 + .../resources/templates/multi-page-layout.html | 7 +++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 0fc888e86..9006909fb 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -51,6 +51,7 @@ public class MultiPageLayoutController { int pagesPerSheet = request.getPagesPerSheet(); MultipartFile file = request.getFileInput(); + String orientation = request.getOrientation(); boolean addBorder = Boolean.TRUE.equals(request.getAddBorder()); if (pagesPerSheet != 2 @@ -69,14 +70,14 @@ public class MultiPageLayoutController { PDDocument newDocument = pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument); - // Create a new A4 landscape rectangle that will be used when pagesPerSheet is 2 or 3 + // Create a new A4 landscape rectangle that we use when orientation is landscape PDRectangle a4Landscape = new PDRectangle(PDRectangle.A4.getHeight(), PDRectangle.A4.getWidth()); PDPage newPage = - (pagesPerSheet == 2 || pagesPerSheet == 3) - ? new PDPage(a4Landscape) - : new PDPage(PDRectangle.A4); + "PORTRAIT".equals(orientation) + ? new PDPage(PDRectangle.A4) + : new PDPage(a4Landscape); newDocument.addPage(newPage); int totalPages = sourceDocument.getNumberOfPages(); @@ -97,9 +98,9 @@ public class MultiPageLayoutController { // Close the current content stream and create a new page and content stream contentStream.close(); newPage = - (pagesPerSheet == 2 || pagesPerSheet == 3) - ? new PDPage(a4Landscape) - : new PDPage(PDRectangle.A4); + "PORTRAIT".equals(orientation) + ? new PDPage(PDRectangle.A4) + : new PDPage(a4Landscape); newDocument.addPage(newPage); contentStream = new PDPageContentStream( diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index 6d9254023..e600d585d 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -19,6 +19,13 @@ public class MergeMultiplePagesRequest extends PDFFile { allowableValues = {"2", "3", "4", "9", "16"}) private int pagesPerSheet; + @Schema( + description = "The orientation of the output PDF pages", + type = "string", + defaultValue = "PORTRAIT", + allowableValues = {"PORTRAIT", "LANDSCAPE"}) + private String orientation; + @Schema(description = "Boolean for if you wish to add border around the pages") private Boolean addBorder; } diff --git a/app/core/src/main/resources/messages_en_US.properties b/app/core/src/main/resources/messages_en_US.properties index e550e9c0d..00791b4e0 100644 --- a/app/core/src/main/resources/messages_en_US.properties +++ b/app/core/src/main/resources/messages_en_US.properties @@ -1152,6 +1152,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.orientation=Orientation: pageLayout.addBorder=Add Borders pageLayout.submit=Submit diff --git a/app/core/src/main/resources/templates/multi-page-layout.html b/app/core/src/main/resources/templates/multi-page-layout.html index 0a8f5ebb3..6ab45e773 100644 --- a/app/core/src/main/resources/templates/multi-page-layout.html +++ b/app/core/src/main/resources/templates/multi-page-layout.html @@ -28,6 +28,13 @@ +
+ + +
From 81295539a904ad6f1779d4d151c93b8ae179cf5c Mon Sep 17 00:00:00 2001 From: YAOU Reda Date: Sun, 19 Oct 2025 16:20:41 +0200 Subject: [PATCH 03/36] Allowing Portrait and Landscape to be translated --- app/core/src/main/resources/messages_en_US.properties | 2 ++ app/core/src/main/resources/templates/multi-page-layout.html | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/core/src/main/resources/messages_en_US.properties b/app/core/src/main/resources/messages_en_US.properties index 00791b4e0..9b05686b7 100644 --- a/app/core/src/main/resources/messages_en_US.properties +++ b/app/core/src/main/resources/messages_en_US.properties @@ -1153,6 +1153,8 @@ pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: pageLayout.orientation=Orientation: +pageLayout.portrait=Portrait +pageLayout.landscape=Landscape pageLayout.addBorder=Add Borders pageLayout.submit=Submit diff --git a/app/core/src/main/resources/templates/multi-page-layout.html b/app/core/src/main/resources/templates/multi-page-layout.html index 6ab45e773..94f5af9d4 100644 --- a/app/core/src/main/resources/templates/multi-page-layout.html +++ b/app/core/src/main/resources/templates/multi-page-layout.html @@ -31,8 +31,8 @@
From fb01d803b5bbecd26d4f3eff82aace9a93b3b3ee Mon Sep 17 00:00:00 2001 From: YAOU Reda Date: Sun, 19 Oct 2025 21:12:25 +0200 Subject: [PATCH 04/36] adding two translations to the new Multi Page Layout feature --- app/core/src/main/resources/messages_en_GB.properties | 3 +++ app/core/src/main/resources/messages_fr_FR.properties | 3 +++ 2 files changed, 6 insertions(+) diff --git a/app/core/src/main/resources/messages_en_GB.properties b/app/core/src/main/resources/messages_en_GB.properties index 508dc4c45..2f9c3a22c 100644 --- a/app/core/src/main/resources/messages_en_GB.properties +++ b/app/core/src/main/resources/messages_en_GB.properties @@ -1159,6 +1159,9 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.orientation=Orientation: +pageLayout.portrait=Portrait +pageLayout.landscape=Landscape pageLayout.addBorder=Add Borders pageLayout.submit=Submit diff --git a/app/core/src/main/resources/messages_fr_FR.properties b/app/core/src/main/resources/messages_fr_FR.properties index 38afdf6fb..83c57b9a3 100644 --- a/app/core/src/main/resources/messages_fr_FR.properties +++ b/app/core/src/main/resources/messages_fr_FR.properties @@ -1157,6 +1157,9 @@ pipeline.title=Pipeline pageLayout.title=Fusionner des pages pageLayout.header=Fusionner des pages pageLayout.pagesPerSheet=Pages par feuille +pageLayout.orientation=Orientation: +pageLayout.portrait=Portrait +pageLayout.landscape=Paysage pageLayout.addBorder=Ajouter des bordures pageLayout.submit=Fusionner From 9ae67d733d0d882aebbecf6dd040825faf94b8f2 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 22 Oct 2025 11:35:45 +0200 Subject: [PATCH 05/36] Add rows, columns, and direction input fields to page layout form --- .../resources/templates/multi-page-layout.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/core/src/main/resources/templates/multi-page-layout.html b/app/core/src/main/resources/templates/multi-page-layout.html index 94f5af9d4..c57a6f194 100644 --- a/app/core/src/main/resources/templates/multi-page-layout.html +++ b/app/core/src/main/resources/templates/multi-page-layout.html @@ -28,6 +28,23 @@
+
+ + +
+
+ + +
+
+ + +
- - + + + +
From 8dfbbe7bbfa561fb0f0b78b8b84f8f9ac26bd8e7 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Thu, 23 Oct 2025 20:02:43 +0200 Subject: [PATCH 09/36] Changed the decription in the schema of pageOrder --- .../SPDF/model/api/general/MergeMultiplePagesRequest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index 45574cf2a..0f1451b4f 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -19,7 +19,7 @@ public class MergeMultiplePagesRequest extends PDFFile { private int pagesPerSheet; @Schema( - description = "The layout direction of content on the page", + description = "Options for the ordering of pages", type = "string", defaultValue = "LR_TD", allowableValues = { @@ -28,7 +28,7 @@ public class MergeMultiplePagesRequest extends PDFFile { "TD_LR", "TD_RL" }) - private String direction; + private String pageOrder; @Schema( description = "Number of rows in the page layout", @@ -40,7 +40,7 @@ public class MergeMultiplePagesRequest extends PDFFile { description = "Number of columns in the page layout", type = "integer", example = "2") - private Integer columns; + private Integer cols; @Schema( description = "The orientation of the output PDF pages", From fbf429128c1b1dd9852956efb5788c02aeb111b1 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Thu, 23 Oct 2025 23:58:42 +0200 Subject: [PATCH 10/36] feat(ui): add mode toggle and JS script to hide inactive layout section - Added radio buttons for selecting between Default and Custom modes. - Implemented JavaScript logic to show only the active mode section (Default or Custom) and completely hide the inactive one using `display: none`. - Ensured proper enabling/disabling of input fields for clean form submission. --- .../templates/multi-page-layout.html | 71 ++++++++++++++++--- 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/app/core/src/main/resources/templates/multi-page-layout.html b/app/core/src/main/resources/templates/multi-page-layout.html index df65f14f6..6528f9193 100644 --- a/app/core/src/main/resources/templates/multi-page-layout.html +++ b/app/core/src/main/resources/templates/multi-page-layout.html @@ -19,8 +19,20 @@
+ +
+ + +
+ +
+ + +
+
+
- @@ -28,17 +40,19 @@
+
+
+ + +
+
+ + +
+
- - -
-
- - -
-
- - @@ -58,6 +72,41 @@
+ + +
From ab109b90791ea16902e99e7858585adaa26029fa Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Fri, 24 Oct 2025 00:01:19 +0200 Subject: [PATCH 11/36] Added page layout labels and page order translations --- app/core/src/main/resources/messages_en_US.properties | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/core/src/main/resources/messages_en_US.properties b/app/core/src/main/resources/messages_en_US.properties index 9220403bc..09a8bbea1 100644 --- a/app/core/src/main/resources/messages_en_US.properties +++ b/app/core/src/main/resources/messages_en_US.properties @@ -1156,11 +1156,10 @@ pipeline.title=Pipeline #pageLayout pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout +pageLayout.mode=Mode +pageLayout.default=Default +pageLayout.custom=Custom pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.orientation=Orientation: -pageLayout.portrait=Portrait -pageLayout.landscape=Landscape -pageLayout.addBorder=Add Borders pageLayout.rows=Rows pageLayout.columns=Columns pageLayout.pageOrder=Page order: @@ -1168,6 +1167,10 @@ pageLayout.leftRightTopDown=Left -> Right, then Top -> Bottom pageLayout.rightLeftTopDown=Right -> Left, then Top -> Bottom pageLayout.topDownLeftRight=Top -> Bottom, then Left -> Right pageLayout.topDownRightLeft=Top -> Bottom, then Right -> Left +pageLayout.orientation=Orientation: +pageLayout.portrait=Portrait +pageLayout.landscape=Landscape +pageLayout.addBorder=Add Borders pageLayout.submit=Submit From 3f3525f0c38d17043c32bdc27f66e6b62141952f Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Fri, 24 Oct 2025 00:05:30 +0200 Subject: [PATCH 12/36] Documented the property with OpenAPI @Schema annotation. --- .../general/MergeMultiplePagesRequest.java | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index 0f1451b4f..d53bc10bb 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -10,6 +10,13 @@ import stirling.software.common.model.api.PDFFile; @Data @EqualsAndHashCode(callSuper = true) public class MergeMultiplePagesRequest extends PDFFile { + @Schema( + description = "Input mode: DEFAULT uses pagesPerSheet; CUSTOM uses explicit cols×rows.", + requiredMode = Schema.RequiredMode.REQUIRED, + type = "string", + defaultValue = "DEFAULT", + allowableValues = {"DEFAULT", "CUSTOM"}) + private String mode; @Schema( description = "The number of pages to fit onto a single sheet in the output PDF.", @@ -19,27 +26,16 @@ public class MergeMultiplePagesRequest extends PDFFile { private int pagesPerSheet; @Schema( - description = "Options for the ordering of pages", - type = "string", - defaultValue = "LR_TD", - allowableValues = { - "LR_TD", - "RL_TD", - "TD_LR", - "TD_RL" - }) + description = "Options for the ordering of pages", + type = "string", + defaultValue = "LR_TD", + allowableValues = {"LR_TD", "RL_TD", "TD_LR", "TD_RL"}) private String pageOrder; - @Schema( - description = "Number of rows in the page layout", - type = "integer", - example = "3") + @Schema(description = "Number of rows", type = "integer", defaultValue = "1", example = "3") private Integer rows; - @Schema( - description = "Number of columns in the page layout", - type = "integer", - example = "2") + @Schema(description = "Number of columns", type = "integer", defaultValue = "2", example = "2") private Integer cols; @Schema( From 4afe99f97bb9dae2a5ae64b2089bba4615fc533a Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Fri, 24 Oct 2025 00:08:26 +0200 Subject: [PATCH 13/36] feat(core): add mode handling and page ordering logic for multi-page merge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduced logic to calculate rows and columns depending on the selected mode (DEFAULT or CUSTOM). • DEFAULT mode uses pagesPerSheet with validation for 2, 3, or perfect squares. • CUSTOM mode uses user-defined rows × cols with >0 checks. - Calculated rows, cols, and pagesPerSheet dynamically for each mode. - Implemented page order switch logic (LR_TD, RL_TD, TD_LR, TD_RL) to determine row and column indexes for correct page placement. --- .../api/MultiPageLayoutController.java | 75 +++++++++++++++---- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 9006909fb..ace4004dd 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -49,22 +49,45 @@ public class MultiPageLayoutController { public ResponseEntity mergeMultiplePagesIntoOne( @ModelAttribute MergeMultiplePagesRequest request) throws IOException { - int pagesPerSheet = request.getPagesPerSheet(); - MultipartFile file = request.getFileInput(); - String orientation = request.getOrientation(); - boolean addBorder = Boolean.TRUE.equals(request.getAddBorder()); + String mode = request.getMode(); + int rows = 0; + int cols = 0; + int pagesPerSheet = 0; + switch (mode) { + case "DEFAULT": + pagesPerSheet = request.getPagesPerSheet(); + if (pagesPerSheet != 2 + && pagesPerSheet != 3 + && pagesPerSheet + != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) { + throw new IllegalArgumentException( + "pagesPerSheet must be 2, 3 or a perfect square"); + } - if (pagesPerSheet != 2 - && pagesPerSheet != 3 - && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) { - throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square"); + cols = + pagesPerSheet == 2 || pagesPerSheet == 3 + ? pagesPerSheet + : (int) Math.sqrt(pagesPerSheet); + rows = + pagesPerSheet == 2 || pagesPerSheet == 3 + ? 1 + : (int) Math.sqrt(pagesPerSheet); + break; + case "CUSTOM": + rows = request.getRows(); + cols = request.getCols(); + if (rows <= 0 || cols <= 0) { + throw new IllegalArgumentException( + "rows and cols must be greater than 0 in CUSTOM mode"); + } + pagesPerSheet = cols * rows; + break; } - int cols = - pagesPerSheet == 2 || pagesPerSheet == 3 - ? pagesPerSheet - : (int) Math.sqrt(pagesPerSheet); - int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet); + MultipartFile file = request.getFileInput(); + String orientation = request.getOrientation(); + String pageOrder = request.getPageOrder(); + boolean addBorder = Boolean.TRUE.equals(request.getAddBorder()); PDDocument sourceDocument = pdfDocumentFactory.load(file); PDDocument newDocument = @@ -120,8 +143,30 @@ public class MultiPageLayoutController { int adjustedPageIndex = i % pagesPerSheet; // Close the current content stream and create a new // page and content stream - int rowIndex = adjustedPageIndex / cols; - int colIndex = adjustedPageIndex % cols; + int rowIndex = 0; + int colIndex = 0; + + switch (pageOrder) { + case "LR_TD": // Left→Right, then Top→Down + rowIndex = adjustedPageIndex / cols; + colIndex = adjustedPageIndex % cols; + break; + + case "RL_TD": // Right→Left, then Top→Down + rowIndex = adjustedPageIndex / cols; + colIndex = cols - 1 - (adjustedPageIndex % cols); + break; + + case "TD_LR": // Top→Down, then Left→Right + colIndex = adjustedPageIndex / rows; + rowIndex = adjustedPageIndex % rows; + break; + + case "TD_RL": // Top→Down, then Right→Left + colIndex = cols - 1 - (adjustedPageIndex / rows); + rowIndex = adjustedPageIndex % rows; + break; + } float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2; float y = From b689667ef1c7d990378a86ae27bfa4d1ee712515 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Fri, 24 Oct 2025 00:12:13 +0200 Subject: [PATCH 14/36] Improved code readability --- .../model/api/general/MergeMultiplePagesRequest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index d53bc10bb..ee95eb842 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -32,10 +32,18 @@ public class MergeMultiplePagesRequest extends PDFFile { allowableValues = {"LR_TD", "RL_TD", "TD_LR", "TD_RL"}) private String pageOrder; - @Schema(description = "Number of rows", type = "integer", defaultValue = "1", example = "3") + @Schema( + description = "Number of rows", + type = "integer", + defaultValue = "1", + example = "3") private Integer rows; - @Schema(description = "Number of columns", type = "integer", defaultValue = "2", example = "2") + @Schema( + description = "Number of columns", + type = "integer", + defaultValue = "2", + example = "2") private Integer cols; @Schema( From 848fd51affe1283d346e5a4bc2c0a38ffc5c6772 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 12:20:26 +0100 Subject: [PATCH 15/36] build(deps): bump github/codeql-action from 3.30.6 to 4.30.9 (#4718) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.6 to 4.30.9.
Release notes

Sourced from github/codeql-action's releases.

v4.30.9

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

4.30.9 - 17 Oct 2025

  • Update default CodeQL bundle version to 2.23.3. #3205
  • Experimental: A new setup-codeql action has been added which is similar to init, except it only installs the CodeQL CLI and does not initialize a database. Do not use this in production as it is part of an internal experiment and subject to change at any time. #3204

See the full CHANGELOG.md for more information.

v4.30.8

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

4.30.8 - 10 Oct 2025

No user facing changes.

See the full CHANGELOG.md for more information.

v4.30.7

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

4.30.7 - 06 Oct 2025

  • [v4+ only] The CodeQL Action now runs on Node.js v24. #3169

See the full CHANGELOG.md for more information.

v3.30.9

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

3.30.9 - 17 Oct 2025

  • Update default CodeQL bundle version to 2.23.3. #3205
  • Experimental: A new setup-codeql action has been added which is similar to init, except it only installs the CodeQL CLI and does not initialize a database. Do not use this in production as it is part of an internal experiment and subject to change at any time. #3204

See the full CHANGELOG.md for more information.

v3.30.8

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

... (truncated)

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

[UNRELEASED]

No user facing changes.

4.30.9 - 17 Oct 2025

  • Update default CodeQL bundle version to 2.23.3. #3205
  • Experimental: A new setup-codeql action has been added which is similar to init, except it only installs the CodeQL CLI and does not initialize a database. Do not use this in production as it is part of an internal experiment and subject to change at any time. #3204

4.30.8 - 10 Oct 2025

No user facing changes.

4.30.7 - 06 Oct 2025

  • [v4+ only] The CodeQL Action now runs on Node.js v24. #3169

3.30.6 - 02 Oct 2025

  • Update default CodeQL bundle version to 2.23.2. #3168

3.30.5 - 26 Sep 2025

  • We fixed a bug that was introduced in 3.30.4 with upload-sarif which resulted in files without a .sarif extension not getting uploaded. #3160

3.30.4 - 25 Sep 2025

  • We have improved the CodeQL Action's ability to validate that the workflow it is used in does not use different versions of the CodeQL Action for different workflow steps. Mixing different versions of the CodeQL Action in the same workflow is unsupported and can lead to unpredictable results. A warning will now be emitted from the codeql-action/init step if different versions of the CodeQL Action are detected in the workflow file. Additionally, an error will now be thrown by the other CodeQL Action steps if they load a configuration file that was generated by a different version of the codeql-action/init step. #3099 and #3100
  • We added support for reducing the size of dependency caches for Java analyses, which will reduce cache usage and speed up workflows. This will be enabled automatically at a later time. #3107
  • You can now run the latest CodeQL nightly bundle by passing tools: nightly to the init action. In general, the nightly bundle is unstable and we only recommend running it when directed by GitHub staff. #3130
  • Update default CodeQL bundle version to 2.23.1. #3118

3.30.3 - 10 Sep 2025

No user facing changes.

3.30.2 - 09 Sep 2025

  • Fixed a bug which could cause language autodetection to fail. #3084
  • Experimental: The quality-queries input that was added in 3.29.2 as part of an internal experiment is now deprecated and will be removed in an upcoming version of the CodeQL Action. It has been superseded by a new analysis-kinds input, which is part of the same internal experiment. Do not use this in production as it is subject to change at any time. #3064

3.30.1 - 05 Sep 2025

  • Update default CodeQL bundle version to 2.23.0. #3077

3.30.0 - 01 Sep 2025

... (truncated)

Commits
  • 16140ae Merge pull request #3213 from github/update-v4.30.9-70205d3d1
  • 30db5fe Update changelog for v4.30.9
  • 70205d3 Merge pull request #3211 from github/mbg/init/starting-partial-config
  • 697c209 Merge remote-tracking branch 'origin/main' into mbg/init/starting-partial-config
  • 1bd53ba Merge pull request #3205 from github/update-bundle/codeql-bundle-v2.23.3
  • cac4df0 Rebuild
  • 77e5c0d Merge branch 'main' into update-bundle/codeql-bundle-v2.23.3
  • 97a4f75 Merge pull request #3204 from github/mbg/setup-codeql
  • 2d5512b Merge remote-tracking branch 'origin/main' into mbg/init/starting-partial-config
  • fa7bdf0 Call getAnalysisKinds a second time, and ignore exceptions thrown during th...
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.30.6&new-version=4.30.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/scorecards.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index ca037b7c0..e5baeb278 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -74,6 +74,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.29.5 + uses: github/codeql-action/upload-sarif@16140ae1a102900babc80a33c44059580f687047 # v3.29.5 with: sarif_file: results.sarif From b8ad62ecf61056cea4d85edd404997dd4e62fd3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:39:31 +0100 Subject: [PATCH 16/36] build(deps): bump sigstore/cosign-installer from 3.10.0 to 4.0.0 (#4717) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.10.0 to 4.0.0.
Release notes

Sourced from sigstore/cosign-installer's releases.

v4.0.0

What's Changed?

Note: You must upgrade to cosign-installer v4 if you want to install Cosign v3+. You may still install Cosign v2.x with cosign-installer v4.

In version v3+, using cosign sign-blob requires adding the --bundle flag which may require you to update your signing command.

  • Add support for Cosign v3 releases (#201)

v3.10.1

What's Changed?

Note: cosign-installer v3.x cannot be used to install Cosign v3.x. You must upgrade to cosign-installer v4 in order to use Cosign v3.

Note: This is planned to be the final release of Cosign v2, though we will cut new releases for any critical security or bug fixes. We recommend transitioning to Cosign v3.

  • Bump default Cosign to v2.6.1 (#203)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sigstore/cosign-installer&package-manager=github_actions&previous-version=3.10.0&new-version=4.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/multiOSReleases.yml | 2 +- .github/workflows/push-docker.yml | 2 +- .github/workflows/releaseArtifacts.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/multiOSReleases.yml b/.github/workflows/multiOSReleases.yml index 6cd128de2..ff61d58db 100644 --- a/.github/workflows/multiOSReleases.yml +++ b/.github/workflows/multiOSReleases.yml @@ -252,7 +252,7 @@ jobs: - name: Install Cosign if: matrix.os == 'windows-latest' - uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0 + uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0 - name: Generate key pair if: matrix.os == 'windows-latest' diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index 48e351433..6f66b051f 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -54,7 +54,7 @@ jobs: - name: Install cosign if: github.ref == 'refs/heads/master' - uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0 + uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0 with: cosign-release: "v2.4.1" diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml index faedf892d..e77016a2d 100644 --- a/.github/workflows/releaseArtifacts.yml +++ b/.github/workflows/releaseArtifacts.yml @@ -95,7 +95,7 @@ jobs: run: ls -R - name: Install Cosign - uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0 + uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0 - name: Generate key pair run: cosign generate-key-pair From 430a9e429ef3b1c14b4ac0378f9fd2de6dae3db4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:39:53 +0100 Subject: [PATCH 17/36] build(deps): bump actions/setup-node from 5.0.0 to 6.0.0 (#4716) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5.0.0 to 6.0.0.
Release notes

Sourced from actions/setup-node's releases.

v6.0.0

What's Changed

Breaking Changes

Dependency Upgrades

Full Changelog: https://github.com/actions/setup-node/compare/v5...v6.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-node&package-manager=github_actions&previous-version=5.0.0&new-version=6.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/testdriver.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testdriver.yml b/.github/workflows/testdriver.yml index 2bd47bee3..cd2cedb25 100644 --- a/.github/workflows/testdriver.yml +++ b/.github/workflows/testdriver.yml @@ -146,7 +146,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set up Node - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: cache: 'npm' cache-dependency-path: frontend/package-lock.json From 3e2216ef75cdcb2832170df68ef3d9ceae76d8f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:41:00 +0100 Subject: [PATCH 18/36] build(deps): bump com.github.junrar:junrar from 7.5.5 to 7.5.7 (#4715) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [com.github.junrar:junrar](https://github.com/junrar/junrar) from 7.5.5 to 7.5.7.
Release notes

Sourced from com.github.junrar:junrar's releases.

Release v7.5.7

Changelog

🛠 Build

  • fix failing version (beccd50)
  • fix failing version (4ccf1d2)
  • use bump when computing snapshot version (20e9105)
  • use java 21 (ae8bff6)
  • remove java toolchains and use release flag instead (0d99993), closes #218

📝 Documentation

  • update maven snapshot badge (04481cf)

Contributors

We'd like to thank the following people for their contributions: Gauthier Roebroeck

Release v7.5.6

Changelog

🐛 Fixes

  • CorruptHeaderException when EndArcHeader is missing and parsing as stream (964801c), closes #216

🧪 Tests

🛠 Build

deps

  • bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310 from 2.19.0 to 2.20.0 (a1143e2)
  • bump ch.qos.logback:logback-classic from 1.5.18 to 1.5.19 (06ba358)
  • bump org.mockito:mockito-core from 5.17.0 to 5.20.0 (9880cc4)
  • bump com.fasterxml.jackson.core:jackson-databind (9912de1)
  • bump commons-io:commons-io from 2.19.0 to 2.20.0 (716b0fc)
  • bump org.assertj:assertj-core from 3.27.4 to 3.27.6 (23ba3d7)
  • bump peter-evans/create-or-update-comment from 4 to 5 (932af2e)
  • bump gradle/actions from 4 to 5 (d3b4237)
  • bump org.assertj:assertj-core from 3.27.3 to 3.27.4 (a7b88da)
  • bump com.github.gotson.bestbefore:bestbefore-processor-java (acf11b2)
  • bump org.jreleaser from 1.18.0 to 1.20.0 (694c46c)
  • bump actions/setup-java from 4 to 5 (c6c2cb9)
  • bump actions/checkout from 4 to 5 (f55f514)
  • bump archunit to 1.4.1 (4942838)
  • bump junit-pioneer to 2.3.0 (75bd572)
  • bump slf4j-api from 2.0.9 to 2.0.17 (cd598e6)
  • bump ch.qos.logback:logback-classic from 1.4.11 to 1.5.18 (666e572)

... (truncated)

Changelog

Sourced from com.github.junrar:junrar's changelog.

7.5.7 (2025-10-17)

🛠 Build

  • fix failing version (beccd50)
  • fix failing version (4ccf1d2)
  • use bump when computing snapshot version (20e9105)
  • use java 21 (ae8bff6)
  • remove java toolchains and use release flag instead (0d99993), closes #218

📝 Documentation

  • update maven snapshot badge (04481cf)

7.5.6 (2025-10-16)

🐛 Fixes

  • CorruptHeaderException when EndArcHeader is missing and parsing as stream (964801c), closes #216

🧪 Tests

🛠 Build

deps

  • bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310 from 2.19.0 to 2.20.0 (a1143e2)
  • bump ch.qos.logback:logback-classic from 1.5.18 to 1.5.19 (06ba358)
  • bump org.mockito:mockito-core from 5.17.0 to 5.20.0 (9880cc4)
  • bump com.fasterxml.jackson.core:jackson-databind (9912de1)
  • bump commons-io:commons-io from 2.19.0 to 2.20.0 (716b0fc)
  • bump org.assertj:assertj-core from 3.27.4 to 3.27.6 (23ba3d7)
  • bump peter-evans/create-or-update-comment from 4 to 5 (932af2e)
  • bump gradle/actions from 4 to 5 (d3b4237)
  • bump org.assertj:assertj-core from 3.27.3 to 3.27.4 (a7b88da)
  • bump com.github.gotson.bestbefore:bestbefore-processor-java (acf11b2)
  • bump org.jreleaser from 1.18.0 to 1.20.0 (694c46c)
  • bump actions/setup-java from 4 to 5 (c6c2cb9)
  • bump actions/checkout from 4 to 5 (f55f514)
  • bump archunit to 1.4.1 (4942838)
  • bump junit-pioneer to 2.3.0 (75bd572)
  • bump slf4j-api from 2.0.9 to 2.0.17 (cd598e6)
  • bump ch.qos.logback:logback-classic from 1.4.11 to 1.5.18 (666e572)
  • bump com.fasterxml.jackson.core:jackson-databind (9258830)
  • bump org.mockito:mockito-core from 5.6.0 to 5.17.0 (c2eeadc)
  • bump io.github.gradle-nexus.publish-plugin (777d966)
  • bump org.assertj:assertj-core from 3.24.2 to 3.27.3 (76c8474)
  • bump com.github.ben-manes.versions from 0.50.0 to 0.52.0 (b6fa2a8)
  • bump codecov/codecov-action from 3 to 5 (9c37e01)
  • bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310 (ea99789)
  • bump commons-io:commons-io from 2.15.0 to 2.19.0 (2c02c73)
  • bump org.jreleaser from 1.9.0 to 1.18.0 (d588832)

... (truncated)

Commits
  • 04481cf docs: update maven snapshot badge
  • beccd50 ci: fix failing version
  • 4ccf1d2 ci: fix failing version
  • 20e9105 ci: use bump when computing snapshot version
  • ae8bff6 ci: use java 21
  • 0d99993 build: remove java toolchains and use release flag instead
  • 9550e75 chore(release): 7.5.6 [skip ci]
  • a1143e2 build(deps): bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310 from...
  • 06ba358 build(deps): bump ch.qos.logback:logback-classic from 1.5.18 to 1.5.19
  • 9880cc4 build(deps): bump org.mockito:mockito-core from 5.17.0 to 5.20.0
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.github.junrar:junrar&package-manager=gradle&previous-version=7.5.5&new-version=7.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- app/common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/common/build.gradle b/app/common/build.gradle index 33a710e96..4dcf57cc8 100644 --- a/app/common/build.gradle +++ b/app/common/build.gradle @@ -37,7 +37,7 @@ dependencies { api 'com.drewnoakes:metadata-extractor:2.19.0' // Image metadata extractor api 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8' api "org.apache.pdfbox:pdfbox:$pdfboxVersion" - api 'com.github.junrar:junrar:7.5.5' // RAR archive support for CBR files + api 'com.github.junrar:junrar:7.5.7' // RAR archive support for CBR files api 'jakarta.servlet:jakarta.servlet-api:6.1.0' api 'org.snakeyaml:snakeyaml-engine:2.10' api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.13" From cde0fe40ca654ca1c2f6e08030ce29e0e84fb59d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:41:44 +0100 Subject: [PATCH 19/36] build(deps): bump org.sonarqube from 6.3.1.5724 to 7.0.0.6105 (#4714) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps org.sonarqube from 6.3.1.5724 to 7.0.0.6105. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.sonarqube&package-manager=gradle&previous-version=6.3.1.5724&new-version=7.0.0.6105)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 729979f07..44b1b7cc3 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { id "com.github.jk1.dependency-license-report" version "2.9" //id "nebula.lint" version "19.0.3" id "org.panteleyev.jpackageplugin" version "1.7.5" - id "org.sonarqube" version "6.3.1.5724" + id "org.sonarqube" version "7.0.0.6105" } import com.github.jk1.license.render.* From dc8426744779c851c638abffc0747bd2a55fa02b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:42:34 +0100 Subject: [PATCH 20/36] build(deps): bump pdfboxVersion from 3.0.5 to 3.0.6 (#4713) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps `pdfboxVersion` from 3.0.5 to 3.0.6. Updates `org.apache.pdfbox:preflight` from 3.0.5 to 3.0.6 Updates `org.apache.pdfbox:xmpbox` from 3.0.5 to 3.0.6 Updates `org.apache.pdfbox:pdfbox` from 3.0.5 to 3.0.6 Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 44b1b7cc3..2780271a0 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ import java.time.Year ext { springBootVersion = "3.5.6" - pdfboxVersion = "3.0.5" + pdfboxVersion = "3.0.6" imageioVersion = "3.12.0" lombokVersion = "1.18.42" bouncycastleVersion = "1.82" From 0508ae4aa6e7f15ceaf0fece908c425106512335 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Mon, 3 Nov 2025 12:33:56 +0100 Subject: [PATCH 21/36] Update app/core/src/main/resources/templates/multi-page-layout.html Change step=\"any\" to step=\"1\" to ensure only whole numbers are accepted. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/core/src/main/resources/templates/multi-page-layout.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/core/src/main/resources/templates/multi-page-layout.html b/app/core/src/main/resources/templates/multi-page-layout.html index 6528f9193..59ee843fa 100644 --- a/app/core/src/main/resources/templates/multi-page-layout.html +++ b/app/core/src/main/resources/templates/multi-page-layout.html @@ -43,11 +43,11 @@
- +
- +
From bdf3878eeb01283cde31e349c282b3aeec0397fd Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 5 Nov 2025 11:17:52 +0100 Subject: [PATCH 22/36] fix: apply defaults and enforce validation for mode, orientation, and pageOrder Ensure null or blank values fall back to defaults and reject unsupported options with IllegalArgumentException. --- .../api/MultiPageLayoutController.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index ace4004dd..1f83d15a7 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -50,6 +50,10 @@ public class MultiPageLayoutController { @ModelAttribute MergeMultiplePagesRequest request) throws IOException { String mode = request.getMode(); + if (mode == null || mode.trim().isEmpty()) { + mode = "DEFAULT"; + } + int rows = 0; int cols = 0; int pagesPerSheet = 0; @@ -82,11 +86,24 @@ public class MultiPageLayoutController { } pagesPerSheet = cols * rows; break; + default: + throw new IllegalArgumentException( + "Mode must be CUSTOM or DEFAULT. Null value rolls back to DEFAULT"); } MultipartFile file = request.getFileInput(); String orientation = request.getOrientation(); + if (orientation == null || orientation.trim().isEmpty()) { + orientation = "PORTRAIT"; + } + if (!"PORTRAIT".equals(orientation) && !"LANDSCAPE".equals(orientation)) { + throw new IllegalArgumentException("Orientation must be PORTRAIT or LANDSCAPE"); + } String pageOrder = request.getPageOrder(); + if (pageOrder == null || pageOrder.trim().isEmpty()) { + pageOrder = "LR_TD"; + } + boolean addBorder = Boolean.TRUE.equals(request.getAddBorder()); PDDocument sourceDocument = pdfDocumentFactory.load(file); @@ -96,7 +113,6 @@ public class MultiPageLayoutController { // Create a new A4 landscape rectangle that we use when orientation is landscape PDRectangle a4Landscape = new PDRectangle(PDRectangle.A4.getHeight(), PDRectangle.A4.getWidth()); - PDPage newPage = "PORTRAIT".equals(orientation) ? new PDPage(PDRectangle.A4) @@ -166,6 +182,9 @@ public class MultiPageLayoutController { colIndex = cols - 1 - (adjustedPageIndex / rows); rowIndex = adjustedPageIndex % rows; break; + default: + throw new IllegalArgumentException( + "Page order must be one of the following supported options: LR_TD, RL_TD, TD_LR, or TD_RL."); } float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2; From a270f283e06f43cffa81be5ba2a7666ba872c08c Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 5 Nov 2025 11:46:50 +0100 Subject: [PATCH 23/36] Added new translation tags --- app/core/src/main/resources/messages_en_GB.properties | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/core/src/main/resources/messages_en_GB.properties b/app/core/src/main/resources/messages_en_GB.properties index 918d62c92..0cd1042ad 100644 --- a/app/core/src/main/resources/messages_en_GB.properties +++ b/app/core/src/main/resources/messages_en_GB.properties @@ -1162,7 +1162,17 @@ pipeline.title=Pipeline #pageLayout pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout +pageLayout.mode=Mode +pageLayout.default=Default +pageLayout.custom=Custom pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.rows=Rows +pageLayout.columns=Columns +pageLayout.pageOrder=Page order: +pageLayout.leftRightTopDown=Left -> Right, then Top -> Bottom +pageLayout.rightLeftTopDown=Right -> Left, then Top -> Bottom +pageLayout.topDownLeftRight=Top -> Bottom, then Left -> Right +pageLayout.topDownRightLeft=Top -> Bottom, then Right -> Left pageLayout.orientation=Orientation: pageLayout.portrait=Portrait pageLayout.landscape=Landscape From 9e4d764ab726d455b615207db58a76ce83347067 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 5 Nov 2025 11:58:58 +0100 Subject: [PATCH 24/36] Removed redundant variable initialization --- .../SPDF/controller/api/MultiPageLayoutController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 1f83d15a7..94ccfe4b6 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -54,9 +54,9 @@ public class MultiPageLayoutController { mode = "DEFAULT"; } - int rows = 0; - int cols = 0; - int pagesPerSheet = 0; + int rows; + int cols; + int pagesPerSheet; switch (mode) { case "DEFAULT": pagesPerSheet = request.getPagesPerSheet(); From 3cb2832d43908802f4438eaff2cb4a7cc902ba1e Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 5 Nov 2025 12:13:33 +0100 Subject: [PATCH 25/36] Update app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java Changed error message Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../software/SPDF/controller/api/MultiPageLayoutController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 94ccfe4b6..2cbf30e4a 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -88,7 +88,7 @@ public class MultiPageLayoutController { break; default: throw new IllegalArgumentException( - "Mode must be CUSTOM or DEFAULT. Null value rolls back to DEFAULT"); + "Mode must be CUSTOM or DEFAULT"); } MultipartFile file = request.getFileInput(); From 28f12acef8cda6c6c6ddd4720286d7e5c51c5ac0 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 5 Nov 2025 14:18:04 +0100 Subject: [PATCH 26/36] Add tags to messages_fr_FR.properties --- .../src/main/resources/messages_fr_FR.properties | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/core/src/main/resources/messages_fr_FR.properties b/app/core/src/main/resources/messages_fr_FR.properties index 3af67dd61..bd18bba30 100644 --- a/app/core/src/main/resources/messages_fr_FR.properties +++ b/app/core/src/main/resources/messages_fr_FR.properties @@ -14,7 +14,7 @@ lang.aze_cyrl=Azéri (Cyrillique) lang.bel=Biélorusse lang.ben=Bengali lang.bod=Tibétain -lang.bos=bosnien +lang.bos=bosnien lang.bre=Breton lang.bul=Bulgare lang.cat=Catalan @@ -76,7 +76,7 @@ lang.kir=Kirghize, Kyrgyz lang.kmr=Kurmandji (Kurde du Nord) lang.kor=Coréen lang.kor_vert=Coréen (Vertical) -lang.lao=Laotien +lang.lao=Laotien lang.lat=Latin lang.lav=Letton lang.lit=Lituanien @@ -1162,7 +1162,17 @@ pipeline.title=Pipeline #pageLayout pageLayout.title=Fusionner des pages pageLayout.header=Fusionner des pages +pageLayout.mode=Mode +pageLayout.default=Default +pageLayout.custom=Custom pageLayout.pagesPerSheet=Pages par feuille +pageLayout.rows=Rows +pageLayout.columns=Columns +pageLayout.pageOrder=Page order: +pageLayout.leftRightTopDown=Left -> Right, then Top -> Bottom +pageLayout.rightLeftTopDown=Right -> Left, then Top -> Bottom +pageLayout.topDownLeftRight=Top -> Bottom, then Left -> Right +pageLayout.topDownRightLeft=Top -> Bottom, then Right -> Left pageLayout.orientation=Orientation: pageLayout.portrait=Portrait pageLayout.landscape=Paysage From d7fa60d6707d0f26ff87bac7411b7a76aa4d4e27 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 5 Nov 2025 14:49:39 +0100 Subject: [PATCH 27/36] refactor: remove redundant variables and fix form copy logic - Remove redundant variable declarations - Skip form copying/transformation for portrait orientation - Skip form copying/transformation when source has rotated pages --- .../SPDF/controller/api/MultiPageLayoutController.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 2cbf30e4a..1ac51b719 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -87,8 +87,7 @@ public class MultiPageLayoutController { pagesPerSheet = cols * rows; break; default: - throw new IllegalArgumentException( - "Mode must be CUSTOM or DEFAULT"); + throw new IllegalArgumentException("Mode must be CUSTOM or DEFAULT"); } MultipartFile file = request.getFileInput(); @@ -159,8 +158,8 @@ public class MultiPageLayoutController { int adjustedPageIndex = i % pagesPerSheet; // Close the current content stream and create a new // page and content stream - int rowIndex = 0; - int colIndex = 0; + int rowIndex; + int colIndex; switch (pageOrder) { case "LR_TD": // Left→Right, then Top→Down @@ -215,7 +214,7 @@ public class MultiPageLayoutController { // If any source page is rotated, skip form copying/transformation entirely boolean hasRotation = FormUtils.hasAnyRotatedPage(sourceDocument); - if (hasRotation) { + if (hasRotation || "LANDSCAPE".equals(orientation)) { log.info("Source document has rotated pages; skipping form field copying."); } else { try { From 454864d77d2affceddaa509f26b1462d510ae6ef Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 12 Nov 2025 10:54:39 +0100 Subject: [PATCH 28/36] Raise IllegalArgumentExceptions using ExceptionUtils. Add MAX_PAGES, MAX_COLS, MAX_ROWS to prevent users from DDoS-ing themselves --- .../api/MultiPageLayoutController.java | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 1ac51b719..bebb75f0e 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -27,6 +27,7 @@ import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest; import stirling.software.common.service.CustomPDFDocumentFactory; +import stirling.software.common.util.ExceptionUtils; import stirling.software.common.util.FormUtils; import stirling.software.common.util.GeneralUtils; import stirling.software.common.util.WebResponseUtils; @@ -49,6 +50,10 @@ public class MultiPageLayoutController { public ResponseEntity mergeMultiplePagesIntoOne( @ModelAttribute MergeMultiplePagesRequest request) throws IOException { + int MAX_PAGES = 10000; + int MAX_COLS = 300; + int MAX_ROWS = 300; + String mode = request.getMode(); if (mode == null || mode.trim().isEmpty()) { mode = "DEFAULT"; @@ -64,8 +69,11 @@ public class MultiPageLayoutController { && pagesPerSheet != 3 && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) { - throw new IllegalArgumentException( - "pagesPerSheet must be 2, 3 or a perfect square"); + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidFormat", + "Invalid {0} format: {1}", + "pagesPerSheet", + "only 2, 3, and perfect squares are supported"); } cols = @@ -81,13 +89,42 @@ public class MultiPageLayoutController { rows = request.getRows(); cols = request.getCols(); if (rows <= 0 || cols <= 0) { - throw new IllegalArgumentException( - "rows and cols must be greater than 0 in CUSTOM mode"); + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidFormat", + "Invalid {0} format: {1}", + "rows and cols", + "only strictly positive values are allowed"); } pagesPerSheet = cols * rows; break; default: - throw new IllegalArgumentException("Mode must be CUSTOM or DEFAULT"); + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidFormat", + "Invalid {0} format: {1}", + "mode", + "only 'DEFAULT' and 'CUSTOM' are supported"); + } + + if (pagesPerSheet > MAX_PAGES) { + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidArgument", + "Invalid {0} format: {1}", + "pagesPerSheet", + "must be less than " + MAX_PAGES); + } + if (cols > MAX_COLS) { + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidArgument", + "Invalid {0} format: {1}", + "cols", + "must be less than " + MAX_COLS); + } + if (rows > MAX_ROWS) { + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidArgument", + "Invalid {0} format: {1}", + "rows", + "must be less than " + MAX_ROWS); } MultipartFile file = request.getFileInput(); @@ -96,7 +133,11 @@ public class MultiPageLayoutController { orientation = "PORTRAIT"; } if (!"PORTRAIT".equals(orientation) && !"LANDSCAPE".equals(orientation)) { - throw new IllegalArgumentException("Orientation must be PORTRAIT or LANDSCAPE"); + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidFormat", + "Invalid {0} format: {1}", + "orientation", + "only 'PORTRAIT' and 'LANDSCAPE' are supported"); } String pageOrder = request.getPageOrder(); if (pageOrder == null || pageOrder.trim().isEmpty()) { @@ -182,8 +223,11 @@ public class MultiPageLayoutController { rowIndex = adjustedPageIndex % rows; break; default: - throw new IllegalArgumentException( - "Page order must be one of the following supported options: LR_TD, RL_TD, TD_LR, or TD_RL."); + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidFormat", + "Invalid {0} format: {1}", + "pageOrder", + "only 'LR_TD', 'RL_TD', 'TD_LR', and 'TD_RL' are supported"); } float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2; From f3e84b80cf3380a839829b5ada60935b5e128386 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 12 Nov 2025 10:55:48 +0100 Subject: [PATCH 29/36] Add maximum values to rows and cols --- .../general/MergeMultiplePagesRequest.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index ee95eb842..8abfb1b2f 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -33,17 +33,21 @@ public class MergeMultiplePagesRequest extends PDFFile { private String pageOrder; @Schema( - description = "Number of rows", - type = "integer", - defaultValue = "1", - example = "3") + description = "Number of rows", + type = "number", + defaultValue = "1", + maximum = "300", + minimum = "1", + example = "3") private Integer rows; @Schema( - description = "Number of columns", - type = "integer", - defaultValue = "2", - example = "2") + description = "Number of columns", + type = "number", + defaultValue = "2", + maximum = "300", + minimum = "1", + example = "2") private Integer cols; @Schema( From a8bbed30827a3d4f6689e316b0d3b1feca50c907 Mon Sep 17 00:00:00 2001 From: OUNZAR Aymane Date: Wed, 12 Nov 2025 10:59:25 +0100 Subject: [PATCH 30/36] Instead of selecting the mode using radio buttons, the mode is by default 'DEFAULT', to change it to 'CUSTOM' the user checks the 'Custom' Checkbox. Added an 'Advanced Settings' checkbox, when unchecked it resets to default values. --- .../templates/multi-page-layout.html | 76 +++++++++++-------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/app/core/src/main/resources/templates/multi-page-layout.html b/app/core/src/main/resources/templates/multi-page-layout.html index 59ee843fa..0510935ee 100644 --- a/app/core/src/main/resources/templates/multi-page-layout.html +++ b/app/core/src/main/resources/templates/multi-page-layout.html @@ -21,16 +21,11 @@
- - -
- -
- +
-
+
-
+
- +
- +
-
-
- - -
-
- -
- - + + +
+ @@ -76,7 +77,7 @@