From 6c4254dc5c5c3c1bb8ebd604e9e0bb34bb3f939a Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 30 Aug 2026 14:26:25 +0100 Subject: [PATCH 1/2] feat(templates): add the ClassicInvoice layered invoice preset The invoice family had a single preset. ClassicInvoice brings the letterhead-style look - header band, TOTAL DUE hero strip, BILL TO / FROM party columns, a dedicated Summary table after the line items, and a notes / payment-terms footer - onto the layered stack with the same create() / create(BrandTheme) contract as ModernInvoice, porting the rendered layout of the published standalone invoice-classic template. The preset reads its surfaces from BrandTheme.invoiceModern() and skips the Summary section when the spec carries no summary rows (the engine rejects zero-row tables). qa: a shared InvoicePresetFixtures feeds both the pixel gate and the new exact layout-snapshot gate (canonical single page plus a forty-line-item overflow freezing the two-page table continuation); ClassicInvoiceSmokeTest drives full layout and render, including the empty invoice. Examples gain ClassicInvoiceV2Example (invoice-classic-v2 in the showcase). --- CHANGELOG.md | 11 + .../demcha/examples/GenerateAllExamples.java | 2 + .../examples/support/ShowcaseMetadata.java | 1 + .../invoice/v2/ClassicInvoiceV2Example.java | 61 + .../ClassicInvoiceLayoutSnapshotTest.java | 58 + .../presets/ClassicInvoiceSmokeTest.java | 83 ++ .../presets/InvoicePresetFixtures.java | 112 ++ .../presets/InvoiceV2VisualParityTest.java | 49 +- .../invoice/classic_invoice_layout.json | 1007 +++++++++++++++++ .../classic_invoice_stress_layout.json | 1007 +++++++++++++++++ .../classic_invoice-page-0.png | Bin 0 -> 86218 bytes .../invoice/presets/ClassicInvoice.java | 461 ++++++++ 12 files changed, 2810 insertions(+), 42 deletions(-) create mode 100644 examples/src/main/java/com/demcha/examples/templates/invoice/v2/ClassicInvoiceV2Example.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceLayoutSnapshotTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceSmokeTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoicePresetFixtures.java create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_layout.json create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_stress_layout.json create mode 100644 qa/src/test/resources/visual-baselines/invoice-v2-layered/classic_invoice-page-0.png create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoice.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a68c1799..86f5d9674 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **A second invoice preset: `ClassicInvoice`.** The letterhead-style invoice — a header + band with the company name and a 28pt INVOICE title, a TOTAL DUE hero strip, + BILL TO / FROM party columns, and a dedicated Summary table composed after the + line items (subtotal / tax / TOTAL, the last row emphasized) — now ships as + `invoice.presets.ClassicInvoice` on the layered stack, with the same + `create()` / `create(BrandTheme)` contract as `ModernInvoice`, porting the rendered + layout of the published standalone `invoice-classic` template. Guarded by a smoke + test, exact layout snapshots (the canonical single page plus a forty-line-item + overflow that freezes the two-page table continuation), and the invoice pixel-parity + gate; the examples showcase gains `invoice-classic-v2`. + - **Monogram Sidebar draws the employer.** Its experience entries rendered the position, the date and the description, and never `CvEntry.subtitle()` — so every company name was missing from the rendered CV while the education block, which does render its diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index 59590ed29..006ec548a 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -96,6 +96,7 @@ import com.demcha.examples.templates.cv.v2.CvPanelExample; import com.demcha.examples.templates.cv.v2.CvSidebarPortraitExample; import com.demcha.examples.templates.cv.v2.CvTimelineMinimalExample; +import com.demcha.examples.templates.invoice.ClassicInvoiceV2Example; import com.demcha.examples.templates.invoice.InvoiceCinematicFileExample; import com.demcha.examples.templates.invoice.ModernInvoiceV2Example; import com.demcha.examples.templates.proposal.CinematicProposalFileExample; @@ -162,6 +163,7 @@ public static void main(String[] args) throws Exception { // Invoices System.out.println("Generated: " + InvoiceCinematicFileExample.generate()); System.out.println("Generated: " + ModernInvoiceV2Example.generate()); + System.out.println("Generated: " + ClassicInvoiceV2Example.generate()); // Proposals System.out.println("Generated: " + ProposalCinematicFileExample.generate()); diff --git a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java index deb4e65f9..0f613f678 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -88,6 +88,7 @@ record Entry(String title, String description, List tags, String codeUrl // ===== Templates / Invoice ===== invoice("invoice-cinematic", "InvoiceCinematicFileExample", "Cinematic Invoice", "Layered ModernInvoice preset with theme-driven layout, advanced tables, and totals.", "invoice", "cinematic"); invoice("invoice-modern-v2", "v2/ModernInvoiceV2Example", "Modern Invoice", "The ModernInvoice preset composed straight from an InvoiceDocumentSpec — line items, totals and payment block driven by the BrandTheme rather than per-document styling.", "invoice"); + invoice("invoice-classic-v2", "v2/ClassicInvoiceV2Example", "Classic Invoice", "The ClassicInvoice preset — letterhead header band, TOTAL DUE hero strip, BILL TO / FROM columns, and a dedicated Summary table after the line items.", "invoice"); // ===== Templates / Proposal ===== proposal("proposal-cinematic", "ProposalCinematicFileExample", "Cinematic Proposal", "Layered ModernProposal layout with cover panel, hero spread, and rich typography.", "proposal", "cinematic"); diff --git a/examples/src/main/java/com/demcha/examples/templates/invoice/v2/ClassicInvoiceV2Example.java b/examples/src/main/java/com/demcha/examples/templates/invoice/v2/ClassicInvoiceV2Example.java new file mode 100644 index 000000000..19b4e9a23 --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/templates/invoice/v2/ClassicInvoiceV2Example.java @@ -0,0 +1,61 @@ +package com.demcha.examples.templates.invoice; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.core.theme.BrandTheme; +import com.demcha.compose.document.templates.data.invoice.InvoiceDocumentSpec; +import com.demcha.compose.document.templates.invoice.presets.ClassicInvoice; +import com.demcha.examples.support.ExampleDataFactory; +import com.demcha.examples.support.ExampleOutputPaths; + +import java.nio.file.Path; + +/** + * Renders the layered {@code invoice.v2} Classic Invoice preset against + * the shared {@code InvoiceDocumentSpec} sample data using the default + * {@code BrandTheme.invoiceModern()} theme. + * + *

Output: + * {@code examples/target/generated-pdfs/templates/invoice/invoice-classic-v2.pdf}.

+ * + *

The preset pads the page flow itself, so the session margin stays at + * {@code ClassicInvoice.RECOMMENDED_MARGIN} (zero) and the page keeps its + * plain white background — the letterhead look of the preset.

+ */ +public final class ClassicInvoiceV2Example { + + private ClassicInvoiceV2Example() { + } + + /** + * @return absolute path of the rendered PDF + * @throws Exception if rendering fails + */ + public static Path generate() throws Exception { + Path outputFile = ExampleOutputPaths.prepare( + "templates/invoice", "invoice-classic-v2.pdf"); + InvoiceDocumentSpec spec = ExampleDataFactory.sampleInvoice(); + DocumentTemplate template = + ClassicInvoice.create(BrandTheme.invoiceModern()); + + float m = (float) ClassicInvoice.RECOMMENDED_MARGIN; + try (DocumentSession document = GraphCompose.document(outputFile) + .pageSize(DocumentPageSize.A4) + .margin(m, m, m, m) + .create()) { + template.compose(document, spec); + document.buildPdf(); + } + return outputFile; + } + + /** + * @param args ignored + * @throws Exception if rendering fails + */ + public static void main(String[] args) throws Exception { + System.out.println("Generated: " + generate()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceLayoutSnapshotTest.java new file mode 100644 index 000000000..140c2f61f --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceLayoutSnapshotTest.java @@ -0,0 +1,58 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.TemplateTestSupport; +import com.demcha.compose.document.templates.data.invoice.InvoiceDocumentSpec; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Exact layout snapshot gate for {@link ClassicInvoice} — freezes the + * resolved node geometry the pixel budget cannot see (a small column or + * spacing shift stays under the visual-diff budget but changes the + * snapshot), and the pagination contract of the overflow invoice: the + * forty-line-item fixture flows onto a second page with the repeated + * table header, and the summary + footer follow the table. + * + *

The multi-page contract is guarded here at snapshot level only — + * full-page pixel baselines drift across platforms far more than the + * geometry they would guard (see the budget note in + * {@code InvoiceV2VisualParityTest}), while the snapshot is exact on + * every platform.

+ * + *

Refresh with {@code -Dgraphcompose.updateSnapshots=true} after a + * deliberate layout change, and commit the JSON with the change.

+ */ +class ClassicInvoiceLayoutSnapshotTest { + + private static DocumentSession open() { + float m = (float) ClassicInvoice.RECOMMENDED_MARGIN; + return GraphCompose.document() + .pageSize(DocumentPageSize.A4) + .margin(m, m, m, m) + .create(); + } + + @Test + void canonicalInvoiceMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = open()) { + ClassicInvoice.create().compose(session, InvoicePresetFixtures.canonicalInvoice()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "classic_invoice_layout", "invoice"); + } + } + + @Test + void overflowInvoicePaginatesOntoSecondPage() throws Exception { + try (DocumentSession session = open()) { + ClassicInvoice.create().compose(session, InvoicePresetFixtures.stressInvoice()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(2); + TemplateTestSupport.assertCanonicalSnapshot( + session, "classic_invoice_stress_layout", "invoice"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceSmokeTest.java new file mode 100644 index 000000000..2b1776029 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ClassicInvoiceSmokeTest.java @@ -0,0 +1,83 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.core.theme.BrandTheme; +import com.demcha.compose.document.templates.data.invoice.InvoiceData; +import com.demcha.compose.document.templates.data.invoice.InvoiceDocumentSpec; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Smoke test for the layered invoice pipeline through + * {@link ClassicInvoice} — proves the preset renders an + * {@link InvoiceDocumentSpec} end-to-end on a {@link BrandTheme}, via + * both factory variants, with any theme, and on an empty invoice. + */ +class ClassicInvoiceSmokeTest { + + /** An invoice with no line items, summaries, notes, footer, or status — the empty paths. */ + private static InvoiceDocumentSpec minimalSpec() { + return InvoiceDocumentSpec.from(InvoiceData.builder() + .invoiceNumber("GC-2026-002") + .fromParty(from -> from.name("GraphCompose Studio")) + .billToParty(to -> to.name("Northwind Systems")) + .build()); + } + + private static void render(DocumentTemplate template, + InvoiceDocumentSpec spec) throws Exception { + float m = (float) ClassicInvoice.RECOMMENDED_MARGIN; + try (DocumentSession session = GraphCompose.document() + .pageSize(DocumentPageSize.A4) + .margin(m, m, m, m) + .create()) { + template.compose(session, spec); + assertThat(session.roots()).isNotEmpty(); + // Drive layout + render, not just composition — the zero-row + // summary table of an empty invoice only exists at layout time. + assertThat(session.toPdfBytes()).isNotEmpty(); + } + } + + @Test + void exposesStableIdentity() { + DocumentTemplate template = ClassicInvoice.create(); + assertThat(template.id()).isEqualTo(ClassicInvoice.ID); + assertThat(template.displayName()).isEqualTo(ClassicInvoice.DISPLAY_NAME); + } + + @Test + void defaultFactoryRendersWithInvoiceTheme() throws Exception { + // create() wires BrandTheme.invoiceModern() — the variant the example uses. + render(ClassicInvoice.create(), InvoicePresetFixtures.canonicalInvoice()); + } + + @Test + void rendersWithExplicitTheme() throws Exception { + render(ClassicInvoice.create(BrandTheme.invoiceModern()), + InvoicePresetFixtures.canonicalInvoice()); + } + + @Test + void readsAnyTheme() throws Exception { + // Renders under a non-invoice theme without crashing: the header, + // hero, labels, and footer follow the theme; the line-item body + // cells inherit the DSL default (as in ModernInvoice). + render(ClassicInvoice.create(BrandTheme.boxedClassic()), + InvoicePresetFixtures.canonicalInvoice()); + } + + @Test + void rendersEmptyInvoice() throws Exception { + // Exercises the empty-collection paths through full layout and + // render: the skipped Summary section (the engine rejects a + // zero-row table), the empty note / payment lists under their + // always-rendered headings, the skipped footer-note paragraph, + // and the em-dash status fallback. + render(ClassicInvoice.create(), minimalSpec()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoicePresetFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoicePresetFixtures.java new file mode 100644 index 000000000..e5b401de9 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoicePresetFixtures.java @@ -0,0 +1,112 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.templates.data.invoice.InvoiceData; +import com.demcha.compose.document.templates.data.invoice.InvoiceDocumentSpec; + +/** + * Shared fixture data for the invoice preset gates — the SAME specs feed + * the pixel parity test and the layout snapshot test, so a geometry shift + * the pixel budget absorbs still trips the exact snapshot, and vice versa. + */ +final class InvoicePresetFixtures { + + private InvoicePresetFixtures() { + } + + /** + * Canonical sample invoice — exercises the hero, both parties, a + * multi-row line-items table, subtotal / tax / total summary, and the + * notes / payment-terms footer. Kept in qa so the gates depend only + * on main + main-test code. + */ + static InvoiceDocumentSpec canonicalInvoice() { + return InvoiceDocumentSpec.from(InvoiceData.builder() + .title("Invoice") + .invoiceNumber("GC-2026-041") + .issueDate("02 Apr 2026") + .dueDate("16 Apr 2026") + .status("Pending") + .fromParty(from -> from + .name("GraphCompose Studio") + .addressLines("18 Layout Street", "London, UK", "EC1A 4GC") + .email("billing@graphcompose.dev") + .phone("+44 20 5555 1000") + .taxId("GB-99887766")) + .billToParty(to -> to + .name("Northwind Systems") + .addressLines("Attn: Finance Team", "410 Market Avenue", "Manchester, UK") + .email("ap@northwind.example") + .phone("+44 161 555 2200") + .taxId("NW-2026-01")) + .lineItem("Discovery workshop", "Stakeholder interviews", + "1", "GBP 1,450", "GBP 1,450") + .lineItem("Template architecture", "Reusable document flows", + "2", "GBP 980", "GBP 1,960") + .lineItem("Render QA", "Cross-platform pixel diffing", + "3", "GBP 320", "GBP 960") + .lineItem("Developer enablement", "Authoring docs + examples", + "1", "GBP 780", "GBP 780") + .summaryRow("Subtotal", "GBP 5,150") + .summaryRow("VAT (20%)", "GBP 1,030") + .totalRow("Total", "GBP 6,180") + .note("Please include the invoice number on your remittance advice.") + .note("All work was delivered as agreed during the April implementation window.") + .paymentTerm("Payment due within 14 calendar days.") + .paymentTerm("Bank transfer preferred; contact billing@graphcompose.dev for remittance details.") + .paymentTerm("Late payments may delay additional template customization work.") + .footerNote("Thank you for choosing GraphCompose for production document rendering.") + .build()); + } + + /** + * Overflow invoice — forty line items so the table paginates naturally + * and the repeated header + cross-page flow become part of the frozen + * contract. No manual page breaks. + */ + static InvoiceDocumentSpec stressInvoice() { + String[] services = { + "Discovery workshop", "Design system audit", "Template architecture", + "Layout engine tuning", "Render QA pass", "Accessibility review", + "Font pipeline setup", "Chart integration", "Data mapping", + "Pagination hardening", "Visual regression wiring", "Docs authoring", + "Stakeholder demo", "Performance profiling", "Release engineering", + "Support retainer"}; + InvoiceData.Builder builder = InvoiceData.builder() + .title("Invoice") + .invoiceNumber("GC-2026-042") + .issueDate("04 May 2026") + .dueDate("18 May 2026") + .status("Pending") + .fromParty(from -> from + .name("GraphCompose Studio") + .addressLines("18 Layout Street", "London, UK", "EC1A 4GC") + .email("billing@graphcompose.dev") + .phone("+44 20 5555 1000")) + .billToParty(to -> to + .name("Northwind Systems") + .addressLines("Attn: Finance Team", "410 Market Avenue", "Manchester, UK") + .email("ap@northwind.example") + .phone("+44 161 555 2200")); + for (int i = 0; i < 40; i++) { + String service = services[i % services.length]; + int quantity = 1 + i % 4; + int unit = 180 + (i * 37) % 900; + builder.lineItem( + service + " — sprint " + (1 + i / services.length), + "Delivered under the framework agreement", + String.valueOf(quantity), + "GBP " + unit, + "GBP " + (quantity * unit)); + } + return InvoiceDocumentSpec.from(builder + .summaryRow("Subtotal", "GBP 44,890") + .summaryRow("VAT (20%)", "GBP 8,978") + .totalRow("Total", "GBP 53,868") + .note("Sprints 1-3 were delivered under the framework agreement.") + .note("Hardware and third-party licences are billed separately.") + .paymentTerm("Payment due within 14 calendar days.") + .paymentTerm("Bank transfer preferred; contact billing@graphcompose.dev for remittance details.") + .footerNote("Thank you for choosing GraphCompose for production document rendering.") + .build()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java index 05c05ba7b..b04bd4c37 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java @@ -4,7 +4,6 @@ import com.demcha.compose.document.api.DocumentPageSize; import com.demcha.compose.document.api.DocumentSession; import com.demcha.compose.document.templates.api.DocumentTemplate; -import com.demcha.compose.document.templates.data.invoice.InvoiceData; import com.demcha.compose.document.templates.data.invoice.InvoiceDocumentSpec; import com.demcha.compose.testing.visual.PdfVisualRegression; import org.junit.jupiter.params.ParameterizedTest; @@ -69,51 +68,17 @@ private static Stream presets() { return Stream.of( Arguments.of("modern_invoice", ModernInvoice.RECOMMENDED_MARGIN, - (Supplier>) ModernInvoice::create)); + (Supplier>) ModernInvoice::create), + Arguments.of("classic_invoice", + ClassicInvoice.RECOMMENDED_MARGIN, + (Supplier>) ClassicInvoice::create)); } /** - * Canonical sample invoice — exercises the hero, both parties, a - * multi-row line-items table, subtotal / tax / total summary, and the - * notes / payment-terms footer. Kept inline so the test depends only - * on main + main-test code. + * Canonical sample invoice — shared with the layout snapshot gate via + * {@link InvoicePresetFixtures}, so both gates freeze the same render. */ private static InvoiceDocumentSpec canonicalInvoice() { - return InvoiceDocumentSpec.from(InvoiceData.builder() - .title("Invoice") - .invoiceNumber("GC-2026-041") - .issueDate("02 Apr 2026") - .dueDate("16 Apr 2026") - .status("Pending") - .fromParty(from -> from - .name("GraphCompose Studio") - .addressLines("18 Layout Street", "London, UK", "EC1A 4GC") - .email("billing@graphcompose.dev") - .phone("+44 20 5555 1000") - .taxId("GB-99887766")) - .billToParty(to -> to - .name("Northwind Systems") - .addressLines("Attn: Finance Team", "410 Market Avenue", "Manchester, UK") - .email("ap@northwind.example") - .phone("+44 161 555 2200") - .taxId("NW-2026-01")) - .lineItem("Discovery workshop", "Stakeholder interviews", - "1", "GBP 1,450", "GBP 1,450") - .lineItem("Template architecture", "Reusable document flows", - "2", "GBP 980", "GBP 1,960") - .lineItem("Render QA", "Cross-platform pixel diffing", - "3", "GBP 320", "GBP 960") - .lineItem("Developer enablement", "Authoring docs + examples", - "1", "GBP 780", "GBP 780") - .summaryRow("Subtotal", "GBP 5,150") - .summaryRow("VAT (20%)", "GBP 1,030") - .totalRow("Total", "GBP 6,180") - .note("Please include the invoice number on your remittance advice.") - .note("All work was delivered as agreed during the April implementation window.") - .paymentTerm("Payment due within 14 calendar days.") - .paymentTerm("Bank transfer preferred; contact billing@graphcompose.dev for remittance details.") - .paymentTerm("Late payments may delay additional template customization work.") - .footerNote("Thank you for choosing GraphCompose for production document rendering.") - .build()); + return InvoicePresetFixtures.canonicalInvoice(); } } diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_layout.json new file mode 100644 index 000000000..2bfc96b9b --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_layout.json @@ -0,0 +1,1007 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 595.276, + "innerHeight" : 841.89, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "Invoice[0]", + "entityName" : "Invoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 0.0, + "computedY" : 191.765, + "placementX" : 0.0, + "placementY" : 191.765, + "placementWidth" : 595.276, + "placementHeight" : 650.125, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 595.276, + "contentHeight" : 650.125, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 24.0, + "right" : 24.0, + "bottom" : 24.0, + "left" : 24.0 + } + }, { + "path" : "Invoice[0]/Header[0]", + "entityName" : "Header", + "entityKind" : "RowNode", + "parentPath" : "Invoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 769.49, + "placementX" : 24.0, + "placementY" : 769.49, + "placementWidth" : 547.276, + "placementHeight" : 48.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 547.276, + "contentHeight" : 48.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderLeft[0]", + "entityName" : "HeaderLeft", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Header[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 790.915, + "placementX" : 24.0, + "placementY" : 790.915, + "placementWidth" : 185.13, + "placementHeight" : 26.975, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 185.13, + "contentHeight" : 26.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderLeft[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderLeft[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 802.165, + "placementX" : 24.0, + "placementY" : 802.165, + "placementWidth" : 185.13, + "placementHeight" : 15.725, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 185.13, + "contentHeight" : 15.725, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderLeft[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderLeft[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 790.915, + "placementX" : 24.0, + "placementY" : 790.915, + "placementWidth" : 73.38, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 73.38, + "contentHeight" : 9.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]", + "entityName" : "HeaderRight", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Header[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 306.638, + "computedY" : 769.49, + "placementX" : 306.638, + "placementY" : 769.49, + "placementWidth" : 115.136, + "placementHeight" : 48.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.136, + "contentHeight" : 48.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderRight[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 791.99, + "placementX" : 306.638, + "placementY" : 791.99, + "placementWidth" : 115.136, + "placementHeight" : 25.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.136, + "contentHeight" : 25.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderRight[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 780.74, + "placementX" : 306.638, + "placementY" : 780.74, + "placementWidth" : 60.58, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 60.58, + "contentHeight" : 9.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderRight[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 769.49, + "placementX" : 306.638, + "placementY" : 769.49, + "placementWidth" : 86.72, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.72, + "contentHeight" : 9.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Hero[1]", + "entityName" : "Hero", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 696.365, + "placementX" : 24.0, + "placementY" : 696.365, + "placementWidth" : 538.468, + "placementHeight" : 57.125, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.468, + "contentHeight" : 57.125, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 14.0, + "right" : 14.0, + "bottom" : 14.0, + "left" : 14.0 + } + }, { + "path" : "Invoice[0]/Hero[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Hero[1]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 38.0, + "computedY" : 729.315, + "placementX" : 38.0, + "placementY" : 729.315, + "placementWidth" : 62.942, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 62.942, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Hero[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Hero[1]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 38.0, + "computedY" : 710.365, + "placementX" : 38.0, + "placementY" : 710.365, + "placementWidth" : 510.468, + "placementHeight" : 12.95, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 510.468, + "contentHeight" : 12.95, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]", + "entityName" : "Parties", + "entityKind" : "RowNode", + "parentPath" : "Invoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 599.94, + "placementX" : 24.0, + "placementY" : 599.94, + "placementWidth" : 547.276, + "placementHeight" : 80.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 547.276, + "contentHeight" : 80.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]", + "entityName" : "BillTo", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Parties[2]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 599.94, + "placementX" : 24.0, + "placementY" : 599.94, + "placementWidth" : 115.709, + "placementHeight" : 80.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.709, + "contentHeight" : 80.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/BillTo[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 670.19, + "placementX" : 24.0, + "placementY" : 670.19, + "placementWidth" : 42.779, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 42.779, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/BillTo[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 658.015, + "placementX" : 24.0, + "placementY" : 658.015, + "placementWidth" : 102.685, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 102.685, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/BillTo[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 599.94, + "placementX" : 24.0, + "placementY" : 599.94, + "placementWidth" : 115.709, + "placementHeight" : 56.075, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.709, + "contentHeight" : 56.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]", + "entityName" : "From", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Parties[2]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 306.638, + "computedY" : 599.94, + "placementX" : 306.638, + "placementY" : 599.94, + "placementWidth" : 132.825, + "placementHeight" : 80.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.825, + "contentHeight" : 80.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/From[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 670.19, + "placementX" : 306.638, + "placementY" : 670.19, + "placementWidth" : 32.384, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.384, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/From[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 658.015, + "placementX" : 306.638, + "placementY" : 658.015, + "placementWidth" : 119.79, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 119.79, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/From[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 599.94, + "placementX" : 306.638, + "placementY" : 599.94, + "placementWidth" : 132.825, + "placementHeight" : 56.075, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.825, + "contentHeight" : 56.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/LineItems[3]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "Invoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 449.965, + "placementX" : 24.0, + "placementY" : 449.965, + "placementWidth" : 400.84, + "placementHeight" : 133.975, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 400.84, + "contentHeight" : 133.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Summary[4]", + "entityName" : "Summary", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 353.89, + "placementX" : 24.0, + "placementY" : 353.89, + "placementWidth" : 262.0, + "placementHeight" : 80.075, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 262.0, + "contentHeight" : 80.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Summary[4]/SummaryTable[0]", + "entityName" : "SummaryTable", + "entityKind" : "TableNode", + "parentPath" : "Invoice[0]/Summary[4]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 353.89, + "placementX" : 24.0, + "placementY" : 353.89, + "placementWidth" : 262.0, + "placementHeight" : 80.075, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 262.0, + "contentHeight" : 80.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]", + "entityName" : "Footer", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 215.765, + "placementX" : 24.0, + "placementY" : 215.765, + "placementWidth" : 547.276, + "placementHeight" : 122.125, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 547.276, + "contentHeight" : 122.125, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]", + "entityName" : "FooterRow", + "entityKind" : "RowNode", + "parentPath" : "Invoice[0]/Footer[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 247.015, + "placementX" : 24.0, + "placementY" : 247.015, + "placementWidth" : 547.276, + "placementHeight" : 90.875, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 547.276, + "contentHeight" : 90.875, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]", + "entityName" : "InvoiceNotes", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 272.915, + "placementX" : 24.0, + "placementY" : 272.915, + "placementWidth" : 264.214, + "placementHeight" : 64.975, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 264.214, + "contentHeight" : 64.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 8.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 327.715, + "placementX" : 32.0, + "placementY" : 327.715, + "placementWidth" : 30.558, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.558, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]/ListNode[1]", + "entityName" : null, + "entityKind" : "ListNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 272.915, + "placementX" : 32.0, + "placementY" : 272.915, + "placementWidth" : 256.214, + "placementHeight" : 51.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 256.214, + "contentHeight" : 51.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]", + "entityName" : "InvoicePaymentTerms", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 247.015, + "placementX" : 306.638, + "placementY" : 247.015, + "placementWidth" : 253.35, + "placementHeight" : 90.875, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 253.35, + "contentHeight" : 90.875, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 8.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 314.638, + "computedY" : 327.715, + "placementX" : 314.638, + "placementY" : 327.715, + "placementWidth" : 78.859, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 78.859, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]/ListNode[1]", + "entityName" : null, + "entityKind" : "ListNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 314.638, + "computedY" : 247.015, + "placementX" : 314.638, + "placementY" : 247.015, + "placementWidth" : 245.35, + "placementHeight" : 77.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 245.35, + "contentHeight" : 77.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Footer[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 215.765, + "placementX" : 24.0, + "placementY" : 215.765, + "placementWidth" : 335.71, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 335.71, + "contentHeight" : 9.25, + "margin" : { + "top" : 14.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_stress_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_stress_layout.json new file mode 100644 index 000000000..e76739bd6 --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/classic_invoice_stress_layout.json @@ -0,0 +1,1007 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 595.276, + "innerHeight" : 841.89, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, + "totalPages" : 2, + "nodes" : [ { + "path" : "Invoice[0]", + "entityName" : "Invoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 0.0, + "computedY" : -752.535, + "placementX" : 0.0, + "placementY" : -752.535, + "placementWidth" : 595.276, + "placementHeight" : 1594.425, + "startPage" : 0, + "endPage" : 1, + "contentWidth" : 595.276, + "contentHeight" : 1594.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 24.0, + "right" : 24.0, + "bottom" : 24.0, + "left" : 24.0 + } + }, { + "path" : "Invoice[0]/Header[0]", + "entityName" : "Header", + "entityKind" : "RowNode", + "parentPath" : "Invoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 769.49, + "placementX" : 24.0, + "placementY" : 769.49, + "placementWidth" : 547.276, + "placementHeight" : 48.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 547.276, + "contentHeight" : 48.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderLeft[0]", + "entityName" : "HeaderLeft", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Header[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 790.915, + "placementX" : 24.0, + "placementY" : 790.915, + "placementWidth" : 185.13, + "placementHeight" : 26.975, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 185.13, + "contentHeight" : 26.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderLeft[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderLeft[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 802.165, + "placementX" : 24.0, + "placementY" : 802.165, + "placementWidth" : 185.13, + "placementHeight" : 15.725, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 185.13, + "contentHeight" : 15.725, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderLeft[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderLeft[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 790.915, + "placementX" : 24.0, + "placementY" : 790.915, + "placementWidth" : 73.38, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 73.38, + "contentHeight" : 9.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]", + "entityName" : "HeaderRight", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Header[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 306.638, + "computedY" : 769.49, + "placementX" : 306.638, + "placementY" : 769.49, + "placementWidth" : 115.136, + "placementHeight" : 48.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.136, + "contentHeight" : 48.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderRight[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 791.99, + "placementX" : 306.638, + "placementY" : 791.99, + "placementWidth" : 115.136, + "placementHeight" : 25.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.136, + "contentHeight" : 25.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderRight[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 780.74, + "placementX" : 306.638, + "placementY" : 780.74, + "placementWidth" : 60.58, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 60.58, + "contentHeight" : 9.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Header[0]/HeaderRight[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Header[0]/HeaderRight[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 769.49, + "placementX" : 306.638, + "placementY" : 769.49, + "placementWidth" : 90.05, + "placementHeight" : 9.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 90.05, + "contentHeight" : 9.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Hero[1]", + "entityName" : "Hero", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 696.365, + "placementX" : 24.0, + "placementY" : 696.365, + "placementWidth" : 544.712, + "placementHeight" : 57.125, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 544.712, + "contentHeight" : 57.125, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 14.0, + "right" : 14.0, + "bottom" : 14.0, + "left" : 14.0 + } + }, { + "path" : "Invoice[0]/Hero[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Hero[1]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 38.0, + "computedY" : 729.315, + "placementX" : 38.0, + "placementY" : 729.315, + "placementWidth" : 62.942, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 62.942, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Hero[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Hero[1]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 38.0, + "computedY" : 710.365, + "placementX" : 38.0, + "placementY" : 710.365, + "placementWidth" : 516.712, + "placementHeight" : 12.95, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 516.712, + "contentHeight" : 12.95, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]", + "entityName" : "Parties", + "entityKind" : "RowNode", + "parentPath" : "Invoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 599.94, + "placementX" : 24.0, + "placementY" : 599.94, + "placementWidth" : 547.276, + "placementHeight" : 80.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 547.276, + "contentHeight" : 80.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]", + "entityName" : "BillTo", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Parties[2]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 599.94, + "placementX" : 24.0, + "placementY" : 599.94, + "placementWidth" : 115.709, + "placementHeight" : 80.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.709, + "contentHeight" : 80.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/BillTo[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 670.19, + "placementX" : 24.0, + "placementY" : 670.19, + "placementWidth" : 42.779, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 42.779, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/BillTo[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 658.015, + "placementX" : 24.0, + "placementY" : 658.015, + "placementWidth" : 102.685, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 102.685, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/BillTo[0]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/BillTo[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 599.94, + "placementX" : 24.0, + "placementY" : 599.94, + "placementWidth" : 115.709, + "placementHeight" : 56.075, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 115.709, + "contentHeight" : 56.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]", + "entityName" : "From", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Parties[2]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 306.638, + "computedY" : 599.94, + "placementX" : 306.638, + "placementY" : 599.94, + "placementWidth" : 132.825, + "placementHeight" : 80.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.825, + "contentHeight" : 80.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/From[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 670.19, + "placementX" : 306.638, + "placementY" : 670.19, + "placementWidth" : 32.384, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.384, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/From[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 658.015, + "placementX" : 306.638, + "placementY" : 658.015, + "placementWidth" : 119.79, + "placementHeight" : 10.175, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 119.79, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Parties[2]/From[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Parties[2]/From[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 599.94, + "placementX" : 306.638, + "placementY" : 599.94, + "placementWidth" : 132.825, + "placementHeight" : 56.075, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.825, + "contentHeight" : 56.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/LineItems[3]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "Invoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 18.765, + "placementX" : 24.0, + "placementY" : 18.765, + "placementWidth" : 475.502, + "placementHeight" : 1104.175, + "startPage" : 0, + "endPage" : 1, + "contentWidth" : 475.502, + "contentHeight" : 1104.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Summary[4]", + "entityName" : "Summary", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 180.64, + "placementX" : 24.0, + "placementY" : 180.64, + "placementWidth" : 262.0, + "placementHeight" : 80.075, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 262.0, + "contentHeight" : 80.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Summary[4]/SummaryTable[0]", + "entityName" : "SummaryTable", + "entityKind" : "TableNode", + "parentPath" : "Invoice[0]/Summary[4]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 180.64, + "placementX" : 24.0, + "placementY" : 180.64, + "placementWidth" : 262.0, + "placementHeight" : 80.075, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 262.0, + "contentHeight" : 80.075, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]", + "entityName" : "Footer", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 24.0, + "computedY" : 68.415, + "placementX" : 24.0, + "placementY" : 68.415, + "placementWidth" : 547.276, + "placementHeight" : 96.225, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 547.276, + "contentHeight" : 96.225, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]", + "entityName" : "FooterRow", + "entityKind" : "RowNode", + "parentPath" : "Invoice[0]/Footer[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 99.665, + "placementX" : 24.0, + "placementY" : 99.665, + "placementWidth" : 547.276, + "placementHeight" : 64.975, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 547.276, + "contentHeight" : 64.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]", + "entityName" : "InvoiceNotes", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 24.0, + "computedY" : 99.665, + "placementX" : 24.0, + "placementY" : 99.665, + "placementWidth" : 250.2, + "placementHeight" : 64.975, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 250.2, + "contentHeight" : 64.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 8.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 154.465, + "placementX" : 32.0, + "placementY" : 154.465, + "placementWidth" : 30.558, + "placementHeight" : 10.175, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 30.558, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]/ListNode[1]", + "entityName" : null, + "entityKind" : "ListNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoiceNotes[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 32.0, + "computedY" : 99.665, + "placementX" : 32.0, + "placementY" : 99.665, + "placementWidth" : 242.2, + "placementHeight" : 51.8, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 242.2, + "contentHeight" : 51.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]", + "entityName" : "InvoicePaymentTerms", + "entityKind" : "SectionNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 306.638, + "computedY" : 99.665, + "placementX" : 306.638, + "placementY" : 99.665, + "placementWidth" : 253.35, + "placementHeight" : 64.975, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 253.35, + "contentHeight" : 64.975, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 8.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 314.638, + "computedY" : 154.465, + "placementX" : 314.638, + "placementY" : 154.465, + "placementWidth" : 78.859, + "placementHeight" : 10.175, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 78.859, + "contentHeight" : 10.175, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]/ListNode[1]", + "entityName" : null, + "entityKind" : "ListNode", + "parentPath" : "Invoice[0]/Footer[5]/FooterRow[0]/InvoicePaymentTerms[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 314.638, + "computedY" : 99.665, + "placementX" : 314.638, + "placementY" : 99.665, + "placementWidth" : 245.35, + "placementHeight" : 51.8, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 245.35, + "contentHeight" : 51.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "Invoice[0]/Footer[5]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "Invoice[0]/Footer[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 24.0, + "computedY" : 68.415, + "placementX" : 24.0, + "placementY" : 68.415, + "placementWidth" : 335.71, + "placementHeight" : 9.25, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 335.71, + "contentHeight" : 9.25, + "margin" : { + "top" : 14.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} diff --git a/qa/src/test/resources/visual-baselines/invoice-v2-layered/classic_invoice-page-0.png b/qa/src/test/resources/visual-baselines/invoice-v2-layered/classic_invoice-page-0.png new file mode 100644 index 0000000000000000000000000000000000000000..a9681f8129fc53fd963f055b33fe47d29c213f1b GIT binary patch literal 86218 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 h-!b@qm4dm`^B>grNFtAGq|U)VC4`!Mf$YAn invoice with a document header band (company name + first + * address line on the left, a 28pt "INVOICE" title with number and + * issue date on the right), a "TOTAL DUE" hero strip, a + * BILL TO / FROM two-column party row, the line-items table, a + * dedicated Summary table composed after the line items + * (subtotal / tax / TOTAL, the last row emphasized), and a notes / + * payment-terms footer. Long invoices paginate naturally: the + * line-items table flows onto the next page with its header repeated, + * and the summary + footer follow the table. The preset carries its + * spacing on the page flow itself (16pt flow spacing, 24pt padding on + * every edge) and expects a zero session margin — see + * {@link #RECOMMENDED_MARGIN}.

+ * + *

Layout traits that distinguish it from {@link ModernInvoice} and are + * part of this preset's visual contract: the header band (Modern has + * none), the party order (BILL TO left, FROM right — Modern renders + * FROM first), the separate Summary table (Modern folds the summary rows + * into the line-items table; this one repeats the line-items column + * pattern and shrink-wraps to its own rows), the fully-rounded hero + * panel (Modern rounds the right edge only), and the dark table-header + * ink on the deep-teal fill (Modern uses the light surface colour). The + * party blocks join address lines, email, and phone only — no tax id + * line.

+ * + *

Ported-render fidelity: the preset reproduces the rendered output + * of the published standalone {@code invoice-classic} template. Three + * traits follow from that and are deliberate: the header always reads + * "INVOICE" — {@link InvoiceData#title()} is not rendered; the + * "TOTAL DUE" strip carries the invoice metadata (number, dates, + * status), not an amount; and the table-header ink stays dark on the + * teal fill. Changing any of them is a redesign of the ported look, + * not a port fix.

+ * + *

The preset reads every shared surface from the + * {@link BrandTheme#invoiceModern()} tokens (palette, Helvetica type + * scale, hero panel radius / padding / accent width). The two ink + * colours below and the geometry constants that have no theme slot + * stay preset-local.

+ */ +public final class ClassicInvoice { + + /** + * Stable template identifier. + */ + public static final String ID = "invoice-classic"; + + /** + * Human-readable display name. + */ + public static final String DISPLAY_NAME = "Classic Invoice"; + + /** + * Recommended session margin (in points). The preset pads the page + * flow itself (24pt on every edge), so the session margin stays zero; + * a non-zero margin would double the page frame. + */ + public static final double RECOMMENDED_MARGIN = 0.0; + + private static final double TABLE_PADDING = 7.0; + + /** + * Flow spacing between the header, hero, parties, table, summary, + * and footer blocks. Intentionally wider than the theme's + * {@code pageFlowSpacing} — the letterhead look breathes more. + */ + private static final double PAGE_SPACING = 16.0; + + /** + * Page-flow padding on every edge — the preset's page frame + * (replaces the session margin, see {@link #RECOMMENDED_MARGIN}). + */ + private static final double PAGE_PADDING = 24.0; + + /** + * Company-name size in the header band — the h2 step of the modern + * business type ladder (between the theme's 11pt banner and 28pt + * headline slots, which is why it has no {@code Typography} slot). + */ + private static final double COMPANY_NAME_SIZE = 17.0; + + /** + * Deep teal used for the INVOICE title, the company name, and the + * line-items table header fill (the modern business primary). + * Same value as {@link ModernInvoice}'s preset-local primary — kept + * preset-local because adding a {@code Palette} slot would change the + * record's public constructor; fold both into a shared slot when the + * palette can grow compatibly. + */ + private static final DocumentColor PRIMARY = DocumentColor.rgb(20, 60, 75); + + /** + * Gold accent for the hero strip, the status read-out, and the footer + * column rules (the modern business accent). Preset-local, same + * rationale as {@link #PRIMARY}. + */ + private static final DocumentColor ACCENT = DocumentColor.rgb(196, 153, 76); + + private ClassicInvoice() { + } + + /** + * Builds the preset with the modern business theme + * ({@link BrandTheme#invoiceModern()}). + * + * @return ready-to-use template + */ + public static DocumentTemplate create() { + return create(BrandTheme.invoiceModern()); + } + + /** + * Builds the preset with a caller-supplied theme, so callers can + * vary the invoice flavour (typography scale, palette) without + * forking this class. + * + * @param theme active theme + * @return ready-to-use template + */ + public static DocumentTemplate create(BrandTheme theme) { + Objects.requireNonNull(theme, "theme"); + return new Template(theme); + } + + private record Template(BrandTheme theme) implements DocumentTemplate { + + @Override + public String id() { + return ID; + } + + @Override + public String displayName() { + return DISPLAY_NAME; + } + + @Override + public void compose(DocumentSession document, InvoiceDocumentSpec spec) { + Objects.requireNonNull(document, "document"); + InvoiceData data = Objects.requireNonNull(spec, "spec").invoice(); + + DocumentColor panelFill = theme.palette().banner(); // soft tan + DocumentColor surface = theme.palette().mainFill(); // cream + DocumentColor rule = theme.palette().rule(); + + DocumentTextStyle titleStyle = DocumentTextStyle.builder() + .fontName(theme.typography().headlineFont()) + .size(theme.typography().sizeHeadline()) + .decoration(DocumentTextDecoration.BOLD) + .color(PRIMARY) + .build(); + DocumentTextStyle companyStyle = DocumentTextStyle.builder() + .fontName(theme.typography().headlineFont()) + .size(COMPANY_NAME_SIZE) + .decoration(DocumentTextDecoration.BOLD) + .color(PRIMARY) + .build(); + DocumentTextStyle labelStyle = theme.bodyBoldStyle(); + DocumentTextStyle bodyStyle = theme.bodyStyle(); + DocumentTextStyle captionStyle = DocumentTextStyle.builder() + .fontName(theme.typography().bodyFont()) + .size(theme.typography().sizeEntrySubtitle()) + .color(theme.palette().muted()) + .build(); + + // Line-item cells intentionally carry NO textStyle — they inherit + // the DSL default table-cell text (same guard as ModernInvoice). + DocumentTableStyle bordered = DocumentTableStyle.builder() + .stroke(DocumentStroke.of(rule, 0.6)) + .padding(DocumentInsets.of(TABLE_PADDING)) + .build(); + // The header keeps the dark body-bold ink on the deep-teal fill — + // the ported template's approved render (Modern uses the light + // surface ink instead). A higher-contrast header is a deliberate + // redesign of the ported look, not a port fix. + DocumentTableStyle headerStyle = DocumentTableStyle.builder() + .fillColor(PRIMARY) + .stroke(DocumentStroke.of(rule, 0.6)) + .padding(DocumentInsets.of(TABLE_PADDING + 1)) + .textStyle(labelStyle) + .build(); + DocumentTableStyle totalStyle = DocumentTableStyle.builder() + .fillColor(panelFill) + .stroke(DocumentStroke.of(rule, 0.6)) + .padding(DocumentInsets.of(TABLE_PADDING + 1)) + .textStyle(labelStyle) + .build(); + + PageFlowBuilder flow = document.dsl().pageFlow() + .name("Invoice") + .spacing(PAGE_SPACING) + .padding(DocumentInsets.of(PAGE_PADDING)) + .addRow("Header", row -> renderHeader(row, data, + companyStyle, titleStyle, captionStyle)) + .addSection("Hero", section -> renderHero(section, data, + panelFill, labelStyle)) + .addRow("Parties", row -> renderParties(row, data, + labelStyle, bodyStyle)) + .addTable(table -> renderLineItems(table, data, + bordered, headerStyle, panelFill, surface)); + // The engine rejects a zero-row table, so an invoice without + // summary rows renders without the Summary section. + if (!data.summaryRows().isEmpty()) { + flow.addSection("Summary", section -> renderSummary(section, data, + bordered, totalStyle)); + } + flow.addSection("Footer", section -> renderFooter(section, data, + labelStyle, captionStyle)) + .build(); + } + + private void renderHeader(RowBuilder row, + InvoiceData data, + DocumentTextStyle companyStyle, + DocumentTextStyle titleStyle, + DocumentTextStyle captionStyle) { + row.spacing(18); + row.weights(1, 1); + row.addSection("HeaderLeft", section -> section + .spacing(2) + .addParagraph(p -> p + .text(data.fromParty().name()) + .textStyle(companyStyle) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .text(firstAddressLine(data.fromParty())) + .textStyle(captionStyle) + .margin(DocumentInsets.zero()))); + row.addSection("HeaderRight", section -> section + .spacing(2) + .addParagraph(p -> p + .text("INVOICE") + .textStyle(titleStyle) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .text(safe(data.invoiceNumber())) + .textStyle(captionStyle) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .text("Issued " + safe(data.issueDate())) + .textStyle(captionStyle) + .margin(DocumentInsets.zero()))); + } + + private void renderHero(SectionBuilder section, + InvoiceData data, + DocumentColor panelFill, + DocumentTextStyle labelStyle) { + // The strip is a metadata read-out — the ported template renders + // no amount after the TOTAL DUE label. + section.softPanel(panelFill, + theme.spacing().bannerCornerRadius(), + theme.spacing().bannerInnerPadding()) + .accentLeft(ACCENT, theme.spacing().accentRuleWidth()) + .spacing(6) + .addParagraph(p -> p + .text("TOTAL DUE") + .textStyle(labelStyle) + .margin(DocumentInsets.zero())) + .addRich(rich -> rich + .plain("Invoice ").bold(safe(data.invoiceNumber())) + .plain(" Issued ").bold(safe(data.issueDate())) + .plain(" Due ").bold(safe(data.dueDate())) + .plain(" Status ").accent(safeStatus(data.status()), ACCENT)); + } + + private void renderParties(RowBuilder row, + InvoiceData data, + DocumentTextStyle labelStyle, + DocumentTextStyle bodyStyle) { + row.spacing(18); + row.weights(1, 1); + row.addSection("BillTo", section -> renderContactBlock( + section, data.billToParty(), "BILL TO", labelStyle, bodyStyle)); + row.addSection("From", section -> renderContactBlock( + section, data.fromParty(), "FROM", labelStyle, bodyStyle)); + } + + private static void renderLineItems(TableBuilder table, + InvoiceData data, + DocumentTableStyle bordered, + DocumentTableStyle headerStyle, + DocumentColor zebraOdd, + DocumentColor zebraEven) { + table.name("LineItems") + .columns( + DocumentTableColumn.auto(), + DocumentTableColumn.fixed(54), + DocumentTableColumn.fixed(96), + DocumentTableColumn.fixed(96)) + .defaultCellStyle(bordered) + .headerRow("Description", "Qty", "Unit", "Amount") + .headerStyle(headerStyle) + .repeatHeader() + .zebra(zebraOdd, zebraEven); + // Only item.description() renders in the cell — the optional + // details string would drive the auto-sized description column + // past the inner page width (same guard as ModernInvoice). + for (InvoiceLineItem item : data.lineItems()) { + table.row(item.description(), item.quantity(), + item.unitPrice(), item.amount()); + } + } + + private static void renderSummary(SectionBuilder section, + InvoiceData data, + DocumentTableStyle bordered, + DocumentTableStyle totalStyle) { + // The summary lives in its own table that repeats the LineItems + // column pattern (auto / 54 / 96 / 96) — the ported template's + // shape. The table shrink-wraps to its own rows (the empty auto + // column collapses), so it renders narrower than the line items + // above. The LAST row is the grand total and renders via + // totalRow for the emphasized style. + section.addTable(summary -> { + summary.name("SummaryTable") + .columns( + DocumentTableColumn.auto(), + DocumentTableColumn.fixed(54), + DocumentTableColumn.fixed(96), + DocumentTableColumn.fixed(96)) + .defaultCellStyle(bordered); + List summaries = data.summaryRows(); + for (int i = 0; i < summaries.size(); i++) { + InvoiceSummaryRow row = summaries.get(i); + if (i == summaries.size() - 1) { + summary.totalRow(totalStyle, "", "", row.label(), row.value()); + } else { + summary.row("", "", row.label(), row.value()); + } + } + }); + } + + private void renderFooter(SectionBuilder section, + InvoiceData data, + DocumentTextStyle labelStyle, + DocumentTextStyle captionStyle) { + section.spacing(8) + .addRow("FooterRow", row -> row + .spacing(18) + .weights(1, 1) + .addSection("InvoiceNotes", col -> col + .accentLeft(ACCENT, 3) + .padding(0, 0, 0, 8) + .spacing(3) + .addParagraph(p -> p + .text("Notes") + .textStyle(labelStyle) + .margin(DocumentInsets.zero())) + .addList(list -> list.items(data.notes()))) + .addSection("InvoicePaymentTerms", col -> col + .accentLeft(ACCENT, 3) + .padding(0, 0, 0, 8) + .spacing(3) + .addParagraph(p -> p + .text("Payment terms") + .textStyle(labelStyle) + .margin(DocumentInsets.zero())) + .addList(list -> list.items(data.paymentTerms())))); + if (!data.footerNote().isBlank()) { + section.addParagraph(p -> p + .text(data.footerNote()) + .textStyle(captionStyle) + .margin(new DocumentInsets(14, 0, 0, 0))); + } + } + + private static void renderContactBlock(SectionBuilder section, + InvoiceParty party, + String label, + DocumentTextStyle labelStyle, + DocumentTextStyle bodyStyle) { + section.spacing(2) + .addParagraph(p -> p + .text(label) + .textStyle(labelStyle) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .text(party.name()) + .textStyle(labelStyle) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .text(joinAddress(party)) + .textStyle(bodyStyle) + .lineSpacing(1.3) + .margin(DocumentInsets.zero())); + } + } + + private static String firstAddressLine(InvoiceParty party) { + for (String line : party.addressLines()) { + if (line != null && !line.isBlank()) { + return line; + } + } + return ""; + } + + private static String joinAddress(InvoiceParty party) { + StringBuilder builder = new StringBuilder(); + for (String line : party.addressLines()) { + if (line == null || line.isBlank()) { + continue; + } + append(builder, line); + } + if (!party.email().isBlank()) { + append(builder, party.email()); + } + if (!party.phone().isBlank()) { + append(builder, party.phone()); + } + return builder.toString(); + } + + private static void append(StringBuilder builder, String line) { + if (builder.length() > 0) { + builder.append('\n'); + } + builder.append(line); + } + + private static String safeStatus(String status) { + if (status == null || status.isBlank()) { + return "—"; + } + return status; + } + + private static String safe(String value) { + return value == null ? "" : value; + } +} From daf0560a31a19f87d5cf6ae496d2494ea0f56efd Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 30 Aug 2026 15:24:04 +0100 Subject: [PATCH 2/2] chore(examples): publish the invoice-classic-v2 preview Every showcase document is either a committed preview under assets/readme/examples or deliberately unpublished; invoice-classic-v2 now ships its preview alongside the other invoice renders. --- assets/readme/examples/invoice-classic-v2.pdf | Bin 0 -> 3217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/readme/examples/invoice-classic-v2.pdf diff --git a/assets/readme/examples/invoice-classic-v2.pdf b/assets/readme/examples/invoice-classic-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a4c2dc20a436f7ae9267791fae2a59c4d4f4303 GIT binary patch literal 3217 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 literal 0 HcmV?d00001