@truedat/dq 4.54.2 → 4.54.4

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.54.4] 2022-10-25
4
+
5
+ ### Added
6
+
7
+ - [TD-3765] Add empty datset status for rule results
8
+
9
+ ## [4.54.3] 2022-10-25
10
+
11
+ ### Added
12
+
13
+ - [TD-4517] Messages for `df_name` Rule filter
14
+
3
15
  ## [4.54.1] 2022-10-24
4
16
 
5
17
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truedat/dq",
3
- "version": "4.54.2",
3
+ "version": "4.54.4",
4
4
  "description": "Truedat Web Data Quality Module",
5
5
  "sideEffects": false,
6
6
  "jsnext:main": "src/index.js",
@@ -34,7 +34,7 @@
34
34
  "@testing-library/jest-dom": "^5.16.4",
35
35
  "@testing-library/react": "^12.0.0",
36
36
  "@testing-library/user-event": "^13.2.1",
37
- "@truedat/test": "4.54.0",
37
+ "@truedat/test": "4.54.4",
38
38
  "babel-jest": "^28.1.0",
39
39
  "babel-plugin-dynamic-import-node": "^2.3.3",
40
40
  "babel-plugin-lodash": "^3.3.4",
@@ -93,8 +93,8 @@
93
93
  },
94
94
  "dependencies": {
95
95
  "@apollo/client": "^3.7.0",
96
- "@truedat/core": "4.54.2",
97
- "@truedat/df": "4.54.2",
96
+ "@truedat/core": "4.54.4",
97
+ "@truedat/df": "4.54.4",
98
98
  "graphql": "^15.5.3",
99
99
  "path-to-regexp": "^1.7.0",
100
100
  "prop-types": "^15.8.1",
@@ -114,5 +114,5 @@
114
114
  "react-dom": ">= 16.8.6 < 17",
115
115
  "semantic-ui-react": ">= 0.88.2 < 2.1"
116
116
  },
117
- "gitHead": "5f8e708ced0c68fbe8a38373f3cc579702f3e7e4"
117
+ "gitHead": "065f4870d4b2195564585d7d70fec26b475f337a"
118
118
  }
@@ -1,6 +1,7 @@
1
1
  import _ from "lodash/fp";
2
2
  import React from "react";
3
3
  import PropTypes from "prop-types";
4
+ import { DateTime } from "@truedat/core/components/DateTime";
4
5
  import { Popup } from "semantic-ui-react";
5
6
  import { Link } from "react-router-dom";
6
7
  import { FormattedMessage, useIntl } from "react-intl";
@@ -17,6 +18,14 @@ export default function ImplementationResultBar({ implementation }) {
17
18
  color: "failed",
18
19
  resultText: intl.formatMessage({ id: "quality.error" }),
19
20
  }
21
+ : ruleResult?.records === 0
22
+ ? {
23
+ color: "empyDataset",
24
+ resultText: intl.formatMessage(
25
+ { id: `quality.result.empty_dataset.date` },
26
+ { date: <DateTime value={ruleResult.date} /> }
27
+ ),
28
+ }
20
29
  : calculateResultDecoration({
21
30
  ruleResult,
22
31
  ruleImplementation: implementation,
@@ -41,6 +50,10 @@ export default function ImplementationResultBar({ implementation }) {
41
50
  className: "not-executed-color",
42
51
  tooltip: "no_execution",
43
52
  },
53
+ empyDataset: {
54
+ className: "empty-dataset-color",
55
+ tooltip: "empty_dataset",
56
+ },
44
57
  failed: {
45
58
  className: "failed-color",
46
59
  tooltip: "failed",
@@ -26,7 +26,9 @@ const staticContentLabels = [
26
26
  "quality_result.under_minimum",
27
27
  "quality_result.under_goal",
28
28
  "quality_result.over_goal",
29
+ "quality_result.failed",
29
30
  "quality_result.no_execution",
31
+ "quality_result.empty_dataset",
30
32
  "executable.true",
31
33
  "executable.false",
32
34
  ];
@@ -26,6 +26,15 @@ export const calculateResultDecoration = ({
26
26
  color: "red",
27
27
  resultText,
28
28
  };
29
+ } else if (ruleResult?.records === 0) {
30
+ const resultText = formatMessage({ id: "quality_result.empty_dataset" });
31
+ return {
32
+ iconName: "warning circle",
33
+ resultText: resultText,
34
+ color: "grey",
35
+ resultText,
36
+ inverted: true,
37
+ };
29
38
  }
30
39
 
31
40
  const { resultType, result_type } = ruleImplementation;
@@ -62,16 +71,22 @@ export const RuleResultDecorator = ({
62
71
  if (nilResult(ruleResult) && isNil(date)) {
63
72
  return null;
64
73
  }
65
- const { iconName, color, resultText, iconTitle } = calculateResultDecoration({
66
- ruleResult,
67
- ruleImplementation,
68
- date,
69
- intl,
70
- });
74
+ const { iconName, color, resultText, iconTitle, inverted } =
75
+ calculateResultDecoration({
76
+ ruleResult,
77
+ ruleImplementation,
78
+ date,
79
+ intl,
80
+ });
71
81
 
72
82
  return (
73
83
  <>
74
- <Icon name={iconName} title={iconTitle} color={color} />
84
+ <Icon
85
+ inverted={inverted}
86
+ name={iconName}
87
+ title={iconTitle}
88
+ color={color}
89
+ />
75
90
  {resultText}
76
91
  </>
77
92
  );
@@ -18,11 +18,20 @@ const GeneralInformation = ({ ruleImplementation, ruleResult }) => {
18
18
  {formatMessage({ id: "ruleResult.props.quality" })}
19
19
  </Table.Cell>
20
20
  <Table.Cell>
21
- <Icon
22
- name="circle"
23
- color={selectColor({ ...ruleImplementation, ...ruleResult })}
24
- />
25
- {`${parseFloat(ruleResult.result)} %`}
21
+ {ruleResult.records === 0 ? (
22
+ <>
23
+ <Icon inverted color="grey" name="warning circle" />
24
+ {formatMessage({ id: "quality_result.empty_dataset" })}
25
+ </>
26
+ ) : (
27
+ <>
28
+ <Icon
29
+ name="circle"
30
+ color={selectColor({ ...ruleImplementation, ...ruleResult })}
31
+ />
32
+ {`${parseFloat(ruleResult.result)} %`}
33
+ </>
34
+ )}
26
35
  </Table.Cell>
27
36
  </Table.Row>
28
37
 
@@ -70,11 +70,20 @@ export const RuleResultRow = ({
70
70
  </Link>
71
71
  </Table.Cell>
72
72
  <Table.Cell>
73
- <Icon
74
- name="circle"
75
- color={selectColor({ ...ruleImplementation, ...ruleResult })}
76
- />
77
- {`${parseFloat(ruleResult.result)} %`}
73
+ {ruleResult.records === 0 ? (
74
+ <>
75
+ <Icon inverted color="grey" name="warning circle" />
76
+ {formatMessage({ id: "quality_result.empty_dataset" })}
77
+ </>
78
+ ) : (
79
+ <>
80
+ <Icon
81
+ name="circle"
82
+ color={selectColor({ ...ruleImplementation, ...ruleResult })}
83
+ />
84
+ {`${parseFloat(ruleResult.result)} %`}
85
+ </>
86
+ )}
78
87
  </Table.Cell>
79
88
  {_.includes("records")(optionalColumns) ? (
80
89
  <Table.Cell>{formatNumber(ruleResult.records)}</Table.Cell>
@@ -26,15 +26,23 @@ const mapSummary = (implementations) => {
26
26
  goal,
27
27
  minimum,
28
28
  result_type,
29
- execution_result_info: { errors, result },
29
+ execution_result_info: { errors, result, records },
30
30
  } = implementation;
31
- const color = selectColor({ errors, result, minimum, goal, result_type });
31
+ const color = selectColor({
32
+ errors,
33
+ result,
34
+ minimum,
35
+ goal,
36
+ result_type,
37
+ records,
38
+ });
32
39
  return _.set(color, summary[color] + 1)(summary);
33
40
  },
34
41
  {
35
42
  green: 0,
36
43
  yellow: 0,
37
44
  red: 0,
45
+ grey: 0,
38
46
  }
39
47
  )(executedImplementations);
40
48
  return {
@@ -43,6 +51,7 @@ const mapSummary = (implementations) => {
43
51
  overGoal: quality.green,
44
52
  underGoal: quality.yellow,
45
53
  underMinimum: quality.red,
54
+ emptyDataset: quality.grey,
46
55
  };
47
56
  };
48
57
 
@@ -117,6 +126,12 @@ const SummaryBars = (props) => {
117
126
  className: "failed-color",
118
127
  tooltip: "failed",
119
128
  })}
129
+ {SummaryBar({
130
+ ...props,
131
+ key: "emptyDataset",
132
+ className: "empty-dataset-color",
133
+ tooltip: "empty_dataset",
134
+ })}
120
135
  </div>
121
136
  );
122
137
  };
@@ -125,8 +140,16 @@ export const RuleSummary = ({ implementations }) => {
125
140
  const [showPercentages, setShowPercentages] = useState(true);
126
141
 
127
142
  const summary = mapSummary(implementations);
128
- const { overGoal, underGoal, underMinimum, notExecuted, failed } = summary;
129
- const total = notExecuted + failed + overGoal + underGoal + underMinimum;
143
+ const {
144
+ overGoal,
145
+ underGoal,
146
+ underMinimum,
147
+ notExecuted,
148
+ failed,
149
+ emptyDataset,
150
+ } = summary;
151
+ const total =
152
+ notExecuted + failed + overGoal + underGoal + underMinimum + emptyDataset;
130
153
 
131
154
  const percentages = _.mapValues((value) => (value / total) * 100)(summary);
132
155
 
@@ -63,6 +63,17 @@ export const SubscriptionContent = ({ subscription, setSubscription }) => {
63
63
  checked={_.includes("fail")(statuses)}
64
64
  onChange={handleEventTypeChange}
65
65
  />
66
+ <Form.Checkbox
67
+ name="empty_dataset"
68
+ label={
69
+ <label>
70
+ <Icon inverted color="grey" name="warning circle" />
71
+ <FormattedMessage id="subscriptions.status.empty_dataset" />
72
+ </label>
73
+ }
74
+ checked={_.includes("empty_dataset")(statuses)}
75
+ onChange={handleEventTypeChange}
76
+ />
66
77
  <Form.Checkbox
67
78
  name="error"
68
79
  label={
@@ -43,6 +43,23 @@ describe("<RuleResultDecorator />", () => {
43
43
  expect(queryByTitle("no_data")).toBeInTheDocument();
44
44
  });
45
45
 
46
+ it("decorates a empty dataset result", () => {
47
+ const ruleImplementation = { resultType: "percentage" };
48
+ const props = {
49
+ ruleResult: {
50
+ result: 0,
51
+ records: 0,
52
+ errors: 0,
53
+ result_text: "Empty dataset",
54
+ },
55
+ };
56
+ const { container } = render(
57
+ <RuleResultDecorator ruleImplementation={ruleImplementation} {...props} />
58
+ );
59
+ expect(container).toMatchSnapshot();
60
+ expect(container).toHaveTextContent("Empty dataset");
61
+ });
62
+
46
63
  it("handles missing execution result", () => {
47
64
  const { container } = render(<RuleResultDecorator />);
48
65
  expect(container).toBeEmptyDOMElement();
@@ -71,6 +71,46 @@ describe("<RuleResultDetails>", () => {
71
71
  expect(getByText("Base64_value")).toBeInTheDocument();
72
72
  });
73
73
 
74
+ it("with empty datset", () => {
75
+ const props = _.update("ruleResult", () => ({
76
+ result: "0",
77
+ records: 0,
78
+ date: "2022-06-24",
79
+ errors: 0,
80
+ hasSegments: false,
81
+ }))(commonProps);
82
+
83
+ const { container } = render(
84
+ <Suspense fallback={null}>
85
+ <RuleResultDetails {...props} />
86
+ </Suspense>,
87
+ renderOpts
88
+ );
89
+ expect(container).toMatchSnapshot();
90
+ expect(container).toHaveTextContent("Empty dataset");
91
+ });
92
+
93
+ it("with empty ruleResult", () => {
94
+ const props = {
95
+ ruleImplementation: {
96
+ id: 1,
97
+ implementation_key: "key",
98
+ minimum: 10,
99
+ goal: 20,
100
+ resultType: "percentage",
101
+ },
102
+ ruleResult: {},
103
+ };
104
+
105
+ const { container } = render(
106
+ <Suspense fallback={null}>
107
+ <RuleResultDetails {...props} />
108
+ </Suspense>,
109
+ renderOpts
110
+ );
111
+ expect(container).toMatchSnapshot();
112
+ });
113
+
74
114
  it("without details", () => {
75
115
  const { container } = render(
76
116
  <Suspense fallback={null}>
@@ -120,6 +120,31 @@ describe("<RuleResultRow />", () => {
120
120
  ).toBeInTheDocument();
121
121
  });
122
122
 
123
+ it("grey icon when result is empty dataset", () => {
124
+ const props = {
125
+ rule: { id: 10 },
126
+ ruleImplementation: {
127
+ id: 23,
128
+ minimum: 81,
129
+ goal: 90,
130
+ resultType: "percentage",
131
+ },
132
+ ruleResult: { id: 54, result: 0, records: 0 },
133
+ date: "2019-08-12T02:00:00Z",
134
+ };
135
+
136
+ const { container } = render(
137
+ <table>
138
+ <tbody>
139
+ <RuleResultRow {...props} />
140
+ </tbody>
141
+ </table>
142
+ );
143
+ expect(
144
+ container.querySelector("td > i.grey.circle.icon")
145
+ ).toBeInTheDocument();
146
+ });
147
+
123
148
  it("renders delete cell in RuleResultRow when user is admin", () => {
124
149
  const props = {
125
150
  rule: { id: 10 },
@@ -39,6 +39,16 @@ describe("<RuleSummary />", () => {
39
39
  },
40
40
  };
41
41
 
42
+ const emptyDataset = {
43
+ ...implementationLimits,
44
+ execution_result_info: {
45
+ date: "2021-07-19T00:01:20Z",
46
+ records: 0,
47
+ result: "0",
48
+ result_text: "quality_result.empty_dataset",
49
+ },
50
+ };
51
+
42
52
  it("render 100% overGoal implementations", () => {
43
53
  const props = {
44
54
  implementations: [overGoalExecution],
@@ -61,13 +71,13 @@ describe("<RuleSummary />", () => {
61
71
  expect(container).toHaveTextContent("33%");
62
72
  });
63
73
 
64
- it("render 50% not executed, failed implementations", () => {
74
+ it("render 25% not executed, failed implementations and empty_dataset", () => {
65
75
  const props = {
66
- implementations: [notExecuted, failedExecution],
76
+ implementations: [notExecuted, failedExecution, emptyDataset],
67
77
  };
68
78
  const { container } = render(<RuleSummary {...props} />);
69
79
  expect(container).toMatchSnapshot();
70
- expect(container).toHaveTextContent("50%");
80
+ expect(container).toHaveTextContent("25%");
71
81
  });
72
82
 
73
83
  it("render without implementations", () => {
@@ -1,5 +1,15 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`<RuleResultDecorator /> decorates a empty dataset result 1`] = `
4
+ <div>
5
+ <i
6
+ aria-hidden="true"
7
+ class="grey warning circle inverted icon"
8
+ />
9
+ Empty dataset
10
+ </div>
11
+ `;
12
+
3
13
  exports[`<RuleResultDecorator /> decorates a percentage result 1`] = `
4
14
  <div>
5
15
  <i
@@ -123,6 +123,99 @@ exports[`<RuleResultDetails> matches the latest snapshot 1`] = `
123
123
  </div>
124
124
  `;
125
125
 
126
+ exports[`<RuleResultDetails> with empty datset 1`] = `
127
+ <div>
128
+ <table
129
+ class="ui table implementation-results medium"
130
+ >
131
+ <thead
132
+ class=""
133
+ >
134
+ <tr
135
+ class=""
136
+ >
137
+ <th
138
+ class=""
139
+ colspan="2"
140
+ >
141
+ Information
142
+ </th>
143
+ </tr>
144
+ </thead>
145
+ <tbody
146
+ class=""
147
+ >
148
+ <tr
149
+ class=""
150
+ >
151
+ <td
152
+ class=""
153
+ >
154
+ Quality
155
+ </td>
156
+ <td
157
+ class=""
158
+ >
159
+ <i
160
+ aria-hidden="true"
161
+ class="grey warning circle inverted icon"
162
+ />
163
+ Empty dataset
164
+ </td>
165
+ </tr>
166
+ <tr
167
+ class=""
168
+ >
169
+ <td
170
+ class=""
171
+ >
172
+ Date
173
+ </td>
174
+ <td
175
+ class=""
176
+ >
177
+ <time
178
+ datetime="1656028800000"
179
+ >
180
+ 2022-06-24 00:00
181
+ </time>
182
+ </td>
183
+ </tr>
184
+ <tr
185
+ class=""
186
+ >
187
+ <td
188
+ class=""
189
+ >
190
+ Records
191
+ </td>
192
+ <td
193
+ class=""
194
+ >
195
+ 0
196
+ </td>
197
+ </tr>
198
+ <tr
199
+ class=""
200
+ >
201
+ <td
202
+ class=""
203
+ >
204
+ Errors
205
+ </td>
206
+ <td
207
+ class=""
208
+ >
209
+ 0
210
+ </td>
211
+ </tr>
212
+ </tbody>
213
+ </table>
214
+ </div>
215
+ `;
216
+
217
+ exports[`<RuleResultDetails> with empty ruleResult 1`] = `<div />`;
218
+
126
219
  exports[`<RuleResultDetails> without details 1`] = `
127
220
  <div>
128
221
  <table
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`<RuleSummary /> render 33% overGoal, underGoal, underMinimum implementations 1`] = `
3
+ exports[`<RuleSummary /> render 25% not executed, failed implementations and empty_dataset 1`] = `
4
4
  <div>
5
5
  <div>
6
6
  <div
@@ -10,33 +10,33 @@ exports[`<RuleSummary /> render 33% overGoal, underGoal, underMinimum implementa
10
10
  class="rule-summary"
11
11
  >
12
12
  <span
13
- class="over-goal-color"
14
- style="width: 33.33333333333333%;"
13
+ class="not-executed-color"
14
+ style="width: 25%;"
15
15
  >
16
16
  <span
17
17
  class="value"
18
18
  >
19
- 33%
19
+ 25%
20
20
  </span>
21
21
  </span>
22
22
  <span
23
- class="under-goal-color"
24
- style="width: 33.33333333333333%;"
23
+ class="failed-color"
24
+ style="width: 25%;"
25
25
  >
26
26
  <span
27
27
  class="value"
28
28
  >
29
- 33%
29
+ 25%
30
30
  </span>
31
31
  </span>
32
32
  <span
33
- class="under-minimum-color"
34
- style="width: 33.33333333333333%;"
33
+ class="empty-dataset-color"
34
+ style="width: 50%;"
35
35
  >
36
36
  <span
37
37
  class="value"
38
38
  >
39
- 33%
39
+ 50%
40
40
  </span>
41
41
  </span>
42
42
  </div>
@@ -45,7 +45,7 @@ exports[`<RuleSummary /> render 33% overGoal, underGoal, underMinimum implementa
45
45
  </div>
46
46
  `;
47
47
 
48
- exports[`<RuleSummary /> render 50% not executed, failed implementations 1`] = `
48
+ exports[`<RuleSummary /> render 33% overGoal, underGoal, underMinimum implementations 1`] = `
49
49
  <div>
50
50
  <div>
51
51
  <div
@@ -55,23 +55,33 @@ exports[`<RuleSummary /> render 50% not executed, failed implementations 1`] = `
55
55
  class="rule-summary"
56
56
  >
57
57
  <span
58
- class="not-executed-color"
59
- style="width: 50%;"
58
+ class="over-goal-color"
59
+ style="width: 33.33333333333333%;"
60
60
  >
61
61
  <span
62
62
  class="value"
63
63
  >
64
- 50%
64
+ 33%
65
65
  </span>
66
66
  </span>
67
67
  <span
68
- class="failed-color"
69
- style="width: 50%;"
68
+ class="under-goal-color"
69
+ style="width: 33.33333333333333%;"
70
70
  >
71
71
  <span
72
72
  class="value"
73
73
  >
74
- 50%
74
+ 33%
75
+ </span>
76
+ </span>
77
+ <span
78
+ class="under-minimum-color"
79
+ style="width: 33.33333333333333%;"
80
+ >
81
+ <span
82
+ class="value"
83
+ >
84
+ 33%
75
85
  </span>
76
86
  </span>
77
87
  </div>
@@ -156,6 +156,26 @@ exports[`<SubscriptionContent /> matches the latest snapshot 1`] = `
156
156
  name="fail"
157
157
  onChange={[Function]}
158
158
  />
159
+ <FormCheckbox
160
+ as={[Function]}
161
+ checked={false}
162
+ control={[Function]}
163
+ label={
164
+ <label>
165
+ <Icon
166
+ as="i"
167
+ color="grey"
168
+ inverted={true}
169
+ name="warning circle"
170
+ />
171
+ <Memo(MemoizedFormattedMessage)
172
+ id="subscriptions.status.empty_dataset"
173
+ />
174
+ </label>
175
+ }
176
+ name="empty_dataset"
177
+ onChange={[Function]}
178
+ />
159
179
  <FormCheckbox
160
180
  as={[Function]}
161
181
  checked={false}
@@ -7,9 +7,10 @@ export const selectColor = ({
7
7
  goal,
8
8
  result_type,
9
9
  resultType,
10
+ records,
10
11
  }) => {
11
12
  const type = _.defaultTo(result_type)(resultType);
12
- if (_.isNil(errors) && _.isNil(result)) return "grey";
13
+ if ((_.isNil(errors) && _.isNil(result)) || records == 0) return "grey";
13
14
  else if (type == "percentage") {
14
15
  if (result < minimum) {
15
16
  return "red";
@@ -50,6 +50,7 @@ export default {
50
50
  "filters.active.raw": "Active",
51
51
  "filters.active.raw.false": "No",
52
52
  "filters.active.raw.true": "Yes",
53
+ "filters.df_name.raw": "Type",
53
54
  "filters.current_business_concept_version": "Concept",
54
55
  "filters.execution_result_info.result_text": "Execution",
55
56
  "filters.result_type.raw": "Result Type",
@@ -128,6 +129,7 @@ export default {
128
129
  "quality.range.errors_number": "error count",
129
130
  "quality.range.percentage": "%",
130
131
  "quality.result": "Result",
132
+ "quality.result.empty_dataset.date": "0 records at {date}",
131
133
  "quality.result.deviation.date": "{result}% at {date}",
132
134
  "quality.result.deviation.description": "{result}%",
133
135
  "quality.result.errors_number.date": "{result} errors at {date}",
@@ -151,6 +153,7 @@ export default {
151
153
  "quality.thresholds": "Limits",
152
154
  "quality.type": "Type",
153
155
  "quality.updated_at": "Last changed",
156
+ "quality_result.empty_dataset": "Empty dataset",
154
157
  "quality_result.failed": "Failed",
155
158
  "quality_result.no_execution": "Not executed",
156
159
  "quality_result.over_goal": "Over goal",
@@ -538,9 +541,11 @@ export default {
538
541
  "ruleImplementations.props.last_execution_at": "Last Execution",
539
542
  "ruleImplementations.props.minimum": "Threshold",
540
543
  "ruleImplementations.props.minimum.placeholder": "Threshold value",
544
+ "ruleImplementations.props.quality_result.empty_dataset": "Empty data",
541
545
  "ruleImplementations.props.quality_result.no_execution": "Not executed",
542
546
  "ruleImplementations.props.quality_result.over_goal": "Over goal",
543
547
  "ruleImplementations.props.quality_result.under_goal": "Under goal",
548
+ "ruleImplementations.props.quality_result.failed": "Failed",
544
549
  "ruleImplementations.props.quality_result.under_minimum": "Under threshold",
545
550
  "ruleImplementations.props.result": "Quality",
546
551
  "ruleImplementations.props.result_type": "Result Type",
@@ -50,6 +50,7 @@ export default {
50
50
  "filters.active.raw": "Activo",
51
51
  "filters.active.raw.false": "No",
52
52
  "filters.active.raw.true": "Sí",
53
+ "filters.df_name.raw": "Tipo",
53
54
  "filters.current_business_concept_version": "Concepto",
54
55
  "filters.execution_result_info.result_text": "Ejecución",
55
56
  "filters.result_type.raw": "Tipo de resultado",
@@ -132,6 +133,7 @@ export default {
132
133
  "quality.range.errors_number": "errores",
133
134
  "quality.range.percentage": "%",
134
135
  "quality.result": "Resultado",
136
+ "quality.result.empty_dataset.date": "Sin datos a {date}",
135
137
  "quality.result.deviation.date": "{result}% de precisión a {date}",
136
138
  "quality.result.deviation.description": "{result}%",
137
139
  "quality.result.errors_number.date": "{result} errores a {date}",
@@ -156,6 +158,7 @@ export default {
156
158
  "quality.type": "Tipo",
157
159
  "quality.updated_at": "Último cambio",
158
160
  "quality_result.failed": "Fallida",
161
+ "quality_result.empty_dataset": "Sin datos",
159
162
  "quality_result.no_execution": "No ejecutada",
160
163
  "quality_result.over_goal": "Cumple el objetivo",
161
164
  "quality_result.under_goal": "Por debajo del objetivo",
@@ -554,10 +557,12 @@ export default {
554
557
  "ruleImplementations.props.last_execution_at": "Última ejecución",
555
558
  "ruleImplementations.props.minimum": "Valor umbral",
556
559
  "ruleImplementations.props.minimum.placeholder": "Umbral",
560
+ "ruleImplementations.props.quality_result.empty_dataset": "Sin datos",
557
561
  "ruleImplementations.props.quality_result.no_execution": "No ejecutada",
558
562
  "ruleImplementations.props.quality_result.over_goal": "Cumple el objetivo",
559
563
  "ruleImplementations.props.quality_result.under_goal":
560
564
  "Por debajo del objetivo",
565
+ "ruleImplementations.props.quality_result.failed": "Fallida",
561
566
  "ruleImplementations.props.quality_result.under_minimum":
562
567
  "Por debajo del umbral",
563
568
  "ruleImplementations.props.result": "Calidad",
@@ -57,6 +57,9 @@
57
57
  .failed-color {
58
58
  background-color: @failedRuleColor;
59
59
  }
60
+ .empty-dataset-color {
61
+ background-color: @emptyDataColor;
62
+ }
60
63
  }
61
64
 
62
65
  .pointer {