From 7daec214963a70b34c580bdbf36e2fc2c3602eed Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 03:36:51 +0000 Subject: [PATCH 1/8] Add 'created_by' field to order API endpoints --- src/backend/InvenTree/order/serializers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index de12e62f2730..be0f59bd3820 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -50,6 +50,7 @@ InvenTreeModelSerializer, InvenTreeMoneySerializer, NotesFieldMixin, + UserSerializer, ) from order.status_codes import ( PurchaseOrderStatusGroups, @@ -158,6 +159,8 @@ class AbstractOrderSerializer(DataImportExportSerializerMixin, serializers.Seria required=False, allow_null=True, label=_('Creation Date') ) + created_by = UserSerializer(read_only=True) + duplicate = DuplicateOrderSerializer( label=_('Duplicate Order'), help_text=_('Specify options for duplicating this order'), @@ -174,6 +177,7 @@ def validate_reference(self, reference): def annotate_queryset(queryset): """Add extra information to the queryset.""" queryset = queryset.annotate(line_items=SubqueryCount('lines')) + queryset = queryset.select_related('created_by') return queryset @@ -183,6 +187,7 @@ def order_fields(extra_fields): return [ 'pk', 'creation_date', + 'created_by', 'target_date', 'description', 'line_items', From 78a2e6e3a0aba37b5edbe579acfbecf298acd54e Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 03:39:00 +0000 Subject: [PATCH 2/8] Add 'created_by' filter --- src/backend/InvenTree/order/api.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index fc4bb4763c43..19b5fe675183 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -5,6 +5,7 @@ from django.conf import settings from django.contrib.auth import authenticate, login +from django.contrib.auth.models import User from django.db.models import F, Q from django.http.response import JsonResponse from django.urls import include, path, re_path @@ -150,6 +151,10 @@ def filter_has_project_code(self, queryset, name, value): queryset=Owner.objects.all(), field_name='responsible', label=_('Responsible') ) + created_by = rest_filters.ModelChoiceFilter( + queryset=User.objects.all(), field_name='created_by', label=_('Created By') + ) + created_before = InvenTreeDateFilter( label=_('Created Before'), field_name='creation_date', lookup_expr='lt' ) From 6d768d78f904eff6f60b32879a9f625cb5a287a8 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 03:49:02 +0000 Subject: [PATCH 3/8] Allow ordering by 'created_by' field --- src/backend/InvenTree/order/api.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index 19b5fe675183..c48399a38eb5 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -313,6 +313,7 @@ def filter_queryset(self, queryset): ordering_fields = [ 'creation_date', + 'created_by', 'reference', 'supplier__name', 'target_date', @@ -782,6 +783,7 @@ def filter_queryset(self, queryset): ordering_fields = [ 'creation_date', + 'created_by', 'reference', 'customer__name', 'customer_reference', @@ -1378,6 +1380,7 @@ def create(self, request, *args, **kwargs): ordering_fields = [ 'creation_date', + 'created_by', 'reference', 'customer__name', 'customer_reference', From 2fc20078d86bbae7f1deed8686aabd72ac027ca9 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 03:55:19 +0000 Subject: [PATCH 4/8] Update UI tables - Show "Created By" column - Column sorting - Column filtering --- src/frontend/src/tables/ColumnRenderers.tsx | 14 +++++++++++- .../tables/purchasing/PurchaseOrderTable.tsx | 21 ++++++++++++++++-- .../src/tables/sales/ReturnOrderTable.tsx | 22 +++++++++++++++++-- .../src/tables/sales/SalesOrderTable.tsx | 22 +++++++++++++++++-- 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/tables/ColumnRenderers.tsx b/src/frontend/src/tables/ColumnRenderers.tsx index 0d25ff8b91c2..d01d62f8efc3 100644 --- a/src/frontend/src/tables/ColumnRenderers.tsx +++ b/src/frontend/src/tables/ColumnRenderers.tsx @@ -9,7 +9,7 @@ import { YesNoButton } from '../components/buttons/YesNoButton'; import { Thumbnail } from '../components/images/Thumbnail'; import { ProgressBar } from '../components/items/ProgressBar'; import { TableStatusRenderer } from '../components/render/StatusRenderer'; -import { RenderOwner } from '../components/render/User'; +import { RenderOwner, RenderUser } from '../components/render/User'; import { formatCurrency, formatDate } from '../defaults/formatters'; import type { ModelType } from '../enums/ModelType'; import { resolveItem } from '../functions/conversion'; @@ -202,6 +202,18 @@ export function StatusColumn({ }; } +export function CreatedByColumn(props: TableColumnProps): TableColumn { + return { + accessor: 'created_by', + title: t`Created By`, + sortable: true, + switchable: true, + render: (record: any) => + record.created_by && RenderUser({ instance: record.created_by }), + ...props + }; +} + export function ResponsibleColumn(props: TableColumnProps): TableColumn { return { accessor: 'responsible', diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx index 72c763b35dfe..2c5c381697cd 100644 --- a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx +++ b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx @@ -8,13 +8,18 @@ import { ApiEndpoints } from '../../enums/ApiEndpoints'; import { ModelType } from '../../enums/ModelType'; import { UserRoles } from '../../enums/Roles'; import { usePurchaseOrderFields } from '../../forms/PurchaseOrderForms'; -import { useOwnerFilters, useProjectCodeFilters } from '../../hooks/UseFilter'; +import { + useOwnerFilters, + useProjectCodeFilters, + useUserFilters +} from '../../hooks/UseFilter'; import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import { apiUrl } from '../../states/ApiState'; import { useUserState } from '../../states/UserState'; import { CompletionDateColumn, + CreatedByColumn, CreationDateColumn, DescriptionColumn, LineItemsProgressColumn, @@ -57,6 +62,7 @@ export function PurchaseOrderTable({ const projectCodeFilters = useProjectCodeFilters(); const responsibleFilters = useOwnerFilters(); + const createdByFilters = useUserFilters(); const tableFilters: TableFilter[] = useMemo(() => { return [ @@ -89,9 +95,19 @@ export function PurchaseOrderTable({ label: t`Responsible`, description: t`Filter by responsible owner`, choices: responsibleFilters.choices + }, + { + name: 'created_by', + label: t`Created By`, + description: t`Filter by user who created the order`, + choices: createdByFilters.choices } ]; - }, [projectCodeFilters.choices, responsibleFilters.choices]); + }, [ + projectCodeFilters.choices, + responsibleFilters.choices, + createdByFilters.choices + ]); const tableColumns = useMemo(() => { return [ @@ -120,6 +136,7 @@ export function PurchaseOrderTable({ StatusColumn({ model: ModelType.purchaseorder }), ProjectCodeColumn({}), CreationDateColumn({}), + CreatedByColumn({}), TargetDateColumn({}), CompletionDateColumn({ accessor: 'complete_date' diff --git a/src/frontend/src/tables/sales/ReturnOrderTable.tsx b/src/frontend/src/tables/sales/ReturnOrderTable.tsx index 6a5f6f96944f..ed13770019f1 100644 --- a/src/frontend/src/tables/sales/ReturnOrderTable.tsx +++ b/src/frontend/src/tables/sales/ReturnOrderTable.tsx @@ -8,13 +8,18 @@ import { ApiEndpoints } from '../../enums/ApiEndpoints'; import { ModelType } from '../../enums/ModelType'; import { UserRoles } from '../../enums/Roles'; import { useReturnOrderFields } from '../../forms/ReturnOrderForms'; -import { useOwnerFilters, useProjectCodeFilters } from '../../hooks/UseFilter'; +import { + useOwnerFilters, + useProjectCodeFilters, + useUserFilters +} from '../../hooks/UseFilter'; import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import { apiUrl } from '../../states/ApiState'; import { useUserState } from '../../states/UserState'; import { CompletionDateColumn, + CreatedByColumn, CreationDateColumn, DescriptionColumn, LineItemsProgressColumn, @@ -54,6 +59,7 @@ export function ReturnOrderTable({ const projectCodeFilters = useProjectCodeFilters(); const responsibleFilters = useOwnerFilters(); + const createdByFilters = useUserFilters(); const tableFilters: TableFilter[] = useMemo(() => { const filters: TableFilter[] = [ @@ -86,6 +92,12 @@ export function ReturnOrderTable({ label: t`Responsible`, description: t`Filter by responsible owner`, choices: responsibleFilters.choices + }, + { + name: 'created_by', + label: t`Created By`, + description: t`Filter by user who created the order`, + choices: createdByFilters.choices } ]; @@ -99,7 +111,12 @@ export function ReturnOrderTable({ } return filters; - }, [partId, projectCodeFilters.choices, responsibleFilters.choices]); + }, [ + partId, + projectCodeFilters.choices, + responsibleFilters.choices, + createdByFilters.choices + ]); const tableColumns = useMemo(() => { return [ @@ -128,6 +145,7 @@ export function ReturnOrderTable({ StatusColumn({ model: ModelType.returnorder }), ProjectCodeColumn({}), CreationDateColumn({}), + CreatedByColumn({}), TargetDateColumn({}), CompletionDateColumn({ accessor: 'complete_date' diff --git a/src/frontend/src/tables/sales/SalesOrderTable.tsx b/src/frontend/src/tables/sales/SalesOrderTable.tsx index 265ec9a214ad..68afdde74e73 100644 --- a/src/frontend/src/tables/sales/SalesOrderTable.tsx +++ b/src/frontend/src/tables/sales/SalesOrderTable.tsx @@ -9,12 +9,17 @@ import { ApiEndpoints } from '../../enums/ApiEndpoints'; import { ModelType } from '../../enums/ModelType'; import { UserRoles } from '../../enums/Roles'; import { useSalesOrderFields } from '../../forms/SalesOrderForms'; -import { useOwnerFilters, useProjectCodeFilters } from '../../hooks/UseFilter'; +import { + useOwnerFilters, + useProjectCodeFilters, + useUserFilters +} from '../../hooks/UseFilter'; import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import { apiUrl } from '../../states/ApiState'; import { useUserState } from '../../states/UserState'; import { + CreatedByColumn, CreationDateColumn, DescriptionColumn, LineItemsProgressColumn, @@ -55,6 +60,7 @@ export function SalesOrderTable({ const projectCodeFilters = useProjectCodeFilters(); const responsibleFilters = useOwnerFilters(); + const createdByFilters = useUserFilters(); const tableFilters: TableFilter[] = useMemo(() => { const filters: TableFilter[] = [ @@ -87,6 +93,12 @@ export function SalesOrderTable({ label: t`Responsible`, description: t`Filter by responsible owner`, choices: responsibleFilters.choices + }, + { + name: 'created_by', + label: t`Created By`, + description: t`Filter by user who created the order`, + choices: createdByFilters.choices } ]; @@ -100,7 +112,12 @@ export function SalesOrderTable({ } return filters; - }, [partId, projectCodeFilters.choices, responsibleFilters.choices]); + }, [ + partId, + projectCodeFilters.choices, + responsibleFilters.choices, + createdByFilters.choices + ]); const salesOrderFields = useSalesOrderFields({}); @@ -165,6 +182,7 @@ export function SalesOrderTable({ StatusColumn({ model: ModelType.salesorder }), ProjectCodeColumn({}), CreationDateColumn({}), + CreatedByColumn({}), TargetDateColumn({}), ShipmentDateColumn({}), ResponsibleColumn({}), From 787e4fdfcc598ecdb3479f25ae9dd2ad292a9d27 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 03:59:14 +0000 Subject: [PATCH 5/8] Cleanup order detail pages --- .../src/pages/purchasing/PurchaseOrderDetail.tsx | 16 +++++++++------- .../src/pages/sales/ReturnOrderDetail.tsx | 14 +++++++------- .../src/pages/sales/SalesOrderDetail.tsx | 14 +++++++------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx index 22ec2225b4ed..2d5e13e719c5 100644 --- a/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx +++ b/src/frontend/src/pages/purchasing/PurchaseOrderDetail.tsx @@ -217,6 +217,13 @@ export default function PurchaseOrderDetail() { icon: 'reference', copy: true, hidden: !order.project_code + }, + { + type: 'text', + name: 'responsible', + label: t`Responsible`, + badge: 'owner', + hidden: !order.responsible } ]; @@ -225,6 +232,7 @@ export default function PurchaseOrderDetail() { type: 'date', name: 'creation_date', label: t`Creation Date`, + copy: true, icon: 'calendar' }, { @@ -240,6 +248,7 @@ export default function PurchaseOrderDetail() { name: 'target_date', label: t`Target Date`, icon: 'calendar', + copy: true, hidden: !order.target_date }, { @@ -249,13 +258,6 @@ export default function PurchaseOrderDetail() { label: t`Completion Date`, copy: true, hidden: !order.complete_date - }, - { - type: 'text', - name: 'responsible', - label: t`Responsible`, - badge: 'owner', - hidden: !order.responsible } ]; diff --git a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx index bbba1340c5fe..d598134805fc 100644 --- a/src/frontend/src/pages/sales/ReturnOrderDetail.tsx +++ b/src/frontend/src/pages/sales/ReturnOrderDetail.tsx @@ -187,6 +187,13 @@ export default function ReturnOrderDetail() { icon: 'reference', copy: true, hidden: !order.project_code + }, + { + type: 'text', + name: 'responsible', + label: t`Responsible`, + badge: 'owner', + hidden: !order.responsible } ]; @@ -221,13 +228,6 @@ export default function ReturnOrderDetail() { label: t`Completion Date`, copy: true, hidden: !order.complete_date - }, - { - type: 'text', - name: 'responsible', - label: t`Responsible`, - badge: 'owner', - hidden: !order.responsible } ]; diff --git a/src/frontend/src/pages/sales/SalesOrderDetail.tsx b/src/frontend/src/pages/sales/SalesOrderDetail.tsx index c02627361c8c..c0b7e0fa23f9 100644 --- a/src/frontend/src/pages/sales/SalesOrderDetail.tsx +++ b/src/frontend/src/pages/sales/SalesOrderDetail.tsx @@ -199,6 +199,13 @@ export default function SalesOrderDetail() { icon: 'reference', copy: true, hidden: !order.project_code + }, + { + type: 'text', + name: 'responsible', + label: t`Responsible`, + badge: 'owner', + hidden: !order.responsible } ]; @@ -231,13 +238,6 @@ export default function SalesOrderDetail() { label: t`Completion Date`, hidden: !order.shipment_date, copy: true - }, - { - type: 'text', - name: 'responsible', - label: t`Responsible`, - badge: 'owner', - hidden: !order.responsible } ]; From 1866cadb5b15f7c0aa60e53dfc888de9d32428bc Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 04:03:10 +0000 Subject: [PATCH 6/8] Bump API version --- src/backend/InvenTree/InvenTree/api_version.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 14c4f62e5b40..9e3d1d5bb677 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,13 +1,18 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 297 +INVENTREE_API_VERSION = 298 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v298 - 2025-01-07 - https://github.com/inventree/InvenTree/pull/8848 + - Adds 'created_by' field to PurchaseOrder API endpoints + - Adds 'created_by' field to SalesOrder API endpoints + - Adds 'created_by' field to ReturnOrder API endpoints + v297 - 2024-12-29 - https://github.com/inventree/InvenTree/pull/8438 - Adjustments to the CustomUserState API endpoints and serializers From 4f61092b9ae748aa553c6f0093d5c49916055e46 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 04:20:33 +0000 Subject: [PATCH 7/8] Refactor table filters --- src/frontend/src/tables/Filter.tsx | 44 +++++++++++++++++++ .../src/tables/build/BuildOrderTable.tsx | 25 +++-------- .../tables/purchasing/PurchaseOrderTable.tsx | 33 ++++---------- .../src/tables/sales/ReturnOrderTable.tsx | 33 ++++---------- .../src/tables/sales/SalesOrderTable.tsx | 33 ++++---------- 5 files changed, 74 insertions(+), 94 deletions(-) diff --git a/src/frontend/src/tables/Filter.tsx b/src/frontend/src/tables/Filter.tsx index f53d5e37f447..dbeca42138ad 100644 --- a/src/frontend/src/tables/Filter.tsx +++ b/src/frontend/src/tables/Filter.tsx @@ -205,3 +205,47 @@ export function HasProjectCodeFilter(): TableFilter { description: t`Show orders with an assigned project code` }; } + +export function OrderStatusFilter({ + model +}: { model: ModelType }): TableFilter { + return { + name: 'status', + label: t`Status`, + description: t`Filter by order status`, + choiceFunction: StatusFilterOptions(model) + }; +} + +export function ProjectCodeFilter({ + choices +}: { choices: TableFilterChoice[] }): TableFilter { + return { + name: 'project_code', + label: t`Project Code`, + description: t`Filter by project code`, + choices: choices + }; +} + +export function ResponsibleFilter({ + choices +}: { choices: TableFilterChoice[] }): TableFilter { + return { + name: 'assigned_to', + label: t`Responsible`, + description: t`Filter by responsible owner`, + choices: choices + }; +} + +export function CreatedByFilter({ + choices +}: { choices: TableFilterChoice[] }): TableFilter { + return { + name: 'created_by', + label: t`Created By`, + description: t`Filter by user who created the order`, + choices: choices + }; +} diff --git a/src/frontend/src/tables/build/BuildOrderTable.tsx b/src/frontend/src/tables/build/BuildOrderTable.tsx index 01531866f0d3..723715d4858d 100644 --- a/src/frontend/src/tables/build/BuildOrderTable.tsx +++ b/src/frontend/src/tables/build/BuildOrderTable.tsx @@ -32,8 +32,10 @@ import { HasProjectCodeFilter, MaxDateFilter, MinDateFilter, + OrderStatusFilter, OverdueFilter, - StatusFilterOptions, + ProjectCodeFilter, + ResponsibleFilter, type TableFilter, TargetDateAfterFilter, TargetDateBeforeFilter @@ -126,12 +128,7 @@ export function BuildOrderTable({ label: t`Outstanding`, description: t`Show outstanding orders` }, - { - name: 'status', - label: t`Status`, - description: t`Filter by order status`, - choiceFunction: StatusFilterOptions(ModelType.build) - }, + OrderStatusFilter({ model: ModelType.build }), OverdueFilter(), AssignedToMeFilter(), MinDateFilter(), @@ -142,12 +139,7 @@ export function BuildOrderTable({ TargetDateAfterFilter(), CompletedBeforeFilter(), CompletedAfterFilter(), - { - name: 'project_code', - label: t`Project Code`, - description: t`Filter by project code`, - choices: projectCodeFilters.choices - }, + ProjectCodeFilter({ choices: projectCodeFilters.choices }), HasProjectCodeFilter(), { name: 'issued_by', @@ -155,12 +147,7 @@ export function BuildOrderTable({ description: t`Filter by user who issued this order`, choices: ownerFilters.choices }, - { - name: 'assigned_to', - label: t`Responsible`, - description: t`Filter by responsible owner`, - choices: ownerFilters.choices - } + ResponsibleFilter({ choices: ownerFilters.choices }) ]; // If we are filtering on a specific part, we can include the "include variants" filter diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx index 2c5c381697cd..36c343bad92a 100644 --- a/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx +++ b/src/frontend/src/tables/purchasing/PurchaseOrderTable.tsx @@ -35,12 +35,15 @@ import { CompletedBeforeFilter, CreatedAfterFilter, CreatedBeforeFilter, + CreatedByFilter, HasProjectCodeFilter, MaxDateFilter, MinDateFilter, + OrderStatusFilter, OutstandingFilter, OverdueFilter, - StatusFilterOptions, + ProjectCodeFilter, + ResponsibleFilter, type TableFilter, TargetDateAfterFilter, TargetDateBeforeFilter @@ -66,12 +69,7 @@ export function PurchaseOrderTable({ const tableFilters: TableFilter[] = useMemo(() => { return [ - { - name: 'status', - label: t`Status`, - description: t`Filter by order status`, - choiceFunction: StatusFilterOptions(ModelType.purchaseorder) - }, + OrderStatusFilter({ model: ModelType.purchaseorder }), OutstandingFilter(), OverdueFilter(), AssignedToMeFilter(), @@ -83,25 +81,10 @@ export function PurchaseOrderTable({ TargetDateAfterFilter(), CompletedBeforeFilter(), CompletedAfterFilter(), - { - name: 'project_code', - label: t`Project Code`, - description: t`Filter by project code`, - choices: projectCodeFilters.choices - }, + ProjectCodeFilter({ choices: projectCodeFilters.choices }), HasProjectCodeFilter(), - { - name: 'assigned_to', - label: t`Responsible`, - description: t`Filter by responsible owner`, - choices: responsibleFilters.choices - }, - { - name: 'created_by', - label: t`Created By`, - description: t`Filter by user who created the order`, - choices: createdByFilters.choices - } + ResponsibleFilter({ choices: responsibleFilters.choices }), + CreatedByFilter({ choices: createdByFilters.choices }) ]; }, [ projectCodeFilters.choices, diff --git a/src/frontend/src/tables/sales/ReturnOrderTable.tsx b/src/frontend/src/tables/sales/ReturnOrderTable.tsx index ed13770019f1..d1715a365813 100644 --- a/src/frontend/src/tables/sales/ReturnOrderTable.tsx +++ b/src/frontend/src/tables/sales/ReturnOrderTable.tsx @@ -35,12 +35,15 @@ import { CompletedBeforeFilter, CreatedAfterFilter, CreatedBeforeFilter, + CreatedByFilter, HasProjectCodeFilter, MaxDateFilter, MinDateFilter, + OrderStatusFilter, OutstandingFilter, OverdueFilter, - StatusFilterOptions, + ProjectCodeFilter, + ResponsibleFilter, type TableFilter, TargetDateAfterFilter, TargetDateBeforeFilter @@ -63,12 +66,7 @@ export function ReturnOrderTable({ const tableFilters: TableFilter[] = useMemo(() => { const filters: TableFilter[] = [ - { - name: 'status', - label: t`Status`, - description: t`Filter by order status`, - choiceFunction: StatusFilterOptions(ModelType.returnorder) - }, + OrderStatusFilter({ model: ModelType.returnorder }), OutstandingFilter(), OverdueFilter(), AssignedToMeFilter(), @@ -80,25 +78,10 @@ export function ReturnOrderTable({ TargetDateAfterFilter(), CompletedBeforeFilter(), CompletedAfterFilter(), - { - name: 'project_code', - label: t`Project Code`, - description: t`Filter by project code`, - choices: projectCodeFilters.choices - }, HasProjectCodeFilter(), - { - name: 'assigned_to', - label: t`Responsible`, - description: t`Filter by responsible owner`, - choices: responsibleFilters.choices - }, - { - name: 'created_by', - label: t`Created By`, - description: t`Filter by user who created the order`, - choices: createdByFilters.choices - } + ProjectCodeFilter({ choices: projectCodeFilters.choices }), + ResponsibleFilter({ choices: responsibleFilters.choices }), + CreatedByFilter({ choices: createdByFilters.choices }) ]; if (!!partId) { diff --git a/src/frontend/src/tables/sales/SalesOrderTable.tsx b/src/frontend/src/tables/sales/SalesOrderTable.tsx index 68afdde74e73..62adb55f8621 100644 --- a/src/frontend/src/tables/sales/SalesOrderTable.tsx +++ b/src/frontend/src/tables/sales/SalesOrderTable.tsx @@ -36,12 +36,15 @@ import { CompletedBeforeFilter, CreatedAfterFilter, CreatedBeforeFilter, + CreatedByFilter, HasProjectCodeFilter, MaxDateFilter, MinDateFilter, + OrderStatusFilter, OutstandingFilter, OverdueFilter, - StatusFilterOptions, + ProjectCodeFilter, + ResponsibleFilter, type TableFilter, TargetDateAfterFilter, TargetDateBeforeFilter @@ -64,12 +67,7 @@ export function SalesOrderTable({ const tableFilters: TableFilter[] = useMemo(() => { const filters: TableFilter[] = [ - { - name: 'status', - label: t`Status`, - description: t`Filter by order status`, - choiceFunction: StatusFilterOptions(ModelType.salesorder) - }, + OrderStatusFilter({ model: ModelType.salesorder }), OutstandingFilter(), OverdueFilter(), AssignedToMeFilter(), @@ -81,25 +79,10 @@ export function SalesOrderTable({ TargetDateAfterFilter(), CompletedBeforeFilter(), CompletedAfterFilter(), - { - name: 'project_code', - label: t`Project Code`, - description: t`Filter by project code`, - choices: projectCodeFilters.choices - }, HasProjectCodeFilter(), - { - name: 'assigned_to', - label: t`Responsible`, - description: t`Filter by responsible owner`, - choices: responsibleFilters.choices - }, - { - name: 'created_by', - label: t`Created By`, - description: t`Filter by user who created the order`, - choices: createdByFilters.choices - } + ProjectCodeFilter({ choices: projectCodeFilters.choices }), + ResponsibleFilter({ choices: responsibleFilters.choices }), + CreatedByFilter({ choices: createdByFilters.choices }) ]; if (!!partId) { From f1376d4b551b673466dd3c707b7afb817f231f5b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Jan 2025 04:22:35 +0000 Subject: [PATCH 8/8] Fix BuildOrderTable filters --- .../src/tables/build/BuildOrderTable.tsx | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/frontend/src/tables/build/BuildOrderTable.tsx b/src/frontend/src/tables/build/BuildOrderTable.tsx index 723715d4858d..b8c397ce063b 100644 --- a/src/frontend/src/tables/build/BuildOrderTable.tsx +++ b/src/frontend/src/tables/build/BuildOrderTable.tsx @@ -8,7 +8,11 @@ import { ApiEndpoints } from '../../enums/ApiEndpoints'; import { ModelType } from '../../enums/ModelType'; import { UserRoles } from '../../enums/Roles'; import { useBuildOrderFields } from '../../forms/BuildForms'; -import { useOwnerFilters, useProjectCodeFilters } from '../../hooks/UseFilter'; +import { + useOwnerFilters, + useProjectCodeFilters, + useUserFilters +} from '../../hooks/UseFilter'; import { useCreateApiFormModal } from '../../hooks/UseForm'; import { useTable } from '../../hooks/UseTable'; import { apiUrl } from '../../states/ApiState'; @@ -33,6 +37,7 @@ import { MaxDateFilter, MinDateFilter, OrderStatusFilter, + OutstandingFilter, OverdueFilter, ProjectCodeFilter, ResponsibleFilter, @@ -119,15 +124,11 @@ export function BuildOrderTable({ const projectCodeFilters = useProjectCodeFilters(); const ownerFilters = useOwnerFilters(); + const userFilters = useUserFilters(); const tableFilters: TableFilter[] = useMemo(() => { const filters: TableFilter[] = [ - { - name: 'outstanding', - type: 'boolean', - label: t`Outstanding`, - description: t`Show outstanding orders` - }, + OutstandingFilter(), OrderStatusFilter({ model: ModelType.build }), OverdueFilter(), AssignedToMeFilter(), @@ -145,7 +146,7 @@ export function BuildOrderTable({ name: 'issued_by', label: t`Issued By`, description: t`Filter by user who issued this order`, - choices: ownerFilters.choices + choices: userFilters.choices }, ResponsibleFilter({ choices: ownerFilters.choices }) ]; @@ -161,7 +162,12 @@ export function BuildOrderTable({ } return filters; - }, [partId, projectCodeFilters.choices, ownerFilters.choices]); + }, [ + partId, + projectCodeFilters.choices, + ownerFilters.choices, + userFilters.choices + ]); const user = useUserState();