mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 13:15:43 +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 |     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({ |   const duplicateBuild = useCreateApiFormModal({ | ||||||
|     url: ApiEndpoints.build_order_list, |     url: ApiEndpoints.build_order_list, | ||||||
|     title: t`Add Build Order`, |     title: t`Add Build Order`, | ||||||
|     fields: buildOrderFields, |     fields: buildOrderFields, | ||||||
|     initialData: { |     initialData: duplicateBuildOrderInitialData, | ||||||
|       ...build, |  | ||||||
|       reference: undefined |  | ||||||
|     }, |  | ||||||
|     follow: true, |     follow: true, | ||||||
|     modelType: ModelType.build |     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({ |   const duplicatePurchaseOrder = useCreateApiFormModal({ | ||||||
|     url: ApiEndpoints.purchase_order_list, |     url: ApiEndpoints.purchase_order_list, | ||||||
|     title: t`Add Purchase Order`, |     title: t`Add Purchase Order`, | ||||||
|     fields: duplicatePurchaseOrderFields, |     fields: duplicatePurchaseOrderFields, | ||||||
|     initialData: { |     initialData: duplicatePurchaseOrderInitialData, | ||||||
|       ...order, |  | ||||||
|       reference: undefined |  | ||||||
|     }, |  | ||||||
|     follow: true, |     follow: true, | ||||||
|     modelType: ModelType.purchaseorder |     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({ |   const duplicateReturnOrder = useCreateApiFormModal({ | ||||||
|     url: ApiEndpoints.return_order_list, |     url: ApiEndpoints.return_order_list, | ||||||
|     title: t`Add Return Order`, |     title: t`Add Return Order`, | ||||||
|     fields: duplicateReturnOrderFields, |     fields: duplicateReturnOrderFields, | ||||||
|     initialData: { |     initialData: duplicateReturnOrderInitialData, | ||||||
|       ...order, |  | ||||||
|       reference: undefined |  | ||||||
|     }, |  | ||||||
|     modelType: ModelType.returnorder, |     modelType: ModelType.returnorder, | ||||||
|     follow: true |     follow: true | ||||||
|   }); |   }); | ||||||
|   | |||||||
| @@ -287,14 +287,20 @@ export default function SalesOrderDetail() { | |||||||
|     duplicateOrderId: order.pk |     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({ |   const duplicateSalesOrder = useCreateApiFormModal({ | ||||||
|     url: ApiEndpoints.sales_order_list, |     url: ApiEndpoints.sales_order_list, | ||||||
|     title: t`Add Sales Order`, |     title: t`Add Sales Order`, | ||||||
|     fields: duplicateOrderFields, |     fields: duplicateOrderFields, | ||||||
|     initialData: { |     initialData: duplicateSalesOrderInitialData, | ||||||
|       ...order, |  | ||||||
|       reference: undefined |  | ||||||
|     }, |  | ||||||
|     follow: true, |     follow: true, | ||||||
|     modelType: ModelType.salesorder |     modelType: ModelType.salesorder | ||||||
|   }); |   }); | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import { expect } from '@playwright/test'; | ||||||
| import { test } from '../baseFixtures.ts'; | import { test } from '../baseFixtures.ts'; | ||||||
| import { | import { | ||||||
|   clearTableFilters, |   clearTableFilters, | ||||||
| @@ -325,3 +326,22 @@ test('Build Order - Filters', async ({ page }) => { | |||||||
|   await page.getByText('On Hold').first().waitFor(); |   await page.getByText('On Hold').first().waitFor(); | ||||||
|   await page.getByText('Pending Approval').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 { test } from '../baseFixtures.ts'; | ||||||
| import { | import { | ||||||
|   clearTableFilters, |   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: 'my-batch-code' }).first().waitFor(); | ||||||
|   await page.getByRole('cell', { name: 'bucket' }).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 { test } from '../baseFixtures.ts'; | ||||||
| import { | import { | ||||||
|   clearTableFilters, |   clearTableFilters, | ||||||
| @@ -199,3 +200,22 @@ test('Sales Orders - Shipments', async ({ page }) => { | |||||||
|     .first() |     .first() | ||||||
|     .click(); |     .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