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