@ukhomeoffice/cop-react-form-renderer 2.1.0 → 2.6.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 (90) hide show
  1. package/dist/components/FormComponent/Container.test.js +250 -0
  2. package/dist/components/FormComponent/FormComponent.js +105 -21
  3. package/dist/components/FormComponent/FormComponent.test.js +67 -0
  4. package/dist/components/FormPage/FormPage.js +2 -1
  5. package/dist/components/FormRenderer/FormRenderer.js +105 -6
  6. package/dist/components/FormRenderer/FormRenderer.test.js +235 -0
  7. package/dist/components/FormRenderer/helpers/getNextPageId.js +3 -0
  8. package/dist/components/FormRenderer/helpers/getNextPageId.test.js +6 -0
  9. package/dist/components/FormRenderer/helpers/getPage.js +1 -1
  10. package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +18 -1
  11. package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +44 -6
  12. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +50 -0
  13. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +122 -0
  14. package/dist/components/FormRenderer/helpers/index.js +7 -1
  15. package/dist/components/TaskList/Task.js +83 -0
  16. package/dist/components/TaskList/Task.test.js +112 -0
  17. package/dist/components/TaskList/TaskList.js +112 -0
  18. package/dist/components/TaskList/TaskList.scss +70 -0
  19. package/dist/components/TaskList/TaskList.stories.mdx +57 -0
  20. package/dist/components/TaskList/TaskList.test.js +223 -0
  21. package/dist/components/TaskList/TaskState.js +42 -0
  22. package/dist/components/TaskList/TaskState.test.js +99 -0
  23. package/dist/components/TaskList/index.js +13 -0
  24. package/dist/hooks/index.js +19 -1
  25. package/dist/hooks/useHooks.js +5 -1
  26. package/dist/json/taskList.json +228 -0
  27. package/dist/json/userProfile.data.json +2 -1
  28. package/dist/models/ComponentTypes.js +5 -1
  29. package/dist/models/FormTypes.js +2 -0
  30. package/dist/models/HubFormats.js +3 -1
  31. package/dist/models/PageAction.js +5 -0
  32. package/dist/models/TaskStates.js +41 -0
  33. package/dist/models/index.js +8 -0
  34. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +40 -0
  35. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +257 -0
  36. package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +9 -1
  37. package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +44 -0
  38. package/dist/utils/CheckYourAnswers/showComponentCYA.js +6 -0
  39. package/dist/utils/Component/cleanAttributes.js +1 -1
  40. package/dist/utils/Component/getComponent.js +26 -0
  41. package/dist/utils/Component/isEditable.js +1 -1
  42. package/dist/utils/Component/showComponent.js +2 -20
  43. package/dist/utils/Condition/index.js +19 -0
  44. package/dist/utils/Condition/meetsAllConditions.js +40 -0
  45. package/dist/utils/Condition/meetsAllConditions.test.js +62 -0
  46. package/dist/utils/{meetsCondition.js → Condition/meetsCondition.js} +0 -0
  47. package/dist/utils/Condition/meetsCondition.test.js +302 -0
  48. package/dist/utils/Condition/setupConditions.js +47 -0
  49. package/dist/utils/Condition/setupConditions.test.js +35 -0
  50. package/dist/utils/Container/getEditableComponents.js +38 -0
  51. package/dist/utils/Container/getEditableComponents.test.js +157 -0
  52. package/dist/utils/Container/index.js +22 -0
  53. package/dist/utils/Container/setupNesting.js +45 -0
  54. package/dist/utils/Container/setupNesting.test.js +92 -0
  55. package/dist/utils/Container/showContainer.js +61 -0
  56. package/dist/utils/Container/showContainer.test.js +128 -0
  57. package/dist/utils/Data/getDataPath.js +90 -0
  58. package/dist/utils/Data/getDataPath.test.js +52 -0
  59. package/dist/utils/Data/index.js +3 -0
  60. package/dist/utils/FormPage/getFormPage.js +4 -2
  61. package/dist/utils/FormPage/getFormPage.test.js +18 -7
  62. package/dist/utils/FormPage/getFormPages.test.js +5 -2
  63. package/dist/utils/FormPage/getPageActions.js +6 -0
  64. package/dist/utils/FormPage/index.js +0 -3
  65. package/dist/utils/FormPage/showFormPage.js +7 -27
  66. package/dist/utils/Hub/getFormHub.js +4 -0
  67. package/dist/utils/Hub/getFormHub.test.js +15 -4
  68. package/dist/utils/Validate/additional/index.js +55 -0
  69. package/dist/utils/Validate/additional/index.test.js +69 -0
  70. package/dist/utils/Validate/additional/mustBeAfter.js +37 -0
  71. package/dist/utils/Validate/additional/mustBeAfter.test.js +98 -0
  72. package/dist/utils/Validate/additional/mustBeBefore.js +35 -0
  73. package/dist/utils/Validate/additional/mustBeBefore.test.js +66 -0
  74. package/dist/utils/Validate/additional/mustBeInTheFuture.js +42 -0
  75. package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +34 -0
  76. package/dist/utils/Validate/additional/mustBeInThePast.js +44 -0
  77. package/dist/utils/Validate/additional/mustBeInThePast.test.js +34 -0
  78. package/dist/utils/Validate/additional/utils.js +66 -0
  79. package/dist/utils/Validate/index.js +7 -1
  80. package/dist/utils/Validate/validateComponent.js +57 -0
  81. package/dist/utils/Validate/validateComponent.test.js +92 -2
  82. package/dist/utils/Validate/validateDate.js +155 -0
  83. package/dist/utils/Validate/validateDate.test.js +118 -0
  84. package/dist/utils/Validate/validatePage.js +6 -8
  85. package/dist/utils/Validate/validateTime.js +95 -0
  86. package/dist/utils/Validate/validateTime.test.js +61 -0
  87. package/dist/utils/index.js +6 -3
  88. package/package.json +3 -2
  89. package/dist/utils/FormPage/getEditableComponents.js +0 -28
  90. package/dist/utils/FormPage/getEditableComponents.test.js +0 -75
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var TYPE_AUTOCOMPLETE = 'autocomplete';
8
8
  var TYPE_CHECKBOXES = 'checkboxes';
9
+ var TYPE_CONTAINER = 'container';
9
10
  var TYPE_DATE = 'date';
10
11
  var TYPE_EMAIL = 'email';
11
12
  var TYPE_HEADING = 'heading';
@@ -15,9 +16,11 @@ var TYPE_PHONE_NUMBER = 'phone-number';
15
16
  var TYPE_RADIOS = 'radios';
16
17
  var TYPE_TEXT = 'text';
17
18
  var TYPE_TEXT_AREA = 'textarea';
19
+ var TYPE_TIME = 'time';
18
20
  var ComponentTypes = {
19
21
  AUTOCOMPLETE: TYPE_AUTOCOMPLETE,
20
22
  CHECKBOXES: TYPE_CHECKBOXES,
23
+ CONTAINER: TYPE_CONTAINER,
21
24
  DATE: TYPE_DATE,
22
25
  EMAIL: TYPE_EMAIL,
23
26
  HEADING: TYPE_HEADING,
@@ -26,7 +29,8 @@ var ComponentTypes = {
26
29
  PHONE_NUMBER: TYPE_PHONE_NUMBER,
27
30
  RADIOS: TYPE_RADIOS,
28
31
  TEXT: TYPE_TEXT,
29
- TEXT_AREA: TYPE_TEXT_AREA
32
+ TEXT_AREA: TYPE_TEXT_AREA,
33
+ TIME: TYPE_TIME
30
34
  };
31
35
  var _default = ComponentTypes;
32
36
  exports.default = _default;
@@ -7,11 +7,13 @@ exports.default = void 0;
7
7
  var TYPE_FORM = 'form';
8
8
  var TYPE_CHECK_YOUR_ANSWERS = 'cya';
9
9
  var TYPE_HUB_AND_SPOKE = 'hub-and-spoke';
10
+ var TYPE_TASK_LIST = 'task-list';
10
11
  var TYPE_WIZARD = 'wizard';
11
12
  var FormTypes = {
12
13
  FORM: TYPE_FORM,
13
14
  CYA: TYPE_CHECK_YOUR_ANSWERS,
14
15
  HUB: TYPE_HUB_AND_SPOKE,
16
+ TASK: TYPE_TASK_LIST,
15
17
  WIZARD: TYPE_WIZARD
16
18
  };
17
19
  var _default = FormTypes;
@@ -5,8 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var HUB_FORMAT_CYA = 'CYA';
8
+ var HUB_FORMAT_TASK = 'TASK';
8
9
  var HubFormats = {
9
- CYA: HUB_FORMAT_CYA
10
+ CYA: HUB_FORMAT_CYA,
11
+ TASK: HUB_FORMAT_TASK
10
12
  };
11
13
  var _default = HubFormats;
12
14
  exports.default = _default;
@@ -11,11 +11,13 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
11
11
 
12
12
  var TYPE_NAVIGATE = 'navigate';
13
13
  var TYPE_SAVE_AND_CONTINUE = 'saveAndContinue';
14
+ var TYPE_SAVE_AND_NAVIGATE = 'saveAndNavigate';
14
15
  var TYPE_SAVE_AND_RETURN = 'saveAndReturn';
15
16
  var TYPE_SUBMIT = 'submit';
16
17
  var PageActionTypes = {
17
18
  NAVIGATE: TYPE_NAVIGATE,
18
19
  SAVE_AND_CONTINUE: TYPE_SAVE_AND_CONTINUE,
20
+ SAVE_AND_NAVIGATE: TYPE_SAVE_AND_NAVIGATE,
19
21
  SAVE_AND_RETURN: TYPE_SAVE_AND_RETURN,
20
22
  SUBMIT: TYPE_SUBMIT
21
23
  };
@@ -24,6 +26,9 @@ var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPage
24
26
  type: TYPE_SAVE_AND_CONTINUE,
25
27
  validate: true,
26
28
  label: 'Save and continue'
29
+ }), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_NAVIGATE, {
30
+ type: TYPE_SAVE_AND_NAVIGATE,
31
+ validate: true
27
32
  }), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_RETURN, {
28
33
  type: TYPE_SAVE_AND_RETURN,
29
34
  validate: false,
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.StateTypes = void 0;
7
+
8
+ var _StateDetails;
9
+
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
+
12
+ var TYPE_COMPLETE = 'complete';
13
+ var TYPE_IN_PROGRESS = 'inProgress';
14
+ var TYPE_NOT_STARTED = 'notStarted';
15
+ var TYPE_CANNOT_START_YET = 'cannotStartYet';
16
+ var StateTypes = {
17
+ COMPLETE: TYPE_COMPLETE,
18
+ IN_PROGRESS: TYPE_IN_PROGRESS,
19
+ NOT_STARTED: TYPE_NOT_STARTED,
20
+ CANNOT_START_YET: TYPE_CANNOT_START_YET
21
+ };
22
+ exports.StateTypes = StateTypes;
23
+ var StateDetails = (_StateDetails = {}, _defineProperty(_StateDetails, TYPE_COMPLETE, {
24
+ label: 'Completed',
25
+ colour: ''
26
+ }), _defineProperty(_StateDetails, TYPE_IN_PROGRESS, {
27
+ label: 'In Progress',
28
+ colour: 'blue'
29
+ }), _defineProperty(_StateDetails, TYPE_NOT_STARTED, {
30
+ label: 'Not Started',
31
+ colour: 'grey'
32
+ }), _defineProperty(_StateDetails, TYPE_CANNOT_START_YET, {
33
+ label: 'Cannot Start Yet',
34
+ colour: 'grey'
35
+ }), _StateDetails);
36
+ var TaskStates = {
37
+ TYPES: StateTypes,
38
+ DETAILS: StateDetails
39
+ };
40
+ var _default = TaskStates;
41
+ exports.default = _default;
@@ -39,6 +39,12 @@ Object.defineProperty(exports, "PageAction", {
39
39
  return _PageAction.default;
40
40
  }
41
41
  });
42
+ Object.defineProperty(exports, "TaskStates", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _TaskStates.default;
46
+ }
47
+ });
42
48
 
43
49
  var _ComponentTypes = _interopRequireDefault(require("./ComponentTypes"));
44
50
 
@@ -52,4 +58,6 @@ var _HubFormats = _interopRequireDefault(require("./HubFormats"));
52
58
 
53
59
  var _PageAction = _interopRequireDefault(require("./PageAction"));
54
60
 
61
+ var _TaskStates = _interopRequireDefault(require("./TaskStates"));
62
+
55
63
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,40 @@
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
+ var _getCYARow = _interopRequireDefault(require("./getCYARow"));
11
+
12
+ var _showComponentCYA = _interopRequireDefault(require("./showComponentCYA"));
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); if (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 = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { 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 getCYARowsForContainer = function getCYARowsForContainer(page, container, formData, onAction) {
23
+ if ((0, _showComponentCYA.default)(container, page.formData)) {
24
+ return container.components.filter(function (c) {
25
+ return (0, _showComponentCYA.default)(c, page.formData);
26
+ }).flatMap(function (component) {
27
+ if (component.type === _models.ComponentTypes.CONTAINER) {
28
+ var fd = formData ? formData[component.fieldId] : undefined;
29
+ return getCYARowsForContainer(page, component, fd, onAction);
30
+ }
31
+
32
+ return (0, _getCYARow.default)(_objectSpread(_objectSpread({}, page), {}, {
33
+ formData: formData
34
+ }), component, onAction);
35
+ });
36
+ }
37
+ };
38
+
39
+ var _default = getCYARowsForContainer;
40
+ exports.default = _default;
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ var _models = require("../../models");
4
+
5
+ var _getCYARowsForContainer = _interopRequireDefault(require("./getCYARowsForContainer"));
6
+
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
9
+ // Local imports
10
+ describe('utils.CheckYourAnswers.getCYARowsForContainer', function () {
11
+ var expectObjectLike = function expectObjectLike(received, expected) {
12
+ Object.keys(expected).forEach(function (key) {
13
+ expect(received[key]).toEqual(expected[key]);
14
+ });
15
+ };
16
+
17
+ it('should get an appropriate row for a container with a single readonly text component', function () {
18
+ var FORM_DATA = {
19
+ container: {
20
+ a: 'Bravo'
21
+ }
22
+ };
23
+ var PAGE = {
24
+ id: 'page',
25
+ formData: FORM_DATA,
26
+ cya_link: {}
27
+ };
28
+ var COMPONENT = {
29
+ type: 'text',
30
+ readonly: true,
31
+ id: 'a',
32
+ fieldId: 'a',
33
+ label: 'Alpha'
34
+ };
35
+ var CONTAINER = {
36
+ id: 'container',
37
+ fieldId: 'container',
38
+ type: _models.ComponentTypes.CONTAINER,
39
+ components: [COMPONENT],
40
+ value: FORM_DATA.container,
41
+ formData: FORM_DATA
42
+ };
43
+
44
+ var ON_ACTION = function ON_ACTION() {};
45
+
46
+ var ROWS = (0, _getCYARowsForContainer.default)(PAGE, CONTAINER, FORM_DATA.container, ON_ACTION);
47
+ expect(ROWS.length).toEqual(1);
48
+ ROWS.forEach(function (row, index) {
49
+ expectObjectLike(row, {
50
+ pageId: PAGE.id,
51
+ fieldId: CONTAINER.components[index].fieldId,
52
+ key: CONTAINER.components[index].label,
53
+ action: null,
54
+ component: COMPONENT,
55
+ value: 'Bravo'
56
+ });
57
+ });
58
+ });
59
+ it('should get appropriate rows for a container with two editable text components', function () {
60
+ var FORM_DATA = {
61
+ container: {
62
+ a: 'Alpha Charlie',
63
+ b: 'Bravo Charlie'
64
+ }
65
+ };
66
+ var PAGE = {
67
+ id: 'page',
68
+ formData: FORM_DATA,
69
+ cya_link: {}
70
+ };
71
+ var COMPONENT_A = {
72
+ type: 'text',
73
+ id: 'a',
74
+ fieldId: 'a',
75
+ label: 'Alpha'
76
+ };
77
+ var COMPONENT_B = {
78
+ type: 'text',
79
+ id: 'b',
80
+ fieldId: 'b',
81
+ label: 'Bravo'
82
+ };
83
+ var CONTAINER = {
84
+ id: 'container',
85
+ fieldId: 'container',
86
+ type: _models.ComponentTypes.CONTAINER,
87
+ components: [COMPONENT_A, COMPONENT_B],
88
+ value: FORM_DATA.container,
89
+ formData: FORM_DATA
90
+ };
91
+
92
+ var ON_ACTION = function ON_ACTION() {};
93
+
94
+ var ROWS = (0, _getCYARowsForContainer.default)(PAGE, CONTAINER, FORM_DATA.container, ON_ACTION);
95
+ expect(ROWS.length).toEqual(2);
96
+ ROWS.forEach(function (row, index) {
97
+ expectObjectLike(row, {
98
+ pageId: PAGE.id,
99
+ fieldId: CONTAINER.components[index].fieldId,
100
+ key: CONTAINER.components[index].label,
101
+ component: CONTAINER.components[index],
102
+ value: "".concat(CONTAINER.components[index].label, " Charlie")
103
+ });
104
+ expectObjectLike(row.action, {
105
+ onAction: ON_ACTION
106
+ });
107
+ });
108
+ });
109
+ it("should filter out any components that shouldn't be shown", function () {
110
+ var FORM_DATA = {
111
+ container: {
112
+ a: 'Alpha Charlie',
113
+ b: 'Bravo Charlie'
114
+ }
115
+ };
116
+ var PAGE = {
117
+ id: 'page',
118
+ formData: FORM_DATA,
119
+ cya_link: {}
120
+ };
121
+ var COMPONENT_A = {
122
+ type: 'text',
123
+ id: 'a',
124
+ fieldId: 'a',
125
+ label: 'Alpha'
126
+ };
127
+ var COMPONENT_B = {
128
+ type: 'text',
129
+ id: 'b',
130
+ fieldId: 'b',
131
+ label: 'Bravo'
132
+ };
133
+ var COMPONENT_C = {
134
+ type: 'heading',
135
+ content: 'Heading component'
136
+ };
137
+ var CONTAINER = {
138
+ id: 'container',
139
+ fieldId: 'container',
140
+ type: _models.ComponentTypes.CONTAINER,
141
+ components: [COMPONENT_A, COMPONENT_B, COMPONENT_C],
142
+ value: FORM_DATA.container,
143
+ formData: FORM_DATA
144
+ };
145
+
146
+ var ON_ACTION = function ON_ACTION() {};
147
+
148
+ var ROWS = (0, _getCYARowsForContainer.default)(PAGE, CONTAINER, FORM_DATA.container, ON_ACTION);
149
+ expect(ROWS.length).toEqual(2);
150
+ ROWS.forEach(function (row, index) {
151
+ expectObjectLike(row, {
152
+ pageId: PAGE.id,
153
+ fieldId: CONTAINER.components[index].fieldId,
154
+ key: CONTAINER.components[index].label,
155
+ component: CONTAINER.components[index],
156
+ value: "".concat(CONTAINER.components[index].label, " Charlie")
157
+ });
158
+ expectObjectLike(row.action, {
159
+ onAction: ON_ACTION
160
+ });
161
+ });
162
+ });
163
+ it('should get an appropriate row for a container with a single readonly text component inside a nested container', function () {
164
+ var FORM_DATA = {
165
+ container: {
166
+ nested: {
167
+ a: 'Bravo'
168
+ }
169
+ }
170
+ };
171
+ var PAGE = {
172
+ id: 'page',
173
+ formData: FORM_DATA,
174
+ cya_link: {}
175
+ };
176
+ var COMPONENT = {
177
+ type: 'text',
178
+ readonly: true,
179
+ id: 'a',
180
+ fieldId: 'a',
181
+ label: 'Alpha'
182
+ };
183
+ var NESTED_CONTAINER = {
184
+ id: 'nested',
185
+ fieldId: 'nested',
186
+ type: _models.ComponentTypes.CONTAINER,
187
+ components: [COMPONENT],
188
+ value: FORM_DATA.container.nested,
189
+ formData: FORM_DATA
190
+ };
191
+ var CONTAINER = {
192
+ id: 'container',
193
+ fieldId: 'container',
194
+ type: _models.ComponentTypes.CONTAINER,
195
+ components: [NESTED_CONTAINER],
196
+ value: FORM_DATA.container,
197
+ formData: FORM_DATA
198
+ };
199
+
200
+ var ON_ACTION = function ON_ACTION() {};
201
+
202
+ var ROWS = (0, _getCYARowsForContainer.default)(PAGE, CONTAINER, FORM_DATA.container, ON_ACTION);
203
+ expect(ROWS.length).toEqual(1);
204
+ ROWS.forEach(function (row, index) {
205
+ expectObjectLike(row, {
206
+ pageId: PAGE.id,
207
+ fieldId: NESTED_CONTAINER.components[index].fieldId,
208
+ key: NESTED_CONTAINER.components[index].label,
209
+ action: null,
210
+ component: COMPONENT,
211
+ value: 'Bravo'
212
+ });
213
+ });
214
+ });
215
+ it('should get an appropriate row for a container with a single readonly text component inside a nested container but no formData', function () {
216
+ var FORM_DATA = undefined;
217
+ var PAGE = {
218
+ id: 'page',
219
+ formData: FORM_DATA,
220
+ cya_link: {}
221
+ };
222
+ var COMPONENT = {
223
+ type: 'text',
224
+ readonly: true,
225
+ id: 'a',
226
+ fieldId: 'a',
227
+ label: 'Alpha'
228
+ };
229
+ var NESTED_CONTAINER = {
230
+ id: 'nested',
231
+ fieldId: 'nested',
232
+ type: _models.ComponentTypes.CONTAINER,
233
+ components: [COMPONENT]
234
+ };
235
+ var CONTAINER = {
236
+ id: 'container',
237
+ fieldId: 'container',
238
+ type: _models.ComponentTypes.CONTAINER,
239
+ components: [NESTED_CONTAINER]
240
+ };
241
+
242
+ var ON_ACTION = function ON_ACTION() {};
243
+
244
+ var ROWS = (0, _getCYARowsForContainer.default)(PAGE, CONTAINER, undefined, ON_ACTION);
245
+ expect(ROWS.length).toEqual(1);
246
+ ROWS.forEach(function (row, index) {
247
+ expectObjectLike(row, {
248
+ pageId: PAGE.id,
249
+ fieldId: NESTED_CONTAINER.components[index].fieldId,
250
+ key: NESTED_CONTAINER.components[index].label,
251
+ action: null,
252
+ component: COMPONENT,
253
+ value: ''
254
+ });
255
+ });
256
+ });
257
+ });
@@ -5,10 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _models = require("../../models");
9
+
8
10
  var _FormPage = _interopRequireDefault(require("../FormPage"));
9
11
 
10
12
  var _getCYARow = _interopRequireDefault(require("./getCYARow"));
11
13
 
14
+ var _getCYARowsForContainer = _interopRequireDefault(require("./getCYARowsForContainer"));
15
+
12
16
  var _showComponentCYA = _interopRequireDefault(require("./showComponentCYA"));
13
17
 
14
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -27,7 +31,11 @@ var getCYARowsForPage = function getCYARowsForPage(page, onAction) {
27
31
  if (_FormPage.default.show(page, page.formData)) {
28
32
  return page.components.filter(function (c) {
29
33
  return (0, _showComponentCYA.default)(c, page.formData);
30
- }).map(function (component) {
34
+ }).flatMap(function (component) {
35
+ if (component.type === _models.ComponentTypes.CONTAINER) {
36
+ return (0, _getCYARowsForContainer.default)(page, component, page.formData[component.fieldId], onAction);
37
+ }
38
+
31
39
  return (0, _getCYARow.default)(page, component, onAction);
32
40
  });
33
41
  }
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ var _models = require("../../models");
4
+
3
5
  var _getCYARowsForPage = _interopRequireDefault(require("./getCYARowsForPage"));
4
6
 
5
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -129,6 +131,48 @@ describe('utils', function () {
129
131
  });
130
132
  });
131
133
  });
134
+ it('should get a appropriate row for a page with a single readonly text component inside of a container', function () {
135
+ var FORM_DATA = {
136
+ container: {
137
+ a: 'Bravo'
138
+ }
139
+ };
140
+ var COMPONENT = {
141
+ type: 'text',
142
+ readonly: true,
143
+ id: 'a',
144
+ fieldId: 'a',
145
+ label: 'Alpha'
146
+ };
147
+ var CONTAINER = {
148
+ id: 'container',
149
+ fieldId: 'container',
150
+ type: _models.ComponentTypes.CONTAINER,
151
+ components: [COMPONENT],
152
+ value: FORM_DATA.container,
153
+ formData: FORM_DATA
154
+ };
155
+ var PAGE = {
156
+ id: 'page',
157
+ components: [CONTAINER],
158
+ formData: FORM_DATA
159
+ };
160
+
161
+ var ON_ACTION = function ON_ACTION() {};
162
+
163
+ var ROWS = (0, _getCYARowsForPage.default)(PAGE, ON_ACTION);
164
+ expect(ROWS.length).toEqual(1);
165
+ ROWS.forEach(function (row, index) {
166
+ expectObjectLike(row, {
167
+ pageId: PAGE.id,
168
+ fieldId: CONTAINER.components[index].fieldId,
169
+ key: CONTAINER.components[index].label,
170
+ action: null,
171
+ component: COMPONENT,
172
+ value: 'Bravo'
173
+ });
174
+ });
175
+ });
132
176
  });
133
177
  });
134
178
  });
@@ -9,6 +9,8 @@ var _models = require("../../models");
9
9
 
10
10
  var _Component = _interopRequireDefault(require("../Component"));
11
11
 
12
+ var _Container = _interopRequireDefault(require("../Container"));
13
+
12
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
15
 
14
16
  // Local imports
@@ -31,6 +33,10 @@ var showComponentCYA = function showComponentCYA(options, data) {
31
33
  return false;
32
34
  }
33
35
 
36
+ if (options.type === _models.ComponentTypes.CONTAINER) {
37
+ return _Container.default.show(options, data);
38
+ }
39
+
34
40
  return _Component.default.show(options, data);
35
41
  };
36
42
 
@@ -19,7 +19,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
19
19
 
20
20
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
21
21
 
22
- var JSON_ONLY_PROPERTIES = ['source', 'use', 'show_when', 'options'];
22
+ var JSON_ONLY_PROPERTIES = ['source', 'use', 'show_when', 'options', 'additionalValidation', 'full_path'];
23
23
  /**
24
24
  * This method removes and properties that are entirely specific to the JSON
25
25
  * configuration and that should not be used as HTML attributes.
@@ -95,6 +95,11 @@ var getTextInput = function getTextInput(config) {
95
95
  return /*#__PURE__*/_react.default.createElement(_copReactComponents.TextInput, attrs);
96
96
  };
97
97
 
98
+ var getTime = function getTime(config) {
99
+ var attrs = (0, _cleanAttributes.default)(config);
100
+ return /*#__PURE__*/_react.default.createElement(_copReactComponents.TimeInput, attrs);
101
+ };
102
+
98
103
  var getComponentByType = function getComponentByType(config) {
99
104
  switch (config.type) {
100
105
  case _models.ComponentTypes.HTML:
@@ -123,6 +128,9 @@ var getComponentByType = function getComponentByType(config) {
123
128
  case _models.ComponentTypes.DATE:
124
129
  return getDate(config);
125
130
 
131
+ case _models.ComponentTypes.TIME:
132
+ return getTime(config);
133
+
126
134
  case _models.ComponentTypes.CHECKBOXES:
127
135
  return getCheckboxes(config);
128
136
 
@@ -132,9 +140,27 @@ var getComponentByType = function getComponentByType(config) {
132
140
  }
133
141
  }
134
142
  };
143
+ /**
144
+ * Get a renderable component, based on a configuration object.
145
+ * @param {object} config The configuration object for the component.
146
+ * @param {boolean} wrap Indicates whether or not the component should be wrapped.
147
+ * @param {Function} fnOverride An optional override function for component rendering.
148
+ * @returns A renderable component.
149
+ */
150
+
135
151
 
136
152
  var getComponent = function getComponent(config) {
137
153
  var wrap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
154
+ var fnOverride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
155
+
156
+ if (typeof fnOverride === 'function') {
157
+ var overrideComponent = fnOverride(config, wrap);
158
+
159
+ if (overrideComponent) {
160
+ return overrideComponent;
161
+ }
162
+ }
163
+
138
164
  var component = getComponentByType(config);
139
165
 
140
166
  if (component && wrap && (0, _isEditable.default)(config)) {
@@ -8,7 +8,7 @@ exports.default = exports.EDITABLE_TYPES = void 0;
8
8
  var _models = require("../../models");
9
9
 
10
10
  // Local imports
11
- var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.CHECKBOXES, _models.ComponentTypes.DATE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT, _models.ComponentTypes.TEXT_AREA];
11
+ var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.CHECKBOXES, _models.ComponentTypes.DATE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT, _models.ComponentTypes.TEXT_AREA, _models.ComponentTypes.TIME];
12
12
  exports.EDITABLE_TYPES = EDITABLE_TYPES;
13
13
 
14
14
  var isEditable = function isEditable(options) {
@@ -5,9 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _Data = _interopRequireDefault(require("../Data"));
9
-
10
- var _meetsCondition = _interopRequireDefault(require("../meetsCondition"));
8
+ var _Condition = _interopRequireDefault(require("../Condition"));
11
9
 
12
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
11
 
@@ -21,23 +19,7 @@ var showComponent = function showComponent(component, data) {
21
19
  return false;
22
20
  }
23
21
 
24
- if (component.show_when) {
25
- if (Array.isArray(component.show_when)) {
26
- var allConditionsMet = true;
27
- component.show_when.forEach(function (condition) {
28
- var sourceDataValue = _Data.default.getSource(data, condition.field);
29
-
30
- allConditionsMet = allConditionsMet && (0, _meetsCondition.default)(condition, sourceDataValue);
31
- });
32
- return allConditionsMet;
33
- } else {
34
- var sourceDataValue = _Data.default.getSource(data, component.show_when.field);
35
-
36
- return (0, _meetsCondition.default)(component.show_when, sourceDataValue);
37
- }
38
- }
39
-
40
- return true;
22
+ return _Condition.default.meetsAll(component, data);
41
23
  };
42
24
 
43
25
  var _default = showComponent;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _meetsAllConditions = _interopRequireDefault(require("./meetsAllConditions"));
9
+
10
+ var _meetsCondition = _interopRequireDefault(require("./meetsCondition"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ var Condition = {
15
+ meetsAll: _meetsAllConditions.default,
16
+ met: _meetsCondition.default
17
+ };
18
+ var _default = Condition;
19
+ exports.default = _default;