Details.tsx 4.1 KB

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