@kineticdata/react 5.1.0-rc.1 → 5.1.1

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 (75) hide show
  1. package/lib/apis/core/attributeDefinitions.js +11 -9
  2. package/lib/apis/core/attributeDefinitions.test.js +1 -1
  3. package/lib/apis/core/authentication.js +13 -5
  4. package/lib/apis/core/backgroundJobs.js +2 -1
  5. package/lib/apis/core/bridgeModelAttributeMappings.js +1 -1
  6. package/lib/apis/core/bridgeModelAttributes.js +15 -12
  7. package/lib/apis/core/bridgeModelMappings.js +1 -1
  8. package/lib/apis/core/bridgeModelQualificationMappings.js +2 -2
  9. package/lib/apis/core/bridgeModelQualifications.js +2 -2
  10. package/lib/apis/core/bridgeModels.js +14 -8
  11. package/lib/apis/core/bridgedresources.js +3 -2
  12. package/lib/apis/core/fileResources.js +36 -0
  13. package/lib/apis/core/filestores.js +40 -0
  14. package/lib/apis/core/formTypes.js +18 -21
  15. package/lib/apis/core/oauthClients.js +11 -5
  16. package/lib/apis/core/securityPolicyDefinitions.js +1 -1
  17. package/lib/apis/core/securityPolicyDefinitions.test.js +4 -4
  18. package/lib/apis/core/submissions.js +68 -0
  19. package/lib/apis/core/webhooks.js +1 -1
  20. package/lib/apis/core/webhooks.test.js +2 -2
  21. package/lib/apis/http.js +17 -3
  22. package/lib/apis/index.js +2 -0
  23. package/lib/apis/system/index.js +86 -1
  24. package/lib/apis/task/index.js +20 -13
  25. package/lib/components/agent/filestore/FilestoreForm.js +132 -0
  26. package/lib/components/agent/filestore/FilestoreTable.js +53 -0
  27. package/lib/components/common/BridgeSelect.js +2 -1
  28. package/lib/components/common/FormSelect.js +2 -1
  29. package/lib/components/common/Scroller.js +6 -6
  30. package/lib/components/common/TableInput.js +74 -29
  31. package/lib/components/common/TeamSelect.js +2 -1
  32. package/lib/components/common/Typeahead.js +7 -4
  33. package/lib/components/common/UserSelect.js +2 -1
  34. package/lib/components/common/authentication/AuthenticationContainer.js +50 -27
  35. package/lib/components/core/core_form/CoreForm.js +10 -10
  36. package/lib/components/core/file_resource/FileResourceForm.js +180 -0
  37. package/lib/components/core/file_resource/FileResourceTable.js +71 -0
  38. package/lib/components/core/i18n/I18n.js +14 -14
  39. package/lib/components/core/security_definition/SecurityDefinitionForm.js +1 -1
  40. package/lib/components/core/space/SpaceForm.js +37 -8
  41. package/lib/components/core/submission/FormSubmissionFilters.js +3 -11
  42. package/lib/components/core/submission/FormSubmissionTable.js +4 -2
  43. package/lib/components/core/submission/SubmissionForm.js +124 -0
  44. package/lib/components/core/submission/helpers.js +2 -2
  45. package/lib/components/core/user/UserForm.js +2 -2
  46. package/lib/components/core/webapi/WebApiForm.js +111 -126
  47. package/lib/components/form/Form.helpers.js +1 -1
  48. package/lib/components/form/Form.js +200 -144
  49. package/lib/components/index.js +14 -6
  50. package/lib/components/system/SystemBackgroundTasksTable.js +83 -0
  51. package/lib/components/system/SystemSecurityForm.js +69 -0
  52. package/lib/components/system/helpers.js +2 -2
  53. package/lib/components/system/spaces/SystemSpaceForm.js +44 -16
  54. package/lib/components/system/spaces/SystemTenantForm.js +15 -9
  55. package/lib/components/system/spaces/SystemTenantTable.js +15 -10
  56. package/lib/components/table/Table.js +9 -6
  57. package/lib/components/task/builder/Connector.js +21 -10
  58. package/lib/components/task/builder/ConnectorForm.js +1 -1
  59. package/lib/components/task/builder/Node.js +10 -3
  60. package/lib/components/task/builder/NodeForm.js +51 -22
  61. package/lib/components/task/builder/NodeParametersForm.js +5 -2
  62. package/lib/components/task/builder/SvgCanvas.js +13 -4
  63. package/lib/components/task/builder/TaskDefinitionConfigForm.js +113 -0
  64. package/lib/components/task/builder/TreeBuilder.js +27 -9
  65. package/lib/components/task/builder/builder.redux.js +159 -52
  66. package/lib/components/task/builder/helpers.js +5 -3
  67. package/lib/components/task/builder/models.js +84 -12
  68. package/lib/components/task/errors/RunErrorTable.js +1 -1
  69. package/lib/components/task/runs/CreateManualTriggerForm.js +15 -24
  70. package/lib/components/task/runs/RunTable.js +5 -3
  71. package/lib/components/task/workflows/WorkflowForm.js +67 -85
  72. package/lib/helpers/index.js +4 -1
  73. package/lib/index.js +1 -0
  74. package/package.json +2 -2
  75. package/proxyhelper.js +19 -6
@@ -2,6 +2,7 @@ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
2
  import { generateForm } from '../../form/Form';
3
3
  import { buildBindings, normalizeParameter } from './helpers';
4
4
  import { NodeParameter } from './models';
5
+ import { checkOmittedParameters } from './TaskDefinitionConfigForm';
5
6
 
6
7
  var getOptions = function getOptions(menu) {
7
8
  return menu.split(',').filter(function (value) {
@@ -54,7 +55,8 @@ var fields = function fields(_ref2) {
54
55
  initialValue: parameter.value,
55
56
  options: parameter.menu ? getOptions(parameter.menu) : bindings,
56
57
  "transient": true,
57
- enabled: false
58
+ enabled: false,
59
+ visible: checkOmittedParameters(node, parameter)
58
60
  };
59
61
  })), _toConsumableArray(parameters.map(function (parameter) {
60
62
  var matchingParameter = node.parameters.find(function (oldParameter) {
@@ -68,7 +70,8 @@ var fields = function fields(_ref2) {
68
70
  helpText: parameter.description,
69
71
  initialValue: matchingParameter ? matchingParameter.value : parameter.defaultValue,
70
72
  options: parameter.menu ? getOptions(parameter.menu) : bindings,
71
- "transient": true
73
+ "transient": true,
74
+ visible: checkOmittedParameters(node, parameter)
72
75
  };
73
76
  })), [{
74
77
  name: 'parameters',
@@ -245,11 +245,20 @@ export var SvgCanvas = /*#__PURE__*/function (_Component) {
245
245
  x = _this$viewport.x,
246
246
  y = _this$viewport.y;
247
247
 
248
- if (!isIE11) {
249
- var transition = duration ? "transition: transform ".concat(duration, "ms ").concat(ease) : '';
250
- this.transformer.current.setAttribute('style', "transform: translate(".concat(x, "px, ").concat(y, "px) scale(").concat(scale, ");").concat(transition));
248
+ if (isIE11) {
249
+ // this.transformer.current.setAttribute(
250
+ // 'transform',
251
+ // `translate(${x} ${y}) scale(${scale})`,
252
+ // );
253
+ this.transformer.current.transform = "translate(".concat(x, " ").concat(y, ") scale(").concat(scale, ")");
251
254
  } else {
252
- this.transformer.current.setAttribute('transform', "translate(".concat(x, " ").concat(y, ") scale(").concat(scale, ")"));
255
+ var transition = duration ? "transform ".concat(duration, "ms ").concat(ease) : ''; // this.transformer.current.setAttribute(
256
+ // 'style',
257
+ // `transform: translate(${x}px, ${y}px) scale(${scale});${transition}`,
258
+ // );
259
+
260
+ this.transformer.current.style.transform = "translate(".concat(x, "px, ").concat(y, "px) scale(").concat(scale, ")");
261
+ this.transformer.current.style.transition = transition;
253
262
  }
254
263
 
255
264
  if (this.viewport.scale < 0.26 && this.transformer.current.className.baseVal !== 'min-detail') {
@@ -0,0 +1,113 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
+ import { List, Map } from 'immutable';
4
+ import { generateForm } from '../../form/Form';
5
+ import { fetchForm, fetchKapps } from '../../../apis';
6
+ export var checkOmittedParameters = function checkOmittedParameters(node, parameter) {
7
+ if (node.definitionId === 'system_submission_create_v1') {
8
+ return !['kappSlug', 'formSlug'].includes(parameter.id);
9
+ } else {
10
+ return true;
11
+ }
12
+ };
13
+ export var generateTaskDefinition = function generateTaskDefinition(taskDefinition) {
14
+ if (taskDefinition.definitionName === 'system_submission_create') {
15
+ return function (_ref) {
16
+ var form = _ref.form;
17
+ return _objectSpread(_objectSpread({}, taskDefinition), {}, {
18
+ parameters: [].concat(_toConsumableArray(taskDefinition.parameters.map(function (parameter) {
19
+ return parameter.id === 'kappSlug' ? _objectSpread(_objectSpread({}, parameter), {}, {
20
+ defaultValue: form.kapp.slug
21
+ }) : parameter.id === 'formSlug' ? _objectSpread(_objectSpread({}, parameter), {}, {
22
+ defaultValue: form.slug
23
+ }) : parameter;
24
+ })), _toConsumableArray(form.fields.map(function (field) {
25
+ return {
26
+ name: field.name,
27
+ defaultValue: '',
28
+ dependsOnId: null,
29
+ dependsOnValue: null,
30
+ description: '',
31
+ id: "values.".concat(field.name),
32
+ required: false
33
+ };
34
+ })))
35
+ });
36
+ };
37
+ } else {
38
+ return null;
39
+ }
40
+ };
41
+
42
+ var dataSources = function dataSources() {
43
+ return {
44
+ kapps: {
45
+ fn: fetchKapps,
46
+ params: [],
47
+ transform: function transform(data) {
48
+ return data.kapps;
49
+ }
50
+ }
51
+ };
52
+ };
53
+
54
+ var fields = function fields() {
55
+ return function () {
56
+ return [{
57
+ name: 'kappSlug',
58
+ label: 'Kapp',
59
+ type: 'select',
60
+ required: true,
61
+ options: function options(_ref2) {
62
+ var kapps = _ref2.kapps;
63
+ return kapps ? kapps.map(function (kapp) {
64
+ return Map({
65
+ value: kapp.get('slug'),
66
+ label: kapp.get('name')
67
+ });
68
+ }) : List();
69
+ },
70
+ onChange: function onChange(_ref3, actions) {
71
+ var values = _ref3.values;
72
+
73
+ if (!!values.get('form')) {
74
+ actions.setValue('form', null);
75
+ }
76
+ }
77
+ }, {
78
+ name: 'form',
79
+ label: 'Form',
80
+ type: 'form',
81
+ required: true,
82
+ enabled: function enabled(_ref4) {
83
+ var values = _ref4.values;
84
+ return values.get('kappSlug') !== '';
85
+ },
86
+ search: function search(_ref5) {
87
+ var values = _ref5.values;
88
+ return values.get('kappSlug') !== '' ? {
89
+ kappSlug: values.get('kappSlug')
90
+ } : {};
91
+ }
92
+ }];
93
+ };
94
+ };
95
+
96
+ var handleSubmit = function handleSubmit(_ref6) {
97
+ var taskDefinition = _ref6.taskDefinition;
98
+ return function (values) {
99
+ return fetchForm({
100
+ kappSlug: values.get('kappSlug'),
101
+ formSlug: values.getIn(['form', 'slug'], ''),
102
+ include: 'fields,kapp'
103
+ }).then(generateTaskDefinition(taskDefinition));
104
+ };
105
+ };
106
+
107
+ export var TaskDefinitionConfigForm = generateForm({
108
+ formOptions: ['taskDefinition'],
109
+ dataSources: dataSources,
110
+ fields: fields,
111
+ handleSubmit: handleSubmit
112
+ });
113
+ TaskDefinitionConfigForm.displayName = 'TaskDefinitionConfigForm';
@@ -155,7 +155,7 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
155
155
  };
156
156
 
157
157
  _this.isDirty = function (treeBuilderState) {
158
- return treeBuilderState && !is(treeBuilderState.lastSave, treeBuilderState.tree);
158
+ return treeBuilderState && (!is(treeBuilderState.lastSave, treeBuilderState.tree) || !is(treeBuilderState.lastWebApi, treeBuilderState.webApi));
159
159
  };
160
160
 
161
161
  _this.state = {
@@ -202,7 +202,7 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
202
202
  // placeholder then we will call configureTreeBuilder with the component's
203
203
  // props at that time
204
204
  if (this.props.treeBuilderState === null) {
205
- configureTreeBuilder(pick(this.props, ['treeKey', 'sourceName', 'sourceGroup', 'name']));
205
+ configureTreeBuilder(pick(this.props, ['treeKey', 'sourceName', 'sourceGroup', 'name', 'platformSourceName']));
206
206
  }
207
207
  }
208
208
  }, {
@@ -218,8 +218,8 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
218
218
  } // otherwise check for changes to the highlight prop and focus if it changes
219
219
  // and its a truthy value
220
220
  else if (this.props.highlight && !this.props.highlight.equals(prevProps.highlight)) {
221
- this.panTo(this.props.highlight);
222
- }
221
+ this.panTo(this.props.highlight);
222
+ }
223
223
  }
224
224
  }
225
225
  }, {
@@ -239,11 +239,14 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
239
239
  highlightId = _ref4[1];
240
240
 
241
241
  if (treeBuilderState) {
242
- var redoStack = treeBuilderState.redoStack,
242
+ var lastSave = treeBuilderState.lastSave,
243
+ lastWebApi = treeBuilderState.lastWebApi,
244
+ redoStack = treeBuilderState.redoStack,
243
245
  saving = treeBuilderState.saving,
244
246
  tasks = treeBuilderState.tasks,
245
247
  tree = treeBuilderState.tree,
246
- undoStack = treeBuilderState.undoStack;
248
+ undoStack = treeBuilderState.undoStack,
249
+ webApi = treeBuilderState.webApi;
247
250
  return this.props.children({
248
251
  actions: {
249
252
  deleteConnector: function deleteConnector(id) {
@@ -270,6 +273,18 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
270
273
  dependencies: dependencies
271
274
  }));
272
275
  },
276
+ updateSettings: function updateSettings(values) {
277
+ return dispatch('TREE_UPDATE_SETTINGS', {
278
+ treeKey: treeKey,
279
+ values: values
280
+ });
281
+ },
282
+ updateWebApi: function updateWebApi(values) {
283
+ return dispatch('TREE_UPDATE_WEB_API', {
284
+ treeKey: treeKey,
285
+ values: values
286
+ });
287
+ },
273
288
  save: function save(_ref5) {
274
289
  var _ref5$overwrite = _ref5.overwrite,
275
290
  overwrite = _ref5$overwrite === void 0 ? false : _ref5$overwrite,
@@ -305,12 +320,14 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
305
320
  }
306
321
  },
307
322
  dirty: this.isDirty(treeBuilderState),
308
- name: tree.name,
323
+ lastTree: lastSave,
324
+ lastWebApi: lastWebApi,
325
+ name: tree ? tree.name : null,
309
326
  saving: saving,
310
327
  sidebarRef: this.sidebarRef,
311
328
  tasks: tasks,
312
329
  tree: tree,
313
- treeBuilder: /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(SvgCanvas, {
330
+ treeBuilder: tree && /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(SvgCanvas, {
314
331
  ref: this.canvasRef
315
332
  }, tree.connectors.map(function (connector) {
316
333
  return /*#__PURE__*/React.createElement(Connector, {
@@ -350,7 +367,8 @@ export var TreeBuilderComponent = /*#__PURE__*/function (_Component) {
350
367
  tasks: tasks,
351
368
  tree: tree
352
369
  });
353
- }).toList()))
370
+ }).toList())),
371
+ webApi: webApi
354
372
  });
355
373
  }
356
374
 
@@ -1,13 +1,13 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
2
  import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
4
4
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
5
5
  import { all, call, put, select, takeEvery } from 'redux-saga/effects';
6
6
  import { List, OrderedMap } from 'immutable';
7
7
  import { isFunction } from 'lodash-es';
8
8
  import { action, dispatch, regHandlers, regSaga } from '../../../store';
9
- import { deserializeTree, serializeTree, Connector, TreeBuilderState } from './models';
10
- import { cloneTree, fetchTaskCategories, fetchTree, updateTree } from '../../../apis/task';
9
+ import { deserializeTree, serializeTree, Connector, TreeBuilderState, deserializeWebApi } from './models';
10
+ import { cloneTree, fetchTaskCategories, fetchTree, fetchWebApi, updateTree, updateWebApi } from '../../../apis';
11
11
  import { renameDependencies, treeReturnTask } from './helpers';
12
12
  export var mountTreeBuilder = function mountTreeBuilder(treeKey) {
13
13
  return dispatch('TREE_MOUNT', {
@@ -26,12 +26,15 @@ export var configureTreeBuilder = function configureTreeBuilder(props) {
26
26
 
27
27
  var remember = function remember(state, treeKey) {
28
28
  return state.updateIn(['trees', treeKey, 'undoStack'], function (stack) {
29
- return stack.push(state.getIn(['trees', treeKey, 'tree']));
29
+ return stack.push({
30
+ tree: state.getIn(['trees', treeKey, 'tree']),
31
+ webApi: state.getIn(['trees', treeKey, 'webApi'])
32
+ });
30
33
  }).deleteIn(['trees', treeKey, 'redoStack']);
31
34
  };
32
35
 
33
36
  regSaga(takeEvery('TREE_CONFIGURE', /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
34
- var payload, name, sourceGroup, sourceName, treeKey, _yield$all, _yield$all2, tree, categories;
37
+ var payload, name, sourceGroup, sourceName, treeKey, webApiProps, _yield$all, _yield$all2, tree, categories, webApi;
35
38
 
36
39
  return _regeneratorRuntime.wrap(function _callee$(_context) {
37
40
  while (1) {
@@ -40,46 +43,52 @@ regSaga(takeEvery('TREE_CONFIGURE', /*#__PURE__*/_regeneratorRuntime.mark(functi
40
43
  payload = _ref.payload;
41
44
  _context.prev = 1;
42
45
  name = payload.name, sourceGroup = payload.sourceGroup, sourceName = payload.sourceName, treeKey = payload.treeKey;
43
- _context.next = 5;
46
+ webApiProps = getWebApiProps(payload);
47
+ _context.next = 6;
44
48
  return all([call(fetchTree, {
45
49
  name: name,
46
50
  sourceGroup: sourceGroup,
47
51
  sourceName: sourceName,
48
- include: 'bindings,details,treeJson'
52
+ include: 'bindings,categories,details,treeJson,inputs,outputs'
49
53
  }), call(fetchTaskCategories, {
50
54
  include: 'handlers.results,handlers.parameters,trees.parameters,trees.inputs,trees.outputs'
51
- })]);
55
+ }), webApiProps ? call(fetchWebApi, _objectSpread(_objectSpread({}, webApiProps), {}, {
56
+ include: 'details,securityPolicies'
57
+ })) : {}]);
52
58
 
53
- case 5:
59
+ case 6:
54
60
  _yield$all = _context.sent;
55
- _yield$all2 = _slicedToArray(_yield$all, 2);
61
+ _yield$all2 = _slicedToArray(_yield$all, 3);
56
62
  tree = _yield$all2[0].tree;
57
63
  categories = _yield$all2[1].categories;
58
- _context.next = 11;
64
+ webApi = _yield$all2[2].webApi;
65
+ _context.next = 13;
59
66
  return put(action('TREE_LOADED', {
60
67
  categories: categories,
68
+ kappSlug: webApiProps && webApiProps.kappSlug,
61
69
  treeKey: treeKey,
62
- tree: deserializeTree(tree)
70
+ tree: deserializeTree(tree),
71
+ webApi: webApiProps && deserializeWebApi(webApi, webApiProps.kappSlug)
63
72
  }));
64
73
 
65
- case 11:
66
- _context.next = 16;
74
+ case 13:
75
+ _context.next = 18;
67
76
  break;
68
77
 
69
- case 13:
70
- _context.prev = 13;
78
+ case 15:
79
+ _context.prev = 15;
71
80
  _context.t0 = _context["catch"](1);
72
81
  console.error('Caught error loading tree', _context.t0);
73
82
 
74
- case 16:
83
+ case 18:
75
84
  case "end":
76
85
  return _context.stop();
77
86
  }
78
87
  }
79
- }, _callee, null, [[1, 13]]);
88
+ }, _callee, null, [[1, 15]]);
80
89
  })));
81
90
  regSaga(takeEvery('TREE_SAVE', /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref2) {
82
- var payload, newName, onError, onSave, overwrite, treeKey, _yield$select, tree, name, sourceGroup, sourceName, _yield, error, newTree;
91
+ var payload, newName, onError, onSave, overwrite, treeKey, _yield$select, kappSlug, lastSave, lastWebApi, tree, webApi, name, sourceGroup, sourceName, _yield, error1, newTree, _yield2, error2, error;
83
92
 
84
93
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
85
94
  while (1) {
@@ -97,11 +106,15 @@ regSaga(takeEvery('TREE_SAVE', /*#__PURE__*/_regeneratorRuntime.mark(function _c
97
106
 
98
107
  case 5:
99
108
  _yield$select = _context2.sent;
109
+ kappSlug = _yield$select.kappSlug;
110
+ lastSave = _yield$select.lastSave;
111
+ lastWebApi = _yield$select.lastWebApi;
100
112
  tree = _yield$select.tree;
101
- name = tree.name, sourceGroup = tree.sourceGroup, sourceName = tree.sourceName; // if a newName was passed we will be creating a new tree with the builder
113
+ webApi = _yield$select.webApi;
114
+ name = lastSave.name, sourceGroup = lastSave.sourceGroup, sourceName = lastSave.sourceName; // if a newName was passed we will be creating a new tree with the builder
102
115
  // contents, otherwise just an update
103
116
 
104
- _context2.next = 10;
117
+ _context2.next = 14;
105
118
  return newName ? call(cloneTree, {
106
119
  name: name,
107
120
  sourceGroup: sourceGroup,
@@ -116,36 +129,50 @@ regSaga(takeEvery('TREE_SAVE', /*#__PURE__*/_regeneratorRuntime.mark(function _c
116
129
  tree: serializeTree(tree, overwrite)
117
130
  });
118
131
 
119
- case 10:
132
+ case 14:
120
133
  _yield = _context2.sent;
121
- error = _yield.error;
134
+ error1 = _yield.error;
122
135
  newTree = _yield.tree;
123
- _context2.next = 15;
136
+ _context2.next = 19;
137
+ return webApi && !error1 ? call(updateWebApi, {
138
+ slug: lastWebApi.get('slug'),
139
+ kappSlug: kappSlug,
140
+ webApi: webApi
141
+ }) : {};
142
+
143
+ case 19:
144
+ _yield2 = _context2.sent;
145
+ error2 = _yield2.error;
146
+ error = error1 || error2; // dispatch the appropriate action based on the result of the call above
147
+
148
+ _context2.next = 24;
124
149
  return put(error ? action('TREE_SAVE_ERROR', {
125
150
  treeKey: treeKey,
126
151
  error: error.message || error,
127
152
  onError: onError
128
153
  }) : action('TREE_SAVE_SUCCESS', {
154
+ previousTree: lastSave,
129
155
  treeKey: treeKey,
130
156
  tree: newTree,
157
+ webApi: webApi,
131
158
  onSave: onSave
132
159
  }));
133
160
 
134
- case 15:
135
- _context2.next = 20;
161
+ case 24:
162
+ _context2.next = 29;
136
163
  break;
137
164
 
138
- case 17:
139
- _context2.prev = 17;
165
+ case 26:
166
+ _context2.prev = 26;
140
167
  _context2.t0 = _context2["catch"](1);
141
168
  console.error(_context2.t0);
142
169
 
143
- case 20:
170
+ case 29:
144
171
  case "end":
145
172
  return _context2.stop();
146
173
  }
147
174
  }
148
- }, _callee2, null, [[1, 17]]);
175
+ }, _callee2, null, [[1, 26]]);
149
176
  })));
150
177
  regSaga(takeEvery('TREE_SAVE_ERROR', /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref3) {
151
178
  var _ref3$payload, error, onError;
@@ -182,38 +209,45 @@ regSaga(takeEvery('TREE_SAVE_ERROR', /*#__PURE__*/_regeneratorRuntime.mark(funct
182
209
  }, _callee3, null, [[1, 7]]);
183
210
  })));
184
211
  regSaga(takeEvery('TREE_SAVE_SUCCESS', /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(_ref4) {
185
- var _ref4$payload, onSave, tree;
212
+ var _ref4$payload, onSave, previousTree, treeKey, tree;
186
213
 
187
214
  return _regeneratorRuntime.wrap(function _callee4$(_context4) {
188
215
  while (1) {
189
216
  switch (_context4.prev = _context4.next) {
190
217
  case 0:
191
- _ref4$payload = _ref4.payload, onSave = _ref4$payload.onSave, tree = _ref4$payload.tree;
218
+ _ref4$payload = _ref4.payload, onSave = _ref4$payload.onSave, previousTree = _ref4$payload.previousTree, treeKey = _ref4$payload.treeKey;
192
219
  _context4.prev = 1;
193
220
 
194
221
  if (!isFunction(onSave)) {
195
- _context4.next = 5;
222
+ _context4.next = 8;
196
223
  break;
197
224
  }
198
225
 
199
226
  _context4.next = 5;
200
- return call(onSave, tree);
227
+ return select(function (state) {
228
+ return state.getIn(['trees', treeKey, 'tree']);
229
+ });
201
230
 
202
231
  case 5:
203
- _context4.next = 10;
232
+ tree = _context4.sent;
233
+ _context4.next = 8;
234
+ return call(onSave, tree, previousTree);
235
+
236
+ case 8:
237
+ _context4.next = 13;
204
238
  break;
205
239
 
206
- case 7:
207
- _context4.prev = 7;
240
+ case 10:
241
+ _context4.prev = 10;
208
242
  _context4.t0 = _context4["catch"](1);
209
243
  console.error(_context4.t0);
210
244
 
211
- case 10:
245
+ case 13:
212
246
  case "end":
213
247
  return _context4.stop();
214
248
  }
215
249
  }
216
- }, _callee4, null, [[1, 7]]);
250
+ }, _callee4, null, [[1, 10]]);
217
251
  })));
218
252
  regHandlers({
219
253
  // the TreeBuilder component does nothing while the tree state is undefined,
@@ -234,11 +268,14 @@ regHandlers({
234
268
  TREE_LOADED: function TREE_LOADED(state, _ref8) {
235
269
  var _ref8$payload = _ref8.payload,
236
270
  categories = _ref8$payload.categories,
271
+ kappSlug = _ref8$payload.kappSlug,
237
272
  treeKey = _ref8$payload.treeKey,
238
- tree = _ref8$payload.tree;
273
+ tree = _ref8$payload.tree,
274
+ webApi = _ref8$payload.webApi;
239
275
  return state.mergeIn(['trees', treeKey], {
240
- categories: categories,
276
+ kappSlug: kappSlug,
241
277
  lastSave: tree,
278
+ lastWebApi: webApi,
242
279
  loading: false,
243
280
  tasks: List(categories).map(function (category) {
244
281
  return category.name === 'System Controls' ? _objectSpread(_objectSpread({}, category), {}, {
@@ -251,7 +288,8 @@ regHandlers({
251
288
  }).reduce(function (reduction, task) {
252
289
  return reduction.set(task.definitionId, task);
253
290
  }, OrderedMap()),
254
- tree: tree
291
+ tree: tree,
292
+ webApi: webApi
255
293
  });
256
294
  },
257
295
  TREE_SAVE: function TREE_SAVE(state, _ref9) {
@@ -272,7 +310,8 @@ regHandlers({
272
310
  TREE_SAVE_SUCCESS: function TREE_SAVE_SUCCESS(state, _ref11) {
273
311
  var _ref11$payload = _ref11.payload,
274
312
  tree = _ref11$payload.tree,
275
- treeKey = _ref11$payload.treeKey;
313
+ treeKey = _ref11$payload.treeKey,
314
+ webApi = _ref11$payload.webApi;
276
315
  var newTree = state.getIn(['trees', treeKey, 'tree']).merge({
277
316
  name: tree.name,
278
317
  versionId: tree.versionId
@@ -281,29 +320,39 @@ regHandlers({
281
320
  dirty: false,
282
321
  error: null,
283
322
  lastSave: newTree,
323
+ lastWebApi: webApi,
284
324
  saving: false,
285
- tree: newTree
325
+ tree: newTree,
326
+ webApi: webApi
286
327
  });
287
328
  },
288
329
  TREE_UNDO: function TREE_UNDO(state, _ref12) {
289
330
  var treeKey = _ref12.payload.treeKey;
290
331
  return state.getIn(['trees', treeKey, 'undoStack']).isEmpty() ? state : state.updateIn(['trees', treeKey], function (builderState) {
291
332
  return builderState.merge({
292
- tree: builderState.undoStack.last(),
293
- redoStack: builderState.redoStack.push(builderState.tree),
294
- undoStack: builderState.undoStack.butLast()
333
+ tree: builderState.undoStack.last().tree,
334
+ redoStack: builderState.redoStack.push({
335
+ tree: builderState.tree,
336
+ webApi: builderState.webApi
337
+ }),
338
+ undoStack: builderState.undoStack.butLast(),
339
+ webApi: builderState.undoStack.last().webApi
295
340
  });
296
- });
341
+ }).updateIn(['trees', treeKey], synchronizeRoutineDefinition);
297
342
  },
298
343
  TREE_REDO: function TREE_REDO(state, _ref13) {
299
344
  var treeKey = _ref13.payload.treeKey;
300
345
  return state.getIn(['trees', treeKey, 'redoStack']).isEmpty() ? state : state.updateIn(['trees', treeKey], function (builderState) {
301
346
  return builderState.merge({
302
- tree: builderState.redoStack.last(),
347
+ tree: builderState.redoStack.last().tree,
303
348
  redoStack: builderState.redoStack.butLast(),
304
- undoStack: builderState.undoStack.push(builderState.tree)
349
+ undoStack: builderState.undoStack.push({
350
+ tree: builderState.tree,
351
+ webApi: builderState.webApi
352
+ }),
353
+ webApi: builderState.redoStack.last().webApi
305
354
  });
306
- });
355
+ }).updateIn(['trees', treeKey], synchronizeRoutineDefinition);
307
356
  },
308
357
  TREE_UPDATE: function TREE_UPDATE(state, _ref14) {
309
358
  var _ref14$payload = _ref14.payload,
@@ -399,5 +448,63 @@ regHandlers({
399
448
  id = _ref22$payload.id,
400
449
  nodeId = _ref22$payload.nodeId;
401
450
  return remember(state, treeKey).setIn(['trees', treeKey, 'tree', 'connectors', id, 'tailId'], nodeId);
451
+ },
452
+ TREE_UPDATE_SETTINGS: function TREE_UPDATE_SETTINGS(state, _ref23) {
453
+ var _ref23$payload = _ref23.payload,
454
+ treeKey = _ref23$payload.treeKey,
455
+ values = _ref23$payload.values;
456
+ // If the updated settings are for a routine we rebuild the "Tree Input"
457
+ // bindings.
458
+ var bindings = values.inputs ? _objectSpread(_objectSpread({}, state.getIn(['trees', treeKey, 'tree', 'bindings'])), {}, {
459
+ 'Tree Input': values.inputs.groupBy(function (input) {
460
+ return input.get('name');
461
+ }).map(function (list) {
462
+ return list.first().get('name');
463
+ }).map(function (name) {
464
+ return "<%=@inputs['".concat(name, "']%>");
465
+ }).toJS()
466
+ }) : state.getIn(['trees', treeKey, 'tree', 'bindings']);
467
+ return remember(state, treeKey).mergeIn(['trees', treeKey, 'tree'], _objectSpread(_objectSpread({}, values), {}, {
468
+ bindings: bindings
469
+ })).updateIn(['trees', treeKey], synchronizeRoutineDefinition);
470
+ },
471
+ TREE_UPDATE_WEB_API: function TREE_UPDATE_WEB_API(state, _ref24) {
472
+ var _ref24$payload = _ref24.payload,
473
+ treeKey = _ref24$payload.treeKey,
474
+ values = _ref24$payload.values;
475
+ return remember(state, treeKey).mergeIn(['trees', treeKey, 'webApi'], values).setIn(['trees', treeKey, 'tree', 'name'], values.slug);
402
476
  }
403
- });
477
+ });
478
+
479
+ var synchronizeRoutineDefinition = function synchronizeRoutineDefinition(treeBuilderState) {
480
+ var tree = treeBuilderState.tree;
481
+ var definitionId = tree.definitionId,
482
+ inputs = tree.inputs,
483
+ outputs = tree.outputs;
484
+ return treeBuilderState.update('tasks', function (tasks) {
485
+ return tasks.map(function (task, taskDefinitionId) {
486
+ return definitionId === taskDefinitionId ? _objectSpread(_objectSpread({}, task), {}, {
487
+ inputs: inputs.toJS(),
488
+ outputs: outputs.toJS()
489
+ }) : taskDefinitionId === 'system_tree_return_v1' ? treeReturnTask(tree) : task;
490
+ });
491
+ });
492
+ };
493
+
494
+ var getWebApiProps = function getWebApiProps(_ref25) {
495
+ var name = _ref25.name,
496
+ platformSourceName = _ref25.platformSourceName,
497
+ sourceGroup = _ref25.sourceGroup,
498
+ sourceName = _ref25.sourceName;
499
+
500
+ if (sourceName === platformSourceName && sourceGroup.startsWith('WebApis')) {
501
+ var kappSlug = sourceGroup.startsWith('WebApis > ') ? sourceGroup.replace('WebApis > ', '') : undefined;
502
+ var slug = name;
503
+ return {
504
+ kappSlug: kappSlug,
505
+ slug: slug
506
+ };
507
+ }
508
+
509
+ return null;
510
+ };
@@ -331,7 +331,7 @@ export var normalizeParameter = function normalizeParameter(_ref12) {
331
331
  value: defaultValue
332
332
  }, rest);
333
333
  };
334
- var defaultOutputs = [{
334
+ var defaultOutputs = List([{
335
335
  id: 'content',
336
336
  name: 'Content'
337
337
  }, {
@@ -346,7 +346,7 @@ var defaultOutputs = [{
346
346
  id: 'response_code',
347
347
  name: 'Response Code',
348
348
  defaultValue: '200'
349
- }];
349
+ }]).map(Map);
350
350
  export var treeReturnTask = function treeReturnTask(tree) {
351
351
  return {
352
352
  deferrable: false,
@@ -358,7 +358,9 @@ export var treeReturnTask = function treeReturnTask(tree) {
358
358
  selectionCriterion: null,
359
359
  status: 'Active',
360
360
  visible: false,
361
- parameters: (tree.taskDefinition ? tree.taskDefinition.outputs : defaultOutputs).map(function (output) {
361
+ parameters: (tree.definitionId ? tree.outputs : defaultOutputs).map(function (output) {
362
+ return output.toObject();
363
+ }).map(function (output) {
362
364
  return {
363
365
  name: output.name,
364
366
  defaultValue: output.defaultValue || '',