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';