@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.
Files changed (72) hide show
  1. package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +2 -2
  2. package/dist/components/CollectionPage/CollectionPage.js +8 -2
  3. package/dist/components/CollectionSummary/BannerStrip.js +3 -2
  4. package/dist/components/CollectionSummary/BannerStrip.scss +2 -2
  5. package/dist/components/CollectionSummary/BannerStrip.test.js +39 -4
  6. package/dist/components/CollectionSummary/CollectionSummary.js +82 -63
  7. package/dist/components/CollectionSummary/CollectionSummary.scss +1 -1
  8. package/dist/components/CollectionSummary/CollectionSummary.test.js +40 -80
  9. package/dist/components/CollectionSummary/Confirmation.scss +1 -1
  10. package/dist/components/CollectionSummary/RenderListView.js +24 -20
  11. package/dist/components/CollectionSummary/RenderListView.scss +10 -1
  12. package/dist/components/CollectionSummary/RenderListView.test.js +14 -4
  13. package/dist/components/CollectionSummary/SummaryCard.js +59 -38
  14. package/dist/components/CollectionSummary/SummaryCard.scss +2 -1
  15. package/dist/components/CollectionSummary/SummaryCard.test.js +193 -150
  16. package/dist/components/CollectionSummary/SummaryCardDetails.js +70 -13
  17. package/dist/components/CollectionSummary/SummaryCardDetails.scss +43 -6
  18. package/dist/components/CollectionSummary/SummaryCardDetails.test.js +174 -26
  19. package/dist/components/CollectionSummary/SummaryCardValidationContext.js +15 -5
  20. package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +5 -4
  21. package/dist/components/FormComponent/Collection.js +24 -17
  22. package/dist/components/FormComponent/Collection.test.js +138 -0
  23. package/dist/components/FormComponent/FormComponent.js +12 -0
  24. package/dist/components/FormPage/FormPage.scss +1 -1
  25. package/dist/components/FormRenderer/FormRenderer.js +7 -4
  26. package/dist/components/FormRenderer/FormRenderer.scss +1 -1
  27. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-airpax-after.json +429 -0
  28. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-airpax-before.json +449 -0
  29. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-airpax-form.json +15219 -0
  30. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-eab-2-data-after.json +516 -0
  31. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-eab-2-data-before.json +593 -0
  32. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-eab2-form.json +15219 -0
  33. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-mandec-data-after.json +84 -0
  34. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-mandec-data-before.json +98 -0
  35. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/cop-mandec-form.json +9158 -0
  36. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/test.json +1605 -0
  37. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/test2.json +205 -0
  38. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +69 -38
  39. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +30 -0
  40. package/dist/components/FormRenderer/helpers/deleteNodeByPath.js +8 -2
  41. package/dist/components/FormRenderer/onPageAction.js +6 -1
  42. package/dist/components/FormRenderer/onPageAction.test.js +18 -4
  43. package/dist/components/SummaryList/SummaryList.scss +2 -2
  44. package/dist/components/TaskList/TaskList.scss +1 -1
  45. package/dist/context/ValidationContext/ValidationContext.js +49 -5
  46. package/dist/context/ValidationContext/ValidationContext.test.js +16 -7
  47. package/dist/hooks/useRefData.js +1 -1
  48. package/dist/utils/CheckYourAnswers/showComponentCYA.js +1 -2
  49. package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +5 -0
  50. package/dist/utils/CollectionPage/addCollectionPageEntry.js +1 -2
  51. package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +4 -24
  52. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +13 -1
  53. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +17 -2
  54. package/dist/utils/CollectionPage/getErrorsForCollection.js +55 -0
  55. package/dist/utils/CollectionPage/getErrorsForCollection.test.js +155 -0
  56. package/dist/utils/CollectionPage/getQuickEditPage.js +7 -1
  57. package/dist/utils/CollectionPage/index.js +2 -0
  58. package/dist/utils/CollectionPage/setCollectionPageData.js +9 -4
  59. package/dist/utils/CollectionPage/setCollectionPageData.test.js +18 -0
  60. package/dist/utils/Component/isEditable.js +1 -1
  61. package/dist/utils/Condition/meetsCondition.js +18 -0
  62. package/dist/utils/Condition/meetsCondition.test.js +100 -0
  63. package/dist/utils/Data/getOptions.js +10 -0
  64. package/dist/utils/Data/getOptions.test.js +73 -0
  65. package/dist/utils/Data/nestInRefdataOptions.js +49 -0
  66. package/dist/utils/Data/nestInRefdataOptions.test.js +236 -0
  67. package/dist/utils/Validate/validateContainer.js +3 -1
  68. package/dist/utils/Validate/validateContainer.test.js +33 -0
  69. package/dist/utils/Validate/validateEmail.js +1 -1
  70. package/dist/utils/Validate/validatePage.js +10 -1
  71. package/dist/utils/Validate/validatePage.test.js +69 -0
  72. 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
- onChange = _ref.onChange,
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 onChange === 'function' && /*#__PURE__*/_react.default.createElement("div", {
54
- className: "govuk-link",
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 onChange(config.changeAction.page, entryData.id);
58
+ return onFullEdit(config.changeAction.page, entryData.id);
57
59
  },
58
- onKeyDown: function onKeyDown(e) {
59
- if (e.key === 'Enter' || e.key === ' ') {
60
- onChange(config.changeAction.page, entryData.id);
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
- if (section.fields) {
87
- return section.fields.flatMap(function (fieldId) {
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
- onChange: _propTypes.default.func.isRequired,
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 "node_modules/govuk-frontend/govuk/_base";
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
- fields: ['item1', 'item2', 'item3']
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
- onChange: ON_CHANGE,
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
- onChange: ON_CHANGE,
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
- onChange: ON_CHANGE,
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
- onChange = _ref.onChange,
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, inError ? 'error' : '');
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' && Object.keys(patch).length)) {
92
- _context.next = 10;
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 = 5;
103
+ _context.next = 6;
99
104
  break;
100
105
  }
101
106
  return _context.abrupt("return");
102
- case 5:
103
- _context.next = 7;
104
- return hooks.onSubmit('quickEdit', patch, function () {}, function (e) {
107
+ case 6:
108
+ _context.next = 8;
109
+ return hooks.onSubmit('quickEdit', validationData, function () {}, function (e) {
105
110
  hookErrors = e;
106
111
  });
107
- case 7:
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
- allData = _utils.default.CollectionPage.getData(parentCollectionName, formData);
116
- allData[entryData.index] = _objectSpread(_objectSpread({}, allData === null || allData === void 0 ? void 0 : allData[entryData.index]), patch);
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 10:
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
- onChange: onChange,
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
- }, DEFAULT_EDIT_LABEL), config.changeAction && typeof onChange === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
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 onChange((_config$changeAction = config.changeAction) === null || _config$changeAction === void 0 ? void 0 : _config$changeAction.page, entryData.id);
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
- }, ((_config$changeAction3 = config.changeAction) === null || _config$changeAction3 === void 0 ? void 0 : _config$changeAction3.label) || DEFAULT_CHANGE_BUTTON_LABEL), config.deleteAction && typeof onDelete === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
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
- }, ((_config$deleteAction = config.deleteAction) === null || _config$deleteAction === void 0 ? void 0 : _config$deleteAction.label) || DEFAULT_DELETE_BUTTON_LABEL), config.duplicateAction && typeof onDuplicate === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
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
- }, ((_config$duplicateActi = config.duplicateAction) === null || _config$duplicateActi === void 0 ? void 0 : _config$duplicateActi.label) || DEFAULT_DUPLICATE_BUTTON_LABEL))), quickEdit && quickEditPage && /*#__PURE__*/_react.default.createElement(_FormPage.default, {
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
- onChange: _propTypes.default.func,
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
- onChange: null,
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 "node_modules/govuk-frontend/govuk/_base";
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;