From 42417c35238473afb9ee5f3abb3a93546f9834d6 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Tue, 13 Jan 2015 16:45:18 -0500 Subject: [PATCH] traffic lights --- app/Container.react.js | 86 +++++++++++++++++- app/Containers.react.js | 42 +++++++-- app/Header.react.js | 27 ++++++ app/images/close.png | Bin 0 -> 243 bytes app/images/close@2x.png | Bin 0 -> 355 bytes app/images/maximize.png | Bin 0 -> 239 bytes app/images/maximize@2x.png | Bin 0 -> 321 bytes app/images/minimize.png | Bin 0 -> 106 bytes app/images/minimize@2x.png | Bin 0 -> 115 bytes app/styles/clearsans.less | 56 ++++++++++++ app/styles/main.less | 176 ++++++++++++++++++++++++++++++++++++- app/styles/retina.less | 36 ++++++++ browser/main.js | 11 ++- gulpfile.js | 16 +++- package.json | 6 +- 15 files changed, 434 insertions(+), 22 deletions(-) create mode 100644 app/Header.react.js create mode 100644 app/images/close.png create mode 100644 app/images/close@2x.png create mode 100644 app/images/maximize.png create mode 100644 app/images/maximize@2x.png create mode 100644 app/images/minimize.png create mode 100644 app/images/minimize@2x.png create mode 100644 app/styles/clearsans.less create mode 100644 app/styles/retina.less diff --git a/app/Container.react.js b/app/Container.react.js index f69ca483b3..8369d64938 100644 --- a/app/Container.react.js +++ b/app/Container.react.js @@ -1,3 +1,4 @@ +var _ = require('underscore'); var React = require('react'); var Router = require('react-router'); var Route = Router.Route; @@ -6,9 +7,92 @@ var DefaultRoute = Router.DefaultRoute; var Link = Router.Link; var RouteHandler = Router.RouteHandler; +var Convert = require('ansi-to-html'); +var convert = new Convert(); + +var docker = require('./docker.js'); + var Container = React.createClass({ + mixins: [Router.State], + componentWillReceiveProps: function () { + var self = this; + var logs = []; + var index = 0; + docker.client().getContainer(this.getParams().Id).logs({ + follow: false, + stdout: true, + timestamps: true + }, function (err, stream) { + stream.setEncoding('utf8'); + stream.on('data', function (buf) { + // Every other message is a header + if (index % 2 === 1) { + var time = buf.substr(0,buf.indexOf(' ')); + var msg = buf.substr(buf.indexOf(' ')+1); + logs.push(convert.toHtml(msg)); + } + index += 1; + }); + stream.on('end', function (buf) { + self.setState({logs: logs}); + docker.client().getContainer(self.getParams().Id).logs({ + follow: true, + stdout: true, + timestamps: true, + tail: 0 + }, function (err, stream) { + stream.setEncoding('utf8'); + stream.on('data', function (buf) { + // Every other message is a header + if (index % 2 === 1) { + var time = buf.substr(0,buf.indexOf(' ')); + var msg = buf.substr(buf.indexOf(' ')+1); + logs.push(convert.toHtml(msg)); + self.setState({logs: logs}); + } + index += 1; + }); + }); + }); + }); + }, render: function () { - return

Hello

; + var self = this; + + if (!this.state || !this.state.logs) { + return false; + } + + var container = _.find(this.props.containers, function (container) { + return container.Id === self.getParams().Id; + }); + // console.log(container); + + if (!container || !this.state) { + return
; + } + + var logs = this.state.logs.map(function (l, i) { + return

; + }); + + var state; + if (container.State.Running) { + state =

running

; + } else if (container.State.Restarting) { + state =

restarting

; + } + + return ( +
+
+

{container.Name.replace('/', '')}

{state} +
+
+ {logs} +
+
+ ); } }); diff --git a/app/Containers.react.js b/app/Containers.react.js index 4cd6f02d8f..e8623099c8 100644 --- a/app/Containers.react.js +++ b/app/Containers.react.js @@ -7,16 +7,37 @@ var Link = Router.Link; var RouteHandler = Router.RouteHandler; var Navigation= Router.Navigation; +var Header = require('./Header.react.js'); + var async = require('async'); var docker = require('./docker.js'); + var ContainerList = React.createClass({ render: function () { var containers = this.props.containers.map(function (container) { - return
  • {container.Name.replace('/', '')}
  • + var state; + if (container.State.Running) { + state = running; + } else if (container.State.Restarting) { + state = restarting; + } + + return ( + +
  • +
    + {container.Name.replace('/', '')} +
    +
    + {state} - {container.Config.Image} +
    +
  • + + ); }); return ( -