From 638d6b71f9d9bc30483811a820357caa4ca83498 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Thu, 22 Jan 2015 10:59:25 -0500 Subject: [PATCH 1/4] Transition to newly created containers --- app/ContainerModal.react.js | 6 +----- app/ContainerStore.js | 5 ----- app/main.js | 42 ++++--------------------------------- app/router.js | 8 +++++++ app/routes.js | 42 +++++++++++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 48 deletions(-) create mode 100644 app/router.js create mode 100644 app/routes.js diff --git a/app/ContainerModal.react.js b/app/ContainerModal.react.js index 2568d4f103..03fe192065 100644 --- a/app/ContainerModal.react.js +++ b/app/ContainerModal.react.js @@ -1,15 +1,11 @@ var async = require('async'); var $ = require('jquery'); var React = require('react'); -var Router = require('react-router'); var Modal = require('react-bootstrap/Modal'); var RetinaImage = require('react-retina-image'); var ContainerStore = require('./ContainerStore'); -var Navigation = Router.Navigation; - var ContainerModal = React.createClass({ - mixins: [Navigation], _searchRequest: null, getInitialState: function () { return { @@ -54,7 +50,7 @@ var ContainerModal = React.createClass({ var name = event.target.getAttribute('name'); var self = this; ContainerStore.create(name, 'latest', function (err, containerName) { - // this.transitionTo('containers', {container: containerName}); + require('./router').transitionTo('container', {name: containerName}); self.props.onRequestHide(); }.bind(this)); }, diff --git a/app/ContainerStore.js b/app/ContainerStore.js index ff54d4351a..a2d2e03c54 100644 --- a/app/ContainerStore.js +++ b/app/ContainerStore.js @@ -39,7 +39,6 @@ var ContainerStore = assign(EventEmitter.prototype, { _createContainer: function (image, name, callback) { var existing = docker.client().getContainer(name); existing.remove(function (err, data) { - console.log('Placeholder removed.'); docker.client().createContainer({ Image: image, Tty: false, @@ -49,12 +48,10 @@ var ContainerStore = assign(EventEmitter.prototype, { callback(err, null); return; } - console.log('Created container: ' + container.id); container.start({ PublishAllPorts: true }, function (err) { if (err) { callback(err, null); return; } - console.log('Started container: ' + container.id); callback(null, container); }); }); @@ -130,14 +127,12 @@ var ContainerStore = assign(EventEmitter.prototype, { docker.client().getEvents(function (err, stream) { stream.setEncoding('utf8'); stream.on('data', function (data) { - console.log(data); // TODO: Dont refresh on deleting placeholder containers var deletingPlaceholder = data.status === 'destroy' && self.container(data.id) && self.container(data.id).Config.Env.indexOf('KITEMATIC_DOWNLOADING=true') !== -1; console.log(deletingPlaceholder); if (!deletingPlaceholder) { self.update(function (err) { - console.log('Updated container data.'); }); } }); diff --git a/app/main.js b/app/main.js index aa765b88f4..0291606c75 100644 --- a/app/main.js +++ b/app/main.js @@ -3,13 +3,10 @@ var Router = require('react-router'); var RetinaImage = require('react-retina-image'); var Raven = require('raven'); var async = require('async'); -var docker = require('./docker.js'); -var boot2docker = require('./boot2docker.js'); -var Setup = require('./Setup.react'); -var Containers = require('./Containers.react'); -var ContainerDetails = require('./ContainerDetails.react'); +var docker = require('./docker'); +var router = require('./router'); +var boot2docker = require('./boot2docker'); var ContainerStore = require('./ContainerStore'); -var Radial = require('./Radial.react'); var Route = Router.Route; var NotFoundRoute = Router.NotFoundRoute; @@ -17,42 +14,11 @@ var DefaultRoute = Router.DefaultRoute; var Link = Router.Link; var RouteHandler = Router.RouteHandler; -var App = React.createClass({ - render: function () { - return ( - - ); - } -}); - -var NoContainers = React.createClass({ - render: function () { - return ( -
- No Containers -
- ); - } -}); - -var routes = ( - - - - - - - - - - -); - boot2docker.ip(function (err, ip) { if (window.location.hash !== '#/') { docker.setHost(ip); ContainerStore.init(function () { - Router.run(routes, function (Handler) { + router.run(function (Handler) { React.render(, document.body); }); }); diff --git a/app/router.js b/app/router.js new file mode 100644 index 0000000000..d419f62176 --- /dev/null +++ b/app/router.js @@ -0,0 +1,8 @@ +var Router = require('react-router'); +var routes = require('./routes'); + +var router = Router.create({ + routes: routes +}); + +module.exports = router; diff --git a/app/routes.js b/app/routes.js new file mode 100644 index 0000000000..29549bb5a9 --- /dev/null +++ b/app/routes.js @@ -0,0 +1,42 @@ +var React = require('react'); +var Setup = require('./Setup.react'); +var Containers = require('./Containers.react'); +var ContainerDetails = require('./ContainerDetails.react'); +var Router = require('react-router'); + +var Route = Router.Route; +var DefaultRoute = Router.DefaultRoute; +var RouteHandler = Router.RouteHandler; + +var App = React.createClass({ + render: function () { + return ( + + ); + } +}); + +var NoContainers = React.createClass({ + render: function () { + return ( +
+ No Containers +
+ ); + } +}); + +var routes = ( + + + + + + + + + + +); + +module.exports = routes; From 1f1ec98a297ff8685c30eade649fae8f52370e9e Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 23 Jan 2015 16:49:25 -0500 Subject: [PATCH 2/4] WIP new events --- README.md | 6 +- app/ContainerDetails.react.js | 62 ++--- app/ContainerList.react.js | 34 +-- app/ContainerModal.react.js | 132 ++++++----- app/ContainerStore.js | 342 ++++++++++++++++------------ app/Containers.react.js | 49 +++- app/Header.react.js | 11 +- app/NoContainers.react.js | 15 ++ app/Setup.react.js | 8 +- app/images/downloading-arrow.png | Bin 276 -> 272 bytes app/images/downloading-arrow@2x.png | Bin 555 -> 563 bytes app/images/loading.png | Bin 807 -> 727 bytes app/images/loading@2x.png | Bin 1703 -> 1765 bytes app/images/roundedcontainer.png | Bin 0 -> 1994 bytes app/images/roundedcontainer@2x.png | Bin 0 -> 4978 bytes app/main.js | 31 +-- app/routes.js | 13 +- app/styles/containers.less | 15 +- app/styles/main.less | 62 +++-- browser/main.js | 3 + gulpfile.js | 48 +--- package.json | 17 +- script/deps | 19 ++ script/env | 35 --- script/gulp | 5 - script/npm | 11 - script/release | 10 - script/test | 5 - 28 files changed, 502 insertions(+), 431 deletions(-) create mode 100644 app/NoContainers.react.js create mode 100644 app/images/roundedcontainer.png create mode 100644 app/images/roundedcontainer@2x.png create mode 100755 script/deps delete mode 100755 script/env delete mode 100755 script/gulp delete mode 100755 script/npm delete mode 100755 script/release delete mode 100755 script/test diff --git a/README.md b/README.md index cae55f027e..ca6f0dca08 100755 --- a/README.md +++ b/README.md @@ -13,15 +13,15 @@ Kitematic's documentation and other information can be found at [http://kitemati ### Development - `sudo npm install -g less` -- `./script/npm install` +- `npm install` To run the app in development: -- `./script/gulp` +- `npm start` ### Building the Mac OS X Package -- `./script/release` +- `npm run release` ## Uninstalling diff --git a/app/ContainerDetails.react.js b/app/ContainerDetails.react.js index cd8c140d6f..7dfd520322 100644 --- a/app/ContainerDetails.react.js +++ b/app/ContainerDetails.react.js @@ -1,5 +1,6 @@ var _ = require('underscore'); -var React = require('react'); +var $ = require('jquery'); +var React = require('react/addons'); var Router = require('react-router'); var Convert = require('ansi-to-html'); var convert = new Convert(); @@ -17,17 +18,15 @@ var RouteHandler = Router.RouteHandler; var ContainerDetails = React.createClass({ mixins: [Router.State], + _oldHeight: 0, getInitialState: function () { return { logs: [] }; }, - componentWillReceiveProps: function () { - this.update(); - this.setState({ - logs: [] - }); - var self = this; + logs: function () { + this.updateProgress(this.getParams().name); + /*var self = this; var logs = []; var index = 0; docker.client().getContainer(this.getParams().name).logs({ @@ -68,25 +67,37 @@ var ContainerDetails = React.createClass({ }); }); }); - }); + });*/ + }, + componentWillReceiveProps: function () { + this.logs(); }, componentWillMount: function () { - this.update(); + this.logs(); }, componentDidMount: function () { - ContainerStore.addChangeListener(ContainerStore.CONTAINERS, this.update); - ContainerStore.addChangeListener(ContainerStore.PROGRESS, this.update); + ContainerStore.on(ContainerStore.SERVER_PROGRESS_EVENT, this.updateProgress); }, componentWillUnmount: function () { - ContainerStore.removeChangeListener(ContainerStore.CONTAINERS, this.update); - ContainerStore.removeChangeListener(ContainerStore.PROGRESS, this.update); + ContainerStore.removeListener(ContainerStore.SERVER_PROGRESS_EVENT, this.updateProgress); }, - update: function () { - var name = this.getParams().name; - this.setState({ - container: ContainerStore.container(name), - progress: ContainerStore.progress(name) - }); + componentDidUpdate: function () { + var parent = $('.details-logs'); + if (!parent.length) { + return; + } + if (parent.scrollTop() >= this._oldHeight) { + parent.stop(); + parent.scrollTop(parent[0].scrollHeight - parent.height()); + } + this._oldHeight = parent[0].scrollHeight - parent.height(); + }, + updateProgress: function (name) { + if (name === this.getParams().name) { + this.setState({ + progress: ContainerStore.progress(name) + }); + } }, _escapeHTML: function (html) { var text = document.createTextNode(html); @@ -95,7 +106,7 @@ var ContainerDetails = React.createClass({ return div.innerHTML; }, handleClick: function (name) { - var container = this.state.container; + var container = this.props.container; boot2docker.ip(function (err, ip) { var ports = _.map(container.NetworkSettings.Ports, function (value, key) { var portProtocolPair = key.split('/'); @@ -113,7 +124,6 @@ var ContainerDetails = React.createClass({ } return res; }); - console.log(ports); exec(['open', ports[0].url], function (err) { if (err) { throw err; } }); @@ -130,14 +140,14 @@ var ContainerDetails = React.createClass({ return

; }); - if (!this.state.container) { + if (!this.props.container) { return false; } var state; - if (this.state.container.State.Running) { + if (this.props.container.State.Running) { state =

running

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

restarting

; } @@ -159,12 +169,10 @@ var ContainerDetails = React.createClass({ button = View; } - var name = this.state.container.Name.replace('/', ''); - return (
-

{name}

View +

{this.getParams().name}

View
{progress}
diff --git a/app/ContainerList.react.js b/app/ContainerList.react.js index 81ade25892..0d00fa0e40 100644 --- a/app/ContainerList.react.js +++ b/app/ContainerList.react.js @@ -7,40 +7,16 @@ var Modal = require('react-bootstrap/Modal'); var RetinaImage = require('react-retina-image'); var ModalTrigger = require('react-bootstrap/ModalTrigger'); var ContainerModal = require('./ContainerModal.react'); -var ContainerStore = require('./ContainerStore'); var Header = require('./Header.react'); var docker = require('./docker'); -var Link = Router.Link; -var RouteHandler = Router.RouteHandler; -var Navigation= Router.Navigation; - var ContainerList = React.createClass({ - getInitialState: function () { - return { - containers: [] - }; - }, - componentDidMount: function () { - this.updateContainers(); - ContainerStore.addChangeListener(ContainerStore.CONTAINERS, this.updateContainers); - }, componentWillMount: function () { this._start = Date.now(); }, - componentWillUnmount: function () { - ContainerStore.removeChangeListener(ContainerStore.CONTAINERS, this.updateContainers); - }, - updateContainers: function () { - // Sort by name - var containers = _.values(ContainerStore.containers()).sort(function (a, b) { - return a.Name.localeCompare(b.Name); - }); - this.setState({containers: containers}); - }, render: function () { var self = this; - var containers = this.state.containers.map(function (container) { + var containers = this.props.containers.map(function (container) { var downloadingImage = null, downloading = false; var env = container.Config.Env; if (env.length) { @@ -76,22 +52,20 @@ var ContainerList = React.createClass({ state =
; } - var name = container.Name.replace('/', ''); - return ( - +
  • {state}
    - {name} + {container.Name}
    {imageName}
  • - +
    ); }); return ( diff --git a/app/ContainerModal.react.js b/app/ContainerModal.react.js index 03fe192065..c3e0e614be 100644 --- a/app/ContainerModal.react.js +++ b/app/ContainerModal.react.js @@ -1,6 +1,6 @@ var async = require('async'); var $ = require('jquery'); -var React = require('react'); +var React = require('react/addons'); var Modal = require('react-bootstrap/Modal'); var RetinaImage = require('react-retina-image'); var ContainerStore = require('./ContainerStore'); @@ -10,21 +10,32 @@ var ContainerModal = React.createClass({ getInitialState: function () { return { query: '', - results: [], - recommended: ContainerStore.recommended() + results: ContainerStore.recommended(), + loading: false, }; }, componentDidMount: function () { this.refs.searchInput.getDOMNode().focus(); }, search: function (query) { + if (this._searchRequest) { + this._searchRequest.abort(); + this._searchRequest = null; + } + + this.setState({ + loading: true + }); + var self = this; this._searchRequest = $.get('https://registry.hub.docker.com/v1/search?q=' + query, function (result) { - self._searchRequest.abort(); + self.setState({ + query: query, + loading: false + }); self._searchRequest = null; if (self.isMounted()) { self.setState(result); - console.log(result); } }); }, @@ -35,79 +46,94 @@ var ContainerModal = React.createClass({ return; } - if (this._searchRequest) { - console.log('Cancel'); - this._searchRequest.abort(); - this._searchRequest = null; - } clearTimeout(this.timeout); - var self = this; - this.timeout = setTimeout(function () { - self.search(query); - }, 250); + if (!query.length) { + this.setState({ + query: query, + results: ContainerStore.recommended() + }); + } else { + var self = this; + this.timeout = setTimeout(function () { + self.search(query); + }, 200); + } }, handleClick: function (event) { var name = event.target.getAttribute('name'); var self = this; ContainerStore.create(name, 'latest', function (err, containerName) { - require('./router').transitionTo('container', {name: containerName}); self.props.onRequestHide(); - }.bind(this)); + }); }, render: function () { var self = this; + var data = this.state.results.slice(0, 7); - var data; - if (this.state.query) { - data = this.state.results.splice(0, 7); - } else { - data = this.state.recommended; - } - var results = data.map(function (r) { - var name; - if (r.is_official) { - name = {r.name}; - } else { - name = {r.name}; - } - return ( -
  • -
    -
    - {name} + var results; + if (data.length) { + var items = data.map(function (r) { + var name; + if (r.is_official) { + name = {r.name}; + } else { + name = {r.name}; + } + return ( +
  • +
    +
    + {name} +
    +
    +
    +
    {r.star_count}
    +
    -
    -
    -
    {r.star_count}
    +
    +
    -
    -
    - -
    -
  • + + ); + }); + + results = ( +
    +
      + {items} +
    +
    ); - }); - - var title; - if (this.state.query) { - title =
    Results
    ; } else { - title =
    Recommended
    ; + results = ( +
    +

    + No Results +

    +
    + ); } + var title = this.state.query ? 'Results' : 'Recommended'; + var loadingClasses = React.addons.classSet({ + hidden: !this.state.loading, + loading: true + }); + return (
    - +
    + + +
    - {title} -
      - {results} -
    +
    {title}
    + {results}
    - +
    ); diff --git a/app/Header.react.js b/app/Header.react.js index b69eb6f18c..e12d1199f4 100644 --- a/app/Header.react.js +++ b/app/Header.react.js @@ -2,6 +2,11 @@ var React = require('react/addons'); var remote = require('remote'); var Header = React.createClass({ + getInitialState: function () { + return { + fullscreen: false + }; + }, componentDidMount: function () { document.addEventListener('keyup', this.handleDocumentKeyUp, false); }, @@ -22,14 +27,16 @@ var Header = React.createClass({ }, handleFullscreen: function () { remote.getCurrentWindow().setFullScreen(!remote.getCurrentWindow().isFullScreen()); - this.forceUpdate(); + this.setState({ + fullscreen: remote.getCurrentWindow().isFullScreen() + }); }, handleFullscreenHover: function () { this.update(); }, render: function () { var buttons; - if (remote.getCurrentWindow().isFullScreen()) { + if (this.state.fullscreen) { return (
    diff --git a/app/NoContainers.react.js b/app/NoContainers.react.js new file mode 100644 index 0000000000..84bfc13dda --- /dev/null +++ b/app/NoContainers.react.js @@ -0,0 +1,15 @@ +var React = require('react/addons'); +var RetinaImage = require('react-retina-image'); + +var NoContainers = React.createClass({ + render: function () { + return ( +
    + +

    No Containers

    +
    + ); + } +}); + +module.exports = NoContainers; diff --git a/app/Setup.react.js b/app/Setup.react.js index f04f58a969..9f8661eb9e 100644 --- a/app/Setup.react.js +++ b/app/Setup.react.js @@ -1,4 +1,4 @@ -var React = require('react'); +var React = require('react/addons'); var Router = require('react-router'); var Radial = require('./Radial.react.js'); var async = require('async'); @@ -134,6 +134,12 @@ var setupSteps = [ var Setup = React.createClass({ mixins: [ Router.Navigation ], + getInitialState: function () { + return { + message: '', + progress: 0 + }; + }, render: function () { var radial; if (this.state.progress) { diff --git a/app/images/downloading-arrow.png b/app/images/downloading-arrow.png index dfca72b6ae952c1b0579c128d60ae5dabac5ae73..41002b231aa7a1c658a409d54f529631feb76a3d 100644 GIT binary patch delta 231 zcmVc5qiWr!fBEgsl#l#s%gh4PR zqXxo4f_$3lVaS5ZEh^hzy8mZnto!rpUkpr*%;v|^9IWii{{8zjnjqy z{{4LmRA|J)%Czr40|P4%vv9C->|tPFwEFj-2_%OVFk%&j3ScVjcc5~iWvV#G66ABYKc)qiW;I^ zIBFo?5TJS(vf#4Ldd zXwW~#|BRgf82&}=G!|Het`^3}YamFG=jjh23`|Tb{xdQ#G5ljl++o7E5T==I+Wqtg l7q_#Ye8@InRO2uU0RXqFH&W=V5Apy2002ovPDHLkV1nBRYVH64 diff --git a/app/images/downloading-arrow@2x.png b/app/images/downloading-arrow@2x.png index 7f589b2596cfb8a97634137311280e4b0664717a..d354d6eb4f1c37432702bb36800dc7aa000de940 100644 GIT binary patch delta 525 zcmV+o0`mQ<1hWK?F@NnzL_t(o3GJ7^F9bmp$KTuYBPx{~ktlX4{RO%cVFiUmg+`&0 zP^vZPM2AGwS15#~6pcm{I-EOHoRARl<7DS~bGhBD%`s2&v*)+bzet zNdYFNx%tk8+qC-AkoMjD2mp=?5F1%Hx%pFWxtP`?MzmHDVTjKa7BF9~vGh4!ehLuN zfH254>%g1Z?|*W?^J@_#gfrfXJH@7mv(Db#3((gQwwIp(3ztJL(Us0FTZ`bEC`=O3 zWiXt@&M~RZV9i&DH?3>zFa1)`J@{fY60g`SHK;g0Ol;e}wd)er0ZV8Noh5?^1V8@b z%`@0X9+JxRH66$EDp_k0l#Q9ox8eSa$&@SDp)PlePim+Eq8 zLgYa^{CjW5WY>`ylrTdUdsSuYXHVsAv}3LsMaYb^@zz_mNB*rj2|bfjXft}GnS~- zHyP(Ss!ap%Q-AAF+poA!T#6uLa7TJGrY0T9cM^L2vsZtq+E_<`qi&o%%AB&L2tu>9 zfq)P8aL(B-Ii0uf0njvmLguYc3PgN0jMi#5Km1Pmn`E(E3wktOqEXWh;|z*ff1b?M z>53L3zN$l=FeGizR8E!~bD%+qM5df35#L2jZrk1v% zLh<%2=x=E1-{_MdS_rh3Hk;^+|DhoG5~U_hvI+J}504Y6C^Ice(0OK9%_TsDA^-Tcpds4z+zhBE2|;qEnH? zx$b3AFQ8xFSSS*d?QfFwk>U`TVZTD%co!}kVL&L7e1GH^;Y_Pn2W8~AoNtb#2GT^d z)NLhx?S%Y50;K6sxmy5u?^K=hl+kp%2c!hJ^^dflh!hyrdVu-ODfxY2c-}}#@uqT% z;k=hc4WJc3d}yUBGkw{80MWE_N3v(xb&pmw)C;gTGg9IvJOje_)=v3mAC0c=NxO8z zFlZgQ`F|q6Fj;H^$~1eWr&-i??zTDm7-CuHwl@jw%IlNRwwWBY%kzZBTdBeif4P|~ zCnl;V39ZlLc4_1y8c7CRR%wsZ_|yaL^FLlj)l9V^#siu!MhT)O&ofeJaT(_ClbF{kzW YA2y@@2EUaTe*gdg07*qoM6N<$g5j%C(f|Me delta 770 zcmV+d1O5Eh1*Zm(F@NDnL_t(Y4XswqOH@%5Kj*$TO{2{eHjVZH5fx=FBqkJFWeZ2G zpp{sg!d8LOK7z1+pn{-iVYDf6m5@3Ul&*wI7X@Jv6InTi9}_x@oW}c3=e+UhIKByd zba{_+&)4tVckl1s`w;%oPLIy*_4$406~Y+~J4gU~fWSh)Z+`?di9`c`wCa0VADS-( zgKm!4*z9hF{%-bl0D|GfZ~=aRP4eU$5#$i8&Y|dzhmNgKnuUt=o5mN2CxQ5(B+M1jVW-*HxT+6{0D(P7mrrF_X1d)V;9KJ`Ib-OwDfXAqHgDh;y|yuy$1Gz z=I8v%{{)vonLQp0 zU@x}mFVjCIk14uezTm&N(7up;ybzM+C4dwlR-76h-f(PqtsL08Eh4#sEnkr24w}K* zYOjFBd8Ss!R%}VdXU>2qKBZcV1HI~of|%qAw#sF5&-f75MCvm1^{pPwUcsYdsWP7O zcEJ>E^?&MQc#6S#_}D$#a;W)|S70YEqRP6sUn!V^ZL`Rt>`f+ZhTl7}H}f@4@MdMx z*g`#k>J}^;lL71ki4(h~HQ+`5v~p#bgR$4YYBviWd%I9)DD3AvpI`~5U@(E!TH%Gm z8}P=`V*36_g95(eHtfKiH*E-D0oLB73@)h;F~rs A)c^nh diff --git a/app/images/loading@2x.png b/app/images/loading@2x.png index 87a14647c4928623afd8913d5d04842e29e6a569..3f6434a0e60fcb8e035098582a3992233238f77d 100644 GIT binary patch delta 1736 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 U*Cb_{00000NkvXXt^-0~f~R;sUH||9 diff --git a/app/images/roundedcontainer.png b/app/images/roundedcontainer.png new file mode 100644 index 0000000000000000000000000000000000000000..c32e2d6b0beb6b1b127da9478026a4b1fe1485da GIT binary patch literal 1994 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 RoS$f17T0c?R2w@#{V(8&a(n;) literal 0 HcmV?d00001 diff --git a/app/main.js b/app/main.js index 0291606c75..e508dc3261 100644 --- a/app/main.js +++ b/app/main.js @@ -1,12 +1,16 @@ +var module = require('module'); +require.main.paths.splice(0, 0, process.env.NODE_PATH); + +var Bugsnag = require('bugsnag-js'); var React = require('react'); var Router = require('react-router'); var RetinaImage = require('react-retina-image'); -var Raven = require('raven'); var async = require('async'); var docker = require('./docker'); var router = require('./router'); var boot2docker = require('./boot2docker'); var ContainerStore = require('./ContainerStore'); +var app = require('remote').require('app'); var Route = Router.Route; var NotFoundRoute = Router.NotFoundRoute; @@ -14,22 +18,23 @@ var DefaultRoute = Router.DefaultRoute; var Link = Router.Link; var RouteHandler = Router.RouteHandler; -boot2docker.ip(function (err, ip) { - if (window.location.hash !== '#/') { +Bugsnag.apiKey = 'fc51aab02ce9dd1bb6ebc9fe2f4d43d7'; +Bugsnag.autoNotify = true; +Bugsnag.releaseStage = process.env.NODE_ENV === 'development' ? 'development' : 'production'; +Bugsnag.notifyReleaseStages = []; +Bugsnag.appVersion = app.getVersion(); + +if (window.location.hash === '#/') { + router.run(function (Handler) { + React.render(, document.body); + }); +} else { + boot2docker.ip(function (err, ip) { docker.setHost(ip); ContainerStore.init(function () { router.run(function (Handler) { React.render(, document.body); }); }); - } else { - Router.run(routes, function (Handler) { - React.render(, document.body); - }); - } -}); - -if (process.env.NODE_ENV !== 'development') { - Raven.config('https://0a5f032d745d4acaae94ce46f762c586@app.getsentry.com/35057', { - }).install(); + }); } diff --git a/app/routes.js b/app/routes.js index 29549bb5a9..88dcf91bcf 100644 --- a/app/routes.js +++ b/app/routes.js @@ -1,7 +1,8 @@ -var React = require('react'); +var React = require('react/addons'); var Setup = require('./Setup.react'); var Containers = require('./Containers.react'); var ContainerDetails = require('./ContainerDetails.react'); +var NoContainers = require('./NoContainers.react'); var Router = require('react-router'); var Route = Router.Route; @@ -16,16 +17,6 @@ var App = React.createClass({ } }); -var NoContainers = React.createClass({ - render: function () { - return ( -
    - No Containers -
    - ); - } -}); - var routes = ( diff --git a/app/styles/containers.less b/app/styles/containers.less index a8944625bd..c55773efc4 100644 --- a/app/styles/containers.less +++ b/app/styles/containers.less @@ -218,6 +218,19 @@ } } + .no-containers { + flex: 1 auto; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + + h3 { + font-size: 16px; + color: #C7D7D7; + } + } + .details { margin: 0; padding: 0; @@ -267,7 +280,7 @@ flex: 1; overflow: auto; .logs { - user-select: text; + -webkit-user-select: text; font-family: Menlo; font-size: 12px; padding: 44px 45px; diff --git a/app/styles/main.less b/app/styles/main.less index b812f33746..c3861fa157 100644 --- a/app/styles/main.less +++ b/app/styles/main.less @@ -13,7 +13,7 @@ html, body { width: 100%; overflow: hidden; -webkit-font-smoothing: antialiased; - user-select: none; + -webkit-user-select: none; font-family: 'Clear Sans', sans-serif; } @@ -49,8 +49,10 @@ html, body { box-shadow: 0 2px 5px rgba(0, 0, 0, 0.10); border: none; //1px solid #ccc; height: 610px; + display: flex; } .modal-body { + flex: 1 auto; display: flex; flex-direction: row; padding: 32px 32px; @@ -68,7 +70,6 @@ html, body { } section.search { - flex: 0 auto; min-width: 404px; padding-right: 32px; border-right: 1px solid #eee; @@ -81,29 +82,54 @@ html, body { text-align: right; } - input { - border-radius: 20px; - font-size: 13px; - height: 38px; - padding: 8px 16px; - font-weight: 400; - color: #666; - - &:focus { - box-shadow: none; - border-color: #bbb; + .search-bar { + position: relative; + .loading { + position: absolute; + right: 9px; + top: 7px; + width: 24px; + height: 24px; + -webkit-animation-name: spin; + -webkit-animation-duration: 1.8s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; } - &::-webkit-input-placeholder { - color: #ddd; - font-weight: 300; + input { + border-radius: 20px; + font-size: 13px; + height: 38px; + padding: 8px 16px; + font-weight: 400; + color: #666; + + &:focus { + box-shadow: none; + border-color: #bbb; + } + + &::-webkit-input-placeholder { + color: #ddd; + font-weight: 300; + } } } .results { overflow: auto; + .no-results { + text-align: center; + h3 { + color: #ABC0C0; + font-size: 16px; + margin-top: 160px; + } + } + .title { + flex: 0 auto; margin-top: 16px; } @@ -129,7 +155,7 @@ html, body { overflow: hidden; text-overflow: ellipsis; } - .stars { + .properties { color: #A7A7A7; margin-top: 2px; @@ -168,7 +194,7 @@ html, body { height: 100%; } -@-webkit-keyframes translatedownload { +@-webkit-keyframes spin { from { -webkit-transform: rotate(0deg); } diff --git a/browser/main.js b/browser/main.js index ba2c77ebb2..03c1328acc 100644 --- a/browser/main.js +++ b/browser/main.js @@ -16,6 +16,8 @@ if (argv.test) { console.log('Running tests'); } +process.env.NODE_PATH = __dirname + '/../node_modules'; + app.on('activate-with-no-open-windows', function () { if (mainWindow) { mainWindow.show(); @@ -32,6 +34,7 @@ app.on('ready', function() { resizable: true, frame: false }; + mainWindow = new BrowserWindow(windowOptions); mainWindow.hide(); diff --git a/gulpfile.js b/gulpfile.js index 3c850a4430..6be303b775 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -4,8 +4,7 @@ var browserify = require('browserify'); var watchify = require('watchify'); var reactify = require('reactify'); var gulpif = require('gulp-if'); -var uglify = require('gulp-uglify'); -var streamify = require('gulp-streamify'); +var uglify = require('gulp-uglifyjs'); var notify = require('gulp-notify'); var concat = require('gulp-concat'); var less = require('gulp-less'); @@ -22,6 +21,7 @@ var ecstatic = require('ecstatic'); var downloadatomshell = require('gulp-download-atom-shell'); var packagejson = require('./package.json'); var http = require('http'); +var react = require('gulp-react'); var dependencies = Object.keys(packagejson.dependencies); var devDependencies = Object.keys(packagejson.devDependencies); @@ -34,44 +34,9 @@ var options = { }; gulp.task('js', function () { - var bundler = browserify({ - entries: ['./app/main.js'], // Only need initial file, browserify finds the rest - transform: [reactify], // We want to convert JSX to normal javascript - debug: options.dev, // Gives us sourcemapping - builtins: false, - commondir: false, - insertGlobals: false, - detectGlobals: false, - bundleExternal: false, - cache: {}, packageCache: {}, fullPaths: options.dev // Requirement of watchify - }); - - // We set our dependencies as externals on our app bundler when developing - dependencies.forEach(function (dep) { - bundler.external(dep); - }); - - devDependencies.forEach(function (dep) { - bundler.external(dep); - }); - - bundler.external('./app'); - - var bundle = function () { - return bundler.bundle() - .on('error', gutil.log) - .pipe(source('main.js')) - .pipe(gulpif(!options.dev, streamify(uglify()))) - .pipe(gulp.dest(options.dev ? './build' : './dist/osx/' + options.filename + '/Contents/Resources/app/build')) - .pipe(gulpif(options.dev && !options.test, livereload())); - }; - - if (options.dev) { - bundler = watchify(bundler); - bundler.on('update', bundle); - } - - return bundle(); + gulp.src('./app/**/*.js') + .pipe(react()) + .pipe(gulp.dest(options.dev ? './build' : './dist/osx/' + options.filename + '/Contents/Resources/app/build')); }); gulp.task('specs', function () { @@ -147,7 +112,7 @@ gulp.task('copy', function () { gulp.task('dist', function (cb) { var stream = gulp.src('').pipe(shell([ - 'rm -rf ./dist/osx', + '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 %>', @@ -213,6 +178,7 @@ gulp.task('test', ['download', 'copy', 'js', 'images', 'styles', 'specs'], funct }); gulp.task('default', ['download', 'copy', 'js', 'images', 'styles'], function () { + gulp.watch('./app/**/*.js', ['js']); gulp.watch('./app/**/*.html', ['copy']); gulp.watch('./app/styles/**/*.less', ['styles']); gulp.watch('./app/images/**', ['images']); diff --git a/package.json b/package.json index 3d8a7f4720..8bb576cd1d 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,10 @@ }, "bugs": "https://github.com/kitematic/kitematic/issues", "scripts": { - "start": "./script/run" + "start": "gulp", + "preinstall": "./script/deps", + "test": "gulp test", + "release": ". ./script/identity && gulp release" }, "licenses": [ { @@ -24,26 +27,22 @@ "dependencies": { "ansi-to-html": "0.2.0", "async": "^0.9.0", + "bugsnag-js": "git+https://git@github.com/bugsnag/bugsnag-js", "dockerode": "2.0.4", "exec": "0.1.2", - "flux-react": "^2.6.1", + "gulp-react": "^2.0.0", "jquery": "^2.1.3", - "leveldown": "^1.0.0", - "levelup": "git+https://github.com/kitematic/node-levelup.git", "minimist": "^1.1.0", "moment": "2.8.1", - "ncp": "0.6.0", "node-uuid": "1.4.1", "open": "0.0.5", - "raven": "^0.7.2", - "react": "^0.12.1", + "react": "^0.12.2", "react-bootstrap": "^0.13.2", "react-retina-image": "^1.1.2", "react-router": "^0.11.6", "request": "2.42.0", "request-progress": "0.3.1", "retina.js": "^1.1.0", - "tar": "0.1.20", "underscore": "^1.7.0" }, "devDependencies": { @@ -65,9 +64,9 @@ "gulp-sourcemaps": "^1.2.8", "gulp-streamify": "0.0.5", "gulp-uglify": "^0.3.1", + "gulp-uglifyjs": "^0.5.0", "gulp-util": "^3.0.0", "jasmine-tagged": "^1.1.2", - "object-assign": "^2.0.0", "reactify": "^0.15.2", "run-sequence": "^1.0.2", "vinyl-source-stream": "^0.1.1", diff --git a/script/deps b/script/deps new file mode 100755 index 0000000000..77bcae2055 --- /dev/null +++ b/script/deps @@ -0,0 +1,19 @@ +#!/bin/bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +BASE=$DIR/.. +export BOOT2DOCKER_CLI_VERSION=$(node -pe "JSON.parse(process.argv[1])['boot2docker-version']" "$(cat $BASE/package.json)") +export BOOT2DOCKER_CLI_VERSION_FILE=boot2docker-$BOOT2DOCKER_CLI_VERSION + +mkdir -p $BASE/cache + +pushd $BASE/resources > /dev/null + +if [ ! -f $BOOT2DOCKER_CLI_VERSION_FILE ]; then + echo "-----> Downloading Boot2docker CLI..." + rm -rf boot2docker-* + curl -L -o $BOOT2DOCKER_CLI_VERSION_FILE https://github.com/boot2docker/boot2docker-cli/releases/download/v${BOOT2DOCKER_CLI_VERSION}/boot2docker-v${BOOT2DOCKER_CLI_VERSION}-darwin-amd64 + chmod +x $BOOT2DOCKER_CLI_VERSION_FILE +fi + +popd > /dev/null diff --git a/script/env b/script/env deleted file mode 100755 index 343e8551df..0000000000 --- a/script/env +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -BASE=$DIR/.. -export NODE_VERSION="0.11.14" -export NPM="$BASE/cache/node-v$NODE_VERSION/bin/npm" -export NODE="$BASE/cache/node-v$NODE_VERSION/bin/node" -export PATH="$BASE/cache/node-v$NODE_VERSION/bin/:$BASE/node_modules/.bin:$PATH" -export NODE_PATH="$BASE/node_modules" -export BOOT2DOCKER_CLI_VERSION=$($NODE -pe "JSON.parse(process.argv[1])['boot2docker-version']" "$(cat $BASE/package.json)") -export BOOT2DOCKER_CLI_VERSION_FILE=boot2docker-$BOOT2DOCKER_CLI_VERSION - -mkdir -p $BASE/cache - -pushd $BASE/cache > /dev/null - -if [ ! -f "$NODE" ]; then - curl -L -o node-v$NODE_VERSION-darwin-x64.tar.gz http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-darwin-x64.tar.gz - mkdir -p node-v$NODE_VERSION - tar -xzf node-v$NODE_VERSION-darwin-x64.tar.gz --strip-components 1 -C node-v$NODE_VERSION - rm -rf node-v$NODE_VERSION-darwin-x64.tar.gz -fi - -popd > /dev/null - -pushd $BASE/resources > /dev/null - -if [ ! -f $BOOT2DOCKER_CLI_VERSION_FILE ]; then - cecho "-----> Downloading Boot2docker CLI..." $purple - rm -rf boot2docker-* - curl -L -o $BOOT2DOCKER_CLI_VERSION_FILE https://github.com/boot2docker/boot2docker-cli/releases/download/v${BOOT2DOCKER_CLI_VERSION}/boot2docker-v${BOOT2DOCKER_CLI_VERSION}-darwin-amd64 - chmod +x $BOOT2DOCKER_CLI_VERSION_FILE -fi - -popd > /dev/null diff --git a/script/gulp b/script/gulp deleted file mode 100755 index c576fd1f81..0000000000 --- a/script/gulp +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $DIR/env - -gulp $* diff --git a/script/npm b/script/npm deleted file mode 100755 index 2399857240..0000000000 --- a/script/npm +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $DIR/env - -ATOM_SHELL_VERSION=$($NODE -pe "JSON.parse(process.argv[1])['atom-shell-version']" "$(cat package.json)") -export npm_config_disturl=https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist -export npm_config_target=$ATOM_SHELL_VERSION -export npm_config_arch=ia64 - -HOME=~/.atom-shell-gyp $NPM $* diff --git a/script/release b/script/release deleted file mode 100755 index 8b3692473c..0000000000 --- a/script/release +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $DIR/env - -if [ -f $DIR/identity ]; then - source $DIR/identity -fi - -gulp release diff --git a/script/test b/script/test deleted file mode 100755 index 79a951fbad..0000000000 --- a/script/test +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source $DIR/env - -gulp test From bcaa6576ba96a720d425ed6121412c7b10f0acb0 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 25 Jan 2015 13:30:10 -0500 Subject: [PATCH 3/4] Adding correct blue to download button --- app/images/downloading.png | Bin 0 -> 618 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/images/downloading.png diff --git a/app/images/downloading.png b/app/images/downloading.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9e63be82b17bfc9ecbec6683bdf44bef143a06 GIT binary patch literal 618 zcmV-w0+s!VP)Px%BuPX;R5%gslTSz#Q5?sAzqgATvL2$HTCyVNuyrZSoeq&Vi6FYzX*L5ZoLNP43SHfKKYvdcl68w!qEiDi@6UXH zpZELs0RHlWf8t5Ic$k2?f$$Ijl@RD7pc;0PiHYCYRR?C?MCGxAgGAy6B19PK0$_L1dGZIy*4}AvH&8@UcD+QB@0PoS0NeS7f`tch@JvspNyS)RLypS zhcfS;1{5|CJuIY*?rKJ+?cPHW7m3v6rNxzJU(YqqhPn+N5+H|4)8za8p{R0PSik|^ z`-Uj)Hf*c+%zW`CX}R#!+KuJBlF&EomT~_E4q91OEU_5L7D@Q=5SZ| z)OWRjLXGnM>lkaggn(zF^;p-(dE2f-b&~P-p=dLsPLFAOliaWEf~iNjVLxvbwsvqX z7h#7I+@MQ>KV>HG04~aAyjrg{8&7s|IT}gfxBx}3xim4^(VN~1)Eu4e!*)YIRk>BeYO?t+`u7=F1<72|(H~6ZcK`qY07*qoM6N<$ Ef{o1;L;wH) literal 0 HcmV?d00001 From f365cf45e8c0f0091d2134f895220ae03e5e0ce6 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 25 Jan 2015 13:42:33 -0500 Subject: [PATCH 4/4] removing identity for now --- gulpfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index c591d8e552..0f7dc7748c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -30,8 +30,8 @@ var options = { dev: process.argv.indexOf('release') === -1 && process.argv.indexOf('test') === -1, test: process.argv.indexOf('test') !== -1, filename: 'Kitematic.app', - name: 'Kitematic', - signing_identity: fs.readFileSync('./identity') + name: 'Kitematic' + //signing_identity: fs.readFileSync('./identity') }; gulp.task('js', function () {