mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 13:15:43 +00:00 
			
		
		
		
	[PUI] Order Parts Wizard (#8602)
* Add generic <WizardDrawer /> * Add a wizard hook - Similar to existing modal form hook * Slight refactor * Simple placeholder table * Only purchaseable parts * Add callback to remove selected part * Add step enum * Improve wizard * Render supplier image * Add validation checks for wizard * Further wizard improvements * add error support * Improvements * Refactoring * Add error checking * Order from part detail page * Implement from SalesOrder view * Implement from build line table * Implement from StockItem table * Add to StockDetail page * Cleanup PartTable * Refactor to use DataTable interface * Simplify wizard into single step * Refactoring * Allow creation of new supplier part * Cleanup * Refactor <PartDetail> * Fix static hook issue * Fix infinite useEffect * Playwright tests
This commit is contained in:
		| @@ -1,4 +1,5 @@ | ||||
| import { test } from '../baseFixtures.ts'; | ||||
| import { baseUrl } from '../defaults.ts'; | ||||
| import { clickButtonIfVisible, openFilterDrawer } from '../helpers.ts'; | ||||
| import { doQuickLogin } from '../login.ts'; | ||||
|  | ||||
| @@ -76,6 +77,83 @@ test('Purchase Orders - Filters', async ({ page }) => { | ||||
|   await page.getByRole('option', { name: 'Target Date After' }).waitFor(); | ||||
| }); | ||||
|  | ||||
| test('Purchase Orders - Order Parts', async ({ page }) => { | ||||
|   await doQuickLogin(page); | ||||
|  | ||||
|   // Open "Order Parts" wizard from the "parts" table | ||||
|   await page.getByRole('tab', { name: 'Parts' }).click(); | ||||
|   await page | ||||
|     .getByLabel('panel-tabs-partcategory') | ||||
|     .getByRole('tab', { name: 'Parts' }) | ||||
|     .click(); | ||||
|  | ||||
|   // Select multiple parts | ||||
|   for (let ii = 1; ii < 5; ii++) { | ||||
|     await page.getByLabel(`Select record ${ii}`, { exact: true }).click(); | ||||
|   } | ||||
|  | ||||
|   await page.getByLabel('action-menu-part-actions').click(); | ||||
|   await page.getByLabel('action-menu-part-actions-order-parts').click(); | ||||
|   await page | ||||
|     .getByRole('heading', { name: 'Order Parts' }) | ||||
|     .locator('div') | ||||
|     .first() | ||||
|     .waitFor(); | ||||
|   await page.getByRole('banner').getByRole('button').click(); | ||||
|  | ||||
|   // Open "Order Parts" wizard from the "Stock Items" table | ||||
|   await page.getByRole('tab', { name: 'Stock' }).click(); | ||||
|   await page.getByRole('tab', { name: 'Stock Items' }).click(); | ||||
|  | ||||
|   // Select multiple stock items | ||||
|   for (let ii = 2; ii < 7; ii += 2) { | ||||
|     await page.getByLabel(`Select record ${ii}`, { exact: true }).click(); | ||||
|   } | ||||
|  | ||||
|   await page | ||||
|     .getByLabel('Stock Items') | ||||
|     .getByLabel('action-menu-stock-actions') | ||||
|     .click(); | ||||
|   await page.getByLabel('action-menu-stock-actions-order-stock').click(); | ||||
|   await page.getByRole('banner').getByRole('button').click(); | ||||
|  | ||||
|   // Order from the part detail page | ||||
|   await page.goto(`${baseUrl}/part/69/`); | ||||
|   await page.waitForURL('**/part/69/**'); | ||||
|  | ||||
|   await page.getByLabel('action-menu-stock-actions').click(); | ||||
|   await page.getByLabel('action-menu-stock-actions-order').click(); | ||||
|  | ||||
|   // Select supplier part | ||||
|   await page.getByLabel('related-field-supplier_part').click(); | ||||
|   await page.getByText('WM1731-ND').click(); | ||||
|  | ||||
|   // Option to create a new supplier part | ||||
|   await page.getByLabel('action-button-new-supplier-part').click(); | ||||
|   await page.getByLabel('related-field-supplier', { exact: true }).click(); | ||||
|   await page.getByText('Future').click(); | ||||
|   await page.getByRole('button', { name: 'Cancel' }).click(); | ||||
|  | ||||
|   // Select purchase order | ||||
|   await page.getByLabel('related-field-purchase_order').click(); | ||||
|   await page.getByText('PO0001').click(); | ||||
|  | ||||
|   // Option to create a new purchase order | ||||
|   await page.getByLabel('action-button-new-purchase-order').click(); | ||||
|   await page.getByLabel('related-field-project_code').click(); | ||||
|   await page.getByText('PRJ-PHO').click(); | ||||
|   await page.getByRole('button', { name: 'Cancel' }).click(); | ||||
|  | ||||
|   // Add the part to the purchase order | ||||
|   await page.getByLabel('action-button-add-to-selected').click(); | ||||
|   await page.getByLabel('number-field-quantity').fill('100'); | ||||
|   await page.waitForTimeout(250); | ||||
|   await page.getByRole('button', { name: 'Submit' }).click(); | ||||
|   await page | ||||
|     .getByText('All selected parts added to a purchase order') | ||||
|     .waitFor(); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * Tests for receiving items against a purchase order | ||||
|  */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user