@@ -6,6 +6,13 @@ pre.word-wrap { | |||||
word-wrap: break-word; /* Internet Explorer 5.5+ */ | word-wrap: break-word; /* Internet Explorer 5.5+ */ | ||||
} | } | ||||
pre.terminal { | |||||
background: black; | |||||
color: #aaa; | |||||
height: 600px; | |||||
width: 100%; | |||||
} | |||||
.w-1 { | .w-1 { | ||||
width: 1px !important; | width: 1px !important; | ||||
} | } |
@@ -0,0 +1,47 @@ | |||||
import { h, Component } from 'preact'; | |||||
import makeArvadosRequest from 'make-arvados-request'; | |||||
class WBLiveLogs extends Component { | |||||
componentDidMount() { | |||||
this.fetchData(); | |||||
} | |||||
componentWillReceiveProps(nextProps) { | |||||
if (nextProps.uuid === this.props.uuid); | |||||
return; | |||||
this.props = nextProps; | |||||
this.fetchData(); | |||||
} | |||||
fetchData() { | |||||
const { uuid, app } = this.props; | |||||
const { arvHost, arvToken } = app.state; | |||||
const filters = [ | |||||
[ 'object_uuid', '=', uuid ] | |||||
]; | |||||
let prom = makeArvadosRequest(arvHost, arvToken, | |||||
'/arvados/v1/logs?filters=' + encodeURIComponent(JSON.stringify(filters))); | |||||
prom = prom.then(xhr => { | |||||
const { items } = xhr.response; | |||||
this.setState({ | |||||
content: items.filter(a => ('text' in a.properties)).map(a => a.properties.text.trim()).join('\n') | |||||
}); | |||||
}); | |||||
} | |||||
render({}, { content }) { | |||||
return ( | |||||
<div> | |||||
<a href="#" onclick={ e => { | |||||
e.preventDefault(); | |||||
this.fetchData(); | |||||
} }>Refresh</a> | |||||
<pre class="word-warp terminal"> | |||||
{ content } | |||||
</pre> | |||||
</div> | |||||
); | |||||
} | |||||
} | |||||
export default WBLiveLogs; |
@@ -3,6 +3,7 @@ import WBNavbarCommon from 'wb-navbar-common'; | |||||
import WBArvadosCrumbs from 'wb-arvados-crumbs'; | import WBArvadosCrumbs from 'wb-arvados-crumbs'; | ||||
import WBCommonFields from 'wb-common-fields'; | import WBCommonFields from 'wb-common-fields'; | ||||
import WBContainerFields from 'wb-container-fields'; | import WBContainerFields from 'wb-container-fields'; | ||||
import WBLiveLogs from 'wb-live-logs'; | |||||
class WBContainerView extends Component { | class WBContainerView extends Component { | ||||
render({ app, uuid }) { | render({ app, uuid }) { | ||||
@@ -21,6 +22,9 @@ class WBContainerView extends Component { | |||||
<h2>Container Fields</h2> | <h2>Container Fields</h2> | ||||
<WBContainerFields app={ app } uuid={ uuid } /> | <WBContainerFields app={ app } uuid={ uuid } /> | ||||
<h2>Live Logs</h2> | |||||
<WBLiveLogs app={ app } uuid={ uuid } /> | |||||
</div> | </div> | ||||
); | ); | ||||
} | } | ||||