@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,5 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import React, { useState } from "react";
2
+ import { useState } from "react";
3
3
  import PropTypes from "prop-types";
4
4
  import { useIntl } from "react-intl";
5
5
  import {
@@ -83,7 +83,6 @@ const LanguageRow = ({
83
83
  />
84
84
  </TableCell>
85
85
  ) : null}
86
-
87
86
  <TableCell>
88
87
  {!is_default ? (
89
88
  <ConfirmModal
@@ -187,13 +186,15 @@ const Languages = () => {
187
186
  </Button>
188
187
  </Form>
189
188
  <Dimmer.Dimmable dimmed={loading}>
190
- <Dimmer active={loading} inverted>
191
- <Loader />
192
- </Dimmer>
189
+ {loading ? (
190
+ <Dimmer active inverted>
191
+ <Loader />
192
+ </Dimmer>
193
+ ) : null}
193
194
  <Table collapsing striped>
194
195
  <TableHeader>
195
196
  <TableRow>
196
- <TableCell></TableCell>
197
+ <TableCell />
197
198
  <TableCell textAlign="center">
198
199
  {formatMessage({
199
200
  id: "i18n.messages.locale.required",
@@ -206,7 +207,7 @@ const Languages = () => {
206
207
  })}
207
208
  </TableCell>
208
209
  ) : null}
209
- <TableCell></TableCell>
210
+ <TableCell />
210
211
  </TableRow>
211
212
  </TableHeader>
212
213
  <TableBody>
@@ -1,6 +1,5 @@
1
1
  import _ from "lodash/fp";
2
2
  import PropTypes from "prop-types";
3
- import React from "react";
4
3
  import { useForm, Controller } from "react-hook-form";
5
4
  import { useIntl } from "react-intl";
6
5
  import { Button, Form, Segment, Header, Loader } from "semantic-ui-react";
@@ -14,15 +13,13 @@ export const LangForm = ({
14
13
  formatMessage,
15
14
  }) => {
16
15
  return (
17
- <Segment>
18
- <Header
16
+ (<Segment><Header
19
17
  as="h4"
20
18
  content={formatMessage({
21
19
  id: `i18n.messages.locale.${lang}`,
22
20
  defaultMessage: `${name} ( ${local_name} )`,
23
21
  })}
24
- />
25
- <Controller
22
+ /><Controller
26
23
  control={control}
27
24
  name={`langs.${id}.definition`}
28
25
  rules={{
@@ -45,8 +42,7 @@ export const LangForm = ({
45
42
  required
46
43
  />
47
44
  )}
48
- />
49
- <Controller
45
+ /><Controller
50
46
  control={control}
51
47
  name={`langs.${id}.description`}
52
48
  render={({ field: { onBlur, onChange, value } }) => (
@@ -61,8 +57,7 @@ export const LangForm = ({
61
57
  value={value || ""}
62
58
  />
63
59
  )}
64
- />
65
- </Segment>
60
+ /></Segment>)
66
61
  );
67
62
  };
68
63
 
@@ -86,8 +81,7 @@ export const MessageForm = ({ onSubmit, isSubmitting }) => {
86
81
  const { errors, isDirty, isValid } = formState;
87
82
 
88
83
  return (
89
- <Form onSubmit={handleSubmit(onSubmit)}>
90
- <Controller
84
+ (<Form onSubmit={handleSubmit(onSubmit)}><Controller
91
85
  control={control}
92
86
  name="message_id"
93
87
  rules={{
@@ -110,9 +104,7 @@ export const MessageForm = ({ onSubmit, isSubmitting }) => {
110
104
  required
111
105
  />
112
106
  )}
113
- />
114
-
115
- {_.flow(
107
+ />{_.flow(
116
108
  _.filter("is_enabled"),
117
109
  _.orderBy(
118
110
  ["is_default", "is_required", "lang"],
@@ -127,23 +119,17 @@ export const MessageForm = ({ onSubmit, isSubmitting }) => {
127
119
  formatMessage={formatMessage}
128
120
  />
129
121
  ))
130
- )(locales)}
131
-
132
- <div className="actions">
133
- <Button
122
+ )(locales)}<div className="actions"><Button
134
123
  floated="right"
135
124
  type="submit"
136
125
  primary
137
126
  loading={isSubmitting}
138
127
  disabled={isSubmitting || !isDirty || !isValid}
139
128
  content={formatMessage({ id: "actions.save" })}
140
- />
141
- <HistoryBackButton
129
+ /><HistoryBackButton
142
130
  content={formatMessage({ id: "actions.cancel" })}
143
131
  disabled={isSubmitting}
144
- />
145
- </div>
146
- </Form>
132
+ /></div></Form>)
147
133
  );
148
134
  };
149
135
 
@@ -1,6 +1,7 @@
1
1
  import _ from "lodash/fp";
2
- import React, { useState } from "react";
3
- import { Link, useLocation, useHistory } from "react-router-dom";
2
+ import { useState } from "react";
3
+ import { Link, useLocation } from "react-router";
4
+ import { useNavigate } from "react-router";
4
5
  import { useIntl, FormattedMessage } from "react-intl";
5
6
  import {
6
7
  Button,
@@ -23,7 +24,7 @@ const ITEMS_PER_PAGE = 30;
23
24
  export function MessagesContent() {
24
25
  const { locales, loading } = useLanguage();
25
26
 
26
- const history = useHistory();
27
+ const navigate = useNavigate();
27
28
  const location = useLocation();
28
29
  const searchParams = new URLSearchParams(location.search);
29
30
  const selectedLang = searchParams.get("lang");
@@ -50,7 +51,7 @@ export function MessagesContent() {
50
51
  const handleSearch = (_e, data) => {
51
52
  const filter = _.propOr("", "value")(data);
52
53
  setPage(1);
53
- history.push(urlTo({ filter }));
54
+ navigate(urlTo({ filter }));
54
55
  };
55
56
 
56
57
  const messages = selectedLang
@@ -1,5 +1,4 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
2
  import PropTypes from "prop-types";
4
3
  import { useIntl } from "react-intl";
5
4
  import { Table, Header, Icon } from "semantic-ui-react";
@@ -1,8 +1,8 @@
1
- import React from "react";
2
1
  import PropTypes from "prop-types";
3
2
  import { Breadcrumb, Header, Container, Segment } from "semantic-ui-react";
4
3
  import { useIntl, FormattedMessage } from "react-intl";
5
- import { useHistory, Link } from "react-router-dom";
4
+ import { Link } from "react-router";
5
+ import { useNavigate } from "react-router";
6
6
  import { useMessagePost } from "@truedat/core/hooks";
7
7
  import { I18N_MESSAGES } from "@truedat/core/routes";
8
8
  import { useLanguage } from "./LangProvider";
@@ -12,13 +12,14 @@ const NewMessage = () => {
12
12
  const { formatMessage } = useIntl();
13
13
  const { trigger } = useMessagePost();
14
14
  const { mutate } = useLanguage();
15
- const history = useHistory();
15
+
16
+ const navigate = useNavigate();
16
17
 
17
18
  const onSubmit = (message) => {
18
19
  trigger({ message }).then(() => {
19
20
  mutate();
20
21
  });
21
- history.push(I18N_MESSAGES);
22
+ navigate(I18N_MESSAGES);
22
23
  };
23
24
 
24
25
  return (
@@ -1,24 +1,22 @@
1
- import React from "react";
2
1
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
2
+ import { render, waitForLoad } from "@truedat/test/render";
4
3
  import messages from "@truedat/core/messages";
5
4
  import EditableCell from "../EditableCell";
6
5
 
7
- const renderOpts = { messages };
8
-
9
6
  describe("<EditableCell />", () => {
10
7
  const onChange = jest.fn();
11
8
  const value = "value";
12
9
  const placeholder = "placeholder";
13
10
 
14
- it("matches the latest snapshot", () => {
11
+ it("matches the latest snapshot", async () => {
15
12
  const props = {
16
13
  onChange,
17
14
  value,
18
15
  placeholder,
19
16
  };
20
- const { container } = render(<EditableCell {...props} />, renderOpts);
21
- expect(container).toMatchSnapshot();
17
+ const rendered = render(<EditableCell {...props} />, { messages });
18
+ await waitForLoad(rendered);
19
+ expect(rendered.container).toMatchSnapshot();
22
20
  });
23
21
 
24
22
  it("clicking the cell will enter edition mode and match snapshot", async () => {
@@ -27,12 +25,12 @@ describe("<EditableCell />", () => {
27
25
  value,
28
26
  placeholder,
29
27
  };
30
- const { container, findByText } = render(
31
- <EditableCell {...props} />,
32
- renderOpts
33
- );
34
- userEvent.click(await findByText(value));
35
- expect(container).toMatchSnapshot();
28
+ const rendered = render(<EditableCell {...props} />, { messages });
29
+ await waitForLoad(rendered);
30
+
31
+ const user = userEvent.setup({ delay: null });
32
+ await user.click(await rendered.findByText(value));
33
+ expect(rendered.container).toMatchSnapshot();
36
34
  });
37
35
 
38
36
  it("on edition mode edition mode will call onChange on blur", async () => {
@@ -41,14 +39,14 @@ describe("<EditableCell />", () => {
41
39
  value,
42
40
  placeholder,
43
41
  };
44
- const { getByRole, findByText } = render(
45
- <EditableCell {...props} />,
46
- renderOpts
47
- );
48
- userEvent.click(await findByText(value));
42
+ const rendered = render(<EditableCell {...props} />, { messages });
43
+ await waitForLoad(rendered);
44
+
45
+ const user = userEvent.setup({ delay: null });
46
+ await user.click(await rendered.findByText(value));
49
47
 
50
- userEvent.type(getByRole("textbox", { type: /text/i }), "foo");
51
- userEvent.tab(getByRole("textbox", { type: /text/i }));
48
+ await user.type(rendered.getByRole("textbox", { type: /text/i }), "foo");
49
+ await user.tab();
52
50
  expect(onChange).toHaveBeenCalledWith("valuefoo");
53
51
  });
54
52
  });
@@ -1,14 +1,48 @@
1
1
  import React from "react";
2
- import { render } from "@truedat/test/render";
2
+ import { render, waitForLoad } from "@truedat/test/render";
3
3
  import I18nRoutes from "../I18nRoutes";
4
+ import { useAuthorized } from "@truedat/core/hooks/useAuthorized";
4
5
 
5
- jest.mock("@truedat/core/hooks", () => ({
6
+ jest.mock("@truedat/core/hooks/useAuthorized", () => ({
6
7
  useAuthorized: jest.fn(() => true),
7
8
  }));
8
9
 
10
+ // Mock all components used in I18nRoutes
11
+ jest.mock("../Messages", () => () => <div>Messages</div>);
12
+ jest.mock("../NewMessage", () => () => <div>NewMessage</div>);
13
+ jest.mock("@truedat/core/router/Unauthorized", () => () => (
14
+ <div>Unauthorized</div>
15
+ ));
16
+
9
17
  describe("<I18nRoutes />", () => {
10
- it("matches the latest snapshot", () => {
11
- const { container } = render(<I18nRoutes />);
12
- expect(container).toMatchSnapshot();
18
+ it("renders correctly with default route", async () => {
19
+ const rendered = render(<I18nRoutes />);
20
+ await waitForLoad(rendered);
21
+ expect(rendered.container).toMatchSnapshot();
22
+ });
23
+
24
+ it("renders correctly with i18n/messages route", async () => {
25
+ const rendered = render(<I18nRoutes />, {
26
+ routes: ["/i18n/messages"],
27
+ });
28
+ await waitForLoad(rendered);
29
+ expect(rendered.container).toMatchSnapshot();
30
+ });
31
+
32
+ it("renders correctly with i18n/messages/new route", async () => {
33
+ const rendered = render(<I18nRoutes />, {
34
+ routes: ["/i18n/messages/new"],
35
+ });
36
+ await waitForLoad(rendered);
37
+ expect(rendered.container).toMatchSnapshot();
38
+ });
39
+
40
+ it("renders unauthorized component when not authorized", async () => {
41
+ useAuthorized.mockReturnValueOnce(false);
42
+ const rendered = render(<I18nRoutes />, {
43
+ routes: ["/i18n/messages"],
44
+ });
45
+ await waitForLoad(rendered);
46
+ expect(rendered.container).toMatchSnapshot();
13
47
  });
14
48
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import messages from "@truedat/core/messages";
4
3
  import MessageForm from "../MessageForm";
@@ -1,31 +1,19 @@
1
- import React from "react";
2
- import { render } from "@truedat/test/render";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { LangProviderWrapper } from "@truedat/core/i18n";
4
3
  import Messages from "../Messages";
5
4
 
6
- const renderOpts = {
7
- messages: {
8
- en: {
9
- "i18n.actions.refreshMessages": "Refresh messages",
10
- },
11
- },
12
- };
13
-
14
5
  jest.mock("@truedat/core/hooks", () => ({
15
6
  useMessagePatch: jest.fn(() => ({ trigger: jest.fn() })),
16
7
  }));
17
8
 
18
- const renderComponent = () =>
19
- render(
20
- <LangProviderWrapper langs={["es"]}>
21
- <Messages />
22
- </LangProviderWrapper>,
23
- renderOpts
24
- );
25
-
26
9
  describe("<Messages />", () => {
27
- it("matches the latest snapshot", () => {
28
- const { container } = renderComponent();
29
- expect(container).toMatchSnapshot();
10
+ it("matches the latest snapshot", async () => {
11
+ const rendered = render(
12
+ <LangProviderWrapper langs={["es"]}>
13
+ <Messages />
14
+ </LangProviderWrapper>,
15
+ );
16
+ await waitForLoad(rendered);
17
+ expect(rendered.container).toMatchSnapshot();
30
18
  });
31
19
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import messages from "@truedat/core/messages";
4
3
  import NewMessage from "../NewMessage";
@@ -1,3 +1,27 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`<I18nRoutes /> matches the latest snapshot 1`] = `<div />`;
3
+ exports[`<I18nRoutes /> renders correctly with default route 1`] = `<div />`;
4
+
5
+ exports[`<I18nRoutes /> renders correctly with i18n/messages route 1`] = `
6
+ <div>
7
+ <div>
8
+ Messages
9
+ </div>
10
+ </div>
11
+ `;
12
+
13
+ exports[`<I18nRoutes /> renders correctly with i18n/messages/new route 1`] = `
14
+ <div>
15
+ <div>
16
+ NewMessage
17
+ </div>
18
+ </div>
19
+ `;
20
+
21
+ exports[`<I18nRoutes /> renders unauthorized component when not authorized 1`] = `
22
+ <div>
23
+ <div>
24
+ Unauthorized
25
+ </div>
26
+ </div>
27
+ `;
@@ -36,6 +36,7 @@ exports[`<MessageForm /> matches the latest snapshot 1`] = `
36
36
  </button>
37
37
  <a
38
38
  class="ui secondary button"
39
+ data-discover="true"
39
40
  href="/"
40
41
  role="button"
41
42
  >
@@ -29,10 +29,11 @@ exports[`<Messages /> matches the latest snapshot 1`] = `
29
29
  <button
30
30
  class="ui right floated button"
31
31
  >
32
- Refresh messages
32
+ i18n.actions.refreshMessages
33
33
  </button>
34
34
  <a
35
35
  class="ui primary right floated button"
36
+ data-discover="true"
36
37
  href="/i18n/messages/new"
37
38
  role="button"
38
39
  >
@@ -47,15 +48,17 @@ exports[`<Messages /> matches the latest snapshot 1`] = `
47
48
  >
48
49
  <a
49
50
  class="active item"
51
+ data-discover="true"
50
52
  href="/i18n/messages"
51
53
  >
52
54
  i18n.messages.locale.manage
53
55
  </a>
54
56
  <a
55
57
  class="item"
58
+ data-discover="true"
56
59
  href="/i18n/messages?lang=es"
57
60
  >
58
- undefined ( undefined )
61
+ es ( es )
59
62
  </a>
60
63
  </div>
61
64
  <div
@@ -114,17 +117,6 @@ exports[`<Messages /> matches the latest snapshot 1`] = `
114
117
  <div
115
118
  class="dimmable"
116
119
  >
117
- <div
118
- class="ui inverted dimmer"
119
- >
120
- <div
121
- class="content"
122
- >
123
- <div
124
- class="ui loader"
125
- />
126
- </div>
127
- </div>
128
120
  <table
129
121
  class="ui collapsing striped table"
130
122
  >
@@ -7,6 +7,7 @@ exports[`<NewMessage /> matches the latest snapshot 1`] = `
7
7
  >
8
8
  <a
9
9
  class="section"
10
+ data-discover="true"
10
11
  href="/i18n/messages"
11
12
  >
12
13
  Translations
@@ -71,6 +72,7 @@ exports[`<NewMessage /> matches the latest snapshot 1`] = `
71
72
  </button>
72
73
  <a
73
74
  class="ui secondary button"
75
+ data-discover="true"
74
76
  href="/"
75
77
  role="button"
76
78
  >
@@ -10,39 +10,42 @@ describe("reducers: comments", () => {
10
10
 
11
11
  it("should handle the clearComments.TRIGGER action", () => {
12
12
  expect(comments(fooState, { type: clearComments.TRIGGER })).toBe(
13
- initialState
13
+ initialState,
14
14
  );
15
15
  });
16
16
 
17
17
  it("should handle the fetchComments.TRIGGER action", () => {
18
18
  expect(comments(fooState, { type: fetchComments.TRIGGER })).toBe(
19
- initialState
19
+ initialState,
20
20
  );
21
21
  });
22
22
 
23
23
  it("should handle the fetchComments.SUCCESS action", () => {
24
24
  const someComments = [
25
25
  { content: "My first comment", resource_id: 2 },
26
- { content: "My second comment", resource_id: 2 }
26
+ { content: "My second comment", resource_id: 2 },
27
27
  ];
28
28
 
29
29
  const data = someComments;
30
30
 
31
31
  expect(
32
- comments(fooState, { type: fetchComments.SUCCESS, payload: { data } })
32
+ comments(fooState, { type: fetchComments.SUCCESS, payload: { data } }),
33
33
  ).toMatchObject(someComments);
34
34
  });
35
35
 
36
36
  it("should handle the createComment.SUCCESS action", () => {
37
37
  const someComments = [
38
38
  { content: "My first comment", resource_id: 2 },
39
- { content: "My second comment", resource_id: 2 }
39
+ { content: "My second comment", resource_id: 2 },
40
40
  ];
41
41
  const newComment = { content: "My third comment", resource_id: 2 };
42
42
  const data = newComment;
43
43
  const resultState = [newComment, ...someComments];
44
44
  expect(
45
- comments(someComments, { type: createComment.SUCCESS, payload: { data } })
45
+ comments(someComments, {
46
+ type: createComment.SUCCESS,
47
+ payload: { data },
48
+ }),
46
49
  ).toMatchObject(resultState);
47
50
  });
48
51
 
@@ -11,13 +11,16 @@ describe("reducers: commentsLoading", () => {
11
11
 
12
12
  it("should be true after receiving the fetchComments.REQUEST action", () => {
13
13
  expect(
14
- commentsResource(fooState, { type: fetchComments.REQUEST, payload: data })
14
+ commentsResource(fooState, {
15
+ type: fetchComments.REQUEST,
16
+ payload: data,
17
+ }),
15
18
  ).toMatchObject(data);
16
19
  });
17
20
 
18
21
  it("should be false after receiving the clearComments.TRIGGER action", () => {
19
22
  expect(
20
- commentsResource(fooState, { type: clearComments.TRIGGER })
23
+ commentsResource(fooState, { type: clearComments.TRIGGER }),
21
24
  ).toMatchObject({});
22
25
  });
23
26
  });
@@ -12,7 +12,7 @@ describe("reducers: coreMessage", () => {
12
12
 
13
13
  it("should handle the login.TRIGGER action", () => {
14
14
  expect(coreMessage(fooState, { type: dismissAlert.TRIGGER })).toEqual(
15
- initialState
15
+ initialState,
16
16
  );
17
17
  });
18
18
  });
@@ -11,7 +11,7 @@ describe("reducers: dashboardDomains", () => {
11
11
 
12
12
  it("should handle the clearDashboardDomains.TRIGGER action", () => {
13
13
  expect(
14
- dashboardDomains(fooState, { type: clearDashboardDomains.TRIGGER })
14
+ dashboardDomains(fooState, { type: clearDashboardDomains.TRIGGER }),
15
15
  ).toEqual(initialState);
16
16
  });
17
17
 
@@ -21,8 +21,8 @@ describe("reducers: dashboardDomains", () => {
21
21
  expect(
22
22
  dashboardDomains(fooState, {
23
23
  type: setDashboardDomains.TRIGGER,
24
- payload: domains
25
- })
24
+ payload: domains,
25
+ }),
26
26
  ).toMatchObject(domains);
27
27
  });
28
28
 
@@ -32,8 +32,8 @@ describe("reducers: dashboardDomains", () => {
32
32
  expect(
33
33
  dashboardDomains(domains, {
34
34
  type: setDashboardDomains.TRIGGER,
35
- payload: domains
36
- })
35
+ payload: domains,
36
+ }),
37
37
  ).toEqual(domains);
38
38
  });
39
39
  });
@@ -0,0 +1,42 @@
1
+ import { fetchSystems, clearSystems } from "../../routines";
2
+ import { systems } from "..";
3
+
4
+ const fooState = { foo: "bar" };
5
+
6
+ describe("reducers: systems", () => {
7
+ const initialState = [];
8
+
9
+ it("should provide the initial state", () => {
10
+ expect(systems(undefined, {})).toEqual(initialState);
11
+ });
12
+
13
+ it("should handle the fetchSystems.TRIGGER action", () => {
14
+ expect(systems(fooState, { type: fetchSystems.TRIGGER })).toEqual(
15
+ initialState,
16
+ );
17
+ });
18
+
19
+ it("should handle the clearSystems.TRIGGER action", () => {
20
+ expect(systems(fooState, { type: clearSystems.TRIGGER })).toEqual(
21
+ initialState,
22
+ );
23
+ });
24
+
25
+ it("should handle the fetchSystems.SUCCESS action", () => {
26
+ const someSystems = [
27
+ { id: 1, name: "System 1", description: "Desc 1" },
28
+ { id: 2, name: "System 2", description: "Desc 2" },
29
+ ];
30
+
31
+ expect(
32
+ systems(fooState, {
33
+ type: fetchSystems.SUCCESS,
34
+ payload: { data: someSystems },
35
+ }),
36
+ ).toEqual(someSystems);
37
+ });
38
+
39
+ it("should ignore unknown actions", () => {
40
+ expect(systems(fooState, { type: "FOO" })).toBe(fooState);
41
+ });
42
+ });
@@ -0,0 +1,22 @@
1
+ import { fetchSystems } from "../../routines";
2
+ import { systemsLoading } from "..";
3
+
4
+ const fooState = { foo: "bar" };
5
+
6
+ describe("reducers: systemsLoading", () => {
7
+ it("should provide the initial state", () => {
8
+ expect(systemsLoading(undefined, {})).toBe(false);
9
+ });
10
+
11
+ it("should be true after receiving the fetchSystems.TRIGGER action", () => {
12
+ expect(systemsLoading(false, { type: fetchSystems.TRIGGER })).toBe(true);
13
+ });
14
+
15
+ it("should be false after receiving the fetchSystems.FULFILL action", () => {
16
+ expect(systemsLoading(true, { type: fetchSystems.FULFILL })).toBe(false);
17
+ });
18
+
19
+ it("should ignore unhandled actions", () => {
20
+ expect(systemsLoading(fooState, { type: "FOO" })).toBe(fooState);
21
+ });
22
+ });