servicesComponent.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React, { Component } from "react";
  2. import * as ReactDom from "react-dom/client";
  3. import DataTable from 'datatables.net-react';
  4. import {HostnameServiceDescription, Service} from "../../src/models/service";
  5. import menu from "./menu";
  6. interface SingleServiceProp {
  7. hostname: string;
  8. serviceName: string;
  9. status: string;
  10. }
  11. interface SystemServiceState {
  12. loading: boolean;
  13. }
  14. interface SystemServiceProps {
  15. data: SingleServiceProp[];
  16. }
  17. export class SystemServiceComponent extends Component<SystemServiceProps, SystemServiceState> {
  18. public constructor(props: SystemServiceProps) {
  19. super(props);
  20. this.state = {
  21. loading: false,
  22. };
  23. menu.addFilterEventListener(() => {
  24. this.refreshFilter();
  25. });
  26. }
  27. private refreshFilter() {
  28. // FIXME
  29. /*
  30. const hidden = this.isFiltered();
  31. if (hidden === this.state.hidden)
  32. return;
  33. this.setState({...this.state, hidden: hidden});
  34. */
  35. }
  36. public render(): React.JSX.Element {
  37. if (this.state.loading)
  38. return (<>Loading..</>);
  39. else if (this.props.data === null)
  40. return (<>Error</>);
  41. return (<>
  42. <DataTable options={{
  43. layout: { topEnd: null },
  44. columnDefs: [
  45. { target: 0, columnControl: { target: 0, content: [ "order", [ "searchList" ] ] } },
  46. { target: 1, columnControl: { target: 0, content: [ "order", [ "search" ] ] } },
  47. { target: 2, columnControl: { target: 0, content: [ "order", [ "searchList" ] ] } }
  48. ],
  49. pageLength: 20,
  50. lengthMenu: [10, 20, 50, 100, -1],
  51. ordering: {
  52. indicators: false,
  53. handler: false
  54. }
  55. }} data={this.props.data.map(x => [ x.hostname, x.serviceName, x.status ])}>
  56. <thead><tr>
  57. <th>Host</th>
  58. <th>Service Name</th>
  59. <th>Status</th>
  60. </tr></thead>
  61. </DataTable>
  62. </>);
  63. }
  64. public static renderMultiple(container: HTMLElement, data: HostnameServiceDescription): void {
  65. const dataArray: SingleServiceProp[] = Object.keys(data).reduce((acc: SingleServiceProp[], hostname: string): SingleServiceProp[] => {
  66. return acc.concat(data[hostname]!.map((x: Service) : SingleServiceProp => { return { hostname: hostname, serviceName: x.name, status: x.statusText }}));
  67. }, []);
  68. ReactDom.createRoot(container).render(<SystemServiceComponent data={dataArray}/>);
  69. }
  70. }