@truedat/df 4.44.1 → 4.44.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/package.json +5 -5
- package/src/components/DynamicForm.js +9 -11
- package/src/components/widgets/DateTimeField.js +14 -16
- package/src/messages/en.js +1 -1
- package/src/selectors/__tests__/templates.spec.js +6 -17
- package/src/selectors/templates.js +5 -12
- package/src/templates/components/TemplateLoader.js +3 -6
- package/src/templates/components/index.js +1 -2
- package/src/templates/components/TemplateSelector.js +0 -59
- package/src/templates/components/__tests__/TemplateSelector.spec.js +0 -29
- package/src/templates/components/__tests__/__snapshots__/TemplateSelector.spec.js.snap +0 -54
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truedat/df",
|
|
3
|
-
"version": "4.44.
|
|
3
|
+
"version": "4.44.4",
|
|
4
4
|
"description": "Truedat Web Data Quality Module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"jsnext:main": "src/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@babel/plugin-transform-modules-commonjs": "^7.15.0",
|
|
31
31
|
"@babel/preset-env": "^7.15.0",
|
|
32
32
|
"@babel/preset-react": "^7.14.5",
|
|
33
|
-
"@truedat/test": "4.44.
|
|
33
|
+
"@truedat/test": "4.44.4",
|
|
34
34
|
"babel-jest": "^27.0.6",
|
|
35
35
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
36
36
|
"babel-plugin-lodash": "^3.3.4",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
]
|
|
81
81
|
},
|
|
82
82
|
"dependencies": {
|
|
83
|
-
"@truedat/auth": "4.44.
|
|
84
|
-
"@truedat/core": "4.44.
|
|
83
|
+
"@truedat/auth": "4.44.4",
|
|
84
|
+
"@truedat/core": "4.44.4",
|
|
85
85
|
"axios": "^0.19.2",
|
|
86
86
|
"path-to-regexp": "^1.7.0",
|
|
87
87
|
"prop-types": "^15.7.2",
|
|
@@ -100,5 +100,5 @@
|
|
|
100
100
|
"react-dom": ">= 16.8.6 < 17",
|
|
101
101
|
"semantic-ui-react": ">= 0.88.2 < 2.1"
|
|
102
102
|
},
|
|
103
|
-
"gitHead": "
|
|
103
|
+
"gitHead": "36fb183e1d22181e6a15b3bac2c01b39214eacdb"
|
|
104
104
|
}
|
|
@@ -49,17 +49,15 @@ export const DynamicForm = ({
|
|
|
49
49
|
|
|
50
50
|
return (
|
|
51
51
|
<>
|
|
52
|
-
{parsedGroups.map(({ name, fields }, i) =>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
);
|
|
62
|
-
})}
|
|
52
|
+
{parsedGroups.map(({ name, fields }, i) => (
|
|
53
|
+
<FieldGroupSegment
|
|
54
|
+
key={i}
|
|
55
|
+
onFieldChange={handleChange}
|
|
56
|
+
name={name}
|
|
57
|
+
fields={fields}
|
|
58
|
+
scope={_.prop("scope")(template)}
|
|
59
|
+
/>
|
|
60
|
+
))}
|
|
63
61
|
</>
|
|
64
62
|
);
|
|
65
63
|
};
|
|
@@ -3,25 +3,23 @@ import PropTypes from "prop-types";
|
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { DateTimeInput } from "semantic-ui-calendar-react";
|
|
5
5
|
|
|
6
|
-
export const DateTimeField = ({ field: { name, value }, onChange }) =>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
);
|
|
20
|
-
};
|
|
6
|
+
export const DateTimeField = ({ field: { name, value } = {}, onChange }) => (
|
|
7
|
+
<DateTimeInput
|
|
8
|
+
animation=""
|
|
9
|
+
closable
|
|
10
|
+
dateTimeFormat={"YYYY-MM-DD HH:mm"}
|
|
11
|
+
duration={0}
|
|
12
|
+
iconPosition="left"
|
|
13
|
+
name={name}
|
|
14
|
+
onChange={(e, { value }) => onChange(e, { name: name, value: value })}
|
|
15
|
+
placeholder="Date Time"
|
|
16
|
+
value={value || ""}
|
|
17
|
+
/>
|
|
18
|
+
);
|
|
21
19
|
|
|
22
20
|
DateTimeField.propTypes = {
|
|
23
21
|
field: PropTypes.object,
|
|
24
|
-
onChange: PropTypes.func
|
|
22
|
+
onChange: PropTypes.func,
|
|
25
23
|
};
|
|
26
24
|
|
|
27
25
|
export default DateTimeField;
|
package/src/messages/en.js
CHANGED
|
@@ -137,7 +137,7 @@ export default {
|
|
|
137
137
|
"template.error.content.invalidtype":
|
|
138
138
|
"Field {name} with type {type} already exists in another template",
|
|
139
139
|
"widget.image.error.too_big":
|
|
140
|
-
"
|
|
140
|
+
"File is too big. Must be smaller then {size_mb}MB",
|
|
141
141
|
"widget.image.error.invalidtype": "Invalid File",
|
|
142
142
|
"widget.copy.modaltitle": "Copy fields",
|
|
143
143
|
"widget.copy.error.jsonformat": "Error: copy has wrong format",
|
|
@@ -1,42 +1,31 @@
|
|
|
1
1
|
import { makeGetApplyTemplate, makeGetTemplate } from "..";
|
|
2
2
|
|
|
3
|
+
const templateFromProps = { id: 1 };
|
|
4
|
+
const templateFromState = { id: 2 };
|
|
5
|
+
|
|
3
6
|
describe("selectors: makeGetTemplate", () => {
|
|
4
|
-
const templateFromProps = { id: 1 };
|
|
5
|
-
const templateFromState = { id: 2 };
|
|
6
7
|
const props = { template: templateFromProps };
|
|
7
8
|
const state = { template: templateFromState };
|
|
8
9
|
it("template from props prevails to template from state", () => {
|
|
9
10
|
const getTemplate = makeGetTemplate();
|
|
10
11
|
const t = getTemplate(state, props);
|
|
11
|
-
expect(t).
|
|
12
|
+
expect(t).toBe(templateFromProps);
|
|
12
13
|
});
|
|
13
14
|
|
|
14
15
|
it("gets template from state if not props provided", () => {
|
|
15
16
|
const getTemplate = makeGetTemplate();
|
|
16
17
|
const t = getTemplate(state, {});
|
|
17
|
-
expect(t).
|
|
18
|
+
expect(t).toBe(templateFromState);
|
|
18
19
|
});
|
|
19
20
|
});
|
|
20
21
|
|
|
21
22
|
describe("selectors: makeGetApplyTemplate", () => {
|
|
22
|
-
const applyTemplate = jest.fn();
|
|
23
|
-
const templateFromProps = { id: 1 };
|
|
24
|
-
const templateFromState = { id: 2 };
|
|
25
|
-
|
|
26
23
|
it("applyTemplate from props prevails to applyTemplate from utils", () => {
|
|
24
|
+
const applyTemplate = jest.fn();
|
|
27
25
|
const props = { template: templateFromProps, applyTemplate };
|
|
28
26
|
const state = { template: templateFromState };
|
|
29
27
|
const getApplyTemplate = makeGetApplyTemplate();
|
|
30
28
|
getApplyTemplate(state, props);
|
|
31
29
|
expect(applyTemplate).toHaveBeenCalledTimes(1);
|
|
32
30
|
});
|
|
33
|
-
|
|
34
|
-
it("get applyTemplate utils when not applyTemplate provided in props", () => {
|
|
35
|
-
const props = { template: templateFromProps };
|
|
36
|
-
const state = { template: templateFromState };
|
|
37
|
-
applyTemplate.mockClear();
|
|
38
|
-
const getApplyTemplate = makeGetApplyTemplate();
|
|
39
|
-
getApplyTemplate(state, props);
|
|
40
|
-
expect(applyTemplate).toHaveBeenCalledTimes(0);
|
|
41
|
-
});
|
|
42
31
|
});
|
|
@@ -8,6 +8,7 @@ const applyTemplateFromProps = (_state, props) =>
|
|
|
8
8
|
_.prop("applyTemplate")(props);
|
|
9
9
|
const selectTemplate = (propTemplate, stateTemplate) =>
|
|
10
10
|
_.defaultTo(stateTemplate)(propTemplate);
|
|
11
|
+
|
|
11
12
|
const selectApplyTemplate = (
|
|
12
13
|
propTemplate,
|
|
13
14
|
stateTemplate,
|
|
@@ -17,21 +18,13 @@ const selectApplyTemplate = (
|
|
|
17
18
|
return _.defaultTo(applyTemplate)(applyTemplateFromProps)(template);
|
|
18
19
|
};
|
|
19
20
|
|
|
20
|
-
export const makeGetTemplate = () =>
|
|
21
|
-
|
|
22
|
-
templateFromProps,
|
|
23
|
-
templateFromState,
|
|
24
|
-
selectTemplate
|
|
25
|
-
);
|
|
26
|
-
return getTemplate;
|
|
27
|
-
};
|
|
21
|
+
export const makeGetTemplate = () =>
|
|
22
|
+
createSelector(templateFromProps, templateFromState, selectTemplate);
|
|
28
23
|
|
|
29
|
-
export const makeGetApplyTemplate = () =>
|
|
30
|
-
|
|
24
|
+
export const makeGetApplyTemplate = () =>
|
|
25
|
+
createSelector(
|
|
31
26
|
templateFromProps,
|
|
32
27
|
templateFromState,
|
|
33
28
|
applyTemplateFromProps,
|
|
34
29
|
selectApplyTemplate
|
|
35
30
|
);
|
|
36
|
-
return getApplyTemplate;
|
|
37
|
-
};
|
|
@@ -21,7 +21,7 @@ export class TemplateLoader extends React.Component {
|
|
|
21
21
|
|
|
22
22
|
componentDidMount() {
|
|
23
23
|
const { fetchTemplate, domainId, templateId, match } = this.props;
|
|
24
|
-
if (match
|
|
24
|
+
if (match?.params?.templateId) {
|
|
25
25
|
fetchTemplate({ templateId: match.params.templateId });
|
|
26
26
|
} else if (templateId) {
|
|
27
27
|
fetchTemplate({ domainId, templateId });
|
|
@@ -36,11 +36,8 @@ export class TemplateLoader extends React.Component {
|
|
|
36
36
|
templateId: prevTemplateId,
|
|
37
37
|
match: prevMatch,
|
|
38
38
|
} = prevProps;
|
|
39
|
-
if (match
|
|
40
|
-
if (
|
|
41
|
-
prevMatch.params &&
|
|
42
|
-
match.params.templateId === prevMatch.params.templateId
|
|
43
|
-
) {
|
|
39
|
+
if (match?.params?.templateId) {
|
|
40
|
+
if (match.params.templateId === prevMatch?.params?.templateId) {
|
|
44
41
|
// No change
|
|
45
42
|
} else {
|
|
46
43
|
fetchTemplate({ templateId: match.params.templateId });
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import TemplateLoader from "./TemplateLoader";
|
|
2
2
|
import TemplateRoutes from "./TemplateRoutes";
|
|
3
|
-
import TemplateSelector from "./TemplateSelector";
|
|
4
3
|
import TemplatesLoader from "./TemplatesLoader";
|
|
5
4
|
|
|
6
|
-
export { TemplateLoader, TemplateRoutes,
|
|
5
|
+
export { TemplateLoader, TemplateRoutes, TemplatesLoader };
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import _ from "lodash/fp";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import PropTypes from "prop-types";
|
|
4
|
-
import { connect } from "react-redux";
|
|
5
|
-
import { Form, Label } from "semantic-ui-react";
|
|
6
|
-
import { useIntl, FormattedMessage } from "react-intl";
|
|
7
|
-
|
|
8
|
-
export const TemplateSelector = ({
|
|
9
|
-
hidden,
|
|
10
|
-
onChange,
|
|
11
|
-
options,
|
|
12
|
-
selectedValue,
|
|
13
|
-
isOptional,
|
|
14
|
-
}) => {
|
|
15
|
-
const { formatMessage } = useIntl();
|
|
16
|
-
const required = !isOptional;
|
|
17
|
-
|
|
18
|
-
return hidden ? null : (
|
|
19
|
-
<Form.Field required={required}>
|
|
20
|
-
<label>
|
|
21
|
-
<FormattedMessage id="template.selector.label" />
|
|
22
|
-
{!selectedValue && required ? (
|
|
23
|
-
<Label pointing="left">
|
|
24
|
-
<FormattedMessage id="template.form.validation.empty_required" />
|
|
25
|
-
</Label>
|
|
26
|
-
) : null}
|
|
27
|
-
</label>
|
|
28
|
-
<Form.Dropdown
|
|
29
|
-
placeholder={formatMessage({ id: "template.selector.placeholder" })}
|
|
30
|
-
name="template"
|
|
31
|
-
search
|
|
32
|
-
selection
|
|
33
|
-
clearable={isOptional}
|
|
34
|
-
options={options}
|
|
35
|
-
onChange={onChange}
|
|
36
|
-
value={selectedValue || null}
|
|
37
|
-
/>
|
|
38
|
-
</Form.Field>
|
|
39
|
-
);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
TemplateSelector.propTypes = {
|
|
43
|
-
onChange: PropTypes.func,
|
|
44
|
-
options: PropTypes.array,
|
|
45
|
-
hidden: PropTypes.bool,
|
|
46
|
-
selectedValue: PropTypes.number,
|
|
47
|
-
isOptional: PropTypes.bool,
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const mapStateToProps = ({ templates }) => ({
|
|
51
|
-
hidden: _.size(templates) <= 1,
|
|
52
|
-
options: _.map(({ label: text, id: value }, i) => ({
|
|
53
|
-
key: i,
|
|
54
|
-
value,
|
|
55
|
-
text,
|
|
56
|
-
}))(templates),
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
export default connect(mapStateToProps)(TemplateSelector);
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { shallow } from "enzyme";
|
|
3
|
-
import { intl } from "@truedat/test/intl-stub";
|
|
4
|
-
import { TemplateSelector } from "../TemplateSelector";
|
|
5
|
-
|
|
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
|
-
describe("<TemplateSelector />", () => {
|
|
11
|
-
const options = [0, 1, 2, 3].map(v => ({
|
|
12
|
-
key: v,
|
|
13
|
-
value: v,
|
|
14
|
-
text: `text ${v}`
|
|
15
|
-
}));
|
|
16
|
-
const onChange = jest.fn();
|
|
17
|
-
const props = { options, onChange };
|
|
18
|
-
|
|
19
|
-
it("matches the latest snapshot", () => {
|
|
20
|
-
const wrapper = shallow(<TemplateSelector {...props} />);
|
|
21
|
-
expect(wrapper).toMatchSnapshot();
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it("renders null if hidden is true", () => {
|
|
25
|
-
const props = { options, onChange, hidden: true };
|
|
26
|
-
const wrapper = shallow(<TemplateSelector {...props} />);
|
|
27
|
-
expect(wrapper.getElement()).toBeNull();
|
|
28
|
-
});
|
|
29
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`<TemplateSelector /> matches the latest snapshot 1`] = `
|
|
4
|
-
<FormField
|
|
5
|
-
required={true}
|
|
6
|
-
>
|
|
7
|
-
<label>
|
|
8
|
-
<MemoizedFormattedMessage
|
|
9
|
-
id="template.selector.label"
|
|
10
|
-
/>
|
|
11
|
-
<Label
|
|
12
|
-
pointing="left"
|
|
13
|
-
>
|
|
14
|
-
<MemoizedFormattedMessage
|
|
15
|
-
id="template.form.validation.empty_required"
|
|
16
|
-
/>
|
|
17
|
-
</Label>
|
|
18
|
-
</label>
|
|
19
|
-
<FormDropdown
|
|
20
|
-
as={[Function]}
|
|
21
|
-
control={[Function]}
|
|
22
|
-
name="template"
|
|
23
|
-
onChange={[MockFunction]}
|
|
24
|
-
options={
|
|
25
|
-
Array [
|
|
26
|
-
Object {
|
|
27
|
-
"key": 0,
|
|
28
|
-
"text": "text 0",
|
|
29
|
-
"value": 0,
|
|
30
|
-
},
|
|
31
|
-
Object {
|
|
32
|
-
"key": 1,
|
|
33
|
-
"text": "text 1",
|
|
34
|
-
"value": 1,
|
|
35
|
-
},
|
|
36
|
-
Object {
|
|
37
|
-
"key": 2,
|
|
38
|
-
"text": "text 2",
|
|
39
|
-
"value": 2,
|
|
40
|
-
},
|
|
41
|
-
Object {
|
|
42
|
-
"key": 3,
|
|
43
|
-
"text": "text 3",
|
|
44
|
-
"value": 3,
|
|
45
|
-
},
|
|
46
|
-
]
|
|
47
|
-
}
|
|
48
|
-
placeholder="template.selector.placeholder"
|
|
49
|
-
search={true}
|
|
50
|
-
selection={true}
|
|
51
|
-
value={null}
|
|
52
|
-
/>
|
|
53
|
-
</FormField>
|
|
54
|
-
`;
|