@kineticdata/react 5.1.0 → 5.1.2

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 (35) 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/backgroundJobs.js +2 -1
  4. package/lib/apis/core/bridgeModelAttributeMappings.js +1 -1
  5. package/lib/apis/core/bridgeModelAttributes.js +15 -12
  6. package/lib/apis/core/bridgeModelMappings.js +1 -1
  7. package/lib/apis/core/bridgeModelQualificationMappings.js +2 -2
  8. package/lib/apis/core/bridgeModelQualifications.js +2 -2
  9. package/lib/apis/core/bridgeModels.js +20 -8
  10. package/lib/apis/core/bridgedresources.js +4 -2
  11. package/lib/apis/core/bridgedresources.test.js +1 -1
  12. package/lib/apis/core/formTypes.js +18 -21
  13. package/lib/apis/core/forms.js +2 -1
  14. package/lib/apis/core/oauthClients.js +11 -5
  15. package/lib/apis/core/platformItems.js +21 -0
  16. package/lib/apis/core/securityPolicyDefinitions.js +1 -1
  17. package/lib/apis/core/submissions.js +92 -3
  18. package/lib/apis/core/submissions.test.js +46 -19
  19. package/lib/apis/core/webhooks.js +1 -1
  20. package/lib/apis/core/webhooks.test.js +2 -2
  21. package/lib/apis/core/workflows.js +56 -0
  22. package/lib/apis/http.js +6 -0
  23. package/lib/apis/index.js +3 -1
  24. package/lib/apis/task/index.js +7 -3
  25. package/lib/components/index.js +2 -0
  26. package/lib/components/table/Table.js +14 -7
  27. package/lib/components/table/Table.redux.js +16 -8
  28. package/lib/components/task/builder/TaskDefinitionConfigForm.js +1 -1
  29. package/lib/components/task/builder/builder.redux.js +65 -28
  30. package/lib/components/task/builder/models.js +19 -0
  31. package/lib/components/task/workflows/LinkedWorkflowForm.js +255 -0
  32. package/lib/components/task/workflows/LinkedWorkflowTable.js +133 -0
  33. package/lib/components/task/workflows/WorkflowForm.js +12 -2
  34. package/package.json +3 -3
  35. package/proxyhelper.js +1 -2
@@ -24,6 +24,8 @@ export var Tree = Record({
24
24
  categories: List(),
25
25
  connectors: OrderedMap(),
26
26
  definitionId: null,
27
+ event: null,
28
+ guid: null,
27
29
  inputs: null,
28
30
  name: '',
29
31
  nextNodeId: 0,
@@ -32,6 +34,8 @@ export var Tree = Record({
32
34
  notes: '',
33
35
  outputs: null,
34
36
  ownerEmail: '',
37
+ platformItemId: null,
38
+ platformItemType: null,
35
39
  schemaVersion: '',
36
40
  sourceGroup: '',
37
41
  sourceName: '',
@@ -81,6 +85,7 @@ export var TreeBuilderState = Record({
81
85
  lastSave: null,
82
86
  lastWebApi: null,
83
87
  loading: true,
88
+ platformItem: null,
84
89
  redoStack: List(),
85
90
  saving: false,
86
91
  tasks: OrderedMap(),
@@ -166,11 +171,15 @@ export var deserializeTree = function deserializeTree(_ref4) {
166
171
  var bindings = _ref4.bindings,
167
172
  categories = _ref4.categories,
168
173
  definitionId = _ref4.definitionId,
174
+ event = _ref4.event,
175
+ guid = _ref4.guid,
169
176
  inputs = _ref4.inputs,
170
177
  name = _ref4.name,
171
178
  notes = _ref4.notes,
172
179
  outputs = _ref4.outputs,
173
180
  ownerEmail = _ref4.ownerEmail,
181
+ platformItemId = _ref4.platformItemId,
182
+ platformItemType = _ref4.platformItemType,
174
183
  sourceGroup = _ref4.sourceGroup,
175
184
  sourceName = _ref4.sourceName,
176
185
  status = _ref4.status,
@@ -186,11 +195,15 @@ export var deserializeTree = function deserializeTree(_ref4) {
186
195
  return [c.id, c];
187
196
  })),
188
197
  definitionId: definitionId,
198
+ event: event,
199
+ guid: guid,
189
200
  inputs: List(inputs).map(Map),
190
201
  name: name,
191
202
  notes: notes,
192
203
  outputs: List(outputs).map(Map),
193
204
  ownerEmail: ownerEmail,
205
+ platformItemId: platformItemId,
206
+ platformItemType: platformItemType,
194
207
  nextNodeId: treeJson.lastId + 1,
195
208
  nextConnectorId: treeJson.connectors.length,
196
209
  nodes: OrderedMap(treeJson.nodes.map(deserializeNode).map(function (n) {
@@ -208,6 +221,7 @@ export var serializeTree = function serializeTree(_ref5) {
208
221
  var connectors = _ref5.connectors,
209
222
  categories = _ref5.categories,
210
223
  definitionId = _ref5.definitionId,
224
+ event = _ref5.event,
211
225
  inputs = _ref5.inputs,
212
226
  name = _ref5.name,
213
227
  nextNodeId = _ref5.nextNodeId,
@@ -215,6 +229,8 @@ export var serializeTree = function serializeTree(_ref5) {
215
229
  notes = _ref5.notes,
216
230
  outputs = _ref5.outputs,
217
231
  ownerEmail = _ref5.ownerEmail,
232
+ platformItemId = _ref5.platformItemId,
233
+ platformItemType = _ref5.platformItemType,
218
234
  schemaVersion = _ref5.schemaVersion,
219
235
  sourceGroup = _ref5.sourceGroup,
220
236
  sourceName = _ref5.sourceName,
@@ -224,11 +240,14 @@ export var serializeTree = function serializeTree(_ref5) {
224
240
  return {
225
241
  categories: categories,
226
242
  definitionId: definitionId,
243
+ event: event,
227
244
  inputs: inputs,
228
245
  name: name,
229
246
  notes: notes,
230
247
  outputs: outputs,
231
248
  ownerEmail: ownerEmail,
249
+ platformItemId: platformItemId,
250
+ platformItemType: platformItemType,
232
251
  sourceGroup: sourceGroup,
233
252
  sourceName: sourceName,
234
253
  status: status,
@@ -0,0 +1,255 @@
1
+ import { get, List, Map } from 'immutable';
2
+ import { generateForm } from '../../form/Form';
3
+ import { createWorkflow, fetchForms, fetchKapps, fetchKappWebhookEvents, fetchSpaceWebhookEvents, fetchTree, fetchWorkflow, updateWorkflow } from '../../../apis';
4
+
5
+ var spaceTrees = function spaceTrees(spaceWebhookEvents) {
6
+ return spaceWebhookEvents.filter(function (_v, key) {
7
+ return key !== 'Discussion';
8
+ }).map(function (events, key) {
9
+ return events.map(function (event) {
10
+ return "".concat(key, " ").concat(event);
11
+ });
12
+ }).toList().flatten();
13
+ };
14
+
15
+ var kappTrees = function kappTrees(kappWebhookEvents) {
16
+ return kappWebhookEvents.map(function (events, key) {
17
+ return events.map(function (event) {
18
+ return "".concat(key, " ").concat(event);
19
+ });
20
+ }).toList().flatten();
21
+ };
22
+
23
+ var formTrees = function formTrees(webhookEvents) {
24
+ return webhookEvents.get('Submission').map(function (event) {
25
+ return "Submission ".concat(event);
26
+ });
27
+ };
28
+
29
+ var getPossibleTrees = function getPossibleTrees(_ref) {
30
+ var kappSlug = _ref.kappSlug,
31
+ formSlug = _ref.formSlug,
32
+ spaceWebhookEvents = _ref.spaceWebhookEvents,
33
+ kappWebhookEvents = _ref.kappWebhookEvents;
34
+ return kappSlug && formSlug ? formTrees(kappWebhookEvents) : !kappSlug && formSlug ? formTrees(spaceWebhookEvents) : kappSlug ? kappTrees(kappWebhookEvents) : spaceTrees(spaceWebhookEvents);
35
+ };
36
+
37
+ var dataSources = function dataSources(_ref2) {
38
+ var workflowId = _ref2.workflowId,
39
+ kappSlug = _ref2.kappSlug,
40
+ formSlug = _ref2.formSlug,
41
+ cloneGuid = _ref2.cloneGuid;
42
+ return {
43
+ workflow: {
44
+ fn: fetchWorkflow,
45
+ params: workflowId && [{
46
+ kappSlug: kappSlug,
47
+ formSlug: formSlug,
48
+ workflowId: workflowId,
49
+ include: 'details'
50
+ }],
51
+ transform: function transform(result) {
52
+ return result.workflow;
53
+ }
54
+ },
55
+ cloneTree: {
56
+ fn: fetchTree,
57
+ params: cloneGuid && [{
58
+ include: 'details,treeJson',
59
+ guid: cloneGuid
60
+ }],
61
+ transform: function transform(result) {
62
+ return result.tree;
63
+ }
64
+ },
65
+ kapps: {
66
+ fn: fetchKapps,
67
+ params: cloneGuid && [],
68
+ transform: function transform(result) {
69
+ return result.kapps;
70
+ }
71
+ },
72
+ forms: {
73
+ fn: fetchForms,
74
+ params: function params(_ref3) {
75
+ var values = _ref3.values;
76
+ return cloneGuid && values && values.get('newKappSlug') && [{
77
+ kappSlug: values.get('newKappSlug')
78
+ }];
79
+ },
80
+ transform: function transform(result) {
81
+ return result.forms;
82
+ }
83
+ },
84
+ // The requests and data manipulation needed to determine available
85
+ // `events` for the dropdown options.
86
+ kappWebhookEvents: {
87
+ fn: fetchKappWebhookEvents,
88
+ params: [],
89
+ transform: function transform(result) {
90
+ return result;
91
+ }
92
+ },
93
+ spaceWebhookEvents: {
94
+ fn: fetchSpaceWebhookEvents,
95
+ params: [],
96
+ transform: function transform(result) {
97
+ return result;
98
+ }
99
+ },
100
+ possibleEvents: {
101
+ fn: getPossibleTrees,
102
+ params: function params(_ref4) {
103
+ var spaceWebhookEvents = _ref4.spaceWebhookEvents,
104
+ kappWebhookEvents = _ref4.kappWebhookEvents;
105
+ return spaceWebhookEvents && kappWebhookEvents && [{
106
+ kappSlug: kappSlug,
107
+ formSlug: formSlug,
108
+ spaceWebhookEvents: spaceWebhookEvents,
109
+ kappWebhookEvents: kappWebhookEvents
110
+ }];
111
+ },
112
+ transform: function transform(result) {
113
+ return result;
114
+ }
115
+ }
116
+ };
117
+ };
118
+
119
+ var NON_CLONABLE_KEYS = ['createdAt', 'createdBy', 'updatedAt', 'updatedBy', 'sourceGroup', 'sourceName', 'name', 'event', 'title', 'id', 'guid', 'platformItemType', 'platformItemId', 'versionId'];
120
+
121
+ var handleSubmit = function handleSubmit(_ref5) {
122
+ var kappSlug = _ref5.kappSlug,
123
+ formSlug = _ref5.formSlug,
124
+ workflowId = _ref5.workflowId,
125
+ cloneGuid = _ref5.cloneGuid;
126
+ return function (values, _ref6) {
127
+ var cloneTree = _ref6.cloneTree;
128
+ var submitFn = workflowId ? updateWorkflow : createWorkflow;
129
+ var workflow = cloneGuid ? cloneTree.filter(function (_v, key) {
130
+ return !NON_CLONABLE_KEYS.includes(key);
131
+ }).set('name', values.get('name')).set('event', values.get('event')).toJS() : values.toJS();
132
+ var targetKappSlug = cloneGuid ? values.get('newKappSlug') : kappSlug;
133
+ var targetFormSlug = cloneGuid ? values.get('newFormSlug') : formSlug;
134
+ return submitFn({
135
+ kappSlug: targetKappSlug,
136
+ formSlug: targetFormSlug,
137
+ workflowId: workflowId,
138
+ workflow: workflow
139
+ }).then(function (_ref7) {
140
+ var workflow = _ref7.workflow,
141
+ error = _ref7.error;
142
+
143
+ if (error) {
144
+ throw error.statusCode === 400 && error.message || 'There was an error saving the workflow';
145
+ }
146
+
147
+ return {
148
+ workflow: workflow,
149
+ targetKappSlug: targetKappSlug,
150
+ targetFormSlug: targetFormSlug
151
+ };
152
+ });
153
+ };
154
+ };
155
+
156
+ var isCloneReady = function isCloneReady(cloneTree, kapps, scope) {
157
+ return cloneTree && (scope !== 'Space' ? kapps : true);
158
+ };
159
+
160
+ var initialEvent = function initialEvent(cloneGuid, cloneTree, workflow, possibleEvents) {
161
+ var cloneEvent = get(cloneTree, 'event', '');
162
+
163
+ if (!cloneGuid) {
164
+ // If we're not cloning (editing or new).
165
+ return get(workflow, 'event', '') || '';
166
+ } else if (cloneGuid && cloneEvent) {
167
+ // If we're cloning a linked workflow.
168
+ return cloneEvent || '';
169
+ } // Otherwise we have to calculate it depending on the sourceGroup and name
170
+
171
+
172
+ var type = get(cloneTree, 'sourceGroup', '').split(' > ')[0].replace(/s?$/, '');
173
+ var name = cloneTree.get('name');
174
+ var event = "".concat(type, " ").concat(name);
175
+ var legacyEvent = possibleEvents.find(function (e) {
176
+ return e === event;
177
+ });
178
+ return legacyEvent || '';
179
+ };
180
+
181
+ var fields = function fields(_ref8) {
182
+ var kappSlug = _ref8.kappSlug,
183
+ formSlug = _ref8.formSlug,
184
+ cloneGuid = _ref8.cloneGuid,
185
+ scope = _ref8.scope;
186
+ return function (_ref9) {
187
+ var workflow = _ref9.workflow,
188
+ cloneTree = _ref9.cloneTree,
189
+ possibleEvents = _ref9.possibleEvents,
190
+ kapps = _ref9.kapps;
191
+ return possibleEvents && (!cloneGuid || isCloneReady(cloneTree, kapps, scope)) && [{
192
+ name: 'name',
193
+ label: 'Name',
194
+ type: 'text',
195
+ required: true,
196
+ initialValue: cloneGuid ? '' : get(workflow, 'name') || ''
197
+ }, {
198
+ name: 'event',
199
+ label: 'Event',
200
+ type: 'select',
201
+ required: true,
202
+ enabled: !cloneGuid || !get(cloneTree, 'event', ''),
203
+ options: possibleEvents.map(function (event) {
204
+ return Map({
205
+ label: event,
206
+ value: event
207
+ });
208
+ }),
209
+ initialValue: initialEvent(cloneGuid, cloneTree, workflow, possibleEvents)
210
+ }, {
211
+ name: 'newKappSlug',
212
+ label: 'Kapp',
213
+ type: 'select',
214
+ required: cloneGuid && scope !== 'Space',
215
+ options: function options(_ref10) {
216
+ var kapps = _ref10.kapps;
217
+ return cloneGuid && scope !== 'Space' && kapps && kapps.map(function (kapp) {
218
+ return Map({
219
+ label: kapp.get('name'),
220
+ value: kapp.get('slug')
221
+ });
222
+ });
223
+ },
224
+ initialValue: kappSlug || ''
225
+ }, {
226
+ name: 'newFormSlug',
227
+ label: 'Form',
228
+ type: 'select',
229
+ required: cloneGuid && scope === 'Form',
230
+ options: function options(_ref11) {
231
+ var forms = _ref11.forms;
232
+ return forms ? forms.map(function (form) {
233
+ return Map({
234
+ label: form.get('name'),
235
+ value: form.get('slug')
236
+ });
237
+ }) : List();
238
+ },
239
+ initialValue: formSlug || ''
240
+ }, {
241
+ name: 'treeXml',
242
+ label: 'Tree XML',
243
+ type: 'text',
244
+ required: false,
245
+ initialValue: ''
246
+ }];
247
+ };
248
+ };
249
+
250
+ export var LinkedWorkflowForm = generateForm({
251
+ formOptions: ['kappSlug', 'formSlug', 'workflowId', 'cloneGuid', 'scope'],
252
+ dataSources: dataSources,
253
+ handleSubmit: handleSubmit,
254
+ fields: fields
255
+ });
@@ -0,0 +1,133 @@
1
+ import { generateTable } from '../../table/Table';
2
+ import { fetchWorkflows } from '../../../apis';
3
+ import { defineFilter } from '../../../helpers';
4
+ var STATUS_OPTIONS = ['Active', 'Inactive', 'Paused'].map(function (v) {
5
+ return {
6
+ label: v,
7
+ value: v
8
+ };
9
+ });
10
+ var clientSide = defineFilter(true).equals('name', 'name').startsWith('event', 'event').equals('status', 'status').end();
11
+
12
+ var dataSource = function dataSource(_ref) {
13
+ var formSlug = _ref.formSlug,
14
+ kappSlug = _ref.kappSlug;
15
+ return {
16
+ clientSide: clientSide,
17
+ fn: fetchWorkflows,
18
+ params: function params(paramData) {
19
+ return [{
20
+ kappSlug: kappSlug,
21
+ formSlug: formSlug,
22
+ include: 'details',
23
+ name: paramData.filters.get('name'),
24
+ event: paramData.filters.get('event'),
25
+ status: paramData.filters.get('status')
26
+ }];
27
+ },
28
+ transform: function transform(result) {
29
+ var extraData = {
30
+ migratable: result.migratable,
31
+ missing: result.missing,
32
+ orphaned: result.orphaned
33
+ };
34
+ return {
35
+ data: result.workflows,
36
+ nextPageToken: result.nextPageToken,
37
+ extraData: extraData
38
+ };
39
+ }
40
+ };
41
+ };
42
+
43
+ var filters = function filters() {
44
+ return function (_ref2) {
45
+ var sourceTypes = _ref2.sourceTypes;
46
+ return sourceTypes && [{
47
+ name: 'name',
48
+ label: 'Name',
49
+ type: 'text'
50
+ }, {
51
+ name: 'event',
52
+ label: 'Event',
53
+ type: 'text'
54
+ }, {
55
+ name: 'status',
56
+ label: 'Status',
57
+ type: 'select',
58
+ options: STATUS_OPTIONS
59
+ }];
60
+ };
61
+ };
62
+
63
+ var columns = [{
64
+ value: 'id',
65
+ title: 'ID',
66
+ sortable: false
67
+ }, {
68
+ value: 'name',
69
+ title: 'Name',
70
+ sortable: true
71
+ }, {
72
+ value: 'event',
73
+ title: 'Event',
74
+ sortable: true
75
+ }, {
76
+ value: 'notes',
77
+ title: 'Notes',
78
+ sortable: false
79
+ }, {
80
+ value: 'definitionId',
81
+ title: 'Definition ID',
82
+ sortable: true
83
+ }, {
84
+ value: 'ownerEmail',
85
+ title: 'Owner EMail',
86
+ sortable: false
87
+ }, {
88
+ value: 'sourceGroup',
89
+ title: 'Source Group',
90
+ sortable: true
91
+ }, {
92
+ value: 'sourceName',
93
+ title: 'Source Name',
94
+ sortable: true
95
+ }, {
96
+ value: 'status',
97
+ title: 'Status',
98
+ sortable: true,
99
+ options: function options() {
100
+ return STATUS_OPTIONS;
101
+ }
102
+ }, {
103
+ value: 'title',
104
+ title: 'Title',
105
+ sortable: false
106
+ }, {
107
+ value: 'type',
108
+ title: 'type',
109
+ sortable: false
110
+ }, {
111
+ value: 'createdAt',
112
+ title: 'Created',
113
+ sortable: false
114
+ }, {
115
+ value: 'createdBy',
116
+ title: 'Created By',
117
+ sortable: false
118
+ }, {
119
+ value: 'updatedAt',
120
+ title: 'Updated',
121
+ sortable: true
122
+ }, {
123
+ value: 'updatedBy',
124
+ title: 'Updated By',
125
+ sortable: false
126
+ }];
127
+ export var LinkedWorkflowTable = generateTable({
128
+ tableOptions: ['kappSlug', 'formSlug'],
129
+ columns: columns,
130
+ filters: filters,
131
+ dataSource: dataSource
132
+ });
133
+ LinkedWorkflowTable.displayName = 'LinkedWorkflowTable';
@@ -85,7 +85,8 @@ var fields = function fields(_ref4) {
85
85
  return sources;
86
86
  },
87
87
  initialValue: workflow ? workflow.get('sourceName') : workflowType === 'routines' ? '-' : '',
88
- helpText: 'The application that is calling and getting the results back from the workflow.'
88
+ helpText: 'The application that is calling and getting the results back from the workflow.',
89
+ visible: !workflow || !workflow.get('event')
89
90
  }, {
90
91
  name: 'sourceGroup',
91
92
  label: 'Source Group',
@@ -101,7 +102,16 @@ var fields = function fields(_ref4) {
101
102
  }) : List();
102
103
  },
103
104
  initialValue: workflow ? workflow.get('sourceGroup') : workflowType === 'routines' ? '-' : '',
104
- helpText: "Categorization of the workflow based on rules provided by the Source. For Request CE it's the combination of the type (submission of form), Kapp Slug and the Form Slug separated by a greater than sign ( > ). Example: Submissions > services > onboarding."
105
+ helpText: "Categorization of the workflow based on rules provided by the Source. For Request CE it's the combination of the type (submission of form), Kapp Slug and the Form Slug separated by a greater than sign ( > ). Example: Submissions > services > onboarding.",
106
+ visible: !workflow || !workflow.get('event')
107
+ }, {
108
+ name: 'event',
109
+ label: 'Event',
110
+ type: 'text',
111
+ initialValue: workflow ? workflow.get('event') : '',
112
+ required: workflow && !!workflow.get('event'),
113
+ visible: workflow && !!workflow.get('event'),
114
+ enabled: false
105
115
  }, {
106
116
  name: 'name',
107
117
  label: 'Name',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kineticdata/react",
3
- "version": "5.1.0",
3
+ "version": "5.1.2",
4
4
  "description": "A React library for the Kinetic Platform",
5
5
  "main": "lib/index.js",
6
6
  "main:src": "src/index.js",
@@ -32,7 +32,7 @@
32
32
  "lodash.isplainobject": "^4.0.6",
33
33
  "lodash.isstring": "^4.0.1",
34
34
  "modularscale-sass": "^3.0.8",
35
- "moment": "^2.21.0",
35
+ "moment": "^2.29.4",
36
36
  "prismjs": "1.23.0",
37
37
  "prop-types": "^15.7.2",
38
38
  "react-autosuggest": "^9.4.3",
@@ -92,5 +92,5 @@
92
92
  "eslintConfig": {
93
93
  "extends": "react-app"
94
94
  },
95
- "gitHead": "5040d157c5e19e593fc9f9ca36407058a8d927c5"
95
+ "gitHead": "08d318b36f6e8922fdbfe2875a1d1d1a0b2552b4"
96
96
  }
package/proxyhelper.js CHANGED
@@ -67,7 +67,6 @@ module.exports = (
67
67
  secure: true,
68
68
  changeOrigin: true,
69
69
  ws: true,
70
- xfwd: true,
71
70
  onProxyReq: (proxyRequest, originalRequest) => {
72
71
  // Browsers may send Origin headers even with same-origin
73
72
  // requests. To prevent CORS issues, we have to change
@@ -78,7 +77,7 @@ module.exports = (
78
77
 
79
78
  if (
80
79
  process.env.REACT_APP_PROXY_SUBDOMAIN &&
81
- (!proxyRequest.path.endsWith('pack') ||
80
+ (!proxyRequest.path.endsWith('pack') &&
82
81
  !proxyRequest.path.endsWith('favicon.ico'))
83
82
  ) {
84
83
  proxyRequest.setHeader(