mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-03 22:55:43 +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:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user