@ukhomeoffice/cop-react-form-renderer 4.54.0 → 4.55.1-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/FormPage/FormPage.js +8 -0
- package/dist/components/FormRenderer/FormRenderer.js +28 -5
- package/dist/components/FormRenderer/FormRenderer.test.js +91 -32
- package/dist/components/FormRenderer/handlers/navigate.js +2 -2
- package/dist/context/HooksContext/HooksContext.js +6 -2
- package/dist/utils/Data/getAutocompleteSource.js +5 -2
- package/dist/utils/Data/getAutocompleteSource.test.js +298 -96
- package/dist/utils/FormPage/useComponent.js +2 -4
- package/package.json +1 -1
|
@@ -57,6 +57,7 @@ var FormPage = function FormPage(_ref) {
|
|
|
57
57
|
_onAction = _ref.onAction,
|
|
58
58
|
onWrapperChange = _ref.onWrapperChange,
|
|
59
59
|
onTopLevelChange = _ref.onTopLevelChange,
|
|
60
|
+
onChange = _ref.onChange,
|
|
60
61
|
classBlock = _ref.classBlock,
|
|
61
62
|
classModifiers = _ref.classModifiers,
|
|
62
63
|
className = _ref.className;
|
|
@@ -89,6 +90,12 @@ var FormPage = function FormPage(_ref) {
|
|
|
89
90
|
setPatchLabel(function (prev) {
|
|
90
91
|
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, target.component, target.label));
|
|
91
92
|
});
|
|
93
|
+
|
|
94
|
+
if (typeof onChange === 'function') {
|
|
95
|
+
onChange(page.formData);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
;
|
|
92
99
|
};
|
|
93
100
|
|
|
94
101
|
(0, _react.useEffect)(function () {
|
|
@@ -143,6 +150,7 @@ FormPage.propTypes = {
|
|
|
143
150
|
// onPageChange functionality. Useful for anything that
|
|
144
151
|
// wants to wrap FormPage.
|
|
145
152
|
onWrapperChange: _propTypes.default.func,
|
|
153
|
+
onChange: _propTypes.default.func,
|
|
146
154
|
classBlock: _propTypes.default.string,
|
|
147
155
|
classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
|
|
148
156
|
className: _propTypes.default.string
|
|
@@ -183,13 +183,23 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
183
183
|
validate = _useValidation.validate; // Need to set submission data when going back
|
|
184
184
|
|
|
185
185
|
|
|
186
|
-
window.onpopstate = function () {
|
|
186
|
+
window.onpopstate = function (e) {
|
|
187
187
|
var _formState$page;
|
|
188
188
|
|
|
189
189
|
if (document.location.hash) {
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
+
if (e.state && e.state.fullPages !== undefined) {
|
|
194
|
+
setCurrentTask(function (prev) {
|
|
195
|
+
var _e$state;
|
|
196
|
+
|
|
197
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
198
|
+
fullPages: (_e$state = e.state) === null || _e$state === void 0 ? void 0 : _e$state.fullPages
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
193
203
|
setGoingBack(true);
|
|
194
204
|
hooks.onGoingBack();
|
|
195
205
|
clearErrors();
|
|
@@ -302,11 +312,16 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
302
312
|
|
|
303
313
|
(0, _react.useEffect)(function () {
|
|
304
314
|
if (newPageId !== undefined) setPageId(newPageId);
|
|
305
|
-
}, [newPageId]); // Handle
|
|
315
|
+
}, [newPageId]); // Handle change to form data in pages.
|
|
316
|
+
|
|
317
|
+
var onChange = function onChange(data) {
|
|
318
|
+
hooks.onChange(data);
|
|
319
|
+
}; // Handle actions from pages.
|
|
306
320
|
// (patch captures payload-ready field name and value,
|
|
307
321
|
// patchLabel captures non-ID values
|
|
308
322
|
// for display purposes after submission.)
|
|
309
323
|
|
|
324
|
+
|
|
310
325
|
var onPageAction = function onPageAction(action, patch, patchLabel) {
|
|
311
326
|
if (action.type === _models.PageAction.TYPES.CANCEL) {
|
|
312
327
|
hooks.onCancel();
|
|
@@ -342,8 +357,12 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
342
357
|
break;
|
|
343
358
|
|
|
344
359
|
case _models.PageAction.TYPES.SAVE_AND_NAVIGATE:
|
|
360
|
+
var state = {
|
|
361
|
+
'fullPages': currentTask.fullPages
|
|
362
|
+
};
|
|
363
|
+
|
|
345
364
|
pageUpdate = function pageUpdate() {
|
|
346
|
-
return _handlers.default.navigate(action, pageId, onPageChange);
|
|
365
|
+
return _handlers.default.navigate(action, pageId, onPageChange, state);
|
|
347
366
|
};
|
|
348
367
|
|
|
349
368
|
break;
|
|
@@ -482,7 +501,10 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
482
501
|
}
|
|
483
502
|
} else if (currentTask.state === _models.TaskStates.TYPES.IN_PROGRESS) {
|
|
484
503
|
var _currentPage = data.formStatus.tasks[currentTask.name].currentPage;
|
|
485
|
-
|
|
504
|
+
var state = {
|
|
505
|
+
'fullPages': currentTask.fullPages
|
|
506
|
+
};
|
|
507
|
+
onPageChange(_currentPage || currentTask.pages[0], state);
|
|
486
508
|
} else if (currentTask.firstPage) {
|
|
487
509
|
var _currentPage2 = currentTask.firstPage;
|
|
488
510
|
onPageChange(_currentPage2 || currentTask.pages[0]);
|
|
@@ -623,7 +645,8 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
623
645
|
formData: data
|
|
624
646
|
})), formState.page && !formState.cya && !formState.page.collection && /*#__PURE__*/_react.default.createElement(_FormPage.default, {
|
|
625
647
|
page: formState.page,
|
|
626
|
-
onAction: onPageAction
|
|
648
|
+
onAction: onPageAction,
|
|
649
|
+
onChange: onChange
|
|
627
650
|
}), formState.page && !formState.cya && formState.page.collection && /*#__PURE__*/_react.default.createElement(_CollectionPage.default, {
|
|
628
651
|
page: formState.page,
|
|
629
652
|
onAction: onPageAction
|
|
@@ -931,11 +931,70 @@ describe('components', function () {
|
|
|
931
931
|
}
|
|
932
932
|
}, _callee26);
|
|
933
933
|
})));
|
|
934
|
-
it('should go to
|
|
935
|
-
var ON_SUBMIT, HOOKS,
|
|
934
|
+
it('should go to incomplete page when selecting in-progress task', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee28() {
|
|
935
|
+
var ON_SUBMIT, HOOKS, DATA, taskList;
|
|
936
936
|
return regeneratorRuntime.wrap(function _callee28$(_context28) {
|
|
937
937
|
while (1) {
|
|
938
938
|
switch (_context28.prev = _context28.next) {
|
|
939
|
+
case 0:
|
|
940
|
+
ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
|
|
941
|
+
onSuccess();
|
|
942
|
+
};
|
|
943
|
+
|
|
944
|
+
HOOKS = {
|
|
945
|
+
onSubmit: ON_SUBMIT
|
|
946
|
+
};
|
|
947
|
+
DATA = {
|
|
948
|
+
"date": "7-7-2022",
|
|
949
|
+
"formStatus": {
|
|
950
|
+
"tasks": {
|
|
951
|
+
"Date, location and mode details": {
|
|
952
|
+
"complete": false,
|
|
953
|
+
"currentPage": "eventMode"
|
|
954
|
+
}
|
|
955
|
+
},
|
|
956
|
+
"taskPage": "eventMode"
|
|
957
|
+
}
|
|
958
|
+
};
|
|
959
|
+
_context28.next = 5;
|
|
960
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee27() {
|
|
961
|
+
return regeneratorRuntime.wrap(function _callee27$(_context27) {
|
|
962
|
+
while (1) {
|
|
963
|
+
switch (_context27.prev = _context27.next) {
|
|
964
|
+
case 0:
|
|
965
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _taskList.default, {
|
|
966
|
+
hooks: HOOKS,
|
|
967
|
+
data: DATA
|
|
968
|
+
})), container);
|
|
969
|
+
|
|
970
|
+
case 1:
|
|
971
|
+
case "end":
|
|
972
|
+
return _context27.stop();
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
}, _callee27);
|
|
976
|
+
})));
|
|
977
|
+
|
|
978
|
+
case 5:
|
|
979
|
+
taskList = container.childNodes[0].childNodes[1]; //Launch first task
|
|
980
|
+
|
|
981
|
+
_react.fireEvent.click(taskList.childNodes[3].childNodes[1].childNodes[0].childNodes[0], {}); //Should be at Event Mode page
|
|
982
|
+
|
|
983
|
+
|
|
984
|
+
expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Event Mode');
|
|
985
|
+
|
|
986
|
+
case 8:
|
|
987
|
+
case "end":
|
|
988
|
+
return _context28.stop();
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
}, _callee28);
|
|
992
|
+
})));
|
|
993
|
+
it('should go to the last page of a complete task if noTaskCYAs specified', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee30() {
|
|
994
|
+
var ON_SUBMIT, HOOKS, TASK_LIST_WITH_NO_TASK_CYAS, taskList, newPage;
|
|
995
|
+
return regeneratorRuntime.wrap(function _callee30$(_context30) {
|
|
996
|
+
while (1) {
|
|
997
|
+
switch (_context30.prev = _context30.next) {
|
|
939
998
|
case 0:
|
|
940
999
|
ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
|
|
941
1000
|
onSuccess();
|
|
@@ -950,11 +1009,11 @@ describe('components', function () {
|
|
|
950
1009
|
type: 'save',
|
|
951
1010
|
complete: true
|
|
952
1011
|
};
|
|
953
|
-
|
|
954
|
-
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
955
|
-
return regeneratorRuntime.wrap(function
|
|
1012
|
+
_context30.next = 7;
|
|
1013
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee29() {
|
|
1014
|
+
return regeneratorRuntime.wrap(function _callee29$(_context29) {
|
|
956
1015
|
while (1) {
|
|
957
|
-
switch (
|
|
1016
|
+
switch (_context29.prev = _context29.next) {
|
|
958
1017
|
case 0:
|
|
959
1018
|
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, TASK_LIST_WITH_NO_TASK_CYAS, {
|
|
960
1019
|
hooks: HOOKS
|
|
@@ -962,10 +1021,10 @@ describe('components', function () {
|
|
|
962
1021
|
|
|
963
1022
|
case 1:
|
|
964
1023
|
case "end":
|
|
965
|
-
return
|
|
1024
|
+
return _context29.stop();
|
|
966
1025
|
}
|
|
967
1026
|
}
|
|
968
|
-
},
|
|
1027
|
+
}, _callee29);
|
|
969
1028
|
})));
|
|
970
1029
|
|
|
971
1030
|
case 7:
|
|
@@ -1014,17 +1073,17 @@ describe('components', function () {
|
|
|
1014
1073
|
|
|
1015
1074
|
case 19:
|
|
1016
1075
|
case "end":
|
|
1017
|
-
return
|
|
1076
|
+
return _context30.stop();
|
|
1018
1077
|
}
|
|
1019
1078
|
}
|
|
1020
|
-
},
|
|
1079
|
+
}, _callee30);
|
|
1021
1080
|
})));
|
|
1022
|
-
it('should handle cancellation from a page', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
1081
|
+
it('should handle cancellation from a page', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee32() {
|
|
1023
1082
|
var ON_CANCEL_CALLS, ON_CANCEL, HOOKS, form, hub, _hub$childNodes5, civilServantList, link, page, cancel;
|
|
1024
1083
|
|
|
1025
|
-
return regeneratorRuntime.wrap(function
|
|
1084
|
+
return regeneratorRuntime.wrap(function _callee32$(_context32) {
|
|
1026
1085
|
while (1) {
|
|
1027
|
-
switch (
|
|
1086
|
+
switch (_context32.prev = _context32.next) {
|
|
1028
1087
|
case 0:
|
|
1029
1088
|
ON_CANCEL_CALLS = [];
|
|
1030
1089
|
|
|
@@ -1035,11 +1094,11 @@ describe('components', function () {
|
|
|
1035
1094
|
HOOKS = {
|
|
1036
1095
|
onCancel: ON_CANCEL
|
|
1037
1096
|
};
|
|
1038
|
-
|
|
1039
|
-
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
1040
|
-
return regeneratorRuntime.wrap(function
|
|
1097
|
+
_context32.next = 5;
|
|
1098
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee31() {
|
|
1099
|
+
return regeneratorRuntime.wrap(function _callee31$(_context31) {
|
|
1041
1100
|
while (1) {
|
|
1042
|
-
switch (
|
|
1101
|
+
switch (_context31.prev = _context31.next) {
|
|
1043
1102
|
case 0:
|
|
1044
1103
|
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
1045
1104
|
data: _userProfileData.default,
|
|
@@ -1048,10 +1107,10 @@ describe('components', function () {
|
|
|
1048
1107
|
|
|
1049
1108
|
case 1:
|
|
1050
1109
|
case "end":
|
|
1051
|
-
return
|
|
1110
|
+
return _context31.stop();
|
|
1052
1111
|
}
|
|
1053
1112
|
}
|
|
1054
|
-
},
|
|
1113
|
+
}, _callee31);
|
|
1055
1114
|
})));
|
|
1056
1115
|
|
|
1057
1116
|
case 5:
|
|
@@ -1075,16 +1134,16 @@ describe('components', function () {
|
|
|
1075
1134
|
|
|
1076
1135
|
case 15:
|
|
1077
1136
|
case "end":
|
|
1078
|
-
return
|
|
1137
|
+
return _context32.stop();
|
|
1079
1138
|
}
|
|
1080
1139
|
}
|
|
1081
|
-
},
|
|
1140
|
+
}, _callee32);
|
|
1082
1141
|
})));
|
|
1083
|
-
it('should navigate to a specific page at the beginning of a task if it is set as the firstPage of a task', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
1142
|
+
it('should navigate to a specific page at the beginning of a task if it is set as the firstPage of a task', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee34() {
|
|
1084
1143
|
var ON_SUBMIT_CALLS, ON_SUBMIT, HOOKS, TASK_LIST_NON_SEQUENTIAL, taskList, firstTask, newPage;
|
|
1085
|
-
return regeneratorRuntime.wrap(function
|
|
1144
|
+
return regeneratorRuntime.wrap(function _callee34$(_context34) {
|
|
1086
1145
|
while (1) {
|
|
1087
|
-
switch (
|
|
1146
|
+
switch (_context34.prev = _context34.next) {
|
|
1088
1147
|
case 0:
|
|
1089
1148
|
ON_SUBMIT_CALLS = [];
|
|
1090
1149
|
|
|
@@ -1098,11 +1157,11 @@ describe('components', function () {
|
|
|
1098
1157
|
};
|
|
1099
1158
|
TASK_LIST_NON_SEQUENTIAL = JSON.parse(JSON.stringify(_taskList.default));
|
|
1100
1159
|
TASK_LIST_NON_SEQUENTIAL.hub.nonSequential = true;
|
|
1101
|
-
|
|
1102
|
-
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
1103
|
-
return regeneratorRuntime.wrap(function
|
|
1160
|
+
_context34.next = 7;
|
|
1161
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee33() {
|
|
1162
|
+
return regeneratorRuntime.wrap(function _callee33$(_context33) {
|
|
1104
1163
|
while (1) {
|
|
1105
|
-
switch (
|
|
1164
|
+
switch (_context33.prev = _context33.next) {
|
|
1106
1165
|
case 0:
|
|
1107
1166
|
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, TASK_LIST_NON_SEQUENTIAL, {
|
|
1108
1167
|
hooks: HOOKS
|
|
@@ -1110,10 +1169,10 @@ describe('components', function () {
|
|
|
1110
1169
|
|
|
1111
1170
|
case 1:
|
|
1112
1171
|
case "end":
|
|
1113
|
-
return
|
|
1172
|
+
return _context33.stop();
|
|
1114
1173
|
}
|
|
1115
1174
|
}
|
|
1116
|
-
},
|
|
1175
|
+
}, _callee33);
|
|
1117
1176
|
})));
|
|
1118
1177
|
|
|
1119
1178
|
case 7:
|
|
@@ -1130,10 +1189,10 @@ describe('components', function () {
|
|
|
1130
1189
|
|
|
1131
1190
|
case 13:
|
|
1132
1191
|
case "end":
|
|
1133
|
-
return
|
|
1192
|
+
return _context34.stop();
|
|
1134
1193
|
}
|
|
1135
1194
|
}
|
|
1136
|
-
},
|
|
1195
|
+
}, _callee34);
|
|
1137
1196
|
})));
|
|
1138
1197
|
});
|
|
1139
1198
|
});
|
|
@@ -16,11 +16,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
16
16
|
* @param {string} currentPageId The current pageId.
|
|
17
17
|
* @param {Function} onNavigate The handler to call if the pageId is different to the currentPageId.
|
|
18
18
|
*/
|
|
19
|
-
var navigate = function navigate(action, currentPageId, onNavigate) {
|
|
19
|
+
var navigate = function navigate(action, currentPageId, onNavigate, state) {
|
|
20
20
|
var pageId = (0, _getPageId.default)(action, currentPageId);
|
|
21
21
|
|
|
22
22
|
if (pageId !== currentPageId) {
|
|
23
|
-
onNavigate(pageId);
|
|
23
|
+
onNavigate(pageId, state);
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
|
|
@@ -32,12 +32,15 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
32
32
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
33
33
|
|
|
34
34
|
var DEFAULT_HOOKS = {
|
|
35
|
-
|
|
35
|
+
onChange: function onChange(data) {
|
|
36
|
+
return data;
|
|
37
|
+
},
|
|
36
38
|
onFormComplete: function onFormComplete() {},
|
|
37
39
|
onFormLoad: function onFormLoad() {},
|
|
38
40
|
onGetComponent: function onGetComponent(config, wrap) {
|
|
39
41
|
return null;
|
|
40
42
|
},
|
|
43
|
+
onGoingBack: function onGoingBack() {},
|
|
41
44
|
onPageChange: function onPageChange(pageId) {
|
|
42
45
|
return pageId;
|
|
43
46
|
},
|
|
@@ -60,10 +63,11 @@ var HooksContextProvider = function HooksContextProvider(_ref) {
|
|
|
60
63
|
children = _ref.children;
|
|
61
64
|
|
|
62
65
|
var _useState = (0, _react.useState)({
|
|
63
|
-
|
|
66
|
+
onChange: (overrides === null || overrides === void 0 ? void 0 : overrides.onChange) || DEFAULT_HOOKS.onChange,
|
|
64
67
|
onFormComplete: (overrides === null || overrides === void 0 ? void 0 : overrides.onFormComplete) || DEFAULT_HOOKS.onFormComplete,
|
|
65
68
|
onFormLoad: (overrides === null || overrides === void 0 ? void 0 : overrides.onFormLoad) || DEFAULT_HOOKS.onFormLoad,
|
|
66
69
|
onGetComponent: (overrides === null || overrides === void 0 ? void 0 : overrides.onGetComponent) || DEFAULT_HOOKS.onGetComponent,
|
|
70
|
+
onGoingBack: (overrides === null || overrides === void 0 ? void 0 : overrides.onGoingBack) || DEFAULT_HOOKS.onGoingBack,
|
|
67
71
|
onPageChange: (overrides === null || overrides === void 0 ? void 0 : overrides.onPageChange) || DEFAULT_HOOKS.onPageChange,
|
|
68
72
|
onRequest: (overrides === null || overrides === void 0 ? void 0 : overrides.onRequest) || DEFAULT_HOOKS.onRequest,
|
|
69
73
|
onSubmit: (overrides === null || overrides === void 0 ? void 0 : overrides.onSubmit) || DEFAULT_HOOKS.onSubmit,
|
|
@@ -7,6 +7,8 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _getOptions = _interopRequireDefault(require("./getOptions"));
|
|
9
9
|
|
|
10
|
+
var _copReactComponents = require("@ukhomeoffice/cop-react-components");
|
|
11
|
+
|
|
10
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
13
|
|
|
12
14
|
// Local imports
|
|
@@ -15,11 +17,12 @@ var getAutocompleteSource = function getAutocompleteSource(config) {
|
|
|
15
17
|
(0, _getOptions.default)(config, function (val) {
|
|
16
18
|
options = val;
|
|
17
19
|
});
|
|
20
|
+
var labelMaker = config !== null && config !== void 0 && config.item ? _copReactComponents.Utils.itemLabel(config.item) : null;
|
|
18
21
|
return function (query, populateResults) {
|
|
19
22
|
var lcQuery = query ? query.toLowerCase() : '';
|
|
20
23
|
populateResults(options.filter(function (opt) {
|
|
21
|
-
var
|
|
22
|
-
return
|
|
24
|
+
var label = labelMaker ? labelMaker(opt) : opt.label || '';
|
|
25
|
+
return label.toLowerCase().includes(lcQuery);
|
|
23
26
|
}));
|
|
24
27
|
};
|
|
25
28
|
};
|
|
@@ -16,129 +16,331 @@ describe('utils', function () {
|
|
|
16
16
|
expect(results.length).toEqual(0);
|
|
17
17
|
});
|
|
18
18
|
});
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
describe('without custom item labels', function () {
|
|
20
|
+
it('should get any specified options from the config', function () {
|
|
21
|
+
var CONFIG = {
|
|
22
|
+
data: {
|
|
23
|
+
options: [{
|
|
24
|
+
value: 'a',
|
|
25
|
+
label: 'Alpha'
|
|
26
|
+
}, {
|
|
27
|
+
value: 'b',
|
|
28
|
+
label: 'Bravo'
|
|
29
|
+
}]
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
33
|
+
expect(typeof SOURCE === 'function').toBeTruthy();
|
|
34
|
+
SOURCE('a', function (results) {
|
|
35
|
+
expect(results.length).toEqual(2);
|
|
36
|
+
expect(results).toEqual([{
|
|
23
37
|
value: 'a',
|
|
24
38
|
label: 'Alpha'
|
|
25
39
|
}, {
|
|
26
40
|
value: 'b',
|
|
27
41
|
label: 'Bravo'
|
|
28
|
-
}]
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
label: 'Alpha'
|
|
38
|
-
}, {
|
|
39
|
-
value: 'b',
|
|
40
|
-
label: 'Bravo'
|
|
41
|
-
}]);
|
|
42
|
-
});
|
|
43
|
-
SOURCE('al', function (results) {
|
|
44
|
-
expect(results.length).toEqual(1);
|
|
45
|
-
expect(results).toEqual([{
|
|
46
|
-
value: 'a',
|
|
47
|
-
label: 'Alpha'
|
|
48
|
-
}]);
|
|
42
|
+
}]);
|
|
43
|
+
});
|
|
44
|
+
SOURCE('al', function (results) {
|
|
45
|
+
expect(results.length).toEqual(1);
|
|
46
|
+
expect(results).toEqual([{
|
|
47
|
+
value: 'a',
|
|
48
|
+
label: 'Alpha'
|
|
49
|
+
}]);
|
|
50
|
+
});
|
|
49
51
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
it('should handle an empty query', function () {
|
|
53
|
+
var CONFIG = {
|
|
54
|
+
data: {
|
|
55
|
+
options: [{
|
|
56
|
+
value: 'a',
|
|
57
|
+
label: 'Alpha'
|
|
58
|
+
}, {
|
|
59
|
+
value: 'b',
|
|
60
|
+
label: 'Bravo'
|
|
61
|
+
}]
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
65
|
+
SOURCE('', function (results) {
|
|
66
|
+
expect(results.length).toEqual(2);
|
|
67
|
+
expect(results).toEqual([{
|
|
55
68
|
value: 'a',
|
|
56
69
|
label: 'Alpha'
|
|
57
70
|
}, {
|
|
58
71
|
value: 'b',
|
|
59
72
|
label: 'Bravo'
|
|
60
|
-
}]
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
64
|
-
SOURCE('', function (results) {
|
|
65
|
-
expect(results.length).toEqual(2);
|
|
66
|
-
expect(results).toEqual([{
|
|
67
|
-
value: 'a',
|
|
68
|
-
label: 'Alpha'
|
|
69
|
-
}, {
|
|
70
|
-
value: 'b',
|
|
71
|
-
label: 'Bravo'
|
|
72
|
-
}]);
|
|
73
|
+
}]);
|
|
74
|
+
});
|
|
73
75
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
it('should handle an undefined query', function () {
|
|
77
|
+
var CONFIG = {
|
|
78
|
+
data: {
|
|
79
|
+
options: [{
|
|
80
|
+
value: 'a',
|
|
81
|
+
label: 'Alpha'
|
|
82
|
+
}, {
|
|
83
|
+
value: 'b',
|
|
84
|
+
label: 'Bravo'
|
|
85
|
+
}]
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
89
|
+
SOURCE(undefined, function (results) {
|
|
90
|
+
expect(results.length).toEqual(2);
|
|
91
|
+
expect(results).toEqual([{
|
|
79
92
|
value: 'a',
|
|
80
93
|
label: 'Alpha'
|
|
81
94
|
}, {
|
|
82
95
|
value: 'b',
|
|
83
96
|
label: 'Bravo'
|
|
84
|
-
}]
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
88
|
-
SOURCE(undefined, function (results) {
|
|
89
|
-
expect(results.length).toEqual(2);
|
|
90
|
-
expect(results).toEqual([{
|
|
91
|
-
value: 'a',
|
|
92
|
-
label: 'Alpha'
|
|
93
|
-
}, {
|
|
94
|
-
value: 'b',
|
|
95
|
-
label: 'Bravo'
|
|
96
|
-
}]);
|
|
97
|
+
}]);
|
|
98
|
+
});
|
|
97
99
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
it('should handle a null query', function () {
|
|
101
|
+
var CONFIG = {
|
|
102
|
+
data: {
|
|
103
|
+
options: [{
|
|
104
|
+
value: 'a',
|
|
105
|
+
label: 'Alpha'
|
|
106
|
+
}, {
|
|
107
|
+
value: 'b',
|
|
108
|
+
label: 'Bravo'
|
|
109
|
+
}]
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
113
|
+
SOURCE(null, function (results) {
|
|
114
|
+
expect(results.length).toEqual(2);
|
|
115
|
+
expect(results).toEqual([{
|
|
103
116
|
value: 'a',
|
|
104
117
|
label: 'Alpha'
|
|
105
118
|
}, {
|
|
106
119
|
value: 'b',
|
|
107
120
|
label: 'Bravo'
|
|
108
|
-
}]
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
112
|
-
SOURCE(null, function (results) {
|
|
113
|
-
expect(results.length).toEqual(2);
|
|
114
|
-
expect(results).toEqual([{
|
|
115
|
-
value: 'a',
|
|
116
|
-
label: 'Alpha'
|
|
117
|
-
}, {
|
|
118
|
-
value: 'b',
|
|
119
|
-
label: 'Bravo'
|
|
120
|
-
}]);
|
|
121
|
+
}]);
|
|
122
|
+
});
|
|
121
123
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
it('should handle a missing label on an option', function () {
|
|
125
|
+
var CONFIG = {
|
|
126
|
+
data: {
|
|
127
|
+
options: [{
|
|
128
|
+
value: 'a',
|
|
129
|
+
label: 'Alpha'
|
|
130
|
+
}, {
|
|
131
|
+
value: 'b'
|
|
132
|
+
}]
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
136
|
+
expect(typeof SOURCE === 'function').toBeTruthy();
|
|
137
|
+
SOURCE('a', function (results) {
|
|
138
|
+
expect(results.length).toEqual(1);
|
|
139
|
+
expect(results).toEqual([{
|
|
127
140
|
value: 'a',
|
|
128
141
|
label: 'Alpha'
|
|
142
|
+
}]);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('with custom item labels', function () {
|
|
147
|
+
it('should get any specified options from the config', function () {
|
|
148
|
+
var CONFIG = {
|
|
149
|
+
item: {
|
|
150
|
+
value: 'currencyCode',
|
|
151
|
+
label: 'currencyCode',
|
|
152
|
+
format: '${currencyName} (${currencyCode})'
|
|
153
|
+
},
|
|
154
|
+
data: {
|
|
155
|
+
options: [{
|
|
156
|
+
currencyName: 'Great British Pounds',
|
|
157
|
+
currencyCode: 'GBP',
|
|
158
|
+
value: 'GBP',
|
|
159
|
+
label: 'GBP'
|
|
160
|
+
}, {
|
|
161
|
+
currencyName: 'United States Dollars',
|
|
162
|
+
currencyCode: 'USD',
|
|
163
|
+
value: 'USD',
|
|
164
|
+
label: 'USD'
|
|
165
|
+
}]
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
169
|
+
expect(typeof SOURCE === 'function').toBeTruthy();
|
|
170
|
+
SOURCE('GB', function (results) {
|
|
171
|
+
expect(results.length).toEqual(1);
|
|
172
|
+
expect(results).toEqual([{
|
|
173
|
+
currencyName: 'Great British Pounds',
|
|
174
|
+
currencyCode: 'GBP',
|
|
175
|
+
value: 'GBP',
|
|
176
|
+
label: 'GBP'
|
|
177
|
+
}]);
|
|
178
|
+
});
|
|
179
|
+
SOURCE(' (', function (results) {
|
|
180
|
+
expect(results.length).toEqual(2);
|
|
181
|
+
expect(results).toEqual([{
|
|
182
|
+
currencyName: 'Great British Pounds',
|
|
183
|
+
currencyCode: 'GBP',
|
|
184
|
+
value: 'GBP',
|
|
185
|
+
label: 'GBP'
|
|
129
186
|
}, {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
187
|
+
currencyName: 'United States Dollars',
|
|
188
|
+
currencyCode: 'USD',
|
|
189
|
+
value: 'USD',
|
|
190
|
+
label: 'USD'
|
|
191
|
+
}]);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
it('should handle an empty query', function () {
|
|
195
|
+
var CONFIG = {
|
|
196
|
+
item: {
|
|
197
|
+
value: 'currencyCode',
|
|
198
|
+
label: 'currencyCode',
|
|
199
|
+
format: '${currencyName} (${currencyCode})'
|
|
200
|
+
},
|
|
201
|
+
data: {
|
|
202
|
+
options: [{
|
|
203
|
+
currencyName: 'Great British Pounds',
|
|
204
|
+
currencyCode: 'GBP',
|
|
205
|
+
value: 'GBP',
|
|
206
|
+
label: 'GBP'
|
|
207
|
+
}, {
|
|
208
|
+
currencyName: 'United States Dollars',
|
|
209
|
+
currencyCode: 'USD',
|
|
210
|
+
value: 'USD',
|
|
211
|
+
label: 'USD'
|
|
212
|
+
}]
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
216
|
+
SOURCE('', function (results) {
|
|
217
|
+
expect(results.length).toEqual(2);
|
|
218
|
+
expect(results).toEqual([{
|
|
219
|
+
currencyName: 'Great British Pounds',
|
|
220
|
+
currencyCode: 'GBP',
|
|
221
|
+
value: 'GBP',
|
|
222
|
+
label: 'GBP'
|
|
223
|
+
}, {
|
|
224
|
+
currencyName: 'United States Dollars',
|
|
225
|
+
currencyCode: 'USD',
|
|
226
|
+
value: 'USD',
|
|
227
|
+
label: 'USD'
|
|
228
|
+
}]);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
it('should handle an undefined query', function () {
|
|
232
|
+
var CONFIG = {
|
|
233
|
+
item: {
|
|
234
|
+
value: 'currencyCode',
|
|
235
|
+
label: 'currencyCode',
|
|
236
|
+
format: '${currencyName} (${currencyCode})'
|
|
237
|
+
},
|
|
238
|
+
data: {
|
|
239
|
+
options: [{
|
|
240
|
+
currencyName: 'Great British Pounds',
|
|
241
|
+
currencyCode: 'GBP',
|
|
242
|
+
value: 'GBP',
|
|
243
|
+
label: 'GBP'
|
|
244
|
+
}, {
|
|
245
|
+
currencyName: 'United States Dollars',
|
|
246
|
+
currencyCode: 'USD',
|
|
247
|
+
value: 'USD',
|
|
248
|
+
label: 'USD'
|
|
249
|
+
}]
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
253
|
+
SOURCE(undefined, function (results) {
|
|
254
|
+
expect(results.length).toEqual(2);
|
|
255
|
+
expect(results).toEqual([{
|
|
256
|
+
currencyName: 'Great British Pounds',
|
|
257
|
+
currencyCode: 'GBP',
|
|
258
|
+
value: 'GBP',
|
|
259
|
+
label: 'GBP'
|
|
260
|
+
}, {
|
|
261
|
+
currencyName: 'United States Dollars',
|
|
262
|
+
currencyCode: 'USD',
|
|
263
|
+
value: 'USD',
|
|
264
|
+
label: 'USD'
|
|
265
|
+
}]);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
it('should handle a null query', function () {
|
|
269
|
+
var CONFIG = {
|
|
270
|
+
item: {
|
|
271
|
+
value: 'currencyCode',
|
|
272
|
+
label: 'currencyCode',
|
|
273
|
+
format: '${currencyName} (${currencyCode})'
|
|
274
|
+
},
|
|
275
|
+
data: {
|
|
276
|
+
options: [{
|
|
277
|
+
currencyName: 'Great British Pounds',
|
|
278
|
+
currencyCode: 'GBP',
|
|
279
|
+
value: 'GBP',
|
|
280
|
+
label: 'GBP'
|
|
281
|
+
}, {
|
|
282
|
+
currencyName: 'United States Dollars',
|
|
283
|
+
currencyCode: 'USD',
|
|
284
|
+
value: 'USD',
|
|
285
|
+
label: 'USD'
|
|
286
|
+
}]
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
290
|
+
SOURCE(null, function (results) {
|
|
291
|
+
expect(results.length).toEqual(2);
|
|
292
|
+
expect(results).toEqual([{
|
|
293
|
+
currencyName: 'Great British Pounds',
|
|
294
|
+
currencyCode: 'GBP',
|
|
295
|
+
value: 'GBP',
|
|
296
|
+
label: 'GBP'
|
|
297
|
+
}, {
|
|
298
|
+
currencyName: 'United States Dollars',
|
|
299
|
+
currencyCode: 'USD',
|
|
300
|
+
value: 'USD',
|
|
301
|
+
label: 'USD'
|
|
302
|
+
}]);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
it('should handle a missing label on an option', function () {
|
|
306
|
+
var CONFIG = {
|
|
307
|
+
item: {
|
|
308
|
+
value: 'currencyCode',
|
|
309
|
+
label: 'currencyCode',
|
|
310
|
+
format: '${currencyName} (${currencyCode})'
|
|
311
|
+
},
|
|
312
|
+
data: {
|
|
313
|
+
options: [{
|
|
314
|
+
currencyName: 'Great British Pounds',
|
|
315
|
+
currencyCode: 'GBP',
|
|
316
|
+
value: 'GBP',
|
|
317
|
+
label: 'GBP'
|
|
318
|
+
}, {
|
|
319
|
+
currencyName: 'United States Dollars',
|
|
320
|
+
currencyCode: 'USD',
|
|
321
|
+
value: 'USD'
|
|
322
|
+
}]
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
var SOURCE = (0, _getAutocompleteSource.default)(CONFIG);
|
|
326
|
+
expect(typeof SOURCE === 'function').toBeTruthy();
|
|
327
|
+
SOURCE('a', function (results) {
|
|
328
|
+
// We expect 2 results here instead of 1 because defining a custom
|
|
329
|
+
// format for item labels means the label is constructed upon processing
|
|
330
|
+
// a query - we're not relying on the 'label' field of the option.
|
|
331
|
+
expect(results.length).toEqual(2);
|
|
332
|
+
expect(results).toEqual([{
|
|
333
|
+
currencyName: 'Great British Pounds',
|
|
334
|
+
currencyCode: 'GBP',
|
|
335
|
+
value: 'GBP',
|
|
336
|
+
label: 'GBP'
|
|
337
|
+
}, {
|
|
338
|
+
currencyName: 'United States Dollars',
|
|
339
|
+
currencyCode: 'USD',
|
|
340
|
+
value: 'USD',
|
|
341
|
+
label: ''
|
|
342
|
+
}]);
|
|
343
|
+
});
|
|
142
344
|
});
|
|
143
345
|
});
|
|
144
346
|
});
|
|
@@ -14,11 +14,9 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
14
14
|
var getComponentToUse = function getComponentToUse(toUse, formComponents) {
|
|
15
15
|
var path = toUse.use.split('.');
|
|
16
16
|
var firstId = path.shift();
|
|
17
|
-
|
|
18
|
-
var wrapper = _objectSpread({}, formComponents.find(function (fc) {
|
|
17
|
+
var wrapper = JSON.parse(JSON.stringify(_objectSpread({}, formComponents.find(function (fc) {
|
|
19
18
|
return fc.id === firstId;
|
|
20
|
-
}));
|
|
21
|
-
|
|
19
|
+
}))));
|
|
22
20
|
var component = wrapper;
|
|
23
21
|
var parent = wrapper;
|
|
24
22
|
|