@ukhomeoffice/cop-react-form-renderer 1.0.0-alpha → 1.0.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.
@@ -13,8 +13,6 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
 
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
- var _models = require("../../models");
17
-
18
16
  var _utils = _interopRequireDefault(require("../../utils"));
19
17
 
20
18
  var _PageActions = _interopRequireDefault(require("../PageActions"));
@@ -59,6 +57,7 @@ exports.DEFAULT_MARGIN_BOTTOM = DEFAULT_MARGIN_BOTTOM;
59
57
  var CheckYourAnswers = function CheckYourAnswers(_ref) {
60
58
  var title = _ref.title,
61
59
  _pages = _ref.pages,
60
+ actions = _ref.actions,
62
61
  _onAction = _ref.onAction,
63
62
  onRowAction = _ref.onRowAction,
64
63
  hide_page_titles = _ref.hide_page_titles,
@@ -124,7 +123,7 @@ var CheckYourAnswers = function CheckYourAnswers(_ref) {
124
123
  rows: page.rows
125
124
  }));
126
125
  }), !hide_actions && /*#__PURE__*/_react.default.createElement(_PageActions.default, {
127
- actions: [_models.PageAction.TYPES.SUBMIT],
126
+ actions: actions,
128
127
  onAction: function onAction(action) {
129
128
  return _onAction(action, onError);
130
129
  }
@@ -134,6 +133,7 @@ var CheckYourAnswers = function CheckYourAnswers(_ref) {
134
133
  CheckYourAnswers.propTypes = {
135
134
  title: _propTypes.default.string.isRequired,
136
135
  pages: _propTypes.default.arrayOf(_propTypes.default.object).isRequired,
136
+ actions: _propTypes.default.arrayOf(_propTypes.default.object),
137
137
  onAction: _propTypes.default.func.isRequired,
138
138
  onRowAction: _propTypes.default.func.isRequired,
139
139
  hide_page_titles: _propTypes.default.bool,
@@ -13,6 +13,7 @@ import GRADE from '../../json/grade.json';
13
13
  import TEAMS from '../../json/team.json';
14
14
  import USER_PROFILE_DATA from '../../json/userProfile.data.json';
15
15
  import USER_PROFILE from '../../json/userProfile.json';
16
+ import FIRST_FORM from '../../json/firstForm.json';
16
17
 
17
18
  <Meta title="Components/Check your answers" id="D-CheckYourAnswers" component={ CheckYourAnswers } decorators={[withMock]} />
18
19
 
@@ -24,19 +25,19 @@ Renders the **Check your answers** screen for a form.
24
25
  <Story name="Default" parameters={{
25
26
  mockData: [
26
27
  {
27
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
28
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
28
29
  method: 'GET',
29
30
  status: 200,
30
31
  response: CIVIL_SERVANT
31
32
  },
32
33
  {
33
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
34
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
34
35
  method: 'GET',
35
36
  status: 200,
36
37
  response: GRADE
37
38
  },
38
39
  {
39
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
40
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
40
41
  method: 'GET',
41
42
  status: 200,
42
43
  response: TEAMS
@@ -44,13 +45,16 @@ Renders the **Check your answers** screen for a form.
44
45
  ]
45
46
  }}>
46
47
  {() => {
47
- const DATA = Utils.Data.setupForm(USER_PROFILE.pages, USER_PROFILE.components, USER_PROFILE_DATA)
48
+ const DATA = Utils.Data.setupForm(USER_PROFILE.pages, USER_PROFILE.components, USER_PROFILE_DATA);
48
49
  const PAGES = Utils.FormPage.getAll(USER_PROFILE.pages, USER_PROFILE.components, { ...DATA });
49
50
  const ON_ACTION = (action, patch, onError) => {
50
51
  console.log('action invoked', action, patch);
51
52
  };
53
+ const ON_ROW_ACTION = (page) => {
54
+ console.log('row action invoked', page);
55
+ };
52
56
  return (
53
- <CheckYourAnswers pages={PAGES} onAction={ON_ACTION} />
57
+ <CheckYourAnswers pages={PAGES} onAction={ON_ACTION} onRowAction={ON_ROW_ACTION} />
54
58
  );
55
59
  }}
56
60
  </Story>
@@ -67,19 +71,19 @@ Renders the **Check your answers** screen for a form.
67
71
  <Story name="No page titles" parameters={{
68
72
  mockData: [
69
73
  {
70
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
74
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
71
75
  method: 'GET',
72
76
  status: 200,
73
77
  response: CIVIL_SERVANT
74
78
  },
75
79
  {
76
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
80
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
77
81
  method: 'GET',
78
82
  status: 200,
79
83
  response: GRADE
80
84
  },
81
85
  {
82
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
86
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
83
87
  method: 'GET',
84
88
  status: 200,
85
89
  response: TEAMS
@@ -87,13 +91,58 @@ Renders the **Check your answers** screen for a form.
87
91
  ]
88
92
  }}>
89
93
  {() => {
90
- const DATA = Utils.Data.setupForm(USER_PROFILE.pages, USER_PROFILE.components, USER_PROFILE_DATA)
94
+ const DATA = Utils.Data.setupForm(USER_PROFILE.pages, USER_PROFILE.components, USER_PROFILE_DATA);
91
95
  const PAGES = Utils.FormPage.getAll(USER_PROFILE.pages, USER_PROFILE.components, { ...DATA });
92
96
  const ON_ACTION = (action, patch, onError) => {
93
97
  console.log('action invoked', action, patch);
94
98
  };
99
+ const ON_ROW_ACTION = (page) => {
100
+ console.log('row action invoked', page);
101
+ };
102
+ return (
103
+ <CheckYourAnswers pages={PAGES} hide_page_titles={true} onAction={ON_ACTION} onRowAction={ON_ROW_ACTION} />
104
+ );
105
+ }}
106
+ </Story>
107
+ </Canvas>
108
+
109
+ ### With actions
110
+
111
+ <Canvas>
112
+ <Story name="With actions" parameters={{
113
+ mockData: [
114
+ {
115
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
116
+ method: 'GET',
117
+ status: 200,
118
+ response: CIVIL_SERVANT
119
+ },
120
+ {
121
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
122
+ method: 'GET',
123
+ status: 200,
124
+ response: GRADE
125
+ },
126
+ {
127
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
128
+ method: 'GET',
129
+ status: 200,
130
+ response: TEAMS
131
+ }
132
+ ]
133
+ }}>
134
+ {() => {
135
+ const DATA = { firstName: 'John', surname: 'Smith', age: 41 };
136
+ const PAGES = Utils.FormPage.getAll(FIRST_FORM.pages, FIRST_FORM.components, { ...DATA });
137
+ const ACTIONS = FIRST_FORM.cya.actions;
138
+ const ON_ACTION = (action, patch, onError) => {
139
+ console.log('action invoked', action, patch);
140
+ };
141
+ const ON_ROW_ACTION = (page) => {
142
+ console.log('row action invoked', page);
143
+ };
95
144
  return (
96
- <CheckYourAnswers pages={PAGES} hide_page_titles={true} onAction={ON_ACTION} />
145
+ <CheckYourAnswers pages={PAGES} hide_page_titles={true} actions={ACTIONS} onAction={ON_ACTION} onRowAction={ON_ROW_ACTION} />
97
146
  );
98
147
  }}
99
148
  </Story>
@@ -80,7 +80,7 @@ describe('components', function () {
80
80
  var container = null;
81
81
 
82
82
  var refDataUrl = function refDataUrl(suffix) {
83
- return "".concat(_userProfileData.default.environmentContext.referenceDataUrl, "/").concat(suffix);
83
+ return "".concat(_userProfileData.default.urls.refData, "/").concat(suffix);
84
84
  };
85
85
 
86
86
  beforeEach(function () {
@@ -89,9 +89,9 @@ describe('components', function () {
89
89
  container = document.createElement('div');
90
90
  document.body.appendChild(container);
91
91
  mockAxios.reset();
92
- mockAxios.onGet(refDataUrl('v2/entities/areYouACivilServant')).reply(200, _areYouACivilServant.default);
93
- mockAxios.onGet(refDataUrl('v2/entities/grade')).reply(200, _grade.default);
94
- mockAxios.onGet(refDataUrl('v1/entities/team')).reply(200, _team.default);
92
+ mockAxios.onGet(refDataUrl('areYouACivilServant')).reply(200, _areYouACivilServant.default);
93
+ mockAxios.onGet(refDataUrl('grade')).reply(200, _grade.default);
94
+ mockAxios.onGet(refDataUrl('team')).reply(200, _team.default);
95
95
  });
96
96
  afterEach(function () {
97
97
  (0, _reactDom.unmountComponentAtNode)(container);
@@ -24,19 +24,19 @@ on the basis of a <Link href="/?path=/docs/f-json-component">JSON</Link> configu
24
24
  <Story name="Default" parameters={{
25
25
  mockData: [
26
26
  {
27
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
27
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
28
28
  method: 'GET',
29
29
  status: 200,
30
30
  response: CIVIL_SERVANT
31
31
  },
32
32
  {
33
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
33
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
34
34
  method: 'GET',
35
35
  status: 200,
36
36
  response: GRADE
37
37
  },
38
38
  {
39
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
39
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
40
40
  method: 'GET',
41
41
  status: 200,
42
42
  response: TEAMS
@@ -47,7 +47,7 @@ on the basis of a <Link href="/?path=/docs/f-json-component">JSON</Link> configu
47
47
  const COMPONENT = {
48
48
  ...USER_PROFILE.components.find(c => c.id === 'areYouACivilServant'),
49
49
  data: {
50
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`
50
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`
51
51
  }
52
52
  };
53
53
  const ON_CHANGE = ({ target }) => {
@@ -71,19 +71,19 @@ on the basis of a <Link href="/?path=/docs/f-json-component">JSON</Link> configu
71
71
  <Story name="Autocomplete" parameters={{
72
72
  mockData: [
73
73
  {
74
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
74
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
75
75
  method: 'GET',
76
76
  status: 200,
77
77
  response: CIVIL_SERVANT
78
78
  },
79
79
  {
80
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
80
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
81
81
  method: 'GET',
82
82
  status: 200,
83
83
  response: GRADE
84
84
  },
85
85
  {
86
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
86
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
87
87
  method: 'GET',
88
88
  status: 200,
89
89
  response: TEAMS
@@ -94,7 +94,7 @@ on the basis of a <Link href="/?path=/docs/f-json-component">JSON</Link> configu
94
94
  const COMPONENT = {
95
95
  ...USER_PROFILE.components.find(c => c.id === 'team'),
96
96
  data: {
97
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`
97
+ url: `${USER_PROFILE_DATA.urls.refData}/team`
98
98
  }
99
99
  };
100
100
  const ON_CHANGE = ({ target }) => {
@@ -128,19 +128,19 @@ on the basis of a <Link href="/?path=/docs/f-json-component">JSON</Link> configu
128
128
  <Story name="Unwrapped autocomplete" parameters={{
129
129
  mockData: [
130
130
  {
131
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
131
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
132
132
  method: 'GET',
133
133
  status: 200,
134
134
  response: CIVIL_SERVANT
135
135
  },
136
136
  {
137
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
137
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
138
138
  method: 'GET',
139
139
  status: 200,
140
140
  response: GRADE
141
141
  },
142
142
  {
143
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
143
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
144
144
  method: 'GET',
145
145
  status: 200,
146
146
  response: TEAMS
@@ -153,7 +153,7 @@ on the basis of a <Link href="/?path=/docs/f-json-component">JSON</Link> configu
153
153
  id: 'team2',
154
154
  fieldId: 'team2',
155
155
  data: {
156
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`
156
+ url: `${USER_PROFILE_DATA.urls.refData}/team`
157
157
  }
158
158
  };
159
159
  const ON_CHANGE = ({ target }) => {
@@ -25,19 +25,19 @@ on the basis of a <Link href="/?path=/docs/f-json-page">JSON</Link> configuratio
25
25
  <Story name="Default" parameters={{
26
26
  mockData: [
27
27
  {
28
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
28
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
29
29
  method: 'GET',
30
30
  status: 200,
31
31
  response: CIVIL_SERVANT
32
32
  },
33
33
  {
34
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
34
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
35
35
  method: 'GET',
36
36
  status: 200,
37
37
  response: GRADE
38
38
  },
39
39
  {
40
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
40
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
41
41
  method: 'GET',
42
42
  status: 200,
43
43
  response: TEAMS
@@ -68,19 +68,19 @@ on the basis of a <Link href="/?path=/docs/f-json-page">JSON</Link> configuratio
68
68
  <Story name="With autocomplete" parameters={{
69
69
  mockData: [
70
70
  {
71
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
71
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
72
72
  method: 'GET',
73
73
  status: 200,
74
74
  response: CIVIL_SERVANT
75
75
  },
76
76
  {
77
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
77
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
78
78
  method: 'GET',
79
79
  status: 200,
80
80
  response: GRADE
81
81
  },
82
82
  {
83
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
83
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
84
84
  method: 'GET',
85
85
  status: 200,
86
86
  response: TEAMS
@@ -36,7 +36,7 @@ describe('components', function () {
36
36
  id: 'pageId',
37
37
  title: 'Page 1',
38
38
  components: [TEXT],
39
- actions: ['submit'],
39
+ actions: [_models.PageAction.TYPES.SUBMIT],
40
40
  formData: {
41
41
  text: VALUE
42
42
  }
@@ -140,7 +140,7 @@ var FormRenderer = function FormRenderer(_ref) {
140
140
  // Check to see whether the action is able to proceed, which in
141
141
  // in the case of a submission will validate the fields in the page.
142
142
  if (_helpers.default.canActionProceed(action, formState.page, onError)) {
143
- if (action.type === 'navigate') {
143
+ if (action.type === _models.PageAction.TYPES.NAVIGATE) {
144
144
  _handlers.default.navigate(action, pageId, onPageChange);
145
145
  } else {
146
146
  // Submit.
@@ -154,7 +154,12 @@ var FormRenderer = function FormRenderer(_ref) {
154
154
  } // Now submit the data to the backend...
155
155
 
156
156
 
157
- hooks.onSubmit(action.type, submissionData, function () {
157
+ hooks.onSubmit(action.type, submissionData, function (response) {
158
+ // The backend response may well contain data we need so apply it.
159
+ setData(function (prev) {
160
+ return _objectSpread(_objectSpread({}, prev), response);
161
+ });
162
+
158
163
  var nextPageId = _helpers.default.getNextPageId(type, pages, pageId, action);
159
164
 
160
165
  onPageChange(nextPageId);
@@ -27,19 +27,19 @@ on the basis of a <Link href="/?path=/docs/f-json-form">JSON</Link> that describ
27
27
  <Story name="Default" parameters={{
28
28
  mockData: [
29
29
  {
30
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/areYouACivilServant`,
30
+ url: `${USER_PROFILE_DATA.urls.refData}/areYouACivilServant`,
31
31
  method: 'GET',
32
32
  status: 200,
33
33
  response: CIVIL_SERVANT
34
34
  },
35
35
  {
36
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v2/entities/grade`,
36
+ url: `${USER_PROFILE_DATA.urls.refData}/grade`,
37
37
  method: 'GET',
38
38
  status: 200,
39
39
  response: GRADE
40
40
  },
41
41
  {
42
- url: `${USER_PROFILE_DATA.environmentContext.referenceDataUrl}/v1/entities/team`,
42
+ url: `${USER_PROFILE_DATA.urls.refData}/team`,
43
43
  method: 'GET',
44
44
  status: 200,
45
45
  response: TEAMS
@@ -60,16 +60,16 @@ describe('components', function () {
60
60
  var container = null;
61
61
 
62
62
  var refDataUrl = function refDataUrl(suffix) {
63
- return "".concat(_userProfileData.default.environmentContext.referenceDataUrl, "/").concat(suffix);
63
+ return "".concat(_userProfileData.default.urls.refData, "/").concat(suffix);
64
64
  };
65
65
 
66
66
  beforeEach(function () {
67
67
  container = document.createElement('div');
68
68
  document.body.appendChild(container);
69
69
  mockAxios.reset();
70
- mockAxios.onGet(refDataUrl('v2/entities/areYouACivilServant')).reply(200, _areYouACivilServant.default);
71
- mockAxios.onGet(refDataUrl('v2/entities/grade')).reply(200, _grade.default);
72
- mockAxios.onGet(refDataUrl('v1/entities/team')).reply(200, _team.default);
70
+ mockAxios.onGet(refDataUrl('areYouACivilServant')).reply(200, _areYouACivilServant.default);
71
+ mockAxios.onGet(refDataUrl('grade')).reply(200, _grade.default);
72
+ mockAxios.onGet(refDataUrl('team')).reply(200, _team.default);
73
73
  });
74
74
  afterEach(function () {
75
75
  (0, _reactDom.unmountComponentAtNode)(container);
@@ -59,7 +59,7 @@ describe('components', function () {
59
59
  while (1) {
60
60
  switch (_context2.prev = _context2.next) {
61
61
  case 0:
62
- ACTION = 'submit';
62
+ ACTION = _models.PageAction.TYPES.SUBMIT;
63
63
  _render2 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_ActionButton.default, {
64
64
  action: ACTION,
65
65
  onAction: ON_ACTION
@@ -55,7 +55,7 @@ describe('components', function () {
55
55
  while (1) {
56
56
  switch (_context2.prev = _context2.next) {
57
57
  case 0:
58
- ACTIONS = ['submit'];
58
+ ACTIONS = [_models.PageAction.TYPES.SUBMIT];
59
59
  _render2 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_PageActions.default, {
60
60
  actions: ACTIONS,
61
61
  onAction: ON_ACTION
@@ -120,11 +120,11 @@ describe('components', function () {
120
120
  switch (_context4.prev = _context4.next) {
121
121
  case 0:
122
122
  NAVIGATE = {
123
- type: 'navigate',
123
+ type: _models.PageAction.TYPES.NAVIGATE,
124
124
  url: '/alpha',
125
125
  label: 'Alpha'
126
126
  };
127
- ACTIONS = [NAVIGATE, 'submit'];
127
+ ACTIONS = [NAVIGATE, _models.PageAction.TYPES.SUBMIT];
128
128
  _render4 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_PageActions.default, {
129
129
  actions: ACTIONS,
130
130
  onAction: ON_ACTION
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "FormRenderer", {
27
27
  return _FormRenderer.default;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "SummaryList", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _SummaryList.default;
34
+ }
35
+ });
30
36
 
31
37
  var _CheckYourAnswers = _interopRequireDefault(require("./CheckYourAnswers"));
32
38
 
@@ -36,4 +42,6 @@ var _FormPage = _interopRequireDefault(require("./FormPage"));
36
42
 
37
43
  var _FormRenderer = _interopRequireDefault(require("./FormRenderer"));
38
44
 
45
+ var _SummaryList = _interopRequireDefault(require("./SummaryList"));
46
+
39
47
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -12,6 +12,7 @@ var TYPE_INSET_TEXT = 'inset-text';
12
12
  var TYPE_PHONE_NUMBER = 'phone-number';
13
13
  var TYPE_RADIOS = 'radios';
14
14
  var TYPE_TEXT = 'text';
15
+ var TYPE_TEXT_AREA = 'textarea';
15
16
  var ComponentTypes = {
16
17
  AUTOCOMPLETE: TYPE_AUTOCOMPLETE,
17
18
  EMAIL: TYPE_EMAIL,
@@ -20,7 +21,8 @@ var ComponentTypes = {
20
21
  INSET_TEXT: TYPE_INSET_TEXT,
21
22
  PHONE_NUMBER: TYPE_PHONE_NUMBER,
22
23
  RADIOS: TYPE_RADIOS,
23
- TEXT: TYPE_TEXT
24
+ TEXT: TYPE_TEXT,
25
+ TEXT_AREA: TYPE_TEXT_AREA
24
26
  };
25
27
  var _default = ComponentTypes;
26
28
  exports.default = _default;
@@ -9,19 +9,18 @@ var _DefaultPageActions;
9
9
 
10
10
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
11
 
12
- var TYPE_SUBMIT = 'submit';
12
+ var TYPE_NAVIGATE = 'navigate';
13
13
  var TYPE_SAVE_AND_CONTINUE = 'saveAndContinue';
14
14
  var TYPE_SAVE_AND_RETURN = 'saveAndReturn';
15
+ var TYPE_SUBMIT = 'submit';
15
16
  var PageActionTypes = {
16
- SUBMIT: TYPE_SUBMIT,
17
+ NAVIGATE: TYPE_NAVIGATE,
17
18
  SAVE_AND_CONTINUE: TYPE_SAVE_AND_CONTINUE,
18
- SAVE_AND_RETURN: TYPE_SAVE_AND_RETURN
19
+ SAVE_AND_RETURN: TYPE_SAVE_AND_RETURN,
20
+ SUBMIT: TYPE_SUBMIT
19
21
  };
20
22
  exports.PageActionTypes = PageActionTypes;
21
- var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPageActions, TYPE_SUBMIT, {
22
- type: TYPE_SUBMIT,
23
- validate: true
24
- }), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_CONTINUE, {
23
+ var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPageActions, TYPE_NAVIGATE, undefined), _defineProperty(_DefaultPageActions, TYPE_SAVE_AND_CONTINUE, {
25
24
  type: TYPE_SAVE_AND_CONTINUE,
26
25
  validate: true,
27
26
  label: 'Save and continue'
@@ -30,6 +29,9 @@ var DefaultPageActions = (_DefaultPageActions = {}, _defineProperty(_DefaultPage
30
29
  validate: false,
31
30
  label: 'Save and return later',
32
31
  classModifiers: 'secondary'
32
+ }), _defineProperty(_DefaultPageActions, TYPE_SUBMIT, {
33
+ type: TYPE_SUBMIT,
34
+ validate: true
33
35
  }), _DefaultPageActions);
34
36
  exports.DefaultPageActions = DefaultPageActions;
35
37
  var PageAction = {
@@ -67,6 +67,11 @@ var getRadios = function getRadios(config) {
67
67
  }));
68
68
  };
69
69
 
70
+ var getTextArea = function getTextArea(config) {
71
+ var attrs = (0, _cleanAttributes.default)(config);
72
+ return /*#__PURE__*/_react.default.createElement(_copReactComponents.TextArea, attrs);
73
+ };
74
+
70
75
  var getTextInput = function getTextInput(config) {
71
76
  var attrs = (0, _cleanAttributes.default)(config);
72
77
  return /*#__PURE__*/_react.default.createElement(_copReactComponents.TextInput, attrs);
@@ -88,6 +93,9 @@ var getComponentByType = function getComponentByType(config) {
88
93
  case _models.ComponentTypes.PHONE_NUMBER:
89
94
  return getTextInput(config);
90
95
 
96
+ case _models.ComponentTypes.TEXT_AREA:
97
+ return getTextArea(config);
98
+
91
99
  case _models.ComponentTypes.AUTOCOMPLETE:
92
100
  return getAutocomplete(config);
93
101
 
@@ -325,5 +325,37 @@ describe('utils', function () {
325
325
  });
326
326
  });
327
327
  });
328
+ it('should return an appropriately rendered textarea component', function () {
329
+ var ID = 'test-id';
330
+ var FIELD_ID = 'field-id';
331
+ var LABEL = 'label';
332
+ var ROWS = 13;
333
+ var COMPONENT = {
334
+ type: _models.ComponentTypes.TEXT_AREA,
335
+ id: ID,
336
+ fieldId: FIELD_ID,
337
+ label: LABEL,
338
+ rows: ROWS,
339
+ 'data-testid': ID
340
+ };
341
+
342
+ var _render10 = (0, _react.render)((0, _getComponent.default)(COMPONENT)),
343
+ container = _render10.container;
344
+
345
+ var _getAllByTestId9 = (0, _react.getAllByTestId)(container, ID),
346
+ _getAllByTestId10 = _slicedToArray(_getAllByTestId9, 2),
347
+ formGroup = _getAllByTestId10[0],
348
+ textarea = _getAllByTestId10[1];
349
+
350
+ expect(formGroup.tagName).toEqual('DIV');
351
+ expect(formGroup.classList).toContain('govuk-form-group');
352
+ var label = formGroup.childNodes[0];
353
+ expect(label.innerHTML).toContain(LABEL);
354
+ expect(label.getAttribute('for')).toEqual(ID);
355
+ expect(textarea.tagName).toEqual('TEXTAREA');
356
+ expect(textarea.classList).toContain('govuk-textarea');
357
+ expect(textarea.getAttribute('rows')).toEqual("".concat(ROWS));
358
+ expect(textarea.id).toEqual(ID);
359
+ });
328
360
  });
329
361
  });
@@ -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.EMAIL, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT];
11
+ var EDITABLE_TYPES = [_models.ComponentTypes.AUTOCOMPLETE, _models.ComponentTypes.EMAIL, _models.ComponentTypes.PHONE_NUMBER, _models.ComponentTypes.RADIOS, _models.ComponentTypes.TEXT, _models.ComponentTypes.TEXT_AREA];
12
12
  exports.EDITABLE_TYPES = EDITABLE_TYPES;
13
13
 
14
14
  var isEditable = function isEditable(options) {
@@ -203,12 +203,12 @@ describe('utils', function () {
203
203
  // and data calculated for the fields, based on that source data.
204
204
 
205
205
  expect(RESULT).toEqual(_objectSpread(_objectSpread({}, _userProfileData.default), {}, {
206
- firstName: _userProfileData.default.keycloakContext.givenName,
207
- surname: _userProfileData.default.keycloakContext.familyName,
208
- team: _userProfileData.default.staffDetailsDataContext.defaultteam,
209
- staffGradeId: _userProfileData.default.staffDetailsDataContext.gradeid,
210
- linemanagerEmail: _userProfileData.default.extendedStaffDetailsContext.linemanagerEmail,
211
- delegateEmails: _userProfileData.default.extendedStaffDetailsContext.delegateEmails
206
+ firstName: _userProfileData.default.currentUser.givenName,
207
+ surname: _userProfileData.default.currentUser.familyName,
208
+ team: _userProfileData.default.userDetails.defaultteam,
209
+ staffGradeId: _userProfileData.default.userDetails.gradeid,
210
+ linemanagerEmail: _userProfileData.default.userDetails.linemanagerEmail,
211
+ delegateEmails: _userProfileData.default.userDetails.delegateEmails
212
212
  }));
213
213
  });
214
214
  });
@@ -9,7 +9,7 @@ describe('utils', function () {
9
9
  describe('Data', function () {
10
10
  describe('setupRefDataUrlForComponent', function () {
11
11
  var DATA = {
12
- environmentContext: {
12
+ urls: {
13
13
  refData: '/ref-data'
14
14
  }
15
15
  };
@@ -39,13 +39,13 @@ describe('utils', function () {
39
39
  id: 'component',
40
40
  // eslint-disable-next-line no-template-curly-in-string
41
41
  data: {
42
- url: '${environmentContext.refData}/v1/teams'
42
+ url: '${urls.refData}/v1/teams'
43
43
  }
44
44
  };
45
45
  expect((0, _setupRefDataUrlForComponent.default)(COMPONENT, DATA)).toEqual({
46
46
  id: COMPONENT.id,
47
47
  data: {
48
- url: "".concat(DATA.environmentContext.refData, "/v1/teams")
48
+ url: "".concat(DATA.urls.refData, "/v1/teams")
49
49
  }
50
50
  });
51
51
  });
@@ -68,7 +68,7 @@ describe('utils', function () {
68
68
  id: 'component',
69
69
  // eslint-disable-next-line no-template-curly-in-string
70
70
  data: {
71
- url: '${environmentContext.referenceData}/v1/teams'
71
+ url: '${urls.referenceData}/v1/teams'
72
72
  }
73
73
  };
74
74
  expect((0, _setupRefDataUrlForComponent.default)(COMPONENT, DATA)).toEqual({
@@ -44,7 +44,7 @@ var getFormPage = function getFormPage(pageOptions, formComponents, formData) {
44
44
  ret = _objectSpread({}, componentOptions);
45
45
  }
46
46
 
47
- return formData && formData.environmentContext ? _Data.default.refData.setupUrl(ret, formData) : ret;
47
+ return formData && formData.urls ? _Data.default.refData.setupUrl(ret, formData) : ret;
48
48
  });
49
49
  return _objectSpread(_objectSpread({}, pageOptions), {}, {
50
50
  formData: formData,
@@ -30,11 +30,11 @@ describe('utils', function () {
30
30
  label: 'Charlie',
31
31
  type: 'radios',
32
32
  data: {
33
- url: '${environmentContext.refData}/v3/charlies'
33
+ url: '${urls.refData}/v3/charlies'
34
34
  }
35
35
  }];
36
36
  var FORM_DATA = {
37
- environmentContext: {
37
+ urls: {
38
38
  refData: 'https://ho.gov.uk/ref-data/'
39
39
  }
40
40
  };
@@ -137,7 +137,7 @@ describe('utils', function () {
137
137
  }, C), {}, {
138
138
  cya_label: C.label,
139
139
  data: {
140
- url: "".concat(FORM_DATA.environmentContext.refData, "/v3/charlies")
140
+ url: "".concat(FORM_DATA.urls.refData, "/v3/charlies")
141
141
  }
142
142
  })],
143
143
  formData: FORM_DATA
@@ -30,11 +30,11 @@ describe('utils', function () {
30
30
  label: 'Charlie',
31
31
  type: 'radios',
32
32
  data: {
33
- url: '${environmentContext.refData}/v3/charlies'
33
+ url: '${urls.refData}/v3/charlies'
34
34
  }
35
35
  }];
36
36
  var FORM_DATA = {
37
- environmentContext: {
37
+ urls: {
38
38
  refData: 'https://ho.gov.uk/ref-data/'
39
39
  }
40
40
  };
@@ -84,7 +84,7 @@ describe('utils', function () {
84
84
  }, C), {}, {
85
85
  cya_label: C.label,
86
86
  data: {
87
- url: "".concat(FORM_DATA.environmentContext.refData, "/v3/charlies")
87
+ url: "".concat(FORM_DATA.urls.refData, "/v3/charlies")
88
88
  }
89
89
  })],
90
90
  formData: FORM_DATA
@@ -32,11 +32,11 @@ describe('utils', function () {
32
32
  label: 'Charlie',
33
33
  type: 'radios',
34
34
  data: {
35
- url: '${environmentContext.refData}/v3/charlies'
35
+ url: '${urls.refData}/v3/charlies'
36
36
  }
37
37
  }];
38
38
  var FORM_DATA = {
39
- environmentContext: {
39
+ urls: {
40
40
  refData: 'https://ho.gov.uk/ref-data/'
41
41
  }
42
42
  };
package/package.json CHANGED
@@ -1,21 +1,22 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "1.0.0-alpha",
3
+ "version": "1.0.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",
7
7
  "test": "react-scripts test",
8
+ "test:coverage": "yarn test --coverage --watchAll=false",
8
9
  "lint": "eslint --ext .js,.jsx src",
9
- "storybook:start": "start-storybook --docs --no-manager-cache -p 6007",
10
+ "storybook:start": "start-storybook --docs -s src/assets --no-manager-cache -p 6007",
10
11
  "storybook:build": "build-storybook --docs -s src/assets",
11
12
  "storybook:deploy": "yarn deploy-storybook",
12
13
  "storybook": "yarn storybook:start",
13
14
  "deploy-storybook": "storybook-to-ghpages -e storybook-static",
14
15
  "compile": "yarn clean && cross-env NODE_ENV=production babel src --out-dir dist --copy-files && yarn post-compile",
15
- "post-compile": "rimraf dist/**/*.test.* dist/**/*.stories.* dist/json dist/assets"
16
+ "post-compile": "rimraf dist/*.test.* dist/**/*.test.* dist/**/*.stories.* dist/docs dist/json dist/assets"
16
17
  },
17
18
  "dependencies": {
18
- "@ukhomeoffice/cop-react-components": "^0.6.0",
19
+ "@ukhomeoffice/cop-react-components": "^0.7.0",
19
20
  "axios": "^0.21.1",
20
21
  "govuk-frontend": "^3.13.0",
21
22
  "web-vitals": "^1.0.1"
@@ -44,14 +45,14 @@
44
45
  "cross-env": "^7.0.3",
45
46
  "html-react-parser": "^0.10.5",
46
47
  "node-sass": "^6.0.1",
47
- "react": "^17.0.2",
48
- "react-dom": "^17.0.2",
48
+ "react": "^16.13.1",
49
+ "react-dom": "^16.13.1",
49
50
  "react-scripts": "4.0.3",
50
51
  "storybook-addon-mock": "^2.0.1"
51
52
  },
52
53
  "peerDependencies": {
53
- "react": "^17.0.2",
54
- "react-dom": "^17.0.2",
54
+ "react": "^16.13.1",
55
+ "react-dom": "^16.13.1",
55
56
  "react-scripts": "4.0.3"
56
57
  },
57
58
  "optionalDependencies": {
@@ -1,18 +0,0 @@
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 _ = _interopRequireWildcard(require("."));
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
- it('should have exported everything appropriately', function () {
13
- expect(_.default).toBeDefined();
14
- expect(_.FormTypes).toBeDefined();
15
- expect(_.HubFormats).toBeDefined();
16
- expect(_.intercepts).toBeDefined();
17
- expect(_.Utils).toBeDefined();
18
- });