@ukhomeoffice/cop-react-form-renderer 3.17.1 → 3.18.1
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.
- package/dist/components/FormPage/FormPage.js +2 -2
- package/dist/components/FormRenderer/FormRenderer.js +3 -3
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +52 -6
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +168 -110
- package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +6 -6
- package/package.json +2 -2
|
@@ -51,7 +51,7 @@ var DEFAULT_CLASS = 'hods-form';
|
|
|
51
51
|
exports.DEFAULT_CLASS = DEFAULT_CLASS;
|
|
52
52
|
|
|
53
53
|
var FormPage = function FormPage(_ref) {
|
|
54
|
-
var _page$actions;
|
|
54
|
+
var _page$actions, _page$actions2;
|
|
55
55
|
|
|
56
56
|
var page = _ref.page,
|
|
57
57
|
_onAction = _ref.onAction,
|
|
@@ -104,7 +104,7 @@ var FormPage = function FormPage(_ref) {
|
|
|
104
104
|
formData: _objectSpread(_objectSpread({}, page.formData), patch)
|
|
105
105
|
});
|
|
106
106
|
}), /*#__PURE__*/_react.default.createElement(_PageActions.default, {
|
|
107
|
-
actions: page.actions.filter(function (action) {
|
|
107
|
+
actions: (_page$actions2 = page.actions) === null || _page$actions2 === void 0 ? void 0 : _page$actions2.filter(function (action) {
|
|
108
108
|
return _utils.default.Component.show(action, page.formData);
|
|
109
109
|
}),
|
|
110
110
|
onAction: function onAction(action) {
|
|
@@ -229,15 +229,15 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
229
229
|
if (hubDetails !== null && hubDetails !== void 0 && hubDetails.sections) {
|
|
230
230
|
var _data$formStatus2;
|
|
231
231
|
|
|
232
|
-
var tasks = data
|
|
232
|
+
var tasks = (data === null || data === void 0 ? void 0 : (_data$formStatus2 = data.formStatus) === null || _data$formStatus2 === void 0 ? void 0 : _data$formStatus2.tasks) || {};
|
|
233
233
|
|
|
234
|
-
var updatedSections = _helpers.default.getUpdatedSectionStates(hubDetails.sections, tasks);
|
|
234
|
+
var updatedSections = _helpers.default.getUpdatedSectionStates(hubDetails.sections, tasks, hubDetails.nonSequential);
|
|
235
235
|
|
|
236
236
|
setHubDetails(function (prev) {
|
|
237
237
|
return _objectSpread(_objectSpread({}, prev), updatedSections);
|
|
238
238
|
});
|
|
239
239
|
}
|
|
240
|
-
}, [currentTask.fullPages, data, hubDetails === null || hubDetails === void 0 ? void 0 : hubDetails.sections]);
|
|
240
|
+
}, [currentTask.fullPages, data, hubDetails === null || hubDetails === void 0 ? void 0 : hubDetails.sections, hubDetails === null || hubDetails === void 0 ? void 0 : hubDetails.nonSequential]);
|
|
241
241
|
|
|
242
242
|
var onPageChange = function onPageChange(newPageId) {
|
|
243
243
|
clearErrors();
|
|
@@ -7,6 +7,28 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _models = require("../../../models");
|
|
9
9
|
|
|
10
|
+
var getCurrentTaskState = function getCurrentTaskState(_ref, defaultState) {
|
|
11
|
+
var complete = _ref.complete,
|
|
12
|
+
currentPage = _ref.currentPage;
|
|
13
|
+
|
|
14
|
+
if (complete) {
|
|
15
|
+
return _models.TaskStates.TYPES.COMPLETE;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (currentPage) {
|
|
19
|
+
return _models.TaskStates.TYPES.IN_PROGRESS;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return defaultState;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
var allDependentTasksComplete = function allDependentTasksComplete(tasks, mustBeComplete) {
|
|
26
|
+
return mustBeComplete.reduce(function (allComplete, taskName) {
|
|
27
|
+
var _tasks$taskName;
|
|
28
|
+
|
|
29
|
+
return allComplete && ((_tasks$taskName = tasks[taskName]) === null || _tasks$taskName === void 0 ? void 0 : _tasks$taskName.complete);
|
|
30
|
+
}, true);
|
|
31
|
+
};
|
|
10
32
|
/**
|
|
11
33
|
* Updates the given task list sections with the latest states
|
|
12
34
|
* @param {object} sections The JSON defining the sections in the task list
|
|
@@ -19,15 +41,13 @@ var _models = require("../../../models");
|
|
|
19
41
|
}
|
|
20
42
|
* @returns An JSON representation of the task list sections with up to date states
|
|
21
43
|
*/
|
|
22
|
-
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
var getUpdatedSequentialStates = function getUpdatedSequentialStates(sections, tasks) {
|
|
23
47
|
return sections.map(function (section, sectionIndex, sectionArray) {
|
|
24
48
|
return section.tasks.map(function (task, taskIndex, taskArray) {
|
|
25
49
|
if (tasks[task.name]) {
|
|
26
|
-
|
|
27
|
-
task.state = _models.TaskStates.TYPES.COMPLETE;
|
|
28
|
-
} else if (tasks[task.name].currentPage) {
|
|
29
|
-
task.state = _models.TaskStates.TYPES.IN_PROGRESS;
|
|
30
|
-
}
|
|
50
|
+
task.state = getCurrentTaskState(tasks[task.name], task.state);
|
|
31
51
|
} else {
|
|
32
52
|
var _taskArray, _sectionArray, _sectionArray$tasks$s;
|
|
33
53
|
|
|
@@ -46,5 +66,31 @@ var getUpdatedSectionStates = function getUpdatedSectionStates(sections, tasks)
|
|
|
46
66
|
});
|
|
47
67
|
};
|
|
48
68
|
|
|
69
|
+
var getUpdatedNonSequentialStates = function getUpdatedNonSequentialStates(sections, tasks) {
|
|
70
|
+
return sections.map(function (section) {
|
|
71
|
+
return section.tasks.map(function (task) {
|
|
72
|
+
if (tasks[task.name]) {
|
|
73
|
+
task.state = getCurrentTaskState(tasks[task.name], task.state);
|
|
74
|
+
} else if (task.depends_on && !allDependentTasksComplete(tasks, task.depends_on)) {
|
|
75
|
+
task.state = _models.TaskStates.TYPES.CANNOT_START_YET;
|
|
76
|
+
} else {
|
|
77
|
+
task.state = _models.TaskStates.TYPES.NOT_STARTED;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return task;
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
var getUpdatedSectionStates = function getUpdatedSectionStates(sections, tasks) {
|
|
86
|
+
var nonSequential = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
87
|
+
|
|
88
|
+
if (nonSequential === true) {
|
|
89
|
+
return getUpdatedNonSequentialStates(sections, tasks);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return getUpdatedSequentialStates(sections, tasks);
|
|
93
|
+
};
|
|
94
|
+
|
|
49
95
|
var _default = getUpdatedSectionStates;
|
|
50
96
|
exports.default = _default;
|
|
@@ -7,116 +7,174 @@ var _models = require("../../../models");
|
|
|
7
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
8
|
|
|
9
9
|
// Local imports
|
|
10
|
-
describe('components', function () {
|
|
11
|
-
describe('
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
10
|
+
describe('components.FormRenderer.helpers.getUpdatedSectionStates', function () {
|
|
11
|
+
describe('sequential tasks', function () {
|
|
12
|
+
it("should set all tasks to '".concat(_models.TaskStates.TYPES.CANNOT_START_YET, "' excluding the first which should be '").concat(_models.TaskStates.TYPES.NOT_STARTED, "'"), function () {
|
|
13
|
+
var SECTIONS = [{
|
|
14
|
+
name: 'Add event details',
|
|
15
|
+
tasks: [{
|
|
16
|
+
name: 'Date, location and mode details',
|
|
17
|
+
pages: ['eventDate', 'eventMode']
|
|
18
|
+
}, {
|
|
19
|
+
name: 'Officer and agency details',
|
|
20
|
+
pages: ['officeDetails']
|
|
21
|
+
}]
|
|
22
|
+
}, {
|
|
23
|
+
name: 'Add people details',
|
|
24
|
+
tasks: [{
|
|
25
|
+
name: 'People details',
|
|
26
|
+
pages: ['firstName', 'surname']
|
|
27
|
+
}, {
|
|
28
|
+
name: 'Immigration details',
|
|
29
|
+
pages: ['immigrationDate']
|
|
30
|
+
}, {
|
|
31
|
+
name: 'Journey details',
|
|
32
|
+
pages: ['journeyDetails']
|
|
33
|
+
}]
|
|
34
|
+
}];
|
|
35
|
+
var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, {});
|
|
36
|
+
expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED);
|
|
37
|
+
expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
|
|
38
|
+
expect(updatedSections[1][0].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
|
|
39
|
+
expect(updatedSections[1][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
|
|
40
|
+
expect(updatedSections[1][2].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
|
|
41
|
+
});
|
|
42
|
+
it("should set tasks after any '".concat(_models.TaskStates.TYPES.COMPLETE, "' ones to '").concat(_models.TaskStates.TYPES.NOT_STARTED, "'"), function () {
|
|
43
|
+
var SECTIONS = [{
|
|
44
|
+
name: 'Add event details',
|
|
45
|
+
tasks: [{
|
|
46
|
+
name: 'Date, location and mode details',
|
|
47
|
+
pages: ['eventDate', 'eventMode']
|
|
48
|
+
}, {
|
|
49
|
+
name: 'Officer and agency details',
|
|
50
|
+
pages: ['officeDetails']
|
|
51
|
+
}]
|
|
52
|
+
}];
|
|
53
|
+
var TASKS = {
|
|
54
|
+
'Date, location and mode details': {
|
|
55
|
+
complete: true
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS);
|
|
59
|
+
expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.COMPLETE);
|
|
60
|
+
expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED);
|
|
61
|
+
});
|
|
62
|
+
it("should set tasks after any '".concat(_models.TaskStates.TYPES.COMPLETE, "' ones to '").concat(_models.TaskStates.TYPES.NOT_STARTED, " across different sections'"), function () {
|
|
63
|
+
var SECTIONS = [{
|
|
64
|
+
name: 'Add event details',
|
|
65
|
+
tasks: [{
|
|
66
|
+
name: 'Date, location and mode details',
|
|
67
|
+
pages: ['eventDate', 'eventMode']
|
|
68
|
+
}, {
|
|
69
|
+
name: 'Officer and agency details',
|
|
70
|
+
pages: ['officeDetails']
|
|
71
|
+
}]
|
|
72
|
+
}, {
|
|
73
|
+
name: 'Add people details',
|
|
74
|
+
tasks: [{
|
|
75
|
+
name: 'People details',
|
|
76
|
+
pages: ['firstName', 'surname']
|
|
77
|
+
}, {
|
|
78
|
+
name: 'Immigration details',
|
|
79
|
+
pages: ['immigrationDate']
|
|
80
|
+
}]
|
|
81
|
+
}];
|
|
82
|
+
var TASKS = {
|
|
83
|
+
'Date, location and mode details': {
|
|
84
|
+
complete: true
|
|
85
|
+
},
|
|
86
|
+
'Officer and agency details': {
|
|
87
|
+
complete: true
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS);
|
|
91
|
+
expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.COMPLETE);
|
|
92
|
+
expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.COMPLETE);
|
|
93
|
+
expect(updatedSections[1][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED);
|
|
94
|
+
expect(updatedSections[1][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
|
|
95
|
+
});
|
|
96
|
+
it("should set tasks to '".concat(_models.TaskStates.TYPES.IN_PROGRESS, "' if they have a current page but are not complete"), function () {
|
|
97
|
+
var SECTIONS = [{
|
|
98
|
+
name: 'Add event details',
|
|
99
|
+
tasks: [{
|
|
100
|
+
name: 'Date, location and mode details',
|
|
101
|
+
pages: ['eventDate', 'eventMode']
|
|
102
|
+
}, {
|
|
103
|
+
name: 'Officer and agency details',
|
|
104
|
+
pages: ['officeDetails']
|
|
105
|
+
}]
|
|
106
|
+
}];
|
|
107
|
+
var TASKS = {
|
|
108
|
+
'Date, location and mode details': {
|
|
109
|
+
complete: false,
|
|
110
|
+
currentPage: 'eventMode'
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
var updatedSections = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS);
|
|
114
|
+
expect(updatedSections[0][0].state).toEqual(_models.TaskStates.TYPES.IN_PROGRESS);
|
|
115
|
+
expect(updatedSections[0][1].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('non-sequential tasks', function () {
|
|
119
|
+
var NON_SEQUENTIAL = true;
|
|
120
|
+
var SECTIONS = [{
|
|
121
|
+
name: 'First',
|
|
122
|
+
tasks: [{
|
|
123
|
+
name: 'Alpha'
|
|
124
|
+
}, {
|
|
125
|
+
name: 'Bravo'
|
|
126
|
+
}]
|
|
127
|
+
}, {
|
|
128
|
+
name: 'Second',
|
|
129
|
+
tasks: [{
|
|
130
|
+
name: 'Charlie',
|
|
131
|
+
depends_on: ['Alpha', 'Bravo']
|
|
132
|
+
}]
|
|
133
|
+
}, {
|
|
134
|
+
name: 'Third',
|
|
135
|
+
tasks: [{
|
|
136
|
+
name: 'Delta'
|
|
137
|
+
}]
|
|
138
|
+
}];
|
|
139
|
+
it("should set all states to '".concat(_models.TaskStates.TYPES.NOT_STARTED, "', except any that depend on others"), function () {
|
|
140
|
+
var RESULT = (0, _getUpdatedSectionStates.default)(SECTIONS, {}, NON_SEQUENTIAL);
|
|
141
|
+
expect(RESULT[0][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED); // Alpha
|
|
142
|
+
|
|
143
|
+
expect(RESULT[0][1].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED); // Bravo
|
|
144
|
+
|
|
145
|
+
expect(RESULT[1][0].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET); // Charlie
|
|
146
|
+
|
|
147
|
+
expect(RESULT[2][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED); // Delta
|
|
148
|
+
});
|
|
149
|
+
it('should keep dependent state unable to start if any dependencies are not complete', function () {
|
|
150
|
+
var ALPHA_COMPLETE = (0, _getUpdatedSectionStates.default)(SECTIONS, {
|
|
151
|
+
Alpha: {
|
|
152
|
+
complete: true
|
|
153
|
+
}
|
|
154
|
+
}, NON_SEQUENTIAL);
|
|
155
|
+
expect(ALPHA_COMPLETE[1][0].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET); // Charlie
|
|
156
|
+
|
|
157
|
+
var BRAVO_COMPLETE = (0, _getUpdatedSectionStates.default)(SECTIONS, {
|
|
158
|
+
Bravo: {
|
|
159
|
+
complete: true
|
|
160
|
+
}
|
|
161
|
+
}, NON_SEQUENTIAL);
|
|
162
|
+
expect(BRAVO_COMPLETE[1][0].state).toEqual(_models.TaskStates.TYPES.CANNOT_START_YET); // Charlie
|
|
163
|
+
});
|
|
164
|
+
it('should allow dependent state to start if all dependencies are complete', function () {
|
|
165
|
+
var TASKS = {
|
|
166
|
+
'Alpha': {
|
|
167
|
+
complete: true
|
|
168
|
+
},
|
|
169
|
+
'Bravo': {
|
|
170
|
+
complete: true
|
|
171
|
+
},
|
|
172
|
+
'Delta': {}
|
|
173
|
+
};
|
|
174
|
+
var RESULT = (0, _getUpdatedSectionStates.default)(SECTIONS, TASKS, NON_SEQUENTIAL);
|
|
175
|
+
expect(RESULT[1][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED); // Charlie
|
|
176
|
+
|
|
177
|
+
expect(RESULT[2][0].state).toEqual(_models.TaskStates.TYPES.NOT_STARTED); // Delta
|
|
120
178
|
});
|
|
121
179
|
});
|
|
122
180
|
});
|
|
@@ -102,8 +102,8 @@ describe('utils.Component.get', function () {
|
|
|
102
102
|
_react.fireEvent.click(checkboxItems[0].childNodes[0]); // alpha
|
|
103
103
|
|
|
104
104
|
|
|
105
|
-
expect(ON_CHANGE_CALLS.length).toEqual(
|
|
106
|
-
expect(ON_CHANGE_CALLS[
|
|
105
|
+
expect(ON_CHANGE_CALLS.length).toEqual(1);
|
|
106
|
+
expect(ON_CHANGE_CALLS[0]).toMatchObject({
|
|
107
107
|
name: FIELD_ID,
|
|
108
108
|
value: [OPTIONS[0].value]
|
|
109
109
|
});
|
|
@@ -111,8 +111,8 @@ describe('utils.Component.get', function () {
|
|
|
111
111
|
_react.fireEvent.click(checkboxItems[1].childNodes[0]); // beta
|
|
112
112
|
|
|
113
113
|
|
|
114
|
-
expect(ON_CHANGE_CALLS.length).toEqual(
|
|
115
|
-
expect(ON_CHANGE_CALLS[
|
|
114
|
+
expect(ON_CHANGE_CALLS.length).toEqual(2);
|
|
115
|
+
expect(ON_CHANGE_CALLS[1]).toMatchObject({
|
|
116
116
|
name: FIELD_ID,
|
|
117
117
|
value: [OPTIONS[0].value, OPTIONS[1].value]
|
|
118
118
|
});
|
|
@@ -120,8 +120,8 @@ describe('utils.Component.get', function () {
|
|
|
120
120
|
_react.fireEvent.click(checkboxItems[0].childNodes[0]); // alpha (unchecked this time)
|
|
121
121
|
|
|
122
122
|
|
|
123
|
-
expect(ON_CHANGE_CALLS.length).toEqual(
|
|
124
|
-
expect(ON_CHANGE_CALLS[
|
|
123
|
+
expect(ON_CHANGE_CALLS.length).toEqual(3);
|
|
124
|
+
expect(ON_CHANGE_CALLS[2]).toMatchObject({
|
|
125
125
|
name: FIELD_ID,
|
|
126
126
|
value: [OPTIONS[1].value]
|
|
127
127
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ukhomeoffice/cop-react-form-renderer",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.18.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"scripts": {
|
|
6
6
|
"clean": "rimraf dist",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"post-compile": "rimraf dist/*.test.* dist/**/*.test.* dist/**/*.stories.* dist/docs dist/assets"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@ukhomeoffice/cop-react-components": "1.
|
|
19
|
+
"@ukhomeoffice/cop-react-components": "1.13.1",
|
|
20
20
|
"axios": "^0.23.0",
|
|
21
21
|
"dayjs": "^1.11.0",
|
|
22
22
|
"govuk-frontend": "^3.13.0",
|