import React, { Component, RefObject } from "react"; import * as ReactDom from "react-dom/client"; import { Api as DTApiType } from 'datatables.net'; import DataTable, {DataTableRef} from 'datatables.net-react'; import {HostnameServiceDescription, Service} from "../../src/models/service"; import menu from "./menu"; interface SingleServiceProp { hostname: string; serviceName: string; status: string; } interface SystemServiceProps { data: SingleServiceProp[]; } export class SystemServiceComponent extends Component { private dtRef: RefObject; public constructor(props: SystemServiceProps) { super(props); this.dtRef = React.createRef(); menu.addFilterEventListener(() => { this.onMenuFilter(); }); } private getDatatableApi(): DTApiType|null { return this.dtRef?.current?.dt() ?? null; } private onMenuFilter() { const dtApi = this.getDatatableApi(); const values = menu.getFilteredHostnames().join("|"); if (!dtApi) return; dtApi.search(""); dtApi.column(0).search(values, { regex: true }).draw(); } public componentDidMount() { this.onMenuFilter(); } public render(): React.JSX.Element { if (this.props.data === null) return (<>Error); let defaultSearch = menu.getFilteredHostnames().join("|"); return ( [ x.hostname, x.serviceName, x.status ])}> Host Service Name Status ); } public static renderMultiple(container: HTMLElement, data: HostnameServiceDescription): void { const dataArray: SingleServiceProp[] = Object.keys(data).reduce((acc: SingleServiceProp[], hostname: string): SingleServiceProp[] => { return acc.concat(data[hostname]!.map((x: Service) : SingleServiceProp => { return { hostname: hostname, serviceName: x.name, status: x.statusText }})); }, []); ReactDom.createRoot(container).render(); } }