import { Button, ButtonGroup, Code, HTMLTable, Intent, NonIdealState, Spinner } from "@blueprintjs/core"; import { push } from "connected-react-router"; import { range } from "lodash"; import * as numeral from "numeral"; import React from "react"; import { connect } from "react-redux"; import { Dispatch } from "redux"; import styled from "styled-components"; import { loadInstanceList } from "../../redux/actions"; import { IAppState, IInstanceListResponse } from "../../redux/types"; import { InstanceType } from "../atoms"; import { ErrorState } from "../molecules"; const StyledTable = styled(HTMLTable)` width: 100%; `; const PaginationContainer = styled.div` margin-top: 20px; display: flex; flex-direction: column; flex: 1; align-items: center; `; interface IInstanceTableProps { loadError: boolean; instancesResponse?: IInstanceListResponse; isLoading: boolean; fetchInstances: (page?: number) => void; navigate: (path: string) => void; } class InstanceTable extends React.PureComponent { public componentDidMount() { const { isLoading, instancesResponse, loadError } = this.props; if (!isLoading && !instancesResponse && !loadError) { this.props.fetchInstances(); } } public render() { const { isLoading, instancesResponse, loadError } = this.props; if (loadError) { return ; } else if (isLoading || !instancesResponse) { return } />; } const { instances, pageNumber, totalPages, totalEntries, pageSize } = instancesResponse!; return ( <> Instance Server type Version Users Statuses Insularity {instances.map(i => ( {i.name} {i.type && } {i.version && {i.version}} {i.userCount} {i.statusCount} {i.insularity && numeral.default(i.insularity).format("0.0%")} ))}

Showing {(pageNumber - 1) * pageSize + 1}-{Math.min(pageNumber * pageSize, totalEntries)} of {totalEntries}{" "} known instances

{range(totalPages).map(n => { const isCurrentPage = pageNumber === n + 1; return ( ); })}
); } private loadPageFactory = (page: number) => () => { this.props.fetchInstances(page); }; private goToInstanceFactory = (domain: string) => () => { this.props.navigate(`/instance/${domain}`); }; } const mapStateToProps = (state: IAppState) => { return { instancesResponse: state.data.instancesResponse, isLoading: state.data.isLoadingInstanceList, loadError: state.data.instanceListLoadError }; }; const mapDispatchToProps = (dispatch: Dispatch) => ({ fetchInstances: (page?: number) => dispatch(loadInstanceList(page) as any), navigate: (path: string) => dispatch(push(path)) }); export default connect( mapStateToProps, mapDispatchToProps )(InstanceTable);