ClusterMenu.tsx 2.0 KB

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