@ukhomeoffice/cop-react-form-renderer 2.6.1-gamma → 2.6.2
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/dist/components/FormComponent/Container.test.js +89 -10
- package/dist/components/FormComponent/FormComponent.js +63 -14
- package/dist/models/ComponentTypes.js +2 -0
- package/dist/utils/Component/getComponent.js +13 -5
- package/dist/utils/Component/getComponentTests/getComponent.file.test.js +81 -0
- package/dist/utils/Component/isEditable.js +1 -1
- package/dist/utils/Data/index.js +3 -0
- package/dist/utils/Data/setDataItem.js +29 -0
- package/dist/utils/Data/setDataItem.test.js +112 -0
- package/package.json +6 -8
|
@@ -4,6 +4,8 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
|
|
|
4
4
|
|
|
5
5
|
var _react = require("@testing-library/react");
|
|
6
6
|
|
|
7
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
8
|
+
|
|
7
9
|
var _react2 = _interopRequireDefault(require("react"));
|
|
8
10
|
|
|
9
11
|
var _models = require("../../models");
|
|
@@ -16,6 +18,10 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
16
18
|
|
|
17
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
20
|
|
|
21
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
22
|
+
|
|
23
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
24
|
+
|
|
19
25
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
20
26
|
|
|
21
27
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
@@ -23,16 +29,20 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
|
|
|
23
29
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
24
30
|
|
|
25
31
|
describe('components.FormComponent.Container', function () {
|
|
26
|
-
var _ID;
|
|
32
|
+
var _ID, _FORM_DATA;
|
|
27
33
|
|
|
28
34
|
var ID = 'container';
|
|
29
35
|
var NESTED_ID = 'nested';
|
|
30
36
|
var TEXT_ID = 'text';
|
|
31
37
|
var TEXT_VALUE = 'alpha';
|
|
32
38
|
var NESTED_TEXT_VALUE = 'charlie';
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
var FORM_DATA = (_FORM_DATA = {}, _defineProperty(_FORM_DATA, ID, (_ID = {}, _defineProperty(_ID, TEXT_ID, TEXT_VALUE), _defineProperty(_ID, NESTED_ID, _defineProperty({}, TEXT_ID, NESTED_TEXT_VALUE)), _ID)), _defineProperty(_FORM_DATA, _FormComponent.META_PROPERTY, _defineProperty({}, _FormComponent.META_DOCUMENTS_PROPERTY, [{
|
|
40
|
+
field: 'epsilon.zeta',
|
|
41
|
+
name: 'ez.jpg',
|
|
42
|
+
type: 'image/jpg',
|
|
43
|
+
extension: 'jpg',
|
|
44
|
+
url: 'http://files.com/ez.jpg'
|
|
45
|
+
}])), _FORM_DATA);
|
|
36
46
|
var TEXT_COMPONENT = {
|
|
37
47
|
id: TEXT_ID,
|
|
38
48
|
fieldId: TEXT_ID,
|
|
@@ -201,22 +211,91 @@ describe('components.FormComponent.Container', function () {
|
|
|
201
211
|
}
|
|
202
212
|
}, _callee3);
|
|
203
213
|
})));
|
|
204
|
-
it('should handle a
|
|
205
|
-
var CONTAINER, _render4, container, c, formGroup,
|
|
214
|
+
it('should handle a change to a file type component appropriately', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
|
|
215
|
+
var FILE_ID, ON_CHANGE_EVENTS, ON_CHANGE, CONTAINER, _render4, container, c, formGroup, input, FILE_EXTENSION, FILE_NAME, FILE_TYPE, str, blob, FILE, containerChangeValue, metaChangeValue;
|
|
206
216
|
|
|
207
217
|
return regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
208
218
|
while (1) {
|
|
209
219
|
switch (_context4.prev = _context4.next) {
|
|
210
220
|
case 0:
|
|
221
|
+
FILE_ID = 'file';
|
|
222
|
+
ON_CHANGE_EVENTS = [];
|
|
223
|
+
|
|
224
|
+
ON_CHANGE = function ON_CHANGE(e) {
|
|
225
|
+
ON_CHANGE_EVENTS.push(e);
|
|
226
|
+
};
|
|
227
|
+
|
|
211
228
|
CONTAINER = {
|
|
212
229
|
id: ID,
|
|
213
230
|
fieldId: ID,
|
|
214
231
|
type: _models.ComponentTypes.CONTAINER,
|
|
215
|
-
components: [
|
|
232
|
+
components: [{
|
|
233
|
+
id: FILE_ID,
|
|
234
|
+
fieldId: FILE_ID,
|
|
235
|
+
full_path: "".concat(ID, ".").concat(FILE_ID),
|
|
236
|
+
type: _models.ComponentTypes.FILE,
|
|
237
|
+
label: 'File component'
|
|
238
|
+
}]
|
|
216
239
|
};
|
|
217
240
|
_render4 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_FormComponent.default, {
|
|
241
|
+
component: CONTAINER,
|
|
242
|
+
value: FORM_DATA[ID],
|
|
243
|
+
formData: FORM_DATA,
|
|
244
|
+
onChange: ON_CHANGE
|
|
245
|
+
})), container = _render4.container; // Get hold of the text input.
|
|
246
|
+
|
|
247
|
+
c = container.childNodes[0];
|
|
248
|
+
formGroup = c.childNodes[0];
|
|
249
|
+
input = formGroup.childNodes[2].childNodes[0];
|
|
250
|
+
FILE_EXTENSION = 'json';
|
|
251
|
+
FILE_NAME = "test.".concat(FILE_EXTENSION);
|
|
252
|
+
FILE_TYPE = 'application/JSON';
|
|
253
|
+
str = JSON.stringify({
|
|
254
|
+
alpha: 'bravo'
|
|
255
|
+
});
|
|
256
|
+
blob = new Blob([str]);
|
|
257
|
+
FILE = new File([blob], FILE_NAME, {
|
|
258
|
+
type: FILE_TYPE
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
_userEvent.default.upload(input, FILE); // And confirm the formData has been changed.
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
expect(ON_CHANGE_EVENTS.length).toEqual(2); // One for the file, another for the meta.
|
|
265
|
+
|
|
266
|
+
expect(ON_CHANGE_EVENTS[0].target.name).toEqual(ID);
|
|
267
|
+
expect(ON_CHANGE_EVENTS[1].target.name).toEqual(_FormComponent.META_PROPERTY);
|
|
268
|
+
containerChangeValue = JSON.parse(JSON.stringify(ON_CHANGE_EVENTS[0].target.value));
|
|
269
|
+
metaChangeValue = JSON.parse(JSON.stringify(ON_CHANGE_EVENTS[1].target.value));
|
|
270
|
+
expect(metaChangeValue.documents.length).toEqual(2); // Existing one, plus this new one.
|
|
271
|
+
|
|
272
|
+
expect(metaChangeValue.documents[1]).toMatchObject(_objectSpread(_objectSpread({}, containerChangeValue[FILE_ID]), {}, {
|
|
273
|
+
field: "".concat(ID, ".").concat(FILE_ID)
|
|
274
|
+
}));
|
|
275
|
+
|
|
276
|
+
case 22:
|
|
277
|
+
case "end":
|
|
278
|
+
return _context4.stop();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}, _callee4);
|
|
282
|
+
})));
|
|
283
|
+
it('should handle a null value appropriately', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
|
|
284
|
+
var CONTAINER, _render5, container, c, formGroup, label, hint, input;
|
|
285
|
+
|
|
286
|
+
return regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
287
|
+
while (1) {
|
|
288
|
+
switch (_context5.prev = _context5.next) {
|
|
289
|
+
case 0:
|
|
290
|
+
CONTAINER = {
|
|
291
|
+
id: ID,
|
|
292
|
+
fieldId: ID,
|
|
293
|
+
type: _models.ComponentTypes.CONTAINER,
|
|
294
|
+
components: [TEXT_COMPONENT]
|
|
295
|
+
};
|
|
296
|
+
_render5 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_FormComponent.default, {
|
|
218
297
|
component: CONTAINER
|
|
219
|
-
})), container =
|
|
298
|
+
})), container = _render5.container; // Check the container itself.
|
|
220
299
|
|
|
221
300
|
c = container.childNodes[0];
|
|
222
301
|
expect(c.tagName).toEqual('DIV');
|
|
@@ -242,9 +321,9 @@ describe('components.FormComponent.Container', function () {
|
|
|
242
321
|
|
|
243
322
|
case 22:
|
|
244
323
|
case "end":
|
|
245
|
-
return
|
|
324
|
+
return _context5.stop();
|
|
246
325
|
}
|
|
247
326
|
}
|
|
248
|
-
},
|
|
327
|
+
}, _callee5);
|
|
249
328
|
})));
|
|
250
329
|
});
|
|
@@ -5,7 +5,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.default = exports.DEFAULT_CONTAINER_CLASS = void 0;
|
|
8
|
+
exports.default = exports.META_PROPERTY = exports.META_DOCUMENTS_PROPERTY = exports.DEFAULT_CONTAINER_CLASS = void 0;
|
|
9
9
|
|
|
10
10
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
11
|
|
|
@@ -50,6 +50,10 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
|
|
|
50
50
|
|
|
51
51
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
52
52
|
|
|
53
|
+
var META_PROPERTY = 'meta';
|
|
54
|
+
exports.META_PROPERTY = META_PROPERTY;
|
|
55
|
+
var META_DOCUMENTS_PROPERTY = 'documents';
|
|
56
|
+
exports.META_DOCUMENTS_PROPERTY = META_DOCUMENTS_PROPERTY;
|
|
53
57
|
var DEFAULT_CONTAINER_CLASS = 'hods-form-container';
|
|
54
58
|
exports.DEFAULT_CONTAINER_CLASS = DEFAULT_CONTAINER_CLASS;
|
|
55
59
|
|
|
@@ -64,15 +68,21 @@ var Container = function Container(_ref) {
|
|
|
64
68
|
var onComponentChange = function onComponentChange(_ref2) {
|
|
65
69
|
var target = _ref2.target;
|
|
66
70
|
|
|
67
|
-
var val = _objectSpread(_objectSpread({}, value), {}, _defineProperty({}, target.name, target.value));
|
|
68
|
-
|
|
69
71
|
if (typeof onChange === 'function') {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
if (target.name === META_PROPERTY) {
|
|
73
|
+
onChange({
|
|
74
|
+
target: target
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
var val = _objectSpread(_objectSpread({}, value), {}, _defineProperty({}, target.name, target.value));
|
|
78
|
+
|
|
79
|
+
onChange({
|
|
80
|
+
target: {
|
|
81
|
+
name: container.fieldId,
|
|
82
|
+
value: val
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
76
86
|
}
|
|
77
87
|
};
|
|
78
88
|
|
|
@@ -88,12 +98,13 @@ var Container = function Container(_ref) {
|
|
|
88
98
|
className: DEFAULT_CONTAINER_CLASS,
|
|
89
99
|
id: container.id
|
|
90
100
|
}), container.components && container.components.filter(shouldShow).map(function (component, index) {
|
|
91
|
-
var
|
|
101
|
+
var defaultValue = component.type === _models.ComponentTypes.FILE ? {} : '';
|
|
102
|
+
var val = value ? value[component.fieldId] : defaultValue;
|
|
92
103
|
return /*#__PURE__*/_react.default.createElement(FormComponent, {
|
|
93
104
|
key: index,
|
|
94
105
|
component: component,
|
|
95
106
|
formData: formData,
|
|
96
|
-
value: val ||
|
|
107
|
+
value: val || defaultValue,
|
|
97
108
|
wrap: wrap,
|
|
98
109
|
onChange: onComponentChange
|
|
99
110
|
});
|
|
@@ -144,22 +155,60 @@ var FormComponent = function FormComponent(_ref3) {
|
|
|
144
155
|
}
|
|
145
156
|
}, [component, data, status]);
|
|
146
157
|
|
|
158
|
+
var changeMetaDocuments = function changeMetaDocuments(document) {
|
|
159
|
+
var _formData$META_PROPER;
|
|
160
|
+
|
|
161
|
+
var documents = (((_formData$META_PROPER = formData[META_PROPERTY]) === null || _formData$META_PROPER === void 0 ? void 0 : _formData$META_PROPER.documents) || []).filter(function (d) {
|
|
162
|
+
return d.field !== component.full_path;
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (document) {
|
|
166
|
+
documents.push(_objectSpread(_objectSpread({}, document), {}, {
|
|
167
|
+
field: component.full_path
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
onChange({
|
|
172
|
+
target: {
|
|
173
|
+
name: META_PROPERTY,
|
|
174
|
+
value: _objectSpread(_objectSpread({}, formData[META_PROPERTY]), {}, {
|
|
175
|
+
documents: documents
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
var onComponentChange = function onComponentChange(_ref4) {
|
|
182
|
+
var target = _ref4.target;
|
|
183
|
+
|
|
184
|
+
if (typeof onChange === 'function') {
|
|
185
|
+
onChange({
|
|
186
|
+
target: target
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
if (component.type === _models.ComponentTypes.FILE) {
|
|
190
|
+
changeMetaDocuments(target.value);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
147
195
|
if (component.type === _models.ComponentTypes.CONTAINER) {
|
|
148
196
|
return /*#__PURE__*/_react.default.createElement(Container, {
|
|
149
197
|
container: component,
|
|
150
198
|
wrap: wrap,
|
|
151
|
-
onChange:
|
|
199
|
+
onChange: onComponentChange,
|
|
152
200
|
value: value,
|
|
153
201
|
formData: formData
|
|
154
202
|
});
|
|
155
203
|
}
|
|
156
204
|
|
|
205
|
+
var defaultValue = component.type === _models.ComponentTypes.FILE ? {} : '';
|
|
157
206
|
return _utils.default.Component.get(_objectSpread(_objectSpread(_objectSpread({}, attrs), component), {}, {
|
|
158
207
|
label: component.label || '',
|
|
159
208
|
hint: component.hint || '',
|
|
160
209
|
options: options,
|
|
161
|
-
value: value ||
|
|
162
|
-
onChange:
|
|
210
|
+
value: value || defaultValue,
|
|
211
|
+
onChange: onComponentChange
|
|
163
212
|
}), wrap, hooks.onGetComponent);
|
|
164
213
|
};
|
|
165
214
|
|
|
@@ -9,6 +9,7 @@ var TYPE_CHECKBOXES = 'checkboxes';
|
|
|
9
9
|
var TYPE_CONTAINER = 'container';
|
|
10
10
|
var TYPE_DATE = 'date';
|
|
11
11
|
var TYPE_EMAIL = 'email';
|
|
12
|
+
var TYPE_FILE = 'file';
|
|
12
13
|
var TYPE_HEADING = 'heading';
|
|
13
14
|
var TYPE_HTML = 'html';
|
|
14
15
|
var TYPE_INSET_TEXT = 'inset-text';
|
|
@@ -23,6 +24,7 @@ var ComponentTypes = {
|
|
|
23
24
|
CONTAINER: TYPE_CONTAINER,
|
|
24
25
|
DATE: TYPE_DATE,
|
|
25
26
|
EMAIL: TYPE_EMAIL,
|
|
27
|
+
FILE: TYPE_FILE,
|
|
26
28
|
HEADING: TYPE_HEADING,
|
|
27
29
|
HTML: TYPE_HTML,
|
|
28
30
|
INSET_TEXT: TYPE_INSET_TEXT,
|
|
@@ -5,16 +5,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var _react = _interopRequireDefault(require("react"));
|
|
9
|
-
|
|
10
8
|
var _copReactComponents = require("@ukhomeoffice/cop-react-components");
|
|
11
9
|
|
|
12
|
-
var
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
11
|
|
|
14
12
|
var _models = require("../../models");
|
|
15
13
|
|
|
16
14
|
var _Data = _interopRequireDefault(require("../Data"));
|
|
17
15
|
|
|
16
|
+
var _cleanAttributes = _interopRequireDefault(require("./cleanAttributes"));
|
|
17
|
+
|
|
18
18
|
var _isEditable = _interopRequireDefault(require("./isEditable"));
|
|
19
19
|
|
|
20
20
|
var _wrapInFormGroup = _interopRequireDefault(require("./wrapInFormGroup"));
|
|
@@ -57,6 +57,11 @@ var getDate = function getDate(config) {
|
|
|
57
57
|
return /*#__PURE__*/_react.default.createElement(_copReactComponents.DateInput, attrs);
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
+
var getFileUpload = function getFileUpload(config) {
|
|
61
|
+
var attrs = (0, _cleanAttributes.default)(config);
|
|
62
|
+
return /*#__PURE__*/_react.default.createElement(_copReactComponents.FileUpload, attrs);
|
|
63
|
+
};
|
|
64
|
+
|
|
60
65
|
var getHeading = function getHeading(config) {
|
|
61
66
|
var attrs = (0, _cleanAttributes.default)(config);
|
|
62
67
|
return /*#__PURE__*/_react.default.createElement(_copReactComponents.Heading, attrs, config.content);
|
|
@@ -125,14 +130,17 @@ var getComponentByType = function getComponentByType(config) {
|
|
|
125
130
|
case _models.ComponentTypes.RADIOS:
|
|
126
131
|
return getRadios(config);
|
|
127
132
|
|
|
133
|
+
case _models.ComponentTypes.CHECKBOXES:
|
|
134
|
+
return getCheckboxes(config);
|
|
135
|
+
|
|
128
136
|
case _models.ComponentTypes.DATE:
|
|
129
137
|
return getDate(config);
|
|
130
138
|
|
|
131
139
|
case _models.ComponentTypes.TIME:
|
|
132
140
|
return getTime(config);
|
|
133
141
|
|
|
134
|
-
case _models.ComponentTypes.
|
|
135
|
-
return
|
|
142
|
+
case _models.ComponentTypes.FILE:
|
|
143
|
+
return getFileUpload(config);
|
|
136
144
|
|
|
137
145
|
default:
|
|
138
146
|
{
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = require("@testing-library/react");
|
|
4
|
+
|
|
5
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
6
|
+
|
|
7
|
+
var _models = require("../../../models");
|
|
8
|
+
|
|
9
|
+
var _getComponent = _interopRequireDefault(require("../getComponent"));
|
|
10
|
+
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
|
|
13
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
14
|
+
|
|
15
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
16
|
+
|
|
17
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
18
|
+
|
|
19
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
20
|
+
|
|
21
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
22
|
+
|
|
23
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
24
|
+
|
|
25
|
+
describe('utils.Component.get', function () {
|
|
26
|
+
it('should return an appropriately rendered file component', function () {
|
|
27
|
+
var ID = 'test-id';
|
|
28
|
+
var FIELD_ID = 'field-id';
|
|
29
|
+
var LABEL = 'label';
|
|
30
|
+
var ON_CHANGE_CALLS = [];
|
|
31
|
+
|
|
32
|
+
var ON_CHANGE = function ON_CHANGE(e) {
|
|
33
|
+
ON_CHANGE_CALLS.push(e.target);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
var COMPONENT = {
|
|
37
|
+
type: _models.ComponentTypes.FILE,
|
|
38
|
+
id: ID,
|
|
39
|
+
fieldId: FIELD_ID,
|
|
40
|
+
label: LABEL,
|
|
41
|
+
onChange: ON_CHANGE,
|
|
42
|
+
'data-testid': ID
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
var _render = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
|
|
46
|
+
container = _render.container;
|
|
47
|
+
|
|
48
|
+
var _getAllByTestId = (0, _react.getAllByTestId)(container, ID),
|
|
49
|
+
_getAllByTestId2 = _slicedToArray(_getAllByTestId, 2),
|
|
50
|
+
formGroup = _getAllByTestId2[0],
|
|
51
|
+
input = _getAllByTestId2[1];
|
|
52
|
+
|
|
53
|
+
expect(formGroup.tagName).toEqual('DIV');
|
|
54
|
+
expect(formGroup.classList).toContain('govuk-form-group');
|
|
55
|
+
var label = undefined;
|
|
56
|
+
formGroup.childNodes.forEach(function (node) {
|
|
57
|
+
// Check if it's an element.
|
|
58
|
+
if (node instanceof Element && node.tagName === 'LABEL') {
|
|
59
|
+
label = node;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
expect(label).toBeDefined();
|
|
63
|
+
expect(label.innerHTML).toContain(LABEL);
|
|
64
|
+
expect(label.getAttribute('for')).toEqual(ID);
|
|
65
|
+
expect(input.tagName).toEqual('INPUT');
|
|
66
|
+
expect(input.classList).toContain('hods-file-upload__select');
|
|
67
|
+
expect(input.id).toEqual("".concat(ID, "-select"));
|
|
68
|
+
var str = JSON.stringify({
|
|
69
|
+
alpha: 'bravo'
|
|
70
|
+
});
|
|
71
|
+
var blob = new Blob([str]);
|
|
72
|
+
var FILE = new File([blob], 'test.json', {
|
|
73
|
+
type: 'application/JSON'
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
_userEvent.default.upload(input, FILE);
|
|
77
|
+
|
|
78
|
+
expect(ON_CHANGE_CALLS.length).toEqual(1);
|
|
79
|
+
expect(input.files.length).toEqual(1);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -8,7 +8,7 @@ exports.default = exports.EDITABLE_TYPES = void 0;
|
|
|
8
8
|
var _models = require("../../models");
|
|
9
9
|
|
|
10
10
|
// Local imports
|
|
11
|
-
var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.CHECKBOXES, _models.ComponentTypes.DATE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT, _models.ComponentTypes.TEXT_AREA, _models.ComponentTypes.TIME];
|
|
11
|
+
var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.CHECKBOXES, _models.ComponentTypes.DATE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.FILE, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT, _models.ComponentTypes.TEXT_AREA, _models.ComponentTypes.TIME];
|
|
12
12
|
exports.EDITABLE_TYPES = EDITABLE_TYPES;
|
|
13
13
|
|
|
14
14
|
var isEditable = function isEditable(options) {
|
package/dist/utils/Data/index.js
CHANGED
|
@@ -15,6 +15,8 @@ var _getSourceData = _interopRequireDefault(require("./getSourceData"));
|
|
|
15
15
|
|
|
16
16
|
var _refDataToOptions = _interopRequireDefault(require("./refDataToOptions"));
|
|
17
17
|
|
|
18
|
+
var _setDataItem = _interopRequireDefault(require("./setDataItem"));
|
|
19
|
+
|
|
18
20
|
var _setupFormData = _interopRequireDefault(require("./setupFormData"));
|
|
19
21
|
|
|
20
22
|
var _setupRefDataUrlForComponent = _interopRequireDefault(require("./setupRefDataUrlForComponent"));
|
|
@@ -31,6 +33,7 @@ var Data = {
|
|
|
31
33
|
setupUrl: _setupRefDataUrlForComponent.default,
|
|
32
34
|
toOptions: _refDataToOptions.default
|
|
33
35
|
},
|
|
36
|
+
setDataItem: _setDataItem.default,
|
|
34
37
|
setupForm: _setupFormData.default
|
|
35
38
|
};
|
|
36
39
|
var _default = Data;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
9
|
+
|
|
10
|
+
var setDataItem = function setDataItem(data, fieldId, value) {
|
|
11
|
+
if (fieldId && data) {
|
|
12
|
+
var parts = fieldId.split('.');
|
|
13
|
+
var leaf = parts.pop();
|
|
14
|
+
var node = data;
|
|
15
|
+
parts.forEach(function (part) {
|
|
16
|
+
if (!node[part] || _typeof(node[part]) !== 'object') {
|
|
17
|
+
node[part] = {};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
node = node[part];
|
|
21
|
+
});
|
|
22
|
+
node[leaf] = value;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return data;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
var _default = setDataItem;
|
|
29
|
+
exports.default = _default;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _setDataItem = _interopRequireDefault(require("./setDataItem"));
|
|
4
|
+
|
|
5
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
6
|
+
|
|
7
|
+
describe('utils.Data.setDataItem', function () {
|
|
8
|
+
it('should handle a null data object', function () {
|
|
9
|
+
var DATA = null;
|
|
10
|
+
var FIELD_ID = 'alpha.bravo.charlie';
|
|
11
|
+
var VALUE = 'delta';
|
|
12
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toBeNull();
|
|
13
|
+
expect(DATA).toBeNull();
|
|
14
|
+
});
|
|
15
|
+
it('should handle an undefined data object', function () {
|
|
16
|
+
var DATA = undefined;
|
|
17
|
+
var FIELD_ID = 'alpha.bravo.charlie';
|
|
18
|
+
var VALUE = 'delta';
|
|
19
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toBeUndefined();
|
|
20
|
+
expect(DATA).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
it('should handle a null fieldId', function () {
|
|
23
|
+
var DATA = {};
|
|
24
|
+
var FIELD_ID = null;
|
|
25
|
+
var VALUE = 'delta';
|
|
26
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toMatchObject({});
|
|
27
|
+
expect(DATA).toMatchObject({});
|
|
28
|
+
});
|
|
29
|
+
it('should handle an undefined fieldId', function () {
|
|
30
|
+
var DATA = {};
|
|
31
|
+
var FIELD_ID = undefined;
|
|
32
|
+
var VALUE = 'delta';
|
|
33
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toMatchObject({});
|
|
34
|
+
expect(DATA).toMatchObject({});
|
|
35
|
+
});
|
|
36
|
+
it('should handle an empty fieldId', function () {
|
|
37
|
+
var DATA = {};
|
|
38
|
+
var FIELD_ID = '';
|
|
39
|
+
var VALUE = 'delta';
|
|
40
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toMatchObject({});
|
|
41
|
+
expect(DATA).toMatchObject({});
|
|
42
|
+
});
|
|
43
|
+
it('should appropriately set a nested value', function () {
|
|
44
|
+
var DATA = {
|
|
45
|
+
alpha: {}
|
|
46
|
+
};
|
|
47
|
+
var FIELD_ID = 'alpha.bravo.charlie';
|
|
48
|
+
var VALUE = 'delta';
|
|
49
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toMatchObject({
|
|
50
|
+
alpha: {
|
|
51
|
+
bravo: {
|
|
52
|
+
charlie: VALUE
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
expect(DATA).toMatchObject({
|
|
57
|
+
alpha: {
|
|
58
|
+
bravo: {
|
|
59
|
+
charlie: VALUE
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it('should appropriately change a nested value', function () {
|
|
65
|
+
var DATA = {
|
|
66
|
+
alpha: {
|
|
67
|
+
bravo: {
|
|
68
|
+
charlie: 'echo'
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var FIELD_ID = 'alpha.bravo.charlie';
|
|
73
|
+
var VALUE = 'delta';
|
|
74
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toMatchObject({
|
|
75
|
+
alpha: {
|
|
76
|
+
bravo: {
|
|
77
|
+
charlie: VALUE
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
expect(DATA).toMatchObject({
|
|
82
|
+
alpha: {
|
|
83
|
+
bravo: {
|
|
84
|
+
charlie: VALUE
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
it('should handle a parent node that is not an object and convert it appropriately', function () {
|
|
90
|
+
var DATA = {
|
|
91
|
+
alpha: {
|
|
92
|
+
bravo: 'echo'
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
var FIELD_ID = 'alpha.bravo.charlie';
|
|
96
|
+
var VALUE = 'delta';
|
|
97
|
+
expect((0, _setDataItem.default)(DATA, FIELD_ID, VALUE)).toMatchObject({
|
|
98
|
+
alpha: {
|
|
99
|
+
bravo: {
|
|
100
|
+
charlie: VALUE
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
expect(DATA).toMatchObject({
|
|
105
|
+
alpha: {
|
|
106
|
+
bravo: {
|
|
107
|
+
charlie: VALUE
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ukhomeoffice/cop-react-form-renderer",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"scripts": {
|
|
6
6
|
"clean": "rimraf dist",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"post-compile": "rimraf dist/*.test.* dist/**/*.test.* dist/**/*.stories.* dist/docs dist/assets"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@ukhomeoffice/cop-react-components": "1.
|
|
19
|
+
"@ukhomeoffice/cop-react-components": "1.3.0",
|
|
20
20
|
"axios": "^0.21.1",
|
|
21
21
|
"dayjs": "^1.11.0",
|
|
22
22
|
"govuk-frontend": "^3.13.0",
|
|
@@ -43,24 +43,22 @@
|
|
|
43
43
|
"@testing-library/react-hooks": "^7.0.2",
|
|
44
44
|
"@testing-library/user-event": "^12.1.10",
|
|
45
45
|
"axios-mock-adapter": "^1.18.1",
|
|
46
|
-
"babel-loader": "8.1.0",
|
|
47
46
|
"cross-env": "^7.0.3",
|
|
48
47
|
"html-react-parser": "^0.10.5",
|
|
49
48
|
"node-sass": "^6.0.1",
|
|
50
49
|
"react": "^16.13.1",
|
|
51
50
|
"react-dom": "^16.13.1",
|
|
52
51
|
"react-scripts": "4.0.3",
|
|
53
|
-
"storybook-addon-mock": "^2.0.1"
|
|
54
|
-
"webpack": "4.44.2"
|
|
52
|
+
"storybook-addon-mock": "^2.0.1"
|
|
55
53
|
},
|
|
56
54
|
"peerDependencies": {
|
|
57
55
|
"react": "^16.13.1",
|
|
58
56
|
"react-dom": "^16.13.1",
|
|
59
57
|
"react-scripts": "4.0.3"
|
|
60
58
|
},
|
|
61
|
-
"optionalDependencies": {
|
|
62
|
-
|
|
63
|
-
"
|
|
59
|
+
"optionalDependencies": {
|
|
60
|
+
"babel-loader": "8.1.0",
|
|
61
|
+
"webpack": "4.44.2"
|
|
64
62
|
},
|
|
65
63
|
"main": "dist/index.js",
|
|
66
64
|
"files": [
|