@truedat/core 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.
- package/package.json +3 -3
- package/src/components/AddMemberForm.js +3 -3
- package/src/components/Alert.js +3 -3
- package/src/components/AlertExporter.js +4 -4
- package/src/components/AvailableFilters.js +5 -5
- package/src/components/CSVFileModal.js +1 -1
- package/src/components/CardGroupsAccordion.js +4 -4
- package/src/components/CatalogMenu.js +2 -2
- package/src/components/CommentsForm.js +1 -1
- package/src/components/DomainSearchFilter.js +9 -9
- package/src/components/DomainSelector.js +1 -1
- package/src/components/FilterDropdown.js +5 -5
- package/src/components/FilterMultilevelDropdown.js +9 -9
- package/src/components/GlossaryMenu.js +10 -7
- package/src/components/Graph.js +199 -127
- package/src/components/GroupActions.js +2 -2
- package/src/components/Hierarchy.js +1 -1
- package/src/components/HierarchyFilterDropdown.js +7 -7
- package/src/components/HierarchySelector.js +1 -1
- package/src/components/LanguagesTabs.js +2 -2
- package/src/components/OptionGroup.js +8 -9
- package/src/components/QualityMenu.js +6 -8
- package/src/components/ResourceMembers.js +3 -3
- package/src/components/SearchFilterDropdown.js +3 -3
- package/src/components/SidebarToggle.js +1 -1
- package/src/components/Submenu.js +46 -27
- package/src/components/SystemsLoader.js +1 -1
- package/src/components/TemplatesLoader.js +1 -1
- package/src/components/TreeSelector.js +2 -2
- package/src/components/UploadJob.js +3 -3
- package/src/components/UploadJobBreadcrumbs.js +4 -1
- package/src/components/UploadJobParser.js +4 -3
- package/src/components/UploadModal.js +1 -1
- package/src/components/UserFilter.js +1 -1
- package/src/components/UserFilters.js +2 -2
- package/src/components/__tests__/ArrayDecorator.spec.js +2 -2
- package/src/components/__tests__/CardGroupsAccordion.spec.js +6 -6
- package/src/components/__tests__/CatalogMenu.spec.js +1 -1
- package/src/components/__tests__/DateTime.spec.js +1 -1
- package/src/components/__tests__/DomainSearchFilter.spec.js +2 -2
- package/src/components/__tests__/DomainSearchFilterItem.spec.js +7 -7
- package/src/components/__tests__/DomainSelector.spec.js +3 -3
- package/src/components/__tests__/DropdownMenuItem.spec.js +3 -3
- package/src/components/__tests__/FilterDropdown.spec.js +11 -11
- package/src/components/__tests__/FilterMultilevelDropdown.spec.js +2 -2
- package/src/components/__tests__/GlossaryMenu.spec.js +2 -2
- package/src/components/__tests__/Graph.spec.js +12 -4
- package/src/components/__tests__/GroupActions.spec.js +4 -4
- package/src/components/__tests__/Hierarchy.spec.js +1 -1
- package/src/components/__tests__/HierarchyFilterDropdown.spec.js +5 -5
- package/src/components/__tests__/HierarchyNodeFinder.spec.js +4 -4
- package/src/components/__tests__/HierarchySelector.spec.js +7 -5
- package/src/components/__tests__/Markdown.spec.js +22 -8
- package/src/components/__tests__/ModalSaveFilter.spec.js +1 -1
- package/src/components/__tests__/Pagination.spec.js +2 -2
- package/src/components/__tests__/ResourceMembers.spec.js +4 -4
- package/src/components/__tests__/SearchDateFilter.spec.js +10 -5
- package/src/components/__tests__/SearchFilterDropdown.spec.js +1 -1
- package/src/components/__tests__/SelectedFilters.spec.js +7 -7
- package/src/components/__tests__/SideMenu.spec.js +1 -1
- package/src/components/__tests__/Submenu.spec.js +1 -1
- package/src/components/__tests__/TemplateSelector.spec.js +5 -5
- package/src/components/__tests__/TreeSelector.spec.js +23 -24
- package/src/components/__tests__/UploadJob.spec.js +1 -3
- package/src/components/__tests__/UploadJobBreadcrumbs.spec.js +4 -4
- package/src/components/__tests__/UploadJobParser.spec.js +42 -38
- package/src/components/__tests__/UploadModal.spec.js +9 -9
- package/src/components/__tests__/UserFilters.spec.js +1 -1
- package/src/components/graph/ColoredEdge.js +29 -23
- package/src/components/graph/edgeLayout.js +4 -1
- package/src/hooks/__tests__/useActiveRoutes.spec.js +32 -18
- package/src/hooks/useAclEntries.js +2 -2
- package/src/hooks/useActiveRoutes.js +14 -6
- package/src/hooks/useAuthorized.js +3 -3
- package/src/hooks/useHierarchies.js +8 -8
- package/src/hooks/useLocales.js +3 -3
- package/src/hooks/useMessages.js +1 -1
- package/src/hooks/useOnScreen.js +1 -1
- package/src/hooks/useUploadJobs.js +2 -8
- package/src/hooks/useUserFilters.js +1 -1
- package/src/i18n/components/LangProvider.js +6 -6
- package/src/i18n/components/Languages.js +4 -4
- package/src/i18n/components/MessageForm.js +24 -13
- package/src/i18n/components/Messages.js +5 -5
- package/src/i18n/components/__tests__/I18nRoutes.spec.js +1 -1
- package/src/messages/index.js +1 -1
- package/src/reducers/comments.js +3 -3
- package/src/router/__tests__/ProtectedRoute.spec.js +1 -1
- package/src/routes.js +1 -1
- package/src/routesTree.js +6 -1
- package/src/routines.js +2 -2
- package/src/search/FilterDropdown.js +1 -1
- package/src/search/FilterMultilevelDropdown.js +10 -10
- package/src/search/FilterQueryDropdown.js +4 -4
- package/src/search/HierarchyFilterDropdown.js +7 -7
- package/src/search/SearchContext.js +19 -19
- package/src/search/SearchDateFilter.js +12 -2
- package/src/search/SearchFilters.js +1 -1
- package/src/search/SearchSelectedFilters.js +1 -1
- package/src/search/SearchWidget.js +6 -2
- package/src/search/UserFilter.js +1 -1
- package/src/search/UserFilters.js +4 -4
- package/src/search/__tests__/FilterDropdown.spec.js +3 -3
- package/src/search/__tests__/FilterQueryDropdown.spec.js +20 -18
- package/src/search/__tests__/ModalSaveFilter.spec.js +2 -2
- package/src/search/__tests__/SearchContext.spec.js +42 -42
- package/src/search/__tests__/SearchSelectedFilters.spec.js +21 -17
- package/src/search/__tests__/SearchWidget.spec.js +4 -4
- package/src/selectors/__tests__/getRiSubscopes.spec.js +1 -1
- package/src/selectors/__tests__/makeSearchQuerySelector.spec.js +2 -2
- package/src/selectors/getConceptSubscope.js +1 -1
- package/src/selectors/getDashboardConfig.js +3 -3
- package/src/selectors/getMessage.js +3 -3
- package/src/selectors/getRecipients.js +3 -3
- package/src/selectors/getRiSubscopes.js +2 -2
- package/src/selectors/getSidemenuGlossarySubscopes.js +1 -1
- package/src/selectors/makeActiveFiltersSelector.js +2 -2
- package/src/selectors/makeDateFiltersSelector.js +1 -1
- package/src/selectors/makeSearchQuerySelector.js +10 -10
- package/src/selectors/makeTagOptionsSelector.js +1 -4
- package/src/selectors/subscopedTemplates.js +2 -2
- package/src/services/columnPredicate.js +1 -1
- package/src/services/dateFilterFormatter.js +1 -1
- package/src/services/fieldType.js +1 -1
- package/src/services/formRules.js +16 -13
- package/src/services/getHierarchyOptions.js +2 -2
- package/src/services/message.js +7 -8
- package/src/services/operators.js +5 -5
- package/src/services/sort.js +2 -2
- package/src/services/swr.js +1 -1
- package/src/services/tree.js +2 -2
|
@@ -48,16 +48,14 @@ describe("<TreeSelector />", () => {
|
|
|
48
48
|
|
|
49
49
|
await waitFor(() => {
|
|
50
50
|
expect(
|
|
51
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
51
|
+
rendered.getByRole("option", { name: /foo/i }),
|
|
52
52
|
).toBeInTheDocument();
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
await user.click(rendered.getByRole("option", { name: /foo/i }));
|
|
56
56
|
expect(props.onChange.mock.calls.length).toBe(1);
|
|
57
57
|
expect(props.onChange.mock.calls[0][1]).toEqual({ value: ["1"] });
|
|
58
|
-
expect(
|
|
59
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
60
|
-
).toBeInTheDocument();
|
|
58
|
+
expect(rendered.getByRole("option", { name: /foo/i })).toBeInTheDocument();
|
|
61
59
|
});
|
|
62
60
|
|
|
63
61
|
it("calls onChange with selected values (single)", async () => {
|
|
@@ -75,7 +73,7 @@ describe("<TreeSelector />", () => {
|
|
|
75
73
|
|
|
76
74
|
await waitFor(() => {
|
|
77
75
|
expect(
|
|
78
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
76
|
+
rendered.getByRole("option", { name: /foo/i }),
|
|
79
77
|
).toBeInTheDocument();
|
|
80
78
|
});
|
|
81
79
|
|
|
@@ -83,9 +81,10 @@ describe("<TreeSelector />", () => {
|
|
|
83
81
|
expect(props.onChange.mock.calls.length).toBe(1);
|
|
84
82
|
expect(props.onChange.mock.calls[0][1]).toEqual({ value: "1" });
|
|
85
83
|
await waitFor(() => {
|
|
86
|
-
expect(
|
|
87
|
-
|
|
88
|
-
|
|
84
|
+
expect(rendered.getByRole("listbox")).toHaveAttribute(
|
|
85
|
+
"aria-expanded",
|
|
86
|
+
"false",
|
|
87
|
+
);
|
|
89
88
|
});
|
|
90
89
|
});
|
|
91
90
|
|
|
@@ -109,31 +108,31 @@ describe("<TreeSelector />", () => {
|
|
|
109
108
|
|
|
110
109
|
await waitFor(() => {
|
|
111
110
|
expect(
|
|
112
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
111
|
+
rendered.getByRole("option", { name: /foo/i }),
|
|
113
112
|
).toBeInTheDocument();
|
|
114
113
|
});
|
|
115
114
|
|
|
116
115
|
await user.click(
|
|
117
116
|
rendered
|
|
118
117
|
.getByRole("option", { name: /foo/i })
|
|
119
|
-
.querySelector('i[class="chevron right icon"]')
|
|
118
|
+
.querySelector('i[class="chevron right icon"]'),
|
|
120
119
|
);
|
|
121
120
|
|
|
122
121
|
await waitFor(() => {
|
|
123
122
|
expect(
|
|
124
|
-
rendered.getByRole("option", { name: /bar/i })
|
|
123
|
+
rendered.getByRole("option", { name: /bar/i }),
|
|
125
124
|
).toBeInTheDocument();
|
|
126
125
|
});
|
|
127
126
|
|
|
128
127
|
await user.click(
|
|
129
128
|
rendered
|
|
130
129
|
.getByRole("option", { name: /bar/i })
|
|
131
|
-
.querySelector('i[class="chevron right icon"]')
|
|
130
|
+
.querySelector('i[class="chevron right icon"]'),
|
|
132
131
|
);
|
|
133
132
|
|
|
134
133
|
await waitFor(() => {
|
|
135
134
|
expect(
|
|
136
|
-
rendered.getByRole("option", { name: /baz/i })
|
|
135
|
+
rendered.getByRole("option", { name: /baz/i }),
|
|
137
136
|
).toBeInTheDocument();
|
|
138
137
|
});
|
|
139
138
|
|
|
@@ -163,19 +162,19 @@ describe("<TreeSelector />", () => {
|
|
|
163
162
|
|
|
164
163
|
await waitFor(() => {
|
|
165
164
|
expect(
|
|
166
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
165
|
+
rendered.getByRole("option", { name: /foo/i }),
|
|
167
166
|
).toBeInTheDocument();
|
|
168
167
|
});
|
|
169
168
|
|
|
170
169
|
await user.click(
|
|
171
170
|
rendered
|
|
172
171
|
.getByRole("option", { name: /foo/i })
|
|
173
|
-
.querySelector('i[class="chevron right icon"]')
|
|
172
|
+
.querySelector('i[class="chevron right icon"]'),
|
|
174
173
|
);
|
|
175
174
|
|
|
176
175
|
await waitFor(() => {
|
|
177
176
|
expect(
|
|
178
|
-
rendered.getByRole("option", { name: /bar/i })
|
|
177
|
+
rendered.getByRole("option", { name: /bar/i }),
|
|
179
178
|
).toBeInTheDocument();
|
|
180
179
|
});
|
|
181
180
|
|
|
@@ -203,31 +202,31 @@ describe("<TreeSelector />", () => {
|
|
|
203
202
|
|
|
204
203
|
await waitFor(() => {
|
|
205
204
|
expect(
|
|
206
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
205
|
+
rendered.getByRole("option", { name: /foo/i }),
|
|
207
206
|
).toBeInTheDocument();
|
|
208
207
|
});
|
|
209
208
|
|
|
210
209
|
await user.click(
|
|
211
210
|
rendered
|
|
212
211
|
.getByRole("option", { name: /foo/i })
|
|
213
|
-
.querySelector('i[class="chevron right icon"]')
|
|
212
|
+
.querySelector('i[class="chevron right icon"]'),
|
|
214
213
|
);
|
|
215
214
|
|
|
216
215
|
await waitFor(() => {
|
|
217
216
|
expect(
|
|
218
|
-
rendered.getByRole("option", { name: /bar/i })
|
|
217
|
+
rendered.getByRole("option", { name: /bar/i }),
|
|
219
218
|
).toBeInTheDocument();
|
|
220
219
|
});
|
|
221
220
|
|
|
222
221
|
await user.click(
|
|
223
222
|
rendered
|
|
224
223
|
.getByRole("option", { name: /bar/i })
|
|
225
|
-
.querySelector('i[class="chevron right icon"]')
|
|
224
|
+
.querySelector('i[class="chevron right icon"]'),
|
|
226
225
|
);
|
|
227
226
|
|
|
228
227
|
await waitFor(() => {
|
|
229
228
|
expect(
|
|
230
|
-
rendered.getByRole("option", { name: /baz/i })
|
|
229
|
+
rendered.getByRole("option", { name: /baz/i }),
|
|
231
230
|
).toBeInTheDocument();
|
|
232
231
|
});
|
|
233
232
|
|
|
@@ -256,19 +255,19 @@ describe("<TreeSelector />", () => {
|
|
|
256
255
|
|
|
257
256
|
await waitFor(() => {
|
|
258
257
|
expect(
|
|
259
|
-
rendered.getByRole("option", { name: /foo/i })
|
|
258
|
+
rendered.getByRole("option", { name: /foo/i }),
|
|
260
259
|
).toBeInTheDocument();
|
|
261
260
|
});
|
|
262
261
|
|
|
263
262
|
await user.click(
|
|
264
263
|
rendered
|
|
265
264
|
.getByRole("option", { name: /foo/i })
|
|
266
|
-
.querySelector('i[class="chevron right icon"]')
|
|
265
|
+
.querySelector('i[class="chevron right icon"]'),
|
|
267
266
|
);
|
|
268
267
|
|
|
269
268
|
await waitFor(() => {
|
|
270
269
|
expect(
|
|
271
|
-
rendered.getByRole("option", { name: /bar/i })
|
|
270
|
+
rendered.getByRole("option", { name: /bar/i }),
|
|
272
271
|
).toBeInTheDocument();
|
|
273
272
|
});
|
|
274
273
|
|
|
@@ -104,9 +104,7 @@ describe("<UploadJob />", () => {
|
|
|
104
104
|
|
|
105
105
|
// COMPLETED events are always visible
|
|
106
106
|
expect(
|
|
107
|
-
rendered.getAllByText(
|
|
108
|
-
/uploadJob.parser.event.status.COMPLETED/i
|
|
109
|
-
)
|
|
107
|
+
rendered.getAllByText(/uploadJob.parser.event.status.COMPLETED/i),
|
|
110
108
|
).toHaveLength(2);
|
|
111
109
|
});
|
|
112
110
|
});
|
|
@@ -7,7 +7,7 @@ describe("ImplementationUploadJobBreadcrumbs", () => {
|
|
|
7
7
|
await waitForLoad(rendered);
|
|
8
8
|
|
|
9
9
|
expect(
|
|
10
|
-
rendered.getByText(/uploadJobs.implementations.header/i)
|
|
10
|
+
rendered.getByText(/uploadJobs.implementations.header/i),
|
|
11
11
|
).toBeInTheDocument();
|
|
12
12
|
expect(rendered.container).toMatchSnapshot();
|
|
13
13
|
});
|
|
@@ -17,19 +17,19 @@ describe("ImplementationUploadJobBreadcrumbs", () => {
|
|
|
17
17
|
await waitForLoad(rendered);
|
|
18
18
|
|
|
19
19
|
expect(
|
|
20
|
-
rendered.getByText(/uploadJobs.myscope.header/i)
|
|
20
|
+
rendered.getByText(/uploadJobs.myscope.header/i),
|
|
21
21
|
).toBeInTheDocument();
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
it("renders breadcrumbs with filename", async () => {
|
|
25
25
|
const filename = "test.csv";
|
|
26
26
|
const rendered = render(
|
|
27
|
-
<UploadJobBreadcrumbs scope="implementations" filename={filename}
|
|
27
|
+
<UploadJobBreadcrumbs scope="implementations" filename={filename} />,
|
|
28
28
|
);
|
|
29
29
|
await waitForLoad(rendered);
|
|
30
30
|
|
|
31
31
|
expect(
|
|
32
|
-
rendered.getByText(/uploadJobs.implementations.header/i)
|
|
32
|
+
rendered.getByText(/uploadJobs.implementations.header/i),
|
|
33
33
|
).toBeInTheDocument();
|
|
34
34
|
expect(rendered.getByText(filename)).toBeInTheDocument();
|
|
35
35
|
expect(rendered.container).toMatchSnapshot();
|
|
@@ -13,8 +13,8 @@ describe("<StatusPill />", () => {
|
|
|
13
13
|
expect(label).toHaveClass(expectedColors[index]);
|
|
14
14
|
expect(
|
|
15
15
|
rendered.getByText(
|
|
16
|
-
new RegExp(`uploadJob.parser.event.status.${status}`, "i")
|
|
17
|
-
)
|
|
16
|
+
new RegExp(`uploadJob.parser.event.status.${status}`, "i"),
|
|
17
|
+
),
|
|
18
18
|
).toBeInTheDocument();
|
|
19
19
|
});
|
|
20
20
|
});
|
|
@@ -23,7 +23,7 @@ describe("<StatusPill />", () => {
|
|
|
23
23
|
describe("<ResponseCell />", () => {
|
|
24
24
|
it("returns null when response is empty", () => {
|
|
25
25
|
const rendered = render(
|
|
26
|
-
<ResponseCell response={null} status="COMPLETED"
|
|
26
|
+
<ResponseCell response={null} status="COMPLETED" />,
|
|
27
27
|
);
|
|
28
28
|
expect(rendered.container.firstChild).toBeNull();
|
|
29
29
|
|
|
@@ -34,7 +34,7 @@ describe("<ResponseCell />", () => {
|
|
|
34
34
|
it("renders FAILED status with message", () => {
|
|
35
35
|
const response = { message: "missing_required_headers" };
|
|
36
36
|
const rendered = render(
|
|
37
|
-
<ResponseCell response={response} status="FAILED"
|
|
37
|
+
<ResponseCell response={response} status="FAILED" />,
|
|
38
38
|
);
|
|
39
39
|
expect(rendered.getByText(/missing_required_headers/i)).toBeInTheDocument();
|
|
40
40
|
});
|
|
@@ -47,10 +47,10 @@ describe("<ResponseCell />", () => {
|
|
|
47
47
|
},
|
|
48
48
|
};
|
|
49
49
|
const rendered = render(
|
|
50
|
-
<ResponseCell response={response} status="ERROR"
|
|
50
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
51
51
|
);
|
|
52
52
|
expect(
|
|
53
|
-
rendered.getByText(/uploadJob.parser.error.missing_required_headers/i)
|
|
53
|
+
rendered.getByText(/uploadJob.parser.error.missing_required_headers/i),
|
|
54
54
|
).toBeInTheDocument();
|
|
55
55
|
expect(rendered.getByText(/header1, header2/i)).toBeInTheDocument();
|
|
56
56
|
});
|
|
@@ -62,13 +62,13 @@ describe("<ResponseCell />", () => {
|
|
|
62
62
|
error_count: 0,
|
|
63
63
|
};
|
|
64
64
|
const rendered = render(
|
|
65
|
-
<ResponseCell response={response} status="COMPLETED"
|
|
65
|
+
<ResponseCell response={response} status="COMPLETED" />,
|
|
66
66
|
);
|
|
67
67
|
expect(
|
|
68
|
-
rendered.getByText(/uploadJob.parser.result.summary.created/i)
|
|
68
|
+
rendered.getByText(/uploadJob.parser.result.summary.created/i),
|
|
69
69
|
).toBeInTheDocument();
|
|
70
70
|
expect(
|
|
71
|
-
rendered.getByText(/uploadJob.parser.result.summary.updated/i)
|
|
71
|
+
rendered.getByText(/uploadJob.parser.result.summary.updated/i),
|
|
72
72
|
).toBeInTheDocument();
|
|
73
73
|
});
|
|
74
74
|
|
|
@@ -84,7 +84,7 @@ describe("<ResponseCell />", () => {
|
|
|
84
84
|
};
|
|
85
85
|
const rendered = render(<ResponseCell response={response} status="INFO" />);
|
|
86
86
|
expect(
|
|
87
|
-
rendered.getByText(/uploadJob.parser.info.implementation_updated/i)
|
|
87
|
+
rendered.getByText(/uploadJob.parser.info.implementation_updated/i),
|
|
88
88
|
).toBeInTheDocument();
|
|
89
89
|
});
|
|
90
90
|
|
|
@@ -97,13 +97,15 @@ describe("<ResponseCell />", () => {
|
|
|
97
97
|
},
|
|
98
98
|
};
|
|
99
99
|
const rendered = render(<ResponseCell response={response} status="INFO" />);
|
|
100
|
-
expect(
|
|
100
|
+
expect(
|
|
101
|
+
rendered.getByText(/uploadJob.parser.info.deprecated_implementation/i),
|
|
102
|
+
).toBeInTheDocument();
|
|
101
103
|
});
|
|
102
104
|
|
|
103
105
|
it("renders default case for unknown status", () => {
|
|
104
106
|
const response = "some text";
|
|
105
107
|
const rendered = render(
|
|
106
|
-
<ResponseCell response={response} status="UNKNOWN"
|
|
108
|
+
<ResponseCell response={response} status="UNKNOWN" />,
|
|
107
109
|
);
|
|
108
110
|
expect(rendered.getByText(/some text/i)).toBeInTheDocument();
|
|
109
111
|
});
|
|
@@ -131,7 +133,7 @@ describe("<ResponseCell />", () => {
|
|
|
131
133
|
};
|
|
132
134
|
const rendered = render(
|
|
133
135
|
<ResponseCell response={response} status="ERROR" />,
|
|
134
|
-
renderOpts
|
|
136
|
+
renderOpts,
|
|
135
137
|
);
|
|
136
138
|
expect(rendered.getByText(/structure note error/i)).toBeInTheDocument();
|
|
137
139
|
expect(rendered.getByText(/content unchanged/i)).toBeInTheDocument();
|
|
@@ -140,7 +142,7 @@ describe("<ResponseCell />", () => {
|
|
|
140
142
|
it("returns null when ERROR response has no type", () => {
|
|
141
143
|
const response = { details: {} };
|
|
142
144
|
const rendered = render(
|
|
143
|
-
<ResponseCell response={response} status="ERROR"
|
|
145
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
144
146
|
);
|
|
145
147
|
expect(rendered.container.firstChild).toBeNull();
|
|
146
148
|
});
|
|
@@ -151,10 +153,10 @@ describe("<ResponseCell />", () => {
|
|
|
151
153
|
details: { template_name: "My Template" },
|
|
152
154
|
};
|
|
153
155
|
const rendered = render(
|
|
154
|
-
<ResponseCell response={response} status="ERROR"
|
|
156
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
155
157
|
);
|
|
156
158
|
expect(
|
|
157
|
-
rendered.getByText(/uploadJob.parser.error.invalid_template_name/i)
|
|
159
|
+
rendered.getByText(/uploadJob.parser.error.invalid_template_name/i),
|
|
158
160
|
).toBeInTheDocument();
|
|
159
161
|
expect(rendered.getByText(/My Template/i)).toBeInTheDocument();
|
|
160
162
|
});
|
|
@@ -165,10 +167,10 @@ describe("<ResponseCell />", () => {
|
|
|
165
167
|
details: { duplicate_fields: ["col_a", "col_b"] },
|
|
166
168
|
};
|
|
167
169
|
const rendered = render(
|
|
168
|
-
<ResponseCell response={response} status="ERROR"
|
|
170
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
169
171
|
);
|
|
170
172
|
expect(
|
|
171
|
-
rendered.getByText(/uploadJob.parser.error.duplicate_field_names/i)
|
|
173
|
+
rendered.getByText(/uploadJob.parser.error.duplicate_field_names/i),
|
|
172
174
|
).toBeInTheDocument();
|
|
173
175
|
expect(rendered.getByText(/col_a, col_b/i)).toBeInTheDocument();
|
|
174
176
|
});
|
|
@@ -182,12 +184,12 @@ describe("<ResponseCell />", () => {
|
|
|
182
184
|
],
|
|
183
185
|
};
|
|
184
186
|
const rendered = render(
|
|
185
|
-
<ResponseCell response={response} status="ERROR"
|
|
187
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
186
188
|
);
|
|
187
189
|
expect(
|
|
188
190
|
rendered.getByText(
|
|
189
|
-
/uploadJob.parser.error.implementation_creation_error/i
|
|
190
|
-
)
|
|
191
|
+
/uploadJob.parser.error.implementation_creation_error/i,
|
|
192
|
+
),
|
|
191
193
|
).toBeInTheDocument();
|
|
192
194
|
expect(rendered.getByText(/Name is required/i)).toBeInTheDocument();
|
|
193
195
|
expect(rendered.getByText(/Key is invalid/i)).toBeInTheDocument();
|
|
@@ -202,7 +204,7 @@ describe("<ResponseCell />", () => {
|
|
|
202
204
|
],
|
|
203
205
|
};
|
|
204
206
|
const rendered = render(
|
|
205
|
-
<ResponseCell response={response} status="ERROR"
|
|
207
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
206
208
|
);
|
|
207
209
|
expect(rendered.getByText(/Invalid/i)).toBeInTheDocument();
|
|
208
210
|
expect(rendered.getByText(/Duplicate/i)).toBeInTheDocument();
|
|
@@ -219,10 +221,10 @@ describe("<ResponseCell />", () => {
|
|
|
219
221
|
},
|
|
220
222
|
};
|
|
221
223
|
const rendered = render(
|
|
222
|
-
<ResponseCell response={response} status="ERROR"
|
|
224
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
223
225
|
);
|
|
224
226
|
expect(
|
|
225
|
-
rendered.getByText(/uploadJob.parser.error.field_validation_error/i)
|
|
227
|
+
rendered.getByText(/uploadJob.parser.error.field_validation_error/i),
|
|
226
228
|
).toBeInTheDocument();
|
|
227
229
|
expect(rendered.getByText(/Required/i)).toBeInTheDocument();
|
|
228
230
|
expect(rendered.getByText(/Already exists/i)).toBeInTheDocument();
|
|
@@ -234,10 +236,10 @@ describe("<ResponseCell />", () => {
|
|
|
234
236
|
details: { implementation_key: "old_impl_key" },
|
|
235
237
|
};
|
|
236
238
|
const rendered = render(
|
|
237
|
-
<ResponseCell response={response} status="ERROR"
|
|
239
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
238
240
|
);
|
|
239
241
|
expect(
|
|
240
|
-
rendered.getByText(/uploadJob.parser.error.deprecated_implementation/i)
|
|
242
|
+
rendered.getByText(/uploadJob.parser.error.deprecated_implementation/i),
|
|
241
243
|
).toBeInTheDocument();
|
|
242
244
|
expect(rendered.getByText(/old_impl_key/i)).toBeInTheDocument();
|
|
243
245
|
});
|
|
@@ -257,7 +259,7 @@ describe("<ResponseCell />", () => {
|
|
|
257
259
|
};
|
|
258
260
|
const rendered = render(
|
|
259
261
|
<ResponseCell response={response} status="ERROR" />,
|
|
260
|
-
renderOpts
|
|
262
|
+
renderOpts,
|
|
261
263
|
);
|
|
262
264
|
expect(rendered.getByText(/unreject failed/i)).toBeInTheDocument();
|
|
263
265
|
expect(rendered.getByText(/Workflow in progress/i)).toBeInTheDocument();
|
|
@@ -272,21 +274,21 @@ describe("<ResponseCell />", () => {
|
|
|
272
274
|
invalid_sheet_count: 0,
|
|
273
275
|
};
|
|
274
276
|
const rendered = render(
|
|
275
|
-
<ResponseCell response={response} status="COMPLETED"
|
|
277
|
+
<ResponseCell response={response} status="COMPLETED" />,
|
|
276
278
|
);
|
|
277
279
|
expect(
|
|
278
|
-
rendered.queryByText(/uploadJob.parser.result.summary.created/i)
|
|
280
|
+
rendered.queryByText(/uploadJob.parser.result.summary.created/i),
|
|
279
281
|
).not.toBeInTheDocument();
|
|
280
282
|
});
|
|
281
283
|
|
|
282
284
|
it("renders default case with object response as JSON", () => {
|
|
283
285
|
const response = { code: "ERR_001", description: "Something failed" };
|
|
284
286
|
const rendered = render(
|
|
285
|
-
<ResponseCell response={response} status="UNKNOWN"
|
|
287
|
+
<ResponseCell response={response} status="UNKNOWN" />,
|
|
286
288
|
);
|
|
287
289
|
expect(rendered.getByText(/"code":\s*"ERR_001"/i)).toBeInTheDocument();
|
|
288
290
|
expect(
|
|
289
|
-
rendered.getByText(/"description":\s*"Something failed"/i)
|
|
291
|
+
rendered.getByText(/"description":\s*"Something failed"/i),
|
|
290
292
|
).toBeInTheDocument();
|
|
291
293
|
});
|
|
292
294
|
|
|
@@ -303,14 +305,16 @@ describe("<ResponseCell />", () => {
|
|
|
303
305
|
const user = userEvent.setup({ delay: null });
|
|
304
306
|
const rendered = render(<ResponseCell response={response} status="INFO" />);
|
|
305
307
|
expect(
|
|
306
|
-
rendered.getByText(/uploadJob.parser.info.implementation_updated/i)
|
|
308
|
+
rendered.getByText(/uploadJob.parser.info.implementation_updated/i),
|
|
307
309
|
).toBeInTheDocument();
|
|
308
310
|
expect(
|
|
309
|
-
rendered.getByText(/uploadJob.parser.result.prop.changes/i)
|
|
311
|
+
rendered.getByText(/uploadJob.parser.result.prop.changes/i),
|
|
310
312
|
).toBeInTheDocument();
|
|
311
313
|
expect(rendered.getByText(/\(2\)/)).toBeInTheDocument();
|
|
312
314
|
await user.click(
|
|
313
|
-
rendered
|
|
315
|
+
rendered
|
|
316
|
+
.getByText(/uploadJob.parser.result.prop.changes/i)
|
|
317
|
+
.closest("div"),
|
|
314
318
|
);
|
|
315
319
|
expect(rendered.getByText(/New Name/i)).toBeInTheDocument();
|
|
316
320
|
expect(rendered.getByText(/Updated description/i)).toBeInTheDocument();
|
|
@@ -330,11 +334,11 @@ describe("<ResponseCell />", () => {
|
|
|
330
334
|
const user = userEvent.setup({ delay: null });
|
|
331
335
|
const rendered = render(<ResponseCell response={response} status="INFO" />);
|
|
332
336
|
const changesHeader = rendered.getByText(
|
|
333
|
-
/uploadJob.parser.result.prop.changes/i
|
|
337
|
+
/uploadJob.parser.result.prop.changes/i,
|
|
334
338
|
);
|
|
335
339
|
await user.click(changesHeader.closest("div"));
|
|
336
340
|
expect(
|
|
337
|
-
rendered.getByText(/ruleImplementations.props.df_content/i)
|
|
341
|
+
rendered.getByText(/ruleImplementations.props.df_content/i),
|
|
338
342
|
).toBeInTheDocument();
|
|
339
343
|
});
|
|
340
344
|
|
|
@@ -346,7 +350,7 @@ describe("<ResponseCell />", () => {
|
|
|
346
350
|
details: { missing_headers: ["H1"] },
|
|
347
351
|
};
|
|
348
352
|
const rendered = render(
|
|
349
|
-
<ResponseCell response={response} status="ERROR"
|
|
353
|
+
<ResponseCell response={response} status="ERROR" />,
|
|
350
354
|
);
|
|
351
355
|
expect(rendered.getByText(/Sheet1/i)).toBeInTheDocument();
|
|
352
356
|
expect(rendered.getByText(/5/)).toBeInTheDocument();
|
|
@@ -356,7 +360,7 @@ describe("<ResponseCell />", () => {
|
|
|
356
360
|
const response = { type: "some_info" };
|
|
357
361
|
const rendered = render(<ResponseCell response={response} status="INFO" />);
|
|
358
362
|
expect(
|
|
359
|
-
rendered.getByText(/uploadJob.parser.info.some_info/i)
|
|
363
|
+
rendered.getByText(/uploadJob.parser.info.some_info/i),
|
|
360
364
|
).toBeInTheDocument();
|
|
361
365
|
});
|
|
362
366
|
|
|
@@ -43,12 +43,12 @@ describe.skip("<UploadModal />", () => {
|
|
|
43
43
|
param: "implementations",
|
|
44
44
|
handleSubmit: onClickYesAction,
|
|
45
45
|
}}
|
|
46
|
-
|
|
46
|
+
/>,
|
|
47
47
|
);
|
|
48
48
|
await waitForLoad(rendered);
|
|
49
49
|
|
|
50
50
|
await user.click(
|
|
51
|
-
rendered.getByRole("option", { name: /trigger element/i })
|
|
51
|
+
rendered.getByRole("option", { name: /trigger element/i }),
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
const yesActionButton = rendered.getByRole("button", {
|
|
@@ -63,7 +63,7 @@ describe.skip("<UploadModal />", () => {
|
|
|
63
63
|
|
|
64
64
|
expect(rendered.getByText(/trigger element/i)).toBeInTheDocument();
|
|
65
65
|
expect(
|
|
66
|
-
rendered.getByText(/uploadModal.actions.upload.confirmation.content/i)
|
|
66
|
+
rendered.getByText(/uploadModal.actions.upload.confirmation.content/i),
|
|
67
67
|
).toBeInTheDocument();
|
|
68
68
|
});
|
|
69
69
|
|
|
@@ -77,12 +77,12 @@ describe.skip("<UploadModal />", () => {
|
|
|
77
77
|
param: "implementations",
|
|
78
78
|
handleSubmit: onClickYesAction,
|
|
79
79
|
}}
|
|
80
|
-
|
|
80
|
+
/>,
|
|
81
81
|
);
|
|
82
82
|
await waitForLoad(rendered);
|
|
83
83
|
|
|
84
84
|
await user.click(
|
|
85
|
-
rendered.getByRole("option", { name: /trigger element/i })
|
|
85
|
+
rendered.getByRole("option", { name: /trigger element/i }),
|
|
86
86
|
);
|
|
87
87
|
|
|
88
88
|
const yesActionButton = rendered.getByRole("button", {
|
|
@@ -100,7 +100,7 @@ describe.skip("<UploadModal />", () => {
|
|
|
100
100
|
});
|
|
101
101
|
|
|
102
102
|
const dropZone = rendered.getByText(
|
|
103
|
-
/uploadModal.actions.upload.confirmation.content/i
|
|
103
|
+
/uploadModal.actions.upload.confirmation.content/i,
|
|
104
104
|
);
|
|
105
105
|
const data = mockData([fakeFile]);
|
|
106
106
|
|
|
@@ -128,12 +128,12 @@ describe.skip("<UploadModal />", () => {
|
|
|
128
128
|
param: "implementations",
|
|
129
129
|
handleSubmit: onClickYesAction,
|
|
130
130
|
}}
|
|
131
|
-
|
|
131
|
+
/>,
|
|
132
132
|
);
|
|
133
133
|
await waitForLoad(rendered);
|
|
134
134
|
|
|
135
135
|
await user.click(
|
|
136
|
-
rendered.getByRole("option", { name: /trigger element/i })
|
|
136
|
+
rendered.getByRole("option", { name: /trigger element/i }),
|
|
137
137
|
);
|
|
138
138
|
|
|
139
139
|
const yesActionButton = rendered.getByRole("button", {
|
|
@@ -151,7 +151,7 @@ describe.skip("<UploadModal />", () => {
|
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
const dropZone = rendered.getByText(
|
|
154
|
-
/uploadModal.actions.upload.confirmation.content/i
|
|
154
|
+
/uploadModal.actions.upload.confirmation.content/i,
|
|
155
155
|
);
|
|
156
156
|
const data = mockData([fakeFile]);
|
|
157
157
|
|
|
@@ -186,7 +186,7 @@ describe("<UserFilters /> for taxonomy screens", () => {
|
|
|
186
186
|
expect(rendered.queryByText(/hide multiple domain filter/i)).toBeNull();
|
|
187
187
|
expect(rendered.queryByText(/hide other domain filter/i)).toBeNull();
|
|
188
188
|
expect(
|
|
189
|
-
rendered.getByText(/show status and domain filter/i)
|
|
189
|
+
rendered.getByText(/show status and domain filter/i),
|
|
190
190
|
).toBeInTheDocument();
|
|
191
191
|
});
|
|
192
192
|
});
|
|
@@ -14,7 +14,10 @@ const getCurveOffset = ({ sourceX, sourceY, targetX, targetY }) => {
|
|
|
14
14
|
|
|
15
15
|
return Math.max(
|
|
16
16
|
MIN_CURVE_OFFSET,
|
|
17
|
-
Math.min(
|
|
17
|
+
Math.min(
|
|
18
|
+
MAX_CURVE_OFFSET,
|
|
19
|
+
horizontalDistance * 0.28 + verticalDistance * 0.04,
|
|
20
|
+
),
|
|
18
21
|
);
|
|
19
22
|
};
|
|
20
23
|
|
|
@@ -38,21 +41,14 @@ const getBezierPoint = (t, p0, p1, p2, p3) => {
|
|
|
38
41
|
const mt2 = mt * mt;
|
|
39
42
|
const t2 = t * t;
|
|
40
43
|
|
|
41
|
-
return
|
|
42
|
-
mt2 * mt * p0 +
|
|
43
|
-
3 * mt2 * t * p1 +
|
|
44
|
-
3 * mt * t2 * p2 +
|
|
45
|
-
t2 * t * p3
|
|
46
|
-
);
|
|
44
|
+
return mt2 * mt * p0 + 3 * mt2 * t * p1 + 3 * mt * t2 * p2 + t2 * t * p3;
|
|
47
45
|
};
|
|
48
46
|
|
|
49
47
|
const getBezierDerivative = (t, p0, p1, p2, p3) => {
|
|
50
48
|
const mt = 1 - t;
|
|
51
49
|
|
|
52
50
|
return (
|
|
53
|
-
3 * mt * mt * (p1 - p0) +
|
|
54
|
-
6 * mt * t * (p2 - p1) +
|
|
55
|
-
3 * t * t * (p3 - p2)
|
|
51
|
+
3 * mt * mt * (p1 - p0) + 6 * mt * t * (p2 - p1) + 3 * t * t * (p3 - p2)
|
|
56
52
|
);
|
|
57
53
|
};
|
|
58
54
|
|
|
@@ -76,7 +72,7 @@ const ColoredEdge = ({
|
|
|
76
72
|
const [hovered, setHovered] = useState(false);
|
|
77
73
|
const targetSlotOffset = getTargetSlotOffset(
|
|
78
74
|
data.targetSlotIndex,
|
|
79
|
-
data.targetSlotCount
|
|
75
|
+
data.targetSlotCount,
|
|
80
76
|
);
|
|
81
77
|
const adjustedTargetY = targetY + targetSlotOffset;
|
|
82
78
|
const curveOffset = getCurveOffset({
|
|
@@ -90,13 +86,13 @@ const ColoredEdge = ({
|
|
|
90
86
|
sourceX,
|
|
91
87
|
sourceY,
|
|
92
88
|
sourcePosition,
|
|
93
|
-
curveOffset
|
|
89
|
+
curveOffset,
|
|
94
90
|
);
|
|
95
91
|
const targetControl = getControlPoint(
|
|
96
92
|
targetX,
|
|
97
93
|
adjustedTargetY,
|
|
98
94
|
targetPosition,
|
|
99
|
-
curveOffset
|
|
95
|
+
curveOffset,
|
|
100
96
|
);
|
|
101
97
|
const targetTangent = normalizeVector(
|
|
102
98
|
getBezierDerivative(1, sourceX, sourceControl.x, targetControl.x, targetX),
|
|
@@ -105,14 +101,26 @@ const ColoredEdge = ({
|
|
|
105
101
|
sourceY,
|
|
106
102
|
sourceControl.y,
|
|
107
103
|
targetControl.y,
|
|
108
|
-
adjustedTargetY
|
|
109
|
-
)
|
|
104
|
+
adjustedTargetY,
|
|
105
|
+
),
|
|
110
106
|
);
|
|
111
107
|
const lineTargetX = targetX - targetTangent.x * EDGE_ARROW_LENGTH;
|
|
112
108
|
const lineTargetY = adjustedTargetY - targetTangent.y * EDGE_ARROW_LENGTH;
|
|
113
109
|
const edgePath = `M ${sourceX},${sourceY} C ${sourceControl.x},${sourceControl.y} ${targetControl.x},${targetControl.y} ${lineTargetX},${lineTargetY}`;
|
|
114
|
-
const labelX = getBezierPoint(
|
|
115
|
-
|
|
110
|
+
const labelX = getBezierPoint(
|
|
111
|
+
0.5,
|
|
112
|
+
sourceX,
|
|
113
|
+
sourceControl.x,
|
|
114
|
+
targetControl.x,
|
|
115
|
+
lineTargetX,
|
|
116
|
+
);
|
|
117
|
+
const labelY = getBezierPoint(
|
|
118
|
+
0.5,
|
|
119
|
+
sourceY,
|
|
120
|
+
sourceControl.y,
|
|
121
|
+
targetControl.y,
|
|
122
|
+
lineTargetY,
|
|
123
|
+
);
|
|
116
124
|
const arrowNormalX = -targetTangent.y;
|
|
117
125
|
const arrowNormalY = targetTangent.x;
|
|
118
126
|
const arrowLeftX = lineTargetX + arrowNormalX * (EDGE_ARROW_WIDTH / 2);
|
|
@@ -122,11 +130,7 @@ const ColoredEdge = ({
|
|
|
122
130
|
|
|
123
131
|
return (
|
|
124
132
|
<>
|
|
125
|
-
<BaseEdge
|
|
126
|
-
id={id}
|
|
127
|
-
path={edgePath}
|
|
128
|
-
style={style}
|
|
129
|
-
/>
|
|
133
|
+
<BaseEdge id={id} path={edgePath} style={style} />
|
|
130
134
|
<circle
|
|
131
135
|
cx={sourceX}
|
|
132
136
|
cy={sourceY}
|
|
@@ -153,7 +157,9 @@ const ColoredEdge = ({
|
|
|
153
157
|
<EdgeLabelRenderer>
|
|
154
158
|
<div
|
|
155
159
|
className="td-graph-edge-label nodrag nopan"
|
|
156
|
-
style={{
|
|
160
|
+
style={{
|
|
161
|
+
transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,
|
|
162
|
+
}}
|
|
157
163
|
>
|
|
158
164
|
{data.label}
|
|
159
165
|
</div>
|
|
@@ -4,7 +4,10 @@ const MAX_TARGET_SLOT_SPAN = 22;
|
|
|
4
4
|
export const getTargetSlotOffset = (slotIndex = 0, slotCount = 1) => {
|
|
5
5
|
if (!slotCount || slotCount <= 1) return 0;
|
|
6
6
|
|
|
7
|
-
const totalSpan = Math.min(
|
|
7
|
+
const totalSpan = Math.min(
|
|
8
|
+
(slotCount - 1) * TARGET_SLOT_STEP,
|
|
9
|
+
MAX_TARGET_SLOT_SPAN,
|
|
10
|
+
);
|
|
8
11
|
const step = totalSpan / (slotCount - 1);
|
|
9
12
|
|
|
10
13
|
return -totalSpan / 2 + slotIndex * step;
|