-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathSchemaViewer.tsx
96 lines (80 loc) · 3.01 KB
/
SchemaViewer.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
90
91
92
93
94
95
96
import React from 'react';
import DataTable from '@gravity-ui/react-data-table';
import {skipToken} from '@reduxjs/toolkit/query';
import {ResizeableDataTable} from '../../../../components/ResizeableDataTable/ResizeableDataTable';
import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton';
import {useGetSchemaQuery} from '../../../../store/reducers/schema/schema';
import {viewSchemaApi} from '../../../../store/reducers/viewSchema/viewSchema';
import type {EPathType} from '../../../../types/api/schema';
import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants';
import {
isColumnEntityType,
isExternalTableType,
isRowTableType,
isViewType,
} from '../../utils/schema';
import {
SCHEMA_COLUMNS_WIDTH_LS_KEY,
SCHEMA_TABLE_COLUMS_IDS,
getColumnTableColumns,
getExternalTableColumns,
getRowTableColumns,
getViewColumns,
} from './columns';
import {prepareSchemaData, prepareViewSchema} from './prepareData';
import {b} from './shared';
import './SchemaViewer.scss';
interface SchemaViewerProps {
type?: EPathType;
path: string;
tenantName: string;
extended?: boolean;
}
export const SchemaViewer = ({type, path, tenantName, extended = false}: SchemaViewerProps) => {
const {data: schemaData, isLoading: loading} = useGetSchemaQuery({path, database: tenantName});
const viewSchemaRequestParams = isViewType(type) ? {path, database: tenantName} : skipToken;
const {data: viewColumnsData, isLoading: isViewSchemaLoading} =
viewSchemaApi.useGetViewSchemaQuery(viewSchemaRequestParams);
const tableData = React.useMemo(() => {
if (isViewType(type)) {
return prepareViewSchema(viewColumnsData);
}
return prepareSchemaData(type, schemaData);
}, [schemaData, type, viewColumnsData]);
const hasAutoIncrement = React.useMemo(() => {
return tableData.some((i) => i.autoIncrement);
}, [tableData]);
const columns = React.useMemo(() => {
if (isViewType(type)) {
return getViewColumns();
}
if (isExternalTableType(type)) {
return getExternalTableColumns();
}
if (isColumnEntityType(type)) {
return getColumnTableColumns();
}
if (isRowTableType(type)) {
return getRowTableColumns(extended, hasAutoIncrement);
}
return [];
}, [type, extended, hasAutoIncrement]);
const renderContent = () => {
if (loading || isViewSchemaLoading) {
return <TableSkeleton />;
}
return (
<ResizeableDataTable
columnsWidthLSKey={SCHEMA_COLUMNS_WIDTH_LS_KEY}
data={tableData}
columns={columns}
settings={DEFAULT_TABLE_SETTINGS}
initialSortOrder={{
columnId: SCHEMA_TABLE_COLUMS_IDS.isKeyColumn,
order: DataTable.ASCENDING,
}}
/>
);
};
return <div className={b(null)}>{renderContent()}</div>;
};