mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	Use ref pattern on PO duplicate (#9100)
* use ref pattern on PO duplicate * use ref patterns on duplicate for other types of orders * revert unintentional change to pre-commit * add playwright tests --------- Co-authored-by: Oliver <oliver.henry.walters@gmail.com>
This commit is contained in:
		| @@ -381,14 +381,20 @@ export default function BuildDetail() { | ||||
|     onFormSuccess: refreshInstance | ||||
|   }); | ||||
|  | ||||
|   const duplicateBuildOrderInitialData = useMemo(() => { | ||||
|     const data = { ...build }; | ||||
|     // if we set the reference to null/undefined, it will be left blank in the form | ||||
|     // if we omit the reference altogether, it will be auto-generated via reference pattern | ||||
|     // from the OPTIONS response | ||||
|     delete data.reference; | ||||
|     return data; | ||||
|   }, [build]); | ||||
|  | ||||
|   const duplicateBuild = useCreateApiFormModal({ | ||||
|     url: ApiEndpoints.build_order_list, | ||||
|     title: t`Add Build Order`, | ||||
|     fields: buildOrderFields, | ||||
|     initialData: { | ||||
|       ...build, | ||||
|       reference: undefined | ||||
|     }, | ||||
|     initialData: duplicateBuildOrderInitialData, | ||||
|     follow: true, | ||||
|     modelType: ModelType.build | ||||
|   }); | ||||
|   | ||||
| @@ -94,14 +94,20 @@ export default function PurchaseOrderDetail() { | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   const duplicatePurchaseOrderInitialData = useMemo(() => { | ||||
|     const data = { ...order }; | ||||
|     // if we set the reference to null/undefined, it will be left blank in the form | ||||
|     // if we omit the reference altogether, it will be auto-generated via reference pattern | ||||
|     // from the OPTIONS response | ||||
|     delete data.reference; | ||||
|     return data; | ||||
|   }, [order]); | ||||
|  | ||||
|   const duplicatePurchaseOrder = useCreateApiFormModal({ | ||||
|     url: ApiEndpoints.purchase_order_list, | ||||
|     title: t`Add Purchase Order`, | ||||
|     fields: duplicatePurchaseOrderFields, | ||||
|     initialData: { | ||||
|       ...order, | ||||
|       reference: undefined | ||||
|     }, | ||||
|     initialData: duplicatePurchaseOrderInitialData, | ||||
|     follow: true, | ||||
|     modelType: ModelType.purchaseorder | ||||
|   }); | ||||
|   | ||||
| @@ -344,14 +344,20 @@ export default function ReturnOrderDetail() { | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   const duplicateReturnOrderInitialData = useMemo(() => { | ||||
|     const data = { ...order }; | ||||
|     // if we set the reference to null/undefined, it will be left blank in the form | ||||
|     // if we omit the reference altogether, it will be auto-generated via reference pattern | ||||
|     // from the OPTIONS response | ||||
|     delete data.reference; | ||||
|     return data; | ||||
|   }, [order]); | ||||
|  | ||||
|   const duplicateReturnOrder = useCreateApiFormModal({ | ||||
|     url: ApiEndpoints.return_order_list, | ||||
|     title: t`Add Return Order`, | ||||
|     fields: duplicateReturnOrderFields, | ||||
|     initialData: { | ||||
|       ...order, | ||||
|       reference: undefined | ||||
|     }, | ||||
|     initialData: duplicateReturnOrderInitialData, | ||||
|     modelType: ModelType.returnorder, | ||||
|     follow: true | ||||
|   }); | ||||
|   | ||||
| @@ -287,14 +287,20 @@ export default function SalesOrderDetail() { | ||||
|     duplicateOrderId: order.pk | ||||
|   }); | ||||
|  | ||||
|   const duplicateSalesOrderInitialData = useMemo(() => { | ||||
|     const data = { ...order }; | ||||
|     // if we set the reference to null/undefined, it will be left blank in the form | ||||
|     // if we omit the reference altogether, it will be auto-generated via reference pattern | ||||
|     // from the OPTIONS response | ||||
|     delete data.reference; | ||||
|     return data; | ||||
|   }, [order]); | ||||
|  | ||||
|   const duplicateSalesOrder = useCreateApiFormModal({ | ||||
|     url: ApiEndpoints.sales_order_list, | ||||
|     title: t`Add Sales Order`, | ||||
|     fields: duplicateOrderFields, | ||||
|     initialData: { | ||||
|       ...order, | ||||
|       reference: undefined | ||||
|     }, | ||||
|     initialData: duplicateSalesOrderInitialData, | ||||
|     follow: true, | ||||
|     modelType: ModelType.salesorder | ||||
|   }); | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import { expect } from '@playwright/test'; | ||||
| import { test } from '../baseFixtures.ts'; | ||||
| import { | ||||
|   clearTableFilters, | ||||
| @@ -325,3 +326,22 @@ test('Build Order - Filters', async ({ page }) => { | ||||
|   await page.getByText('On Hold').first().waitFor(); | ||||
|   await page.getByText('Pending Approval').first().waitFor(); | ||||
| }); | ||||
|  | ||||
| test('Build Order - Duplicate', async ({ page }) => { | ||||
|   await doQuickLogin(page); | ||||
|  | ||||
|   await navigate(page, 'manufacturing/build-order/24/details'); | ||||
|   await page.getByLabel('action-menu-build-order-').click(); | ||||
|   await page.getByLabel('action-menu-build-order-actions-duplicate').click(); | ||||
|  | ||||
|   // Ensure a new reference is suggested | ||||
|   await expect(page.getByLabel('text-field-reference')).not.toBeEmpty(); | ||||
|  | ||||
|   // Submit the duplicate request and ensure it completes | ||||
|   await page.getByRole('button', { name: 'Submit' }).isEnabled(); | ||||
|   await page.getByRole('button', { name: 'Submit' }).click(); | ||||
|   await page.getByRole('tab', { name: 'Build Details' }).waitFor(); | ||||
|   await page.getByRole('tab', { name: 'Build Details' }).click(); | ||||
|  | ||||
|   await page.getByText('Pending').first().waitFor(); | ||||
| }); | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import { expect } from '@playwright/test'; | ||||
| import { test } from '../baseFixtures.ts'; | ||||
| import { | ||||
|   clearTableFilters, | ||||
| @@ -321,3 +322,22 @@ test('Purchase Orders - Receive Items', async ({ page }) => { | ||||
|   await page.getByRole('cell', { name: 'my-batch-code' }).first().waitFor(); | ||||
|   await page.getByRole('cell', { name: 'bucket' }).first().waitFor(); | ||||
| }); | ||||
|  | ||||
| test('Purchase Orders - Duplicate', async ({ page }) => { | ||||
|   await doQuickLogin(page); | ||||
|  | ||||
|   await navigate(page, 'purchasing/purchase-order/13/detail'); | ||||
|   await page.getByLabel('action-menu-order-actions').click(); | ||||
|   await page.getByLabel('action-menu-order-actions-duplicate').click(); | ||||
|  | ||||
|   // Ensure a new reference is suggested | ||||
|   await expect(page.getByLabel('text-field-reference')).not.toBeEmpty(); | ||||
|  | ||||
|   // Submit the duplicate request and ensure it completes | ||||
|   await page.getByRole('button', { name: 'Submit' }).isEnabled(); | ||||
|   await page.getByRole('button', { name: 'Submit' }).click(); | ||||
|   await page.getByRole('tab', { name: 'Order Details' }).waitFor(); | ||||
|   await page.getByRole('tab', { name: 'Order Details' }).click(); | ||||
|  | ||||
|   await page.getByText('Pending').first().waitFor(); | ||||
| }); | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import { expect } from '@playwright/test'; | ||||
| import { test } from '../baseFixtures.ts'; | ||||
| import { | ||||
|   clearTableFilters, | ||||
| @@ -199,3 +200,22 @@ test('Sales Orders - Shipments', async ({ page }) => { | ||||
|     .first() | ||||
|     .click(); | ||||
| }); | ||||
|  | ||||
| test('Sales Orders - Duplicate', async ({ page }) => { | ||||
|   await doQuickLogin(page); | ||||
|  | ||||
|   await navigate(page, 'sales/sales-order/11/detail'); | ||||
|   await page.getByLabel('action-menu-order-actions').click(); | ||||
|   await page.getByLabel('action-menu-order-actions-duplicate').click(); | ||||
|  | ||||
|   // Ensure a new reference is suggested | ||||
|   await expect(page.getByLabel('text-field-reference')).not.toBeEmpty(); | ||||
|  | ||||
|   // Submit the duplicate request and ensure it completes | ||||
|   await page.getByRole('button', { name: 'Submit' }).isEnabled(); | ||||
|   await page.getByRole('button', { name: 'Submit' }).click(); | ||||
|   await page.getByRole('tab', { name: 'Order Details' }).waitFor(); | ||||
|   await page.getByRole('tab', { name: 'Order Details' }).click(); | ||||
|  | ||||
|   await page.getByText('Pending').first().waitFor(); | ||||
| }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user