@ukhomeoffice/cop-react-form-renderer 2.8.5 → 2.10.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.js +8 -12
- package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +10 -8
- package/dist/components/FormComponent/Collection.js +244 -0
- package/dist/components/FormComponent/Collection.scss +23 -0
- package/dist/components/FormComponent/Container.js +110 -0
- package/dist/components/FormComponent/Container.test.js +26 -26
- package/dist/components/FormComponent/FormComponent.js +65 -128
- package/dist/components/FormComponent/FormComponent.test.js +19 -19
- package/dist/components/FormComponent/helpers/getComponentError.js +31 -0
- package/dist/components/FormComponent/helpers/getComponentError.test.js +52 -0
- package/dist/components/FormComponent/helpers/index.js +15 -0
- package/dist/components/FormPage/FormPage.js +7 -11
- package/dist/components/FormPage/FormPage.test.js +12 -76
- package/dist/components/FormRenderer/FormRenderer.js +103 -44
- package/dist/components/FormRenderer/helpers/canActionProceed.js +3 -12
- package/dist/components/FormRenderer/helpers/canActionProceed.test.js +41 -65
- package/dist/components/FormRenderer/helpers/canCYASubmit.js +3 -24
- package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +72 -145
- package/dist/components/SummaryList/GroupAction.js +6 -2
- package/dist/components/SummaryList/SummaryList.js +33 -18
- package/dist/components/SummaryList/SummaryList.scss +12 -8
- package/dist/components/SummaryList/SummaryList.test.js +94 -27
- package/dist/components/SummaryList/SummaryListRow.js +51 -0
- package/dist/components/SummaryList/SummaryListTitleRow.js +30 -0
- package/dist/context/ValidationContext/ValidationContext.js +122 -0
- package/dist/context/ValidationContext/ValidationContext.test.js +98 -0
- package/dist/context/ValidationContext/index.js +23 -0
- package/dist/context/index.js +15 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/useValidation.js +19 -0
- package/dist/index.js +11 -5
- package/dist/models/CollectionLabels.js +14 -0
- package/dist/models/ComponentTypes.js +2 -0
- package/dist/models/index.js +8 -0
- package/dist/setupTests.js +32 -0
- package/dist/utils/CheckYourAnswers/getCYARow.js +14 -0
- package/dist/utils/CheckYourAnswers/getCYARow.test.js +34 -11
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +89 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +194 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +9 -13
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +11 -4
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +58 -14
- 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/Component/getDefaultValue.js +25 -0
- package/dist/utils/Component/getDefaultValue.test.js +53 -0
- package/dist/utils/Component/index.js +4 -1
- package/dist/utils/Data/getSourceData.js +38 -0
- package/dist/utils/Data/getSourceData.test.js +16 -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 +3 -3
|
@@ -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,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _models = require("../../models");
|
|
9
|
+
|
|
10
|
+
var _DEFAULT_VALUES;
|
|
11
|
+
|
|
12
|
+
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; }
|
|
13
|
+
|
|
14
|
+
var DEFAULT_VALUES = (_DEFAULT_VALUES = {}, _defineProperty(_DEFAULT_VALUES, _models.ComponentTypes.COLLECTION, []), _defineProperty(_DEFAULT_VALUES, _models.ComponentTypes.CONTAINER, {}), _defineProperty(_DEFAULT_VALUES, _models.ComponentTypes.FILE, {}), _DEFAULT_VALUES);
|
|
15
|
+
|
|
16
|
+
var getDefaultValue = function getDefaultValue(component) {
|
|
17
|
+
if (component) {
|
|
18
|
+
return DEFAULT_VALUES[component.type] || '';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return '';
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
var _default = getDefaultValue;
|
|
25
|
+
exports.default = _default;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _models = require("../../models");
|
|
4
|
+
|
|
5
|
+
var _getDefaultValue = _interopRequireDefault(require("./getDefaultValue"));
|
|
6
|
+
|
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
|
|
9
|
+
describe('utils.Component.defaultValue', function () {
|
|
10
|
+
it('should return an empty string if the component is undefined', function () {
|
|
11
|
+
expect((0, _getDefaultValue.default)(undefined)).toEqual('');
|
|
12
|
+
});
|
|
13
|
+
it('should return an empty string if the component is null', function () {
|
|
14
|
+
expect((0, _getDefaultValue.default)(null)).toEqual('');
|
|
15
|
+
});
|
|
16
|
+
it('should return an empty string if the component has no type', function () {
|
|
17
|
+
expect((0, _getDefaultValue.default)({})).toEqual('');
|
|
18
|
+
});
|
|
19
|
+
it('should return an empty string if the component type is null', function () {
|
|
20
|
+
expect((0, _getDefaultValue.default)({
|
|
21
|
+
type: null
|
|
22
|
+
})).toEqual('');
|
|
23
|
+
});
|
|
24
|
+
it('should return an empty string if the component type is undefined', function () {
|
|
25
|
+
expect((0, _getDefaultValue.default)({
|
|
26
|
+
type: undefined
|
|
27
|
+
})).toEqual('');
|
|
28
|
+
});
|
|
29
|
+
it("should return an empty array if the component type is 'collection'", function () {
|
|
30
|
+
expect((0, _getDefaultValue.default)({
|
|
31
|
+
type: _models.ComponentTypes.COLLECTION
|
|
32
|
+
})).toEqual([]);
|
|
33
|
+
});
|
|
34
|
+
it("should return an empty object if the component type is 'container'", function () {
|
|
35
|
+
expect((0, _getDefaultValue.default)({
|
|
36
|
+
type: _models.ComponentTypes.CONTAINER
|
|
37
|
+
})).toEqual({});
|
|
38
|
+
});
|
|
39
|
+
it("should return an empty object if the component type is 'file'", function () {
|
|
40
|
+
expect((0, _getDefaultValue.default)({
|
|
41
|
+
type: _models.ComponentTypes.FILE
|
|
42
|
+
})).toEqual({});
|
|
43
|
+
});
|
|
44
|
+
Object.values(_models.ComponentTypes).forEach(function (value) {
|
|
45
|
+
if (![_models.ComponentTypes.COLLECTION, _models.ComponentTypes.CONTAINER, _models.ComponentTypes.FILE].includes(value)) {
|
|
46
|
+
it("should return an empty object if the component type is '".concat(value, "'"), function () {
|
|
47
|
+
expect((0, _getDefaultValue.default)({
|
|
48
|
+
type: _models.ComponentTypes.TEXT
|
|
49
|
+
})).toEqual('');
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -9,6 +9,8 @@ var _cleanAttributes = _interopRequireDefault(require("./cleanAttributes"));
|
|
|
9
9
|
|
|
10
10
|
var _getComponent = _interopRequireDefault(require("./getComponent"));
|
|
11
11
|
|
|
12
|
+
var _getDefaultValue = _interopRequireDefault(require("./getDefaultValue"));
|
|
13
|
+
|
|
12
14
|
var _isEditable = _interopRequireDefault(require("./isEditable"));
|
|
13
15
|
|
|
14
16
|
var _showComponent = _interopRequireDefault(require("./showComponent"));
|
|
@@ -19,8 +21,9 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
19
21
|
|
|
20
22
|
var Component = {
|
|
21
23
|
clean: _cleanAttributes.default,
|
|
22
|
-
|
|
24
|
+
defaultValue: _getDefaultValue.default,
|
|
23
25
|
editable: _isEditable.default,
|
|
26
|
+
get: _getComponent.default,
|
|
24
27
|
show: _showComponent.default,
|
|
25
28
|
wrap: _wrapInFormGroup.default
|
|
26
29
|
};
|
|
@@ -5,6 +5,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
9
|
+
|
|
10
|
+
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."); }
|
|
11
|
+
|
|
12
|
+
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); }
|
|
13
|
+
|
|
14
|
+
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; }
|
|
15
|
+
|
|
16
|
+
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; }
|
|
17
|
+
|
|
18
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
19
|
+
|
|
20
|
+
var getItemInArray = function getItemInArray(arr, index) {
|
|
21
|
+
if (Array.isArray(arr)) {
|
|
22
|
+
return arr[parseInt(index, 10)];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return undefined;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
var isArrayProp = function isArrayProp(prop) {
|
|
29
|
+
return prop.includes('[');
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
var getPropertyAndIndex = function getPropertyAndIndex(prop) {
|
|
33
|
+
return prop.replace(']', '').split('[');
|
|
34
|
+
};
|
|
8
35
|
/**
|
|
9
36
|
* Gets the value of a field within the top-level JSON form data,
|
|
10
37
|
* based on a dot-separated field identifier.
|
|
@@ -20,12 +47,23 @@ exports.default = void 0;
|
|
|
20
47
|
* @param {string} fieldId The dot-separated path to the field.
|
|
21
48
|
* @returns The value of the field specified.
|
|
22
49
|
*/
|
|
50
|
+
|
|
51
|
+
|
|
23
52
|
var getSourceData = function getSourceData(data, fieldId) {
|
|
24
53
|
if (!fieldId) {
|
|
25
54
|
return undefined;
|
|
26
55
|
}
|
|
27
56
|
|
|
28
57
|
return fieldId.split('.').reduce(function (obj, prop) {
|
|
58
|
+
if (obj && isArrayProp(prop)) {
|
|
59
|
+
var _getPropertyAndIndex = getPropertyAndIndex(prop),
|
|
60
|
+
_getPropertyAndIndex2 = _slicedToArray(_getPropertyAndIndex, 2),
|
|
61
|
+
actualProp = _getPropertyAndIndex2[0],
|
|
62
|
+
index = _getPropertyAndIndex2[1];
|
|
63
|
+
|
|
64
|
+
return getItemInArray(obj[actualProp], index);
|
|
65
|
+
}
|
|
66
|
+
|
|
29
67
|
return obj ? obj[prop] : undefined;
|
|
30
68
|
}, data);
|
|
31
69
|
};
|
|
@@ -120,6 +120,22 @@ describe('utils', function () {
|
|
|
120
120
|
var value = (0, _getSourceData.default)(DATA, FIELD_ID);
|
|
121
121
|
expect(value).toBeUndefined();
|
|
122
122
|
});
|
|
123
|
+
it('should handle a reference to an array item', function () {
|
|
124
|
+
var FIELD_ID = 'items[1]';
|
|
125
|
+
var ALPHA = 'alpha';
|
|
126
|
+
var BETA = 'beta';
|
|
127
|
+
var DATA = {
|
|
128
|
+
items: [ALPHA, BETA]
|
|
129
|
+
};
|
|
130
|
+
var value = (0, _getSourceData.default)(DATA, FIELD_ID);
|
|
131
|
+
expect(value).toEqual(BETA);
|
|
132
|
+
});
|
|
133
|
+
it('should handle a reference to an array that does not exist', function () {
|
|
134
|
+
var FIELD_ID = 'items[1]';
|
|
135
|
+
var DATA = {};
|
|
136
|
+
var value = (0, _getSourceData.default)(DATA, FIELD_ID);
|
|
137
|
+
expect(value).toBeUndefined();
|
|
138
|
+
});
|
|
123
139
|
});
|
|
124
140
|
});
|
|
125
141
|
});
|
|
@@ -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
|
+
});
|