@truedat/df 8.7.0 → 8.7.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.
Files changed (101) hide show
  1. package/package.json +4 -4
  2. package/src/components/DynamicFormViewer.js +3 -3
  3. package/src/components/DynamicFormWithTranslations.js +4 -4
  4. package/src/components/FieldGroupDetail.js +1 -1
  5. package/src/components/FieldGroupWithTranslations.js +1 -1
  6. package/src/components/SelectableDynamicForm.js +1 -1
  7. package/src/components/__tests__/DynamicFieldValue.spec.js +2 -2
  8. package/src/components/__tests__/DynamicFormViewer.spec.js +7 -7
  9. package/src/components/__tests__/EditableDynamicFieldValue.spec.js +1 -1
  10. package/src/components/__tests__/FieldViewerValue.spec.js +12 -12
  11. package/src/components/__tests__/SelectDynamicFormWithTranslations.spec.js +1 -1
  12. package/src/components/__tests__/SelectableDynamicForm.spec.js +16 -12
  13. package/src/components/hierarchies/HierarchyView.js +9 -9
  14. package/src/components/hierarchies/__tests__/HierarchyRoutes.spec.js +1 -1
  15. package/src/components/widgets/DropdownDataLoader.js +1 -1
  16. package/src/components/widgets/DynamicField.js +5 -5
  17. package/src/components/widgets/DynamicTableField.js +129 -125
  18. package/src/components/widgets/GroupPreview.js +2 -2
  19. package/src/components/widgets/HierarchyPreview.js +1 -1
  20. package/src/components/widgets/ImageField.js +2 -3
  21. package/src/components/widgets/MarkdownField.js +0 -1
  22. package/src/components/widgets/StandardDropdown.js +5 -5
  23. package/src/components/widgets/StringField.js +1 -4
  24. package/src/components/widgets/TableField.js +1 -1
  25. package/src/components/widgets/UserGroupPreview.js +1 -1
  26. package/src/components/widgets/__tests__/CheckboxField.spec.js +2 -2
  27. package/src/components/widgets/__tests__/DropdownField.spec.js +2 -2
  28. package/src/components/widgets/__tests__/DynamicField.spec.js +11 -3
  29. package/src/components/widgets/__tests__/DynamicTableField.spec.js +237 -237
  30. package/src/components/widgets/__tests__/GroupPreview.spec.js +11 -11
  31. package/src/components/widgets/__tests__/HierarchyDropdown.spec.js +3 -3
  32. package/src/components/widgets/__tests__/NumberField.spec.js +1 -1
  33. package/src/components/widgets/__tests__/PairListField.spec.js +3 -3
  34. package/src/components/widgets/__tests__/StandardDropdown.spec.js +1 -1
  35. package/src/components/widgets/__tests__/UserGroupPreview.spec.js +14 -10
  36. package/src/messages/index.js +1 -1
  37. package/src/reducers/__tests__/dfMessage.spec.js +5 -5
  38. package/src/reducers/__tests__/selectedDomain.spec.js +2 -2
  39. package/src/reducers/__tests__/selectedDomains.spec.js +2 -2
  40. package/src/reducers/dfMessage.js +4 -4
  41. package/src/selectors/getOptions.js +2 -2
  42. package/src/selectors/templates.js +2 -2
  43. package/src/templates/components/Template.js +2 -2
  44. package/src/templates/components/TemplateFilters.js +1 -1
  45. package/src/templates/components/TemplateLoader.js +1 -1
  46. package/src/templates/components/TemplateRoutes.js +1 -1
  47. package/src/templates/components/Templates.js +1 -6
  48. package/src/templates/components/TemplatesContext.js +3 -3
  49. package/src/templates/components/TemplatesTable.js +1 -1
  50. package/src/templates/components/__tests__/TemplateLoader.spec.js +2 -2
  51. package/src/templates/components/__tests__/TemplateRoutes.spec.js +1 -1
  52. package/src/templates/components/__tests__/TemplatesTable.spec.js +1 -1
  53. package/src/templates/components/templateForm/ActiveGroupForm.js +3 -3
  54. package/src/templates/components/templateForm/ConditionalFieldForm.js +3 -3
  55. package/src/templates/components/templateForm/DependentDomain.js +3 -3
  56. package/src/templates/components/templateForm/FieldDefinition.js +126 -129
  57. package/src/templates/components/templateForm/HierarchiesList.js +1 -1
  58. package/src/templates/components/templateForm/MandatoryConditional.js +2 -2
  59. package/src/templates/components/templateForm/TemplateForm.js +46 -41
  60. package/src/templates/components/templateForm/ValuesConfiguration.js +69 -56
  61. package/src/templates/components/templateForm/ValuesField.js +43 -43
  62. package/src/templates/components/templateForm/__tests__/DefaultValue.spec.js +35 -35
  63. package/src/templates/components/templateForm/__tests__/DependentDomain.spec.js +1 -1
  64. package/src/templates/components/templateForm/__tests__/FieldDefinition.spec.js +227 -201
  65. package/src/templates/components/templateForm/__tests__/FieldForm.spec.js +12 -10
  66. package/src/templates/components/templateForm/__tests__/MandatoryConditional.spec.js +3 -3
  67. package/src/templates/components/templateForm/__tests__/SwitchListForm.spec.js +5 -5
  68. package/src/templates/components/templateForm/__tests__/SwitchSegment.spec.js +8 -8
  69. package/src/templates/components/templateForm/__tests__/TableValuesForm.spec.js +207 -189
  70. package/src/templates/components/templateForm/__tests__/TemplateForm.spec.js +42 -13
  71. package/src/templates/components/templateForm/__tests__/TemplateFormActions.spec.js +1 -1
  72. package/src/templates/components/templateForm/__tests__/TemplateRelationsForm.spec.js +3 -1
  73. package/src/templates/components/templateForm/__tests__/ValuesField.spec.js +6 -6
  74. package/src/templates/components/templateForm/__tests__/ValuesListForm.spec.js +4 -4
  75. package/src/templates/components/templateForm/__tests__/ValuesSelector.spec.js +3 -3
  76. package/src/templates/components/templateForm/widgetDefinitions.js +2 -0
  77. package/src/templates/reducers/__tests__/allTemplates.spec.js +4 -4
  78. package/src/templates/reducers/__tests__/selectedTemplate.spec.js +2 -2
  79. package/src/templates/reducers/__tests__/template.spec.js +4 -4
  80. package/src/templates/reducers/__tests__/templateDeleting.spec.js +2 -2
  81. package/src/templates/reducers/__tests__/templateLoading.spec.js +2 -2
  82. package/src/templates/reducers/__tests__/templates.spec.js +3 -3
  83. package/src/templates/reducers/__tests__/templatesLoading.spec.js +2 -2
  84. package/src/templates/sagas/__tests__/createTemplate.spec.js +3 -3
  85. package/src/templates/sagas/__tests__/fetchTemplates.spec.js +1 -1
  86. package/src/templates/sagas/index.js +2 -2
  87. package/src/templates/utils/__tests__/applyDefaults.spec.js +4 -4
  88. package/src/templates/utils/__tests__/filterDomains.spec.js +15 -15
  89. package/src/templates/utils/__tests__/filterFields.spec.js +2 -2
  90. package/src/templates/utils/__tests__/filterSwitches.spec.js +5 -5
  91. package/src/templates/utils/__tests__/filterValues.spec.js +4 -4
  92. package/src/templates/utils/__tests__/formatLegacyContent.spec.js +7 -7
  93. package/src/templates/utils/applyTemplate.js +66 -53
  94. package/src/templates/utils/filterDepends.js +1 -1
  95. package/src/templates/utils/filterSwitches.js +3 -3
  96. package/src/templates/utils/filterValues.js +4 -5
  97. package/src/templates/utils/flattenFields.js +2 -2
  98. package/src/templates/utils/formatLegacyContent.js +2 -1
  99. package/src/templates/utils/parseFieldOptions.js +15 -14
  100. package/src/templates/utils/parseGroups.js +43 -43
  101. package/src/templates/utils/validateContent.js +4 -4
@@ -7,144 +7,148 @@ import { useIntl } from "react-intl";
7
7
  const FieldByWidget = lazy(() => import("./FieldByWidget"));
8
8
 
9
9
  export const DynamicTableField = ({
10
- field: { name, value: fieldValue = [], values },
11
- onChange,
12
- scope,
10
+ field: { name, value: fieldValue = [], values },
11
+ onChange,
12
+ scope,
13
13
  }) => {
14
- const value = fieldValue || [];
15
- const table_columns = _.get("table_columns")(values) || [];
16
- const { formatMessage } = useIntl();
14
+ const value = fieldValue || [];
15
+ const table_columns = _.get("table_columns")(values) || [];
16
+ const { formatMessage } = useIntl();
17
17
 
18
- const handleAddRow = (e) => {
19
- e && e.preventDefault();
20
- onChange(e, {
21
- name,
22
- value: [...value, {}],
23
- });
24
- };
18
+ const handleAddRow = (e) => {
19
+ e && e.preventDefault();
20
+ onChange(e, {
21
+ name,
22
+ value: [...value, {}],
23
+ });
24
+ };
25
25
 
26
- const handleRemoveRow = (e, id) => {
27
- e && e.preventDefault();
28
- const newValue = [...value];
29
- newValue.splice(id, 1);
30
- onChange(e, { name, value: newValue });
31
- };
26
+ const handleRemoveRow = (e, id) => {
27
+ e && e.preventDefault();
28
+ const newValue = [...value];
29
+ newValue.splice(id, 1);
30
+ onChange(e, { name, value: newValue });
31
+ };
32
32
 
33
- const handleChange = (idx, e, data) => {
34
- const currentValue = removeDeletedColumns(table_columns, [...value]);
35
- const input = {
36
- ...currentValue[idx],
37
- [data.name]: { origin: "user", value: data.value },
38
- };
39
- onChange(e, {
40
- name,
41
- value: currentValue.map((newElem, i) => (i == idx ? input : newElem)),
42
- });
33
+ const handleChange = (idx, e, data) => {
34
+ const currentValue = removeDeletedColumns(table_columns, [...value]);
35
+ const input = {
36
+ ...currentValue[idx],
37
+ [data.name]: { origin: "user", value: data.value },
43
38
  };
39
+ onChange(e, {
40
+ name,
41
+ value: currentValue.map((newElem, i) => (i == idx ? input : newElem)),
42
+ });
43
+ };
44
44
 
45
- const removeDeletedColumns = (table_columns, content) => {
46
- const columns_name = _.map((column) => column.name)(table_columns);
47
- return content.map((row) => {
48
- const field_deleted = _.keys(row).filter(
49
- (x) => !columns_name.includes(x),
50
- );
51
- return _.omit(field_deleted)(row);
52
- });
53
- };
45
+ const removeDeletedColumns = (table_columns, content) => {
46
+ const columns_name = _.map((column) => column.name)(table_columns);
47
+ return content.map((row) => {
48
+ const field_deleted = _.keys(row).filter(
49
+ (x) => !columns_name.includes(x),
50
+ );
51
+ return _.omit(field_deleted)(row);
52
+ });
53
+ };
54
54
 
55
- const rows = value.map((row) => {
56
- return table_columns.map((field) => {
57
- return { ...field, value: row[field.name]?.value };
58
- });
55
+ const rows = value.map((row) => {
56
+ return table_columns.map((field) => {
57
+ return { ...field, value: row[field.name]?.value };
59
58
  });
59
+ });
60
60
 
61
- const requiredErrors = _.flow(
62
- _.flatten,
63
- _.filter(_.prop("required")),
64
- _.groupBy("name"),
65
- _.toPairs,
66
- _.map(([key, values]) => [
67
- key,
68
- _.any((value) => _.isEmpty(value?.value))(values),
69
- ]),
70
- _.fromPairs
71
- )(rows);
61
+ const requiredErrors = _.flow(
62
+ _.flatten,
63
+ _.filter(_.prop("required")),
64
+ _.groupBy("name"),
65
+ _.toPairs,
66
+ _.map(([key, values]) => [
67
+ key,
68
+ _.any((value) => _.isEmpty(value?.value))(values),
69
+ ]),
70
+ _.fromPairs,
71
+ )(rows);
72
72
 
73
- return (
74
- <Table celled className="no_padding">
75
- <Table.Header>
76
- <Table.Row>
77
- {table_columns.map((v, i) => (
78
- <Table.HeaderCell key={i}>
79
- {v.name}
80
- {["+", "1"].includes(v.cardinality) && (
81
- <span className="is_required">*</span>
82
- )}
83
- {requiredErrors[v.name] && (<Label pointing="left">
84
- {formatMessage({
85
- id: "template.form.validation.empty_required",
86
- })}
87
- </Label>)
88
- }
89
- </Table.HeaderCell>
90
- ))}
91
- <Table.HeaderCell />
92
- </Table.Row>
93
- </Table.Header>
94
- <Table.Body>
95
- {rows.map((row, i) => (
96
- <Table.Row key={i}>
97
- {row.map((field, k) => (
98
- <Table.Cell key={k} width={5}>
99
- <FieldByWidget
100
- field={field}
101
- widget={field.widget}
102
- onChange={(e, data) => handleChange(i, e, data)}
103
- scope={scope}
104
- />
105
- </Table.Cell>
106
- ))}
107
- <Table.Cell style={{ textAlign: "center", padding: "1px" }} width={1}>
108
- <Button
109
- icon={
110
- <Icon
111
- className="selectable"
112
- name="trash alternate outline"
113
- color="red"
114
- onClick={(e) => handleRemoveRow(e, i)}
115
- />
116
- }
117
- color="red"
118
- size="mini"
119
- basic
120
- />
121
- </Table.Cell>
122
- </Table.Row>
123
- ))}
124
- </Table.Body>
125
- <Table.Footer>
126
- <Table.Row>
127
- <Table.HeaderCell colSpan={`${table_columns.length + 1}`}>
128
- <Button
129
- compact
130
- data-testid="add-button"
131
- floated="right"
132
- icon={{ name: "add", color: "green" }}
133
- name="add_button"
134
- onClick={handleAddRow}
135
- size="small"
136
- />
137
- </Table.HeaderCell>
138
- </Table.Row>
139
- </Table.Footer>
140
- </Table>
141
- );
73
+ return (
74
+ <Table celled className="no_padding">
75
+ <Table.Header>
76
+ <Table.Row>
77
+ {table_columns.map((v, i) => (
78
+ <Table.HeaderCell key={i}>
79
+ {v.name}
80
+ {["+", "1"].includes(v.cardinality) && (
81
+ <span className="is_required">*</span>
82
+ )}
83
+ {requiredErrors[v.name] && (
84
+ <Label pointing="left">
85
+ {formatMessage({
86
+ id: "template.form.validation.empty_required",
87
+ })}
88
+ </Label>
89
+ )}
90
+ </Table.HeaderCell>
91
+ ))}
92
+ <Table.HeaderCell />
93
+ </Table.Row>
94
+ </Table.Header>
95
+ <Table.Body>
96
+ {rows.map((row, i) => (
97
+ <Table.Row key={i}>
98
+ {row.map((field, k) => (
99
+ <Table.Cell key={k} width={5}>
100
+ <FieldByWidget
101
+ field={field}
102
+ widget={field.widget}
103
+ onChange={(e, data) => handleChange(i, e, data)}
104
+ scope={scope}
105
+ />
106
+ </Table.Cell>
107
+ ))}
108
+ <Table.Cell
109
+ style={{ textAlign: "center", padding: "1px" }}
110
+ width={1}
111
+ >
112
+ <Button
113
+ icon={
114
+ <Icon
115
+ className="selectable"
116
+ name="trash alternate outline"
117
+ color="red"
118
+ onClick={(e) => handleRemoveRow(e, i)}
119
+ />
120
+ }
121
+ color="red"
122
+ size="mini"
123
+ basic
124
+ />
125
+ </Table.Cell>
126
+ </Table.Row>
127
+ ))}
128
+ </Table.Body>
129
+ <Table.Footer>
130
+ <Table.Row>
131
+ <Table.HeaderCell colSpan={`${table_columns.length + 1}`}>
132
+ <Button
133
+ compact
134
+ data-testid="add-button"
135
+ floated="right"
136
+ icon={{ name: "add", color: "green" }}
137
+ name="add_button"
138
+ onClick={handleAddRow}
139
+ size="small"
140
+ />
141
+ </Table.HeaderCell>
142
+ </Table.Row>
143
+ </Table.Footer>
144
+ </Table>
145
+ );
142
146
  };
143
147
 
144
148
  DynamicTableField.propTypes = {
145
- field: PropTypes.object,
146
- onChange: PropTypes.func,
147
- scope: PropTypes.string,
149
+ field: PropTypes.object,
150
+ onChange: PropTypes.func,
151
+ scope: PropTypes.string,
148
152
  };
149
153
 
150
154
  export default DynamicTableField;
@@ -56,7 +56,7 @@ export const GroupPreview = ({ groups }) =>
56
56
  key={groupId(group) || groupDisplayName(group)}
57
57
  group={group}
58
58
  />
59
- ))
59
+ )),
60
60
  )(groups);
61
61
 
62
62
  GroupPreview.propTypes = {
@@ -68,7 +68,7 @@ GroupPreview.propTypes = {
68
68
  name: PropTypes.string.isRequired,
69
69
  }),
70
70
  PropTypes.string,
71
- ])
71
+ ]),
72
72
  ).isRequired,
73
73
  };
74
74
 
@@ -38,7 +38,7 @@ HiearchyPreviewLabel.propTypes = {
38
38
  const HierarchyPreview = ({ hierarchyValue }) =>
39
39
  _.flow(
40
40
  _.reject(_.isNull),
41
- _.map((node) => <HiearchyPreviewLabel key={node.id} node={node} />)
41
+ _.map((node) => <HiearchyPreviewLabel key={node.id} node={node} />),
42
42
  )(hierarchyValue);
43
43
 
44
44
  HierarchyPreview.propTypes = {
@@ -34,8 +34,8 @@ export const ImageField = ({ field: { name, value }, onChange }) => {
34
34
  setInputError(
35
35
  formatMessage(
36
36
  { id: "widget.image.error.too_big" },
37
- { size_mb: MAXIMUM_FILE_SIZE_MB }
38
- )
37
+ { size_mb: MAXIMUM_FILE_SIZE_MB },
38
+ ),
39
39
  );
40
40
  clearImage(e);
41
41
  return;
@@ -48,7 +48,6 @@ export const ImageField = ({ field: { name, value }, onChange }) => {
48
48
  };
49
49
  setInputValue(e.target.value);
50
50
 
51
- // eslint-disable-next-line fp/no-mutation
52
51
  reader.readAsDataURL(file);
53
52
  };
54
53
  const clearImage = (e) => {
@@ -11,4 +11,3 @@ MarkdownField.propTypes = {
11
11
  };
12
12
 
13
13
  export default MarkdownField;
14
-
@@ -35,8 +35,8 @@ const makeOptions = (formatMessage, label) => (cardinality, values) =>
35
35
  isMultiple(cardinality)
36
36
  ? translateValues(formatMessage, label)(values)
37
37
  : _.union(translateValues(formatMessage, label)(values), [
38
- { text: formatMessage({ id: "selector.no.selection" }), value: null },
39
- ]);
38
+ { text: formatMessage({ id: "selector.no.selection" }), value: null },
39
+ ]);
40
40
 
41
41
  const singleValueType = (name, value, options) =>
42
42
  _.flow(
@@ -44,7 +44,7 @@ const singleValueType = (name, value, options) =>
44
44
  ({ value: id, text, external_id }) => ({
45
45
  value: { id, name: text, external_id },
46
46
  name,
47
- })
47
+ }),
48
48
  )(options);
49
49
 
50
50
  const multipleValueType = (name, value, options) => ({
@@ -55,7 +55,7 @@ const multipleValueType = (name, value, options) => ({
55
55
  id,
56
56
  name: text,
57
57
  external_id,
58
- }))
58
+ })),
59
59
  )(options),
60
60
  });
61
61
 
@@ -95,7 +95,7 @@ export const StandardDropdown = ({
95
95
  (o, key) => ({
96
96
  ...o,
97
97
  key,
98
- })
98
+ }),
99
99
  )}
100
100
  />
101
101
  );
@@ -2,10 +2,7 @@ import PropTypes from "prop-types";
2
2
  import { Form } from "semantic-ui-react";
3
3
  import { useIntl } from "react-intl";
4
4
 
5
- export const StringField = ({
6
- field,
7
- onChange,
8
- }) => {
5
+ export const StringField = ({ field, onChange }) => {
9
6
  const { name, cardinality, placeholder, value } = field;
10
7
  const { formatMessage } = useIntl();
11
8
  return cardinality == "+" || cardinality == "*" ? (
@@ -42,7 +42,7 @@ export const TableField = ({
42
42
  const columns_name = _.map((column) => column.name)(table_columns);
43
43
  return content.map((row) => {
44
44
  const field_deleted = _.keys(row).filter(
45
- (x) => !columns_name.includes(x)
45
+ (x) => !columns_name.includes(x),
46
46
  );
47
47
  return _.omit(field_deleted)(row);
48
48
  });
@@ -79,7 +79,7 @@ UserGroupPreview.propTypes = {
79
79
  name: PropTypes.string.isRequired,
80
80
  }),
81
81
  PropTypes.string,
82
- ])
82
+ ]),
83
83
  ).isRequired,
84
84
  };
85
85
 
@@ -27,7 +27,7 @@ describe("<CheckboxField />", () => {
27
27
  expect.objectContaining({
28
28
  checked: true,
29
29
  value: "Si",
30
- })
30
+ }),
31
31
  );
32
32
  });
33
33
  });
@@ -59,7 +59,7 @@ describe("<CheckboxField /> Multiple", () => {
59
59
  await user.click(rendered.getAllByRole("checkbox")[0]);
60
60
  expect(onChange).toHaveBeenCalledWith(
61
61
  expect.anything(),
62
- expect.objectContaining({ value: ["foo"] })
62
+ expect.objectContaining({ value: ["foo"] }),
63
63
  );
64
64
  });
65
65
  });
@@ -45,7 +45,7 @@ describe("<DropdownField />", () => {
45
45
  const field = { ...fieldData, type: "domain" };
46
46
  const rendered = render(
47
47
  <DropdownField {...{ ...props, field }} />,
48
- renderOpts
48
+ renderOpts,
49
49
  );
50
50
  await waitForLoad(rendered);
51
51
  expect(rendered.container).toMatchSnapshot();
@@ -55,7 +55,7 @@ describe("<DropdownField />", () => {
55
55
  const field = { ...fieldData, type: "system" };
56
56
  const rendered = render(
57
57
  <DropdownField {...{ ...props, field }} />,
58
- renderOpts
58
+ renderOpts,
59
59
  );
60
60
  await waitForLoad(rendered);
61
61
  expect(rendered.container).toMatchSnapshot();
@@ -148,9 +148,17 @@ describe("<DynamicField />", () => {
148
148
  });
149
149
 
150
150
  it("matches the latest snapshot (dynamic_table widget)", async () => {
151
- const table_columns = [{ name: "col", type: "string", widget: "string", cardinality: "1" }];
152
- const value = { value: [{ col: { origin: "user", value: "foo" } }], origin: "user" };
153
- const props = { field: { widget: "dynamic_table", values: { table_columns }, value }, onChange };
151
+ const table_columns = [
152
+ { name: "col", type: "string", widget: "string", cardinality: "1" },
153
+ ];
154
+ const value = {
155
+ value: [{ col: { origin: "user", value: "foo" } }],
156
+ origin: "user",
157
+ };
158
+ const props = {
159
+ field: { widget: "dynamic_table", values: { table_columns }, value },
160
+ onChange,
161
+ };
154
162
  const rendered = render(<DynamicField {...props} />);
155
163
  await waitForLoad(rendered);
156
164
  expect(rendered.container).toMatchSnapshot();