diff --git a/CHANGELOG.md b/CHANGELOG.md
index b47d981f1b..ce309cc1e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added much more detailed status information for machines to the API endpoint (including backend and frontend changes) in [#10381](https://github.com/inventree/InvenTree/pull/10381)
- Added ability to partially complete and partially scrap build outputs in [#10499](https://github.com/inventree/InvenTree/pull/10499)
- Added support for Redis ACL user-based authentication in [#10551](https://github.com/inventree/InvenTree/pull/10551)
+- Expose stock adjustment forms to the UI plugin context in [#10584](https://github.com/inventree/InvenTree/pull/10584)
+- Allow stock adjustments for "in production" items in [#10600](https://github.com/inventree/InvenTree/pull/10600)
### Changed
diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py
index 9e059dfe7b..ef1ad9482a 100644
--- a/src/backend/InvenTree/InvenTree/api_version.py
+++ b/src/backend/InvenTree/InvenTree/api_version.py
@@ -1,12 +1,15 @@
"""InvenTree API version information."""
# InvenTree API version
-INVENTREE_API_VERSION = 408
+INVENTREE_API_VERSION = 409
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """
+v409 -> 2025-10-17 : https://github.com/inventree/InvenTree/pull/10601
+ - Adds ability to filter StockList API by manufacturer part ID
+
v408 -> 2025-10-13: https://github.com/inventree/InvenTree/pull/10561
- Allow search of assembly fields in BOM API endpoint
diff --git a/src/backend/InvenTree/stock/api.py b/src/backend/InvenTree/stock/api.py
index bc7ce58d91..11beec18e1 100644
--- a/src/backend/InvenTree/stock/api.py
+++ b/src/backend/InvenTree/stock/api.py
@@ -25,7 +25,7 @@ import InvenTree.permissions
import stock.serializers as StockSerializers
from build.models import Build
from build.serializers import BuildSerializer
-from company.models import Company, SupplierPart
+from company.models import Company, ManufacturerPart, SupplierPart
from company.serializers import CompanySerializer
from data_exporter.mixins import DataExportViewMixin
from generic.states.api import StatusView
@@ -553,6 +553,12 @@ class StockFilter(FilterSet):
& Q(supplier_part__manufacturer_part__manufacturer=company)
)
+ manufacturer_part = rest_filters.ModelChoiceFilter(
+ label=_('Manufacturer Part'),
+ queryset=ManufacturerPart.objects.all(),
+ field_name='supplier_part__manufacturer_part',
+ )
+
supplier = rest_filters.ModelChoiceFilter(
label=_('Supplier'),
queryset=Company.objects.filter(is_supplier=True),
diff --git a/src/backend/InvenTree/stock/models.py b/src/backend/InvenTree/stock/models.py
index 7718dd0a00..d66895b30b 100644
--- a/src/backend/InvenTree/stock/models.py
+++ b/src/backend/InvenTree/stock/models.py
@@ -1743,7 +1743,6 @@ class StockItem(
self.belongs_to is None, # Not installed inside another StockItem
self.customer is None, # Not assigned to a customer
self.consumed_by is None, # Not consumed by a build
- not self.is_building, # Not part of an active build
])
@property
@@ -2221,7 +2220,6 @@ class StockItem(
- The new item will have a different StockItem ID, while this will remain the same.
"""
# Run initial checks to test if the stock item can actually be "split"
-
allow_production = kwargs.get('allow_production', False)
# Cannot split a stock item which is in production
@@ -2346,7 +2344,9 @@ class StockItem(
'STOCK_ALLOW_OUT_OF_STOCK_TRANSFER', backup_value=False, cache=False
)
- if not allow_out_of_stock_transfer and not self.is_in_stock(check_status=False):
+ if not allow_out_of_stock_transfer and not self.is_in_stock(
+ check_status=False, check_in_production=False
+ ):
raise ValidationError(_('StockItem cannot be moved as it is not in stock'))
if quantity <= 0:
@@ -2362,7 +2362,7 @@ class StockItem(
kwargs['notes'] = notes
# Split the existing StockItem in two
- self.splitStock(quantity, location, user, **kwargs)
+ self.splitStock(quantity, location, user, allow_production=True, **kwargs)
return True
diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py
index 9ae4540592..4154c533e6 100644
--- a/src/backend/InvenTree/stock/serializers.py
+++ b/src/backend/InvenTree/stock/serializers.py
@@ -1554,7 +1554,7 @@ class StockAdjustmentItemSerializer(serializers.Serializer):
)
if not allow_out_of_stock_transfer and not stock_item.is_in_stock(
- check_status=False, check_quantity=False
+ check_status=False, check_quantity=False, check_in_production=False
):
raise ValidationError(_('Stock item is not in stock'))
elif self.require_in_stock == False:
diff --git a/src/frontend/CHANGELOG.md b/src/frontend/CHANGELOG.md
index ca6b880027..deec3c3251 100644
--- a/src/frontend/CHANGELOG.md
+++ b/src/frontend/CHANGELOG.md
@@ -2,6 +2,14 @@
This file contains historical changelog information for the InvenTree UI components library.
+### 0.7.0 - October 2025
+
+Exposes stock adjustment forms to plugins, allowing plugins to adjust stock adjustments using the common InvenTree UI form components.
+
+### 0.6.0 - September 2025
+
+Updated underlying Mantine library versions.
+
### 0.5.0 - August 2025
This release updates the base `react` major version from `18.3.1` to `19.1.1`. This change may introduce breaking changes for plugins that rely on the InvenTree UI components library (plugin developers should test their plugins against this new version).
diff --git a/src/frontend/lib/index.ts b/src/frontend/lib/index.ts
index 35eb3aff19..17e7e20f36 100644
--- a/src/frontend/lib/index.ts
+++ b/src/frontend/lib/index.ts
@@ -12,7 +12,12 @@ export { ModelType } from './enums/ModelType';
export type { ModelDict } from './enums/ModelInformation';
export { UserRoles, UserPermissions } from './enums/Roles';
-export type { InvenTreePluginContext } from './types/Plugins';
+export type {
+ InvenTreePluginContext,
+ InvenTreeFormsContext,
+ PluginVersion,
+ StockAdjustmentFormsContext
+} from './types/Plugins';
export type { RowAction, RowViewProps } from './types/Tables';
export type {
@@ -25,6 +30,11 @@ export type {
BulkEditApiFormModalProps
} from './types/Forms';
+export type {
+ UseModalProps,
+ UseModalReturn
+} from './types/Modals';
+
// Common utility functions
export { apiUrl } from './functions/Api';
export {
diff --git a/src/frontend/lib/types/Forms.tsx b/src/frontend/lib/types/Forms.tsx
index cf9b6e43fd..3393ec361a 100644
--- a/src/frontend/lib/types/Forms.tsx
+++ b/src/frontend/lib/types/Forms.tsx
@@ -191,3 +191,11 @@ export interface ApiFormModalProps extends ApiFormProps {
export interface BulkEditApiFormModalProps extends ApiFormModalProps {
items: number[];
}
+
+export type StockOperationProps = {
+ items?: any[];
+ pk?: number;
+ filters?: any;
+ model: ModelType.stockitem | 'location' | ModelType.part;
+ refresh: () => void;
+};
diff --git a/src/frontend/lib/types/Plugins.tsx b/src/frontend/lib/types/Plugins.tsx
index b93e99ef90..cc10083b6e 100644
--- a/src/frontend/lib/types/Plugins.tsx
+++ b/src/frontend/lib/types/Plugins.tsx
@@ -5,7 +5,11 @@ import type { AxiosInstance } from 'axios';
import type { NavigateFunction } from 'react-router-dom';
import type { ModelDict } from '../enums/ModelInformation';
import type { ModelType } from '../enums/ModelType';
-import type { ApiFormModalProps, BulkEditApiFormModalProps } from './Forms';
+import type {
+ ApiFormModalProps,
+ BulkEditApiFormModalProps,
+ StockOperationProps
+} from './Forms';
import type { UseModalReturn } from './Modals';
import type { RenderInstanceProps } from './Rendering';
import type { SettingsStateProps } from './Settings';
@@ -24,11 +28,24 @@ export interface PluginVersion {
mantine: string;
}
+export type StockAdjustmentFormsContext = {
+ addStock: (props: StockOperationProps) => UseModalReturn;
+ assignStock: (props: StockOperationProps) => UseModalReturn;
+ changeStatus: (props: StockOperationProps) => UseModalReturn;
+ countStock: (props: StockOperationProps) => UseModalReturn;
+ deleteStock: (props: StockOperationProps) => UseModalReturn;
+ mergeStock: (props: StockOperationProps) => UseModalReturn;
+ removeStock: (props: StockOperationProps) => UseModalReturn;
+ transferStock: (props: StockOperationProps) => UseModalReturn;
+ returnStock: (props: StockOperationProps) => UseModalReturn;
+};
+
export type InvenTreeFormsContext = {
bulkEdit: (props: BulkEditApiFormModalProps) => UseModalReturn;
create: (props: ApiFormModalProps) => UseModalReturn;
delete: (props: ApiFormModalProps) => UseModalReturn;
edit: (props: ApiFormModalProps) => UseModalReturn;
+ stockActions: StockAdjustmentFormsContext;
};
/**
diff --git a/src/frontend/package.json b/src/frontend/package.json
index ecfd110472..b56f61cc99 100644
--- a/src/frontend/package.json
+++ b/src/frontend/package.json
@@ -1,7 +1,7 @@
{
"name": "@inventreedb/ui",
"description": "UI components for the InvenTree project",
- "version": "0.6.0",
+ "version": "0.7.0",
"private": false,
"type": "module",
"license": "MIT",
diff --git a/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx b/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx
index 49f1c20e33..17a9cf739f 100644
--- a/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx
+++ b/src/frontend/src/components/dashboard/DashboardWidgetLibrary.tsx
@@ -24,14 +24,17 @@ export function BuiltinQueryCountWidgets(): DashboardWidgetProps[] {
title: t`Subscribed Parts`,
description: t`Show the number of parts which you have subscribed to`,
modelType: ModelType.part,
- params: { starred: true }
+ params: { starred: true, active: true }
}),
QueryCountDashboardWidget({
label: 'sub-cat',
title: t`Subscribed Categories`,
description: t`Show the number of part categories which you have subscribed to`,
modelType: ModelType.partcategory,
- params: { starred: true }
+ params: {
+ starred: true,
+ top_level: 'none'
+ }
}),
QueryCountDashboardWidget({
label: 'invalid-bom',
diff --git a/src/frontend/src/components/plugins/PluginContext.tsx b/src/frontend/src/components/plugins/PluginContext.tsx
index 0176c42b40..26c62dd5dc 100644
--- a/src/frontend/src/components/plugins/PluginContext.tsx
+++ b/src/frontend/src/components/plugins/PluginContext.tsx
@@ -18,6 +18,17 @@ import {
type InvenTreePluginContext
} from '@lib/types/Plugins';
import { i18n } from '@lingui/core';
+import {
+ useAddStockItem,
+ useAssignStockItem,
+ useChangeStockStatus,
+ useCountStockItem,
+ useDeleteStockItem,
+ useMergeStockItem,
+ useRemoveStockItem,
+ useReturnStockItem,
+ useTransferStockItem
+} from '../../forms/StockForms';
import {
useBulkEditApiFormModal,
useCreateApiFormModal,
@@ -60,7 +71,18 @@ export const useInvenTreeContext = () => {
bulkEdit: useBulkEditApiFormModal,
create: useCreateApiFormModal,
delete: useDeleteApiFormModal,
- edit: useEditApiFormModal
+ edit: useEditApiFormModal,
+ stockActions: {
+ addStock: useAddStockItem,
+ assignStock: useAssignStockItem,
+ changeStatus: useChangeStockStatus,
+ countStock: useCountStockItem,
+ deleteStock: useDeleteStockItem,
+ mergeStock: useMergeStockItem,
+ removeStock: useRemoveStockItem,
+ transferStock: useTransferStockItem,
+ returnStock: useReturnStockItem
+ }
}
};
}, [
diff --git a/src/frontend/src/forms/StockForms.tsx b/src/frontend/src/forms/StockForms.tsx
index 9da55a945c..d00af0a968 100644
--- a/src/frontend/src/forms/StockForms.tsx
+++ b/src/frontend/src/forms/StockForms.tsx
@@ -37,7 +37,8 @@ import type {
ApiFormAdjustFilterType,
ApiFormFieldChoice,
ApiFormFieldSet,
- ApiFormModalProps
+ ApiFormModalProps,
+ StockOperationProps
} from '@lib/types/Forms';
import {
TableFieldExtraRow,
@@ -711,6 +712,9 @@ function stockTransferFields(items: any[]): ApiFormFieldSet {
const records = Object.fromEntries(items.map((item) => [item.pk, item]));
+ // Extract all location values from the items
+ const locations = [...new Set(items.map((item) => item.location))];
+
const fields: ApiFormFieldSet = {
items: {
field_type: 'table',
@@ -739,6 +743,7 @@ function stockTransferFields(items: any[]): ApiFormFieldSet {
]
},
location: {
+ value: locations.length === 1 ? locations[0] : undefined,
filters: {
structural: false
}
@@ -1172,14 +1177,6 @@ function useStockOperationModal({
});
}
-export type StockOperationProps = {
- items?: any[];
- pk?: number;
- filters?: any;
- model: ModelType.stockitem | 'location' | ModelType.part;
- refresh: () => void;
-};
-
export function useAddStockItem(props: StockOperationProps) {
return useStockOperationModal({
...props,
diff --git a/src/frontend/src/hooks/UseStockAdjustActions.tsx b/src/frontend/src/hooks/UseStockAdjustActions.tsx
index d9e9ba927e..f0450bf0b3 100644
--- a/src/frontend/src/hooks/UseStockAdjustActions.tsx
+++ b/src/frontend/src/hooks/UseStockAdjustActions.tsx
@@ -1,11 +1,11 @@
import { UserRoles } from '@lib/index';
+import type { StockOperationProps } from '@lib/types/Forms';
import type { UseModalReturn } from '@lib/types/Modals';
import { t } from '@lingui/core/macro';
import { type ReactNode, useMemo } from 'react';
import type { ActionDropdownItem } from '../components/items/ActionDropdown';
import { ActionDropdown } from '../components/items/ActionDropdown';
import {
- type StockOperationProps,
useAddStockItem,
useAssignStockItem,
useChangeStockStatus,
@@ -54,8 +54,8 @@ export function useStockAdjustActions(
// The available modals for stock adjustment actions
const addStock = useAddStockItem(props.formProps);
const assignStock = useAssignStockItem(props.formProps);
- const countStock = useCountStockItem(props.formProps);
const changeStatus = useChangeStockStatus(props.formProps);
+ const countStock = useCountStockItem(props.formProps);
const deleteStock = useDeleteStockItem(props.formProps);
const mergeStock = useMergeStockItem(props.formProps);
const removeStock = useRemoveStockItem(props.formProps);
diff --git a/src/frontend/src/pages/build/BuildDetail.tsx b/src/frontend/src/pages/build/BuildDetail.tsx
index 28337dde2b..d856376d95 100644
--- a/src/frontend/src/pages/build/BuildDetail.tsx
+++ b/src/frontend/src/pages/build/BuildDetail.tsx
@@ -679,6 +679,7 @@ export default function BuildDetail() {
,
) {
icon: ,
hidden: !company?.is_manufacturer,
content: company?.pk && (
-
+
)
},
{
diff --git a/src/frontend/src/pages/company/ManufacturerPartDetail.tsx b/src/frontend/src/pages/company/ManufacturerPartDetail.tsx
index 784191be21..dc2924b443 100644
--- a/src/frontend/src/pages/company/ManufacturerPartDetail.tsx
+++ b/src/frontend/src/pages/company/ManufacturerPartDetail.tsx
@@ -3,7 +3,8 @@ import { Grid, Skeleton, Stack } from '@mantine/core';
import {
IconBuildingWarehouse,
IconInfoCircle,
- IconList
+ IconList,
+ IconPackages
} from '@tabler/icons-react';
import { useMemo } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
@@ -42,6 +43,7 @@ import { useInstance } from '../../hooks/UseInstance';
import { useUserState } from '../../states/UserState';
import ManufacturerPartParameterTable from '../../tables/purchasing/ManufacturerPartParameterTable';
import { SupplierPartTable } from '../../tables/purchasing/SupplierPartTable';
+import { StockItemTable } from '../../tables/stock/StockItemTable';
export default function ManufacturerPartDetail() {
const { id } = useParams();
@@ -171,6 +173,20 @@ export default function ManufacturerPartDetail() {
)
},
+ {
+ name: 'stock',
+ label: t`Received Stock`,
+ hidden: !user.hasViewRole(UserRoles.stock),
+ icon: ,
+ content: (
+
+ )
+ },
{
name: 'suppliers',
label: t`Suppliers`,
@@ -194,7 +210,7 @@ export default function ManufacturerPartDetail() {
model_id: manufacturerPart?.pk
})
];
- }, [manufacturerPart]);
+ }, [user, manufacturerPart]);
const editManufacturerPartFields = useManufacturerPartFields();
@@ -278,7 +294,7 @@ export default function ManufacturerPartDetail() {
>
{t`Manufacturers`}
-
+
diff --git a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx
index 6ed526b43e..20430cae28 100644
--- a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx
+++ b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx
@@ -460,6 +460,7 @@ export default function PurchaseOrderDetail() {
,
,
- content:
+ content:
}
];
}, [user, purchaseOrderView]);
diff --git a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx
index 297d393574..e4040da166 100644
--- a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx
+++ b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx
@@ -458,6 +458,7 @@ export default function ReturnOrderDetail() {
modelType={ModelType.returnorder}
items={[order.pk]}
enableReports
+ enableLabels
/>,
,
diff --git a/src/frontend/src/tables/build/BuildOutputTable.tsx b/src/frontend/src/tables/build/BuildOutputTable.tsx
index 89a20e47e2..ac7322e6f5 100644
--- a/src/frontend/src/tables/build/BuildOutputTable.tsx
+++ b/src/frontend/src/tables/build/BuildOutputTable.tsx
@@ -33,6 +33,7 @@ import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api';
import type { TableFilter } from '@lib/types/Filters';
+import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables';
import { StylishText } from '../../components/items/StylishText';
import { useApi } from '../../contexts/ApiContext';
@@ -43,7 +44,6 @@ import {
useScrapBuildOutputsForm
} from '../../forms/BuildForms';
import {
- type StockOperationProps,
useStockFields,
useStockItemSerializeFields
} from '../../forms/StockForms';
diff --git a/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx b/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx
index 71105c71fe..937a54a9f7 100644
--- a/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx
+++ b/src/frontend/src/tables/purchasing/ManufacturerPartTable.tsx
@@ -11,6 +11,7 @@ import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api';
+import type { TableFilter } from '@lib/types/Filters';
import type { TableColumn } from '@lib/types/Tables';
import { useManufacturerPartFields } from '../../forms/CompanyForms';
import {
@@ -32,9 +33,27 @@ import { InvenTreeTable } from '../InvenTreeTable';
* Construct a table listing manufacturer parts
*/
export function ManufacturerPartTable({
- params
-}: Readonly<{ params: any }>): ReactNode {
- const table = useTable('manufacturerparts');
+ manufacturerId,
+ partId
+}: Readonly<{
+ manufacturerId?: number;
+ partId?: number;
+}>): ReactNode {
+ const tableId: string = useMemo(() => {
+ let tId = 'manufacturer-part';
+
+ if (manufacturerId) {
+ tId += '-manufacturer';
+ }
+
+ if (partId) {
+ tId += '-part';
+ }
+
+ return tId;
+ }, [manufacturerId, partId]);
+
+ const table = useTable(tableId);
const user = useUserState();
@@ -42,7 +61,7 @@ export function ManufacturerPartTable({
const tableColumns: TableColumn[] = useMemo(() => {
return [
PartColumn({
- switchable: 'part' in params
+ switchable: !!partId
}),
{
accessor: 'manufacturer',
@@ -59,7 +78,7 @@ export function ManufacturerPartTable({
DescriptionColumn({}),
LinkColumn({})
];
- }, [params]);
+ }, [partId]);
const manufacturerPartFields = useManufacturerPartFields();
@@ -73,8 +92,8 @@ export function ManufacturerPartTable({
fields: manufacturerPartFields,
table: table,
initialData: {
- manufacturer: params?.manufacturer,
- part: params?.part
+ manufacturer: manufacturerId,
+ part: partId
}
});
@@ -93,6 +112,24 @@ export function ManufacturerPartTable({
table: table
});
+ const tableFilters: TableFilter[] = useMemo(() => {
+ return [
+ {
+ name: 'part_active',
+ label: t`Active Part`,
+ description: t`Show manufacturer parts for active internal parts.`,
+ type: 'boolean'
+ },
+ {
+ name: 'manufacturer_active',
+ label: t`Active Manufacturer`,
+ active: !manufacturerId,
+ description: t`Show manufacturer parts for active manufacturers.`,
+ type: 'boolean'
+ }
+ ];
+ }, [manufacturerId]);
+
const tableActions = useMemo(() => {
const can_add =
user.hasAddRole(UserRoles.purchase_order) &&
@@ -141,13 +178,15 @@ export function ManufacturerPartTable({
columns={tableColumns}
props={{
params: {
- ...params,
+ part: partId,
+ manufacturer: manufacturerId,
part_detail: true,
manufacturer_detail: true
},
enableDownload: true,
rowActions: rowActions,
tableActions: tableActions,
+ tableFilters: tableFilters,
modelType: ModelType.manufacturerpart
}}
/>
diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx
index 314227811d..81fe9db967 100644
--- a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx
+++ b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx
@@ -190,7 +190,8 @@ export function PurchaseOrderTable({
modelType: ModelType.purchaseorder,
enableSelection: true,
enableDownload: true,
- enableReports: true
+ enableReports: true,
+ enableLabels: true
}}
/>
>
diff --git a/src/frontend/src/tables/sales/ReturnOrderTable.tsx b/src/frontend/src/tables/sales/ReturnOrderTable.tsx
index 33b6141dec..f01dedfbf9 100644
--- a/src/frontend/src/tables/sales/ReturnOrderTable.tsx
+++ b/src/frontend/src/tables/sales/ReturnOrderTable.tsx
@@ -189,7 +189,8 @@ export function ReturnOrderTable({
modelType: ModelType.returnorder,
enableSelection: true,
enableDownload: true,
- enableReports: true
+ enableReports: true,
+ enableLabels: true
}}
/>
>
diff --git a/src/frontend/src/tables/sales/SalesOrderAllocationTable.tsx b/src/frontend/src/tables/sales/SalesOrderAllocationTable.tsx
index df247781dd..96ac375258 100644
--- a/src/frontend/src/tables/sales/SalesOrderAllocationTable.tsx
+++ b/src/frontend/src/tables/sales/SalesOrderAllocationTable.tsx
@@ -12,11 +12,11 @@ import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api';
import type { TableFilter } from '@lib/types/Filters';
+import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables';
import { IconTruckDelivery } from '@tabler/icons-react';
import { formatDate } from '../../defaults/formatters';
import { useSalesOrderAllocationFields } from '../../forms/SalesOrderForms';
-import type { StockOperationProps } from '../../forms/StockForms';
import {
useBulkEditApiFormModal,
useDeleteApiFormModal,
diff --git a/src/frontend/src/tables/sales/SalesOrderTable.tsx b/src/frontend/src/tables/sales/SalesOrderTable.tsx
index 770eca785f..01249aad03 100644
--- a/src/frontend/src/tables/sales/SalesOrderTable.tsx
+++ b/src/frontend/src/tables/sales/SalesOrderTable.tsx
@@ -201,7 +201,8 @@ export function SalesOrderTable({
modelType: ModelType.salesorder,
enableSelection: true,
enableDownload: true,
- enableReports: true
+ enableReports: true,
+ enableLabels: true
}}
/>
>
diff --git a/src/frontend/src/tables/stock/StockItemTable.tsx b/src/frontend/src/tables/stock/StockItemTable.tsx
index 4d8f98226a..0d4d868285 100644
--- a/src/frontend/src/tables/stock/StockItemTable.tsx
+++ b/src/frontend/src/tables/stock/StockItemTable.tsx
@@ -11,6 +11,7 @@ import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api';
import { getDetailUrl } from '@lib/functions/Navigation';
import type { TableFilter } from '@lib/types/Filters';
+import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables';
import OrderPartsWizard from '../../components/wizards/OrderPartsWizard';
import {
@@ -18,10 +19,7 @@ import {
formatDecimal,
formatPriceRange
} from '../../defaults/formatters';
-import {
- type StockOperationProps,
- useStockFields
-} from '../../forms/StockForms';
+import { useStockFields } from '../../forms/StockForms';
import { InvenTreeIcon } from '../../functions/icons';
import { useCreateApiFormModal } from '../../hooks/UseForm';
import { useStockAdjustActions } from '../../hooks/UseStockAdjustActions';