2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-15 19:45:46 +00:00

Use form state to update values

This commit is contained in:
Oliver Walters
2023-07-27 16:09:36 +10:00
parent be57bee1a8
commit a6b00bb490
2 changed files with 43 additions and 5 deletions

View File

@ -9,7 +9,7 @@ import {
TextInput TextInput
} from '@mantine/core'; } from '@mantine/core';
import { Button, Center, Group, Loader, Stack, Text } from '@mantine/core'; import { Button, Center, Group, Loader, Stack, Text } from '@mantine/core';
import { useForm } from '@mantine/form'; import { UseFormReturnType, useForm } from '@mantine/form';
import { IconAlertCircle } from '@tabler/icons-react'; import { IconAlertCircle } from '@tabler/icons-react';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { AxiosResponse } from 'axios'; import { AxiosResponse } from 'axios';
@ -42,10 +42,12 @@ export type ApiFormFieldType = {
* Render an individual form field * Render an individual form field
*/ */
function ApiFormField({ function ApiFormField({
form,
field, field,
definitions, definitions,
onValueChange onValueChange
}: { }: {
form: UseFormReturnType<Record<string, unknown>>;
field: ApiFormFieldType; field: ApiFormFieldType;
definitions: ApiFormFieldType[]; definitions: ApiFormFieldType[];
onValueChange: (fieldName: string, value: any) => void; onValueChange: (fieldName: string, value: any) => void;
@ -63,6 +65,17 @@ function ApiFormField({
// Format the errors // Format the errors
if (def.errors?.length == 1) { if (def.errors?.length == 1) {
def.error = def.errors[0]; def.error = def.errors[0];
} else if (def.errors?.length ?? 0 > 1) {
// TODO: Build a custom error stack?
} else {
def.error = null;
}
// Retrieve the latest value from the form
let value = form.values[def.name];
if (value != undefined) {
def.value = value;
} }
return def; return def;
@ -70,7 +83,8 @@ function ApiFormField({
// Callback helper when form value changes // Callback helper when form value changes
function onChange(value: any) { function onChange(value: any) {
onValueChange(definition.name, value); // onValueChange(definition.name, value);
form.setValues({ [definition.name]: value });
} }
switch (definition.fieldType) { switch (definition.fieldType) {
@ -133,7 +147,8 @@ export function ApiForm({
onFormError, onFormError,
cancelText = t`Cancel`, cancelText = t`Cancel`,
submitText = t`Submit`, submitText = t`Submit`,
method = 'PUT' method = 'PUT',
fetchInitialData = false
}: { }: {
name: string; name: string;
url: string; url: string;
@ -142,6 +157,7 @@ export function ApiForm({
fields: ApiFormFieldType[]; fields: ApiFormFieldType[];
cancelText?: string; cancelText?: string;
submitText?: string; submitText?: string;
fetchInitialData?: boolean;
method?: string; method?: string;
opened: boolean; opened: boolean;
onClose?: () => void; onClose?: () => void;
@ -159,6 +175,7 @@ export function ApiForm({
// Error observed during form construction // Error observed during form construction
const [error, setError] = useState<string>(''); const [error, setError] = useState<string>('');
// Query manager for retrieving form definition from the server
const definitionQuery = useQuery({ const definitionQuery = useQuery({
enabled: opened && !!url, enabled: opened && !!url,
queryKey: ['form-definition', name, url, pk, fields], queryKey: ['form-definition', name, url, pk, fields],
@ -172,13 +189,30 @@ export function ApiForm({
return response; return response;
}) })
.catch((error) => { .catch((error) => {
console.error('Error fetching field definitions:', error);
setError(error.message); setError(error.message);
setFieldDefinitions([]); setFieldDefinitions([]);
}); });
} }
}); });
// Query manager for retrieiving initial data from the server
const initialDataQuery = useQuery({
enabled: fetchInitialData && opened && !!url && fieldDefinitions.length > 0,
queryKey: ['form-initial-data', name, url, pk, fields, fieldDefinitions],
queryFn: async () => {
return api
.get(getUrl())
.then((response) => {
form.setValues(response.data);
return response;
})
.catch((error) => {
console.error('Error fetching initial data:', error);
setError(error.message);
});
}
});
// State variable to determine if the form can render the data // State variable to determine if the form can render the data
const [canRender, setCanRender] = useState<boolean>(false); const [canRender, setCanRender] = useState<boolean>(false);
@ -274,8 +308,11 @@ export function ApiForm({
<ApiFormField <ApiFormField
key={field.name} key={field.name}
field={field} field={field}
form={form}
definitions={fieldDefinitions} definitions={fieldDefinitions}
onValueChange={(fieldName, value) => {}} onValueChange={(fieldName, value) => {
form.setValues({ [fieldName]: value });
}}
/> />
))} ))}
</Stack> </Stack>

View File

@ -53,6 +53,7 @@ export default function Home() {
title="Edit Part" title="Edit Part"
opened={formOpened} opened={formOpened}
onClose={() => setFormOpened(false)} onClose={() => setFormOpened(false)}
fetchInitialData={true}
/> />
<Button <Button
onClick={() => setFormOpened(true)} onClick={() => setFormOpened(true)}