From 9cd0b520c22c4b037314520b227065fb2e27d734 Mon Sep 17 00:00:00 2001 From: Jan Krajdl Date: Sun, 29 Mar 2026 06:09:47 +0200 Subject: [PATCH] Added keep open boolean field to Stock Location modal form (#11074) * Added keep open boolean field to Stock Location modal form * Rewrite keep form open field feature to avoid calling methods in form field definitions * Rewrite keep form open feature as common form property * Removed unused artefact from previous implementation * keepOpenOption removed as default option for all create forms. Instead it's enabled on selected forms. * keepOpenOption field speed improvement - using useRef instead of useState - keepOpenSwitch moved to own component * Added keep form open feature to changelog * Updated documentation: keep form open feature added to concepts/user_interface docs * Added test case for "keep form open" feature * Changed switch selector in keep form open feature test --------- Co-authored-by: spm Co-authored-by: Oliver Co-authored-by: Matthias Mair --- CHANGELOG.md | 1 + .../images/concepts/ui_form_add_part.png | Bin 35305 -> 50894 bytes docs/docs/concepts/user_interface.md | 2 + src/frontend/lib/types/Forms.tsx | 2 + src/frontend/src/components/forms/ApiForm.tsx | 28 +++++++++++--- .../components/forms/KeepFormOpenSwitch.tsx | 23 +++++++++++ src/frontend/src/forms/StockForms.tsx | 3 +- src/frontend/src/hooks/UseForm.tsx | 8 +++- .../src/tables/build/BuildOrderTable.tsx | 3 +- .../src/tables/company/CompanyTable.tsx | 3 +- .../src/tables/part/PartCategoryTable.tsx | 3 +- src/frontend/src/tables/part/PartTable.tsx | 3 +- .../purchasing/ManufacturerPartTable.tsx | 3 +- .../tables/purchasing/PurchaseOrderTable.tsx | 3 +- .../tables/purchasing/SupplierPartTable.tsx | 3 +- .../src/tables/sales/ReturnOrderTable.tsx | 3 +- .../src/tables/sales/SalesOrderTable.tsx | 3 +- .../src/tables/stock/StockItemTable.tsx | 3 +- .../src/tables/stock/StockLocationTable.tsx | 3 +- src/frontend/tests/pui_forms.spec.ts | 36 +++++++++++++++++- 20 files changed, 116 insertions(+), 20 deletions(-) create mode 100644 src/frontend/src/components/forms/KeepFormOpenSwitch.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b71fd37a4..590f179f24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#10887](https://github.com/inventree/InvenTree/pull/10887) adds the ability to auto-allocate tracked items against specific build outputs. Currently, this will only allocate items where the serial number of the tracked item matches the serial number of the build output, but in future this may be extended to allow for more flexible allocation rules. - [#11372](https://github.com/inventree/InvenTree/pull/11372) adds backup metadata setter and restore metadata validator functions to ensure common footguns are harder to trigger when using the backup and restore functionality. - [#11374](https://github.com/inventree/InvenTree/pull/11374) adds `updated_at` field on purchase, sales and return orders. +- [#11074](https://github.com/inventree/InvenTree/pull/11074) adds "Keep form open" option on create form which leaves dialog with form opened after form submitting. ### Changed diff --git a/docs/docs/assets/images/concepts/ui_form_add_part.png b/docs/docs/assets/images/concepts/ui_form_add_part.png index af8daf98368cac57f4a9c1fca71ed3f568ee8297..3f2cc70e2231864f155d90ca178c279585abe844 100644 GIT binary patch literal 50894 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 diff --git a/docs/docs/concepts/user_interface.md b/docs/docs/concepts/user_interface.md index 665b9fcf02..26e7ddf5d0 100644 --- a/docs/docs/concepts/user_interface.md +++ b/docs/docs/concepts/user_interface.md @@ -224,6 +224,8 @@ Example: Creating a new part via the "Add Part" form: {{ image("concepts/ui_form_add_part.png", "Add Part Button") }} +On several forms is displayed option "Keep form open" in bottom part of the form on left side of Submit button (option is visible on the screenshot above). When this switch is turned on, form window is not closed after submit and filled form data is not reset. This is useful for creating more entries at one time with similar properties (e.g. only different number in name). + ### Data Editing Example: Editing an existing purchase order via the "Edit Purchase Order" form: diff --git a/src/frontend/lib/types/Forms.tsx b/src/frontend/lib/types/Forms.tsx index 1bc3dc62f3..42ba36acfd 100644 --- a/src/frontend/lib/types/Forms.tsx +++ b/src/frontend/lib/types/Forms.tsx @@ -180,6 +180,8 @@ export interface ApiFormProps { follow?: boolean; actions?: ApiFormAction[]; timeout?: number; + keepOpenOption?: boolean; + onKeepOpenChange?: (keepOpen: boolean) => void; } /** diff --git a/src/frontend/src/components/forms/ApiForm.tsx b/src/frontend/src/components/forms/ApiForm.tsx index 089ce4f36b..43b2b22948 100644 --- a/src/frontend/src/components/forms/ApiForm.tsx +++ b/src/frontend/src/components/forms/ApiForm.tsx @@ -12,7 +12,7 @@ import { import { useId } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { useQuery, useQueryClient } from '@tanstack/react-query'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { type FieldValues, FormProvider, @@ -42,6 +42,7 @@ import { showTimeoutNotification } from '../../functions/notifications'; import { Boundary } from '../Boundary'; +import { KeepFormOpenSwitch } from './KeepFormOpenSwitch'; import { ApiFormField } from './fields/ApiFormField'; export function OptionsApiForm({ @@ -169,6 +170,12 @@ export function ApiForm({ }>) { const api = useApi(); const queryClient = useQueryClient(); + const keepOpenRef = useRef(false); + + const onKeepOpenChange = (v: boolean) => { + keepOpenRef.current = v; + props.onKeepOpenChange?.(v); + }; // Accessor for the navigation function (which is used to redirect the user) let navigate: NavigateFunction | null = null; @@ -459,9 +466,14 @@ export function ApiForm({ props.onFormSuccess(response.data, form); } - if (props.follow && props.modelType && response.data?.pk) { + if ( + props.follow && + props.modelType && + response.data?.pk && + !keepOpenRef.current + ) { // If we want to automatically follow the returned data - if (!!navigate) { + if (!!navigate && !keepOpenRef.current) { navigate(getDetailUrl(props.modelType, response.data?.pk)); } } else if (props.table) { @@ -588,7 +600,6 @@ export function ApiForm({ ); } - return ( @@ -673,7 +684,12 @@ export function ApiForm({ {/* Footer with Action Buttons */} -
+ + + {props.keepOpenOption && ( + + )} + {props.actions?.map((action, i) => (
+
); diff --git a/src/frontend/src/components/forms/KeepFormOpenSwitch.tsx b/src/frontend/src/components/forms/KeepFormOpenSwitch.tsx new file mode 100644 index 0000000000..1c4d75b2c9 --- /dev/null +++ b/src/frontend/src/components/forms/KeepFormOpenSwitch.tsx @@ -0,0 +1,23 @@ +import { Switch } from '@mantine/core'; +import { useEffect, useState } from 'react'; + +export function KeepFormOpenSwitch({ + onChange +}: { onChange?: (v: boolean) => void }) { + const [keepOpen, setKeepOpen] = useState(false); + + useEffect(() => { + onChange?.(keepOpen); + }, [keepOpen]); + + return ( + setKeepOpen(e.currentTarget.checked)} + /> + ); +} diff --git a/src/frontend/src/forms/StockForms.tsx b/src/frontend/src/forms/StockForms.tsx index 3ab80b7543..102cb2662c 100644 --- a/src/frontend/src/forms/StockForms.tsx +++ b/src/frontend/src/forms/StockForms.tsx @@ -321,7 +321,8 @@ export function useCreateStockItem() { url: ApiEndpoints.stock_item_list, fields: fields, modalId: 'create-stock-item', - title: t`Add Stock Item` + title: t`Add Stock Item`, + keepOpenOption: true }); } diff --git a/src/frontend/src/hooks/UseForm.tsx b/src/frontend/src/hooks/UseForm.tsx index 6213633e6b..c92f321f6d 100644 --- a/src/frontend/src/hooks/UseForm.tsx +++ b/src/frontend/src/hooks/UseForm.tsx @@ -24,9 +24,15 @@ export function useApiFormModal(props: ApiFormModalProps) { return props.modalId ?? id; }, [props.modalId, id]); + const keepOpenRef = useRef(false); + const setKeepOpen = (v: boolean) => { + keepOpenRef.current = v; + }; + const formProps = useMemo( () => ({ ...props, + onKeepOpenChange: setKeepOpen, actions: [ ...(props.actions || []), { @@ -38,7 +44,7 @@ export function useApiFormModal(props: ApiFormModalProps) { } ], onFormSuccess: (data, form) => { - if (props.checkClose?.(data, form) ?? true) { + if (!keepOpenRef.current && (props.checkClose?.(data, form) ?? true)) { modalClose.current(); } props.onFormSuccess?.(data, form); diff --git a/src/frontend/src/tables/build/BuildOrderTable.tsx b/src/frontend/src/tables/build/BuildOrderTable.tsx index 115e07ab74..b4480256ca 100644 --- a/src/frontend/src/tables/build/BuildOrderTable.tsx +++ b/src/frontend/src/tables/build/BuildOrderTable.tsx @@ -218,7 +218,8 @@ export function BuildOrderTable({ parent: parentBuildId }, follow: true, - modelType: ModelType.build + modelType: ModelType.build, + keepOpenOption: true }); const tableActions = useMemo(() => { diff --git a/src/frontend/src/tables/company/CompanyTable.tsx b/src/frontend/src/tables/company/CompanyTable.tsx index e3c6125344..13d9c61159 100644 --- a/src/frontend/src/tables/company/CompanyTable.tsx +++ b/src/frontend/src/tables/company/CompanyTable.tsx @@ -80,7 +80,8 @@ export function CompanyTable({ fields: companyFields(), initialData: params, follow: true, - modelType: ModelType.company + modelType: ModelType.company, + keepOpenOption: true }); const [selectedCompany, setSelectedCompany] = useState(0); diff --git a/src/frontend/src/tables/part/PartCategoryTable.tsx b/src/frontend/src/tables/part/PartCategoryTable.tsx index 15abbf8390..0f15524f09 100644 --- a/src/frontend/src/tables/part/PartCategoryTable.tsx +++ b/src/frontend/src/tables/part/PartCategoryTable.tsx @@ -109,7 +109,8 @@ export function PartCategoryTable({ parentId }: Readonly<{ parentId?: any }>) { }, follow: true, modelType: ModelType.partcategory, - table: table + table: table, + keepOpenOption: true }); const [selectedCategory, setSelectedCategory] = useState(-1); diff --git a/src/frontend/src/tables/part/PartTable.tsx b/src/frontend/src/tables/part/PartTable.tsx index c6380f9ac0..ab4ab27fe7 100644 --- a/src/frontend/src/tables/part/PartTable.tsx +++ b/src/frontend/src/tables/part/PartTable.tsx @@ -407,7 +407,8 @@ export function PartListTable({ fields: newPartFields, initialData: initialPartData, follow: true, - modelType: ModelType.part + modelType: ModelType.part, + keepOpenOption: true }); const [selectedPart, setSelectedPart] = useState({}); diff --git a/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx b/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx index 674963ff80..4c371ad104 100644 --- a/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx +++ b/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx @@ -118,7 +118,8 @@ export function ManufacturerPartTable({ initialData: { manufacturer: manufacturerId, part: partId - } + }, + keepOpenOption: true }); const editManufacturerPart = useEditApiFormModal({ diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx index e450ede8e7..7f9b4e1465 100644 --- a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx +++ b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx @@ -175,7 +175,8 @@ export function PurchaseOrderTable({ supplier: supplierId }, follow: true, - modelType: ModelType.purchaseorder + modelType: ModelType.purchaseorder, + keepOpenOption: true }); const tableActions = useMemo(() => { diff --git a/src/frontend/src/tables/purchasing/SupplierPartTable.tsx b/src/frontend/src/tables/purchasing/SupplierPartTable.tsx index f0c99c870c..ef75f6ade5 100644 --- a/src/frontend/src/tables/purchasing/SupplierPartTable.tsx +++ b/src/frontend/src/tables/purchasing/SupplierPartTable.tsx @@ -210,7 +210,8 @@ export function SupplierPartTable({ onFormSuccess: (response: any) => { table.refreshTable(); }, - successMessage: t`Supplier part created` + successMessage: t`Supplier part created`, + keepOpenOption: true }); const supplierPlugins = usePluginsWithMixin('supplier'); diff --git a/src/frontend/src/tables/sales/ReturnOrderTable.tsx b/src/frontend/src/tables/sales/ReturnOrderTable.tsx index 22ad44d9ce..2f50cdab10 100644 --- a/src/frontend/src/tables/sales/ReturnOrderTable.tsx +++ b/src/frontend/src/tables/sales/ReturnOrderTable.tsx @@ -179,7 +179,8 @@ export function ReturnOrderTable({ customer: customerId }, follow: true, - modelType: ModelType.returnorder + modelType: ModelType.returnorder, + keepOpenOption: true }); const tableActions = useMemo(() => { diff --git a/src/frontend/src/tables/sales/SalesOrderTable.tsx b/src/frontend/src/tables/sales/SalesOrderTable.tsx index 3d97ed09b2..6f679f728f 100644 --- a/src/frontend/src/tables/sales/SalesOrderTable.tsx +++ b/src/frontend/src/tables/sales/SalesOrderTable.tsx @@ -125,7 +125,8 @@ export function SalesOrderTable({ customer: customerId }, follow: true, - modelType: ModelType.salesorder + modelType: ModelType.salesorder, + keepOpenOption: true }); const tableActions = useMemo(() => { diff --git a/src/frontend/src/tables/stock/StockItemTable.tsx b/src/frontend/src/tables/stock/StockItemTable.tsx index 4f5f352e46..e23cd60a4c 100644 --- a/src/frontend/src/tables/stock/StockItemTable.tsx +++ b/src/frontend/src/tables/stock/StockItemTable.tsx @@ -417,7 +417,8 @@ export function StockItemTable({ // Navigate to the first result navigate(getDetailUrl(ModelType.stockitem, response[0].pk)); }, - successMessage: t`Stock item created` + successMessage: t`Stock item created`, + keepOpenOption: true }); const [partsToOrder, setPartsToOrder] = useState([]); diff --git a/src/frontend/src/tables/stock/StockLocationTable.tsx b/src/frontend/src/tables/stock/StockLocationTable.tsx index 43c338370c..bc2baefd87 100644 --- a/src/frontend/src/tables/stock/StockLocationTable.tsx +++ b/src/frontend/src/tables/stock/StockLocationTable.tsx @@ -110,7 +110,8 @@ export function StockLocationTable({ parentId }: Readonly<{ parentId?: any }>) { }, follow: true, modelType: ModelType.stocklocation, - table: table + table: table, + keepOpenOption: true }); const [selectedLocation, setSelectedLocation] = useState(-1); diff --git a/src/frontend/tests/pui_forms.spec.ts b/src/frontend/tests/pui_forms.spec.ts index 267f8e2a64..c86a490720 100644 --- a/src/frontend/tests/pui_forms.spec.ts +++ b/src/frontend/tests/pui_forms.spec.ts @@ -1,5 +1,5 @@ /** Unit tests for form validation, rendering, etc */ -import test from 'playwright/test'; +import { expect, test } from 'playwright/test'; import { stevenuser } from './defaults'; import { navigate } from './helpers'; import { doCachedLogin } from './login'; @@ -134,3 +134,37 @@ test('Forms - Supplier Validation', async ({ browser }) => { await page.getByText('Form Error').waitFor(); await page.getByRole('button', { name: 'Cancel' }).click(); }); + +test('Forms - Keep form open option', async ({ browser }) => { + const page = await doCachedLogin(browser, { + user: stevenuser, + url: 'stock/location/index/sublocations' + }); + await page.waitForURL('**/stock/location/index/**'); + + await page.getByLabel('action-button-add-stock-location').click(); + + // Generate unique location name + const locationName = `New Sublocation ${new Date().getTime()}`; + + await page.getByLabel('text-field-name', { exact: true }).fill(locationName); + + // Check keep form open switch and submit + await page.getByRole('switch', { name: 'Keep form open' }).click(); + await page.getByRole('button', { name: 'Submit' }).click(); + + // Location should be created, form should remain opened + await page.getByText('Item Created').waitFor(); + await expect(page.getByRole('dialog')).toBeVisible(); + + // Create another location and uncheck this option + await page + .getByLabel('text-field-name', { exact: true }) + .fill(`Another ${locationName}`); + await page.getByRole('switch', { name: 'Keep form open' }).click(); + await page.getByRole('button', { name: 'Submit' }).click(); + + // Location should be created, and the form (modal) should disappear + await page.getByText('Item Created').waitFor(); + await expect(page.getByRole('dialog')).toBeHidden(); +});