@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.
Files changed (41) hide show
  1. package/build/legacy/dynamicFlow/DynamicFlow.js +5 -5
  2. package/build/legacy/dynamicFlow/tests/Actions.spec.js +50 -3
  3. package/build/legacy/formControl/FormControl.js +6 -4
  4. package/build/legacy/jsonSchemaForm/JsonSchemaForm.end-to-end.spec.js +0 -29
  5. package/build/legacy/jsonSchemaForm/oneOfSchema/OneOfSchema.js +1 -1
  6. package/build/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.js +6 -2
  7. package/build/main.js +1241 -1183
  8. package/build/main.min.js +1 -1
  9. package/build/main.mjs +943 -885
  10. package/build/revamp/DynamicFlowCore.js +2 -3
  11. package/build/revamp/DynamicFragmentWise.js +1 -1
  12. package/build/revamp/flow/executeSubmission.js +2 -2
  13. package/build/revamp/tests/RefreshOnChange.with.Segmented.spec.js +447 -0
  14. package/build/revamp/tests/RefreshOnChange.with.Tabs.spec.js +57 -0
  15. package/build/revamp/tests/SegmentedControl.spec.js +48 -0
  16. package/build/revamp/tests/legacy/Actions.spec.js +242 -0
  17. package/build/revamp/wise/renderers/ButtonRenderer.js +1 -1
  18. package/build/revamp/wise/renderers/DecisionRenderer.js +1 -1
  19. package/build/revamp/wise/renderers/SearchRenderer/BlockSearchRendererComponent.js +1 -1
  20. package/build/revamp/wise/renderers/SearchRenderer/InlineSearchRendererComponent.js +1 -1
  21. package/build/revamp/wise/renderers/SelectInputRenderer/SegmentedInputRendererComponent.js +21 -0
  22. package/build/revamp/wise/renderers/SelectInputRenderer/SelectInputRenderer.js +3 -0
  23. package/build/revamp/wise/renderers/SelectInputRenderer/SelectInputRendererComponent.js +2 -2
  24. package/build/revamp/wise/renderers/getWiseRenderers.js +2 -0
  25. package/build/revamp/{renderers → wise/renderers}/step/ExternalConfirmationDialog.js +1 -1
  26. package/build/types/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.d.ts +1 -0
  27. package/build/types/legacy/layout/utils/index.d.ts +1 -1
  28. package/build/types/revamp/wise/renderers/SelectInputRenderer/SegmentedInputRendererComponent.d.ts +2 -0
  29. package/build/types/revamp/wise/renderers/getWiseRenderers.d.ts +1 -1
  30. package/build/types/revamp/{renderers → wise/renderers}/step/BackButton.d.ts +1 -1
  31. package/build/types/revamp/wise/renderers/step/StepRenderer.d.ts +2 -0
  32. package/build/types/revamp/{renderers → wise/renderers}/step/StepRendererContext.d.ts +2 -2
  33. package/build/types/revamp/wise/renderers/utils/layout-utils.d.ts +1 -1
  34. package/package.json +3 -3
  35. package/build/types/revamp/renderers/step/StepRenderer.d.ts +0 -2
  36. /package/build/revamp/{renderers → wise/renderers}/step/BackButton.js +0 -0
  37. /package/build/revamp/{renderers → wise/renderers}/step/StepRenderer.js +0 -0
  38. /package/build/revamp/{renderers → wise/renderers}/step/StepRendererContext.js +0 -0
  39. /package/build/revamp/{renderers → wise/renderers}/step/useExternal.js +0 -0
  40. /package/build/types/revamp/{renderers → wise/renderers}/step/ExternalConfirmationDialog.d.ts +0 -0
  41. /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
- // // eslint-disable-next-line react-hooks/exhaustive-deps
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: 'new value', extra_key: 'value' }), {
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: 'old value' } },
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: 'old value', extra_key: 'value' }));
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: function () {
115
- _this.setState({ selectedOption: null });
116
- _this.props.onChange(null);
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
- return schema.control || FormControlType.SELECT;
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
  }