From b2a5533b7abbe689fe09590a38b96265febc9cbd Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 26 Jul 2025 16:59:26 +1000 Subject: [PATCH] Stock filters (#10083) * Stock filters - Add "supplier" filter - Add "manufacturer" filter * Fix docstring --- src/frontend/lib/types/Filters.tsx | 2 ++ src/frontend/src/tables/Filter.tsx | 26 +++++++++++++++++++ .../src/tables/FilterSelectDrawer.tsx | 1 + .../src/tables/stock/StockItemTable.tsx | 6 ++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/frontend/lib/types/Filters.tsx b/src/frontend/lib/types/Filters.tsx index 619a33a99e..1ef44a3a84 100644 --- a/src/frontend/lib/types/Filters.tsx +++ b/src/frontend/lib/types/Filters.tsx @@ -33,6 +33,7 @@ export type TableFilterType = 'boolean' | 'choice' | 'date' | 'text' | 'api'; * displayValue: The current display value of the filter * active: Whether the filter is active (false = hidden, not used) * apiUrl: The API URL to use for fetching dynamic filter options + * apiFilter: Optional filters to apply when fetching options from the API * model: The model type to use for fetching dynamic filter options * modelRenderer: A function to render a simple text version of the model type */ @@ -48,6 +49,7 @@ export type TableFilter = { displayValue?: any; active?: boolean; apiUrl?: string; + apiFilter?: Record; model?: ModelType; modelRenderer?: (instance: any) => string; }; diff --git a/src/frontend/src/tables/Filter.tsx b/src/frontend/src/tables/Filter.tsx index f42496a267..4aed278029 100644 --- a/src/frontend/src/tables/Filter.tsx +++ b/src/frontend/src/tables/Filter.tsx @@ -333,6 +333,32 @@ export function UserFilter({ }; } +export function ManufacturerFilter(): TableFilter { + return { + name: 'manufacturer', + label: t`Manufacturer`, + description: t`Filter by manufacturer`, + type: 'api', + apiUrl: apiUrl(ApiEndpoints.company_list), + model: ModelType.company, + modelRenderer: (instance: any) => instance.name, + apiFilter: { is_manufacturer: true } + }; +} + +export function SupplierFilter(): TableFilter { + return { + name: 'supplier', + label: t`Supplier`, + description: t`Filter by supplier`, + type: 'api', + apiUrl: apiUrl(ApiEndpoints.company_list), + model: ModelType.company, + modelRenderer: (instance: any) => instance.name, + apiFilter: { is_supplier: true } + }; +} + export function CreatedByFilter(): TableFilter { return UserFilter({ name: 'created_by', diff --git a/src/frontend/src/tables/FilterSelectDrawer.tsx b/src/frontend/src/tables/FilterSelectDrawer.tsx index bc1a4e5124..eecacf9431 100644 --- a/src/frontend/src/tables/FilterSelectDrawer.tsx +++ b/src/frontend/src/tables/FilterSelectDrawer.tsx @@ -98,6 +98,7 @@ function FilterElement({ fieldDefinition={{ field_type: 'related field', api_url: filterProps.apiUrl, + filters: filterProps.apiFilter, placeholder: t`Select filter value`, model: filterProps.model, label: t`Select filter value`, diff --git a/src/frontend/src/tables/stock/StockItemTable.tsx b/src/frontend/src/tables/stock/StockItemTable.tsx index ee49620244..f784ca9010 100644 --- a/src/frontend/src/tables/stock/StockItemTable.tsx +++ b/src/frontend/src/tables/stock/StockItemTable.tsx @@ -34,10 +34,12 @@ import { HasBatchCodeFilter, IncludeVariantsFilter, IsSerializedFilter, + ManufacturerFilter, SerialFilter, SerialGTEFilter, SerialLTEFilter, - StatusFilterOptions + StatusFilterOptions, + SupplierFilter } from '../Filter'; import { InvenTreeTable } from '../InvenTreeTable'; import { TableHoverCard } from '../TableHoverCard'; @@ -358,6 +360,8 @@ function stockItemTableFilters({ description: t`Show items which are in production` }, IncludeVariantsFilter(), + SupplierFilter(), + ManufacturerFilter(), { name: 'consumed', label: t`Consumed`,