@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.
- package/LICENSE +21 -0
- package/README.md +12 -0
- package/dist/components/CheckYourAnswers/CheckYourAnswers.js +16 -5
- package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +199 -79
- package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +44 -0
- package/dist/components/FormComponent/FormComponent.js +6 -1
- package/dist/components/FormComponent/FormComponent.test.js +67 -0
- package/dist/components/FormRenderer/FormRenderer.js +122 -11
- package/dist/components/FormRenderer/FormRenderer.stories.mdx +115 -49
- package/dist/components/FormRenderer/FormRenderer.test.js +275 -0
- package/dist/components/FormRenderer/helpers/getNextPageId.js +3 -0
- package/dist/components/FormRenderer/helpers/getNextPageId.test.js +6 -0
- package/dist/components/FormRenderer/helpers/getPage.js +1 -1
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +18 -1
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +44 -6
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +50 -0
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +122 -0
- package/dist/components/FormRenderer/helpers/index.js +7 -1
- package/dist/components/SummaryList/SummaryList.js +7 -4
- package/dist/components/SummaryList/SummaryList.scss +10 -2
- package/dist/components/SummaryList/SummaryList.stories.mdx +64 -10
- package/dist/components/SummaryList/SummaryList.test.js +54 -0
- package/dist/components/TaskList/Task.js +83 -0
- package/dist/components/TaskList/Task.test.js +112 -0
- package/dist/components/TaskList/TaskList.js +112 -0
- package/dist/components/TaskList/TaskList.scss +70 -0
- package/dist/components/TaskList/TaskList.stories.mdx +57 -0
- package/dist/components/TaskList/TaskList.test.js +223 -0
- package/dist/components/TaskList/TaskState.js +42 -0
- package/dist/components/TaskList/TaskState.test.js +99 -0
- package/dist/components/TaskList/index.js +13 -0
- package/dist/hooks/useHooks.js +5 -1
- package/dist/index.js +8 -0
- package/dist/json/taskList.json +228 -0
- package/dist/json/userProfile.data.json +2 -1
- package/dist/models/ComponentTypes.js +3 -1
- package/dist/models/FormTypes.js +2 -0
- package/dist/models/HubFormats.js +3 -1
- package/dist/models/PageAction.js +5 -0
- package/dist/models/TaskStates.js +41 -0
- package/dist/models/index.js +8 -0
- package/dist/utils/Component/cleanAttributes.js +1 -1
- package/dist/utils/Component/getComponent.js +26 -0
- package/dist/utils/Component/isEditable.js +1 -1
- package/dist/utils/FormPage/getPageActions.js +6 -0
- package/dist/utils/Hub/getFormHub.js +4 -0
- package/dist/utils/Hub/getFormHub.test.js +10 -2
- package/dist/utils/Validate/additional/index.js +55 -0
- package/dist/utils/Validate/additional/index.test.js +69 -0
- package/dist/utils/Validate/additional/mustBeAfter.js +37 -0
- package/dist/utils/Validate/additional/mustBeAfter.test.js +98 -0
- package/dist/utils/Validate/additional/mustBeBefore.js +35 -0
- package/dist/utils/Validate/additional/mustBeBefore.test.js +66 -0
- package/dist/utils/Validate/additional/mustBeInTheFuture.js +42 -0
- package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +34 -0
- package/dist/utils/Validate/additional/mustBeInThePast.js +44 -0
- package/dist/utils/Validate/additional/mustBeInThePast.test.js +34 -0
- package/dist/utils/Validate/additional/utils.js +66 -0
- package/dist/utils/Validate/validateComponent.js +38 -1
- package/dist/utils/Validate/validateComponent.test.js +48 -2
- package/dist/utils/Validate/validateDate.js +144 -0
- package/dist/utils/Validate/validateDate.test.js +112 -0
- package/dist/utils/Validate/validateRequired.js +11 -0
- package/dist/utils/Validate/validateRequired.test.js +12 -0
- package/dist/utils/Validate/validateTime.js +76 -0
- package/dist/utils/Validate/validateTime.test.js +55 -0
- 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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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;
|