@ukhomeoffice/cop-react-form-renderer 3.26.2 → 3.31.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 (26) hide show
  1. package/dist/components/CheckYourAnswers/CheckYourAnswers.js +5 -2
  2. package/dist/components/CollectionPage/CollectionPage.js +149 -0
  3. package/dist/components/CollectionPage/CollectionPage.test.js +428 -0
  4. package/dist/components/CollectionPage/index.js +13 -0
  5. package/dist/components/FormPage/FormPage.js +6 -1
  6. package/dist/components/FormRenderer/FormRenderer.js +62 -18
  7. package/dist/components/PageActions/ActionButton.js +1 -1
  8. package/dist/components/TaskList/TaskList.js +2 -2
  9. package/dist/components/TaskList/TaskList.scss +22 -4
  10. package/dist/models/PageAction.js +5 -1
  11. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +85 -0
  12. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +107 -0
  13. package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +6 -0
  14. package/dist/utils/CheckYourAnswers/showComponentCYA.js +4 -0
  15. package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +10 -0
  16. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +45 -0
  17. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +41 -0
  18. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +34 -0
  19. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +54 -0
  20. package/dist/utils/CollectionPage/index.js +23 -0
  21. package/dist/utils/CollectionPage/mergeCollectionPages.js +69 -0
  22. package/dist/utils/CollectionPage/mergeCollectionPages.test.js +131 -0
  23. package/dist/utils/Validate/validatePage.js +16 -2
  24. package/dist/utils/Validate/validatePage.test.js +352 -206
  25. package/dist/utils/index.js +3 -0
  26. package/package.json +2 -2
@@ -23,6 +23,8 @@ var _utils = _interopRequireDefault(require("../../utils"));
23
23
 
24
24
  var _CheckYourAnswers = _interopRequireDefault(require("../CheckYourAnswers"));
25
25
 
26
+ var _CollectionPage = _interopRequireDefault(require("../CollectionPage"));
27
+
26
28
  var _FormPage = _interopRequireDefault(require("../FormPage"));
27
29
 
28
30
  var _TaskList = _interopRequireDefault(require("../TaskList"));
@@ -191,7 +193,7 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
191
193
 
192
194
 
193
195
  (0, _react.useEffect)(function () {
194
- if (components && _pages && _data && (['load', 'submit'].includes(pagePoint) || viewOnly)) {
196
+ if (components && _pages && _data && (pagePoint === 'load' || viewOnly)) {
195
197
  var _data$formStatus;
196
198
 
197
199
  setData(_utils.default.Data.setupForm(_pages, components, _data));
@@ -289,11 +291,49 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
289
291
  if (_helpers.default.canActionProceed(action, formState.page, validate.page)) {
290
292
  patch = _helpers.default.cleanHiddenNestedData(patch, formState.page);
291
293
 
294
+ if (action.addToFormData) {
295
+ formState.page.formData[action.addToFormData.field] = action.addToFormData.value;
296
+ }
297
+
292
298
  if (action.type === _models.PageAction.TYPES.NAVIGATE) {
293
299
  _handlers.default.navigate(action, pageId, onPageChange);
294
300
  } else {
295
- if (action.type === 'submit') {
296
- setPagePoint('submit');
301
+ var pageUpdate = function pageUpdate(next) {
302
+ return onPageChange(_helpers.default.getNextPageId(type, pages, pageId, action, next));
303
+ };
304
+
305
+ switch (action.type) {
306
+ case _models.PageAction.TYPES.SUBMIT:
307
+ setPagePoint('end');
308
+ break;
309
+
310
+ case _models.PageAction.TYPES.SAVE_AND_NAVIGATE:
311
+ pageUpdate = function pageUpdate() {
312
+ return _handlers.default.navigate(action, pageId, onPageChange);
313
+ };
314
+
315
+ break;
316
+
317
+ case _models.PageAction.TYPES.COLLECTION_ADD:
318
+ formState.page.formData["".concat(action.collection, "ActiveId")] = Date.now().toString();
319
+
320
+ pageUpdate = function pageUpdate() {
321
+ return _handlers.default.navigate(action, pageId, onPageChange);
322
+ };
323
+
324
+ break;
325
+
326
+ case _models.PageAction.TYPES.COLLECTION_DUPLICATE:
327
+ if (_utils.default.CollectionPage.duplicateActiveEntry(action.collection, formState.page.formData)) {
328
+ pageUpdate = function pageUpdate() {
329
+ return _handlers.default.navigate(action, pageId, onPageChange);
330
+ };
331
+ }
332
+
333
+ break;
334
+
335
+ default:
336
+ break;
297
337
  } // Save draft or submit.
298
338
 
299
339
 
@@ -306,18 +346,6 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
306
346
 
307
347
  if (patch) {
308
348
  setData(submissionData);
309
- }
310
-
311
- var pageUpdate = function pageUpdate(next) {
312
- return onPageChange(_helpers.default.getNextPageId(type, pages, pageId, action, next));
313
- }; // const navigablePages = currentTask?.fullPages || pages;
314
- // let pageUpdate = (next) => onPageChange(helpers.getNextPageId(type, navigablePages, pageId, action, next));
315
-
316
-
317
- if (action.type === _models.PageAction.TYPES.SAVE_AND_NAVIGATE) {
318
- pageUpdate = function pageUpdate() {
319
- return _handlers.default.navigate(action, pageId, onPageChange);
320
- };
321
349
  } // Now submit the data to the backend...
322
350
 
323
351
 
@@ -336,10 +364,23 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
336
364
  }
337
365
  }
338
366
  }; // Handle navigation from "Check your answers".
367
+ // Passing a dataCallback allows changes to formData from the
368
+ // CYA screen. This is necessary to alow changing the active
369
+ // entry in page collections.
370
+
339
371
 
372
+ var onCYARowAction = function onCYARowAction(page, dataCallback) {
373
+ if (typeof dataCallback === 'function') {
374
+ var newData = dataCallback(_objectSpread({}, data));
340
375
 
341
- var onCYARowAction = function onCYARowAction(page) {
342
- _handlers.default.cyaAction(page, pageId, onPageChange);
376
+ if (newData) {
377
+ setData(newData);
378
+ }
379
+ }
380
+
381
+ if (page) {
382
+ _handlers.default.cyaAction(page, pageId, onPageChange);
383
+ }
343
384
  }; //Kick off a task, gather required pages and move to the correct point
344
385
 
345
386
 
@@ -466,7 +507,10 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
466
507
  refNumber: data['businessKey'],
467
508
  refTitle: _hub.refTitle,
468
509
  onTaskAction: onTaskAction
469
- }), formState.page && !formState.cya && /*#__PURE__*/_react.default.createElement(_FormPage.default, {
510
+ }), formState.page && !formState.cya && !formState.page.collection && /*#__PURE__*/_react.default.createElement(_FormPage.default, {
511
+ page: formState.page,
512
+ onAction: onPageAction
513
+ }), formState.page && !formState.cya && formState.page.collection && /*#__PURE__*/_react.default.createElement(_CollectionPage.default, {
470
514
  page: formState.page,
471
515
  onAction: onPageAction
472
516
  }));
@@ -42,7 +42,7 @@ var ActionButton = function ActionButton(_ref) {
42
42
  className: action.className,
43
43
  classModifiers: action.classModifiers,
44
44
  start: action.start || false,
45
- onClick: function onClick() {
45
+ onClick: action.disabled ? function () {} : function () {
46
46
  return onAction(action);
47
47
  }
48
48
  }), action.label || (actionLabel === null || actionLabel === void 0 ? void 0 : actionLabel.label) || DEFAULT_LABEL);
@@ -68,11 +68,11 @@ var TaskList = function TaskList(_ref) {
68
68
  return /*#__PURE__*/_react.default.createElement("div", _extends({}, attrs, {
69
69
  className: classes()
70
70
  }), refNumber && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("h2", {
71
- className: "hods-task-reference-description govuk-heading-s govuk-!-margin-bottom-2 govuk-!-padding-right-1"
71
+ className: "govuk-heading-s govuk-!-margin-bottom-0"
72
72
  }, "".concat(refTitle)), /*#__PURE__*/_react.default.createElement("h2", {
73
73
  className: "govuk-heading-s govuk-!-font-weight-regular"
74
74
  }, "".concat(refNumber))), numberOfSections !== numberOfCompleteSections && /*#__PURE__*/_react.default.createElement("h2", {
75
- className: "govuk-heading-s govuk-!-margin-bottom-2"
75
+ className: "govuk-heading-s govuk-!-margin-bottom-0"
76
76
  }, "Incomplete form"), /*#__PURE__*/_react.default.createElement("p", {
77
77
  className: "govuk-body govuk-!-margin-bottom-7"
78
78
  }, "You have completed ".concat(numberOfCompleteSections, " of ").concat(numberOfSections, " sections")), sections.map(function (section, index) {
@@ -7,11 +7,13 @@
7
7
  padding-left: 0;
8
8
  margin-top: 0;
9
9
  margin-bottom: 0;
10
+
10
11
  @include govuk-media-query($from: tablet) {
11
12
  min-width: 550px;
12
13
  }
14
+
13
15
  .hods-task-list__items {
14
- font-size: 19px;
16
+ font-size: 19px;
15
17
  @include govuk-responsive-margin(9, 'bottom');
16
18
  list-style: none;
17
19
  padding-left: 0;
@@ -21,8 +23,14 @@
21
23
 
22
24
  .hods-task-list__section {
23
25
  display: table;
24
- font-size: 24px;
25
- font-weight: bold;
26
+ font-size: 1.25rem;
27
+ font-weight: bold;
28
+
29
+ @include govuk-media-query($from: tablet) {
30
+ font-size: 1.5rem;
31
+ line-height: 1.875rem;
32
+ }
33
+
26
34
  }
27
35
 
28
36
  .hods-task-list__section-number {
@@ -40,6 +48,7 @@
40
48
  padding-top: govuk-spacing(2);
41
49
  padding-bottom: govuk-spacing(2);
42
50
  @include govuk-clearfix;
51
+
43
52
  &:first-child {
44
53
  border-top: 1px solid $govuk-border-colour;
45
54
  }
@@ -48,13 +57,20 @@
48
57
  .hods-task-list__task-name {
49
58
  display: block;
50
59
  cursor: auto;
60
+ font-size: 1rem;
61
+
62
+ @include govuk-media-query($from: tablet) {
63
+ font-size: 1.1875rem;
64
+ }
65
+
51
66
  @include govuk-media-query($from: 450px) {
52
67
  float: left;
53
68
  }
69
+
54
70
  font-weight: normal;
55
71
  }
56
72
 
57
- .hods-task-reference-description{
73
+ .hods-task-reference-description {
58
74
  @include govuk-media-query($from: 450px) {
59
75
  float: left;
60
76
  }
@@ -66,6 +82,8 @@
66
82
  // avoid breaking task lists in existing prototypes.
67
83
  .hods-task-list__tag,
68
84
  .hods-task-list__task-completed {
85
+ letter-spacing: 0;
86
+ padding: 0.25rem 0.5rem;
69
87
  margin-top: govuk-spacing(2);
70
88
  margin-bottom: govuk-spacing(1);
71
89
 
@@ -10,6 +10,8 @@ var _DefaultPageActions;
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
12
  var TYPE_CANCEL = 'cancel';
13
+ var TYPE_COLLECTION_ADD = 'collectionAdd';
14
+ var TYPE_COLLECTION_DUPLICATE = 'collectionDuplicate';
13
15
  var TYPE_NAVIGATE = 'navigate';
14
16
  var TYPE_SAVE_AND_CONTINUE = 'saveAndContinue';
15
17
  var TYPE_SAVE_AND_NAVIGATE = 'saveAndNavigate';
@@ -17,6 +19,8 @@ var TYPE_SAVE_AND_RETURN = 'saveAndReturn';
17
19
  var TYPE_SUBMIT = 'submit';
18
20
  var PageActionTypes = {
19
21
  CANCEL: TYPE_CANCEL,
22
+ COLLECTION_ADD: TYPE_COLLECTION_ADD,
23
+ COLLECTION_DUPLICATE: TYPE_COLLECTION_DUPLICATE,
20
24
  NAVIGATE: TYPE_NAVIGATE,
21
25
  SAVE_AND_CONTINUE: TYPE_SAVE_AND_CONTINUE,
22
26
  SAVE_AND_NAVIGATE: TYPE_SAVE_AND_NAVIGATE,
@@ -29,7 +33,7 @@ var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPage
29
33
  validate: false,
30
34
  label: 'Cancel',
31
35
  classModifiers: 'secondary'
32
- }), _defineProperty(_DefaultPageActions, TYPE_NAVIGATE, undefined), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_CONTINUE, {
36
+ }), _defineProperty(_DefaultPageActions, TYPE_COLLECTION_ADD, undefined), _defineProperty(_DefaultPageActions, TYPE_COLLECTION_DUPLICATE, undefined), _defineProperty(_DefaultPageActions, TYPE_NAVIGATE, undefined), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_CONTINUE, {
33
37
  type: TYPE_SAVE_AND_CONTINUE,
34
38
  validate: true,
35
39
  label: 'Save and continue'
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
9
+
10
+ var _models = require("../../models");
11
+
12
+ var _getCYARowsForContainer = _interopRequireDefault(require("./getCYARowsForContainer"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
+
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
+
20
+ 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; }
21
+
22
+ var getChangeActionForItem = function getChangeActionForItem(page, item, onAction) {
23
+ return function (row) {
24
+ var changeCallback = function changeCallback(data) {
25
+ data["".concat(page.collection.name, "ActiveId")] = item.id;
26
+ return data;
27
+ };
28
+
29
+ onAction(row, changeCallback);
30
+ };
31
+ };
32
+
33
+ var getContainerForPage = function getContainerForPage(page, item, labelCount, full_path) {
34
+ return {
35
+ id: item.id,
36
+ fieldId: item.id,
37
+ type: _models.ComponentTypes.CONTAINER,
38
+ required: true,
39
+ full_path: full_path,
40
+ components: page.components.map(function (component) {
41
+ return _objectSpread(_objectSpread({}, component), {}, {
42
+ label: _copReactComponents.Utils.interpolateString(component.label, _objectSpread(_objectSpread({}, item), {}, {
43
+ index: labelCount
44
+ })),
45
+ full_path: "".concat(full_path, ".").concat(component.fieldId)
46
+ });
47
+ })
48
+ };
49
+ };
50
+
51
+ var getTitleRowForItem = function getTitleRowForItem(page, item, pageId, labelCount, full_path) {
52
+ var labels = _objectSpread(_objectSpread({}, _models.CollectionLabels), page.collection.labels);
53
+
54
+ return {
55
+ pageId: pageId,
56
+ fieldId: 'Title',
57
+ full_path: "".concat(full_path, ".Title"),
58
+ key: _copReactComponents.Utils.interpolateString(labels.item, _objectSpread(_objectSpread({}, item), {}, {
59
+ index: labelCount
60
+ })),
61
+ type: 'title'
62
+ };
63
+ };
64
+
65
+ var getCYARowsForCollectionPage = function getCYARowsForCollectionPage(page, onAction) {
66
+ var _page$formData, _page$formData$page$c;
67
+
68
+ var rows = [];
69
+ (_page$formData = page.formData) === null || _page$formData === void 0 ? void 0 : (_page$formData$page$c = _page$formData[page.collection.name]) === null || _page$formData$page$c === void 0 ? void 0 : _page$formData$page$c.forEach(function (item, index) {
70
+ var labelCount = index + 1;
71
+ var full_path = "".concat(page.collection.name, "[").concat(index, "]");
72
+ var container = getContainerForPage(page, item, labelCount, full_path);
73
+ var itemChangeAction = getChangeActionForItem(page, item, onAction);
74
+ var containerRows = (0, _getCYARowsForContainer.default)(page, container, item, itemChangeAction);
75
+ var titleRow = getTitleRowForItem(page, item, page.id, labelCount, full_path);
76
+ rows = rows.concat(titleRow);
77
+ rows = rows.concat(containerRows);
78
+ });
79
+ return rows.filter(function (row) {
80
+ return !!row;
81
+ });
82
+ };
83
+
84
+ var _default = getCYARowsForCollectionPage;
85
+ exports.default = _default;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ var _getCYARowsForCollectionPage = _interopRequireDefault(require("./getCYARowsForCollectionPage"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
8
+
9
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
10
+
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
+
13
+ describe('utils.CheckYourAnswers.getCYARowsForCollectionPage', function () {
14
+ var TEXT_COMP = {
15
+ id: 'testText',
16
+ fieldId: 'testText',
17
+ label: 'Test text',
18
+ type: 'text'
19
+ };
20
+ var MASTER_PAGE = {
21
+ id: 'page1',
22
+ collection: {
23
+ name: 'collection',
24
+ labels: {
25
+ item: 'Collection entry ${index}'
26
+ }
27
+ },
28
+ title: 'Collection',
29
+ components: [TEXT_COMP]
30
+ };
31
+ it('should return an empty array if the collection has no entries', function () {
32
+ var FORM_DATA = {};
33
+
34
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
35
+ formData: FORM_DATA
36
+ });
37
+
38
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
39
+ expect(ROWS.length).toEqual(0);
40
+ });
41
+ it('should format titles correctly when collection.labels.item is specified', function () {
42
+ var FORM_DATA = {
43
+ collection: [{
44
+ id: '01',
45
+ testText: 'value'
46
+ }]
47
+ };
48
+
49
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
50
+ formData: FORM_DATA
51
+ });
52
+
53
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
54
+ expect(ROWS.length).toEqual(2); // Title row + component row
55
+
56
+ expect(ROWS[0].key).toEqual('Collection entry 1');
57
+ });
58
+ it('should provide default titles if collection.labels.item is not specified', function () {
59
+ var FORM_DATA = {
60
+ collection: [{
61
+ id: '01',
62
+ testText: 'value'
63
+ }]
64
+ };
65
+
66
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
67
+ collection: _objectSpread(_objectSpread({}, MASTER_PAGE.collection), {}, {
68
+ labels: {}
69
+ }),
70
+ formData: FORM_DATA
71
+ });
72
+
73
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
74
+ expect(ROWS.length).toEqual(2); // Title row + component row
75
+
76
+ expect(ROWS[0].key).toEqual('Item 1');
77
+ });
78
+ it('should return correctly formatted rows for mutliple entries', function () {
79
+ var FORM_DATA = {
80
+ collection: [{
81
+ id: '01',
82
+ testText: 'value'
83
+ }, {
84
+ id: '02',
85
+ testText: 'value'
86
+ }]
87
+ };
88
+
89
+ var PAGE = _objectSpread(_objectSpread({}, MASTER_PAGE), {}, {
90
+ formData: FORM_DATA
91
+ });
92
+
93
+ var ROWS = (0, _getCYARowsForCollectionPage.default)(PAGE, null);
94
+ expect(ROWS.length).toEqual(4); // Title row + component row for each item
95
+
96
+ expect(ROWS[0].type).toEqual('title');
97
+ expect(ROWS[0].key).toEqual('Collection entry 1'); // Formatted according to collection.labels.item
98
+
99
+ expect(ROWS[1].value).toEqual('value');
100
+ expect(ROWS[1].key).toEqual('Test text');
101
+ expect(ROWS[2].type).toEqual('title');
102
+ expect(ROWS[2].key).toEqual('Collection entry 2'); // Formatted according to collection.labels.item
103
+
104
+ expect(ROWS[3].value).toEqual('value');
105
+ expect(ROWS[3].key).toEqual('Test text');
106
+ });
107
+ });
@@ -11,6 +11,8 @@ var _FormPage = _interopRequireDefault(require("../FormPage"));
11
11
 
12
12
  var _getCYARow = _interopRequireDefault(require("./getCYARow"));
13
13
 
14
+ var _getCYARowsForCollectionPage = _interopRequireDefault(require("./getCYARowsForCollectionPage"));
15
+
14
16
  var _getCYARowForGroup2 = _interopRequireDefault(require("./getCYARowForGroup"));
15
17
 
16
18
  var _getCYARowsForCollection = _interopRequireDefault(require("./getCYARowsForCollection"));
@@ -35,6 +37,10 @@ var getCYARowsForPage = function getCYARowsForPage(page, onAction) {
35
37
  if (_FormPage.default.showCYA(page, page.formData)) {
36
38
  var _page$groups;
37
39
 
40
+ if (page.collection) {
41
+ return (0, _getCYARowsForCollectionPage.default)(page, onAction);
42
+ }
43
+
38
44
  var rows = page.components.filter(function (c) {
39
45
  return (0, _showComponentCYA.default)(c, page.formData);
40
46
  }).flatMap(function (component) {
@@ -33,6 +33,10 @@ var showComponentCYA = function showComponentCYA(options, data) {
33
33
  return false;
34
34
  }
35
35
 
36
+ if (options.hasOwnProperty('show_on_cya') && !options.show_on_cya) {
37
+ return false;
38
+ }
39
+
36
40
  if (options.type === _models.ComponentTypes.CONTAINER) {
37
41
  return _Container.default.show(options, data);
38
42
  }
@@ -13,6 +13,11 @@ describe('utils', function () {
13
13
  it('should not show when there are no options', function () {
14
14
  expect((0, _showComponentCYA.default)(null, null)).toBeFalsy();
15
15
  });
16
+ it('should not show when show_on_cya is defined and falsy', function () {
17
+ expect((0, _showComponentCYA.default)({
18
+ show_on_cya: false
19
+ })).toBeFalsy();
20
+ });
16
21
  it('should not show when it is a heading type', function () {
17
22
  expect((0, _showComponentCYA.default)({
18
23
  type: _models.ComponentTypes.HEADING
@@ -34,6 +39,11 @@ describe('utils', function () {
34
39
  disabled: true
35
40
  }, null)).toBeFalsy();
36
41
  });
42
+ it('should show when show_on_cya is defined and truthy', function () {
43
+ expect((0, _showComponentCYA.default)({
44
+ show_on_cya: true
45
+ })).toBeTruthy();
46
+ });
37
47
  it('should show when it hidden but not disabled', function () {
38
48
  expect((0, _showComponentCYA.default)({
39
49
  hidden: true
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _getCollectionPageActiveIndex = _interopRequireDefault(require("./getCollectionPageActiveIndex"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
+
16
+ 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; }
17
+
18
+ /**
19
+ * Duplicates the currently active entry in a named collection's data.
20
+ * Once duplicated, the new entry is set as the active entry.
21
+ * @param {string} collectionName The name of the collection.
22
+ * @param {object} formData A page's form data containing the collection's data.
23
+ * @return true if the entry ws successfully duplicated, false if not.
24
+ */
25
+ var duplicateCollectionPageActiveEntry = function duplicateCollectionPageActiveEntry(collectionName, formData) {
26
+ var _formData$collectionN;
27
+
28
+ var currentIndex = (0, _getCollectionPageActiveIndex.default)(collectionName, formData);
29
+ var currentEntry = (_formData$collectionN = formData[collectionName]) === null || _formData$collectionN === void 0 ? void 0 : _formData$collectionN[currentIndex];
30
+
31
+ if (!currentEntry) {
32
+ return false;
33
+ }
34
+
35
+ var newEntry = _objectSpread(_objectSpread({}, currentEntry), {}, {
36
+ id: Date.now().toString()
37
+ });
38
+
39
+ formData[collectionName].push(newEntry);
40
+ formData["".concat(collectionName, "ActiveId")] = newEntry.id;
41
+ return true;
42
+ };
43
+
44
+ var _default = duplicateCollectionPageActiveEntry;
45
+ exports.default = _default;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ var _duplicateCollectionPageActiveEntry = _interopRequireDefault(require("./duplicateCollectionPageActiveEntry"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ 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; }
8
+
9
+ describe('utils.CollectionPage.duplicateCollectionPageActiveEntry', function () {
10
+ var COLLECTION_NAME = 'testCollection';
11
+ var OBJ = {
12
+ id: '1',
13
+ value: 'value'
14
+ };
15
+ it('should duplicate the active entry if one exists', function () {
16
+ var _FORM_DATA;
17
+
18
+ var FORM_DATA = (_FORM_DATA = {}, _defineProperty(_FORM_DATA, "".concat(COLLECTION_NAME, "ActiveId"), '1'), _defineProperty(_FORM_DATA, COLLECTION_NAME, [OBJ]), _FORM_DATA);
19
+ (0, _duplicateCollectionPageActiveEntry.default)(COLLECTION_NAME, FORM_DATA);
20
+ expect(FORM_DATA[COLLECTION_NAME].length).toEqual(2);
21
+ expect(FORM_DATA[COLLECTION_NAME][1].value).toEqual(FORM_DATA[COLLECTION_NAME][0].value);
22
+ expect(FORM_DATA[COLLECTION_NAME][1].id).toBeTruthy();
23
+ expect(FORM_DATA[COLLECTION_NAME][1].id === '1').toBeFalsy();
24
+ expect(FORM_DATA["".concat(COLLECTION_NAME, "ActiveId")]).toBeTruthy();
25
+ expect(FORM_DATA["".concat(COLLECTION_NAME, "ActiveId")] === '1').toBeFalsy();
26
+ });
27
+ it('should do nothing if there is no active entry', function () {
28
+ var _FORM_DATA2;
29
+
30
+ var FORM_DATA = (_FORM_DATA2 = {}, _defineProperty(_FORM_DATA2, "".concat(COLLECTION_NAME, "ActiveId"), '2'), _defineProperty(_FORM_DATA2, COLLECTION_NAME, [OBJ]), _FORM_DATA2);
31
+ (0, _duplicateCollectionPageActiveEntry.default)(COLLECTION_NAME, FORM_DATA);
32
+ expect(FORM_DATA[COLLECTION_NAME].length).toEqual(1);
33
+ expect(FORM_DATA[COLLECTION_NAME][0]).toEqual(OBJ);
34
+ expect(FORM_DATA["".concat(COLLECTION_NAME, "ActiveId")]).toEqual('2'); // Shouldn't have changed.
35
+ });
36
+ it('should do nothing if the collection does not exist', function () {
37
+ var FORM_DATA = {};
38
+ (0, _duplicateCollectionPageActiveEntry.default)(COLLECTION_NAME, FORM_DATA);
39
+ expect(FORM_DATA).toEqual({});
40
+ });
41
+ });
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ /**
9
+ * Gets the index of the active entry in a named collection's data.
10
+ * @param {string} collectionName The name of the collection.
11
+ * @param {object} formData A page's form data containing the collection's data.
12
+ * @returns The index of the active entry, or null if there isn't one.
13
+ */
14
+ var getCollectionPageActiveIndex = function getCollectionPageActiveIndex(collectionName, formData) {
15
+ var _formData$collectionN;
16
+
17
+ if (!collectionName) {
18
+ return null;
19
+ }
20
+
21
+ var id = formData === null || formData === void 0 ? void 0 : formData["".concat(collectionName, "ActiveId")];
22
+
23
+ if (!id) {
24
+ return null;
25
+ }
26
+
27
+ var activeIndex = (_formData$collectionN = formData[collectionName]) === null || _formData$collectionN === void 0 ? void 0 : _formData$collectionN.findIndex(function (item) {
28
+ return item.id === id;
29
+ });
30
+ return activeIndex > -1 ? activeIndex : null;
31
+ };
32
+
33
+ var _default = getCollectionPageActiveIndex;
34
+ exports.default = _default;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _getCollectionPageActiveIndex = _interopRequireDefault(require("./getCollectionPageActiveIndex"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ // Local imports
8
+ describe('utils.CollectionPage.getCollectionPageActiveIndex', function () {
9
+ it('should return the index of the active item in the collection, if one exists', function () {
10
+ var COLLECTION_NAME = 'test';
11
+ var ACTIVE_ID = '002';
12
+ var FORM_DATA = {
13
+ testActiveId: ACTIVE_ID,
14
+ test: [{
15
+ id: '001'
16
+ }, {
17
+ id: '002'
18
+ }]
19
+ };
20
+ var PAGE = {
21
+ collection: {
22
+ name: COLLECTION_NAME
23
+ },
24
+ formData: FORM_DATA
25
+ };
26
+ expect((0, _getCollectionPageActiveIndex.default)(PAGE.collection.name, PAGE.formData)).toEqual(1);
27
+ });
28
+ it('should return null if no active item can be found in the collection', function () {
29
+ var COLLECTION_NAME = 'test';
30
+ var ACTIVE_ID = '002';
31
+ var FORM_DATA = {
32
+ testActiveId: ACTIVE_ID,
33
+ test: [{
34
+ id: '001'
35
+ }]
36
+ };
37
+ var PAGE = {
38
+ collection: {
39
+ name: COLLECTION_NAME
40
+ },
41
+ formData: FORM_DATA
42
+ };
43
+ expect((0, _getCollectionPageActiveIndex.default)(PAGE.collection.name, PAGE.formData)).toEqual(null);
44
+ });
45
+ it('should return null if formData is null', function () {
46
+ var COLLECTION_NAME = 'test';
47
+ var PAGE = {
48
+ collection: {
49
+ name: COLLECTION_NAME
50
+ }
51
+ };
52
+ expect((0, _getCollectionPageActiveIndex.default)(PAGE.collection.name, null)).toEqual(null);
53
+ });
54
+ });