mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 03:26:45 +00:00
[PUI] Form error fix (#8204)
* Handle simple string error message * Add playwright test for form validation * Render stock unit price / total value * Fix for TextField: - Prevent unnecessary value change - This was removing the field error * Add playwright test for supplier form validation
This commit is contained in:
parent
e6470ffdea
commit
390fec3ab1
@ -521,6 +521,8 @@ export function ApiForm({
|
|||||||
// Standard error handling for other fields
|
// Standard error handling for other fields
|
||||||
form.setError(path, { message: v.join(', ') });
|
form.setError(path, { message: v.join(', ') });
|
||||||
}
|
}
|
||||||
|
} else if (typeof v === 'string') {
|
||||||
|
form.setError(path, { message: v });
|
||||||
} else {
|
} else {
|
||||||
processErrors(v, path);
|
processErrors(v, path);
|
||||||
}
|
}
|
||||||
@ -529,6 +531,7 @@ export function ApiForm({
|
|||||||
|
|
||||||
processErrors(error.response.data);
|
processErrors(error.response.data);
|
||||||
setNonFieldErrors(_nonFieldErrors);
|
setNonFieldErrors(_nonFieldErrors);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Unexpected state on form error
|
// Unexpected state on form error
|
||||||
|
@ -60,7 +60,9 @@ export default function TextField({
|
|||||||
radius="sm"
|
radius="sm"
|
||||||
onChange={(event) => onTextChange(event.currentTarget.value)}
|
onChange={(event) => onTextChange(event.currentTarget.value)}
|
||||||
onBlur={(event) => {
|
onBlur={(event) => {
|
||||||
onChange(event.currentTarget.value);
|
if (event.currentTarget.value != value) {
|
||||||
|
onChange(event.currentTarget.value);
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
onKeyDown={(event) => onKeyDown(event.code)}
|
onKeyDown={(event) => onKeyDown(event.code)}
|
||||||
rightSection={
|
rightSection={
|
||||||
|
@ -83,6 +83,9 @@ export function useStockFields({
|
|||||||
part: {
|
part: {
|
||||||
value: part,
|
value: part,
|
||||||
disabled: !create,
|
disabled: !create,
|
||||||
|
filters: {
|
||||||
|
active: create ? true : undefined
|
||||||
|
},
|
||||||
onValueChange: (value, record) => {
|
onValueChange: (value, record) => {
|
||||||
setPart(value);
|
setPart(value);
|
||||||
// TODO: implement remaining functionality from old stock.py
|
// TODO: implement remaining functionality from old stock.py
|
||||||
|
@ -38,6 +38,7 @@ import { PageDetail } from '../../components/nav/PageDetail';
|
|||||||
import { PanelType } from '../../components/nav/Panel';
|
import { PanelType } from '../../components/nav/Panel';
|
||||||
import { PanelGroup } from '../../components/nav/PanelGroup';
|
import { PanelGroup } from '../../components/nav/PanelGroup';
|
||||||
import { StatusRenderer } from '../../components/render/StatusRenderer';
|
import { StatusRenderer } from '../../components/render/StatusRenderer';
|
||||||
|
import { formatCurrency } from '../../defaults/formatters';
|
||||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||||
import { ModelType } from '../../enums/ModelType';
|
import { ModelType } from '../../enums/ModelType';
|
||||||
import { UserRoles } from '../../enums/Roles';
|
import { UserRoles } from '../../enums/Roles';
|
||||||
@ -179,8 +180,6 @@ export default function StockDetail() {
|
|||||||
label: t`Batch Code`,
|
label: t`Batch Code`,
|
||||||
hidden: !stockitem.batch
|
hidden: !stockitem.batch
|
||||||
}
|
}
|
||||||
// TODO: allocated_to_sales_orders
|
|
||||||
// TODO: allocated_to_build_orders
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// Bottom left: location information
|
// Bottom left: location information
|
||||||
@ -264,6 +263,34 @@ export default function StockDetail() {
|
|||||||
let br: DetailsField[] = [
|
let br: DetailsField[] = [
|
||||||
// TODO: Expiry date
|
// TODO: Expiry date
|
||||||
// TODO: Ownership
|
// TODO: Ownership
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
name: 'purchase_price',
|
||||||
|
label: t`Unit Price`,
|
||||||
|
icon: 'currency',
|
||||||
|
hidden: !stockitem.purchase_price,
|
||||||
|
value_formatter: () => {
|
||||||
|
return formatCurrency(stockitem.purchase_price, {
|
||||||
|
currency: stockitem.purchase_price_currency
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
name: 'stock_value',
|
||||||
|
label: t`Stock Value`,
|
||||||
|
icon: 'currency',
|
||||||
|
hidden:
|
||||||
|
!stockitem.purchase_price ||
|
||||||
|
stockitem.quantity == 1 ||
|
||||||
|
stockitem.quantity == 0,
|
||||||
|
value_formatter: () => {
|
||||||
|
return formatCurrency(stockitem.purchase_price, {
|
||||||
|
currency: stockitem.purchase_price_currency,
|
||||||
|
multiplier: stockitem.quantity
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'text',
|
type: 'text',
|
||||||
name: 'packaging',
|
name: 'packaging',
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { test } from './baseFixtures.js';
|
import { test } from './baseFixtures.js';
|
||||||
import { doQuickLogin } from './login.js';
|
import { doQuickLogin } from './login.js';
|
||||||
|
|
||||||
test('PUI - Modals as admin', async ({ page }) => {
|
test('Modals as admin', async ({ page }) => {
|
||||||
await doQuickLogin(page, 'admin', 'inventree');
|
await doQuickLogin(page, 'admin', 'inventree');
|
||||||
|
|
||||||
// use server info
|
// use server info
|
||||||
|
@ -2,7 +2,7 @@ import { test } from '../baseFixtures.ts';
|
|||||||
import { baseUrl } from '../defaults.ts';
|
import { baseUrl } from '../defaults.ts';
|
||||||
import { doQuickLogin } from '../login.ts';
|
import { doQuickLogin } from '../login.ts';
|
||||||
|
|
||||||
test('PUI - Pages - Build Order', async ({ page }) => {
|
test('Pages - Build Order', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/`);
|
await page.goto(`${baseUrl}/part/`);
|
||||||
@ -82,7 +82,7 @@ test('PUI - Pages - Build Order', async ({ page }) => {
|
|||||||
.waitFor();
|
.waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Build Order - Build Outputs', async ({ page }) => {
|
test('Pages - Build Order - Build Outputs', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/`);
|
await page.goto(`${baseUrl}/part/`);
|
||||||
|
@ -3,7 +3,7 @@ import { doQuickLogin } from '../login.js';
|
|||||||
|
|
||||||
const newPartName = 'UITESTIN123';
|
const newPartName = 'UITESTIN123';
|
||||||
|
|
||||||
test('PUI - Pages - Index - Playground', async ({ page }) => {
|
test('Pages - Index - Playground', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto('./');
|
await page.goto('./');
|
||||||
@ -72,7 +72,7 @@ test('PUI - Pages - Index - Playground', async ({ page }) => {
|
|||||||
await page.getByText('Attention needed').waitFor();
|
await page.getByText('Attention needed').waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Dashboard', async ({ page }) => {
|
test('Pages - Index - Dashboard', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Dashboard auto update
|
// Dashboard auto update
|
||||||
|
@ -2,7 +2,7 @@ import { test } from '../baseFixtures.ts';
|
|||||||
import { baseUrl } from '../defaults.ts';
|
import { baseUrl } from '../defaults.ts';
|
||||||
import { doQuickLogin } from '../login.ts';
|
import { doQuickLogin } from '../login.ts';
|
||||||
|
|
||||||
test('PUI - Sales Orders', async ({ page }) => {
|
test('Sales Orders', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/home`);
|
await page.goto(`${baseUrl}/home`);
|
||||||
@ -41,7 +41,7 @@ test('PUI - Sales Orders', async ({ page }) => {
|
|||||||
await page.getByRole('button', { name: 'Issue Order' }).waitFor();
|
await page.getByRole('button', { name: 'Issue Order' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Purchase Orders', async ({ page }) => {
|
test('Purchase Orders', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/home`);
|
await page.goto(`${baseUrl}/home`);
|
||||||
@ -61,7 +61,7 @@ test('PUI - Purchase Orders', async ({ page }) => {
|
|||||||
await page.getByRole('button', { name: 'Issue Order' }).waitFor();
|
await page.getByRole('button', { name: 'Issue Order' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Purchase Orders - Barcodes', async ({ page }) => {
|
test('Purchase Orders - Barcodes', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/purchasing/purchase-order/13/detail`);
|
await page.goto(`${baseUrl}/purchasing/purchase-order/13/detail`);
|
||||||
|
@ -2,7 +2,7 @@ import { test } from '../baseFixtures';
|
|||||||
import { baseUrl } from '../defaults';
|
import { baseUrl } from '../defaults';
|
||||||
import { doQuickLogin } from '../login';
|
import { doQuickLogin } from '../login';
|
||||||
|
|
||||||
test('PUI - Pages - Part - Locking', async ({ page }) => {
|
test('Pages - Part - Locking', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Navigate to a known assembly which is *not* locked
|
// Navigate to a known assembly which is *not* locked
|
||||||
@ -23,7 +23,7 @@ test('PUI - Pages - Part - Locking', async ({ page }) => {
|
|||||||
await page.getByText('Part parameters cannot be').waitFor();
|
await page.getByText('Part parameters cannot be').waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Pricing (Nothing, BOM)', async ({ page }) => {
|
test('Pages - Part - Pricing (Nothing, BOM)', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Part with no history
|
// Part with no history
|
||||||
@ -72,7 +72,7 @@ test('PUI - Pages - Part - Pricing (Nothing, BOM)', async ({ page }) => {
|
|||||||
await page.waitForURL('**/part/98/**');
|
await page.waitForURL('**/part/98/**');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Pricing (Supplier)', async ({ page }) => {
|
test('Pages - Part - Pricing (Supplier)', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Part
|
// Part
|
||||||
@ -98,7 +98,7 @@ test('PUI - Pages - Part - Pricing (Supplier)', async ({ page }) => {
|
|||||||
// await page.waitForURL('**/purchasing/supplier-part/697/');
|
// await page.waitForURL('**/purchasing/supplier-part/697/');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Pricing (Variant)', async ({ page }) => {
|
test('Pages - Part - Pricing (Variant)', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Part
|
// Part
|
||||||
@ -124,7 +124,7 @@ test('PUI - Pages - Part - Pricing (Variant)', async ({ page }) => {
|
|||||||
await page.waitForURL('**/part/109/**');
|
await page.waitForURL('**/part/109/**');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Pricing (Internal)', async ({ page }) => {
|
test('Pages - Part - Pricing (Internal)', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Part
|
// Part
|
||||||
@ -149,7 +149,7 @@ test('PUI - Pages - Part - Pricing (Internal)', async ({ page }) => {
|
|||||||
await page.getByText('Part *M2x4 SHCSSocket head').click();
|
await page.getByText('Part *M2x4 SHCSSocket head').click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Pricing (Purchase)', async ({ page }) => {
|
test('Pages - Part - Pricing (Purchase)', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Part
|
// Part
|
||||||
@ -171,7 +171,7 @@ test('PUI - Pages - Part - Pricing (Purchase)', async ({ page }) => {
|
|||||||
await page.getByText('2022-04-29').waitFor();
|
await page.getByText('2022-04-29').waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Attachments', async ({ page }) => {
|
test('Pages - Part - Attachments', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/69/attachments`);
|
await page.goto(`${baseUrl}/part/69/attachments`);
|
||||||
@ -193,7 +193,7 @@ test('PUI - Pages - Part - Attachments', async ({ page }) => {
|
|||||||
await page.getByRole('button', { name: 'Cancel' }).click();
|
await page.getByRole('button', { name: 'Cancel' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Parameters', async ({ page }) => {
|
test('Pages - Part - Parameters', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/69/parameters`);
|
await page.goto(`${baseUrl}/part/69/parameters`);
|
||||||
@ -220,7 +220,7 @@ test('PUI - Pages - Part - Parameters', async ({ page }) => {
|
|||||||
await page.getByRole('button', { name: 'Cancel' }).click();
|
await page.getByRole('button', { name: 'Cancel' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Notes', async ({ page }) => {
|
test('Pages - Part - Notes', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/69/notes`);
|
await page.goto(`${baseUrl}/part/69/notes`);
|
||||||
@ -241,7 +241,7 @@ test('PUI - Pages - Part - Notes', async ({ page }) => {
|
|||||||
await page.getByLabel('Save Notes').waitFor();
|
await page.getByLabel('Save Notes').waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - 404', async ({ page }) => {
|
test('Pages - Part - 404', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/99999/`);
|
await page.goto(`${baseUrl}/part/99999/`);
|
||||||
@ -251,7 +251,7 @@ test('PUI - Pages - Part - 404', async ({ page }) => {
|
|||||||
await page.evaluate(() => console.clear());
|
await page.evaluate(() => console.clear());
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Part - Revision', async ({ page }) => {
|
test('Pages - Part - Revision', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/906/details`);
|
await page.goto(`${baseUrl}/part/906/details`);
|
||||||
|
@ -24,7 +24,7 @@ async function defaultScanTest(page, search_text) {
|
|||||||
await page.getByRole('button', { name: 'Lookup part' }).click();
|
await page.getByRole('button', { name: 'Lookup part' }).click();
|
||||||
}
|
}
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (Part)', async ({ page }) => {
|
test('Pages - Index - Scan (Part)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"part": 1}');
|
await defaultScanTest(page, '{"part": 1}');
|
||||||
|
|
||||||
// part: 1
|
// part: 1
|
||||||
@ -33,7 +33,7 @@ test('PUI - Pages - Index - Scan (Part)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'part' }).waitFor();
|
await page.getByRole('cell', { name: 'part' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (Stockitem)', async ({ page }) => {
|
test('Pages - Index - Scan (Stockitem)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"stockitem": 408}');
|
await defaultScanTest(page, '{"stockitem": 408}');
|
||||||
|
|
||||||
// stockitem: 408
|
// stockitem: 408
|
||||||
@ -42,7 +42,7 @@ test('PUI - Pages - Index - Scan (Stockitem)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'Quantity: 100' }).waitFor();
|
await page.getByRole('cell', { name: 'Quantity: 100' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (StockLocation)', async ({ page }) => {
|
test('Pages - Index - Scan (StockLocation)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"stocklocation": 3}');
|
await defaultScanTest(page, '{"stocklocation": 3}');
|
||||||
|
|
||||||
// stocklocation: 3
|
// stocklocation: 3
|
||||||
@ -51,7 +51,7 @@ test('PUI - Pages - Index - Scan (StockLocation)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'stocklocation' }).waitFor();
|
await page.getByRole('cell', { name: 'stocklocation' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (SupplierPart)', async ({ page }) => {
|
test('Pages - Index - Scan (SupplierPart)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"supplierpart": 204}');
|
await defaultScanTest(page, '{"supplierpart": 204}');
|
||||||
|
|
||||||
// supplierpart: 204
|
// supplierpart: 204
|
||||||
@ -60,7 +60,7 @@ test('PUI - Pages - Index - Scan (SupplierPart)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'supplierpart' }).waitFor();
|
await page.getByRole('cell', { name: 'supplierpart' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (PurchaseOrder)', async ({ page }) => {
|
test('Pages - Index - Scan (PurchaseOrder)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"purchaseorder": 12}');
|
await defaultScanTest(page, '{"purchaseorder": 12}');
|
||||||
|
|
||||||
// purchaseorder: 12
|
// purchaseorder: 12
|
||||||
@ -69,7 +69,7 @@ test('PUI - Pages - Index - Scan (PurchaseOrder)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'purchaseorder' }).waitFor();
|
await page.getByRole('cell', { name: 'purchaseorder' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (SalesOrder)', async ({ page }) => {
|
test('Pages - Index - Scan (SalesOrder)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"salesorder": 6}');
|
await defaultScanTest(page, '{"salesorder": 6}');
|
||||||
|
|
||||||
// salesorder: 6
|
// salesorder: 6
|
||||||
@ -78,7 +78,7 @@ test('PUI - Pages - Index - Scan (SalesOrder)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'salesorder' }).waitFor();
|
await page.getByRole('cell', { name: 'salesorder' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (Build)', async ({ page }) => {
|
test('Pages - Index - Scan (Build)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"build": 8}');
|
await defaultScanTest(page, '{"build": 8}');
|
||||||
|
|
||||||
// build: 8
|
// build: 8
|
||||||
@ -87,7 +87,7 @@ test('PUI - Pages - Index - Scan (Build)', async ({ page }) => {
|
|||||||
await page.getByRole('cell', { name: 'build', exact: true }).waitFor();
|
await page.getByRole('cell', { name: 'build', exact: true }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Pages - Index - Scan (General)', async ({ page }) => {
|
test('Pages - Index - Scan (General)', async ({ page }) => {
|
||||||
await defaultScanTest(page, '{"unknown": 312}');
|
await defaultScanTest(page, '{"unknown": 312}');
|
||||||
await page.getByText('"unknown": 312').waitFor();
|
await page.getByText('"unknown": 312').waitFor();
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { expect, test } from './baseFixtures.js';
|
|||||||
import { baseUrl, user } from './defaults.js';
|
import { baseUrl, user } from './defaults.js';
|
||||||
import { doLogin, doQuickLogin } from './login.js';
|
import { doLogin, doQuickLogin } from './login.js';
|
||||||
|
|
||||||
test('PUI - Basic Login Test', async ({ page }) => {
|
test('Basic Login Test', async ({ page }) => {
|
||||||
await doLogin(page);
|
await doLogin(page);
|
||||||
|
|
||||||
// Check that the username is provided
|
// Check that the username is provided
|
||||||
@ -35,7 +35,7 @@ test('PUI - Basic Login Test', async ({ page }) => {
|
|||||||
await page.getByLabel('username');
|
await page.getByLabel('username');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Quick Login Test', async ({ page }) => {
|
test('Quick Login Test', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Check that the username is provided
|
// Check that the username is provided
|
||||||
|
@ -2,7 +2,7 @@ import { systemKey, test } from './baseFixtures.js';
|
|||||||
import { baseUrl } from './defaults.js';
|
import { baseUrl } from './defaults.js';
|
||||||
import { doQuickLogin } from './login.js';
|
import { doQuickLogin } from './login.js';
|
||||||
|
|
||||||
test('PUI - Quick Command', async ({ page }) => {
|
test('Quick Command', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Open Spotlight with Keyboard Shortcut
|
// Open Spotlight with Keyboard Shortcut
|
||||||
@ -31,7 +31,7 @@ test('PUI - Quick Command', async ({ page }) => {
|
|||||||
await page.waitForURL('**/platform/dashboard');
|
await page.waitForURL('**/platform/dashboard');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Quick Command - No Keys', async ({ page }) => {
|
test('Quick Command - No Keys', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Open Spotlight with Button
|
// Open Spotlight with Button
|
||||||
|
127
src/frontend/tests/pui_forms.spec.ts
Normal file
127
src/frontend/tests/pui_forms.spec.ts
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/** Unit tests for form validation, rendering, etc */
|
||||||
|
import test from 'playwright/test';
|
||||||
|
|
||||||
|
import { baseUrl } from './defaults';
|
||||||
|
import { doQuickLogin } from './login';
|
||||||
|
|
||||||
|
test('Forms - Stock Item Validation', async ({ page }) => {
|
||||||
|
await doQuickLogin(page, 'steven', 'wizardstaff');
|
||||||
|
await page.goto(`${baseUrl}/stock/location/index/stock-items`);
|
||||||
|
await page.waitForURL('**/platform/stock/location/**');
|
||||||
|
|
||||||
|
// Create new stock item form
|
||||||
|
await page.getByLabel('action-button-add-stock-item').click();
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
|
||||||
|
// Check for validation errors
|
||||||
|
await page.getByText('Form Error').waitFor();
|
||||||
|
await page.getByText('Errors exist for one or more form fields').waitFor();
|
||||||
|
await page.getByText('Valid part must be supplied').waitFor();
|
||||||
|
|
||||||
|
// Adjust other field - the errors should persist
|
||||||
|
await page.getByLabel('text-field-batch').fill('BATCH-123');
|
||||||
|
await page.waitForTimeout(250);
|
||||||
|
|
||||||
|
await page.getByText('Valid part must be supplied').waitFor();
|
||||||
|
|
||||||
|
// Fill out fields
|
||||||
|
await page.getByLabel('number-field-quantity').fill('-1');
|
||||||
|
await page.getByLabel('related-field-part').click();
|
||||||
|
await page.getByRole('option', { name: /1551AGY/ }).click();
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
|
||||||
|
// Check for validation errors
|
||||||
|
await page.getByText('Errors exist for one or more form fields').waitFor();
|
||||||
|
await page
|
||||||
|
.getByText(/Ensure this value is greater than or equal to 0/)
|
||||||
|
.first()
|
||||||
|
.waitFor();
|
||||||
|
|
||||||
|
// Set location
|
||||||
|
await page.getByLabel('related-field-location').click();
|
||||||
|
await page.getByRole('option', { name: /Electronics Lab/ }).click();
|
||||||
|
|
||||||
|
// Create the stock item
|
||||||
|
await page.getByLabel('number-field-quantity').fill('123');
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
|
||||||
|
// Edit the resulting stock item
|
||||||
|
await page.getByLabel('action-menu-stock-item-actions').click();
|
||||||
|
await page.getByLabel('action-menu-stock-item-actions-edit').click();
|
||||||
|
|
||||||
|
await page.getByLabel('number-field-purchase_price').fill('-1');
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
await page.getByText('Errors exist for one or more form fields').waitFor();
|
||||||
|
await page
|
||||||
|
.getByText('Ensure this value is greater than or equal to 0')
|
||||||
|
.waitFor();
|
||||||
|
|
||||||
|
// Check the error message still persists after editing a different field
|
||||||
|
await page.getByLabel('text-field-packaging').fill('a box');
|
||||||
|
await page.waitForTimeout(250);
|
||||||
|
await page
|
||||||
|
.getByText('Ensure this value is greater than or equal to 0')
|
||||||
|
.waitFor();
|
||||||
|
|
||||||
|
// Correct the price
|
||||||
|
await page.getByLabel('number-field-purchase_price').fill('1.2345');
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
await page.getByText('Item Updated').waitFor();
|
||||||
|
|
||||||
|
// Ensure the stock item has been updated correctly
|
||||||
|
await page.getByText('$151.8435').waitFor();
|
||||||
|
await page.getByText('$151.8435').waitFor();
|
||||||
|
await page.getByText('a box').waitFor();
|
||||||
|
await page.getByRole('cell', { name: 'Electronics Lab' }).waitFor();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Forms - Supplier Validation', async ({ page, request }) => {
|
||||||
|
await doQuickLogin(page, 'steven', 'wizardstaff');
|
||||||
|
await page.goto(`${baseUrl}/purchasing/index/suppliers`);
|
||||||
|
await page.waitForURL('**/purchasing/index/**');
|
||||||
|
|
||||||
|
await page.getByLabel('action-button-add-company').click();
|
||||||
|
await page.getByLabel('text-field-website').fill('not-a-website');
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
|
||||||
|
// Check for validation errors
|
||||||
|
await page.getByText('Form Error').waitFor();
|
||||||
|
await page.getByText('Errors exist for one or more').waitFor();
|
||||||
|
await page.getByText('This field may not be blank.').waitFor();
|
||||||
|
await page.getByText('Enter a valid URL.').waitFor();
|
||||||
|
|
||||||
|
// Fill out another field, expect that the errors persist
|
||||||
|
await page.getByLabel('text-field-description').fill('A description');
|
||||||
|
await page.waitForTimeout(250);
|
||||||
|
await page.getByText('This field may not be blank.').waitFor();
|
||||||
|
await page.getByText('Enter a valid URL.').waitFor();
|
||||||
|
|
||||||
|
// Generate a unique supplier name
|
||||||
|
const supplierName = `Supplier ${new Date().getTime()}`;
|
||||||
|
|
||||||
|
// Fill with good data
|
||||||
|
await page
|
||||||
|
.getByLabel('text-field-website')
|
||||||
|
.fill('https://www.test-website.co.uk');
|
||||||
|
await page.getByLabel('text-field-name').fill(supplierName);
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
|
||||||
|
await page.getByText(supplierName).waitFor();
|
||||||
|
await page
|
||||||
|
.getByRole('link', { name: 'https://www.test-website.co.uk' })
|
||||||
|
.waitFor();
|
||||||
|
|
||||||
|
// Now, try to create another new supplier with the same name
|
||||||
|
await page.goto(`${baseUrl}/purchasing/index/suppliers`);
|
||||||
|
await page.waitForURL('**/purchasing/index/**');
|
||||||
|
await page.getByLabel('action-button-add-company').click();
|
||||||
|
await page.getByLabel('text-field-name').fill(supplierName);
|
||||||
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
|
|
||||||
|
// Is prevented, due to uniqueness requirements
|
||||||
|
await page
|
||||||
|
.getByText('Company with this Company name and Email already exists')
|
||||||
|
.waitFor();
|
||||||
|
await page.getByRole('button', { name: 'Cancel' }).click();
|
||||||
|
});
|
@ -2,7 +2,7 @@ import { test } from './baseFixtures.js';
|
|||||||
import { baseUrl } from './defaults.js';
|
import { baseUrl } from './defaults.js';
|
||||||
import { doQuickLogin } from './login.js';
|
import { doQuickLogin } from './login.js';
|
||||||
|
|
||||||
test('PUI - Parts', async ({ page }) => {
|
test('Parts', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/home`);
|
await page.goto(`${baseUrl}/home`);
|
||||||
@ -42,7 +42,7 @@ test('PUI - Parts', async ({ page }) => {
|
|||||||
await page.getByRole('tab', { name: 'Build Orders' }).click();
|
await page.getByRole('tab', { name: 'Build Orders' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Parts - Manufacturer Parts', async ({ page }) => {
|
test('Parts - Manufacturer Parts', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/84/manufacturers`);
|
await page.goto(`${baseUrl}/part/84/manufacturers`);
|
||||||
@ -55,7 +55,7 @@ test('PUI - Parts - Manufacturer Parts', async ({ page }) => {
|
|||||||
await page.getByText('1551ACLR - 1551ACLR').waitFor();
|
await page.getByText('1551ACLR - 1551ACLR').waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Parts - Supplier Parts', async ({ page }) => {
|
test('Parts - Supplier Parts', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/part/15/suppliers`);
|
await page.goto(`${baseUrl}/part/15/suppliers`);
|
||||||
@ -68,7 +68,7 @@ test('PUI - Parts - Supplier Parts', async ({ page }) => {
|
|||||||
await page.getByText('DIG-84670-SJI - R_550R_0805_1%').waitFor();
|
await page.getByText('DIG-84670-SJI - R_550R_0805_1%').waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Sales', async ({ page }) => {
|
test('Sales', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/sales/index/`);
|
await page.goto(`${baseUrl}/sales/index/`);
|
||||||
@ -119,7 +119,7 @@ test('PUI - Sales', async ({ page }) => {
|
|||||||
await page.getByRole('tab', { name: 'Notes' }).click();
|
await page.getByRole('tab', { name: 'Notes' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Scanning', async ({ page }) => {
|
test('Scanning', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.getByLabel('Homenav').click();
|
await page.getByLabel('Homenav').click();
|
||||||
@ -140,7 +140,7 @@ test('PUI - Scanning', async ({ page }) => {
|
|||||||
await page.getByRole('option', { name: 'Manual input' }).click();
|
await page.getByRole('option', { name: 'Manual input' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Language / Color', async ({ page }) => {
|
test('Language / Color', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Ally Access' }).click();
|
await page.getByRole('button', { name: 'Ally Access' }).click();
|
||||||
@ -174,7 +174,7 @@ test('PUI - Language / Color', async ({ page }) => {
|
|||||||
await page.waitForURL('**/platform/dashboard');
|
await page.waitForURL('**/platform/dashboard');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Company', async ({ page }) => {
|
test('Company', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/company/1/details`);
|
await page.goto(`${baseUrl}/company/1/details`);
|
||||||
|
@ -8,7 +8,7 @@ import { setPluginState } from './settings.js';
|
|||||||
* Select a number of stock items from the table,
|
* Select a number of stock items from the table,
|
||||||
* and print labels against them
|
* and print labels against them
|
||||||
*/
|
*/
|
||||||
test('PUI - Label Printing', async ({ page }) => {
|
test('Label Printing', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/stock/location/index/`);
|
await page.goto(`${baseUrl}/stock/location/index/`);
|
||||||
@ -52,7 +52,7 @@ test('PUI - Label Printing', async ({ page }) => {
|
|||||||
* Navigate to a PurchaseOrder detail page,
|
* Navigate to a PurchaseOrder detail page,
|
||||||
* and print a report against it.
|
* and print a report against it.
|
||||||
*/
|
*/
|
||||||
test('PUI - Report Printing', async ({ page }) => {
|
test('Report Printing', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/stock/location/index/`);
|
await page.goto(`${baseUrl}/stock/location/index/`);
|
||||||
@ -82,7 +82,7 @@ test('PUI - Report Printing', async ({ page }) => {
|
|||||||
await page.context().close();
|
await page.context().close();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Report Editing', async ({ page, request }) => {
|
test('Report Editing', async ({ page, request }) => {
|
||||||
const [username, password] = ['admin', 'inventree'];
|
const [username, password] = ['admin', 'inventree'];
|
||||||
await doQuickLogin(page, username, password);
|
await doQuickLogin(page, username, password);
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { apiUrl, baseUrl } from './defaults.js';
|
|||||||
import { doQuickLogin } from './login.js';
|
import { doQuickLogin } from './login.js';
|
||||||
import { setSettingState } from './settings.js';
|
import { setSettingState } from './settings.js';
|
||||||
|
|
||||||
test('PUI - Admin', async ({ page }) => {
|
test('Admin', async ({ page }) => {
|
||||||
// Note here we login with admin access
|
// Note here we login with admin access
|
||||||
await doQuickLogin(page, 'admin', 'inventree');
|
await doQuickLogin(page, 'admin', 'inventree');
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ test('PUI - Admin', async ({ page }) => {
|
|||||||
await page.getByRole('button', { name: 'Submit' }).click();
|
await page.getByRole('button', { name: 'Submit' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Admin - Barcode History', async ({ page, request }) => {
|
test('Admin - Barcode History', async ({ page, request }) => {
|
||||||
// Login with admin credentials
|
// Login with admin credentials
|
||||||
await doQuickLogin(page, 'admin', 'inventree');
|
await doQuickLogin(page, 'admin', 'inventree');
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ test('PUI - Admin - Barcode History', async ({ page, request }) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Admin - Unauthorized', async ({ page }) => {
|
test('Admin - Unauthorized', async ({ page }) => {
|
||||||
// Try to access "admin" page with a non-staff user
|
// Try to access "admin" page with a non-staff user
|
||||||
await doQuickLogin(page, 'allaccess', 'nolimits');
|
await doQuickLogin(page, 'allaccess', 'nolimits');
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { test } from './baseFixtures.js';
|
|||||||
import { baseUrl } from './defaults.js';
|
import { baseUrl } from './defaults.js';
|
||||||
import { doQuickLogin } from './login.js';
|
import { doQuickLogin } from './login.js';
|
||||||
|
|
||||||
test('PUI - Stock', async ({ page }) => {
|
test('Stock', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/stock/location/index/`);
|
await page.goto(`${baseUrl}/stock/location/index/`);
|
||||||
@ -32,7 +32,7 @@ test('PUI - Stock', async ({ page }) => {
|
|||||||
await page.getByRole('tab', { name: 'Installed Items' }).click();
|
await page.getByRole('tab', { name: 'Installed Items' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Purchasing', async ({ page }) => {
|
test('Purchasing', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
||||||
@ -82,7 +82,7 @@ test('PUI - Purchasing', async ({ page }) => {
|
|||||||
await page.getByRole('tab', { name: 'Details' }).waitFor();
|
await page.getByRole('tab', { name: 'Details' }).waitFor();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Stock Location Tree', async ({ page }) => {
|
test('Stock Location Tree', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
await page.goto(`${baseUrl}/stock/location/index/`);
|
await page.goto(`${baseUrl}/stock/location/index/`);
|
||||||
|
@ -20,7 +20,7 @@ const clearFilters = async (page) => {
|
|||||||
await page.getByLabel('filter-drawer-close').click();
|
await page.getByLabel('filter-drawer-close').click();
|
||||||
};
|
};
|
||||||
|
|
||||||
test('PUI - Tables - Filters', async ({ page }) => {
|
test('Tables - Filters', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Head to the "build order list" page
|
// Head to the "build order list" page
|
||||||
@ -50,7 +50,7 @@ test('PUI - Tables - Filters', async ({ page }) => {
|
|||||||
await clearFilters(page);
|
await clearFilters(page);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('PUI - Tables - Columns', async ({ page }) => {
|
test('Tables - Columns', async ({ page }) => {
|
||||||
await doQuickLogin(page);
|
await doQuickLogin(page);
|
||||||
|
|
||||||
// Go to the "stock list" page
|
// Go to the "stock list" page
|
||||||
|
Loading…
x
Reference in New Issue
Block a user