mirror of
https://github.com/portainer/portainer.git
synced 2025-07-23 23:39:41 +02:00
Merge branch 'release/1.10.2'
This commit is contained in:
commit
0e40bb13fc
33 changed files with 191 additions and 41 deletions
|
@ -6,7 +6,7 @@ import (
|
||||||
|
|
||||||
// main is the entry point of the program
|
// main is the entry point of the program
|
||||||
func main() {
|
func main() {
|
||||||
kingpin.Version("1.10.1")
|
kingpin.Version("1.10.2")
|
||||||
var (
|
var (
|
||||||
endpoint = kingpin.Flag("host", "Dockerd endpoint").Default("unix:///var/run/docker.sock").Short('H').String()
|
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()
|
addr = kingpin.Flag("bind", "Address and port to serve Portainer").Default(":9000").Short('p').String()
|
||||||
|
|
|
@ -5,6 +5,7 @@ angular.module('portainer', [
|
||||||
'ui.select',
|
'ui.select',
|
||||||
'ngCookies',
|
'ngCookies',
|
||||||
'ngSanitize',
|
'ngSanitize',
|
||||||
|
'angularUtils.directives.dirPagination',
|
||||||
'portainer.services',
|
'portainer.services',
|
||||||
'portainer.helpers',
|
'portainer.helpers',
|
||||||
'portainer.filters',
|
'portainer.filters',
|
||||||
|
@ -188,4 +189,5 @@ 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('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('CONFIG_ENDPOINT', 'settings')
|
||||||
.constant('TEMPLATES_ENDPOINT', 'templates')
|
.constant('TEMPLATES_ENDPOINT', 'templates')
|
||||||
.constant('UI_VERSION', 'v1.10.1');
|
.constant('PAGINATION_MAX_ITEMS', 10)
|
||||||
|
.constant('UI_VERSION', 'v1.10.2');
|
||||||
|
|
|
@ -207,7 +207,6 @@
|
||||||
<div class="col-lg-12 col-md-12 col-xs-12">
|
<div class="col-lg-12 col-md-12 col-xs-12">
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
<rd-widget-header icon="fa-sitemap" title="Connected networks"></rd-widget-header>
|
<rd-widget-header icon="fa-sitemap" title="Connected networks"></rd-widget-header>
|
||||||
|
|
||||||
<rd-widget-body classes="no-padding">
|
<rd-widget-body classes="no-padding">
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -218,7 +217,7 @@
|
||||||
<th>Actions</th>
|
<th>Actions</th>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="(key, value) in container.NetworkSettings.Networks">
|
<tr dir-paginate="(key, value) in container.NetworkSettings.Networks | itemsPerPage: pagination_count">
|
||||||
<td><a ui-sref="network({id: value.NetworkID})">{{ key }}</a></td>
|
<td><a ui-sref="network({id: value.NetworkID})">{{ key }}</a></td>
|
||||||
<td>{{ value.IPAddress || '-' }}</td>
|
<td>{{ value.IPAddress || '-' }}</td>
|
||||||
<td>{{ value.Gateway || '-' }}</td>
|
<td>{{ value.Gateway || '-' }}</td>
|
||||||
|
@ -229,6 +228,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div class="pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
</rd-widget>
|
</rd-widget>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
angular.module('container', [])
|
angular.module('container', [])
|
||||||
.controller('ContainerController', ['$scope', '$state','$stateParams', '$filter', 'Container', 'ContainerCommit', 'ImageHelper', 'Network', 'Messages',
|
.controller('ContainerController', ['$scope', '$state','$stateParams', '$filter', 'Container', 'ContainerCommit', 'ImageHelper', 'Network', 'Messages', 'Settings',
|
||||||
function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, ImageHelper, Network, Messages) {
|
function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, ImageHelper, Network, Messages, Settings) {
|
||||||
$scope.activityTime = 0;
|
$scope.activityTime = 0;
|
||||||
$scope.portBindings = [];
|
$scope.portBindings = [];
|
||||||
$scope.config = {
|
$scope.config = {
|
||||||
Image: '',
|
Image: '',
|
||||||
Registry: ''
|
Registry: ''
|
||||||
};
|
};
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
var update = function () {
|
var update = function () {
|
||||||
$('#loadingViewSpinner').show();
|
$('#loadingViewSpinner').show();
|
||||||
|
|
|
@ -83,7 +83,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="container in (state.filteredContainers = ( containers | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="container in (state.filteredContainers = ( containers | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td><input type="checkbox" ng-model="container.Checked" ng-change="selectItem(container)"/></td>
|
<td><input type="checkbox" ng-model="container.Checked" ng-change="selectItem(container)"/></td>
|
||||||
<td><span class="label label-{{ container.Status|containerstatusbadge }}">{{ container.Status|containerstatus }}</span></td>
|
<td><span class="label label-{{ container.Status|containerstatusbadge }}">{{ container.Status|containerstatus }}</span></td>
|
||||||
<td ng-if="swarm && !swarm_mode"><a ui-sref="container({id: container.Id})">{{ container|swarmcontainername}}</a></td>
|
<td ng-if="swarm && !swarm_mode"><a ui-sref="container({id: container.Id})">{{ container|swarmcontainername}}</a></td>
|
||||||
|
@ -106,6 +106,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="containers" class="pull-left pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
|
|
|
@ -8,6 +8,7 @@ function ($scope, Container, ContainerHelper, Info, Settings, Messages, Config)
|
||||||
$scope.sortReverse = false;
|
$scope.sortReverse = false;
|
||||||
$scope.state.selectedItemCount = 0;
|
$scope.state.selectedItemCount = 0;
|
||||||
$scope.swarm_mode = false;
|
$scope.swarm_mode = false;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
$scope.order = function (sortType) {
|
$scope.order = function (sortType) {
|
||||||
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
||||||
|
|
|
@ -13,6 +13,7 @@ function ($scope, $state, Service, Volume, Network, ImageHelper, Messages) {
|
||||||
User: '',
|
User: '',
|
||||||
Env: [],
|
Env: [],
|
||||||
Labels: [],
|
Labels: [],
|
||||||
|
ContainerLabels: [],
|
||||||
Volumes: [],
|
Volumes: [],
|
||||||
Network: '',
|
Network: '',
|
||||||
ExtraNetworks: [],
|
ExtraNetworks: [],
|
||||||
|
@ -59,6 +60,14 @@ function ($scope, $state, Service, Volume, Network, ImageHelper, Messages) {
|
||||||
$scope.formValues.Labels.splice(index, 1);
|
$scope.formValues.Labels.splice(index, 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$scope.addContainerLabel = function() {
|
||||||
|
$scope.formValues.ContainerLabels.push({ name: '', value: ''});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.removeContainerLabel = function(index) {
|
||||||
|
$scope.formValues.ContainerLabels.splice(index, 1);
|
||||||
|
};
|
||||||
|
|
||||||
function prepareImageConfig(config, input) {
|
function prepareImageConfig(config, input) {
|
||||||
var imageConfig = ImageHelper.createImageConfig(input.Image, input.Registry);
|
var imageConfig = ImageHelper.createImageConfig(input.Image, input.Registry);
|
||||||
config.TaskTemplate.ContainerSpec.Image = imageConfig.repo + ':' + imageConfig.tag;
|
config.TaskTemplate.ContainerSpec.Image = imageConfig.repo + ':' + imageConfig.tag;
|
||||||
|
@ -113,7 +122,15 @@ function ($scope, $state, Service, Volume, Network, ImageHelper, Messages) {
|
||||||
labels[label.name] = label.value;
|
labels[label.name] = label.value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
config.TaskTemplate.ContainerSpec.Labels = labels;
|
config.Labels = labels;
|
||||||
|
|
||||||
|
var containerLabels = {};
|
||||||
|
input.ContainerLabels.forEach(function (label) {
|
||||||
|
if (label.name && label.value) {
|
||||||
|
containerLabels[label.name] = label.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
config.TaskTemplate.ContainerSpec.Labels = containerLabels;
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareVolumes(config, input) {
|
function prepareVolumes(config, input) {
|
||||||
|
|
|
@ -284,6 +284,35 @@
|
||||||
<!-- !labels-input-list -->
|
<!-- !labels-input-list -->
|
||||||
</div>
|
</div>
|
||||||
<!-- !labels-->
|
<!-- !labels-->
|
||||||
|
<!-- container-labels -->
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="service_env" class="col-sm-1 control-label text-left">Container labels</label>
|
||||||
|
<div class="col-sm-11">
|
||||||
|
<span class="label label-default interactive" ng-click="addContainerLabel()">
|
||||||
|
<i class="fa fa-plus-circle" aria-hidden="true"></i> container label
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- container-labels-input-list -->
|
||||||
|
<div class="col-sm-offset-1 col-sm-11 form-inline" style="margin-top: 10px;">
|
||||||
|
<div ng-repeat="label in formValues.ContainerLabels" style="margin-top: 2px;">
|
||||||
|
<div class="input-group col-sm-5 input-group-sm">
|
||||||
|
<span class="input-group-addon">name</span>
|
||||||
|
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo">
|
||||||
|
</div>
|
||||||
|
<div class="input-group col-sm-5 input-group-sm">
|
||||||
|
<span class="input-group-addon">value</span>
|
||||||
|
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar">
|
||||||
|
<span class="input-group-btn">
|
||||||
|
<button class="btn btn-default" type="button" ng-click="removeContainerLabel($index)">
|
||||||
|
<i class="fa fa-minus" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- !container-labels-input-list -->
|
||||||
|
</div>
|
||||||
|
<!-- !container-labels-->
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<!-- !tab-labels -->
|
<!-- !tab-labels -->
|
||||||
|
|
|
@ -49,13 +49,16 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="event in (events | filter:state.filter | orderBy:sortType:sortReverse)">
|
<tr dir-paginate="event in (events | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count)">
|
||||||
<td>{{ event.Time|getisodatefromtimestamp }}</td>
|
<td>{{ event.Time|getisodatefromtimestamp }}</td>
|
||||||
<td>{{ event.Type }}</td>
|
<td>{{ event.Type }}</td>
|
||||||
<td>{{ event.Details }}</td>
|
<td>{{ event.Details }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="events" class="pull-left pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
|
|
|
@ -4,6 +4,7 @@ function ($scope, Settings, Messages, Events) {
|
||||||
$scope.state = {};
|
$scope.state = {};
|
||||||
$scope.sortType = 'Time';
|
$scope.sortType = 'Time';
|
||||||
$scope.sortReverse = true;
|
$scope.sortReverse = true;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
$scope.order = function(sortType) {
|
$scope.order = function(sortType) {
|
||||||
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="image in (state.filteredImages = (images | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="image in (state.filteredImages = (images | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td><input type="checkbox" ng-model="image.Checked" ng-change="selectItem(image)" /></td>
|
<td><input type="checkbox" ng-model="image.Checked" ng-change="selectItem(image)" /></td>
|
||||||
<td><a ui-sref="image({id: image.Id})">{{ image.Id|truncate:20}}</a></td>
|
<td><a ui-sref="image({id: image.Id})">{{ image.Id|truncate:20}}</a></td>
|
||||||
<td>
|
<td>
|
||||||
|
@ -115,6 +115,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="images" class="pull-left pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
angular.module('images', [])
|
angular.module('images', [])
|
||||||
.controller('ImagesController', ['$scope', '$state', 'Config', 'Image', 'Messages',
|
.controller('ImagesController', ['$scope', '$state', 'Config', 'Image', 'Messages', 'Settings',
|
||||||
function ($scope, $state, Config, Image, Messages) {
|
function ($scope, $state, Config, Image, Messages, Settings) {
|
||||||
$scope.state = {};
|
$scope.state = {};
|
||||||
$scope.sortType = 'RepoTags';
|
$scope.sortType = 'RepoTags';
|
||||||
$scope.sortReverse = true;
|
$scope.sortReverse = true;
|
||||||
$scope.state.selectedItemCount = 0;
|
$scope.state.selectedItemCount = 0;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
$scope.config = {
|
$scope.config = {
|
||||||
Image: '',
|
Image: '',
|
||||||
|
|
|
@ -121,7 +121,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="network in ( state.filteredNetworks = (networks | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="network in ( state.filteredNetworks = (networks | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td><input type="checkbox" ng-model="network.Checked" ng-change="selectItem(network)"/></td>
|
<td><input type="checkbox" ng-model="network.Checked" ng-change="selectItem(network)"/></td>
|
||||||
<td><a ui-sref="network({id: network.Id})">{{ network.Name|truncate:40}}</a></td>
|
<td><a ui-sref="network({id: network.Id})">{{ network.Name|truncate:40}}</a></td>
|
||||||
<td>{{ network.Id }}</td>
|
<td>{{ network.Id }}</td>
|
||||||
|
@ -139,6 +139,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="networks" class="pull-left pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
angular.module('networks', [])
|
angular.module('networks', [])
|
||||||
.controller('NetworksController', ['$scope', '$state', 'Network', 'Config', 'Messages',
|
.controller('NetworksController', ['$scope', '$state', 'Network', 'Config', 'Messages', 'Settings',
|
||||||
function ($scope, $state, Network, Config, Messages) {
|
function ($scope, $state, Network, Config, Messages, Settings) {
|
||||||
$scope.state = {};
|
$scope.state = {};
|
||||||
$scope.state.selectedItemCount = 0;
|
$scope.state.selectedItemCount = 0;
|
||||||
$scope.state.advancedSettings = false;
|
$scope.state.advancedSettings = false;
|
||||||
$scope.sortType = 'Name';
|
$scope.sortType = 'Name';
|
||||||
$scope.sortReverse = false;
|
$scope.sortReverse = false;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
$scope.config = {
|
$scope.config = {
|
||||||
Name: ''
|
Name: ''
|
||||||
};
|
};
|
||||||
|
|
|
@ -137,6 +137,37 @@
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Container labels</td>
|
||||||
|
<td>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-11 nopadding">
|
||||||
|
<span class="label label-default interactive fit-text-size" ng-click="addContainerLabel(service)">
|
||||||
|
<i class="fa fa-plus-circle" aria-hidden="true"></i> container label
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- labels-input-list -->
|
||||||
|
<div class="col-sm-11 form-inline nopadding" style="margin-top: 10px;">
|
||||||
|
<div ng-repeat="label in service.ServiceContainerLabels" style="margin-top: 2px;">
|
||||||
|
<div class="input-group col-sm-5 input-group-sm">
|
||||||
|
<span class="input-group-addon fit-text-size">name</span>
|
||||||
|
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" ng-change="updateLabel(service, label)">
|
||||||
|
</div>
|
||||||
|
<div class="input-group col-sm-5 input-group-sm">
|
||||||
|
<span class="input-group-addon fit-text-size">value</span>
|
||||||
|
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" ng-change="updateLabel(service, label)">
|
||||||
|
<span class="input-group-btn">
|
||||||
|
<button class="btn btn-default" type="button" ng-click="removeContainerLabel(service, $index)">
|
||||||
|
<i class="fa fa-minus" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- !labels-input-list -->
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
|
@ -190,7 +221,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="task in (filteredTasks = ( tasks | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="task in (filteredTasks = ( tasks | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td><a ui-sref="task({ id: task.Id })">{{ task.Id }}</a></td>
|
<td><a ui-sref="task({ id: task.Id })">{{ task.Id }}</a></td>
|
||||||
<td><span class="label label-{{ task.Status|taskstatusbadge }}">{{ task.Status }}</span></td>
|
<td><span class="label label-{{ task.Status|taskstatusbadge }}">{{ task.Status }}</span></td>
|
||||||
<td>{{ task.Slot }}</td>
|
<td>{{ task.Slot }}</td>
|
||||||
|
@ -199,6 +230,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="tasks" class="pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
</rd-widget>
|
</rd-widget>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
angular.module('service', [])
|
angular.module('service', [])
|
||||||
.controller('ServiceController', ['$scope', '$stateParams', '$state', 'Service', 'ServiceHelper', 'Task', 'Node', 'Messages',
|
.controller('ServiceController', ['$scope', '$stateParams', '$state', 'Service', 'ServiceHelper', 'Task', 'Node', 'Messages', 'Settings',
|
||||||
function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Messages) {
|
function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Messages, Settings) {
|
||||||
|
|
||||||
$scope.service = {};
|
$scope.service = {};
|
||||||
$scope.tasks = [];
|
$scope.tasks = [];
|
||||||
$scope.displayNode = false;
|
$scope.displayNode = false;
|
||||||
$scope.sortType = 'Status';
|
$scope.sortType = 'Status';
|
||||||
$scope.sortReverse = false;
|
$scope.sortReverse = false;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
var previousServiceValues = {};
|
var previousServiceValues = {};
|
||||||
|
|
||||||
|
@ -50,6 +51,14 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
|
||||||
$scope.updateLabel = function updateLabel(service, label) {
|
$scope.updateLabel = function updateLabel(service, label) {
|
||||||
service.hasChanges = service.hasChanges || label.value !== label.originalValue;
|
service.hasChanges = service.hasChanges || label.value !== label.originalValue;
|
||||||
};
|
};
|
||||||
|
$scope.addContainerLabel = function addContainerLabel(service) {
|
||||||
|
service.hasChanges = true;
|
||||||
|
service.ServiceContainerLabels.push({ key: '', value: '', originalValue: '' });
|
||||||
|
};
|
||||||
|
$scope.removeContainerLabel = function removeContainerLabel(service, index) {
|
||||||
|
var removedElement = service.ServiceContainerLabels.splice(index, 1);
|
||||||
|
service.hasChanges = service.hasChanges || removedElement !== null;
|
||||||
|
};
|
||||||
|
|
||||||
$scope.cancelChanges = function changeServiceImage(service) {
|
$scope.cancelChanges = function changeServiceImage(service) {
|
||||||
Object.keys(previousServiceValues).forEach(function(attribute) {
|
Object.keys(previousServiceValues).forEach(function(attribute) {
|
||||||
|
@ -60,6 +69,7 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
|
||||||
// clear out environment variable changes
|
// clear out environment variable changes
|
||||||
service.EnvironmentVariables = translateEnvironmentVariables(service.Env);
|
service.EnvironmentVariables = translateEnvironmentVariables(service.Env);
|
||||||
service.ServiceLabels = translateLabelsToServiceLabels(service.Labels);
|
service.ServiceLabels = translateLabelsToServiceLabels(service.Labels);
|
||||||
|
service.ServiceContainerLabels = translateLabelsToServiceLabels(service.ContainerLabels);
|
||||||
|
|
||||||
service.hasChanges = false;
|
service.hasChanges = false;
|
||||||
};
|
};
|
||||||
|
@ -68,8 +78,9 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
|
||||||
$('#loadServicesSpinner').show();
|
$('#loadServicesSpinner').show();
|
||||||
var config = ServiceHelper.serviceToConfig(service.Model);
|
var config = ServiceHelper.serviceToConfig(service.Model);
|
||||||
config.Name = service.newServiceName;
|
config.Name = service.newServiceName;
|
||||||
|
config.Labels = translateServiceLabelsToLabels(service.ServiceLabels);
|
||||||
config.TaskTemplate.ContainerSpec.Env = translateEnvironmentVariablesToEnv(service.EnvironmentVariables);
|
config.TaskTemplate.ContainerSpec.Env = translateEnvironmentVariablesToEnv(service.EnvironmentVariables);
|
||||||
config.TaskTemplate.ContainerSpec.Labels = translateServiceLabelsToLabels(service.ServiceLabels);
|
config.TaskTemplate.ContainerSpec.Labels = translateServiceLabelsToLabels(service.ServiceContainerLabels);
|
||||||
config.TaskTemplate.ContainerSpec.Image = service.newServiceImage;
|
config.TaskTemplate.ContainerSpec.Image = service.newServiceImage;
|
||||||
if (service.Mode === 'replicated') {
|
if (service.Mode === 'replicated') {
|
||||||
config.Mode.Replicated.Replicas = service.Replicas;
|
config.Mode.Replicated.Replicas = service.Replicas;
|
||||||
|
@ -112,6 +123,7 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
|
||||||
service.newServiceReplicas = service.Replicas;
|
service.newServiceReplicas = service.Replicas;
|
||||||
service.EnvironmentVariables = translateEnvironmentVariables(service.Env);
|
service.EnvironmentVariables = translateEnvironmentVariables(service.Env);
|
||||||
service.ServiceLabels = translateLabelsToServiceLabels(service.Labels);
|
service.ServiceLabels = translateLabelsToServiceLabels(service.Labels);
|
||||||
|
service.ServiceContainerLabels = translateLabelsToServiceLabels(service.ContainerLabels);
|
||||||
|
|
||||||
$scope.service = service;
|
$scope.service = service;
|
||||||
Task.query({filters: {service: [service.Name]}}, function (tasks) {
|
Task.query({filters: {service: [service.Name]}}, function (tasks) {
|
||||||
|
@ -152,7 +164,8 @@ function ($scope, $stateParams, $state, Service, ServiceHelper, Task, Node, Mess
|
||||||
if (env) {
|
if (env) {
|
||||||
var variables = [];
|
var variables = [];
|
||||||
env.forEach(function(variable) {
|
env.forEach(function(variable) {
|
||||||
var keyValue = variable.split('=');
|
var idx = variable.indexOf('=');
|
||||||
|
var keyValue = [variable.slice(0,idx), variable.slice(idx+1)];
|
||||||
var originalValue = (keyValue.length > 1) ? keyValue[1] : '';
|
var originalValue = (keyValue.length > 1) ? keyValue[1] : '';
|
||||||
variables.push({ key: keyValue[0], value: originalValue, originalValue: originalValue, added: true});
|
variables.push({ key: keyValue[0], value: originalValue, originalValue: originalValue, added: true});
|
||||||
});
|
});
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
</th>
|
</th>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="service in (state.filteredServices = ( services | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="service in (state.filteredServices = ( services | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td><input type="checkbox" ng-model="service.Checked" ng-change="selectItem(service)"/></td>
|
<td><input type="checkbox" ng-model="service.Checked" ng-change="selectItem(service)"/></td>
|
||||||
<td><a ui-sref="service({id: service.Id})">{{ service.Name }}</a></td>
|
<td><a ui-sref="service({id: service.Id})">{{ service.Name }}</a></td>
|
||||||
<td>{{ service.Image }}</td>
|
<td>{{ service.Image }}</td>
|
||||||
|
@ -77,6 +77,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="services" class="pull-left pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
angular.module('services', [])
|
angular.module('services', [])
|
||||||
.controller('ServicesController', ['$scope', '$stateParams', '$state', 'Service', 'ServiceHelper', 'Messages',
|
.controller('ServicesController', ['$scope', '$stateParams', '$state', 'Service', 'ServiceHelper', 'Messages', 'Settings',
|
||||||
function ($scope, $stateParams, $state, Service, ServiceHelper, Messages) {
|
function ($scope, $stateParams, $state, Service, ServiceHelper, Messages, Settings) {
|
||||||
$scope.state = {};
|
$scope.state = {};
|
||||||
$scope.state.selectedItemCount = 0;
|
$scope.state.selectedItemCount = 0;
|
||||||
$scope.sortType = 'Name';
|
$scope.sortType = 'Name';
|
||||||
$scope.sortReverse = false;
|
$scope.sortReverse = false;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
$scope.scaleService = function scaleService(service) {
|
$scope.scaleService = function scaleService(service) {
|
||||||
$('#loadServicesSpinner').show();
|
$('#loadServicesSpinner').show();
|
||||||
|
|
|
@ -69,11 +69,14 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="processInfos in state.filteredProcesses = (containerTop.Processes | orderBy:sortType:sortReverse)">
|
<tr dir-paginate="processInfos in state.filteredProcesses = (containerTop.Processes | orderBy:sortType:sortReverse | itemsPerPage: pagination_count)">
|
||||||
<td ng-repeat="processInfo in processInfos track by $index">{{processInfo}}</td>
|
<td ng-repeat="processInfo in processInfos track by $index">{{processInfo}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="containerTop.Processes" class="pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
</rd-widget>
|
</rd-widget>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -7,6 +7,7 @@ function (Settings, $scope, Messages, $timeout, Container, ContainerTop, $stateP
|
||||||
$scope.state = {};
|
$scope.state = {};
|
||||||
$scope.sortType = 'CMD';
|
$scope.sortType = 'CMD';
|
||||||
$scope.sortReverse = false;
|
$scope.sortReverse = false;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
$scope.order = function (sortType) {
|
$scope.order = function (sortType) {
|
||||||
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
||||||
$scope.sortType = sortType;
|
$scope.sortType = sortType;
|
||||||
|
|
|
@ -117,7 +117,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="node in (state.filteredNodes = (swarm.Status | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="node in (state.filteredNodes = (swarm.Status | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td>{{ node.name }}</td>
|
<td>{{ node.name }}</td>
|
||||||
<td>{{ node.cpu }}</td>
|
<td>{{ node.cpu }}</td>
|
||||||
<td>{{ node.memory }}</td>
|
<td>{{ node.memory }}</td>
|
||||||
|
@ -127,6 +127,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div class="pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
</rd-widget>
|
</rd-widget>
|
||||||
</div>
|
</div>
|
||||||
|
@ -182,7 +185,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="node in (state.filteredNodes = (nodes | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="node in (state.filteredNodes = (nodes | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td>{{ node.Description.Hostname }}</td>
|
<td>{{ node.Description.Hostname }}</td>
|
||||||
<td>{{ node.Spec.Role }}</td>
|
<td>{{ node.Spec.Role }}</td>
|
||||||
<td>{{ node.Description.Resources.NanoCPUs / 1000000000 }}</td>
|
<td>{{ node.Description.Resources.NanoCPUs / 1000000000 }}</td>
|
||||||
|
@ -192,6 +195,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div class="pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
</rd-widget>
|
</rd-widget>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
angular.module('swarm', [])
|
angular.module('swarm', [])
|
||||||
.controller('SwarmController', ['$scope', 'Info', 'Version', 'Node',
|
.controller('SwarmController', ['$scope', 'Info', 'Version', 'Node', 'Settings',
|
||||||
function ($scope, Info, Version, Node) {
|
function ($scope, Info, Version, Node, Settings) {
|
||||||
|
|
||||||
$scope.sortType = 'Name';
|
$scope.sortType = 'Name';
|
||||||
$scope.sortReverse = true;
|
$scope.sortReverse = true;
|
||||||
|
@ -10,6 +10,7 @@ function ($scope, Info, Version, Node) {
|
||||||
$scope.swarm_mode = false;
|
$scope.swarm_mode = false;
|
||||||
$scope.totalCPU = 0;
|
$scope.totalCPU = 0;
|
||||||
$scope.totalMemory = 0;
|
$scope.totalMemory = 0;
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
$scope.order = function(sortType) {
|
$scope.order = function(sortType) {
|
||||||
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
||||||
|
|
|
@ -121,7 +121,7 @@
|
||||||
</rd-widget-header>
|
</rd-widget-header>
|
||||||
<rd-widget-body classes="padding">
|
<rd-widget-body classes="padding">
|
||||||
<div class="template-list">
|
<div class="template-list">
|
||||||
<div ng-repeat="tpl in templates" class="container-template hvr-underline-from-center" id="template_{{ $index }}" ng-click="selectTemplate($index)">
|
<div dir-paginate="tpl in templates | itemsPerPage: pagination_count" class="container-template hvr-underline-from-center" id="template_{{ tpl.index }}" ng-click="selectTemplate(tpl.index)">
|
||||||
<img class="logo" ng-src="{{ tpl.logo }}" />
|
<img class="logo" ng-src="{{ tpl.logo }}" />
|
||||||
<div class="title">{{ tpl.title }}</div>
|
<div class="title">{{ tpl.title }}</div>
|
||||||
<div class="description">{{ tpl.description }}</div>
|
<div class="description">{{ tpl.description }}</div>
|
||||||
|
@ -133,6 +133,9 @@
|
||||||
No templates available.
|
No templates available.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div ng-if="templates">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
</rd-widget>
|
</rd-widget>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
angular.module('templates', [])
|
angular.module('templates', [])
|
||||||
.controller('TemplatesController', ['$scope', '$q', '$state', '$filter', 'Config', 'Info', 'Container', 'ContainerHelper', 'Image', 'Volume', 'Network', 'Templates', 'TemplateHelper', 'Messages',
|
.controller('TemplatesController', ['$scope', '$q', '$state', '$filter', 'Config', 'Info', 'Container', 'ContainerHelper', 'Image', 'Volume', 'Network', 'Templates', 'TemplateHelper', 'Messages', 'Settings',
|
||||||
function ($scope, $q, $state, $filter, Config, Info, Container, ContainerHelper, Image, Volume, Network, Templates, TemplateHelper, Messages) {
|
function ($scope, $q, $state, $filter, Config, Info, Container, ContainerHelper, Image, Volume, Network, Templates, TemplateHelper, Messages, Settings) {
|
||||||
$scope.state = {
|
$scope.state = {
|
||||||
selectedTemplate: null,
|
selectedTemplate: null,
|
||||||
showAdvancedOptions: false
|
showAdvancedOptions: false
|
||||||
|
@ -10,6 +10,7 @@ function ($scope, $q, $state, $filter, Config, Info, Container, ContainerHelper,
|
||||||
name: "",
|
name: "",
|
||||||
ports: []
|
ports: []
|
||||||
};
|
};
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
var selectedItem = -1;
|
var selectedItem = -1;
|
||||||
|
|
||||||
|
@ -183,7 +184,10 @@ function ($scope, $q, $state, $filter, Config, Info, Container, ContainerHelper,
|
||||||
|
|
||||||
function initTemplates() {
|
function initTemplates() {
|
||||||
Templates.get(function (data) {
|
Templates.get(function (data) {
|
||||||
$scope.templates = data;
|
$scope.templates = data.map(function(tpl,index){
|
||||||
|
tpl.index = index;
|
||||||
|
return tpl;
|
||||||
|
});
|
||||||
$('#loadTemplatesSpinner').hide();
|
$('#loadTemplatesSpinner').hide();
|
||||||
}, function (e) {
|
}, function (e) {
|
||||||
$('#loadTemplatesSpinner').hide();
|
$('#loadTemplatesSpinner').hide();
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="volume in (state.filteredVolumes = (volumes | filter:state.filter | orderBy:sortType:sortReverse))">
|
<tr dir-paginate="volume in (state.filteredVolumes = (volumes | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: pagination_count))">
|
||||||
<td><input type="checkbox" ng-model="volume.Checked" ng-change="selectItem(volume)"/></td>
|
<td><input type="checkbox" ng-model="volume.Checked" ng-change="selectItem(volume)"/></td>
|
||||||
<td>{{ volume.Name|truncate:50 }}</td>
|
<td>{{ volume.Name|truncate:50 }}</td>
|
||||||
<td>{{ volume.Driver }}</td>
|
<td>{{ volume.Driver }}</td>
|
||||||
|
@ -67,6 +67,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div ng-if="volumes" class="pull-left pagination-controls">
|
||||||
|
<dir-pagination-controls></dir-pagination-controls>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</rd-widget-body>
|
</rd-widget-body>
|
||||||
<rd-widget>
|
<rd-widget>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
angular.module('volumes', [])
|
angular.module('volumes', [])
|
||||||
.controller('VolumesController', ['$scope', '$state', 'Volume', 'Messages',
|
.controller('VolumesController', ['$scope', '$state', 'Volume', 'Messages', 'Settings',
|
||||||
function ($scope, $state, Volume, Messages) {
|
function ($scope, $state, Volume, Messages, Settings) {
|
||||||
$scope.state = {};
|
$scope.state = {};
|
||||||
$scope.state.selectedItemCount = 0;
|
$scope.state.selectedItemCount = 0;
|
||||||
$scope.sortType = 'Name';
|
$scope.sortType = 'Name';
|
||||||
|
@ -8,6 +8,7 @@ function ($scope, $state, Volume, Messages) {
|
||||||
$scope.config = {
|
$scope.config = {
|
||||||
Name: ''
|
Name: ''
|
||||||
};
|
};
|
||||||
|
$scope.pagination_count = Settings.pagination_count;
|
||||||
|
|
||||||
$scope.order = function(sortType) {
|
$scope.order = function(sortType) {
|
||||||
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
$scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
|
||||||
|
@ -54,7 +55,7 @@ function ($scope, $state, Volume, Messages) {
|
||||||
function fetchVolumes() {
|
function fetchVolumes() {
|
||||||
$('#loadVolumesSpinner').show();
|
$('#loadVolumesSpinner').show();
|
||||||
Volume.query({}, function (d) {
|
Volume.query({}, function (d) {
|
||||||
$scope.volumes = d.Volumes;
|
$scope.volumes = d.Volumes || [];
|
||||||
$('#loadVolumesSpinner').hide();
|
$('#loadVolumesSpinner').hide();
|
||||||
}, function (e) {
|
}, function (e) {
|
||||||
$('#loadVolumesSpinner').hide();
|
$('#loadVolumesSpinner').hide();
|
||||||
|
|
|
@ -41,8 +41,10 @@ angular.module('portainer.helpers', [])
|
||||||
serviceToConfig: function(service) {
|
serviceToConfig: function(service) {
|
||||||
return {
|
return {
|
||||||
Name: service.Spec.Name,
|
Name: service.Spec.Name,
|
||||||
|
Labels: service.Spec.Labels,
|
||||||
TaskTemplate: service.Spec.TaskTemplate,
|
TaskTemplate: service.Spec.TaskTemplate,
|
||||||
Mode: service.Spec.Mode,
|
Mode: service.Spec.Mode,
|
||||||
|
UpdateConfig: service.Spec.UpdateConfig,
|
||||||
Networks: service.Spec.Networks,
|
Networks: service.Spec.Networks,
|
||||||
EndpointSpec: service.Spec.EndpointSpec
|
EndpointSpec: service.Spec.EndpointSpec
|
||||||
};
|
};
|
||||||
|
|
|
@ -213,7 +213,7 @@ angular.module('portainer.services', ['ngResource', 'ngSanitize'])
|
||||||
get: {method: 'GET', isArray: true}
|
get: {method: 'GET', isArray: true}
|
||||||
});
|
});
|
||||||
}])
|
}])
|
||||||
.factory('Settings', ['DOCKER_ENDPOINT', 'DOCKER_PORT', 'UI_VERSION', function SettingsFactory(DOCKER_ENDPOINT, DOCKER_PORT, UI_VERSION) {
|
.factory('Settings', ['DOCKER_ENDPOINT', 'DOCKER_PORT', 'UI_VERSION', 'PAGINATION_MAX_ITEMS', function SettingsFactory(DOCKER_ENDPOINT, DOCKER_PORT, UI_VERSION, PAGINATION_MAX_ITEMS) {
|
||||||
'use strict';
|
'use strict';
|
||||||
var url = DOCKER_ENDPOINT;
|
var url = DOCKER_ENDPOINT;
|
||||||
if (DOCKER_PORT) {
|
if (DOCKER_PORT) {
|
||||||
|
@ -225,7 +225,8 @@ angular.module('portainer.services', ['ngResource', 'ngSanitize'])
|
||||||
endpoint: DOCKER_ENDPOINT,
|
endpoint: DOCKER_ENDPOINT,
|
||||||
uiVersion: UI_VERSION,
|
uiVersion: UI_VERSION,
|
||||||
url: url,
|
url: url,
|
||||||
firstLoad: firstLoad
|
firstLoad: firstLoad,
|
||||||
|
pagination_count: PAGINATION_MAX_ITEMS
|
||||||
};
|
};
|
||||||
}])
|
}])
|
||||||
.factory('Messages', ['$rootScope', '$sanitize', function MessagesFactory($rootScope, $sanitize) {
|
.factory('Messages', ['$rootScope', '$sanitize', function MessagesFactory($rootScope, $sanitize) {
|
||||||
|
|
|
@ -35,8 +35,9 @@ function ServiceViewModel(data) {
|
||||||
} else {
|
} else {
|
||||||
this.Mode = 'global';
|
this.Mode = 'global';
|
||||||
}
|
}
|
||||||
|
this.Labels = data.Spec.Labels;
|
||||||
if (data.Spec.TaskTemplate.ContainerSpec) {
|
if (data.Spec.TaskTemplate.ContainerSpec) {
|
||||||
this.Labels = data.Spec.TaskTemplate.ContainerSpec.Labels;
|
this.ContainerLabels = data.Spec.TaskTemplate.ContainerSpec.Labels;
|
||||||
}
|
}
|
||||||
if (data.Spec.TaskTemplate.ContainerSpec.Env) {
|
if (data.Spec.TaskTemplate.ContainerSpec.Env) {
|
||||||
this.Env = data.Spec.TaskTemplate.ContainerSpec.Env;
|
this.Env = data.Spec.TaskTemplate.ContainerSpec.Env;
|
||||||
|
|
|
@ -202,3 +202,7 @@ input[type="radio"] {
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pagination-controls {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "portainer",
|
"name": "portainer",
|
||||||
"version": "1.10.1",
|
"version": "1.10.2",
|
||||||
"homepage": "https://github.com/portainer/portainer",
|
"homepage": "https://github.com/portainer/portainer",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Anthony Lapenna <anthony.lapenna at gmail dot com>"
|
"Anthony Lapenna <anthony.lapenna at gmail dot com>"
|
||||||
|
@ -32,6 +32,7 @@
|
||||||
"angular-mocks": "~1.5.0",
|
"angular-mocks": "~1.5.0",
|
||||||
"angular-resource": "~1.5.0",
|
"angular-resource": "~1.5.0",
|
||||||
"angular-ui-select": "~0.17.1",
|
"angular-ui-select": "~0.17.1",
|
||||||
|
"angular-utils-pagination": "~0.11.1",
|
||||||
"bootstrap": "~3.3.6",
|
"bootstrap": "~3.3.6",
|
||||||
"font-awesome": "~4.6.3",
|
"font-awesome": "~4.6.3",
|
||||||
"filesize": "~3.3.0",
|
"filesize": "~3.3.0",
|
||||||
|
|
|
@ -196,6 +196,7 @@ module.exports = function (grunt) {
|
||||||
'bower_components/angular-ui-router/release/angular-ui-router.min.js',
|
'bower_components/angular-ui-router/release/angular-ui-router.min.js',
|
||||||
'bower_components/angular-resource/angular-resource.min.js',
|
'bower_components/angular-resource/angular-resource.min.js',
|
||||||
'bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js',
|
'bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js',
|
||||||
|
'bower_components/angular-utils-pagination/dirPagination.js',
|
||||||
'bower_components/angular-ui-select/dist/select.min.js'],
|
'bower_components/angular-ui-select/dist/select.min.js'],
|
||||||
dest: '<%= distdir %>/js/angular.js'
|
dest: '<%= distdir %>/js/angular.js'
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"author": "Portainer.io",
|
"author": "Portainer.io",
|
||||||
"name": "portainer",
|
"name": "portainer",
|
||||||
"homepage": "http://portainer.io",
|
"homepage": "http://portainer.io",
|
||||||
"version": "1.10.1",
|
"version": "1.10.2",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git@github.com:portainer/portainer.git"
|
"url": "git@github.com:portainer/portainer.git"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue