From 38c8dcb22dc7742d6dbe6ca472b115794331b0b9 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 10:23:23 -0400 Subject: [PATCH 1/7] Rename atom shell to electron --- gulpfile.js | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 4c1b05b3e2..7a37f6a387 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,7 @@ var babel = require('gulp-babel'); var changed = require('gulp-changed'); var concat = require('gulp-concat'); var cssmin = require('gulp-cssmin'); -var downloadatomshell = require('gulp-download-atom-shell'); +var downloadelectron = require('gulp-download-atom-shell'); var fs = require('fs'); var gulp = require('gulp'); var gulpif = require('gulp-if'); @@ -76,8 +76,8 @@ gulp.task('styles', function () { }); gulp.task('download', function (cb) { - downloadatomshell({ - version: packagejson['atom-shell-version'], + downloadelectron({ + version: packagejson['electron-version'], outputDir: 'cache' }, cb); }); diff --git a/package.json b/package.json index eb834ed4e6..789613df83 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "docker-version": "1.6.0", "docker-machine-version": "0.2.0", - "atom-shell-version": "0.23.0", + "electron-version": "0.24.0", "virtualbox-version": "4.3.26", "virtualbox-filename": "VirtualBox-4.3.26.pkg", "virtualbox-checksum": "668f61c95efe37f8fc65cafe95b866fba64e37f2492dfc1e2b44a7ac3dcafa3b", From 734b779df63a33367d0d1382e358e3d3b90be494 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 10:25:41 -0400 Subject: [PATCH 2/7] Fixing unit tests by ignoring babel --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index eb834ed4e6..d6ce3833f5 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "tty", "net", "crypto", + "babel", "/node_modules/.*JSONStream", "/node_modules/object-assign", "/node_modules/underscore", From b9887a3709d8ba870f9c032b69e50e9008ac287d Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 10:26:14 -0400 Subject: [PATCH 3/7] Changing docs to electron Signed-off-by: Jeffrey Morgan --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f0a4c54814..209f81f62e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ To run the app in development: **Note: This architecture is work in progress and doesn't reflect the current state of the app, yet!** -Kitematic is an application built using [atom-shell](https://github.com/atom/atom-shell) and is powered by the [Docker Engine](https://github.com/docker/docker). While it's work in progress, the goal is to make Kitematic a high-performance, portable Javascript ES6 application built with React and Reflux. It adopts a single data flow pattern: +Kitematic is an application built using [electron](https://github.com/atom/electron) and is powered by the [Docker Engine](https://github.com/docker/docker). While it's work in progress, the goal is to make Kitematic a high-performance, portable Javascript ES6 application built with React and Reflux. It adopts a single data flow pattern: ``` ╔═════════╗ ╔════════╗ ╔═════════════════╗ From 614e034167ac7a29ebc8835e68c7ec9b9d9f048f Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 11:01:18 -0400 Subject: [PATCH 4/7] Fixing download Signed-off-by: Jeffrey Morgan --- gulpfile.js | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 7a37f6a387..1029d73663 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,7 @@ var babel = require('gulp-babel'); var changed = require('gulp-changed'); var concat = require('gulp-concat'); var cssmin = require('gulp-cssmin'); -var downloadelectron = require('gulp-download-atom-shell'); +var downloadelectron = require('gulp-download-electron'); var fs = require('fs'); var gulp = require('gulp'); var gulpif = require('gulp-if'); @@ -97,14 +97,14 @@ gulp.task('dist', function () { var stream = gulp.src('').pipe(shell([ 'rm -Rf dist', 'mkdir -p ./dist/osx', - 'cp -R ./cache/Atom.app ./dist/osx/<%= filename %>', - 'mv ./dist/osx/<%= filename %>/Contents/MacOS/Atom ./dist/osx/<%= filename %>/Contents/MacOS/<%= name %>', + 'cp -R ./cache/Electron.app ./dist/osx/<%= filename %>', + 'mv ./dist/osx/<%= filename %>/Contents/MacOS/Electron ./dist/osx/<%= filename %>/Contents/MacOS/<%= name %>', 'mkdir -p ./dist/osx/<%= filename %>/Contents/Resources/app', 'mkdir -p ./dist/osx/<%= filename %>/Contents/Resources/app/node_modules', 'cp package.json dist/osx/<%= filename %>/Contents/Resources/app/', 'mkdir -p dist/osx/<%= filename %>/Contents/Resources/app/resources', 'cp -v resources/* dist/osx/<%= filename %>/Contents/Resources/app/resources/ || :', - 'cp <%= icon %> dist/osx/<%= filename %>/Contents/Resources/atom.icns', + 'cp <%= icon %> dist/osx/<%= filename %>/Contents/Resources/electron.icns', 'cp ./util/Info.plist dist/osx/<%= filename %>/Contents/Info.plist', '/usr/libexec/PlistBuddy -c "Set :CFBundleVersion <%= version %>" dist/osx/<%= filename %>/Contents/Info.plist', '/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName <%= name %>" dist/osx/<%= filename %>/Contents/Info.plist', @@ -181,7 +181,7 @@ gulp.task('default', ['download', 'copy', 'js', 'images', 'styles'], function () var env = process.env; env.NODE_ENV = 'development'; - gulp.src('').pipe(shell(['./cache/Atom.app/Contents/MacOS/Atom .'], { + gulp.src('').pipe(shell(['./cache/Electron.app/Contents/MacOS/Electron .'], { env: env })); }); diff --git a/package.json b/package.json index 789613df83..fc2173897e 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "gulp-changed": "^1.2.1", "gulp-concat": "^2.5.2", "gulp-cssmin": "^0.1.6", - "gulp-download-atom-shell": "0.0.4", + "gulp-download-electron": "^0.0.5", "gulp-if": "^1.2.5", "gulp-insert": "^0.4.0", "gulp-less": "^3.0.2", From 1d00ca197c97323b557322535dc35f53f4192ed2 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 11:23:57 -0400 Subject: [PATCH 5/7] Fix signing errors --- gulpfile.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 1029d73663..ae62be14b2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -104,7 +104,7 @@ gulp.task('dist', function () { 'cp package.json dist/osx/<%= filename %>/Contents/Resources/app/', 'mkdir -p dist/osx/<%= filename %>/Contents/Resources/app/resources', 'cp -v resources/* dist/osx/<%= filename %>/Contents/Resources/app/resources/ || :', - 'cp <%= icon %> dist/osx/<%= filename %>/Contents/Resources/electron.icns', + 'cp <%= icon %> dist/osx/<%= filename %>/Contents/Resources/atom.icns', 'cp ./util/Info.plist dist/osx/<%= filename %>/Contents/Info.plist', '/usr/libexec/PlistBuddy -c "Set :CFBundleVersion <%= version %>" dist/osx/<%= filename %>/Contents/Info.plist', '/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName <%= name %>" dist/osx/<%= filename %>/Contents/Info.plist', @@ -138,9 +138,19 @@ gulp.task('sign', function () { try { var signing_identity = fs.readFileSync('./identity', 'utf8').trim(); return gulp.src('').pipe(shell([ - 'codesign --deep --force --verbose --sign "' + signing_identity + '" ' + options.appFilename.replace(' ', '\\ ').replace('(','\\(').replace(')','\\)') + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Framework.framework', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Helper\\ EH.app', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Helper\\ NP.app', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Helper.app', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/ReactiveCocoa.framework', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Squirrel.framework', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Mantle.framework', + 'codesign --force --verbose --sign <%= identity %> <%= filename %>', ], { - cwd: './dist/osx/' + templateData: { + filename: 'dist/osx/' + options.appFilename.replace(' ', '\\ ').replace('(','\\(').replace(')','\\)'), + identity: '\"' + signing_identity + '\"' + } })); } catch (error) { gutil.log(gutil.colors.red('Error: ' + error.message)); From 729f0c492086be5a23b50546e46d6aa4d06017a1 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 11:37:37 -0400 Subject: [PATCH 6/7] Removing unnecessary logs Signed-off-by: Jeffrey Morgan --- src/Docker.js | 1 - src/SetupStore.js | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/Docker.js b/src/Docker.js index 36ad6c069e..baa753e908 100644 --- a/src/Docker.js +++ b/src/Docker.js @@ -32,7 +32,6 @@ var Docker = { delay = delay || 1000; var tryCount = 1; while (true) { - console.log('Connecting: ' + tryCount + ' tries...'); try { yield new Promise((resolve, reject) => { this._client.listContainers((err) => { diff --git a/src/SetupStore.js b/src/SetupStore.js index 53972c90d7..b4bf85df9e 100644 --- a/src/SetupStore.js +++ b/src/SetupStore.js @@ -222,7 +222,6 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { setup: Promise.coroutine(function * () { while (true) { try { - console.log('Starting Steps'); var ip = yield this.run(); if (!ip || !ip.length) { throw { @@ -231,8 +230,6 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { ip: ip, }; } - console.log('Finished Steps'); - console.log(ip); docker.setup(ip, machine.name()); yield docker.waitForConnection(); metrics.track('Setup Finished'); From 5fd740d67f73363c09639aed413be2fa73ca6d7c Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 17 Apr 2015 12:43:08 -0400 Subject: [PATCH 7/7] Removing react-router warnings --- .jshintrc | 2 +- package.json | 2 +- src/ContainerDetails.react.js | 8 ++++--- src/ContainerDetailsSubheader.react.js | 30 ++++++++++++++------------ src/ContainerHome.react.js | 13 +++++------ src/ContainerHomeFolders.react.js | 7 +++--- src/ContainerHomeLogs.react.js | 5 ++++- src/ContainerHomePreview.react.js | 9 ++++---- src/ContainerListNewItem.react.js | 1 - src/ContainerLogs.react.js | 7 ++++++ src/ContainerSettings.react.js | 8 ++++--- src/ContainerSettingsGeneral.react.js | 8 ++++--- src/ContainerSettingsPorts.react.js | 8 +++---- src/ContainerSettingsVolumes.react.js | 2 -- src/Containers.react.js | 18 +++++++++------- src/LogStore.js | 5 +++-- src/NewContainer.react.js | 7 +++--- src/Radial.react.js | 5 +++-- 18 files changed, 84 insertions(+), 61 deletions(-) diff --git a/.jshintrc b/.jshintrc index daeaf45072..9240a3ae9f 100644 --- a/.jshintrc +++ b/.jshintrc @@ -27,5 +27,5 @@ "jest": true, "pit": true }, - "predef": [ "Promise" ] + "predef": [ "-Promise" ] } diff --git a/package.json b/package.json index 2ac0a9d617..99fbf376b2 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "async": "^0.9.0", "bluebird": "^2.9.24", "bugsnag-js": "^2.4.7", + "classnames": "^1.2.0", "coveralls": "^2.11.2", "dockerode": "^2.1.1", "exec": "0.2.0", @@ -89,7 +90,6 @@ "gulp-shell": "^0.4.1", "gulp-sourcemaps": "^1.5.2", "gulp-util": "^3.0.4", - "gulp": "^3.8.11", "jest-cli": "kitematic/jest", "jsxhint": "^0.14.0", "minimist": "^1.1.1", diff --git a/src/ContainerDetails.react.js b/src/ContainerDetails.react.js index f101b603ba..b18d69819b 100644 --- a/src/ContainerDetails.react.js +++ b/src/ContainerDetails.react.js @@ -5,7 +5,9 @@ var ContainerDetailsSubheader = require('./ContainerDetailsSubheader.react'); var Router = require('react-router'); var ContainerDetail = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { currentRoute: null @@ -18,9 +20,9 @@ var ContainerDetail = React.createClass({ this.init(); }, init: function () { - var currentRoute = _.last(this.getRoutes()).name; + var currentRoute = _.last(this.context.router.getCurrentRoutes()).name; if (currentRoute === 'containerDetails') { - this.transitionTo('containerHome', {name: this.getParams().name}); + this.context.router.transitionTo('containerHome', {name: this.context.router.getCurrentParams().name}); } }, render: function () { diff --git a/src/ContainerDetailsSubheader.react.js b/src/ContainerDetailsSubheader.react.js index 8b44ea8c62..377dfcfa72 100644 --- a/src/ContainerDetailsSubheader.react.js +++ b/src/ContainerDetailsSubheader.react.js @@ -1,6 +1,6 @@ var _ = require('underscore'); var $ = require('jquery'); -var React = require('react/addons'); +var React = require('react'); var exec = require('exec'); var path = require('path'); var metrics = require('./Metrics'); @@ -8,11 +8,13 @@ var ContainerStore = require('./ContainerStore'); var ContainerUtil = require('./ContainerUtil'); var machine = require('./DockerMachine'); var RetinaImage = require('react-retina-image'); -var Router = require('react-router'); var webPorts = require('./Util').webPorts; +var classNames = require('classNames'); var ContainerDetailsSubheader = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { defaultPort: null @@ -26,9 +28,9 @@ var ContainerDetailsSubheader = React.createClass({ }, init: function () { this.setState({ - currentRoute: _.last(this.getRoutes()).name + currentRoute: _.last(this.context.router.getCurrentRoutes()).name }); - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -69,19 +71,19 @@ var ContainerDetailsSubheader = React.createClass({ metrics.track('Viewed Home', { from: 'header' }); - this.transitionTo('containerHome', {name: this.getParams().name}); + this.context.router.transitionTo('containerHome', {name: this.context.router.getCurrentParams().name}); } }, showLogs: function () { if (!this.disableTab()) { metrics.track('Viewed Logs'); - this.transitionTo('containerLogs', {name: this.getParams().name}); + this.context.router.transitionTo('containerLogs', {name: this.context.router.getCurrentParams().name}); } }, showSettings: function () { if (!this.disableTab()) { metrics.track('Viewed Settings'); - this.transitionTo('containerSettings', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettings', {name: this.context.router.getCurrentParams().name}); } }, handleRun: function () { @@ -141,29 +143,29 @@ var ContainerDetailsSubheader = React.createClass({ $action.css("visibility", "hidden"); }, render: function () { - var runActionClass = React.addons.classSet({ + var runActionClass = classNames({ action: true, disabled: this.disableRun() }); - var restartActionClass = React.addons.classSet({ + var restartActionClass = classNames({ action: true, disabled: this.disableRestart() }); - var terminalActionClass = React.addons.classSet({ + var terminalActionClass = classNames({ action: true, disabled: this.disableTerminal() }); - var tabHomeClasses = React.addons.classSet({ + var tabHomeClasses = classNames({ 'tab': true, 'active': this.state.currentRoute === 'containerHome', disabled: this.disableTab() }); - var tabLogsClasses = React.addons.classSet({ + var tabLogsClasses = classNames({ 'tab': true, 'active': this.state.currentRoute === 'containerLogs', disabled: this.disableTab() }); - var tabSettingsClasses = React.addons.classSet({ + var tabSettingsClasses = classNames({ 'tab': true, 'active': this.state.currentRoute && (this.state.currentRoute.indexOf('containerSettings') >= 0), disabled: this.disableTab() diff --git a/src/ContainerHome.react.js b/src/ContainerHome.react.js index a25fa678b5..9495a2f235 100644 --- a/src/ContainerHome.react.js +++ b/src/ContainerHome.react.js @@ -2,7 +2,6 @@ var _ = require('underscore'); var $ = require('jquery'); var React = require('react/addons'); var ContainerStore = require('./ContainerStore'); -var Router = require('react-router'); var Radial = require('./Radial.react'); var ContainerHomePreview = require('./ContainerHomePreview.react'); var ContainerHomeLogs = require('./ContainerHomeLogs.react'); @@ -16,7 +15,9 @@ var resizeWindow = function () { }; var ContainerHome = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { ports: {}, @@ -47,7 +48,7 @@ var ContainerHome = React.createClass({ resizeWindow(); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -57,12 +58,12 @@ var ContainerHome = React.createClass({ defaultPort: _.find(_.keys(ports), function (port) { return util.webPorts.indexOf(port) !== -1; }), - progress: ContainerStore.progress(this.getParams().name), - blocked: ContainerStore.blocked(this.getParams().name) + progress: ContainerStore.progress(this.context.router.getCurrentParams().name), + blocked: ContainerStore.blocked(this.context.router.getCurrentParams().name) }); }, updateProgress: function (name) { - if (name === this.getParams().name) { + if (name === this.context.router.getCurrentParams().name) { this.setState({ blocked: ContainerStore.blocked(name), progress: ContainerStore.progress(name) diff --git a/src/ContainerHomeFolders.react.js b/src/ContainerHomeFolders.react.js index 1ace6d4e90..ca2760c3db 100644 --- a/src/ContainerHomeFolders.react.js +++ b/src/ContainerHomeFolders.react.js @@ -5,11 +5,12 @@ var path = require('path'); var shell = require('shell'); var util = require('./Util'); var metrics = require('./Metrics'); -var Router = require('react-router'); var ContainerStore = require('./ContainerStore'); var ContainerHomeFolder = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, handleClickFolder: function (hostVolume, containerVolume) { metrics.track('Opened Volume Directory', { from: 'home' @@ -39,7 +40,7 @@ var ContainerHomeFolder = React.createClass({ metrics.track('Viewed Volume Settings', { from: 'preview' }); - this.transitionTo('containerSettingsVolumes', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettingsVolumes', {name: this.context.router.getCurrentParams().name}); }, render: function () { if (!this.props.container) { diff --git a/src/ContainerHomeLogs.react.js b/src/ContainerHomeLogs.react.js index fba6a1b4f4..771765dfa9 100644 --- a/src/ContainerHomeLogs.react.js +++ b/src/ContainerHomeLogs.react.js @@ -44,9 +44,12 @@ module.exports = React.createClass({ metrics.track('Viewed Logs', { from: 'preview' }); - this.transitionTo('containerLogs', {name: this.props.container.Name}); + this.context.router.transitionTo('containerLogs', {name: this.props.container.Name}); }, update: function () { + if (!this.props.container) { + return; + } this.setState({ logs: LogStore.logs(this.props.container.Name) }); diff --git a/src/ContainerHomePreview.react.js b/src/ContainerHomePreview.react.js index e03c448411..34fa82bd26 100644 --- a/src/ContainerHomePreview.react.js +++ b/src/ContainerHomePreview.react.js @@ -3,13 +3,14 @@ var React = require('react/addons'); var exec = require('exec'); var ContainerStore = require('./ContainerStore'); var ContainerUtil = require('./ContainerUtil'); -var Router = require('react-router'); var request = require('request'); var metrics = require('./Metrics'); var webPorts = require('./Util').webPorts; var ContainerHomePreview = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { ports: {}, @@ -41,7 +42,7 @@ var ContainerHomePreview = React.createClass({ clearInterval(this.timer); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -67,7 +68,7 @@ var ContainerHomePreview = React.createClass({ metrics.track('Viewed Port Settings', { from: 'preview' }); - this.transitionTo('containerSettingsPorts', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettingsPorts', {name: this.context.router.getCurrentParams().name}); }, render: function () { var preview; diff --git a/src/ContainerListNewItem.react.js b/src/ContainerListNewItem.react.js index 21c3d53c45..108e7b78e4 100644 --- a/src/ContainerListNewItem.react.js +++ b/src/ContainerListNewItem.react.js @@ -5,7 +5,6 @@ var ContainerStore = require('./ContainerStore'); var metrics = require('./Metrics'); var ContainerListNewItem = React.createClass({ - mixins: [Router.State, Router.Navigation], handleItemMouseEnter: function () { var $action = $(this.getDOMNode()).find('.action'); $action.show(); diff --git a/src/ContainerLogs.react.js b/src/ContainerLogs.react.js index f7b0b24064..36689c44af 100644 --- a/src/ContainerLogs.react.js +++ b/src/ContainerLogs.react.js @@ -20,6 +20,10 @@ module.exports = React.createClass({ LogStore.fetch(this.props.container.Name); }, componentWillUnmount: function() { + if (!this.props.container) { + return; + } + LogStore.detach(this.props.container.Name); LogStore.removeListener(LogStore.SERVER_LOGS_EVENT, this.update); }, @@ -34,6 +38,9 @@ module.exports = React.createClass({ _prevBottom = parent[0].scrollHeight - parent.height(); }, update: function () { + if (!this.props.container) { + return; + } this.setState({ logs: LogStore.logs(this.props.container.Name) }); diff --git a/src/ContainerSettings.react.js b/src/ContainerSettings.react.js index 3b0ba56e88..7a25dd73ae 100644 --- a/src/ContainerSettings.react.js +++ b/src/ContainerSettings.react.js @@ -3,7 +3,9 @@ var React = require('react/addons'); var Router = require('react-router'); var ContainerSettings = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, componentWillReceiveProps: function () { this.init(); }, @@ -11,9 +13,9 @@ var ContainerSettings = React.createClass({ this.init(); }, init: function () { - var currentRoute = _.last(this.getRoutes()).name; + var currentRoute = _.last(this.context.router.getCurrentRoutes()).name; if (currentRoute === 'containerSettings') { - this.transitionTo('containerSettingsGeneral', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettingsGeneral', {name: this.context.router.getCurrentParams().name}); } }, render: function () { diff --git a/src/ContainerSettingsGeneral.react.js b/src/ContainerSettingsGeneral.react.js index d44a8baa58..f54728cff7 100644 --- a/src/ContainerSettingsGeneral.react.js +++ b/src/ContainerSettingsGeneral.react.js @@ -28,7 +28,9 @@ var containerNameSlugify = function (text) { }; var ContainerSettingsGeneral = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { slugName: null, @@ -44,7 +46,7 @@ var ContainerSettingsGeneral = React.createClass({ this.init(); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -98,7 +100,7 @@ var ContainerSettingsGeneral = React.createClass({ return; } metrics.track('Changed Container Name'); - this.transitionTo('containerSettingsGeneral', {name: newName}); + this.context.router.transitionTo('containerSettingsGeneral', {name: newName}); var oldPath = path.join(process.env.HOME, 'Kitematic', oldName); var newPath = path.join(process.env.HOME, 'Kitematic', newName); rimraf(newPath, () => { diff --git a/src/ContainerSettingsPorts.react.js b/src/ContainerSettingsPorts.react.js index 64239a084d..21581e76bd 100644 --- a/src/ContainerSettingsPorts.react.js +++ b/src/ContainerSettingsPorts.react.js @@ -1,6 +1,5 @@ var _ = require('underscore'); var React = require('react/addons'); -var Router = require('react-router'); var exec = require('exec'); var ContainerStore = require('./ContainerStore'); var ContainerUtil = require('./ContainerUtil'); @@ -8,7 +7,9 @@ var metrics = require('./Metrics'); var webPorts = require('./Util').webPorts; var ContainerSettingsPorts = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { ports: {}, @@ -22,7 +23,7 @@ var ContainerSettingsPorts = React.createClass({ this.init(); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -43,7 +44,6 @@ var ContainerSettingsPorts = React.createClass({ }); }, handleChangeDefaultPort: function (port, e) { - console.log(e.target.checked); if (e.target.checked) { this.setState({ defaultPort: port diff --git a/src/ContainerSettingsVolumes.react.js b/src/ContainerSettingsVolumes.react.js index cb470e75aa..6108398a0f 100644 --- a/src/ContainerSettingsVolumes.react.js +++ b/src/ContainerSettingsVolumes.react.js @@ -1,6 +1,5 @@ var _ = require('underscore'); var React = require('react/addons'); -var Router = require('react-router'); var remote = require('remote'); var exec = require('exec'); var dialog = remote.require('dialog'); @@ -8,7 +7,6 @@ var metrics = require('./Metrics'); var ContainerStore = require('./ContainerStore'); var ContainerSettingsVolumes = React.createClass({ - mixins: [Router.State, Router.Navigation], handleChooseVolumeClick: function (dockerVol) { var self = this; dialog.showOpenDialog({properties: ['openDirectory', 'createDirectory']}, function (filenames) { diff --git a/src/Containers.react.js b/src/Containers.react.js index af151dabca..c0275e22cd 100644 --- a/src/Containers.react.js +++ b/src/Containers.react.js @@ -15,7 +15,9 @@ var Tooltip = require('react-bootstrap').Tooltip; var util = require('./Util'); var Containers = React.createClass({ - mixins: [Router.Navigation, Router.State], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { sidebarOffset: 0, @@ -34,7 +36,7 @@ var Containers = React.createClass({ ContainerStore.on(ContainerStore.CLIENT_CONTAINER_EVENT, this.updateFromClient); if (this.state.sorted.length) { - this.transitionTo('containerHome', {name: this.state.sorted[0].Name}); + this.context.router.transitionTo('containerHome', {name: this.state.sorted[0].Name}); } ipc.on('application:update-available', () => { @@ -50,9 +52,9 @@ var Containers = React.createClass({ }, onDestroy: function () { if (this.state.sorted.length) { - this.transitionTo('containerHome', {name: this.state.sorted[0].Name}); + this.context.router.transitionTo('containerHome', {name: this.state.sorted[0].Name}); } else { - this.transitionTo('containers'); + this.context.router.transitionTo('containers'); } }, updateError: function (err) { @@ -77,7 +79,7 @@ var Containers = React.createClass({ downloading: ContainerStore.downloading() }); if (status === 'create') { - this.transitionTo('containerHome', {name: name}); + this.context.router.transitionTo('containerHome', {name: name}); } else if (status === 'destroy') { this.onDestroy(); } @@ -95,7 +97,7 @@ var Containers = React.createClass({ }, handleNewContainer: function () { $(this.getDOMNode()).find('.new-container-item').parent().fadeIn(); - this.transitionTo('new'); + this.context.router.transitionTo('new'); metrics.track('Pressed New Container'); }, handleAutoUpdateClick: function () { @@ -106,7 +108,7 @@ var Containers = React.createClass({ metrics.track('Opened Preferences', { from: 'app' }); - this.transitionTo('preferences'); + this.context.router.transitionTo('preferences'); }, handleClickDockerTerminal: function () { metrics.track('Opened Docker Terminal', { @@ -173,7 +175,7 @@ var Containers = React.createClass({ button = ; } - var container = this.getParams().name ? this.state.containers[this.getParams().name] : {}; + var container = this.context.router.getCurrentParams().name ? this.state.containers[this.context.router.getCurrentParams().name] : {}; return (
diff --git a/src/LogStore.js b/src/LogStore.js index fa14b34e11..60f707ce80 100644 --- a/src/LogStore.js +++ b/src/LogStore.js @@ -30,7 +30,7 @@ module.exports = assign(Object.create(EventEmitter.prototype), { follow: false }, (err, logStream) => { if (err) { - throw err; + return; } var logs = []; var outstream = new stream.PassThrough(); @@ -56,8 +56,9 @@ module.exports = assign(Object.create(EventEmitter.prototype), { stream: true }, (err, logStream) => { if (err) { - throw err; + return; } + _streams[name] = logStream; var outstream = new stream.PassThrough(); docker.client().modem.demuxStream(logStream, outstream, outstream); outstream.on('data', (chunk) => { diff --git a/src/NewContainer.react.js b/src/NewContainer.react.js index 05e772cedd..39de7011f8 100644 --- a/src/NewContainer.react.js +++ b/src/NewContainer.react.js @@ -1,11 +1,12 @@ var _ = require('underscore'); var $ = require('jquery'); -var React = require('react/addons'); +var React = require('react'); var RetinaImage = require('react-retina-image'); var Radial = require('./Radial.react'); var ImageCard = require('./ImageCard.react'); var Promise = require('bluebird'); var metrics = require('./Metrics'); +var classNames = require('classnames'); var _recommended = []; var _searchPromise = null; @@ -132,11 +133,11 @@ var NewContainer = React.createClass({ ); } } - var loadingClasses = React.addons.classSet({ + var loadingClasses = classNames({ hidden: !this.state.loading, loading: true }); - var magnifierClasses = React.addons.classSet({ + var magnifierClasses = classNames({ hidden: this.state.loading, icon: true, 'icon-magnifier': true, diff --git a/src/Radial.react.js b/src/Radial.react.js index cc826167cd..bdc9ea1773 100644 --- a/src/Radial.react.js +++ b/src/Radial.react.js @@ -1,4 +1,5 @@ -var React = require('react/addons'); +var React = require('react'); +var classNames = require('classnames'); var Radial = React.createClass({ render: function () { @@ -10,7 +11,7 @@ var Radial = React.createClass({ } else { percentage =
; } - var classes = React.addons.classSet({ + var classes = classNames({ 'radial-progress': true, 'radial-spinner': this.props.spin, 'radial-negative': this.props.error,