@truedat/df 7.5.7 → 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 (212) hide show
  1. package/package.json +43 -67
  2. package/src/components/DynamicFieldValue.js +0 -1
  3. package/src/components/DynamicForm.js +5 -4
  4. package/src/components/DynamicFormViewer.js +0 -1
  5. package/src/components/DynamicFormWithTranslations.js +3 -3
  6. package/src/components/EditableDynamicFieldValue.js +1 -2
  7. package/src/components/FieldGroupDetail.js +0 -1
  8. package/src/components/FieldGroupSegment.js +17 -29
  9. package/src/components/FieldGroupWithTranslations.js +19 -38
  10. package/src/components/FieldViewerValue.js +4 -7
  11. package/src/components/OriginLabel.js +0 -1
  12. package/src/components/SelectDynamicFormWithTranslations.js +4 -6
  13. package/src/components/SelectableDynamicForm.js +5 -11
  14. package/src/components/__tests__/DynamicFieldValue.spec.js +0 -1
  15. package/src/components/__tests__/DynamicForm.spec.js +25 -23
  16. package/src/components/__tests__/EditableDynamicFieldValue.spec.js +0 -1
  17. package/src/components/__tests__/FieldGroupDetail.spec.js +0 -1
  18. package/src/components/__tests__/FieldViewerValue.spec.js +1 -6
  19. package/src/components/__tests__/SelectableDynamicForm.spec.js +102 -46
  20. package/src/components/__tests__/__snapshots__/DynamicFieldValue.spec.js.snap +2 -2
  21. package/src/components/__tests__/__snapshots__/DynamicForm.spec.js.snap +94 -81
  22. package/src/components/__tests__/__snapshots__/FieldGroupDetail.spec.js.snap +2 -2
  23. package/src/components/__tests__/__snapshots__/FieldViewerValue.spec.js.snap +1 -7
  24. package/src/components/__tests__/__snapshots__/SelectableDynamicForm.spec.js.snap +39 -39
  25. package/src/components/hierarchies/Hierarchies.js +2 -4
  26. package/src/components/hierarchies/HierarchiesView.js +1 -2
  27. package/src/components/hierarchies/HierarchyCrumbs.js +1 -2
  28. package/src/components/hierarchies/HierarchyRoutes.js +44 -39
  29. package/src/components/hierarchies/HierarchyView.js +4 -7
  30. package/src/components/hierarchies/__tests__/Hierarchies.spec.js +2 -3
  31. package/src/components/hierarchies/__tests__/HierarchiesView.spec.js +3 -7
  32. package/src/components/hierarchies/__tests__/HierarchyCrumbs.spec.js +0 -1
  33. package/src/components/hierarchies/__tests__/HierarchyRoutes.spec.js +79 -0
  34. package/src/components/hierarchies/__tests__/HierarchyView.spec.js +2 -10
  35. package/src/components/hierarchies/__tests__/__snapshots__/Hierarchies.spec.js.snap +1 -0
  36. package/src/components/hierarchies/__tests__/__snapshots__/HierarchiesView.spec.js.snap +7 -5
  37. package/src/components/hierarchies/__tests__/__snapshots__/HierarchyCrumbs.spec.js.snap +4 -2
  38. package/src/components/hierarchies/__tests__/__snapshots__/HierarchyRoutes.spec.js.snap +60 -0
  39. package/src/components/hierarchies/__tests__/__snapshots__/HierarchyView.spec.js.snap +8 -6
  40. package/src/components/widgets/CheckboxField.js +0 -1
  41. package/src/components/widgets/ColorPickerField.js +2 -3
  42. package/src/components/widgets/DateField.js +0 -1
  43. package/src/components/widgets/DateTimeField.js +0 -1
  44. package/src/components/widgets/DomainDropdown.js +1 -1
  45. package/src/components/widgets/DomainPreview.js +1 -2
  46. package/src/components/widgets/DropdownDataLoader.js +3 -3
  47. package/src/components/widgets/DropdownField.js +5 -4
  48. package/src/components/widgets/DynamicField.js +0 -5
  49. package/src/components/widgets/EnrichedTextField.js +0 -1
  50. package/src/components/widgets/HierarchyDropdown.js +1 -1
  51. package/src/components/widgets/HierarchyPreview.js +0 -1
  52. package/src/components/widgets/IdentifierField.js +0 -1
  53. package/src/components/widgets/ImageField.js +1 -1
  54. package/src/components/widgets/ImagePreview.js +0 -1
  55. package/src/components/widgets/NumberField.js +6 -7
  56. package/src/components/widgets/PairListField.js +5 -6
  57. package/src/components/widgets/PasswordField.js +1 -2
  58. package/src/components/widgets/RadioField.js +0 -1
  59. package/src/components/widgets/StandardDropdown.js +0 -1
  60. package/src/components/widgets/StringField.js +0 -1
  61. package/src/components/widgets/SystemPreview.js +2 -3
  62. package/src/components/widgets/TableField.js +5 -5
  63. package/src/components/widgets/TextField.js +1 -2
  64. package/src/components/widgets/__tests__/CheckboxField.spec.js +33 -23
  65. package/src/components/widgets/__tests__/ColorPickerField.spec.js +5 -12
  66. package/src/components/widgets/__tests__/DateField.spec.js +5 -5
  67. package/src/components/widgets/__tests__/DateTimeField.spec.js +5 -5
  68. package/src/components/widgets/__tests__/DomainPreview.spec.js +12 -14
  69. package/src/components/widgets/__tests__/DropdownDataLoader.spec.js +5 -5
  70. package/src/components/widgets/__tests__/DropdownField.spec.js +18 -29
  71. package/src/components/widgets/__tests__/DynamicField.spec.js +0 -1
  72. package/src/components/widgets/__tests__/HierarchyDropdown.spec.js +4 -5
  73. package/src/components/widgets/__tests__/HierarchyPreview.spec.js +0 -1
  74. package/src/components/widgets/__tests__/ImageField.spec.js +5 -10
  75. package/src/components/widgets/__tests__/NumberField.spec.js +23 -5
  76. package/src/components/widgets/__tests__/PairListField.spec.js +69 -59
  77. package/src/components/widgets/__tests__/PasswordField.spec.js +3 -4
  78. package/src/components/widgets/__tests__/RadioField.spec.js +5 -5
  79. package/src/components/widgets/__tests__/StandardDropdown.spec.js +45 -46
  80. package/src/components/widgets/__tests__/StringField.spec.js +10 -13
  81. package/src/components/widgets/__tests__/SystemPreview.spec.js +13 -15
  82. package/src/components/widgets/__tests__/TableField.spec.js +32 -32
  83. package/src/components/widgets/__tests__/TextField.spec.js +5 -5
  84. package/src/components/widgets/__tests__/__snapshots__/CheckboxField.spec.js.snap +58 -29
  85. package/src/components/widgets/__tests__/__snapshots__/ColorPickerField.spec.js.snap +221 -36
  86. package/src/components/widgets/__tests__/__snapshots__/DateField.spec.js.snap +21 -16
  87. package/src/components/widgets/__tests__/__snapshots__/DateTimeField.spec.js.snap +21 -20
  88. package/src/components/widgets/__tests__/__snapshots__/DomainPreview.spec.js.snap +26 -21
  89. package/src/components/widgets/__tests__/__snapshots__/DropdownDataLoader.spec.js.snap +1 -1
  90. package/src/components/widgets/__tests__/__snapshots__/DropdownField.spec.js.snap +93 -43
  91. package/src/components/widgets/__tests__/__snapshots__/DynamicField.spec.js.snap +2 -14
  92. package/src/components/widgets/__tests__/__snapshots__/ImageField.spec.js.snap +16 -28
  93. package/src/components/widgets/__tests__/__snapshots__/NumberField.spec.js.snap +11 -9
  94. package/src/components/widgets/__tests__/__snapshots__/PairListField.spec.js.snap +53 -39
  95. package/src/components/widgets/__tests__/__snapshots__/PasswordField.spec.js.snap +15 -8
  96. package/src/components/widgets/__tests__/__snapshots__/RadioField.spec.js.snap +41 -22
  97. package/src/components/widgets/__tests__/__snapshots__/StandardDropdown.spec.js.snap +78 -31
  98. package/src/components/widgets/__tests__/__snapshots__/StringField.spec.js.snap +78 -38
  99. package/src/components/widgets/__tests__/__snapshots__/SystemPreview.spec.js.snap +24 -21
  100. package/src/components/widgets/__tests__/__snapshots__/TableField.spec.js.snap +138 -174
  101. package/src/components/widgets/__tests__/__snapshots__/TextField.spec.js.snap +12 -7
  102. package/src/reducers/__tests__/dfMessage.spec.js +14 -18
  103. package/src/reducers/dfMessage.js +8 -7
  104. package/src/selectors/index.js +0 -1
  105. package/src/templates/components/NewTemplate.js +0 -1
  106. package/src/templates/components/Template.js +0 -2
  107. package/src/templates/components/TemplateCard.js +3 -4
  108. package/src/templates/components/TemplateCrumbs.js +2 -3
  109. package/src/templates/components/TemplateFilters.js +0 -1
  110. package/src/templates/components/TemplateLoader.js +25 -101
  111. package/src/templates/components/TemplateRoutes.js +29 -45
  112. package/src/templates/components/Templates.js +1 -5
  113. package/src/templates/components/TemplatesContext.js +3 -7
  114. package/src/templates/components/TemplatesTable.js +1 -2
  115. package/src/templates/components/__tests__/NewTemplate.spec.js +5 -10
  116. package/src/templates/components/__tests__/Template.spec.js +0 -1
  117. package/src/templates/components/__tests__/TemplateLoader.spec.js +71 -109
  118. package/src/templates/components/__tests__/TemplateRoutes.spec.js +63 -0
  119. package/src/templates/components/__tests__/TemplatesTable.spec.js +15 -9
  120. package/src/templates/components/__tests__/__snapshots__/NewTemplate.spec.js.snap +335 -22
  121. package/src/templates/components/__tests__/__snapshots__/Template.spec.js.snap +49 -48
  122. package/src/templates/components/__tests__/__snapshots__/TemplateLoader.spec.js.snap +7 -1
  123. package/src/templates/components/__tests__/__snapshots__/TemplateRoutes.spec.js.snap +38 -0
  124. package/src/templates/components/__tests__/__snapshots__/TemplatesTable.spec.js.snap +94 -1
  125. package/src/templates/components/index.js +1 -2
  126. package/src/templates/components/templateForm/ActiveGroupForm.js +1 -4
  127. package/src/templates/components/templateForm/ConditionalFieldForm.js +0 -1
  128. package/src/templates/components/templateForm/DefaultValue.js +0 -1
  129. package/src/templates/components/templateForm/DependentDomain.js +0 -1
  130. package/src/templates/components/templateForm/DependentFormField.js +0 -1
  131. package/src/templates/components/templateForm/FieldForm.js +5 -5
  132. package/src/templates/components/templateForm/GroupsList.js +0 -1
  133. package/src/templates/components/templateForm/HierarchiesList.js +1 -2
  134. package/src/templates/components/templateForm/MandatoryConditional.js +0 -1
  135. package/src/templates/components/templateForm/SwitchListForm.js +2 -2
  136. package/src/templates/components/templateForm/SwitchSegment.js +0 -1
  137. package/src/templates/components/templateForm/TemplateForm.js +1 -1
  138. package/src/templates/components/templateForm/TemplateFormActions.js +3 -4
  139. package/src/templates/components/templateForm/ValuesField.js +1 -3
  140. package/src/templates/components/templateForm/ValuesListForm.js +3 -3
  141. package/src/templates/components/templateForm/ValuesSelector.js +0 -1
  142. package/src/templates/components/templateForm/__tests__/ActiveGroupForm.spec.js +8 -13
  143. package/src/templates/components/templateForm/__tests__/DefaultValue.spec.js +198 -113
  144. package/src/templates/components/templateForm/__tests__/DependentDomain.spec.js +0 -1
  145. package/src/templates/components/templateForm/__tests__/DependentFormField.spec.js +0 -1
  146. package/src/templates/components/templateForm/__tests__/FieldForm.spec.js +106 -72
  147. package/src/templates/components/templateForm/__tests__/GroupsList.spec.js +7 -12
  148. package/src/templates/components/templateForm/__tests__/MandatoryConditional.spec.js +0 -1
  149. package/src/templates/components/templateForm/__tests__/SwitchListForm.spec.js +71 -50
  150. package/src/templates/components/templateForm/__tests__/SwitchSegment.spec.js +37 -62
  151. package/src/templates/components/templateForm/__tests__/TemplateForm.spec.js +0 -1
  152. package/src/templates/components/templateForm/__tests__/TemplateFormActions.spec.js +19 -15
  153. package/src/templates/components/templateForm/__tests__/ValuesField.spec.js +84 -62
  154. package/src/templates/components/templateForm/__tests__/ValuesListForm.spec.js +108 -144
  155. package/src/templates/components/templateForm/__tests__/ValuesSelector.spec.js +36 -36
  156. package/src/templates/components/templateForm/__tests__/__snapshots__/ActiveGroupForm.spec.js.snap +654 -86
  157. package/src/templates/components/templateForm/__tests__/__snapshots__/DefaultValue.spec.js.snap +45 -23
  158. package/src/templates/components/templateForm/__tests__/__snapshots__/FieldForm.spec.js.snap +1700 -1025
  159. package/src/templates/components/templateForm/__tests__/__snapshots__/GroupsList.spec.js.snap +44 -39
  160. package/src/templates/components/templateForm/__tests__/__snapshots__/SwitchListForm.spec.js.snap +225 -60
  161. package/src/templates/components/templateForm/__tests__/__snapshots__/SwitchSegment.spec.js.snap +1 -1
  162. package/src/templates/components/templateForm/__tests__/__snapshots__/TemplateForm.spec.js.snap +89 -92
  163. package/src/templates/components/templateForm/__tests__/__snapshots__/TemplateFormActions.spec.js.snap +66 -100
  164. package/src/templates/components/templateForm/__tests__/__snapshots__/ValuesField.spec.js.snap +542 -231
  165. package/src/templates/components/templateForm/__tests__/__snapshots__/ValuesListForm.spec.js.snap +264 -268
  166. package/src/templates/components/templateForm/__tests__/__snapshots__/ValuesSelector.spec.js.snap +146 -11
  167. package/src/templates/reducers/__tests__/allTemplates.spec.js +1 -1
  168. package/src/templates/reducers/__tests__/template.spec.js +3 -2
  169. package/src/templates/reducers/__tests__/templateLoading.spec.js +2 -2
  170. package/src/templates/reducers/__tests__/templates.spec.js +1 -1
  171. package/src/templates/reducers/__tests__/templatesLoading.spec.js +1 -1
  172. package/src/templates/reducers/allTemplates.js +1 -2
  173. package/src/templates/reducers/template.js +2 -1
  174. package/src/templates/reducers/templates.js +1 -1
  175. package/src/templates/reducers/templatesLoading.js +1 -1
  176. package/src/templates/routines.js +0 -2
  177. package/src/templates/sagas/__tests__/deleteTemplate.spec.js +2 -2
  178. package/src/templates/sagas/__tests__/fetchTemplates.spec.js +3 -6
  179. package/src/templates/sagas/__tests__/updateTemplate.spec.js +4 -4
  180. package/src/templates/sagas/deleteTemplate.js +1 -1
  181. package/src/templates/sagas/fetchTemplate.js +1 -1
  182. package/src/templates/sagas/fetchTemplates.js +1 -1
  183. package/src/templates/sagas/updateTemplate.js +1 -1
  184. package/src/templates/utils/filterSwitches.js +2 -2
  185. package/src/templates/utils/filterValues.js +2 -2
  186. package/src/api/hierarchies.js +0 -4
  187. package/src/components/FieldGroupCopy.js +0 -108
  188. package/src/components/FieldGroupSubSegment/FieldGroupSubSegment.js +0 -181
  189. package/src/components/FieldGroupSubSegment/__tests__/FieldGroupSubSegment.spec.js +0 -221
  190. package/src/components/FieldGroupSubSegment/__tests__/__snapshots__/FieldGroupSubSegment.spec.js.snap +0 -230
  191. package/src/components/FieldGroupSubSegment/constants.js +0 -68
  192. package/src/components/FieldGroupSubSegment/copyValidations.js +0 -75
  193. package/src/components/FieldGroupSubSegment/handleCopyModule.js +0 -186
  194. package/src/components/__tests__/FieldGroupCopy.spec.js +0 -14
  195. package/src/components/__tests__/__snapshots__/FieldGroupCopy.spec.js.snap +0 -307
  196. package/src/components/widgets/CopyField/CopyField.js +0 -270
  197. package/src/components/widgets/CopyField/CopyFieldCell.js +0 -138
  198. package/src/components/widgets/CopyField/CopyFieldColumn.js +0 -53
  199. package/src/components/widgets/CopyField/CopyFieldSelectableCell.js +0 -71
  200. package/src/components/widgets/CopyField/CustomStyles.js +0 -91
  201. package/src/components/widgets/CopyField/__tests__/CopyField.spec.js +0 -82
  202. package/src/components/widgets/CopyField/__tests__/CopyFieldCell.spec.js +0 -67
  203. package/src/components/widgets/CopyField/__tests__/CopyFieldColumn.spec.js +0 -33
  204. package/src/components/widgets/CopyField/__tests__/CopyFieldSelectableCell.spec.js +0 -49
  205. package/src/components/widgets/CopyField/__tests__/__snapshots__/CopyField.spec.js.snap +0 -279
  206. package/src/components/widgets/CopyField/__tests__/__snapshots__/CopyFieldCell.spec.js.snap +0 -67
  207. package/src/components/widgets/CopyField/__tests__/__snapshots__/CopyFieldColumn.spec.js.snap +0 -42
  208. package/src/components/widgets/CopyField/__tests__/__snapshots__/CopyFieldSelectableCell.spec.js.snap +0 -60
  209. package/src/hooks/useHierarchies.js +0 -112
  210. package/src/selectors/subscopedTemplates.js +0 -16
  211. package/src/templates/components/TemplatesLoader.js +0 -24
  212. package/src/templates/components/__tests__/TemplatesLoader.spec.js +0 -29
@@ -1,110 +1,34 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
- import PropTypes from "prop-types";
4
- import { compose } from "redux";
5
- import { connect } from "react-redux";
6
- import { withRouter } from "react-router-dom";
2
+ import { useEffect } from "react";
3
+ import { useParams } from "react-router";
4
+ import { useDispatch, useSelector } from "react-redux";
7
5
  import { Loading } from "@truedat/core/components";
8
- import { clearTemplate, fetchTemplate } from "../routines";
9
- import { clearSelectedDomain, clearSelectedDomains } from "../../routines";
6
+ import { fetchTemplate } from "../routines";
10
7
 
11
- export class TemplateLoader extends React.Component {
12
- static propTypes = {
13
- clearSelectedDomain: PropTypes.func,
14
- clearSelectedDomains: PropTypes.func,
15
- clearTemplate: PropTypes.func,
16
- domainId: PropTypes.number,
17
- domainIds: PropTypes.array,
18
- fetchTemplate: PropTypes.func,
19
- match: PropTypes.object.isRequired,
20
- templateId: PropTypes.number,
21
- templateLoading: PropTypes.bool,
22
- };
8
+ export function TemplateLoader() {
9
+ const dispatch = useDispatch();
10
+ const selectedDomain = useSelector((state) => state.selectedDomain);
11
+ const selectedDomains = useSelector((state) => state.selectedDomains);
12
+ const selectedTemplate = useSelector((state) => state.selectedTemplate);
13
+ const templateLoading = useSelector((state) => state.templateLoading);
23
14
 
24
- componentDidMount() {
25
- const { fetchTemplate, domainId, domainIds, templateId, match } =
26
- this.props;
27
- if (match?.params?.templateId) {
28
- fetchTemplate({ templateId: match.params.templateId });
29
- } else if (templateId) {
30
- fetchTemplate({ domainId, domainIds, templateId });
31
- }
32
- }
33
-
34
- componentDidUpdate(prevProps) {
35
- const {
36
- clearTemplate,
37
- domainId,
38
- domainIds,
39
- fetchTemplate,
40
- match,
41
- templateId,
42
- } = this.props;
43
- const {
44
- domainId: prevDomainId,
45
- domainIds: prevDomainIds,
46
- match: prevMatch,
47
- templateId: prevTemplateId,
48
- } = prevProps;
49
- if (match?.params?.templateId) {
50
- if (match.params.templateId === prevMatch?.params?.templateId) {
51
- // No change
52
- } else {
53
- fetchTemplate({ templateId: match.params.templateId });
54
- }
55
- } else if (templateId) {
56
- if (
57
- domainId !== prevDomainId ||
58
- domainIds !== prevDomainIds ||
59
- templateId !== prevTemplateId
60
- ) {
61
- fetchTemplate({
62
- domainId,
63
- domainIds,
64
- templateId,
65
- });
66
- }
67
- } else if (templateId !== prevTemplateId) {
68
- clearTemplate();
69
- }
70
- }
15
+ const domainId = _.prop("id")(selectedDomain);
16
+ const domainIds = selectedDomains;
17
+ const selectedTemplateId = _.prop("id")(selectedTemplate);
71
18
 
72
- componentWillUnmount() {
73
- const { clearTemplate, clearSelectedDomain, clearSelectedDomains } =
74
- this.props;
75
- clearTemplate();
76
- clearSelectedDomain();
77
- clearSelectedDomains();
78
- }
19
+ const { templateId } = useParams();
79
20
 
80
- render() {
81
- const { templateLoading } = this.props;
82
- if (templateLoading) {
83
- return <Loading />;
84
- } else {
85
- return null;
21
+ useEffect(() => {
22
+ if (templateId) {
23
+ dispatch(fetchTemplate({ templateId }));
24
+ } else if (selectedTemplateId) {
25
+ dispatch(
26
+ fetchTemplate({ domainId, domainIds, templateId: selectedTemplateId })
27
+ );
86
28
  }
87
- }
88
- }
29
+ }, [domainId, domainIds, templateId, selectedTemplateId]);
89
30
 
90
- const mapStateToProps = ({
91
- selectedDomain,
92
- selectedDomains,
93
- selectedTemplate,
94
- templateLoading,
95
- }) => ({
96
- domainId: _.prop("id")(selectedDomain),
97
- domainIds: selectedDomains,
98
- templateId: _.prop("id")(selectedTemplate),
99
- templateLoading,
100
- });
31
+ return templateLoading ? <Loading /> : null;
32
+ }
101
33
 
102
- export default compose(
103
- withRouter,
104
- connect(mapStateToProps, {
105
- clearSelectedDomain,
106
- clearSelectedDomains,
107
- clearTemplate,
108
- fetchTemplate,
109
- })
110
- )(TemplateLoader);
34
+ export default TemplateLoader;
@@ -1,58 +1,42 @@
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";
2
+ import { Route, Routes } from "react-router";
5
3
  import { TEMPLATE, TEMPLATES, TEMPLATES_NEW } from "@truedat/core/routes";
4
+ import { ProtectedRoute, Loader } from "@truedat/core/router";
6
5
  import NewTemplate from "./NewTemplate";
7
6
  import Templates from "./Templates";
8
7
  import Template from "./Template";
9
- import TemplatesLoader from "./TemplatesLoader";
8
+ import TemplatesLoader from "@truedat/core/components/TemplatesLoader";
10
9
  import TemplateLoader from "./TemplateLoader";
11
10
  import TemplatesContextProvider from "./TemplatesContext";
12
11
 
13
12
  export const TemplateRoutes = () => {
14
- const authorized = useAuthorized();
15
13
  return (
16
- <Route
17
- path={TEMPLATES}
18
- render={() =>
19
- authorized ? (
20
- <TemplatesContextProvider
21
- initialSortColumn="updated_at"
22
- initialSortDirection="descending"
23
- >
24
- <Switch>
25
- <Route
26
- path={TEMPLATES}
27
- render={() => (
28
- <>
29
- <TemplatesLoader />
30
- <Templates />
31
- </>
32
- )}
33
- exact
34
- />
35
- <Route
36
- path={TEMPLATES_NEW}
37
- render={() => <NewTemplate />}
38
- exact
39
- />
40
- <Route
41
- path={TEMPLATE}
42
- render={() => (
43
- <>
44
- <TemplateLoader />
45
- <Template />
46
- </>
47
- )}
48
- />
49
- </Switch>
50
- </TemplatesContextProvider>
51
- ) : (
52
- <Unauthorized />
53
- )
54
- }
55
- />
14
+ <Routes>
15
+ <Route path={TEMPLATES} element={<ProtectedRoute />}>
16
+ <Route
17
+ index
18
+ element={
19
+ <TemplatesContextProvider
20
+ initialSortColumn="updated_at"
21
+ initialSortDirection="descending"
22
+ >
23
+ <TemplatesLoader /> <Templates />
24
+ </TemplatesContextProvider>
25
+ }
26
+ />
27
+ <Route path={TEMPLATES_NEW} element={<NewTemplate />} />
28
+ <Route
29
+ path={TEMPLATE}
30
+ element={
31
+ <>
32
+ <TemplateLoader />
33
+ <Template />
34
+ </>
35
+ }
36
+ />
37
+ </Route>
38
+ <Route path="*" element={null} />
39
+ </Routes>
56
40
  );
57
41
  };
58
42
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { FormattedMessage, useIntl } from "react-intl";
3
2
  import {
4
3
  Header,
@@ -8,7 +7,7 @@ import {
8
7
  Container,
9
8
  Button,
10
9
  } from "semantic-ui-react";
11
- import { Link } from "react-router-dom";
10
+ import { Link } from "react-router";
12
11
  import { TEMPLATES_NEW } from "@truedat/core/routes";
13
12
  import TemplateFilters from "./TemplateFilters";
14
13
  import TemplatesTable from "./TemplatesTable";
@@ -32,12 +31,10 @@ export default function Templates() {
32
31
  </Header.Subheader>
33
32
  </Header.Content>
34
33
  </Header>
35
-
36
34
  <Grid>
37
35
  <Grid.Column width={8}>
38
36
  <TemplateFilters />
39
37
  </Grid.Column>
40
-
41
38
  <Grid.Column width={8}>
42
39
  <Container textAlign="right">
43
40
  <Button
@@ -49,7 +46,6 @@ export default function Templates() {
49
46
  </Container>
50
47
  </Grid.Column>
51
48
  </Grid>
52
-
53
49
  <TemplatesTable />
54
50
  </Segment>
55
51
  );
@@ -1,10 +1,10 @@
1
1
  import _ from "lodash/fp";
2
- import React, { useState, useContext, createContext } from "react";
2
+ import { useState, use, createContext } from "react";
3
3
  import { useSelector } from "react-redux";
4
4
  import { matchSorter } from "match-sorter";
5
5
 
6
6
  export const TemplatesContext = createContext();
7
- export const useTemplatesContext = () => useContext(TemplatesContext);
7
+ export const useTemplatesContext = () => use(TemplatesContext);
8
8
 
9
9
  const HIDDEN_SCOPES = ["cx", "ca", "actions"];
10
10
  const isHiddenScope = (scope) => _.includes(scope)(HIDDEN_SCOPES);
@@ -57,9 +57,5 @@ export default function TemplatesContextProvider(props) {
57
57
  setSortDirection,
58
58
  };
59
59
 
60
- return (
61
- <TemplatesContext.Provider value={context}>
62
- {children}
63
- </TemplatesContext.Provider>
64
- );
60
+ return <TemplatesContext value={context}>{children}</TemplatesContext>;
65
61
  }
@@ -1,7 +1,6 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
2
  import { FormattedMessage } from "react-intl";
4
- import { Link } from "react-router-dom";
3
+ import { Link } from "react-router";
5
4
  import { Table, Header, Icon } from "semantic-ui-react";
6
5
  import { linkTo } from "@truedat/core/routes";
7
6
  import { sortColumn as sortHandler } from "@truedat/core/services/sort";
@@ -1,17 +1,12 @@
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 { NewTemplate } from "../NewTemplate";
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("<NewTemplate />", () => {
11
- it("matches the latest snapshot", () => {
5
+ it("matches the latest snapshot", async () => {
12
6
  const createTemplate = jest.fn();
13
7
  const props = { createTemplate };
14
- const wrapper = shallow(<NewTemplate {...props} />);
15
- expect(wrapper).toMatchSnapshot();
8
+ const rendered = render(<NewTemplate {...props} />);
9
+ await waitForLoad(rendered);
10
+ expect(rendered.container).toMatchSnapshot();
16
11
  });
17
12
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import Template from "../Template";
4
3
 
@@ -1,128 +1,90 @@
1
- import React from "react";
2
- import ReactDOM from "react-dom";
3
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
4
2
  import { TemplateLoader } from "../TemplateLoader";
3
+ import { clearTemplate, fetchTemplate } from "../../routines";
4
+ import { clearSelectedDomain, clearSelectedDomains } from "../../../routines";
5
+
6
+ jest.mock("react-router", () => ({
7
+ ...jest.requireActual("react-router"),
8
+ useParams: () => ({ templateId: "1" }),
9
+ }));
5
10
 
6
11
  describe("<TemplateLoader />", () => {
7
- const clearTemplate = jest.fn();
8
- const fetchTemplate = jest.fn();
9
- const clearSelectedDomain = jest.fn();
10
- const clearSelectedDomains = jest.fn();
11
- const match = {};
12
+ let mockDispatch;
12
13
 
13
- it("matches the latest snapshot", () => {
14
- const templateLoading = true;
15
- const props = {
16
- clearSelectedDomain,
17
- clearSelectedDomains,
18
- clearTemplate,
19
- fetchTemplate,
20
- templateLoading,
21
- match,
22
- };
23
- const wrapper = shallow(<TemplateLoader {...props} />);
24
- expect(wrapper).toMatchSnapshot();
14
+ beforeEach(() => {
15
+ jest.clearAllMocks();
16
+ mockDispatch = jest.fn();
25
17
  });
26
18
 
27
- it("renders a loader if templateLoading is true", () => {
28
- const templateLoading = true;
29
- const props = {
30
- clearSelectedDomain,
31
- clearSelectedDomains,
32
- clearTemplate,
33
- fetchTemplate,
34
- templateLoading,
35
- match,
36
- };
37
- const wrapper = shallow(<TemplateLoader {...props} />);
38
- expect(wrapper.find("Loading").length).toBe(1);
19
+ it("matches the latest snapshot", async () => {
20
+ const rendered = render(<TemplateLoader />, {
21
+ state: { templateLoading: true },
22
+ dispatch: mockDispatch,
23
+ });
24
+ expect(rendered.container).toMatchSnapshot();
39
25
  });
40
26
 
41
- it("renders null if templateLoading is false", () => {
42
- const templateLoading = false;
43
- const props = {
44
- clearSelectedDomain,
45
- clearSelectedDomains,
46
- clearTemplate,
47
- fetchTemplate,
48
- templateLoading,
49
- match,
50
- };
51
- const wrapper = shallow(<TemplateLoader {...props} />);
52
- expect(wrapper.getElement()).toBeNull();
27
+ it("renders a loader if templateLoading is true", async () => {
28
+ const rendered = render(<TemplateLoader />, {
29
+ state: { templateLoading: true },
30
+ dispatch: mockDispatch,
31
+ });
32
+ expect(rendered.container.querySelector(".loader")).toBeInTheDocument();
53
33
  });
54
34
 
55
- it("calls fetchTemplate when component mounts, clearTemplate when component unmounts", () => {
56
- const fetchTemplate = jest.fn();
57
- const clearTemplate = jest.fn();
58
- const clearSelectedDomain = jest.fn();
59
- const clearSelectedDomains = jest.fn();
60
- const templateLoading = false;
61
- const domainId = 1;
62
- const templateId = 2;
63
- const props = {
64
- clearSelectedDomain,
65
- clearSelectedDomains,
66
- fetchTemplate,
67
- templateLoading,
68
- clearTemplate,
69
- domainId,
70
- templateId,
71
- match,
72
- };
73
- jest.spyOn(TemplateLoader.prototype, "componentDidMount");
74
- const wrapper = shallow(<TemplateLoader {...props} />);
75
- expect(TemplateLoader.prototype.componentDidMount.mock.calls.length).toBe(
76
- 1
77
- );
78
- expect(clearTemplate.mock.calls.length).toBe(0);
79
- expect(fetchTemplate.mock.calls.length).toBe(1);
80
- expect(fetchTemplate.mock.calls[0]).toEqual([
81
- { domainId: 1, templateId: 2 },
82
- ]);
83
- expect(clearSelectedDomain.mock.calls.length).toBe(0);
84
- expect(clearSelectedDomains.mock.calls.length).toBe(0);
85
- wrapper.unmount();
86
- expect(clearTemplate.mock.calls.length).toBe(1);
87
- expect(fetchTemplate.mock.calls.length).toBe(1);
88
- expect(clearSelectedDomain.mock.calls.length).toBe(1);
89
- expect(clearSelectedDomains.mock.calls.length).toBe(1);
35
+ it("renders null if templateLoading is false", async () => {
36
+ const rendered = render(<TemplateLoader />, {
37
+ state: { templateLoading: false },
38
+ dispatch: mockDispatch,
39
+ });
40
+ await waitForLoad(rendered);
41
+ expect(rendered.container.firstChild).toBeNull();
90
42
  });
91
43
 
92
- it("calls fetchTemplate when component updates, clearTemplate when component receives null templateId", () => {
93
- const fetchTemplate = jest.fn();
94
- const clearTemplate = jest.fn();
95
- const templateLoading = false;
96
- const domainId = 1;
97
- const templateId = 2;
98
- const props = {
99
- fetchTemplate,
100
- templateLoading,
101
- clearTemplate,
102
- domainId,
103
- templateId,
104
- match,
105
- };
106
- const newProps = { ...props, templateId: 3 };
107
- const newNullProps = { ...props, templateId: null };
44
+ it("dispatches fetchTemplate when mounted", async () => {
45
+ const rendered = render(<TemplateLoader />, {
46
+ state: {
47
+ selectedDomain: { id: 1 },
48
+ selectedDomains: [2, 3],
49
+ selectedTemplate: { id: 4 },
50
+ templateLoading: false,
51
+ },
52
+ dispatch: mockDispatch,
53
+ });
108
54
 
109
- const node = document.createElement("div");
110
- ReactDOM.render(<TemplateLoader {...props} />, node);
111
- jest.spyOn(TemplateLoader.prototype, "componentDidUpdate");
112
- ReactDOM.render(<TemplateLoader {...newProps} />, node);
55
+ await waitForLoad(rendered);
113
56
 
114
- expect(TemplateLoader.prototype.componentDidUpdate.mock.calls.length).toBe(
115
- 1
57
+ // Check that fetchTemplate was called with the right params
58
+ expect(mockDispatch).toHaveBeenCalledWith(
59
+ fetchTemplate({ templateId: "1" })
116
60
  );
117
- expect(clearTemplate.mock.calls.length).toBe(0);
118
- expect(fetchTemplate.mock.calls.length).toBe(2);
119
- expect(fetchTemplate.mock.calls[1]).toEqual([
120
- { domainId: 1, templateId: 3 },
121
- ]);
122
61
 
123
- ReactDOM.render(<TemplateLoader {...newNullProps} />, node);
124
- expect(clearTemplate.mock.calls.length).toBe(1);
62
+ mockDispatch.mockClear();
63
+ rendered.unmount();
125
64
  });
126
65
 
127
- // TODO: Tests for componentDidUpdate
66
+ it("dispatches fetchTemplate with selectedTemplateId when no templateId is present", async () => {
67
+ // Mock useParams to return an empty object for this test only
68
+ jest.spyOn(require("react-router"), "useParams").mockReturnValue({});
69
+
70
+ const rendered = render(<TemplateLoader />, {
71
+ state: {
72
+ selectedDomain: { id: 5 },
73
+ selectedDomains: [6, 7],
74
+ selectedTemplate: { id: 8 },
75
+ templateLoading: false,
76
+ },
77
+ dispatch: mockDispatch,
78
+ });
79
+
80
+ await waitForLoad(rendered);
81
+
82
+ expect(mockDispatch).toHaveBeenCalledWith(
83
+ fetchTemplate({
84
+ domainId: 5,
85
+ domainIds: [6, 7],
86
+ templateId: 8,
87
+ })
88
+ );
89
+ });
128
90
  });
@@ -0,0 +1,63 @@
1
+ import React from "react";
2
+ import { render, waitForLoad } from "@truedat/test/render";
3
+ import { TemplateRoutes } from "../TemplateRoutes";
4
+ import { useAuthorized } from "@truedat/core/hooks/useAuthorized";
5
+ import { TEMPLATE, TEMPLATES, TEMPLATES_NEW } from "@truedat/core/routes";
6
+
7
+ jest.mock("@truedat/core/hooks/useAuthorized", () => ({
8
+ useAuthorized: jest.fn(() => true),
9
+ }));
10
+
11
+ // Mock all child components
12
+ jest.mock("../NewTemplate", () => () => <div>NewTemplate</div>);
13
+ jest.mock("../Templates", () => () => <div>Templates</div>);
14
+ jest.mock("../Template", () => () => <div>Template</div>);
15
+ jest.mock("../TemplateLoader", () => () => <div>TemplateLoader</div>);
16
+ jest.mock("../TemplatesContext", () => () => <div>TemplatesContext</div>);
17
+ jest.mock("@truedat/core/components/TemplatesLoader", () => () => (
18
+ <div>TemplatesLoader</div>
19
+ ));
20
+ jest.mock("@truedat/core/router/Unauthorized", () => () => (
21
+ <div>Unauthorized</div>
22
+ ));
23
+
24
+ describe("<TemplateRoutes />", () => {
25
+ it("renders correctly with default route", async () => {
26
+ const rendered = render(<TemplateRoutes />);
27
+ await waitForLoad(rendered);
28
+ expect(rendered.container).toMatchSnapshot();
29
+ });
30
+
31
+ it("renders correctly with templates route", async () => {
32
+ const rendered = render(<TemplateRoutes />, {
33
+ routes: [TEMPLATES],
34
+ });
35
+ await waitForLoad(rendered);
36
+ expect(rendered.container).toMatchSnapshot();
37
+ });
38
+
39
+ it("renders correctly with templates new route", async () => {
40
+ const rendered = render(<TemplateRoutes />, {
41
+ routes: [TEMPLATES_NEW],
42
+ });
43
+ await waitForLoad(rendered);
44
+ expect(rendered.container).toMatchSnapshot();
45
+ });
46
+
47
+ it("renders correctly with template route", async () => {
48
+ const rendered = render(<TemplateRoutes />, {
49
+ routes: [TEMPLATE.replace(":id", "123")],
50
+ });
51
+ await waitForLoad(rendered);
52
+ expect(rendered.container).toMatchSnapshot();
53
+ });
54
+
55
+ it("renders unauthorized component when not authorized", async () => {
56
+ useAuthorized.mockReturnValueOnce(false);
57
+ const rendered = render(<TemplateRoutes />, {
58
+ routes: [TEMPLATES],
59
+ });
60
+ await waitForLoad(rendered);
61
+ expect(rendered.container).toMatchSnapshot();
62
+ });
63
+ });
@@ -1,29 +1,35 @@
1
- import React from "react";
2
- import { shallowWithIntl } from "@truedat/test/intl-stub";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import TemplatesTable from "../TemplatesTable";
4
- import { TemplatesContext } from "../TemplatesContext";
3
+ import TemplatesContext from "../TemplatesContext";
5
4
 
6
5
  describe("<TemplatesTable />", () => {
7
6
  const templates = [
8
7
  {
8
+ id: "1",
9
9
  scope: "bg",
10
10
  name: "testbg",
11
11
  label: "testbg",
12
12
  },
13
13
  {
14
+ id: "2",
14
15
  scope: "dq",
15
16
  name: "testdq",
16
17
  label: "testdq",
17
18
  },
18
19
  ];
19
- const context = { templates };
20
20
 
21
- it("matches the latest snapshot", () => {
22
- const wrapper = shallowWithIntl(
23
- <TemplatesContext.Provider values={context}>
21
+ const renderOpts = {
22
+ state: { templates },
23
+ };
24
+
25
+ it("matches the latest snapshot", async () => {
26
+ const rendered = render(
27
+ <TemplatesContext>
24
28
  <TemplatesTable />
25
- </TemplatesContext.Provider>
29
+ </TemplatesContext>,
30
+ renderOpts
26
31
  );
27
- expect(wrapper).toMatchSnapshot();
32
+ await waitForLoad(rendered);
33
+ expect(rendered.container).toMatchSnapshot();
28
34
  });
29
35
  });