@truedat/dd 4.42.3 → 4.42.6
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/CHANGELOG.md +12 -0
- package/package.json +6 -6
- package/src/components/LineageGraph.js +149 -73
- package/src/components/LineageLink.js +22 -4
- package/src/messages/en.js +2 -0
- package/src/messages/es.js +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.42.6] 2022-04-25
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- [TD-2026] Fix `linage graph` empty metada condition
|
|
8
|
+
|
|
9
|
+
## [4.42.5] 2022-04-22
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- [TD-2026] Add metadata to `linage graph`
|
|
14
|
+
|
|
3
15
|
## [4.41.2] 2022-03-30
|
|
4
16
|
|
|
5
17
|
### Fixed
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truedat/dd",
|
|
3
|
-
"version": "4.42.
|
|
3
|
+
"version": "4.42.6",
|
|
4
4
|
"description": "Truedat Web Data Dictionary",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"jsnext:main": "src/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@testing-library/jest-dom": "^5.14.1",
|
|
35
35
|
"@testing-library/react": "^12.0.0",
|
|
36
36
|
"@testing-library/user-event": "^13.2.1",
|
|
37
|
-
"@truedat/test": "4.42.
|
|
37
|
+
"@truedat/test": "4.42.6",
|
|
38
38
|
"babel-jest": "^27.0.6",
|
|
39
39
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
40
40
|
"babel-plugin-lodash": "^3.3.4",
|
|
@@ -84,9 +84,9 @@
|
|
|
84
84
|
]
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
|
87
|
-
"@truedat/auth": "4.42.
|
|
88
|
-
"@truedat/core": "4.42.
|
|
89
|
-
"@truedat/df": "4.42.
|
|
87
|
+
"@truedat/auth": "4.42.6",
|
|
88
|
+
"@truedat/core": "4.42.6",
|
|
89
|
+
"@truedat/df": "4.42.6",
|
|
90
90
|
"lodash": "^4.17.21",
|
|
91
91
|
"path-to-regexp": "^1.7.0",
|
|
92
92
|
"prop-types": "^15.7.2",
|
|
@@ -107,5 +107,5 @@
|
|
|
107
107
|
"react-dom": ">= 16.8.6 < 17",
|
|
108
108
|
"semantic-ui-react": ">= 0.88.2 < 2.1"
|
|
109
109
|
},
|
|
110
|
-
"gitHead": "
|
|
110
|
+
"gitHead": "3dda251b557b530f73e81cd12c70af259a93e421"
|
|
111
111
|
}
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
|
-
import React, { useRef, useEffect, useReducer } from "react";
|
|
2
|
+
import React, { useRef, useEffect, useReducer, useState } from "react";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import { connect } from "react-redux";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
Dimmer,
|
|
7
|
+
Loader,
|
|
8
|
+
Segment,
|
|
9
|
+
Header,
|
|
10
|
+
Button,
|
|
11
|
+
Grid,
|
|
12
|
+
Divider,
|
|
13
|
+
} from "semantic-ui-react";
|
|
6
14
|
import svgPanZoom from "svg-pan-zoom";
|
|
7
15
|
import { FormattedMessage, useIntl } from "react-intl";
|
|
16
|
+
|
|
8
17
|
import {
|
|
9
18
|
clearNode,
|
|
10
19
|
selectNode,
|
|
@@ -64,6 +73,9 @@ export const LineageGraph = ({
|
|
|
64
73
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
65
74
|
const { selectedNode, hover, svg } = state;
|
|
66
75
|
|
|
76
|
+
const [metadata, setMetadata] = useState(null);
|
|
77
|
+
const [selectedLink, selectLink] = useState(null);
|
|
78
|
+
|
|
67
79
|
useEffect(() => {
|
|
68
80
|
// Anything in here is fired on component mount.
|
|
69
81
|
return () => cancelPoll();
|
|
@@ -84,78 +96,110 @@ export const LineageGraph = ({
|
|
|
84
96
|
const { formatMessage } = useIntl();
|
|
85
97
|
|
|
86
98
|
return (
|
|
87
|
-
|
|
88
|
-
<
|
|
89
|
-
<
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
/>
|
|
95
|
-
{loadingInfo?.data?.graph_hash && loadingInfo?.data?.status && (
|
|
96
|
-
<p>
|
|
97
|
-
{formatMessage({
|
|
98
|
-
id:
|
|
99
|
-
_.toLower(loadingInfo?.data?.status) === "already_started"
|
|
100
|
-
? "lineage.graph.loading.background.existing"
|
|
101
|
-
: _.toLower(loadingInfo?.data?.status) ===
|
|
102
|
-
"just_started" &&
|
|
103
|
-
"lineage.graph.loading.background.launched",
|
|
104
|
-
})}
|
|
105
|
-
</p>
|
|
106
|
-
)}
|
|
107
|
-
{loadingInfo?.data?.graph_hash && (
|
|
108
|
-
<p>
|
|
109
|
-
Graph hash:{" "}
|
|
110
|
-
<span className="graph-hash">
|
|
111
|
-
{loadingInfo?.data?.graph_hash}
|
|
112
|
-
</span>
|
|
113
|
-
</p>
|
|
114
|
-
)}
|
|
115
|
-
<p>
|
|
116
|
-
{loadingInfo?.data?.retry &&
|
|
117
|
-
formatMessage(
|
|
118
|
-
{ id: "lineage.graph.loading.polling" },
|
|
119
|
-
{ retry: loadingInfo?.data?.retry }
|
|
120
|
-
)}
|
|
121
|
-
</p>
|
|
122
|
-
</Loader>
|
|
123
|
-
</Dimmer>
|
|
124
|
-
<svg
|
|
125
|
-
width="100%"
|
|
126
|
-
height={height}
|
|
127
|
-
ref={ref}
|
|
128
|
-
onClick={() => dispatch(selectNode.trigger(null))}
|
|
99
|
+
<Grid>
|
|
100
|
+
<Grid.Row columns={2}>
|
|
101
|
+
<Grid.Column
|
|
102
|
+
width={_.isNull(metadata) || _.isEmpty(metadata) ? 16 : 12}
|
|
103
|
+
style={
|
|
104
|
+
_.isNull(metadata) || _.isEmpty(metadata) ? {} : { paddingRight: 0 }
|
|
105
|
+
}
|
|
129
106
|
>
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
107
|
+
<Dimmer.Dimmable dimmed={loading} className="dl">
|
|
108
|
+
<Dimmer active={loading} inverted>
|
|
109
|
+
<Loader size="large">
|
|
110
|
+
<FormattedMessage
|
|
111
|
+
id="lineage.graph.loading"
|
|
112
|
+
defaultMessage={"Analyzing..."}
|
|
113
|
+
/>
|
|
114
|
+
{loadingInfo?.data?.graph_hash && loadingInfo?.data?.status && (
|
|
115
|
+
<p>
|
|
116
|
+
{formatMessage({
|
|
117
|
+
id:
|
|
118
|
+
_.toLower(loadingInfo?.data?.status) ===
|
|
119
|
+
"already_started"
|
|
120
|
+
? "lineage.graph.loading.background.existing"
|
|
121
|
+
: _.toLower(loadingInfo?.data?.status) ===
|
|
122
|
+
"just_started" &&
|
|
123
|
+
"lineage.graph.loading.background.launched",
|
|
124
|
+
})}
|
|
125
|
+
</p>
|
|
126
|
+
)}
|
|
127
|
+
{loadingInfo?.data?.graph_hash && (
|
|
128
|
+
<p>
|
|
129
|
+
Graph hash:{" "}
|
|
130
|
+
<span className="graph-hash">
|
|
131
|
+
{loadingInfo?.data?.graph_hash}
|
|
132
|
+
</span>
|
|
133
|
+
</p>
|
|
134
|
+
)}
|
|
135
|
+
<p>
|
|
136
|
+
{loadingInfo?.data?.retry &&
|
|
137
|
+
formatMessage(
|
|
138
|
+
{ id: "lineage.graph.loading.polling" },
|
|
139
|
+
{ retry: loadingInfo?.data?.retry }
|
|
140
|
+
)}
|
|
141
|
+
</p>
|
|
142
|
+
</Loader>
|
|
143
|
+
</Dimmer>
|
|
144
|
+
<svg
|
|
145
|
+
width="100%"
|
|
146
|
+
height={height}
|
|
147
|
+
ref={ref}
|
|
148
|
+
onClick={() => dispatch(selectNode.trigger(null))}
|
|
149
|
+
style={{ border: "1px solid #d4d4d5", borderRadius: "5px" }}
|
|
150
|
+
>
|
|
151
|
+
<LineageDefs />
|
|
152
|
+
<g className="svg-pan-zoom_viewport">
|
|
153
|
+
{_.map.convert({ cap: false })((g, i) => (
|
|
154
|
+
<LineageGroup
|
|
155
|
+
key={i}
|
|
156
|
+
active={hover === g.id}
|
|
157
|
+
onHover={onHover(g.id)}
|
|
158
|
+
onClick={onSelect(g)}
|
|
159
|
+
selected={selectedNode === g}
|
|
160
|
+
{...g}
|
|
161
|
+
/>
|
|
162
|
+
))(groups)}
|
|
163
|
+
{_.map.convert({ cap: false })((g, i) => (
|
|
164
|
+
<LineageResource
|
|
165
|
+
key={i}
|
|
166
|
+
active={hover === g.id}
|
|
167
|
+
onHover={onHover(g.id)}
|
|
168
|
+
onClick={onSelect(g)}
|
|
169
|
+
selected={selectedNode === g}
|
|
170
|
+
{...g}
|
|
171
|
+
/>
|
|
172
|
+
))(resources)}
|
|
173
|
+
{_.map.convert({ cap: false })((p, i) => (
|
|
174
|
+
<LineageLink
|
|
175
|
+
key={i}
|
|
176
|
+
active
|
|
177
|
+
selected={selectedLink === i}
|
|
178
|
+
path={p.path}
|
|
179
|
+
metadata={p.metadata}
|
|
180
|
+
onClick={(metadata) => {
|
|
181
|
+
setMetadata(metadata);
|
|
182
|
+
selectLink(i);
|
|
183
|
+
}}
|
|
184
|
+
/>
|
|
185
|
+
))(paths)}
|
|
186
|
+
</g>
|
|
187
|
+
</svg>
|
|
188
|
+
</Dimmer.Dimmable>
|
|
189
|
+
</Grid.Column>
|
|
190
|
+
{_.isNull(metadata) || _.isEmpty(metadata) ? null : (
|
|
191
|
+
<Grid.Column width={4} style={{ maxHeight: 300 }}>
|
|
192
|
+
<LinageMetadata
|
|
193
|
+
metadata={metadata}
|
|
194
|
+
onClose={() => {
|
|
195
|
+
setMetadata(null);
|
|
196
|
+
selectLink(null);
|
|
197
|
+
}}
|
|
198
|
+
/>
|
|
199
|
+
</Grid.Column>
|
|
200
|
+
)}
|
|
201
|
+
</Grid.Row>
|
|
202
|
+
</Grid>
|
|
159
203
|
);
|
|
160
204
|
};
|
|
161
205
|
|
|
@@ -186,3 +230,35 @@ const mapStateToProps = (
|
|
|
186
230
|
export default connect(mapStateToProps, { clearNode, cancelPoll })(
|
|
187
231
|
LineageGraph
|
|
188
232
|
);
|
|
233
|
+
|
|
234
|
+
export const LinageMetadata = ({ metadata, onClose }) => {
|
|
235
|
+
const { formatMessage } = useIntl();
|
|
236
|
+
const content = _.flow(
|
|
237
|
+
_.toPairs,
|
|
238
|
+
_.map(([key, value]) => (
|
|
239
|
+
<div key={key}>
|
|
240
|
+
<b>{key}:</b>
|
|
241
|
+
<p>{value}</p>
|
|
242
|
+
<Divider fitted />
|
|
243
|
+
</div>
|
|
244
|
+
))
|
|
245
|
+
)(metadata);
|
|
246
|
+
|
|
247
|
+
return (
|
|
248
|
+
<Segment secondary>
|
|
249
|
+
<Header>
|
|
250
|
+
{" "}
|
|
251
|
+
{formatMessage({ id: "lineage.graph.metadata.header" })}{" "}
|
|
252
|
+
</Header>
|
|
253
|
+
<div style={{ maxHeight: "400px", overflowY: "auto" }}>{content}</div>
|
|
254
|
+
<Button
|
|
255
|
+
onClick={onClose}
|
|
256
|
+
content={formatMessage({ id: "lineage.graph.metadata.close.button" })}
|
|
257
|
+
/>
|
|
258
|
+
</Segment>
|
|
259
|
+
);
|
|
260
|
+
};
|
|
261
|
+
LinageMetadata.propTypes = {
|
|
262
|
+
metadata: PropTypes.object,
|
|
263
|
+
onClose: PropTypes.func,
|
|
264
|
+
};
|
|
@@ -1,13 +1,31 @@
|
|
|
1
|
+
import _ from "lodash/fp";
|
|
1
2
|
import React from "react";
|
|
2
3
|
import PropTypes from "prop-types";
|
|
3
4
|
|
|
4
|
-
export const LineageLink = ({
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
export const LineageLink = ({
|
|
6
|
+
active = false,
|
|
7
|
+
path,
|
|
8
|
+
metadata,
|
|
9
|
+
onClick,
|
|
10
|
+
selected,
|
|
11
|
+
}) => {
|
|
12
|
+
return _.isNull(metadata) || _.isEmpty(metadata) ? (
|
|
13
|
+
<path className={active ? "active link" : "link"} d={path} />
|
|
14
|
+
) : (
|
|
15
|
+
<path
|
|
16
|
+
className={
|
|
17
|
+
active ? (selected ? "active link metadata" : "link metadata") : "link"
|
|
18
|
+
}
|
|
19
|
+
d={path}
|
|
20
|
+
onClick={() => onClick(metadata)}
|
|
21
|
+
/>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
7
24
|
|
|
8
25
|
LineageLink.propTypes = {
|
|
9
26
|
active: PropTypes.bool,
|
|
10
|
-
path: PropTypes.string.isRequired
|
|
27
|
+
path: PropTypes.string.isRequired,
|
|
28
|
+
onClick: PropTypes.func,
|
|
11
29
|
};
|
|
12
30
|
|
|
13
31
|
export default LineageLink;
|
package/src/messages/en.js
CHANGED
|
@@ -129,6 +129,8 @@ export default {
|
|
|
129
129
|
"lineage.graph.status.just_started": "Just started",
|
|
130
130
|
"lineage.graph.status.started": "Started",
|
|
131
131
|
"lineage.graph.status.timed_out": "Timed out",
|
|
132
|
+
"lineage.graph.metadata.header": "Information",
|
|
133
|
+
"lineage.graph.metadata.close.button": "Close",
|
|
132
134
|
"lineage.group.placeholder": "Select Top Level Structure",
|
|
133
135
|
"lineage.resources.placeholder": "Select Child Structures",
|
|
134
136
|
"lineage.subgroup.placeholder": "Select Child Structure",
|
package/src/messages/es.js
CHANGED
|
@@ -132,6 +132,8 @@ export default {
|
|
|
132
132
|
"lineage.graph.status.just_started": "Acaba de iniciarse",
|
|
133
133
|
"lineage.graph.status.started": "Iniciado",
|
|
134
134
|
"lineage.graph.status.timed_out": "Tiempo de espera máximo sobrepasado",
|
|
135
|
+
"lineage.graph.metadata.header": "Información",
|
|
136
|
+
"lineage.graph.metadata.close.button": "Cerrar",
|
|
135
137
|
"lineage.group.placeholder": "Seleccionar Estructura Padre",
|
|
136
138
|
"lineage.resources.placeholder": "Seleccionar Estructuras Hijos",
|
|
137
139
|
"lineage.subgroup.placeholder": "Seleccionar Estructura Hijo",
|