@truedat/core 7.5.9 → 7.5.11

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 (279) hide show
  1. package/package.json +36 -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/Graph.js +101 -0
  39. package/src/components/GroupActions.js +15 -15
  40. package/src/components/Hierarchy.js +7 -10
  41. package/src/components/HierarchyFilterDropdown.js +1 -2
  42. package/src/components/HierarchyNodeFinder.js +4 -4
  43. package/src/components/HierarchySelector.js +1 -2
  44. package/src/components/HistoryBackButton.js +6 -6
  45. package/src/components/IngestMenu.js +0 -1
  46. package/src/components/LanguagesTabs.js +4 -4
  47. package/src/components/LineageMenu.js +0 -1
  48. package/src/components/Loading.js +1 -2
  49. package/src/components/MembersMenu.js +0 -1
  50. package/src/components/ModalSaveFilter.js +1 -1
  51. package/src/components/NodeOpenActions.js +0 -1
  52. package/src/components/OptionGroup.js +1 -2
  53. package/src/components/OptionModal.js +0 -1
  54. package/src/components/Pagination.js +0 -1
  55. package/src/components/QualityMenu.js +0 -1
  56. package/src/components/QxMenu.js +0 -1
  57. package/src/components/Redirector.js +3 -3
  58. package/src/components/ResourceMember.js +1 -2
  59. package/src/components/ResourceMembers.js +3 -3
  60. package/src/components/ResourceMembersActions.js +1 -2
  61. package/src/components/RichTextEditor.js +7 -8
  62. package/src/components/RouteListener.js +11 -32
  63. package/src/components/SafeLink.js +0 -1
  64. package/src/components/ScrollToTop.js +13 -16
  65. package/src/components/SearchFilterDropdown.js +1 -1
  66. package/src/components/SearchInput.js +3 -3
  67. package/src/components/SearchMenu.js +0 -1
  68. package/src/components/SelectedFilters.js +1 -2
  69. package/src/components/SideMenu.js +0 -1
  70. package/src/components/SidebarToggle.js +2 -2
  71. package/src/components/StructureFilterItem.js +0 -1
  72. package/src/components/Submenu.js +8 -7
  73. package/src/components/SystemsLoader.js +27 -0
  74. package/src/components/TaxonomyMenu.js +0 -1
  75. package/src/components/TemplateSelector.js +1 -1
  76. package/src/components/TemplatesLoader.js +24 -0
  77. package/src/components/TreeSelector.js +4 -4
  78. package/src/components/Unauthorized.js +0 -1
  79. package/src/components/UploadModal.js +152 -176
  80. package/src/components/UserFilter.js +0 -2
  81. package/src/components/UserFilters.js +0 -2
  82. package/src/components/__tests__/AddMemberForm.spec.js +26 -38
  83. package/src/components/__tests__/AddResourceMember.spec.js +0 -1
  84. package/src/components/__tests__/AdminMenu.spec.js +0 -1
  85. package/src/components/__tests__/Alert.spec.js +17 -21
  86. package/src/components/__tests__/AvailableFilters.spec.js +19 -14
  87. package/src/components/__tests__/CardGroupsAccordion.spec.js +24 -15
  88. package/src/components/__tests__/CatalogMenu.spec.js +27 -45
  89. package/src/components/__tests__/CommentsLoader.spec.js +17 -14
  90. package/src/components/__tests__/CursorPagination.spec.js +0 -1
  91. package/src/components/__tests__/DashboardMenu.spec.js +0 -1
  92. package/src/components/__tests__/DateFilter.spec.js +6 -28
  93. package/src/components/__tests__/DateTime.spec.js +0 -1
  94. package/src/components/__tests__/DomainSelector.spec.js +4 -4
  95. package/src/components/__tests__/DropdownMenuItem.spec.js +0 -1
  96. package/src/components/__tests__/FilterDropdown.spec.js +28 -27
  97. package/src/components/__tests__/FilterItem.spec.js +19 -20
  98. package/src/components/__tests__/FilterMultilevelDropdown.spec.js +16 -16
  99. package/src/components/__tests__/FiltersLoader.spec.js +25 -20
  100. package/src/components/__tests__/GenericCrumbs.spec.js +0 -1
  101. package/src/components/__tests__/GlossaryMenu.spec.js +0 -1
  102. package/src/components/__tests__/GrantMenu.spec.js +0 -1
  103. package/src/components/__tests__/GroupActions.spec.js +0 -1
  104. package/src/components/__tests__/Hierarchy.spec.js +0 -1
  105. package/src/components/__tests__/HierarchyFilterDropdown.spec.js +16 -14
  106. package/src/components/__tests__/HierarchyNodeFinder.spec.js +0 -1
  107. package/src/components/__tests__/HierarchySelector.spec.js +28 -35
  108. package/src/components/__tests__/HistoryBackButton.spec.js +23 -23
  109. package/src/components/__tests__/IngestMenu.spec.js +0 -1
  110. package/src/components/__tests__/LineageMenu.spec.js +0 -1
  111. package/src/components/__tests__/Loading.spec.js +4 -5
  112. package/src/components/__tests__/MembersMenu.spec.js +0 -1
  113. package/src/components/__tests__/ModalSaveFilter.spec.js +0 -1
  114. package/src/components/__tests__/OptionGroup.spec.js +5 -7
  115. package/src/components/__tests__/Pagination.spec.js +22 -16
  116. package/src/components/__tests__/QualityMenu.spec.js +0 -1
  117. package/src/components/__tests__/Redirector.spec.js +5 -10
  118. package/src/components/__tests__/ResourceMembers.spec.js +36 -27
  119. package/src/components/__tests__/ResourceMembersAction.spec.js +1 -2
  120. package/src/components/__tests__/RouteListener.spec.js +25 -26
  121. package/src/components/__tests__/SafeLink.spec.js +0 -1
  122. package/src/components/__tests__/SearchDateFilter.spec.js +0 -1
  123. package/src/components/__tests__/SearchFilterDropdown.spec.js +32 -24
  124. package/src/components/__tests__/SearchInput.spec.js +5 -5
  125. package/src/components/__tests__/SearchMenu.spec.js +0 -1
  126. package/src/components/__tests__/SelectedFilters.spec.js +50 -47
  127. package/src/components/__tests__/SideMenu.spec.js +5 -8
  128. package/src/components/__tests__/StructureFilterItem.spec.js +13 -11
  129. package/src/components/__tests__/Submenu.spec.js +0 -1
  130. package/src/components/__tests__/SystemsLoader.spec.js +40 -0
  131. package/src/components/__tests__/TaxonomyMenu.spec.js +0 -1
  132. package/src/components/__tests__/TemplateSelector.spec.js +27 -29
  133. package/src/components/__tests__/TemplatesLoader.spec.js +30 -0
  134. package/src/components/__tests__/TreeSelector.spec.js +110 -83
  135. package/src/components/__tests__/UploadModal.spec.js +171 -0
  136. package/src/components/__tests__/UserFilters.spec.js +44 -37
  137. package/src/components/__tests__/__snapshots__/AddMemberForm.spec.js.snap +1 -0
  138. package/src/components/__tests__/__snapshots__/AddResourceMember.spec.js.snap +10 -9
  139. package/src/components/__tests__/__snapshots__/AdminMenu.spec.js.snap +22 -11
  140. package/src/components/__tests__/__snapshots__/Alert.spec.js.snap +29 -17
  141. package/src/components/__tests__/__snapshots__/AvailableFilters.spec.js.snap +1 -1
  142. package/src/components/__tests__/__snapshots__/CatalogMenu.spec.js.snap +18 -8
  143. package/src/components/__tests__/__snapshots__/CursorPagination.spec.js.snap +3 -0
  144. package/src/components/__tests__/__snapshots__/DateFilter.spec.js.snap +165 -107
  145. package/src/components/__tests__/__snapshots__/DomainSelector.spec.js.snap +1 -1
  146. package/src/components/__tests__/__snapshots__/FilterItem.spec.js.snap +13 -20
  147. package/src/components/__tests__/__snapshots__/GlossaryMenu.spec.js.snap +8 -0
  148. package/src/components/__tests__/__snapshots__/GrantMenu.spec.js.snap +14 -7
  149. package/src/components/__tests__/__snapshots__/GroupActions.spec.js.snap +0 -1
  150. package/src/components/__tests__/__snapshots__/Hierarchy.spec.js.snap +0 -1
  151. package/src/components/__tests__/__snapshots__/HierarchySelector.spec.js.snap +1 -1
  152. package/src/components/__tests__/__snapshots__/HistoryBackButton.spec.js.snap +10 -20
  153. package/src/components/__tests__/__snapshots__/IngestMenu.spec.js.snap +3 -1
  154. package/src/components/__tests__/__snapshots__/LineageMenu.spec.js.snap +6 -3
  155. package/src/components/__tests__/__snapshots__/Loading.spec.js.snap +5 -4
  156. package/src/components/__tests__/__snapshots__/MembersMenu.spec.js.snap +6 -3
  157. package/src/components/__tests__/__snapshots__/OptionGroup.spec.js.snap +38 -28
  158. package/src/components/__tests__/__snapshots__/Pagination.spec.js.snap +213 -64
  159. package/src/components/__tests__/__snapshots__/QualityMenu.spec.js.snap +14 -8
  160. package/src/components/__tests__/__snapshots__/ResourceMembers.spec.js.snap +1 -0
  161. package/src/components/__tests__/__snapshots__/ResourceMembersAction.spec.js.snap +2 -1
  162. package/src/components/__tests__/__snapshots__/RouteListener.spec.js.snap +1 -1
  163. package/src/components/__tests__/__snapshots__/SearchInput.spec.js.snap +10 -12
  164. package/src/components/__tests__/__snapshots__/SearchMenu.spec.js.snap +3 -1
  165. package/src/components/__tests__/__snapshots__/SelectedFilters.spec.js.snap +8 -8
  166. package/src/components/__tests__/__snapshots__/SideMenu.spec.js.snap +112 -50
  167. package/src/components/__tests__/__snapshots__/Submenu.spec.js.snap +3 -0
  168. package/src/components/__tests__/__snapshots__/SystemsLoader.spec.js.snap +3 -0
  169. package/src/components/__tests__/__snapshots__/TaxonomyMenu.spec.js.snap +3 -1
  170. package/src/components/__tests__/__snapshots__/TemplateSelector.spec.js.snap +7 -7
  171. package/src/components/common/SearchContextWrapper.js +1 -4
  172. package/src/components/index.js +4 -2
  173. package/src/hooks/__mocks__/useAuthorized.js +2 -0
  174. package/src/hooks/__mocks__/useUserFilters.js +17 -0
  175. package/src/hooks/__tests__/{useAclEntries.spec.js → useAclEntries.spec.js.disabled} +1 -1
  176. package/src/hooks/__tests__/useAuthorized.spec.js +1 -1
  177. package/src/hooks/useAclEntries.js +6 -3
  178. package/src/hooks/useActiveRoute.js +3 -3
  179. package/src/hooks/useActiveRoutes.js +4 -4
  180. package/src/hooks/useHierarchies.js +112 -0
  181. package/src/hooks/useLocales.js +1 -1
  182. package/src/hooks/useMessages.js +1 -1
  183. package/src/hooks/usePath.js +4 -4
  184. package/src/hooks/useUserFilters.js +1 -1
  185. package/src/i18n/components/EditableCell.js +1 -1
  186. package/src/i18n/components/I18nRoutes.js +11 -16
  187. package/src/i18n/components/LangProvider.js +56 -101
  188. package/src/i18n/components/LangProviderWrapper.js +26 -33
  189. package/src/i18n/components/Languages.js +8 -7
  190. package/src/i18n/components/MessageForm.js +9 -23
  191. package/src/i18n/components/Messages.js +5 -4
  192. package/src/i18n/components/MessagesTable.js +0 -1
  193. package/src/i18n/components/NewMessage.js +5 -4
  194. package/src/i18n/components/__tests__/EditableCell.spec.js +18 -20
  195. package/src/i18n/components/__tests__/I18nRoutes.spec.js +39 -5
  196. package/src/i18n/components/__tests__/MessageForm.spec.js +0 -1
  197. package/src/i18n/components/__tests__/Messages.spec.js +9 -21
  198. package/src/i18n/components/__tests__/NewMessage.spec.js +0 -1
  199. package/src/i18n/components/__tests__/__snapshots__/I18nRoutes.spec.js.snap +25 -1
  200. package/src/i18n/components/__tests__/__snapshots__/MessageForm.spec.js.snap +1 -0
  201. package/src/i18n/components/__tests__/__snapshots__/Messages.spec.js.snap +5 -13
  202. package/src/i18n/components/__tests__/__snapshots__/NewMessage.spec.js.snap +2 -0
  203. package/src/reducers/__tests__/comments.spec.js +9 -6
  204. package/src/reducers/__tests__/commentsResource.spec.js +5 -2
  205. package/src/reducers/__tests__/coreMessage.spec.js +1 -1
  206. package/src/reducers/__tests__/dashboardDomains.spec.js +5 -5
  207. package/src/reducers/__tests__/systems.spec.js +42 -0
  208. package/src/reducers/__tests__/systemsLoading.spec.js +22 -0
  209. package/src/reducers/index.js +5 -1
  210. package/src/reducers/systems.js +19 -0
  211. package/src/reducers/systemsLoading.js +14 -0
  212. package/src/router/Loader.js +10 -0
  213. package/src/router/ProtectedRoute.js +11 -0
  214. package/src/router/Unauthorized.js +16 -0
  215. package/src/router/__tests__/ProtectedRoute.spec.js +49 -0
  216. package/src/router/__tests__/Unauthorized.spec.js +15 -0
  217. package/src/router/__tests__/__snapshots__/ProtectedRoute.spec.js.snap +44 -0
  218. package/src/router/__tests__/__snapshots__/Unauthorized.spec.js.snap +26 -0
  219. package/src/router/index.js +5 -0
  220. package/src/routes.js +7 -7
  221. package/src/routesTree.js +93 -0
  222. package/src/routines.js +8 -0
  223. package/src/sagas/__tests__/addComment.spec.js +3 -5
  224. package/src/sagas/__tests__/fetchComments.spec.js +1 -1
  225. package/src/sagas/__tests__/fetchSystems.spec.js +69 -0
  226. package/src/sagas/fetchSystems.js +25 -0
  227. package/src/sagas/index.js +3 -0
  228. package/src/search/FilterDropdown.js +0 -1
  229. package/src/search/FilterItem.js +0 -1
  230. package/src/search/FilterMultilevelDropdown.js +1 -1
  231. package/src/search/FilterQueryDropdown.js +38 -42
  232. package/src/search/HierarchyFilterDropdown.js +3 -4
  233. package/src/search/ModalSaveFilter.js +1 -1
  234. package/src/search/Pagination.js +0 -1
  235. package/src/search/SearchContext.js +9 -11
  236. package/src/search/SearchDateFilter.js +0 -1
  237. package/src/search/SearchFilters.js +1 -2
  238. package/src/search/SearchSelectedFilters.js +4 -4
  239. package/src/search/SearchWidget.js +0 -4
  240. package/src/search/UserFilter.js +0 -2
  241. package/src/search/UserFilters.js +4 -3
  242. package/src/search/__tests__/FilterDropdown.spec.js +54 -51
  243. package/src/search/__tests__/FilterItem.spec.js +20 -15
  244. package/src/search/__tests__/FilterQueryDropdown.spec.js +106 -84
  245. package/src/search/__tests__/ModalSaveFilter.spec.js +4 -5
  246. package/src/search/__tests__/SearchContext.spec.js +3 -4
  247. package/src/search/__tests__/SearchWidget.spec.js +0 -1
  248. package/src/selectors/__tests__/getConceptSubscope.spec.js +37 -0
  249. package/src/selectors/__tests__/getDashboardConfig.spec.js +9 -9
  250. package/src/selectors/__tests__/getMessage.spec.js +1 -1
  251. package/src/selectors/__tests__/getSidemenuGlossarySubscopes.spec.js +17 -0
  252. package/src/selectors/__tests__/makeActiveFiltersSelector.spec.js +2 -2
  253. package/src/selectors/__tests__/makeSearchQuerySelector.spec.js +1 -1
  254. package/src/selectors/__tests__/makeTagOptionsSelector.spec.js +6 -6
  255. package/src/selectors/getConceptSubscope.js +19 -0
  256. package/src/selectors/getMessage.js +2 -2
  257. package/src/selectors/getRecipients.js +34 -0
  258. package/src/selectors/getSidemenuGlossarySubscopes.js +8 -0
  259. package/src/selectors/index.js +5 -0
  260. package/src/selectors/makeActiveFiltersSelector.js +2 -6
  261. package/src/selectors/makeSearchQuerySelector.js +4 -11
  262. package/src/selectors/makeTagOptionsSelector.js +4 -8
  263. package/src/selectors/subscopedTemplates.js +16 -0
  264. package/src/selectors/taxonomy.js +170 -0
  265. package/src/services/__tests__/columnDecorator.spec.js +1 -1
  266. package/src/services/__tests__/dateFilterFormatter.spec.js +2 -2
  267. package/src/services/__tests__/fieldType.spec.js +2 -2
  268. package/src/services/__tests__/filters.spec.js +1 -1
  269. package/src/services/__tests__/message.spec.js +2 -2
  270. package/src/services/__tests__/operators.spec.js +5 -5
  271. package/src/services/__tests__/sort.spec.js +8 -8
  272. package/src/services/__tests__/storage.spec.js +17 -0
  273. package/src/services/arrays.js +16 -14
  274. package/src/services/columnDecoratorComponent.js +2 -2
  275. package/src/services/columnDecorators.js +0 -1
  276. package/src/services/fieldType.js +8 -8
  277. package/src/services/filters.js +5 -5
  278. package/src/services/message.js +1 -4
  279. package/src/services/operators.js +1 -1
@@ -6,7 +6,7 @@ exports[`<TemplateSelector /> matches the latest snapshot (loading) 1`] = `
6
6
  class="field"
7
7
  >
8
8
  <label>
9
- Template
9
+ template.selector.label
10
10
  </label>
11
11
  <div
12
12
  class="field"
@@ -32,7 +32,7 @@ exports[`<TemplateSelector /> matches the latest snapshot (loading) 1`] = `
32
32
  class="divider default text"
33
33
  role="alert"
34
34
  >
35
- loading...
35
+ loading
36
36
  </div>
37
37
  <i
38
38
  aria-hidden="true"
@@ -60,7 +60,7 @@ exports[`<TemplateSelector /> matches the latest snapshot 1`] = `
60
60
  class="field"
61
61
  >
62
62
  <label>
63
- Template
63
+ template.selector.label
64
64
  </label>
65
65
  <div
66
66
  class="field"
@@ -86,7 +86,7 @@ exports[`<TemplateSelector /> matches the latest snapshot 1`] = `
86
86
  class="divider default text"
87
87
  role="alert"
88
88
  >
89
- Select a template...
89
+ template.selector.placeholder
90
90
  </div>
91
91
  <i
92
92
  aria-hidden="true"
@@ -135,11 +135,11 @@ exports[`<TemplateSelector /> matches the latest snapshot when required 1`] = `
135
135
  class="required field"
136
136
  >
137
137
  <label>
138
- Template
138
+ template.selector.label
139
139
  <div
140
140
  class="ui left pointing label"
141
141
  >
142
- Empty required field
142
+ template.form.validation.empty_required
143
143
  </div>
144
144
  </label>
145
145
  <div
@@ -166,7 +166,7 @@ exports[`<TemplateSelector /> matches the latest snapshot when required 1`] = `
166
166
  class="divider default text"
167
167
  role="alert"
168
168
  >
169
- Select a template...
169
+ template.selector.placeholder
170
170
  </div>
171
171
  <i
172
172
  aria-hidden="true"
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import PropTypes from "prop-types";
3
2
  import SearchContext from "@truedat/core/search/SearchContext";
4
3
  import SearchContextProvider from "@truedat/core/search/SearchContext";
@@ -36,9 +35,7 @@ export default function SearchContextWrapper({
36
35
  };
37
36
 
38
37
  return provider ? (
39
- <SearchContext.Provider value={searchProps}>
40
- {children}
41
- </SearchContext.Provider>
38
+ <SearchContext value={searchProps}>{children}</SearchContext>
42
39
  ) : (
43
40
  <SearchContextProvider {...searchProps}>{children}</SearchContextProvider>
44
41
  );
@@ -3,7 +3,6 @@ import AdminMenu from "./AdminMenu";
3
3
  import Alert from "./Alert";
4
4
  import Authorized from "./Authorized";
5
5
  import AvailableFilters from "./AvailableFilters";
6
- import HierarchyNodeFinder from "./HierarchyNodeFinder";
7
6
  import CardGroupsAccordion from "./CardGroupsAccordion";
8
7
  import CatalogMenu from "./CatalogMenu";
9
8
  import Comments from "./Comments";
@@ -24,7 +23,9 @@ import FieldLabel from "./FieldLabel";
24
23
  import FiltersLoader from "./FiltersLoader";
25
24
  import GlossaryMenu from "./GlossaryMenu";
26
25
  import GrantMenu from "./GrantMenu";
26
+ import Graph from "./Graph";
27
27
  import GroupActions from "./GroupActions";
28
+ import HierarchyNodeFinder from "./HierarchyNodeFinder";
28
29
  import HierarchySelector from "./HierarchySelector";
29
30
  import HistoryBackButton from "./HistoryBackButton";
30
31
  import IngestMenu from "./IngestMenu";
@@ -61,7 +62,6 @@ export {
61
62
  Alert,
62
63
  Authorized,
63
64
  AvailableFilters,
64
- HierarchyNodeFinder,
65
65
  CardGroupsAccordion,
66
66
  CatalogMenu,
67
67
  Comments,
@@ -82,7 +82,9 @@ export {
82
82
  FiltersLoader,
83
83
  GlossaryMenu,
84
84
  GrantMenu,
85
+ Graph,
85
86
  GroupActions,
87
+ HierarchyNodeFinder,
86
88
  HierarchySelector,
87
89
  HistoryBackButton,
88
90
  IngestMenu,
@@ -0,0 +1,2 @@
1
+ export const useAuthorized = jest.fn(() => true);
2
+ export const useAuthorizedItems = jest.fn((items) => items);
@@ -0,0 +1,17 @@
1
+ export const mutateUserFilters = jest.fn();
2
+ export const useUserFilters = jest.fn(() => ({
3
+ userFilters: [],
4
+ loading: false,
5
+ mutate: jest.fn(),
6
+ }));
7
+
8
+ export const useUserFiltersCreate = jest.fn(() => ({
9
+ trigger: jest.fn(() => ({
10
+ then: jest.fn(),
11
+ })),
12
+ }));
13
+ export const useUserFiltersDelete = jest.fn(() => ({
14
+ trigger: jest.fn(() => ({
15
+ then: jest.fn(),
16
+ })),
17
+ }));
@@ -1,6 +1,6 @@
1
1
  import { compile } from "path-to-regexp";
2
2
  import { waitFor } from "@testing-library/react";
3
- import { renderHook } from "@testing-library/react-hooks";
3
+ import { renderHook } from "@testing-library/react";
4
4
  import { API_ACL_RESOURCE_ENTRIES, API_ACL_ENTRY } from "../../api";
5
5
  import { apiJsonPost, apiJsonPatch, apiJsonDelete } from "../../services/api";
6
6
  import {
@@ -1,7 +1,7 @@
1
1
  import { useAuthorized } from "../useAuthorized";
2
2
 
3
3
  jest.mock("react-redux", () => ({
4
- useSelector: jest.fn(() => ({ groups: ["foo"] }))
4
+ useSelector: jest.fn(() => ({ groups: ["foo"] })),
5
5
  }));
6
6
 
7
7
  describe("hooks: useAuthorized", () => {
@@ -13,7 +13,10 @@ import {
13
13
  } from "../services/api";
14
14
 
15
15
  export const useAclEntries = (resource) => {
16
- const url = compile(API_ACL_RESOURCE_ENTRIES)(resource);
16
+ const url = compile(API_ACL_RESOURCE_ENTRIES)({
17
+ type: resource.type,
18
+ id: `${resource.id}`,
19
+ });
17
20
  const { data, error, loading, mutate } = useSWR(url, apiJson);
18
21
  const aclEntries = _.flow(
19
22
  _.pathOr([], "_embedded.acl_entries"),
@@ -34,11 +37,11 @@ export const useAclEntryCreate = (resource) => {
34
37
  };
35
38
 
36
39
  export const useAclEntryUpdate = (id) => {
37
- const url = compile(API_ACL_ENTRY)({ id });
40
+ const url = compile(API_ACL_ENTRY)({ id: `${id}` });
38
41
  return useSWRMutation(url, (url, { arg }) => apiJsonPatch(url, arg));
39
42
  };
40
43
 
41
44
  export const useAclEntryDelete = (id) => {
42
- const url = compile(API_ACL_ENTRY)({ id });
45
+ const url = compile(API_ACL_ENTRY)({ id: `${id}` });
43
46
  return useSWRMutation(url, (url) => apiJsonDelete(url, JSON_OPTS));
44
47
  };
@@ -1,7 +1,7 @@
1
1
  import _ from "lodash/fp";
2
- import { useRouteMatch } from "react-router-dom";
2
+ import { useMatch } from "react-router";
3
3
 
4
4
  export const useActiveRoute = (props) => {
5
- const match = useRouteMatch(props);
6
- return _.has("path")(match);
5
+ const match = useMatch(props);
6
+ return !_.isEmpty(match);
7
7
  };
@@ -1,5 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import { useLocation } from "react-router-dom";
2
+ import { useLocation } from "react-router";
3
3
  import { BUCKETS_VIEW } from "@truedat/core/routes";
4
4
  import { matchPath } from "react-router";
5
5
 
@@ -11,7 +11,7 @@ export const useActiveRoutes = (route, navFilter) => {
11
11
  return _.flow(
12
12
  _.map((route) => ({
13
13
  route,
14
- filterMatch: matchPath(route, { path: BUCKETS_VIEW }),
14
+ filterMatch: matchPath({ path: BUCKETS_VIEW }, route),
15
15
  })),
16
16
  _.reduce(
17
17
  (acc, { route, filterMatch }) => {
@@ -21,8 +21,8 @@ export const useActiveRoutes = (route, navFilter) => {
21
21
  _.includes(filterMatch?.params?.propertyPath, Object.keys(navFilter))
22
22
  ? { ...acc, filterMatchRoutes: route }
23
23
  : route === pathname || _.startsWith(`${route}/`)(pathname)
24
- ? { ...acc, pathMatchRoutes: route }
25
- : { filterMatchRoutes, pathMatchRoutes };
24
+ ? { ...acc, pathMatchRoutes: route }
25
+ : { filterMatchRoutes, pathMatchRoutes };
26
26
  },
27
27
  { filterMatchRoutes: null, pathMatchRoutes: null }
28
28
  ),
@@ -0,0 +1,112 @@
1
+ import _ from "lodash/fp";
2
+ import { compile } from "path-to-regexp";
3
+ import { mutate } from "swr";
4
+ import useSWR from "swr";
5
+ import useSWRMutations from "swr/mutation";
6
+ import {
7
+ apiJson,
8
+ apiJsonPatch,
9
+ apiJsonPost,
10
+ apiJsonDelete,
11
+ } from "@truedat/core/services/api";
12
+ import { API_HIERARCHIES, API_HIERARCHY } from "@truedat/core/api";
13
+
14
+ const newHierarchy = {
15
+ name: "",
16
+ description: null,
17
+ nodes: [],
18
+ };
19
+
20
+ export const useHierarchies = () => {
21
+ const toApiPath = compile(API_HIERARCHIES);
22
+ const url = toApiPath();
23
+ const { data, error } = useSWR(url, apiJson);
24
+ return { data: data?.data?.data, error, loading: !error && !data };
25
+ };
26
+
27
+ export const useInitialHiearchy = () => {
28
+ return {
29
+ data: newHierarchy,
30
+ error: null,
31
+ loading: false,
32
+ };
33
+ };
34
+
35
+ export const useHierarchy = (id) => {
36
+ const toApiPath = compile(API_HIERARCHY);
37
+ const url = toApiPath({ id: `${id}` });
38
+ const { data, error } = useSWR(url, apiJson);
39
+ const back_hierarchy = data?.data?.data;
40
+ const front_hierarchy = toFront(back_hierarchy);
41
+ return { data: front_hierarchy, error, loading: !error && !data };
42
+ };
43
+
44
+ export const useHierarchyPatch = (id, callback) => {
45
+ const toApiPath = compile(API_HIERARCHY);
46
+ const url = toApiPath({ id: `${id}` });
47
+ return useSWRMutations(url, (url, { arg }) =>
48
+ apiJsonPatch(url, toBack(arg)).then(
49
+ ({ data }) =>
50
+ mutate(API_HIERARCHIES) && mutate(url, data) && callback(data?.data)
51
+ )
52
+ );
53
+ };
54
+
55
+ export const useHierarchyPost = (callback) => {
56
+ return useSWRMutations(API_HIERARCHIES, (url, { arg }) =>
57
+ apiJsonPost(url, toBack(arg)).then(
58
+ ({ data }) => mutate(API_HIERARCHIES) && callback(data?.data)
59
+ )
60
+ );
61
+ };
62
+
63
+ export const useHierarchyDelete = (id, callback) => {
64
+ const toApiPath = compile(API_HIERARCHY);
65
+ const url = toApiPath({ id: `${id}` });
66
+ return useSWRMutations(url, (url, { arg }) =>
67
+ apiJsonDelete(url, toBack(arg)).then(
68
+ ({ data }) => mutate(API_HIERARCHIES) && callback(data?.data)
69
+ )
70
+ );
71
+ };
72
+
73
+ const toFront = (hierarchy) => {
74
+ return hierarchy
75
+ ? {
76
+ ...hierarchy,
77
+ nodes: _.flow(
78
+ _.pathOr([], "nodes"),
79
+ _.map((node) => {
80
+ return {
81
+ id: node.node_id,
82
+ key: node.key,
83
+ parentId: node.parent_id,
84
+ name: node.name,
85
+ description: node.description,
86
+ };
87
+ })
88
+ )(hierarchy),
89
+ }
90
+ : hierarchy;
91
+ };
92
+
93
+ const toBack = (hierarchy) => {
94
+ return hierarchy
95
+ ? {
96
+ hierarchy: {
97
+ ...hierarchy,
98
+ nodes: _.flow(
99
+ _.pathOr([], "nodes"),
100
+ _.map((node) => {
101
+ return {
102
+ node_id: node.id,
103
+ parent_id: node.parentId,
104
+ name: node.name,
105
+ description: node.description,
106
+ };
107
+ })
108
+ )(hierarchy),
109
+ },
110
+ }
111
+ : hierarchy;
112
+ };
@@ -38,6 +38,6 @@ export const useLocalesUpdate = () => {
38
38
  return useSWRMutations("api/locales", (_url, { arg }) => {
39
39
  const { id, locale } = arg;
40
40
  const toApiPath = compile(API_LOCALE);
41
- return apiJsonPatch(toApiPath({ id }), { id, locale });
41
+ return apiJsonPatch(toApiPath({ id: `${id}` }), { id, locale });
42
42
  });
43
43
  };
@@ -20,7 +20,7 @@ export const useMessages = (lang) => {
20
20
  };
21
21
 
22
22
  export const useMessagePatch = (id) => {
23
- const url = toApiMessagePath({ id });
23
+ const url = toApiMessagePath({ id: `${id}` });
24
24
  return useSWRMutations(url, (url, { arg }) =>
25
25
  apiJsonPatch(url, arg).then(() => mutate(API_LOCALES))
26
26
  );
@@ -1,7 +1,7 @@
1
1
  import _ from "lodash/fp";
2
- import { useRouteMatch } from "react-router-dom";
2
+ import { useLocation } from "react-router";
3
3
 
4
- export const usePath = (props) => {
5
- const match = useRouteMatch(props);
6
- return _.prop("path")(match);
4
+ export const usePath = () => {
5
+ const { pathname } = useLocation();
6
+ return pathname;
7
7
  };
@@ -39,6 +39,6 @@ export const useUserFiltersCreate = (type) => {
39
39
  };
40
40
 
41
41
  export const useUserFiltersDelete = (id, type) => {
42
- const url = compile(API_USER_FILTER)({ id, type });
42
+ const url = compile(API_USER_FILTER)({ id: `${id}`, type });
43
43
  return useSWRMutations(url, (url, { arg }) => apiJsonDelete(url, arg));
44
44
  };
@@ -1,6 +1,6 @@
1
1
  import _ from "lodash/fp";
2
2
  import PropTypes from "prop-types";
3
- import React, { useState } from "react";
3
+ import { useState } from "react";
4
4
  import { Table, Input } from "semantic-ui-react";
5
5
 
6
6
  const MAX_LENGTH = 255;
@@ -1,24 +1,19 @@
1
1
  import React from "react";
2
- import { Route, Switch } from "react-router-dom";
3
- import { Unauthorized } from "@truedat/core/components";
4
- import { useAuthorized } from "@truedat/core/hooks";
5
- import { I18N, I18N_MESSAGES, I18N_MESSAGES_NEW } from "@truedat/core/routes";
2
+ import { Route, Routes } from "react-router";
3
+ import { ProtectedRoute } from "@truedat/core/router";
6
4
  import Messages from "./Messages";
7
5
  import NewMessage from "./NewMessage";
8
6
 
9
- export const AuthorizedI18nRoutes = () => (
10
- <Switch>
11
- <Route exact path={I18N_MESSAGES} render={() => <Messages />} />
12
- <Route exact path={I18N_MESSAGES_NEW} render={() => <NewMessage />} />
13
- </Switch>
14
- );
15
-
16
7
  export default function I18nRoutes() {
17
- const authorized = useAuthorized();
18
8
  return (
19
- <Route
20
- path={I18N}
21
- render={() => (authorized ? <AuthorizedI18nRoutes /> : <Unauthorized />)}
22
- />
9
+ <Routes>
10
+ <Route path={"i18n"} element={<ProtectedRoute />}>
11
+ <Route path={"messages"}>
12
+ <Route index element={<Messages />} />
13
+ <Route path={"new"} element={<NewMessage />} />
14
+ </Route>
15
+ </Route>
16
+ <Route path="*" element={null} />
17
+ </Routes>
23
18
  );
24
19
  }
@@ -1,12 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import React, {
3
- useCallback,
4
- useContext,
5
- createContext,
6
- useEffect,
7
- useMemo,
8
- useState,
9
- } from "react";
2
+ import { use, createContext, useEffect, useState } from "react";
10
3
  import { IntlProvider } from "react-intl";
11
4
  import PropTypes from "prop-types";
12
5
  import { Loading } from "@truedat/core/components";
@@ -26,10 +19,11 @@ const defaultContext = {
26
19
  localesError: null,
27
20
  mutate: () => {},
28
21
  setAltLang: () => {},
22
+ onIntlError: () => {},
29
23
  };
30
24
 
31
25
  export const LanguageContext = createContext(defaultContext);
32
- export const useLanguage = () => useContext(LanguageContext);
26
+ export const useLanguage = () => use(LanguageContext);
33
27
 
34
28
  const LanguageContextProvider = ({ children, defaultMessages }) => {
35
29
  const {
@@ -45,106 +39,70 @@ const LanguageContextProvider = ({ children, defaultMessages }) => {
45
39
  } = useLocales(false);
46
40
 
47
41
  const loading = loadingLocales || loadingAllLocales;
48
- const mutate = useCallback(() => {
42
+ const mutate = () => {
49
43
  mutateLocales();
50
44
  mutateAllLocales();
51
- }, [mutateLocales, mutateAllLocales]);
45
+ };
52
46
 
53
47
  const langsOf = _.map(({ lang }) => lang);
54
- const enabledLangs = useMemo(
55
- () =>
56
- _.flow(
57
- _.filter(({ is_enabled }) => is_enabled),
58
- langsOf
59
- )(locales),
60
- [locales, langsOf]
61
- );
62
-
63
- const altLangs = useMemo(
64
- () =>
65
- _.flow(
66
- _.filter(({ is_enabled, is_default }) => is_enabled && !is_default),
67
- _.orderBy(["is_required", "lang"], ["desc", "asc"]),
68
- langsOf
69
- )(locales),
70
- [locales, langsOf]
71
- );
72
-
73
- const requiredLangs = useMemo(
74
- () =>
75
- _.flow(
76
- _.filter(({ is_required }) => is_required),
77
- langsOf
78
- )(locales),
79
- [locales, langsOf]
80
- );
81
-
82
- const defaultLang = useMemo(
83
- () =>
84
- _.flow(
85
- _.find(({ is_default }) => is_default),
86
- _.prop("lang")
87
- )(locales),
88
- [locales]
89
- );
48
+ const enabledLangs = _.flow(
49
+ _.filter(({ is_enabled }) => is_enabled),
50
+ langsOf
51
+ )(locales);
52
+
53
+ const altLangs = _.flow(
54
+ _.filter(({ is_enabled, is_default }) => is_enabled && !is_default),
55
+ _.orderBy(["is_required", "lang"], ["desc", "asc"]),
56
+ langsOf
57
+ )(locales);
58
+
59
+ const requiredLangs = _.flow(
60
+ _.filter(({ is_required }) => is_required),
61
+ langsOf
62
+ )(locales);
63
+
64
+ const defaultLang = _.flow(
65
+ _.find(({ is_default }) => is_default),
66
+ _.prop("lang"),
67
+ _.defaultTo("en")
68
+ )(locales);
90
69
 
91
70
  const mapMessages = _.flow(
92
71
  _.map(({ message_id, definition }) => [message_id, definition]),
93
72
  _.fromPairs
94
73
  );
95
74
 
96
- const messages = useMemo(
97
- () =>
98
- _.flow(
99
- _.map(({ lang, messages }) => [lang, mapMessages(messages)]),
100
- _.fromPairs
101
- )(locales),
102
- [locales, mapMessages]
103
- );
75
+ const messages = _.flow(
76
+ _.map(({ lang, messages }) => [lang, mapMessages(messages)]),
77
+ _.fromPairs
78
+ )(locales);
104
79
 
105
80
  const [lang, setLang] = useState(defaultLang);
106
81
  const [altLang, setAltLang] = useState();
107
82
 
108
- const getMessagesForLang = useCallback(
109
- (requestedLang) => {
110
- if (loading || !requestedLang) return null;
111
- return messages[requestedLang] || defaultMessages[requestedLang];
112
- },
113
- [loading, messages, defaultMessages]
114
- );
115
-
116
- const context = useMemo(
117
- () => ({
118
- defaultLang,
119
- altLangs,
120
- requiredLangs,
121
- enabledLangs,
122
- isMultilingual: enabledLangs.length > 1,
123
- setAltLang,
124
- altLang,
125
- getMessagesForLang,
126
- lang,
127
- loading,
128
- allLocales,
129
- locales,
130
- localesError,
131
- mutate,
132
- }),
133
- [
134
- defaultLang,
135
- altLangs,
136
- allLocales,
137
- locales,
138
- enabledLangs,
139
- altLang,
140
- requiredLangs,
141
- lang,
142
- loading,
143
- getMessagesForLang,
144
- localesError,
145
- mutate,
146
- ]
147
- );
83
+ const getMessagesForLang = (requestedLang) => {
84
+ if (loading || !requestedLang) return null;
85
+ return messages[requestedLang] || defaultMessages[requestedLang];
86
+ };
87
+
88
+ const context = {
89
+ defaultLang,
90
+ altLangs,
91
+ requiredLangs,
92
+ enabledLangs,
93
+ isMultilingual: enabledLangs.length > 1,
94
+ setAltLang,
95
+ altLang,
96
+ getMessagesForLang,
97
+ lang,
98
+ loading,
99
+ allLocales,
100
+ locales,
101
+ localesError,
102
+ mutate,
103
+ // onIntlError: console.error,
104
+ onIntlError: () => {},
105
+ };
148
106
 
149
107
  useEffect(() => {
150
108
  if (enabledLangs.length > 0) {
@@ -169,11 +127,7 @@ const LanguageContextProvider = ({ children, defaultMessages }) => {
169
127
 
170
128
  if (localesError) return <div>Error loading language data</div>;
171
129
 
172
- return (
173
- <LanguageContext.Provider value={context}>
174
- {children}
175
- </LanguageContext.Provider>
176
- );
130
+ return <LanguageContext value={context}>{children}</LanguageContext>;
177
131
  };
178
132
 
179
133
  LanguageContextProvider.propTypes = {
@@ -182,11 +136,12 @@ LanguageContextProvider.propTypes = {
182
136
  };
183
137
 
184
138
  export const I18nProvider = ({ children, lang }) => {
185
- const { lang: contextLang, getMessagesForLang } = useLanguage();
139
+ const { lang: contextLang, getMessagesForLang, onIntlError } = useLanguage();
186
140
  const currentLang = lang || contextLang;
187
141
 
188
142
  return (
189
143
  <IntlProvider
144
+ onError={onIntlError}
190
145
  locale={currentLang}
191
146
  defaultLocale={currentLang}
192
147
  messages={getMessagesForLang(currentLang)}