From d91f7be91d0c3be8463be9a4f8d3311d2643b7eb Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 25 Jun 2026 12:29:57 +0000 Subject: [PATCH] Allow stock adjustment from "category" detail view --- src/frontend/lib/types/Forms.tsx | 2 +- .../src/pages/part/CategoryDetail.tsx | 29 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/frontend/lib/types/Forms.tsx b/src/frontend/lib/types/Forms.tsx index 03acfb0ad9..52f6ab1db4 100644 --- a/src/frontend/lib/types/Forms.tsx +++ b/src/frontend/lib/types/Forms.tsx @@ -223,6 +223,6 @@ export type StockOperationProps = { items?: any[]; pk?: number; filters?: any; - model: ModelType.stockitem | 'location' | ModelType.part; + model: ModelType.stockitem | 'location' | 'category' | ModelType.part; refresh: () => void; }; diff --git a/src/frontend/src/pages/part/CategoryDetail.tsx b/src/frontend/src/pages/part/CategoryDetail.tsx index 9d0077e9c8..50f3543d4b 100644 --- a/src/frontend/src/pages/part/CategoryDetail.tsx +++ b/src/frontend/src/pages/part/CategoryDetail.tsx @@ -16,6 +16,7 @@ import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ModelType } from '@lib/enums/ModelType'; import { UserRoles } from '@lib/enums/Roles'; import { getDetailUrl } from '@lib/functions/Navigation'; +import type { StockOperationProps } from '@lib/types/Forms'; import type { PanelType } from '@lib/types/Panel'; import { useLocalStorage } from '@mantine/hooks'; import AdminButton from '../../components/buttons/AdminButton'; @@ -43,6 +44,7 @@ import { useEditApiFormModal } from '../../hooks/UseForm'; import { useInstance } from '../../hooks/UseInstance'; +import { useStockAdjustActions } from '../../hooks/UseStockAdjustActions'; import { useUserSettingsState } from '../../states/SettingsStates'; import { useUserState } from '../../states/UserState'; import ParametricPartTable from '../../tables/part/ParametricPartTable'; @@ -82,6 +84,29 @@ export default function CategoryDetail() { } }); + const stockOperationProps: StockOperationProps = useMemo(() => { + return { + pk: category.pk, + model: 'category', + refresh: refreshInstance, + filters: { + in_stock: true + } + }; + }, [category]); + + const stockAdjustActions = useStockAdjustActions({ + formProps: stockOperationProps, + enabled: true, + add: false, + remove: false, + changeStatus: false, + changeBatch: false, + delete: false, + merge: false, + assign: false + }); + const detailsPanel = useMemo(() => { if (id && instanceQuery.isFetching) { return ; @@ -241,6 +266,7 @@ export default function CategoryDetail() { refreshInstance(); }} />, + stockAdjustActions.dropdown, ]; - }, [id, user, category.pk, category.starred]); + }, [id, user, category.pk, category.starred, stockAdjustActions.dropdown]); const [partsView, setPartsView] = useLocalStorage({ key: 'category-parts-view', @@ -367,6 +393,7 @@ export default function CategoryDetail() { <> {editCategory.modal} {deleteCategory.modal} + {stockAdjustActions.modals.map((modal) => modal.modal)}