@ukhomeoffice/cop-react-form-renderer 5.48.1-bravo → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.DEFAULT_TITLE = exports.DEFAULT_EDIT_LABEL = exports.DEFAULT_DUPLICATE_BUTTON_LABEL = exports.DEFAULT_DETAILS_TITLE = exports.DEFAULT_DELETE_BUTTON_LABEL = exports.DEFAULT_CLASS = exports.DEFAULT_CHANGE_BUTTON_LABEL = exports.DEFAULT_CHANGE_BUTTON_CLASS = void 0;
7
+ var _copReactComponents = require("@ukhomeoffice/cop-react-components");
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _SummaryListRow = _interopRequireDefault(require("../SummaryList/SummaryListRow"));
11
+ var _utils = _interopRequireDefault(require("../../utils"));
12
+ require("./RenderListView.scss");
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ // Global imports.
15
+
16
+ // Local imports.
17
+
18
+ // Styles.
19
+
20
+ var DEFAULT_CLASS = exports.DEFAULT_CLASS = 'hods-form-summary-card';
21
+ var DEFAULT_TITLE = exports.DEFAULT_TITLE = 'Item';
22
+ var DEFAULT_CHANGE_BUTTON_LABEL = exports.DEFAULT_CHANGE_BUTTON_LABEL = 'Change';
23
+ var DEFAULT_DELETE_BUTTON_LABEL = exports.DEFAULT_DELETE_BUTTON_LABEL = 'Delete';
24
+ var DEFAULT_EDIT_LABEL = exports.DEFAULT_EDIT_LABEL = 'Quick Edit';
25
+ var DEFAULT_DUPLICATE_BUTTON_LABEL = exports.DEFAULT_DUPLICATE_BUTTON_LABEL = 'Duplicate';
26
+ var DEFAULT_DETAILS_TITLE = exports.DEFAULT_DETAILS_TITLE = 'Full details';
27
+ var DEFAULT_CHANGE_BUTTON_CLASS = exports.DEFAULT_CHANGE_BUTTON_CLASS = 'secondary';
28
+ var RenderListView = function RenderListView(_ref) {
29
+ var _config$changeAction2, _config$changeAction3, _config$deleteAction, _masterPage$childPage;
30
+ var id = _ref.id,
31
+ entryData = _ref.entryData,
32
+ config = _ref.config,
33
+ onChange = _ref.onChange,
34
+ onDelete = _ref.onDelete,
35
+ masterPage = _ref.masterPage;
36
+ return /*#__PURE__*/_react.default.createElement("div", {
37
+ className: "govuk-summary-card",
38
+ id: id
39
+ }, /*#__PURE__*/_react.default.createElement("div", {
40
+ className: "govuk-summary-card__title-wrapper dark"
41
+ }, /*#__PURE__*/_react.default.createElement("h2", {
42
+ className: "govuk-summary-card__title"
43
+ }, _copReactComponents.Utils.interpolateString(config.title || DEFAULT_TITLE, entryData)), /*#__PURE__*/_react.default.createElement("ul", {
44
+ className: "govuk-summary-card__actions"
45
+ }, /*#__PURE__*/_react.default.createElement("li", {
46
+ className: "govuk-summary-card__action"
47
+ }, config.changeAction && typeof onChange === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
48
+ id: "".concat(id, ".changeButton"),
49
+ onClick: function onClick() {
50
+ var _config$changeAction;
51
+ return onChange((_config$changeAction = config.changeAction) === null || _config$changeAction === void 0 ? void 0 : _config$changeAction.page, entryData.id);
52
+ },
53
+ classModifiers: ((_config$changeAction2 = config.changeAction) === null || _config$changeAction2 === void 0 ? void 0 : _config$changeAction2.classModifiers) || DEFAULT_CHANGE_BUTTON_CLASS
54
+ }, ((_config$changeAction3 = config.changeAction) === null || _config$changeAction3 === void 0 ? void 0 : _config$changeAction3.label) || DEFAULT_CHANGE_BUTTON_LABEL)), /*#__PURE__*/_react.default.createElement("li", {
55
+ className: "govuk-summary-card__action"
56
+ }, config.deleteAction && typeof onDelete === 'function' && /*#__PURE__*/_react.default.createElement(_copReactComponents.Button, {
57
+ id: "".concat(id, ".deleteButton"),
58
+ onClick: function onClick() {
59
+ return onDelete(entryData);
60
+ },
61
+ classModifiers: "secondary"
62
+ }, ((_config$deleteAction = config.deleteAction) === null || _config$deleteAction === void 0 ? void 0 : _config$deleteAction.label) || DEFAULT_DELETE_BUTTON_LABEL)))), /*#__PURE__*/_react.default.createElement("div", {
63
+ className: "govuk-summary-card__content"
64
+ }, /*#__PURE__*/_react.default.createElement("dl", {
65
+ className: "govuk-summary-list"
66
+ }, masterPage === null || masterPage === void 0 || (_masterPage$childPage = masterPage.childPages) === null || _masterPage$childPage === void 0 ? void 0 : _masterPage$childPage.flatMap(function (childPage) {
67
+ var _childPage$summaryLay;
68
+ return (_childPage$summaryLay = childPage.summaryLayout) === null || _childPage$summaryLay === void 0 ? void 0 : _childPage$summaryLay.sections.flatMap(function (section) {
69
+ var _section$fields;
70
+ return (_section$fields = section.fields) === null || _section$fields === void 0 ? void 0 : _section$fields.map(function (fieldId) {
71
+ var component = _utils.default.Component.elevateNested(childPage === null || childPage === void 0 ? void 0 : childPage.components, entryData).find(function (comp) {
72
+ return comp.fieldId === fieldId;
73
+ });
74
+ return component ? /*#__PURE__*/_react.default.createElement(_SummaryListRow.default, {
75
+ key: fieldId,
76
+ row: {
77
+ key: component.label,
78
+ value: _copReactComponents.Utils.interpolateString(entryData[component === null || component === void 0 ? void 0 : component.fieldId], entryData),
79
+ required: component.required
80
+ },
81
+ classes: function classes(element) {
82
+ return "govuk-summary-list__".concat(element);
83
+ }
84
+ }) : null;
85
+ });
86
+ });
87
+ }))));
88
+ };
89
+ RenderListView.propTypes = {
90
+ id: _propTypes.default.string.isRequired,
91
+ entryData: _propTypes.default.shape({
92
+ id: _propTypes.default.string.isRequired,
93
+ index: _propTypes.default.number.isRequired
94
+ }).isRequired,
95
+ config: _propTypes.default.shape({
96
+ banners: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({})])),
97
+ title: _propTypes.default.string,
98
+ details: _propTypes.default.string,
99
+ changeAction: _propTypes.default.shape({
100
+ label: _propTypes.default.string,
101
+ page: _propTypes.default.string.isRequired,
102
+ classModifiers: _propTypes.default.string
103
+ }),
104
+ deleteAction: _propTypes.default.shape({
105
+ label: _propTypes.default.string
106
+ }),
107
+ duplicateAction: _propTypes.default.shape({
108
+ label: _propTypes.default.string
109
+ }),
110
+ quickEdit: _propTypes.default.shape({
111
+ components: _propTypes.default.arrayOf(_propTypes.default.shape({
112
+ use: _propTypes.default.string
113
+ }))
114
+ }),
115
+ detailsTitle: _propTypes.default.string,
116
+ listView: _propTypes.default.bool
117
+ }).isRequired,
118
+ onChange: _propTypes.default.func.isRequired,
119
+ onDelete: _propTypes.default.func.isRequired,
120
+ masterPage: _propTypes.default.shape({
121
+ childPages: _propTypes.default.arrayOf(_propTypes.default.shape({
122
+ components: _propTypes.default.arrayOf(_propTypes.default.shape())
123
+ })).isRequired
124
+ }).isRequired
125
+ };
126
+ var _default = exports.default = RenderListView;
@@ -0,0 +1,8 @@
1
+ $govuk-font-family: 'Roboto', arial, sans-serif;
2
+
3
+ @import "node_modules/govuk-frontend/govuk/_base";
4
+ @import "node_modules/govuk-frontend/govuk/components/summary-list/_index";
5
+
6
+ .govuk-summary-card__title-wrapper.dark {
7
+ background-color: #D1D1D1;
8
+ }
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _setupTests = require("../../setupTests");
6
+ var _RenderListView = _interopRequireDefault(require("./RenderListView"));
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+ // Global imports.
9
+
10
+ // Local imports.
11
+
12
+ describe('components.CollectionSummary.RenderListView', function () {
13
+ var ENTRY = {
14
+ id: '001',
15
+ item1: 'Value 1',
16
+ item2: 'Value 2',
17
+ index: 0
18
+ };
19
+ var MASTER_PAGE = {
20
+ childPages: [{
21
+ summaryLayout: {
22
+ sections: [{
23
+ fields: ['item1', 'item2']
24
+ }]
25
+ },
26
+ components: [{
27
+ fieldId: 'item1',
28
+ label: 'Item 1',
29
+ required: true
30
+ }, {
31
+ fieldId: 'item2',
32
+ label: 'Item 2'
33
+ }]
34
+ }]
35
+ };
36
+ var CONFIG = {
37
+ title: 'Title text',
38
+ listView: true
39
+ // ...other config properties
40
+ };
41
+
42
+ var ID = 'testListView';
43
+ var onChangeArgs = [];
44
+ var ON_CHANGE = function ON_CHANGE(page, id) {
45
+ onChangeArgs.push({
46
+ page: page,
47
+ id: id
48
+ });
49
+ };
50
+ beforeEach(function () {
51
+ onChangeArgs = [];
52
+ });
53
+ var onDeleteArgs = [];
54
+ var ON_DELETE = function ON_DELETE(entry) {
55
+ onDeleteArgs.push(entry);
56
+ };
57
+ beforeEach(function () {
58
+ onDeleteArgs = [];
59
+ });
60
+
61
+ // Setup function to check rendered elements
62
+ var checkSetup = function checkSetup(container) {
63
+ var listViewDiv = container.children[0];
64
+ expect(listViewDiv.tagName).toEqual('DIV');
65
+ expect(listViewDiv.classList).toContain('govuk-summary-card');
66
+ return listViewDiv;
67
+ };
68
+ it('should correctly render RenderListView component', function () {
69
+ var _renderWithValidation = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_RenderListView.default, {
70
+ id: ID,
71
+ entryData: ENTRY,
72
+ config: CONFIG,
73
+ onChange: ON_CHANGE,
74
+ onDelete: ON_DELETE,
75
+ masterPage: MASTER_PAGE
76
+ })),
77
+ container = _renderWithValidation.container;
78
+ var listViewDiv = checkSetup(container);
79
+
80
+ // Check title wrapper and title text
81
+ var titleWrapper = listViewDiv.querySelector('.govuk-summary-card__title-wrapper');
82
+ expect(titleWrapper).not.toBeNull();
83
+ var title = titleWrapper.querySelector('.govuk-summary-card__title');
84
+ expect(title.textContent).toEqual(CONFIG.title);
85
+
86
+ // Logic to check the rendered rows
87
+ var rows = container.querySelectorAll('.govuk-summary-list__row');
88
+ expect(rows.length).toEqual(2); // Expecting two rows as per MOCK_MASTER_PAGE
89
+
90
+ // Check the first row
91
+ var firstRowKey = rows[0].querySelector('.govuk-summary-list__key');
92
+ var firstRowValue = rows[0].querySelector('.govuk-summary-list__value');
93
+ expect(firstRowKey.textContent).toEqual('Item 1');
94
+ expect(firstRowValue.textContent).toEqual(ENTRY.item1);
95
+
96
+ // Check the second row
97
+ var secondRowKey = rows[1].querySelector('.govuk-summary-list__key');
98
+ var secondRowValue = rows[1].querySelector('.govuk-summary-list__value');
99
+ expect(secondRowKey.textContent).toEqual('Item 2 (optional)');
100
+ expect(secondRowValue.textContent).toEqual(ENTRY.item2);
101
+ });
102
+ });
103
+ describe('Action buttons in RenderListView', function () {
104
+ var ID = 'testListView';
105
+ var onChangeArgs = [];
106
+ var onChangeCalls = 0;
107
+ var ON_CHANGE = function ON_CHANGE(page, id) {
108
+ onChangeArgs.push({
109
+ page: page,
110
+ id: id
111
+ });
112
+ onChangeCalls += 1;
113
+ };
114
+ var onDeleteArgs = [];
115
+ var onDeleteCalls = 0;
116
+ var ON_DELETE = function ON_DELETE(entry) {
117
+ onDeleteArgs.push(entry);
118
+ onDeleteCalls += 1;
119
+ };
120
+ beforeEach(function () {
121
+ onChangeArgs = [];
122
+ onChangeCalls = 0;
123
+ onDeleteArgs = [];
124
+ onDeleteCalls = 0;
125
+ });
126
+ var ENTRY = {
127
+ id: '001',
128
+ item1: 'Value 1',
129
+ item2: 'Value 2',
130
+ index: 0
131
+ };
132
+ var MASTER_PAGE = {
133
+ childPages: [{
134
+ summaryLayout: {
135
+ sections: [{
136
+ fields: ['item1', 'item2']
137
+ }]
138
+ },
139
+ components: [{
140
+ fieldId: 'item1',
141
+ label: 'Item 1',
142
+ required: true
143
+ }, {
144
+ fieldId: 'item2',
145
+ label: 'Item 2'
146
+ }]
147
+ }]
148
+ };
149
+ var CONFIG = {
150
+ title: 'Title text',
151
+ listView: true,
152
+ changeAction: {
153
+ label: 'Change label',
154
+ page: 'testPage'
155
+ },
156
+ deleteAction: {
157
+ label: 'Delete label'
158
+ }
159
+ };
160
+ it('should render and handle action buttons correctly', function () {
161
+ var _renderWithValidation2 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_RenderListView.default, {
162
+ id: ID,
163
+ entryData: ENTRY,
164
+ config: CONFIG,
165
+ onChange: ON_CHANGE,
166
+ onDelete: ON_DELETE,
167
+ masterPage: MASTER_PAGE
168
+ })),
169
+ container = _renderWithValidation2.container;
170
+ var listViewDiv = container.querySelector('.govuk-summary-card');
171
+ expect(listViewDiv).not.toBeNull();
172
+
173
+ // Check for change button
174
+ var changeButton = listViewDiv.querySelector('[id$=".changeButton"]');
175
+ expect(changeButton.textContent).toEqual(CONFIG.changeAction.label);
176
+ _react2.fireEvent.click(changeButton, {});
177
+ expect(onChangeCalls).toEqual(1);
178
+ expect(onChangeArgs[0]).toMatchObject({
179
+ page: CONFIG.changeAction.page,
180
+ id: ENTRY.id
181
+ });
182
+
183
+ // Check for delete button
184
+ var deleteButton = listViewDiv.querySelector('[id$=".deleteButton"]');
185
+ expect(deleteButton.textContent).toEqual(CONFIG.deleteAction.label);
186
+ _react2.fireEvent.click(deleteButton, {});
187
+ expect(onDeleteCalls).toEqual(1);
188
+ expect(onDeleteArgs[0]).toEqual(ENTRY);
189
+ });
190
+ });
@@ -14,6 +14,7 @@ var _hooks = require("../../hooks");
14
14
  var _FormPage = _interopRequireDefault(require("../FormPage"));
15
15
  var _FormComponent = _interopRequireDefault(require("../FormComponent"));
16
16
  var _BannerStrip = _interopRequireDefault(require("./BannerStrip"));
17
+ var _RenderListView = _interopRequireDefault(require("./RenderListView"));
17
18
  require("./SummaryCard.scss");
18
19
  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); }
19
20
  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; }
@@ -133,6 +134,18 @@ var SummaryCard = function SummaryCard(_ref) {
133
134
  return _ref2.apply(this, arguments);
134
135
  };
135
136
  }();
137
+
138
+ // To render summary card in list view as per https://design-system.service.gov.uk/components/summary-list
139
+ if (config.listView) {
140
+ return /*#__PURE__*/_react.default.createElement(_RenderListView.default, {
141
+ id: id,
142
+ entryData: entryData,
143
+ config: config,
144
+ onChange: onChange,
145
+ onDelete: onDelete,
146
+ masterPage: masterPage
147
+ });
148
+ }
136
149
  return /*#__PURE__*/_react.default.createElement("div", {
137
150
  className: classes(),
138
151
  id: id
@@ -249,7 +262,8 @@ SummaryCard.propTypes = {
249
262
  use: _propTypes.default.string
250
263
  }))
251
264
  }),
252
- detailsTitle: _propTypes.default.string
265
+ detailsTitle: _propTypes.default.string,
266
+ listView: _propTypes.default.bool
253
267
  }).isRequired,
254
268
  masterPage: _propTypes.default.shape({
255
269
  childPages: _propTypes.default.arrayOf(_propTypes.default.shape({
@@ -253,7 +253,6 @@ var getChildJsx = function getChildJsx(parent, paramChild) {
253
253
  component: child,
254
254
  value: child.value,
255
255
  onChange: parent.onChange,
256
- onTopLevelChange: parent.onChange,
257
256
  key: child.key,
258
257
  formData: parent.formData
259
258
  });
@@ -79,7 +79,7 @@ var setupDefaultObjectValue = function setupDefaultObjectValue(defaultObject, da
79
79
  // be used as field names to get values from data.
80
80
  if (defaultObj.sourced) {
81
81
  var _result;
82
- result = (_result = result) !== null && _result !== void 0 ? _result : {};
82
+ (_result = result) !== null && _result !== void 0 ? _result : result = {};
83
83
  Object.keys(defaultObj.sourced).every(function (key) {
84
84
  var sourcedValue = typeof defaultObj.sourced[key] === 'string' && (0, _getSourceData.default)(data, defaultObj.sourced[key]);
85
85
  if (sourcedValue === undefined && defaultObj.skipIfSourceInvalid) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "5.48.1-bravo",
3
+ "version": "5.49.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",