ClusterMenu.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import React, { CSSProperties } from 'react';
  2. import { NavLink } from 'react-router-dom';
  3. import {
  4. clusterBrokersPath,
  5. clusterTopicsPath,
  6. clusterConsumerGroupsPath,
  7. clusterSchemasPath,
  8. } from 'lib/paths';
  9. import { Cluster, ServerStatus } from 'generated-sources';
  10. interface Props {
  11. cluster: Cluster;
  12. }
  13. const DefaultIcon: React.FC = () => {
  14. const style: CSSProperties = {
  15. width: '.6rem',
  16. left: '-8px',
  17. top: '-4px',
  18. position: 'relative',
  19. };
  20. return (
  21. <span title="Default Cluster" className="icon has-text-primary is-small">
  22. <i
  23. style={style}
  24. data-fa-transform="rotate-340"
  25. className="fas fa-thumbtack"
  26. />
  27. </span>
  28. );
  29. };
  30. const StatusIcon: React.FC<Props> = ({ cluster }) => {
  31. const style: CSSProperties = {
  32. width: '10px',
  33. height: '10px',
  34. borderRadius: '5px',
  35. marginLeft: '7px',
  36. padding: 0,
  37. };
  38. return (
  39. <span
  40. className={`tag ${
  41. cluster.status === ServerStatus.ONLINE ? 'is-primary' : 'is-danger'
  42. }`}
  43. title={cluster.status}
  44. style={style}
  45. />
  46. );
  47. };
  48. const ClusterMenu: React.FC<Props> = ({ cluster }) => (
  49. <ul className="menu-list">
  50. <li>
  51. <NavLink
  52. exact
  53. to={clusterBrokersPath(cluster.name)}
  54. title={cluster.name}
  55. className="has-text-overflow-ellipsis"
  56. >
  57. {cluster.defaultCluster && <DefaultIcon />}
  58. {cluster.name}
  59. <StatusIcon cluster={cluster} />
  60. </NavLink>
  61. <ul>
  62. <NavLink
  63. to={clusterBrokersPath(cluster.name)}
  64. activeClassName="is-active"
  65. title="Brokers"
  66. >
  67. Brokers
  68. </NavLink>
  69. <NavLink
  70. to={clusterTopicsPath(cluster.name)}
  71. activeClassName="is-active"
  72. title="Topics"
  73. >
  74. Topics
  75. </NavLink>
  76. <NavLink
  77. to={clusterConsumerGroupsPath(cluster.name)}
  78. activeClassName="is-active"
  79. title="Consumers"
  80. >
  81. Consumers
  82. </NavLink>
  83. <NavLink
  84. to={clusterSchemasPath(cluster.name)}
  85. activeClassName="is-active"
  86. title="Schema Registry"
  87. >
  88. Schema Registry
  89. </NavLink>
  90. </ul>
  91. </li>
  92. </ul>
  93. );
  94. export default ClusterMenu;