@truedat/df 8.6.7 → 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.
Files changed (102) hide show
  1. package/package.json +4 -4
  2. package/src/components/DynamicFormViewer.js +3 -3
  3. package/src/components/DynamicFormWithTranslations.js +4 -4
  4. package/src/components/FieldGroupDetail.js +1 -1
  5. package/src/components/FieldGroupWithTranslations.js +1 -1
  6. package/src/components/SelectDynamicFormWithTranslations.js +14 -15
  7. package/src/components/SelectableDynamicForm.js +1 -1
  8. package/src/components/__tests__/DynamicFieldValue.spec.js +2 -2
  9. package/src/components/__tests__/DynamicFormViewer.spec.js +7 -7
  10. package/src/components/__tests__/EditableDynamicFieldValue.spec.js +1 -1
  11. package/src/components/__tests__/FieldViewerValue.spec.js +12 -12
  12. package/src/components/__tests__/SelectDynamicFormWithTranslations.spec.js +1 -1
  13. package/src/components/__tests__/SelectableDynamicForm.spec.js +16 -12
  14. package/src/components/hierarchies/HierarchyView.js +9 -9
  15. package/src/components/hierarchies/__tests__/HierarchyRoutes.spec.js +1 -1
  16. package/src/components/widgets/DropdownDataLoader.js +1 -1
  17. package/src/components/widgets/DynamicField.js +5 -5
  18. package/src/components/widgets/DynamicTableField.js +129 -125
  19. package/src/components/widgets/GroupPreview.js +2 -2
  20. package/src/components/widgets/HierarchyPreview.js +1 -1
  21. package/src/components/widgets/ImageField.js +2 -3
  22. package/src/components/widgets/MarkdownField.js +0 -1
  23. package/src/components/widgets/StandardDropdown.js +5 -5
  24. package/src/components/widgets/StringField.js +1 -4
  25. package/src/components/widgets/TableField.js +1 -1
  26. package/src/components/widgets/UserGroupPreview.js +1 -1
  27. package/src/components/widgets/__tests__/CheckboxField.spec.js +2 -2
  28. package/src/components/widgets/__tests__/DropdownField.spec.js +2 -2
  29. package/src/components/widgets/__tests__/DynamicField.spec.js +11 -3
  30. package/src/components/widgets/__tests__/DynamicTableField.spec.js +237 -237
  31. package/src/components/widgets/__tests__/GroupPreview.spec.js +11 -11
  32. package/src/components/widgets/__tests__/HierarchyDropdown.spec.js +3 -3
  33. package/src/components/widgets/__tests__/NumberField.spec.js +1 -1
  34. package/src/components/widgets/__tests__/PairListField.spec.js +3 -3
  35. package/src/components/widgets/__tests__/StandardDropdown.spec.js +1 -1
  36. package/src/components/widgets/__tests__/UserGroupPreview.spec.js +14 -10
  37. package/src/messages/index.js +1 -1
  38. package/src/reducers/__tests__/dfMessage.spec.js +5 -5
  39. package/src/reducers/__tests__/selectedDomain.spec.js +2 -2
  40. package/src/reducers/__tests__/selectedDomains.spec.js +2 -2
  41. package/src/reducers/dfMessage.js +4 -4
  42. package/src/selectors/getOptions.js +2 -2
  43. package/src/selectors/templates.js +2 -2
  44. package/src/templates/components/Template.js +2 -2
  45. package/src/templates/components/TemplateFilters.js +1 -1
  46. package/src/templates/components/TemplateLoader.js +1 -1
  47. package/src/templates/components/TemplateRoutes.js +1 -1
  48. package/src/templates/components/Templates.js +1 -6
  49. package/src/templates/components/TemplatesContext.js +3 -3
  50. package/src/templates/components/TemplatesTable.js +1 -1
  51. package/src/templates/components/__tests__/TemplateLoader.spec.js +2 -2
  52. package/src/templates/components/__tests__/TemplateRoutes.spec.js +1 -1
  53. package/src/templates/components/__tests__/TemplatesTable.spec.js +1 -1
  54. package/src/templates/components/templateForm/ActiveGroupForm.js +3 -3
  55. package/src/templates/components/templateForm/ConditionalFieldForm.js +3 -3
  56. package/src/templates/components/templateForm/DependentDomain.js +3 -3
  57. package/src/templates/components/templateForm/FieldDefinition.js +126 -129
  58. package/src/templates/components/templateForm/HierarchiesList.js +1 -1
  59. package/src/templates/components/templateForm/MandatoryConditional.js +2 -2
  60. package/src/templates/components/templateForm/TemplateForm.js +46 -41
  61. package/src/templates/components/templateForm/ValuesConfiguration.js +69 -56
  62. package/src/templates/components/templateForm/ValuesField.js +43 -43
  63. package/src/templates/components/templateForm/__tests__/DefaultValue.spec.js +35 -35
  64. package/src/templates/components/templateForm/__tests__/DependentDomain.spec.js +1 -1
  65. package/src/templates/components/templateForm/__tests__/FieldDefinition.spec.js +227 -201
  66. package/src/templates/components/templateForm/__tests__/FieldForm.spec.js +12 -10
  67. package/src/templates/components/templateForm/__tests__/MandatoryConditional.spec.js +3 -3
  68. package/src/templates/components/templateForm/__tests__/SwitchListForm.spec.js +5 -5
  69. package/src/templates/components/templateForm/__tests__/SwitchSegment.spec.js +8 -8
  70. package/src/templates/components/templateForm/__tests__/TableValuesForm.spec.js +207 -189
  71. package/src/templates/components/templateForm/__tests__/TemplateForm.spec.js +42 -13
  72. package/src/templates/components/templateForm/__tests__/TemplateFormActions.spec.js +1 -1
  73. package/src/templates/components/templateForm/__tests__/TemplateRelationsForm.spec.js +3 -1
  74. package/src/templates/components/templateForm/__tests__/ValuesField.spec.js +6 -6
  75. package/src/templates/components/templateForm/__tests__/ValuesListForm.spec.js +4 -4
  76. package/src/templates/components/templateForm/__tests__/ValuesSelector.spec.js +3 -3
  77. package/src/templates/components/templateForm/widgetDefinitions.js +2 -0
  78. package/src/templates/reducers/__tests__/allTemplates.spec.js +4 -4
  79. package/src/templates/reducers/__tests__/selectedTemplate.spec.js +2 -2
  80. package/src/templates/reducers/__tests__/template.spec.js +4 -4
  81. package/src/templates/reducers/__tests__/templateDeleting.spec.js +2 -2
  82. package/src/templates/reducers/__tests__/templateLoading.spec.js +2 -2
  83. package/src/templates/reducers/__tests__/templates.spec.js +3 -3
  84. package/src/templates/reducers/__tests__/templatesLoading.spec.js +2 -2
  85. package/src/templates/sagas/__tests__/createTemplate.spec.js +3 -3
  86. package/src/templates/sagas/__tests__/fetchTemplates.spec.js +1 -1
  87. package/src/templates/sagas/index.js +2 -2
  88. package/src/templates/utils/__tests__/applyDefaults.spec.js +4 -4
  89. package/src/templates/utils/__tests__/filterDomains.spec.js +15 -15
  90. package/src/templates/utils/__tests__/filterFields.spec.js +2 -2
  91. package/src/templates/utils/__tests__/filterSwitches.spec.js +5 -5
  92. package/src/templates/utils/__tests__/filterValues.spec.js +4 -4
  93. package/src/templates/utils/__tests__/formatLegacyContent.spec.js +7 -7
  94. package/src/templates/utils/applyTemplate.js +66 -53
  95. package/src/templates/utils/filterDepends.js +1 -1
  96. package/src/templates/utils/filterSwitches.js +3 -3
  97. package/src/templates/utils/filterValues.js +4 -5
  98. package/src/templates/utils/flattenFields.js +2 -2
  99. package/src/templates/utils/formatLegacyContent.js +2 -1
  100. package/src/templates/utils/parseFieldOptions.js +15 -14
  101. package/src/templates/utils/parseGroups.js +43 -43
  102. 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
- ...jest.requireActual("react-intl"),
12
- useIntl: () => ({
13
- formatMessage: mockFormatMessage,
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
- 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();
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
- test("renders dropdowns with initial values", async () => {
39
- const rendered = render(<FieldDefinition {...baseProps} onChange={jest.fn()} />);
40
- waitForLoad(rendered);
41
- expect(rendered.container).toMatchSnapshot();
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
- test("handleWidgetChange: sets valueName to null (via getValues), resets default, sets subscribable=false, then emits type change", async () => {
62
- const onChange = jest.fn();
63
- const rendered = render(<FieldDefinition {...baseProps} onChange={onChange} />);
64
- waitForLoad(rendered);
65
-
66
- const numberOpt = within(rendered.getAllByRole("listbox")[0]).getByRole("option", { name: "Number" });
67
- // Change type; for widget 'string' the only type is 'string', so switch the widget first to 'number'
68
- await user.click(numberOpt);
69
-
70
- // 1) reset value
71
- expect(onChange).toHaveBeenNthCalledWith(
72
- onChange.mock.calls.length - 3,
73
- null,
74
- { name: "field.value", value: null }
75
- );
76
-
77
- // // 2) reset defaultField
78
- expect(onChange).toHaveBeenNthCalledWith(
79
- onChange.mock.calls.length - 2,
80
- expect.anything(),
81
- { name: "field.default", value: { value: "", origin: "default" } }
82
- );
83
-
84
- // // 3) set subscribable=false
85
- expect(onChange).toHaveBeenNthCalledWith(
86
- onChange.mock.calls.length - 1,
87
- expect.anything(),
88
- { name: "field.subscribable", value: false }
89
- );
90
-
91
- // // 4) finally, the actual type widget event payload
92
- expect(onChange).toHaveBeenLastCalledWith(
93
- expect.anything(),
94
- expect.objectContaining({ name: "field.widget", value: "number" })
95
- );
96
- });
97
-
98
- test("handleTypeChange: recomputes default value via real getValues, resets default, sets subscribable=false, and emits widget change", async () => {
99
- const onChange = jest.fn();
100
- const rendered = render(<FieldDefinition {...{ ...baseProps, widget: "dropdown", type: "string" }} onChange={onChange} />);
101
- waitForLoad(rendered);
102
-
103
- // Switch Type from 'string' to 'domain'
104
- const domainOpt = within(rendered.getAllByRole("listbox")[1]).getByRole("option", { name: "template.field.type.domain" });
105
- await user.click(domainOpt);
106
-
107
- // The first call in handleTypeChange is changeValue(valueName, ...) -> null
108
- expect(onChange).toHaveBeenNthCalledWith(
109
- 1,
110
- null,
111
- { name: "field.value", value: null }
112
- );
113
-
114
- // 2) default reset
115
- expect(onChange).toHaveBeenNthCalledWith(
116
- 2,
117
- expect.anything(),
118
- { name: "field.default", value: { value: "", origin: "default" } }
119
- );
120
-
121
- // 3) subscribable=false
122
- expect(onChange).toHaveBeenNthCalledWith(
123
- 3,
124
- expect.anything(),
125
- { name: "field.subscribable", value: false }
126
- );
127
-
128
- // 4) widget change payload
129
- expect(onChange).toHaveBeenNthCalledWith(
130
- 4,
131
- expect.anything(),
132
- expect.objectContaining({ name: "field.type", value: "domain" })
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
- test("useEffect: auto-fixes invalid type/cardinality for a widget (real WIDGETS)", () => {
137
- const onChange = jest.fn();
138
-
139
- // For widget='number', valid types: ['integer','float']; cardinalities: ['?','1']
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
- test("handleCardinalityChange: selecting '1' (or '+') clears mandatory when it's non-empty", async () => {
161
- const onChange = jest.fn();
162
-
163
- const rendered = render(
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
- test("allowedWidgets & allowedTypes filter visible options (using real option generators)", () => {
195
- const onChange = jest.fn();
196
-
197
- const rendered = render(
198
- <FieldDefinition
199
- {...baseProps}
200
- onChange={onChange}
201
- allowedWidgets={["number"]}
202
- allowedTypes={["float"]}
203
- widget="number"
204
- type="float"
205
- />
206
- );
207
-
208
- waitForLoad(rendered);
209
-
210
- const dropdowns = rendered.getAllByRole("listbox");
211
- expect(dropdowns.length).toBe(3);
212
-
213
- const widgetDropdown = dropdowns[0];
214
- expect(widgetDropdown).toHaveAttribute("name", "field.widget");
215
- const widgetOptions = within(widgetDropdown).getAllByRole("option");
216
- expect(widgetOptions.length).toBe(1);
217
- expect(widgetOptions[0]).toHaveAttribute("aria-checked", "true");
218
- expect(widgetOptions[0]).toHaveTextContent("Number");
219
-
220
- const typeDropdown = dropdowns[1];
221
- expect(typeDropdown).toHaveAttribute("name", "field.type");
222
- const typeOptions = within(typeDropdown).getAllByRole("option");
223
- expect(typeOptions.length).toBe(1);
224
- expect(typeOptions[0]).toHaveAttribute("aria-checked", "true");
225
- expect(typeOptions[0]).toHaveTextContent("float");
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("input[name='undefined.fields[0].name']")
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
  });