datajunction-ui 0.0.1-rc.19 → 0.0.1-rc.20

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 (66) hide show
  1. package/package.json +6 -5
  2. package/src/__tests__/reportWebVitals.test.jsx +44 -0
  3. package/src/app/components/DeleteNode.jsx +79 -0
  4. package/src/app/components/ListGroupItem.jsx +8 -1
  5. package/src/app/components/QueryInfo.jsx +4 -4
  6. package/src/app/components/Tab.jsx +9 -1
  7. package/src/app/components/ToggleSwitch.jsx +3 -0
  8. package/src/app/components/__tests__/QueryInfo.test.jsx +55 -0
  9. package/src/app/components/__tests__/Tab.test.jsx +27 -0
  10. package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
  11. package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +3 -0
  12. package/src/app/components/djgraph/DJNodeColumns.jsx +4 -1
  13. package/src/app/components/djgraph/DJNodeDimensions.jsx +9 -2
  14. package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
  15. package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
  16. package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
  17. package/src/app/index.tsx +6 -0
  18. package/src/app/pages/AddEditNodePage/FormikSelect.jsx +15 -2
  19. package/src/app/pages/AddEditNodePage/FullNameField.jsx +2 -1
  20. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +77 -0
  21. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +93 -0
  22. package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +34 -3
  23. package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +4 -2
  24. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +53 -0
  25. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +53 -0
  26. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +0 -81
  27. package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +82 -257
  28. package/src/app/pages/AddEditNodePage/index.jsx +13 -5
  29. package/src/app/pages/LoginPage/__tests__/index.test.jsx +70 -0
  30. package/src/app/pages/NamespacePage/__tests__/index.test.jsx +95 -0
  31. package/src/app/pages/NamespacePage/index.jsx +8 -5
  32. package/src/app/pages/NodePage/ClientCodePopover.jsx +3 -1
  33. package/src/app/pages/NodePage/EditColumnPopover.jsx +102 -0
  34. package/src/app/pages/NodePage/LinkDimensionPopover.jsx +135 -0
  35. package/src/app/pages/NodePage/NodeColumnTab.jsx +80 -17
  36. package/src/app/pages/NodePage/NodeHistory.jsx +63 -30
  37. package/src/app/pages/NodePage/NodeInfoTab.jsx +52 -7
  38. package/src/app/pages/NodePage/NodeMaterializationTab.jsx +50 -27
  39. package/src/app/pages/NodePage/NodeSQLTab.jsx +0 -10
  40. package/src/app/pages/NodePage/NodesWithDimension.jsx +4 -2
  41. package/src/app/pages/NodePage/__tests__/ClientCodePopover.test.jsx +49 -0
  42. package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +148 -0
  43. package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +165 -0
  44. package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +591 -0
  45. package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +57 -0
  46. package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +725 -0
  47. package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
  48. package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +402 -0
  49. package/src/app/pages/NodePage/index.jsx +22 -6
  50. package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
  51. package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
  52. package/src/app/pages/RegisterTablePage/index.jsx +163 -0
  53. package/src/app/pages/Root/__tests__/index.test.jsx +77 -0
  54. package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
  55. package/src/app/pages/SQLBuilderPage/index.jsx +61 -43
  56. package/src/app/services/DJService.js +125 -54
  57. package/src/app/services/__tests__/DJService.test.jsx +609 -0
  58. package/src/mocks/mockNodes.jsx +1397 -0
  59. package/src/setupTests.ts +30 -0
  60. package/src/styles/index.css +43 -0
  61. package/src/styles/node-creation.scss +7 -0
  62. package/src/utils/form.jsx +23 -0
  63. package/.github/pull_request_template.md +0 -11
  64. package/.github/workflows/ci.yml +0 -33
  65. package/src/app/pages/NamespacePage/__tests__/__snapshots__/index.test.tsx.snap +0 -118
  66. package/src/app/pages/NamespacePage/__tests__/index.test.tsx +0 -14
@@ -6,10 +6,9 @@ const DJ_URL = process.env.REACT_APP_DJ_URL
6
6
 
7
7
  export const DataJunctionAPI = {
8
8
  whoami: async function () {
9
- const data = await (
9
+ return await (
10
10
  await fetch(`${DJ_URL}/whoami/`, { credentials: 'include' })
11
11
  ).json();
12
- return data;
13
12
  },
14
13
 
15
14
  logout: async function () {
@@ -19,6 +18,14 @@ export const DataJunctionAPI = {
19
18
  });
20
19
  },
21
20
 
21
+ catalogs: async function () {
22
+ return await (
23
+ await fetch(`${DJ_URL}/catalogs`, {
24
+ credentials: 'include',
25
+ })
26
+ ).json();
27
+ },
28
+
22
29
  node: async function (name) {
23
30
  const data = await (
24
31
  await fetch(`${DJ_URL}/nodes/${name}/`, {
@@ -102,148 +109,147 @@ export const DataJunctionAPI = {
102
109
  }
103
110
  },
104
111
 
112
+ registerTable: async function (catalog, schema, table) {
113
+ const response = await fetch(
114
+ `${DJ_URL}/register/table/${catalog}/${schema}/${table}`,
115
+ {
116
+ method: 'POST',
117
+ headers: {
118
+ 'Content-Type': 'application/json',
119
+ },
120
+ credentials: 'include',
121
+ },
122
+ );
123
+ return { status: response.status, json: await response.json() };
124
+ },
125
+
105
126
  upstreams: async function (name) {
106
- const data = await (
127
+ return await (
107
128
  await fetch(`${DJ_URL}/nodes/${name}/upstream/`, {
108
129
  credentials: 'include',
109
130
  })
110
131
  ).json();
111
- return data;
112
132
  },
113
133
 
114
134
  downstreams: async function (name) {
115
- const data = await (
116
- await fetch(`${DJ_URL}/nodes/` + name + '/downstream/', {
135
+ return await (
136
+ await fetch(`${DJ_URL}/nodes/${name}/downstream/`, {
117
137
  credentials: 'include',
118
138
  })
119
139
  ).json();
120
- return data;
121
140
  },
122
141
 
123
142
  node_dag: async function (name) {
124
- const data = await (
125
- await fetch(`${DJ_URL}/nodes/` + name + '/dag/', {
143
+ return await (
144
+ await fetch(`${DJ_URL}/nodes/${name}/dag/`, {
126
145
  credentials: 'include',
127
146
  })
128
147
  ).json();
129
- return data;
130
148
  },
131
149
 
132
150
  node_lineage: async function (name) {
133
- const data = await (
134
- await fetch(`${DJ_URL}/nodes/` + name + '/lineage/', {
151
+ return await (
152
+ await fetch(`${DJ_URL}/nodes/${name}/lineage/`, {
135
153
  credentials: 'include',
136
154
  })
137
155
  ).json();
138
- return data;
139
156
  },
140
157
 
141
158
  metric: async function (name) {
142
- const data = await (
143
- await fetch(`${DJ_URL}/metrics/` + name + '/', {
159
+ return await (
160
+ await fetch(`${DJ_URL}/metrics/${name}/`, {
144
161
  credentials: 'include',
145
162
  })
146
163
  ).json();
147
- return data;
148
164
  },
149
165
 
150
166
  clientCode: async function (name) {
151
- const data = await (
152
- await fetch(`${DJ_URL}/datajunction-clients/python/new_node/` + name, {
167
+ return await (
168
+ await fetch(`${DJ_URL}/datajunction-clients/python/new_node/${name}`, {
153
169
  credentials: 'include',
154
170
  })
155
171
  ).json();
156
- return data;
157
172
  },
158
173
 
159
174
  cube: async function (name) {
160
- const data = await (
161
- await fetch(`${DJ_URL}/cubes/` + name + '/', {
175
+ return await (
176
+ await fetch(`${DJ_URL}/cubes/${name}/`, {
162
177
  credentials: 'include',
163
178
  })
164
179
  ).json();
165
- return data;
166
180
  },
167
181
 
168
182
  metrics: async function (name) {
169
- const data = await (
183
+ return await (
170
184
  await fetch(`${DJ_URL}/metrics/`, {
171
185
  credentials: 'include',
172
186
  })
173
187
  ).json();
174
- return data;
175
188
  },
176
189
 
177
190
  commonDimensions: async function (metrics) {
178
191
  const metricsQuery = '?' + metrics.map(m => `metric=${m}`).join('&');
179
- const data = await (
180
- await fetch(`${DJ_URL}/metrics/common/dimensions/` + metricsQuery, {
192
+ return await (
193
+ await fetch(`${DJ_URL}/metrics/common/dimensions/${metricsQuery}`, {
181
194
  credentials: 'include',
182
195
  })
183
196
  ).json();
184
- return data;
185
197
  },
186
198
 
187
199
  history: async function (type, name, offset, limit) {
188
- const data = await (
200
+ return await (
189
201
  await fetch(
190
- `${DJ_URL}/history?node=` +
191
- name +
192
- `&offset=${offset ? offset : 0}&limit=${limit ? limit : 100}`,
202
+ `${DJ_URL}/history?node=${name}&offset=${offset ? offset : 0}&limit=${
203
+ limit ? limit : 100
204
+ }`,
193
205
  {
194
206
  credentials: 'include',
195
207
  },
196
208
  )
197
209
  ).json();
198
- return data;
199
210
  },
200
211
 
201
212
  revisions: async function (name) {
202
- const data = await (
203
- await fetch(`${DJ_URL}/nodes/` + name + '/revisions/', {
213
+ return await (
214
+ await fetch(`${DJ_URL}/nodes/${name}/revisions/`, {
204
215
  credentials: 'include',
205
216
  })
206
217
  ).json();
207
- return data;
208
218
  },
209
219
 
210
220
  namespace: async function (nmspce) {
211
- const data = await (
212
- await fetch(`${DJ_URL}/namespaces/` + nmspce + '/', {
221
+ return await (
222
+ await fetch(`${DJ_URL}/namespaces/${nmspce}/`, {
213
223
  credentials: 'include',
214
224
  })
215
225
  ).json();
216
- return data;
217
226
  },
218
227
 
219
228
  namespaces: async function () {
220
- const data = await (
229
+ return await (
221
230
  await fetch(`${DJ_URL}/namespaces/`, {
222
231
  credentials: 'include',
223
232
  })
224
233
  ).json();
225
- return data;
226
234
  },
227
235
 
228
236
  sql: async function (metric_name, selection) {
229
- const data = await (
237
+ return await (
230
238
  await fetch(
231
- `${DJ_URL}/sql/` + metric_name + '?' + new URLSearchParams(selection),
239
+ `${DJ_URL}/sql/${metric_name}?` + new URLSearchParams(selection),
232
240
  {
233
241
  credentials: 'include',
234
242
  },
235
243
  )
236
244
  ).json();
237
- return data;
238
245
  },
239
246
 
240
247
  nodesWithDimension: async function (name) {
241
- const data = await (
242
- await fetch(`${DJ_URL}/dimensions/` + name + '/nodes/', {
248
+ return await (
249
+ await fetch(`${DJ_URL}/dimensions/${name}/nodes/`, {
243
250
  credentials: 'include',
244
251
  })
245
252
  ).json();
246
- return data;
247
253
  },
248
254
 
249
255
  materializations: async function (node) {
@@ -302,12 +308,11 @@ export const DataJunctionAPI = {
302
308
  const params = new URLSearchParams();
303
309
  metricSelection.map(metric => params.append('metrics', metric));
304
310
  dimensionSelection.map(dimension => params.append('dimensions', dimension));
305
- const data = await (
311
+ return await (
306
312
  await fetch(`${DJ_URL}/data/?` + params + '&limit=10000', {
307
313
  credentials: 'include',
308
314
  })
309
315
  ).json();
310
- return data;
311
316
  },
312
317
 
313
318
  stream: async function (metricSelection, dimensionSelection, filters) {
@@ -326,12 +331,11 @@ export const DataJunctionAPI = {
326
331
  lineage: async function (node) {},
327
332
 
328
333
  compiledSql: async function (node) {
329
- const data = await (
334
+ return await (
330
335
  await fetch(`${DJ_URL}/sql/${node}/`, {
331
336
  credentials: 'include',
332
337
  })
333
338
  ).json();
334
- return data;
335
339
  },
336
340
 
337
341
  dag: async function (namespace = 'default') {
@@ -392,7 +396,6 @@ export const DataJunctionAPI = {
392
396
  const column_names = node.columns.map(col => {
393
397
  return { name: col.name, type: col.type };
394
398
  });
395
- // const dimensions = node.type === "metric" ? metrics.filter(metric => metric.name === node.name)[0].dimensions : [];
396
399
  return {
397
400
  id: String(node.name),
398
401
  type: 'DJNode',
@@ -407,13 +410,81 @@ export const DataJunctionAPI = {
407
410
  type: node.type,
408
411
  primary_key: primary_key,
409
412
  column_names: column_names,
410
- // dimensions: dimensions,
411
413
  },
412
- // parentNode: [node.name.split(".").slice(-2, -1)],
413
- // extent: 'parent',
414
414
  };
415
415
  });
416
416
 
417
417
  return { edges: edges, nodes: nodes, namespaces: namespaceNodes };
418
418
  },
419
+ attributes: async function () {
420
+ return await (
421
+ await fetch(`${DJ_URL}/attributes`, {
422
+ credentials: 'include',
423
+ })
424
+ ).json();
425
+ },
426
+ setAttributes: async function (nodeName, columnName, attributes) {
427
+ const response = await fetch(
428
+ `${DJ_URL}/nodes/${nodeName}/columns/${columnName}/attributes`,
429
+ {
430
+ method: 'POST',
431
+ headers: {
432
+ 'Content-Type': 'application/json',
433
+ },
434
+ body: JSON.stringify(
435
+ attributes.map(attribute => {
436
+ return {
437
+ namespace: 'system',
438
+ name: attribute,
439
+ };
440
+ }),
441
+ ),
442
+ credentials: 'include',
443
+ },
444
+ );
445
+ return { status: response.status, json: await response.json() };
446
+ },
447
+ dimensions: async function () {
448
+ return await (
449
+ await fetch(`${DJ_URL}/dimensions`, {
450
+ credentials: 'include',
451
+ })
452
+ ).json();
453
+ },
454
+ linkDimension: async function (nodeName, columnName, dimensionName) {
455
+ const response = await fetch(
456
+ `${DJ_URL}/nodes/${nodeName}/columns/${columnName}?dimension=${dimensionName}`,
457
+ {
458
+ method: 'POST',
459
+ headers: {
460
+ 'Content-Type': 'application/json',
461
+ },
462
+ credentials: 'include',
463
+ },
464
+ );
465
+ return { status: response.status, json: await response.json() };
466
+ },
467
+ unlinkDimension: async function (nodeName, columnName, dimensionName) {
468
+ const response = await fetch(
469
+ `${DJ_URL}/nodes/${nodeName}/columns/${columnName}?dimension=${dimensionName}`,
470
+ {
471
+ method: 'DELETE',
472
+ headers: {
473
+ 'Content-Type': 'application/json',
474
+ },
475
+ credentials: 'include',
476
+ },
477
+ );
478
+ return { status: response.status, json: await response.json() };
479
+ },
480
+ deactivate: async function (nodeName) {
481
+ const response = await fetch(`${DJ_URL}/nodes/${nodeName}`, {
482
+ method: 'DELETE',
483
+ headers: {
484
+ 'Content-Type': 'application/json',
485
+ },
486
+ credentials: 'include',
487
+ });
488
+ return { status: response.status, json: await response.json() };
489
+ },
419
490
  };