@truedat/df 8.7.0 → 8.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/components/DynamicFormViewer.js +3 -3
- package/src/components/DynamicFormWithTranslations.js +4 -4
- package/src/components/FieldGroupDetail.js +1 -1
- package/src/components/FieldGroupWithTranslations.js +1 -1
- package/src/components/SelectableDynamicForm.js +1 -1
- package/src/components/__tests__/DynamicFieldValue.spec.js +2 -2
- package/src/components/__tests__/DynamicFormViewer.spec.js +7 -7
- package/src/components/__tests__/EditableDynamicFieldValue.spec.js +1 -1
- package/src/components/__tests__/FieldViewerValue.spec.js +12 -12
- package/src/components/__tests__/SelectDynamicFormWithTranslations.spec.js +1 -1
- package/src/components/__tests__/SelectableDynamicForm.spec.js +16 -12
- package/src/components/hierarchies/HierarchyView.js +9 -9
- package/src/components/hierarchies/__tests__/HierarchyRoutes.spec.js +1 -1
- package/src/components/widgets/DropdownDataLoader.js +1 -1
- package/src/components/widgets/DynamicField.js +5 -5
- package/src/components/widgets/DynamicTableField.js +129 -125
- package/src/components/widgets/GroupPreview.js +2 -2
- package/src/components/widgets/HierarchyPreview.js +1 -1
- package/src/components/widgets/ImageField.js +2 -3
- package/src/components/widgets/MarkdownField.js +0 -1
- package/src/components/widgets/StandardDropdown.js +5 -5
- package/src/components/widgets/StringField.js +1 -4
- package/src/components/widgets/TableField.js +1 -1
- package/src/components/widgets/UserGroupPreview.js +1 -1
- package/src/components/widgets/__tests__/CheckboxField.spec.js +2 -2
- package/src/components/widgets/__tests__/DropdownField.spec.js +2 -2
- package/src/components/widgets/__tests__/DynamicField.spec.js +11 -3
- package/src/components/widgets/__tests__/DynamicTableField.spec.js +237 -237
- package/src/components/widgets/__tests__/GroupPreview.spec.js +11 -11
- package/src/components/widgets/__tests__/HierarchyDropdown.spec.js +3 -3
- package/src/components/widgets/__tests__/NumberField.spec.js +1 -1
- package/src/components/widgets/__tests__/PairListField.spec.js +3 -3
- package/src/components/widgets/__tests__/StandardDropdown.spec.js +1 -1
- package/src/components/widgets/__tests__/UserGroupPreview.spec.js +14 -10
- package/src/messages/index.js +1 -1
- package/src/reducers/__tests__/dfMessage.spec.js +5 -5
- package/src/reducers/__tests__/selectedDomain.spec.js +2 -2
- package/src/reducers/__tests__/selectedDomains.spec.js +2 -2
- package/src/reducers/dfMessage.js +4 -4
- package/src/selectors/getOptions.js +2 -2
- package/src/selectors/templates.js +2 -2
- package/src/templates/components/Template.js +2 -2
- package/src/templates/components/TemplateFilters.js +1 -1
- package/src/templates/components/TemplateLoader.js +1 -1
- package/src/templates/components/TemplateRoutes.js +1 -1
- package/src/templates/components/Templates.js +1 -6
- package/src/templates/components/TemplatesContext.js +3 -3
- package/src/templates/components/TemplatesTable.js +1 -1
- package/src/templates/components/__tests__/TemplateLoader.spec.js +2 -2
- package/src/templates/components/__tests__/TemplateRoutes.spec.js +1 -1
- package/src/templates/components/__tests__/TemplatesTable.spec.js +1 -1
- package/src/templates/components/templateForm/ActiveGroupForm.js +3 -3
- package/src/templates/components/templateForm/ConditionalFieldForm.js +3 -3
- package/src/templates/components/templateForm/DependentDomain.js +3 -3
- package/src/templates/components/templateForm/FieldDefinition.js +126 -129
- package/src/templates/components/templateForm/HierarchiesList.js +1 -1
- package/src/templates/components/templateForm/MandatoryConditional.js +2 -2
- package/src/templates/components/templateForm/TemplateForm.js +46 -41
- package/src/templates/components/templateForm/ValuesConfiguration.js +69 -56
- package/src/templates/components/templateForm/ValuesField.js +43 -43
- package/src/templates/components/templateForm/__tests__/DefaultValue.spec.js +35 -35
- package/src/templates/components/templateForm/__tests__/DependentDomain.spec.js +1 -1
- package/src/templates/components/templateForm/__tests__/FieldDefinition.spec.js +227 -201
- package/src/templates/components/templateForm/__tests__/FieldForm.spec.js +12 -10
- package/src/templates/components/templateForm/__tests__/MandatoryConditional.spec.js +3 -3
- package/src/templates/components/templateForm/__tests__/SwitchListForm.spec.js +5 -5
- package/src/templates/components/templateForm/__tests__/SwitchSegment.spec.js +8 -8
- package/src/templates/components/templateForm/__tests__/TableValuesForm.spec.js +207 -189
- package/src/templates/components/templateForm/__tests__/TemplateForm.spec.js +42 -13
- package/src/templates/components/templateForm/__tests__/TemplateFormActions.spec.js +1 -1
- package/src/templates/components/templateForm/__tests__/TemplateRelationsForm.spec.js +3 -1
- package/src/templates/components/templateForm/__tests__/ValuesField.spec.js +6 -6
- package/src/templates/components/templateForm/__tests__/ValuesListForm.spec.js +4 -4
- package/src/templates/components/templateForm/__tests__/ValuesSelector.spec.js +3 -3
- package/src/templates/components/templateForm/widgetDefinitions.js +2 -0
- package/src/templates/reducers/__tests__/allTemplates.spec.js +4 -4
- package/src/templates/reducers/__tests__/selectedTemplate.spec.js +2 -2
- package/src/templates/reducers/__tests__/template.spec.js +4 -4
- package/src/templates/reducers/__tests__/templateDeleting.spec.js +2 -2
- package/src/templates/reducers/__tests__/templateLoading.spec.js +2 -2
- package/src/templates/reducers/__tests__/templates.spec.js +3 -3
- package/src/templates/reducers/__tests__/templatesLoading.spec.js +2 -2
- package/src/templates/sagas/__tests__/createTemplate.spec.js +3 -3
- package/src/templates/sagas/__tests__/fetchTemplates.spec.js +1 -1
- package/src/templates/sagas/index.js +2 -2
- package/src/templates/utils/__tests__/applyDefaults.spec.js +4 -4
- package/src/templates/utils/__tests__/filterDomains.spec.js +15 -15
- package/src/templates/utils/__tests__/filterFields.spec.js +2 -2
- package/src/templates/utils/__tests__/filterSwitches.spec.js +5 -5
- package/src/templates/utils/__tests__/filterValues.spec.js +4 -4
- package/src/templates/utils/__tests__/formatLegacyContent.spec.js +7 -7
- package/src/templates/utils/applyTemplate.js +66 -53
- package/src/templates/utils/filterDepends.js +1 -1
- package/src/templates/utils/filterSwitches.js +3 -3
- package/src/templates/utils/filterValues.js +4 -5
- package/src/templates/utils/flattenFields.js +2 -2
- package/src/templates/utils/formatLegacyContent.js +2 -1
- package/src/templates/utils/parseFieldOptions.js +15 -14
- package/src/templates/utils/parseGroups.js +43 -43
- package/src/templates/utils/validateContent.js +4 -4
|
@@ -8,220 +8,246 @@ import FieldDefinition from "../FieldDefinition";
|
|
|
8
8
|
const mockFormatMessage = jest.fn(({ id }) => id);
|
|
9
9
|
|
|
10
10
|
jest.mock("react-intl", () => ({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
...jest.requireActual("react-intl"),
|
|
12
|
+
useIntl: () => ({
|
|
13
|
+
formatMessage: mockFormatMessage,
|
|
14
|
+
}),
|
|
15
15
|
}));
|
|
16
16
|
|
|
17
17
|
const user = userEvent.setup({ delay: null });
|
|
18
18
|
|
|
19
19
|
describe("FieldDefinition", () => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
20
|
+
const baseProps = {
|
|
21
|
+
fieldNamePrefix: "field",
|
|
22
|
+
defaultField: "field.default",
|
|
23
|
+
valueName: "field.value",
|
|
24
|
+
subscribableField: "field.subscribable",
|
|
25
|
+
widget: "string",
|
|
26
|
+
type: "string",
|
|
27
|
+
cardinality: "?",
|
|
28
|
+
onChange: jest.fn(),
|
|
29
|
+
allowedTypes: [],
|
|
30
|
+
allowedWidgets: [],
|
|
31
|
+
mandatory: {},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("renders dropdowns with initial values", async () => {
|
|
39
|
+
const rendered = render(
|
|
40
|
+
<FieldDefinition {...baseProps} onChange={jest.fn()} />,
|
|
41
|
+
);
|
|
42
|
+
waitForLoad(rendered);
|
|
43
|
+
expect(rendered.container).toMatchSnapshot();
|
|
44
|
+
const dropdowns = rendered.getAllByRole("listbox");
|
|
45
|
+
expect(dropdowns.length).toBe(3);
|
|
46
|
+
|
|
47
|
+
const widgetDropdown = dropdowns[0];
|
|
48
|
+
expect(widgetDropdown).toHaveAttribute("name", "field.widget");
|
|
49
|
+
const selectedWidget = within(widgetDropdown).getByRole("option", {
|
|
50
|
+
name: "Text Input",
|
|
36
51
|
});
|
|
52
|
+
expect(selectedWidget).toHaveAttribute("aria-checked", "true");
|
|
37
53
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const dropdowns = rendered.getAllByRole("listbox");
|
|
43
|
-
expect(dropdowns.length).toBe(3);
|
|
44
|
-
|
|
45
|
-
const widgetDropdown = dropdowns[0];
|
|
46
|
-
expect(widgetDropdown).toHaveAttribute("name", "field.widget");
|
|
47
|
-
const selectedWidget = within(widgetDropdown).getByRole("option", { name: "Text Input" });
|
|
48
|
-
expect(selectedWidget).toHaveAttribute("aria-checked", "true");
|
|
49
|
-
|
|
50
|
-
const typeDropdown = dropdowns[1];
|
|
51
|
-
expect(typeDropdown).toHaveAttribute("name", "field.type");
|
|
52
|
-
const selectedType = within(typeDropdown).getByRole("option", { name: "template.field.type.string" });
|
|
53
|
-
expect(selectedType).toHaveAttribute("aria-checked", "true");
|
|
54
|
-
|
|
55
|
-
const cardinalityDropdown = dropdowns[2];
|
|
56
|
-
expect(cardinalityDropdown).toHaveAttribute("name", "field.cardinality");
|
|
57
|
-
const selectedCardinality = within(cardinalityDropdown).getByRole("option", { name: "template.field.cardinality.?" });
|
|
58
|
-
expect(selectedCardinality).toHaveAttribute("aria-checked", "true");
|
|
54
|
+
const typeDropdown = dropdowns[1];
|
|
55
|
+
expect(typeDropdown).toHaveAttribute("name", "field.type");
|
|
56
|
+
const selectedType = within(typeDropdown).getByRole("option", {
|
|
57
|
+
name: "template.field.type.string",
|
|
59
58
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
59
|
+
expect(selectedType).toHaveAttribute("aria-checked", "true");
|
|
60
|
+
|
|
61
|
+
const cardinalityDropdown = dropdowns[2];
|
|
62
|
+
expect(cardinalityDropdown).toHaveAttribute("name", "field.cardinality");
|
|
63
|
+
const selectedCardinality = within(cardinalityDropdown).getByRole(
|
|
64
|
+
"option",
|
|
65
|
+
{ name: "template.field.cardinality.?" },
|
|
66
|
+
);
|
|
67
|
+
expect(selectedCardinality).toHaveAttribute("aria-checked", "true");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("handleWidgetChange: sets valueName to null (via getValues), resets default, sets subscribable=false, then emits type change", async () => {
|
|
71
|
+
const onChange = jest.fn();
|
|
72
|
+
const rendered = render(
|
|
73
|
+
<FieldDefinition {...baseProps} onChange={onChange} />,
|
|
74
|
+
);
|
|
75
|
+
waitForLoad(rendered);
|
|
76
|
+
|
|
77
|
+
const numberOpt = within(rendered.getAllByRole("listbox")[0]).getByRole(
|
|
78
|
+
"option",
|
|
79
|
+
{ name: "Number" },
|
|
80
|
+
);
|
|
81
|
+
// Change type; for widget 'string' the only type is 'string', so switch the widget first to 'number'
|
|
82
|
+
await user.click(numberOpt);
|
|
83
|
+
|
|
84
|
+
// 1) reset value
|
|
85
|
+
expect(onChange).toHaveBeenNthCalledWith(
|
|
86
|
+
onChange.mock.calls.length - 3,
|
|
87
|
+
null,
|
|
88
|
+
{ name: "field.value", value: null },
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
// // 2) reset defaultField
|
|
92
|
+
expect(onChange).toHaveBeenNthCalledWith(
|
|
93
|
+
onChange.mock.calls.length - 2,
|
|
94
|
+
expect.anything(),
|
|
95
|
+
{ name: "field.default", value: { value: "", origin: "default" } },
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
// // 3) set subscribable=false
|
|
99
|
+
expect(onChange).toHaveBeenNthCalledWith(
|
|
100
|
+
onChange.mock.calls.length - 1,
|
|
101
|
+
expect.anything(),
|
|
102
|
+
{ name: "field.subscribable", value: false },
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// // 4) finally, the actual type widget event payload
|
|
106
|
+
expect(onChange).toHaveBeenLastCalledWith(
|
|
107
|
+
expect.anything(),
|
|
108
|
+
expect.objectContaining({ name: "field.widget", value: "number" }),
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("handleTypeChange: recomputes default value via real getValues, resets default, sets subscribable=false, and emits widget change", async () => {
|
|
113
|
+
const onChange = jest.fn();
|
|
114
|
+
const rendered = render(
|
|
115
|
+
<FieldDefinition
|
|
116
|
+
{...{ ...baseProps, widget: "dropdown", type: "string" }}
|
|
117
|
+
onChange={onChange}
|
|
118
|
+
/>,
|
|
119
|
+
);
|
|
120
|
+
waitForLoad(rendered);
|
|
121
|
+
|
|
122
|
+
// Switch Type from 'string' to 'domain'
|
|
123
|
+
const domainOpt = within(rendered.getAllByRole("listbox")[1]).getByRole(
|
|
124
|
+
"option",
|
|
125
|
+
{ name: "template.field.type.domain" },
|
|
126
|
+
);
|
|
127
|
+
await user.click(domainOpt);
|
|
128
|
+
|
|
129
|
+
// The first call in handleTypeChange is changeValue(valueName, ...) -> null
|
|
130
|
+
expect(onChange).toHaveBeenNthCalledWith(1, null, {
|
|
131
|
+
name: "field.value",
|
|
132
|
+
value: null,
|
|
134
133
|
});
|
|
135
134
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
// Provide invalid type 'string' and invalid cardinality '+'
|
|
141
|
-
const rendered = render(<FieldDefinition {...baseProps}
|
|
142
|
-
onChange={onChange}
|
|
143
|
-
widget="number"
|
|
144
|
-
type="string"
|
|
145
|
-
cardinality="+" />);
|
|
146
|
-
|
|
147
|
-
waitForLoad(rendered);
|
|
148
|
-
|
|
149
|
-
// The effect should fire once and fix both:
|
|
150
|
-
expect(onChange).toHaveBeenCalledWith(
|
|
151
|
-
null,
|
|
152
|
-
{ name: "field.type", value: "integer" } // first in WIDGETS types for 'number'
|
|
153
|
-
);
|
|
154
|
-
expect(onChange).toHaveBeenCalledWith(
|
|
155
|
-
null,
|
|
156
|
-
{ name: "field.cardinality", value: "?" } // first in WIDGETS cardinalities for 'number'
|
|
157
|
-
);
|
|
135
|
+
// 2) default reset
|
|
136
|
+
expect(onChange).toHaveBeenNthCalledWith(2, expect.anything(), {
|
|
137
|
+
name: "field.default",
|
|
138
|
+
value: { value: "", origin: "default" },
|
|
158
139
|
});
|
|
159
140
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
<FieldDefinition
|
|
165
|
-
{...baseProps}
|
|
166
|
-
onChange={onChange}
|
|
167
|
-
widget="string"
|
|
168
|
-
type="string"
|
|
169
|
-
cardinality="?"
|
|
170
|
-
mandatory={{ some: "value" }}
|
|
171
|
-
/>);
|
|
172
|
-
|
|
173
|
-
waitForLoad(rendered);
|
|
174
|
-
|
|
175
|
-
// Select exactly-one '1'
|
|
176
|
-
const cardOpt = within(rendered.getAllByRole("listbox")[2]).getByRole("option", { name: "template.field.cardinality.1" });
|
|
177
|
-
await user.click(cardOpt);
|
|
178
|
-
|
|
179
|
-
// First: direct change emission
|
|
180
|
-
expect(onChange).toHaveBeenNthCalledWith(
|
|
181
|
-
1,
|
|
182
|
-
expect.anything(),
|
|
183
|
-
expect.objectContaining({ name: "field.cardinality", value: "1" })
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
// Then: clear mandatory because value ∈ ['1','+'] and mandatory was non-empty
|
|
187
|
-
expect(onChange).toHaveBeenNthCalledWith(
|
|
188
|
-
2,
|
|
189
|
-
expect.anything(),
|
|
190
|
-
{ name: "field.mandatory", value: null }
|
|
191
|
-
);
|
|
141
|
+
// 3) subscribable=false
|
|
142
|
+
expect(onChange).toHaveBeenNthCalledWith(3, expect.anything(), {
|
|
143
|
+
name: "field.subscribable",
|
|
144
|
+
value: false,
|
|
192
145
|
});
|
|
193
146
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
147
|
+
// 4) widget change payload
|
|
148
|
+
expect(onChange).toHaveBeenNthCalledWith(
|
|
149
|
+
4,
|
|
150
|
+
expect.anything(),
|
|
151
|
+
expect.objectContaining({ name: "field.type", value: "domain" }),
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("useEffect: auto-fixes invalid type/cardinality for a widget (real WIDGETS)", () => {
|
|
156
|
+
const onChange = jest.fn();
|
|
157
|
+
|
|
158
|
+
// For widget='number', valid types: ['integer','float']; cardinalities: ['?','1']
|
|
159
|
+
// Provide invalid type 'string' and invalid cardinality '+'
|
|
160
|
+
const rendered = render(
|
|
161
|
+
<FieldDefinition
|
|
162
|
+
{...baseProps}
|
|
163
|
+
onChange={onChange}
|
|
164
|
+
widget="number"
|
|
165
|
+
type="string"
|
|
166
|
+
cardinality="+"
|
|
167
|
+
/>,
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
waitForLoad(rendered);
|
|
171
|
+
|
|
172
|
+
// The effect should fire once and fix both:
|
|
173
|
+
expect(onChange).toHaveBeenCalledWith(
|
|
174
|
+
null,
|
|
175
|
+
{ name: "field.type", value: "integer" }, // first in WIDGETS types for 'number'
|
|
176
|
+
);
|
|
177
|
+
expect(onChange).toHaveBeenCalledWith(
|
|
178
|
+
null,
|
|
179
|
+
{ name: "field.cardinality", value: "?" }, // first in WIDGETS cardinalities for 'number'
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("handleCardinalityChange: selecting '1' (or '+') clears mandatory when it's non-empty", async () => {
|
|
184
|
+
const onChange = jest.fn();
|
|
185
|
+
|
|
186
|
+
const rendered = render(
|
|
187
|
+
<FieldDefinition
|
|
188
|
+
{...baseProps}
|
|
189
|
+
onChange={onChange}
|
|
190
|
+
widget="string"
|
|
191
|
+
type="string"
|
|
192
|
+
cardinality="?"
|
|
193
|
+
mandatory={{ some: "value" }}
|
|
194
|
+
/>,
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
waitForLoad(rendered);
|
|
198
|
+
|
|
199
|
+
// Select exactly-one '1'
|
|
200
|
+
const cardOpt = within(rendered.getAllByRole("listbox")[2]).getByRole(
|
|
201
|
+
"option",
|
|
202
|
+
{ name: "template.field.cardinality.1" },
|
|
203
|
+
);
|
|
204
|
+
await user.click(cardOpt);
|
|
205
|
+
|
|
206
|
+
// First: direct change emission
|
|
207
|
+
expect(onChange).toHaveBeenNthCalledWith(
|
|
208
|
+
1,
|
|
209
|
+
expect.anything(),
|
|
210
|
+
expect.objectContaining({ name: "field.cardinality", value: "1" }),
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
// Then: clear mandatory because value ∈ ['1','+'] and mandatory was non-empty
|
|
214
|
+
expect(onChange).toHaveBeenNthCalledWith(2, expect.anything(), {
|
|
215
|
+
name: "field.mandatory",
|
|
216
|
+
value: null,
|
|
226
217
|
});
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test("allowedWidgets & allowedTypes filter visible options (using real option generators)", () => {
|
|
221
|
+
const onChange = jest.fn();
|
|
222
|
+
|
|
223
|
+
const rendered = render(
|
|
224
|
+
<FieldDefinition
|
|
225
|
+
{...baseProps}
|
|
226
|
+
onChange={onChange}
|
|
227
|
+
allowedWidgets={["number"]}
|
|
228
|
+
allowedTypes={["float"]}
|
|
229
|
+
widget="number"
|
|
230
|
+
type="float"
|
|
231
|
+
/>,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
waitForLoad(rendered);
|
|
235
|
+
|
|
236
|
+
const dropdowns = rendered.getAllByRole("listbox");
|
|
237
|
+
expect(dropdowns.length).toBe(3);
|
|
238
|
+
|
|
239
|
+
const widgetDropdown = dropdowns[0];
|
|
240
|
+
expect(widgetDropdown).toHaveAttribute("name", "field.widget");
|
|
241
|
+
const widgetOptions = within(widgetDropdown).getAllByRole("option");
|
|
242
|
+
expect(widgetOptions.length).toBe(1);
|
|
243
|
+
expect(widgetOptions[0]).toHaveAttribute("aria-checked", "true");
|
|
244
|
+
expect(widgetOptions[0]).toHaveTextContent("Number");
|
|
245
|
+
|
|
246
|
+
const typeDropdown = dropdowns[1];
|
|
247
|
+
expect(typeDropdown).toHaveAttribute("name", "field.type");
|
|
248
|
+
const typeOptions = within(typeDropdown).getAllByRole("option");
|
|
249
|
+
expect(typeOptions.length).toBe(1);
|
|
250
|
+
expect(typeOptions[0]).toHaveAttribute("aria-checked", "true");
|
|
251
|
+
expect(typeOptions[0]).toHaveTextContent("float");
|
|
252
|
+
});
|
|
227
253
|
});
|
|
@@ -55,7 +55,9 @@ describe("<FieldForm />", () => {
|
|
|
55
55
|
const rendered = render(<FieldForm {...props} />);
|
|
56
56
|
await waitForLoad(rendered);
|
|
57
57
|
expect(
|
|
58
|
-
rendered.container.querySelector(
|
|
58
|
+
rendered.container.querySelector(
|
|
59
|
+
"input[name='undefined.fields[0].name']",
|
|
60
|
+
),
|
|
59
61
|
).toHaveAttribute("disabled");
|
|
60
62
|
});
|
|
61
63
|
|
|
@@ -89,7 +91,7 @@ describe("<FieldForm />", () => {
|
|
|
89
91
|
|
|
90
92
|
const user = userEvent.setup({ delay: null });
|
|
91
93
|
const fixedTupleOption = rendered.getByText(
|
|
92
|
-
"template.field.values.fixed_tuple"
|
|
94
|
+
"template.field.values.fixed_tuple",
|
|
93
95
|
);
|
|
94
96
|
await user.click(fixedTupleOption);
|
|
95
97
|
|
|
@@ -98,7 +100,7 @@ describe("<FieldForm />", () => {
|
|
|
98
100
|
expect.objectContaining({
|
|
99
101
|
name: "Group.fields[0].subscribable",
|
|
100
102
|
value: false,
|
|
101
|
-
})
|
|
103
|
+
}),
|
|
102
104
|
);
|
|
103
105
|
expect(onChange).toHaveBeenCalledWith(null, {
|
|
104
106
|
name: "Group.fields[0].values",
|
|
@@ -153,7 +155,7 @@ describe("<FieldForm />", () => {
|
|
|
153
155
|
expect.anything(),
|
|
154
156
|
expect.objectContaining({
|
|
155
157
|
value: "string",
|
|
156
|
-
})
|
|
158
|
+
}),
|
|
157
159
|
);
|
|
158
160
|
});
|
|
159
161
|
|
|
@@ -193,27 +195,27 @@ describe("<FieldForm />", () => {
|
|
|
193
195
|
expect.objectContaining({
|
|
194
196
|
name: "Group.fields[0].values",
|
|
195
197
|
value: { fixed: null },
|
|
196
|
-
})
|
|
198
|
+
}),
|
|
197
199
|
);
|
|
198
200
|
expect(onChange).toHaveBeenCalledWith(
|
|
199
201
|
expect.anything(),
|
|
200
202
|
expect.objectContaining({
|
|
201
203
|
name: "Group.fields[0].default",
|
|
202
204
|
value: { value: "", origin: "default" },
|
|
203
|
-
})
|
|
205
|
+
}),
|
|
204
206
|
);
|
|
205
207
|
expect(onChange).toHaveBeenCalledWith(
|
|
206
208
|
expect.anything(),
|
|
207
209
|
expect.objectContaining({
|
|
208
210
|
name: "Group.fields[0].subscribable",
|
|
209
211
|
value: false,
|
|
210
|
-
})
|
|
212
|
+
}),
|
|
211
213
|
);
|
|
212
214
|
expect(onChange).toHaveBeenCalledWith(
|
|
213
215
|
expect.anything(),
|
|
214
216
|
expect.objectContaining({
|
|
215
217
|
value: "string",
|
|
216
|
-
})
|
|
218
|
+
}),
|
|
217
219
|
);
|
|
218
220
|
});
|
|
219
221
|
|
|
@@ -271,7 +273,7 @@ describe("<FieldForm />", () => {
|
|
|
271
273
|
await waitForLoad(rendered);
|
|
272
274
|
expect(rendered.container).toMatchSnapshot();
|
|
273
275
|
expect(
|
|
274
|
-
rendered.getByText(/template.field.mandatory.depends.to_be/i)
|
|
276
|
+
rendered.getByText(/template.field.mandatory.depends.to_be/i),
|
|
275
277
|
).toBeInTheDocument();
|
|
276
278
|
});
|
|
277
279
|
|
|
@@ -340,7 +342,7 @@ describe("<FieldForm />", () => {
|
|
|
340
342
|
expect.objectContaining({
|
|
341
343
|
name: "Group.fields[0].cardinality",
|
|
342
344
|
value: "1",
|
|
343
|
-
})
|
|
345
|
+
}),
|
|
344
346
|
);
|
|
345
347
|
expect(onChange).toHaveBeenCalledWith(expect.anything(), {
|
|
346
348
|
name: "Group.fields[0].mandatory",
|
|
@@ -54,7 +54,7 @@ describe("<MandatoryConditional />", () => {
|
|
|
54
54
|
it("matches the latest snapshot", () => {
|
|
55
55
|
const { container } = render(
|
|
56
56
|
<MandatoryConditional {...props} />,
|
|
57
|
-
renderOpts
|
|
57
|
+
renderOpts,
|
|
58
58
|
);
|
|
59
59
|
expect(container).toMatchSnapshot();
|
|
60
60
|
});
|
|
@@ -62,7 +62,7 @@ describe("<MandatoryConditional />", () => {
|
|
|
62
62
|
it("calls onChange when whe select a field", async () => {
|
|
63
63
|
const { findByRole } = render(
|
|
64
64
|
<MandatoryConditional {...props} />,
|
|
65
|
-
renderOpts
|
|
65
|
+
renderOpts,
|
|
66
66
|
);
|
|
67
67
|
|
|
68
68
|
userEvent.click(await findByRole("option", { name: /Foo/ }));
|
|
@@ -82,7 +82,7 @@ describe("<MandatoryConditional />", () => {
|
|
|
82
82
|
onChange.mockClear();
|
|
83
83
|
const { findByRole } = render(
|
|
84
84
|
<MandatoryConditional {...props} />,
|
|
85
|
-
renderOpts
|
|
85
|
+
renderOpts,
|
|
86
86
|
);
|
|
87
87
|
|
|
88
88
|
userEvent.click(await findByRole("option", { name: /4/ }));
|
|
@@ -40,7 +40,7 @@ describe("<SwitchListForm />", () => {
|
|
|
40
40
|
await waitForLoad(rendered);
|
|
41
41
|
|
|
42
42
|
const input = rendered.getByPlaceholderText(
|
|
43
|
-
/template.field.values.switch_field/i
|
|
43
|
+
/template.field.values.switch_field/i,
|
|
44
44
|
);
|
|
45
45
|
await user.type(input, "1");
|
|
46
46
|
expect(onChange).toHaveBeenCalledWith({ ...values, on: "test1" });
|
|
@@ -64,7 +64,7 @@ describe("<SwitchListForm />", () => {
|
|
|
64
64
|
await waitForLoad(rendered);
|
|
65
65
|
|
|
66
66
|
const deleteButton = rendered.container.querySelectorAll(
|
|
67
|
-
".remove.circle.link.icon"
|
|
67
|
+
".remove.circle.link.icon",
|
|
68
68
|
)[0];
|
|
69
69
|
await user.click(deleteButton);
|
|
70
70
|
expect(onChange).toHaveBeenCalledWith({
|
|
@@ -91,7 +91,7 @@ describe("<SwitchListForm />", () => {
|
|
|
91
91
|
await waitForLoad(rendered);
|
|
92
92
|
|
|
93
93
|
const valueInput = rendered.getAllByPlaceholderText(
|
|
94
|
-
/template.field.values.add_value/i
|
|
94
|
+
/template.field.values.add_value/i,
|
|
95
95
|
)[0];
|
|
96
96
|
await user.clear(valueInput);
|
|
97
97
|
await user.type(valueInput, "5{enter}");
|
|
@@ -123,7 +123,7 @@ describe("<SwitchListForm />", () => {
|
|
|
123
123
|
await waitForLoad(rendered);
|
|
124
124
|
|
|
125
125
|
const newValueInput = rendered.container.querySelector(
|
|
126
|
-
"input[placeholder='template.field.values.add_switch_value']"
|
|
126
|
+
"input[placeholder='template.field.values.add_switch_value']",
|
|
127
127
|
);
|
|
128
128
|
await user.type(newValueInput, "Test");
|
|
129
129
|
await user.keyboard("{Enter}");
|
|
@@ -156,7 +156,7 @@ describe("<SwitchListForm />", () => {
|
|
|
156
156
|
await waitForLoad(rendered);
|
|
157
157
|
|
|
158
158
|
const newValueInput = rendered.getByPlaceholderText(
|
|
159
|
-
/template.field.values.add_switch_value/i
|
|
159
|
+
/template.field.values.add_switch_value/i,
|
|
160
160
|
);
|
|
161
161
|
await user.type(newValueInput, "a");
|
|
162
162
|
|
|
@@ -39,22 +39,22 @@ describe("<SwitchSegment />", () => {
|
|
|
39
39
|
const user = userEvent.setup({ delay: null });
|
|
40
40
|
await user.click(
|
|
41
41
|
rendered.container.querySelectorAll(
|
|
42
|
-
'[class="circle outline link icon"]'
|
|
43
|
-
)[0]
|
|
42
|
+
'[class="circle outline link icon"]',
|
|
43
|
+
)[0],
|
|
44
44
|
);
|
|
45
45
|
expect(onDefaultValueChange).toHaveBeenCalledWith({ 1: "foo" });
|
|
46
46
|
|
|
47
47
|
await user.click(
|
|
48
48
|
rendered.container.querySelectorAll(
|
|
49
|
-
'[class="circle outline link icon"]'
|
|
50
|
-
)[1]
|
|
49
|
+
'[class="circle outline link icon"]',
|
|
50
|
+
)[1],
|
|
51
51
|
);
|
|
52
52
|
expect(onDefaultValueChange).toHaveBeenCalledWith({ 1: "bar" });
|
|
53
53
|
|
|
54
54
|
await user.click(
|
|
55
55
|
rendered.container.querySelectorAll(
|
|
56
|
-
'[class="circle outline link icon"]'
|
|
57
|
-
)[2]
|
|
56
|
+
'[class="circle outline link icon"]',
|
|
57
|
+
)[2],
|
|
58
58
|
);
|
|
59
59
|
expect(onDefaultValueChange).toHaveBeenCalledWith({ 1: "baz" });
|
|
60
60
|
});
|
|
@@ -68,8 +68,8 @@ describe("<SwitchSegment />", () => {
|
|
|
68
68
|
const user = userEvent.setup({ delay: null });
|
|
69
69
|
await user.click(
|
|
70
70
|
rendered.container.querySelector(
|
|
71
|
-
'[class="check circle outline link icon"]'
|
|
72
|
-
)
|
|
71
|
+
'[class="check circle outline link icon"]',
|
|
72
|
+
),
|
|
73
73
|
);
|
|
74
74
|
expect(onDefaultValueChange).toHaveBeenCalledWith({});
|
|
75
75
|
});
|