2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-30 12:36:45 +00:00

Table date filters (#8299)

* Add date filtering for tables

* Update filters for build order table

* Update other tables

* Typing fix

* Fix filter type
This commit is contained in:
Oliver 2024-10-16 20:18:59 +11:00 committed by GitHub
parent 7c19e51d80
commit 0c9e986796
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 116 additions and 47 deletions

View File

@ -11,6 +11,15 @@ export type TableFilterChoice = {
label: string;
};
/**
* Available filter types
*
* boolean: A simple true/false filter
* choice: A filter which allows selection from a list of (supplied)
* date: A filter which allows selection from a date input
*/
export type TableFilterType = 'boolean' | 'choice' | 'date';
/**
* Interface for the table filter type. Provides a number of options for selecting filter value:
*
@ -22,7 +31,7 @@ export type TableFilter = {
name: string;
label: string;
description?: string;
type?: string;
type?: TableFilterType;
choices?: TableFilterChoice[];
choiceFunction?: () => TableFilterChoice[];
defaultValue?: any;
@ -83,9 +92,12 @@ export function StatusFilterOptions(
};
}
// Define some commonly used filters
export function AssignedToMeFilter(): TableFilter {
return {
name: 'assigned_to_me',
type: 'boolean',
label: t`Assigned to me`,
description: t`Show orders assigned to me`
};
@ -95,7 +107,7 @@ export function OutstandingFilter(): TableFilter {
return {
name: 'outstanding',
label: t`Outstanding`,
description: t`Show outstanding orders`
description: t`Show outstanding items`
};
}
@ -103,6 +115,33 @@ export function OverdueFilter(): TableFilter {
return {
name: 'overdue',
label: t`Overdue`,
description: t`Show overdue orders`
description: t`Show overdue items`
};
}
export function MinDateFilter(): TableFilter {
return {
name: 'min_date',
label: t`Minimum Date`,
description: t`Show items after this date`,
type: 'date'
};
}
export function MaxDateFilter(): TableFilter {
return {
name: 'max_date',
label: t`Maximum Date`,
description: t`Show items before this date`,
type: 'date'
};
}
export function HasProjectCodeFilter(): TableFilter {
return {
name: 'has_project_code',
type: 'boolean',
label: t`Has Project Code`,
description: t`Show orders with an assigned project code`
};
}

View File

@ -1,4 +1,5 @@
import { t } from '@lingui/macro';
import { L } from '@lingui/react/dist/shared/react.e5f95de8';
import {
Badge,
Button,
@ -12,6 +13,8 @@ import {
Text,
Tooltip
} from '@mantine/core';
import { DateInput, DateValue } from '@mantine/dates';
import dayjs from 'dayjs';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { StylishText } from '../components/items/StylishText';
@ -19,6 +22,7 @@ import { TableState } from '../hooks/UseTable';
import {
TableFilter,
TableFilterChoice,
TableFilterType,
getTableFilterOptions
} from './Filter';
@ -99,6 +103,14 @@ function FilterAddGroup({
return getTableFilterOptions(filter);
}, [selectedFilter]);
// Determine the "type" of filter (default = boolean)
const filterType: TableFilterType = useMemo(() => {
return (
availableFilters?.find((flt) => flt.name === selectedFilter)?.type ??
'boolean'
);
}, [selectedFilter]);
const setSelectedValue = useCallback(
(value: string | null) => {
// Find the matching filter
@ -126,6 +138,18 @@ function FilterAddGroup({
[selectedFilter]
);
const setDateValue = useCallback(
(value: DateValue) => {
if (value) {
let date = value.toString();
setSelectedValue(dayjs(date).format('YYYY-MM-DD'));
} else {
setSelectedValue('');
}
},
[setSelectedValue]
);
return (
<Stack gap="xs">
<Divider />
@ -137,16 +161,23 @@ function FilterAddGroup({
onChange={(value: string | null) => setSelectedFilter(value)}
maxDropdownHeight={800}
/>
{selectedFilter && (
<Select
data={valueOptions}
label={t`Value`}
searchable={true}
placeholder={t`Select filter value`}
onChange={(value: string | null) => setSelectedValue(value)}
maxDropdownHeight={800}
/>
)}
{selectedFilter &&
(filterType === 'date' ? (
<DateInput
label={t`Value`}
placeholder={t`Select date value`}
onChange={setDateValue}
/>
) : (
<Select
data={valueOptions}
label={t`Value`}
searchable={true}
placeholder={t`Select filter value`}
onChange={(value: string | null) => setSelectedValue(value)}
maxDropdownHeight={800}
/>
))}
</Stack>
);
}

View File

@ -23,7 +23,15 @@ import {
StatusColumn,
TargetDateColumn
} from '../ColumnRenderers';
import { StatusFilterOptions, TableFilter } from '../Filter';
import {
AssignedToMeFilter,
HasProjectCodeFilter,
MaxDateFilter,
MinDateFilter,
OverdueFilter,
StatusFilterOptions,
TableFilter
} from '../Filter';
import { InvenTreeTable } from '../InvenTreeTable';
/*
@ -115,29 +123,17 @@ export function BuildOrderTable({
description: t`Filter by order status`,
choiceFunction: StatusFilterOptions(ModelType.build)
},
{
name: 'overdue',
label: t`Overdue`,
type: 'boolean',
description: t`Show overdue status`
},
{
name: 'assigned_to_me',
type: 'boolean',
label: t`Assigned to me`,
description: t`Show orders assigned to me`
},
OverdueFilter(),
AssignedToMeFilter(),
MinDateFilter(),
MaxDateFilter(),
{
name: 'project_code',
label: t`Project Code`,
description: t`Filter by project code`,
choices: projectCodeFilters.choices
},
{
name: 'has_project_code',
label: t`Has Project Code`,
description: t`Filter by whether the purchase order has a project code`
},
HasProjectCodeFilter(),
{
name: 'issued_by',
label: t`Issued By`,

View File

@ -25,6 +25,9 @@ import {
} from '../ColumnRenderers';
import {
AssignedToMeFilter,
HasProjectCodeFilter,
MaxDateFilter,
MinDateFilter,
OutstandingFilter,
OverdueFilter,
StatusFilterOptions,
@ -59,17 +62,15 @@ export function PurchaseOrderTable({
OutstandingFilter(),
OverdueFilter(),
AssignedToMeFilter(),
MinDateFilter(),
MaxDateFilter(),
{
name: 'project_code',
label: t`Project Code`,
description: t`Filter by project code`,
choices: projectCodeFilters.choices
},
{
name: 'has_project_code',
label: t`Has Project Code`,
description: t`Filter by whether the purchase order has a project code`
},
HasProjectCodeFilter(),
{
name: 'assigned_to',
label: t`Responsible`,

View File

@ -25,6 +25,9 @@ import {
} from '../ColumnRenderers';
import {
AssignedToMeFilter,
HasProjectCodeFilter,
MaxDateFilter,
MinDateFilter,
OutstandingFilter,
OverdueFilter,
StatusFilterOptions,
@ -50,17 +53,15 @@ export function ReturnOrderTable({ params }: Readonly<{ params?: any }>) {
OutstandingFilter(),
OverdueFilter(),
AssignedToMeFilter(),
MinDateFilter(),
MaxDateFilter(),
{
name: 'project_code',
label: t`Project Code`,
description: t`Filter by project code`,
choices: projectCodeFilters.choices
},
{
name: 'has_project_code',
label: t`Has Project Code`,
description: t`Filter by whether the purchase order has a project code`
},
HasProjectCodeFilter(),
{
name: 'assigned_to',
label: t`Responsible`,

View File

@ -26,6 +26,9 @@ import {
} from '../ColumnRenderers';
import {
AssignedToMeFilter,
HasProjectCodeFilter,
MaxDateFilter,
MinDateFilter,
OutstandingFilter,
OverdueFilter,
StatusFilterOptions,
@ -57,17 +60,15 @@ export function SalesOrderTable({
OutstandingFilter(),
OverdueFilter(),
AssignedToMeFilter(),
MinDateFilter(),
MaxDateFilter(),
{
name: 'project_code',
label: t`Project Code`,
description: t`Filter by project code`,
choices: projectCodeFilters.choices
},
{
name: 'has_project_code',
label: t`Has Project Code`,
description: t`Filter by whether the purchase order has a project code`
},
HasProjectCodeFilter(),
{
name: 'assigned_to',
label: t`Responsible`,

View File

@ -355,7 +355,7 @@ export function TemplateTable({
name: 'enabled',
label: t`Enabled`,
description: t`Filter by enabled status`,
type: 'checkbox'
type: 'boolean'
},
{
name: 'model_type',