Skip to content

Commit c236eb3

Browse files
authored
Merge pull request #141 from workfloworchestrator/2076-test-findings
2076 Fixes getting default values
2 parents a55d523 + eef8579 commit c236eb3

File tree

14 files changed

+567
-289
lines changed

14 files changed

+567
-289
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'pydantic-forms': patch
3+
---
4+
5+
Fixes getting default values

frontend/package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/packages/pydantic-forms/src/components/defaultComponentMatchers.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ const defaultComponentMatchers: PydanticComponentMatcher[] = [
101101
// We are looking for a single value from a set list of options. With less than 4 options, use radio buttons.
102102
return (
103103
field.type === PydanticFormFieldType.STRING &&
104-
field.options.length > 0 &&
105-
field.options.length <= 3
104+
field.options?.length > 0 &&
105+
field.options?.length <= 3
106106
);
107107
},
108108
},
@@ -116,7 +116,7 @@ const defaultComponentMatchers: PydanticComponentMatcher[] = [
116116
// We are looking for a single value from a set list of options. With more than 3 options, use a dropdown.
117117
return (
118118
field.type === PydanticFormFieldType.STRING &&
119-
field.options.length >= 4
119+
field.options?.length >= 4
120120
);
121121
},
122122
},
@@ -139,8 +139,8 @@ const defaultComponentMatchers: PydanticComponentMatcher[] = [
139139
matcher(field) {
140140
return (
141141
field.type === PydanticFormFieldType.ARRAY &&
142-
field.options.length > 0 &&
143-
field.options.length <= 5
142+
field.options?.length > 0 &&
143+
field.options?.length <= 5
144144
);
145145
},
146146
validator: zodValidationPresets.multiSelect,
@@ -153,7 +153,7 @@ const defaultComponentMatchers: PydanticComponentMatcher[] = [
153153
},
154154
matcher(field) {
155155
return (
156-
field.options.length > 0 &&
156+
field.options?.length > 0 &&
157157
field.type === PydanticFormFieldType.ARRAY
158158
);
159159
},

frontend/packages/pydantic-forms/src/components/fields/ObjectField.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ export const ObjectField = ({
2828
}}
2929
>
3030
<h1>{pydanticFormField.title}</h1>
31-
<RenderFields pydanticFormComponents={components} />
31+
<RenderFields
32+
pydanticFormComponents={components}
33+
idPrefix={pydanticFormField.id}
34+
/>
3235
</div>
3336
);
3437
};

frontend/packages/pydantic-forms/src/components/render/RenderFields.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ import { PydanticFormComponents, PydanticFormField } from '@/types';
1212
interface RenderFieldsProps {
1313
pydanticFormComponents: PydanticFormComponents;
1414
extraTriggerFields?: string[]; // The use case for this is that we want to trigger the array field aswell as the array item field
15+
idPrefix?: string; // This is used to prefix the id of the field for nested fields
1516
}
1617

1718
export function RenderFields({
1819
pydanticFormComponents,
1920
extraTriggerFields,
21+
idPrefix = '',
2022
}: RenderFieldsProps) {
2123
return pydanticFormComponents.map((component) => {
2224
const { Element, isControlledElement } = component.Element;
@@ -27,23 +29,24 @@ export function RenderFields({
2729
return undefined;
2830
}
2931

32+
const field = {
33+
...pydanticFormField,
34+
id: idPrefix
35+
? `${idPrefix}.${pydanticFormField.id}`
36+
: pydanticFormField.id,
37+
};
3038
if (isControlledElement) {
3139
return (
32-
<div css={{ width: '100%' }} key={pydanticFormField.id}>
40+
<div css={{ width: '100%' }} key={field.id}>
3341
<WrapFieldElement
3442
PydanticFormControlledElement={Element}
35-
pydanticFormField={pydanticFormField}
43+
pydanticFormField={field}
3644
extraTriggerFields={extraTriggerFields}
3745
/>
3846
</div>
3947
);
4048
} else {
41-
return (
42-
<Element
43-
pydanticFormField={pydanticFormField}
44-
key={pydanticFormField.id}
45-
/>
46-
);
49+
return <Element pydanticFormField={field} key={field.id} />;
4750
}
4851
});
4952
}

frontend/packages/pydantic-forms/src/core/PydanticFormContextProvider.tsx

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import React, {
99
createContext,
1010
useCallback,
1111
useEffect,
12+
useMemo,
1213
useRef,
1314
useState,
1415
} from 'react';
@@ -157,14 +158,21 @@ function PydanticFormContextProvider({
157158
componentMatcherExtender,
158159
);
159160

160-
const initialData = getFormValuesFromFieldOrLabels(
161-
pydanticFormSchema,
162-
{
163-
...formLabels?.data,
164-
...customData,
165-
},
161+
const initialData = useMemo(() => {
162+
return getFormValuesFromFieldOrLabels(
163+
pydanticFormSchema?.properties,
164+
{
165+
...formLabels?.data,
166+
...customData,
167+
},
168+
componentMatcherExtender,
169+
);
170+
}, [
166171
componentMatcherExtender,
167-
);
172+
customData,
173+
formLabels?.data,
174+
pydanticFormSchema?.properties,
175+
]);
168176

169177
// initialize the react-hook-form
170178
const rhf = useForm({

0 commit comments

Comments
 (0)