Details.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import React from 'react';
  2. import { useHistory } from 'react-router';
  3. import { SchemaSubject } from 'generated-sources';
  4. import { ClusterName, SchemaName } from 'redux/interfaces';
  5. import { clusterSchemasPath, clusterSchemaSchemaEditPath } from 'lib/paths';
  6. import Breadcrumb from 'components/common/Breadcrumb/Breadcrumb';
  7. import ClusterContext from 'components/contexts/ClusterContext';
  8. import { Link } from 'react-router-dom';
  9. import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal';
  10. import PageLoader from 'components/common/PageLoader/PageLoader';
  11. import SchemaVersion from './SchemaVersion';
  12. import LatestVersionItem from './LatestVersionItem';
  13. export interface DetailsProps {
  14. subject: SchemaName;
  15. schema: SchemaSubject;
  16. clusterName: ClusterName;
  17. versions: SchemaSubject[];
  18. areVersionsFetched: boolean;
  19. areSchemasFetched: boolean;
  20. fetchSchemaVersions: (
  21. clusterName: ClusterName,
  22. schemaName: SchemaName
  23. ) => void;
  24. fetchSchemasByClusterName: (clusterName: ClusterName) => void;
  25. deleteSchema: (clusterName: ClusterName, subject: string) => Promise<void>;
  26. }
  27. const Details: React.FC<DetailsProps> = ({
  28. subject,
  29. schema,
  30. clusterName,
  31. fetchSchemaVersions,
  32. fetchSchemasByClusterName,
  33. deleteSchema,
  34. versions,
  35. areVersionsFetched,
  36. areSchemasFetched,
  37. }) => {
  38. const { isReadOnly } = React.useContext(ClusterContext);
  39. const [
  40. isDeleteSchemaConfirmationVisible,
  41. setDeleteSchemaConfirmationVisible,
  42. ] = React.useState(false);
  43. React.useEffect(() => {
  44. fetchSchemasByClusterName(clusterName);
  45. fetchSchemaVersions(clusterName, subject);
  46. }, [fetchSchemaVersions, fetchSchemasByClusterName, clusterName]);
  47. const history = useHistory();
  48. const onDelete = React.useCallback(() => {
  49. deleteSchema(clusterName, subject);
  50. history.push(clusterSchemasPath(clusterName));
  51. }, [deleteSchema, clusterName, subject]);
  52. return (
  53. <div className="section">
  54. <div className="level">
  55. <Breadcrumb
  56. links={[
  57. {
  58. href: clusterSchemasPath(clusterName),
  59. label: 'Schema Registry',
  60. },
  61. ]}
  62. >
  63. {subject}
  64. </Breadcrumb>
  65. </div>
  66. {areVersionsFetched && areSchemasFetched ? (
  67. <>
  68. <div className="box">
  69. <div className="level">
  70. <div className="level-left">
  71. <div className="level-item">
  72. <div className="mr-1">
  73. <b>Latest Version</b>
  74. </div>
  75. <div className="tag is-info is-light" title="Version">
  76. #{schema.version}
  77. </div>
  78. </div>
  79. </div>
  80. {!isReadOnly && (
  81. <div className="level-right buttons">
  82. <Link
  83. className="button is-warning"
  84. type="button"
  85. to={clusterSchemaSchemaEditPath(clusterName, subject)}
  86. >
  87. Update Schema
  88. </Link>
  89. <button
  90. className="button is-danger"
  91. type="button"
  92. onClick={() => setDeleteSchemaConfirmationVisible(true)}
  93. >
  94. Remove
  95. </button>
  96. <ConfirmationModal
  97. isOpen={isDeleteSchemaConfirmationVisible}
  98. onCancel={() => setDeleteSchemaConfirmationVisible(false)}
  99. onConfirm={onDelete}
  100. >
  101. Are you sure want to remove <b>{subject}</b> schema?
  102. </ConfirmationModal>
  103. </div>
  104. )}
  105. </div>
  106. <LatestVersionItem schema={schema} />
  107. </div>
  108. <div className="box">
  109. <table className="table is-fullwidth">
  110. <thead>
  111. <tr>
  112. <th>Version</th>
  113. <th>ID</th>
  114. <th>Schema</th>
  115. </tr>
  116. </thead>
  117. <tbody>
  118. {versions.map((version) => (
  119. <SchemaVersion key={version.id} version={version} />
  120. ))}
  121. {versions.length === 0 && (
  122. <tr>
  123. <td colSpan={10}>No active Schema</td>
  124. </tr>
  125. )}
  126. </tbody>
  127. </table>
  128. </div>
  129. </>
  130. ) : (
  131. <PageLoader />
  132. )}
  133. </div>
  134. );
  135. };
  136. export default Details;