diff --git a/embark-ui/src/components/Process.js b/embark-ui/src/components/Process.js index 02bb6bce..7a73e064 100644 --- a/embark-ui/src/components/Process.js +++ b/embark-ui/src/components/Process.js @@ -1,18 +1,23 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; +import {Page} from "tabler-react"; +import Loading from "./Loading"; class Process extends Component { render() { - const logs = this.props.logs || []; + const logs = this.props.logs; return ( -
- State: {this.props.state} + +

State: {this.props.state}

+ {!logs && + } + {logs &&
{ logs.map((item, i) =>

{item.msg_clear || item.msg}

) } -
-
); + } + ); } } diff --git a/embark-ui/src/components/ProcessesLayout.js b/embark-ui/src/components/ProcessesLayout.js new file mode 100644 index 00000000..25e93774 --- /dev/null +++ b/embark-ui/src/components/ProcessesLayout.js @@ -0,0 +1,68 @@ +import PropTypes from "prop-types"; +import React, {Component} from 'react'; +import connect from "react-redux/es/connect/connect"; +import {NavLink, Route, Switch, withRouter} from 'react-router-dom'; +import { + Page, + Grid, + List +} from "tabler-react"; + +import ProcessesContainer from '../containers/ProcessesContainer'; +import Loading from "./Loading"; + +const routePrefix = '/embark/processes'; + +class ProcessesLayout extends Component { + + + render() { + if (!this.props.processes || !this.props.processes.data) { + return ; + } + const processNames = Object.keys(this.props.processes.data) || []; + return ( + + Processes +
+ + {processNames.map((processName, index) => { + return ( + {processName} + ); + })} + + +
+
+ + + + {processNames.map((processName, index) => { + return (); + })} + + +
); + } +} + +ProcessesLayout.propTypes = { + processes: PropTypes.object, + match: PropTypes.object +}; + +function mapStateToProps(state) { + return {processes: state.processes}; +} + +export default connect( + mapStateToProps +)(ProcessesLayout); + diff --git a/embark-ui/src/containers/AppContainer.js b/embark-ui/src/containers/AppContainer.js index 94c83767..962baa73 100644 --- a/embark-ui/src/containers/AppContainer.js +++ b/embark-ui/src/containers/AppContainer.js @@ -6,11 +6,12 @@ import React, {Component} from 'react'; import history from '../history'; import Layout from '../components/Layout'; import routes from '../routes'; -import {initBlockHeader} from '../actions'; +import {initBlockHeader, fetchProcesses} from '../actions'; class AppContainer extends Component { componentDidMount() { this.props.initBlockHeader(); + this.props.fetchProcesses(); } render() { @@ -25,12 +26,14 @@ class AppContainer extends Component { } AppContainer.propTypes = { - initBlockHeader: PropTypes.func + initBlockHeader: PropTypes.func, + fetchProcesses: PropTypes.func }; export default connect( null, { - initBlockHeader + initBlockHeader, + fetchProcesses }, )(AppContainer); diff --git a/embark-ui/src/containers/ProcessesContainer.js b/embark-ui/src/containers/ProcessesContainer.js index 681b3bce..9f5c3256 100644 --- a/embark-ui/src/containers/ProcessesContainer.js +++ b/embark-ui/src/containers/ProcessesContainer.js @@ -1,66 +1,46 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; -import {Tabs, Tab} from 'tabler-react'; import PropTypes from 'prop-types'; -import {fetchProcesses, fetchProcessLogs, listenToProcessLogs} from '../actions'; -import Loading from '../components/Loading'; +import {fetchProcessLogs, listenToProcessLogs} from '../actions'; -import "./css/processContainer.css"; import Process from "../components/Process"; class ProcessesContainer extends Component { componentDidMount() { - this.props.fetchProcesses(); - } - - shouldComponentUpdate(nextProps, _nextState) { - if (!this.islistening && nextProps.processes && nextProps.processes.data) { - this.islistening = true; - Object.keys(nextProps.processes.data).forEach(processName => { - this.props.fetchProcessLogs(processName); - // Only start watching if we are not already watching - if (!this.props.processes.data || - !this.props.processes.data[processName] || - !this.props.processes.data[processName].isListening - ) { - this.props.listenToProcessLogs(processName); - } - }); + // Get correct process name + const pathParts = this.props.match.path.split('/'); + this.processName = pathParts[pathParts.length - 1]; + // If we are not in a specific process page (eg: processes/ root), get first process + if (Object.keys(this.props.processes.data).indexOf(this.processName) < 0) { + this.processName = Object.keys(this.props.processes.data)[0]; + } + + // Fetch logs for the process + this.props.fetchProcessLogs(this.processName); + + // Only start watching if we are not already watching + if (!this.props.processes.data[this.processName].isListening) { + this.props.listenToProcessLogs(this.processName); } - return true; } render() { - const {processes} = this.props; - if (!processes.data) { - return ; + if (!this.processName) { + return ''; } - - const processNames = Object.keys(processes.data); return (
- {processes.error &&

- Error: {processes.error.message || processes.error} -

} - - {processNames && processNames.length && - {processNames.map(processName => { - return ( - - ); - })} - } - +
); } } ProcessesContainer.propTypes = { + match: PropTypes.object, processes: PropTypes.object, - fetchProcesses: PropTypes.func, fetchProcessLogs: PropTypes.func, listenToProcessLogs: PropTypes.func }; @@ -72,7 +52,6 @@ function mapStateToProps(state) { export default connect( mapStateToProps, { - fetchProcesses, fetchProcessLogs, listenToProcessLogs } diff --git a/embark-ui/src/containers/css/processContainer.css b/embark-ui/src/general.css similarity index 60% rename from embark-ui/src/containers/css/processContainer.css rename to embark-ui/src/general.css index 1510241f..60588a99 100644 --- a/embark-ui/src/containers/css/processContainer.css +++ b/embark-ui/src/general.css @@ -1,9 +1,4 @@ - -.processes-container .nav-link { - text-transform: capitalize; -} - -.processes-container .logs { +.logs { margin: 10px 0; background-color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; @@ -13,15 +8,19 @@ border-radius: 8px; } -.processes-container .logs .error { +.logs .error { color: #dc3546; } -.processes-container .logs .warn { +.logs .warn { color: #fec107; } -.processes-container .logs .debug { +.logs .debug { color: #b7c1cc; } -.processes-container .logs .trace { +.logs .trace { color: #8f98a2; } + +.capitalize { + text-transform: capitalize; +} diff --git a/embark-ui/src/index.js b/embark-ui/src/index.js index 346c9426..40ff2c2d 100644 --- a/embark-ui/src/index.js +++ b/embark-ui/src/index.js @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom'; import {Provider} from 'react-redux'; import "tabler-react/dist/Tabler.css"; +import "./general.css"; import AppContainer from './containers/AppContainer'; import registerServiceWorker from './registerServiceWorker'; diff --git a/embark-ui/src/routes.js b/embark-ui/src/routes.js index 0797357d..c7cee5aa 100644 --- a/embark-ui/src/routes.js +++ b/embark-ui/src/routes.js @@ -4,15 +4,14 @@ import {Route, Switch} from 'react-router-dom'; import Home from './components/Home'; import NoMatch from './components/NoMatch'; import ExplorerLayout from './components/ExplorerLayout'; - -import ProcessesContainer from './containers/ProcessesContainer'; +import ProcessesLayout from './components/ProcessesLayout'; const routes = ( - +