@ukhomeoffice/cop-react-form-renderer 6.0.6-peter → 6.5.1-peter
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/CheckYourAnswers/CheckYourAnswers.scss +2 -2
- package/dist/components/CollectionPage/CollectionPage.js +8 -2
- package/dist/components/CollectionSummary/BannerStrip.js +3 -2
- package/dist/components/CollectionSummary/BannerStrip.scss +2 -2
- package/dist/components/CollectionSummary/BannerStrip.test.js +39 -4
- package/dist/components/CollectionSummary/CollectionSummary.js +82 -63
- package/dist/components/CollectionSummary/CollectionSummary.scss +1 -1
- package/dist/components/CollectionSummary/CollectionSummary.test.js +40 -80
- package/dist/components/CollectionSummary/Confirmation.scss +1 -1
- package/dist/components/CollectionSummary/RenderListView.js +24 -20
- package/dist/components/CollectionSummary/RenderListView.scss +10 -1
- package/dist/components/CollectionSummary/RenderListView.test.js +14 -4
- package/dist/components/CollectionSummary/SummaryCard.js +59 -38
- package/dist/components/CollectionSummary/SummaryCard.scss +2 -1
- package/dist/components/CollectionSummary/SummaryCard.test.js +193 -150
- package/dist/components/CollectionSummary/SummaryCardDetails.js +70 -13
- package/dist/components/CollectionSummary/SummaryCardDetails.scss +43 -6
- package/dist/components/CollectionSummary/SummaryCardDetails.test.js +174 -26
- package/dist/components/CollectionSummary/SummaryCardValidationContext.js +15 -5
- package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +5 -4
- package/dist/components/FormComponent/Collection.js +24 -17
- package/dist/components/FormComponent/Collection.test.js +138 -0
- package/dist/components/FormComponent/FormComponent.js +12 -0
- package/dist/components/FormPage/FormPage.scss +1 -1
- package/dist/components/FormRenderer/FormRenderer.js +7 -4
- package/dist/components/FormRenderer/FormRenderer.scss +1 -1
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-airpax-after.json +429 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-airpax-before.json +449 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-airpax-form.json +15219 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-eab-2-data-after.json +516 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-eab-2-data-before.json +593 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-eab2-form.json +15219 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-mandec-data-after.json +84 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-mandec-data-before.json +98 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-mandec-form.json +9158 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/test.json +1605 -0
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/test2.json +205 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +69 -38
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +30 -0
- package/dist/components/FormRenderer/helpers/deleteNodeByPath.js +8 -2
- package/dist/components/FormRenderer/onPageAction.js +6 -1
- package/dist/components/FormRenderer/onPageAction.test.js +18 -4
- package/dist/components/SummaryList/SummaryList.scss +2 -2
- package/dist/components/TaskList/TaskList.scss +1 -1
- package/dist/context/ValidationContext/ValidationContext.js +49 -5
- package/dist/context/ValidationContext/ValidationContext.test.js +16 -7
- package/dist/hooks/useRefData.js +1 -1
- package/dist/utils/CheckYourAnswers/showComponentCYA.js +1 -2
- package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +5 -0
- package/dist/utils/CollectionPage/addCollectionPageEntry.js +1 -2
- package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +4 -24
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +13 -1
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +17 -2
- package/dist/utils/CollectionPage/getErrorsForCollection.js +55 -0
- package/dist/utils/CollectionPage/getErrorsForCollection.test.js +155 -0
- package/dist/utils/CollectionPage/getQuickEditPage.js +7 -1
- package/dist/utils/CollectionPage/index.js +2 -0
- package/dist/utils/CollectionPage/setCollectionPageData.js +9 -4
- package/dist/utils/CollectionPage/setCollectionPageData.test.js +18 -0
- package/dist/utils/Component/isEditable.js +1 -1
- package/dist/utils/Condition/meetsCondition.js +18 -0
- package/dist/utils/Condition/meetsCondition.test.js +100 -0
- package/dist/utils/Data/getOptions.js +10 -0
- package/dist/utils/Data/getOptions.test.js +73 -0
- package/dist/utils/Data/nestInRefdataOptions.js +49 -0
- package/dist/utils/Data/nestInRefdataOptions.test.js +236 -0
- package/dist/utils/Validate/validateContainer.js +3 -1
- package/dist/utils/Validate/validateContainer.test.js +33 -0
- package/dist/utils/Validate/validateEmail.js +1 -1
- package/dist/utils/Validate/validatePage.js +10 -1
- package/dist/utils/Validate/validatePage.test.js +69 -0
- package/package.json +4 -4
|
@@ -9,6 +9,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
9
9
|
var _react = _interopRequireDefault(require("react"));
|
|
10
10
|
var _utils = _interopRequireDefault(require("../../utils"));
|
|
11
11
|
var _getComponentRowForCYA = _interopRequireDefault(require("../../utils/CheckYourAnswers/getComponentRowForCYA"));
|
|
12
|
+
var _Condition = _interopRequireDefault(require("../../utils/Condition"));
|
|
12
13
|
require("./RenderListView.scss");
|
|
13
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
15
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
@@ -27,11 +28,11 @@ var DEFAULT_DELETE_BUTTON_LABEL = exports.DEFAULT_DELETE_BUTTON_LABEL = 'Delete'
|
|
|
27
28
|
var DEFAULT_CHANGE_BUTTON_CLASS = exports.DEFAULT_CHANGE_BUTTON_CLASS = 'secondary';
|
|
28
29
|
var DEFAULT_DELETE_BUTTON_CLASS = exports.DEFAULT_DELETE_BUTTON_CLASS = 'warning';
|
|
29
30
|
var RenderListView = function RenderListView(_ref) {
|
|
30
|
-
var _masterPage$childPage;
|
|
31
|
+
var _config$changeAction, _config$deleteAction, _masterPage$childPage;
|
|
31
32
|
var id = _ref.id,
|
|
32
33
|
entryData = _ref.entryData,
|
|
33
34
|
config = _ref.config,
|
|
34
|
-
|
|
35
|
+
onFullEdit = _ref.onFullEdit,
|
|
35
36
|
onDelete = _ref.onDelete,
|
|
36
37
|
masterPage = _ref.masterPage,
|
|
37
38
|
classModifiers = _ref.classModifiers;
|
|
@@ -50,21 +51,15 @@ var RenderListView = function RenderListView(_ref) {
|
|
|
50
51
|
className: classes('actions')
|
|
51
52
|
}, /*#__PURE__*/_react.default.createElement("li", {
|
|
52
53
|
className: classes('action')
|
|
53
|
-
}, config.changeAction && typeof
|
|
54
|
-
|
|
54
|
+
}, config.changeAction && typeof onFullEdit === 'function' && /*#__PURE__*/_react.default.createElement("button", {
|
|
55
|
+
type: "button",
|
|
56
|
+
className: "govuk-link govuk-link-button",
|
|
55
57
|
onClick: function onClick() {
|
|
56
|
-
return
|
|
58
|
+
return onFullEdit(config.changeAction.page, entryData.id);
|
|
57
59
|
},
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
role: "button",
|
|
64
|
-
tabIndex: 0,
|
|
65
|
-
style: {
|
|
66
|
-
cursor: 'pointer'
|
|
67
|
-
}
|
|
60
|
+
"aria-label": _copReactComponents.Utils.interpolateString("".concat(((_config$changeAction = config.changeAction) === null || _config$changeAction === void 0 ? void 0 : _config$changeAction.label) || DEFAULT_CHANGE_BUTTON_LABEL, " ").concat(config.title || DEFAULT_TITLE), _objectSpread(_objectSpread({}, entryData), {}, {
|
|
61
|
+
index: entryData.index + 1
|
|
62
|
+
}))
|
|
68
63
|
}, config.changeAction.label || DEFAULT_CHANGE_BUTTON_LABEL)), /*#__PURE__*/_react.default.createElement("li", {
|
|
69
64
|
className: classes('action')
|
|
70
65
|
}, config.deleteAction && typeof onDelete === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
|
|
@@ -72,7 +67,10 @@ var RenderListView = function RenderListView(_ref) {
|
|
|
72
67
|
onClick: function onClick() {
|
|
73
68
|
return onDelete(entryData);
|
|
74
69
|
},
|
|
75
|
-
classModifiers: config.deleteAction.classModifiers || DEFAULT_DELETE_BUTTON_CLASS
|
|
70
|
+
classModifiers: config.deleteAction.classModifiers || DEFAULT_DELETE_BUTTON_CLASS,
|
|
71
|
+
"aria-label": _copReactComponents.Utils.interpolateString("".concat(((_config$deleteAction = config.deleteAction) === null || _config$deleteAction === void 0 ? void 0 : _config$deleteAction.label) || DEFAULT_DELETE_BUTTON_LABEL, " ").concat(config.title || DEFAULT_TITLE), _objectSpread(_objectSpread({}, entryData), {}, {
|
|
72
|
+
index: entryData.index + 1
|
|
73
|
+
}))
|
|
76
74
|
}, config.deleteAction.label || DEFAULT_DELETE_BUTTON_LABEL)))), /*#__PURE__*/_react.default.createElement("div", {
|
|
77
75
|
className: classes('content')
|
|
78
76
|
}, /*#__PURE__*/_react.default.createElement("dl", {
|
|
@@ -83,12 +81,18 @@ var RenderListView = function RenderListView(_ref) {
|
|
|
83
81
|
return _utils.default.Component.elevateNested([component], entryData);
|
|
84
82
|
}).flat().filter(Boolean);
|
|
85
83
|
return (_childPage$summaryLay = childPage.summaryLayout) === null || _childPage$summaryLay === void 0 || (_childPage$summaryLay = _childPage$summaryLay.sections) === null || _childPage$summaryLay === void 0 ? void 0 : _childPage$summaryLay.flatMap(function (section) {
|
|
86
|
-
|
|
87
|
-
return
|
|
84
|
+
var filteredColumns = section.columns.filter(function (column) {
|
|
85
|
+
return _Condition.default.meetsAll(column, _objectSpread(_objectSpread({}, childPage.formData), entryData));
|
|
86
|
+
});
|
|
87
|
+
var summaryFields = filteredColumns.flatMap(function (column) {
|
|
88
|
+
return column.fields || [];
|
|
89
|
+
});
|
|
90
|
+
if (summaryFields.length) {
|
|
91
|
+
return summaryFields.flatMap(function (fieldId) {
|
|
88
92
|
var component = elevatedComponents.find(function (comp) {
|
|
89
93
|
return comp.fieldId === fieldId;
|
|
90
94
|
});
|
|
91
|
-
if (!component) {
|
|
95
|
+
if (!component || !_Condition.default.meetsAll(component, _objectSpread(_objectSpread({}, childPage.formData), entryData))) {
|
|
92
96
|
return null;
|
|
93
97
|
}
|
|
94
98
|
return (0, _getComponentRowForCYA.default)(childPage, component, listClass, entryData);
|
|
@@ -117,7 +121,7 @@ RenderListView.propTypes = {
|
|
|
117
121
|
}),
|
|
118
122
|
listView: _propTypes.default.bool
|
|
119
123
|
}).isRequired,
|
|
120
|
-
|
|
124
|
+
onFullEdit: _propTypes.default.func.isRequired,
|
|
121
125
|
onDelete: _propTypes.default.func.isRequired,
|
|
122
126
|
masterPage: _propTypes.default.shape({
|
|
123
127
|
childPages: _propTypes.default.arrayOf(_propTypes.default.shape({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$govuk-font-family: 'Roboto', arial, sans-serif;
|
|
2
2
|
|
|
3
|
-
@import "
|
|
3
|
+
@import "govuk-frontend/dist/govuk/_base";
|
|
4
4
|
|
|
5
5
|
.govuk-summary-list {
|
|
6
6
|
@include govuk-font($size: 19);
|
|
@@ -179,6 +179,10 @@ $govuk-font-family: 'Roboto', arial, sans-serif;
|
|
|
179
179
|
.govuk-summary-card {
|
|
180
180
|
@include govuk-responsive-margin(6, "bottom");
|
|
181
181
|
border: 1px solid $govuk-border-colour;
|
|
182
|
+
|
|
183
|
+
&--deleting-summary-card {
|
|
184
|
+
background-color: #FCF0EE;
|
|
185
|
+
}
|
|
182
186
|
}
|
|
183
187
|
|
|
184
188
|
.govuk-summary-card__title-wrapper {
|
|
@@ -271,3 +275,8 @@ $govuk-font-family: 'Roboto', arial, sans-serif;
|
|
|
271
275
|
border-bottom: none;
|
|
272
276
|
}
|
|
273
277
|
}
|
|
278
|
+
|
|
279
|
+
.govuk-link-button {
|
|
280
|
+
background: none;
|
|
281
|
+
border: none;
|
|
282
|
+
}
|
|
@@ -19,13 +19,21 @@ describe('components.CollectionSummary.RenderListView', function () {
|
|
|
19
19
|
label: 'Value 3',
|
|
20
20
|
value: 'Value 3'
|
|
21
21
|
},
|
|
22
|
+
condition: 'test',
|
|
22
23
|
index: 0
|
|
23
24
|
};
|
|
24
25
|
var MASTER_PAGE = {
|
|
25
26
|
childPages: [{
|
|
26
27
|
summaryLayout: {
|
|
27
28
|
sections: [{
|
|
28
|
-
|
|
29
|
+
columns: [{
|
|
30
|
+
fields: ['item1', 'item2', 'item3'],
|
|
31
|
+
show_when: {
|
|
32
|
+
field: "condition",
|
|
33
|
+
op: "in",
|
|
34
|
+
values: ["test"]
|
|
35
|
+
}
|
|
36
|
+
}]
|
|
29
37
|
}]
|
|
30
38
|
},
|
|
31
39
|
components: [{
|
|
@@ -114,7 +122,7 @@ describe('components.CollectionSummary.RenderListView', function () {
|
|
|
114
122
|
id: ID,
|
|
115
123
|
entryData: ENTRY,
|
|
116
124
|
config: CONFIG,
|
|
117
|
-
|
|
125
|
+
onFullEdit: ON_CHANGE,
|
|
118
126
|
onDelete: ON_DELETE,
|
|
119
127
|
masterPage: MASTER_PAGE,
|
|
120
128
|
getComponentRow: getComponentRow
|
|
@@ -155,7 +163,7 @@ describe('components.CollectionSummary.RenderListView', function () {
|
|
|
155
163
|
id: ID,
|
|
156
164
|
entryData: ENTRY,
|
|
157
165
|
config: CONFIG,
|
|
158
|
-
|
|
166
|
+
onFullEdit: ON_CHANGE,
|
|
159
167
|
onDelete: ON_DELETE,
|
|
160
168
|
masterPage: MASTER_PAGE,
|
|
161
169
|
getComponentRow: getComponentRow
|
|
@@ -184,7 +192,7 @@ describe('components.CollectionSummary.RenderListView', function () {
|
|
|
184
192
|
id: ID,
|
|
185
193
|
entryData: ENTRY,
|
|
186
194
|
config: CONFIG,
|
|
187
|
-
|
|
195
|
+
onFullEdit: ON_CHANGE,
|
|
188
196
|
onDelete: ON_DELETE,
|
|
189
197
|
masterPage: MASTER_PAGE,
|
|
190
198
|
getComponentRow: getComponentRow
|
|
@@ -196,6 +204,7 @@ describe('components.CollectionSummary.RenderListView', function () {
|
|
|
196
204
|
// Check for change button
|
|
197
205
|
var changeLink = listViewDiv.querySelector('.govuk-link');
|
|
198
206
|
expect(changeLink.textContent).toEqual(CONFIG.changeAction.label);
|
|
207
|
+
expect(changeLink.getAttribute('aria-label')).toEqual("".concat(CONFIG.changeAction.label, " ").concat(CONFIG.title));
|
|
199
208
|
_react.fireEvent.click(changeLink, {});
|
|
200
209
|
expect(onChangeCalls).toEqual(1);
|
|
201
210
|
expect(onChangeArgs[0]).toMatchObject({
|
|
@@ -206,6 +215,7 @@ describe('components.CollectionSummary.RenderListView', function () {
|
|
|
206
215
|
// Check for delete button
|
|
207
216
|
var deleteButton = listViewDiv.querySelector('[id$=".deleteButton"]');
|
|
208
217
|
expect(deleteButton.textContent).toEqual(CONFIG.deleteAction.label);
|
|
218
|
+
expect(deleteButton.getAttribute('aria-label')).toEqual("".concat(CONFIG.deleteAction.label, " ").concat(CONFIG.title));
|
|
209
219
|
_react.fireEvent.click(deleteButton, {});
|
|
210
220
|
expect(onDeleteCalls).toEqual(1);
|
|
211
221
|
expect(onDeleteArgs[0]).toEqual(ENTRY);
|
|
@@ -16,10 +16,13 @@ var _BannerStrip = _interopRequireDefault(require("./BannerStrip"));
|
|
|
16
16
|
var _RenderListView = _interopRequireDefault(require("./RenderListView"));
|
|
17
17
|
var _SummaryCardDetails = _interopRequireDefault(require("./SummaryCardDetails"));
|
|
18
18
|
require("./SummaryCard.scss");
|
|
19
|
+
var _excluded = ["isDuplicate"];
|
|
19
20
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
20
21
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
22
23
|
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
24
|
+
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; }
|
|
25
|
+
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; }
|
|
23
26
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
24
27
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
25
28
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
@@ -44,12 +47,12 @@ var DEFAULT_DUPLICATE_BUTTON_LABEL = exports.DEFAULT_DUPLICATE_BUTTON_LABEL = 'D
|
|
|
44
47
|
var DEFAULT_DETAILS_TITLE = exports.DEFAULT_DETAILS_TITLE = 'Full details';
|
|
45
48
|
var DEFAULT_CHANGE_BUTTON_CLASS = exports.DEFAULT_CHANGE_BUTTON_CLASS = 'secondary';
|
|
46
49
|
var SummaryCard = function SummaryCard(_ref) {
|
|
47
|
-
var _config$changeAction2, _config$changeAction3, _config$deleteAction, _config$duplicateActi;
|
|
50
|
+
var _config$changeAction2, _config$changeAction3, _config$changeAction4, _config$deleteAction, _config$deleteAction2, _config$duplicateActi, _config$duplicateActi2;
|
|
48
51
|
var id = _ref.id,
|
|
49
52
|
entryData = _ref.entryData,
|
|
50
53
|
config = _ref.config,
|
|
51
54
|
classModifiers = _ref.classModifiers,
|
|
52
|
-
|
|
55
|
+
onFullEdit = _ref.onFullEdit,
|
|
53
56
|
onDelete = _ref.onDelete,
|
|
54
57
|
onDuplicate = _ref.onDuplicate,
|
|
55
58
|
onQuickEdit = _ref.onQuickEdit,
|
|
@@ -57,13 +60,12 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
57
60
|
childCollections = _ref.childCollections,
|
|
58
61
|
formData = _ref.formData,
|
|
59
62
|
masterPage = _ref.masterPage,
|
|
60
|
-
hideDetails = _ref.hideDetails
|
|
61
|
-
inError = _ref.inError;
|
|
63
|
+
hideDetails = _ref.hideDetails;
|
|
62
64
|
var _useState = (0, _react.useState)(false),
|
|
63
65
|
_useState2 = _slicedToArray(_useState, 2),
|
|
64
66
|
quickEdit = _useState2[0],
|
|
65
67
|
setQuickEdit = _useState2[1];
|
|
66
|
-
var classes = _copReactComponents.Utils.classBuilder(DEFAULT_CLASS, classModifiers,
|
|
68
|
+
var classes = _copReactComponents.Utils.classBuilder(DEFAULT_CLASS, classModifiers, config.className);
|
|
67
69
|
var quickEditPage = (0, _react.useMemo)(function () {
|
|
68
70
|
return config.quickEdit ? (0, _getQuickEditPage.default)(masterPage, entryData) : null;
|
|
69
71
|
}, [masterPage, config, entryData, quickEdit]);
|
|
@@ -73,12 +75,13 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
73
75
|
var _useValidation = (0, _hooks.useValidation)(),
|
|
74
76
|
addErrors = _useValidation.addErrors,
|
|
75
77
|
resetQuickEditErrors = _useValidation.resetQuickEditErrors,
|
|
78
|
+
clearTopLevelErrorsForCard = _useValidation.clearTopLevelErrorsForCard,
|
|
76
79
|
validate = _useValidation.validate;
|
|
77
80
|
var _useHooks = (0, _hooks.useHooks)(),
|
|
78
81
|
hooks = _useHooks.hooks;
|
|
79
82
|
var _onAction = /*#__PURE__*/function () {
|
|
80
83
|
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(action, patch) {
|
|
81
|
-
var errors, hookErrors, allErrors, allData;
|
|
84
|
+
var validationData, errors, hookErrors, allErrors, allData, _allData$entryData$in, isDuplicate, newEntry;
|
|
82
85
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
83
86
|
while (1) switch (_context.prev = _context.next) {
|
|
84
87
|
case 0:
|
|
@@ -88,23 +91,25 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
88
91
|
});
|
|
89
92
|
resetQuickEditErrors === null || resetQuickEditErrors === void 0 || resetQuickEditErrors();
|
|
90
93
|
}
|
|
91
|
-
if (!(action.type === 'save' && typeof onQuickEdit === 'function'
|
|
92
|
-
_context.next =
|
|
94
|
+
if (!(action.type === 'save' && typeof onQuickEdit === 'function')) {
|
|
95
|
+
_context.next = 11;
|
|
93
96
|
break;
|
|
94
97
|
}
|
|
95
|
-
// Local validation
|
|
96
|
-
errors = validate.page(quickEditPage)
|
|
98
|
+
validationData = _objectSpread(_objectSpread(_objectSpread({}, quickEditPage.formData), patch), {}, _defineProperty({}, "".concat(parentCollectionName, "ActiveId"), entryData.id)); // Local validation
|
|
99
|
+
errors = validate.page(_objectSpread(_objectSpread({}, quickEditPage), {}, {
|
|
100
|
+
formData: validationData
|
|
101
|
+
}));
|
|
97
102
|
if (!errors.length) {
|
|
98
|
-
_context.next =
|
|
103
|
+
_context.next = 6;
|
|
99
104
|
break;
|
|
100
105
|
}
|
|
101
106
|
return _context.abrupt("return");
|
|
102
|
-
case
|
|
103
|
-
_context.next =
|
|
104
|
-
return hooks.onSubmit('quickEdit',
|
|
107
|
+
case 6:
|
|
108
|
+
_context.next = 8;
|
|
109
|
+
return hooks.onSubmit('quickEdit', validationData, function () {}, function (e) {
|
|
105
110
|
hookErrors = e;
|
|
106
111
|
});
|
|
107
|
-
case
|
|
112
|
+
case 8:
|
|
108
113
|
if (hookErrors) {
|
|
109
114
|
addErrors(hookErrors);
|
|
110
115
|
}
|
|
@@ -112,8 +117,14 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
112
117
|
// Save data assuming no errors
|
|
113
118
|
allErrors = errors.concat(hookErrors);
|
|
114
119
|
if (allErrors.length === 0 || allErrors.length === 1 && allErrors[0] === undefined) {
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
// Now that validation has passed with no errors - from the page or
|
|
121
|
+
// the hook - we want to remove any errors for this
|
|
122
|
+
// entry from the top-level validation context too.
|
|
123
|
+
clearTopLevelErrorsForCard();
|
|
124
|
+
allData = _utils.default.CollectionPage.getData(parentCollectionName, formData); // Pull out the isDuplicate flag if one exists as we want
|
|
125
|
+
// to remove it now that the entry has been edited.
|
|
126
|
+
_allData$entryData$in = allData[entryData.index], isDuplicate = _allData$entryData$in.isDuplicate, newEntry = _objectWithoutProperties(_allData$entryData$in, _excluded);
|
|
127
|
+
allData[entryData.index] = _objectSpread(_objectSpread({}, newEntry), patch);
|
|
117
128
|
onQuickEdit({
|
|
118
129
|
target: {
|
|
119
130
|
name: parentCollectionName,
|
|
@@ -124,7 +135,7 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
124
135
|
return !prevState;
|
|
125
136
|
});
|
|
126
137
|
}
|
|
127
|
-
case
|
|
138
|
+
case 11:
|
|
128
139
|
case "end":
|
|
129
140
|
return _context.stop();
|
|
130
141
|
}
|
|
@@ -141,9 +152,10 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
141
152
|
id: id,
|
|
142
153
|
entryData: entryData,
|
|
143
154
|
config: config,
|
|
144
|
-
|
|
155
|
+
onFullEdit: onFullEdit,
|
|
145
156
|
onDelete: onDelete,
|
|
146
|
-
masterPage: masterPage
|
|
157
|
+
masterPage: masterPage,
|
|
158
|
+
classModifiers: classModifiers
|
|
147
159
|
});
|
|
148
160
|
}
|
|
149
161
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
@@ -173,27 +185,34 @@ var SummaryCard = function SummaryCard(_ref) {
|
|
|
173
185
|
});
|
|
174
186
|
},
|
|
175
187
|
classModifiers: "primary",
|
|
176
|
-
disabled: quickEdit
|
|
177
|
-
|
|
188
|
+
disabled: quickEdit,
|
|
189
|
+
name: "QuickEdit"
|
|
190
|
+
}, DEFAULT_EDIT_LABEL), config.changeAction && typeof onFullEdit === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
|
|
178
191
|
id: "".concat(id, ".changeButton"),
|
|
179
192
|
onClick: function onClick() {
|
|
180
193
|
var _config$changeAction;
|
|
181
|
-
return
|
|
194
|
+
return onFullEdit((_config$changeAction = config.changeAction) === null || _config$changeAction === void 0 ? void 0 : _config$changeAction.page, entryData.id);
|
|
182
195
|
},
|
|
183
|
-
classModifiers: ((_config$changeAction2 = config.changeAction) === null || _config$changeAction2 === void 0 ? void 0 : _config$changeAction2.classModifiers) || DEFAULT_CHANGE_BUTTON_CLASS
|
|
184
|
-
|
|
196
|
+
classModifiers: ((_config$changeAction2 = config.changeAction) === null || _config$changeAction2 === void 0 ? void 0 : _config$changeAction2.classModifiers) || DEFAULT_CHANGE_BUTTON_CLASS,
|
|
197
|
+
"aria-label": _utils.default.FormPage.getConditionalText((_config$changeAction3 = config.changeAction) === null || _config$changeAction3 === void 0 ? void 0 : _config$changeAction3.aria_label, entryData),
|
|
198
|
+
name: "Change"
|
|
199
|
+
}, ((_config$changeAction4 = config.changeAction) === null || _config$changeAction4 === void 0 ? void 0 : _config$changeAction4.label) || DEFAULT_CHANGE_BUTTON_LABEL), config.deleteAction && typeof onDelete === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
|
|
185
200
|
id: "".concat(id, ".deleteButton"),
|
|
186
201
|
onClick: function onClick() {
|
|
187
202
|
return onDelete(entryData);
|
|
188
203
|
},
|
|
189
|
-
classModifiers: "secondary"
|
|
190
|
-
|
|
204
|
+
classModifiers: "secondary",
|
|
205
|
+
"aria-label": _utils.default.FormPage.getConditionalText((_config$deleteAction = config.deleteAction) === null || _config$deleteAction === void 0 ? void 0 : _config$deleteAction.aria_label, entryData),
|
|
206
|
+
name: "Delete"
|
|
207
|
+
}, ((_config$deleteAction2 = config.deleteAction) === null || _config$deleteAction2 === void 0 ? void 0 : _config$deleteAction2.label) || DEFAULT_DELETE_BUTTON_LABEL), config.duplicateAction && typeof onDuplicate === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
|
|
191
208
|
id: "".concat(id, ".duplicateButton"),
|
|
192
209
|
onClick: function onClick() {
|
|
193
210
|
onDuplicate(entryData);
|
|
194
211
|
},
|
|
195
|
-
classModifiers: "secondary"
|
|
196
|
-
|
|
212
|
+
classModifiers: "secondary",
|
|
213
|
+
"aria-label": _utils.default.FormPage.getConditionalText((_config$duplicateActi = config.duplicateAction) === null || _config$duplicateActi === void 0 ? void 0 : _config$duplicateActi.aria_label, entryData),
|
|
214
|
+
name: "Duplicate"
|
|
215
|
+
}, ((_config$duplicateActi2 = config.duplicateAction) === null || _config$duplicateActi2 === void 0 ? void 0 : _config$duplicateActi2.label) || DEFAULT_DUPLICATE_BUTTON_LABEL))), quickEdit && quickEditPage && /*#__PURE__*/_react.default.createElement(_FormPage.default, {
|
|
197
216
|
page: quickEditPage,
|
|
198
217
|
onAction: function onAction(action, patch) {
|
|
199
218
|
return _onAction(action, patch);
|
|
@@ -218,19 +237,23 @@ SummaryCard.propTypes = {
|
|
|
218
237
|
index: _propTypes.default.number.isRequired
|
|
219
238
|
}).isRequired,
|
|
220
239
|
config: _propTypes.default.shape({
|
|
240
|
+
className: _propTypes.default.string,
|
|
221
241
|
banners: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({})])),
|
|
222
242
|
title: _propTypes.default.string,
|
|
223
243
|
details: _propTypes.default.string,
|
|
224
244
|
changeAction: _propTypes.default.shape({
|
|
225
245
|
label: _propTypes.default.string,
|
|
226
246
|
page: _propTypes.default.string.isRequired,
|
|
227
|
-
classModifiers: _propTypes.default.string
|
|
247
|
+
classModifiers: _propTypes.default.string,
|
|
248
|
+
aria_label: _propTypes.default.string
|
|
228
249
|
}),
|
|
229
250
|
deleteAction: _propTypes.default.shape({
|
|
230
|
-
label: _propTypes.default.string
|
|
251
|
+
label: _propTypes.default.string,
|
|
252
|
+
aria_label: _propTypes.default.string
|
|
231
253
|
}),
|
|
232
254
|
duplicateAction: _propTypes.default.shape({
|
|
233
|
-
label: _propTypes.default.string
|
|
255
|
+
label: _propTypes.default.string,
|
|
256
|
+
aria_label: _propTypes.default.string
|
|
234
257
|
}),
|
|
235
258
|
quickEdit: _propTypes.default.shape({
|
|
236
259
|
components: _propTypes.default.arrayOf(_propTypes.default.shape({
|
|
@@ -246,24 +269,22 @@ SummaryCard.propTypes = {
|
|
|
246
269
|
})).isRequired
|
|
247
270
|
}).isRequired,
|
|
248
271
|
classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
|
|
249
|
-
|
|
272
|
+
onFullEdit: _propTypes.default.func,
|
|
250
273
|
onDelete: _propTypes.default.func,
|
|
251
274
|
onDuplicate: _propTypes.default.func,
|
|
252
275
|
onQuickEdit: _propTypes.default.func,
|
|
253
276
|
parentCollectionName: _propTypes.default.string.isRequired,
|
|
254
277
|
childCollections: _propTypes.default.arrayOf(_propTypes.default.string),
|
|
255
278
|
formData: _propTypes.default.shape({}).isRequired,
|
|
256
|
-
hideDetails: _propTypes.default.bool
|
|
257
|
-
inError: _propTypes.default.bool
|
|
279
|
+
hideDetails: _propTypes.default.bool
|
|
258
280
|
};
|
|
259
281
|
SummaryCard.defaultProps = {
|
|
260
282
|
classModifiers: null,
|
|
261
|
-
|
|
283
|
+
onFullEdit: null,
|
|
262
284
|
onDelete: null,
|
|
263
285
|
onDuplicate: null,
|
|
264
286
|
onQuickEdit: null,
|
|
265
287
|
childCollections: [],
|
|
266
|
-
hideDetails: false
|
|
267
|
-
inError: false
|
|
288
|
+
hideDetails: false
|
|
268
289
|
};
|
|
269
290
|
var _default = exports.default = SummaryCard;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$govuk-font-family: 'Roboto', arial, sans-serif;
|
|
2
2
|
|
|
3
|
-
@import "
|
|
3
|
+
@import "govuk-frontend/dist/govuk/_base";
|
|
4
4
|
|
|
5
5
|
.govuk-grid-column-two-thirds:has(.hods-form-summary-card) {
|
|
6
6
|
width: 100% !important;
|
|
@@ -51,6 +51,7 @@ $govuk-font-family: 'Roboto', arial, sans-serif;
|
|
|
51
51
|
|
|
52
52
|
&-actions {
|
|
53
53
|
width: 35%;
|
|
54
|
+
text-align: center;
|
|
54
55
|
|
|
55
56
|
.hods-button--primary {
|
|
56
57
|
@extend .hods-button--primary;
|