2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-07-05 06:32:55 +00:00

Report Generation Updates (#12187)

* Fix for TemplateEditor

- Allow dragging of split section

* Cleaner report template code

* Pass correct error message through

* Prevent multiple retries if running in worker thread

* Handle report merge error

* Add playwright tests for broken report printing

* Reduce scope for exception messages

* Reduce comment deltas

* Adjust unit test

* Raise ValidaitonError

* Handle message parsing

* Additional comment

* Fix unit tests
This commit is contained in:
Oliver
2026-06-18 13:41:44 +10:00
committed by GitHub
parent 4b29032c6e
commit fc15f30f8f
7 changed files with 96 additions and 32 deletions
@@ -68,9 +68,13 @@ export const PdfPreviewComponent: PreviewAreaComponent = forwardRef(
api
.get(apiUrl(ApiEndpoints.data_output, preview.data.pk))
.then((response) => {
if (response.data.error) {
if (response.data.errors || response.data.error) {
clearInterval(interval);
rej(response.data.error);
rej(
response.data.error ??
response.data.errors?.error ??
t`Process failed`
);
}
if (response.data.complete) {
@@ -223,7 +223,7 @@ export function TemplateEditor(props: Readonly<TemplateEditorProps>) {
});
})
.catch((error) => {
const msg = error?.message;
const msg = error?.message || error?.toString();
if (msg) {
if (Array.isArray(msg)) {
@@ -272,7 +272,7 @@ export function TemplateEditor(props: Readonly<TemplateEditorProps>) {
return (
<Boundary label='TemplateEditor'>
<Stack style={{ height: '100%', flex: '1' }}>
<Split style={{ gap: '10px' }}>
<Split visible style={{ flex: 1 }}>
<Tabs
value={editorValue}
onChange={async (v) => {
@@ -282,7 +282,7 @@ export function TemplateEditor(props: Readonly<TemplateEditorProps>) {
keepMounted={false}
style={{
minWidth: '300px',
flex: '1',
width: '50%',
display: 'flex',
flexDirection: 'column'
}}
@@ -348,6 +348,7 @@ export function TemplateEditor(props: Readonly<TemplateEditorProps>) {
keepMounted={false}
style={{
minWidth: '200px',
width: '50%',
display: 'flex',
flexDirection: 'column'
}}
+52 -1
View File
@@ -1,7 +1,7 @@
import type { Locator } from '@playwright/test';
import { expect, test } from './baseFixtures.js';
import { adminuser } from './defaults.js';
import { activateTableView, loadTab } from './helpers.js';
import { activateTableView, loadTab, navigate } from './helpers.js';
import { doCachedLogin } from './login.js';
import { setPluginState } from './settings.js';
@@ -207,3 +207,54 @@ test('Printing - Report Editing', async ({ browser }) => {
state: false
});
});
// Test report printing with an intentionally broken template, to verify that errors are handled gracefully
test('Printing - Broken Template', async ({ browser }) => {
const page = await doCachedLogin(browser, {
user: adminuser,
url: 'sales/sales-order/14/detail'
});
// Print report from the "sales order" detail page
await page
.getByRole('button', { name: 'action-menu-printing-actions' })
.click();
await page
.getByRole('menuitem', {
name: 'action-menu-printing-actions-print-reports'
})
.click();
await page
.getByRole('combobox', { name: 'related-field-template' })
.fill('broken');
await page.getByText('Broken Sales Order Report').click();
await page.getByRole('button', { name: 'Print', exact: true }).click();
// Expected error message
await page
.getByText('parameter tag requires a valid Model instance')
.waitFor();
// Next, check error message from the template editor preview
await navigate(page, 'settings/admin/reports');
await page
.getByRole('textbox', { name: 'table-search-input' })
.fill('broken');
await page.getByRole('cell', { name: 'Broken Sales Order Report' }).click();
await page.getByLabel('split-button-preview-options-action').click();
await page
.getByLabel('split-button-preview-options-item-preview-save', {
exact: true
})
.click();
await page.getByRole('button', { name: 'Save & Reload' }).click();
// Expected error messages
await page.getByText('Error rendering template').waitFor();
await page
.getByText('parameter tag requires a valid Model instance')
.waitFor();
});