@ukhomeoffice/cop-react-form-renderer 4.37.0 → 4.40.0
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/FormComponent.js +6 -0
- package/dist/models/ComponentTypes.js +2 -0
- package/dist/utils/Component/getComponent.js +8 -0
- package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +84 -0
- package/dist/utils/Component/isEditable.js +1 -1
- package/dist/utils/Meta/documents/index.js +2 -2
- package/dist/utils/Meta/documents/{setDocumentForField.js → setDocumentsForField.js} +12 -14
- package/dist/utils/Meta/documents/setDocumentsForField.test.js +71 -0
- package/dist/utils/Validate/index.js +3 -0
- package/dist/utils/Validate/validateComponent.js +7 -1
- package/dist/utils/Validate/validateEmail.js +12 -1
- package/dist/utils/Validate/validateEmail.test.js +10 -2
- package/dist/utils/Validate/validateMultifile.js +35 -0
- package/dist/utils/Validate/validateMultifile.test.js +44 -0
- package/package.json +2 -2
- package/dist/utils/Meta/documents/setDocumentForField.test.js +0 -60
|
@@ -90,6 +90,10 @@ var FormComponent = function FormComponent(_ref) {
|
|
|
90
90
|
var target = _ref2.target;
|
|
91
91
|
|
|
92
92
|
if (typeof onChange === 'function') {
|
|
93
|
+
if (component.type === _models.ComponentTypes.EMAIL) {
|
|
94
|
+
target['value'] = target.value.trim();
|
|
95
|
+
}
|
|
96
|
+
|
|
93
97
|
target = (0, _helpers.addLabel)(target, component, data);
|
|
94
98
|
onChange({
|
|
95
99
|
target: target
|
|
@@ -144,6 +148,8 @@ var FormComponent = function FormComponent(_ref) {
|
|
|
144
148
|
target: target
|
|
145
149
|
})) {
|
|
146
150
|
if (component.type === _models.ComponentTypes.FILE) {
|
|
151
|
+
changeMetaDocuments([target.value]);
|
|
152
|
+
} else if (component.type === _models.ComponentTypes.MULTI_FILE) {
|
|
147
153
|
changeMetaDocuments(target.value);
|
|
148
154
|
}
|
|
149
155
|
}
|
|
@@ -18,6 +18,7 @@ var TYPE_HEADING = 'heading';
|
|
|
18
18
|
var TYPE_HTML = 'html';
|
|
19
19
|
var TYPE_INSET_TEXT = 'inset-text';
|
|
20
20
|
var TYPE_LIST = 'list';
|
|
21
|
+
var TYPE_MULTI_FILE = 'multifile';
|
|
21
22
|
var TYPE_PARAGRAPH = 'paragraph';
|
|
22
23
|
var TYPE_PHONE_NUMBER = 'phone-number';
|
|
23
24
|
var TYPE_RADIOS = 'radios';
|
|
@@ -41,6 +42,7 @@ var ComponentTypes = {
|
|
|
41
42
|
HTML: TYPE_HTML,
|
|
42
43
|
INSET_TEXT: TYPE_INSET_TEXT,
|
|
43
44
|
LIST: TYPE_LIST,
|
|
45
|
+
MULTI_FILE: TYPE_MULTI_FILE,
|
|
44
46
|
PARAGRAPH: TYPE_PARAGRAPH,
|
|
45
47
|
PHONE_NUMBER: TYPE_PHONE_NUMBER,
|
|
46
48
|
RADIOS: TYPE_RADIOS,
|
|
@@ -112,6 +112,11 @@ var getFileUpload = function getFileUpload(config) {
|
|
|
112
112
|
return /*#__PURE__*/_react.default.createElement(_copReactComponents.FileUpload, attrs);
|
|
113
113
|
};
|
|
114
114
|
|
|
115
|
+
var getMultiFileUpload = function getMultiFileUpload(config) {
|
|
116
|
+
var attrs = (0, _cleanAttributes.default)(config);
|
|
117
|
+
return /*#__PURE__*/_react.default.createElement(_copReactComponents.MultiFileUpload, attrs);
|
|
118
|
+
};
|
|
119
|
+
|
|
115
120
|
var getHeading = function getHeading(config) {
|
|
116
121
|
var attrs = (0, _cleanAttributes.default)(config);
|
|
117
122
|
return /*#__PURE__*/_react.default.createElement(_copReactComponents.Heading, attrs, config.content);
|
|
@@ -247,6 +252,9 @@ var getComponentByType = function getComponentByType(config) {
|
|
|
247
252
|
case _models.ComponentTypes.FILE:
|
|
248
253
|
return getFileUpload(config);
|
|
249
254
|
|
|
255
|
+
case _models.ComponentTypes.MULTI_FILE:
|
|
256
|
+
return getMultiFileUpload(config);
|
|
257
|
+
|
|
250
258
|
case _models.ComponentTypes.WARNING:
|
|
251
259
|
return getWarningText(config);
|
|
252
260
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = require("@testing-library/react");
|
|
4
|
+
|
|
5
|
+
var _models = require("../../../models");
|
|
6
|
+
|
|
7
|
+
var _getComponent = _interopRequireDefault(require("../getComponent"));
|
|
8
|
+
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
|
|
11
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
12
|
+
|
|
13
|
+
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."); }
|
|
14
|
+
|
|
15
|
+
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); }
|
|
16
|
+
|
|
17
|
+
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; }
|
|
18
|
+
|
|
19
|
+
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; }
|
|
20
|
+
|
|
21
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
22
|
+
|
|
23
|
+
describe('utils.Component.get', function () {
|
|
24
|
+
it('should return an appropriately rendered multi file component', function () {
|
|
25
|
+
var ID = 'test-id';
|
|
26
|
+
var FIELD_ID = 'field-id';
|
|
27
|
+
var LABEL = 'label';
|
|
28
|
+
var ON_CHANGE_CALLS = [];
|
|
29
|
+
|
|
30
|
+
var ON_CHANGE = function ON_CHANGE(e) {
|
|
31
|
+
ON_CHANGE_CALLS.push(e.target);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
var COMPONENT = {
|
|
35
|
+
type: _models.ComponentTypes.MULTI_FILE,
|
|
36
|
+
id: ID,
|
|
37
|
+
fieldId: FIELD_ID,
|
|
38
|
+
label: LABEL,
|
|
39
|
+
onChange: ON_CHANGE,
|
|
40
|
+
'data-testid': ID
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
var _render = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
|
|
44
|
+
container = _render.container;
|
|
45
|
+
|
|
46
|
+
var _getAllByTestId = (0, _react.getAllByTestId)(container, ID),
|
|
47
|
+
_getAllByTestId2 = _slicedToArray(_getAllByTestId, 2),
|
|
48
|
+
formGroup = _getAllByTestId2[0],
|
|
49
|
+
wrapper = _getAllByTestId2[1];
|
|
50
|
+
|
|
51
|
+
var input = wrapper.querySelector('#dropzone').children[0];
|
|
52
|
+
expect(formGroup.tagName).toEqual('DIV');
|
|
53
|
+
expect(formGroup.classList).toContain('govuk-form-group');
|
|
54
|
+
var label = undefined;
|
|
55
|
+
formGroup.childNodes[0].childNodes.forEach(function (node) {
|
|
56
|
+
// Check if it's an element.
|
|
57
|
+
if (node instanceof Element && node.tagName === 'LEGEND') {
|
|
58
|
+
label = node.childNodes[0];
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
expect(label).toBeDefined();
|
|
62
|
+
expect(label.innerHTML).toContain(LABEL);
|
|
63
|
+
expect(label.getAttribute('for')).toEqual(ID);
|
|
64
|
+
expect(wrapper.tagName).toEqual('DIV');
|
|
65
|
+
expect(wrapper.classList).toContain('cop-multi-file-upload');
|
|
66
|
+
expect(wrapper.id).toEqual(ID);
|
|
67
|
+
var str = JSON.stringify({
|
|
68
|
+
alpha: 'bravo'
|
|
69
|
+
});
|
|
70
|
+
var blob = new Blob([str]);
|
|
71
|
+
var FILE = new File([blob], 'test.json', {
|
|
72
|
+
type: 'application/JSON'
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
_react.fireEvent.change(input, {
|
|
76
|
+
target: {
|
|
77
|
+
files: [FILE]
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
expect(ON_CHANGE_CALLS.length).toEqual(1);
|
|
82
|
+
expect(input.files.length).toEqual(1);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -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.CALCULATION, _models.ComponentTypes.CHECKBOXES, _models.ComponentTypes.DATE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.FILE, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.SELECT, _models.ComponentTypes.TEXT, _models.ComponentTypes.TEXT_AREA, _models.ComponentTypes.TIME];
|
|
11
|
+
var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.CALCULATION, _models.ComponentTypes.CHECKBOXES, _models.ComponentTypes.DATE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.FILE, _models.ComponentTypes.MULTI_FILE, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.SELECT, _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) {
|
|
@@ -7,7 +7,7 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _constants = require("../constants");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _setDocumentsForField = _interopRequireDefault(require("./setDocumentsForField"));
|
|
11
11
|
|
|
12
12
|
var _getDocuments = _interopRequireDefault(require("./getDocuments"));
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
15
15
|
|
|
16
16
|
// Local imports
|
|
17
17
|
var documents = {
|
|
18
|
-
setForField:
|
|
18
|
+
setForField: _setDocumentsForField.default,
|
|
19
19
|
get: _getDocuments.default,
|
|
20
20
|
name: _constants.META_DOCUMENTS_PROPERTY
|
|
21
21
|
};
|
|
@@ -17,24 +17,22 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
17
17
|
|
|
18
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
19
|
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
var setDocumentsForField = function setDocumentsForField(documents, formData, field, allowMultiple) {
|
|
21
|
+
var changedDocuments = allowMultiple ? (0, _getDocuments.default)(formData) : (0, _getDocuments.default)(formData).filter(function (d) {
|
|
22
|
+
return d.field !== field;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (Array.isArray(documents)) {
|
|
26
|
+
documents.forEach(function (document) {
|
|
27
|
+
changedDocuments.push(_objectSpread(_objectSpread({}, document), {}, {
|
|
28
|
+
field: field
|
|
29
|
+
}));
|
|
26
30
|
});
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
if (document) {
|
|
30
|
-
documents.push(_objectSpread(_objectSpread({}, document), {}, {
|
|
31
|
-
field: field
|
|
32
|
-
}));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
33
|
var existing = formData ? formData[_constants.META_PROPERTY] : undefined;
|
|
36
|
-
return _objectSpread(_objectSpread({}, existing), {}, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY,
|
|
34
|
+
return _objectSpread(_objectSpread({}, existing), {}, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, changedDocuments));
|
|
37
35
|
};
|
|
38
36
|
|
|
39
|
-
var _default =
|
|
37
|
+
var _default = setDocumentsForField;
|
|
40
38
|
exports.default = _default;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _constants = require("../constants");
|
|
4
|
+
|
|
5
|
+
var _setDocumentsForField = _interopRequireDefault(require("./setDocumentsForField"));
|
|
6
|
+
|
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
|
|
9
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
10
|
+
|
|
11
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
12
|
+
|
|
13
|
+
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; }
|
|
14
|
+
|
|
15
|
+
describe('Utils.Meta.documents.add', function () {
|
|
16
|
+
var ALPHA_DOCUMENT = {
|
|
17
|
+
field: 'alpha',
|
|
18
|
+
url: 'http://alpha-bravo.com/files/alpha'
|
|
19
|
+
};
|
|
20
|
+
var BRAVO_DOCUMENT = {
|
|
21
|
+
field: 'bravo',
|
|
22
|
+
url: 'http://alpha-bravo.com/files/bravo'
|
|
23
|
+
};
|
|
24
|
+
it('should return an appropriately set up object if formData is null', function () {
|
|
25
|
+
expect((0, _setDocumentsForField.default)([ALPHA_DOCUMENT], null, ALPHA_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
26
|
+
});
|
|
27
|
+
it('should add a new document to the array', function () {
|
|
28
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
29
|
+
|
|
30
|
+
expect((0, _setDocumentsForField.default)([BRAVO_DOCUMENT], FORM_DATA, BRAVO_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT, BRAVO_DOCUMENT]));
|
|
31
|
+
});
|
|
32
|
+
it('should add multiple new documents to the array', function () {
|
|
33
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, []));
|
|
34
|
+
|
|
35
|
+
var SECOND_DOCUMENT = _objectSpread({}, ALPHA_DOCUMENT);
|
|
36
|
+
|
|
37
|
+
expect((0, _setDocumentsForField.default)([ALPHA_DOCUMENT, SECOND_DOCUMENT], FORM_DATA, ALPHA_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT, SECOND_DOCUMENT]));
|
|
38
|
+
});
|
|
39
|
+
it('should replace an existing document with the same field', function () {
|
|
40
|
+
var NEW_URL = 'http://replacement.com/files/alpha';
|
|
41
|
+
var NEW_ALPHA = {
|
|
42
|
+
field: ALPHA_DOCUMENT.field,
|
|
43
|
+
url: NEW_URL
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
47
|
+
|
|
48
|
+
expect((0, _setDocumentsForField.default)([NEW_ALPHA], FORM_DATA, NEW_ALPHA.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [NEW_ALPHA]));
|
|
49
|
+
});
|
|
50
|
+
it('should add a document with the same field if allowMultiple is true', function () {
|
|
51
|
+
var NEW_URL = 'http://replacement.com/files/alpha';
|
|
52
|
+
var NEW_ALPHA = {
|
|
53
|
+
field: ALPHA_DOCUMENT.field,
|
|
54
|
+
url: NEW_URL
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
58
|
+
|
|
59
|
+
expect((0, _setDocumentsForField.default)([NEW_ALPHA], FORM_DATA, NEW_ALPHA.field, true)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT, NEW_ALPHA]));
|
|
60
|
+
});
|
|
61
|
+
it('should handle a null document being passed where a document with that field already exists', function () {
|
|
62
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
63
|
+
|
|
64
|
+
expect((0, _setDocumentsForField.default)(null, FORM_DATA, ALPHA_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, []));
|
|
65
|
+
});
|
|
66
|
+
it('should handle a null document being passed where a document with that field does not already exist', function () {
|
|
67
|
+
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
68
|
+
|
|
69
|
+
expect((0, _setDocumentsForField.default)(null, FORM_DATA, BRAVO_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
70
|
+
});
|
|
71
|
+
});
|
|
@@ -11,6 +11,8 @@ var _validateDate = _interopRequireDefault(require("./validateDate"));
|
|
|
11
11
|
|
|
12
12
|
var _validateEmail = _interopRequireDefault(require("./validateEmail"));
|
|
13
13
|
|
|
14
|
+
var _validateMultifile = _interopRequireDefault(require("./validateMultifile"));
|
|
15
|
+
|
|
14
16
|
var _validatePage = _interopRequireDefault(require("./validatePage"));
|
|
15
17
|
|
|
16
18
|
var _validateRegex = _interopRequireDefault(require("./validateRegex"));
|
|
@@ -26,6 +28,7 @@ var Validate = {
|
|
|
26
28
|
component: _validateComponent.default,
|
|
27
29
|
email: _validateEmail.default,
|
|
28
30
|
date: _validateDate.default,
|
|
31
|
+
multifile: _validateMultifile.default,
|
|
29
32
|
page: _validatePage.default,
|
|
30
33
|
regex: _validateRegex.default,
|
|
31
34
|
required: _validateRequired.default,
|
|
@@ -19,6 +19,8 @@ var _validateDate = _interopRequireDefault(require("./validateDate"));
|
|
|
19
19
|
|
|
20
20
|
var _validateEmail = _interopRequireDefault(require("./validateEmail"));
|
|
21
21
|
|
|
22
|
+
var _validateMultifile = _interopRequireDefault(require("./validateMultifile"));
|
|
23
|
+
|
|
22
24
|
var _validateRegex = _interopRequireDefault(require("./validateRegex"));
|
|
23
25
|
|
|
24
26
|
var _validateRequired = _interopRequireDefault(require("./validateRequired"));
|
|
@@ -65,7 +67,7 @@ var validateComponent = function validateComponent(component, outerData, formDat
|
|
|
65
67
|
|
|
66
68
|
case _models.ComponentTypes.EMAIL:
|
|
67
69
|
var userEmail = fd === null ? '' : (_fd$keycloakContext = fd.keycloakContext) === null || _fd$keycloakContext === void 0 ? void 0 : _fd$keycloakContext.email;
|
|
68
|
-
error = (0, _validateEmail.default)(value, component.label, userEmail);
|
|
70
|
+
error = (0, _validateEmail.default)(value, component.label, userEmail, component.custom_errors);
|
|
69
71
|
break;
|
|
70
72
|
|
|
71
73
|
case _models.ComponentTypes.DATE:
|
|
@@ -96,6 +98,10 @@ var validateComponent = function validateComponent(component, outerData, formDat
|
|
|
96
98
|
|
|
97
99
|
break;
|
|
98
100
|
|
|
101
|
+
case _models.ComponentTypes.MULTI_FILE:
|
|
102
|
+
error = (0, _validateMultifile.default)(value, component.custom_errors);
|
|
103
|
+
break;
|
|
104
|
+
|
|
99
105
|
default:
|
|
100
106
|
break;
|
|
101
107
|
}
|
|
@@ -22,6 +22,7 @@ var HODS_EMAIL_REGEX = /^[a-z0-9._-]+@(digital\.)?homeoffice.gov.uk$/i;
|
|
|
22
22
|
var validateEmail = function validateEmail(value) {
|
|
23
23
|
var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
24
24
|
var userEmail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
|
25
|
+
var customErrors = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
25
26
|
|
|
26
27
|
if (!!value) {
|
|
27
28
|
var name = label ? label.toLowerCase() : 'email address';
|
|
@@ -29,7 +30,7 @@ var validateEmail = function validateEmail(value) {
|
|
|
29
30
|
if (typeof value === 'string') {
|
|
30
31
|
// The following is an interim fix pending a mechanism for validating against specific values
|
|
31
32
|
if (['Line manager email', 'Delegate email address'].includes(label) && value.toLowerCase() === userEmail) {
|
|
32
|
-
return "".concat(label, " cannot be
|
|
33
|
+
return "".concat(label, " cannot be your own email");
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
if (HODS_EMAIL_REGEX.test(value)) {
|
|
@@ -37,6 +38,16 @@ var validateEmail = function validateEmail(value) {
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
if (Array.isArray(customErrors)) {
|
|
42
|
+
var result = customErrors.filter(function (error) {
|
|
43
|
+
return error.type === 'format';
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (result && result.length > 0 && result[0].message) {
|
|
47
|
+
return result[0].message;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
40
51
|
return "Enter ".concat(name, " in the correct format, like jane.doe@homeoffice.gov.uk");
|
|
41
52
|
}
|
|
42
53
|
|
|
@@ -52,12 +52,20 @@ describe('utils', function () {
|
|
|
52
52
|
var DEFAULT_ERROR = 'Enter email address in the correct format, like jane.doe@homeoffice.gov.uk';
|
|
53
53
|
expect((0, _validateEmail.default)(['bob'], undefined)).toEqual(DEFAULT_ERROR);
|
|
54
54
|
});
|
|
55
|
+
it('should use a custom format error message when specified', function () {
|
|
56
|
+
var customErrors = [{
|
|
57
|
+
'type': 'format',
|
|
58
|
+
'message': 'Enter email address in the correct format'
|
|
59
|
+
}];
|
|
60
|
+
var CUSTOM_ERROR = 'Enter email address in the correct format';
|
|
61
|
+
expect((0, _validateEmail.default)('bob', '', '', customErrors)).toEqual(CUSTOM_ERROR);
|
|
62
|
+
});
|
|
55
63
|
it('should return an error when line manager email is same as user email', function () {
|
|
56
|
-
var USER_EMAIL_ERROR = 'Line manager email cannot be
|
|
64
|
+
var USER_EMAIL_ERROR = 'Line manager email cannot be your own email';
|
|
57
65
|
expect((0, _validateEmail.default)('joe.bloggs@digital.homeoffice.gov.uk', 'Line manager email', 'joe.bloggs@digital.homeoffice.gov.uk')).toEqual(USER_EMAIL_ERROR);
|
|
58
66
|
});
|
|
59
67
|
it('should return an error when delegate email is same as user email', function () {
|
|
60
|
-
var USER_EMAIL_ERROR = 'Delegate email address cannot be
|
|
68
|
+
var USER_EMAIL_ERROR = 'Delegate email address cannot be your own email';
|
|
61
69
|
expect((0, _validateEmail.default)('joe.bloggs@digital.homeoffice.gov.uk', 'Delegate email address', 'joe.bloggs@digital.homeoffice.gov.uk')).toEqual(USER_EMAIL_ERROR);
|
|
62
70
|
});
|
|
63
71
|
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.DEFAULT_ERROR = void 0;
|
|
7
|
+
var DEFAULT_ERROR = 'Invalid files must be deleted';
|
|
8
|
+
exports.DEFAULT_ERROR = DEFAULT_ERROR;
|
|
9
|
+
|
|
10
|
+
var validateMultifile = function validateMultifile(value, customErrors) {
|
|
11
|
+
var inError = false;
|
|
12
|
+
value.every(function (entry) {
|
|
13
|
+
inError = entry.error;
|
|
14
|
+
return !inError;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
if (inError) {
|
|
18
|
+
if (Array.isArray(customErrors)) {
|
|
19
|
+
var result = customErrors.filter(function (error) {
|
|
20
|
+
return error.type === 'invalidFile';
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
if (result && result.length > 0 && result[0].message) {
|
|
24
|
+
return result[0].message;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return DEFAULT_ERROR;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return undefined;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
var _default = validateMultifile;
|
|
35
|
+
exports.default = _default;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
var _validateMultifile = _interopRequireWildcard(require("./validateMultifile"));
|
|
6
|
+
|
|
7
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
8
|
+
|
|
9
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
10
|
+
|
|
11
|
+
// Local imports
|
|
12
|
+
describe('utils', function () {
|
|
13
|
+
describe('Validate', function () {
|
|
14
|
+
describe('multifile', function () {
|
|
15
|
+
var ERROR_MSG = 'This is a custom error message';
|
|
16
|
+
var CUSTOM_ERRORS = [{
|
|
17
|
+
type: 'invalidFile',
|
|
18
|
+
message: ERROR_MSG
|
|
19
|
+
}]; // Valid values.
|
|
20
|
+
|
|
21
|
+
it('should return no error when value is an empty array', function () {
|
|
22
|
+
var VALUE = [];
|
|
23
|
+
expect((0, _validateMultifile.default)(VALUE, [])).toBeUndefined();
|
|
24
|
+
});
|
|
25
|
+
it('should return no error when value only contains valid files', function () {
|
|
26
|
+
var VALUE = [{}, {}];
|
|
27
|
+
expect((0, _validateMultifile.default)(VALUE, [])).toBeUndefined();
|
|
28
|
+
}); // Invalid values.
|
|
29
|
+
|
|
30
|
+
it('should return an error when valid contains invalid files', function () {
|
|
31
|
+
var VALUE = [{
|
|
32
|
+
error: 'This is an invalid file'
|
|
33
|
+
}];
|
|
34
|
+
expect((0, _validateMultifile.default)(VALUE, [])).toEqual(_validateMultifile.DEFAULT_ERROR);
|
|
35
|
+
});
|
|
36
|
+
it('should return a custom error when one is provided', function () {
|
|
37
|
+
var VALUE = [{
|
|
38
|
+
error: 'This is an invalid file'
|
|
39
|
+
}];
|
|
40
|
+
expect((0, _validateMultifile.default)(VALUE, CUSTOM_ERRORS)).toEqual(ERROR_MSG);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ukhomeoffice/cop-react-form-renderer",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.40.0",
|
|
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": "2.
|
|
19
|
+
"@ukhomeoffice/cop-react-components": "2.8.0",
|
|
20
20
|
"axios": "^0.23.0",
|
|
21
21
|
"dayjs": "^1.11.0",
|
|
22
22
|
"govuk-frontend": "^4.3.1",
|
|
@@ -1,60 +0,0 @@
|
|
|
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 add a document with the same field if allowMultiple is true', function () {
|
|
40
|
-
var NEW_URL = 'http://replacement.com/files/alpha';
|
|
41
|
-
var NEW_ALPHA = {
|
|
42
|
-
field: ALPHA_DOCUMENT.field,
|
|
43
|
-
url: NEW_URL
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
47
|
-
|
|
48
|
-
expect((0, _setDocumentForField.default)(NEW_ALPHA, FORM_DATA, NEW_ALPHA.field, true)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT, NEW_ALPHA]));
|
|
49
|
-
});
|
|
50
|
-
it('should handle a null document being passed where a document with that field already exists', function () {
|
|
51
|
-
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
52
|
-
|
|
53
|
-
expect((0, _setDocumentForField.default)(null, FORM_DATA, ALPHA_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, []));
|
|
54
|
-
});
|
|
55
|
-
it('should handle a null document being passed where a document with that field does not already exist', function () {
|
|
56
|
-
var FORM_DATA = _defineProperty({}, _constants.META_PROPERTY, _defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
57
|
-
|
|
58
|
-
expect((0, _setDocumentForField.default)(null, FORM_DATA, BRAVO_DOCUMENT.field)).toEqual(_defineProperty({}, _constants.META_DOCUMENTS_PROPERTY, [ALPHA_DOCUMENT]));
|
|
59
|
-
});
|
|
60
|
-
});
|