ClusterMenu.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React from 'react';
  2. import { Cluster, ClusterFeaturesEnum } from 'generated-sources';
  3. import { NavLink } from 'react-router-dom';
  4. import {
  5. clusterBrokersPath,
  6. clusterTopicsPath,
  7. clusterConsumerGroupsPath,
  8. clusterSchemasPath,
  9. clusterConnectorsPath,
  10. clusterConnectsPath,
  11. clusterKsqlDbPath,
  12. } from 'lib/paths';
  13. import ClusterMenuItem from './ClusterMenuItem/ClusterMenuItem';
  14. import DefaultClusterIcon from './DefaultClusterIcon';
  15. import ClusterStatusIcon from './ClusterStatusIcon';
  16. interface Props {
  17. cluster: Cluster;
  18. }
  19. const ClusterMenu: React.FC<Props> = ({
  20. cluster: { name, status, defaultCluster, features },
  21. }) => {
  22. const hasFeatureConfigured = React.useCallback(
  23. (key) => features?.includes(key),
  24. [features]
  25. );
  26. return (
  27. <ul className="menu-list">
  28. <li>
  29. <NavLink
  30. exact
  31. to={clusterBrokersPath(name)}
  32. title={name}
  33. className="has-text-overflow-ellipsis"
  34. >
  35. {defaultCluster && <DefaultClusterIcon />}
  36. {name}
  37. <ClusterStatusIcon status={status} />
  38. </NavLink>
  39. <ul>
  40. <li>
  41. <NavLink
  42. to={clusterBrokersPath(name)}
  43. activeClassName="is-active"
  44. title="Brokers"
  45. >
  46. Brokers
  47. </NavLink>
  48. </li>
  49. <ClusterMenuItem
  50. liType="primary"
  51. to={clusterTopicsPath(name)}
  52. activeClassName="is-active"
  53. title="Topics"
  54. >
  55. Topics
  56. </ClusterMenuItem>
  57. <li>
  58. <NavLink
  59. to={clusterConsumerGroupsPath(name)}
  60. activeClassName="is-active"
  61. title="Consumers"
  62. >
  63. Consumers
  64. </NavLink>
  65. </li>
  66. {hasFeatureConfigured(ClusterFeaturesEnum.SCHEMA_REGISTRY) && (
  67. <li>
  68. <NavLink
  69. to={clusterSchemasPath(name)}
  70. activeClassName="is-active"
  71. title="Schema Registry"
  72. >
  73. Schema Registry
  74. </NavLink>
  75. </li>
  76. )}
  77. {hasFeatureConfigured(ClusterFeaturesEnum.KAFKA_CONNECT) && (
  78. <li>
  79. <NavLink
  80. to={clusterConnectorsPath(name)}
  81. activeClassName="is-active"
  82. title="Kafka Connect"
  83. isActive={(_, location) =>
  84. location.pathname.startsWith(clusterConnectsPath(name)) ||
  85. location.pathname.startsWith(clusterConnectorsPath(name))
  86. }
  87. >
  88. Kafka Connect
  89. </NavLink>
  90. </li>
  91. )}
  92. {hasFeatureConfigured(ClusterFeaturesEnum.KSQL_DB) && (
  93. <li>
  94. <NavLink
  95. to={clusterKsqlDbPath(name)}
  96. activeClassName="is-active"
  97. title="KSQL DB"
  98. >
  99. KSQL DB
  100. </NavLink>
  101. </li>
  102. )}
  103. </ul>
  104. </li>
  105. </ul>
  106. );
  107. };
  108. export default ClusterMenu;