@truedat/qx 7.0.7 → 7.1.0

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 (169) hide show
  1. package/package.json +13 -4
  2. package/src/api.js +29 -20
  3. package/src/components/QxRoutes.js +18 -16
  4. package/src/components/__tests__/__fixtures__/helper.js +187 -0
  5. package/src/components/common/TestFormWrapper.js +38 -0
  6. package/src/components/common/__tests__/ResourceSelector.spec.js +18 -7
  7. package/src/components/common/__tests__/__snapshots__/ResourceSelector.spec.js.snap +0 -12
  8. package/src/components/common/expressions/__tests__/Condition.spec.js +4 -1
  9. package/src/components/common/expressions/__tests__/FunctionArgs.spec.js +18 -5
  10. package/src/components/common/expressions/__tests__/ShapeSelector.spec.js +4 -4
  11. package/src/components/common/expressions/__tests__/__snapshots__/FunctionArgs.spec.js.snap +10 -2
  12. package/src/components/common/resourceSelectors/__tests__/DataStructureSelector.spec.js +6 -3
  13. package/src/components/common/resourceSelectors/__tests__/__snapshots__/DataStructureSelector.spec.js.snap +0 -12
  14. package/src/components/dataViews/__tests__/DataViewEditor.spec.js +83 -53
  15. package/src/components/dataViews/__tests__/DataViews.spec.js +14 -1
  16. package/src/components/dataViews/__tests__/__snapshots__/DataViewEditor.spec.js.snap +93 -4
  17. package/src/components/dataViews/queryableProperties/__tests__/SelectField.spec.js +13 -6
  18. package/src/components/functions/__tests__/FunctionEditor.spec.js +2 -34
  19. package/src/components/functions/__tests__/FunctionParams.spec.js +4 -17
  20. package/src/components/functions/__tests__/Functions.spec.js +2 -34
  21. package/src/components/functions/__tests__/__snapshots__/FunctionEditor.spec.js.snap +48 -48
  22. package/src/components/functions/__tests__/__snapshots__/FunctionParams.spec.js.snap +4 -4
  23. package/src/components/functions/__tests__/__snapshots__/Functions.spec.js.snap +4 -4
  24. package/src/components/qualityControls/ControlProperties.js +43 -0
  25. package/src/components/qualityControls/ControlPropertiesView.js +109 -0
  26. package/src/components/qualityControls/EditQualityControl.js +5 -21
  27. package/src/components/qualityControls/IconPopup.js +28 -0
  28. package/src/components/qualityControls/NewDraftQualityControl.js +4 -13
  29. package/src/components/qualityControls/NewQualityControl.js +10 -25
  30. package/src/components/qualityControls/QualityBadge.js +33 -0
  31. package/src/components/qualityControls/QualityControl.js +11 -53
  32. package/src/components/qualityControls/QualityControlActions.js +133 -46
  33. package/src/components/qualityControls/QualityControlEditor.js +114 -135
  34. package/src/components/qualityControls/QualityControlHeader.js +29 -7
  35. package/src/components/qualityControls/QualityControlHistory.js +6 -12
  36. package/src/components/qualityControls/QualityControlQueryModal.js +8 -5
  37. package/src/components/qualityControls/QualityControlRoutes.js +51 -96
  38. package/src/components/qualityControls/QualityControlRow.js +21 -2
  39. package/src/components/qualityControls/QualityControlScores.js +140 -0
  40. package/src/components/qualityControls/QualityControlTabs.js +24 -23
  41. package/src/components/qualityControls/QualityControls.js +142 -59
  42. package/src/components/qualityControls/QualityControlsLabelResults.js +51 -0
  43. package/src/components/qualityControls/QualityControlsTable.js +69 -43
  44. package/src/components/qualityControls/ScoreCriteria.js +40 -0
  45. package/src/components/qualityControls/{ResultCriteria.js → ScoreCriteriaView.js} +26 -42
  46. package/src/components/qualityControls/__tests__/ControlProperties.spec.js +86 -0
  47. package/src/components/qualityControls/__tests__/ControlPropertiesView.spec.js +86 -0
  48. package/src/components/qualityControls/__tests__/EditQualityControl.spec.js +219 -0
  49. package/src/components/qualityControls/__tests__/IconPopup.spec.js +33 -0
  50. package/src/components/qualityControls/__tests__/NewDraftQualityControl.spec.js +253 -0
  51. package/src/components/qualityControls/__tests__/NewQualityControl.spec.js +384 -0
  52. package/src/components/qualityControls/__tests__/QualityBadge.spec.js +30 -0
  53. package/src/components/qualityControls/__tests__/QualityControl.spec.js +47 -0
  54. package/src/components/qualityControls/__tests__/QualityControlActions.spec.js +192 -0
  55. package/src/components/qualityControls/__tests__/QualityControlCrumbs.spec.js +18 -0
  56. package/src/components/qualityControls/__tests__/QualityControlEditor.spec.js +296 -0
  57. package/src/components/qualityControls/__tests__/QualityControlHeader.spec.js +68 -0
  58. package/src/components/qualityControls/__tests__/QualityControlHistory.spec.js +21 -0
  59. package/src/components/qualityControls/__tests__/QualityControlQueryModal.spec.js +77 -0
  60. package/src/components/qualityControls/__tests__/QualityControlRow.spec.js +91 -0
  61. package/src/components/qualityControls/__tests__/QualityControlScores.spec.js +139 -0
  62. package/src/components/qualityControls/__tests__/QualityControlTabs.spec.js +20 -0
  63. package/src/components/qualityControls/__tests__/QualityControls.spec.js +202 -0
  64. package/src/components/qualityControls/__tests__/QualityControlsLabelResults.spec.js +83 -0
  65. package/src/components/qualityControls/__tests__/QualityControlsTable.spec.js +38 -0
  66. package/src/components/qualityControls/__tests__/ScoreCriteria.spec.js +77 -0
  67. package/src/components/qualityControls/__tests__/ScoreCriteriaView.spec.js +62 -0
  68. package/src/components/qualityControls/__tests__/__fixtures__/qualityControlHelper.js +281 -0
  69. package/src/components/qualityControls/__tests__/__snapshots__/ControlProperties.spec.js.snap +151 -0
  70. package/src/components/qualityControls/__tests__/__snapshots__/ControlPropertiesView.spec.js.snap +290 -0
  71. package/src/components/qualityControls/__tests__/__snapshots__/EditQualityControl.spec.js.snap +672 -0
  72. package/src/components/qualityControls/__tests__/__snapshots__/IconPopup.spec.js.snap +10 -0
  73. package/src/components/qualityControls/__tests__/__snapshots__/NewDraftQualityControl.spec.js.snap +648 -0
  74. package/src/components/qualityControls/__tests__/__snapshots__/NewQualityControl.spec.js.snap +336 -0
  75. package/src/components/qualityControls/__tests__/__snapshots__/QualityBadge.spec.js.snap +11 -0
  76. package/src/components/qualityControls/__tests__/__snapshots__/QualityControl.spec.js.snap +255 -0
  77. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlActions.spec.js.snap +85 -0
  78. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlCrumbs.spec.js.snap +25 -0
  79. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlEditor.spec.js.snap +930 -0
  80. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlHeader.spec.js.snap +127 -0
  81. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlHistory.spec.js.snap +75 -0
  82. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlQueryModal.spec.js.snap +27 -0
  83. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlRow.spec.js.snap +113 -0
  84. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlScores.spec.js.snap +161 -0
  85. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlTabs.spec.js.snap +28 -0
  86. package/src/components/qualityControls/__tests__/__snapshots__/QualityControls.spec.js.snap +219 -0
  87. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlsLabelResults.spec.js.snap +11 -0
  88. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlsTable.spec.js.snap +121 -0
  89. package/src/components/qualityControls/__tests__/__snapshots__/ScoreCriteria.spec.js.snap +186 -0
  90. package/src/components/qualityControls/__tests__/__snapshots__/ScoreCriteriaView.spec.js.snap +76 -0
  91. package/src/components/qualityControls/__tests__/qualityByControlMode.spec.js +248 -0
  92. package/src/components/qualityControls/controlProperties/ErrorCount.js +56 -0
  93. package/src/components/qualityControls/controlProperties/Ratio.js +79 -0
  94. package/src/components/qualityControls/controlProperties/__tests__/ErrorCount.spec.js +82 -0
  95. package/src/components/qualityControls/controlProperties/__tests__/Ratio.spec.js +115 -0
  96. package/src/components/qualityControls/controlProperties/__tests__/__snapshots__/ErrorCount.spec.js.snap +62 -0
  97. package/src/components/qualityControls/controlProperties/__tests__/__snapshots__/Ratio.spec.js.snap +143 -0
  98. package/src/components/qualityControls/qualityByControlMode.js +62 -0
  99. package/src/components/qualityControls/qualityControlScoresColumns.js +52 -0
  100. package/src/components/qualityControls/{resultCriterias → scoreCriterias}/Deviation.js +6 -6
  101. package/src/components/qualityControls/{resultCriterias/ErrorsNumber.js → scoreCriterias/ErrorCount.js} +7 -7
  102. package/src/components/qualityControls/{resultCriterias → scoreCriterias}/Percentage.js +6 -6
  103. package/src/components/qualityControls/scoreCriterias/__tests__/Deviation.spec.js +75 -0
  104. package/src/components/qualityControls/scoreCriterias/__tests__/ErrorCount.spec.js +63 -0
  105. package/src/components/qualityControls/scoreCriterias/__tests__/Percentage.spec.js +61 -0
  106. package/src/components/qualityControls/scoreCriterias/__tests__/__snapshots__/Deviation.spec.js.snap +58 -0
  107. package/src/components/qualityControls/scoreCriterias/__tests__/__snapshots__/ErrorCount.spec.js.snap +58 -0
  108. package/src/components/qualityControls/scoreCriterias/__tests__/__snapshots__/Percentage.spec.js.snap +58 -0
  109. package/src/components/{executions/ExecutionGroupsHeader.js → scores/MyScoreGroups.js} +5 -3
  110. package/src/components/scores/QualityBar.js +73 -0
  111. package/src/components/scores/Score.js +32 -0
  112. package/src/components/scores/ScoreContext.js +3 -0
  113. package/src/components/scores/ScoreCrumbs.js +40 -0
  114. package/src/components/scores/ScoreDetails.js +67 -0
  115. package/src/components/scores/ScoreEvents.js +59 -0
  116. package/src/components/scores/ScoreGroup.js +83 -0
  117. package/src/components/scores/ScoreGroupBreadcrumbs.js +25 -0
  118. package/src/components/{qualityControls/ExecutionForm.js → scores/ScoreGroupForm.js} +11 -13
  119. package/src/components/scores/ScoreGroupLink.js +18 -0
  120. package/src/components/scores/ScoreGroupMessage.js +25 -0
  121. package/src/components/{qualityControls/ExecutionPopup.js → scores/ScoreGroupPopup.js} +13 -22
  122. package/src/components/scores/ScoreGroupsTable.js +113 -0
  123. package/src/components/scores/ScoreRoutes.js +32 -0
  124. package/src/components/{executions/ExecutionStatusDecorator.js → scores/ScoreStatusDecorator.js} +10 -8
  125. package/src/components/scores/ScoreTabs.js +32 -0
  126. package/src/components/scores/__tests__/MyScoreGroups.spec.js +31 -0
  127. package/src/components/scores/__tests__/QualityBar.spec.js +55 -0
  128. package/src/components/scores/__tests__/Score.spec.js +41 -0
  129. package/src/components/scores/__tests__/ScoreCrumbs.spec.js +39 -0
  130. package/src/components/scores/__tests__/ScoreDetails.spec.js +38 -0
  131. package/src/components/scores/__tests__/ScoreEvents.spec.js +24 -0
  132. package/src/components/scores/__tests__/ScoreGroup.spec.js +43 -0
  133. package/src/components/scores/__tests__/ScoreGroupBreadcrumbs.spec.js +16 -0
  134. package/src/components/scores/__tests__/ScoreGroupForm.spec.js +78 -0
  135. package/src/components/scores/__tests__/ScoreGroupLink.spec.js +16 -0
  136. package/src/components/scores/__tests__/ScoreGroupMessage.spec.js +20 -0
  137. package/src/components/scores/__tests__/ScoreGroupPopup.spec.js +59 -0
  138. package/src/components/scores/__tests__/ScoreGroupsTable.spec.js +40 -0
  139. package/src/components/scores/__tests__/ScoreStatusDecorator.spec.js +21 -0
  140. package/src/components/scores/__tests__/ScoreTabs.spec.js +27 -0
  141. package/src/components/scores/__tests__/__fixtures__/scoreHelper.js +182 -0
  142. package/src/components/scores/__tests__/__snapshots__/MyScoreGroups.spec.js.snap +154 -0
  143. package/src/components/scores/__tests__/__snapshots__/QualityBar.spec.js.snap +24 -0
  144. package/src/components/scores/__tests__/__snapshots__/Score.spec.js.snap +92 -0
  145. package/src/components/scores/__tests__/__snapshots__/ScoreCrumbs.spec.js.snap +39 -0
  146. package/src/components/scores/__tests__/__snapshots__/ScoreDetails.spec.js.snap +156 -0
  147. package/src/components/scores/__tests__/__snapshots__/ScoreEvents.spec.js.snap +167 -0
  148. package/src/components/scores/__tests__/__snapshots__/ScoreGroup.spec.js.snap +103 -0
  149. package/src/components/scores/__tests__/__snapshots__/ScoreGroupBreadcrumbs.spec.js.snap +29 -0
  150. package/src/components/scores/__tests__/__snapshots__/ScoreGroupForm.spec.js.snap +145 -0
  151. package/src/components/scores/__tests__/__snapshots__/ScoreGroupLink.spec.js.snap +15 -0
  152. package/src/components/scores/__tests__/__snapshots__/ScoreGroupMessage.spec.js.snap +43 -0
  153. package/src/components/scores/__tests__/__snapshots__/ScoreGroupPopup.spec.js.snap +11 -0
  154. package/src/components/scores/__tests__/__snapshots__/ScoreGroupsTable.spec.js.snap +147 -0
  155. package/src/components/scores/__tests__/__snapshots__/ScoreStatusDecorator.spec.js.snap +71 -0
  156. package/src/components/scores/__tests__/__snapshots__/ScoreTabs.spec.js.snap +43 -0
  157. package/src/components/scores/index.js +15 -0
  158. package/src/hooks/useQualityControls.js +3 -9
  159. package/src/hooks/useScoreGroups.js +23 -0
  160. package/src/hooks/useScores.js +22 -0
  161. package/src/styles/Expression.less +16 -0
  162. package/src/styles/scores.less +63 -0
  163. package/src/components/executions/ExecutionGroupBreadcrumbs.js +0 -25
  164. package/src/components/executions/ExecutionGroupContent.js +0 -42
  165. package/src/components/executions/ExecutionGroupLink.js +0 -18
  166. package/src/components/executions/ExecutionGroupMessage.js +0 -27
  167. package/src/components/executions/ExecutionGroupsTable.js +0 -101
  168. package/src/components/executions/executionGroupDetail.js +0 -87
  169. package/src/components/qualityControls/ResultType.js +0 -57
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { FormattedMessage } from "react-intl";
3
+ import { Icon, Popup, Header, List, ListItem } from "semantic-ui-react";
4
+
5
+ export default function IconPopup({ color, label1, value1, label2, value2 }) {
6
+ return (
7
+ <Popup
8
+ trigger={<Icon name="circle" color={color} />}
9
+ content={
10
+ <List>
11
+ <ListItem>
12
+ <Header as="h5">
13
+ <FormattedMessage id={"quality_control.score_criteria"} />
14
+ </Header>
15
+ </ListItem>
16
+ <ListItem>
17
+ <FormattedMessage id={label1} />
18
+ {`: ${value1}`}
19
+ </ListItem>
20
+ <ListItem>
21
+ <FormattedMessage id={label2} />
22
+ {`: ${value2}`}
23
+ </ListItem>
24
+ </List>
25
+ }
26
+ />
27
+ );
28
+ }
@@ -15,8 +15,9 @@ export default function NewDraftQualityControl() {
15
15
  const history = useHistory();
16
16
  const { trigger, isMutating } = useQualityControlCreateDraft(id);
17
17
 
18
- const { data, loading } = useQualityControl(id);
18
+ const { data, loading: qualityControlLoading } = useQualityControl(id);
19
19
  const qualityControl = data?.data;
20
+ const loading = qualityControlLoading || isMutating;
20
21
 
21
22
  const handlePublish = (qualityControl) =>
22
23
  trigger({
@@ -29,20 +30,10 @@ export default function NewDraftQualityControl() {
29
30
  history.push(linkTo.QUALITY_CONTROL({ id }));
30
31
  });
31
32
  const handleSave = (qualityControl) => {
32
- const resource = _.prop("resource")(qualityControl);
33
- const validation = _.prop("validation")(qualityControl);
34
33
  trigger({
35
34
  quality_control: {
36
35
  ...qualityControl,
37
36
  status: "draft",
38
- resource: _.conforms({ type: _.isNil })(resource) ? null : resource,
39
- validation: _.isEqual([
40
- {
41
- expressions: [{ shape: "function", value: { isCondition: true } }],
42
- },
43
- ])(validation)
44
- ? []
45
- : validation,
46
37
  },
47
38
  }).then((data) => {
48
39
  const id = _.prop("data.data.id")(data);
@@ -50,7 +41,7 @@ export default function NewDraftQualityControl() {
50
41
  });
51
42
  };
52
43
  return (
53
- <Segment floated="left" loading={isMutating || loading}>
44
+ <Segment floated="left" loading={loading}>
54
45
  <Container text>
55
46
  <Header as="h2">
56
47
  <Icon circular name="archive" />
@@ -68,7 +59,7 @@ export default function NewDraftQualityControl() {
68
59
  onPublish={handlePublish}
69
60
  onSave={handleSave}
70
61
  onCancel={() => history.push(QUALITY_CONTROLS)}
71
- isSubmitting={false}
62
+ isSubmitting={loading}
72
63
  />
73
64
  ) : null}
74
65
  </Container>
@@ -7,11 +7,17 @@ import { QUALITY_CONTROLS, linkTo } from "@truedat/core/routes";
7
7
  import { useQualityControlCreate } from "../../hooks/useQualityControls";
8
8
  import QualityControlEditor from "./QualityControlEditor";
9
9
 
10
+ export const defaultQualityControl = {
11
+ name: "",
12
+ active: true,
13
+ domain_ids: [],
14
+ df_type: null,
15
+ };
10
16
  export default function NewQualityControl() {
11
17
  const history = useHistory();
12
18
  const { trigger, isMutating } = useQualityControlCreate();
13
19
 
14
- const handlePublish = (qualityControl) =>
20
+ const handlePublish = (qualityControl) => {
15
21
  trigger({
16
22
  quality_control: {
17
23
  ...qualityControl,
@@ -21,21 +27,12 @@ export default function NewQualityControl() {
21
27
  const id = _.prop("data.data.id")(data);
22
28
  history.push(linkTo.QUALITY_CONTROL({ id }));
23
29
  });
30
+ };
24
31
  const handleSave = (qualityControl) => {
25
- const resource = _.prop("resource")(qualityControl);
26
- const validation = _.prop("validation")(qualityControl);
27
32
  trigger({
28
33
  quality_control: {
29
34
  ...qualityControl,
30
35
  status: "draft",
31
- resource: _.conforms({ type: _.isNil })(resource) ? null : resource,
32
- validation: _.isEqual([
33
- {
34
- expressions: [{ shape: "function", value: { isCondition: true } }],
35
- },
36
- ])(validation)
37
- ? []
38
- : validation,
39
36
  },
40
37
  }).then((data) => {
41
38
  const id = _.prop("data.data.id")(data);
@@ -56,24 +53,12 @@ export default function NewQualityControl() {
56
53
  </Header.Content>
57
54
  </Header>
58
55
  <QualityControlEditor
59
- value={{
60
- name: "",
61
- domain_ids: [],
62
- // df_content: {},
63
- df_type: null,
64
- validation: [
65
- {
66
- expressions: [
67
- { shape: "function", value: { isCondition: true } },
68
- ],
69
- },
70
- ],
71
- }}
56
+ value={defaultQualityControl}
72
57
  isModification={false}
73
58
  onPublish={handlePublish}
74
59
  onSave={handleSave}
75
60
  onCancel={() => history.push(QUALITY_CONTROLS)}
76
- isSubmitting={false}
61
+ isSubmitting={isMutating}
77
62
  />
78
63
  </Container>
79
64
  </Segment>
@@ -0,0 +1,33 @@
1
+ import _ from "lodash/fp";
2
+ import React from "react";
3
+ import { FormattedMessage } from "react-intl";
4
+ import { Icon } from "semantic-ui-react";
5
+ import IconPopup from "./IconPopup";
6
+ import qualityByControlMode from "./qualityByControlMode";
7
+
8
+ export default function QualityBadge({ score }) {
9
+ const quality = qualityByControlMode(score);
10
+
11
+ return quality.isFailed ? (
12
+ <>
13
+ <Icon color="red" name="warning circle" />
14
+ <FormattedMessage id={"score.status.failed"} />
15
+ </>
16
+ ) : quality.isEmpty ? (
17
+ <>
18
+ <Icon inverted color="grey" name="warning circle" />
19
+ <FormattedMessage id={"score.no_results"} />
20
+ </>
21
+ ) : (
22
+ <>
23
+ <IconPopup
24
+ color={quality.color}
25
+ label1={quality.label1}
26
+ value1={quality.value1}
27
+ label2={quality.label2}
28
+ value2={quality.value2}
29
+ />
30
+ {quality.text}
31
+ </>
32
+ );
33
+ }
@@ -1,11 +1,11 @@
1
1
  import _ from "lodash/fp";
2
2
  import React, { useContext } from "react";
3
3
  import { FormattedMessage } from "react-intl";
4
- import { Header, Icon, Segment, List, Label } from "semantic-ui-react";
4
+ import { Header, Icon, List, Label } from "semantic-ui-react";
5
5
 
6
- import ClauseViewer from "@truedat/qx/components/common/ClauseViewer";
7
6
  import QxContext from "../QxContext";
8
- import ResultCriteria from "./ResultCriteria";
7
+ import ScoreCriteriaView from "./ScoreCriteriaView";
8
+ import ControlPropertiesView from "./ControlPropertiesView";
9
9
 
10
10
  const DynamicFormViewer = React.lazy(() =>
11
11
  import("@truedat/df/components/DynamicFormViewer")
@@ -18,14 +18,16 @@ export default function QualityControl() {
18
18
  <List size="big" relaxed>
19
19
  <List.Item>
20
20
  <List.Header>
21
- <FormattedMessage id="quality_control.form.domain_ids" />{" "}
21
+ <FormattedMessage id="quality_control.form.domain_ids" />
22
22
  {_.map((domain) => <Label key={domain.id}>{domain.name}</Label>)(
23
23
  qualityControl.domains
24
24
  )}
25
25
  </List.Header>
26
26
  </List.Item>
27
27
  </List>
28
- <ResultCriteria qualityControl={qualityControl} />
28
+
29
+ <ScoreCriteriaView qualityControl={qualityControl} />
30
+
29
31
  {qualityControl.df_type ? (
30
32
  <>
31
33
  <Header as="h3">
@@ -37,57 +39,13 @@ export default function QualityControl() {
37
39
  <DynamicFormViewer
38
40
  boxLayout
39
41
  template={qualityControl.df_type}
40
- content={qualityControl.df_content}
42
+ content={qualityControl.dynamic_content}
43
+ domainIds={qualityControl.domain_ids}
41
44
  />
42
45
  </>
43
46
  ) : null}
44
- <>
45
- <Header as="h3">
46
- <Icon name="puzzle piece" size="small" />
47
- <Header.Content>
48
- <FormattedMessage id="quality_control.form.implementation" />
49
- </Header.Content>
50
- </Header>
51
- <Segment>
52
- <List>
53
- <List.Item>
54
- <List.Header>
55
- <FormattedMessage id="quality_control.form.dataset" />
56
- </List.Header>
57
- <List.Content>
58
- {qualityControl.resource ? (
59
- <List.Description>
60
- <Label horizontal>
61
- <FormattedMessage
62
- id={`queryables.resource.selector.${qualityControl.resource?.type}`}
63
- />
64
- </Label>
65
- <Label color="blue">
66
- {_.prop("resource.embedded.name")(qualityControl)}
67
- </Label>
68
- </List.Description>
69
- ) : (
70
- <FormattedMessage id="quality_control.form.dataset.empty" />
71
- )}
72
- </List.Content>
73
- </List.Item>
74
- <List.Item>
75
- <List.Header>
76
- <FormattedMessage id="quality_control.form.validation" />
77
- </List.Header>
78
- <List.Content>
79
- {qualityControl.validation ? (
80
- <List.Description>
81
- <ClauseViewer clause={qualityControl.validation} />
82
- </List.Description>
83
- ) : (
84
- <FormattedMessage id="quality_control.form.validation.empty" />
85
- )}
86
- </List.Content>
87
- </List.Item>
88
- </List>
89
- </Segment>
90
- </>
47
+
48
+ <ControlPropertiesView qualityControl={qualityControl} />
91
49
  </>
92
50
  );
93
51
  }
@@ -1,67 +1,154 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
2
+ import React, { useContext } from "react";
3
3
  import PropTypes from "prop-types";
4
4
  import { useIntl } from "react-intl";
5
- import { Link } from "react-router-dom";
5
+ import { Link, useHistory } from "react-router-dom";
6
6
  import { Button, Container } from "semantic-ui-react";
7
7
  import { linkTo } from "@truedat/core/routes";
8
8
  import { useAuthorized } from "@truedat/core/hooks";
9
- import { useQualityControlUpdateStatus } from "../../hooks/useQualityControls";
9
+ import { ConfirmModal, GroupActions } from "@truedat/core/components";
10
+ import { useScoreGroupCreate } from "../../hooks/useScoreGroups";
11
+ import QxContext from "../QxContext";
12
+ import { ScoreGroupPopup } from "../scores";
13
+ import {
14
+ useQualityControlUpdateStatus,
15
+ useQualityControlUpdateMain,
16
+ } from "../../hooks/useQualityControls";
10
17
  import QualityControlQueryModal from "./QualityControlQueryModal";
11
18
 
12
- export default function QualityControlActions({
13
- actions,
14
- qualityControl,
15
- mutate,
16
- }) {
19
+ export const ConfirmToggleActiveModal = ({ onConfirm, qualityControl }) => {
17
20
  const { formatMessage } = useIntl();
18
- const { trigger, isMutating } = useQualityControlUpdateStatus(
19
- qualityControl.id
21
+ const { active, name } = qualityControl || {};
22
+ const action = active ? "disable" : "enable";
23
+ const icon = active ? "pause" : "play";
24
+ return (
25
+ <ConfirmModal
26
+ icon={icon}
27
+ trigger={
28
+ <Button
29
+ icon={icon}
30
+ content={formatMessage({ id: `quality_controls.actions.${action}` })}
31
+ />
32
+ }
33
+ header={formatMessage({
34
+ id: `quality_controls.actions.${action}.confirmation.header`,
35
+ })}
36
+ size="small"
37
+ content={formatMessage(
38
+ { id: `quality_controls.actions.${action}.confirmation.content` },
39
+ { name: <i>{name}</i> }
40
+ )}
41
+ onConfirm={() => onConfirm()}
42
+ />
20
43
  );
44
+ };
45
+
46
+ ConfirmToggleActiveModal.propTypes = {
47
+ action: PropTypes.object,
48
+ onConfirm: PropTypes.func,
49
+ };
50
+
51
+ export default function QualityControlActions() {
52
+ const history = useHistory();
53
+ const { formatMessage } = useIntl();
21
54
  const authorized = useAuthorized();
55
+ const { qualityControl, actions, mutate } = useContext(QxContext);
56
+ const { trigger: updateQualityControlStatus, isMutating } =
57
+ useQualityControlUpdateStatus(qualityControl.id);
58
+
59
+ const { trigger: updateMainQualityControl, isMutating: isMutatingMain } =
60
+ useQualityControlUpdateMain(qualityControl.id);
22
61
 
23
- const updateStatus = (action) => trigger({ action }).then(() => mutate());
62
+ const { trigger: triggerCreateScoreGroup, loading: groupCreating } =
63
+ useScoreGroupCreate();
64
+
65
+ const updateStatus = (action) =>
66
+ updateQualityControlStatus({ action }).then(() => mutate());
67
+
68
+ const toggleActive = () =>
69
+ updateMainQualityControl({
70
+ quality_control: { active: !qualityControl.active },
71
+ }).then(() => mutate());
72
+
73
+ const availableActions = _.flow(
74
+ _.reject(_.includes(["delete_score"])),
75
+ _.map((action) => {
76
+ const actionIcon = {
77
+ create_draft: "edit",
78
+ deprecate: "folder open outline",
79
+ edit: "edit",
80
+ publish: "bullhorn",
81
+ reject: "window close outline",
82
+ restore: "undo",
83
+ send_to_approval: "send",
84
+ send_to_draft: "clipboard outline",
85
+ };
86
+ const base = {
87
+ key: action,
88
+ disabled: isMutating || isMutatingMain,
89
+ icon: _.prop(action)(actionIcon),
90
+ };
91
+ switch (action) {
92
+ case "create_draft":
93
+ return {
94
+ ...base,
95
+ as: Link,
96
+ to: linkTo.QUALITY_CONTROL_NEW_DRAFT(qualityControl),
97
+ text: formatMessage({ id: `quality_controls.actions.${action}` }),
98
+ };
99
+ case "edit":
100
+ return {
101
+ ...base,
102
+ as: Link,
103
+ to: linkTo.QUALITY_CONTROL_EDIT(qualityControl),
104
+ text: formatMessage({ id: `quality_controls.actions.${action}` }),
105
+ };
106
+ case "toggle_active":
107
+ return {
108
+ ...base,
109
+ as: ConfirmToggleActiveModal,
110
+ onConfirm: toggleActive,
111
+ qualityControl: qualityControl,
112
+ };
113
+ default:
114
+ return {
115
+ ...base,
116
+ text: formatMessage({ id: `quality_controls.actions.${action}` }),
117
+ onClick: () => updateStatus(action),
118
+ };
119
+ }
120
+ })
121
+ )(actions);
122
+
123
+ const onCreateScoreGroup = ({ content, df_type }) => {
124
+ const score_group = {
125
+ dynamic_content: content,
126
+ df_type,
127
+ };
128
+
129
+ triggerCreateScoreGroup({
130
+ score_group,
131
+ ids: [qualityControl.version_id],
132
+ }).then(({ data }) => {
133
+ const id = _.prop("data.id")(data);
134
+ history.push(linkTo.SCORE_GROUP({ id }));
135
+ });
136
+ };
24
137
 
25
138
  return (
26
139
  <Container textAlign="right">
27
140
  {authorized ? (
28
141
  <QualityControlQueryModal qualityControlId={qualityControl.id} />
29
142
  ) : null}
30
- {_.map((action) =>
31
- action === "create_draft" ? (
32
- <Button
33
- key={action}
34
- primary
35
- as={Link}
36
- disabled={isMutating}
37
- to={linkTo.QUALITY_CONTROL_NEW_DRAFT(qualityControl)}
38
- content={formatMessage({
39
- id: `quality_controls.actions.${action}`,
40
- })}
41
- />
42
- ) : action === "edit" ? (
43
- <Button
44
- key={action}
45
- primary
46
- as={Link}
47
- disabled={isMutating}
48
- to={linkTo.QUALITY_CONTROL_EDIT(qualityControl)}
49
- content={formatMessage({
50
- id: `quality_controls.actions.${action}`,
51
- })}
52
- />
53
- ) : (
54
- <Button
55
- key={action}
56
- primary
57
- disabled={isMutating}
58
- onClick={() => updateStatus(action)}
59
- content={formatMessage({
60
- id: `quality_controls.actions.${action}`,
61
- })}
62
- />
63
- )
64
- )(actions)}
143
+
144
+ {qualityControl.active &&
145
+ !_.includes(qualityControl.status)(["deprecated", "versioned"]) ? (
146
+ <ScoreGroupPopup
147
+ loading={groupCreating}
148
+ onSubmit={onCreateScoreGroup}
149
+ />
150
+ ) : null}
151
+ <GroupActions availableActions={availableActions} />
65
152
  </Container>
66
153
  );
67
154
  }