diff --git a/CHANGELOG.md b/CHANGELOG.md index b47d981f1b..29411a85e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ 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) ### Changed 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/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..f3c407eba9 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, @@ -1172,14 +1173,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/part/PartDetail.tsx b/src/frontend/src/pages/part/PartDetail.tsx index 12a8a22ad6..a35d50482e 100644 --- a/src/frontend/src/pages/part/PartDetail.tsx +++ b/src/frontend/src/pages/part/PartDetail.tsx @@ -47,7 +47,7 @@ import { UserRoles } from '@lib/enums/Roles'; import { apiUrl } from '@lib/functions/Api'; import { getDetailUrl } from '@lib/functions/Navigation'; import { ActionButton } from '@lib/index'; -import type { ApiFormFieldSet } from '@lib/types/Forms'; +import type { ApiFormFieldSet, StockOperationProps } from '@lib/types/Forms'; import AdminButton from '../../components/buttons/AdminButton'; import { PrintingActions } from '../../components/buttons/PrintingActions'; import StarredToggleButton from '../../components/buttons/StarredToggleButton'; @@ -80,10 +80,7 @@ import OrderPartsWizard from '../../components/wizards/OrderPartsWizard'; import { useApi } from '../../contexts/ApiContext'; import { formatDecimal, formatPriceRange } from '../../defaults/formatters'; import { usePartFields } from '../../forms/PartForms'; -import { - type StockOperationProps, - useFindSerialNumberForm -} from '../../forms/StockForms'; +import { useFindSerialNumberForm } from '../../forms/StockForms'; import { useApiFormModal, useCreateApiFormModal, diff --git a/src/frontend/src/pages/stock/LocationDetail.tsx b/src/frontend/src/pages/stock/LocationDetail.tsx index 0486bb5ec8..eb844ab928 100644 --- a/src/frontend/src/pages/stock/LocationDetail.tsx +++ b/src/frontend/src/pages/stock/LocationDetail.tsx @@ -3,6 +3,7 @@ import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { apiUrl } from '@lib/functions/Api'; import { getDetailUrl } from '@lib/functions/Navigation'; +import type { StockOperationProps } from '@lib/types/Forms'; import { t } from '@lingui/core/macro'; import { Group, Skeleton, Stack, Text } from '@mantine/core'; import { IconInfoCircle, IconPackages, IconSitemap } from '@tabler/icons-react'; @@ -30,10 +31,7 @@ import { PageDetail } from '../../components/nav/PageDetail'; import type { PanelType } from '../../components/panels/Panel'; import { PanelGroup } from '../../components/panels/PanelGroup'; import LocateItemButton from '../../components/plugins/LocateItemButton'; -import { - type StockOperationProps, - stockLocationFields -} from '../../forms/StockForms'; +import { stockLocationFields } from '../../forms/StockForms'; import { InvenTreeIcon } from '../../functions/icons'; import { useDeleteApiFormModal, diff --git a/src/frontend/src/pages/stock/StockDetail.tsx b/src/frontend/src/pages/stock/StockDetail.tsx index faba55f015..b6466b0b85 100644 --- a/src/frontend/src/pages/stock/StockDetail.tsx +++ b/src/frontend/src/pages/stock/StockDetail.tsx @@ -33,6 +33,7 @@ import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { apiUrl } from '@lib/functions/Api'; import { getDetailUrl } from '@lib/functions/Navigation'; +import type { StockOperationProps } from '@lib/types/Forms'; import { notifications } from '@mantine/notifications'; import { useBarcodeScanDialog } from '../../components/barcodes/BarcodeScanDialog'; import AdminButton from '../../components/buttons/AdminButton'; @@ -66,7 +67,6 @@ import OrderPartsWizard from '../../components/wizards/OrderPartsWizard'; import { useApi } from '../../contexts/ApiContext'; import { formatCurrency, formatDecimal } from '../../defaults/formatters'; import { - type StockOperationProps, useFindSerialNumberForm, useStockFields, useStockItemSerializeFields diff --git a/src/frontend/src/tables/build/BuildAllocatedStockTable.tsx b/src/frontend/src/tables/build/BuildAllocatedStockTable.tsx index 6f42b8c7f5..bdecc5d61b 100644 --- a/src/frontend/src/tables/build/BuildAllocatedStockTable.tsx +++ b/src/frontend/src/tables/build/BuildAllocatedStockTable.tsx @@ -12,10 +12,10 @@ import { UserRoles } from '@lib/enums/Roles'; import { apiUrl } from '@lib/functions/Api'; import { ActionButton } from '@lib/index'; import type { TableFilter } from '@lib/types/Filters'; +import type { StockOperationProps } from '@lib/types/Forms'; import type { TableColumn } from '@lib/types/Tables'; import { IconCircleDashedCheck } from '@tabler/icons-react'; import { useConsumeBuildItemsForm } from '../../forms/BuildForms'; -import type { StockOperationProps } from '../../forms/StockForms'; import { useDeleteApiFormModal, useEditApiFormModal 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/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/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';