@truedat/df 5.7.7 → 5.8.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truedat/df",
3
- "version": "5.7.7",
3
+ "version": "5.8.1",
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.5",
35
35
  "@testing-library/react": "^12.0.0",
36
36
  "@testing-library/user-event": "^13.2.1",
37
- "@truedat/test": "5.7.5",
37
+ "@truedat/test": "5.8.1",
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",
@@ -87,8 +87,8 @@
87
87
  },
88
88
  "dependencies": {
89
89
  "@apollo/client": "^3.7.1",
90
- "@truedat/auth": "5.7.5",
91
- "@truedat/core": "5.7.5",
90
+ "@truedat/auth": "5.8.1",
91
+ "@truedat/core": "5.8.1",
92
92
  "decode-uri-component": "^0.2.2",
93
93
  "path-to-regexp": "^1.7.0",
94
94
  "prop-types": "^15.8.1",
@@ -109,5 +109,5 @@
109
109
  "react-dom": ">= 16.8.6 < 17",
110
110
  "semantic-ui-react": ">= 2.0.3 < 2.2"
111
111
  },
112
- "gitHead": "83ed64e0a2c2c69601a924441e211a38e3b23a78"
112
+ "gitHead": "aacafb9e014ac8d1193a5dc2a37c92ea36c3d816"
113
113
  }
@@ -27,6 +27,7 @@ const validateHierarchy = (hierarchy) => {
27
27
  const hasError =
28
28
  _.isEmpty(node.name) ||
29
29
  node.name === "" ||
30
+ node.name.includes("/") ||
30
31
  hasDuplicatedSiblings(node, hierarchy);
31
32
  return {
32
33
  ...node,
@@ -82,9 +82,24 @@ export const DynamicField = ({
82
82
  }) => (
83
83
  <Form.Field disabled={!editable && isModification} data-testid="form-field">
84
84
  <label>
85
- {label ? (
85
+ {(label && fieldProps.type != "hierarchy") ||
86
+ (fieldProps.type == "hierarchy" &&
87
+ fieldProps.values.hierarchy.min_depth == 0) ? (
86
88
  <FormattedMessage id={`fields.${label}`} defaultMessage={label} />
87
89
  ) : null}
90
+ {label &&
91
+ fieldProps.type == "hierarchy" &&
92
+ fieldProps.values.hierarchy.min_depth > 0 ? (
93
+ <>
94
+ <FormattedMessage id={`fields.${label}`} defaultMessage={label} />
95
+ <Label pointing="left">
96
+ <FormattedMessage
97
+ id="hierarchy.selectable.mindepth"
98
+ values={{ depth: fieldProps.values.hierarchy.min_depth }}
99
+ />
100
+ </Label>
101
+ </>
102
+ ) : null}
88
103
  {fieldProps?.required && (
89
104
  <span
90
105
  style={{
@@ -32,7 +32,6 @@ export const HierarchyDropdown = ({
32
32
  };
33
33
 
34
34
  const multiple = _.includes(cardinality)(["+", "*"]);
35
-
36
35
  return (
37
36
  <>
38
37
  {loading ? <Form.Input loading /> : null}
@@ -8,7 +8,7 @@ describe("<HierarchyDropdown />", () => {
8
8
  name: "foo",
9
9
  cardinality: "*",
10
10
  value: "",
11
- values: { hierarchy: 50 },
11
+ values: { hierarchy: { id: 50, min_depth: null } },
12
12
  },
13
13
  onChange: jest.fn(),
14
14
  };
@@ -26,6 +26,7 @@ export default {
26
26
  "hierarchy.name": "Hierarchy name",
27
27
  "hierarchy.new_node": "New node",
28
28
  "hierarchy.node": "Node",
29
+ "hierarchy.selectable.mindepth": "Selectable minimum level: {depth}",
29
30
  "navigation.admin.templates": "Templates",
30
31
  "navigation.hierarchies": "Hierarchies",
31
32
  "navigation.templates": "Templates",
@@ -69,6 +70,8 @@ export default {
69
70
  "template.field.type.copy": "File Structure",
70
71
  "template.field.type.date": "Date",
71
72
  "template.field.type.datetime": "Date Time",
73
+ "template.field.type.depth":
74
+ "Selectable minimun level (to allow everything, set value: 0)",
72
75
  "template.field.type.domain": "Domain",
73
76
  "template.field.type.enriched_text": "Enriched text",
74
77
  "template.field.type.float": "Float",
@@ -26,6 +26,7 @@ export default {
26
26
  "hierarchy.name": "Nombre de jerarquía",
27
27
  "hierarchy.new_node": "Nuevo nodo",
28
28
  "hierarchy.node": "Nodo",
29
+ "hierarchy.selectable.mindepth": "Nivel minimo seleccionable: {depth}",
29
30
  "navigation.admin.templates": "Plantillas",
30
31
  "navigation.hierarchies": "Jerarquías",
31
32
  "navigation.templates": "Plantillas",
@@ -69,6 +70,8 @@ export default {
69
70
  "template.field.type.copy": "Estructura de Fichero",
70
71
  "template.field.type.date": "Fecha",
71
72
  "template.field.type.datetime": "Fecha Hora",
73
+ "template.field.type.depth":
74
+ "Nivel mínimo seleccionable (para permitir todo, establecer valor: 0)",
72
75
  "template.field.type.domain": "Dominio",
73
76
  "template.field.type.enriched_text": "Texto enriquecido",
74
77
  "template.field.type.float": "Decimal",
@@ -7,6 +7,14 @@ import DateTimeField from "../../../components/widgets/DateTimeField";
7
7
  import DateField from "../../../components/widgets/DateField";
8
8
 
9
9
  const defaultValueFormat = (d) => (_.isArray(d) ? _.first(d) : d);
10
+ const multipleDefaultValueFormat = (d) => {
11
+ switch (d) {
12
+ case "":
13
+ return [];
14
+ default:
15
+ return !_.isArray(d) ? [d] : d;
16
+ }
17
+ };
10
18
 
11
19
  export const DefaultValue = ({
12
20
  defaultField,
@@ -36,7 +44,24 @@ export const DefaultValue = ({
36
44
  });
37
45
  };
38
46
 
47
+ const onMultipleDefaultValueChange = (e, { value }) => {
48
+ onChange(null, {
49
+ name: defaultField,
50
+ value: value,
51
+ });
52
+ };
53
+
39
54
  const fixedValues = _.pathOr([], "values.fixed")(field) || [];
55
+
56
+ const multipleDefalultsAvaliableCardinality = ["*", "+"];
57
+ const multipleDefalultsAvaliableWidget = ["string", "dropdown", "checkbox"];
58
+ const multipleDefalultsDisableType = ["fixed_tuple", "switch", "domain"];
59
+ const multipleDefault =
60
+ fieldType === "string" &&
61
+ multipleDefalultsAvaliableCardinality.includes(field.cardinality) &&
62
+ multipleDefalultsAvaliableWidget.includes(field.widget) &&
63
+ !multipleDefalultsDisableType.includes(type);
64
+
40
65
  return (
41
66
  <>
42
67
  {!type && fieldType === "date" && (
@@ -69,24 +94,24 @@ export const DefaultValue = ({
69
94
  "datetime",
70
95
  "integer",
71
96
  "float",
72
- ]) && (
97
+ ]) &&
98
+ !multipleDefault && (
73
99
  <Form.Input
74
100
  name="default_value"
75
- placeholder={formatMessage({
101
+ label={formatMessage({
76
102
  id: "template.field.values.default_value",
77
103
  })}
78
104
  value={_.get("default")(field)}
79
105
  onChange={onDefaultValueChange}
80
106
  />
81
107
  )}
82
- {type == "fixed" && (
108
+ {type == "fixed" && !multipleDefault && (
83
109
  <Form.Dropdown
84
110
  fluid
85
111
  selection
86
112
  label={formatMessage({ id: "template.field.values.default_value" })}
87
113
  onChange={onDefaultValueChange}
88
114
  value={defaultValueFormat(_.get("default")(field))}
89
- required
90
115
  options={_.map((v) => ({
91
116
  key: v,
92
117
  value: v,
@@ -94,6 +119,39 @@ export const DefaultValue = ({
94
119
  }))(["", ...fixedValues])}
95
120
  />
96
121
  )}
122
+ {multipleDefault &&
123
+ (field.widget === "dropdown" || field.widget === "checkbox") && (
124
+ <Form.Dropdown
125
+ fluid
126
+ selection
127
+ multiple
128
+ label={formatMessage({ id: "template.field.values.default_value" })}
129
+ onChange={onMultipleDefaultValueChange}
130
+ value={multipleDefaultValueFormat(_.get("default")(field))}
131
+ options={_.map((v) => ({
132
+ key: v,
133
+ value: v,
134
+ text: v,
135
+ }))(["", ...fixedValues])}
136
+ />
137
+ )}
138
+ {multipleDefault && field.widget === "string" && (
139
+ <Form.Dropdown
140
+ fluid
141
+ selection
142
+ multiple
143
+ search
144
+ allowAdditions
145
+ label={formatMessage({ id: "template.field.values.default_value" })}
146
+ onChange={onMultipleDefaultValueChange}
147
+ value={multipleDefaultValueFormat(_.get("default")(field))}
148
+ options={_.map((v) => ({
149
+ key: v,
150
+ value: v,
151
+ text: v,
152
+ }))(["", ...multipleDefaultValueFormat(_.get("default")(field))])}
153
+ />
154
+ )}
97
155
  </>
98
156
  );
99
157
  };
@@ -1,19 +1,18 @@
1
1
  import _ from "lodash/fp";
2
- import React, { useState, useEffect } from "react";
2
+ import React from "react";
3
3
  import PropTypes from "prop-types";
4
4
  import { useIntl } from "react-intl";
5
5
  import { Form } from "semantic-ui-react";
6
6
  import { useHierarchies } from "../../../hooks/useHierarchies";
7
7
 
8
- export const HierarchiesList = ({
9
- hierarchies,
10
- onChange,
11
- values: value,
12
- loading,
13
- }) => {
8
+ export const HierarchiesList = ({ hierarchies, onChange, values, loading }) => {
14
9
  const { formatMessage } = useIntl();
15
10
 
16
- const handleChange = (_e, { value }) => onChange(value);
11
+ const handleChange = (_e, { value, name }) =>
12
+ onChange({
13
+ ...values,
14
+ [name]: value,
15
+ });
17
16
 
18
17
  const options = _.flow(
19
18
  _.map(({ id, name }) => ({ text: name, value: id })),
@@ -24,9 +23,10 @@ export const HierarchiesList = ({
24
23
  <Form.Group size="small" widths="equal">
25
24
  <Form.Dropdown
26
25
  required
26
+ name="id"
27
27
  selection
28
28
  label={
29
- value === ""
29
+ values?.id === ""
30
30
  ? ""
31
31
  : formatMessage({ id: "template.field.type.hierarchy" })
32
32
  }
@@ -36,7 +36,15 @@ export const HierarchiesList = ({
36
36
  })}
37
37
  onChange={handleChange}
38
38
  options={options}
39
- value={value}
39
+ value={values?.id}
40
+ />
41
+ <Form.Input
42
+ type="number"
43
+ required
44
+ name="min_depth"
45
+ label={formatMessage({ id: "template.field.type.depth" })}
46
+ onChange={handleChange}
47
+ value={values.min_depth}
40
48
  />
41
49
  </Form.Group>
42
50
  );
@@ -45,7 +53,6 @@ export const HierarchiesList = ({
45
53
  HierarchiesList.propTypes = {
46
54
  hierarchies: PropTypes.array,
47
55
  onChange: PropTypes.func,
48
- onDefaultValueChange: PropTypes.func,
49
56
  values: PropTypes.number,
50
57
  loading: PropTypes.bool,
51
58
  };
@@ -15,7 +15,7 @@ describe("<DefaultValue />", () => {
15
15
  fieldType,
16
16
  formatMessage,
17
17
  onChange,
18
- type
18
+ type,
19
19
  };
20
20
 
21
21
  it("matches the latest snapshot for null values", () => {
@@ -30,7 +30,7 @@ describe("<DefaultValue />", () => {
30
30
  fieldType: "date",
31
31
  formatMessage,
32
32
  onChange,
33
- type: null
33
+ type: null,
34
34
  };
35
35
  const wrapper = shallow(<DefaultValue {...props} />);
36
36
  expect(wrapper.find("DateField").length).toBe(1);
@@ -45,7 +45,7 @@ describe("<DefaultValue />", () => {
45
45
  fieldType: "datetime",
46
46
  formatMessage,
47
47
  onChange,
48
- type: null
48
+ type: null,
49
49
  };
50
50
  const wrapper = shallow(<DefaultValue {...props} />);
51
51
  expect(wrapper.find("DateTimeField").length).toBe(1);
@@ -60,7 +60,7 @@ describe("<DefaultValue />", () => {
60
60
  fieldType: "integer",
61
61
  formatMessage,
62
62
  onChange,
63
- type: null
63
+ type: null,
64
64
  };
65
65
  const wrapper = shallow(<DefaultValue {...props} />);
66
66
  expect(wrapper.find("NumberField").length).toBe(1);
@@ -75,7 +75,7 @@ describe("<DefaultValue />", () => {
75
75
  fieldType: "float",
76
76
  formatMessage,
77
77
  onChange,
78
- type: null
78
+ type: null,
79
79
  };
80
80
  const wrapper = shallow(<DefaultValue {...props} />);
81
81
  expect(wrapper.find("NumberField").length).toBe(1);
@@ -95,13 +95,164 @@ describe("<DefaultValue />", () => {
95
95
  expect(wrapper.find("FormDropdown").length).toBe(1);
96
96
  });
97
97
 
98
+ it("renders form dropdown when type is fixed, widget is dropdown, fieldType is string and cardinality ? or 1", () => {
99
+ const cardinalityes = ["?", "1"];
100
+
101
+ cardinalityes.forEach((cardinality) => {
102
+ const props = {
103
+ defaultField,
104
+ field: { cardinality: cardinality, widget: "dropdown" },
105
+ fieldType: "string",
106
+ formatMessage,
107
+ onChange,
108
+ type: "fixed",
109
+ };
110
+
111
+ const wrapper = shallow(<DefaultValue {...props} />);
112
+ expect(wrapper.find("DateTimeField").length).toBe(0);
113
+ expect(wrapper.find("FormInput").length).toBe(0);
114
+ expect(wrapper.find("FormDropdown").length).toBe(1);
115
+ expect(wrapper.find("FormDropdown").prop("multiple")).toBe(undefined);
116
+ });
117
+ });
118
+
119
+ it("renders form dropdown multiple when widget is dropdown, fieldType is string and cardinality * or +", () => {
120
+ const cardinalityes = ["*", "+"];
121
+
122
+ cardinalityes.forEach((cardinality) => {
123
+ const props = {
124
+ defaultField,
125
+ field: { cardinality: cardinality, widget: "dropdown" },
126
+ fieldType: "string",
127
+ formatMessage,
128
+ onChange,
129
+ type: null,
130
+ };
131
+
132
+ const wrapper = shallow(<DefaultValue {...props} />);
133
+ expect(wrapper.find("DateTimeField").length).toBe(0);
134
+ expect(wrapper.find("FormInput").length).toBe(0);
135
+ expect(wrapper.find("FormDropdown").length).toBe(1);
136
+ expect(wrapper.find("FormDropdown").prop("multiple")).toBe(true);
137
+ });
138
+ });
139
+
140
+ it("renders form dropdown when widget is checkbox, fieldType is string and cardinality ? or 1", () => {
141
+ const cardinalityes = ["?", "1"];
142
+
143
+ cardinalityes.forEach((cardinality) => {
144
+ const props = {
145
+ defaultField,
146
+ field: { cardinality: cardinality, widget: "checkbox" },
147
+ fieldType: "string",
148
+ formatMessage,
149
+ onChange,
150
+ type: "fixed",
151
+ };
152
+
153
+ const wrapper = shallow(<DefaultValue {...props} />);
154
+ expect(wrapper.find("DateTimeField").length).toBe(0);
155
+ expect(wrapper.find("FormInput").length).toBe(0);
156
+ expect(wrapper.find("FormDropdown").length).toBe(1);
157
+ expect(wrapper.find("FormDropdown").prop("multiple")).toBe(undefined);
158
+ });
159
+ });
160
+
161
+ it("renders form dropdown multiple when widget is checkbox, fieldType is string and cardinality * or +", () => {
162
+ const cardinalityes = ["*", "+"];
163
+
164
+ cardinalityes.forEach((cardinality) => {
165
+ const props = {
166
+ defaultField,
167
+ field: { cardinality: cardinality, widget: "checkbox" },
168
+ fieldType: "string",
169
+ formatMessage,
170
+ onChange,
171
+ type: null,
172
+ };
173
+
174
+ const wrapper = shallow(<DefaultValue {...props} />);
175
+ expect(wrapper.find("DateTimeField").length).toBe(0);
176
+ expect(wrapper.find("FormInput").length).toBe(0);
177
+ expect(wrapper.find("FormDropdown").length).toBe(1);
178
+ expect(wrapper.find("FormDropdown").prop("multiple")).toBe(true);
179
+ expect(wrapper.find("FormDropdown").prop("search")).toBe(undefined);
180
+ expect(wrapper.find("FormDropdown").prop("allowAdditions")).toBe(
181
+ undefined
182
+ );
183
+ });
184
+ });
185
+
186
+ it("renders form input when fieldType is string and cardinality ? or 1", () => {
187
+ const cardinalityes = ["?", "1"];
188
+
189
+ cardinalityes.forEach((cardinality) => {
190
+ const props = {
191
+ defaultField,
192
+ field: { cardinality: cardinality, widget: "string" },
193
+ fieldType: "string",
194
+ formatMessage,
195
+ onChange,
196
+ type: null,
197
+ };
198
+
199
+ const wrapper = shallow(<DefaultValue {...props} />);
200
+ expect(wrapper.find("DateTimeField").length).toBe(0);
201
+ expect(wrapper.find("FormInput").length).toBe(1);
202
+ expect(wrapper.find("FormDropdown").length).toBe(0);
203
+ });
204
+ });
205
+
206
+ it("renders form input when widget is string, fieldType is string and cardinality ? or 1", () => {
207
+ const cardinalityes = ["?", "1"];
208
+
209
+ cardinalityes.forEach((cardinality) => {
210
+ const props = {
211
+ defaultField,
212
+ field: { cardinality: cardinality, widget: "string" },
213
+ fieldType: "string",
214
+ formatMessage,
215
+ onChange,
216
+ type: null,
217
+ };
218
+
219
+ const wrapper = shallow(<DefaultValue {...props} />);
220
+ expect(wrapper.find("DateTimeField").length).toBe(0);
221
+ expect(wrapper.find("FormInput").length).toBe(1);
222
+ expect(wrapper.find("FormDropdown").length).toBe(0);
223
+ });
224
+ });
225
+
226
+ it("renders form dropdown multiple and allow additions when widget is string, fieldType is string and cardinality * or +", () => {
227
+ const cardinalityes = ["*", "+"];
228
+
229
+ cardinalityes.forEach((cardinality) => {
230
+ const props = {
231
+ defaultField,
232
+ field: { cardinality: cardinality, widget: "string" },
233
+ fieldType: "string",
234
+ formatMessage,
235
+ onChange,
236
+ type: null,
237
+ };
238
+
239
+ const wrapper = shallow(<DefaultValue {...props} />);
240
+ expect(wrapper.find("DateTimeField").length).toBe(0);
241
+ expect(wrapper.find("FormInput").length).toBe(0);
242
+ expect(wrapper.find("FormDropdown").length).toBe(1);
243
+ expect(wrapper.find("FormDropdown").prop("multiple")).toBe(true);
244
+ expect(wrapper.find("FormDropdown").prop("search")).toBe(true);
245
+ expect(wrapper.find("FormDropdown").prop("allowAdditions")).toBe(true);
246
+ });
247
+ });
248
+
98
249
  it("calls dropdown change", () => {
99
250
  const wrapper = shallow(<DefaultValue {...props} />);
100
251
  const input = wrapper.find("FormDropdown");
101
252
  input.simulate("change", null, { value: 3 });
102
253
  expect(onChange).toBeCalledWith(null, {
103
254
  name: defaultField,
104
- value: [3]
255
+ value: [3],
105
256
  });
106
257
  });
107
258
 
@@ -113,7 +264,7 @@ describe("<DefaultValue />", () => {
113
264
  input.simulate("change", null, { value: 3 });
114
265
  expect(onChange).toBeCalledWith(null, {
115
266
  name: defaultField,
116
- value: 3
267
+ value: 3,
117
268
  });
118
269
  });
119
270
  });
@@ -21,7 +21,6 @@ exports[`<DefaultValue /> matches the latest snapshot for null values 1`] = `
21
21
  },
22
22
  ]
23
23
  }
24
- required={true}
25
24
  selection={true}
26
25
  />
27
26
  </Fragment>