Skip to content

Commit 66d5180

Browse files
[UI] Improve order parts wizard (#9389)
* [UI] Improve order parts wizard - Enhance placeholder text - Precalculate order quantity * Tweak playwright tests * Simplify tests
1 parent 7b994a3 commit 66d5180

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

src/frontend/src/components/wizards/OrderPartsWizard.tsx

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@ interface PartOrderRecord {
3838
function SelectPartsStep({
3939
records,
4040
onRemovePart,
41+
onSelectQuantity,
4142
onSelectSupplierPart,
4243
onSelectPurchaseOrder
4344
}: {
4445
records: PartOrderRecord[];
4546
onRemovePart: (part: any) => void;
47+
onSelectQuantity: (partId: number, quantity: number) => void;
4648
onSelectSupplierPart: (partId: number, supplierPart: any) => void;
4749
onSelectPurchaseOrder: (partId: number, purchaseOrder: any) => void;
4850
}) {
@@ -151,6 +153,7 @@ function SelectPartsStep({
151153
field_type: 'related field',
152154
api_url: apiUrl(ApiEndpoints.supplier_part_list),
153155
model: ModelType.supplierpart,
156+
placeholder: t`Select supplier part`,
154157
required: true,
155158
value: record.supplier_part?.pk,
156159
onValueChange: (value, instance) => {
@@ -189,6 +192,7 @@ function SelectPartsStep({
189192
field_type: 'related field',
190193
api_url: apiUrl(ApiEndpoints.purchase_order_list),
191194
model: ModelType.purchaseorder,
195+
placeholder: t`Select purchase order`,
192196
disabled: !record.supplier_part?.supplier,
193197
value: record.purchase_order?.pk,
194198
filters: {
@@ -213,6 +217,26 @@ function SelectPartsStep({
213217
</Group>
214218
)
215219
},
220+
{
221+
accessor: 'quantity',
222+
title: t`Quantity`,
223+
width: 125,
224+
render: (record: PartOrderRecord) => (
225+
<StandaloneField
226+
fieldName='quantity'
227+
hideLabels={true}
228+
error={record.errors?.quantity}
229+
fieldDefinition={{
230+
field_type: 'number',
231+
required: true,
232+
value: record.quantity,
233+
onValueChange: (value) => {
234+
onSelectQuantity(record.part.pk, value);
235+
}
236+
}}
237+
/>
238+
)
239+
},
216240
{
217241
accessor: 'right_actions',
218242
title: ' ',
@@ -288,6 +312,22 @@ export default function OrderPartsWizard({
288312
[selectedParts]
289313
);
290314

315+
// Select a quantity to order
316+
const selectQuantity = useCallback(
317+
(partId: number, quantity: number) => {
318+
const records = [...selectedParts];
319+
320+
records.forEach((record: PartOrderRecord, index: number) => {
321+
if (record.part.pk === partId) {
322+
records[index].quantity = quantity;
323+
}
324+
});
325+
326+
setSelectedParts(records);
327+
},
328+
[selectedParts]
329+
);
330+
291331
// Select a supplier part for a part
292332
const selectSupplierPart = useCallback(
293333
(partId: number, supplierPart: any) => {
@@ -327,6 +367,7 @@ export default function OrderPartsWizard({
327367
<SelectPartsStep
328368
records={selectedParts}
329369
onRemovePart={removePart}
370+
onSelectQuantity={selectQuantity}
330371
onSelectSupplierPart={selectSupplierPart}
331372
onSelectPurchaseOrder={selectPurchaseOrder}
332373
/>
@@ -400,11 +441,23 @@ export default function OrderPartsWizard({
400441
(record: PartOrderRecord) => record.part?.pk === part.pk
401442
)
402443
) {
444+
// TODO: Make this calculation generic and reusable
445+
// Calculate the "to order" quantity
446+
const required =
447+
(part.minimum_stock ?? 0) +
448+
(part.required_for_build_orders ?? 0) +
449+
(part.required_for_sales_orders ?? 0);
450+
const on_hand = part.total_in_stock ?? 0;
451+
const on_order = part.ordering ?? 0;
452+
const in_production = part.building ?? 0;
453+
454+
const to_order = required - on_hand - on_order - in_production;
455+
403456
records.push({
404457
part: part,
405458
supplier_part: undefined,
406459
purchase_order: undefined,
407-
quantity: 1,
460+
quantity: Math.max(to_order, 0),
408461
errors: {}
409462
});
410463
}

src/frontend/tests/pages/pui_purchase_order.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ test('Purchase Orders - Order Parts', async ({ browser }) => {
283283
await page.getByText('PRJ-PHO').click();
284284
await page.getByRole('button', { name: 'Cancel' }).click();
285285

286+
await page.getByLabel('number-field-quantity').fill('100');
287+
286288
// Add the part to the purchase order
287289
await page.getByLabel('action-button-add-to-selected').click();
288290
await page.getByLabel('number-field-quantity').fill('100');

src/frontend/tests/pui_forms.spec.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@ test('Forms - Supplier Validation', async ({ browser }) => {
126126
await page.getByRole('button', { name: 'Submit' }).click();
127127

128128
// Is prevented, due to uniqueness requirements
129-
await page
130-
.getByText('Company with this Company name and Email already exists')
131-
.waitFor();
129+
await page.getByText('Form Error').waitFor();
132130
await page.getByRole('button', { name: 'Cancel' }).click();
133131
});

0 commit comments

Comments
 (0)