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.
- package/package.json +6 -5
- package/src/__tests__/reportWebVitals.test.jsx +44 -0
- package/src/app/components/DeleteNode.jsx +79 -0
- package/src/app/components/ListGroupItem.jsx +8 -1
- package/src/app/components/QueryInfo.jsx +4 -4
- package/src/app/components/Tab.jsx +9 -1
- package/src/app/components/ToggleSwitch.jsx +3 -0
- package/src/app/components/__tests__/QueryInfo.test.jsx +55 -0
- package/src/app/components/__tests__/Tab.test.jsx +27 -0
- package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
- package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +3 -0
- package/src/app/components/djgraph/DJNodeColumns.jsx +4 -1
- package/src/app/components/djgraph/DJNodeDimensions.jsx +9 -2
- package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
- package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
- package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
- package/src/app/index.tsx +6 -0
- package/src/app/pages/AddEditNodePage/FormikSelect.jsx +15 -2
- package/src/app/pages/AddEditNodePage/FullNameField.jsx +2 -1
- package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +77 -0
- package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +93 -0
- package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +34 -3
- package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +4 -2
- package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +53 -0
- package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +53 -0
- package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +0 -81
- package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +82 -257
- package/src/app/pages/AddEditNodePage/index.jsx +13 -5
- package/src/app/pages/LoginPage/__tests__/index.test.jsx +70 -0
- package/src/app/pages/NamespacePage/__tests__/index.test.jsx +95 -0
- package/src/app/pages/NamespacePage/index.jsx +8 -5
- package/src/app/pages/NodePage/ClientCodePopover.jsx +3 -1
- package/src/app/pages/NodePage/EditColumnPopover.jsx +102 -0
- package/src/app/pages/NodePage/LinkDimensionPopover.jsx +135 -0
- package/src/app/pages/NodePage/NodeColumnTab.jsx +80 -17
- package/src/app/pages/NodePage/NodeHistory.jsx +63 -30
- package/src/app/pages/NodePage/NodeInfoTab.jsx +52 -7
- package/src/app/pages/NodePage/NodeMaterializationTab.jsx +50 -27
- package/src/app/pages/NodePage/NodeSQLTab.jsx +0 -10
- package/src/app/pages/NodePage/NodesWithDimension.jsx +4 -2
- package/src/app/pages/NodePage/__tests__/ClientCodePopover.test.jsx +49 -0
- package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +148 -0
- package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +165 -0
- package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +591 -0
- package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +57 -0
- package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +725 -0
- package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
- package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +402 -0
- package/src/app/pages/NodePage/index.jsx +22 -6
- package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
- package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
- package/src/app/pages/RegisterTablePage/index.jsx +163 -0
- package/src/app/pages/Root/__tests__/index.test.jsx +77 -0
- package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
- package/src/app/pages/SQLBuilderPage/index.jsx +61 -43
- package/src/app/services/DJService.js +125 -54
- package/src/app/services/__tests__/DJService.test.jsx +609 -0
- package/src/mocks/mockNodes.jsx +1397 -0
- package/src/setupTests.ts +30 -0
- package/src/styles/index.css +43 -0
- package/src/styles/node-creation.scss +7 -0
- package/src/utils/form.jsx +23 -0
- package/.github/pull_request_template.md +0 -11
- package/.github/workflows/ci.yml +0 -33
- package/src/app/pages/NamespacePage/__tests__/__snapshots__/index.test.tsx.snap +0 -118
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
await fetch(`${DJ_URL}/nodes
|
|
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
|
-
|
|
125
|
-
await fetch(`${DJ_URL}/nodes
|
|
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
|
-
|
|
134
|
-
await fetch(`${DJ_URL}/nodes
|
|
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
|
-
|
|
143
|
-
await fetch(`${DJ_URL}/metrics
|
|
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
|
-
|
|
152
|
-
await fetch(`${DJ_URL}/datajunction-clients/python/new_node
|
|
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
|
-
|
|
161
|
-
await fetch(`${DJ_URL}/cubes
|
|
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
|
-
|
|
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
|
-
|
|
180
|
-
await fetch(`${DJ_URL}/metrics/common/dimensions
|
|
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
|
-
|
|
200
|
+
return await (
|
|
189
201
|
await fetch(
|
|
190
|
-
`${DJ_URL}/history?node
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
203
|
-
await fetch(`${DJ_URL}/nodes
|
|
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
|
-
|
|
212
|
-
await fetch(`${DJ_URL}/namespaces
|
|
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
|
-
|
|
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
|
-
|
|
237
|
+
return await (
|
|
230
238
|
await fetch(
|
|
231
|
-
`${DJ_URL}/sql
|
|
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
|
-
|
|
242
|
-
await fetch(`${DJ_URL}/dimensions
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|