2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-10-18 23:17:41 +00:00

Plugin stock forms (#10584)

* Expose stock adjustment forms to plugins

* Update changelog

* Expand type exports

* Update CHANGELOG.md
This commit is contained in:
Oliver
2025-10-15 09:08:38 +11:00
committed by GitHub
parent e0559bb2b4
commit c2ade84872
16 changed files with 84 additions and 32 deletions

View File

@@ -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 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 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) - 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 ### Changed

View File

@@ -2,6 +2,14 @@
This file contains historical changelog information for the InvenTree UI components library. 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 ### 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). 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).

View File

@@ -12,7 +12,12 @@ export { ModelType } from './enums/ModelType';
export type { ModelDict } from './enums/ModelInformation'; export type { ModelDict } from './enums/ModelInformation';
export { UserRoles, UserPermissions } from './enums/Roles'; 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 { RowAction, RowViewProps } from './types/Tables';
export type { export type {
@@ -25,6 +30,11 @@ export type {
BulkEditApiFormModalProps BulkEditApiFormModalProps
} from './types/Forms'; } from './types/Forms';
export type {
UseModalProps,
UseModalReturn
} from './types/Modals';
// Common utility functions // Common utility functions
export { apiUrl } from './functions/Api'; export { apiUrl } from './functions/Api';
export { export {

View File

@@ -191,3 +191,11 @@ export interface ApiFormModalProps extends ApiFormProps {
export interface BulkEditApiFormModalProps extends ApiFormModalProps { export interface BulkEditApiFormModalProps extends ApiFormModalProps {
items: number[]; items: number[];
} }
export type StockOperationProps = {
items?: any[];
pk?: number;
filters?: any;
model: ModelType.stockitem | 'location' | ModelType.part;
refresh: () => void;
};

View File

@@ -5,7 +5,11 @@ import type { AxiosInstance } from 'axios';
import type { NavigateFunction } from 'react-router-dom'; import type { NavigateFunction } from 'react-router-dom';
import type { ModelDict } from '../enums/ModelInformation'; import type { ModelDict } from '../enums/ModelInformation';
import type { ModelType } from '../enums/ModelType'; 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 { UseModalReturn } from './Modals';
import type { RenderInstanceProps } from './Rendering'; import type { RenderInstanceProps } from './Rendering';
import type { SettingsStateProps } from './Settings'; import type { SettingsStateProps } from './Settings';
@@ -24,11 +28,24 @@ export interface PluginVersion {
mantine: string; 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 = { export type InvenTreeFormsContext = {
bulkEdit: (props: BulkEditApiFormModalProps) => UseModalReturn; bulkEdit: (props: BulkEditApiFormModalProps) => UseModalReturn;
create: (props: ApiFormModalProps) => UseModalReturn; create: (props: ApiFormModalProps) => UseModalReturn;
delete: (props: ApiFormModalProps) => UseModalReturn; delete: (props: ApiFormModalProps) => UseModalReturn;
edit: (props: ApiFormModalProps) => UseModalReturn; edit: (props: ApiFormModalProps) => UseModalReturn;
stockActions: StockAdjustmentFormsContext;
}; };
/** /**

View File

@@ -1,7 +1,7 @@
{ {
"name": "@inventreedb/ui", "name": "@inventreedb/ui",
"description": "UI components for the InvenTree project", "description": "UI components for the InvenTree project",
"version": "0.6.0", "version": "0.7.0",
"private": false, "private": false,
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",

View File

@@ -18,6 +18,17 @@ import {
type InvenTreePluginContext type InvenTreePluginContext
} from '@lib/types/Plugins'; } from '@lib/types/Plugins';
import { i18n } from '@lingui/core'; import { i18n } from '@lingui/core';
import {
useAddStockItem,
useAssignStockItem,
useChangeStockStatus,
useCountStockItem,
useDeleteStockItem,
useMergeStockItem,
useRemoveStockItem,
useReturnStockItem,
useTransferStockItem
} from '../../forms/StockForms';
import { import {
useBulkEditApiFormModal, useBulkEditApiFormModal,
useCreateApiFormModal, useCreateApiFormModal,
@@ -60,7 +71,18 @@ export const useInvenTreeContext = () => {
bulkEdit: useBulkEditApiFormModal, bulkEdit: useBulkEditApiFormModal,
create: useCreateApiFormModal, create: useCreateApiFormModal,
delete: useDeleteApiFormModal, 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
}
} }
}; };
}, [ }, [

View File

@@ -37,7 +37,8 @@ import type {
ApiFormAdjustFilterType, ApiFormAdjustFilterType,
ApiFormFieldChoice, ApiFormFieldChoice,
ApiFormFieldSet, ApiFormFieldSet,
ApiFormModalProps ApiFormModalProps,
StockOperationProps
} from '@lib/types/Forms'; } from '@lib/types/Forms';
import { import {
TableFieldExtraRow, 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) { export function useAddStockItem(props: StockOperationProps) {
return useStockOperationModal({ return useStockOperationModal({
...props, ...props,

View File

@@ -1,11 +1,11 @@
import { UserRoles } from '@lib/index'; import { UserRoles } from '@lib/index';
import type { StockOperationProps } from '@lib/types/Forms';
import type { UseModalReturn } from '@lib/types/Modals'; import type { UseModalReturn } from '@lib/types/Modals';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { type ReactNode, useMemo } from 'react'; import { type ReactNode, useMemo } from 'react';
import type { ActionDropdownItem } from '../components/items/ActionDropdown'; import type { ActionDropdownItem } from '../components/items/ActionDropdown';
import { ActionDropdown } from '../components/items/ActionDropdown'; import { ActionDropdown } from '../components/items/ActionDropdown';
import { import {
type StockOperationProps,
useAddStockItem, useAddStockItem,
useAssignStockItem, useAssignStockItem,
useChangeStockStatus, useChangeStockStatus,
@@ -54,8 +54,8 @@ export function useStockAdjustActions(
// The available modals for stock adjustment actions // The available modals for stock adjustment actions
const addStock = useAddStockItem(props.formProps); const addStock = useAddStockItem(props.formProps);
const assignStock = useAssignStockItem(props.formProps); const assignStock = useAssignStockItem(props.formProps);
const countStock = useCountStockItem(props.formProps);
const changeStatus = useChangeStockStatus(props.formProps); const changeStatus = useChangeStockStatus(props.formProps);
const countStock = useCountStockItem(props.formProps);
const deleteStock = useDeleteStockItem(props.formProps); const deleteStock = useDeleteStockItem(props.formProps);
const mergeStock = useMergeStockItem(props.formProps); const mergeStock = useMergeStockItem(props.formProps);
const removeStock = useRemoveStockItem(props.formProps); const removeStock = useRemoveStockItem(props.formProps);

View File

@@ -47,7 +47,7 @@ import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import { getDetailUrl } from '@lib/functions/Navigation'; import { getDetailUrl } from '@lib/functions/Navigation';
import { ActionButton } from '@lib/index'; 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 AdminButton from '../../components/buttons/AdminButton';
import { PrintingActions } from '../../components/buttons/PrintingActions'; import { PrintingActions } from '../../components/buttons/PrintingActions';
import StarredToggleButton from '../../components/buttons/StarredToggleButton'; import StarredToggleButton from '../../components/buttons/StarredToggleButton';
@@ -80,10 +80,7 @@ import OrderPartsWizard from '../../components/wizards/OrderPartsWizard';
import { useApi } from '../../contexts/ApiContext'; import { useApi } from '../../contexts/ApiContext';
import { formatDecimal, formatPriceRange } from '../../defaults/formatters'; import { formatDecimal, formatPriceRange } from '../../defaults/formatters';
import { usePartFields } from '../../forms/PartForms'; import { usePartFields } from '../../forms/PartForms';
import { import { useFindSerialNumberForm } from '../../forms/StockForms';
type StockOperationProps,
useFindSerialNumberForm
} from '../../forms/StockForms';
import { import {
useApiFormModal, useApiFormModal,
useCreateApiFormModal, useCreateApiFormModal,

View File

@@ -3,6 +3,7 @@ import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles'; import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import { getDetailUrl } from '@lib/functions/Navigation'; import { getDetailUrl } from '@lib/functions/Navigation';
import type { StockOperationProps } from '@lib/types/Forms';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { Group, Skeleton, Stack, Text } from '@mantine/core'; import { Group, Skeleton, Stack, Text } from '@mantine/core';
import { IconInfoCircle, IconPackages, IconSitemap } from '@tabler/icons-react'; 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 type { PanelType } from '../../components/panels/Panel';
import { PanelGroup } from '../../components/panels/PanelGroup'; import { PanelGroup } from '../../components/panels/PanelGroup';
import LocateItemButton from '../../components/plugins/LocateItemButton'; import LocateItemButton from '../../components/plugins/LocateItemButton';
import { import { stockLocationFields } from '../../forms/StockForms';
type StockOperationProps,
stockLocationFields
} from '../../forms/StockForms';
import { InvenTreeIcon } from '../../functions/icons'; import { InvenTreeIcon } from '../../functions/icons';
import { import {
useDeleteApiFormModal, useDeleteApiFormModal,

View File

@@ -33,6 +33,7 @@ import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles'; import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import { getDetailUrl } from '@lib/functions/Navigation'; import { getDetailUrl } from '@lib/functions/Navigation';
import type { StockOperationProps } from '@lib/types/Forms';
import { notifications } from '@mantine/notifications'; import { notifications } from '@mantine/notifications';
import { useBarcodeScanDialog } from '../../components/barcodes/BarcodeScanDialog'; import { useBarcodeScanDialog } from '../../components/barcodes/BarcodeScanDialog';
import AdminButton from '../../components/buttons/AdminButton'; import AdminButton from '../../components/buttons/AdminButton';
@@ -66,7 +67,6 @@ import OrderPartsWizard from '../../components/wizards/OrderPartsWizard';
import { useApi } from '../../contexts/ApiContext'; import { useApi } from '../../contexts/ApiContext';
import { formatCurrency, formatDecimal } from '../../defaults/formatters'; import { formatCurrency, formatDecimal } from '../../defaults/formatters';
import { import {
type StockOperationProps,
useFindSerialNumberForm, useFindSerialNumberForm,
useStockFields, useStockFields,
useStockItemSerializeFields useStockItemSerializeFields

View File

@@ -12,10 +12,10 @@ import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import { ActionButton } from '@lib/index'; import { ActionButton } from '@lib/index';
import type { TableFilter } from '@lib/types/Filters'; import type { TableFilter } from '@lib/types/Filters';
import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables'; import type { TableColumn } from '@lib/types/Tables';
import { IconCircleDashedCheck } from '@tabler/icons-react'; import { IconCircleDashedCheck } from '@tabler/icons-react';
import { useConsumeBuildItemsForm } from '../../forms/BuildForms'; import { useConsumeBuildItemsForm } from '../../forms/BuildForms';
import type { StockOperationProps } from '../../forms/StockForms';
import { import {
useDeleteApiFormModal, useDeleteApiFormModal,
useEditApiFormModal useEditApiFormModal

View File

@@ -33,6 +33,7 @@ import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles'; import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import type { TableFilter } from '@lib/types/Filters'; import type { TableFilter } from '@lib/types/Filters';
import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables'; import type { TableColumn } from '@lib/types/Tables';
import { StylishText } from '../../components/items/StylishText'; import { StylishText } from '../../components/items/StylishText';
import { useApi } from '../../contexts/ApiContext'; import { useApi } from '../../contexts/ApiContext';
@@ -43,7 +44,6 @@ import {
useScrapBuildOutputsForm useScrapBuildOutputsForm
} from '../../forms/BuildForms'; } from '../../forms/BuildForms';
import { import {
type StockOperationProps,
useStockFields, useStockFields,
useStockItemSerializeFields useStockItemSerializeFields
} from '../../forms/StockForms'; } from '../../forms/StockForms';

View File

@@ -12,11 +12,11 @@ import { ModelType } from '@lib/enums/ModelType';
import { UserRoles } from '@lib/enums/Roles'; import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import type { TableFilter } from '@lib/types/Filters'; import type { TableFilter } from '@lib/types/Filters';
import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables'; import type { TableColumn } from '@lib/types/Tables';
import { IconTruckDelivery } from '@tabler/icons-react'; import { IconTruckDelivery } from '@tabler/icons-react';
import { formatDate } from '../../defaults/formatters'; import { formatDate } from '../../defaults/formatters';
import { useSalesOrderAllocationFields } from '../../forms/SalesOrderForms'; import { useSalesOrderAllocationFields } from '../../forms/SalesOrderForms';
import type { StockOperationProps } from '../../forms/StockForms';
import { import {
useBulkEditApiFormModal, useBulkEditApiFormModal,
useDeleteApiFormModal, useDeleteApiFormModal,

View File

@@ -11,6 +11,7 @@ import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api'; import { apiUrl } from '@lib/functions/Api';
import { getDetailUrl } from '@lib/functions/Navigation'; import { getDetailUrl } from '@lib/functions/Navigation';
import type { TableFilter } from '@lib/types/Filters'; import type { TableFilter } from '@lib/types/Filters';
import type { StockOperationProps } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables'; import type { TableColumn } from '@lib/types/Tables';
import OrderPartsWizard from '../../components/wizards/OrderPartsWizard'; import OrderPartsWizard from '../../components/wizards/OrderPartsWizard';
import { import {
@@ -18,10 +19,7 @@ import {
formatDecimal, formatDecimal,
formatPriceRange formatPriceRange
} from '../../defaults/formatters'; } from '../../defaults/formatters';
import { import { useStockFields } from '../../forms/StockForms';
type StockOperationProps,
useStockFields
} from '../../forms/StockForms';
import { InvenTreeIcon } from '../../functions/icons'; import { InvenTreeIcon } from '../../functions/icons';
import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useCreateApiFormModal } from '../../hooks/UseForm';
import { useStockAdjustActions } from '../../hooks/UseStockAdjustActions'; import { useStockAdjustActions } from '../../hooks/UseStockAdjustActions';