2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00

Use ref pattern on PO duplicate (#9100) (#9147)

* 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>
(cherry picked from commit 2cabd02c6b447bed7ec8bccbdcd6115f427a451e)

Co-authored-by: Jacob Felknor <jacobfelknor073@gmail.com>
This commit is contained in:
github-actions[bot] 2025-02-22 20:46:00 +11:00 committed by GitHub
parent cd41ca2a87
commit 3625b8f14c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 100 additions and 16 deletions

View File

@ -362,14 +362,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
}); });

View File

@ -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
}); });

View File

@ -329,14 +329,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
}); });

View File

@ -272,14 +272,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
}); });

View File

@ -1,3 +1,4 @@
import { expect } from '@playwright/test';
import { test } from '../baseFixtures.ts'; import { test } from '../baseFixtures.ts';
import { baseUrl } from '../defaults.ts'; import { baseUrl } from '../defaults.ts';
import { import {
@ -271,3 +272,22 @@ test('Build Order - Filters', async ({ page }) => {
await page.waitForTimeout(2500); await page.waitForTimeout(2500);
}); });
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();
});

View File

@ -1,3 +1,4 @@
import { expect } from '@playwright/test';
import { test } from '../baseFixtures.ts'; import { test } from '../baseFixtures.ts';
import { baseUrl } from '../defaults.ts'; import { baseUrl } from '../defaults.ts';
import { clickButtonIfVisible, openFilterDrawer } from '../helpers.ts'; import { clickButtonIfVisible, openFilterDrawer } from '../helpers.ts';
@ -186,3 +187,22 @@ test('Purchase Orders - Receive Items', async ({ page }) => {
await page.getByRole('button', { name: 'Cancel' }).click(); await page.getByRole('button', { name: 'Cancel' }).click();
}); });
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();
});

View File

@ -1,3 +1,4 @@
import { expect } from '@playwright/test';
import { test } from '../baseFixtures.ts'; import { test } from '../baseFixtures.ts';
import { baseUrl } from '../defaults.ts'; import { baseUrl } from '../defaults.ts';
import { clearTableFilters, setTableChoiceFilter } from '../helpers.ts'; import { clearTableFilters, setTableChoiceFilter } from '../helpers.ts';
@ -149,3 +150,22 @@ test('Purchase Orders', async ({ page }) => {
await page.getByRole('button', { name: 'Issue Order' }).waitFor(); await page.getByRole('button', { name: 'Issue Order' }).waitFor();
}); });
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();
});