diff --git a/src/ic/ic-pages/default-manager-page.js b/src/ic/ic-pages/default-manager-page.js new file mode 100644 index 0000000..d8065fb --- /dev/null +++ b/src/ic/ic-pages/default-manager-page.js @@ -0,0 +1,187 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {Col, Container, Row} from "react-bootstrap"; +import IconButton from "../../common/icon-button"; +import Table from '../../common/table'; +import TableColumn from '../../common/table-column'; + +class DefaultManagerPage extends React.Component { + + constructor() { + super(); + + this.state = { + managedICs: [], + } + } + + componentDidMount() { + let sortedICs = this.props.ics.filter(ic => ic.category !== "manager" && parseInt(ic.manager,10) === parseInt(this.props.ic.uuid,10)); + + this.setState({managedICs: sortedICs}); + } + + static calculateState(prevState, props) { + + let sortedICs = props.ics.filter(ic => ic.category !== "manager" && parseInt(ic.manager,10) === parseInt(props.ic.uuid,10)); + return { + managedICs: sortedICs + } + } + + stateLabelStyle(state, component){ + var style = [ 'badge' ]; + + switch (state) { + case 'error': + style.push('badge-danger'); + break; + case 'idle': + style.push('badge-primary'); + break; + case 'starting': + style.push('badge-info'); + break; + case 'running': + style.push('badge-success'); + break; + case 'pausing': + style.push('badge-info'); + break; + case 'paused': + style.push('badge-info'); + break; + case 'resuming': + style.push('badge-warning'); + break; + case 'stopping': + style.push('badge-warning'); + break; + case 'resetting': + style.push('badge-warning'); + break; + case 'shuttingdown': + style.push('badge-warning'); + break; + case 'shutdown': + style.push('badge-warning'); + break; + + default: + style.push('badge-default'); + + /* Possible states of ICs + * 'error': ['resetting', 'error'], + * 'idle': ['resetting', 'error', 'idle', 'starting', 'shuttingdown'], + * 'starting': ['resetting', 'error', 'running'], + * 'running': ['resetting', 'error', 'pausing', 'stopping'], + * 'pausing': ['resetting', 'error', 'paused'], + * 'paused': ['resetting', 'error', 'resuming', 'stopping'], + * 'resuming': ['resetting', 'error', 'running'], + * 'stopping': ['resetting', 'error', 'idle'], + * 'resetting': ['resetting', 'error', 'idle'], + * 'shuttingdown': ['shutdown', 'error'], + * 'shutdown': ['starting', 'error'] + */ + } + + return style.join(' ') + } + + stateUpdateModifier(updatedAt, component) { + let dateFormat = 'ddd, DD MMM YYYY HH:mm:ss ZZ'; + let dateTime = moment(updatedAt, dateFormat); + return dateTime.fromNow() + } + + modifyUptimeColumn(uptime, component){ + if(uptime >= 0){ + let momentDurationFormatSetup = require("moment-duration-format"); + momentDurationFormatSetup(moment) + + let timeString = moment.duration(uptime, "seconds").humanize(); + return {timeString} + } + else{ + return Unknown + } + } + + render() { + + return (
+ + +

{this.props.ic.name} + + + this.props.refresh(this.props.ic, this.props.sessionToken)} + icon='sync-alt' + buttonStyle={this.props.buttonStyle} + iconStyle={this.props.iconStyle} + /> + +

+ + + + + {this.props.ICParamsTable(this.props.ic)} + + +

Managed ICs:

+ + {this.props.currentUser.role === "Admin" ? + + : <> + } + + this.stateLabelStyle(state, component)} + /> + +
+ +
+
+
+ ) + + } + +} + +export default DefaultManagerPage; diff --git a/src/ic/ic.js b/src/ic/ic.js index 444d825..d591b54 100644 --- a/src/ic/ic.js +++ b/src/ic/ic.js @@ -26,6 +26,7 @@ import ReactJson from 'react-json-view'; import GatewayVillasNode from './ic-pages/gateway-villas-node' import ManagerVillasRelay from './ic-pages/manager-villas-relay' import DefaultICPage from './ic-pages/default-page' +import DefaultManagerPage from './ic-pages/default-manager-page'; class InfrastructureComponent extends React.Component { constructor(props) { @@ -43,6 +44,7 @@ class InfrastructureComponent extends React.Component { static calculateState(prevState, props) { return { + ics: ICstore.getState(), ic: ICstore.getState().find(ic => ic.id === parseInt(props.match.params.ic, 10)) } } @@ -57,6 +59,16 @@ class InfrastructureComponent extends React.Component { }); } + componentDidUpdate(prevProps: Readonly

, prevState: Readonly, snapshot: SS){ + + let icID = parseInt(this.props.match.params.ic, 10); + + if(typeof prevState !== "undefined" && typeof prevState.ic !== "undefined" && parseInt(prevState.ic.id, 10) !== icID){ + this.setState({ ic: ICstore.getState().find(ic => ic.id === icID)}); + } + + } + static refresh(ic, token) { // get status of VILLASnode and VILLASrelay ICs if (ic.apiurl !== '' && ic.apiurl !== undefined && ic.apiurl !== null && !ic.managedexternally) { @@ -146,7 +158,6 @@ class InfrastructureComponent extends React.Component { height: '25px', width: '25px' } - let page = <>IC page not defined if (this.state.ic.category ==="gateway" && this.state.ic.type === "villas-node") { page = InfrastructureComponent.ICParamsTable(ic)} @@ -170,7 +182,19 @@ class InfrastructureComponent extends React.Component { buttonStyle = {buttonStyle} iconStyle = {iconStyle} /> - } else { + }else if (this.state.ic.category ==="manager") { + page = InfrastructureComponent.ICParamsTable(ic)} + rawDataTable = {(rawData) => InfrastructureComponent.rawDataTable(rawData)} + refresh = {(ic, token) => InfrastructureComponent.refresh(ic, token)} + buttonStyle = {buttonStyle} + iconStyle = {iconStyle} + /> + }else { page = InfrastructureComponent.ICParamsTable(ic)} diff --git a/src/ic/ics.js b/src/ic/ics.js index 7452fa8..f78b568 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -26,7 +26,6 @@ import moment from 'moment' import AppDispatcher from '../common/app-dispatcher'; import InfrastructureComponentStore from './ic-store'; -import Icon from '../common/icon'; import Table from '../common/table'; import TableColumn from '../common/table-column'; import NewICDialog from './new-ic';