@ukhomeoffice/cop-react-form-renderer 2.8.3 → 2.9.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/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +1 -1
- package/dist/components/FormComponent/FormComponent.js +2 -1
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +7 -0
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +2 -2
- package/dist/components/SummaryList/GroupAction.js +5 -1
- package/dist/components/SummaryList/SummaryList.js +1 -1
- package/dist/json/group.json +1 -17
- package/dist/json/port.json +346 -0
- package/dist/json/sublocation.json +859 -0
- package/dist/json/terminal.json +81 -0
- package/dist/models/ComponentTypes.js +2 -0
- package/dist/utils/CheckYourAnswers/getCYARow.js +12 -0
- package/dist/utils/CheckYourAnswers/getCYARow.test.js +28 -1
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +1 -0
- package/dist/utils/Component/cleanAttributes.js +1 -1
- package/dist/utils/Component/getComponent.js +36 -3
- package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +92 -0
- package/dist/utils/Meta/constants.js +10 -0
- package/dist/utils/Meta/documents/getDocuments.js +18 -0
- package/dist/utils/Meta/documents/getDocuments.test.js +43 -0
- package/dist/utils/Meta/documents/index.js +23 -0
- package/dist/utils/Meta/documents/setDocumentForField.js +36 -0
- package/dist/utils/Meta/documents/setDocumentForField.test.js +49 -0
- package/dist/utils/Meta/index.js +21 -0
- package/dist/utils/Validate/validateCollection.js +42 -0
- package/dist/utils/Validate/validateCollection.test.js +74 -0
- package/dist/utils/Validate/validateComponent.js +67 -48
- package/dist/utils/Validate/validateComponent.test.js +247 -188
- package/dist/utils/Validate/validateContainer.js +29 -0
- package/dist/utils/Validate/validateContainer.test.js +68 -0
- package/dist/utils/index.js +4 -1
- package/package.json +2 -2
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"data": [
|
|
3
|
+
{
|
|
4
|
+
"id": 1,
|
|
5
|
+
"name": "Terminal 1",
|
|
6
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
7
|
+
"validto": null,
|
|
8
|
+
"updatedby": null
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 2,
|
|
12
|
+
"name": "Terminal 2",
|
|
13
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
14
|
+
"validto": null,
|
|
15
|
+
"updatedby": null
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 3,
|
|
19
|
+
"name": "Terminal 3",
|
|
20
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
21
|
+
"validto": null,
|
|
22
|
+
"updatedby": null
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": 4,
|
|
26
|
+
"name": "Terminal 4",
|
|
27
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
28
|
+
"validto": null,
|
|
29
|
+
"updatedby": null
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 5,
|
|
33
|
+
"name": "Terminal 5",
|
|
34
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
35
|
+
"validto": null,
|
|
36
|
+
"updatedby": null
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": 6,
|
|
40
|
+
"name": "North Terminal",
|
|
41
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
42
|
+
"validto": null,
|
|
43
|
+
"updatedby": null
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": 7,
|
|
47
|
+
"name": "South Terminal",
|
|
48
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
49
|
+
"validto": null,
|
|
50
|
+
"updatedby": null
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": 8,
|
|
54
|
+
"name": "Eastern Docks",
|
|
55
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
56
|
+
"validto": null,
|
|
57
|
+
"updatedby": null
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": 9,
|
|
61
|
+
"name": "Western Docks",
|
|
62
|
+
"validfrom": "2019-01-01T00:01:00.000Z",
|
|
63
|
+
"validto": null,
|
|
64
|
+
"updatedby": null
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": 10,
|
|
68
|
+
"name": "Tourist",
|
|
69
|
+
"validfrom": "2021-05-07T00:01:00.000Z",
|
|
70
|
+
"validto": null,
|
|
71
|
+
"updatedby": "Ben Milnes"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": 11,
|
|
75
|
+
"name": "Freight",
|
|
76
|
+
"validfrom": "2021-05-07T00:01:00.000Z",
|
|
77
|
+
"validto": null,
|
|
78
|
+
"updatedby": "Ben Milnes"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var TYPE_AUTOCOMPLETE = 'autocomplete';
|
|
8
8
|
var TYPE_CHECKBOXES = 'checkboxes';
|
|
9
|
+
var TYPE_COLLECTION = 'collection';
|
|
9
10
|
var TYPE_CONTAINER = 'container';
|
|
10
11
|
var TYPE_DATE = 'date';
|
|
11
12
|
var TYPE_EMAIL = 'email';
|
|
@@ -21,6 +22,7 @@ var TYPE_TIME = 'time';
|
|
|
21
22
|
var ComponentTypes = {
|
|
22
23
|
AUTOCOMPLETE: TYPE_AUTOCOMPLETE,
|
|
23
24
|
CHECKBOXES: TYPE_CHECKBOXES,
|
|
25
|
+
COLLECTION: TYPE_COLLECTION,
|
|
24
26
|
CONTAINER: TYPE_CONTAINER,
|
|
25
27
|
DATE: TYPE_DATE,
|
|
26
28
|
EMAIL: TYPE_EMAIL,
|
|
@@ -29,6 +29,7 @@ var getCYARow = function getCYARow(page, component, onAction) {
|
|
|
29
29
|
value = page.formData[component.fieldId];
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
setNestedValue(component, page);
|
|
32
33
|
return {
|
|
33
34
|
pageId: page.id,
|
|
34
35
|
id: component.id,
|
|
@@ -40,5 +41,16 @@ var getCYARow = function getCYARow(page, component, onAction) {
|
|
|
40
41
|
};
|
|
41
42
|
};
|
|
42
43
|
|
|
44
|
+
var setNestedValue = function setNestedValue(component, page) {
|
|
45
|
+
var _component$data, _component$data$optio;
|
|
46
|
+
|
|
47
|
+
(_component$data = component.data) === null || _component$data === void 0 ? void 0 : (_component$data$optio = _component$data.options) === null || _component$data$optio === void 0 ? void 0 : _component$data$optio.forEach(function (option, index) {
|
|
48
|
+
//check if option is selected and has nested component
|
|
49
|
+
if (page.formData[component.id] === option.value && option.nested) {
|
|
50
|
+
component.data.options[index].nested.value = page.formData[option.nested.id];
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
43
55
|
var _default = getCYARow;
|
|
44
56
|
exports.default = _default;
|
|
@@ -4,7 +4,8 @@ var _getCYARow = _interopRequireDefault(require("./getCYARow"));
|
|
|
4
4
|
|
|
5
5
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
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; }
|
|
8
|
+
|
|
8
9
|
describe('utils', function () {
|
|
9
10
|
describe('CheckYourAnswers', function () {
|
|
10
11
|
describe('getCYARow', function () {
|
|
@@ -148,6 +149,32 @@ describe('utils', function () {
|
|
|
148
149
|
onAction: ON_ACTION
|
|
149
150
|
});
|
|
150
151
|
});
|
|
152
|
+
it('should update update any nested components with corresponding values from the stored formdata', function () {
|
|
153
|
+
var SELECTED_VALUE = 'selectedValue';
|
|
154
|
+
var NESTED_ID = 'nestedId';
|
|
155
|
+
var NESTED_VALUE = 'nestedValue';
|
|
156
|
+
var PAGE = {
|
|
157
|
+
id: 'page',
|
|
158
|
+
formData: _defineProperty({
|
|
159
|
+
a: SELECTED_VALUE
|
|
160
|
+
}, NESTED_ID, NESTED_VALUE),
|
|
161
|
+
cya_link: {}
|
|
162
|
+
};
|
|
163
|
+
var COMPONENT = {
|
|
164
|
+
type: 'radios',
|
|
165
|
+
id: 'a',
|
|
166
|
+
data: {
|
|
167
|
+
options: [{
|
|
168
|
+
value: SELECTED_VALUE,
|
|
169
|
+
nested: {
|
|
170
|
+
id: NESTED_ID
|
|
171
|
+
}
|
|
172
|
+
}]
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
var ROW = (0, _getCYARow.default)(PAGE, COMPONENT, function () {});
|
|
176
|
+
expect(ROW.component.data.options[0].nested.value).toEqual(NESTED_VALUE);
|
|
177
|
+
});
|
|
151
178
|
});
|
|
152
179
|
});
|
|
153
180
|
});
|
|
@@ -19,7 +19,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
|
|
|
19
19
|
|
|
20
20
|
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; }
|
|
21
21
|
|
|
22
|
-
var JSON_ONLY_PROPERTIES = ['source', 'use', 'show_when', 'options', 'additionalValidation', 'full_path'];
|
|
22
|
+
var JSON_ONLY_PROPERTIES = ['source', 'use', 'show_when', 'options', 'additionalValidation', 'full_path', 'shown', 'formData'];
|
|
23
23
|
/**
|
|
24
24
|
* This method removes and properties that are entirely specific to the JSON
|
|
25
25
|
* configuration and that should not be used as HTML attributes.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.getNestedComponent = exports.default = void 0;
|
|
7
7
|
|
|
8
8
|
var _copReactComponents = require("@ukhomeoffice/cop-react-components");
|
|
9
9
|
|
|
@@ -84,6 +84,13 @@ var getRadios = function getRadios(config) {
|
|
|
84
84
|
options = val;
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
+
options.forEach(function (option) {
|
|
88
|
+
if (!option.nested) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
option.nestedJSX = getNestedComponent(config, option);
|
|
93
|
+
});
|
|
87
94
|
var attrs = (0, _cleanAttributes.default)(config);
|
|
88
95
|
return /*#__PURE__*/_react.default.createElement(_copReactComponents.Radios, _extends({}, attrs, {
|
|
89
96
|
options: options
|
|
@@ -148,6 +155,34 @@ var getComponentByType = function getComponentByType(config) {
|
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
};
|
|
158
|
+
/**
|
|
159
|
+
* Get nested component with form data
|
|
160
|
+
* @param {*} parentConfig
|
|
161
|
+
* @param {*} nestedConfig
|
|
162
|
+
*/
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
var getNestedComponent = function getNestedComponent(parentConfig, nestedConfig) {
|
|
166
|
+
nestedConfig.nested.onChange = parentConfig.onChange;
|
|
167
|
+
|
|
168
|
+
if (parentConfig.formData) {
|
|
169
|
+
var _parentConfig$formDat;
|
|
170
|
+
|
|
171
|
+
nestedConfig.nested.value = parentConfig !== null && parentConfig !== void 0 && (_parentConfig$formDat = parentConfig.formData) !== null && _parentConfig$formDat !== void 0 && _parentConfig$formDat[nestedConfig.nested.fieldId] ? parentConfig.formData[nestedConfig.nested.fieldId] : '';
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if ('readonly' in nestedConfig.nested) delete nestedConfig.nested.readonly;
|
|
175
|
+
|
|
176
|
+
if (parentConfig.readonly) {
|
|
177
|
+
nestedConfig.nested.readonly = parentConfig.readonly;
|
|
178
|
+
return getComponent(nestedConfig.nested, false);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return getComponent(nestedConfig.nested);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
exports.getNestedComponent = getNestedComponent;
|
|
185
|
+
|
|
151
186
|
/**
|
|
152
187
|
* Get a renderable component, based on a configuration object.
|
|
153
188
|
* @param {object} config The configuration object for the component.
|
|
@@ -155,8 +190,6 @@ var getComponentByType = function getComponentByType(config) {
|
|
|
155
190
|
* @param {Function} fnOverride An optional override function for component rendering.
|
|
156
191
|
* @returns A renderable component.
|
|
157
192
|
*/
|
|
158
|
-
|
|
159
|
-
|
|
160
193
|
var getComponent = function getComponent(config) {
|
|
161
194
|
var wrap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
162
195
|
var fnOverride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = require("@testing-library/react");
|
|
4
|
+
|
|
5
|
+
var _getComponent = require("../getComponent");
|
|
6
|
+
|
|
7
|
+
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; }
|
|
8
|
+
|
|
9
|
+
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); } }
|
|
10
|
+
|
|
11
|
+
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); }); }; }
|
|
12
|
+
|
|
13
|
+
describe('utils.Component.get', function () {
|
|
14
|
+
it('should return a component that is nested within another component', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
15
|
+
var ID, FIELD_ID, LABEL, VALUE, PARENT_CONFIG, NESTED_CONFIG, _render, container, child, label, input;
|
|
16
|
+
|
|
17
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
18
|
+
while (1) {
|
|
19
|
+
switch (_context.prev = _context.next) {
|
|
20
|
+
case 0:
|
|
21
|
+
ID = 'testId';
|
|
22
|
+
FIELD_ID = 'fieldId';
|
|
23
|
+
LABEL = 'Test label';
|
|
24
|
+
VALUE = 'nestedValue';
|
|
25
|
+
PARENT_CONFIG = {
|
|
26
|
+
onChange: function onChange() {},
|
|
27
|
+
formData: _defineProperty({}, FIELD_ID, VALUE)
|
|
28
|
+
};
|
|
29
|
+
NESTED_CONFIG = {
|
|
30
|
+
nested: {
|
|
31
|
+
id: ID,
|
|
32
|
+
fieldId: FIELD_ID,
|
|
33
|
+
label: LABEL,
|
|
34
|
+
type: 'text'
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
_render = (0, _react.render)((0, _getComponent.getNestedComponent)(PARENT_CONFIG, NESTED_CONFIG)), container = _render.container;
|
|
38
|
+
child = container.childNodes[0];
|
|
39
|
+
expect(child.classList).toContain('govuk-form-group');
|
|
40
|
+
label = child.childNodes[0];
|
|
41
|
+
expect(label).toBeDefined();
|
|
42
|
+
expect(label.innerHTML).toContain(LABEL);
|
|
43
|
+
input = child.childNodes[1];
|
|
44
|
+
expect(input.tagName).toEqual('INPUT');
|
|
45
|
+
expect(input.classList).toContain('govuk-input');
|
|
46
|
+
expect(input.id).toEqual(ID);
|
|
47
|
+
expect(input.value).toEqual(VALUE);
|
|
48
|
+
|
|
49
|
+
case 17:
|
|
50
|
+
case "end":
|
|
51
|
+
return _context.stop();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}, _callee);
|
|
55
|
+
})));
|
|
56
|
+
it('should return a read only component that is nested within another readonly component', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
|
|
57
|
+
var ID, FIELD_ID, LABEL, VALUE, PARENT_CONFIG, NESTED_CONFIG, _render2, container, child;
|
|
58
|
+
|
|
59
|
+
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
60
|
+
while (1) {
|
|
61
|
+
switch (_context2.prev = _context2.next) {
|
|
62
|
+
case 0:
|
|
63
|
+
ID = 'testId';
|
|
64
|
+
FIELD_ID = 'fieldId';
|
|
65
|
+
LABEL = 'Test label';
|
|
66
|
+
VALUE = 'nestedValue';
|
|
67
|
+
PARENT_CONFIG = {
|
|
68
|
+
onChange: function onChange() {},
|
|
69
|
+
formData: _defineProperty({}, FIELD_ID, VALUE),
|
|
70
|
+
readonly: true
|
|
71
|
+
};
|
|
72
|
+
NESTED_CONFIG = {
|
|
73
|
+
nested: {
|
|
74
|
+
id: ID,
|
|
75
|
+
fieldId: FIELD_ID,
|
|
76
|
+
label: LABEL,
|
|
77
|
+
type: 'text',
|
|
78
|
+
readonly: true
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
_render2 = (0, _react.render)((0, _getComponent.getNestedComponent)(PARENT_CONFIG, NESTED_CONFIG)), container = _render2.container;
|
|
82
|
+
child = container.childNodes[0];
|
|
83
|
+
expect(child.classList).toContain('hods-readonly');
|
|
84
|
+
|
|
85
|
+
case 9:
|
|
86
|
+
case "end":
|
|
87
|
+
return _context2.stop();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}, _callee2);
|
|
91
|
+
})));
|
|
92
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.META_PROPERTY = exports.META_DOCUMENTS_PROPERTY = void 0;
|
|
7
|
+
var META_PROPERTY = 'meta';
|
|
8
|
+
exports.META_PROPERTY = META_PROPERTY;
|
|
9
|
+
var META_DOCUMENTS_PROPERTY = 'documents';
|
|
10
|
+
exports.META_DOCUMENTS_PROPERTY = META_DOCUMENTS_PROPERTY;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _constants = require("../constants");
|
|
9
|
+
|
|
10
|
+
// Local imports
|
|
11
|
+
var getDocuments = function getDocuments(formData) {
|
|
12
|
+
var _formData$META_PROPER;
|
|
13
|
+
|
|
14
|
+
return (formData === null || formData === void 0 ? void 0 : (_formData$META_PROPER = formData[_constants.META_PROPERTY]) === null || _formData$META_PROPER === void 0 ? void 0 : _formData$META_PROPER[_constants.META_DOCUMENTS_PROPERTY]) || [];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
var _default = getDocuments;
|
|
18
|
+
exports.default = _default;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _constants = require("../constants");
|
|
4
|
+
|
|
5
|
+
var _getDocuments = _interopRequireDefault(require("./getDocuments"));
|
|
6
|
+
|
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
|
|
9
|
+
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; }
|
|
10
|
+
|
|
11
|
+
describe('Utils.Meta.documents.get', function () {
|
|
12
|
+
it('should return an empty array if formData is null', function () {
|
|
13
|
+
expect((0, _getDocuments.default)(null)).toEqual([]);
|
|
14
|
+
});
|
|
15
|
+
it('should return an empty array if formData does not contain a meta property', function () {
|
|
16
|
+
expect((0, _getDocuments.default)({})).toEqual([]);
|
|
17
|
+
});
|
|
18
|
+
it('should return an empty array if the meta property is undefined', function () {
|
|
19
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, undefined);
|
|
20
|
+
|
|
21
|
+
expect((0, _getDocuments.default)(FORM_DATA)).toEqual([]);
|
|
22
|
+
});
|
|
23
|
+
it('should return an empty array if the meta property contains no documents property', function () {
|
|
24
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, {});
|
|
25
|
+
|
|
26
|
+
expect((0, _getDocuments.default)(FORM_DATA)).toEqual([]);
|
|
27
|
+
});
|
|
28
|
+
it('should return an empty array if the meta.documents property is undefined', function () {
|
|
29
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, undefined));
|
|
30
|
+
|
|
31
|
+
expect((0, _getDocuments.default)(FORM_DATA)).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
it('should return the meta.documents property if it exists', function () {
|
|
34
|
+
var DOCUMENTS = [{
|
|
35
|
+
field: 'alpha',
|
|
36
|
+
url: 'http://alpha-bravo.com/files/charlie'
|
|
37
|
+
}];
|
|
38
|
+
|
|
39
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, DOCUMENTS));
|
|
40
|
+
|
|
41
|
+
expect((0, _getDocuments.default)(FORM_DATA)).toEqual(DOCUMENTS);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _constants = require("../constants");
|
|
9
|
+
|
|
10
|
+
var _setDocumentForField = _interopRequireDefault(require("./setDocumentForField"));
|
|
11
|
+
|
|
12
|
+
var _getDocuments = _interopRequireDefault(require("./getDocuments"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
// Local imports
|
|
17
|
+
var documents = {
|
|
18
|
+
setForField: _setDocumentForField.default,
|
|
19
|
+
get: _getDocuments.default,
|
|
20
|
+
name: _constants.META_DOCUMENTS_PROPERTY
|
|
21
|
+
};
|
|
22
|
+
var _default = documents;
|
|
23
|
+
exports.default = _default;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _constants = require("../constants");
|
|
9
|
+
|
|
10
|
+
var _getDocuments = _interopRequireDefault(require("./getDocuments"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
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; }
|
|
15
|
+
|
|
16
|
+
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; }
|
|
17
|
+
|
|
18
|
+
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; }
|
|
19
|
+
|
|
20
|
+
var setDocumentForField = function setDocumentForField(document, formData, field) {
|
|
21
|
+
var documents = (0, _getDocuments.default)(formData).filter(function (d) {
|
|
22
|
+
return d.field !== field;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (document) {
|
|
26
|
+
documents.push(_objectSpread(_objectSpread({}, document), {}, {
|
|
27
|
+
field: field
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
var existing = formData ? formData[_constants.META_PROPERTY] : undefined;
|
|
32
|
+
return _objectSpread(_objectSpread({}, existing), {}, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, documents));
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
var _default = setDocumentForField;
|
|
36
|
+
exports.default = _default;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _constants = require("../constants");
|
|
4
|
+
|
|
5
|
+
var _setDocumentForField = _interopRequireDefault(require("./setDocumentForField"));
|
|
6
|
+
|
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
|
|
9
|
+
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; }
|
|
10
|
+
|
|
11
|
+
describe('Utils.Meta.documents.add', function () {
|
|
12
|
+
var ALPHA_DOCUMENT = {
|
|
13
|
+
field: 'alpha',
|
|
14
|
+
url: 'http://alpha-bravo.com/files/alpha'
|
|
15
|
+
};
|
|
16
|
+
var BRAVO_DOCUMENT = {
|
|
17
|
+
field: 'bravo',
|
|
18
|
+
url: 'http://alpha-bravo.com/files/bravo'
|
|
19
|
+
};
|
|
20
|
+
it('should return an appropriately set up object if formData is null', function () {
|
|
21
|
+
expect((0, _setDocumentForField.default)(ALPHA_DOCUMENT, null, ALPHA_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
22
|
+
});
|
|
23
|
+
it('should add a new document to the array', function () {
|
|
24
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
25
|
+
|
|
26
|
+
expect((0, _setDocumentForField.default)(BRAVO_DOCUMENT, FORM_DATA, BRAVO_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT, BRAVO_DOCUMENT]));
|
|
27
|
+
});
|
|
28
|
+
it('should replace an existing document with the same field', function () {
|
|
29
|
+
var NEW_URL = 'http://replacement.com/files/alpha';
|
|
30
|
+
var NEW_ALPHA = {
|
|
31
|
+
field: ALPHA_DOCUMENT.field,
|
|
32
|
+
url: NEW_URL
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
36
|
+
|
|
37
|
+
expect((0, _setDocumentForField.default)(NEW_ALPHA, FORM_DATA, NEW_ALPHA.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [NEW_ALPHA]));
|
|
38
|
+
});
|
|
39
|
+
it('should handle a null document being passed where a document with that field already exists', function () {
|
|
40
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
41
|
+
|
|
42
|
+
expect((0, _setDocumentForField.default)(null, FORM_DATA, ALPHA_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, []));
|
|
43
|
+
});
|
|
44
|
+
it('should handle a null document being passed where a document with that field does not already exist', function () {
|
|
45
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
46
|
+
|
|
47
|
+
expect((0, _setDocumentForField.default)(null, FORM_DATA, BRAVO_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.Meta = void 0;
|
|
7
|
+
|
|
8
|
+
var _constants = require("./constants");
|
|
9
|
+
|
|
10
|
+
var _documents = _interopRequireDefault(require("./documents"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
// Local imports
|
|
15
|
+
var Meta = {
|
|
16
|
+
documents: _documents.default,
|
|
17
|
+
name: _constants.META_PROPERTY
|
|
18
|
+
};
|
|
19
|
+
exports.Meta = Meta;
|
|
20
|
+
var _default = Meta;
|
|
21
|
+
exports.default = _default;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _validateContainer = _interopRequireDefault(require("./validateContainer"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
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; }
|
|
13
|
+
|
|
14
|
+
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; }
|
|
15
|
+
|
|
16
|
+
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; }
|
|
17
|
+
|
|
18
|
+
var validateCollection = function validateCollection(collection, items) {
|
|
19
|
+
var errors = [];
|
|
20
|
+
|
|
21
|
+
if (collection && Array.isArray(collection.item) && Array.isArray(items)) {
|
|
22
|
+
items.forEach(function (item, index) {
|
|
23
|
+
var full_path = "".concat(collection.full_path || collection.fieldId, "[").concat(index, "]");
|
|
24
|
+
var container = {
|
|
25
|
+
full_path: full_path,
|
|
26
|
+
components: collection.item.map(function (component) {
|
|
27
|
+
return _objectSpread(_objectSpread({}, component), {}, {
|
|
28
|
+
full_path: "".concat(full_path, ".").concat(component.fieldId)
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
};
|
|
32
|
+
errors.push((0, _validateContainer.default)(container, item));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return errors.filter(function (e) {
|
|
37
|
+
return !!e;
|
|
38
|
+
}).flat();
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var _default = validateCollection;
|
|
42
|
+
exports.default = _default;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _models = require("../../models");
|
|
4
|
+
|
|
5
|
+
var _validateCollection = _interopRequireDefault(require("./validateCollection"));
|
|
6
|
+
|
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
|
|
9
|
+
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; }
|
|
10
|
+
|
|
11
|
+
describe('utils.Validate.Collection', function () {
|
|
12
|
+
var setup = function setup(id, type, label, required, item) {
|
|
13
|
+
return {
|
|
14
|
+
id: id,
|
|
15
|
+
fieldId: id,
|
|
16
|
+
type: type,
|
|
17
|
+
label: label,
|
|
18
|
+
required: required,
|
|
19
|
+
item: item
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
it('should return an empty array when the component is null', function () {
|
|
24
|
+
expect((0, _validateCollection.default)(null, [])).toEqual([]);
|
|
25
|
+
});
|
|
26
|
+
it('should return an empty array when the collection has an undefined item array', function () {
|
|
27
|
+
var ID = 'collection';
|
|
28
|
+
var LABEL = 'field';
|
|
29
|
+
var COLLECTION = setup(ID, _models.ComponentTypes.COLLECTION, LABEL, false, undefined);
|
|
30
|
+
expect((0, _validateCollection.default)(COLLECTION, [])).toEqual([]);
|
|
31
|
+
});
|
|
32
|
+
it('should return an empty array when the collection has an empty item array', function () {
|
|
33
|
+
var ID = 'collection';
|
|
34
|
+
var LABEL = 'field';
|
|
35
|
+
var COLLECTION = setup(ID, _models.ComponentTypes.COLLECTION, LABEL, false, []);
|
|
36
|
+
expect((0, _validateCollection.default)(COLLECTION, [])).toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
it('should return an empty array when the collection has only valid items', function () {
|
|
39
|
+
var EMAIL_ID = 'email';
|
|
40
|
+
var EMAIL_LABEL = 'Email';
|
|
41
|
+
var EMAIL = setup(EMAIL_ID, _models.ComponentTypes.EMAIL, EMAIL_LABEL, false);
|
|
42
|
+
var ID = 'collection';
|
|
43
|
+
var LABEL = 'field';
|
|
44
|
+
var COLLECTION = setup(ID, _models.ComponentTypes.COLLECTION, LABEL, false, [EMAIL]);
|
|
45
|
+
var ITEMS = [_defineProperty({}, EMAIL_ID, 'alpha.bravo@homeoffice.gov.uk'), _defineProperty({}, EMAIL_ID, 'charlie.delta@homeoffice.gov.uk')];
|
|
46
|
+
expect((0, _validateCollection.default)(COLLECTION, ITEMS)).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
it('should return an array containing an error when the collection has an invalid first item', function () {
|
|
49
|
+
var EMAIL_ID = 'email';
|
|
50
|
+
var EMAIL_LABEL = 'Email';
|
|
51
|
+
var EMAIL = setup(EMAIL_ID, _models.ComponentTypes.EMAIL, EMAIL_LABEL, false);
|
|
52
|
+
var ID = 'container';
|
|
53
|
+
var LABEL = 'field';
|
|
54
|
+
var COLLECTION = setup(ID, _models.ComponentTypes.CONTAINER, LABEL, false, [EMAIL]);
|
|
55
|
+
var ITEMS = [_defineProperty({}, EMAIL_ID, 'alpha.bravo@digital.homeoffice.com'), _defineProperty({}, EMAIL_ID, 'alpha.bravo@digital.homeoffice.gov.uk')];
|
|
56
|
+
expect((0, _validateCollection.default)(COLLECTION, ITEMS)).toEqual([{
|
|
57
|
+
id: "".concat(ID, "[0].").concat(EMAIL_ID),
|
|
58
|
+
error: "Enter ".concat(EMAIL_LABEL.toLowerCase(), " in the correct format, like jane.doe@homeoffice.gov.uk")
|
|
59
|
+
}]);
|
|
60
|
+
});
|
|
61
|
+
it('should return an array containing an error when the collection has an invalid second item', function () {
|
|
62
|
+
var EMAIL_ID = 'email';
|
|
63
|
+
var EMAIL_LABEL = 'Email';
|
|
64
|
+
var EMAIL = setup(EMAIL_ID, _models.ComponentTypes.EMAIL, EMAIL_LABEL, false);
|
|
65
|
+
var ID = 'container';
|
|
66
|
+
var LABEL = 'field';
|
|
67
|
+
var COLLECTION = setup(ID, _models.ComponentTypes.CONTAINER, LABEL, false, [EMAIL]);
|
|
68
|
+
var ITEMS = [_defineProperty({}, EMAIL_ID, 'alpha.bravo@digital.homeoffice.gov.uk'), _defineProperty({}, EMAIL_ID, 'alpha.bravo@digital.homeoffice.com')];
|
|
69
|
+
expect((0, _validateCollection.default)(COLLECTION, ITEMS)).toEqual([{
|
|
70
|
+
id: "".concat(ID, "[1].").concat(EMAIL_ID),
|
|
71
|
+
error: "Enter ".concat(EMAIL_LABEL.toLowerCase(), " in the correct format, like jane.doe@homeoffice.gov.uk")
|
|
72
|
+
}]);
|
|
73
|
+
});
|
|
74
|
+
});
|