@ukhomeoffice/cop-react-form-renderer 3.12.0 → 3.13.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.
@@ -250,9 +250,14 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
250
250
  }, [newPageId]); // Handle actions from pages.
251
251
 
252
252
  var onPageAction = function onPageAction(action, patch) {
253
- // Re-apply the patch to the page's formData.
253
+ if (action.type === _models.PageAction.TYPES.CANCEL) {
254
+ hooks.onCancel();
255
+ return;
256
+ } // Re-apply the patch to the page's formData.
254
257
  // This should normally have no effect but will prevent issues
255
258
  // with validation if formData happens to have been wiped.
259
+
260
+
256
261
  formState.page.formData = _objectSpread(_objectSpread({}, formState.page.formData), patch); // Check to see whether the action is able to proceed, which in
257
262
  // in the case of a submission will validate the fields in the page.
258
263
 
@@ -388,6 +393,10 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
388
393
  });
389
394
  }
390
395
  }
396
+
397
+ if (action.type === _models.PageAction.TYPES.CANCEL) {
398
+ hooks.onCancel();
399
+ }
391
400
  };
392
401
 
393
402
  var classes = _utils.default.classBuilder(classBlock, classModifiers, className);
@@ -99,6 +99,10 @@ describe('components', function () {
99
99
  return page.childNodes[page.childNodes.length - 1].childNodes[0].childNodes[0];
100
100
  };
101
101
 
102
+ var getCancelButton = function getCancelButton(page) {
103
+ return page.childNodes[page.childNodes.length - 1].childNodes[1].childNodes[0];
104
+ };
105
+
102
106
  it('should start on the hub page correctly and display the title', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
103
107
  var form, title, hub;
104
108
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
@@ -743,5 +747,66 @@ describe('components', function () {
743
747
  }
744
748
  }, _callee20);
745
749
  })));
750
+ it('should handle cancellation from a page', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee22() {
751
+ var ON_CANCEL_CALLS, ON_CANCEL, HOOKS, form, hub, _hub$childNodes5, civilServantList, link, page, cancel;
752
+
753
+ return regeneratorRuntime.wrap(function _callee22$(_context22) {
754
+ while (1) {
755
+ switch (_context22.prev = _context22.next) {
756
+ case 0:
757
+ ON_CANCEL_CALLS = [];
758
+
759
+ ON_CANCEL = function ON_CANCEL() {
760
+ ON_CANCEL_CALLS.push(undefined);
761
+ };
762
+
763
+ HOOKS = {
764
+ onCancel: ON_CANCEL
765
+ };
766
+ _context22.next = 5;
767
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee21() {
768
+ return regeneratorRuntime.wrap(function _callee21$(_context21) {
769
+ while (1) {
770
+ switch (_context21.prev = _context21.next) {
771
+ case 0:
772
+ (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
773
+ data: _userProfileData.default,
774
+ hooks: HOOKS
775
+ })), container);
776
+
777
+ case 1:
778
+ case "end":
779
+ return _context21.stop();
780
+ }
781
+ }
782
+ }, _callee21);
783
+ })));
784
+
785
+ case 5:
786
+ form = checkForm(container); // Navigate to the "Are you a civil servant?" page.
787
+
788
+ hub = form.childNodes[1]; // Hub = CYA
789
+
790
+ _hub$childNodes5 = _slicedToArray(hub.childNodes, 3), civilServantList = _hub$childNodes5[2];
791
+ link = getChangeLink(civilServantList);
792
+
793
+ _react.fireEvent.click(link, {}); // Should already be answered "Yes", so simply click "Continue".
794
+
795
+
796
+ page = form.childNodes[0];
797
+ cancel = getCancelButton(page);
798
+ expect(ON_CANCEL_CALLS.length).toEqual(0);
799
+
800
+ _react.fireEvent.click(cancel, {});
801
+
802
+ expect(ON_CANCEL_CALLS.length).toEqual(1);
803
+
804
+ case 15:
805
+ case "end":
806
+ return _context22.stop();
807
+ }
808
+ }
809
+ }, _callee22);
810
+ })));
746
811
  });
747
812
  });
@@ -45,7 +45,9 @@ var DEFAULT_HOOKS = {
45
45
  },
46
46
  onSubmit: function onSubmit(type, payload, onSuccess, onError) {
47
47
  if (typeof onSuccess === 'function') onSuccess();
48
- }
48
+ },
49
+ onCancel: function onCancel() {} // Consuming application must provide function to action, else this does nothing.
50
+
49
51
  };
50
52
  var ALLOWED_HOOKS = Object.keys(DEFAULT_HOOKS);
51
53
  exports.ALLOWED_HOOKS = ALLOWED_HOOKS;
@@ -62,7 +64,8 @@ var HooksContextProvider = function HooksContextProvider(_ref) {
62
64
  onGetComponent: (overrides === null || overrides === void 0 ? void 0 : overrides.onGetComponent) || DEFAULT_HOOKS.onGetComponent,
63
65
  onPageChange: (overrides === null || overrides === void 0 ? void 0 : overrides.onPageChange) || DEFAULT_HOOKS.onPageChange,
64
66
  onRequest: (overrides === null || overrides === void 0 ? void 0 : overrides.onRequest) || DEFAULT_HOOKS.onRequest,
65
- onSubmit: (overrides === null || overrides === void 0 ? void 0 : overrides.onSubmit) || DEFAULT_HOOKS.onSubmit
67
+ onSubmit: (overrides === null || overrides === void 0 ? void 0 : overrides.onSubmit) || DEFAULT_HOOKS.onSubmit,
68
+ onCancel: (overrides === null || overrides === void 0 ? void 0 : overrides.onCancel) || DEFAULT_HOOKS.onCancel
66
69
  }),
67
70
  _useState2 = _slicedToArray(_useState, 2),
68
71
  hooks = _useState2[0],
@@ -138,7 +138,7 @@
138
138
  "label": ""
139
139
  }
140
140
  ],
141
- "actions": ["submit"],
141
+ "actions": ["submit", "cancel"],
142
142
  "cya_link": {
143
143
  "page": "civil-servant-status",
144
144
  "aria_suffix": "civil servant status"
@@ -9,12 +9,14 @@ var _DefaultPageActions;
9
9
 
10
10
  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; }
11
11
 
12
+ var TYPE_CANCEL = 'cancel';
12
13
  var TYPE_NAVIGATE = 'navigate';
13
14
  var TYPE_SAVE_AND_CONTINUE = 'saveAndContinue';
14
15
  var TYPE_SAVE_AND_NAVIGATE = 'saveAndNavigate';
15
16
  var TYPE_SAVE_AND_RETURN = 'saveAndReturn';
16
17
  var TYPE_SUBMIT = 'submit';
17
18
  var PageActionTypes = {
19
+ CANCEL: TYPE_CANCEL,
18
20
  NAVIGATE: TYPE_NAVIGATE,
19
21
  SAVE_AND_CONTINUE: TYPE_SAVE_AND_CONTINUE,
20
22
  SAVE_AND_NAVIGATE: TYPE_SAVE_AND_NAVIGATE,
@@ -22,7 +24,12 @@ var PageActionTypes = {
22
24
  SUBMIT: TYPE_SUBMIT
23
25
  };
24
26
  exports.PageActionTypes = PageActionTypes;
25
- var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPageActions, TYPE_NAVIGATE, undefined), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_CONTINUE, {
27
+ var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPageActions, TYPE_CANCEL, {
28
+ type: TYPE_CANCEL,
29
+ validate: false,
30
+ label: 'Cancel',
31
+ classModifiers: 'secondary'
32
+ }), _defineProperty(_DefaultPageActions, TYPE_NAVIGATE, undefined), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_CONTINUE, {
26
33
  type: TYPE_SAVE_AND_CONTINUE,
27
34
  validate: true,
28
35
  label: 'Save and continue'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "3.12.0",
3
+ "version": "3.13.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",