@ukhomeoffice/cop-react-form-renderer 4.44.0 → 4.47.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.
@@ -311,7 +311,10 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
311
311
  if (action.type === _models.PageAction.TYPES.CANCEL) {
312
312
  hooks.onCancel();
313
313
  return;
314
- } // Re-apply the patch to the page's formData.
314
+ } // Save a copy of data in case submit errors and we need to revert
315
+
316
+
317
+ var preSubmitData = _objectSpread({}, data); // Re-apply the patch to the page's formData.
315
318
  // This should normally have no effect but will prevent issues
316
319
  // with validation if formData happens to have been wiped.
317
320
 
@@ -419,6 +422,8 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
419
422
  pageUpdate(sData);
420
423
  }, function (errors) {
421
424
  _handlers.default.submissionError(errors, addErrors);
425
+
426
+ setData(_objectSpread({}, preSubmitData));
422
427
  }, changedFieldName, changedFieldValue);
423
428
  }
424
429
  }
@@ -262,12 +262,14 @@ describe('components', function () {
262
262
  case 0:
263
263
  ON_SUBMIT_CALLS = [];
264
264
 
265
- ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
265
+ ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError, fieldName, fieldValue) {
266
266
  ON_SUBMIT_CALLS.push({
267
267
  type: type,
268
268
  payload: payload,
269
269
  onSuccess: onSuccess,
270
- onError: onError
270
+ onError: onError,
271
+ fieldName: fieldName,
272
+ fieldValue: fieldValue
271
273
  });
272
274
  onSuccess();
273
275
  };
@@ -283,7 +285,8 @@ describe('components', function () {
283
285
  case 0:
284
286
  (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
285
287
  data: _userProfileData.default,
286
- hooks: HOOKS
288
+ hooks: HOOKS,
289
+ type: _models.FormTypes.HUB
287
290
  })), container);
288
291
 
289
292
  case 1:
@@ -302,9 +305,12 @@ describe('components', function () {
302
305
  _hub$childNodes2 = _slicedToArray(hub.childNodes, 3), civilServantList = _hub$childNodes2[2];
303
306
  link = getChangeLink(civilServantList);
304
307
 
305
- _react.fireEvent.click(link, {}); // Should already be answered "Yes", so simply click "Continue".
308
+ _react.fireEvent.click(link, {}); // Should already be answered "Yes", but select "No, I'm a contractor" option to generate patch
309
+ // and then click "Continue".
306
310
 
307
311
 
312
+ _react.fireEvent.click(_react.screen.getByText("No, I'm a contractor"));
313
+
308
314
  page = form.childNodes[0];
309
315
  continueButton = getContinueButton(page);
310
316
  expect(ON_SUBMIT_CALLS.length).toEqual(0);
@@ -313,7 +319,9 @@ describe('components', function () {
313
319
 
314
320
  expect(ON_SUBMIT_CALLS.length).toEqual(1);
315
321
  expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
316
- expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('yes'); // And we should be back on the hub.
322
+ expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('no-contractor');
323
+ expect(ON_SUBMIT_CALLS[0].fieldName).toEqual('Are you a civil servant?');
324
+ expect(ON_SUBMIT_CALLS[0].fieldValue).toEqual("No, I'm a contractor"); // And we should be back on the hub.
317
325
 
318
326
  expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
319
327
 
@@ -321,7 +329,7 @@ describe('components', function () {
321
329
  expect(title.tagName).toEqual('H1');
322
330
  expect(title.textContent).toEqual(_userProfile.default.title);
323
331
 
324
- case 21:
332
+ case 24:
325
333
  case "end":
326
334
  return _context8.stop();
327
335
  }
@@ -15,6 +15,8 @@ var _GroupAction = _interopRequireDefault(require("./GroupAction"));
15
15
 
16
16
  var _SummaryListRow = _interopRequireDefault(require("./SummaryListRow"));
17
17
 
18
+ var _SummaryListHeadingRow = _interopRequireDefault(require("./SummaryListHeadingRow"));
19
+
18
20
  var _SummaryListTitleRow = _interopRequireDefault(require("./SummaryListTitleRow"));
19
21
 
20
22
  require("./SummaryList.scss");
@@ -67,6 +69,15 @@ var SummaryList = function SummaryList(_ref) {
67
69
  });
68
70
  }
69
71
 
72
+ if (row.type === 'heading') {
73
+ return /*#__PURE__*/_react.default.createElement(_SummaryListHeadingRow.default, {
74
+ key: key,
75
+ title: row.key,
76
+ size: row.size || 's',
77
+ classes: classes
78
+ });
79
+ }
80
+
70
81
  if (row.type === 'action') {
71
82
  return /*#__PURE__*/_react.default.createElement("div", {
72
83
  key: "".concat(key, "-actions")
@@ -14,6 +14,25 @@
14
14
  }
15
15
  }
16
16
 
17
+ .govuk-summary-list__heading {
18
+ width: 100%;
19
+ white-space: nowrap;
20
+ .govuk-heading-s {
21
+ margin-bottom: 10px;
22
+ }
23
+ .govuk-heading-m {
24
+ margin-bottom: 10px;
25
+ }
26
+ &:not(:first-child) {
27
+ .govuk-heading-s {
28
+ margin-top: 20px;
29
+ }
30
+ .govuk-heading-m {
31
+ margin-top: 30px;
32
+ }
33
+ }
34
+ }
35
+
17
36
  .changeRow {
18
37
  .govuk-link {
19
38
  float: right;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _react = _interopRequireDefault(require("react"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ // Global imports
17
+ var SummaryListHeadingRow = function SummaryListHeadingRow(_ref) {
18
+ var title = _ref.title,
19
+ size = _ref.size,
20
+ classes = _ref.classes;
21
+ return /*#__PURE__*/_react.default.createElement("div", {
22
+ className: "".concat(classes('heading'))
23
+ }, size === 's' && /*#__PURE__*/_react.default.createElement(_copReactComponents.SmallHeading, null, title), size === 'm' && /*#__PURE__*/_react.default.createElement(_copReactComponents.MediumHeading, null, title));
24
+ };
25
+
26
+ SummaryListHeadingRow.propTypes = {
27
+ title: _propTypes.default.string.isRequired,
28
+ classes: _propTypes.default.func.isRequired
29
+ };
30
+ var _default = SummaryListHeadingRow;
31
+ exports.default = _default;
@@ -9,12 +9,16 @@ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
9
9
 
10
10
  var _models = require("../../models");
11
11
 
12
- var _getCYARowsForContainer = _interopRequireDefault(require("./getCYARowsForContainer"));
12
+ var _addShowWhen = _interopRequireDefault(require("../Component/addShowWhen"));
13
+
14
+ var _showFormPageCYA = _interopRequireDefault(require("../FormPage/showFormPageCYA"));
13
15
 
14
16
  var _getCYACollectionDeleteAction = _interopRequireDefault(require("./getCYACollectionDeleteAction"));
15
17
 
16
18
  var _getCYACollectionChangeAction = _interopRequireDefault(require("./getCYACollectionChangeAction"));
17
19
 
20
+ var _getCYARowsForContainer = _interopRequireDefault(require("./getCYARowsForContainer"));
21
+
18
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
23
 
20
24
  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; }
@@ -30,7 +34,14 @@ var getContainerForPage = function getContainerForPage(page, item, labelCount, f
30
34
  type: _models.ComponentTypes.CONTAINER,
31
35
  required: true,
32
36
  full_path: full_path,
33
- components: page.components
37
+ components: page.components.map(function (component) {
38
+ return _objectSpread(_objectSpread({}, component), {}, {
39
+ label: _copReactComponents.Utils.interpolateString(component.label, _objectSpread(_objectSpread({}, item), {}, {
40
+ index: labelCount
41
+ })),
42
+ full_path: "".concat(full_path, ".").concat(component.fieldId)
43
+ });
44
+ })
34
45
  };
35
46
  };
36
47
 
@@ -44,7 +55,23 @@ var getTitleRowForItem = function getTitleRowForItem(page, item, pageId, labelCo
44
55
  key: _copReactComponents.Utils.interpolateString(labels.item, _objectSpread(_objectSpread({}, item), {}, {
45
56
  index: labelCount
46
57
  })),
47
- type: 'title'
58
+ type: 'heading',
59
+ size: page.collection.titleSize || 's'
60
+ };
61
+ };
62
+
63
+ var getHeadingRow = function getHeadingRow(config, pageId, labelCount) {
64
+ if (config.text === '') {
65
+ return null;
66
+ }
67
+
68
+ return {
69
+ pageId: pageId,
70
+ fieldId: "heading".concat(labelCount),
71
+ full_path: "heading".concat(labelCount),
72
+ key: config.text,
73
+ type: 'heading',
74
+ size: config.size || 's'
48
75
  };
49
76
  };
50
77
 
@@ -69,16 +96,42 @@ var getCYARowsForCollectionPage = function getCYARowsForCollectionPage(page, onA
69
96
  var _page$formData, _page$formData$page$c;
70
97
 
71
98
  var rows = [];
99
+
100
+ if (!page.collection.hideNameFromCYA) {
101
+ rows.push({
102
+ pageId: page.id,
103
+ fieldId: "".concat(page.collection.name, "Title"),
104
+ full_path: "".concat(page.collection.name, "Title"),
105
+ key: page.collection.name.charAt(0).toUpperCase() + page.collection.name.slice(1),
106
+ type: 'heading',
107
+ size: 'm'
108
+ });
109
+ }
110
+
72
111
  (_page$formData = page.formData) === null || _page$formData === void 0 ? void 0 : (_page$formData$page$c = _page$formData[page.collection.name]) === null || _page$formData$page$c === void 0 ? void 0 : _page$formData$page$c.forEach(function (item, index) {
73
112
  var labelCount = index + 1;
74
113
  var full_path = "".concat(page.collection.name, "[").concat(index, "]");
75
- var container = getContainerForPage(page, item, labelCount, full_path);
76
- var containerRows = (0, _getCYARowsForContainer.default)(page, container, item, undefined);
77
114
  var titleRow = getTitleRowForItem(page, item, page.id, labelCount, full_path);
78
115
  var actionRows = getActionRows(page, item, onAction, labelCount);
79
116
  rows = rows.concat(titleRow);
80
117
  rows = rows.concat(actionRows);
81
- rows = rows.concat(containerRows);
118
+ page.collectionPages.forEach(function (p) {
119
+ if (p.collection.route) {
120
+ var pageWithRoute = (0, _addShowWhen.default)(p, p.collection.route);
121
+ p = pageWithRoute || p;
122
+ }
123
+
124
+ if ((0, _showFormPageCYA.default)(p, _objectSpread(_objectSpread({}, p.formData), item))) {
125
+ if (p.collection.heading) {
126
+ var headingRow = getHeadingRow(p.collection.heading, p.id, labelCount);
127
+ rows = rows.concat(headingRow);
128
+ }
129
+
130
+ var container = getContainerForPage(p, item, labelCount, full_path);
131
+ var containerRows = (0, _getCYARowsForContainer.default)(p, container, item, undefined);
132
+ rows = rows.concat(containerRows);
133
+ }
134
+ });
82
135
  });
83
136
  return rows.filter(function (row) {
84
137
  return !!row;
@@ -17,6 +17,25 @@ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
17
17
  label: 'Test text',
18
18
  type: 'text'
19
19
  };
20
+ var DATE_COMP = {
21
+ id: 'testDate',
22
+ fieldId: 'testDate',
23
+ label: 'Test date',
24
+ type: 'date'
25
+ };
26
+ var PAGES = [{
27
+ id: 'page1',
28
+ collection: {
29
+ name: 'collection'
30
+ },
31
+ components: [TEXT_COMP]
32
+ }, {
33
+ id: 'page2',
34
+ collection: {
35
+ name: 'collection'
36
+ },
37
+ components: [DATE_COMP]
38
+ }];
20
39
  var MASTER_PAGE = {
21
40
  id: 'page1',
22
41
  collection: {
@@ -36,16 +55,29 @@ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
36
55
  page: 'confirmDelete'
37
56
  }]
38
57
  },
39
- title: 'Collection',
40
- components: [TEXT_COMP]
58
+ collectionPages: PAGES
41
59
  };
42
- it('should return an empty array if the collection has no entries', function () {
60
+ it('should return just a heading for the collection if it has no entries', function () {
43
61
  var FORM_DATA = {};
44
62
 
45
63
  var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
46
64
  formData: FORM_DATA
47
65
  });
48
66
 
67
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
68
+ expect(ROWS.length).toEqual(1);
69
+ expect(ROWS[0].key).toEqual('Collection');
70
+ });
71
+ it('should accept the hideNameFromCYA collection flag', function () {
72
+ var FORM_DATA = {};
73
+
74
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
75
+ formData: FORM_DATA,
76
+ collection: _objectSpread(_objectSpread({}, MASTER_PAGE.collection), {}, {
77
+ hideNameFromCYA: true
78
+ })
79
+ });
80
+
49
81
  var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
50
82
  expect(ROWS.length).toEqual(0);
51
83
  });
@@ -62,9 +94,9 @@ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
62
94
  });
63
95
 
64
96
  var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
65
- expect(ROWS.length).toEqual(5); // Title row + action rows + component row
97
+ expect(ROWS.length).toEqual(7); // Collection title, item title, action rows & component rows
66
98
 
67
- expect(ROWS[0].key).toEqual('Collection entry 1');
99
+ expect(ROWS[1].key).toEqual('Collection entry 1');
68
100
  });
69
101
  it('should provide default titles if collection.labels.item is not specified', function () {
70
102
  var FORM_DATA = {
@@ -82,9 +114,9 @@ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
82
114
  });
83
115
 
84
116
  var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
85
- expect(ROWS.length).toEqual(5); // Title row + action rows + component row
117
+ expect(ROWS.length).toEqual(7); // Collection title, item title, action rows & component rows
86
118
 
87
- expect(ROWS[0].key).toEqual('Item 1');
119
+ expect(ROWS[1].key).toEqual('Item 1');
88
120
  });
89
121
  it('should return correctly formatted rows for mutliple entries', function () {
90
122
  var FORM_DATA = {
@@ -102,24 +134,42 @@ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
102
134
  });
103
135
 
104
136
  var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
105
- expect(ROWS.length).toEqual(10); // Title row + component row for each item
106
-
107
- expect(ROWS[0].type).toEqual('title');
108
- expect(ROWS[0].key).toEqual('Collection entry 1'); // Formatted according to collection.labels.item
109
-
110
- expect(ROWS[1].action.label).toEqual('Change');
111
- expect(ROWS[2].action.label).toEqual('custom remove label');
112
- expect(ROWS[3].action.label).toEqual('custom change label');
113
- expect(ROWS[4].value).toEqual('value');
114
- expect(ROWS[4].key).toEqual('Test text');
115
- expect(ROWS[5].type).toEqual('title');
116
- expect(ROWS[5].key).toEqual('Collection entry 2'); // Formatted according to collection.labels.item
117
-
118
- expect(ROWS[6].action.label).toEqual('Change');
119
- expect(ROWS[7].action.label).toEqual('custom remove label');
120
- expect(ROWS[8].action.label).toEqual('custom change label');
121
- expect(ROWS[9].value).toEqual('value');
122
- expect(ROWS[9].key).toEqual('Test text');
137
+ expect(ROWS.length).toEqual(13); // Title row + component row for each item
138
+
139
+ expect(ROWS[0]).toMatchObject({
140
+ type: 'heading',
141
+ key: 'Collection'
142
+ });
143
+ expect(ROWS[1]).toMatchObject({
144
+ type: 'heading',
145
+ key: 'Collection entry 1'
146
+ });
147
+ expect(ROWS[2].action.label).toEqual('Change');
148
+ expect(ROWS[3].action.label).toEqual('custom remove label');
149
+ expect(ROWS[4].action.label).toEqual('custom change label');
150
+ expect(ROWS[5]).toMatchObject({
151
+ value: 'value',
152
+ key: 'Test text'
153
+ });
154
+ expect(ROWS[6]).toMatchObject({
155
+ value: '',
156
+ key: 'Test date'
157
+ });
158
+ expect(ROWS[7]).toMatchObject({
159
+ type: 'heading',
160
+ key: 'Collection entry 2'
161
+ });
162
+ expect(ROWS[8].action.label).toEqual('Change');
163
+ expect(ROWS[9].action.label).toEqual('custom remove label');
164
+ expect(ROWS[10].action.label).toEqual('custom change label');
165
+ expect(ROWS[11]).toMatchObject({
166
+ value: 'value',
167
+ key: 'Test text'
168
+ });
169
+ expect(ROWS[12]).toMatchObject({
170
+ value: '',
171
+ key: 'Test date'
172
+ });
123
173
  });
124
174
  it('should exclude components that should not be shown', function () {
125
175
  var FD = {
@@ -133,38 +183,152 @@ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
133
183
  testText: 'testing'
134
184
  }]
135
185
  };
136
- var C = {
137
- id: 'testText',
138
- fieldId: 'testText',
139
- label: 'Test text',
140
- type: 'text',
141
- show_when: {
142
- field: "otherField",
143
- op: "!=",
144
- value: "no"
145
- }
186
+
187
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
188
+ collection: {
189
+ name: 'collection'
190
+ },
191
+ formData: FD,
192
+ collectionPages: [_objectSpread(_objectSpread({}, PAGES[0]), {}, {
193
+ components: [{
194
+ id: 'testText',
195
+ fieldId: 'testText',
196
+ label: 'Test text',
197
+ type: 'text',
198
+ show_when: {
199
+ field: "otherField",
200
+ op: "!=",
201
+ value: "yes"
202
+ }
203
+ }]
204
+ })]
205
+ });
206
+
207
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
208
+ expect(ROWS.length).toEqual(4);
209
+ expect(ROWS[0]).toMatchObject({
210
+ type: 'heading',
211
+ key: 'Collection'
212
+ });
213
+ expect(ROWS[1]).toMatchObject({
214
+ type: 'heading',
215
+ key: 'Item 1'
216
+ });
217
+ expect(ROWS[2]).toMatchObject({
218
+ type: 'heading',
219
+ key: 'Item 2'
220
+ });
221
+ expect(ROWS[3]).toMatchObject({
222
+ value: 'testing',
223
+ key: 'Test text'
224
+ });
225
+ });
226
+ it('should exclude pages that should not be shown', function () {
227
+ var FD = {
228
+ collection: [{
229
+ id: '01',
230
+ otherField: 'yes',
231
+ testText: 'testing'
232
+ }]
146
233
  };
147
- var P = {
148
- id: 'page1',
234
+
235
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
149
236
  collection: {
150
237
  name: 'collection'
151
238
  },
152
- title: 'Collection',
153
- components: [C]
239
+ formData: FD,
240
+ collectionPages: [_objectSpread(_objectSpread({}, PAGES[0]), {}, {
241
+ show_when: {
242
+ field: "otherField",
243
+ op: "!=",
244
+ value: "yes"
245
+ }
246
+ }), PAGES[1]]
247
+ });
248
+
249
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
250
+ expect(ROWS.length).toEqual(3); // Missing the page with the text component on.
251
+
252
+ expect(ROWS[0]).toMatchObject({
253
+ type: 'heading',
254
+ key: 'Collection'
255
+ });
256
+ expect(ROWS[1]).toMatchObject({
257
+ type: 'heading',
258
+ key: 'Item 1'
259
+ });
260
+ expect(ROWS[2]).toMatchObject({
261
+ value: '',
262
+ key: 'Test date'
263
+ });
264
+ });
265
+ it('should include rows for custom headings', function () {
266
+ var FORM_DATA = {
267
+ collection: [{
268
+ id: '01',
269
+ testText: 'value'
270
+ }]
154
271
  };
155
272
 
156
- var PAGE = _objectSpread(_objectSpread({}, P), {}, {
157
- formData: FD
273
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
274
+ formData: FORM_DATA,
275
+ collectionPages: [_objectSpread(_objectSpread({}, PAGES[0]), {}, {
276
+ collection: _objectSpread(_objectSpread({}, PAGES[0].collection), {}, {
277
+ heading: {
278
+ size: 'm',
279
+ text: 'Custom page heading'
280
+ }
281
+ })
282
+ })]
158
283
  });
159
284
 
160
285
  var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
161
- expect(ROWS.length).toEqual(3); // Title row + single component as other should fail show check
162
-
163
- expect(ROWS[0].type).toEqual('title');
164
- expect(ROWS[0].key).toEqual('Item 1');
165
- expect(ROWS[1].value).toEqual('testing');
166
- expect(ROWS[1].key).toEqual('Test text');
167
- expect(ROWS[2].type).toEqual('title');
168
- expect(ROWS[2].key).toEqual('Item 2');
286
+ expect(ROWS.length).toEqual(7);
287
+ expect(ROWS[0]).toMatchObject({
288
+ type: 'heading',
289
+ key: 'Collection'
290
+ });
291
+ expect(ROWS[1]).toMatchObject({
292
+ type: 'heading',
293
+ key: 'Collection entry 1'
294
+ });
295
+ expect(ROWS[2].action.label).toEqual('Change');
296
+ expect(ROWS[3].action.label).toEqual('custom remove label');
297
+ expect(ROWS[4].action.label).toEqual('custom change label');
298
+ expect(ROWS[5]).toMatchObject({
299
+ type: 'heading',
300
+ key: 'Custom page heading',
301
+ size: 'm'
302
+ });
303
+ expect(ROWS[6]).toMatchObject({
304
+ value: 'value',
305
+ key: 'Test text'
306
+ });
307
+ });
308
+ it('should default to a title size of small if one is not specified', function () {
309
+ var FORM_DATA = {
310
+ collection: [{
311
+ id: '01',
312
+ testText: 'value'
313
+ }]
314
+ };
315
+
316
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
317
+ formData: FORM_DATA,
318
+ collectionPages: [_objectSpread(_objectSpread({}, PAGES[0]), {}, {
319
+ collection: _objectSpread(_objectSpread({}, PAGES[0].collection), {}, {
320
+ heading: {
321
+ text: 'Custom page heading'
322
+ }
323
+ })
324
+ })]
325
+ });
326
+
327
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
328
+ expect(ROWS[5]).toMatchObject({
329
+ type: 'heading',
330
+ key: 'Custom page heading',
331
+ size: 's'
332
+ });
169
333
  });
170
334
  });
@@ -5,53 +5,34 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _addShowWhen = _interopRequireDefault(require("../Component/addShowWhen"));
9
-
10
- var _applyToComponentTree = _interopRequireDefault(require("../Component/applyToComponentTree"));
11
-
12
- var _showFormPageCYA = _interopRequireDefault(require("../FormPage/showFormPageCYA"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
8
  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; }
17
9
 
18
10
  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; }
19
11
 
20
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; }
21
13
 
22
- var getComponentsWithRouting = function getComponentsWithRouting(page) {
23
- if (!page.collection.route) {
24
- return page.components;
25
- } // Apply show_whens to components on certain conditional pages.
26
- // This ensures that those components aren't shown on the CYA
27
- // screen if they were never visited by the user.
28
-
29
-
30
- return page.components.map(function (component) {
31
- return (0, _applyToComponentTree.default)(component, function (c) {
32
- return (0, _addShowWhen.default)(c, page.collection.route);
33
- });
34
- });
35
- };
36
-
37
14
  var createMasterPage = function createMasterPage(page) {
38
- return _objectSpread(_objectSpread({}, page), {}, {
39
- title: page.collection.name.charAt(0).toUpperCase() + page.collection.name.slice(1),
40
- components: getComponentsWithRouting(page)
41
- });
15
+ return {
16
+ id: page.id,
17
+ collection: _objectSpread({
18
+ masterPage: true
19
+ }, page.collection),
20
+ formData: _objectSpread({}, page.formData),
21
+ collectionPages: [page]
22
+ };
42
23
  };
43
24
 
44
25
  var mergeIntoMasterPage = function mergeIntoMasterPage(page, masterPage) {
45
26
  masterPage.collection = _objectSpread(_objectSpread({}, masterPage.collection), page.collection);
46
- masterPage.components = [].concat(masterPage.components, getComponentsWithRouting(page));
47
- masterPage.formData = _objectSpread({}, page.formData);
27
+ masterPage.formData = _objectSpread(_objectSpread({}, masterPage.formData), page.formData);
28
+ masterPage.collectionPages = [].concat(masterPage.collectionPages, [page]);
48
29
  };
49
30
  /**
50
31
  * Loop over an array of pages, merging any CollectionPages into a
51
32
  * single master page for that collection. A master page is created
52
33
  * for each unique collection.name that exists.
53
- * These master pages contain all the fields needed to represent an
54
- * entry in the collection.
34
+ * These master pages contain all the pages that are needed to
35
+ * represent an item in that collection.
55
36
  * The master page for each collection is positioned at the index
56
37
  * of the first CollectionPage in that collection.
57
38
  * @param { array } pages Array of pages in the form.
@@ -64,7 +45,7 @@ var mergeCollectionPages = function mergeCollectionPages(pages) {
64
45
  return pages.map(function (page) {
65
46
  var _page$collection;
66
47
 
67
- if (page !== null && page !== void 0 && (_page$collection = page.collection) !== null && _page$collection !== void 0 && _page$collection.name && (0, _showFormPageCYA.default)(page, page.formData)) {
48
+ if (page !== null && page !== void 0 && (_page$collection = page.collection) !== null && _page$collection !== void 0 && _page$collection.name) {
68
49
  if (!masterPages[page.collection.name]) {
69
50
  // If no master page exists for this collection.name, then
70
51
  // we kick one off using this page as a template.
@@ -40,14 +40,14 @@ describe('utils.CollectionPage.mergeCollectionPages', function () {
40
40
  }];
41
41
  var RESULT = (0, _mergeCollectionPages.default)(PAGES);
42
42
  expect(RESULT.length).toEqual(1);
43
- expect(RESULT[0]).toEqual({
43
+ expect(RESULT[0]).toMatchObject({
44
44
  id: 'page1',
45
- title: 'Collection',
46
45
  collection: {
47
- name: 'collection'
46
+ name: 'collection',
47
+ masterPage: true
48
48
  },
49
- components: [TEXT_COMP, DATE_COMP],
50
- formData: {}
49
+ formData: {},
50
+ collectionPages: PAGES
51
51
  });
52
52
  });
53
53
  it('should leave non-collection pages unaffected', function () {
@@ -70,12 +70,12 @@ describe('utils.CollectionPage.mergeCollectionPages', function () {
70
70
  expect(RESULT.length).toEqual(2);
71
71
  expect(RESULT[0]).toEqual({
72
72
  id: 'page1',
73
- title: 'Collection',
74
73
  collection: {
75
- name: 'collection'
74
+ name: 'collection',
75
+ masterPage: true
76
76
  },
77
- components: [TEXT_COMP, DATE_COMP],
78
- formData: {}
77
+ formData: {},
78
+ collectionPages: [PAGES[0], PAGES[1]]
79
79
  });
80
80
  expect(RESULT[1]).toEqual({
81
81
  id: 'page3'
@@ -112,90 +112,20 @@ describe('utils.CollectionPage.mergeCollectionPages', function () {
112
112
  expect(RESULT[0]).toEqual({
113
113
  id: 'page1',
114
114
  collection: {
115
- name: 'collection1'
115
+ name: 'collection1',
116
+ masterPage: true
116
117
  },
117
- title: 'Collection1',
118
- components: [],
119
- formData: {}
118
+ formData: {},
119
+ collectionPages: [PAGES[0], PAGES[1]]
120
120
  });
121
121
  expect(RESULT[1]).toEqual({
122
122
  id: 'page3',
123
123
  collection: {
124
- name: 'collection2'
125
- },
126
- title: 'Collection2',
127
- components: [],
128
- formData: {}
129
- });
130
- });
131
- it('should add a defined route as a show_when to components on the page', function () {
132
- var PAGES = [{
133
- id: 'page1',
134
- collection: {
135
- name: 'collection',
136
- route: {
137
- field: 'field',
138
- op: '=',
139
- value: 'value'
140
- }
141
- },
142
- components: [{
143
- type: 'text'
144
- }]
145
- }, {
146
- id: 'page2',
147
- collection: {
148
- name: 'collection',
149
- route: {
150
- field: 'field',
151
- op: '=',
152
- value: 'otherValue'
153
- }
154
- },
155
- components: [{
156
- type: 'container',
157
- components: [{
158
- type: 'date'
159
- }]
160
- }]
161
- }];
162
- var RESULT = (0, _mergeCollectionPages.default)(PAGES);
163
- expect(RESULT.length).toEqual(1);
164
- expect(RESULT[0]).toEqual({
165
- id: 'page1',
166
- title: 'Collection',
167
- collection: {
168
- name: 'collection',
169
- route: {
170
- field: 'field',
171
- op: '=',
172
- value: 'otherValue'
173
- }
124
+ name: 'collection2',
125
+ masterPage: true
174
126
  },
175
- components: [{
176
- type: 'text',
177
- show_when: {
178
- field: 'field',
179
- op: '=',
180
- value: 'value'
181
- }
182
- }, {
183
- type: 'container',
184
- components: [{
185
- type: 'date',
186
- show_when: {
187
- field: 'field',
188
- op: '=',
189
- value: 'otherValue'
190
- }
191
- }],
192
- show_when: {
193
- field: 'field',
194
- op: '=',
195
- value: 'otherValue'
196
- }
197
- }],
198
- formData: {}
127
+ formData: {},
128
+ collectionPages: [PAGES[2], PAGES[3]]
199
129
  });
200
130
  });
201
131
  });
@@ -41,7 +41,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
41
41
  * @returns The first encountered error with the component.
42
42
  */
43
43
  var validateComponent = function validateComponent(component, outerData, formData) {
44
- var _fd$keycloakContext, _component$data$optio;
44
+ var _component$data$optio;
45
45
 
46
46
  var fd = formData || outerData;
47
47
 
@@ -68,8 +68,7 @@ var validateComponent = function validateComponent(component, outerData, formDat
68
68
  return (0, _validateCollection.default)(component, value, fd);
69
69
 
70
70
  case _models.ComponentTypes.EMAIL:
71
- var userEmail = fd === null ? '' : (_fd$keycloakContext = fd.keycloakContext) === null || _fd$keycloakContext === void 0 ? void 0 : _fd$keycloakContext.email;
72
- error = (0, _validateEmail.default)(value, component.label, userEmail, component.custom_errors);
71
+ error = (0, _validateEmail.default)(value, component.label, component.custom_errors);
73
72
  break;
74
73
 
75
74
  case _models.ComponentTypes.DATE:
@@ -15,24 +15,18 @@ var HODS_EMAIL_REGEX = /^[a-z0-9._-]+@(digital\.)?homeoffice.gov.uk$/i;
15
15
  * validateRequired (Validate.required) for that sort of validation.
16
16
  * @param {*} value The value to validate.
17
17
  * @param {string} label The label to use in any error message.
18
- * @param {string} userEmail The user email to use for validation.
18
+ * @param {array} customErrors The array of custom errors to use for format message.
19
19
  * @returns An error if the email address is invalid.
20
20
  */
21
21
 
22
22
  var validateEmail = function validateEmail(value) {
23
23
  var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
24
- var userEmail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
25
- var customErrors = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
24
+ var customErrors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
26
25
 
27
26
  if (!!value) {
28
27
  var name = label ? label.toLowerCase() : 'email address';
29
28
 
30
29
  if (typeof value === 'string') {
31
- // The following is an interim fix pending a mechanism for validating against specific values
32
- if (['Line manager email', 'Delegate email address'].includes(label) && value.toLowerCase() === userEmail) {
33
- return "".concat(label, " cannot be your own email");
34
- }
35
-
36
30
  if (HODS_EMAIL_REGEX.test(value)) {
37
31
  return undefined;
38
32
  }
@@ -58,15 +58,15 @@ describe('utils', function () {
58
58
  'message': 'Enter email address in the correct format'
59
59
  }];
60
60
  var CUSTOM_ERROR = 'Enter email address in the correct format';
61
- expect((0, _validateEmail.default)('bob', '', '', customErrors)).toEqual(CUSTOM_ERROR);
61
+ expect((0, _validateEmail.default)('bob', '', customErrors)).toEqual(CUSTOM_ERROR);
62
62
  });
63
- it('should return an error when line manager email is same as user email', function () {
64
- var USER_EMAIL_ERROR = 'Line manager email cannot be your own email';
65
- expect((0, _validateEmail.default)('joe.bloggs@digital.homeoffice.gov.uk', 'Line manager email', 'joe.bloggs@digital.homeoffice.gov.uk')).toEqual(USER_EMAIL_ERROR);
66
- });
67
- it('should return an error when delegate email is same as user email', function () {
68
- var USER_EMAIL_ERROR = 'Delegate email address cannot be your own email';
69
- expect((0, _validateEmail.default)('joe.bloggs@digital.homeoffice.gov.uk', 'Delegate email address', 'joe.bloggs@digital.homeoffice.gov.uk')).toEqual(USER_EMAIL_ERROR);
63
+ it('should use the default format error message when custom errors is not an array', function () {
64
+ var DEFAULT_ERROR = 'Enter email address in the correct format, like jane.doe@homeoffice.gov.uk';
65
+ var customErrors = {
66
+ 'type': 'format',
67
+ 'message': 'Enter email address in the correct format'
68
+ };
69
+ expect((0, _validateEmail.default)('bob', '', customErrors)).toEqual(DEFAULT_ERROR);
70
70
  });
71
71
  });
72
72
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "4.44.0",
3
+ "version": "4.47.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",