From e101397a2c2a83647df1826098c1b247eed160b3 Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Sun, 4 Sep 2016 15:33:59 +1200 Subject: [PATCH 1/8] chore(gitter): add gitter badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 36eaf2af6..d4b2ef8e6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Portainer +[![Gitter](https://badges.gitter.im/portainer/Lobby.svg)](https://gitter.im/portainer/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + Portainer is a web interface for the Docker remote API. ![Dashboard](/dashboard.png) From b502852966c94062957ac420f84a6bfb0f3be664 Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Mon, 5 Sep 2016 09:19:34 +1200 Subject: [PATCH 2/8] chore(badge): add the microbadger badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d4b2ef8e6..13ef3f3ea 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Portainer +[![Microbadger](https://images.microbadger.com/badges/image/cloudinovasi/portainer.svg)](http://microbadger.com/images/cloudinovasi/portainer "Image size") [![Gitter](https://badges.gitter.im/portainer/Lobby.svg)](https://gitter.im/portainer/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) Portainer is a web interface for the Docker remote API. From 89d666f3655c69954c43b2c3583d9000f5ea2d4a Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Wed, 7 Sep 2016 16:25:21 +1200 Subject: [PATCH 3/8] style(logo): use latest logo --- assets/images/logo.png | Bin 1917 -> 3092 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/images/logo.png b/assets/images/logo.png index dee08bdde048dd8d9eac53f27880f7fd4ca92f4b..1790cb5371fafecce9875fbd11579d767e015906 100644 GIT binary patch literal 3092 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 D%Ab>> From f56256f89743e0b7096a6ee4a8f09570a6446fce Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Wed, 7 Sep 2016 16:38:54 +1200 Subject: [PATCH 4/8] fix(containers): make hidden containers labels available in the $scope --- app/components/containers/containersController.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/components/containers/containersController.js b/app/components/containers/containersController.js index db2898001..a0000c421 100644 --- a/app/components/containers/containersController.js +++ b/app/components/containers/containersController.js @@ -14,13 +14,13 @@ function ($scope, Container, ContainerHelper, Info, Settings, Messages, Config) $scope.sortType = sortType; }; - var update = function (data, containersToHideLabels) { + var update = function (data) { $('#loadContainersSpinner').show(); $scope.state.selectedItemCount = 0; Container.query(data, function (d) { var containers = d; - if (containersToHideLabels) { - containers = ContainerHelper.hideContainers(d, containersToHideLabels); + if ($scope.containersToHideLabels) { + containers = ContainerHelper.hideContainers(d, $scope.containersToHideLabels); } $scope.containers = containers.map(function (container) { var model = new ContainerViewModel(container); @@ -147,15 +147,15 @@ function ($scope, Container, ContainerHelper, Info, Settings, Messages, Config) $scope.swarm = false; Config.$promise.then(function (c) { - var containersToHideLabels = c.hiddenLabels; + $scope.containersToHideLabels = c.hiddenLabels; $scope.swarm = c.swarm; if (c.swarm) { Info.get({}, function (d) { $scope.swarm_hosts = retrieveSwarmHostsInfo(d); - update({all: Settings.displayAll ? 1 : 0}, containersToHideLabels); + update({all: Settings.displayAll ? 1 : 0}); }); } else { - update({all: Settings.displayAll ? 1 : 0}, containersToHideLabels); + update({all: Settings.displayAll ? 1 : 0}); } }); }]); From 4eb9a9a0afab8e6e8e4d2928e82613a46cfb275f Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Wed, 7 Sep 2016 18:03:55 +1200 Subject: [PATCH 5/8] fix(image): support array in Messages.error --- app/shared/responseHandlers.js | 2 +- app/shared/services.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/shared/responseHandlers.js b/app/shared/responseHandlers.js index 95b7e9c92..16bdc248a 100644 --- a/app/shared/responseHandlers.js +++ b/app/shared/responseHandlers.js @@ -50,8 +50,8 @@ function genericHandler(data) { // This handler returns the original array on success or a newly created array containing // only one JSON object with the field message filled with the error message on failure. function deleteImageHandler(data) { - var response = []; // A string is returned on failure (Docker < 1.12) + var response = []; if (!isJSON(data)) { response.push({message: data}); } diff --git a/app/shared/services.js b/app/shared/services.js index 3d4c53352..b715ebc1d 100644 --- a/app/shared/services.js +++ b/app/shared/services.js @@ -207,12 +207,13 @@ angular.module('portainer.services', ['ngResource', 'ngSanitize']) }); }, error: function (title, e, fallbackText) { - console.log(JSON.stringify(e, null, 4)); var msg = fallbackText; if (e.data && e.data.message) { msg = e.data.message; } else if (e.message) { msg = e.message; + } else if (e.data.length > 0 && e.data[0].message) { + msg = e.data[0].message; } $.gritter.add({ title: $sanitize(title), From ca5cf33c8f45f816dc58d66b86f0e0bc5fb324d6 Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Wed, 7 Sep 2016 18:21:46 +1200 Subject: [PATCH 6/8] fix(volumes): display an error message when trying to delete a bound volume --- app/components/volumes/volumesController.js | 10 +++++++--- app/shared/services.js | 6 ++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/components/volumes/volumesController.js b/app/components/volumes/volumesController.js index 621f9a573..90c9880e5 100644 --- a/app/components/volumes/volumesController.js +++ b/app/components/volumes/volumesController.js @@ -36,9 +36,13 @@ function ($scope, $state, Volume, Messages) { if (volume.Checked) { counter = counter + 1; Volume.remove({name: volume.Name}, function (d) { - Messages.send("Volume deleted", volume.Name); - var index = $scope.volumes.indexOf(volume); - $scope.volumes.splice(index, 1); + if (d.message) { + Messages.error("Unable to remove volume", {}, d.message); + } else { + Messages.send("Volume deleted", volume.Name); + var index = $scope.volumes.indexOf(volume); + $scope.volumes.splice(index, 1); + } complete(); }, function (e) { Messages.error("Failure", e, "Unable to remove volume"); diff --git a/app/shared/services.js b/app/shared/services.js index b715ebc1d..c6cc56501 100644 --- a/app/shared/services.js +++ b/app/shared/services.js @@ -165,7 +165,9 @@ angular.module('portainer.services', ['ngResource', 'ngSanitize']) query: {method: 'GET'}, get: {method: 'GET'}, create: {method: 'POST', params: {action: 'create'}, transformResponse: genericHandler}, - remove: {method: 'DELETE'} + remove: { + method: 'DELETE', transformResponse: genericHandler + } }); }]) .factory('Config', ['$resource', 'CONFIG_ENDPOINT', function ConfigFactory($resource, CONFIG_ENDPOINT) { @@ -212,7 +214,7 @@ angular.module('portainer.services', ['ngResource', 'ngSanitize']) msg = e.data.message; } else if (e.message) { msg = e.message; - } else if (e.data.length > 0 && e.data[0].message) { + } else if (e.data && e.data.length > 0 && e.data[0].message) { msg = e.data[0].message; } $.gritter.add({ From 220faa52e7c896450e4e619ad44ce50033bb4243 Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Wed, 7 Sep 2016 18:28:14 +1200 Subject: [PATCH 7/8] feat(network-creation): disable create button while network name is empty --- app/components/createNetwork/createnetwork.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/createNetwork/createnetwork.html b/app/components/createNetwork/createnetwork.html index 31ed20d37..3b3eecdd4 100644 --- a/app/components/createNetwork/createnetwork.html +++ b/app/components/createNetwork/createnetwork.html @@ -89,7 +89,7 @@
- + Cancel From 9f22e01d3b4380ffc2fc390587b1823f6ed24ed5 Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Wed, 7 Sep 2016 18:31:32 +1200 Subject: [PATCH 8/8] chore(version): bump version number --- api/main.go | 2 +- app/app.js | 2 +- bower.json | 2 +- package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/main.go b/api/main.go index f753151a9..3cc5b5ba9 100644 --- a/api/main.go +++ b/api/main.go @@ -6,7 +6,7 @@ import ( // main is the entry point of the program func main() { - kingpin.Version("1.8.0") + kingpin.Version("1.8.1") var ( endpoint = kingpin.Flag("host", "Dockerd endpoint").Default("unix:///var/run/docker.sock").Short('H').String() addr = kingpin.Flag("bind", "Address and port to serve Portainer").Default(":9000").Short('p').String() diff --git a/app/app.js b/app/app.js index 39abbd9a6..c7e9a3acb 100644 --- a/app/app.js +++ b/app/app.js @@ -164,4 +164,4 @@ angular.module('portainer', [ .constant('DOCKER_PORT', '') // Docker port, leave as an empty string if no port is requred. If you have a port, prefix it with a ':' i.e. :4243 .constant('CONFIG_ENDPOINT', 'settings') .constant('TEMPLATES_ENDPOINT', 'templates') - .constant('UI_VERSION', 'v1.8.0'); + .constant('UI_VERSION', 'v1.8.1'); diff --git a/bower.json b/bower.json index c90092ee5..ddcd38464 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "portainer", - "version": "1.8.0", + "version": "1.8.1", "homepage": "https://github.com/cloud-inovasi/portainer", "authors": [ "Anthony Lapenna " diff --git a/package.json b/package.json index d2ee8fb6b..d21b684b3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Cloud Inovasi", "name": "portainer", "homepage": "https://github.com/cloud-inovasi/portainer", - "version": "1.8.0", + "version": "1.8.1", "repository": { "type": "git", "url": "git@github.com:cloud-inovasi/portainer.git"