Home Reference Source

src/components/HostList/index.js

import React from 'react';
import { Table } from 'antd';
import NewMetricModal from './NewMetricModal';
import MetadataCell from './MetadataCell';
import MetricCell from './MetricCell';
import MonitorIcon from '../MonitorIcon';

import {Hostname as HostnameFiltered} from './FilteredTable/Hostname';
import {Metrics as MetricsFiltered} from './FilteredTable/Metrics';
import {Metadata as MetadataFiltered} from './FilteredTable/Metadata';

import './index.less';

class HostList extends React.Component
{
    constructor(props) {
        super(props);
        this.state = this.getInitialState();
    }

    getInitialState = () => ({
        hostToAddMetric: null
    });

    UNSAFE_componentWillReceiveProps(nextProps) {
        if(this.props !== nextProps) {
            this.setState(this.getInitialState());
        }
    }

    showModal = (hostname) => {
        const hostToAddMetric = this.props.hosts.find(host => host.hostname === hostname);
        if(typeof hostToAddMetric !== 'undefined') {
            this.setState({
                hostToAddMetric
            });
        }
    };

    closeModal = () => {
        this.setState({
            hostToAddMetric: null
        });
    };

    allMetadata = (hosts) => {
        const metadata = {};
        hosts.forEach((host) => {
            host.metadata.forEach((singleMetadata) => {
                metadata[singleMetadata.id] = singleMetadata;
            });
        });
        return metadata;
    };

    allMetrics = (hosts) => {
        const base = {}, complex = {};
        hosts.forEach((host) => {
            host.metrics.forEach((metric) => {
                if(metric.parent_id === null) {
                    base[metric.id] = metric.id;
                } else {
                    complex[metric.id] = metric.id;
                }
            });
        });
        return {
            base,
            complex
        };
    };

    render() {
        const columns = [{
            title: 'Host',
            dataIndex: 'displayName',
            key: 'hostname',
            width: '26%',
            render: (hostname, host) => <span><MonitorIcon>{host.monitor}</MonitorIcon> {hostname}</span>
        }, {
            title: 'Metadane',
            dataIndex: 'metadata',
            key: 'metadata',
            width: '37%',
            render: (metadata) => <MetadataCell metadata={metadata}/>,
        }, {
            title: 'Metryki',
            dataIndex: 'metrics',
            key: 'metrics',
            width: '37%',
            render: (metrics, host) => <MetricCell
                onShowModal={this.showModal} onRemove={this.props.onRemoveMetric} host={host}
            />,
        }];

        const hosts = this.props.hosts.map(host => ({
            ...host,
            key: host.hostname,
            displayName: host.hostname
        }));

        return (
            <div className="host-list">
                <NewMetricModal
                    host={this.state.hostToAddMetric} onAddMetric={this.props.onAddMetric} onClose={this.closeModal}
                />
                <HostnameFiltered dataSource={hosts} columns={columns}>
                    <MetricsFiltered metrics={this.allMetrics(this.props.hosts)}>
                        <MetadataFiltered metadata={this.allMetadata(this.props.hosts)}>
                            <Table size="middle" bordered={true} />
                        </MetadataFiltered>
                    </MetricsFiltered>
                </HostnameFiltered>
            </div>
        );
    }
}

export default HostList;