@truedat/core 7.5.9 → 7.5.10

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 (277) hide show
  1. package/package.json +34 -68
  2. package/src/__tests__/routesTree.spec.js +108 -0
  3. package/src/api/queries.js +10 -0
  4. package/src/api.js +3 -0
  5. package/src/components/AddMemberForm.js +10 -10
  6. package/src/components/AddResourceMember.js +0 -2
  7. package/src/components/AdminMenu.js +0 -1
  8. package/src/components/AiMenu.js +0 -1
  9. package/src/components/Alert.js +1 -1
  10. package/src/components/AlertExporter.js +0 -1
  11. package/src/components/ArrayDecorator.js +0 -1
  12. package/src/components/Authorized.js +2 -2
  13. package/src/components/AvailableFilters.js +1 -2
  14. package/src/components/CSVFileModal.js +1 -1
  15. package/src/components/CardGroupsAccordion.js +1 -1
  16. package/src/components/CatalogMenu.js +1 -2
  17. package/src/components/CommentRow.js +7 -8
  18. package/src/components/Comments.js +3 -4
  19. package/src/components/CommentsForm.js +2 -2
  20. package/src/components/ConfirmModal.js +0 -1
  21. package/src/components/CursorPagination.js +1 -2
  22. package/src/components/DashboardMenu.js +0 -1
  23. package/src/components/Date.js +0 -1
  24. package/src/components/DateFilter.js +1 -1
  25. package/src/components/DateRangeFilter.js +1 -1
  26. package/src/components/DateTime.js +0 -1
  27. package/src/components/DescriptionInput.js +1 -1
  28. package/src/components/DomainSelector.js +2 -3
  29. package/src/components/DropdownMenuItem.js +0 -1
  30. package/src/components/ErrorBoundary.js +8 -7
  31. package/src/components/FieldLabel.js +0 -1
  32. package/src/components/FilterDropdown.js +3 -3
  33. package/src/components/FilterItem.js +0 -1
  34. package/src/components/FilterMultilevelDropdown.js +1 -1
  35. package/src/components/GenericCrumbs.js +3 -4
  36. package/src/components/GlossaryMenu.js +24 -31
  37. package/src/components/GrantMenu.js +0 -1
  38. package/src/components/GroupActions.js +15 -15
  39. package/src/components/Hierarchy.js +7 -10
  40. package/src/components/HierarchyFilterDropdown.js +1 -2
  41. package/src/components/HierarchyNodeFinder.js +4 -4
  42. package/src/components/HierarchySelector.js +1 -2
  43. package/src/components/HistoryBackButton.js +6 -6
  44. package/src/components/IngestMenu.js +0 -1
  45. package/src/components/LanguagesTabs.js +4 -4
  46. package/src/components/LineageMenu.js +0 -1
  47. package/src/components/Loading.js +1 -2
  48. package/src/components/MembersMenu.js +0 -1
  49. package/src/components/ModalSaveFilter.js +1 -1
  50. package/src/components/NodeOpenActions.js +0 -1
  51. package/src/components/OptionGroup.js +1 -2
  52. package/src/components/OptionModal.js +0 -1
  53. package/src/components/Pagination.js +0 -1
  54. package/src/components/QualityMenu.js +0 -1
  55. package/src/components/QxMenu.js +0 -1
  56. package/src/components/Redirector.js +3 -3
  57. package/src/components/ResourceMember.js +1 -2
  58. package/src/components/ResourceMembers.js +3 -3
  59. package/src/components/ResourceMembersActions.js +1 -2
  60. package/src/components/RichTextEditor.js +7 -8
  61. package/src/components/RouteListener.js +11 -32
  62. package/src/components/SafeLink.js +0 -1
  63. package/src/components/ScrollToTop.js +13 -16
  64. package/src/components/SearchFilterDropdown.js +1 -1
  65. package/src/components/SearchInput.js +3 -3
  66. package/src/components/SearchMenu.js +0 -1
  67. package/src/components/SelectedFilters.js +1 -2
  68. package/src/components/SideMenu.js +0 -1
  69. package/src/components/SidebarToggle.js +2 -2
  70. package/src/components/StructureFilterItem.js +0 -1
  71. package/src/components/Submenu.js +8 -7
  72. package/src/components/SystemsLoader.js +27 -0
  73. package/src/components/TaxonomyMenu.js +0 -1
  74. package/src/components/TemplateSelector.js +1 -1
  75. package/src/components/TemplatesLoader.js +24 -0
  76. package/src/components/TreeSelector.js +4 -4
  77. package/src/components/Unauthorized.js +0 -1
  78. package/src/components/UploadModal.js +152 -176
  79. package/src/components/UserFilter.js +0 -2
  80. package/src/components/UserFilters.js +0 -2
  81. package/src/components/__tests__/AddMemberForm.spec.js +26 -38
  82. package/src/components/__tests__/AddResourceMember.spec.js +0 -1
  83. package/src/components/__tests__/AdminMenu.spec.js +0 -1
  84. package/src/components/__tests__/Alert.spec.js +17 -21
  85. package/src/components/__tests__/AvailableFilters.spec.js +19 -14
  86. package/src/components/__tests__/CardGroupsAccordion.spec.js +24 -15
  87. package/src/components/__tests__/CatalogMenu.spec.js +27 -45
  88. package/src/components/__tests__/CommentsLoader.spec.js +17 -14
  89. package/src/components/__tests__/CursorPagination.spec.js +0 -1
  90. package/src/components/__tests__/DashboardMenu.spec.js +0 -1
  91. package/src/components/__tests__/DateFilter.spec.js +6 -28
  92. package/src/components/__tests__/DateTime.spec.js +0 -1
  93. package/src/components/__tests__/DomainSelector.spec.js +4 -4
  94. package/src/components/__tests__/DropdownMenuItem.spec.js +0 -1
  95. package/src/components/__tests__/FilterDropdown.spec.js +28 -27
  96. package/src/components/__tests__/FilterItem.spec.js +19 -20
  97. package/src/components/__tests__/FilterMultilevelDropdown.spec.js +16 -16
  98. package/src/components/__tests__/FiltersLoader.spec.js +25 -20
  99. package/src/components/__tests__/GenericCrumbs.spec.js +0 -1
  100. package/src/components/__tests__/GlossaryMenu.spec.js +0 -1
  101. package/src/components/__tests__/GrantMenu.spec.js +0 -1
  102. package/src/components/__tests__/GroupActions.spec.js +0 -1
  103. package/src/components/__tests__/Hierarchy.spec.js +0 -1
  104. package/src/components/__tests__/HierarchyFilterDropdown.spec.js +16 -14
  105. package/src/components/__tests__/HierarchyNodeFinder.spec.js +0 -1
  106. package/src/components/__tests__/HierarchySelector.spec.js +28 -35
  107. package/src/components/__tests__/HistoryBackButton.spec.js +23 -23
  108. package/src/components/__tests__/IngestMenu.spec.js +0 -1
  109. package/src/components/__tests__/LineageMenu.spec.js +0 -1
  110. package/src/components/__tests__/Loading.spec.js +4 -5
  111. package/src/components/__tests__/MembersMenu.spec.js +0 -1
  112. package/src/components/__tests__/ModalSaveFilter.spec.js +0 -1
  113. package/src/components/__tests__/OptionGroup.spec.js +5 -7
  114. package/src/components/__tests__/Pagination.spec.js +22 -16
  115. package/src/components/__tests__/QualityMenu.spec.js +0 -1
  116. package/src/components/__tests__/Redirector.spec.js +5 -10
  117. package/src/components/__tests__/ResourceMembers.spec.js +36 -27
  118. package/src/components/__tests__/ResourceMembersAction.spec.js +1 -2
  119. package/src/components/__tests__/RouteListener.spec.js +25 -26
  120. package/src/components/__tests__/SafeLink.spec.js +0 -1
  121. package/src/components/__tests__/SearchDateFilter.spec.js +0 -1
  122. package/src/components/__tests__/SearchFilterDropdown.spec.js +32 -24
  123. package/src/components/__tests__/SearchInput.spec.js +5 -5
  124. package/src/components/__tests__/SearchMenu.spec.js +0 -1
  125. package/src/components/__tests__/SelectedFilters.spec.js +50 -47
  126. package/src/components/__tests__/SideMenu.spec.js +5 -8
  127. package/src/components/__tests__/StructureFilterItem.spec.js +13 -11
  128. package/src/components/__tests__/Submenu.spec.js +0 -1
  129. package/src/components/__tests__/SystemsLoader.spec.js +40 -0
  130. package/src/components/__tests__/TaxonomyMenu.spec.js +0 -1
  131. package/src/components/__tests__/TemplateSelector.spec.js +27 -29
  132. package/src/components/__tests__/TemplatesLoader.spec.js +30 -0
  133. package/src/components/__tests__/TreeSelector.spec.js +110 -83
  134. package/src/components/__tests__/UploadModal.spec.js +171 -0
  135. package/src/components/__tests__/UserFilters.spec.js +44 -37
  136. package/src/components/__tests__/__snapshots__/AddMemberForm.spec.js.snap +1 -0
  137. package/src/components/__tests__/__snapshots__/AddResourceMember.spec.js.snap +10 -9
  138. package/src/components/__tests__/__snapshots__/AdminMenu.spec.js.snap +22 -11
  139. package/src/components/__tests__/__snapshots__/Alert.spec.js.snap +29 -17
  140. package/src/components/__tests__/__snapshots__/AvailableFilters.spec.js.snap +1 -1
  141. package/src/components/__tests__/__snapshots__/CatalogMenu.spec.js.snap +18 -8
  142. package/src/components/__tests__/__snapshots__/CursorPagination.spec.js.snap +3 -0
  143. package/src/components/__tests__/__snapshots__/DateFilter.spec.js.snap +165 -107
  144. package/src/components/__tests__/__snapshots__/DomainSelector.spec.js.snap +1 -1
  145. package/src/components/__tests__/__snapshots__/FilterItem.spec.js.snap +13 -20
  146. package/src/components/__tests__/__snapshots__/GlossaryMenu.spec.js.snap +8 -0
  147. package/src/components/__tests__/__snapshots__/GrantMenu.spec.js.snap +14 -7
  148. package/src/components/__tests__/__snapshots__/GroupActions.spec.js.snap +0 -1
  149. package/src/components/__tests__/__snapshots__/Hierarchy.spec.js.snap +0 -1
  150. package/src/components/__tests__/__snapshots__/HierarchySelector.spec.js.snap +1 -1
  151. package/src/components/__tests__/__snapshots__/HistoryBackButton.spec.js.snap +10 -20
  152. package/src/components/__tests__/__snapshots__/IngestMenu.spec.js.snap +3 -1
  153. package/src/components/__tests__/__snapshots__/LineageMenu.spec.js.snap +6 -3
  154. package/src/components/__tests__/__snapshots__/Loading.spec.js.snap +5 -4
  155. package/src/components/__tests__/__snapshots__/MembersMenu.spec.js.snap +6 -3
  156. package/src/components/__tests__/__snapshots__/OptionGroup.spec.js.snap +38 -28
  157. package/src/components/__tests__/__snapshots__/Pagination.spec.js.snap +213 -64
  158. package/src/components/__tests__/__snapshots__/QualityMenu.spec.js.snap +14 -8
  159. package/src/components/__tests__/__snapshots__/ResourceMembers.spec.js.snap +1 -0
  160. package/src/components/__tests__/__snapshots__/ResourceMembersAction.spec.js.snap +2 -1
  161. package/src/components/__tests__/__snapshots__/RouteListener.spec.js.snap +1 -1
  162. package/src/components/__tests__/__snapshots__/SearchInput.spec.js.snap +10 -12
  163. package/src/components/__tests__/__snapshots__/SearchMenu.spec.js.snap +3 -1
  164. package/src/components/__tests__/__snapshots__/SelectedFilters.spec.js.snap +8 -8
  165. package/src/components/__tests__/__snapshots__/SideMenu.spec.js.snap +112 -50
  166. package/src/components/__tests__/__snapshots__/Submenu.spec.js.snap +3 -0
  167. package/src/components/__tests__/__snapshots__/SystemsLoader.spec.js.snap +3 -0
  168. package/src/components/__tests__/__snapshots__/TaxonomyMenu.spec.js.snap +3 -1
  169. package/src/components/__tests__/__snapshots__/TemplateSelector.spec.js.snap +7 -7
  170. package/src/components/common/SearchContextWrapper.js +1 -4
  171. package/src/hooks/__mocks__/useAuthorized.js +2 -0
  172. package/src/hooks/__mocks__/useUserFilters.js +17 -0
  173. package/src/hooks/__tests__/{useAclEntries.spec.js → useAclEntries.spec.js.disabled} +1 -1
  174. package/src/hooks/__tests__/useAuthorized.spec.js +1 -1
  175. package/src/hooks/useAclEntries.js +6 -3
  176. package/src/hooks/useActiveRoute.js +3 -3
  177. package/src/hooks/useActiveRoutes.js +4 -4
  178. package/src/hooks/useHierarchies.js +112 -0
  179. package/src/hooks/useLocales.js +1 -1
  180. package/src/hooks/useMessages.js +1 -1
  181. package/src/hooks/usePath.js +4 -4
  182. package/src/hooks/useUserFilters.js +1 -1
  183. package/src/i18n/components/EditableCell.js +1 -1
  184. package/src/i18n/components/I18nRoutes.js +11 -16
  185. package/src/i18n/components/LangProvider.js +56 -101
  186. package/src/i18n/components/LangProviderWrapper.js +26 -33
  187. package/src/i18n/components/Languages.js +8 -7
  188. package/src/i18n/components/MessageForm.js +9 -23
  189. package/src/i18n/components/Messages.js +5 -4
  190. package/src/i18n/components/MessagesTable.js +0 -1
  191. package/src/i18n/components/NewMessage.js +5 -4
  192. package/src/i18n/components/__tests__/EditableCell.spec.js +18 -20
  193. package/src/i18n/components/__tests__/I18nRoutes.spec.js +39 -5
  194. package/src/i18n/components/__tests__/MessageForm.spec.js +0 -1
  195. package/src/i18n/components/__tests__/Messages.spec.js +9 -21
  196. package/src/i18n/components/__tests__/NewMessage.spec.js +0 -1
  197. package/src/i18n/components/__tests__/__snapshots__/I18nRoutes.spec.js.snap +25 -1
  198. package/src/i18n/components/__tests__/__snapshots__/MessageForm.spec.js.snap +1 -0
  199. package/src/i18n/components/__tests__/__snapshots__/Messages.spec.js.snap +5 -13
  200. package/src/i18n/components/__tests__/__snapshots__/NewMessage.spec.js.snap +2 -0
  201. package/src/reducers/__tests__/comments.spec.js +9 -6
  202. package/src/reducers/__tests__/commentsResource.spec.js +5 -2
  203. package/src/reducers/__tests__/coreMessage.spec.js +1 -1
  204. package/src/reducers/__tests__/dashboardDomains.spec.js +5 -5
  205. package/src/reducers/__tests__/systems.spec.js +42 -0
  206. package/src/reducers/__tests__/systemsLoading.spec.js +22 -0
  207. package/src/reducers/index.js +5 -1
  208. package/src/reducers/systems.js +19 -0
  209. package/src/reducers/systemsLoading.js +14 -0
  210. package/src/router/Loader.js +10 -0
  211. package/src/router/ProtectedRoute.js +11 -0
  212. package/src/router/Unauthorized.js +16 -0
  213. package/src/router/__tests__/ProtectedRoute.spec.js +49 -0
  214. package/src/router/__tests__/Unauthorized.spec.js +15 -0
  215. package/src/router/__tests__/__snapshots__/ProtectedRoute.spec.js.snap +44 -0
  216. package/src/router/__tests__/__snapshots__/Unauthorized.spec.js.snap +26 -0
  217. package/src/router/index.js +5 -0
  218. package/src/routes.js +7 -7
  219. package/src/routesTree.js +93 -0
  220. package/src/routines.js +8 -0
  221. package/src/sagas/__tests__/addComment.spec.js +3 -5
  222. package/src/sagas/__tests__/fetchComments.spec.js +1 -1
  223. package/src/sagas/__tests__/fetchSystems.spec.js +69 -0
  224. package/src/sagas/fetchSystems.js +25 -0
  225. package/src/sagas/index.js +3 -0
  226. package/src/search/FilterDropdown.js +0 -1
  227. package/src/search/FilterItem.js +0 -1
  228. package/src/search/FilterMultilevelDropdown.js +1 -1
  229. package/src/search/FilterQueryDropdown.js +38 -42
  230. package/src/search/HierarchyFilterDropdown.js +3 -4
  231. package/src/search/ModalSaveFilter.js +1 -1
  232. package/src/search/Pagination.js +0 -1
  233. package/src/search/SearchContext.js +9 -11
  234. package/src/search/SearchDateFilter.js +0 -1
  235. package/src/search/SearchFilters.js +1 -2
  236. package/src/search/SearchSelectedFilters.js +4 -4
  237. package/src/search/SearchWidget.js +0 -4
  238. package/src/search/UserFilter.js +0 -2
  239. package/src/search/UserFilters.js +4 -3
  240. package/src/search/__tests__/FilterDropdown.spec.js +54 -51
  241. package/src/search/__tests__/FilterItem.spec.js +20 -15
  242. package/src/search/__tests__/FilterQueryDropdown.spec.js +106 -84
  243. package/src/search/__tests__/ModalSaveFilter.spec.js +4 -5
  244. package/src/search/__tests__/SearchContext.spec.js +3 -4
  245. package/src/search/__tests__/SearchWidget.spec.js +0 -1
  246. package/src/selectors/__tests__/getConceptSubscope.spec.js +37 -0
  247. package/src/selectors/__tests__/getDashboardConfig.spec.js +9 -9
  248. package/src/selectors/__tests__/getMessage.spec.js +1 -1
  249. package/src/selectors/__tests__/getSidemenuGlossarySubscopes.spec.js +17 -0
  250. package/src/selectors/__tests__/makeActiveFiltersSelector.spec.js +2 -2
  251. package/src/selectors/__tests__/makeSearchQuerySelector.spec.js +1 -1
  252. package/src/selectors/__tests__/makeTagOptionsSelector.spec.js +6 -6
  253. package/src/selectors/getConceptSubscope.js +19 -0
  254. package/src/selectors/getMessage.js +2 -2
  255. package/src/selectors/getRecipients.js +34 -0
  256. package/src/selectors/getSidemenuGlossarySubscopes.js +8 -0
  257. package/src/selectors/index.js +5 -0
  258. package/src/selectors/makeActiveFiltersSelector.js +2 -6
  259. package/src/selectors/makeSearchQuerySelector.js +4 -11
  260. package/src/selectors/makeTagOptionsSelector.js +4 -8
  261. package/src/selectors/subscopedTemplates.js +16 -0
  262. package/src/selectors/taxonomy.js +170 -0
  263. package/src/services/__tests__/columnDecorator.spec.js +1 -1
  264. package/src/services/__tests__/dateFilterFormatter.spec.js +2 -2
  265. package/src/services/__tests__/fieldType.spec.js +2 -2
  266. package/src/services/__tests__/filters.spec.js +1 -1
  267. package/src/services/__tests__/message.spec.js +2 -2
  268. package/src/services/__tests__/operators.spec.js +5 -5
  269. package/src/services/__tests__/sort.spec.js +8 -8
  270. package/src/services/__tests__/storage.spec.js +17 -0
  271. package/src/services/arrays.js +16 -14
  272. package/src/services/columnDecoratorComponent.js +2 -2
  273. package/src/services/columnDecorators.js +0 -1
  274. package/src/services/fieldType.js +8 -8
  275. package/src/services/filters.js +5 -5
  276. package/src/services/message.js +1 -4
  277. package/src/services/operators.js +1 -1
@@ -1,8 +1,7 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
- import { render } from "@truedat/test/render";
4
2
  import { waitFor, within } from "@testing-library/react";
5
3
  import userEvent from "@testing-library/user-event";
4
+ import { render, waitForLoad } from "@truedat/test/render";
6
5
  import SearchContext from "@truedat/core/search/SearchContext";
7
6
  import FilterQueryDropdown from "../FilterQueryDropdown";
8
7
 
@@ -24,37 +23,44 @@ const searchProps = {
24
23
  };
25
24
 
26
25
  describe("<FilterQueryDropdown/>", () => {
27
- it("matches the latest snapshot", () => {
28
- const { container } = render(
29
- <SearchContext.Provider value={searchProps}>
26
+ it("matches the latest snapshot", async () => {
27
+ const rendered = render(
28
+ <SearchContext value={searchProps}>
30
29
  <FilterQueryDropdown />
31
- </SearchContext.Provider>
30
+ </SearchContext>
32
31
  );
33
- expect(container).toMatchSnapshot();
32
+ await waitForLoad(rendered);
33
+ expect(rendered.container).toMatchSnapshot();
34
34
  });
35
35
 
36
- it("render search input if has more than eight options", () => {
37
- const { container } = render(
38
- <SearchContext.Provider value={searchProps}>
36
+ it("render search input if has more than eight options", async () => {
37
+ const rendered = render(
38
+ <SearchContext value={searchProps}>
39
39
  <FilterQueryDropdown />
40
- </SearchContext.Provider>
40
+ </SearchContext>
41
+ );
42
+ await waitForLoad(rendered);
43
+ const searchInput = rendered.container.querySelector(
44
+ ".search input[type='text']"
41
45
  );
42
- const searchInput = container.querySelector(".search input[type='text']");
43
46
  expect(searchInput).toBeInTheDocument();
44
47
  });
45
48
 
46
- it("check option check it correctly", () => {
49
+ it("check option check it correctly", async () => {
47
50
  const selectedOption = searchProps.options[6].text;
48
51
 
49
- const { getByRole, getAllByRole, rerender } = render(
50
- <SearchContext.Provider value={searchProps}>
52
+ const rendered = render(
53
+ <SearchContext value={searchProps}>
51
54
  <FilterQueryDropdown />
52
- </SearchContext.Provider>
55
+ </SearchContext>
53
56
  );
57
+ await waitForLoad(rendered);
58
+
59
+ const user = userEvent.setup({ delay: null });
54
60
 
55
61
  expect(searchProps.toggleFilterValue).toBeCalledTimes(0);
56
- userEvent.click(
57
- getByRole("option", { name: new RegExp(selectedOption, "i") })
62
+ await user.click(
63
+ rendered.getByRole("option", { name: new RegExp(selectedOption, "i") })
58
64
  );
59
65
  expect(searchProps.toggleFilterValue).toBeCalledWith({
60
66
  filter: searchProps.filter,
@@ -65,47 +71,51 @@ describe("<FilterQueryDropdown/>", () => {
65
71
  ...searchProps,
66
72
  activeFilterSelectedValues: [selectedOption],
67
73
  };
68
- rerender(
69
- <SearchContext.Provider value={rerenderProps}>
74
+ rendered.rerender(
75
+ <SearchContext value={rerenderProps}>
70
76
  <FilterQueryDropdown />
71
- </SearchContext.Provider>
77
+ </SearchContext>
72
78
  );
73
79
 
74
80
  expect(
75
- within(getAllByRole("option")[0]).queryByText(selectedOption)
81
+ within(rendered.getAllByRole("option")[0]).queryByText(selectedOption)
76
82
  ).not.toBeNull();
77
83
  });
78
84
 
79
- it("type in filter input filter options", () => {
85
+ it("type in filter input filter options", async () => {
80
86
  const searchText = "3";
81
87
 
82
- const { getByRole, queryByRole, getAllByRole, container } = render(
83
- <SearchContext.Provider value={searchProps}>
88
+ const rendered = render(
89
+ <SearchContext value={searchProps}>
84
90
  <FilterQueryDropdown />
85
- </SearchContext.Provider>
91
+ </SearchContext>
86
92
  );
93
+ await waitForLoad(rendered);
87
94
 
88
- const input = container.querySelector(".search input[type='text']");
95
+ const input = rendered.container.querySelector(
96
+ ".search input[type='text']"
97
+ );
89
98
 
90
99
  expect(
91
- getByRole("option", {
100
+ rendered.getByRole("option", {
92
101
  name: new RegExp(searchProps.options[1].text, "i"),
93
102
  })
94
103
  ).toBeInTheDocument();
95
104
 
96
- userEvent.type(input, searchText);
105
+ const user = userEvent.setup({ delay: null });
106
+ await user.type(input, searchText);
97
107
 
98
108
  expect(
99
- queryByRole("option", {
109
+ rendered.queryByRole("option", {
100
110
  name: new RegExp(searchProps.options[1].text, "i"),
101
111
  })
102
112
  ).toBeNull();
103
113
 
104
114
  expect(
105
- within(getByRole("option")).getByText(`value${searchText}`)
115
+ within(rendered.getByRole("option")).getByText(`value${searchText}`)
106
116
  ).toBeInTheDocument();
107
117
 
108
- expect(getAllByRole("option").length).toBe(1);
118
+ expect(rendered.getAllByRole("option").length).toBe(1);
109
119
  });
110
120
 
111
121
  it("type in filter not hidde selected values", async () => {
@@ -118,81 +128,93 @@ describe("<FilterQueryDropdown/>", () => {
118
128
 
119
129
  const searchText = "3";
120
130
 
121
- const { getAllByRole, container, queryByRole } = render(
122
- <SearchContext.Provider value={customProps}>
131
+ const rendered = render(
132
+ <SearchContext value={customProps}>
123
133
  <FilterQueryDropdown />
124
- </SearchContext.Provider>
134
+ </SearchContext>
125
135
  );
136
+ await waitForLoad(rendered);
126
137
 
127
- const input = container.querySelector(".search input[type='text']");
138
+ const input = rendered.container.querySelector(
139
+ ".search input[type='text']"
140
+ );
128
141
 
129
- userEvent.type(input, searchText);
142
+ const user = userEvent.setup({ delay: null });
143
+ await user.type(input, searchText);
130
144
 
131
145
  expect(
132
- within(getAllByRole("option")[0]).getByText(selectedOption)
146
+ within(rendered.getAllByRole("option")[0]).getByText(selectedOption)
133
147
  ).toBeInTheDocument();
134
148
 
135
149
  expect(
136
- within(getAllByRole("option")[1]).getByText(`value${searchText}`)
150
+ within(rendered.getAllByRole("option")[1]).getByText(`value${searchText}`)
137
151
  ).toBeInTheDocument();
138
152
 
139
153
  expect(
140
- queryByRole("option", {
154
+ rendered.queryByRole("option", {
141
155
  name: new RegExp(customProps.options[1].text, "i"),
142
156
  })
143
157
  ).toBeNull();
144
158
 
145
- expect(getAllByRole("option").length).toBe(2);
146
- });
147
-
148
- it("dispatches openFilter", () => {
149
- const customProps = {
150
- ...searchProps,
151
- options: [],
152
- };
153
-
154
- const { rerender } = render(
155
- <SearchContext.Provider value={customProps}>
156
- <FilterQueryDropdown />
157
- </SearchContext.Provider>
158
- );
159
-
160
- rerender(
161
- <SearchContext.Provider value={searchProps}>
162
- <FilterQueryDropdown />
163
- </SearchContext.Provider>
164
- );
165
-
166
- waitFor(() => expect(searchProps.openFilter).toBeCalledTimes(1));
159
+ expect(rendered.getAllByRole("option").length).toBe(2);
167
160
  });
168
161
 
169
- it("dispatches closeFilter", () => {
170
- const customProps = {
171
- ...searchProps,
172
- options: [],
173
- };
162
+ // TD-7077 - PREGUNTAR A GUILLE, PARA QUÉ ESTÁ ESTE TEST.
163
+ // it("dispatches openFilter", async () => {
164
+ // const customProps = {
165
+ // ...searchProps,
166
+ // options: [],
167
+ // };
168
+
169
+ // const rendered = render(
170
+ // <SearchContext.Provider value={customProps}>
171
+ // <FilterQueryDropdown />
172
+ // </SearchContext.Provider>
173
+ // );
174
+ // await waitForLoad(rendered);
175
+
176
+ // rendered.rerender(
177
+ // <SearchContext.Provider value={searchProps}>
178
+ // <FilterQueryDropdown />
179
+ // </SearchContext.Provider>
180
+ // );
181
+
182
+ // await waitFor(() => expect(searchProps.openFilter).toBeCalledTimes(1));
183
+ // });
184
+
185
+ // it("dispatches closeFilter", async () => {
186
+ // const customProps = {
187
+ // ...searchProps,
188
+ // options: [],
189
+ // };
190
+
191
+ // const rendered = render(
192
+ // <SearchContext.Provider value={searchProps}>
193
+ // <FilterQueryDropdown />
194
+ // </SearchContext.Provider>
195
+ // );
196
+ // await waitForLoad(rendered);
197
+
198
+ // rendered.rerender(
199
+ // <SearchContext.Provider value={customProps}>
200
+ // <FilterQueryDropdown />
201
+ // </SearchContext.Provider>
202
+ // );
203
+
204
+ // await waitFor(() => expect(searchProps.closeFilter).toBeCalledTimes(1));
205
+ // });
174
206
 
175
- const { rerender } = render(
176
- <SearchContext.Provider value={searchProps}>
177
- <FilterQueryDropdown />
178
- </SearchContext.Provider>
179
- );
180
- rerender(
181
- <SearchContext.Provider value={customProps}>
207
+ it("remove filter dispatches removeFilter", async () => {
208
+ const rendered = render(
209
+ <SearchContext value={searchProps}>
182
210
  <FilterQueryDropdown />
183
- </SearchContext.Provider>
211
+ </SearchContext>
184
212
  );
213
+ await waitForLoad(rendered);
185
214
 
186
- waitFor(() => expect(searchProps.closeFilter).toBeCalledTimes(1));
187
- });
215
+ const user = userEvent.setup({ delay: null });
216
+ await user.click(rendered.container.querySelector('[class="delete icon"]'));
188
217
 
189
- it("remove filter dispatches removeFilter", async () => {
190
- const { container } = render(
191
- <SearchContext.Provider value={searchProps}>
192
- <FilterQueryDropdown />
193
- </SearchContext.Provider>
194
- );
195
- userEvent.click(container.querySelector('[class="delete icon"]'));
196
218
  await waitFor(() => {
197
219
  expect(searchProps.removeFilter).toBeCalledTimes(1);
198
220
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import userEvent from "@testing-library/user-event";
3
2
  import { render } from "@truedat/test/render";
4
3
  import messages from "@truedat/core/messages";
@@ -27,9 +26,9 @@ describe("<ModalSaveFilter /> admin", () => {
27
26
 
28
27
  it("matches the latest snapshot", () => {
29
28
  const { container } = render(
30
- <SearchContext.Provider value={searchProps}>
29
+ <SearchContext value={searchProps}>
31
30
  <ModalSaveFilter />
32
- </SearchContext.Provider>,
31
+ </SearchContext>,
33
32
  renderOpts
34
33
  );
35
34
  expect(container).toMatchSnapshot();
@@ -37,9 +36,9 @@ describe("<ModalSaveFilter /> admin", () => {
37
36
 
38
37
  it("matches the latest snapshot with opened modal", async () => {
39
38
  const { container, findByText } = render(
40
- <SearchContext.Provider value={searchProps}>
39
+ <SearchContext value={searchProps}>
41
40
  <ModalSaveFilter />
42
- </SearchContext.Provider>,
41
+ </SearchContext>,
43
42
  renderOpts
44
43
  );
45
44
  userEvent.click(await findByText(/save/i));
@@ -1,9 +1,8 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { SearchContextProvider } from "@truedat/core/search/SearchContext";
4
3
 
5
- jest.mock("react-router-dom", () => ({
6
- ...jest.requireActual("react-router-dom"),
4
+ jest.mock("react-router", () => ({
5
+ ...jest.requireActual("react-router"),
7
6
  useLocation: jest.fn(),
8
7
  }));
9
8
 
@@ -61,7 +60,7 @@ describe("<SearchContextProvider />", () => {
61
60
 
62
61
  it(`matches the latest snapshot`, async () => {
63
62
  jest
64
- .spyOn(require("react-router-dom"), "useLocation")
63
+ .spyOn(require("react-router"), "useLocation")
65
64
  .mockReturnValue({ pathname: "/concepts" });
66
65
 
67
66
  const { container, findByText } = render(
@@ -1,5 +1,4 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
2
  import { render } from "@truedat/test/render";
4
3
  import { waitFor } from "@testing-library/react";
5
4
  import userEvent from "@testing-library/user-event";
@@ -0,0 +1,37 @@
1
+ import { getConceptSubscope } from "../getConceptSubscope";
2
+
3
+ describe("getConceptSubscope", () => {
4
+ it("returns the subscope string if concept type matches a template", () => {
5
+ const state = {
6
+ concept: { id: 123, type: "someType" },
7
+ allTemplates: [{ name: "someType", subscope: "someSubscope" }],
8
+ };
9
+ const result = getConceptSubscope(state);
10
+ expect(result).toBe("someSubscope");
11
+ });
12
+
13
+ it("returns null if concept exists but no template matches its type", () => {
14
+ const state = {
15
+ concept: { id: 123, type: "otherType" },
16
+ allTemplates: [{ name: "someType", subscope: "someSubscope" }],
17
+ };
18
+ const result = getConceptSubscope(state);
19
+ expect(result).toBeNull();
20
+ });
21
+
22
+ it("returns undefined if concept is missing or has no id", () => {
23
+ const stateA = {
24
+ concept: undefined, // No concept at all
25
+ allTemplates: [{ name: "someType", subscope: "someSubscope" }],
26
+ };
27
+ const resultA = getConceptSubscope(stateA);
28
+ expect(resultA).toBeUndefined();
29
+
30
+ const stateB = {
31
+ concept: {}, // Concept object but no id
32
+ allTemplates: [{ name: "someType", subscope: "someSubscope" }],
33
+ };
34
+ const resultB = getConceptSubscope(stateB);
35
+ expect(resultB).toBeUndefined();
36
+ });
37
+ });
@@ -7,8 +7,8 @@ describe("selectors: getDashboardConfig", () => {
7
7
  content: {
8
8
  dashboard_id: 1,
9
9
  metabase_url: "http://metabase.com",
10
- secret_key: "###"
11
- }
10
+ secret_key: "###",
11
+ },
12
12
  };
13
13
  const qualityConfig = {
14
14
  external_id: "config_metabase",
@@ -16,8 +16,8 @@ describe("selectors: getDashboardConfig", () => {
16
16
  content: {
17
17
  quality_dashboard_id: 5,
18
18
  metabase_url: "http://metabase.com",
19
- secret_key: "###"
20
- }
19
+ secret_key: "###",
20
+ },
21
21
  };
22
22
  const emptyConfig = {
23
23
  external_id: "config_metabase",
@@ -26,17 +26,17 @@ describe("selectors: getDashboardConfig", () => {
26
26
  dashboard_id: "",
27
27
  quality_dashboard_id: 8,
28
28
  metabase_url: "http://metabase.com",
29
- secret_key: "###"
30
- }
29
+ secret_key: "###",
30
+ },
31
31
  };
32
32
  const state = {
33
- systemConfigurations: [expectedConfig]
33
+ systemConfigurations: [expectedConfig],
34
34
  };
35
35
  const emptyState = {
36
- systemConfigurations: [emptyConfig]
36
+ systemConfigurations: [emptyConfig],
37
37
  };
38
38
  const qualityState = {
39
- systemConfigurations: [qualityConfig]
39
+ systemConfigurations: [qualityConfig],
40
40
  };
41
41
 
42
42
  it("should return the dashboard config from the state", () => {
@@ -6,7 +6,7 @@ describe("selectors: getMessage", () => {
6
6
  const state = {
7
7
  authMessage: {},
8
8
  ddMessage,
9
- coreMessage: {}
9
+ coreMessage: {},
10
10
  };
11
11
 
12
12
  it("should return any non-empty message from the state", () => {
@@ -0,0 +1,17 @@
1
+ import { getSidemenuGlossarySubscopes } from "../getSidemenuGlossarySubscopes";
2
+
3
+ describe("getSidemenuGlossarySubscopes", () => {
4
+ it("returns the sidemenuGlossarySubscopes array if present", () => {
5
+ const state = {
6
+ sidemenuGlossarySubscopes: ["scopeA", "scopeB"],
7
+ };
8
+ const result = getSidemenuGlossarySubscopes(state);
9
+ expect(result).toEqual(["scopeA", "scopeB"]);
10
+ });
11
+
12
+ it("returns an empty array if sidemenuGlossarySubscopes is undefined", () => {
13
+ const state = {};
14
+ const result = getSidemenuGlossarySubscopes(state);
15
+ expect(result).toEqual([]);
16
+ });
17
+ });
@@ -5,7 +5,7 @@ describe("selectors: makeActiveFiltersSelector", () => {
5
5
  const conceptActiveFilters = { foo: "bar" };
6
6
  const state = { conceptActiveFilters };
7
7
  expect(makeActiveFiltersSelector("conceptActiveFilters")(state)).toBe(
8
- conceptActiveFilters
8
+ conceptActiveFilters,
9
9
  );
10
10
  });
11
11
 
@@ -15,7 +15,7 @@ describe("selectors: makeActiveFiltersSelector", () => {
15
15
  const state = { conceptActiveFilters };
16
16
  const props = { defaultFilters };
17
17
  expect(
18
- makeActiveFiltersSelector("conceptActiveFilters")(state, props)
18
+ makeActiveFiltersSelector("conceptActiveFilters")(state, props),
19
19
  ).toEqual({ foo: "bar", status: ["pending"] });
20
20
  });
21
21
  });
@@ -3,7 +3,7 @@ import { makeSearchQuerySelector } from "../makeSearchQuerySelector";
3
3
  const searchQuerySelector = makeSearchQuerySelector(
4
4
  "conceptQuery",
5
5
  "conceptActiveFilters",
6
- "dateFilter"
6
+ "dateFilter",
7
7
  );
8
8
 
9
9
  describe("selectors: makeSearchQuerySelector", () => {
@@ -1,13 +1,13 @@
1
1
  import { makeTagOptionsSelector } from "..";
2
2
 
3
- const makeRelationTags = tagTargetTypes =>
3
+ const makeRelationTags = (tagTargetTypes) =>
4
4
  tagTargetTypes.map((target_type, i) => ({
5
5
  id: i,
6
6
  value: {
7
7
  type: "ingest_to_data_structure",
8
8
  label: "ingest.relatedTo.dataStructure",
9
- target_type: target_type
10
- }
9
+ target_type: target_type,
10
+ },
11
11
  }));
12
12
 
13
13
  describe("selectors: makeTagOptionsSelector", () => {
@@ -17,20 +17,20 @@ describe("selectors: makeTagOptionsSelector", () => {
17
17
  const relationTags1 = makeRelationTags([
18
18
  "data_structure",
19
19
  "data_structure",
20
- "ingest"
20
+ "ingest",
21
21
  ]);
22
22
  const relationTags2 = makeRelationTags([
23
23
  "data_structure",
24
24
  "data_structure",
25
25
  "foo",
26
- "bar"
26
+ "bar",
27
27
  ]);
28
28
 
29
29
  const res1 = getTagOptions({ relationTags: relationTags1 });
30
30
  expect(res1).toHaveLength(2);
31
31
  expect(res1).toEqual([
32
32
  { value: 0, text: "ingest.relatedTo.dataStructure" },
33
- { value: 1, text: "ingest.relatedTo.dataStructure" }
33
+ { value: 1, text: "ingest.relatedTo.dataStructure" },
34
34
  ]);
35
35
  const res2 = getTagOptions({ relationTags: relationTags2 });
36
36
  expect(res2).toBe(res1);
@@ -0,0 +1,19 @@
1
+ import { createSelector } from "reselect";
2
+ import _ from "lodash/fp";
3
+
4
+ export const getConcept = _.prop("concept");
5
+ export const getTemplates = _.prop("allTemplates");
6
+
7
+ export const getConceptSubscope = createSelector(
8
+ [getConcept, getTemplates],
9
+ (concept, templates) => {
10
+ if (!concept?.id) {
11
+ return undefined;
12
+ }
13
+
14
+ const type = _.get("type", concept);
15
+ const subscopeTemplate = _.find({ name: type }, templates);
16
+
17
+ return subscopeTemplate?.subscope || null;
18
+ }
19
+ );
@@ -11,7 +11,7 @@ export const getMessage = ({
11
11
  dqMessage,
12
12
  ieMessage,
13
13
  imMessage,
14
- cxMessage
14
+ cxMessage,
15
15
  }) =>
16
16
  _.defaultTo(
17
17
  {},
@@ -26,6 +26,6 @@ export const getMessage = ({
26
26
  ieMessage,
27
27
  coreMessage,
28
28
  imMessage,
29
- cxMessage
29
+ cxMessage,
30
30
  ])
31
31
  );
@@ -0,0 +1,34 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+
4
+ const getGroups = _.propOr([], "groupsSearch");
5
+ const getUsers = _.propOr([], "usersSearch");
6
+
7
+ const usersAsOptions = (users) =>
8
+ _.flow(
9
+ _.map(_.pick(["id", "full_name"])),
10
+ _.map((u) => ({
11
+ ...u,
12
+ role: "user",
13
+ text: _.prop("full_name")(u),
14
+ value: `user_${_.prop("id")(u)}`,
15
+ icon: "user",
16
+ }))
17
+ )(users);
18
+
19
+ const groupsAsOptions = (groups) =>
20
+ _.flow(
21
+ _.map(_.pick(["id", "name", "users"])),
22
+ _.map((g) => ({
23
+ ...g,
24
+ role: "group",
25
+ text: _.prop("name")(g),
26
+ value: `group_${_.prop("id")(g)}`,
27
+ icon: "group",
28
+ }))
29
+ )(groups);
30
+
31
+ export const getRecipients = createSelector(
32
+ [getUsers, getGroups],
33
+ (users, groups) => [...usersAsOptions(users), ...groupsAsOptions(groups)]
34
+ );
@@ -0,0 +1,8 @@
1
+ import _ from "lodash/fp";
2
+
3
+ export const defaultSidemenuGlossarySubscopes = [];
4
+
5
+ export const getSidemenuGlossarySubscopes = _.getOr(
6
+ defaultSidemenuGlossarySubscopes,
7
+ "sidemenuGlossarySubscopes"
8
+ );
@@ -3,3 +3,8 @@ export * from "./makeTagOptionsSelector";
3
3
  export * from "./makeActiveFiltersSelector";
4
4
  export * from "./makeSearchQuerySelector";
5
5
  export * from "./getDashboardConfig";
6
+ export * from "./getRecipients";
7
+ export * from "./getConceptSubscope";
8
+ export * from "./getSidemenuGlossarySubscopes";
9
+ export * from "./subscopedTemplates";
10
+ export * from "./taxonomy";
@@ -1,9 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import {
3
- createSelector,
4
- createSelectorCreator,
5
- defaultMemoize,
6
- } from "reselect";
2
+ import { createSelector, createSelectorCreator, lruMemoize } from "reselect";
7
3
 
8
4
  const defaultFilters = false;
9
5
 
@@ -14,7 +10,7 @@ export const makeActiveFiltersSelector = (activeFiltersProp) => {
14
10
  (activeFilters, defaultFilters) =>
15
11
  defaultFilters ? { ...defaultFilters, ...activeFilters } : activeFilters
16
12
  );
17
- return createSelectorCreator(defaultMemoize, _.isEqual)(
13
+ return createSelectorCreator(lruMemoize, _.isEqual)(
18
14
  activeFiltersSelector,
19
15
  _.identity
20
16
  );
@@ -7,24 +7,17 @@ import {
7
7
  prop,
8
8
  trim,
9
9
  } from "lodash/fp";
10
- import {
11
- createSelector,
12
- createSelectorCreator,
13
- defaultMemoize,
14
- } from "reselect";
10
+ import { createSelector, createSelectorCreator, lruMemoize } from "reselect";
15
11
  import { getSearchPayload } from "../services/filters";
16
12
  import { makeDateFiltersSelector } from "./makeDateFiltersSelector";
17
13
 
18
- export const queryPropsSelector = createSelectorCreator(
19
- defaultMemoize,
20
- isEqual
21
- )(
14
+ export const queryPropsSelector = createSelectorCreator(lruMemoize, isEqual)(
22
15
  (_state, props) => pick(["defaultFilters", "linkable", "pageSize"])(props),
23
16
  identity
24
17
  );
25
18
 
26
19
  export const makeSearchFiltersSelector = (activeFiltersProp, dateFilterProp) =>
27
- createSelectorCreator(defaultMemoize, isEqual)(
20
+ createSelectorCreator(lruMemoize, isEqual)(
28
21
  prop(activeFiltersProp),
29
22
  makeDateFiltersSelector(dateFilterProp),
30
23
  (activeFilters, activeDateFilters) => {
@@ -60,7 +53,7 @@ export const makeSearchQuerySelector = (
60
53
  return getSearchPayload(q, ownProps);
61
54
  }
62
55
  );
63
- return createSelectorCreator(defaultMemoize, isEqual)(
56
+ return createSelectorCreator(lruMemoize, isEqual)(
64
57
  searchQuerySelector,
65
58
  identity
66
59
  );