@ukhomeoffice/cop-react-form-renderer 5.24.2 → 5.25.0-beta
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/CollectionPage/CollectionPage.js +6 -9
- package/dist/components/FormComponent/FormComponent.js +16 -3
- package/dist/components/FormComponent/FormComponent.test.js +92 -0
- package/dist/setupTests.js +9 -1
- package/dist/utils/Component/getDefaultValue.js +5 -8
- package/dist/utils/Component/getDefaultValueFromConfig.js +45 -0
- package/dist/utils/Component/getDefaultValueFromConfig.test.js +86 -0
- package/dist/utils/Component/index.js +2 -0
- package/dist/utils/Data/setupFormData.js +2 -73
- package/dist/utils/Data/setupFormData.test.js +0 -220
- package/package.json +1 -1
|
@@ -41,16 +41,9 @@ var CollectionPage = function CollectionPage(_ref) {
|
|
|
41
41
|
_useState2 = _slicedToArray(_useState, 2),
|
|
42
42
|
patch = _useState2[0],
|
|
43
43
|
setPatch = _useState2[1];
|
|
44
|
-
var
|
|
45
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
46
|
-
data = _useState4[0],
|
|
47
|
-
setData = _useState4[1];
|
|
44
|
+
var data = _utils.default.CollectionPage.getData(page.collection.name, page.formData) || [];
|
|
48
45
|
var currentCollectionName = page.collection.name.split('.').pop();
|
|
49
46
|
var activeIndex = _utils.default.CollectionPage.getActiveIndex(page.collection.name, page.formData);
|
|
50
|
-
(0, _react.useEffect)(function () {
|
|
51
|
-
// This makes sure that the page is correctly populated on a refresh.
|
|
52
|
-
setData(_utils.default.CollectionPage.getData(page.collection.name, page.formData) || []);
|
|
53
|
-
}, [page.formData]);
|
|
54
47
|
|
|
55
48
|
/**
|
|
56
49
|
* Handle the state of the data directly within the page.
|
|
@@ -61,7 +54,7 @@ var CollectionPage = function CollectionPage(_ref) {
|
|
|
61
54
|
var onPageChange = function onPageChange(_ref2) {
|
|
62
55
|
var target = _ref2.target;
|
|
63
56
|
_utils.default.CollectionPage.setData(currentPage.collection.name, target.value, page.formData);
|
|
64
|
-
|
|
57
|
+
data = target.value;
|
|
65
58
|
var parentCollection = page.collection.name.split('.').shift();
|
|
66
59
|
// Because of the way that patch is applied to the submission data
|
|
67
60
|
// later (in onPageAction.js), we have to record the entire top-level
|
|
@@ -86,6 +79,10 @@ var CollectionPage = function CollectionPage(_ref) {
|
|
|
86
79
|
}
|
|
87
80
|
};
|
|
88
81
|
var reportActiveIdChange = function reportActiveIdChange(newActiveId) {
|
|
82
|
+
// Manually set activeIndex here as if we receive rapid onChange events
|
|
83
|
+
// from several components then it's possible activeIndex does not update
|
|
84
|
+
// in time.
|
|
85
|
+
activeIndex = data.length;
|
|
89
86
|
onTopLevelChange({
|
|
90
87
|
target: {
|
|
91
88
|
name: "".concat(currentCollectionName, "ActiveId"),
|
|
@@ -72,13 +72,26 @@ var FormComponent = function FormComponent(_ref) {
|
|
|
72
72
|
}
|
|
73
73
|
return false;
|
|
74
74
|
};
|
|
75
|
+
(0, _react.useEffect)(function () {
|
|
76
|
+
var defaultValue = _utils.default.Component.defaultValue(component, formData);
|
|
77
|
+
if (!value && defaultValue) {
|
|
78
|
+
if (typeof onComponentChange === 'function') {
|
|
79
|
+
onComponentChange({
|
|
80
|
+
target: {
|
|
81
|
+
name: component.fieldId,
|
|
82
|
+
value: defaultValue
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}, []);
|
|
75
88
|
if (component.type === _models.ComponentTypes.CONTAINER) {
|
|
76
89
|
var container = /*#__PURE__*/_react.default.createElement(_Container.default, _extends({}, attrs, {
|
|
77
90
|
container: component,
|
|
78
91
|
wrap: wrap,
|
|
79
92
|
onChange: onComponentChange,
|
|
80
93
|
onTopLevelChange: onTopLevelChange,
|
|
81
|
-
value: value || _utils.default.Component.defaultValue(component),
|
|
94
|
+
value: value || _utils.default.Component.defaultValue(component, formData),
|
|
82
95
|
formData: formData
|
|
83
96
|
}));
|
|
84
97
|
if (component.additionalValidation) {
|
|
@@ -92,7 +105,7 @@ var FormComponent = function FormComponent(_ref) {
|
|
|
92
105
|
wrap: wrap,
|
|
93
106
|
onChange: onComponentChange,
|
|
94
107
|
onTopLevelChange: onTopLevelChange,
|
|
95
|
-
value: value || _utils.default.Component.defaultValue(component),
|
|
108
|
+
value: value || _utils.default.Component.defaultValue(component, formData),
|
|
96
109
|
formData: formData
|
|
97
110
|
}));
|
|
98
111
|
}
|
|
@@ -138,7 +151,7 @@ var FormComponent = function FormComponent(_ref) {
|
|
|
138
151
|
cya_label: _utils.default.interpolateString(component.cya_label, formData),
|
|
139
152
|
suffix: _utils.default.interpolateString(component.suffix, formData),
|
|
140
153
|
options: options,
|
|
141
|
-
value: value
|
|
154
|
+
value: value,
|
|
142
155
|
onChange: onComponentChangeExtended,
|
|
143
156
|
formData: formData
|
|
144
157
|
}), wrap, hooks.onGetComponent);
|
|
@@ -223,5 +223,97 @@ describe('components', function () {
|
|
|
223
223
|
}
|
|
224
224
|
}, _callee6);
|
|
225
225
|
})));
|
|
226
|
+
it('should correctly handle a component\'s default value when it has no existing value', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
|
|
227
|
+
var ID, COMPONENT, DATA, ON_CHANGE_ARGS, ON_CHANGE_COUNT, ON_CHANGE, _renderWithValidation7, container, rerender, formGroup, input;
|
|
228
|
+
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
|
|
229
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
230
|
+
case 0:
|
|
231
|
+
ID = 'component';
|
|
232
|
+
COMPONENT = {
|
|
233
|
+
id: ID,
|
|
234
|
+
fieldId: ID,
|
|
235
|
+
type: 'text',
|
|
236
|
+
label: 'Text component',
|
|
237
|
+
defaultValue: 'default text'
|
|
238
|
+
};
|
|
239
|
+
DATA = {};
|
|
240
|
+
ON_CHANGE_ARGS = [];
|
|
241
|
+
ON_CHANGE_COUNT = 0;
|
|
242
|
+
ON_CHANGE = function ON_CHANGE(_ref8) {
|
|
243
|
+
var target = _ref8.target;
|
|
244
|
+
ON_CHANGE_ARGS.push(target);
|
|
245
|
+
ON_CHANGE_COUNT += 1;
|
|
246
|
+
DATA[target.name] = target.value;
|
|
247
|
+
};
|
|
248
|
+
_renderWithValidation7 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
|
|
249
|
+
"data-testid": ID,
|
|
250
|
+
component: COMPONENT,
|
|
251
|
+
value: DATA[ID],
|
|
252
|
+
onChange: ON_CHANGE,
|
|
253
|
+
formData: DATA
|
|
254
|
+
})), container = _renderWithValidation7.container, rerender = _renderWithValidation7.rerender;
|
|
255
|
+
expect(ON_CHANGE_COUNT).toEqual(1);
|
|
256
|
+
expect(ON_CHANGE_ARGS[0]).toMatchObject({
|
|
257
|
+
name: 'component',
|
|
258
|
+
value: COMPONENT.defaultValue
|
|
259
|
+
});
|
|
260
|
+
formGroup = container.childNodes[0];
|
|
261
|
+
input = formGroup.childNodes[2];
|
|
262
|
+
(0, _setupTests.rerenderWithValidation)(rerender, /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
|
|
263
|
+
"data-testid": ID,
|
|
264
|
+
component: COMPONENT,
|
|
265
|
+
value: DATA[ID],
|
|
266
|
+
onChange: ON_CHANGE,
|
|
267
|
+
formData: DATA
|
|
268
|
+
}));
|
|
269
|
+
// Input should only be updated once the changes caused
|
|
270
|
+
// by onChange have had another render to propagate down.
|
|
271
|
+
expect(input.value).toEqual(COMPONENT.defaultValue);
|
|
272
|
+
case 13:
|
|
273
|
+
case "end":
|
|
274
|
+
return _context7.stop();
|
|
275
|
+
}
|
|
276
|
+
}, _callee7);
|
|
277
|
+
})));
|
|
278
|
+
it('should correctly handle a component\'s default value when it has an existing value', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
|
|
279
|
+
var ID, COMPONENT, DATA, ON_CHANGE_ARGS, ON_CHANGE_COUNT, ON_CHANGE, _renderWithValidation8, container, formGroup, input;
|
|
280
|
+
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
|
|
281
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
282
|
+
case 0:
|
|
283
|
+
ID = 'component';
|
|
284
|
+
COMPONENT = {
|
|
285
|
+
id: ID,
|
|
286
|
+
fieldId: ID,
|
|
287
|
+
type: 'text',
|
|
288
|
+
label: 'Text component',
|
|
289
|
+
defaultValue: 'default text'
|
|
290
|
+
};
|
|
291
|
+
DATA = {
|
|
292
|
+
component: 'existing value'
|
|
293
|
+
};
|
|
294
|
+
ON_CHANGE_ARGS = [];
|
|
295
|
+
ON_CHANGE_COUNT = 0;
|
|
296
|
+
ON_CHANGE = function ON_CHANGE(_ref10) {
|
|
297
|
+
var target = _ref10.target;
|
|
298
|
+
ON_CHANGE_ARGS.push(target);
|
|
299
|
+
ON_CHANGE_COUNT += 1;
|
|
300
|
+
};
|
|
301
|
+
_renderWithValidation8 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
|
|
302
|
+
"data-testid": ID,
|
|
303
|
+
component: COMPONENT,
|
|
304
|
+
value: DATA[ID],
|
|
305
|
+
onChange: ON_CHANGE,
|
|
306
|
+
formData: DATA
|
|
307
|
+
})), container = _renderWithValidation8.container;
|
|
308
|
+
expect(ON_CHANGE_COUNT).toEqual(0);
|
|
309
|
+
formGroup = container.childNodes[0];
|
|
310
|
+
input = formGroup.childNodes[2];
|
|
311
|
+
expect(input.value).toEqual(DATA[ID]);
|
|
312
|
+
case 11:
|
|
313
|
+
case "end":
|
|
314
|
+
return _context8.stop();
|
|
315
|
+
}
|
|
316
|
+
}, _callee8);
|
|
317
|
+
})));
|
|
226
318
|
});
|
|
227
319
|
});
|
package/dist/setupTests.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.renderWithValidation = exports.renderHookWithProvider = exports.renderDomWithValidation = exports.expectObjectLike = void 0;
|
|
6
|
+
exports.rerenderWithValidation = exports.renderWithValidation = exports.renderHookWithProvider = exports.renderDomWithValidation = exports.expectObjectLike = void 0;
|
|
7
7
|
var _react = require("@testing-library/react");
|
|
8
8
|
var _reactHooks = require("@testing-library/react-hooks");
|
|
9
9
|
var _reactDom = require("react-dom");
|
|
@@ -16,6 +16,14 @@ var renderWithValidation = function renderWithValidation(ui, options) {
|
|
|
16
16
|
}, ui)), options);
|
|
17
17
|
};
|
|
18
18
|
exports.renderWithValidation = renderWithValidation;
|
|
19
|
+
var rerenderWithValidation = function rerenderWithValidation(rerenderCallback, ui, options) {
|
|
20
|
+
return rerenderCallback( /*#__PURE__*/React.createElement(_context.HooksContextProvider, {
|
|
21
|
+
overrides: options === null || options === void 0 ? void 0 : options.hooks
|
|
22
|
+
}, /*#__PURE__*/React.createElement(_context.ValidationContextProvider, {
|
|
23
|
+
key: "vcp"
|
|
24
|
+
}, ui)), options);
|
|
25
|
+
};
|
|
26
|
+
exports.rerenderWithValidation = rerenderWithValidation;
|
|
19
27
|
var renderDomWithValidation = function renderDomWithValidation(ui, container, options) {
|
|
20
28
|
return (0, _reactDom.render)( /*#__PURE__*/React.createElement(_context.HooksContextProvider, {
|
|
21
29
|
overrides: options === null || options === void 0 ? void 0 : options.hooks
|
|
@@ -5,23 +5,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _models = require("../../models");
|
|
8
|
+
var _getDefaultValueFromConfig = _interopRequireDefault(require("./getDefaultValueFromConfig"));
|
|
8
9
|
var _DEFAULT_VALUES;
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
11
|
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
10
12
|
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; }
|
|
11
13
|
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
12
14
|
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
13
15
|
var DEFAULT_VALUES = (_DEFAULT_VALUES = {}, _defineProperty(_DEFAULT_VALUES, _models.ComponentTypes.COLLECTION, []), _defineProperty(_DEFAULT_VALUES, _models.ComponentTypes.CONTAINER, {}), _defineProperty(_DEFAULT_VALUES, _models.ComponentTypes.FILE, {}), _DEFAULT_VALUES);
|
|
14
|
-
var getDefaultValue = function getDefaultValue(component) {
|
|
16
|
+
var getDefaultValue = function getDefaultValue(component, formData) {
|
|
15
17
|
if (!component) {
|
|
16
18
|
return '';
|
|
17
19
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
if ('defaultObjectValue' in component) {
|
|
22
|
-
return component.defaultObjectValue;
|
|
23
|
-
}
|
|
24
|
-
return DEFAULT_VALUES[component.type] || '';
|
|
20
|
+
var defaultValue = (0, _getDefaultValueFromConfig.default)(component, formData);
|
|
21
|
+
return defaultValue || DEFAULT_VALUES[component.type] || '';
|
|
25
22
|
};
|
|
26
23
|
var _default = getDefaultValue;
|
|
27
24
|
exports.default = _default;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
8
|
+
var _getSourceData = _interopRequireDefault(require("../Data/getSourceData"));
|
|
9
|
+
var _models = require("../../models");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
// Global imports.
|
|
12
|
+
|
|
13
|
+
// Local imports.
|
|
14
|
+
|
|
15
|
+
var hasDefaultValue = function hasDefaultValue(component) {
|
|
16
|
+
return component.defaultValue || component.defaultObjectValue;
|
|
17
|
+
};
|
|
18
|
+
var getDefaultForDate = function getDefaultForDate(date) {
|
|
19
|
+
var dateFormat = /^(\d{1,2})-\d{1,2}-(\d{4})$/;
|
|
20
|
+
var defaultDate = dateFormat.test(date.defaultValue) ? date.defaultValue : null;
|
|
21
|
+
return date.defaultValue === 'today' ? (0, _dayjs.default)().format('DD-MM-YYYY') : defaultDate;
|
|
22
|
+
};
|
|
23
|
+
var getDefaultValueFromConfig = function getDefaultValueFromConfig(component, data) {
|
|
24
|
+
if (!hasDefaultValue(component)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
switch (component.type) {
|
|
28
|
+
case _models.ComponentTypes.DATE:
|
|
29
|
+
return getDefaultForDate(component, data);
|
|
30
|
+
default:
|
|
31
|
+
{
|
|
32
|
+
if (component.defaultObjectValue) {
|
|
33
|
+
Object.keys(component.defaultObjectValue).forEach(function (value) {
|
|
34
|
+
if (typeof component.defaultObjectValue[value] === 'string' && (0, _getSourceData.default)(data, component.defaultObjectValue[value]) !== undefined) {
|
|
35
|
+
// eslint-disable-next-line no-param-reassign
|
|
36
|
+
component.defaultObjectValue[value] = (0, _getSourceData.default)(data, component.defaultObjectValue[value]);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return component.defaultObjectValue ? component.defaultObjectValue : component.defaultValue;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var _default = getDefaultValueFromConfig;
|
|
45
|
+
exports.default = _default;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
4
|
+
var _models = require("../../models");
|
|
5
|
+
var _getDefaultValueFromConfig = _interopRequireDefault(require("./getDefaultValueFromConfig"));
|
|
6
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
7
|
+
// Global imports.
|
|
8
|
+
|
|
9
|
+
// Local imports.
|
|
10
|
+
|
|
11
|
+
describe('utils.component.defaultValueFromConfig', function () {
|
|
12
|
+
it('should return null if a component has no default value defined', function () {
|
|
13
|
+
var result = (0, _getDefaultValueFromConfig.default)({}, {});
|
|
14
|
+
expect(result).toEqual(null);
|
|
15
|
+
});
|
|
16
|
+
it('should return a normal default value if one is defined', function () {
|
|
17
|
+
var COMPONENT = {
|
|
18
|
+
defaultValue: 'value'
|
|
19
|
+
};
|
|
20
|
+
var result = (0, _getDefaultValueFromConfig.default)(COMPONENT, {});
|
|
21
|
+
expect(result).toEqual('value');
|
|
22
|
+
});
|
|
23
|
+
it('should return an object default value if one is defined', function () {
|
|
24
|
+
var COMPONENT = {
|
|
25
|
+
defaultObjectValue: {
|
|
26
|
+
alpha: 'one',
|
|
27
|
+
bravo: 'two'
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var result = (0, _getDefaultValueFromConfig.default)(COMPONENT, {});
|
|
31
|
+
expect(result).toEqual({
|
|
32
|
+
alpha: 'one',
|
|
33
|
+
bravo: 'two'
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('should return the defaultObjectValue if both defaultObjectValue and defaultValue are defined', function () {
|
|
37
|
+
var COMPONENT = {
|
|
38
|
+
defaultValue: 'zero',
|
|
39
|
+
defaultObjectValue: {
|
|
40
|
+
alpha: 'one',
|
|
41
|
+
bravo: 'two'
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var result = (0, _getDefaultValueFromConfig.default)(COMPONENT, {});
|
|
45
|
+
expect(result).toEqual({
|
|
46
|
+
alpha: 'one',
|
|
47
|
+
bravo: 'two'
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it('should return an object default with interpolated fields if applicable', function () {
|
|
51
|
+
var COMPONENT = {
|
|
52
|
+
defaultObjectValue: {
|
|
53
|
+
alpha: 'testObject.testText',
|
|
54
|
+
bravo: 'testObject.testText'
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var DATA = {
|
|
58
|
+
testObject: {
|
|
59
|
+
testText: 'value'
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var result = (0, _getDefaultValueFromConfig.default)(COMPONENT, DATA);
|
|
63
|
+
expect(result).toEqual({
|
|
64
|
+
alpha: 'value',
|
|
65
|
+
bravo: 'value'
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('for a date component', function () {
|
|
69
|
+
it('should return a normal default value', function () {
|
|
70
|
+
var COMPONENT = {
|
|
71
|
+
type: _models.ComponentTypes.DATE,
|
|
72
|
+
defaultValue: '01-01-2000'
|
|
73
|
+
};
|
|
74
|
+
var result = (0, _getDefaultValueFromConfig.default)(COMPONENT, {});
|
|
75
|
+
expect(result).toEqual('01-01-2000');
|
|
76
|
+
});
|
|
77
|
+
it('should handle specific default values for date', function () {
|
|
78
|
+
var COMPONENT = {
|
|
79
|
+
type: _models.ComponentTypes.DATE,
|
|
80
|
+
defaultValue: 'today'
|
|
81
|
+
};
|
|
82
|
+
var result = (0, _getDefaultValueFromConfig.default)(COMPONENT, {});
|
|
83
|
+
expect(result).toEqual((0, _dayjs.default)().format('DD-MM-YYYY'));
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -8,6 +8,7 @@ var _cleanAttributes = _interopRequireDefault(require("./cleanAttributes"));
|
|
|
8
8
|
var _elevateNestedComponents = _interopRequireDefault(require("./elevateNestedComponents"));
|
|
9
9
|
var _getComponent = _interopRequireDefault(require("./getComponent"));
|
|
10
10
|
var _getDefaultValue = _interopRequireDefault(require("./getDefaultValue"));
|
|
11
|
+
var _getDefaultValueFromConfig = _interopRequireDefault(require("./getDefaultValueFromConfig"));
|
|
11
12
|
var _isEditable = _interopRequireDefault(require("./isEditable"));
|
|
12
13
|
var _setupContainerComponentsPath = _interopRequireDefault(require("./setupContainerComponentsPath"));
|
|
13
14
|
var _showComponent = _interopRequireDefault(require("./showComponent"));
|
|
@@ -16,6 +17,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
16
17
|
var Component = {
|
|
17
18
|
clean: _cleanAttributes.default,
|
|
18
19
|
defaultValue: _getDefaultValue.default,
|
|
20
|
+
defaultValueFromConfig: _getDefaultValueFromConfig.default,
|
|
19
21
|
editable: _isEditable.default,
|
|
20
22
|
elevateNested: _elevateNestedComponents.default,
|
|
21
23
|
get: _getComponent.default,
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
8
7
|
var _getSourceData = _interopRequireDefault(require("./getSourceData"));
|
|
9
|
-
var _setDataItem = _interopRequireDefault(require("./setDataItem"));
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
9
|
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
12
10
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
@@ -14,70 +12,6 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
14
12
|
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; }
|
|
15
13
|
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
16
14
|
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } // Local imports
|
|
17
|
-
var setDefaultDateValue = function setDefaultDateValue(date, data, fullPath) {
|
|
18
|
-
var dateFormat = /^(\d{1,2})-\d{1,2}-(\d{4})$/;
|
|
19
|
-
var defaultDate = dateFormat.test(date.defaultValue) ? date.defaultValue : (0, _getSourceData.default)(data, date.defaultValue);
|
|
20
|
-
var val = date.defaultValue === 'today' ? (0, _dayjs.default)().format('DD-MM-YYYY') : defaultDate;
|
|
21
|
-
(0, _setDataItem.default)(data, "".concat(fullPath).concat(date.fieldId), val);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* This currently will not work for collections.
|
|
26
|
-
* If support is required it will need to be added.
|
|
27
|
-
*/
|
|
28
|
-
var setupDefaultValue = function setupDefaultValue(component, data, fullPath) {
|
|
29
|
-
var thisComponent = component;
|
|
30
|
-
var componentFullPath = "".concat(fullPath).concat(component.fieldId);
|
|
31
|
-
if (component.type === 'container') {
|
|
32
|
-
var _component$components;
|
|
33
|
-
(_component$components = component.components) === null || _component$components === void 0 ? void 0 : _component$components.forEach(function (comp) {
|
|
34
|
-
setupDefaultValue(comp, data, "".concat(componentFullPath, "."));
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if ((component.defaultValue || component.defaultObjectValue) && !(0, _getSourceData.default)(data, componentFullPath)) {
|
|
38
|
-
switch (component.type) {
|
|
39
|
-
case 'date':
|
|
40
|
-
setDefaultDateValue(component, data, fullPath);
|
|
41
|
-
break;
|
|
42
|
-
default:
|
|
43
|
-
// defaultValue is expected to be a string, default object value is an object. Keeping defaultValue
|
|
44
|
-
// as a string is required for consuming apps using FormIO, this restriction could be removed in the future.
|
|
45
|
-
{
|
|
46
|
-
if (component.defaultObjectValue) {
|
|
47
|
-
Object.keys(component.defaultObjectValue).forEach(function (value) {
|
|
48
|
-
if (typeof component.defaultObjectValue[value] === 'string' && (0, _getSourceData.default)(data, component.defaultObjectValue[value]) !== undefined) {
|
|
49
|
-
thisComponent.defaultObjectValue[value] = (0, _getSourceData.default)(data, component.defaultObjectValue[value]);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
var defaultToUse = component.defaultObjectValue ? component.defaultObjectValue : component.defaultValue;
|
|
54
|
-
(0, _setDataItem.default)(data, componentFullPath, defaultToUse);
|
|
55
|
-
delete thisComponent.defaultObjectValue;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (component.defaultValue) {
|
|
60
|
-
// Some components will throw warnings when having
|
|
61
|
-
// both a 'value' and 'defaultValue' prop set.
|
|
62
|
-
// defaultValue is safe to delete once we've tried
|
|
63
|
-
// to use it.
|
|
64
|
-
delete thisComponent.defaultValue;
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
var setupDefaultValuesForComponents = function setupDefaultValuesForComponents(components, data) {
|
|
68
|
-
components.forEach(function (component) {
|
|
69
|
-
return setupDefaultValue(component, data, '');
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
var setupPageDefaultValues = function setupPageDefaultValues(pages, data) {
|
|
73
|
-
pages.forEach(function (page) {
|
|
74
|
-
page.components.filter(function (c) {
|
|
75
|
-
return !c.use;
|
|
76
|
-
}).forEach(function (component) {
|
|
77
|
-
return setupDefaultValue(component, data, '');
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
15
|
var setupComponentSourceData = function setupComponentSourceData(component, data) {
|
|
82
16
|
var componentSourceData = data;
|
|
83
17
|
if (component.source) {
|
|
@@ -100,11 +34,8 @@ var setupPageSourceData = function setupPageSourceData(pages, data) {
|
|
|
100
34
|
};
|
|
101
35
|
|
|
102
36
|
/**
|
|
103
|
-
* This populates an object with data
|
|
104
|
-
*
|
|
105
|
-
* source field will take priority.
|
|
106
|
-
* Note that in the case of source fields, this doesn't currently
|
|
107
|
-
* support sequenced dependencies:
|
|
37
|
+
* This populates an object with data from a source field.
|
|
38
|
+
* Note that this doesn't currently support sequenced dependencies:
|
|
108
39
|
* 0: fieldA: source.field = fieldB
|
|
109
40
|
* 1: fieldB: source.field = fieldC
|
|
110
41
|
* 2: fieldC: 'value'
|
|
@@ -117,8 +48,6 @@ var setupPageSourceData = function setupPageSourceData(pages, data) {
|
|
|
117
48
|
*/
|
|
118
49
|
var setupFormData = function setupFormData(pages, components, baseData) {
|
|
119
50
|
var data = _objectSpread({}, baseData);
|
|
120
|
-
setupDefaultValuesForComponents(components, data);
|
|
121
|
-
setupPageDefaultValues(pages, data);
|
|
122
51
|
setupSourceDataForComponents(components, data);
|
|
123
52
|
setupPageSourceData(pages, data);
|
|
124
53
|
return data;
|
|
@@ -208,226 +208,6 @@ describe('utils', function () {
|
|
|
208
208
|
delegateEmails: _userProfileData.default.userDetails.delegateEmails
|
|
209
209
|
}));
|
|
210
210
|
});
|
|
211
|
-
it('should handle a default value field', function () {
|
|
212
|
-
var PAGES = [];
|
|
213
|
-
var COMPONENTS = [{
|
|
214
|
-
fieldId: 'testField',
|
|
215
|
-
type: 'text',
|
|
216
|
-
defaultValue: 'VALUE'
|
|
217
|
-
}];
|
|
218
|
-
var DATA = {};
|
|
219
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
220
|
-
expect(RESULT).toEqual({
|
|
221
|
-
testField: 'VALUE'
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
it('should handle a default value field with defaultObjectValue', function () {
|
|
225
|
-
var PAGES = [];
|
|
226
|
-
var COMPONENTS = [{
|
|
227
|
-
fieldId: 'testField',
|
|
228
|
-
type: 'autocomplete',
|
|
229
|
-
defaultObjectValue: {
|
|
230
|
-
id: 4,
|
|
231
|
-
name: 'Algeria',
|
|
232
|
-
value: '4',
|
|
233
|
-
label: 'Algeria'
|
|
234
|
-
}
|
|
235
|
-
}];
|
|
236
|
-
var DATA = {};
|
|
237
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
238
|
-
expect(RESULT.testField).toMatchObject({
|
|
239
|
-
id: 4,
|
|
240
|
-
name: 'Algeria',
|
|
241
|
-
value: '4',
|
|
242
|
-
label: 'Algeria'
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
it('should handle a default value field with defaultObjectValue if dot-separated field identifier exists within the data', function () {
|
|
246
|
-
var PAGES = [];
|
|
247
|
-
var COMPONENTS = [{
|
|
248
|
-
fieldId: 'testField',
|
|
249
|
-
type: 'autocomplete',
|
|
250
|
-
defaultObjectValue: {
|
|
251
|
-
id: 'country.id',
|
|
252
|
-
name: 'country.name',
|
|
253
|
-
value: 'country.value',
|
|
254
|
-
label: 'country.name'
|
|
255
|
-
}
|
|
256
|
-
}];
|
|
257
|
-
var DATA = {
|
|
258
|
-
'country': {
|
|
259
|
-
'id': 4,
|
|
260
|
-
'name': 'Algeria',
|
|
261
|
-
'value': '4'
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
265
|
-
expect(RESULT.testField).toMatchObject({
|
|
266
|
-
id: 4,
|
|
267
|
-
name: 'Algeria',
|
|
268
|
-
value: '4',
|
|
269
|
-
label: 'Algeria'
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
it('should ignore the default value field with defaultObjectValue if dot-separated field identifier doesn\'t exists within the data', function () {
|
|
273
|
-
var PAGES = [];
|
|
274
|
-
var COMPONENTS = [{
|
|
275
|
-
fieldId: 'testField',
|
|
276
|
-
type: 'autocomplete',
|
|
277
|
-
defaultObjectValue: {
|
|
278
|
-
id: 'country.id',
|
|
279
|
-
name: 'country.name',
|
|
280
|
-
value: 'country.value',
|
|
281
|
-
label: 'country.name'
|
|
282
|
-
}
|
|
283
|
-
}];
|
|
284
|
-
var DATA = {};
|
|
285
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
286
|
-
expect(RESULT.testField).toMatchObject({
|
|
287
|
-
id: 'country.id',
|
|
288
|
-
name: 'country.name',
|
|
289
|
-
value: 'country.value',
|
|
290
|
-
label: 'country.name'
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
it('should ignore a default value when a value already exists in data', function () {
|
|
294
|
-
var PAGES = [];
|
|
295
|
-
var COMPONENTS = [{
|
|
296
|
-
fieldId: 'testField',
|
|
297
|
-
type: 'text',
|
|
298
|
-
defaultValue: 'VALUE'
|
|
299
|
-
}];
|
|
300
|
-
var DATA = {
|
|
301
|
-
testField: 'EXISTING_VALUE'
|
|
302
|
-
};
|
|
303
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
304
|
-
expect(RESULT).toEqual({
|
|
305
|
-
testField: 'EXISTING_VALUE'
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
it('should handle default values within pages', function () {
|
|
309
|
-
var PAGES = [{
|
|
310
|
-
components: [{
|
|
311
|
-
fieldId: 'pageField',
|
|
312
|
-
type: 'text',
|
|
313
|
-
defaultValue: 'VALUE'
|
|
314
|
-
}]
|
|
315
|
-
}];
|
|
316
|
-
var COMPONENTS = [];
|
|
317
|
-
var DATA = {};
|
|
318
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
319
|
-
expect(RESULT).toEqual({
|
|
320
|
-
pageField: 'VALUE'
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
it('should ignore default values within pages when a value already exists in data', function () {
|
|
324
|
-
var PAGES = [{
|
|
325
|
-
components: [{
|
|
326
|
-
fieldId: 'pageField',
|
|
327
|
-
type: 'text',
|
|
328
|
-
defaultValue: 'VALUE'
|
|
329
|
-
}]
|
|
330
|
-
}];
|
|
331
|
-
var COMPONENTS = [];
|
|
332
|
-
var DATA = {
|
|
333
|
-
pageField: 'EXISTING_VALUE'
|
|
334
|
-
};
|
|
335
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
336
|
-
expect(RESULT).toEqual({
|
|
337
|
-
pageField: 'EXISTING_VALUE'
|
|
338
|
-
});
|
|
339
|
-
});
|
|
340
|
-
it('should handle default values of components within containers', function () {
|
|
341
|
-
var PAGES = [{
|
|
342
|
-
components: [{
|
|
343
|
-
fieldId: 'firstContainer',
|
|
344
|
-
type: 'container',
|
|
345
|
-
components: [{
|
|
346
|
-
fieldId: 'firstDate',
|
|
347
|
-
type: 'date',
|
|
348
|
-
defaultValue: '01-01-1999'
|
|
349
|
-
}, {
|
|
350
|
-
fieldId: 'secondContainer',
|
|
351
|
-
type: 'container',
|
|
352
|
-
components: [{
|
|
353
|
-
fieldId: 'secondDate',
|
|
354
|
-
type: 'date',
|
|
355
|
-
defaultValue: '01-01-2000'
|
|
356
|
-
}]
|
|
357
|
-
}]
|
|
358
|
-
}]
|
|
359
|
-
}];
|
|
360
|
-
var RESULT = (0, _setupFormData.default)(PAGES, [], {});
|
|
361
|
-
expect(RESULT).toEqual({
|
|
362
|
-
firstContainer: {
|
|
363
|
-
firstDate: '01-01-1999',
|
|
364
|
-
secondContainer: {
|
|
365
|
-
secondDate: '01-01-2000'
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
it('should ignore default values of components within containers when they already have a value in data', function () {
|
|
371
|
-
var PAGES = [{
|
|
372
|
-
components: [{
|
|
373
|
-
fieldId: 'firstContainer',
|
|
374
|
-
type: 'container',
|
|
375
|
-
components: [{
|
|
376
|
-
fieldId: 'firstDate',
|
|
377
|
-
type: 'date',
|
|
378
|
-
defaultValue: '01-01-1999'
|
|
379
|
-
}, {
|
|
380
|
-
fieldId: 'secondContainer',
|
|
381
|
-
type: 'container',
|
|
382
|
-
components: [{
|
|
383
|
-
fieldId: 'secondDate',
|
|
384
|
-
type: 'date',
|
|
385
|
-
defaultValue: '01-01-2000'
|
|
386
|
-
}]
|
|
387
|
-
}]
|
|
388
|
-
}]
|
|
389
|
-
}];
|
|
390
|
-
var DATA = {
|
|
391
|
-
firstContainer: {
|
|
392
|
-
firstDate: '01-01-1000',
|
|
393
|
-
secondContainer: {
|
|
394
|
-
secondDate: '01-01-1000'
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
};
|
|
398
|
-
var RESULT = (0, _setupFormData.default)(PAGES, [], DATA);
|
|
399
|
-
expect(RESULT).toEqual({
|
|
400
|
-
firstContainer: {
|
|
401
|
-
firstDate: '01-01-1000',
|
|
402
|
-
secondContainer: {
|
|
403
|
-
secondDate: '01-01-1000'
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
it('should handle default values given it is a date with a dot-separated field identifier within pages', function () {
|
|
409
|
-
var PAGES = [{
|
|
410
|
-
components: [{
|
|
411
|
-
fieldId: 'pageFieldA',
|
|
412
|
-
type: 'date',
|
|
413
|
-
defaultValue: 'test.a'
|
|
414
|
-
}, {
|
|
415
|
-
fieldId: 'pageFieldB',
|
|
416
|
-
type: 'date',
|
|
417
|
-
defaultValue: 'test.b'
|
|
418
|
-
}]
|
|
419
|
-
}];
|
|
420
|
-
var COMPONENTS = [];
|
|
421
|
-
var DATA = {
|
|
422
|
-
'test': {
|
|
423
|
-
'a': '11-04-2023',
|
|
424
|
-
'b': '12-5-2023'
|
|
425
|
-
}
|
|
426
|
-
};
|
|
427
|
-
var RESULT = (0, _setupFormData.default)(PAGES, COMPONENTS, DATA);
|
|
428
|
-
expect(RESULT.pageFieldA).toEqual('11-04-2023');
|
|
429
|
-
expect(RESULT.pageFieldB).toEqual('12-5-2023');
|
|
430
|
-
});
|
|
431
211
|
});
|
|
432
212
|
});
|
|
433
213
|
});
|