Skip to content

Commit 3bc9447

Browse files
authored
Schema Registry Views (#195)
* Schema Registry index page #183 * Schema Registry show page #196 * Specs #208 * New JsonViewer common component
1 parent 2c95928 commit 3bc9447

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2092
-83
lines changed

docker/kafka-ui.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ services:
3030
environment:
3131
ZOOKEEPER_CLIENT_PORT: 2181
3232
ZOOKEEPER_TICK_TIME: 2000
33+
ports:
34+
- 2181:2181
3335

3436
kafka0:
3537
image: confluentinc/cp-kafka:5.1.0

kafka-ui-react-app/package-lock.json

Lines changed: 47 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kafka-ui-react-app/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"private": true,
55
"dependencies": {
66
"@hookform/error-message": "0.0.5",
7-
"@types/node-fetch": "^2.5.8",
87
"bulma": "^0.9.2",
98
"bulma-switch": "^2.0.0",
109
"classnames": "^2.2.6",
@@ -22,6 +21,7 @@
2221
"react-json-tree": "^0.13.0",
2322
"react-multi-select-component": "^2.0.14",
2423
"react-redux": "^7.2.2",
24+
"react-router": "^5.2.0",
2525
"react-router-dom": "^5.2.0",
2626
"redux": "^4.0.5",
2727
"redux-thunk": "^2.3.0",
@@ -77,6 +77,7 @@
7777
"@types/jest": "^26.0.20",
7878
"@types/lodash": "^4.14.165",
7979
"@types/node": "^12.20.2",
80+
"@types/node-fetch": "^2.5.8",
8081
"@types/react": "^17.0.2",
8182
"@types/react-datepicker": "^3.1.1",
8283
"@types/react-dom": "^17.0.1",

kafka-ui-react-app/src/components/App.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import { Switch, Route, Redirect } from 'react-router-dom';
33
import './App.scss';
44
import BrokersContainer from './Brokers/BrokersContainer';
55
import TopicsContainer from './Topics/TopicsContainer';
6-
import NavConatiner from './Nav/NavConatiner';
6+
import NavContainer from './Nav/NavContainer';
77
import PageLoader from './common/PageLoader/PageLoader';
88
import Dashboard from './Dashboard/Dashboard';
99
import ConsumersGroupsContainer from './ConsumerGroups/ConsumersGroupsContainer';
10+
import SchemasContainer from './Schemas/SchemasContainer';
1011

1112
interface AppProps {
1213
isClusterListFetched: boolean;
@@ -35,7 +36,7 @@ const App: React.FC<AppProps> = ({
3536
</div>
3637
</nav>
3738
<main className="Layout__container">
38-
<NavConatiner className="Layout__navbar" />
39+
<NavContainer className="Layout__navbar" />
3940
{isClusterListFetched ? (
4041
<Switch>
4142
<Route
@@ -55,6 +56,10 @@ const App: React.FC<AppProps> = ({
5556
path="/ui/clusters/:clusterName/consumer-groups"
5657
component={ConsumersGroupsContainer}
5758
/>
59+
<Route
60+
path="/ui/clusters/:clusterName/schemas"
61+
component={SchemasContainer}
62+
/>
5863
<Redirect
5964
from="/ui/clusters/:clusterName"
6065
to="/ui/clusters/:clusterName/brokers"

kafka-ui-react-app/src/components/Nav/ClusterMenu.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
clusterBrokersPath,
55
clusterTopicsPath,
66
clusterConsumerGroupsPath,
7+
clusterSchemasPath,
78
} from 'lib/paths';
89
import { Cluster, ServerStatus } from 'generated-sources';
910

@@ -85,6 +86,13 @@ const ClusterMenu: React.FC<Props> = ({ cluster }) => (
8586
>
8687
Consumers
8788
</NavLink>
89+
<NavLink
90+
to={clusterSchemasPath(cluster.name)}
91+
activeClassName="is-active"
92+
title="Schema Registry"
93+
>
94+
Schema Registry
95+
</NavLink>
8896
</ul>
8997
</li>
9098
</ul>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import React from 'react';
2+
import { SchemaSubject } from 'generated-sources';
3+
import { ClusterName, SchemaName } from 'redux/interfaces';
4+
import { clusterSchemasPath } from 'lib/paths';
5+
import Breadcrumb from '../../common/Breadcrumb/Breadcrumb';
6+
import SchemaVersion from './SchemaVersion';
7+
import LatestVersionItem from './LatestVersionItem';
8+
import PageLoader from '../../common/PageLoader/PageLoader';
9+
10+
export interface DetailsProps {
11+
schema: SchemaSubject;
12+
clusterName: ClusterName;
13+
versions: SchemaSubject[];
14+
isFetched: boolean;
15+
fetchSchemaVersions: (
16+
clusterName: ClusterName,
17+
schemaName: SchemaName
18+
) => void;
19+
}
20+
21+
const Details: React.FC<DetailsProps> = ({
22+
schema,
23+
clusterName,
24+
fetchSchemaVersions,
25+
versions,
26+
isFetched,
27+
}) => {
28+
React.useEffect(() => {
29+
fetchSchemaVersions(clusterName, schema.subject as SchemaName);
30+
}, [fetchSchemaVersions, clusterName]);
31+
return (
32+
<div className="section">
33+
<div className="level">
34+
<Breadcrumb
35+
links={[
36+
{
37+
href: clusterSchemasPath(clusterName),
38+
label: 'Schema Registry',
39+
},
40+
]}
41+
>
42+
{schema.subject}
43+
</Breadcrumb>
44+
</div>
45+
<div className="box">
46+
<div className="level">
47+
<div className="level-left">
48+
<div className="level-item">
49+
<div className="mr-1">
50+
<b>Latest Version</b>
51+
</div>
52+
<div className="tag is-info is-light" title="Version">
53+
#{schema.version}
54+
</div>
55+
</div>
56+
</div>
57+
<div className="level-right">
58+
<button
59+
className="button is-primary is-small level-item"
60+
type="button"
61+
title="in development"
62+
disabled
63+
>
64+
Create Schema
65+
</button>
66+
<button
67+
className="button is-warning is-small level-item"
68+
type="button"
69+
title="in development"
70+
disabled
71+
>
72+
Update Schema
73+
</button>
74+
<button
75+
className="button is-danger is-small level-item"
76+
type="button"
77+
title="in development"
78+
disabled
79+
>
80+
Delete
81+
</button>
82+
</div>
83+
</div>
84+
<LatestVersionItem schema={schema} />
85+
</div>
86+
{isFetched ? (
87+
<div className="box">
88+
<table className="table is-striped is-fullwidth">
89+
<thead>
90+
<tr>
91+
<th>Version</th>
92+
<th>ID</th>
93+
<th>Schema</th>
94+
</tr>
95+
</thead>
96+
<tbody>
97+
{versions.map((version) => (
98+
<SchemaVersion key={version.id} version={version} />
99+
))}
100+
</tbody>
101+
</table>
102+
</div>
103+
) : (
104+
<PageLoader />
105+
)}
106+
</div>
107+
);
108+
};
109+
110+
export default Details;

0 commit comments

Comments
 (0)