@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
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ [![Build and test](https://github.com/UKHomeOffice/cop-react-form-renderer/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/UKHomeOffice/cop-react-form-renderer/actions/workflows/build-and-test.yml)
2
+ [![Publish cop-react-form-renderer to npm](https://github.com/UKHomeOffice/cop-react-form-renderer/actions/workflows/publish-cop-react-form-renderer-to-npm.yml/badge.svg)](https://github.com/UKHomeOffice/cop-react-form-renderer/actions/workflows/publish-cop-react-form-renderer-to-npm.yml)
3
+ [![Deploy Storybook](https://github.com/UKHomeOffice/cop-react-form-renderer/actions/workflows/deploy-storybook.yml/badge.svg)](https://github.com/UKHomeOffice/cop-react-form-renderer/actions/workflows/deploy-storybook.yml)
4
+ # Getting Started with COP React Form Renderer
5
+
6
+ The COP React Form Renderer is a library that renders a form on the basis of a supplied JSON.
7
+
8
+ It uses components from [COP React Design System](https://github.com/UKHomeOffice/cop-react-design-system).
9
+ - `@ukhomeoffice/cop-react-components` - and offers various styles of forms. These are showcased inside of
10
+ a [yarn storybook](Storybook) within the project.
11
+
12
+ ## Available Scripts
13
+
14
+ In the project directory, you can run:
15
+
16
+ ### `yarn lint`
17
+
18
+ Runs `eslint` against the project to check for coding issues.
19
+
20
+ ### `yarn test`
21
+
22
+ Launches the test runner in the interactive watch mode.\
23
+ See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
24
+
25
+ ### `yarn compile`
26
+
27
+ Builds the library for production to the `dist` folder.\
28
+ It correctly bundles React in production mode and optimizes the build for the best performance.
29
+
30
+ The build is minified and the filenames include the hashes.
31
+
32
+ ### `yarn storybook`
33
+
34
+ Runs Storybook on [http://localhost:6007](http://localhost:6007), which showcases the components within this library.
35
+
36
+ ### `yarn storybook:build`
37
+
38
+ Builds Storybook for production to the `storybook-static` folder.
@@ -0,0 +1,77 @@
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
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = exports.DEFAULT_MARGIN_BOTTOM = void 0;
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
15
+
16
+ var _SummaryList = _interopRequireDefault(require("../SummaryList"));
17
+
18
+ var _utils = _interopRequireDefault(require("../../utils"));
19
+
20
+ require("./CheckYourAnswers.scss");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ 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); }
25
+
26
+ 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; }
27
+
28
+ // Global imports
29
+ // Local imports
30
+ // Styles
31
+ var DEFAULT_MARGIN_BOTTOM = 9;
32
+ exports.DEFAULT_MARGIN_BOTTOM = DEFAULT_MARGIN_BOTTOM;
33
+
34
+ var CheckYourAnswers = function CheckYourAnswers(_ref) {
35
+ var title = _ref.title,
36
+ pages = _ref.pages,
37
+ hide_page_titles = _ref.hide_page_titles,
38
+ onAction = _ref.onAction;
39
+ var listMarginBottom = hide_page_titles ? 0 : DEFAULT_MARGIN_BOTTOM;
40
+
41
+ var isLastPage = function isLastPage(index) {
42
+ return index === pages.length - 1;
43
+ };
44
+
45
+ return /*#__PURE__*/_react.default.createElement("div", {
46
+ className: "hods-check-your-answers"
47
+ }, title && /*#__PURE__*/_react.default.createElement(_copReactComponents.LargeHeading, {
48
+ key: "heading"
49
+ }, title), pages && pages.map(function (page, pageIndex) {
50
+ var rows = _utils.default.CheckYourAnswers.getRows(page, onAction);
51
+
52
+ if (rows.length === 0) {
53
+ return null;
54
+ }
55
+
56
+ var pageMarginBottom = isLastPage(pageIndex) ? DEFAULT_MARGIN_BOTTOM : listMarginBottom;
57
+ var className = "govuk-!-margin-bottom-".concat(pageMarginBottom);
58
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, {
59
+ key: pageIndex
60
+ }, !hide_page_titles && page.title && /*#__PURE__*/_react.default.createElement(_copReactComponents.MediumHeading, null, page.title), /*#__PURE__*/_react.default.createElement(_SummaryList.default, {
61
+ className: className,
62
+ rows: rows
63
+ }));
64
+ }));
65
+ };
66
+
67
+ CheckYourAnswers.propTypes = {
68
+ title: _propTypes.default.string.isRequired,
69
+ pages: _propTypes.default.arrayOf(_propTypes.default.object).isRequired,
70
+ hide_page_titles: _propTypes.default.bool
71
+ };
72
+ CheckYourAnswers.defaultProps = {
73
+ title: 'Check your answers',
74
+ hide_page_titles: false
75
+ };
76
+ var _default = CheckYourAnswers;
77
+ exports.default = _default;
@@ -0,0 +1,9 @@
1
+ @import "node_modules/govuk-frontend/govuk/_base";
2
+ @import "node_modules/govuk-frontend/govuk/overrides/spacing";
3
+
4
+ .hods-check-your-answers {
5
+ .govuk-link {
6
+ color: govuk-colour('blue');
7
+ cursor: pointer;
8
+ }
9
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _CheckYourAnswers = _interopRequireDefault(require("./CheckYourAnswers"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var _default = _CheckYourAnswers.default;
13
+ exports.default = _default;
@@ -0,0 +1,95 @@
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
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _useRefData2 = _interopRequireWildcard(require("../../hooks/useRefData"));
15
+
16
+ var _utils = _interopRequireDefault(require("../../utils"));
17
+
18
+ var _excluded = ["component", "value", "noWrap", "onChange"];
19
+
20
+ 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); }
21
+
22
+ 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; }
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ 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; }
27
+
28
+ 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; }
29
+
30
+ 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; }
31
+
32
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
33
+
34
+ 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."); }
35
+
36
+ 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); }
37
+
38
+ 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; }
39
+
40
+ 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; }
41
+
42
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
43
+
44
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
45
+
46
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
47
+
48
+ var FormComponent = function FormComponent(_ref) {
49
+ var component = _ref.component,
50
+ value = _ref.value,
51
+ noWrap = _ref.noWrap,
52
+ onChange = _ref.onChange,
53
+ attrs = _objectWithoutProperties(_ref, _excluded);
54
+
55
+ var _useRefData = (0, _useRefData2.default)(component),
56
+ data = _useRefData.data,
57
+ status = _useRefData.status;
58
+
59
+ var _useState = (0, _react.useState)([]),
60
+ _useState2 = _slicedToArray(_useState, 2),
61
+ options = _useState2[0],
62
+ setOptions = _useState2[1];
63
+
64
+ (0, _react.useEffect)(function () {
65
+ if (status === _useRefData2.STATUS_COMPLETE) {
66
+ setOptions(data);
67
+ }
68
+ }, [component, data, status]);
69
+ return _utils.default.Component.get(_objectSpread(_objectSpread(_objectSpread({}, attrs), component), {}, {
70
+ label: component.label || '',
71
+ hint: component.hint || '',
72
+ options: options,
73
+ value: value,
74
+ onChange: onChange
75
+ }), noWrap);
76
+ };
77
+
78
+ FormComponent.propTypes = {
79
+ component: _propTypes.default.shape({
80
+ label: _propTypes.default.string,
81
+ hint: _propTypes.default.string,
82
+ data: _propTypes.default.shape({
83
+ options: _propTypes.default.arrayOf(_propTypes.default.object),
84
+ url: _propTypes.default.string
85
+ })
86
+ }).isRequired,
87
+ value: _propTypes.default.any.isRequired,
88
+ noWrap: _propTypes.default.bool,
89
+ onChange: _propTypes.default.func
90
+ };
91
+ FormComponent.defaultProps = {
92
+ noWrap: false
93
+ };
94
+ var _default = FormComponent;
95
+ exports.default = _default;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _FormComponent = _interopRequireDefault(require("./FormComponent"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var _default = _FormComponent.default;
13
+ exports.default = _default;
@@ -0,0 +1,121 @@
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
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
15
+
16
+ var _FormComponent = _interopRequireDefault(require("../FormComponent"));
17
+
18
+ var _PageActions = _interopRequireDefault(require("../PageActions"));
19
+
20
+ var _utils = _interopRequireDefault(require("../../utils"));
21
+
22
+ require("./FormPage.scss");
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ 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); }
27
+
28
+ 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; }
29
+
30
+ 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; }
31
+
32
+ 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; }
33
+
34
+ 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; }
35
+
36
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
37
+
38
+ 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."); }
39
+
40
+ 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); }
41
+
42
+ 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; }
43
+
44
+ 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; }
45
+
46
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
47
+
48
+ var DEFAULT_CLASS = 'hods-form';
49
+
50
+ var FormPage = function FormPage(_ref) {
51
+ var page = _ref.page,
52
+ _onAction = _ref.onAction,
53
+ classBlock = _ref.classBlock,
54
+ classModifiers = _ref.classModifiers,
55
+ className = _ref.className;
56
+
57
+ var _useState = (0, _react.useState)({}),
58
+ _useState2 = _slicedToArray(_useState, 2),
59
+ patch = _useState2[0],
60
+ setPatch = _useState2[1];
61
+
62
+ var _useState3 = (0, _react.useState)([]),
63
+ _useState4 = _slicedToArray(_useState3, 2),
64
+ errors = _useState4[0],
65
+ setErrors = _useState4[1];
66
+ /**
67
+ * Handle the state of the data directly within the page.
68
+ * This is so that the overall form data isn't affected until such
69
+ * time as the onAction handler is invoked.
70
+ */
71
+
72
+
73
+ var onPageChange = function onPageChange(_ref2) {
74
+ var target = _ref2.target;
75
+ page.formData[target.name] = target.value;
76
+ setPatch(function (prev) {
77
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, target.name, target.value));
78
+ });
79
+ };
80
+
81
+ var classes = _utils.default.classBuilder(classBlock, classModifiers, className);
82
+
83
+ return /*#__PURE__*/_react.default.createElement("div", {
84
+ className: classes('page'),
85
+ key: page.id
86
+ }, page.title && /*#__PURE__*/_react.default.createElement(_copReactComponents.LargeHeading, null, page.title), errors && errors.length > 0 && /*#__PURE__*/_react.default.createElement(_copReactComponents.ErrorSummary, {
87
+ errors: errors
88
+ }), page.components.map(function (component, index) {
89
+ return /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
90
+ key: index,
91
+ component: component,
92
+ value: page.formData[component.fieldId] || '',
93
+ onChange: onPageChange
94
+ });
95
+ }), page.actions && /*#__PURE__*/_react.default.createElement(_PageActions.default, {
96
+ actions: page.actions,
97
+ onAction: function onAction(action) {
98
+ return _onAction(action, patch, setErrors);
99
+ }
100
+ }));
101
+ };
102
+
103
+ FormPage.propTypes = {
104
+ page: _propTypes.default.shape({
105
+ id: _propTypes.default.string.isRequired,
106
+ title: _propTypes.default.string,
107
+ components: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object])).isRequired,
108
+ actions: _propTypes.default.array,
109
+ formData: _propTypes.default.object
110
+ }).isRequired,
111
+ onAction: _propTypes.default.func.isRequired,
112
+ classBlock: _propTypes.default.string,
113
+ classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
114
+ className: _propTypes.default.string
115
+ };
116
+ FormPage.defaultProps = {
117
+ classBlock: DEFAULT_CLASS,
118
+ classModifiers: []
119
+ };
120
+ var _default = FormPage;
121
+ exports.default = _default;
@@ -0,0 +1,7 @@
1
+ @import "node_modules/govuk-frontend/govuk/_base";
2
+
3
+ .hods-form {
4
+ &__page {
5
+ display: block;
6
+ }
7
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _FormPage = _interopRequireDefault(require("./FormPage"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var _default = _FormPage.default;
13
+ exports.default = _default;
@@ -0,0 +1,203 @@
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
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _hooks = require("../../hooks");
17
+
18
+ var _models = require("../../models");
19
+
20
+ var _utils = _interopRequireDefault(require("../../utils"));
21
+
22
+ var _CheckYourAnswers = _interopRequireDefault(require("../CheckYourAnswers"));
23
+
24
+ var _FormPage = _interopRequireDefault(require("../FormPage"));
25
+
26
+ var _helpers = require("./helpers");
27
+
28
+ require("./FormRenderer.scss");
29
+
30
+ 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); }
31
+
32
+ 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; }
33
+
34
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
+
36
+ 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); }
37
+
38
+ 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; }
39
+
40
+ 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; }
41
+
42
+ 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; }
43
+
44
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
45
+
46
+ 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."); }
47
+
48
+ 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); }
49
+
50
+ 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; }
51
+
52
+ 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; }
53
+
54
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
55
+
56
+ var DEFAULT_CLASS = 'hods-form';
57
+
58
+ var FormRenderer = function FormRenderer(_ref) {
59
+ var title = _ref.title,
60
+ type = _ref.type,
61
+ components = _ref.components,
62
+ _pages = _ref.pages,
63
+ _hub = _ref.hub,
64
+ _cya = _ref.cya,
65
+ _data = _ref.data,
66
+ hooks = _ref.hooks,
67
+ classBlock = _ref.classBlock,
68
+ classModifiers = _ref.classModifiers,
69
+ className = _ref.className;
70
+
71
+ // Set up the initial states.
72
+ var _useState = (0, _react.useState)({}),
73
+ _useState2 = _slicedToArray(_useState, 2),
74
+ data = _useState2[0],
75
+ setData = _useState2[1];
76
+
77
+ var _useState3 = (0, _react.useState)(0),
78
+ _useState4 = _slicedToArray(_useState3, 2),
79
+ redoPages = _useState4[0],
80
+ setRedoPages = _useState4[1];
81
+
82
+ var _useState5 = (0, _react.useState)([]),
83
+ _useState6 = _slicedToArray(_useState5, 2),
84
+ pages = _useState6[0],
85
+ setPages = _useState6[1];
86
+
87
+ var _useState7 = (0, _react.useState)(undefined),
88
+ _useState8 = _slicedToArray(_useState7, 2),
89
+ hub = _useState8[0],
90
+ setHub = _useState8[1];
91
+
92
+ var _useState9 = (0, _react.useState)('hub'),
93
+ _useState10 = _slicedToArray(_useState9, 2),
94
+ pageId = _useState10[0],
95
+ setPageId = _useState10[1];
96
+
97
+ var _useState11 = (0, _react.useState)((0, _helpers.getFormState)(pageId, pages, hub)),
98
+ _useState12 = _slicedToArray(_useState11, 2),
99
+ formState = _useState12[0],
100
+ setFormState = _useState12[1]; // Set up hooks.
101
+
102
+
103
+ var _useHooks = (0, _hooks.useHooks)(),
104
+ addHook = _useHooks.addHook;
105
+
106
+ (0, _react.useEffect)(function () {
107
+ if (hooks) {
108
+ Object.keys(hooks).forEach(function (key) {
109
+ addHook(key, hooks[key]);
110
+ });
111
+ }
112
+ }, [hooks, addHook]); // Setup data.
113
+
114
+ (0, _react.useEffect)(function () {
115
+ setData(_utils.default.Data.setupForm(_pages, components, _data));
116
+ }, [components, _pages, _data, setData]); // Setup pages.
117
+
118
+ (0, _react.useEffect)(function () {
119
+ setPages(_utils.default.FormPage.getAll(_pages, components, _objectSpread({}, data)));
120
+ }, [components, _pages, data, redoPages, setPages]); // Setup hub.
121
+
122
+ (0, _react.useEffect)(function () {
123
+ setHub(_utils.default.Hub.get(type, _hub, components));
124
+ }, [type, _hub, components, setHub]); // Form state.
125
+
126
+ (0, _react.useEffect)(function () {
127
+ setFormState((0, _helpers.getFormState)(pageId, pages, hub));
128
+ }, [pages, hub, pageId, setFormState]); // Handle actions from pages.
129
+
130
+ var onAction = function onAction(action, patch, onError) {
131
+ // First check the validity of the
132
+ if ((0, _helpers.canActionProceed)(action, formState.page, onError)) {
133
+ if (action.type === 'navigate') {
134
+ setPageId(action.url.replace('/', ''));
135
+ } else if (action.type === 'cancel') {
136
+ setRedoPages(Date.now);
137
+ setPageId('hub');
138
+ } else {
139
+ // Submit.
140
+ if (patch) {
141
+ setData(function (prev) {
142
+ return _objectSpread(_objectSpread({}, prev), patch);
143
+ });
144
+ } // Now submit the data to the backend and, if that succeeds...
145
+
146
+
147
+ setPageId('hub');
148
+ }
149
+ }
150
+ }; // Handle navigation from "Check your answers".
151
+
152
+
153
+ var onCheckYourAnswerChange = function onCheckYourAnswerChange(page) {
154
+ var action = page.action;
155
+
156
+ if (action && action.href) {
157
+ setPageId(action.href.replace('/', ''));
158
+ } else {
159
+ setPageId(page.pageId);
160
+ }
161
+ };
162
+
163
+ var classes = _utils.default.classBuilder(classBlock, classModifiers, className);
164
+
165
+ return /*#__PURE__*/_react.default.createElement("div", {
166
+ className: classes()
167
+ }, title && pageId === 'hub' && /*#__PURE__*/_react.default.createElement(_copReactComponents.LargeHeading, null, title), formState.cya && /*#__PURE__*/_react.default.createElement(_CheckYourAnswers.default, _extends({
168
+ pages: pages
169
+ }, _cya, formState.cya, {
170
+ onAction: onCheckYourAnswerChange
171
+ })), formState.page && /*#__PURE__*/_react.default.createElement(_FormPage.default, {
172
+ page: formState.page,
173
+ onAction: onAction,
174
+ classes: classes
175
+ }));
176
+ };
177
+
178
+ FormRenderer.propTypes = {
179
+ title: _propTypes.default.string,
180
+
181
+ /** See <a href="/?path=/docs/f-json--page#formtypes">FormTypes</a>. */
182
+ type: _propTypes.default.oneOf([_models.FormTypes.CYA, _models.FormTypes.FORM, _models.FormTypes.HUB, _models.FormTypes.WIZARD]).isRequired,
183
+ components: _propTypes.default.arrayOf(_propTypes.default.object).isRequired,
184
+ pages: _propTypes.default.arrayOf(_propTypes.default.object).isRequired,
185
+ hub: _propTypes.default.object,
186
+ cya: _propTypes.default.object,
187
+ data: _propTypes.default.object,
188
+ hooks: _propTypes.default.shape({
189
+ onRequest: _propTypes.default.func
190
+ }),
191
+ classBlock: _propTypes.default.string,
192
+ classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
193
+ className: _propTypes.default.string
194
+ };
195
+ FormRenderer.defaultProps = {
196
+ type: _models.FormTypes.HUB,
197
+ components: [],
198
+ pages: [],
199
+ classBlock: DEFAULT_CLASS,
200
+ classModifiers: []
201
+ };
202
+ var _default = FormRenderer;
203
+ exports.default = _default;
@@ -0,0 +1,5 @@
1
+ @import "node_modules/govuk-frontend/govuk/_base";
2
+
3
+ .hods-form {
4
+ display: block;
5
+ }