diff --git a/css/app.css b/css/app.css index 183e4b127..dc0d0731e 100644 --- a/css/app.css +++ b/css/app.css @@ -94,7 +94,7 @@ } .footer { - max-height:6px; + max-height:6px; } #response { @@ -108,3 +108,8 @@ border: 1px solid #DDD; margin-top: 5px; } + +.messages { + overflow: scroll; + max-height: 50px; +} diff --git a/index.html b/index.html index 78ba4134d..02b1f4ea0 100644 --- a/index.html +++ b/index.html @@ -29,6 +29,7 @@
+
diff --git a/js/controllers.js b/js/controllers.js index af8817d50..0d7068b68 100644 --- a/js/controllers.js +++ b/js/controllers.js @@ -6,6 +6,21 @@ function MastheadController($scope) { function DashboardController($scope, Container) { } +function MessageController($scope, Messages) { + $scope.template = 'partials/messages.html'; + $scope.messages = []; + $scope.$watch('messages.length', function(o, n) { + $('#message-display').show(); + }); + + $scope.$on(Messages.event, function(e, msg) { + $scope.messages.push(msg); + setTimeout(function() { + $('#message-display').hide('slow'); + }, 10000); + }); +} + function StatusBarController($scope, Settings) { $scope.template = 'partials/statusbar.html'; @@ -20,95 +35,75 @@ function SideBarController($scope, Container, Settings) { Container.query({all: 0}, function(d) { $scope.containers = d; - }); + }); } -function SettingsController($scope, Auth, System, Docker, Settings) { +function SettingsController($scope, Auth, System, Docker, Settings, Messages) { $scope.auth = {}; $scope.info = {}; $scope.docker = {}; $scope.endpoint = Settings.endpoint; $scope.apiVersion = Settings.version; - $('#response').hide(); - $scope.alertClass = 'block'; - $scope.updateAuthInfo = function() { if ($scope.auth.password != $scope.auth.cpassword) { - setSuccessfulResponse($scope, 'Your passwords do not match.', '#response'); + alert('Your passwords do not match.'); return; } - Auth.update( - {username: $scope.auth.username, email: $scope.auth.email, password: $scope.auth.password}, function(d) { - console.log(d); - setSuccessfulResponse($scope, 'Auth information updated.', '#response'); + Auth.update({ + username: $scope.auth.username, + email: $scope.auth.email, + password: $scope.auth.password + }, function(d) { + Messages.send({class: 'text-success', data: 'Auth information updated.'}); }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + Messages.send({class: 'text-error', data: e.data}); }); }; - Auth.get({}, function(d) { - $scope.auth = d; - }); - - Docker.get({}, function(d) { - $scope.docker = d; - }); - - System.get({}, function(d) { - $scope.info = d; - }); + Auth.get({}, function(d) { $scope.auth = d; }); + Docker.get({}, function(d) { $scope.docker = d; }); + System.get({}, function(d) { $scope.info = d; }); } // Controls the page that displays a single container and actions on that container. -function ContainerController($scope, $routeParams, $location, Container) { - $('#response').hide(); - $scope.alertClass = 'block'; +function ContainerController($scope, $routeParams, $location, Container, Messages) { + $scope.changes = []; $scope.start = function(){ Container.start({id: $routeParams.id}, function(d) { - console.log(d); setSuccessfulResponse($scope, 'Container started.', '#response'); + Messages.send({class: 'text-success', data: 'Container started.'}); }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); - }); + failedRequestHandler(e, Messages); + }); }; $scope.stop = function() { Container.stop({id: $routeParams.id}, function(d) { - console.log(d); - setSuccessfulResponse($scope, 'Container stopped.', '#response'); + Messages.send({class: 'text-success', data: 'Container stopped.'}); }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); }); }; $scope.kill = function() { Container.kill({id: $routeParams.id}, function(d) { - console.log(d); - setSuccessfulResponse($scope, 'Container killed.', '#response'); + Messages.send({class: 'text-success', data: 'Container killed.'}); }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); }); }; $scope.remove = function() { if (confirm("Are you sure you want to remove the container?")) { Container.remove({id: $routeParams.id}, function(d) { - console.log(d); - setSuccessfulResponse($scope, 'Container removed.', '#response'); + Messages.send({class: 'text-success', data: 'Container removed.'}); }, function(e){ - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); }); } }; - $scope.changes = []; - $scope.hasContent = function(data) { return data !== null && data !== undefined && data.length > 1; }; @@ -122,8 +117,7 @@ function ContainerController($scope, $routeParams, $location, Container) { Container.get({id: $routeParams.id}, function(d) { $scope.container = d; }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); if (e.status === 404) { $('.detail').hide(); } @@ -133,7 +127,7 @@ function ContainerController($scope, $routeParams, $location, Container) { } // Controller for the list of containers -function ContainersController($scope, Container, Settings, ViewSpinner) { +function ContainersController($scope, Container, Settings, Messages, ViewSpinner) { $scope.displayAll = Settings.displayAll; $scope.predicate = '-Created'; $scope.toggle = false; @@ -150,7 +144,9 @@ function ContainersController($scope, Container, Settings, ViewSpinner) { angular.forEach(items, function(c) { if (c.Checked) { action({id: c.Id}, function(d) { - console.log(d); + Messages.send({class: 'text-success', data: d}); + }, function(e) { + failedRequestHandler(e, Messages); }); } }); @@ -164,13 +160,12 @@ function ContainersController($scope, Container, Settings, ViewSpinner) { $scope.toggleGetAll = function() { Settings.displayAll = $scope.displayAll; - var u = update; var data = {all: 0}; if ($scope.displayAll) { data.all = 1; } - u(data); + update(data); }; $scope.startAction = function() { @@ -193,10 +188,7 @@ function ContainersController($scope, Container, Settings, ViewSpinner) { } // Controller for the list of images -function ImagesController($scope, Image, ViewSpinner) { - $scope.predicate = '-Created'; - $('#response').hide(); - $scope.alertClass = 'block'; +function ImagesController($scope, Image, ViewSpinner, Messages) { $scope.toggle = false; $scope.showBuilder = function() { @@ -204,10 +196,28 @@ function ImagesController($scope, Image, ViewSpinner) { }; $scope.removeAction = function() { + ViewSpinner.spin(); + var counter = 0; + var complete = function() { + counter = counter - 1; + if (counter === 0) { + ViewSpinner.stop(); + } + }; angular.forEach($scope.images, function(i) { if (i.Checked) { + counter = counter + 1; Image.remove({id: i.Id}, function(d) { - console.log(d); + angular.forEach(d, function(resource) { + Messages.send({class: 'text-success', data: 'Deleted: ' + resource.Deleted}); + }); + //Remove the image from the list + var index = $scope.images.indexOf(i); + $scope.images.splice(index, 1); + complete(); + }, function(e) { + Messages.send({class: 'text-error', data: e.data}); + complete(); }); } }); @@ -224,28 +234,22 @@ function ImagesController($scope, Image, ViewSpinner) { $scope.images = d.map(function(item) { return new ImageViewModel(item); }); ViewSpinner.stop(); }, function (e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); ViewSpinner.stop(); }); } // Controller for a single image and actions on that image -function ImageController($scope, $routeParams, $location, Image) { +function ImageController($scope, $routeParams, $location, Image, Messages) { $scope.history = []; $scope.tag = {repo: '', force: false}; - - $('#response').hide(); - $scope.alertClass = 'block'; $scope.remove = function() { if (confirm("Are you sure you want to delete this image?")) { Image.remove({id: $routeParams.id}, function(d) { - console.log(d); - setSuccessfulResponse($scope, 'Image removed.', '#response'); + Messages.send({class: 'text-success', data: 'Image removed.'}); }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); }); } }; @@ -259,11 +263,9 @@ function ImageController($scope, $routeParams, $location, Image) { $scope.updateTag = function() { var tag = $scope.tag; Image.tag({id: $routeParams.id, repo: tag.repo, force: tag.force ? 1 : 0}, function(d) { - console.log(d); - setSuccessfulResponse($scope, 'Tag added.', '#response'); + Messages.send({class: 'text-success', data: 'Tag added.'}); }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); }); }; @@ -274,8 +276,7 @@ function ImageController($scope, $routeParams, $location, Image) { Image.get({id: $routeParams.id}, function(d) { $scope.image = d; }, function(e) { - console.log(e); - setFailedResponse($scope, e.data, '#response'); + failedRequestHandler(e, Messages); if (e.status === 404) { $('.detail').hide(); } @@ -284,7 +285,7 @@ function ImageController($scope, $routeParams, $location, Image) { $scope.getHistory(); } -function StartContainerController($scope, $routeParams, $location, Container) { +function StartContainerController($scope, $routeParams, $location, Container, Messages) { $scope.template = 'partials/startcontainer.html'; $scope.config = { memory: 0, @@ -296,7 +297,6 @@ function StartContainerController($scope, $routeParams, $location, Container) { $scope.commandPlaceholder = '["/bin/echo", "Hello world"]'; $scope.create = function() { - $scope.response = ''; var cmds = null; if ($scope.config.commands !== '') { cmds = angular.fromJson($scope.config.commands); @@ -313,45 +313,34 @@ function StartContainerController($scope, $routeParams, $location, Container) { Cmd: cmds, VolumesFrom: $scope.config.volumesFrom }, function(d) { - console.log(d); if (d.Id) { ctor.start({id: d.Id}, function(cd) { - console.log(cd); $('#create-modal').modal('hide'); loc.path('/containers/' + d.Id + '/'); }, function(e) { - console.log(e); - s.resonse = e.data; + failedRequestHandler(e, Messages); }); } }, function(e) { - console.log(e); - $scope.response = e.data; + failedRequestHandler(e, Messages); }); }; } -function BuilderController($scope, Dockerfile) { +function BuilderController($scope, Dockerfile, Messages) { $scope.template = '/partials/builder.html'; ace.config.set('basePath', '/lib/ace-builds/src-noconflict/'); $scope.build = function() { - Dockerfile.build(editor.getValue(), function(e) { - console.log(e); + Dockerfile.build(editor.getValue(), function(d) { + Messages.send({class:'text-info', data: d}); + }, function(e) { + Messages.send({class:'text-error', data: e}); }); }; } -function setSuccessfulResponse($scope, msg, msgId) { - $scope.alertClass = 'success'; - $scope.response = msg; - $(msgId).show(); - setTimeout(function() { $(msgId).hide();}, 5000); -} - -function setFailedResponse($scope, msg, msgId) { - $scope.alertClass = 'error'; - $scope.response = msg; - $(msgId).show(); +function failedRequestHandler(e, Messages) { + Messages.send({class: 'text-error', data: e.data}); } diff --git a/js/services.js b/js/services.js index 6aee21839..a59da988c 100644 --- a/js/services.js +++ b/js/services.js @@ -76,6 +76,14 @@ angular.module('dockerui.services', ['ngResource']) stop: function() { spinner.stop(); } }; }) + .factory('Messages', function($rootScope) { + return { + event: 'messageSend', + send: function(msg) { + $rootScope.$broadcast('messageSend', msg); + } + }; + }) .factory('Dockerfile', function(Settings) { var url = Settings.rawUrl + '/build'; return { diff --git a/partials/builder.html b/partials/builder.html index a572322c3..ea2192aaa 100644 --- a/partials/builder.html +++ b/partials/builder.html @@ -4,9 +4,6 @@

Build Image