2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-18 10:46:31 +00:00

PartParameter updates (#10023)

* Add mixin for storing user who last updated an instance

* Add mixin to "PartParameter" model

* Fix typo

* Fix strings

* Refactor mixin class

* Update part parameter table:

- Add "user" filter
- Add "updated_by" column
- Add "update" column
- Add "note" column

* Fix for updating date

* Add user information when saving parameter

* small refactors

* Bump API version

* Add unit test for "updated" and "updated_by" fields

* Check for 'note' field

* Update docs image
This commit is contained in:
Oliver
2025-07-15 22:34:07 +10:00
committed by GitHub
parent 75ab57bc0b
commit d99ec3e1a1
13 changed files with 203 additions and 22 deletions

View File

@@ -250,7 +250,8 @@ export function usePartParameterFields({
// Coerce boolean value into a string (required by backend)
return value.toString();
}
}
},
note: {}
};
}, [editTemplate, fieldType, choices]);
}

View File

@@ -12,9 +12,11 @@ import { YesNoButton } from '@lib/components/YesNoButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { UserRoles } from '@lib/enums/Roles';
import { apiUrl } from '@lib/functions/Api';
import type { TableFilter } from '@lib/types/Filters';
import type { ApiFormFieldSet } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables';
import { AddItemButton } from '../../components/buttons/AddItemButton';
import { RenderUser } from '../../components/render/User';
import { formatDecimal } from '../../defaults/formatters';
import { usePartParameterFields } from '../../forms/PartForms';
import {
@@ -24,7 +26,13 @@ import {
} from '../../hooks/UseForm';
import { useTable } from '../../hooks/UseTable';
import { useUserState } from '../../states/UserState';
import { DescriptionColumn, PartColumn } from '../ColumnRenderers';
import {
DateColumn,
DescriptionColumn,
NoteColumn,
PartColumn
} from '../ColumnRenderers';
import { UserFilter } from '../Filter';
import { InvenTreeTable } from '../InvenTreeTable';
import { TableHoverCard } from '../TableHoverCard';
@@ -108,10 +116,45 @@ export function PartParameterTable({
accessor: 'template_detail.units',
ordering: 'units',
sortable: true
},
NoteColumn({}),
DateColumn({
accessor: 'updated',
title: t`Last Updated`,
sortable: true,
switchable: true
}),
{
accessor: 'updated_by',
title: t`Updated By`,
sortable: true,
switchable: true,
render: (record: any) => {
return record.updated_by_detail ? (
<RenderUser instance={record.updated_by_detail} />
) : (
'-'
);
}
}
];
}, [partId]);
const tableFilters: TableFilter[] = useMemo(() => {
return [
{
name: 'include_variants',
label: t`Include Variants`,
type: 'boolean'
},
UserFilter({
name: 'updated_by',
label: t`Updated By`,
description: t`Filter by user who last updated the parameter`
})
];
}, []);
const partParameterFields: ApiFormFieldSet = usePartParameterFields({});
const newParameter = useCreateApiFormModal({
@@ -211,13 +254,7 @@ export function PartParameterTable({
rowActions: rowActions,
enableDownload: true,
tableActions: tableActions,
tableFilters: [
{
name: 'include_variants',
label: t`Include Variants`,
type: 'boolean'
}
],
tableFilters: tableFilters,
params: {
part: partId,
template_detail: true,

View File

@@ -419,6 +419,8 @@ test('Parts - Parameters', async ({ browser }) => {
await page.getByLabel('choice-field-data').click();
await page.getByRole('option', { name: 'Green' }).click();
await page.getByLabel('text-field-note').fill('A custom note field');
// Select the "polarized" parameter template (should create a "checkbox" field)
await page.getByLabel('related-field-template').fill('Polarized');
await page.getByText('Is this part polarized?').click();