Details.tsx 4.1 KB

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