@ukhomeoffice/cop-react-form-renderer 5.91.1 → 5.93.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.
@@ -29,7 +29,7 @@ var DEFAULT_DELETE_BUTTON_LABEL = exports.DEFAULT_DELETE_BUTTON_LABEL = 'Delete'
29
29
  var DEFAULT_CHANGE_BUTTON_CLASS = exports.DEFAULT_CHANGE_BUTTON_CLASS = 'secondary';
30
30
  var DEFAULT_DELETE_BUTTON_CLASS = exports.DEFAULT_DELETE_BUTTON_CLASS = 'warning';
31
31
  var RenderListView = function RenderListView(_ref) {
32
- var _config$changeAction, _config$deleteAction, _masterPage$childPage;
32
+ var _config$changeAction, _config$changeAction2, _config$changeAction3, _config$changeAction4, _config$deleteAction, _masterPage$childPage;
33
33
  var id = _ref.id,
34
34
  entryData = _ref.entryData,
35
35
  config = _ref.config,
@@ -59,16 +59,28 @@ var RenderListView = function RenderListView(_ref) {
59
59
  className: classes('actions')
60
60
  }, /*#__PURE__*/_react.default.createElement("li", {
61
61
  className: classes('action')
62
- }, config.changeAction && typeof onFullEdit === 'function' && /*#__PURE__*/_react.default.createElement("button", {
62
+ }, config.changeAction && typeof onFullEdit === 'function' &&
63
+ // If passed a value for classModifiers, render a Button with those classModifiers applied -
64
+ // otherwise, revert to the default GOVUK List View styling of rendering a Link button instead:
65
+ config.changeAction.classModifiers ? /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
66
+ id: "".concat(id, ".changeButton"),
67
+ onClick: function onClick() {
68
+ return onFullEdit(config.changeAction.page, entryData.id);
69
+ },
70
+ classModifiers: config.changeAction.classModifiers,
71
+ "aria-label": _copReactComponents.Utils.interpolateString("".concat(((_config$changeAction = config.changeAction) === null || _config$changeAction === void 0 ? void 0 : _config$changeAction.label) || DEFAULT_CHANGE_BUTTON_LABEL, " ").concat(config.title || DEFAULT_TITLE), _objectSpread(_objectSpread({}, entryData), {}, {
72
+ index: entryData.index + 1
73
+ }))
74
+ }, ((_config$changeAction2 = config.changeAction) === null || _config$changeAction2 === void 0 ? void 0 : _config$changeAction2.label) || DEFAULT_CHANGE_BUTTON_LABEL) : /*#__PURE__*/_react.default.createElement("button", {
63
75
  type: "button",
64
76
  className: "govuk-link govuk-link-button",
65
77
  onClick: function onClick() {
66
78
  return onFullEdit(config.changeAction.page, entryData.id);
67
79
  },
68
- "aria-label": _copReactComponents.Utils.interpolateString("".concat(((_config$changeAction = config.changeAction) === null || _config$changeAction === void 0 ? void 0 : _config$changeAction.label) || DEFAULT_CHANGE_BUTTON_LABEL, " ").concat(config.title || DEFAULT_TITLE), _objectSpread(_objectSpread({}, entryData), {}, {
80
+ "aria-label": _copReactComponents.Utils.interpolateString("".concat(((_config$changeAction3 = config.changeAction) === null || _config$changeAction3 === void 0 ? void 0 : _config$changeAction3.label) || DEFAULT_CHANGE_BUTTON_LABEL, " ").concat(config.title || DEFAULT_TITLE), _objectSpread(_objectSpread({}, entryData), {}, {
69
81
  index: entryData.index + 1
70
82
  }))
71
- }, config.changeAction.label || DEFAULT_CHANGE_BUTTON_LABEL)), /*#__PURE__*/_react.default.createElement("li", {
83
+ }, ((_config$changeAction4 = config.changeAction) === null || _config$changeAction4 === void 0 ? void 0 : _config$changeAction4.label) || DEFAULT_CHANGE_BUTTON_LABEL)), /*#__PURE__*/_react.default.createElement("li", {
72
84
  className: classes('action')
73
85
  }, config.deleteAction && typeof onDelete === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
74
86
  id: "".concat(id, ".deleteButton"),
@@ -289,3 +289,7 @@ $govuk-font-family: 'Roboto', arial, sans-serif;
289
289
  background: none;
290
290
  border: none;
291
291
  }
292
+
293
+ .hods-button {
294
+ margin: 0;
295
+ }
@@ -224,7 +224,7 @@ describe('components.CollectionSummary.RenderListView', function () {
224
224
  onDeleteArgs = [];
225
225
  onDeleteCalls = 0;
226
226
  });
227
- it('should render and handle action buttons correctly', function () {
227
+ it('should render and handle action buttons correctly, including a GOVUK default Change Link when no classModifiers are passed in', function () {
228
228
  var _renderWithValidation4 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react2.default.createElement(_RenderListView.default, {
229
229
  id: ID,
230
230
  entryData: ENTRY,
@@ -238,7 +238,7 @@ describe('components.CollectionSummary.RenderListView', function () {
238
238
  var listViewDiv = container.querySelector('.govuk-summary-card');
239
239
  expect(listViewDiv).not.toBeNull();
240
240
 
241
- // Check for change button
241
+ // Check for change link
242
242
  var changeLink = listViewDiv.querySelector('.govuk-link');
243
243
  expect(changeLink.textContent).toEqual(CONFIG.changeAction.label);
244
244
  expect(changeLink.getAttribute('aria-label')).toEqual("".concat(CONFIG.changeAction.label, " ").concat(CONFIG.title));
@@ -257,5 +257,38 @@ describe('components.CollectionSummary.RenderListView', function () {
257
257
  expect(onDeleteCalls).toEqual(1);
258
258
  expect(onDeleteArgs[0]).toEqual(ENTRY);
259
259
  });
260
+ it('should render and handle an Update button instead of the GOVUK default Change link when classModifiers are passed in', function () {
261
+ var CONFIG_WITH_BUTTON = _objectSpread(_objectSpread({}, CONFIG), {}, {
262
+ changeAction: {
263
+ label: 'Update label',
264
+ page: 'testPage',
265
+ classModifiers: 'primary'
266
+ }
267
+ });
268
+ var _renderWithValidation5 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react2.default.createElement(_RenderListView.default, {
269
+ id: ID,
270
+ entryData: ENTRY,
271
+ config: CONFIG_WITH_BUTTON,
272
+ onFullEdit: ON_CHANGE,
273
+ onDelete: ON_DELETE,
274
+ masterPage: MASTER_PAGE,
275
+ getComponentRow: getComponentRow
276
+ })),
277
+ container = _renderWithValidation5.container;
278
+ var listViewDiv = container.querySelector('.govuk-summary-card');
279
+ expect(listViewDiv).not.toBeNull();
280
+
281
+ // Check for update button
282
+ var changeButton = listViewDiv.querySelector('.hods-button');
283
+ expect(changeButton.classList).toContain('hods-button--primary');
284
+ expect(changeButton.textContent).toEqual(CONFIG_WITH_BUTTON.changeAction.label);
285
+ expect(changeButton.getAttribute('aria-label')).toEqual("".concat(CONFIG_WITH_BUTTON.changeAction.label, " ").concat(CONFIG_WITH_BUTTON.title));
286
+ _react.fireEvent.click(changeButton, {});
287
+ expect(onChangeCalls).toEqual(1);
288
+ expect(onChangeArgs[0]).toMatchObject({
289
+ page: CONFIG_WITH_BUTTON.changeAction.page,
290
+ id: ENTRY.id
291
+ });
292
+ });
260
293
  });
261
294
  });
@@ -7,6 +7,7 @@ exports.default = void 0;
7
7
  // eslint-disable-next-line no-control-regex
8
8
  // const EMAIL_REGEX = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/i;
9
9
  var HODS_EMAIL_REGEX = /^[a-z0-9._\-']+@(digital\.)?homeoffice.gov.uk$/i;
10
+ var JMSC_EMAIL_REGEX = /^[a-z0-9._\-']+@jmsc.gov.uk$/i;
10
11
 
11
12
  /**
12
13
  * Validates an email address, ensuring it is in the correct domain and
@@ -26,7 +27,7 @@ var validateEmail = function validateEmail(value) {
26
27
  if (!!value) {
27
28
  var name = label ? label.toLowerCase() : 'email address';
28
29
  if (typeof value === 'string') {
29
- if (HODS_EMAIL_REGEX.test(value)) {
30
+ if (HODS_EMAIL_REGEX.test(value) || JMSC_EMAIL_REGEX.test(value)) {
30
31
  return undefined;
31
32
  }
32
33
  }
@@ -14,6 +14,9 @@ describe('utils', function () {
14
14
  it('should return no error when the value is a valid .gov.uk address', function () {
15
15
  expect((0, _validateEmail.default)('alpha@homeoffice.gov.uk', LABEL)).toBeUndefined();
16
16
  });
17
+ it('should return no error when the value is a valid jmsc.gov.uk address', function () {
18
+ expect((0, _validateEmail.default)('alpha@jmsc.gov.uk', LABEL)).toBeUndefined();
19
+ });
17
20
  it('should return no error when the value is a capitalised digital.homeoffice.gov.uk address', function () {
18
21
  expect((0, _validateEmail.default)('ALPHA.BRAVO@DIGITAL.HOMEOFFICE.GOV.UK', LABEL)).toBeUndefined();
19
22
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "5.91.1",
3
+ "version": "5.93.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",