@ukhomeoffice/cop-react-form-renderer 5.42.0 → 5.44.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.
@@ -50,7 +50,8 @@ var CheckYourAnswers = function CheckYourAnswers(_ref) {
50
50
  noGroupAction = _ref.noGroupAction,
51
51
  groups = _ref.groups,
52
52
  sections = _ref.sections,
53
- type = _ref.type;
53
+ type = _ref.type,
54
+ hideBlankRows = _ref.hideBlankRows;
54
55
  var _useState = (0, _react.useState)([]),
55
56
  _useState2 = _slicedToArray(_useState, 2),
56
57
  pages = _useState2[0],
@@ -179,18 +180,25 @@ var CheckYourAnswers = function CheckYourAnswers(_ref) {
179
180
  }));
180
181
  });
181
182
  }), type !== _models.FormTypes.TASK_CYA && pages && pages.map(function (page, pageIndex, array) {
182
- var pageMarginBottom = isLastPage(pageIndex) || isGroup(array[pageIndex].id) || isGroup(array[pageIndex + 1].id) ? DEFAULT_MARGIN_BOTTOM : listMarginBottom;
183
+ var filteredRows = !hideBlankRows || page.collection ? page.rows : page.rows.filter(function (row) {
184
+ var _row$value;
185
+ return row === null || row === void 0 || (_row$value = row.value) === null || _row$value === void 0 || (_row$value = _row$value.props) === null || _row$value === void 0 ? void 0 : _row$value.value;
186
+ });
187
+ if (filteredRows.length === 0) {
188
+ return null;
189
+ }
190
+ var showPageTitle = !hide_page_titles && page.title && !isGroup(page.id);
191
+ var pageMarginBottom = isLastPage(pageIndex) || isGroup(array[pageIndex].id) || array.length > pageIndex + 1 && isGroup(array[pageIndex + 1].id) ? DEFAULT_MARGIN_BOTTOM : listMarginBottom;
183
192
  var currentGroup = isGroup(page.id) ? getGroupForPage(page.id) : undefined;
184
193
  var className = "govuk-!-margin-bottom-".concat(pageMarginBottom);
185
194
  var hideActionButtons = isGroup(page.id) || noChangeAction;
186
- var showHeading = !hide_page_titles && page.title && !isGroup(page.id);
187
195
  return /*#__PURE__*/_react.default.createElement(_react.Fragment, {
188
196
  key: pageIndex
189
- }, showHeading && getPageHeading(page, 'm'), isGroup(page.id) && /*#__PURE__*/_react.default.createElement("div", {
197
+ }, showPageTitle && getPageHeading(page, 'm'), currentGroup && /*#__PURE__*/_react.default.createElement("div", {
190
198
  className: "group-title"
191
199
  }, /*#__PURE__*/_react.default.createElement(_copReactComponents.MediumHeading, null, currentGroup.title || _utils.default.FormPage.getTitle(page.title, page.formData))), /*#__PURE__*/_react.default.createElement(_SummaryList.default, {
192
200
  className: className,
193
- rows: page.rows,
201
+ rows: filteredRows,
194
202
  classModifiers: summaryListClassModifiers,
195
203
  noChangeAction: hideActionButtons,
196
204
  noGroupAction: noGroupAction,
@@ -224,7 +232,8 @@ CheckYourAnswers.propTypes = {
224
232
  })),
225
233
  summaryListClassModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
226
234
  title: _propTypes.default.string,
227
- type: _propTypes.default.string
235
+ type: _propTypes.default.string,
236
+ hideBlankRows: _propTypes.default.bool
228
237
  };
229
238
  CheckYourAnswers.defaultProps = {
230
239
  actions: [],
@@ -237,6 +246,7 @@ CheckYourAnswers.defaultProps = {
237
246
  sections: [],
238
247
  summaryListClassModifiers: null,
239
248
  title: DEFAULT_TITLE,
240
- type: null
249
+ type: null,
250
+ hideBlankRows: false
241
251
  };
242
252
  var _default = exports.default = CheckYourAnswers;
@@ -771,5 +771,54 @@ describe('components', function () {
771
771
  }
772
772
  }, _callee30);
773
773
  })));
774
+ it('Show answers from multiple address fields into in one DL correctly when hideBlankRows is true', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee32() {
775
+ var ADDRESS_DATA, GROUP_PAGES, cya, groupedComponent, keyGroup, valueGroup, changeButtonDiv, changeButton;
776
+ return _regeneratorRuntime().wrap(function _callee32$(_context32) {
777
+ while (1) switch (_context32.prev = _context32.next) {
778
+ case 0:
779
+ ADDRESS_DATA = _utils.default.Data.setupForm(_group.default.pages, _group.default.components, _groupData.default);
780
+ GROUP_PAGES = _utils.default.FormPage.getAll(_group.default.pages, _group.default.components, _objectSpread({}, ADDRESS_DATA));
781
+ _context32.next = 4;
782
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee31() {
783
+ return _regeneratorRuntime().wrap(function _callee31$(_context31) {
784
+ while (1) switch (_context31.prev = _context31.next) {
785
+ case 0:
786
+ (0, _setupTests.renderDomWithValidation)( /*#__PURE__*/_react.default.createElement(_CheckYourAnswers.default, {
787
+ pages: GROUP_PAGES,
788
+ onRowAction: ON_ROW_ACTION,
789
+ onAction: ON_ACTION,
790
+ hide_title: true,
791
+ hideBlankRows: true
792
+ }), container);
793
+ case 1:
794
+ case "end":
795
+ return _context31.stop();
796
+ }
797
+ }, _callee31);
798
+ })));
799
+ case 4:
800
+ cya = checkCYA(container);
801
+ groupedComponent = cya.childNodes[6];
802
+ keyGroup = groupedComponent.childNodes[0].childNodes[0].childNodes[0];
803
+ expect(keyGroup.tagName).toEqual('DT');
804
+ expect(keyGroup.textContent).toEqual('Address details');
805
+ valueGroup = groupedComponent.childNodes[0].childNodes[0].childNodes[1];
806
+ expect(valueGroup.childNodes.length).toEqual(4);
807
+ expect(valueGroup.tagName).toEqual('DD');
808
+ expect(valueGroup.childNodes[0].textContent).toContain('10 Downing Street');
809
+ expect(valueGroup.childNodes[1].textContent).toContain('City of Westminster');
810
+ expect(valueGroup.childNodes[2].textContent).toContain('London');
811
+ expect(valueGroup.childNodes[3].textContent).toContain('SW1A 2AA');
812
+ changeButtonDiv = groupedComponent.childNodes[0].childNodes[0].childNodes[2];
813
+ expect(changeButtonDiv.classList).toContain('govuk-summary-list__actions');
814
+ changeButton = changeButtonDiv.childNodes[0];
815
+ expect(changeButton.tagName).toEqual('A');
816
+ expect(changeButton.textContent).toEqual('Change address details');
817
+ case 21:
818
+ case "end":
819
+ return _context32.stop();
820
+ }
821
+ }, _callee32);
822
+ })));
774
823
  });
775
824
  });
@@ -35,7 +35,8 @@ var CollectionPage = function CollectionPage(_ref) {
35
35
  hashLink = _ref.hashLink,
36
36
  classBlock = _ref.classBlock,
37
37
  classModifiers = _ref.classModifiers,
38
- className = _ref.className;
38
+ className = _ref.className,
39
+ submitting = _ref.submitting;
39
40
  var _useState = (0, _react.useState)({}),
40
41
  _useState2 = _slicedToArray(_useState, 2),
41
42
  patch = _useState2[0],
@@ -123,7 +124,8 @@ var CollectionPage = function CollectionPage(_ref) {
123
124
  hashLink: hashLink,
124
125
  classBlock: classBlock,
125
126
  classModifiers: classModifiers,
126
- className: className
127
+ className: className,
128
+ submitting: submitting
127
129
  });
128
130
  };
129
131
  CollectionPage.propTypes = {
@@ -142,13 +144,15 @@ CollectionPage.propTypes = {
142
144
  hashLink: _propTypes.default.bool,
143
145
  classBlock: _propTypes.default.string,
144
146
  classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
145
- className: _propTypes.default.string
147
+ className: _propTypes.default.string,
148
+ submitting: _propTypes.default.bool
146
149
  };
147
150
  CollectionPage.defaultProps = {
148
151
  onCollectionChange: undefined,
149
152
  hashLink: false,
150
153
  classBlock: DEFAULT_CLASS,
151
154
  classModifiers: [],
152
- className: ''
155
+ className: '',
156
+ submitting: false
153
157
  };
154
158
  var _default = exports.default = CollectionPage;
@@ -15,7 +15,7 @@ var _CollectionSummary = _interopRequireDefault(require("../CollectionSummary"))
15
15
  var _Collection = _interopRequireDefault(require("./Collection"));
16
16
  var _Container = _interopRequireDefault(require("./Container"));
17
17
  var _helpers = require("./helpers");
18
- var _excluded = ["component", "value", "formData", "wrap", "onAction", "onChange", "onTopLevelChange", "pages"]; // Global imports
18
+ var _excluded = ["component", "value", "formData", "wrap", "onAction", "onChange", "onTopLevelChange", "pages", "submitting"]; // Global imports
19
19
  // Local imports
20
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -43,6 +43,7 @@ var FormComponent = function FormComponent(_ref) {
43
43
  onChange = _ref.onChange,
44
44
  onTopLevelChange = _ref.onTopLevelChange,
45
45
  pages = _ref.pages,
46
+ submitting = _ref.submitting,
46
47
  attrs = _objectWithoutProperties(_ref, _excluded);
47
48
  var _useHooks = (0, _hooks.useHooks)(),
48
49
  hooks = _useHooks.hooks;
@@ -166,7 +167,8 @@ var FormComponent = function FormComponent(_ref) {
166
167
  value: value,
167
168
  onChange: onComponentChangeExtended,
168
169
  formData: formData,
169
- onAction: onAction
170
+ onAction: onAction,
171
+ submitting: submitting
170
172
  }), wrap, hooks.onGetComponent);
171
173
  };
172
174
  FormComponent.propTypes = {
@@ -201,7 +203,8 @@ FormComponent.propTypes = {
201
203
  onAction: _propTypes.default.func,
202
204
  onChange: _propTypes.default.func,
203
205
  onTopLevelChange: _propTypes.default.func,
204
- pages: _propTypes.default.arrayOf(_propTypes.default.shape({}))
206
+ pages: _propTypes.default.arrayOf(_propTypes.default.shape({})),
207
+ submitting: _propTypes.default.bool
205
208
  };
206
209
  FormComponent.defaultProps = {
207
210
  formData: null,
@@ -210,6 +213,7 @@ FormComponent.defaultProps = {
210
213
  onTopLevelChange: undefined,
211
214
  value: null,
212
215
  wrap: true,
213
- pages: []
216
+ pages: [],
217
+ submitting: false
214
218
  };
215
219
  var _default = exports.default = FormComponent;
@@ -41,7 +41,8 @@ var FormPage = function FormPage(_ref) {
41
41
  hashLink = _ref.hashLink,
42
42
  classBlock = _ref.classBlock,
43
43
  classModifiers = _ref.classModifiers,
44
- className = _ref.className;
44
+ className = _ref.className,
45
+ submitting = _ref.submitting;
45
46
  var _useState = (0, _react.useState)({}),
46
47
  _useState2 = _slicedToArray(_useState, 2),
47
48
  patch = _useState2[0],
@@ -104,7 +105,8 @@ var FormPage = function FormPage(_ref) {
104
105
  onTopLevelChange: onTopLevelChange || onPageChange,
105
106
  value: page.formData[component.fieldId] || patch[component.fieldId],
106
107
  formData: page.formData,
107
- pages: pages
108
+ pages: pages,
109
+ submitting: submitting
108
110
  });
109
111
  });
110
112
  return /*#__PURE__*/_react.default.createElement("div", {
@@ -150,7 +152,8 @@ FormPage.propTypes = {
150
152
  actions: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.shape({}), _propTypes.default.string])),
151
153
  formData: _propTypes.default.shape({}).isRequired
152
154
  }).isRequired,
153
- pages: _propTypes.default.arrayOf(_propTypes.default.shape({}))
155
+ pages: _propTypes.default.arrayOf(_propTypes.default.shape({})),
156
+ submitting: _propTypes.default.bool
154
157
  };
155
158
  FormPage.defaultProps = {
156
159
  classBlock: DEFAULT_CLASS,
@@ -160,6 +163,7 @@ FormPage.defaultProps = {
160
163
  onChange: undefined,
161
164
  onTopLevelChange: undefined,
162
165
  onWrapperChange: undefined,
163
- pages: []
166
+ pages: [],
167
+ submitting: false
164
168
  };
165
169
  var _default = exports.default = FormPage;
@@ -59,7 +59,8 @@ var FormRenderer = function FormRenderer(_ref) {
59
59
  summaryListClassModifiers = _ref.summaryListClassModifiers,
60
60
  noChangeAction = _ref.noChangeAction,
61
61
  newPageId = _ref.newPageId,
62
- viewOnly = _ref.viewOnly;
62
+ viewOnly = _ref.viewOnly,
63
+ hideBlankRows = _ref.hideBlankRows;
63
64
  return /*#__PURE__*/_react.default.createElement(_context.HooksContextProvider, {
64
65
  overrides: hooks
65
66
  }, /*#__PURE__*/_react.default.createElement(_context.ValidationContextProvider, null, /*#__PURE__*/_react.default.createElement(InternalFormRenderer, {
@@ -78,7 +79,8 @@ var FormRenderer = function FormRenderer(_ref) {
78
79
  summaryListClassModifiers: summaryListClassModifiers,
79
80
  noChangeAction: noChangeAction,
80
81
  newPageId: newPageId,
81
- viewOnly: viewOnly
82
+ viewOnly: viewOnly,
83
+ hideBlankRows: hideBlankRows
82
84
  })));
83
85
  };
84
86
  var DEFAULT_CLASS = exports.DEFAULT_CLASS = 'hods-form';
@@ -99,7 +101,8 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
99
101
  summaryListClassModifiers = _ref2.summaryListClassModifiers,
100
102
  noChangeAction = _ref2.noChangeAction,
101
103
  newPageId = _ref2.newPageId,
102
- viewOnly = _ref2.viewOnly;
104
+ viewOnly = _ref2.viewOnly,
105
+ hideBlankRows = _ref2.hideBlankRows;
103
106
  // Set up the initial states.
104
107
  var _useState = (0, _react.useState)({}),
105
108
  _useState2 = _slicedToArray(_useState, 2),
@@ -341,7 +344,8 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
341
344
  noChangeAction: (_formState$cya$hideCh = formState.cya.hideChangeActions) !== null && _formState$cya$hideCh !== void 0 ? _formState$cya$hideCh : noChangeAction,
342
345
  noGroupAction: (_formState$cya$hideGr = formState.cya.hideGroupActions) !== null && _formState$cya$hideGr !== void 0 ? _formState$cya$hideGr : false,
343
346
  sections: typeof hubDetails !== 'undefined' ? hubDetails.sections : [],
344
- type: type
347
+ type: type,
348
+ hideBlankRows: hideBlankRows
345
349
  })), hub === _models.HubFormats.TASK && formState.pageId === _models.FormPages.HUB && /*#__PURE__*/_react.default.createElement(_TaskList.default, _extends({}, taskDetails, {
346
350
  refNumber: data.businessKey,
347
351
  onTaskAction: function onTaskAction(task) {
@@ -357,7 +361,8 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
357
361
  onChange: onChange,
358
362
  hashLink: hashLink,
359
363
  classModifiers: formState.page.classModifiers,
360
- className: formState.page.className
364
+ className: formState.page.className,
365
+ submitting: submitting
361
366
  }), formState.page && !formState.cya && formState.page.collection && /*#__PURE__*/_react.default.createElement(_CollectionPage.default, {
362
367
  page: formState.page,
363
368
  onCollectionChange: onChange,
@@ -366,7 +371,8 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
366
371
  },
367
372
  hashLink: hashLink,
368
373
  classModifiers: formState.page.classModifiers,
369
- className: formState.page.className
374
+ className: formState.page.className,
375
+ submitting: submitting
370
376
  }));
371
377
  };
372
378
  var propTypes = {
@@ -396,7 +402,8 @@ var propTypes = {
396
402
  title: _propTypes.default.string,
397
403
  /** See <a href="/?path=/docs/f-json--page#formtypes">FormTypes</a>. */
398
404
  type: _propTypes.default.oneOf([_models.FormTypes.CYA, _models.FormTypes.FORM, _models.FormTypes.HUB, _models.FormTypes.TASK, _models.FormTypes.WIZARD, _models.FormTypes.TASK_CYA, _models.FormTypes.FORM_WITH_TASK]).isRequired,
399
- viewOnly: _propTypes.default.bool
405
+ viewOnly: _propTypes.default.bool,
406
+ hideBlankRows: _propTypes.default.bool
400
407
  };
401
408
  var defaultProps = {
402
409
  classBlock: DEFAULT_CLASS,
@@ -417,7 +424,8 @@ var defaultProps = {
417
424
  noChangeAction: false,
418
425
  summaryListClassModifiers: [],
419
426
  title: '',
420
- viewOnly: true
427
+ viewOnly: true,
428
+ hideBlankRows: false
421
429
  };
422
430
  FormRenderer.propTypes = propTypes;
423
431
  InternalFormRenderer.propTypes = propTypes;
@@ -1119,5 +1119,63 @@ describe('components', function () {
1119
1119
  }
1120
1120
  }, _callee38);
1121
1121
  })));
1122
+ it('should handle page navigation correctly when hideBlankRows is true', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee40() {
1123
+ var ON_PAGE_CHANGE_CALLS, ON_PAGE_CHANGE, HOOKS, form, hub, _hub$childNodes7, lineManagerList, link, page, pageHeading, continueButton, newPageHeading;
1124
+ return _regeneratorRuntime().wrap(function _callee40$(_context40) {
1125
+ while (1) switch (_context40.prev = _context40.next) {
1126
+ case 0:
1127
+ ON_PAGE_CHANGE_CALLS = [];
1128
+ ON_PAGE_CHANGE = function ON_PAGE_CHANGE(pageId) {
1129
+ ON_PAGE_CHANGE_CALLS.push(pageId);
1130
+ };
1131
+ HOOKS = {
1132
+ onPageChange: ON_PAGE_CHANGE
1133
+ };
1134
+ _context40.next = 5;
1135
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee39() {
1136
+ return _regeneratorRuntime().wrap(function _callee39$(_context39) {
1137
+ while (1) switch (_context39.prev = _context39.next) {
1138
+ case 0:
1139
+ (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
1140
+ data: _userProfileData.default,
1141
+ hooks: HOOKS,
1142
+ hideBlankRows: true
1143
+ })), container);
1144
+ case 1:
1145
+ case "end":
1146
+ return _context39.stop();
1147
+ }
1148
+ }, _callee39);
1149
+ })));
1150
+ case 5:
1151
+ form = checkForm(container); // Navigate to the "Add or change a line manager" page.
1152
+ hub = form.childNodes[1]; // Hub = CYA
1153
+ _hub$childNodes7 = _slicedToArray(hub.childNodes, 4), lineManagerList = _hub$childNodes7[3];
1154
+ link = getChangeLink(lineManagerList);
1155
+ expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
1156
+ _react.fireEvent.click(link, {});
1157
+ expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[4].id);
1158
+
1159
+ // Should be on the page explaining what changing the line manager means.
1160
+ page = form.childNodes[0];
1161
+ pageHeading = page.childNodes[0];
1162
+ expect(pageHeading.tagName).toEqual('H1');
1163
+ expect(pageHeading.textContent).toEqual(_userProfile.default.pages[4].title);
1164
+
1165
+ // Now click on the "Continue" button on here.
1166
+ continueButton = getContinueButton(page);
1167
+ expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
1168
+ _react.fireEvent.click(continueButton, {});
1169
+ expect(ON_PAGE_CHANGE_CALLS.length).toEqual(2);
1170
+ expect(ON_PAGE_CHANGE_CALLS[1]).toEqual(_userProfile.default.pages[5].id);
1171
+ newPageHeading = form.childNodes[0].childNodes[0];
1172
+ expect(newPageHeading.tagName).toEqual('H1');
1173
+ expect(newPageHeading.textContent).toEqual(_userProfile.default.pages[5].title);
1174
+ case 24:
1175
+ case "end":
1176
+ return _context40.stop();
1177
+ }
1178
+ }, _callee40);
1179
+ })));
1122
1180
  });
1123
1181
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "5.42.0",
3
+ "version": "5.44.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",