/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import './nodes_table.scss'; import React, { useMemo, useCallback, useState } from 'react'; import { EuiBasicTable, Direction, CriteriaWithPagination, EuiHealth, EuiEmptyPrompt, EuiCopy, EuiText, } from '@elastic/eui'; import { INode } from './'; export function NodesTable(props: { nodes: INode[]; loading: boolean }) { const { nodes, loading } = props; const [sort, setSort] = useState<{ field: keyof INode; direction: Direction }>({ field: 'deployed', direction: 'asc', }); const [pageOptions, setPageOptions] = useState({ index: 0, size: 10, }); const items = useMemo(() => { const { field, direction } = sort; const { index, size } = pageOptions; const sortedNodes = nodes.sort((a, b) => { if (field === 'id') { const compareResult = a.id.localeCompare(b.id); return direction === 'asc' ? compareResult : -compareResult; } if (field === 'deployed') { return direction === 'asc' ? Number(a.deployed) - Number(b.deployed) : Number(b.deployed) - Number(a.deployed); } return 0; }); const startIndex = index * size; const endIndex = (index + 1) * size; const result = sortedNodes.slice(startIndex, endIndex); return result; }, [sort, pageOptions, nodes]); const columns = useMemo( () => [ { field: 'deployed', name: 'Status', sortable: true, render: (deployed: boolean) => { const color = deployed ? 'success' : 'danger'; const label = deployed ? 'Responding' : 'Not responding'; return {label}; }, }, { field: 'id', name: 'Node ID', sortable: true, render: (id: string) => { return ( {(copy) => ( {id} )} ); }, }, ], [] ); const pagination = useMemo( () => ({ pageIndex: pageOptions.index, pageSize: pageOptions.size, totalItemCount: nodes.length, pageSizeOptions: [10, 20, 50], showPerPageOptions: true, }), [pageOptions, nodes] ); const handleTableChange = useCallback( ({ sort: newSort, page }: CriteriaWithPagination) => { const { index, size } = page; setPageOptions({ index, size }); if (newSort) { setSort({ field: newSort.field, direction: newSort.direction, }); } }, [] ); return ( columns={columns} items={items} sorting={{ sort }} pagination={pagination} onChange={handleTableChange} loading={loading} noItemsMessage={ loading ? Loading...} aria-label="loading nodes" /> : undefined } /> ); }