@ukhomeoffice/cop-react-form-renderer 2.0.0 → 2.5.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/components/CheckYourAnswers/CheckYourAnswers.js +16 -5
  4. package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +199 -79
  5. package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +44 -0
  6. package/dist/components/FormComponent/FormComponent.js +6 -1
  7. package/dist/components/FormComponent/FormComponent.test.js +67 -0
  8. package/dist/components/FormRenderer/FormRenderer.js +122 -11
  9. package/dist/components/FormRenderer/FormRenderer.stories.mdx +115 -49
  10. package/dist/components/FormRenderer/FormRenderer.test.js +275 -0
  11. package/dist/components/FormRenderer/helpers/getNextPageId.js +3 -0
  12. package/dist/components/FormRenderer/helpers/getNextPageId.test.js +6 -0
  13. package/dist/components/FormRenderer/helpers/getPage.js +1 -1
  14. package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +18 -1
  15. package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +44 -6
  16. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +50 -0
  17. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +122 -0
  18. package/dist/components/FormRenderer/helpers/index.js +7 -1
  19. package/dist/components/SummaryList/SummaryList.js +7 -4
  20. package/dist/components/SummaryList/SummaryList.scss +10 -2
  21. package/dist/components/SummaryList/SummaryList.stories.mdx +64 -10
  22. package/dist/components/SummaryList/SummaryList.test.js +54 -0
  23. package/dist/components/TaskList/Task.js +83 -0
  24. package/dist/components/TaskList/Task.test.js +112 -0
  25. package/dist/components/TaskList/TaskList.js +112 -0
  26. package/dist/components/TaskList/TaskList.scss +70 -0
  27. package/dist/components/TaskList/TaskList.stories.mdx +57 -0
  28. package/dist/components/TaskList/TaskList.test.js +223 -0
  29. package/dist/components/TaskList/TaskState.js +42 -0
  30. package/dist/components/TaskList/TaskState.test.js +99 -0
  31. package/dist/components/TaskList/index.js +13 -0
  32. package/dist/hooks/useHooks.js +5 -1
  33. package/dist/index.js +8 -0
  34. package/dist/json/taskList.json +228 -0
  35. package/dist/json/userProfile.data.json +2 -1
  36. package/dist/models/ComponentTypes.js +3 -1
  37. package/dist/models/FormTypes.js +2 -0
  38. package/dist/models/HubFormats.js +3 -1
  39. package/dist/models/PageAction.js +5 -0
  40. package/dist/models/TaskStates.js +41 -0
  41. package/dist/models/index.js +8 -0
  42. package/dist/utils/Component/cleanAttributes.js +1 -1
  43. package/dist/utils/Component/getComponent.js +26 -0
  44. package/dist/utils/Component/isEditable.js +1 -1
  45. package/dist/utils/FormPage/getPageActions.js +6 -0
  46. package/dist/utils/Hub/getFormHub.js +4 -0
  47. package/dist/utils/Hub/getFormHub.test.js +10 -2
  48. package/dist/utils/Validate/additional/index.js +55 -0
  49. package/dist/utils/Validate/additional/index.test.js +69 -0
  50. package/dist/utils/Validate/additional/mustBeAfter.js +37 -0
  51. package/dist/utils/Validate/additional/mustBeAfter.test.js +98 -0
  52. package/dist/utils/Validate/additional/mustBeBefore.js +35 -0
  53. package/dist/utils/Validate/additional/mustBeBefore.test.js +66 -0
  54. package/dist/utils/Validate/additional/mustBeInTheFuture.js +42 -0
  55. package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +34 -0
  56. package/dist/utils/Validate/additional/mustBeInThePast.js +44 -0
  57. package/dist/utils/Validate/additional/mustBeInThePast.test.js +34 -0
  58. package/dist/utils/Validate/additional/utils.js +66 -0
  59. package/dist/utils/Validate/validateComponent.js +38 -1
  60. package/dist/utils/Validate/validateComponent.test.js +48 -2
  61. package/dist/utils/Validate/validateDate.js +144 -0
  62. package/dist/utils/Validate/validateDate.test.js +112 -0
  63. package/dist/utils/Validate/validateRequired.js +11 -0
  64. package/dist/utils/Validate/validateRequired.test.js +12 -0
  65. package/dist/utils/Validate/validateTime.js +76 -0
  66. package/dist/utils/Validate/validateTime.test.js +55 -0
  67. package/package.json +3 -2
@@ -18,6 +18,8 @@ var _models = require("../../models");
18
18
 
19
19
  var _CheckYourAnswers = require("../CheckYourAnswers/CheckYourAnswers");
20
20
 
21
+ var _TaskList = require("../TaskList/TaskList");
22
+
21
23
  var _FormRenderer = _interopRequireWildcard(require("./FormRenderer"));
22
24
 
23
25
  var _areYouACivilServant = _interopRequireDefault(require("../../json/areYouACivilServant.json"));
@@ -30,6 +32,8 @@ var _userProfileData = _interopRequireDefault(require("../../json/userProfile.da
30
32
 
31
33
  var _userProfile = _interopRequireDefault(require("../../json/userProfile.json"));
32
34
 
35
+ var _taskList = _interopRequireDefault(require("../../json/taskList.json"));
36
+
33
37
  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); }
34
38
 
35
39
  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; }
@@ -467,5 +471,276 @@ describe('components', function () {
467
471
  }
468
472
  }, _callee12);
469
473
  })));
474
+ it('should show no title when hide_title is set to true', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee14() {
475
+ var form, hub;
476
+ return regeneratorRuntime.wrap(function _callee14$(_context14) {
477
+ while (1) {
478
+ switch (_context14.prev = _context14.next) {
479
+ case 0:
480
+ _context14.next = 2;
481
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13() {
482
+ return regeneratorRuntime.wrap(function _callee13$(_context13) {
483
+ while (1) {
484
+ switch (_context13.prev = _context13.next) {
485
+ case 0:
486
+ (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
487
+ data: _userProfileData.default,
488
+ hide_title: true
489
+ })), container);
490
+
491
+ case 1:
492
+ case "end":
493
+ return _context13.stop();
494
+ }
495
+ }
496
+ }, _callee13);
497
+ })));
498
+
499
+ case 2:
500
+ form = checkForm(container);
501
+ expect(form.childNodes.length).toEqual(1); //Hub page (= CYA)
502
+
503
+ hub = form.childNodes[0];
504
+ expect(hub.tagName).toEqual('DIV');
505
+ expect(hub.classList).toContain(_CheckYourAnswers.DEFAULT_CLASS);
506
+
507
+ case 7:
508
+ case "end":
509
+ return _context14.stop();
510
+ }
511
+ }
512
+ }, _callee14);
513
+ })));
514
+ it('should render a tasklist', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee16() {
515
+ var taskList;
516
+ return regeneratorRuntime.wrap(function _callee16$(_context16) {
517
+ while (1) {
518
+ switch (_context16.prev = _context16.next) {
519
+ case 0:
520
+ _context16.next = 2;
521
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee15() {
522
+ return regeneratorRuntime.wrap(function _callee15$(_context15) {
523
+ while (1) {
524
+ switch (_context15.prev = _context15.next) {
525
+ case 0:
526
+ (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _taskList.default), container);
527
+
528
+ case 1:
529
+ case "end":
530
+ return _context15.stop();
531
+ }
532
+ }
533
+ }, _callee15);
534
+ })));
535
+
536
+ case 2:
537
+ taskList = container.childNodes[0].childNodes[1];
538
+ expect(taskList.classList).toContain(_TaskList.DEFAULT_CLASS);
539
+
540
+ case 4:
541
+ case "end":
542
+ return _context16.stop();
543
+ }
544
+ }
545
+ }, _callee16);
546
+ })));
547
+ it('should handle navigating between task list pages', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee18() {
548
+ var ON_SUBMIT_CALLS, ON_SUBMIT, HOOKS, taskList, firstTaskStatus, secondTaskStatus, firstTask, newPage, continueButton, cyaPage, finalSubmit;
549
+ return regeneratorRuntime.wrap(function _callee18$(_context18) {
550
+ while (1) {
551
+ switch (_context18.prev = _context18.next) {
552
+ case 0:
553
+ ON_SUBMIT_CALLS = [];
554
+
555
+ ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
556
+ ON_SUBMIT_CALLS.push(payload);
557
+ onSuccess();
558
+ };
559
+
560
+ HOOKS = {
561
+ onSubmit: ON_SUBMIT
562
+ };
563
+ _context18.next = 5;
564
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee17() {
565
+ return regeneratorRuntime.wrap(function _callee17$(_context17) {
566
+ while (1) {
567
+ switch (_context17.prev = _context17.next) {
568
+ case 0:
569
+ (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _taskList.default, {
570
+ hooks: HOOKS
571
+ })), container);
572
+
573
+ case 1:
574
+ case "end":
575
+ return _context17.stop();
576
+ }
577
+ }
578
+ }, _callee17);
579
+ })));
580
+
581
+ case 5:
582
+ taskList = container.childNodes[0].childNodes[1]; //Check status's are correct
583
+
584
+ firstTaskStatus = taskList.childNodes[4].childNodes[0].childNodes[1];
585
+ expect(firstTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.NOT_STARTED].label);
586
+ secondTaskStatus = taskList.childNodes[4].childNodes[1].childNodes[1];
587
+ expect(secondTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.CANNOT_START_YET].label); //Launch first task
588
+
589
+ firstTask = taskList.childNodes[4].childNodes[0].childNodes[0].childNodes[0];
590
+ expect(firstTask.textContent).toEqual('Date, location and mode details');
591
+
592
+ _react.fireEvent.click(firstTask, {}); //Fill first page and navigate
593
+
594
+
595
+ newPage = container.childNodes[0].childNodes[0];
596
+ expect(newPage.childNodes[0].textContent).toEqual('Event Date');
597
+
598
+ _react.fireEvent.change(newPage.childNodes[1].childNodes[2].childNodes[0].childNodes[1], {
599
+ target: {
600
+ name: 'date-day',
601
+ value: '7'
602
+ }
603
+ });
604
+
605
+ _react.fireEvent.change(newPage.childNodes[1].childNodes[2].childNodes[1].childNodes[1], {
606
+ target: {
607
+ name: 'date-month',
608
+ value: '7'
609
+ }
610
+ });
611
+
612
+ _react.fireEvent.change(newPage.childNodes[1].childNodes[2].childNodes[2].childNodes[1], {
613
+ target: {
614
+ name: 'date-year',
615
+ value: '2022'
616
+ }
617
+ });
618
+
619
+ continueButton = newPage.childNodes[2].childNodes[0];
620
+
621
+ _react.fireEvent.click(continueButton, {}); //Fill second page and navigate
622
+
623
+
624
+ newPage = container.childNodes[0].childNodes[0];
625
+ expect(newPage.childNodes[0].textContent).toEqual('Event Mode');
626
+
627
+ _react.fireEvent.click(newPage.childNodes[1].childNodes[2].childNodes[0].childNodes[0], {});
628
+
629
+ continueButton = newPage.childNodes[2].childNodes[0];
630
+
631
+ _react.fireEvent.click(continueButton, {}); //Continue on from CYA page
632
+
633
+
634
+ cyaPage = container.childNodes[0].childNodes[0];
635
+ expect(cyaPage.childNodes[0].textContent).toEqual('Check your answers');
636
+ expect(cyaPage.childNodes[5].textContent).toEqual('Submit');
637
+
638
+ _react.fireEvent.click(cyaPage.childNodes[5].childNodes[0], {}); //Should be back at task list
639
+
640
+
641
+ expect(container.childNodes[0].childNodes[0].textContent).toEqual('Event at the border'); //Check status's are correct
642
+
643
+ firstTaskStatus = container.childNodes[0].childNodes[1].childNodes[4].childNodes[0].childNodes[1];
644
+ expect(firstTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.COMPLETE].label);
645
+ secondTaskStatus = container.childNodes[0].childNodes[1].childNodes[4].childNodes[1].childNodes[1];
646
+ expect(secondTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.NOT_STARTED].label); //Check final data submitted to backend is as expected
647
+
648
+ finalSubmit = ON_SUBMIT_CALLS[ON_SUBMIT_CALLS.length - 1];
649
+ expect(finalSubmit.date).toEqual('7-7-2022');
650
+ expect(finalSubmit.mode).toEqual('sea');
651
+ expect(finalSubmit.formStatus.tasks['Date, location and mode details'].complete).toEqual(true);
652
+
653
+ case 38:
654
+ case "end":
655
+ return _context18.stop();
656
+ }
657
+ }
658
+ }, _callee18);
659
+ })));
660
+ it('should go straight to CYA page if a complete task is selected', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee20() {
661
+ var ON_SUBMIT, HOOKS, taskList, newPage;
662
+ return regeneratorRuntime.wrap(function _callee20$(_context20) {
663
+ while (1) {
664
+ switch (_context20.prev = _context20.next) {
665
+ case 0:
666
+ ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
667
+ onSuccess();
668
+ };
669
+
670
+ HOOKS = {
671
+ onSubmit: ON_SUBMIT
672
+ };
673
+ _context20.next = 4;
674
+ return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee19() {
675
+ return regeneratorRuntime.wrap(function _callee19$(_context19) {
676
+ while (1) {
677
+ switch (_context19.prev = _context19.next) {
678
+ case 0:
679
+ (0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _taskList.default, {
680
+ hooks: HOOKS
681
+ })), container);
682
+
683
+ case 1:
684
+ case "end":
685
+ return _context19.stop();
686
+ }
687
+ }
688
+ }, _callee19);
689
+ })));
690
+
691
+ case 4:
692
+ taskList = container.childNodes[0].childNodes[1]; //Launch first task
693
+
694
+ _react.fireEvent.click(taskList.childNodes[4].childNodes[0].childNodes[0].childNodes[0], {}); //Fill first page and navigate
695
+
696
+
697
+ newPage = container.childNodes[0].childNodes[0];
698
+
699
+ _react.fireEvent.change(newPage.childNodes[1].childNodes[2].childNodes[0].childNodes[1], {
700
+ target: {
701
+ name: 'date-day',
702
+ value: '7'
703
+ }
704
+ });
705
+
706
+ _react.fireEvent.change(newPage.childNodes[1].childNodes[2].childNodes[1].childNodes[1], {
707
+ target: {
708
+ name: 'date-month',
709
+ value: '7'
710
+ }
711
+ });
712
+
713
+ _react.fireEvent.change(newPage.childNodes[1].childNodes[2].childNodes[2].childNodes[1], {
714
+ target: {
715
+ name: 'date-year',
716
+ value: '2022'
717
+ }
718
+ });
719
+
720
+ _react.fireEvent.click(newPage.childNodes[2].childNodes[0], {}); //Fill second page and navigate
721
+
722
+
723
+ newPage = container.childNodes[0].childNodes[0];
724
+
725
+ _react.fireEvent.click(newPage.childNodes[1].childNodes[2].childNodes[0].childNodes[0], {});
726
+
727
+ _react.fireEvent.click(newPage.childNodes[2].childNodes[0], {}); //Continue on from CYA page
728
+
729
+
730
+ _react.fireEvent.click(container.childNodes[0].childNodes[0].childNodes[5].childNodes[0], {}); //Launch same task again
731
+
732
+
733
+ _react.fireEvent.click(container.childNodes[0].childNodes[1].childNodes[4].childNodes[0].childNodes[0].childNodes[0], {}); //Should be at CYA page
734
+
735
+
736
+ expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Check your answers');
737
+
738
+ case 17:
739
+ case "end":
740
+ return _context20.stop();
741
+ }
742
+ }
743
+ }, _callee20);
744
+ })));
470
745
  });
471
746
  });
@@ -60,6 +60,9 @@ var getNextPageId = function getNextPageId(formType, pages, currentPageId, actio
60
60
  case _models.FormTypes.CYA:
61
61
  return getNextCYAPageId(pages, currentPageId, formData);
62
62
 
63
+ case _models.FormTypes.TASK:
64
+ return getNextHubPageId(action);
65
+
63
66
  case _models.FormTypes.WIZARD:
64
67
  return getNextWizardPageId(pages, currentPageId, formData);
65
68
 
@@ -166,6 +166,12 @@ describe('components', function () {
166
166
  expect((0, _getNextPageId.default)(FORM_TYPE, [])).toBeUndefined();
167
167
  });
168
168
  });
169
+ describe("when the form type is '".concat(_models.FormTypes.TASK, "'"), function () {
170
+ var FORM_TYPE = _models.FormTypes.TASK;
171
+ it("should return '".concat(_models.FormPages.HUB, "' by default"), function () {
172
+ expect((0, _getNextPageId.default)(FORM_TYPE, PAGES)).toEqual(_models.FormPages.HUB);
173
+ });
174
+ });
169
175
  });
170
176
  });
171
177
  });
@@ -19,7 +19,7 @@ var _models = require("../../../models");
19
19
  var getPage = function getPage(pageId, pages, hub) {
20
20
  if (pageId) {
21
21
  if (pageId === _models.FormPages.HUB) {
22
- return hub === _models.HubFormats.CYA ? undefined : hub;
22
+ return hub === _models.HubFormats.CYA || hub === _models.HubFormats.TASK ? undefined : hub;
23
23
  }
24
24
 
25
25
  return pages.find(function (p) {
@@ -11,7 +11,24 @@ var _getNextPageId = _interopRequireDefault(require("./getNextPageId"));
11
11
 
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
 
14
- var getSubmissionStatus = function getSubmissionStatus(formType, pages, currentPageId, action, formData) {
14
+ var getSubmissionStatus = function getSubmissionStatus(formType, pages, currentPageId, action, formData, currentTask) {
15
+ if (formType === _models.FormTypes.TASK) {
16
+ var formStatus = formData.formStatus ? formData.formStatus : {};
17
+ formStatus.tasks = formStatus.tasks ? formStatus.tasks : {};
18
+ formStatus.tasks[currentTask.name] = formStatus.tasks[currentTask.name] ? formStatus.tasks[currentTask.name] : {};
19
+
20
+ if (currentPageId === _models.FormPages.CYA) {
21
+ formStatus.tasks[currentTask.name].complete = true;
22
+ } else {
23
+ formStatus.tasks[currentTask.name] = {
24
+ complete: false,
25
+ currentPage: action.page
26
+ };
27
+ }
28
+
29
+ return formStatus;
30
+ }
31
+
15
32
  if ((action === null || action === void 0 ? void 0 : action.type) === _models.PageAction.TYPES.SAVE_AND_RETURN) {
16
33
  return {
17
34
  page: currentPageId
@@ -2,11 +2,14 @@
2
2
 
3
3
  var _models = require("../../../models");
4
4
 
5
+ var _PageAction = require("../../../models/PageAction");
6
+
5
7
  var _getSubmissionStatus = _interopRequireDefault(require("./getSubmissionStatus"));
6
8
 
7
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
10
 
9
- // Local imports
11
+ 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; }
12
+
10
13
  describe('components', function () {
11
14
  describe('FormRenderer', function () {
12
15
  describe('helpers', function () {
@@ -100,12 +103,14 @@ describe('components', function () {
100
103
  });
101
104
  describe("when the action type is '".concat(_models.PageAction.TYPES.SAVE_AND_RETURN, "'"), function () {
102
105
  Object.values(_models.FormTypes).forEach(function (formType) {
103
- it("should return the current page if the form type is '".concat(formType, "'"), function () {
104
- var ACTION = _models.PageAction.DEFAULTS.saveAndReturn;
105
- expect((0, _getSubmissionStatus.default)(formType, PAGES, PAGES[0].id, ACTION, FORM_DATA)).toMatchObject({
106
- page: PAGES[0].id
106
+ if (formType !== _models.FormTypes.TASK) {
107
+ it("should return the current page if the form type is '".concat(formType, "'"), function () {
108
+ var ACTION = _models.PageAction.DEFAULTS.saveAndReturn;
109
+ expect((0, _getSubmissionStatus.default)(formType, PAGES, PAGES[0].id, ACTION, FORM_DATA)).toMatchObject({
110
+ page: PAGES[0].id
111
+ });
107
112
  });
108
- });
113
+ }
109
114
  });
110
115
  });
111
116
  describe("when the form type is '".concat(_models.FormTypes.HUB, "'"), function () {
@@ -203,6 +208,39 @@ describe('components', function () {
203
208
  });
204
209
  });
205
210
  });
211
+ describe("when the form type is '".concat(_models.FormTypes.TASK, "'"), function () {
212
+ var FORM_TYPE = _models.FormTypes.TASK;
213
+ it("should mark the current task as complete if the current page is '".concat(_models.FormPages.CYA, "'"), function () {
214
+ var CURRENT_PAGE_ID = _models.FormPages.CYA;
215
+ var TASK_NAME = 'taskName';
216
+ var CURRENT_TASK = {
217
+ name: TASK_NAME
218
+ };
219
+ expect((0, _getSubmissionStatus.default)(FORM_TYPE, PAGES, CURRENT_PAGE_ID, undefined, {}, CURRENT_TASK)).toMatchObject({
220
+ tasks: _defineProperty({}, TASK_NAME, {
221
+ complete: true
222
+ })
223
+ });
224
+ });
225
+ it("should update the current task with the next page and a false complete flag if the current page is not '".concat(_models.FormPages.CYA, "'"), function () {
226
+ var CURRENT_PAGE_ID = 'eventDate';
227
+ var TASK_NAME = 'taskName';
228
+ var CURRENT_TASK = {
229
+ name: TASK_NAME
230
+ };
231
+ var NEXT_PAGE_ID = 'eventMode';
232
+ var ACTION = {
233
+ type: _PageAction.PageActionTypes.SAVE_AND_NAVIGATE,
234
+ page: NEXT_PAGE_ID
235
+ };
236
+ expect((0, _getSubmissionStatus.default)(FORM_TYPE, PAGES, CURRENT_PAGE_ID, ACTION, {}, CURRENT_TASK)).toMatchObject({
237
+ tasks: _defineProperty({}, TASK_NAME, {
238
+ complete: false,
239
+ currentPage: NEXT_PAGE_ID
240
+ })
241
+ });
242
+ });
243
+ });
206
244
  });
207
245
  });
208
246
  });
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _models = require("../../../models");
9
+
10
+ /**
11
+ * Updates the given task list sections with the latest states
12
+ * @param {object} sections The JSON defining the sections in the task list
13
+ * @param {object} tasks object with entry for each task containing currentPage and complete boolean flag
14
+ * {
15
+ "TaskName": {
16
+ "complete": true,
17
+ "currentPage": "pageId"
18
+ }
19
+ }
20
+ * @returns An JSON representation of the task list sections with up to date states
21
+ */
22
+ var getUpdatedSectionStates = function getUpdatedSectionStates(sections, tasks) {
23
+ return sections.map(function (section, sectionIndex, sectionArray) {
24
+ return section.tasks.map(function (task, taskIndex, taskArray) {
25
+ if (tasks[task.name]) {
26
+ if (tasks[task.name].complete) {
27
+ task.state = _models.TaskStates.TYPES.COMPLETE;
28
+ } else if (tasks[task.name].currentPage) {
29
+ task.state = _models.TaskStates.TYPES.IN_PROGRESS;
30
+ }
31
+ } else {
32
+ var _taskArray, _sectionArray, _sectionArray$tasks$s;
33
+
34
+ if (taskIndex === 0 && sectionIndex === 0 || //First task in tasklist
35
+ ((_taskArray = taskArray[taskIndex - 1]) === null || _taskArray === void 0 ? void 0 : _taskArray.state) === _models.TaskStates.TYPES.COMPLETE || //any task after a complete task in same section
36
+ taskIndex === 0 && ((_sectionArray = sectionArray[sectionIndex - 1]) === null || _sectionArray === void 0 ? void 0 : (_sectionArray$tasks$s = _sectionArray.tasks.slice(-1)[0]) === null || _sectionArray$tasks$s === void 0 ? void 0 : _sectionArray$tasks$s.state) === _models.TaskStates.TYPES.COMPLETE //any task after a complete task in the preceeding section
37
+ ) {
38
+ task.state = _models.TaskStates.TYPES.NOT_STARTED;
39
+ } else {
40
+ task.state = _models.TaskStates.TYPES.CANNOT_START_YET;
41
+ }
42
+ }
43
+
44
+ return task;
45
+ });
46
+ });
47
+ };
48
+
49
+ var _default = getUpdatedSectionStates;
50
+ exports.default = _default;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ var _getUpdatedSectionStates = _interopRequireDefault(require("./getUpdatedSectionStates"));
4
+
5
+ var _models = require("../../../models");
6
+
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
9
+ // Local imports
10
+ describe('components', function () {
11
+ describe('FormRenderer', function () {
12
+ describe('helpers', function () {
13
+ describe('getUpdatedSectionStates', function () {
14
+ it("should set all tasks to '".concat(_models.TaskStates.TYPES.CANNOT_START_YET, "' excluding the first which should be '").concat(_models.TaskStates.TYPES.NOT_STARTED, "'"), function () {
15
+ var SECTIONS = [{
16
+ name: 'Add event details',
17
+ tasks: [{
18
+ name: 'Date, location and mode details',
19
+ pages: ['eventDate', 'eventMode']
20
+ }, {
21
+ name: 'Officer and agency details',
22
+ pages: ['officeDetails']
23
+ }]
24
+ }, {
25
+ name: 'Add people details',
26
+ tasks: [{
27
+ name: 'People details',
28
+ pages: ['firstName', 'surname']
29
+ }, {
30
+ name: 'Immigration details',
31
+ pages: ['immigrationDate']
32
+ }, {
33
+ name: 'Journey details',
34
+ pages: ['journeyDetails']
35
+ }]
36
+ }];
37
+ var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, {});
38
+ expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED);
39
+ expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
40
+ expect(updatedSections[1][0].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
41
+ expect(updatedSections[1][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
42
+ expect(updatedSections[1][2].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
43
+ });
44
+ it("should set tasks after any '".concat(_models.TaskStates.TYPES.COMPLETE, "' ones to '").concat(_models.TaskStates.TYPES.NOT_STARTED, "'"), function () {
45
+ var SECTIONS = [{
46
+ name: 'Add event details',
47
+ tasks: [{
48
+ name: 'Date, location and mode details',
49
+ pages: ['eventDate', 'eventMode']
50
+ }, {
51
+ name: 'Officer and agency details',
52
+ pages: ['officeDetails']
53
+ }]
54
+ }];
55
+ var TASKS = {
56
+ 'Date, location and mode details': {
57
+ complete: true
58
+ }
59
+ };
60
+ var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS);
61
+ expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.COMPLETE);
62
+ expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED);
63
+ });
64
+ it("should set tasks after any '".concat(_models.TaskStates.TYPES.COMPLETE, "' ones to '").concat(_models.TaskStates.TYPES.NOT_STARTED, " across different sections'"), function () {
65
+ var SECTIONS = [{
66
+ name: 'Add event details',
67
+ tasks: [{
68
+ name: 'Date, location and mode details',
69
+ pages: ['eventDate', 'eventMode']
70
+ }, {
71
+ name: 'Officer and agency details',
72
+ pages: ['officeDetails']
73
+ }]
74
+ }, {
75
+ name: 'Add people details',
76
+ tasks: [{
77
+ name: 'People details',
78
+ pages: ['firstName', 'surname']
79
+ }, {
80
+ name: 'Immigration details',
81
+ pages: ['immigrationDate']
82
+ }]
83
+ }];
84
+ var TASKS = {
85
+ 'Date, location and mode details': {
86
+ complete: true
87
+ },
88
+ 'Officer and agency details': {
89
+ complete: true
90
+ }
91
+ };
92
+ var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS);
93
+ expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.COMPLETE);
94
+ expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.COMPLETE);
95
+ expect(updatedSections[1][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED);
96
+ expect(updatedSections[1][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
97
+ });
98
+ it("should set tasks to '".concat(_models.TaskStates.TYPES.IN_PROGRESS, "' if they have a current page but are not complete"), function () {
99
+ var SECTIONS = [{
100
+ name: 'Add event details',
101
+ tasks: [{
102
+ name: 'Date, location and mode details',
103
+ pages: ['eventDate', 'eventMode']
104
+ }, {
105
+ name: 'Officer and agency details',
106
+ pages: ['officeDetails']
107
+ }]
108
+ }];
109
+ var TASKS = {
110
+ 'Date, location and mode details': {
111
+ complete: false,
112
+ currentPage: 'eventMode'
113
+ }
114
+ };
115
+ var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS);
116
+ expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.IN_PROGRESS);
117
+ expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
118
+ });
119
+ });
120
+ });
121
+ });
122
+ });
@@ -13,8 +13,12 @@ var _getFormState = _interopRequireDefault(require("./getFormState"));
13
13
 
14
14
  var _getNextPageId = _interopRequireDefault(require("./getNextPageId"));
15
15
 
16
+ var _getPage = _interopRequireDefault(require("./getPage"));
17
+
16
18
  var _getSubmissionStatus = _interopRequireDefault(require("./getSubmissionStatus"));
17
19
 
20
+ var _getUpdatedSectionStates = _interopRequireDefault(require("./getUpdatedSectionStates"));
21
+
18
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
23
 
20
24
  // Local imports
@@ -23,7 +27,9 @@ var helpers = {
23
27
  canCYASubmit: _canCYASubmit.default,
24
28
  getFormState: _getFormState.default,
25
29
  getNextPageId: _getNextPageId.default,
26
- getSubmissionStatus: _getSubmissionStatus.default
30
+ getPage: _getPage.default,
31
+ getSubmissionStatus: _getSubmissionStatus.default,
32
+ getUpdatedSectionStates: _getUpdatedSectionStates.default
27
33
  };
28
34
  exports.helpers = helpers;
29
35
  var _default = helpers;
@@ -15,7 +15,7 @@ var _RowAction = _interopRequireDefault(require("./RowAction"));
15
15
 
16
16
  require("./SummaryList.scss");
17
17
 
18
- var _excluded = ["rows", "classBlock", "classModifiers", "className"];
18
+ var _excluded = ["rows", "noChangeAction", "classBlock", "classModifiers", "className"];
19
19
 
20
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
21
 
@@ -30,6 +30,7 @@ exports.DEFAULT_CLASS = DEFAULT_CLASS;
30
30
 
31
31
  var SummaryList = function SummaryList(_ref) {
32
32
  var rows = _ref.rows,
33
+ noChangeAction = _ref.noChangeAction,
33
34
  classBlock = _ref.classBlock,
34
35
  classModifiers = _ref.classModifiers,
35
36
  className = _ref.className,
@@ -47,7 +48,7 @@ var SummaryList = function SummaryList(_ref) {
47
48
  className: classes('key')
48
49
  }, row.key), /*#__PURE__*/_react.default.createElement("dd", {
49
50
  className: classes('value')
50
- }, row.value), /*#__PURE__*/_react.default.createElement("dd", {
51
+ }, row.value), !noChangeAction && /*#__PURE__*/_react.default.createElement("dd", {
51
52
  className: classes('actions')
52
53
  }, row.action && /*#__PURE__*/_react.default.createElement(_RowAction.default, {
53
54
  row: row
@@ -70,10 +71,12 @@ SummaryList.propTypes = {
70
71
  })).isRequired,
71
72
  classBlock: _propTypes.default.string,
72
73
  classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
73
- className: _propTypes.default.string
74
+ className: _propTypes.default.string,
75
+ noChangeAction: _propTypes.default.bool
74
76
  };
75
77
  SummaryList.defaultProps = {
76
- classBlock: DEFAULT_CLASS
78
+ classBlock: DEFAULT_CLASS,
79
+ noChangeAction: false
77
80
  };
78
81
  var _default = SummaryList;
79
82
  exports.default = _default;