@ukhomeoffice/cop-react-form-renderer 0.1.0-beta

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 (82) hide show
  1. package/README.md +38 -0
  2. package/dist/components/CheckYourAnswers/CheckYourAnswers.js +77 -0
  3. package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +9 -0
  4. package/dist/components/CheckYourAnswers/index.js +13 -0
  5. package/dist/components/FormComponent/FormComponent.js +95 -0
  6. package/dist/components/FormComponent/index.js +13 -0
  7. package/dist/components/FormPage/FormPage.js +121 -0
  8. package/dist/components/FormPage/FormPage.scss +7 -0
  9. package/dist/components/FormPage/index.js +13 -0
  10. package/dist/components/FormRenderer/FormRenderer.js +203 -0
  11. package/dist/components/FormRenderer/FormRenderer.scss +5 -0
  12. package/dist/components/FormRenderer/helpers.js +66 -0
  13. package/dist/components/FormRenderer/helpers.test.js +158 -0
  14. package/dist/components/FormRenderer/index.js +13 -0
  15. package/dist/components/PageActions/PageActions.js +49 -0
  16. package/dist/components/PageActions/index.js +13 -0
  17. package/dist/components/SummaryList/RowAction.js +75 -0
  18. package/dist/components/SummaryList/SummaryList.js +93 -0
  19. package/dist/components/SummaryList/SummaryList.scss +2 -0
  20. package/dist/components/SummaryList/index.js +13 -0
  21. package/dist/components/index.js +31 -0
  22. package/dist/hooks/index.js +39 -0
  23. package/dist/hooks/useAxios.js +80 -0
  24. package/dist/hooks/useGetRequest.js +149 -0
  25. package/dist/hooks/useHooks.js +51 -0
  26. package/dist/hooks/useRefData.js +91 -0
  27. package/dist/index.js +48 -0
  28. package/dist/models/ComponentTypes.js +26 -0
  29. package/dist/models/FormTypes.js +18 -0
  30. package/dist/models/HubFormats.js +12 -0
  31. package/dist/models/index.js +31 -0
  32. package/dist/utils/CheckYourAnswers/getCYAAction.js +22 -0
  33. package/dist/utils/CheckYourAnswers/getCYAAction.test.js +92 -0
  34. package/dist/utils/CheckYourAnswers/getCYARow.js +27 -0
  35. package/dist/utils/CheckYourAnswers/getCYARow.test.js +151 -0
  36. package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +24 -0
  37. package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +134 -0
  38. package/dist/utils/CheckYourAnswers/index.js +17 -0
  39. package/dist/utils/CheckYourAnswers/showComponentCYA.js +37 -0
  40. package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +54 -0
  41. package/dist/utils/Component/cleanAttributes.js +55 -0
  42. package/dist/utils/Component/cleanAttributes.test.js +69 -0
  43. package/dist/utils/Component/getComponent.js +117 -0
  44. package/dist/utils/Component/getComponent.test.js +329 -0
  45. package/dist/utils/Component/index.js +28 -0
  46. package/dist/utils/Component/isEditable.js +19 -0
  47. package/dist/utils/Component/isEditable.test.js +42 -0
  48. package/dist/utils/Component/showComponent.js +44 -0
  49. package/dist/utils/Component/showComponent.test.js +94 -0
  50. package/dist/utils/Component/wrapInFormGroup.js +23 -0
  51. package/dist/utils/Data/getAutocompleteSource.js +28 -0
  52. package/dist/utils/Data/getAutocompleteSource.test.js +146 -0
  53. package/dist/utils/Data/getOptions.js +21 -0
  54. package/dist/utils/Data/getOptions.test.js +71 -0
  55. package/dist/utils/Data/getSourceData.js +34 -0
  56. package/dist/utils/Data/getSourceData.test.js +125 -0
  57. package/dist/utils/Data/index.js +34 -0
  58. package/dist/utils/Data/refDataToOptions.js +33 -0
  59. package/dist/utils/Data/refDataToOptions.test.js +99 -0
  60. package/dist/utils/Data/setupFormData.js +63 -0
  61. package/dist/utils/Data/setupFormData.test.js +216 -0
  62. package/dist/utils/Data/setupRefDataUrlForComponent.js +29 -0
  63. package/dist/utils/Data/setupRefDataUrlForComponent.test.js +83 -0
  64. package/dist/utils/FormPage/getFormPage.js +45 -0
  65. package/dist/utils/FormPage/getFormPages.js +33 -0
  66. package/dist/utils/FormPage/getParagraphFromText.js +20 -0
  67. package/dist/utils/FormPage/index.js +19 -0
  68. package/dist/utils/FormPage/useComponent.js +31 -0
  69. package/dist/utils/Hub/getFormHub.js +30 -0
  70. package/dist/utils/Hub/index.js +20 -0
  71. package/dist/utils/Validate/index.js +26 -0
  72. package/dist/utils/Validate/validateComponent.js +49 -0
  73. package/dist/utils/Validate/validateComponent.test.js +119 -0
  74. package/dist/utils/Validate/validateEmail.js +39 -0
  75. package/dist/utils/Validate/validateEmail.test.js +57 -0
  76. package/dist/utils/Validate/validatePage.js +35 -0
  77. package/dist/utils/Validate/validatePage.test.js +122 -0
  78. package/dist/utils/Validate/validateRequired.js +38 -0
  79. package/dist/utils/Validate/validateRequired.test.js +50 -0
  80. package/dist/utils/index.js +43 -0
  81. package/dist/utils/meetsCondition.js +79 -0
  82. package/package.json +91 -0
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+
3
+ var _react = require("@testing-library/react");
4
+
5
+ var _models = require("../../models");
6
+
7
+ var _getComponent = _interopRequireDefault(require("./getComponent"));
8
+
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+
11
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
+
13
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
+
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+
17
+ 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; }
18
+
19
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
20
+
21
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
22
+
23
+ describe('utils', function () {
24
+ describe('Component', function () {
25
+ describe('get', function () {
26
+ it('should return null for an unknown type', function () {
27
+ expect((0, _getComponent.default)({
28
+ type: 'unknown'
29
+ })).toBeNull();
30
+ });
31
+ it('should return a p tag by default for an HTML component', function () {
32
+ var ID = 'test-id';
33
+ var CONTENT = 'HTML content';
34
+ var COMPONENT = {
35
+ type: _models.ComponentTypes.HTML,
36
+ content: CONTENT,
37
+ 'data-testid': ID
38
+ };
39
+
40
+ var _render = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
41
+ container = _render.container;
42
+
43
+ var p = (0, _react.getByTestId)(container, ID);
44
+ expect(p.innerHTML).toContain(CONTENT);
45
+ expect(p.tagName).toEqual('P');
46
+ });
47
+ it('should return an appropriate tag for an HTML component', function () {
48
+ var ID = 'test-id';
49
+ var TAG_NAME = 'hr';
50
+ var COMPONENT = {
51
+ type: _models.ComponentTypes.HTML,
52
+ tagName: TAG_NAME,
53
+ 'data-testid': ID
54
+ };
55
+
56
+ var _render2 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
57
+ container = _render2.container;
58
+
59
+ var hr = (0, _react.getByTestId)(container, ID);
60
+ expect(hr.tagName).toEqual('HR');
61
+ });
62
+ it('should return an appropriately rendered heading component', function () {
63
+ var ID = 'test-id';
64
+ var SIZE = 'm';
65
+ var CONTENT = 'Heading text';
66
+ var COMPONENT = {
67
+ type: _models.ComponentTypes.HEADING,
68
+ size: SIZE,
69
+ content: CONTENT,
70
+ 'data-testid': ID
71
+ };
72
+
73
+ var _render3 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
74
+ container = _render3.container;
75
+
76
+ var heading = (0, _react.getByTestId)(container, ID);
77
+ expect(heading.innerHTML).toContain(CONTENT);
78
+ expect(heading.tagName).toEqual('H3');
79
+ expect(heading.classList).toContain("govuk-heading-".concat(SIZE));
80
+ });
81
+ it('should return an appropriately rendered inset-text component', function () {
82
+ var ID = 'test-id';
83
+ var CONTENT = 'Heading text';
84
+ var COMPONENT = {
85
+ type: _models.ComponentTypes.INSET_TEXT,
86
+ content: CONTENT,
87
+ 'data-testid': ID
88
+ };
89
+
90
+ var _render4 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
91
+ container = _render4.container;
92
+
93
+ var insetText = (0, _react.getByTestId)(container, ID);
94
+ expect(insetText.innerHTML).toContain(CONTENT);
95
+ expect(insetText.tagName).toEqual('DIV');
96
+ expect(insetText.classList).toContain('govuk-inset-text');
97
+ });
98
+ it('should return an appropriately rendered text component', function () {
99
+ var ID = 'test-id';
100
+ var FIELD_ID = 'field-id';
101
+ var LABEL = 'label';
102
+ var COMPONENT = {
103
+ type: _models.ComponentTypes.TEXT,
104
+ id: ID,
105
+ fieldId: FIELD_ID,
106
+ label: LABEL,
107
+ 'data-testid': ID
108
+ };
109
+
110
+ var _render5 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
111
+ container = _render5.container;
112
+
113
+ var _getAllByTestId = (0, _react.getAllByTestId)(container, ID),
114
+ _getAllByTestId2 = _slicedToArray(_getAllByTestId, 2),
115
+ formGroup = _getAllByTestId2[0],
116
+ input = _getAllByTestId2[1];
117
+
118
+ expect(formGroup.tagName).toEqual('DIV');
119
+ expect(formGroup.classList).toContain('govuk-form-group');
120
+ var label = undefined;
121
+ formGroup.childNodes.forEach(function (node) {
122
+ // Check if it's an element.
123
+ if (node instanceof Element && node.tagName === 'LABEL') {
124
+ label = node;
125
+ }
126
+ });
127
+ expect(label).toBeDefined();
128
+ expect(label.innerHTML).toContain(LABEL);
129
+ expect(label.getAttribute('for')).toEqual(ID);
130
+ expect(input.tagName).toEqual('INPUT');
131
+ expect(input.classList).toContain('govuk-input');
132
+ expect(input.id).toEqual(ID);
133
+ });
134
+ it('should return an appropriately rendered email component', function () {
135
+ var ID = 'test-id';
136
+ var FIELD_ID = 'field-id';
137
+ var LABEL = 'label';
138
+ var COMPONENT = {
139
+ type: _models.ComponentTypes.EMAIL,
140
+ id: ID,
141
+ fieldId: FIELD_ID,
142
+ label: LABEL,
143
+ 'data-testid': ID
144
+ };
145
+
146
+ var _render6 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
147
+ container = _render6.container;
148
+
149
+ var _getAllByTestId3 = (0, _react.getAllByTestId)(container, ID),
150
+ _getAllByTestId4 = _slicedToArray(_getAllByTestId3, 2),
151
+ formGroup = _getAllByTestId4[0],
152
+ input = _getAllByTestId4[1];
153
+
154
+ expect(formGroup.tagName).toEqual('DIV');
155
+ expect(formGroup.classList).toContain('govuk-form-group');
156
+ var label = undefined;
157
+ formGroup.childNodes.forEach(function (node) {
158
+ // Check if it's an element.
159
+ if (node instanceof Element && node.tagName === 'LABEL') {
160
+ label = node;
161
+ }
162
+ });
163
+ expect(label).toBeDefined();
164
+ expect(label.innerHTML).toContain(LABEL);
165
+ expect(label.getAttribute('for')).toEqual(ID);
166
+ expect(input.tagName).toEqual('INPUT');
167
+ expect(input.classList).toContain('govuk-input');
168
+ expect(input.id).toEqual(ID);
169
+ });
170
+ it('should return an appropriately rendered phone-number component', function () {
171
+ var ID = 'test-id';
172
+ var FIELD_ID = 'field-id';
173
+ var LABEL = 'label';
174
+ var COMPONENT = {
175
+ type: _models.ComponentTypes.PHONE_NUMBER,
176
+ id: ID,
177
+ fieldId: FIELD_ID,
178
+ label: LABEL,
179
+ 'data-testid': ID
180
+ };
181
+
182
+ var _render7 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
183
+ container = _render7.container;
184
+
185
+ var _getAllByTestId5 = (0, _react.getAllByTestId)(container, ID),
186
+ _getAllByTestId6 = _slicedToArray(_getAllByTestId5, 2),
187
+ formGroup = _getAllByTestId6[0],
188
+ input = _getAllByTestId6[1];
189
+
190
+ expect(formGroup.tagName).toEqual('DIV');
191
+ expect(formGroup.classList).toContain('govuk-form-group');
192
+ var label = undefined;
193
+ formGroup.childNodes.forEach(function (node) {
194
+ // Check if it's an element.
195
+ if (node instanceof Element && node.tagName === 'LABEL') {
196
+ label = node;
197
+ }
198
+ });
199
+ expect(label).toBeDefined();
200
+ expect(label.innerHTML).toContain(LABEL);
201
+ expect(label.getAttribute('for')).toEqual(ID);
202
+ expect(input.tagName).toEqual('INPUT');
203
+ expect(input.classList).toContain('govuk-input');
204
+ expect(input.id).toEqual(ID);
205
+ });
206
+ it('should return an appropriately rendered autocomplete component', function () {
207
+ var ID = 'test-id';
208
+ var FIELD_ID = 'field-id';
209
+ var LABEL = 'label';
210
+ var OPTIONS = [];
211
+ var COMPONENT = {
212
+ type: _models.ComponentTypes.AUTOCOMPLETE,
213
+ id: ID,
214
+ fieldId: FIELD_ID,
215
+ label: LABEL,
216
+ data: {
217
+ options: OPTIONS
218
+ },
219
+ 'data-testid': ID
220
+ };
221
+
222
+ var _render8 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
223
+ container = _render8.container;
224
+
225
+ var formGroup = (0, _react.getByTestId)(container, ID);
226
+ expect(formGroup.tagName).toEqual('DIV');
227
+ expect(formGroup.classList).toContain('govuk-form-group');
228
+ var label = undefined;
229
+ var autocompleteWrapper = undefined;
230
+ var autocomplete = undefined;
231
+ var autocompleteInput = undefined;
232
+ formGroup.childNodes.forEach(function (node) {
233
+ // Check if it's an element.
234
+ if (node instanceof Element) {
235
+ if (node.tagName === 'LABEL') {
236
+ label = node;
237
+ } else if (node.classList.contains('hods-autocomplete__outer-wrapper')) {
238
+ autocompleteWrapper = node;
239
+ var autocompleteInner = node.childNodes[0];
240
+
241
+ if (autocompleteInner instanceof Element) {
242
+ autocomplete = autocompleteInner;
243
+ autocomplete.childNodes.forEach(function (grandchild) {
244
+ if (grandchild instanceof Element) {
245
+ if (grandchild.tagName === 'INPUT') {
246
+ autocompleteInput = grandchild;
247
+ }
248
+ }
249
+ });
250
+ }
251
+
252
+ ;
253
+ }
254
+ }
255
+ });
256
+ expect(label).toBeDefined();
257
+ expect(label.innerHTML).toContain(LABEL);
258
+ expect(label.getAttribute('for')).toEqual(ID);
259
+ expect(autocompleteWrapper).toBeDefined();
260
+ expect(autocompleteWrapper.tagName).toEqual('DIV');
261
+ expect(autocomplete).toBeDefined();
262
+ expect(autocomplete.tagName).toEqual('DIV');
263
+ expect(autocompleteInput).toBeDefined();
264
+ expect(autocompleteInput.id).toEqual(ID);
265
+ });
266
+ it('should return an appropriately rendered radios component', function () {
267
+ var ID = 'test-id';
268
+ var FIELD_ID = 'field-id';
269
+ var LABEL = 'label';
270
+ var OPTIONS = [{
271
+ value: 'a',
272
+ label: 'Alpha'
273
+ }];
274
+ var COMPONENT = {
275
+ type: _models.ComponentTypes.RADIOS,
276
+ id: ID,
277
+ fieldId: FIELD_ID,
278
+ label: LABEL,
279
+ data: {
280
+ options: OPTIONS
281
+ },
282
+ 'data-testid': ID
283
+ };
284
+
285
+ var _render9 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
286
+ container = _render9.container;
287
+
288
+ var _getAllByTestId7 = (0, _react.getAllByTestId)(container, ID),
289
+ _getAllByTestId8 = _slicedToArray(_getAllByTestId7, 2),
290
+ formGroup = _getAllByTestId8[0],
291
+ radios = _getAllByTestId8[1];
292
+
293
+ expect(formGroup.tagName).toEqual('DIV');
294
+ expect(formGroup.classList).toContain('govuk-form-group');
295
+ var label = undefined;
296
+ formGroup.childNodes.forEach(function (node) {
297
+ // Check if it's an element.
298
+ if (node instanceof Element) {
299
+ if (node.tagName === 'LABEL') {
300
+ label = node;
301
+ }
302
+ }
303
+ });
304
+ expect(label).toBeDefined();
305
+ expect(label.innerHTML).toContain(LABEL);
306
+ expect(label.getAttribute('for')).toEqual(ID);
307
+ expect(radios.tagName).toEqual('DIV');
308
+ expect(radios.classList).toContain('govuk-radios');
309
+ expect(radios.childNodes.length).toEqual(OPTIONS.length);
310
+ var radioItems = [];
311
+ OPTIONS.forEach(function (_, index) {
312
+ var radio = radios.childNodes[index];
313
+ expect(radio instanceof Element).toBeTruthy();
314
+
315
+ if (radio instanceof Element) {
316
+ radioItems.push(radio);
317
+ }
318
+ });
319
+ expect(radioItems.length).toEqual(OPTIONS.length);
320
+ OPTIONS.forEach(function (option, index) {
321
+ var radio = radioItems[index];
322
+ expect(radio.tagName).toEqual('DIV');
323
+ expect(radio.classList).toContain('govuk-radios__item');
324
+ expect(radio.innerHTML).toContain(option.label);
325
+ });
326
+ });
327
+ });
328
+ });
329
+ });
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _cleanAttributes = _interopRequireDefault(require("./cleanAttributes"));
9
+
10
+ var _getComponent = _interopRequireDefault(require("./getComponent"));
11
+
12
+ var _isEditable = _interopRequireDefault(require("./isEditable"));
13
+
14
+ var _showComponent = _interopRequireDefault(require("./showComponent"));
15
+
16
+ var _wrapInFormGroup = _interopRequireDefault(require("./wrapInFormGroup"));
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ var Component = {
21
+ clean: _cleanAttributes.default,
22
+ get: _getComponent.default,
23
+ editable: _isEditable.default,
24
+ show: _showComponent.default,
25
+ wrap: _wrapInFormGroup.default
26
+ };
27
+ var _default = Component;
28
+ exports.default = _default;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.EDITABLE_TYPES = void 0;
7
+
8
+ var _models = require("../../models");
9
+
10
+ // Local imports
11
+ var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT];
12
+ exports.EDITABLE_TYPES = EDITABLE_TYPES;
13
+
14
+ var isEditable = function isEditable(options) {
15
+ return EDITABLE_TYPES.includes(options === null || options === void 0 ? void 0 : options.type);
16
+ };
17
+
18
+ var _default = isEditable;
19
+ exports.default = _default;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
+
5
+ var _isEditable = _interopRequireWildcard(require("./isEditable"));
6
+
7
+ 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); }
8
+
9
+ 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; }
10
+
11
+ // Local imports
12
+ describe('utils', function () {
13
+ describe('Component', function () {
14
+ describe('isEditable', function () {
15
+ _isEditable.EDITABLE_TYPES.forEach(function (type) {
16
+ it("should return true for a type of '".concat(type, "'"), function () {
17
+ var OPTIONS = {
18
+ type: type
19
+ };
20
+ expect((0, _isEditable.default)(OPTIONS)).toEqual(true);
21
+ });
22
+ });
23
+
24
+ it('should return false if options is undefined', function () {
25
+ expect((0, _isEditable.default)(undefined)).toEqual(false);
26
+ });
27
+ it('should return false if options is null', function () {
28
+ expect((0, _isEditable.default)(null)).toEqual(false);
29
+ });
30
+ it('should return false if options has no type', function () {
31
+ expect((0, _isEditable.default)({
32
+ bob: 'Bob'
33
+ })).toEqual(false);
34
+ });
35
+ it("should return false if options has a type of 'hidden'", function () {
36
+ expect((0, _isEditable.default)({
37
+ type: 'hidden'
38
+ })).toEqual(false);
39
+ });
40
+ });
41
+ });
42
+ });
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _Data = _interopRequireDefault(require("../Data"));
9
+
10
+ var _meetsCondition = _interopRequireDefault(require("../meetsCondition"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ // Local imports
15
+ var showComponent = function showComponent(component, data) {
16
+ if (!component) {
17
+ return false;
18
+ }
19
+
20
+ if (component.hidden && component.disabled) {
21
+ return false;
22
+ }
23
+
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;
41
+ };
42
+
43
+ var _default = showComponent;
44
+ exports.default = _default;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ var _showComponent = _interopRequireDefault(require("./showComponent"));
4
+
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+
7
+ // Local imports
8
+ describe('utils', function () {
9
+ describe('Component', function () {
10
+ describe('show', function () {
11
+ it('should not show when there are no options', function () {
12
+ expect((0, _showComponent.default)(null, null)).toBeFalsy();
13
+ });
14
+ it('should not show when hidden and disabled', function () {
15
+ expect((0, _showComponent.default)({
16
+ hidden: true,
17
+ disabled: true
18
+ }, null)).toBeFalsy();
19
+ });
20
+ it('should show when hidden but not disabled', function () {
21
+ expect((0, _showComponent.default)({
22
+ hidden: true
23
+ }, null)).toBeTruthy();
24
+ });
25
+ it('should show when disabled but not hidden', function () {
26
+ expect((0, _showComponent.default)({
27
+ disabled: true
28
+ }, null)).toBeTruthy();
29
+ });
30
+ it('should show when a single show_when condition is met', function () {
31
+ var COMPONENT = {
32
+ show_when: {
33
+ field: 'alpha',
34
+ op: 'eq',
35
+ value: 'bravo'
36
+ }
37
+ };
38
+ var DATA = {
39
+ alpha: 'bravo'
40
+ };
41
+ expect((0, _showComponent.default)(COMPONENT, DATA)).toBeTruthy();
42
+ });
43
+ it('should not show when a single show_when condition is not met', function () {
44
+ var COMPONENT = {
45
+ show_when: {
46
+ field: 'alpha',
47
+ op: 'eq',
48
+ value: 'bravo'
49
+ }
50
+ };
51
+ var DATA = {
52
+ alpha: 'charlie'
53
+ };
54
+ expect((0, _showComponent.default)(COMPONENT, DATA)).toBeFalsy();
55
+ });
56
+ it('should show when multiple show_when conditions are met', function () {
57
+ var COMPONENT = {
58
+ show_when: [{
59
+ field: 'alpha',
60
+ op: 'eq',
61
+ value: 'bravo'
62
+ }, {
63
+ field: 'charlie',
64
+ op: 'eq',
65
+ value: 'delta'
66
+ }]
67
+ };
68
+ var DATA = {
69
+ alpha: 'bravo',
70
+ charlie: 'delta'
71
+ };
72
+ expect((0, _showComponent.default)(COMPONENT, DATA)).toBeTruthy();
73
+ });
74
+ it('should not show when one of multiple show_when conditions is not met', function () {
75
+ var COMPONENT = {
76
+ show_when: [{
77
+ field: 'alpha',
78
+ op: 'eq',
79
+ value: 'bravo'
80
+ }, {
81
+ field: 'charlie',
82
+ op: 'eq',
83
+ value: 'delta'
84
+ }]
85
+ };
86
+ var DATA = {
87
+ alpha: 'bravo',
88
+ charlie: 'echo'
89
+ };
90
+ expect((0, _showComponent.default)(COMPONENT, DATA)).toBeFalsy();
91
+ });
92
+ });
93
+ });
94
+ });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
15
+
16
+ var wrapInFormGroup = function wrapInFormGroup(config, children) {
17
+ return /*#__PURE__*/_react.default.createElement(_copReactComponents.FormGroup, _extends({}, config, {
18
+ onChange: null
19
+ }), children);
20
+ };
21
+
22
+ var _default = wrapInFormGroup;
23
+ exports.default = _default;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _getOptions = _interopRequireDefault(require("./getOptions"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ // Local imports
13
+ var getAutocompleteSource = function getAutocompleteSource(config) {
14
+ var options = [];
15
+ (0, _getOptions.default)(config, function (val) {
16
+ options = val;
17
+ });
18
+ return function (query, populateResults) {
19
+ var lcQuery = query ? query.toLowerCase() : '';
20
+ populateResults(options.filter(function (opt) {
21
+ var lcLabel = opt.label ? opt.label.toLowerCase() : '';
22
+ return lcLabel.includes(lcQuery);
23
+ }));
24
+ };
25
+ };
26
+
27
+ var _default = getAutocompleteSource;
28
+ exports.default = _default;