client/app/components/queries/SchemaData.jsx (130 lines of code) (raw):
import { some } from "lodash";
import React from "react";
import PropTypes from "prop-types";
import Drawer from "antd/lib/drawer";
import Table from "antd/lib/table";
import { DataSourceMetadata, Query } from "@/components/proptypes";
function textWrapRenderer(text) {
return <div style={{ wordWrap: "break-word", wordBreak: "break-all" }}>{text}</div>;
}
export default class SchemaData extends React.PureComponent {
static propTypes = {
show: PropTypes.bool.isRequired,
onClose: PropTypes.func.isRequired,
tableName: PropTypes.string,
tableDescription: PropTypes.string,
tableMetadata: PropTypes.arrayOf(DataSourceMetadata),
sampleQueries: PropTypes.arrayOf(Query),
};
static defaultProps = {
tableName: "",
tableDescription: "",
tableMetadata: [],
sampleQueries: [],
};
render() {
const tableDataColumns = [
{
title: "Metadata",
dataIndex: "metadata",
width: 400,
key: "metadata",
},
{
title: "Value",
dataIndex: "value",
width: 400,
key: "value",
render: text => {
if (typeof text === "string") {
return text;
}
return (
<ul style={{ margin: 0, paddingLeft: "15px" }}>
{Object.values(text).map(query => (
<li>
<a target="_blank" rel="noopener noreferrer" href={`queries/${query.id}/source`}>
{query.name}
</a>
</li>
))}
</ul>
);
},
},
];
const columnDataColumns = [
{
title: "Column Name",
dataIndex: "name",
width: 400,
key: "name",
render: textWrapRenderer,
},
{
title: "Column Type",
dataIndex: "type",
width: 400,
key: "type",
render: textWrapRenderer,
},
];
const hasDescription = some(this.props.tableMetadata, columnMetadata => columnMetadata.description);
const hasExample = some(this.props.tableMetadata, columnMetadata => columnMetadata.example);
if (hasDescription) {
columnDataColumns.push({
title: "Description",
dataIndex: "description",
width: 400,
key: "description",
render: textWrapRenderer,
});
}
if (hasExample) {
columnDataColumns.push({
title: "Example",
dataIndex: "example",
width: 400,
key: "example",
render: textWrapRenderer,
});
}
const tableData = [
{
metadata: "Table Description",
value: this.props.tableDescription || "N/A",
key: "description",
},
{
metadata: "Sample Usage",
value: this.props.sampleQueries.length > 0 ? this.props.sampleQueries : "N/A",
key: "sample",
},
];
return (
<Drawer closable={false} placement="bottom" height={500} onClose={this.props.onClose} visible={this.props.show}>
<h4 style={{ margin: 0 }}>{this.props.tableName}</h4>
<hr />
<h5>Table Data</h5>
<Table
dataSource={tableData}
pagination={false}
scroll={{ y: 350 }}
size="small"
showHeader={false}
columns={tableDataColumns}
/>
<br />
<h5>Column Data</h5>
<Table
dataSource={this.props.tableMetadata}
pagination={false}
scroll={{ y: 175 }}
size="small"
rowKey="id"
columns={columnDataColumns}
/>
</Drawer>
);
}
}