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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datajunction-ui",
3
- "version": "0.0.1a107",
3
+ "version": "0.0.1a109",
4
4
  "description": "DataJunction Metrics Platform UI",
5
5
  "module": "src/index.tsx",
6
6
  "repository": {
@@ -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?.cube_elements
34
- .filter(element => element.type === 'dimension')
35
- .map(cubeDim => {
36
- return {
37
- value: cubeDim.node_name + '.' + cubeDim.name,
38
- label:
39
- labelize(cubeDim.name) +
40
- (cubeDim.properties?.includes('primary_key') ? ' (PK)' : ''),
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?.cube_elements
28
- .filter(element => element.type === 'metric')
29
- .map(metric => {
30
- return {
31
- value: metric.node_name,
32
- label: metric.node_name,
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
- display_name: 'Default: Repair Orders Cube',
31
- version: 'v4.0',
32
- description: 'Repairs cube',
33
- availability: null,
34
- cube_elements: [
30
+ type: 'CUBE',
31
+ owners: [
35
32
  {
36
- name: 'default_DOT_total_repair_cost',
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
- query: '',
65
- columns: [
66
- {
67
- name: 'default.total_repair_cost',
68
- display_name: 'Total Repair Cost',
69
- type: 'double',
70
- attributes: [],
71
- dimension: null,
72
- partition: null,
73
- },
74
- {
75
- name: 'default.num_repair_orders',
76
- display_name: 'Num Repair Orders',
77
- type: 'bigint',
78
- attributes: [],
79
- dimension: null,
80
- partition: null,
81
- },
82
- {
83
- name: 'default.hard_hat.country',
84
- display_name: 'Country',
85
- type: 'string',
86
- attributes: [],
87
- dimension: null,
88
- partition: null,
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: 'default.hard_hat.state',
92
- display_name: 'State',
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.cube.mockResolvedValue(mockCube);
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.cube).toHaveBeenCalled();
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 = (data, setFieldValue, setSelectTags) => {
110
- setFieldValue('display_name', data.display_name || '', false);
111
- setFieldValue('description', data.description || '', false);
112
- setFieldValue('mode', data.mode || 'draft', false);
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.display_name };
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.cube(name);
185
+ const cube = await djClient.getCubeForEditing(name);
168
186
  setNode(cube);
169
- updateFieldsWithNodeData(cube, setFieldValue, setSelectTags);
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
  });