datajunction-ui 0.0.1-a107 → 0.0.1-a109
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 +1 -1
- package/src/app/pages/CubeBuilderPage/DimensionsSelect.jsx +8 -10
- package/src/app/pages/CubeBuilderPage/MetricsSelect.jsx +6 -8
- package/src/app/pages/CubeBuilderPage/__tests__/index.test.jsx +39 -71
- package/src/app/pages/CubeBuilderPage/index.jsx +31 -7
- package/src/app/services/DJService.js +53 -0
package/package.json
CHANGED
|
@@ -30,16 +30,14 @@ export const DimensionsSelect = ({ cube }) => {
|
|
|
30
30
|
const fetchData = async () => {
|
|
31
31
|
let cubeDimensions = undefined;
|
|
32
32
|
if (cube) {
|
|
33
|
-
cubeDimensions = cube?.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
};
|
|
42
|
-
});
|
|
33
|
+
cubeDimensions = cube?.current.cubeDimensions.map(cubeDim => {
|
|
34
|
+
return {
|
|
35
|
+
value: cubeDim.name,
|
|
36
|
+
label:
|
|
37
|
+
labelize(cubeDim.attribute) +
|
|
38
|
+
(cubeDim.properties?.includes('primary_key') ? ' (PK)' : ''),
|
|
39
|
+
};
|
|
40
|
+
});
|
|
43
41
|
setDefaultDimensions(cubeDimensions);
|
|
44
42
|
setValue(cubeDimensions.map(m => m.value));
|
|
45
43
|
}
|
|
@@ -24,14 +24,12 @@ export const MetricsSelect = ({ cube }) => {
|
|
|
24
24
|
useEffect(() => {
|
|
25
25
|
const fetchData = async () => {
|
|
26
26
|
if (cube) {
|
|
27
|
-
const cubeMetrics = cube?.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
};
|
|
34
|
-
});
|
|
27
|
+
const cubeMetrics = cube?.current.cubeMetrics.map(metric => {
|
|
28
|
+
return {
|
|
29
|
+
value: metric.name,
|
|
30
|
+
label: metric.name,
|
|
31
|
+
};
|
|
32
|
+
});
|
|
35
33
|
setDefaultMetrics(cubeMetrics);
|
|
36
34
|
await setValue(cubeMetrics.map(m => m.value));
|
|
37
35
|
}
|
|
@@ -10,10 +10,13 @@ const mockDjClient = {
|
|
|
10
10
|
createCube: jest.fn(),
|
|
11
11
|
namespaces: jest.fn(),
|
|
12
12
|
cube: jest.fn(),
|
|
13
|
+
getCubeForEditing: jest.fn(),
|
|
13
14
|
node: jest.fn(),
|
|
14
15
|
listTags: jest.fn(),
|
|
15
16
|
tagsNode: jest.fn(),
|
|
16
17
|
patchCube: jest.fn(),
|
|
18
|
+
users: jest.fn(),
|
|
19
|
+
whoami: jest.fn(),
|
|
17
20
|
};
|
|
18
21
|
|
|
19
22
|
const mockMetrics = [
|
|
@@ -23,81 +26,44 @@ const mockMetrics = [
|
|
|
23
26
|
];
|
|
24
27
|
|
|
25
28
|
const mockCube = {
|
|
26
|
-
node_revision_id: 102,
|
|
27
|
-
node_id: 33,
|
|
28
|
-
type: 'cube',
|
|
29
29
|
name: 'default.repair_orders_cube',
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
description: 'Repairs cube',
|
|
33
|
-
availability: null,
|
|
34
|
-
cube_elements: [
|
|
30
|
+
type: 'CUBE',
|
|
31
|
+
owners: [
|
|
35
32
|
{
|
|
36
|
-
|
|
37
|
-
display_name: 'Total Repair Cost',
|
|
38
|
-
node_name: 'default.total_repair_cost',
|
|
39
|
-
type: 'metric',
|
|
40
|
-
partition: null,
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
name: 'default_DOT_num_repair_orders',
|
|
44
|
-
display_name: 'Num Repair Orders',
|
|
45
|
-
node_name: 'default.num_repair_orders',
|
|
46
|
-
type: 'metric',
|
|
47
|
-
partition: null,
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: 'country',
|
|
51
|
-
display_name: 'Country',
|
|
52
|
-
node_name: 'default.hard_hat',
|
|
53
|
-
type: 'dimension',
|
|
54
|
-
partition: null,
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
name: 'state',
|
|
58
|
-
display_name: 'State',
|
|
59
|
-
node_name: 'default.hard_hat',
|
|
60
|
-
type: 'dimension',
|
|
61
|
-
partition: null,
|
|
33
|
+
username: 'someone@example.com',
|
|
62
34
|
},
|
|
63
35
|
],
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
36
|
+
current: {
|
|
37
|
+
displayName: 'Default: Repair Orders Cube',
|
|
38
|
+
description: 'Repairs cube',
|
|
39
|
+
mode: 'DRAFT',
|
|
40
|
+
cubeMetrics: [
|
|
41
|
+
{
|
|
42
|
+
name: 'default.total_repair_cost',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'default.num_repair_orders',
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
cubeDimensions: [
|
|
49
|
+
{
|
|
50
|
+
name: 'default.hard_hat.country',
|
|
51
|
+
attribute: 'country',
|
|
52
|
+
properties: ['dimension'],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'default.hard_hat.state',
|
|
56
|
+
attribute: 'state',
|
|
57
|
+
properties: ['dimension'],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
tags: [
|
|
90
62
|
{
|
|
91
|
-
name: '
|
|
92
|
-
|
|
93
|
-
type: 'string',
|
|
94
|
-
attributes: [],
|
|
95
|
-
dimension: null,
|
|
96
|
-
partition: null,
|
|
63
|
+
name: 'repairs',
|
|
64
|
+
displayName: 'Repairs Domain',
|
|
97
65
|
},
|
|
98
66
|
],
|
|
99
|
-
updated_at: '2023-12-03T06:51:09.598532+00:00',
|
|
100
|
-
materializations: [],
|
|
101
67
|
};
|
|
102
68
|
|
|
103
69
|
const mockCommonDimensions = [
|
|
@@ -205,11 +171,12 @@ describe('CubeBuilderPage', () => {
|
|
|
205
171
|
mockDjClient.commonDimensions.mockResolvedValue(mockCommonDimensions);
|
|
206
172
|
mockDjClient.createCube.mockResolvedValue({ status: 201, json: {} });
|
|
207
173
|
mockDjClient.namespaces.mockResolvedValue(['default']);
|
|
208
|
-
mockDjClient.
|
|
209
|
-
mockDjClient.node.mockResolvedValue(mockCube);
|
|
174
|
+
mockDjClient.getCubeForEditing.mockResolvedValue(mockCube);
|
|
210
175
|
mockDjClient.listTags.mockResolvedValue([]);
|
|
211
176
|
mockDjClient.tagsNode.mockResolvedValue([]);
|
|
212
177
|
mockDjClient.patchCube.mockResolvedValue({ status: 201, json: {} });
|
|
178
|
+
mockDjClient.users.mockResolvedValue([{ username: 'dj' }]);
|
|
179
|
+
mockDjClient.whoami.mockResolvedValue({ username: 'dj' });
|
|
213
180
|
|
|
214
181
|
window.scrollTo = jest.fn();
|
|
215
182
|
});
|
|
@@ -342,7 +309,7 @@ describe('CubeBuilderPage', () => {
|
|
|
342
309
|
);
|
|
343
310
|
expect(screen.getAllByText('Edit')[0]).toBeInTheDocument();
|
|
344
311
|
await waitFor(() => {
|
|
345
|
-
expect(mockDjClient.
|
|
312
|
+
expect(mockDjClient.getCubeForEditing).toHaveBeenCalled();
|
|
346
313
|
});
|
|
347
314
|
await waitFor(() => {
|
|
348
315
|
expect(mockDjClient.metrics).toHaveBeenCalled();
|
|
@@ -399,6 +366,7 @@ describe('CubeBuilderPage', () => {
|
|
|
399
366
|
'default.date_dim.dateint',
|
|
400
367
|
],
|
|
401
368
|
[],
|
|
369
|
+
[],
|
|
402
370
|
);
|
|
403
371
|
});
|
|
404
372
|
});
|
|
@@ -12,6 +12,7 @@ import NodeNameField from '../../components/forms/NodeNameField';
|
|
|
12
12
|
import { MetricsSelect } from './MetricsSelect';
|
|
13
13
|
import { DimensionsSelect } from './DimensionsSelect';
|
|
14
14
|
import { TagsField } from '../AddEditNodePage/TagsField';
|
|
15
|
+
import { OwnersField } from '../AddEditNodePage/OwnersField';
|
|
15
16
|
|
|
16
17
|
export function CubeBuilderPage() {
|
|
17
18
|
const djClient = useContext(DJClientContext).DataJunctionAPI;
|
|
@@ -30,6 +31,7 @@ export function CubeBuilderPage() {
|
|
|
30
31
|
dimensions: [],
|
|
31
32
|
filters: [],
|
|
32
33
|
tags: [],
|
|
34
|
+
owners: [],
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
const handleSubmit = (values, { setSubmitting, setStatus }) => {
|
|
@@ -85,6 +87,7 @@ export function CubeBuilderPage() {
|
|
|
85
87
|
values.metrics,
|
|
86
88
|
values.dimensions,
|
|
87
89
|
values.filters || [],
|
|
90
|
+
values.owners,
|
|
88
91
|
);
|
|
89
92
|
const tagsResponse = await djClient.tagsNode(
|
|
90
93
|
values.name,
|
|
@@ -106,10 +109,15 @@ export function CubeBuilderPage() {
|
|
|
106
109
|
}
|
|
107
110
|
};
|
|
108
111
|
|
|
109
|
-
const updateFieldsWithNodeData = (
|
|
110
|
-
|
|
111
|
-
setFieldValue
|
|
112
|
-
|
|
112
|
+
const updateFieldsWithNodeData = (
|
|
113
|
+
data,
|
|
114
|
+
setFieldValue,
|
|
115
|
+
setSelectTags,
|
|
116
|
+
setSelectOwners,
|
|
117
|
+
) => {
|
|
118
|
+
setFieldValue('display_name', data.current.displayName || '', false);
|
|
119
|
+
setFieldValue('description', data.current.description || '', false);
|
|
120
|
+
setFieldValue('mode', data.current.mode.toLowerCase() || 'draft', false);
|
|
113
121
|
setFieldValue(
|
|
114
122
|
'tags',
|
|
115
123
|
data.tags.map(tag => tag.name),
|
|
@@ -119,10 +127,19 @@ export function CubeBuilderPage() {
|
|
|
119
127
|
setSelectTags(
|
|
120
128
|
<TagsField
|
|
121
129
|
defaultValue={data.tags.map(t => {
|
|
122
|
-
return { value: t.name, label: t.
|
|
130
|
+
return { value: t.name, label: t.displayName };
|
|
123
131
|
})}
|
|
124
132
|
/>,
|
|
125
133
|
);
|
|
134
|
+
if (data.owners) {
|
|
135
|
+
setSelectOwners(
|
|
136
|
+
<OwnersField
|
|
137
|
+
defaultValue={data.owners.map(owner => {
|
|
138
|
+
return { value: owner.username, label: owner.username };
|
|
139
|
+
})}
|
|
140
|
+
/>,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
126
143
|
};
|
|
127
144
|
|
|
128
145
|
const staticFieldsInEdit = () => (
|
|
@@ -159,14 +176,20 @@ export function CubeBuilderPage() {
|
|
|
159
176
|
{function Render({ isSubmitting, status, setFieldValue, props }) {
|
|
160
177
|
const [node, setNode] = useState([]);
|
|
161
178
|
const [selectTags, setSelectTags] = useState(null);
|
|
179
|
+
const [selectOwners, setSelectOwners] = useState(null);
|
|
162
180
|
|
|
163
181
|
// Get cube
|
|
164
182
|
useEffect(() => {
|
|
165
183
|
const fetchData = async () => {
|
|
166
184
|
if (name) {
|
|
167
|
-
const cube = await djClient.
|
|
185
|
+
const cube = await djClient.getCubeForEditing(name);
|
|
168
186
|
setNode(cube);
|
|
169
|
-
updateFieldsWithNodeData(
|
|
187
|
+
updateFieldsWithNodeData(
|
|
188
|
+
cube,
|
|
189
|
+
setFieldValue,
|
|
190
|
+
setSelectTags,
|
|
191
|
+
setSelectOwners,
|
|
192
|
+
);
|
|
170
193
|
}
|
|
171
194
|
};
|
|
172
195
|
fetchData().catch(console.error);
|
|
@@ -243,6 +266,7 @@ export function CubeBuilderPage() {
|
|
|
243
266
|
</Field>
|
|
244
267
|
</div>
|
|
245
268
|
{action === Action.Edit ? selectTags : <TagsField />}
|
|
269
|
+
{action === Action.Edit ? selectOwners : <OwnersField />}
|
|
246
270
|
<button
|
|
247
271
|
type="submit"
|
|
248
272
|
disabled={isSubmitting}
|
|
@@ -224,6 +224,57 @@ export const DataJunctionAPI = {
|
|
|
224
224
|
return results.data.findNodes[0];
|
|
225
225
|
},
|
|
226
226
|
|
|
227
|
+
getCubeForEditing: async function (name) {
|
|
228
|
+
const query = `
|
|
229
|
+
query GetCubeForEditing($name: String!) {
|
|
230
|
+
findNodes(names: [$name]) {
|
|
231
|
+
name
|
|
232
|
+
type
|
|
233
|
+
owners {
|
|
234
|
+
username
|
|
235
|
+
}
|
|
236
|
+
current {
|
|
237
|
+
displayName
|
|
238
|
+
description
|
|
239
|
+
mode
|
|
240
|
+
cubeMetrics {
|
|
241
|
+
name
|
|
242
|
+
}
|
|
243
|
+
cubeDimensions {
|
|
244
|
+
name
|
|
245
|
+
attribute
|
|
246
|
+
properties
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
tags {
|
|
250
|
+
name
|
|
251
|
+
displayName
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
`;
|
|
256
|
+
|
|
257
|
+
const results = await (
|
|
258
|
+
await fetch(DJ_GQL, {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: {
|
|
261
|
+
'Content-Type': 'application/json',
|
|
262
|
+
},
|
|
263
|
+
credentials: 'include',
|
|
264
|
+
body: JSON.stringify({
|
|
265
|
+
query,
|
|
266
|
+
variables: {
|
|
267
|
+
name: name,
|
|
268
|
+
},
|
|
269
|
+
}),
|
|
270
|
+
})
|
|
271
|
+
).json();
|
|
272
|
+
if (results.data.findNodes.length === 0) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
return results.data.findNodes[0];
|
|
276
|
+
},
|
|
277
|
+
|
|
227
278
|
nodes: async function (prefix) {
|
|
228
279
|
const queryParams = prefix ? `?prefix=${prefix}` : '';
|
|
229
280
|
return await (
|
|
@@ -396,6 +447,7 @@ export const DataJunctionAPI = {
|
|
|
396
447
|
metrics,
|
|
397
448
|
dimensions,
|
|
398
449
|
filters,
|
|
450
|
+
owners,
|
|
399
451
|
) {
|
|
400
452
|
const response = await fetch(`${DJ_URL}/nodes/${name}`, {
|
|
401
453
|
method: 'PATCH',
|
|
@@ -409,6 +461,7 @@ export const DataJunctionAPI = {
|
|
|
409
461
|
dimensions: dimensions,
|
|
410
462
|
filters: filters || [],
|
|
411
463
|
mode: mode,
|
|
464
|
+
owners: owners,
|
|
412
465
|
}),
|
|
413
466
|
credentials: 'include',
|
|
414
467
|
});
|