datajunction-ui 0.0.1-a44 → 0.0.1-a44.dev1

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.1a44",
3
+ "version": "0.0.1-a44.dev1",
4
4
  "description": "DataJunction Metrics Platform UI",
5
5
  "module": "src/index.tsx",
6
6
  "repository": {
@@ -61,7 +61,7 @@ export const DimensionsSelect = ({ cube }) => {
61
61
 
62
62
  // Set the selected cube dimensions if an existing cube is being edited
63
63
  if (cube) {
64
- const currentSelectedDimensionsByGroup = selectedDimensionsByGroup;
64
+ const currentSelectedDimensionsByGroup = {};
65
65
  grouped.forEach(grouping => {
66
66
  const dimensionsInGroup = grouping[1];
67
67
  currentSelectedDimensionsByGroup[dimensionsInGroup[0].node_name] =
@@ -69,7 +69,6 @@ export const MetricsSelect = ({ cube }) => {
69
69
  isMulti
70
70
  isClearable
71
71
  closeMenuOnSelect={false}
72
- isDisabled={!!(values.metrics.length && values.dimensions.length)}
73
72
  />
74
73
  );
75
74
  }
@@ -8,6 +8,7 @@ import { displayMessageAfterSubmit } from '../../../utils/form';
8
8
 
9
9
  export default function LinkDimensionPopover({
10
10
  column,
11
+ referencedDimensionNode,
11
12
  node,
12
13
  options,
13
14
  onSubmit,
@@ -28,15 +29,15 @@ export default function LinkDimensionPopover({
28
29
  };
29
30
  }, [setPopoverAnchor]);
30
31
 
31
- const columnDimension = column.dimension;
32
+ const columnDimension = referencedDimensionNode;
32
33
 
33
34
  const handleSubmit = async (
34
35
  { node, column, dimension },
35
36
  { setSubmitting, setStatus },
36
37
  ) => {
37
38
  setSubmitting(false);
38
- if (columnDimension?.name && dimension === 'Remove') {
39
- await unlinkDimension(node, column, columnDimension?.name, setStatus);
39
+ if (referencedDimensionNode && dimension === 'Remove') {
40
+ await unlinkDimension(node, column, referencedDimensionNode, setStatus);
40
41
  } else {
41
42
  await linkDimension(node, column, dimension, setStatus);
42
43
  }
@@ -93,7 +94,7 @@ export default function LinkDimensionPopover({
93
94
  column: column.name,
94
95
  node: node.name,
95
96
  dimension: '',
96
- currentDimension: column.dimension?.name,
97
+ currentDimension: referencedDimensionNode,
97
98
  }}
98
99
  onSubmit={handleSubmit}
99
100
  >
@@ -110,10 +111,10 @@ export default function LinkDimensionPopover({
110
111
  placeholder="Select dimension to link"
111
112
  className=""
112
113
  defaultValue={
113
- column.dimension
114
+ referencedDimensionNode
114
115
  ? {
115
- value: column.dimension.name,
116
- label: column.dimension.name,
116
+ value: referencedDimensionNode,
117
+ label: referencedDimensionNode,
117
118
  }
118
119
  : ''
119
120
  }
@@ -12,6 +12,8 @@ export default function NodeColumnTab({ node, djClient }) {
12
12
  const [attributes, setAttributes] = useState([]);
13
13
  const [dimensions, setDimensions] = useState([]);
14
14
  const [columns, setColumns] = useState([]);
15
+ const [links, setLinks] = useState([]);
16
+
15
17
  useEffect(() => {
16
18
  const fetchData = async () => {
17
19
  setColumns(await djClient.columns(node));
@@ -88,92 +90,103 @@ export default function NodeColumnTab({ node, djClient }) {
88
90
  };
89
91
 
90
92
  const columnList = columns => {
91
- return columns.map(col => (
92
- <tr key={col.name}>
93
- <td
94
- className="text-start"
95
- role="columnheader"
96
- aria-label="ColumnName"
97
- aria-hidden="false"
98
- >
99
- {col.name}
100
- </td>
101
- <td>
102
- <span
103
- className=""
104
- role="columnheader"
105
- aria-label="ColumnDisplayName"
106
- aria-hidden="false"
107
- >
108
- {col.display_name}
109
- </span>
110
- </td>
111
- <td>
112
- <span
113
- className={`node_type__${
114
- node.type === 'cube' ? col.type : 'transform'
115
- } badge node_type`}
93
+ return columns.map(col => {
94
+ const dimensionLinks = (links.length > 0 ? links : node?.dimension_links)
95
+ .map(link => [
96
+ link.dimension.name,
97
+ Object.entries(link.foreign_keys).filter(
98
+ entry => entry[0] === node.name + '.' + col.name,
99
+ ),
100
+ ])
101
+ .filter(keys => keys[1].length >= 1);
102
+ const referencedDimensionNode =
103
+ dimensionLinks.length > 0 ? dimensionLinks[0][0] : null;
104
+ return (
105
+ <tr key={col.name}>
106
+ <td
107
+ className="text-start"
116
108
  role="columnheader"
117
- aria-label="ColumnType"
109
+ aria-label="ColumnName"
118
110
  aria-hidden="false"
119
111
  >
120
- {col.type}
121
- </span>
122
- </td>
123
- {node.type !== 'cube' ? (
112
+ {col.name}
113
+ </td>
124
114
  <td>
125
- {col.dimension !== undefined && col.dimension !== null ? (
126
- <>
127
- <a href={`/nodes/${col.dimension.name}`}>
128
- {col.dimension.name}
129
- </a>
130
- <ClientCodePopover code={col.clientCode} />
131
- </>
132
- ) : (
133
- ''
134
- )}{' '}
135
- <LinkDimensionPopover
136
- column={col}
137
- node={node}
138
- options={dimensions}
139
- onSubmit={async () => {
140
- const res = await djClient.node(node.name);
141
- setColumns(res.columns);
142
- }}
143
- />
115
+ <span
116
+ className=""
117
+ role="columnheader"
118
+ aria-label="ColumnDisplayName"
119
+ aria-hidden="false"
120
+ >
121
+ {col.display_name}
122
+ </span>
123
+ </td>
124
+ <td>
125
+ <span
126
+ className={`node_type__${
127
+ node.type === 'cube' ? col.type : 'transform'
128
+ } badge node_type`}
129
+ role="columnheader"
130
+ aria-label="ColumnType"
131
+ aria-hidden="false"
132
+ >
133
+ {col.type}
134
+ </span>
144
135
  </td>
145
- ) : (
146
- ''
147
- )}
148
- {node.type !== 'cube' ? (
136
+ {node.type !== 'cube' ? (
137
+ <td>
138
+ {referencedDimensionNode !== null ? (
139
+ <a href={`/nodes/${referencedDimensionNode}`}>
140
+ {referencedDimensionNode}
141
+ </a>
142
+ ) : (
143
+ ''
144
+ )}
145
+ <LinkDimensionPopover
146
+ column={col}
147
+ referencedDimensionNode={referencedDimensionNode}
148
+ node={node}
149
+ options={dimensions}
150
+ onSubmit={async () => {
151
+ const res = await djClient.node(node.name);
152
+ setColumns(res.columns);
153
+ setLinks(res.dimension_links);
154
+ }}
155
+ />
156
+ </td>
157
+ ) : (
158
+ ''
159
+ )}
160
+ {node.type !== 'cube' ? (
161
+ <td>
162
+ {showColumnAttributes(col)}
163
+ <EditColumnPopover
164
+ column={col}
165
+ node={node}
166
+ options={attributes}
167
+ onSubmit={async () => {
168
+ const res = await djClient.node(node.name);
169
+ setColumns(res.columns);
170
+ }}
171
+ />
172
+ </td>
173
+ ) : (
174
+ ''
175
+ )}
149
176
  <td>
150
- {showColumnAttributes(col)}
151
- <EditColumnPopover
177
+ {showColumnPartition(col)}
178
+ <PartitionColumnPopover
152
179
  column={col}
153
180
  node={node}
154
- options={attributes}
155
181
  onSubmit={async () => {
156
182
  const res = await djClient.node(node.name);
157
183
  setColumns(res.columns);
158
184
  }}
159
185
  />
160
186
  </td>
161
- ) : (
162
- ''
163
- )}
164
- <td>
165
- {showColumnPartition(col)}
166
- <PartitionColumnPopover
167
- column={col}
168
- node={node}
169
- onSubmit={async () => {
170
- const res = await djClient.node(node.name);
171
- setColumns(res.columns);
172
- }}
173
- />
174
- </td>
175
- </tr>
176
- ));
187
+ </tr>
188
+ );
189
+ });
177
190
  };
178
191
 
179
192
  return (
@@ -42,6 +42,7 @@ describe('<LinkDimensionPopover />', () => {
42
42
  <DJClientContext.Provider value={mockDjClient}>
43
43
  <LinkDimensionPopover
44
44
  column={column}
45
+ referencedDimensionNode={'default.dimension1'}
45
46
  node={node}
46
47
  options={options}
47
48
  onSubmit={onSubmitMock}
@@ -94,7 +95,6 @@ describe('<LinkDimensionPopover />', () => {
94
95
  };
95
96
  const node = { name: 'default.node1' };
96
97
  const options = [
97
- { value: 'Remove', label: '[Remove dimension link]' },
98
98
  { value: 'default.dimension1', label: 'Dimension 1' },
99
99
  { value: 'default.dimension2', label: 'Dimension 2' },
100
100
  ];
@@ -117,6 +117,7 @@ describe('<LinkDimensionPopover />', () => {
117
117
  <DJClientContext.Provider value={mockDjClient}>
118
118
  <LinkDimensionPopover
119
119
  column={column}
120
+ referencedDimensionNode={'default.dimension1'}
120
121
  node={node}
121
122
  options={options}
122
123
  onSubmit={onSubmitMock}
@@ -148,7 +149,7 @@ describe('<LinkDimensionPopover />', () => {
148
149
 
149
150
  // Click on the 'Remove' option and save
150
151
  fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' });
151
- fireEvent.click(screen.getByText('[Remove dimension link]'));
152
+ fireEvent.click(screen.getByText('[Remove Dimension]'));
152
153
  fireEvent.click(getByText('Save'));
153
154
  getByText('Save').click();
154
155
 
@@ -98,6 +98,10 @@ describe('<NodeColumnTab />', () => {
98
98
  'default.contractor.contractor_id = default.repair_orders.contractor_id',
99
99
  join_cardinality: 'one_to_one',
100
100
  role: 'contractor',
101
+ foreign_keys: {
102
+ 'default.repair_orders.contractor_id':
103
+ 'default.contractor.contractor_id',
104
+ },
101
105
  },
102
106
  ],
103
107
  };
@@ -24,11 +24,19 @@ export function Root() {
24
24
  <div className="container d-flex align-items-center justify-content-between">
25
25
  <div className="header">
26
26
  <div className="logo">
27
- <a href={'/'} style={{textTransform: 'none', textDecoration: 'none', color: '#000'}}>
27
+ <a
28
+ href={'/'}
29
+ style={{
30
+ textTransform: 'none',
31
+ textDecoration: 'none',
32
+ color: '#000',
33
+ }}
34
+ >
28
35
  <h2>
29
- <DJLogo />
30
- Data<b>Junction</b>
31
- </h2></a>
36
+ <DJLogo />
37
+ Data<b>Junction</b>
38
+ </h2>
39
+ </a>
32
40
  </div>
33
41
  <Search />
34
42
  <div className="menu">