servicesComponent.tsx 2.9 KB

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