frontend/app/ProxyHealth/ProxyHealthDash.jsx (163 lines of code) (raw):

import React from 'react'; import axios from 'axios'; import {HorizontalBar} from 'react-chartjs-2'; import ErrorViewComponent from '../common/ErrorViewComponent.jsx'; import AdminContainer from "../admin/AdminContainer"; import {Snackbar, createStyles, withStyles} from "@material-ui/core"; import MuiAlert from "@material-ui/lab/Alert"; const styles = createStyles({ chartContainerWide: { float: "left", width: "50vw", position: "relative", overflow: "hidden" }, chartContainer: { float: "left", width: "31vw", position: "relative" }, listControlLabel: { marginBottom: 0 } }); class ProxyHealthDash extends React.Component { static makeColourValues(count, offset){ let values = []; for(let n=0;n<count;++n){ let hue = (n/count)*360.0 + offset; values[n] = 'hsla(' + hue + ',75%,50%,0.6)' } return values; } static colourValues = ProxyHealthDash.makeColourValues(10,10); constructor(props){ super(props); this.state = { loading: false, proxyBreakdownData: {}, typeBreakdownData: {}, lastError: null, showingAlert: false } this.closeAlert = this.closeAlert.bind(this); } embellish(data){ return Object.assign({}, data, { datasets: data.datasets.map((dset,idx)=>Object.assign({}, dset, {backgroundColor: ProxyHealthDash.colourValues[idx]})), }) } componentDidMount(){ this.setState({loading: true}, ()=>axios.get("/api/search/proxyStats") .then(response=>{ const proxyBreakdownData = response.data.entries.filter(entry=>entry.name==="hasProxy"); const typeBreakdownData = response.data.entries.filter(entry=>entry.name==="mediaType"); this.setState({ loading: false, proxyBreakdownData: proxyBreakdownData.length>0 ? this.embellish(proxyBreakdownData[0]) : {}, typeBreakdownData: typeBreakdownData.length>0 ? this.embellish(typeBreakdownData[0]) : {} }); console.log(ProxyHealthDash.colourValues); console.log(proxyBreakdownData.length>0 ? this.embellish(proxyBreakdownData[0]) : {}); }) .catch(err=>{ console.error("could not load stats data: ", err); this.setState({ loading: false, lastError: err, showingAlert: true }); }) ) } closeAlert() { this.setState({showingAlert: false}); } render(){ return <AdminContainer {...this.props}> <Snackbar autoHideDuration={8000} onClose={this.closeAlert} open={this.state.showingAlert}> <MuiAlert severity="error" onClose={this.closeAlert}>{ErrorViewComponent.formatError(this.state.lastError)}</MuiAlert> </Snackbar> <div className={this.props.classes.chartContainerWide}> <HorizontalBar data={this.state.proxyBreakdownData} height={400} width={400} options={{ title: { display: true, fontColor:"rgba(255,255,255,1)", fontSize: 24, text: "Proxied or Not?" }, maintainAspectRatio: false, scales: { yAxes: [{ type: "category", gridLines: { display: true, color: "rgba(0,0,0,0.8)" }, ticks: { autoSkip: false, fontColor: "rgba(255,255,255,1)" }, stacked: true }], xAxes: [{ stacked: true, }] }, legend: { labels: { fontColor: "rgba(255,255,255,1)" }, position: "bottom" } }} /> </div> <div className={this.props.classes.chartContainer}> <HorizontalBar data={this.state.typeBreakdownData} height={400} width={200} options={{ title: { display: true, text: "Media Types by Collection", fontColor:"rgba(255,255,255,1)", fontSize: 24 }, maintainAspectRatio: false, scales: { yAxes: [{ type: "category", gridLines: { display: true, color: "rgba(0,0,0,0.8)" }, ticks: { autoSkip: false, fontColor: "rgba(255,255,255,1)" }, stacked: true }], xAxes: [{ stacked: true }] }, legend: { labels: { fontColor: "rgba(255,255,255,1)" }, position: "bottom" } }} /> </div> </AdminContainer> } } export default withStyles(styles)(ProxyHealthDash);