@truedat/core 8.12.6 → 8.12.7

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 (55) hide show
  1. package/package.json +3 -3
  2. package/src/components/AddMemberForm.js +1 -1
  3. package/src/components/Markdown.js +2 -55
  4. package/src/components/MarkdownReader.js +59 -0
  5. package/src/components/UploadJob.js +1 -1
  6. package/src/components/__tests__/Alert.spec.js +2 -1
  7. package/src/components/__tests__/ArrayDecorator.spec.js +2 -2
  8. package/src/components/__tests__/AvailableFilters.spec.js +2 -1
  9. package/src/components/__tests__/CardGroupsAccordion.spec.js +5 -4
  10. package/src/components/__tests__/ColoredEdge.spec.js +1 -1
  11. package/src/components/__tests__/CommentsLoader.spec.js +2 -1
  12. package/src/components/__tests__/ConceptNode.spec.js +1 -1
  13. package/src/components/__tests__/DateFilter.spec.js +2 -1
  14. package/src/components/__tests__/DateTime.spec.js +2 -2
  15. package/src/components/__tests__/DomainSearchFilter.spec.js +1 -1
  16. package/src/components/__tests__/DomainSearchFilterItem.spec.js +1 -1
  17. package/src/components/__tests__/DropdownMenuItem.spec.js +5 -3
  18. package/src/components/__tests__/FilterDropdown.spec.js +1 -1
  19. package/src/components/__tests__/FilterItem.spec.js +2 -1
  20. package/src/components/__tests__/FilterMultilevelDropdown.spec.js +1 -1
  21. package/src/components/__tests__/FiltersLoader.spec.js +2 -1
  22. package/src/components/__tests__/Graph.spec.js +1 -1
  23. package/src/components/__tests__/GroupActions.spec.js +2 -2
  24. package/src/components/__tests__/Hierarchy.spec.js +1 -1
  25. package/src/components/__tests__/HierarchyFilterDropdown.spec.js +1 -1
  26. package/src/components/__tests__/HierarchySelector.spec.js +2 -1
  27. package/src/components/__tests__/LineageEdgeRendering.spec.js +39 -34
  28. package/src/components/__tests__/LineageGroupNode.spec.js +1 -1
  29. package/src/components/__tests__/Loading.spec.js +1 -1
  30. package/src/components/__tests__/Markdown.spec.js +1 -1
  31. package/src/components/__tests__/OptionGroup.spec.js +2 -1
  32. package/src/components/__tests__/OriginLabel.spec.js +15 -13
  33. package/src/components/__tests__/Pagination.spec.js +2 -1
  34. package/src/components/__tests__/SafeLink.spec.js +1 -1
  35. package/src/components/__tests__/SearchDateFilter.spec.js +1 -1
  36. package/src/components/__tests__/SearchFilterDropdown.spec.js +2 -1
  37. package/src/components/__tests__/SearchInput.spec.js +2 -1
  38. package/src/components/__tests__/StructureFilterItem.spec.js +2 -1
  39. package/src/components/__tests__/SystemsLoader.spec.js +2 -1
  40. package/src/components/__tests__/TemplatesLoader.spec.js +2 -1
  41. package/src/components/__tests__/TextPromptModal.spec.js +1 -1
  42. package/src/components/__tests__/TreeSelector.spec.js +2 -1
  43. package/src/components/graph/ColoredEdge.js +1 -1
  44. package/src/i18n/components/LangProvider.js +1 -1
  45. package/src/i18n/components/Languages.js +1 -1
  46. package/src/i18n/components/MessageForm.js +1 -1
  47. package/src/i18n/components/Messages.js +2 -2
  48. package/src/i18n/components/__tests__/EditableCell.spec.js +2 -1
  49. package/src/router/__tests__/ProtectedRoute.spec.js +2 -1
  50. package/src/router/__tests__/Unauthorized.spec.js +3 -4
  51. package/src/search/__tests__/FilterDropdown.spec.js +5 -2
  52. package/src/search/__tests__/FilterItem.spec.js +2 -1
  53. package/src/search/__tests__/FilterQueryDropdown.spec.js +2 -1
  54. package/src/search/__tests__/ModalSaveFilter.spec.js +3 -3
  55. package/src/search/__tests__/SearchContext.spec.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truedat/core",
3
- "version": "8.12.6",
3
+ "version": "8.12.7",
4
4
  "description": "Truedat Web Core",
5
5
  "sideEffects": [
6
6
  "**/*.css",
@@ -57,7 +57,7 @@
57
57
  "@testing-library/jest-dom": "^6.6.3",
58
58
  "@testing-library/react": "^16.3.0",
59
59
  "@testing-library/user-event": "^14.6.1",
60
- "@truedat/test": "8.12.6",
60
+ "@truedat/test": "8.12.7",
61
61
  "identity-obj-proxy": "^3.0.0",
62
62
  "jest": "^29.7.0",
63
63
  "redux-saga-test-plan": "^4.0.6"
@@ -99,5 +99,5 @@
99
99
  "swr": "^2.3.3",
100
100
  "turndown": "^7.2.2"
101
101
  },
102
- "gitHead": "fe7375c2d3c6ebdaf3dacd985f56433eda477712"
102
+ "gitHead": "dae06fd2f915163d5f1e7e3f26c414c8ee9bf055"
103
103
  }
@@ -9,7 +9,7 @@ import {
9
9
  accentInsensitivePathOrder,
10
10
  lowerDeburrTrim,
11
11
  } from "@truedat/core/services/sort";
12
- import { HistoryBackButton } from "@truedat/core/components";
12
+ import HistoryBackButton from "@truedat/core/components/HistoryBackButton";
13
13
  import { getRecipients } from "@truedat/core/selectors";
14
14
  import { useAclEntryCreate } from "@truedat/core/hooks/useAclEntries";
15
15
 
@@ -7,19 +7,11 @@ import Link from "@tiptap/extension-link";
7
7
  import Heading from "@tiptap/extension-heading";
8
8
  import { Menu, Icon } from "semantic-ui-react";
9
9
  import { FormattedMessage } from "react-intl";
10
- import { Marked } from "marked";
11
- import DOMPurify from "dompurify";
12
10
  import TurndownService from "turndown";
13
11
  import TextPromptModal from "./TextPromptModal";
12
+ import { markdownToHtml } from "./MarkdownReader";
14
13
 
15
- const markdownParser = new Marked();
16
- markdownParser.use({
17
- tokenizer: {
18
- code() {
19
- return undefined;
20
- },
21
- },
22
- });
14
+ export { MarkdownReader } from "./MarkdownReader";
23
15
 
24
16
  const turndownService = new TurndownService({ headingStyle: "atx" });
25
17
  turndownService.addRule("underline", {
@@ -88,34 +80,6 @@ const validateUrl = (value, allowEmpty = false) => {
88
80
  return { valid: true, value: urlWithProtocol };
89
81
  };
90
82
 
91
- function stripOuterCodeFence(text) {
92
- const match = text.match(/^\s*```(?:markdown)?\s*\n([\s\S]*?)\n\s*```\s*$/);
93
- return match ? match[1] : text;
94
- }
95
-
96
- function markdownToHtml(markdown) {
97
- if (!markdown || (typeof markdown === "string" && markdown.trim() === "")) {
98
- return "<p></p>";
99
- }
100
-
101
- const cleaned = stripOuterCodeFence(markdown);
102
-
103
- const withLinks = markdownParser
104
- .parse(cleaned, { async: false })
105
- .replace(
106
- /<a (?=[^>]*href=)/gi,
107
- `<a target="_blank" rel="noopener noreferrer" `,
108
- )
109
- .replace(
110
- /href="(?!https?:\/\/|mailto:)([^"]+)"/gi,
111
- (match, url) => `href="https://${url}"`,
112
- );
113
-
114
- const safeHtml = DOMPurify.sanitize(withLinks, { ADD_ATTR: ["target"] });
115
-
116
- return safeHtml;
117
- }
118
-
119
83
  function htmlToMarkdown(html) {
120
84
  if (!html || (typeof html === "string" && html.trim() === "")) {
121
85
  return "";
@@ -123,23 +87,6 @@ function htmlToMarkdown(html) {
123
87
  return turndownService.turndown(html);
124
88
  }
125
89
 
126
- export function MarkdownReader({ content = "" }) {
127
- const html = markdownToHtml(content);
128
- if (!content || (typeof content === "string" && content.trim() === "")) {
129
- return null;
130
- }
131
- return (
132
- <div
133
- className="markdown-reader"
134
- dangerouslySetInnerHTML={{ __html: html }}
135
- />
136
- );
137
- }
138
-
139
- MarkdownReader.propTypes = {
140
- content: PropTypes.string,
141
- };
142
-
143
90
  export function MarkdownEditor({
144
91
  value = "",
145
92
  onChange = null,
@@ -0,0 +1,59 @@
1
+ import PropTypes from "prop-types";
2
+ import { Marked } from "marked";
3
+ import DOMPurify from "dompurify";
4
+
5
+ const markdownParser = new Marked();
6
+ markdownParser.use({
7
+ tokenizer: {
8
+ code() {
9
+ return undefined;
10
+ },
11
+ },
12
+ });
13
+
14
+ function stripOuterCodeFence(text) {
15
+ const match = text.match(/^\s*```(?:markdown)?\s*\n([\s\S]*?)\n\s*```\s*$/);
16
+ return match ? match[1] : text;
17
+ }
18
+
19
+ function markdownToHtml(markdown) {
20
+ if (!markdown || (typeof markdown === "string" && markdown.trim() === "")) {
21
+ return "<p></p>";
22
+ }
23
+
24
+ const cleaned = stripOuterCodeFence(markdown);
25
+
26
+ const withLinks = markdownParser
27
+ .parse(cleaned, { async: false })
28
+ .replace(
29
+ /<a (?=[^>]*href=)/gi,
30
+ `<a target="_blank" rel="noopener noreferrer" `,
31
+ )
32
+ .replace(
33
+ /href="(?!https?:\/\/|mailto:)([^"]+)"/gi,
34
+ (match, url) => `href="https://${url}"`,
35
+ );
36
+
37
+ const safeHtml = DOMPurify.sanitize(withLinks, { ADD_ATTR: ["target"] });
38
+
39
+ return safeHtml;
40
+ }
41
+
42
+ export function MarkdownReader({ content = "" }) {
43
+ const html = markdownToHtml(content);
44
+ if (!content || (typeof content === "string" && content.trim() === "")) {
45
+ return null;
46
+ }
47
+ return (
48
+ <div
49
+ className="markdown-reader"
50
+ dangerouslySetInnerHTML={{ __html: html }}
51
+ />
52
+ );
53
+ }
54
+
55
+ MarkdownReader.propTypes = {
56
+ content: PropTypes.string,
57
+ };
58
+
59
+ export { markdownToHtml };
@@ -12,7 +12,7 @@ import {
12
12
  Label,
13
13
  Button,
14
14
  } from "semantic-ui-react";
15
- import { DateTime } from "@truedat/core/components";
15
+ import DateTime from "@truedat/core/components/DateTime";
16
16
  import { useUploadJob } from "../hooks/useUploadJobs";
17
17
  import { StatusPill, ResponseCell } from "./UploadJobParser";
18
18
  import UploadJobBreadcrumbs from "./UploadJobBreadcrumbs";
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { Alert } from "../Alert";
3
4
 
4
5
  describe("<Alert />", () => {
@@ -1,4 +1,4 @@
1
- import { render } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
2
  import { waitFor } from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import ArrayDecorator from "../ArrayDecorator";
@@ -36,7 +36,7 @@ describe("<ArrayDecorator />", () => {
36
36
 
37
37
  expect(queryAllByRole("listitem")).toEqual([]);
38
38
  expect(getByText(showableItems.join(concatenator))).toBeInTheDocument();
39
- userEvent.hover(await getByText("+2"));
39
+ await userEvent.hover(getByText("+2"));
40
40
  await waitFor(() => expect(getByRole("list")).toBeInTheDocument());
41
41
  const listItems = queryAllByRole("listitem");
42
42
  expect(listItems.length).toBe(2);
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import userEvent from "@testing-library/user-event";
3
4
  import { waitFor } from "@testing-library/react";
4
5
  import { AvailableFilters } from "../AvailableFilters";
@@ -1,8 +1,9 @@
1
1
  import { waitFor } from "@testing-library/react";
2
- import { render, waitForLoad } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
+ import { waitForLoad } from "@truedat/test/waitForLoad";
3
4
  import { Card } from "semantic-ui-react";
4
5
  import userEvent from "@testing-library/user-event";
5
- import { CardGroupsAccordion } from "..";
6
+ import CardGroupsAccordion from "@truedat/core/components/CardGroupsAccordion";
6
7
 
7
8
  const groups_all_cards_grouped = {
8
9
  foo: [
@@ -136,13 +137,13 @@ describe("<CardGroupsAccordion />", () => {
136
137
 
137
138
  const firstTitle = rendered.container.querySelector(".title");
138
139
 
139
- userEvent.click(firstTitle);
140
+ await userEvent.click(firstTitle);
140
141
 
141
142
  await waitFor(() => {
142
143
  expect(firstTitle.classList.contains("active")).toBeFalsy();
143
144
  });
144
145
 
145
- userEvent.click(firstTitle);
146
+ await userEvent.click(firstTitle);
146
147
 
147
148
  await waitFor(() => {
148
149
  expect(firstTitle.classList.contains("active")).toBeTruthy();
@@ -1,5 +1,5 @@
1
1
  import { fireEvent } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import ColoredEdge, {
4
4
  EdgeHoverContext,
5
5
  edgeAnimationDuration,
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { CommentsLoader } from "../CommentsLoader";
3
4
 
4
5
  describe("<CommentsLoader />", () => {
@@ -1,5 +1,5 @@
1
1
  import { fireEvent } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import ConceptNode from "../graph/ConceptNode";
4
4
  import { EdgeHoverContext } from "../graph/ColoredEdge";
5
5
 
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { DateFilter } from "../DateFilter";
3
4
 
4
5
  describe("<DateFilter/>", () => {
@@ -1,5 +1,5 @@
1
- import { render } from "@truedat/test/render";
2
- import { DateTime } from "..";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import DateTime from "@truedat/core/components/DateTime";
3
3
 
4
4
  describe("<DateTime />", () => {
5
5
  it("matches the latest snapshot", () => {
@@ -1,6 +1,6 @@
1
1
  import { fireEvent } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
4
  import { DomainSearchFilter } from "../DomainSearchFilter";
5
5
 
6
6
  jest.mock("../DomainSearchFilterItem", () => {
@@ -1,5 +1,5 @@
1
1
  import userEvent from "@testing-library/user-event";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import { DomainSearchFilterItem } from "../DomainSearchFilterItem";
4
4
 
5
5
  describe("<DomainSearchFilterItem />", () => {
@@ -1,6 +1,6 @@
1
1
  import { waitFor } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
4
  import { DropdownMenuItem } from "../DropdownMenuItem";
5
5
 
6
6
  describe("<DropdownMenuItem />", () => {
@@ -32,7 +32,9 @@ describe("<DropdownMenuItem />", () => {
32
32
  messages: {},
33
33
  });
34
34
 
35
- userEvent.click(container.querySelector('[class="chevron right icon"]'));
35
+ await userEvent.click(
36
+ container.querySelector('[class="chevron right icon"]'),
37
+ );
36
38
  await waitFor(() => {
37
39
  expect(onOpen).toHaveBeenCalledWith(id);
38
40
  });
@@ -53,7 +55,7 @@ describe("<DropdownMenuItem />", () => {
53
55
  },
54
56
  );
55
57
 
56
- userEvent.click(getByRole("option"));
58
+ await userEvent.click(getByRole("option"));
57
59
 
58
60
  await waitFor(() => {
59
61
  expect(onClick.mock.calls[0][1]).toBe(id);
@@ -1,5 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import { waitFor, within } from "@testing-library/react";
4
4
  import userEvent from "@testing-library/user-event";
5
5
 
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { FilterItem } from "../FilterItem";
3
4
 
4
5
  describe("<FilterItem/>", () => {
@@ -1,6 +1,6 @@
1
1
  import { waitFor } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
4
  import { FilterMultilevelDropdown } from "../FilterMultilevelDropdown";
5
5
 
6
6
  describe("<FilterMultilevelDropdown />", () => {
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { FiltersLoader } from "../FiltersLoader";
3
4
 
4
5
  describe("<FiltersLoader/>", () => {
@@ -1,5 +1,5 @@
1
1
  import { act, fireEvent, screen, waitFor } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import { Graph, getMinZoomForDiagram } from "../Graph";
4
4
 
5
5
  const mockGetNodesBounds = jest.fn();
@@ -1,6 +1,6 @@
1
1
  import { fireEvent } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
3
- import { GroupActions } from "..";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
+ import GroupActions from "@truedat/core/components/GroupActions";
4
4
 
5
5
  const actions = [
6
6
  { key: 1, icon: "edit", text: "First Item", value: 1 },
@@ -1,4 +1,4 @@
1
- import { render } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
2
  import Hierarchy from "../Hierarchy";
3
3
  import en from "../../../../df/src/messages/en";
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { waitFor } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
4
  import HierarchyFilterDropdown from "../HierarchyFilterDropdown";
5
5
 
6
6
  const hierarchy = {
@@ -1,6 +1,7 @@
1
1
  import userEvent from "@testing-library/user-event";
2
2
  import { waitFor } from "@testing-library/react";
3
- import { render, waitForLoad } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
+ import { waitForLoad } from "@truedat/test/waitForLoad";
4
5
  import HierarchySelector from "../HierarchySelector";
5
6
 
6
7
  const hierarchy = {
@@ -1,7 +1,7 @@
1
1
  import { fireEvent } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import ColoredEdge from "@truedat/core/components/graph/ColoredEdge";
4
- import { redesignedLineageEdges } from "@truedat/dd/components/LineageGraph";
4
+ import { redesignedLineageEdges } from "@truedat/dd/utils/lineageGraph";
5
5
 
6
6
  jest.mock("@xyflow/react", () => ({
7
7
  BaseEdge: ({ className, id, path, style }) => (
@@ -11,35 +11,40 @@ jest.mock("@xyflow/react", () => ({
11
11
  getBezierPath: () => ["M 0,0 L 400,0", 200, 0],
12
12
  }));
13
13
 
14
- it("lets the rendered edge respond to hover after lineage style normalization", () => {
15
- const [edge] = redesignedLineageEdges([
16
- {
17
- id: "edge",
18
- source: "a",
19
- target: "b",
20
- style: { stroke: "#b0b8c8", strokeWidth: 2, strokeOpacity: 0.95 },
21
- data: {},
22
- },
23
- ]);
24
- const { container } = render(
25
- <svg>
26
- <ColoredEdge
27
- {...edge}
28
- sourceX={0}
29
- sourceY={0}
30
- targetX={400}
31
- targetY={0}
32
- sourcePosition="right"
33
- targetPosition="left"
34
- />
35
- </svg>,
36
- );
37
- const path = container.querySelector(".td-graph-edge");
38
- expect(path.style.strokeWidth).toBe("");
39
- expect(path.style.strokeOpacity).toBe("");
40
- expect(path.style.stroke).toContain("var(--td-graph-edge-stroke");
41
- fireEvent.mouseEnter(container.querySelector(".td-graph-edge-hit-area"));
42
- expect(path).toHaveClass("td-graph-edge--hovered");
43
- fireEvent.mouseLeave(container.querySelector(".td-graph-edge-hit-area"));
44
- expect(path).not.toHaveClass("td-graph-edge--hovered");
45
- });
14
+ it.each([false, true])(
15
+ "lets the rendered edge respond to hover with focusDimmed=%s",
16
+ (focusDimmed) => {
17
+ const [edge] = redesignedLineageEdges([
18
+ {
19
+ id: "edge",
20
+ source: "a",
21
+ target: "b",
22
+ style: { stroke: "#b0b8c8", strokeWidth: 2, strokeOpacity: 0.95 },
23
+ data: { focusDimmed },
24
+ },
25
+ ]);
26
+ const { container } = render(
27
+ <svg>
28
+ <ColoredEdge
29
+ {...edge}
30
+ sourceX={0}
31
+ sourceY={0}
32
+ targetX={400}
33
+ targetY={0}
34
+ sourcePosition="right"
35
+ targetPosition="left"
36
+ />
37
+ </svg>,
38
+ );
39
+ const path = container.querySelector(".td-graph-edge");
40
+ expect(path.style.strokeWidth).toBe("");
41
+ expect(path.style.strokeOpacity).toBe("");
42
+ expect(path.style.stroke).toContain("var(--td-graph-edge-stroke");
43
+ fireEvent.mouseEnter(container.querySelector(".td-graph-edge-hit-area"));
44
+ expect(path).toHaveClass("td-graph-edge--hovered");
45
+ expect(path.style.stroke).toContain("var(--td-graph-edge-active");
46
+ fireEvent.mouseLeave(container.querySelector(".td-graph-edge-hit-area"));
47
+ expect(path).not.toHaveClass("td-graph-edge--hovered");
48
+ expect(path.style.stroke).toContain("var(--td-graph-edge-stroke");
49
+ },
50
+ );
@@ -1,5 +1,5 @@
1
1
  import { act, fireEvent, screen } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import LineageGroupNode from "../graph/LineageGroupNode";
4
4
  import { EdgeHoverContext } from "../graph/ColoredEdge";
5
5
  import { lineageNodeIcon } from "../graph/lineageNodeIcon";
@@ -1,4 +1,4 @@
1
- import { render } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
2
  import { Loading } from "../Loading";
3
3
 
4
4
  describe("<Loading />", () => {
@@ -1,5 +1,5 @@
1
1
  import { act, fireEvent, waitFor } from "@testing-library/react";
2
- import { render } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
3
  import {
4
4
  MarkdownReader,
5
5
  MarkdownEditor,
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { OptionGroup } from "../OptionGroup";
3
4
 
4
5
  describe("<OptionGroup />", () => {
@@ -1,4 +1,4 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl } from "@truedat/test/renderWithIntl";
2
2
  import OriginLabel, { OriginIcon } from "../OriginLabel";
3
3
 
4
4
  const labelRenderOpts = {
@@ -21,29 +21,31 @@ const iconRenderOpts = {
21
21
  };
22
22
 
23
23
  describe("<OriginLabel />", () => {
24
- it("matches the latest snapshot without origin", async () => {
25
- const rendered = render(<OriginLabel />, labelRenderOpts);
26
- await waitForLoad(rendered);
24
+ it("matches the latest snapshot without origin", () => {
25
+ const rendered = renderWithIntl(<OriginLabel />, labelRenderOpts);
27
26
  expect(rendered.container).toMatchSnapshot();
28
27
  });
29
28
 
30
- it("matches the latest snapshot with origin", async () => {
31
- const rendered = render(<OriginLabel origin="test" />, labelRenderOpts);
32
- await waitForLoad(rendered);
29
+ it("matches the latest snapshot with origin", () => {
30
+ const rendered = renderWithIntl(
31
+ <OriginLabel origin="test" />,
32
+ labelRenderOpts,
33
+ );
33
34
  expect(rendered.container).toMatchSnapshot();
34
35
  });
35
36
  });
36
37
 
37
38
  describe("<OriginIcon />", () => {
38
- it("matches the latest snapshot without origin", async () => {
39
- const rendered = render(<OriginIcon />, iconRenderOpts);
40
- await waitForLoad(rendered);
39
+ it("matches the latest snapshot without origin", () => {
40
+ const rendered = renderWithIntl(<OriginIcon />, iconRenderOpts);
41
41
  expect(rendered.container).toMatchSnapshot();
42
42
  });
43
43
 
44
- it("matches the latest snapshot with origin", async () => {
45
- const rendered = render(<OriginIcon origin="test" />, iconRenderOpts);
46
- await waitForLoad(rendered);
44
+ it("matches the latest snapshot with origin", () => {
45
+ const rendered = renderWithIntl(
46
+ <OriginIcon origin="test" />,
47
+ iconRenderOpts,
48
+ );
47
49
  expect(rendered.container).toMatchSnapshot();
48
50
  });
49
51
  });
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { Pagination, MAX_PAGES } from "../Pagination";
3
4
 
4
5
  describe("<Pagination />", () => {
@@ -1,4 +1,4 @@
1
- import { render } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
2
  import SafeLink from "../SafeLink";
3
3
 
4
4
  describe("<SafeLink />", () => {
@@ -1,4 +1,4 @@
1
- import { render } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
2
  import SearchDateFilter from "@truedat/core/search/SearchDateFilter";
3
3
  import SearchContextWrapper from "@truedat/core/components/common/SearchContextWrapper";
4
4
 
@@ -2,7 +2,8 @@
2
2
  import { Icon, Dropdown, Segment } from "semantic-ui-react";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import { within, waitFor } from "@testing-library/react";
5
- import { render, waitForLoad } from "@truedat/test/render";
5
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
6
+ import { waitForLoad } from "@truedat/test/waitForLoad";
6
7
 
7
8
  import SearchFilterDropdown from "../SearchFilterDropdown";
8
9
 
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { SearchInput } from "../SearchInput";
3
4
 
4
5
  describe("<SearchInput />", () => {
@@ -1,5 +1,6 @@
1
1
  import userEvent from "@testing-library/user-event";
2
- import { render, waitForLoad } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
+ import { waitForLoad } from "@truedat/test/waitForLoad";
3
4
  import { StructureFilterItem } from "../StructureFilterItem";
4
5
 
5
6
  const user = userEvent.setup({ delay: null });
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { SystemsLoader } from "../SystemsLoader";
3
4
 
4
5
  describe("<SystemsLoader />", () => {
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { TemplatesLoader } from "@truedat/core/components/TemplatesLoader";
3
4
 
4
5
  describe("<TemplatesLoader />", () => {
@@ -1,7 +1,7 @@
1
1
  import { screen, fireEvent } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
3
  import messages from "@truedat/core/messages";
4
- import { render } from "@truedat/test/render";
4
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
5
5
  import TextPromptModal from "../TextPromptModal";
6
6
 
7
7
  const renderWithIntl = (component) => {
@@ -1,6 +1,7 @@
1
1
  import userEvent from "@testing-library/user-event";
2
2
  import { waitFor } from "@testing-library/react";
3
- import { render, waitForLoad } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
+ import { waitForLoad } from "@truedat/test/waitForLoad";
4
5
  import TreeSelector from "../TreeSelector";
5
6
 
6
7
  const baz = { id: "3", level: 2, name: "baz", children: [] };
@@ -397,7 +397,7 @@ export const getEdgeSlotOffsets = (data = {}) => ({
397
397
  export const getLineageEdgeVisualState = (data = {}, hovered = false) => {
398
398
  const aggregatedCount = Number(data.aggregatedCount);
399
399
  const aggregated = Number.isFinite(aggregatedCount) && aggregatedCount > 1;
400
- const dimmed = Boolean(data.focusDimmed);
400
+ const dimmed = Boolean(data.focusDimmed) && !hovered;
401
401
 
402
402
  return {
403
403
  aggregated,
@@ -2,7 +2,7 @@ import _ from "lodash/fp";
2
2
  import { use, createContext, useEffect, useState } from "react";
3
3
  import { IntlProvider } from "react-intl";
4
4
  import PropTypes from "prop-types";
5
- import { Loading } from "@truedat/core/components";
5
+ import Loading from "@truedat/core/components/Loading";
6
6
  import { useLocales } from "../../hooks/useLocales";
7
7
  import { getNavigatorLanguage } from "../../services/i18n";
8
8
 
@@ -17,7 +17,7 @@ import {
17
17
  TableHeader,
18
18
  TableRow,
19
19
  } from "semantic-ui-react";
20
- import { ConfirmModal } from "@truedat/core/components";
20
+ import ConfirmModal from "@truedat/core/components/ConfirmModal";
21
21
  import { useLocalesUpdate } from "../../hooks/useLocales";
22
22
  import { useLanguage } from "./LangProvider";
23
23
 
@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
3
3
  import { useForm, Controller } from "react-hook-form";
4
4
  import { useIntl } from "react-intl";
5
5
  import { Button, Form, Segment, Header, Loader } from "semantic-ui-react";
6
- import { HistoryBackButton } from "@truedat/core/components";
6
+ import HistoryBackButton from "@truedat/core/components/HistoryBackButton";
7
7
  import { useLanguage } from "./LangProvider";
8
8
 
9
9
  export const LangForm = ({
@@ -11,10 +11,10 @@ import {
11
11
  Segment,
12
12
  Menu,
13
13
  } from "semantic-ui-react";
14
- import { SearchInput } from "@truedat/core/components";
14
+ import SearchInput from "@truedat/core/components/SearchInput";
15
15
  import { lowerDeburrTrim } from "@truedat/core/services/sort";
16
16
  import { I18N_MESSAGES, I18N_MESSAGES_NEW } from "@truedat/core/routes";
17
- import { Pagination } from "@truedat/core/components";
17
+ import Pagination from "@truedat/core/components/Pagination";
18
18
  import { useLanguage } from "./LangProvider";
19
19
  import MessagesTable from "./MessagesTable";
20
20
  import Languages from "./Languages";
@@ -1,5 +1,6 @@
1
1
  import userEvent from "@testing-library/user-event";
2
- import { render, waitForLoad } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
+ import { waitForLoad } from "@truedat/test/waitForLoad";
3
4
  import messages from "@truedat/core/messages";
4
5
  import EditableCell from "../EditableCell";
5
6
 
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import { useAuthorized } from "@truedat/core/hooks/useAuthorized";
3
4
  import ProtectedRoute from "../ProtectedRoute";
4
5
 
@@ -1,10 +1,9 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl } from "@truedat/test/renderWithIntl";
2
2
  import Unauthorized from "../Unauthorized";
3
3
 
4
4
  describe("Unauthorized", () => {
5
- it("renders unauthorized message", async () => {
6
- const rendered = render(<Unauthorized />);
7
- await waitForLoad(rendered);
5
+ it("renders unauthorized message", () => {
6
+ const rendered = renderWithIntl(<Unauthorized />);
8
7
 
9
8
  expect(rendered.getByText(/view.unauthorized.head/i)).toBeInTheDocument();
10
9
  expect(
@@ -1,5 +1,6 @@
1
1
  import _ from "lodash/fp";
2
- import { render, waitForLoad } from "@truedat/test/render";
2
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
3
+ import { waitForLoad } from "@truedat/test/waitForLoad";
3
4
  import { waitFor } from "@testing-library/react";
4
5
  import userEvent from "@testing-library/user-event";
5
6
  import SearchContext from "@truedat/core/search/SearchContext";
@@ -94,7 +95,9 @@ describe("<FilterDropdown/>", () => {
94
95
  </SearchContext>,
95
96
  );
96
97
  await waitForLoad(rendered);
97
- userEvent.click(rendered.container.querySelector('[class="delete icon"]'));
98
+ await userEvent.click(
99
+ rendered.container.querySelector('[class="delete icon"]'),
100
+ );
98
101
  await waitFor(() => {
99
102
  expect(searchProps.removeFilter).toBeCalledTimes(1);
100
103
  });
@@ -1,4 +1,5 @@
1
- import { render, waitForLoad } from "@truedat/test/render";
1
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
2
+ import { waitForLoad } from "@truedat/test/waitForLoad";
2
3
  import userEvent from "@testing-library/user-event";
3
4
  import { FilterItem } from "../FilterItem";
4
5
 
@@ -1,7 +1,8 @@
1
1
  import _ from "lodash/fp";
2
2
  import { waitFor, within } from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
- import { render, waitForLoad } from "@truedat/test/render";
4
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
5
+ import { waitForLoad } from "@truedat/test/waitForLoad";
5
6
  import SearchContext from "@truedat/core/search/SearchContext";
6
7
  import FilterQueryDropdown from "../FilterQueryDropdown";
7
8
 
@@ -2,13 +2,13 @@ import userEvent from "@testing-library/user-event";
2
2
  import { render, waitForLoad } from "@truedat/test/render";
3
3
  import messages from "@truedat/core/messages";
4
4
  import SearchContext from "@truedat/core/search/SearchContext";
5
+ import { mutateUserFilters } from "../../hooks/useUserFilters";
5
6
  import ModalSaveFilter from "../ModalSaveFilter";
6
7
 
7
- const mockMutateUserFilters = jest.fn();
8
8
  const mockTrigger = jest.fn();
9
9
 
10
10
  jest.mock("../../hooks/useUserFilters", () => ({
11
- mutateUserFilters: mockMutateUserFilters,
11
+ mutateUserFilters: jest.fn(),
12
12
  useUserFilters: jest.fn(),
13
13
  useUserFiltersCreate: () => ({ trigger: mockTrigger }),
14
14
  useUserFiltersDelete: jest.fn(),
@@ -35,7 +35,7 @@ describe("<ModalSaveFilter /> admin", () => {
35
35
  };
36
36
 
37
37
  beforeEach(() => {
38
- mockMutateUserFilters.mockClear();
38
+ mutateUserFilters.mockClear();
39
39
  mockTrigger.mockReset();
40
40
  });
41
41
 
@@ -1,6 +1,6 @@
1
1
  import { act, waitFor } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
3
+ import { renderWithIntl as render } from "@truedat/test/renderWithIntl";
4
4
  import {
5
5
  SearchContextProvider,
6
6
  useSearchContext,