@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,8 @@
1
- import React from "react";
1
+ import { useState, Fragment } from "react";
2
2
  import PropTypes from "prop-types";
3
3
  import { Modal, Button, Icon, Container, List } from "semantic-ui-react";
4
4
  import { FormattedMessage } from "react-intl";
5
- import Dropzone from "react-dropzone";
5
+ import { useDropzone } from "react-dropzone";
6
6
 
7
7
  const dropzoneStyle = {
8
8
  width: "100%",
@@ -68,189 +68,165 @@ const getFormData = (files, param) =>
68
68
  return acc;
69
69
  }, new FormData());
70
70
 
71
- export class UploadModal extends React.Component {
72
- static propTypes = {
73
- open: PropTypes.bool,
74
- onOpen: PropTypes.func,
75
- icon: PropTypes.string,
76
- header: PropTypes.any,
77
- subHeader: PropTypes.any,
78
- content: PropTypes.any,
79
- handleSubmit: PropTypes.func,
80
- onClose: PropTypes.func,
81
- trigger: PropTypes.element,
82
- size: PropTypes.string,
83
- accept: PropTypes.string,
84
- param: PropTypes.string,
85
- extraAction: PropTypes.object,
71
+ export const UploadModal = (props) => {
72
+ const {
73
+ open,
74
+ onOpen,
75
+ icon,
76
+ header,
77
+ subHeader,
78
+ content,
79
+ onClose,
80
+ handleSubmit,
81
+ trigger,
82
+ size,
83
+ accept,
84
+ param,
85
+ extraAction,
86
+ } = props;
87
+
88
+ const [files, setFiles] = useState([]);
89
+
90
+ const onDrop = (acceptedFiles) => {
91
+ setFiles([acceptedFiles[0]]);
86
92
  };
87
93
 
88
- constructor(props) {
89
- super(props);
90
- this.state = { files: [], dropzoneActive: false };
91
- this.onDrop = this.onDrop.bind(this);
92
- this.onDragEnter = this.onDragEnter.bind(this);
93
- this.onDragLeave = this.onDragLeave.bind(this);
94
- }
94
+ const {
95
+ getRootProps,
96
+ getInputProps,
97
+ isDragActive,
98
+ open: openFileDialog,
99
+ } = useDropzone({
100
+ onDrop,
101
+ accept,
102
+ noClick: true,
103
+ });
95
104
 
96
- onDragEnter() {
97
- this.setState({
98
- dropzoneActive: true,
99
- });
100
- }
105
+ const clearFiles = () => setFiles([]);
101
106
 
102
- onDragLeave() {
103
- this.setState({
104
- dropzoneActive: false,
105
- });
106
- }
107
+ const submitForm = () => {
108
+ handleSubmit(getFormData(files, param));
109
+ clearFiles();
110
+ };
107
111
 
108
- onDrop(files) {
109
- this.setState({
110
- files: [files[0]],
111
- dropzoneActive: false,
112
- });
113
- }
114
- render() {
115
- const {
116
- open,
117
- onOpen,
118
- icon,
119
- header,
120
- subHeader,
121
- content,
122
- onClose,
123
- handleSubmit,
124
- trigger,
125
- size,
126
- accept,
127
- param,
128
- extraAction,
129
- } = this.props;
130
- const { dropzoneActive, files } = this.state;
131
- // eslint-disable-next-line fp/no-let
132
- let dropzoneRef;
112
+ const handleExtraAction = () => {
113
+ if (extraAction) {
114
+ extraAction.onClick(getFormData(files, param));
115
+ clearFiles();
116
+ }
117
+ };
133
118
 
134
- return (
135
- <React.Fragment>
136
- <Modal
137
- icon={icon}
138
- open={open}
139
- role="presentation"
140
- onOpen={onOpen}
141
- onClose={onClose}
142
- actions={actions(
143
- () => {
144
- handleSubmit(getFormData(files, param));
145
- this.setState({ files: [] });
146
- },
147
- files <= 0,
148
- extraAction
149
- ? {
150
- ...extraAction,
151
- onClick: () => {
152
- extraAction.onClick(getFormData(files, param));
153
- this.setState({ files: [] });
154
- },
155
- }
156
- : false
157
- )}
158
- trigger={trigger}
159
- closeIcon
160
- size={size || "small"}
161
- header={<CoolHeader header={header} subHeader={subHeader} />}
162
- content={
163
- content.type === "string" ? (
164
- content
165
- ) : (
166
- <Modal.Content>
167
- <Dropzone
168
- data-testid="fileDropZone"
169
- disableClick
170
- accept={accept}
171
- style={dropzoneActive ? dropzoneStyleHover : dropzoneStyle}
172
- ref={(node) => {
173
- // eslint-disable-next-line fp/no-mutation
174
- dropzoneRef = node;
175
- }}
176
- onDrop={this.onDrop}
177
- onDragEnter={this.onDragEnter}
178
- onDragLeave={this.onDragLeave}
119
+ return (
120
+ <Fragment>
121
+ <Modal
122
+ icon={icon}
123
+ open={open}
124
+ role="presentation"
125
+ onOpen={onOpen}
126
+ onClose={onClose}
127
+ actions={actions(
128
+ submitForm,
129
+ files.length <= 0,
130
+ extraAction
131
+ ? {
132
+ ...extraAction,
133
+ onClick: handleExtraAction,
134
+ }
135
+ : false
136
+ )}
137
+ trigger={trigger}
138
+ closeIcon
139
+ size={size || "small"}
140
+ header={<CoolHeader header={header} subHeader={subHeader} />}
141
+ content={
142
+ content.type === "string" ? (
143
+ content
144
+ ) : (
145
+ <Modal.Content>
146
+ <div
147
+ {...getRootProps()}
148
+ style={isDragActive ? dropzoneStyleHover : dropzoneStyle}
149
+ data-testid="fileDropZone"
150
+ >
151
+ <input {...getInputProps()} />
152
+ <div
153
+ style={
154
+ isDragActive ? dropzoneActiveStyle : dropzoneInactiveStyle
155
+ }
179
156
  >
180
- <div
181
- style={
182
- dropzoneActive
183
- ? dropzoneActiveStyle
184
- : dropzoneInactiveStyle
185
- }
186
- >
187
- <Container textAlign="center">
188
- <Icon
189
- name={dropzoneActive ? "download" : "cloud upload"}
190
- size="huge"
157
+ <Container textAlign="center">
158
+ <Icon
159
+ name={isDragActive ? "download" : "cloud upload"}
160
+ size="huge"
161
+ />
162
+ <p>
163
+ <FormattedMessage
164
+ id={
165
+ isDragActive
166
+ ? "uploadModal.actions.upload.confirmation.content.hover"
167
+ : "uploadModal.actions.upload.confirmation.content"
168
+ }
191
169
  />
192
- <p>
193
- <FormattedMessage
194
- id={
195
- dropzoneActive
196
- ? "uploadModal.actions.upload.confirmation.content.hover"
197
- : "uploadModal.actions.upload.confirmation.content"
170
+ </p>
171
+ <Button
172
+ secondary
173
+ icon="upload"
174
+ onClick={(e) => {
175
+ e.stopPropagation();
176
+ openFileDialog();
177
+ }}
178
+ content="Upload file"
179
+ />
180
+ </Container>
181
+ </div>
182
+ </div>
183
+ <h2>
184
+ <FormattedMessage id="uploadModal.selected.files" />
185
+ </h2>
186
+ <ul>
187
+ {files.map((f) => (
188
+ <List divided verticalAlign="middle" key={f.name} size="big">
189
+ <List.Item key={f.name}>
190
+ <List.Content floated="right">
191
+ <Button
192
+ basic
193
+ icon={
194
+ <Icon name="trash alternate outline" color="red" />
198
195
  }
196
+ color="red"
197
+ onClick={clearFiles}
199
198
  />
200
- </p>
201
- <Button
202
- secondary
203
- icon="upload"
204
- onClick={() => {
205
- dropzoneRef.open();
206
- }}
207
- content="Upload file"
208
- />
209
- </Container>
210
- </div>
211
- </Dropzone>
212
- <h2>
213
- <FormattedMessage id="uploadModal.selected.files" />
214
- </h2>
215
- <ul>
216
- {files.map((f) => (
217
- <List
218
- divided
219
- verticalAlign="middle"
220
- key={f.name}
221
- size="big"
222
- >
223
- <List.Item key={f.name}>
224
- <List.Content floated="right">
225
- <Button
226
- basic
227
- icon={
228
- <Icon
229
- name="trash alternate outline"
230
- color="red"
231
- />
232
- }
233
- color="red"
234
- onClick={() => {
235
- this.setState({ files: [] });
236
- }}
237
- />
238
- </List.Content>
239
- <Icon name="file alternate outline" size="big" />
240
- <List.Content verticalAlign="middle">
241
- {f.name} - {f.size} bytes
242
- </List.Content>
243
- </List.Item>
244
- </List>
245
- ))}
246
- </ul>
247
- </Modal.Content>
248
- )
249
- }
250
- />
251
- </React.Fragment>
252
- );
253
- }
254
- }
199
+ </List.Content>
200
+ <Icon name="file alternate outline" size="big" />
201
+ <List.Content verticalAlign="middle">
202
+ {f.name}- {f.size}bytes
203
+ </List.Content>
204
+ </List.Item>
205
+ </List>
206
+ ))}
207
+ </ul>
208
+ </Modal.Content>
209
+ )
210
+ }
211
+ />
212
+ </Fragment>
213
+ );
214
+ };
215
+
216
+ UploadModal.propTypes = {
217
+ open: PropTypes.bool,
218
+ onOpen: PropTypes.func,
219
+ icon: PropTypes.string,
220
+ header: PropTypes.any,
221
+ subHeader: PropTypes.any,
222
+ content: PropTypes.any,
223
+ handleSubmit: PropTypes.func,
224
+ onClose: PropTypes.func,
225
+ trigger: PropTypes.element,
226
+ size: PropTypes.string,
227
+ accept: PropTypes.string,
228
+ param: PropTypes.string,
229
+ extraAction: PropTypes.object,
230
+ };
255
231
 
256
232
  export default UploadModal;
@@ -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 { Label, Icon } from "semantic-ui-react";
5
4
  import { FormattedMessage } from "react-intl";
@@ -58,7 +57,6 @@ export const UserFilter = ({
58
57
  >
59
58
  {userFilter.name}
60
59
  </span>
61
-
62
60
  {!isGlobal || authorized ? (
63
61
  <ConfirmModal
64
62
  icon="trash"
@@ -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 { Label, Icon } from "semantic-ui-react";
5
4
  import { FormattedMessage } from "react-intl";
@@ -68,7 +67,6 @@ export const UserFilters = ({
68
67
  >
69
68
  {userFilter.name}
70
69
  </span>
71
-
72
70
  {!isGlobal || authorized ? (
73
71
  <ConfirmModal
74
72
  icon="trash"
@@ -1,15 +1,10 @@
1
- import React from "react";
2
- import { MemoryRouter } from "react-router-dom";
3
- import { intl } from "@truedat/test/intl-stub";
4
1
  import { waitFor } from "@testing-library/react";
5
- import { render } from "@truedat/test/render";
6
2
  import userEvent from "@testing-library/user-event";
3
+ import { render, waitForLoad } from "@truedat/test/render";
7
4
  import { apiJsonPost } from "@truedat/core/services/api";
8
5
  import { AddMemberForm } from "../AddMemberForm";
9
6
 
10
- // workaround for enzyme issue with React.useContext
11
- // see https://github.com/airbnb/enzyme/issues/2176#issuecomment-532361526
12
- jest.spyOn(React, "useContext").mockImplementation(() => intl);
7
+ const user = userEvent.setup({ delay: null });
13
8
 
14
9
  jest.mock("@truedat/core/services/api", () => {
15
10
  const originalModule = jest.requireActual("@truedat/core/services/api");
@@ -25,11 +20,11 @@ describe("<AddMemberForm />", () => {
25
20
  const onSuccess = jest.fn();
26
21
  const resource = {
27
22
  type: "domain",
28
- id: 1,
23
+ id: "1",
29
24
  };
30
25
  const options = [
31
- { key: 1, text: "john", value: "user_1", id: 1 },
32
- { key: 2, text: "mambo", value: "group_2", id: 2 },
26
+ { key: 1, text: "john", value: "user_1", id: "1" },
27
+ { key: 2, text: "mambo", value: "group_2", id: "2" },
33
28
  ];
34
29
  const roles = [
35
30
  { key: 1, text: "role1", value: "role1" },
@@ -38,44 +33,37 @@ describe("<AddMemberForm />", () => {
38
33
  const props = { onSuccess, resource, options, roles };
39
34
 
40
35
  it("matches the latest snapshot", async () => {
41
- const { container, findByRole } = render(
42
- <MemoryRouter>
43
- <AddMemberForm {...props} />
44
- </MemoryRouter>
45
- );
46
- await findByRole("button", { name: /add_member/ });
47
- expect(container).toMatchSnapshot();
36
+ const rendered = render(<AddMemberForm {...props} />);
37
+ await waitForLoad(rendered);
38
+ await rendered.findByRole("button", { name: /add_member/i });
39
+ expect(rendered.container).toMatchSnapshot();
48
40
  });
49
41
 
50
42
  it("calls onSuccess with acl data on submit correctly", async () => {
51
- const { findByRole, getByRole, findByText } = render(
52
- <MemoryRouter>
53
- <AddMemberForm {...props} />
54
- </MemoryRouter>
55
- );
43
+ const rendered = render(<AddMemberForm {...props} />);
44
+ await waitForLoad(rendered);
56
45
 
57
46
  // Submit button should initially be disabled
58
- await waitFor(() =>
59
- expect(getByRole("button", { name: /add_member/ })).toBeDisabled()
47
+ await waitFor(async () =>
48
+ expect(
49
+ await rendered.findByRole("button", { name: /add_member/i })
50
+ ).toBeDisabled()
60
51
  );
61
52
 
62
- // Select principal
63
- userEvent.click(await findByText(/john/));
64
-
65
- // Select role
66
- userEvent.click(await findByRole("textbox", { name: "domain.role" }));
67
- userEvent.click(await findByRole("option", { name: "role2" }));
53
+ // Description
54
+ await user.click(await rendered.findByText(/john/i));
55
+ await user.click(await rendered.findByRole("option", { name: "role2" }));
68
56
 
69
57
  // Submit button should now be enabled
70
- await waitFor(() =>
71
- expect(getByRole("button", { name: /add_member/ })).not.toBeDisabled()
58
+ await waitFor(async () =>
59
+ expect(
60
+ await rendered.findByRole("button", { name: /add_member/i })
61
+ ).not.toBeDisabled()
72
62
  );
73
63
 
74
- // Description
75
- userEvent.type(await findByRole("textbox", { name: /description/ }), "foo");
76
-
77
- // Submit
78
- userEvent.click(await findByRole("button", { name: /add_member/ }));
64
+ await user.click(
65
+ await rendered.findByRole("button", { name: /add_member/i })
66
+ );
79
67
 
80
68
  await waitFor(() =>
81
69
  expect(apiJsonPost).toHaveBeenCalledWith("/api/acl_entries/domain/1", {
@@ -84,7 +72,7 @@ describe("<AddMemberForm />", () => {
84
72
  resource_type: "domain",
85
73
  principal_type: "user",
86
74
  principal_id: 1,
87
- description: "foo",
75
+ description: "",
88
76
  },
89
77
  })
90
78
  );
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { AddResourceMember } from "../AddResourceMember";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import AdminMenu from "../AdminMenu";
4
3
 
@@ -1,12 +1,6 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
3
- import { intl } from "@truedat/test/intl-stub";
1
+ import { render, waitForLoad } from "@truedat/test/render";
4
2
  import { Alert } from "../Alert";
5
3
 
6
- // workaround for enzyme issue with React.useContext
7
- // see https://github.com/airbnb/enzyme/issues/2176#issuecomment-532361526
8
- jest.spyOn(React, "useContext").mockImplementation(() => intl);
9
-
10
4
  describe("<Alert />", () => {
11
5
  const dismissAlert = jest.fn();
12
6
  const message = {
@@ -18,20 +12,21 @@ describe("<Alert />", () => {
18
12
  };
19
13
  const props = { message, dismissAlert };
20
14
 
21
- it("matches the latest snapshot", () => {
22
- const wrapper = shallow(<Alert {...props} />);
23
- expect(wrapper).toMatchSnapshot();
15
+ it("matches the latest snapshot", async () => {
16
+ const rendered = render(<Alert {...props} />);
17
+ await waitForLoad(rendered);
18
+ expect(rendered.container).toMatchSnapshot();
24
19
  });
25
20
 
26
- it("contains a formatted message with properties", () => {
27
- const wrapper = shallow(<Alert {...props} />);
28
- const message = wrapper.find("Message");
29
- expect(message).toHaveLength(1);
30
- expect(wrapper.text().includes(message.prop("content")));
31
- expect(message.prop("header")).toEqual("header.message.id");
21
+ it("contains a formatted message with properties", async () => {
22
+ const rendered = render(<Alert {...props} />);
23
+ await waitForLoad(rendered);
24
+
25
+ expect(rendered.getByText(/content.message.id/i)).toBeInTheDocument();
26
+ expect(rendered.getByText(/header.message.id/i)).toBeInTheDocument();
32
27
  });
33
28
 
34
- it("contains a list of messages", () => {
29
+ it("contains a list of messages", async () => {
35
30
  const message = {
36
31
  error: false,
37
32
  header: "message.header",
@@ -49,9 +44,10 @@ describe("<Alert />", () => {
49
44
  ],
50
45
  };
51
46
  const props = { message, dismissAlert };
52
- const wrapper = shallow(<Alert {...props} />);
53
- const m = wrapper.find("Message");
54
- expect(m).toHaveLength(1);
55
- expect(m.prop("list")).toEqual(["message.0.id", "message.1.id"]);
47
+ const rendered = render(<Alert {...props} />);
48
+ await waitForLoad(rendered);
49
+
50
+ expect(rendered.getByText(/message.0.id/i)).toBeInTheDocument();
51
+ expect(rendered.getByText(/message.1.id/i)).toBeInTheDocument();
56
52
  });
57
53
  });
@@ -1,10 +1,10 @@
1
- import _ from "lodash/fp";
2
- import React from "react";
3
- import { render } from "@truedat/test/render";
1
+ import { render, waitForLoad } from "@truedat/test/render";
4
2
  import userEvent from "@testing-library/user-event";
5
3
  import { waitFor } from "@testing-library/react";
6
4
  import { AvailableFilters } from "../AvailableFilters";
7
5
 
6
+ const user = userEvent.setup({ delay: null });
7
+
8
8
  describe("<AvailableFilters/>", () => {
9
9
  const resetFilters = jest.fn();
10
10
  const addFilter = jest.fn();
@@ -15,28 +15,31 @@ describe("<AvailableFilters/>", () => {
15
15
  filters: ["foo", "bar", "xyz"],
16
16
  });
17
17
 
18
- it("matches the latest snapshot", () => {
18
+ it("matches the latest snapshot", async () => {
19
19
  const props = getProps();
20
- const { container } = render(<AvailableFilters {...props} />);
21
- expect(container).toMatchSnapshot();
20
+ const rendered = render(<AvailableFilters {...props} />);
21
+ await waitForLoad(rendered);
22
+ expect(rendered.container).toMatchSnapshot();
22
23
  });
23
24
 
24
25
  it("dispatches resetFilters when first item is clicked", async () => {
25
26
  const props = getProps();
26
- const { queryByText } = render(<AvailableFilters {...props} />);
27
+ const rendered = render(<AvailableFilters {...props} />);
28
+ await waitForLoad(rendered);
27
29
 
28
- expect(queryByText(/reset all filters/i)).toBeInTheDocument();
30
+ expect(rendered.getByText(/reset filters/i)).toBeInTheDocument();
29
31
  expect(resetFilters.mock.calls.length).toBe(0);
30
- userEvent.click(await queryByText(/reset all filters/i));
32
+ await user.click(rendered.getByText(/reset filters/i));
31
33
  await waitFor(() => expect(resetFilters.mock.calls.length).toBe(1));
32
34
  });
33
35
 
34
36
  it("dispatches addFilter when last item is clicked", async () => {
35
37
  const props = getProps();
36
- const { queryByText } = render(<AvailableFilters {...props} />);
38
+ const rendered = render(<AvailableFilters {...props} />);
39
+ await waitForLoad(rendered);
37
40
 
38
41
  expect(props.addFilter.mock.calls.length).toBe(0);
39
- userEvent.click(await queryByText(/foo/i));
42
+ await user.click(rendered.getByText(/foo/i));
40
43
  expect(props.addFilter.mock.calls.length).toBe(1);
41
44
  });
42
45
 
@@ -52,8 +55,10 @@ describe("<AvailableFilters/>", () => {
52
55
  filters: ["foo", "bar", "xyz"],
53
56
  filtersGroup,
54
57
  };
55
- const { queryByText } = render(<AvailableFilters {...props} />);
56
- expect(queryByText(/important/i)).toBeInTheDocument();
57
- expect(queryByText(/grupNan/i)).not.toBeInTheDocument();
58
+ const rendered = render(<AvailableFilters {...props} />);
59
+ await waitForLoad(rendered);
60
+
61
+ expect(rendered.getByText(/important/i)).toBeInTheDocument();
62
+ expect(rendered.queryByText(/grupnan/i)).not.toBeInTheDocument();
58
63
  });
59
64
  });