@wise/dynamic-flow-client 3.9.1-experimental-152372b → 3.9.2-experimental-535221d
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/build/legacy/dynamicFlow/DynamicFlow.js +5 -5
- package/build/legacy/dynamicFlow/tests/Actions.spec.js +50 -3
- package/build/legacy/formControl/FormControl.js +6 -4
- package/build/legacy/jsonSchemaForm/JsonSchemaForm.end-to-end.spec.js +0 -29
- package/build/legacy/jsonSchemaForm/oneOfSchema/OneOfSchema.js +1 -1
- package/build/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.js +6 -2
- package/build/main.js +1241 -1183
- package/build/main.min.js +1 -1
- package/build/main.mjs +943 -885
- package/build/revamp/DynamicFlowCore.js +2 -3
- package/build/revamp/DynamicFragmentWise.js +1 -1
- package/build/revamp/flow/executeSubmission.js +2 -2
- package/build/revamp/tests/RefreshOnChange.with.Segmented.spec.js +447 -0
- package/build/revamp/tests/RefreshOnChange.with.Tabs.spec.js +57 -0
- package/build/revamp/tests/SegmentedControl.spec.js +48 -0
- package/build/revamp/tests/legacy/Actions.spec.js +242 -0
- package/build/revamp/wise/renderers/ButtonRenderer.js +1 -1
- package/build/revamp/wise/renderers/DecisionRenderer.js +1 -1
- package/build/revamp/wise/renderers/SearchRenderer/BlockSearchRendererComponent.js +1 -1
- package/build/revamp/wise/renderers/SearchRenderer/InlineSearchRendererComponent.js +1 -1
- package/build/revamp/wise/renderers/SelectInputRenderer/SegmentedInputRendererComponent.js +21 -0
- package/build/revamp/wise/renderers/SelectInputRenderer/SelectInputRenderer.js +3 -0
- package/build/revamp/wise/renderers/SelectInputRenderer/SelectInputRendererComponent.js +2 -2
- package/build/revamp/wise/renderers/getWiseRenderers.js +2 -0
- package/build/revamp/{renderers → wise/renderers}/step/ExternalConfirmationDialog.js +1 -1
- package/build/types/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.d.ts +1 -0
- package/build/types/legacy/layout/utils/index.d.ts +1 -1
- package/build/types/revamp/wise/renderers/SelectInputRenderer/SegmentedInputRendererComponent.d.ts +2 -0
- package/build/types/revamp/wise/renderers/getWiseRenderers.d.ts +1 -1
- package/build/types/revamp/{renderers → wise/renderers}/step/BackButton.d.ts +1 -1
- package/build/types/revamp/wise/renderers/step/StepRenderer.d.ts +2 -0
- package/build/types/revamp/{renderers → wise/renderers}/step/StepRendererContext.d.ts +2 -2
- package/build/types/revamp/wise/renderers/utils/layout-utils.d.ts +1 -1
- package/package.json +3 -3
- package/build/types/revamp/renderers/step/StepRenderer.d.ts +0 -2
- /package/build/revamp/{renderers → wise/renderers}/step/BackButton.js +0 -0
- /package/build/revamp/{renderers → wise/renderers}/step/StepRenderer.js +0 -0
- /package/build/revamp/{renderers → wise/renderers}/step/StepRendererContext.js +0 -0
- /package/build/revamp/{renderers → wise/renderers}/step/useExternal.js +0 -0
- /package/build/types/revamp/{renderers → wise/renderers}/step/ExternalConfirmationDialog.d.ts +0 -0
- /package/build/types/revamp/{renderers → wise/renderers}/step/useExternal.d.ts +0 -0
|
@@ -50,7 +50,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
|
50
50
|
import { DynamicFlowProvider, getEventDispatcher, EventsContextProvider, LogProvider, getLogger, } from '../common/contexts';
|
|
51
51
|
import { FeatureContextProvider } from '../common/contexts/featureContext/FeatureContext';
|
|
52
52
|
import { isObjectModel } from '../common/utils';
|
|
53
|
-
import { isValidSchema } from '../common/validators';
|
|
53
|
+
import { isObject, isValidSchema } from '../common/validators';
|
|
54
54
|
import { DynamicFlowStep } from './DynamicFlowStep';
|
|
55
55
|
import { ErrorBoundary, useLoader, useDynamicFlowState, useDebouncedRefresh, parseFetchResponse, getJsonObjectOrNull, parseErrorResponse, } from './utils';
|
|
56
56
|
import { HttpClientProvider } from '../../common/httpClientContext';
|
|
@@ -112,7 +112,7 @@ var DynamicFlowComponent = function (_a) {
|
|
|
112
112
|
case 3:
|
|
113
113
|
_a.sent();
|
|
114
114
|
return [2 /*return*/];
|
|
115
|
-
case 4: return [4 /*yield*/, handleResponse(response, 'submission')];
|
|
115
|
+
case 4: return [4 /*yield*/, handleResponse(response, 'submission', action.result)];
|
|
116
116
|
case 5:
|
|
117
117
|
_a.sent();
|
|
118
118
|
return [3 /*break*/, 7];
|
|
@@ -179,9 +179,9 @@ var DynamicFlowComponent = function (_a) {
|
|
|
179
179
|
if (initialStep) {
|
|
180
180
|
warnIfNoStepLayout(initialStep);
|
|
181
181
|
}
|
|
182
|
-
//
|
|
182
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
183
183
|
}, [httpClient, JSON.stringify(initialStep), JSON.stringify(initialAction)]);
|
|
184
|
-
var handleResponse = function (response, fetchType) { return __awaiter(void 0, void 0, void 0, function () {
|
|
184
|
+
var handleResponse = function (response, fetchType, actionResult) { return __awaiter(void 0, void 0, void 0, function () {
|
|
185
185
|
var errorResponse, result, error_3;
|
|
186
186
|
return __generator(this, function (_a) {
|
|
187
187
|
switch (_a.label) {
|
|
@@ -204,7 +204,7 @@ var DynamicFlowComponent = function (_a) {
|
|
|
204
204
|
void performAction(result.action, result.action.data);
|
|
205
205
|
}
|
|
206
206
|
else if (result.type === 'exit') {
|
|
207
|
-
dispatchEventAndComplete(result.result);
|
|
207
|
+
dispatchEventAndComplete(isObject(actionResult) ? __assign(__assign({}, result.result), actionResult) : result.result);
|
|
208
208
|
}
|
|
209
209
|
else {
|
|
210
210
|
updateStep(result.step, result.etag, fetchType);
|
|
@@ -81,7 +81,7 @@ describe('Actions', function () {
|
|
|
81
81
|
onError = jest.fn();
|
|
82
82
|
onCompletion = jest.fn();
|
|
83
83
|
httpClient = jest.fn(function () {
|
|
84
|
-
return Promise.resolve(new Response(JSON.stringify({ key: '
|
|
84
|
+
return Promise.resolve(new Response(JSON.stringify({ key: 'response body value', extra_key: 'value' }), {
|
|
85
85
|
status: 200,
|
|
86
86
|
}));
|
|
87
87
|
});
|
|
@@ -90,7 +90,7 @@ describe('Actions', function () {
|
|
|
90
90
|
layout: [
|
|
91
91
|
{
|
|
92
92
|
type: 'button',
|
|
93
|
-
action: { url: '/submit', exit: true, result: { key: '
|
|
93
|
+
action: { url: '/submit', exit: true, result: { key: 'action result value' } },
|
|
94
94
|
},
|
|
95
95
|
],
|
|
96
96
|
schemas: [],
|
|
@@ -106,7 +106,7 @@ describe('Actions', function () {
|
|
|
106
106
|
})];
|
|
107
107
|
case 3:
|
|
108
108
|
_c.sent();
|
|
109
|
-
expect(onCompletion).toHaveBeenCalledWith(expect.objectContaining({ key: '
|
|
109
|
+
expect(onCompletion).toHaveBeenCalledWith(expect.objectContaining({ key: 'action result value', extra_key: 'value' }));
|
|
110
110
|
expect(onError).not.toHaveBeenCalled();
|
|
111
111
|
return [2 /*return*/];
|
|
112
112
|
}
|
|
@@ -182,4 +182,51 @@ describe('Actions', function () {
|
|
|
182
182
|
}); });
|
|
183
183
|
});
|
|
184
184
|
});
|
|
185
|
+
describe('given an non-exit action', function () {
|
|
186
|
+
describe('when the response contains "X-DF-ResponseType: exit" header', function () {
|
|
187
|
+
it('should exit the flow with a merged object of the response body and result when the action has a result', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
188
|
+
var onError, onCompletion, httpClient, step, _a, _b;
|
|
189
|
+
return __generator(this, function (_c) {
|
|
190
|
+
switch (_c.label) {
|
|
191
|
+
case 0:
|
|
192
|
+
onError = jest.fn();
|
|
193
|
+
onCompletion = jest.fn();
|
|
194
|
+
httpClient = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
195
|
+
return __generator(this, function (_a) {
|
|
196
|
+
return [2 /*return*/, Promise.resolve(new Response(JSON.stringify({ key: 'response body value', extra_key: 'value' }), {
|
|
197
|
+
status: 200,
|
|
198
|
+
headers: { 'X-DF-Response-Type': 'exit' },
|
|
199
|
+
}))];
|
|
200
|
+
});
|
|
201
|
+
}); });
|
|
202
|
+
step = {
|
|
203
|
+
id: 'step-id',
|
|
204
|
+
title: 'Step Title',
|
|
205
|
+
layout: [
|
|
206
|
+
{
|
|
207
|
+
type: 'button',
|
|
208
|
+
action: { url: '/submit', result: { key: 'action result value' } },
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
schemas: [],
|
|
212
|
+
};
|
|
213
|
+
renderWithProviders(_jsx(DynamicFlow, { flowId: "the-flow-id", initialStep: step, httpClient: httpClient, onCompletion: onCompletion, onError: onError }));
|
|
214
|
+
_b = (_a = userEvent).click;
|
|
215
|
+
return [4 /*yield*/, screen.findByRole('button')];
|
|
216
|
+
case 1: return [4 /*yield*/, _b.apply(_a, [_c.sent()])];
|
|
217
|
+
case 2:
|
|
218
|
+
_c.sent();
|
|
219
|
+
return [4 /*yield*/, waitFor(function () {
|
|
220
|
+
expect(onCompletion).toHaveBeenCalledTimes(1);
|
|
221
|
+
})];
|
|
222
|
+
case 3:
|
|
223
|
+
_c.sent();
|
|
224
|
+
expect(onCompletion).toHaveBeenCalledWith(expect.objectContaining({ key: 'action result value', extra_key: 'value' }));
|
|
225
|
+
expect(onError).not.toHaveBeenCalled();
|
|
226
|
+
return [2 /*return*/];
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}); });
|
|
230
|
+
});
|
|
231
|
+
});
|
|
185
232
|
});
|
|
@@ -111,10 +111,12 @@ var FormControl = /** @class */ (function (_super) {
|
|
|
111
111
|
var query = _a.query;
|
|
112
112
|
onSearchChange(query);
|
|
113
113
|
}
|
|
114
|
-
: undefined, onClear:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
: undefined, onClear: required
|
|
115
|
+
? undefined
|
|
116
|
+
: function () {
|
|
117
|
+
_this.setState({ selectedOption: null });
|
|
118
|
+
_this.props.onChange(null);
|
|
119
|
+
} }) }));
|
|
118
120
|
}
|
|
119
121
|
case FormControlType.TAB:
|
|
120
122
|
return (_jsx(Tabs, { selected: (((_b = this.getSelectedOption(options)) === null || _b === void 0 ? void 0 : _b.value) || 0), tabs: options.map(function (option) { return ({
|
|
@@ -495,35 +495,6 @@ describe('E2E: Given a component for rendering a JSON schema form', function ()
|
|
|
495
495
|
}
|
|
496
496
|
});
|
|
497
497
|
}); });
|
|
498
|
-
it('...and if the oneOf is unselected, the validation message is back', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
499
|
-
return __generator(this, function (_a) {
|
|
500
|
-
switch (_a.label) {
|
|
501
|
-
case 0:
|
|
502
|
-
renderComponent({ schema: schema, initialModel: {}, submitted: true });
|
|
503
|
-
expect(screen.getByText(/please, choose/i)).toBeInTheDocument();
|
|
504
|
-
expect(screen.getByText('Custom required validation error')).toBeInTheDocument();
|
|
505
|
-
expect(screen.queryByText('Please fill out this field.')).not.toBeInTheDocument();
|
|
506
|
-
fireEvent.click(screen.getByText(/please, choose an option/i));
|
|
507
|
-
fireEvent.click(screen.getByText(/iban tab/i));
|
|
508
|
-
return [4 /*yield*/, waitFor(function () {
|
|
509
|
-
expect(screen.queryByText(/please, choose an option/i)).not.toBeInTheDocument();
|
|
510
|
-
})];
|
|
511
|
-
case 1:
|
|
512
|
-
_a.sent();
|
|
513
|
-
expect(screen.queryByText('Custom required validation error')).not.toBeInTheDocument();
|
|
514
|
-
expect(screen.getAllByText('Please fill out this field.')).toHaveLength(2);
|
|
515
|
-
fireEvent.click(screen.getByLabelText(/clear/i));
|
|
516
|
-
expect(screen.getByText(/please, choose an option/i)).toBeInTheDocument();
|
|
517
|
-
fireEvent.click(screen.getByText(/please, choose an option/i));
|
|
518
|
-
return [4 /*yield*/, waitFor(function () {
|
|
519
|
-
expect(screen.getByText('Custom required validation error')).toBeInTheDocument();
|
|
520
|
-
})];
|
|
521
|
-
case 2:
|
|
522
|
-
_a.sent();
|
|
523
|
-
return [2 /*return*/];
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
}); });
|
|
527
498
|
});
|
|
528
499
|
});
|
|
529
500
|
});
|
|
@@ -111,7 +111,7 @@ function OneOfSchema(props) {
|
|
|
111
111
|
((props.submitted || (changed && blurred)) && validations.length),
|
|
112
112
|
};
|
|
113
113
|
var feedbackId = "".concat(id, "-feedback");
|
|
114
|
-
return (_jsxs(_Fragment, { children: [(props.schema.oneOf.length > 1 || isConstSchema(props.schema.oneOf[0])) && (_jsxs(_Fragment, { children: [props.schema.alert && _jsx(DynamicAlert, { component: props.schema.alert }), _jsxs("div", { className: classNames(formGroupClasses), children: [getTitleAndHelp(props.schema, id), _jsx(SchemaFormControl, { id: id, schema: schemaForSelect, value: schemaIndex, disabled: props.disabled, describedBy: feedbackId, onChange: onChooseNewSchema, onFocus: onFocus, onBlur: onBlur, onSearchChange: onSearchChange }), _jsx(ControlFeedback, { id: feedbackId, changed: changed, focused: focused, blurred: blurred, submitted: props.submitted, errors: errorsToString(props.errors), schema: props.schema, validations: validations, infoMessage: null })] })] })), isNoNConstSchema(props.schema.oneOf[schemaIndex]) && (_jsx(GenericSchema, { schema: props.schema.oneOf[schemaIndex], model: models[schemaIndex], errors: props.errors, submitted: props.submitted, hideTitle: true, disabled: props.disabled, onChange: function (parameters) { return onChildModelChange(schemaIndex, parameters); }, onPersistAsync: props.onPersistAsync }))] }));
|
|
114
|
+
return (_jsxs(_Fragment, { children: [(props.schema.oneOf.length > 1 || isConstSchema(props.schema.oneOf[0])) && (_jsxs(_Fragment, { children: [props.schema.alert && _jsx(DynamicAlert, { component: props.schema.alert }), _jsxs("div", { className: classNames(formGroupClasses), children: [getTitleAndHelp(props.schema, id), _jsx(SchemaFormControl, { id: id, schema: schemaForSelect, value: schemaIndex, disabled: props.disabled, describedBy: feedbackId, required: props.required, onChange: onChooseNewSchema, onFocus: onFocus, onBlur: onBlur, onSearchChange: onSearchChange }), _jsx(ControlFeedback, { id: feedbackId, changed: changed, focused: focused, blurred: blurred, submitted: props.submitted, errors: errorsToString(props.errors), schema: props.schema, validations: validations, infoMessage: null })] })] })), isNoNConstSchema(props.schema.oneOf[schemaIndex]) && (_jsx(GenericSchema, { schema: props.schema.oneOf[schemaIndex], model: models[schemaIndex], errors: props.errors, submitted: props.submitted, hideTitle: true, disabled: props.disabled, onChange: function (parameters) { return onChildModelChange(schemaIndex, parameters); }, onPersistAsync: props.onPersistAsync }))] }));
|
|
115
115
|
}
|
|
116
116
|
function getTitleAndHelp(schema, forId) {
|
|
117
117
|
var _a;
|
|
@@ -25,7 +25,10 @@ export var getControlType = function (schema) {
|
|
|
25
25
|
if (schema.control === FormControlType.TAB && schema.oneOf.length > 3) {
|
|
26
26
|
return FormControlType.SELECT;
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
if (schema.control == null || !Object.values(FormControlType).includes(schema.control)) {
|
|
29
|
+
return FormControlType.SELECT;
|
|
30
|
+
}
|
|
31
|
+
return schema.control;
|
|
29
32
|
}
|
|
30
33
|
if (isStringSchema(schema)) {
|
|
31
34
|
return getStringSchemaControlType(schema);
|
|
@@ -75,7 +78,7 @@ var getOptions = function (schema, controlType) {
|
|
|
75
78
|
return null;
|
|
76
79
|
};
|
|
77
80
|
function SchemaFormControl(props) {
|
|
78
|
-
var id = props.id, schema = props.schema, value = props.value, disabled = props.disabled, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, onSearchChange = props.onSearchChange, describedBy = props.describedBy;
|
|
81
|
+
var id = props.id, schema = props.schema, value = props.value, disabled = props.disabled, required = props.required, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, onSearchChange = props.onSearchChange, describedBy = props.describedBy;
|
|
79
82
|
var log = useLogger();
|
|
80
83
|
var getSanitisedValue = function (value) {
|
|
81
84
|
return isNativeInput(schema.type) && (isNull(value) || isUndefined(value)) ? '' : value;
|
|
@@ -110,6 +113,7 @@ function SchemaFormControl(props) {
|
|
|
110
113
|
// TODO: LOW avoid type assertion below
|
|
111
114
|
uploadProps: mapSchemaToUploadOptions(schema),
|
|
112
115
|
describedBy: describedBy,
|
|
116
|
+
required: required,
|
|
113
117
|
};
|
|
114
118
|
return (_jsx("div", { "aria-describedby": describedBy, children: _jsx(FormControl, __assign({ type: controlType, value: safeValue }, events, controlProps)) }));
|
|
115
119
|
}
|