From 7f1f2dbad24c6f1fe2b034fbb64c950f24318d50 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 7 Jun 2026 12:59:33 +1000 Subject: [PATCH] [UI] Table column filters (#12103) * Expose properties for column based filtering * Adjust renderers * Hide filter if name does not match * Allow multiple filters on same column * Better formatting * Add filtering support for multiple tables * Revert yarn.lock changes * Fix date input props * Updated column * Add filter to PartTable * Add playwright tests for new column filters * Update CHANGELOG * Updated docs * Reduce padding * Update more table filters * More filter columns * Adjust playwright test * Simplify playwright test * Robustify playwright tests * Add some delay * Add some buffer time --- CHANGELOG.md | 1 + .../ui_table_column_filter_popover.png | Bin 0 -> 72592 bytes docs/docs/concepts/user_interface.md | 17 ++ .../lib/components/TableColumnSelect.tsx | 2 +- src/frontend/lib/types/Tables.tsx | 7 +- src/frontend/src/tables/ColumnRenderers.tsx | 12 ++ .../src/tables/FilterSelectDrawer.tsx | 169 +++++++++++++++--- src/frontend/src/tables/InvenTreeTable.tsx | 60 ++++++- src/frontend/src/tables/bom/BomTable.tsx | 11 +- src/frontend/src/tables/bom/UsedInTable.tsx | 3 +- .../src/tables/build/BuildLineTable.tsx | 8 + .../src/tables/build/BuildOrderTable.tsx | 9 +- .../src/tables/company/CompanyTable.tsx | 1 + .../src/tables/general/ParameterTable.tsx | 4 +- .../src/tables/part/PartCategoryTable.tsx | 12 +- .../tables/part/PartPurchaseOrdersTable.tsx | 2 + src/frontend/src/tables/part/PartTable.tsx | 18 +- .../src/tables/part/PartTestResultTable.tsx | 8 +- .../purchasing/ManufacturerPartTable.tsx | 4 +- .../tables/purchasing/SupplierPartTable.tsx | 5 +- .../tables/sales/SalesOrderShipmentTable.tsx | 3 + .../src/tables/stock/StockItemTable.tsx | 27 ++- .../tables/stock/StockItemTestResultTable.tsx | 1 + .../src/tables/stock/StockLocationTable.tsx | 1 + src/frontend/tests/helpers.ts | 20 +++ src/frontend/tests/pages/pui_build.spec.ts | 6 +- src/frontend/tests/pages/pui_company.spec.ts | 6 +- src/frontend/tests/pages/pui_part.spec.ts | 12 +- .../tests/pages/pui_purchasing.spec.ts | 20 +-- src/frontend/tests/pages/pui_stock.spec.ts | 6 +- src/frontend/tests/pui_forms.spec.ts | 5 +- src/frontend/tests/pui_login.spec.ts | 6 +- src/frontend/tests/pui_tables.spec.ts | 40 ++++- 33 files changed, 407 insertions(+), 99 deletions(-) create mode 100644 docs/docs/assets/images/concepts/ui_table_column_filter_popover.png diff --git a/CHANGELOG.md b/CHANGELOG.md index dbc6e48ac1..052cdafdcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [#12103](https://github.com/inventree/InvenTree/pull/12103) adds column-based filtering to table views in the user interface. This extends the existing table filtering functionality by allowing users to apply filters directly to individual columns. - [#12093](https://github.com/inventree/InvenTree/pull/12093) adds "read_only" attribute to PluginSetting API endpoint, which indicates whether a particular plugin setting is read-only (i.e. cannot be modified via the API) - [#12079](https://github.com/inventree/InvenTree/pull/12079) adds the ability to save filter groups for table and calendar views in the user interface. This allows users to save and reuse commonly used filter configurations, improving the usability and efficiency of the interface. - [#12077](https://github.com/inventree/InvenTree/pull/12077) adds "tags" fields to multiple new model types and a /api/tag/ endpoint for fetching tags. Also adds the ability to filter various model types by tags. diff --git a/docs/docs/assets/images/concepts/ui_table_column_filter_popover.png b/docs/docs/assets/images/concepts/ui_table_column_filter_popover.png new file mode 100644 index 0000000000000000000000000000000000000000..8e979ed99919b1f28f2dd7f169939dbd20e54c6d GIT binary patch literal 72592 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

&B(AfQLd#H%1L(bhUi`bnN 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 WbVT$goJF9(>$QZ8c%i7S@Baf`BM{>N literal 0 HcmV?d00001 diff --git a/docs/docs/concepts/user_interface.md b/docs/docs/concepts/user_interface.md index 64255d6145..c9973c514c 100644 --- a/docs/docs/concepts/user_interface.md +++ b/docs/docs/concepts/user_interface.md @@ -158,6 +158,23 @@ Select the "table filters" button to open the filter selection menu Table filters are saved across browser sessions, allowing users to maintain their preferred filter settings when returning to the particular table view. +#### Column Filters + +Many table columns expose an inline filter icon directly in the column header, providing a quick way to filter by that column without opening the full filter drawer. Columns that support filtering display a small filter icon alongside the column title. The icon is highlighted when a filter for that column is currently active, giving an at-a-glance indication of which columns have active filters. + +Clicking the icon opens a compact popover anchored to the column header: + +{{ image("concepts/ui_table_column_filter_popover.png", "Column Filter Popover") }} + +**Single-filter columns** — for columns linked to one filter (e.g. *Active*, *Has IPN*, *Status*), selecting a value immediately applies the filter and the popover closes automatically. + +**Range columns** — for columns that represent a range concept (e.g. *Start Date*, *Target Date*, *Creation Date*), the popover stays open and presents multiple controls — for example *before* and *after* date pickers — so both bounds can be set in a single interaction. + +Once a filter is active, the popover shows a badge with the current value and a remove button (red ×) instead of the value picker. Clicking the × clears only that column's filter. + +!!! info "Column filters and the filter drawer share the same state" + Filters applied via a column popover appear immediately in the filter drawer's active-filter list, and filters added through the drawer are reflected in the column icons. Clearing all filters from the drawer also removes any filters set via column popovers. + #### Saved Filter Groups Frequently used combinations of filters can be saved as a named *filter group*, allowing them to be quickly recalled later without having to re-add each filter individually. diff --git a/src/frontend/lib/components/TableColumnSelect.tsx b/src/frontend/lib/components/TableColumnSelect.tsx index c686ce65c6..5b99ffc82f 100644 --- a/src/frontend/lib/components/TableColumnSelect.tsx +++ b/src/frontend/lib/components/TableColumnSelect.tsx @@ -23,7 +23,7 @@ export function TableColumnSelect({ {t`Select Columns`} {columns - .filter((col) => col.switchable ?? true) + .filter((col) => (col.switchable ?? true) && !col.propHidden) .map((col) => ( = { editable?: boolean; definition?: ApiFormFieldType; render?: (record: T, index?: number) => any; - filter?: any; + filter?: + | string + | string[] + | (({ close }: { close: () => void }) => ReactNode); filtering?: boolean; width?: number; minWidth?: string | number; diff --git a/src/frontend/src/tables/ColumnRenderers.tsx b/src/frontend/src/tables/ColumnRenderers.tsx index f3c61e8990..b2d4eb4f81 100644 --- a/src/frontend/src/tables/ColumnRenderers.tsx +++ b/src/frontend/src/tables/ColumnRenderers.tsx @@ -117,6 +117,7 @@ export function IPNColumn(props: TableColumnProps): TableColumn { switchable: true, title: t`IPN`, copyable: true, + filter: 'has_ipn', ...props }; } @@ -433,6 +434,7 @@ export function BooleanColumn(props: TableColumn): TableColumn { sortable: true, switchable: true, minWidth: '75px', + filter: props.filter ?? props.accessor, render: (record: any) => (

@@ -564,6 +566,7 @@ export function ProjectCodeColumn(props: TableColumnProps): TableColumn { sortable: true, title: t`Project Code`, hidden: !enabled, + filter: 'project_code', render: (record: any) => { const project_code = resolveItem( record, @@ -584,6 +587,7 @@ export function StatusColumn(props: StatusColumnProps): TableColumn { return { accessor: 'status', + filter: 'status', sortable: true, switchable: true, minWidth: '50px', @@ -636,6 +640,7 @@ export function CreatedByColumn(props: TableColumnProps): TableColumn { accessor: 'created_by', ordering: 'created_by', title: t`Created By`, + filter: 'created_by', ...props }); } @@ -665,6 +670,7 @@ export function ResponsibleColumn(props: TableColumnProps): TableColumn { accessor: 'responsible_detail', ordering: 'responsible', title: t`Responsible`, + filter: 'assigned_to', ...props }); } @@ -688,6 +694,7 @@ export function StartDateColumn(props: TableColumnProps): TableColumn { return DateColumn({ accessor: 'start_date', title: t`Start Date`, + filter: ['has_start_date', 'start_date_before', 'start_date_after'], ...props }); } @@ -696,6 +703,7 @@ export function TargetDateColumn(props: TableColumnProps): TableColumn { return DateColumn({ accessor: 'target_date', title: t`Target Date`, + filter: ['has_target_date', 'target_date_before', 'target_date_after'], ...props }); } @@ -704,6 +712,7 @@ export function CreationDateColumn(props: TableColumnProps): TableColumn { return DateColumn({ accessor: 'creation_date', title: t`Creation Date`, + filter: ['created_before', 'created_after'], ...props }); } @@ -712,6 +721,7 @@ export function CompletionDateColumn(props: TableColumnProps): TableColumn { return DateColumn({ accessor: 'completion_date', title: t`Completion Date`, + filter: ['completed_before', 'completed_after'], ...props }); } @@ -720,6 +730,7 @@ export function ShipmentDateColumn(props: TableColumnProps): TableColumn { return DateColumn({ accessor: 'shipment_date', title: t`Shipment Date`, + filter: ['shipment_date_before', 'shipment_date_after'], ...props }); } @@ -729,6 +740,7 @@ export function UpdatedAtColumn(props: TableColumnProps): TableColumn { accessor: 'updated_at', title: t`Updated`, defaultVisible: false, + filter: ['updated_before', 'updated_after'], extra: { showTime: true }, ...props }); diff --git a/src/frontend/src/tables/FilterSelectDrawer.tsx b/src/frontend/src/tables/FilterSelectDrawer.tsx index 78eecb16ea..8be8e4f9f8 100644 --- a/src/frontend/src/tables/FilterSelectDrawer.tsx +++ b/src/frontend/src/tables/FilterSelectDrawer.tsx @@ -182,15 +182,17 @@ function MultiApiFilterElement({ ); } -function FilterElement({ +export function FilterElement({ filterName, filterProps, valueOptions, + brief = false, onValueChange }: { filterName: string; filterProps: TableFilter; valueOptions: TableFilterChoice[]; + brief?: boolean; onValueChange: (value: string | null, displayValue?: any) => void; }) { const setDateValue = useCallback( @@ -226,7 +228,7 @@ function FilterElement({ filters: filterProps.apiFilter, placeholder: t`Select filter value`, model: filterProps.model, - label: t`Select filter value`, + label: brief ? undefined : t`Select filter value`, onValueChange: (value: any, instance: any) => { if (filterProps.transform) { const choice = filterProps.transform(instance); @@ -244,9 +246,10 @@ function FilterElement({ case 'text': return ( } - onChange={(e) => setTextValue(e.currentTarget.value)} - onKeyDown={(e) => { + onChange={(e: React.ChangeEvent) => + setTextValue(e.currentTarget.value) + } + onKeyDown={(e: React.KeyboardEvent) => { if (e.key === 'Enter') { onValueChange(textValue); } @@ -267,9 +272,11 @@ function FilterElement({ case 'date': return ( ); case 'choice': @@ -278,8 +285,9 @@ function FilterElement({ return (