fix(app): add github action for linting and formatting [EE-2344] (#6356)

pull/6389/head^2
Chaim Lev-Ari 3 years ago committed by GitHub
parent 34cc8ea96a
commit 1b1a50d6b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -99,3 +99,7 @@ overrides:
'jest/globals': true 'jest/globals': true
rules: rules:
'react/jsx-no-constructed-context-values': off 'react/jsx-no-constructed-context-values': off
- files:
- app/**/*.stories.*
rules:
'no-alert': off

@ -0,0 +1,4 @@
# prettier
cf5056d9c03b62d91a25c3b9127caac838695f98
# prettier v2 (put here after fix/EE-2344/fix-eslint-issues is merged)

@ -0,0 +1,41 @@
name: Lint
on:
push:
branches:
- master
- develop
- release/*
pull_request:
branches:
- master
- develop
- release/*
jobs:
run-linters:
name: Run linters
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v1
with:
node-version: 12
# ESLint and Prettier must be in `package.json`
- name: Install Node.js dependencies
run: yarn
- name: Run linters
uses: wearerequired/lint-action@v1
with:
eslint: true
eslint_extensions: ts,tsx,js,jsx
prettier: true
prettier_dir: app/
gofmt: true
gofmt_dir: api/

@ -0,0 +1,11 @@
name: Test Frontend
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install modules
run: yarn
- name: Run tests
run: yarn test:client

@ -4,21 +4,16 @@
"htmlWhitespaceSensitivity": "strict", "htmlWhitespaceSensitivity": "strict",
"overrides": [ "overrides": [
{ {
"files": [ "files": ["*.html"],
"*.html"
],
"options": { "options": {
"parser": "angular" "parser": "angular"
} }
}, },
{ {
"files": [ "files": ["*.{j,t}sx", "*.ts"],
"*.{j,t}sx",
"*.ts"
],
"options": { "options": {
"printWidth": 80 "printWidth": 80
} }
} }
] ]
} }

@ -1,4 +1,5 @@
{ {
"go.lintTool": "golangci-lint", "go.lintTool": "golangci-lint",
"go.lintFlags": ["--fast", "-E", "exportloopref"] "go.lintFlags": ["--fast", "-E", "exportloopref"],
"gitlens.advanced.blame.customArguments": ["ignore-revs-file", ".git-blame-ignore-revs"]
} }

@ -34,10 +34,10 @@ func (store *Store) Init() error {
AutoCreateUsers: true, AutoCreateUsers: true,
TLSConfig: portainer.TLSConfiguration{}, TLSConfig: portainer.TLSConfiguration{},
SearchSettings: []portainer.LDAPSearchSettings{ SearchSettings: []portainer.LDAPSearchSettings{
portainer.LDAPSearchSettings{}, {},
}, },
GroupSearchSettings: []portainer.LDAPGroupSearchSettings{ GroupSearchSettings: []portainer.LDAPGroupSearchSettings{
portainer.LDAPGroupSearchSettings{}, {},
}, },
}, },
OAuthSettings: portainer.OAuthSettings{}, OAuthSettings: portainer.OAuthSettings{},

@ -95,7 +95,7 @@ func createEdgeClient(endpoint *portainer.Endpoint, signatureService portainer.D
if err != nil { if err != nil {
return nil, err return nil, err
} }
endpointURL := fmt.Sprintf("http://127.0.0.1:%d", tunnel.Port) endpointURL := fmt.Sprintf("http://127.0.0.1:%d", tunnel.Port)
return client.NewClientWithOpts( return client.NewClientWithOpts(

@ -33,7 +33,7 @@ func (s StringSet) List() []string {
list := make([]string, s.Len()) list := make([]string, s.Len())
i := 0 i := 0
for k, _ := range s { for k := range s {
list[i] = k list[i] = k
i++ i++
} }

@ -4,9 +4,9 @@ import (
"errors" "errors"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api"
"strconv" "strconv"
"strings" "strings"
portainer "github.com/portainer/portainer/api"
"net/http" "net/http"
) )

@ -21,7 +21,7 @@ type registryConfigurePayload struct {
// Password used to authenticate against this registry. required when Authentication is true // Password used to authenticate against this registry. required when Authentication is true
Password string `example:"registry_password"` Password string `example:"registry_password"`
// ECR region // ECR region
Region string Region string
// Use TLS // Use TLS
TLS bool `example:"true"` TLS bool `example:"true"`
// Skip the verification of the server TLS certificate // Skip the verification of the server TLS certificate

@ -25,13 +25,13 @@ type registryUpdatePayload struct {
// Username used to authenticate against this registry. Required when Authentication is true // Username used to authenticate against this registry. Required when Authentication is true
Username *string `example:"registry_user"` Username *string `example:"registry_user"`
// Password used to authenticate against this registry. required when Authentication is true // Password used to authenticate against this registry. required when Authentication is true
Password *string `example:"registry_password"` Password *string `example:"registry_password"`
// Quay data // Quay data
Quay *portainer.QuayRegistryData Quay *portainer.QuayRegistryData
// Registry access control // Registry access control
RegistryAccesses *portainer.RegistryAccesses `json:",omitempty"` RegistryAccesses *portainer.RegistryAccesses `json:",omitempty"`
// ECR data // ECR data
Ecr *portainer.EcrData `json:",omitempty"` Ecr *portainer.EcrData `json:",omitempty"`
} }
func (payload *registryUpdatePayload) Validate(r *http.Request) error { func (payload *registryUpdatePayload) Validate(r *http.Request) error {

@ -17,7 +17,7 @@ import (
type webhookCreatePayload struct { type webhookCreatePayload struct {
ResourceID string ResourceID string
EndpointID int EndpointID int
RegistryID portainer.RegistryID RegistryID portainer.RegistryID
WebhookType int WebhookType int
} }

@ -80,13 +80,13 @@ func (handler *Handler) executeServiceWebhook(
} }
service.Spec.TaskTemplate.ForceUpdate++ service.Spec.TaskTemplate.ForceUpdate++
var imageName = strings.Split(service.Spec.TaskTemplate.ContainerSpec.Image, "@sha")[0] var imageName = strings.Split(service.Spec.TaskTemplate.ContainerSpec.Image, "@sha")[0]
if imageTag != "" { if imageTag != "" {
var tagIndex = strings.LastIndex(imageName, ":") var tagIndex = strings.LastIndex(imageName, ":")
if tagIndex == -1 { if tagIndex == -1 {
tagIndex = len(imageName) tagIndex = len(imageName)
} }
service.Spec.TaskTemplate.ContainerSpec.Image = imageName[:tagIndex] + ":" + imageTag service.Spec.TaskTemplate.ContainerSpec.Image = imageName[:tagIndex] + ":" + imageTag
} else { } else {

@ -12,4 +12,4 @@ func (transport *baseTransport) proxyDeploymentsRequest(request *http.Request, n
default: default:
return transport.executeKubernetesRequest(request) return transport.executeKubernetesRequest(request)
} }
} }

@ -12,4 +12,4 @@ func (transport *baseTransport) proxyPodsRequest(request *http.Request, namespac
default: default:
return transport.executeKubernetesRequest(request) return transport.executeKubernetesRequest(request)
} }
} }

@ -14,4 +14,4 @@ func (transport *baseTransport) refreshRegistry(request *http.Request, namespace
err = registryutils.RefreshEcrSecret(cli, transport.endpoint, transport.dataStore, namespace) err = registryutils.RefreshEcrSecret(cli, transport.endpoint, transport.dataStore, namespace)
return return
} }

@ -101,4 +101,4 @@ func Test_FilterByExcludeIDs(t *testing.T) {
tt.asserts(t, output) tt.asserts(t, output)
}) })
} }
} }

@ -50,7 +50,7 @@ func (factory *ClientFactory) GetInstanceID() (instanceID string) {
} }
// Remove the cached kube client so a new one can be created // Remove the cached kube client so a new one can be created
func (factory *ClientFactory) RemoveKubeClient(endpointID portainer.EndpointID) { func (factory *ClientFactory) RemoveKubeClient(endpointID portainer.EndpointID) {
factory.endpointClients.Remove(strconv.Itoa(int(endpointID))) factory.endpointClients.Remove(strconv.Itoa(int(endpointID)))
} }

@ -16,8 +16,8 @@ import (
const ( const (
secretDockerConfigKey = ".dockerconfigjson" secretDockerConfigKey = ".dockerconfigjson"
labelRegistryType = "io.portainer.kubernetes.registry.type" labelRegistryType = "io.portainer.kubernetes.registry.type"
annotationRegistryID = "portainer.io/registry.id" annotationRegistryID = "portainer.io/registry.id"
) )
type ( type (

@ -1,3 +1,3 @@
<button type="button" ngf-select="$ctrl.onFileSelected($file)" class="btn ng-scope" button-spinner="$ctrl.state.uploadInProgress"> <button type="button" ngf-select="$ctrl.onFileSelected($file)" class="btn ng-scope" button-spinner="$ctrl.state.uploadInProgress">
<i style="margin: 0;" class="fa fa-upload" ng-if="!$ctrl.state.uploadInProgress"></i> <i style="margin: 0" class="fa fa-upload" ng-if="!$ctrl.state.uploadInProgress"></i>
</button> </button>

@ -41,9 +41,7 @@
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ModTime' && $ctrl.state.reverseOrder"></i> <i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ModTime' && $ctrl.state.reverseOrder"></i>
</a> </a>
</th> </th>
<th> <th> Actions </th>
Actions
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

@ -1,18 +1,18 @@
{ {
"name": "Portainer", "name": "Portainer",
"icons": [ "icons": [
{ {
"src": "ico/android-chrome-192x192.png", "src": "ico/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "ico/android-chrome-256x256.png", "src": "ico/android-chrome-256x256.png",
"sizes": "256x256", "sizes": "256x256",
"type": "image/png" "type": "image/png"
} }
], ],
"theme_color": "#ffffff", "theme_color": "#ffffff",
"background_color": "#ffffff", "background_color": "#ffffff",
"display": "standalone" "display": "standalone"
} }

@ -1,7 +1,5 @@
<div> <div>
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Azure configuration </div>
Azure configuration
</div>
<!-- applicationId-input --> <!-- applicationId-input -->
<div class="form-group"> <div class="form-group">
<label for="azure_credential_appid" class="col-sm-3 col-lg-2 control-label text-left">Application ID</label> <label for="azure_credential_appid" class="col-sm-3 col-lg-2 control-label text-left">Application ID</label>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="actionBar"> <div class="actionBar">
<button type="button" class="btn btn-sm btn-danger" ng-disabled="$ctrl.state.selectedItemCount === 0" ng-click="$ctrl.removeAction($ctrl.state.selectedItems)"> <button type="button" class="btn btn-sm btn-danger" ng-disabled="$ctrl.state.selectedItemCount === 0" ng-click="$ctrl.removeAction($ctrl.state.selectedItems)">
@ -46,9 +46,7 @@
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Location' && $ctrl.state.reverseOrder"></i> <i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Location' && $ctrl.state.reverseOrder"></i>
</a> </a>
</th> </th>
<th> <th> Published Ports </th>
Published Ports
</th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('ResourceControl.Ownership')"> <a ng-click="$ctrl.changeOrderBy('ResourceControl.Ownership')">
Ownership Ownership
@ -98,9 +96,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -8,9 +8,7 @@
<rd-widget> <rd-widget>
<rd-widget-body> <rd-widget-body>
<div class="form-horizontal" autocomplete="off"> <div class="form-horizontal" autocomplete="off">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Azure settings </div>
Azure settings
</div>
<!-- subscription-input --> <!-- subscription-input -->
<div class="form-group"> <div class="form-group">
<label for="azure_subscription" class="col-sm-2 control-label text-left">Subscription</label> <label for="azure_subscription" class="col-sm-2 control-label text-left">Subscription</label>
@ -35,9 +33,7 @@
</div> </div>
</div> </div>
<!-- !location-input --> <!-- !location-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Container configuration </div>
Container configuration
</div>
<!-- name-input --> <!-- name-input -->
<div class="form-group"> <div class="form-group">
<label for="container_name" class="col-sm-2 control-label text-left">Name</label> <label for="container_name" class="col-sm-2 control-label text-left">Name</label>
@ -68,15 +64,15 @@
<label class="control-label text-left">Port mapping</label> <label class="control-label text-left">Port mapping</label>
</div> </div>
<!-- port-mapping-input-list --> <!-- port-mapping-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="binding in $ctrl.container.Ports" style="margin-top: 2px;"> <div ng-repeat="binding in $ctrl.container.Ports" style="margin-top: 2px">
<!-- host-port --> <!-- host-port -->
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">host</span> <span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="binding.host" placeholder="e.g. 80" disabled /> <input type="text" class="form-control" ng-model="binding.host" placeholder="e.g. 80" disabled />
</div> </div>
<!-- !host-port --> <!-- !host-port -->
<span style="margin: 0 10px 0 10px;"> <span style="margin: 0 10px 0 10px">
<i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i> <i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i>
</span> </span>
<!-- container-port --> <!-- container-port -->
@ -100,17 +96,13 @@
<!-- !port-mapping --> <!-- !port-mapping -->
<!-- public-ip --> <!-- public-ip -->
<div class="form-group" ng-if="$ctrl.container.AllocatePublicIP"> <div class="form-group" ng-if="$ctrl.container.AllocatePublicIP">
<label for="public_ip" class="col-sm-2 control-label text-left"> <label for="public_ip" class="col-sm-2 control-label text-left"> Public IP </label>
Public IP
</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input type="text" class="form-control" ng-model="$ctrl.container.IPAddress" disabled /> <input type="text" class="form-control" ng-model="$ctrl.container.IPAddress" disabled />
</div> </div>
</div> </div>
<!-- public-ip --> <!-- public-ip -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Container resources </div>
Container resources
</div>
<!-- cpu-input --> <!-- cpu-input -->
<div class="form-group"> <div class="form-group">
<label for="container_cpu" class="col-sm-2 control-label text-left">CPU</label> <label for="container_cpu" class="col-sm-2 control-label text-left">CPU</label>

@ -8,9 +8,7 @@
<rd-widget> <rd-widget>
<rd-widget-body> <rd-widget-body>
<form class="form-horizontal" autocomplete="off" name="aciForm"> <form class="form-horizontal" autocomplete="off" name="aciForm">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Azure settings </div>
Azure settings
</div>
<!-- subscription-input --> <!-- subscription-input -->
<div class="form-group"> <div class="form-group">
<label for="azure_subscription" class="col-sm-1 control-label text-left">Subscription</label> <label for="azure_subscription" class="col-sm-1 control-label text-left">Subscription</label>
@ -46,9 +44,7 @@
</div> </div>
</div> </div>
<!-- !location-input --> <!-- !location-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Container configuration </div>
Container configuration
</div>
<!-- name-input --> <!-- name-input -->
<div class="form-group"> <div class="form-group">
<label for="container_name" class="col-sm-1 control-label text-left">Name</label> <label for="container_name" class="col-sm-1 control-label text-left">Name</label>
@ -94,20 +90,20 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left">Port mapping</label> <label class="control-label text-left">Port mapping</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addPortBinding()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addPortBinding()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> map additional port <i class="fa fa-plus-circle" aria-hidden="true"></i> map additional port
</span> </span>
</div> </div>
<!-- port-mapping-input-list --> <!-- port-mapping-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="binding in model.Ports" style="margin-top: 2px;"> <div ng-repeat="binding in model.Ports" style="margin-top: 2px">
<!-- host-port --> <!-- host-port -->
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">host</span> <span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="binding.host" placeholder="e.g. 80" /> <input type="text" class="form-control" ng-model="binding.host" placeholder="e.g. 80" />
</div> </div>
<!-- !host-port --> <!-- !host-port -->
<span style="margin: 0 10px 0 10px;"> <span style="margin: 0 10px 0 10px">
<i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i> <i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i>
</span> </span>
<!-- container-port --> <!-- container-port -->
@ -138,9 +134,7 @@
</div> </div>
<!-- public-ip --> <!-- public-ip -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Container resources </div>
Container resources
</div>
<!-- cpu-input --> <!-- cpu-input -->
<div class="form-group"> <div class="form-group">
<label for="container_cpu" class="col-sm-1 control-label text-left">CPU</label> <label for="container_cpu" class="col-sm-1 control-label text-left">CPU</label>
@ -161,16 +155,14 @@
<por-access-control-form form-data="model.AccessControlData"></por-access-control-form> <por-access-control-form form-data="model.AccessControlData"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button type="button" class="btn btn-primary btn-sm" ng-disabled="state.actionInProgress" ng-click="create()" button-spinner="state.actionInProgress"> <button type="button" class="btn btn-primary btn-sm" ng-disabled="state.actionInProgress" ng-click="create()" button-spinner="state.actionInProgress">
<span ng-hide="state.actionInProgress">Deploy the container</span> <span ng-hide="state.actionInProgress">Deploy the container</span>
<span ng-show="state.actionInProgress">Deployment in progress...</span> <span ng-show="state.actionInProgress">Deployment in progress...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -1,12 +1,10 @@
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Container capabilities </div>
Container capabilities
</div>
<div class="form-group"> <div class="form-group">
<div ng-repeat="cap in $ctrl.capabilities" class="col-xs-12 col-sm-6 col-md-4"> <div ng-repeat="cap in $ctrl.capabilities" class="col-xs-12 col-sm-6 col-md-4">
<div class="row"> <div class="row">
<div class="col-xs-8"> <div class="col-xs-8">
<label for="capability" class="control-label text-left" style="display: flex; padding: 0;"> <label for="capability" class="control-label text-left" style="display: flex; padding: 0">
{{ cap.capability }} {{ cap.capability }}
<portainer-tooltip position="bottom" message="{{ cap.description }}"></portainer-tooltip> <portainer-tooltip position="bottom" message="{{ cap.description }}"></portainer-tooltip>
</label> </label>

@ -2,15 +2,13 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -18,9 +16,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -29,7 +25,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -133,9 +129,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="actionBar"> <div class="actionBar">
<form class="form-horizontal"> <form class="form-horizontal">
@ -99,9 +99,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -34,9 +34,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -65,9 +65,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,15 +2,13 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -18,9 +16,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -29,7 +25,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -115,9 +111,7 @@
</div> </div>
<div class="dropdown-menu" uib-dropdown-menu> <div class="dropdown-menu" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Filter by usage </div>
Filter by usage
</div>
<div class="menuContent"> <div class="menuContent">
<div class="md-checkbox"> <div class="md-checkbox">
<input id="filter_usage_usedImages" type="checkbox" ng-model="$ctrl.filters.state.showUsedImages" ng-change="$ctrl.onstateFilterChange()" /> <input id="filter_usage_usedImages" type="checkbox" ng-model="$ctrl.filters.state.showUsedImages" ng-change="$ctrl.onstateFilterChange()" />
@ -178,7 +172,7 @@
item.Id | truncate: 40 item.Id | truncate: 40
}}</a> }}</a>
<span ng-if="$ctrl.offlineMode">{{ item.Id | truncate: 40 }}</span> <span ng-if="$ctrl.offlineMode">{{ item.Id | truncate: 40 }}</span>
<span style="margin-left: 10px;" class="label label-warning image-tag" ng-if="::item.ContainerCount === 0">Unused</span> <span style="margin-left: 10px" class="label label-warning image-tag" ng-if="::item.ContainerCount === 0">Unused</span>
</td> </td>
<td> <td>
<span class="label label-primary image-tag" ng-repeat="tag in (item | repotags) track by $index">{{ tag }}</span> <span class="label label-primary image-tag" ng-repeat="tag in (item | repotags) track by $index">{{ tag }}</span>
@ -201,9 +195,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -94,9 +94,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -17,7 +17,7 @@
<td> <td>
<a ng-if="!parentCtrl.offlineMode" ui-sref="docker.networks.network({ id: item.Id, nodeName: item.NodeName })" title="{{ item.Name }}">{{ item.Name | truncate: 40 }}</a> <a ng-if="!parentCtrl.offlineMode" ui-sref="docker.networks.network({ id: item.Id, nodeName: item.NodeName })" title="{{ item.Name }}">{{ item.Name | truncate: 40 }}</a>
<span ng-if="parentCtrl.offlineMode">{{ item.Name | truncate: 40 }}</span> <span ng-if="parentCtrl.offlineMode">{{ item.Name | truncate: 40 }}</span>
<span style="margin-left: 10px;" class="label label-info image-tag space-left" ng-if="item.ResourceControl.System">System</span> <span style="margin-left: 10px" class="label label-info image-tag space-left" ng-if="item.ResourceControl.System">System</span>
</td> </td>
<td>{{ item.StackName ? item.StackName : '-' }}</td> <td>{{ item.StackName ? item.StackName : '-' }}</td>
<td>{{ item.Driver }}</td> <td>{{ item.Driver }}</td>

@ -2,15 +2,13 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -18,9 +16,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -29,7 +25,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -72,7 +68,7 @@
<table class="table table-hover nowrap-cells"> <table class="table table-hover nowrap-cells">
<thead> <thead>
<tr> <tr>
<th style="width: 55px;"> <th style="width: 55px">
<span class="md-checkbox" ng-if="!$ctrl.offlineMode" authorization="DockerNetworkDelete, DockerNetworkCreate"> <span class="md-checkbox" ng-if="!$ctrl.offlineMode" authorization="DockerNetworkDelete, DockerNetworkCreate">
<input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" /> <input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" />
<label for="select_all"></label> <label for="select_all"></label>
@ -186,9 +182,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -85,9 +85,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,15 +2,13 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -18,9 +16,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -29,7 +25,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -150,9 +146,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,15 +2,13 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -18,9 +16,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -29,7 +25,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -133,9 +129,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<table class="table table-condensed table-hover nowrap-cells"> <table class="table table-condensed table-hover nowrap-cells">
<thead> <thead>
<tr> <tr>
<th uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.filters.state.open" style="width: 10%;"> <th uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.filters.state.open" style="width: 10%">
<a ng-click="$ctrl.changeOrderBy('Status.State')"> <a ng-click="$ctrl.changeOrderBy('Status.State')">
Status Status
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Status.State' && !$ctrl.state.reverseOrder"></i> <i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Status.State' && !$ctrl.state.reverseOrder"></i>
@ -14,9 +14,7 @@
</span> </span>
<div class="dropdown-menu" uib-dropdown-menu> <div class="dropdown-menu" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Filter by state </div>
Filter by state
</div>
<div class="menuContent"> <div class="menuContent">
<div class="md-checkbox" ng-repeat="filter in $ctrl.filters.state.values track by $index"> <div class="md-checkbox" ng-repeat="filter in $ctrl.filters.state.values track by $index">
<input id="filter_state_{{ $ctrl.serviceId }}_{{ $index }}" type="checkbox" ng-model="filter.display" ng-change="$ctrl.onStateFilterChange()" /> <input id="filter_state_{{ $ctrl.serviceId }}_{{ $index }}" type="checkbox" ng-model="filter.display" ng-change="$ctrl.onStateFilterChange()" />
@ -29,7 +27,7 @@
</div> </div>
</div> </div>
</th> </th>
<th style="width: 22%;">Task</th> <th style="width: 22%">Task</th>
<th>Actions</th> <th>Actions</th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Slot')"> <a ng-click="$ctrl.changeOrderBy('Slot')">

@ -2,16 +2,14 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<datatable-columns-visibility columns="$ctrl.columnVisibility.columns" on-change="($ctrl.onColumnVisibilityChange)"></datatable-columns-visibility> <datatable-columns-visibility columns="$ctrl.columnVisibility.columns" on-change="($ctrl.onColumnVisibilityChange)"></datatable-columns-visibility>
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -19,9 +17,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -30,7 +26,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -66,7 +62,7 @@
<table class="table table-hover nowrap-cells"> <table class="table table-hover nowrap-cells">
<thead> <thead>
<tr> <tr>
<th style="width: 55px;"> <th style="width: 55px">
<span class="md-checkbox" authorization="DockerServiceUpdate, DockerServiceDelete, DockerServiceCreate"> <span class="md-checkbox" authorization="DockerServiceUpdate, DockerServiceDelete, DockerServiceCreate">
<input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" /> <input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" />
<label for="select_all"></label> <label for="select_all"></label>
@ -218,9 +214,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -106,9 +106,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,15 +2,13 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
<div class="settings"> <div class="settings">
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open"> <span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
<span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span> <span uib-dropdown-toggle><i class="fa fa-cog" aria-hidden="true"></i> Settings</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -18,9 +16,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -29,7 +25,7 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -88,9 +84,7 @@
</div> </div>
<div class="dropdown-menu" uib-dropdown-menu> <div class="dropdown-menu" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Filter by usage </div>
Filter by usage
</div>
<div class="menuContent"> <div class="menuContent">
<div class="md-checkbox"> <div class="md-checkbox">
<input id="filter_usage_usedImages" type="checkbox" ng-model="$ctrl.filters.state.showUsedVolumes" ng-change="$ctrl.onstateFilterChange()" /> <input id="filter_usage_usedImages" type="checkbox" ng-model="$ctrl.filters.state.showUsedVolumes" ng-change="$ctrl.onstateFilterChange()" />
@ -170,7 +164,7 @@
<i class="fa fa-search"></i> browse <i class="fa fa-search"></i> browse
</a> </a>
</btn> </btn>
<span style="margin-left: 10px;" class="label label-warning image-tag space-left" ng-if="item.dangling">Unused</span> <span style="margin-left: 10px" class="label label-warning image-tag space-left" ng-if="item.dangling">Unused</span>
</td> </td>
<td>{{ item.StackName ? item.StackName : '-' }}</td> <td>{{ item.StackName ? item.StackName : '-' }}</td>
<td>{{ item.Driver }}</td> <td>{{ item.Driver }}</td>
@ -198,9 +192,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -19,9 +19,7 @@
<td colspan="2" class="text-center text-muted">Loading...</td> <td colspan="2" class="text-center text-muted">Loading...</td>
</tr> </tr>
<tr ng-if="$ctrl.devices.length === 0"> <tr ng-if="$ctrl.devices.length === 0">
<td colspan="2" class="text-center text-muted"> <td colspan="2" class="text-center text-muted"> No device available. </td>
No device available.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

@ -19,9 +19,7 @@
<td colspan="2" class="text-center text-muted">Loading...</td> <td colspan="2" class="text-center text-muted">Loading...</td>
</tr> </tr>
<tr ng-if="$ctrl.disks.length === 0"> <tr ng-if="$ctrl.disks.length === 0">
<td colspan="2" class="text-center text-muted"> <td colspan="2" class="text-center text-muted"> No disks available. </td>
No disks available.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

@ -27,9 +27,7 @@
</tr> </tr>
<tr ng-if="$ctrl.isBrowseEnabled"> <tr ng-if="$ctrl.isBrowseEnabled">
<td colspan="2"> <td colspan="2">
<button class="btn btn-primary btn-sm" title="Browse" ui-sref="{{ $ctrl.browseUrl }}"> <button class="btn btn-primary btn-sm" title="Browse" ui-sref="{{ $ctrl.browseUrl }}"> Browse </button>
Browse
</button>
</td> </td>
</tr> </tr>
</tbody> </tbody>

@ -1,9 +1,7 @@
<div ng-if="!$ctrl.labels.length"> <div ng-if="!$ctrl.labels.length"> There are no labels for this node. </div>
There are no labels for this node.
</div>
<div class="col-sm-12 form-inline" style="padding: 0px;" ng-if="$ctrl.labels.length"> <div class="col-sm-12 form-inline" style="padding: 0px" ng-if="$ctrl.labels.length">
<div ng-repeat="label in $ctrl.labels" style="margin-top: 2px;"> <div ng-repeat="label in $ctrl.labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" ng-change="$ctrl.updateLabel(label)" /> <input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" ng-change="$ctrl.updateLabel(label)" />

@ -48,9 +48,7 @@
<td colspan="2"> <td colspan="2">
<div class="btn-toolbar" role="toolbar"> <div class="btn-toolbar" role="toolbar">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button type="button" class="btn btn-primary btn-sm" ng-disabled="!$ctrl.state.hasChanges" ng-click="$ctrl.saveChanges()"> <button type="button" class="btn btn-primary btn-sm" ng-disabled="!$ctrl.state.hasChanges" ng-click="$ctrl.saveChanges()"> Apply changes </button>
Apply changes
</button>
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span> <span class="caret"></span>
</button> </button>

@ -1,21 +1,21 @@
<div class="form-group" ng-if="$ctrl.pullRateLimits"> <div class="form-group" ng-if="$ctrl.pullRateLimits">
<div class="col-sm-12 small"> <div class="col-sm-12 small">
<div ng-if="$ctrl.pullRateLimits.remaining > 0" class="text-muted"> <div ng-if="$ctrl.pullRateLimits.remaining > 0" class="text-muted">
<i class="fa fa-exclamation-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-exclamation-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i>
<span ng-if="$ctrl.isAuthenticated"> <span ng-if="$ctrl.isAuthenticated">
You are currently using a free account to pull images from DockerHub and will be limited to 200 pulls every 6 hours. Remaining pulls: You are currently using a free account to pull images from DockerHub and will be limited to 200 pulls every 6 hours. Remaining pulls:
<span style="font-weight: bold;">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span> <span style="font-weight: bold">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span>
</span> </span>
<span ng-if="!$ctrl.isAuthenticated"> <span ng-if="!$ctrl.isAuthenticated">
<span ng-if="$ctrl.isAdmin"> <span ng-if="$ctrl.isAdmin">
You are currently using an anonymous account to pull images from DockerHub and will be limited to 100 pulls every 6 hours. You can configure DockerHub authentication in You are currently using an anonymous account to pull images from DockerHub and will be limited to 100 pulls every 6 hours. You can configure DockerHub authentication in
the the
<a ui-sref="portainer.registries">Registries View</a>. Remaining pulls: <a ui-sref="portainer.registries">Registries View</a>. Remaining pulls:
<span style="font-weight: bold;">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span> <span style="font-weight: bold">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span>
</span> </span>
<span ng-if="!$ctrl.isAdmin"> <span ng-if="!$ctrl.isAdmin">
You are currently using an anonymous account to pull images from DockerHub and will be limited to 100 pulls every 6 hours. Contact your administrator to configure You are currently using an anonymous account to pull images from DockerHub and will be limited to 100 pulls every 6 hours. Contact your administrator to configure
DockerHub authentication. Remaining pulls: <span style="font-weight: bold;">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span> DockerHub authentication. Remaining pulls: <span style="font-weight: bold">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span>
</span> </span>
</span> </span>
</div> </div>

@ -1,9 +1,7 @@
<!-- use registry --> <!-- use registry -->
<div> <div>
<div class="form-group" ng-if="$ctrl.model.UseRegistry"> <div class="form-group" ng-if="$ctrl.model.UseRegistry">
<label for="image_registry" class="control-label text-left" ng-class="$ctrl.labelClass"> <label for="image_registry" class="control-label text-left" ng-class="$ctrl.labelClass"> Registry </label>
Registry
</label>
<div ng-class="$ctrl.inputClass"> <div ng-class="$ctrl.inputClass">
<select <select
ng-options="registry as registry.Name for registry in $ctrl.registries track by registry.Id" ng-options="registry as registry.Name for registry in $ctrl.registries track by registry.Id"
@ -47,8 +45,8 @@
<div ng-if="!$ctrl.model.UseRegistry"> <div ng-if="!$ctrl.model.UseRegistry">
<div class="form-group"> <div class="form-group">
<span class="small"> <span class="small">
<p class="text-muted" style="margin-left: 15px;"> <p class="text-muted" style="margin-left: 15px">
<i class="fa fa-exclamation-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-exclamation-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i>
When using advanced mode, image and repository <b>must be</b> publicly available. When using advanced mode, image and repository <b>must be</b> publicly available.
</p> </p>
</span> </span>

@ -10,7 +10,7 @@
Auto-refresh logs Auto-refresh logs
<portainer-tooltip position="bottom" message="Disabling this option allows you to pause the log collection process and the auto-scrolling."></portainer-tooltip> <portainer-tooltip position="bottom" message="Disabling this option allows you to pause the log collection process and the auto-scrolling."></portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <label class="switch" style="margin-left: 20px">
<input <input
type="checkbox" type="checkbox"
ng-model="$ctrl.state.logCollection" ng-model="$ctrl.state.logCollection"
@ -21,24 +21,18 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label for="tls" class="control-label text-left"> <label for="tls" class="control-label text-left"> Wrap lines </label>
Wrap lines <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="$ctrl.state.wrapLines" /><i></i> </label>
</label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="$ctrl.state.wrapLines" /><i></i> </label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label for="tls" class="control-label text-left"> <label for="tls" class="control-label text-left"> Display timestamps </label>
Display timestamps <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="$ctrl.displayTimestamps" /><i></i> </label>
</label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="$ctrl.displayTimestamps" /><i></i> </label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="logs_since" class="col-sm-1 control-label text-left"> <label for="logs_since" class="col-sm-1 control-label text-left"> Fetch </label>
Fetch
</label>
<div class="col-sm-2"> <div class="col-sm-2">
<select class="form-control" ng-model="$ctrl.sinceTimestamp" id="logs_since"> <select class="form-control" ng-model="$ctrl.sinceTimestamp" id="logs_since">
<option selected value="">All logs</option> <option selected value="">All logs</option>
@ -47,27 +41,21 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="logs_search" class="col-sm-1 control-label text-left"> <label for="logs_search" class="col-sm-1 control-label text-left"> Search </label>
Search
</label>
<div class="col-sm-11"> <div class="col-sm-11">
<input class="form-control" type="text" name="logs_search" ng-model="$ctrl.state.search" ng-change="$ctrl.state.selectedLines.length = 0;" placeholder="Filter..." /> <input class="form-control" type="text" name="logs_search" ng-model="$ctrl.state.search" ng-change="$ctrl.state.selectedLines.length = 0;" placeholder="Filter..." />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="lines_count" class="col-sm-1 control-label text-left"> <label for="lines_count" class="col-sm-1 control-label text-left"> Lines </label>
Lines
</label>
<div class="col-sm-11"> <div class="col-sm-11">
<input class="form-control" type="number" name="lines_count" ng-model="$ctrl.lineCount" placeholder="Enter no of lines..." /> <input class="form-control" type="number" name="lines_count" ng-model="$ctrl.lineCount" placeholder="Enter no of lines..." />
</div> </div>
</div> </div>
<div class="form-group" ng-if="$ctrl.state.copySupported"> <div class="form-group" ng-if="$ctrl.state.copySupported">
<label class="col-sm-1 control-label text-left"> <label class="col-sm-1 control-label text-left"> Actions </label>
Actions
</label>
<div class="col-sm-11"> <div class="col-sm-11">
<button class="btn btn-primary btn-sm" type="button" ng-click="$ctrl.downloadLogs()" style="margin-left: 0;"><i class="fa fa-download"></i> Download logs</button> <button class="btn btn-primary btn-sm" type="button" ng-click="$ctrl.downloadLogs()" style="margin-left: 0"><i class="fa fa-download"></i> Download logs</button>
<button <button
class="btn btn-primary btn-sm" class="btn btn-primary btn-sm"
ng-click="$ctrl.copy()" ng-click="$ctrl.copy()"
@ -84,7 +72,7 @@
><i class="fa fa-times space-right" aria-hidden="true"></i>Unselect</button ><i class="fa fa-times space-right" aria-hidden="true"></i>Unselect</button
> >
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-left: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-left: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
@ -94,8 +82,8 @@
</div> </div>
</div> </div>
<div class="row" style="height: 54%;"> <div class="row" style="height: 54%">
<div class="col-sm-12" style="height: 100%;"> <div class="col-sm-12" style="height: 100%">
<pre ng-class="{ wrap_lines: $ctrl.state.wrapLines }" class="log_viewer" scroll-glue="$ctrl.state.autoScroll" force-glue> <pre ng-class="{ wrap_lines: $ctrl.state.wrapLines }" class="log_viewer" scroll-glue="$ctrl.state.autoScroll" force-glue>
<div ng-repeat="log in $ctrl.state.filteredLogs = ($ctrl.data | filter:{ 'line': $ctrl.state.search }) track by $index" class="line" ng-if="log.line"><p class="inner_line" ng-click="$ctrl.selectLine(log.line)" ng-class="{ 'line_selected': $ctrl.state.selectedLines.indexOf(log.line) > -1 }"><span ng-repeat="span in log.spans" ng-style="{ 'color': span.foregroundColor, 'background-color': span.backgroundColor }">{{ span.text }}</span></p></div> <div ng-repeat="log in $ctrl.state.filteredLogs = ($ctrl.data | filter:{ 'line': $ctrl.state.search }) track by $index" class="line" ng-if="log.line"><p class="inner_line" ng-click="$ctrl.selectLine(log.line)" ng-class="{ 'line_selected': $ctrl.state.selectedLines.indexOf(log.line) > -1 }"><span ng-repeat="span in log.spans" ng-style="{ 'color': span.foregroundColor, 'background-color': span.backgroundColor }">{{ span.text }}</span></p></div>
<div ng-if="!$ctrl.state.filteredLogs.length" class="line"><p class="inner_line">No log line matching the '{{ $ctrl.state.search }}' filter</p></div> <div ng-if="!$ctrl.state.filteredLogs.length" class="line"><p class="inner_line">No log line matching the '{{ $ctrl.state.search }}' filter</p></div>

@ -1,22 +1,20 @@
<div> <div>
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Macvlan configuration </div>
Macvlan configuration
</div>
<!-- selector --> <!-- selector -->
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i>
To create a MACVLAN network you need to create a configuration, then create the network from this configuration. To create a MACVLAN network you need to create a configuration, then create the network from this configuration.
</span> </span>
</div> </div>
<div class="col-sm-12"> <div class="col-sm-12">
<div class="form-group" style="margin-bottom: 0;"> <div class="form-group" style="margin-bottom: 0">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div> <div>
<input type="radio" id="network_config" ng-model="$ctrl.data.Scope" value="local" /> <input type="radio" id="network_config" ng-model="$ctrl.data.Scope" value="local" />
<label for="network_config"> <label for="network_config">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-cog" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-cog" aria-hidden="true" style="margin-right: 2px"></i>
Configuration Configuration
</div> </div>
<p>I want to configure a network before deploying it</p> <p>I want to configure a network before deploying it</p>
@ -26,7 +24,7 @@
<input type="radio" id="network_deploy" ng-model="$ctrl.data.Scope" value="swarm" ng-disabled="$ctrl.availableNetworks.length === 0" /> <input type="radio" id="network_deploy" ng-model="$ctrl.data.Scope" value="swarm" ng-disabled="$ctrl.availableNetworks.length === 0" />
<label for="network_deploy" ng-class="$ctrl.availableNetworks.length === 0 ? 'boxselector_disabled' : ''"> <label for="network_deploy" ng-class="$ctrl.availableNetworks.length === 0 ? 'boxselector_disabled' : ''">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-sitemap" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-sitemap" aria-hidden="true" style="margin-right: 2px"></i>
Creation Creation
</div> </div>
<p>I want to create a network from a configuration</p> <p>I want to create a network from a configuration</p>

@ -1,9 +1,7 @@
<!-- CIFS-settings --> <!-- CIFS-settings -->
<div ng-show="$ctrl.data.useCIFS"> <div ng-show="$ctrl.data.useCIFS">
<ng-form class="form-horizontal" name="cifsInformationForm"> <ng-form class="form-horizontal" name="cifsInformationForm">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> CIFS Settings </div>
CIFS Settings
</div>
<!-- address-input --> <!-- address-input -->
<div class="form-group col-md-12"> <div class="form-group col-md-12">
<label for="cifs_address" class="col-sm-2 col-md-1 control-label text-left">Address</label> <label for="cifs_address" class="col-sm-2 col-md-1 control-label text-left">Address</label>

@ -1,9 +1,7 @@
<!-- NFS-settings --> <!-- NFS-settings -->
<div ng-show="$ctrl.data.useNFS"> <div ng-show="$ctrl.data.useNFS">
<ng-form class="form-horizontal" name="nfsInformationForm"> <ng-form class="form-horizontal" name="nfsInformationForm">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> NFS Settings </div>
NFS Settings
</div>
<!-- address-input --> <!-- address-input -->
<div class="form-group col-md-12"> <div class="form-group col-md-12">
<label for="nfs_address" class="col-sm-2 col-md-1 control-label text-left">Address</label> <label for="nfs_address" class="col-sm-2 col-md-1 control-label text-left">Address</label>

@ -52,7 +52,6 @@ export interface ContainerTableProps {
dataset: DockerContainer[]; dataset: DockerContainer[];
onRefresh?(): Promise<void>; onRefresh?(): Promise<void>;
isHostColumnVisible: boolean; isHostColumnVisible: boolean;
autoFocusSearch: boolean;
tableKey?: string; tableKey?: string;
} }
@ -61,7 +60,6 @@ export function ContainersDatatable({
dataset, dataset,
onRefresh, onRefresh,
isHostColumnVisible, isHostColumnVisible,
autoFocusSearch,
}: ContainerTableProps) { }: ContainerTableProps) {
const { settings, setTableSettings } = const { settings, setTableSettings } =
useTableSettings<ContainersTableSettings>(); useTableSettings<ContainersTableSettings>();
@ -164,11 +162,7 @@ export function ContainersDatatable({
/> />
</TableActions> </TableActions>
<SearchBar <SearchBar value={searchBarValue} onChange={handleSearchBarChange} />
value={searchBarValue}
onChange={handleSearchBarChange}
autoFocus={autoFocusSearch}
/>
<Table <Table
className={tableProps.className} className={tableProps.className}

@ -47,7 +47,6 @@ export const ContainersDatatableAngular = react2angular(
'dataset', 'dataset',
'onRefresh', 'onRefresh',
'isHostColumnVisible', 'isHostColumnVisible',
'autoFocusSearch',
'tableKey', 'tableKey',
] ]
); );

@ -31,15 +31,15 @@
<!-- !config-data --> <!-- !config-data -->
<!-- labels --> <!-- labels -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Labels</label> <label class="control-label text-left">Labels</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addLabel()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="ctrl.addLabel()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add label <i class="fa fa-plus-circle" aria-hidden="true"></i> add label
</span> </span>
</div> </div>
<!-- labels-input-list --> <!-- labels-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="label in ctrl.formValues.Labels" style="margin-top: 2px;"> <div ng-repeat="label in ctrl.formValues.Labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" /> <input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" />
@ -60,13 +60,11 @@
<por-access-control-form form-data="ctrl.formValues.AccessControlData"></por-access-control-form> <por-access-control-form form-data="ctrl.formValues.AccessControlData"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button type="button" class="btn btn-primary btn-sm" ng-disabled="!ctrl.formValues.Name" ng-click="ctrl.create()">Create config</button> <button type="button" class="btn btn-primary btn-sm" ng-disabled="!ctrl.formValues.Name" ng-click="ctrl.create()">Create config</button>
<span class="text-danger" ng-if="ctrl.state.formValidationError" style="margin-left: 5px;">{{ ctrl.state.formValidationError }}</span> <span class="text-danger" ng-if="ctrl.state.formValidationError" style="margin-left: 5px">{{ ctrl.state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -6,7 +6,7 @@
<information-panel title-text="Caution" ng-if="state.mode == 'duplicate'"> <information-panel title-text="Caution" ng-if="state.mode == 'duplicate'">
<span class="small"> <span class="small">
<p class="text-muted"> <p class="text-muted">
<i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px"></i>
The new container may fail to start if the image is changed, and settings from the previous container aren't compatible. Common causes include entrypoint, cmd or The new container may fail to start if the image is changed, and settings from the previous container aren't compatible. Common causes include entrypoint, cmd or
<a href="http://portainer.readthedocs.io/en/stable/agent.html" target="_blank">other settings</a> set by an image. <a href="http://portainer.readthedocs.io/en/stable/agent.html" target="_blank">other settings</a> set by an image.
</p> </p>
@ -26,12 +26,10 @@
</div> </div>
</div> </div>
<!-- !name-input --> <!-- !name-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Image configuration </div>
Image configuration
</div>
<div ng-if="!formValues.RegistryModel.Registry && fromContainer"> <div ng-if="!formValues.RegistryModel.Registry && fromContainer">
<i class="fa fa-exclamation-triangle orange-icon" aria-hidden="true"></i> <i class="fa fa-exclamation-triangle orange-icon" aria-hidden="true"></i>
<span class="small text-danger" style="margin-left: 5px;"> <span class="small text-danger" style="margin-left: 5px">
The Docker registry for the <code>{{ config.Image }}</code> image is not registered inside Portainer, you will not be able to create a container. Please register that The Docker registry for the <code>{{ config.Image }}</code> image is not registered inside Portainer, you will not be able to create a container. Please register that
registry first. registry first.
</span> </span>
@ -60,18 +58,14 @@
message="When enabled, Portainer will automatically try to pull the specified image before creating the container." message="When enabled, Portainer will automatically try to pull the specified image before creating the container."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="formValues.alwaysPull" ng-disabled="!state.pullImageValidity" /><i></i> </label>
<input type="checkbox" ng-model="formValues.alwaysPull" ng-disabled="!state.pullImageValidity" /><i></i>
</label>
</div> </div>
</div> </div>
<!-- !always-pull --> <!-- !always-pull -->
</por-image-registry> </por-image-registry>
<!-- !image-and-registry --> <!-- !image-and-registry -->
</div> </div>
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Network ports configuration </div>
Network ports configuration
</div>
<!-- publish-exposed-ports --> <!-- publish-exposed-ports -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
@ -82,7 +76,7 @@
message="When enabled, Portainer will let Docker automatically map a random port on the host to each one defined in the image Dockerfile." message="When enabled, Portainer will let Docker automatically map a random port on the host to each one defined in the image Dockerfile."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="config.HostConfig.PublishAllPorts" /><i></i> </label> <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="config.HostConfig.PublishAllPorts" /><i></i> </label>
</div> </div>
</div> </div>
<!-- !publish-exposed-ports --> <!-- !publish-exposed-ports -->
@ -96,20 +90,20 @@
message="When a range of ports on the host and a single port on the container is specified, Docker will randomly choose a single available port in the defined range and forward that to the container port." message="When a range of ports on the host and a single port on the container is specified, Docker will randomly choose a single available port in the defined range and forward that to the container port."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addPortBinding()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addPortBinding()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> publish a new network port <i class="fa fa-plus-circle" aria-hidden="true"></i> publish a new network port
</span> </span>
</div> </div>
<!-- port-mapping-input-list --> <!-- port-mapping-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="portBinding in config.HostConfig.PortBindings" style="margin-top: 2px;"> <div ng-repeat="portBinding in config.HostConfig.PortBindings" style="margin-top: 2px">
<!-- host-port --> <!-- host-port -->
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">host</span> <span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="portBinding.hostPort" placeholder="e.g. 80, 80-88, ip:80 or ip:80-88 (optional)" /> <input type="text" class="form-control" ng-model="portBinding.hostPort" placeholder="e.g. 80, 80-88, ip:80 or ip:80-88 (optional)" />
</div> </div>
<!-- !host-port --> <!-- !host-port -->
<span style="margin: 0 10px 0 10px;"> <span style="margin: 0 10px 0 10px">
<i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i> <i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i>
</span> </span>
<!-- container-port --> <!-- container-port -->
@ -135,9 +129,7 @@
</div> </div>
<!-- !port-mapping --> <!-- !port-mapping -->
<div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'"> <div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment </div>
Deployment
</div>
<!-- node-selection --> <!-- node-selection -->
<node-selector model="formValues.NodeName"> </node-selector> <node-selector model="formValues.NodeName"> </node-selector>
<!-- !node-selection --> <!-- !node-selection -->
@ -146,9 +138,7 @@
<por-access-control-form form-data="formValues.AccessControlData" resource-control="fromContainer.ResourceControl" ng-if="fromContainer"></por-access-control-form> <por-access-control-form form-data="formValues.AccessControlData" resource-control="fromContainer.ResourceControl" ng-if="fromContainer"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<!-- autoremove --> <!-- autoremove -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
@ -159,7 +149,7 @@
message="When enabled, Portainer will automatically remove the container when it exits. This is useful when you want to use the container only once." message="When enabled, Portainer will automatically remove the container when it exits. This is useful when you want to use the container only once."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="config.HostConfig.AutoRemove" /><i></i> </label> <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="config.HostConfig.AutoRemove" /><i></i> </label>
</div> </div>
</div> </div>
<!-- !autoremove --> <!-- !autoremove -->
@ -176,7 +166,7 @@
<span ng-hide="state.actionInProgress">Deploy the container</span> <span ng-hide="state.actionInProgress">Deploy the container</span>
<span ng-show="state.actionInProgress">Deployment in progress...</span> <span ng-show="state.actionInProgress">Deployment in progress...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->
@ -205,14 +195,14 @@
<div class="tab-content"> <div class="tab-content">
<!-- tab-command --> <!-- tab-command -->
<div class="tab-pane active" id="command"> <div class="tab-pane active" id="command">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- command-input --> <!-- command-input -->
<div class="form-group"> <div class="form-group">
<label for="container_command" class="col-sm-2 col-lg-1 control-label text-left">Command</label> <label for="container_command" class="col-sm-2 col-lg-1 control-label text-left">Command</label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="input-group"> <div class="input-group">
<div class="input-group-btn"> <div class="input-group-btn">
<button class="btn btn-primary" ng-model="formValues.CmdMode" uib-btn-radio="'default'" style="margin-left: 0px;"> Default</button> <button class="btn btn-primary" ng-model="formValues.CmdMode" uib-btn-radio="'default'" style="margin-left: 0px"> Default</button>
<button class="btn btn-primary" ng-model="formValues.CmdMode" uib-btn-radio="'override'">Override</button> <button class="btn btn-primary" ng-model="formValues.CmdMode" uib-btn-radio="'override'">Override</button>
</div> </div>
<input <input
@ -239,7 +229,7 @@
<div class="col-sm-9"> <div class="col-sm-9">
<div class="input-group"> <div class="input-group">
<div class="input-group-btn"> <div class="input-group-btn">
<label class="btn btn-primary" ng-model="formValues.EntrypointMode" uib-btn-radio="'default'" style="margin-left: 0px;"> Default</label> <label class="btn btn-primary" ng-model="formValues.EntrypointMode" uib-btn-radio="'default'" style="margin-left: 0px"> Default</label>
<label class="btn btn-primary" ng-model="formValues.EntrypointMode" uib-btn-radio="'override'">Override</label> <label class="btn btn-primary" ng-model="formValues.EntrypointMode" uib-btn-radio="'override'">Override</label>
</div> </div>
<input <input
@ -300,9 +290,7 @@
</div> </div>
<!-- !console --> <!-- !console -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Logging </div>
Logging
</div>
<!-- logging-driver --> <!-- logging-driver -->
<div class="form-group"> <div class="form-group">
<label for="log-driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label> <label for="log-driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label>
@ -323,7 +311,7 @@
<!-- !logging-driver --> <!-- !logging-driver -->
<!-- logging-opts --> <!-- logging-opts -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left"> <label class="control-label text-left">
Options Options
<portainer-tooltip <portainer-tooltip
@ -333,15 +321,15 @@
</label> </label>
<span <span
class="label label-default interactive" class="label label-default interactive"
style="margin-left: 10px;" style="margin-left: 10px"
ng-click="!formValues.LogDriverName || formValues.LogDriverName === 'none' || addLogDriverOpt(formValues.LogDriverName)" ng-click="!formValues.LogDriverName || formValues.LogDriverName === 'none' || addLogDriverOpt(formValues.LogDriverName)"
> >
<i class="fa fa-plus-circle" aria-hidden="true"></i> add logging driver option <i class="fa fa-plus-circle" aria-hidden="true"></i> add logging driver option
</span> </span>
</div> </div>
<!-- logging-opts-input-list --> <!-- logging-opts-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="opt in formValues.LogDriverOpts" style="margin-top: 2px;"> <div ng-repeat="opt in formValues.LogDriverOpts" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">option</span> <span class="input-group-addon">option</span>
<input type="text" class="form-control" ng-model="opt.name" placeholder="e.g. FOO" /> <input type="text" class="form-control" ng-model="opt.name" placeholder="e.g. FOO" />
@ -363,20 +351,20 @@
<!-- !tab-command --> <!-- !tab-command -->
<!-- tab-volume --> <!-- tab-volume -->
<div class="tab-pane" id="volumes"> <div class="tab-pane" id="volumes">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- volumes --> <!-- volumes -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Volume mapping</label> <label class="control-label text-left">Volume mapping</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addVolume()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addVolume()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> map additional volume <i class="fa fa-plus-circle" aria-hidden="true"></i> map additional volume
</span> </span>
</div> </div>
<!-- volumes-input-list --> <!-- volumes-input-list -->
<div class="form-inline" style="margin-top: 10px;"> <div class="form-inline" style="margin-top: 10px">
<div ng-repeat="volume in formValues.Volumes"> <div ng-repeat="volume in formValues.Volumes">
<!-- volume-line1 --> <!-- volume-line1 -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<!-- container-path --> <!-- container-path -->
<div class="input-group input-group-sm col-sm-6"> <div class="input-group input-group-sm col-sm-6">
<span class="input-group-addon">container</span> <span class="input-group-addon">container</span>
@ -384,7 +372,7 @@
</div> </div>
<!-- !container-path --> <!-- !container-path -->
<!-- volume-type --> <!-- volume-type -->
<div class="input-group col-sm-5" style="margin-left: 5px;"> <div class="input-group col-sm-5" style="margin-left: 5px">
<div class="btn-group btn-group-sm" ng-if="allowBindMounts"> <div class="btn-group btn-group-sm" ng-if="allowBindMounts">
<label class="btn btn-primary" ng-model="volume.type" uib-btn-radio="'volume'" ng-click="volume.name = ''">Volume</label> <label class="btn btn-primary" ng-model="volume.type" uib-btn-radio="'volume'" ng-click="volume.name = ''">Volume</label>
<label class="btn btn-primary" ng-model="volume.type" uib-btn-radio="'bind'" ng-click="volume.name = ''">Bind</label> <label class="btn btn-primary" ng-model="volume.type" uib-btn-radio="'bind'" ng-click="volume.name = ''">Bind</label>
@ -397,7 +385,7 @@
</div> </div>
<!-- !volume-line1 --> <!-- !volume-line1 -->
<!-- volume-line2 --> <!-- volume-line2 -->
<div class="col-sm-12 form-inline" style="margin-top: 5px;"> <div class="col-sm-12 form-inline" style="margin-top: 5px">
<i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i> <i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i>
<!-- volume --> <!-- volume -->
<div class="input-group input-group-sm col-sm-6" ng-if="volume.type === 'volume'"> <div class="input-group input-group-sm col-sm-6" ng-if="volume.type === 'volume'">
@ -415,7 +403,7 @@
</div> </div>
<!-- !bind --> <!-- !bind -->
<!-- read-only --> <!-- read-only -->
<div class="input-group input-group-sm col-sm-5" style="margin-left: 5px;"> <div class="input-group input-group-sm col-sm-5" style="margin-left: 5px">
<div class="btn-group btn-group-sm"> <div class="btn-group btn-group-sm">
<label class="btn btn-primary" ng-model="volume.readOnly" uib-btn-radio="false">Writable</label> <label class="btn btn-primary" ng-model="volume.readOnly" uib-btn-radio="false">Writable</label>
<label class="btn btn-primary" ng-model="volume.readOnly" uib-btn-radio="true">Read-only</label> <label class="btn btn-primary" ng-model="volume.readOnly" uib-btn-radio="true">Read-only</label>
@ -434,7 +422,7 @@
<!-- !tab-volume --> <!-- !tab-volume -->
<!-- tab-network --> <!-- tab-network -->
<div class="tab-pane" id="network"> <div class="tab-pane" id="network">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="form-group" ng-if="globalNetworkCount === 0 && applicationState.endpoint.mode.provider !== 'DOCKER_SWARM_MODE'"> <div class="form-group" ng-if="globalNetworkCount === 0 && applicationState.endpoint.mode.provider !== 'DOCKER_SWARM_MODE'">
<div class="col-sm-12"> <div class="col-sm-12">
<span class="small text-muted">You don't have any shared networks. Head over to the <a ui-sref="docker.networks">networks view</a> to create one.</span> <span class="small text-muted">You don't have any shared networks. Head over to the <a ui-sref="docker.networks">networks view</a> to create one.</span>
@ -524,15 +512,15 @@
<!-- !dns-secondary-input --> <!-- !dns-secondary-input -->
<!-- extra-hosts-variables --> <!-- extra-hosts-variables -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Hosts file entries</label> <label class="control-label text-left">Hosts file entries</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addExtraHost()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addExtraHost()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add additional entry <i class="fa fa-plus-circle" aria-hidden="true"></i> add additional entry
</span> </span>
</div> </div>
<!-- extra-hosts-input-list --> <!-- extra-hosts-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="variable in formValues.ExtraHosts" style="margin-top: 2px;"> <div ng-repeat="variable in formValues.ExtraHosts" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span> <span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="variable.value" placeholder="e.g. host:IP" /> <input type="text" class="form-control" ng-model="variable.value" placeholder="e.g. host:IP" />
@ -550,18 +538,18 @@
<!-- !tab-network --> <!-- !tab-network -->
<!-- tab-labels --> <!-- tab-labels -->
<div class="tab-pane" id="labels"> <div class="tab-pane" id="labels">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- labels --> <!-- labels -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Labels</label> <label class="control-label text-left">Labels</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addLabel()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addLabel()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add label <i class="fa fa-plus-circle" aria-hidden="true"></i> add label
</span> </span>
</div> </div>
<!-- labels-input-list --> <!-- labels-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="label in formValues.Labels" style="margin-top: 2px;"> <div ng-repeat="label in formValues.Labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" /> <input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" />
@ -592,25 +580,15 @@
<!-- !tab-env --> <!-- !tab-env -->
<!-- tab-restart-policy --> <!-- tab-restart-policy -->
<div class="tab-pane" id="restart-policy"> <div class="tab-pane" id="restart-policy">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left"> <label class="control-label text-left"> Restart policy </label>
Restart policy <div class="btn-group btn-group-sm" style="margin-left: 20px">
</label> <label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'no'"> Never </label>
<div class="btn-group btn-group-sm" style="margin-left: 20px;"> <label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'always'"> Always </label>
<label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'no'"> <label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'on-failure'"> On failure </label>
Never <label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'unless-stopped'"> Unless stopped </label>
</label>
<label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'always'">
Always
</label>
<label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'on-failure'">
On failure
</label>
<label class="btn btn-primary" ng-model="config.HostConfig.RestartPolicy.Name" uib-btn-radio="'unless-stopped'">
Unless stopped
</label>
</div> </div>
</div> </div>
</div> </div>
@ -619,27 +597,21 @@
<!-- !tab-restart-policy --> <!-- !tab-restart-policy -->
<!-- tab-runtime-resources --> <!-- tab-runtime-resources -->
<div class="tab-pane" id="runtime-resources"> <div class="tab-pane" id="runtime-resources">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Runtime </div>
Runtime
</div>
<!-- privileged-mode --> <!-- privileged-mode -->
<div class="form-group" ng-if="isAdmin || allowPrivilegedMode"> <div class="form-group" ng-if="isAdmin || allowPrivilegedMode">
<div class="col-sm-12"> <div class="col-sm-12">
<label for="privileged_mode" class="control-label text-left"> <label for="privileged_mode" class="control-label text-left"> Privileged mode </label>
Privileged mode <label class="switch" style="margin-left: 20px"> <input type="checkbox" name="privileged_mode" ng-model="config.HostConfig.Privileged" /><i></i> </label>
</label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" name="privileged_mode" ng-model="config.HostConfig.Privileged" /><i></i> </label>
</div> </div>
</div> </div>
<!-- !privileged-mode --> <!-- !privileged-mode -->
<!-- init --> <!-- init -->
<div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.37"> <div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.37">
<div class="col-sm-12"> <div class="col-sm-12">
<label for="init" class="control-label text-left"> <label for="init" class="control-label text-left"> Init </label>
Init <label class="switch" style="margin-left: 20px"> <input type="checkbox" name="init" ng-model="config.HostConfig.Init" /><i></i> </label>
</label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" name="init" ng-model="config.HostConfig.Init" /><i></i> </label>
</div> </div>
</div> </div>
<!-- !init --> <!-- !init -->
@ -654,18 +626,18 @@
</div> </div>
<!-- !runtimes --> <!-- !runtimes -->
</form> </form>
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- devices --> <!-- devices -->
<div ng-if="showDeviceMapping" class="form-group"> <div ng-if="showDeviceMapping" class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Devices</label> <label class="control-label text-left">Devices</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addDevice()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addDevice()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add device <i class="fa fa-plus-circle" aria-hidden="true"></i> add device
</span> </span>
</div> </div>
<!-- devices-input-list --> <!-- devices-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="device in config.HostConfig.Devices" style="margin-top: 2px;"> <div ng-repeat="device in config.HostConfig.Devices" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">host</span> <span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="device.pathOnHost" placeholder="e.g. /dev/tty0" /> <input type="text" class="form-control" ng-model="device.pathOnHost" placeholder="e.g. /dev/tty0" />
@ -684,15 +656,15 @@
<!-- !devices--> <!-- !devices-->
<!-- sysctls --> <!-- sysctls -->
<div ng-if="showSysctls" class="form-group"> <div ng-if="showSysctls" class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Sysctls</label> <label class="control-label text-left">Sysctls</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addSysctl()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addSysctl()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add sysctl <i class="fa fa-plus-circle" aria-hidden="true"></i> add sysctl
</span> </span>
</div> </div>
<!-- sysctls-input-list --> <!-- sysctls-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="sysctl in formValues.Sysctls" style="margin-top: 2px;"> <div ng-repeat="sysctl in formValues.Sysctls" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="sysctl.name" placeholder="e.g. FOO" /> <input type="text" class="form-control" ng-model="sysctl.name" placeholder="e.g. FOO" />
@ -710,14 +682,10 @@
</div> </div>
<!-- !sysctls --> <!-- !sysctls -->
<div ng-class="{ 'edit-resources': state.mode == 'duplicate' }"> <div ng-class="{ 'edit-resources': state.mode == 'duplicate' }">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Resources </div>
Resources
</div>
<!-- memory-reservation-input --> <!-- memory-reservation-input -->
<div class="form-group"> <div class="form-group">
<label for="memory-reservation" class="col-sm-3 col-lg-2 control-label text-left mt-20"> <label for="memory-reservation" class="col-sm-3 col-lg-2 control-label text-left mt-20"> Memory reservation </label>
Memory reservation
</label>
<div class="col-sm-3"> <div class="col-sm-3">
<slider <slider
on-change="(handleResourceChange)" on-change="(handleResourceChange)"
@ -732,17 +700,13 @@
<input type="number" min="0" class="form-control" ng-model="formValues.MemoryReservation" id="memory-reservation" /> <input type="number" min="0" class="form-control" ng-model="formValues.MemoryReservation" id="memory-reservation" />
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
<p class="small text-muted mt-7"> <p class="small text-muted mt-7"> Memory soft limit (<b>MB</b>) </p>
Memory soft limit (<b>MB</b>)
</p>
</div> </div>
</div> </div>
<!-- !memory-reservation-input --> <!-- !memory-reservation-input -->
<!-- memory-limit-input --> <!-- memory-limit-input -->
<div class="form-group"> <div class="form-group">
<label for="memory-limit" class="col-sm-3 col-lg-2 control-label text-left mt-20"> <label for="memory-limit" class="col-sm-3 col-lg-2 control-label text-left mt-20"> Memory limit </label>
Memory limit
</label>
<div class="col-sm-3"> <div class="col-sm-3">
<slider <slider
on-change="(handleResourceChange)" on-change="(handleResourceChange)"
@ -757,17 +721,13 @@
<input type="number" min="0" class="form-control" ng-model="formValues.MemoryLimit" id="memory-limit" /> <input type="number" min="0" class="form-control" ng-model="formValues.MemoryLimit" id="memory-limit" />
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
<p class="small text-muted mt-7"> <p class="small text-muted mt-7"> Memory limit (<b>MB</b>) </p>
Memory limit (<b>MB</b>)
</p>
</div> </div>
</div> </div>
<!-- !memory-limit-input --> <!-- !memory-limit-input -->
<!-- cpu-limit-input --> <!-- cpu-limit-input -->
<div class="form-group"> <div class="form-group">
<label for="cpu-limit" class="col-sm-3 col-lg-2 control-label text-left mt-20"> <label for="cpu-limit" class="col-sm-3 col-lg-2 control-label text-left mt-20"> CPU limit </label>
CPU limit
</label>
<div class="col-sm-5"> <div class="col-sm-5">
<slider <slider
on-change="(handleResourceChange)" on-change="(handleResourceChange)"
@ -780,9 +740,7 @@
></slider> ></slider>
</div> </div>
<div class="col-sm-4 mt-20"> <div class="col-sm-4 mt-20">
<p class="small text-muted"> <p class="small text-muted"> Maximum CPU usage </p>
Maximum CPU usage
</p>
</div> </div>
</div> </div>
<!-- !cpu-limit-input --> <!-- !cpu-limit-input -->

@ -20,9 +20,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="refreshRate" class="col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left"> <label for="refreshRate" class="col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left"> Refresh rate </label>
Refresh rate
</label>
<div class="col-sm-3 col-md-2"> <div class="col-sm-3 col-md-2">
<select id="refreshRate" ng-model="state.refreshRate" ng-change="changeUpdateRepeater()" class="form-control"> <select id="refreshRate" ng-model="state.refreshRate" ng-change="changeUpdateRepeater()" class="form-control">
<option value="1">1s</option> <option value="1">1s</option>
@ -34,7 +32,7 @@
</select> </select>
</div> </div>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
<div class="form-group" ng-if="state.networkStatsUnavailable"> <div class="form-group" ng-if="state.networkStatsUnavailable">
@ -58,7 +56,7 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-chart-area" title-text="Memory usage"></rd-widget-header> <rd-widget-header icon="fa-chart-area" title-text="Memory usage"></rd-widget-header>
<rd-widget-body> <rd-widget-body>
<div class="chart-container" style="position: relative;"> <div class="chart-container" style="position: relative">
<canvas id="memoryChart" width="770" height="300"></canvas> <canvas id="memoryChart" width="770" height="300"></canvas>
</div> </div>
</rd-widget-body> </rd-widget-body>
@ -69,7 +67,7 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-chart-area" title-text="CPU usage"></rd-widget-header> <rd-widget-header icon="fa-chart-area" title-text="CPU usage"></rd-widget-header>
<rd-widget-body> <rd-widget-body>
<div class="chart-container" style="position: relative;"> <div class="chart-container" style="position: relative">
<canvas id="cpuChart" width="770" height="300"></canvas> <canvas id="cpuChart" width="770" height="300"></canvas>
</div> </div>
</rd-widget-body> </rd-widget-body>
@ -80,7 +78,7 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-chart-area" title-text="Network usage (aggregate)"></rd-widget-header> <rd-widget-header icon="fa-chart-area" title-text="Network usage (aggregate)"></rd-widget-header>
<rd-widget-body> <rd-widget-body>
<div class="chart-container" style="position: relative;"> <div class="chart-container" style="position: relative">
<canvas id="networkChart" width="770" height="300"></canvas> <canvas id="networkChart" width="770" height="300"></canvas>
</div> </div>
</rd-widget-body> </rd-widget-body>
@ -91,7 +89,7 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-chart-area" title-text="I/O usage (aggregate)"></rd-widget-header> <rd-widget-header icon="fa-chart-area" title-text="I/O usage (aggregate)"></rd-widget-header>
<rd-widget-body> <rd-widget-body>
<div class="chart-container" style="position: relative;"> <div class="chart-container" style="position: relative">
<canvas id="ioChart" width="770" height="300"></canvas> <canvas id="ioChart" width="770" height="300"></canvas>
</div> </div>
</rd-widget-body> </rd-widget-body>

@ -20,12 +20,12 @@
> >
<span class="small"> <span class="small">
<p class="text-muted" ng-if="applicationState.endpoint.mode.role === 'MANAGER'"> <p class="text-muted" ng-if="applicationState.endpoint.mode.role === 'MANAGER'">
<i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px"></i>
Portainer is connected to a node that is part of a Swarm cluster. Some resources located on other nodes in the cluster might not be available for management, have a look at Portainer is connected to a node that is part of a Swarm cluster. Some resources located on other nodes in the cluster might not be available for management, have a look at
<a href="http://portainer.readthedocs.io/en/stable/agent.html" target="_blank">our agent setup</a> for more details. <a href="http://portainer.readthedocs.io/en/stable/agent.html" target="_blank">our agent setup</a> for more details.
</p> </p>
<p class="text-muted" ng-if="applicationState.endpoint.mode.role === 'WORKER'"> <p class="text-muted" ng-if="applicationState.endpoint.mode.role === 'WORKER'">
<i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px"></i>
Portainer is connected to a worker node. Swarm management features will not be available. Portainer is connected to a worker node. Swarm management features will not be available.
</p> </p>
</span> </span>
@ -107,11 +107,11 @@
<div class="widget-icon blue pull-left"> <div class="widget-icon blue pull-left">
<i class="fa fa-cubes"></i> <i class="fa fa-cubes"></i>
</div> </div>
<div class="pull-right" style="padding-left: 5px;"> <div class="pull-right" style="padding-left: 5px">
<div><i class="fa fa-power-off space-right green-icon"></i>{{ containers | runningcontainers }} running</div> <div><i class="fa fa-power-off space-right green-icon"></i>{{ containers | runningcontainers }} running</div>
<div><i class="fa fa-power-off space-right red-icon"></i>{{ containers | stoppedcontainers }} stopped</div> <div><i class="fa fa-power-off space-right red-icon"></i>{{ containers | stoppedcontainers }} stopped</div>
</div> </div>
<div class="pull-right" style="padding-right: 5px;"> <div class="pull-right" style="padding-right: 5px">
<div><i class="fa fa-heartbeat space-right green-icon"></i>{{ containers | healthycontainers }} healthy</div> <div><i class="fa fa-heartbeat space-right green-icon"></i>{{ containers | healthycontainers }} healthy</div>
<div><i class="fa fa-heartbeat space-right orange-icon"></i>{{ containers | unhealthycontainers }} unhealthy</div> <div><i class="fa fa-heartbeat space-right orange-icon"></i>{{ containers | unhealthycontainers }} unhealthy</div>
</div> </div>

@ -8,12 +8,10 @@
<rd-widget> <rd-widget>
<rd-widget-body> <rd-widget-body>
<form class="form-horizontal" name="$ctrl.form"> <form class="form-horizontal" name="$ctrl.form">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Host and Filesystem </div>
Host and Filesystem
</div>
<div ng-if="!$ctrl.isAgent" class="form-group"> <div ng-if="!$ctrl.isAgent" class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i>
These features are only available for an Agent enabled environments. These features are only available for an Agent enabled environments.
</span> </span>
</div> </div>
@ -44,9 +42,7 @@
</div> </div>
</div> </div>
<!-- auto update window --> <!-- auto update window -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Change Window Setting </div>
Change Window Setting
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
@ -64,9 +60,7 @@
</div> </div>
<!-- security --> <!-- security -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Docker Security Settings </div>
Docker Security Settings
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<por-switch-field <por-switch-field
@ -150,16 +144,14 @@
<div class="form-group" ng-if="$ctrl.isContainerEditDisabled()"> <div class="form-group" ng-if="$ctrl.isContainerEditDisabled()">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i>
Note: The recreate/duplicate/edit feature is currently disabled (for non-admin users) by one or more security settings. Note: The recreate/duplicate/edit feature is currently disabled (for non-admin users) by one or more security settings.
</span> </span>
</div> </div>
<!-- !security --> <!-- !security -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button type="button" class="btn btn-primary btn-sm" ng-click="$ctrl.save()" ng-disabled="$ctrl.state.actionInProgress" button-spinner="$ctrl.state.actionInProgress"> <button type="button" class="btn btn-primary btn-sm" ng-click="$ctrl.save()" ng-disabled="$ctrl.state.actionInProgress" button-spinner="$ctrl.state.actionInProgress">

@ -11,19 +11,15 @@
<uib-tab index="0"> <uib-tab index="0">
<uib-tab-heading> <i class="fa fa-wrench space-right" aria-hidden="true"></i> Builder </uib-tab-heading> <uib-tab-heading> <i class="fa fa-wrench space-right" aria-hidden="true"></i> Builder </uib-tab-heading>
<form class="form-horizontal"> <form class="form-horizontal">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Naming </div>
Naming
</div>
<!-- names --> <!-- names -->
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small"> You can specify multiple names to your image. </span>
You can specify multiple names to your image.
</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left">Names</label> <label class="control-label text-left">Names</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addImageName()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addImageName()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add additional name <i class="fa fa-plus-circle" aria-hidden="true"></i> add additional name
</span> </span>
</div> </div>
@ -44,8 +40,8 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="item in formValues.ImageNames track by $index" style="margin-top: 2px;"> <div ng-repeat="item in formValues.ImageNames track by $index" style="margin-top: 2px">
<!-- name-input --> <!-- name-input -->
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
@ -69,17 +65,15 @@
</div> </div>
<!-- !name-input-list --> <!-- !name-input-list -->
<!-- build-method --> <!-- build-method -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Build method </div>
Build method
</div>
<div class="form-group"></div> <div class="form-group"></div>
<div class="form-group" style="margin-bottom: 0;"> <div class="form-group" style="margin-bottom: 0">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div> <div>
<input type="radio" id="method_editor" ng-model="state.BuildType" value="editor" ng-click="toggleEditor()" /> <input type="radio" id="method_editor" ng-model="state.BuildType" value="editor" ng-click="toggleEditor()" />
<label for="method_editor"> <label for="method_editor">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px"></i>
Web editor Web editor
</div> </div>
<p>Use our Web editor</p> <p>Use our Web editor</p>
@ -89,7 +83,7 @@
<input type="radio" id="method_upload" ng-model="state.BuildType" value="upload" ng-click="saveEditorContent()" /> <input type="radio" id="method_upload" ng-model="state.BuildType" value="upload" ng-click="saveEditorContent()" />
<label for="method_upload"> <label for="method_upload">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-upload" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-upload" aria-hidden="true" style="margin-right: 2px"></i>
Upload Upload
</div> </div>
<p>Upload a tarball or a Dockerfile from your computer</p> <p>Upload a tarball or a Dockerfile from your computer</p>
@ -99,7 +93,7 @@
<input type="radio" id="method_url" ng-model="state.BuildType" value="url" ng-click="saveEditorContent()" /> <input type="radio" id="method_url" ng-model="state.BuildType" value="url" ng-click="saveEditorContent()" />
<label for="method_url"> <label for="method_url">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-globe" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-globe" aria-hidden="true" style="margin-right: 2px"></i>
URL URL
</div> </div>
<p>Specify a URL to a file</p> <p>Specify a URL to a file</p>
@ -110,9 +104,7 @@
<!-- !build-method --> <!-- !build-method -->
<!-- web-editor --> <!-- web-editor -->
<div ng-show="state.BuildType === 'editor'"> <div ng-show="state.BuildType === 'editor'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Web editor </div>
Web editor
</div>
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small">
You can get more information about Dockerfile format in the You can get more information about Dockerfile format in the
@ -133,9 +125,7 @@
<!-- !web-editor --> <!-- !web-editor -->
<!-- upload --> <!-- upload -->
<div ng-show="state.BuildType === 'upload'"> <div ng-show="state.BuildType === 'upload'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Upload </div>
Upload
</div>
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small">
You can upload a Dockerfile or a tar archive containing a Dockerfile from your computer. When using a tarball, the root folder will be used as the build You can upload a Dockerfile or a tar archive containing a Dockerfile from your computer. When using a tarball, the root folder will be used as the build
@ -145,7 +135,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button class="btn btn-sm btn-primary" ngf-select ngf-min-size="10" ng-model="formValues.UploadFile">Select file</button> <button class="btn btn-sm btn-primary" ngf-select ngf-min-size="10" ng-model="formValues.UploadFile">Select file</button>
<span style="margin-left: 5px;"> <span style="margin-left: 5px">
{{ formValues.UploadFile.name }} {{ formValues.UploadFile.name }}
<i class="fa fa-times red-icon" ng-if="!formValues.UploadFile" aria-hidden="true"></i> <i class="fa fa-times red-icon" ng-if="!formValues.UploadFile" aria-hidden="true"></i>
</span> </span>
@ -153,9 +143,7 @@
</div> </div>
<div ng-if="formValues.UploadFile.type === 'application/gzip' || formValues.UploadFile.type === 'application/x-tar'"> <div ng-if="formValues.UploadFile.type === 'application/gzip' || formValues.UploadFile.type === 'application/x-tar'">
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small"> Indicate the path to the Dockerfile within the tarball. </span>
Indicate the path to the Dockerfile within the tarball.
</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="image_path" class="col-sm-2 control-label text-left">Dockerfile path</label> <label for="image_path" class="col-sm-2 control-label text-left">Dockerfile path</label>
@ -168,9 +156,7 @@
<!-- !upload --> <!-- !upload -->
<!-- url --> <!-- url -->
<div ng-show="state.BuildType === 'url'"> <div ng-show="state.BuildType === 'url'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> URL </div>
URL
</div>
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small">
Specify the URL to a Dockerfile, a tarball or a public Git repository (suffixed by <b>.git</b>). When using a tarball or a Git repository URL, the root folder Specify the URL to a Dockerfile, a tarball or a public Git repository (suffixed by <b>.git</b>). When using a tarball or a Git repository URL, the root folder
@ -184,9 +170,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small"> Indicate the path to the Dockerfile within the tarball/repository (ignored when using a Dockerfile). </span>
Indicate the path to the Dockerfile within the tarball/repository (ignored when using a Dockerfile).
</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="image_path" class="col-sm-2 control-label text-left">Dockerfile path</label> <label for="image_path" class="col-sm-2 control-label text-left">Dockerfile path</label>
@ -197,17 +181,13 @@
</div> </div>
<!-- !url --> <!-- !url -->
<div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'"> <div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment </div>
Deployment
</div>
<!-- node-selection --> <!-- node-selection -->
<node-selector model="formValues.NodeName"> </node-selector> <node-selector model="formValues.NodeName"> </node-selector>
<!-- !node-selection --> <!-- !node-selection -->
</div> </div>
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -223,7 +203,7 @@
<span ng-hide="state.actionInProgress">Build the image</span> <span ng-hide="state.actionInProgress">Build the image</span>
<span ng-show="state.actionInProgress">Image building in progress...</span> <span ng-show="state.actionInProgress">Image building in progress...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -13,8 +13,8 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group"> <div class="form-group">
<div class="row"> <div class="row">
<div class="pull-left" ng-repeat="tag in image.RepoTags" style="display: table;"> <div class="pull-left" ng-repeat="tag in image.RepoTags" style="display: table">
<div class="input-group col-md-1" style="padding: 0 15px;"> <div class="input-group col-md-1" style="padding: 0 15px">
<span class="input-group-addon">{{ tag }}</span> <span class="input-group-addon">{{ tag }}</span>
<span class="input-group-btn" authorization="DockerImagePush, DockerImageCreate, DockerImageDelete"> <span class="input-group-btn" authorization="DockerImagePush, DockerImageCreate, DockerImageDelete">
<a data-toggle="tooltip" class="btn btn-primary interactive" title="Push to registry" ng-click="pushTag(tag)" authorization="DockerImagePush"> <a data-toggle="tooltip" class="btn btn-primary interactive" title="Push to registry" ng-click="pushTag(tag)" authorization="DockerImagePush">
@ -40,13 +40,13 @@
</span> </span>
</div> </div>
<div class="col-sm-12"> <div class="col-sm-12">
<span id="downloadResourceHint" class="createResource" style="display: none; margin-left: 0;"> <span id="downloadResourceHint" class="createResource" style="display: none; margin-left: 0">
Download in progress... Download in progress...
<i class="fa fa-circle-notch fa-spin" aria-hidden="true" style="margin-left: 2px;"></i> <i class="fa fa-circle-notch fa-spin" aria-hidden="true" style="margin-left: 2px"></i>
</span> </span>
<span id="uploadResourceHint" class="createResource" style="display: none; margin-left: 0;"> <span id="uploadResourceHint" class="createResource" style="display: none; margin-left: 0">
Upload in progress... Upload in progress...
<i class="fa fa-circle-notch fa-spin" aria-hidden="true" style="margin-left: 2px;"></i> <i class="fa fa-circle-notch fa-spin" aria-hidden="true" style="margin-left: 2px"></i>
</span> </span>
</div> </div>
</div> </div>
@ -217,7 +217,7 @@
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<table id="image-layers" class="table"> <table id="image-layers" class="table">
<thead> <thead>
<th style="white-space: nowrap;"> <th style="white-space: nowrap">
<a ng-click="order('Order')"> <a ng-click="order('Order')">
Order Order
<span ng-show="sortType == 'Order' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span> <span ng-show="sortType == 'Order' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
@ -241,20 +241,20 @@
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="layer in history | orderBy:sortType:sortReverse"> <tr ng-repeat="layer in history | orderBy:sortType:sortReverse">
<td style="white-space: nowrap;"> <td style="white-space: nowrap">
{{ layer.Order }} {{ layer.Order }}
</td> </td>
<td style="white-space: nowrap;"> <td style="white-space: nowrap">
{{ layer.Size | humansize }} {{ layer.Size | humansize }}
</td> </td>
<td class="expand"> <td class="expand">
<div ng-if="layer.CreatedBy.length > 130"> <div ng-if="layer.CreatedBy.length > 130">
<span id="layer-command-{{ $index }}-full" style="display: none;"> <span id="layer-command-{{ $index }}-full" style="display: none">
{{ layer.CreatedBy | imagelayercommand }} {{ layer.CreatedBy | imagelayercommand }}
</span> </span>
<span id="layer-command-{{ $index }}-short"> <span id="layer-command-{{ $index }}-short">
{{ layer.CreatedBy | imagelayercommand | truncate: 130 }} {{ layer.CreatedBy | imagelayercommand | truncate: 130 }}
<span ng-if="layer.CreatedBy.length > 130" style="margin-left: 5px;"> <span ng-if="layer.CreatedBy.length > 130" style="margin-left: 5px">
<a id="layer-command-expander{{ $index }}" class="btn" ng-click="toggleLayerCommand($index)"> <a id="layer-command-expander{{ $index }}" class="btn" ng-click="toggleLayerCommand($index)">
<i class="fa fa-plus-circle" aria-hidden="true"></i> <i class="fa fa-plus-circle" aria-hidden="true"></i>
</a> </a>

@ -25,9 +25,7 @@
check-rate-limits="true" check-rate-limits="true"
> >
<div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'"> <div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment </div>
Deployment
</div>
<!-- node-selection --> <!-- node-selection -->
<node-selector model="formValues.NodeName"> </node-selector> <node-selector model="formValues.NodeName"> </node-selector>
<!-- !node-selection --> <!-- !node-selection -->

@ -9,18 +9,14 @@
<rd-widget-body> <rd-widget-body>
<form class="form-horizontal"> <form class="form-horizontal">
<!-- upload --> <!-- upload -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Upload </div>
Upload
</div>
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small"> You can upload a tar archive containing your images. </span>
You can upload a tar archive containing your images.
</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button type="button" class="btn btn-sm btn-primary" ngf-select ngf-min-size="10" ng-model="formValues.UploadFile">Select file</button> <button type="button" class="btn btn-sm btn-primary" ngf-select ngf-min-size="10" ng-model="formValues.UploadFile">Select file</button>
<span style="margin-left: 5px;"> <span style="margin-left: 5px">
{{ formValues.UploadFile.name }} {{ formValues.UploadFile.name }}
<i class="fa fa-times red-icon" ng-if="!formValues.UploadFile" aria-hidden="true"></i> <i class="fa fa-times red-icon" ng-if="!formValues.UploadFile" aria-hidden="true"></i>
</span> </span>
@ -28,9 +24,7 @@
</div> </div>
<!-- !upload --> <!-- !upload -->
<div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'"> <div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment </div>
Deployment
</div>
<!-- node-selection --> <!-- node-selection -->
<node-selector model="formValues.NodeName"> </node-selector> <node-selector model="formValues.NodeName"> </node-selector>
<!-- !node-selection --> <!-- !node-selection -->
@ -55,9 +49,7 @@
</div> </div>
</div> </div>
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -70,7 +62,7 @@
<span ng-hide="state.actionInProgress">Upload</span> <span ng-hide="state.actionInProgress">Upload</span>
<span ng-show="state.actionInProgress">Images uploading in progress...</span> <span ng-show="state.actionInProgress">Images uploading in progress...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -16,9 +16,7 @@
</div> </div>
</div> </div>
<!-- !name-input --> <!-- !name-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Driver configuration </div>
Driver configuration
</div>
<!-- driver-input --> <!-- driver-input -->
<div class="form-group"> <div class="form-group">
<label for="network_driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label> <label for="network_driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label>
@ -32,7 +30,7 @@
<!-- !driver-input --> <!-- !driver-input -->
<!-- driver-options --> <!-- driver-options -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left"> <label class="control-label text-left">
Driver options Driver options
<portainer-tooltip <portainer-tooltip
@ -40,13 +38,13 @@
message="Driver options are specific to the selected driver. Please refer to the selected driver documentation." message="Driver options are specific to the selected driver. Please refer to the selected driver documentation."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addDriverOption()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addDriverOption()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add driver option <i class="fa fa-plus-circle" aria-hidden="true"></i> add driver option
</span> </span>
</div> </div>
<!-- driver-options-input-list --> <!-- driver-options-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px;"> <div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="option.name" placeholder="e.g. com.docker.network.bridge.enable_icc" /> <input type="text" class="form-control" ng-model="option.name" placeholder="e.g. com.docker.network.bridge.enable_icc" />
@ -67,9 +65,7 @@
<network-macvlan-form ng-show="config.Driver === 'macvlan'" data="formValues.Macvlan" application-state="applicationState"></network-macvlan-form> <network-macvlan-form ng-show="config.Driver === 'macvlan'" data="formValues.Macvlan" application-state="applicationState"></network-macvlan-form>
<!-- !macvlan-management --> <!-- !macvlan-management -->
<div ng-hide="config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'swarm'"> <div ng-hide="config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'swarm'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> IPV4 Network configuration </div>
IPV4 Network configuration
</div>
<!-- subnet-gateway-inputs --> <!-- subnet-gateway-inputs -->
<div class="form-group"> <div class="form-group">
<label for="ipv4_network_subnet" class="col-sm-2 col-lg-1 control-label text-left">Subnet</label> <label for="ipv4_network_subnet" class="col-sm-2 col-lg-1 control-label text-left">Subnet</label>
@ -110,15 +106,13 @@
</div> </div>
<!-- !iprange-auxaddr-inputs --> <!-- !iprange-auxaddr-inputs -->
<div class="form-group"> <div class="form-group">
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addIPV4AuxAddress()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addIPV4AuxAddress()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add excluded IP <i class="fa fa-plus-circle" aria-hidden="true"></i> add excluded IP
</span> </span>
</div> </div>
</div> </div>
<div ng-show="config.Driver === 'bridge' || (config.Driver === 'macvlan' && formValues.Macvlan.Scope !== 'swarm')"> <div ng-show="config.Driver === 'bridge' || (config.Driver === 'macvlan' && formValues.Macvlan.Scope !== 'swarm')">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> IPV6 Network configuration </div>
IPV6 Network configuration
</div>
<!-- subnet-gateway-inputs --> <!-- subnet-gateway-inputs -->
<div class="form-group"> <div class="form-group">
<label for="ipv6_network_subnet" class="col-sm-2 col-lg-1 control-label text-left">Subnet</label> <label for="ipv6_network_subnet" class="col-sm-2 col-lg-1 control-label text-left">Subnet</label>
@ -159,23 +153,21 @@
</div> </div>
<!-- !iprange-auxaddr-inputs --> <!-- !iprange-auxaddr-inputs -->
<div class="form-group"> <div class="form-group">
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addIPV6AuxAddress()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addIPV6AuxAddress()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add excluded IP <i class="fa fa-plus-circle" aria-hidden="true"></i> add excluded IP
</span> </span>
</div> </div>
</div> </div>
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Advanced configuration </div>
Advanced configuration
</div>
<!-- labels --> <!-- labels -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Labels</label> <label class="control-label text-left">Labels</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addLabel()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add label </span> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addLabel()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add label </span>
</div> </div>
<!-- labels-input-list --> <!-- labels-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="label in formValues.Labels" style="margin-top: 2px;"> <div ng-repeat="label in formValues.Labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" /> <input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
@ -199,7 +191,7 @@
Isolated network Isolated network
<portainer-tooltip position="bottom" message="An isolated network has no inbound or outbound communications."></portainer-tooltip> <portainer-tooltip position="bottom" message="An isolated network has no inbound or outbound communications."></portainer-tooltip>
</label> </label>
<label name="ownership" class="switch" style="margin-left: 20px;"> <label name="ownership" class="switch" style="margin-left: 20px">
<input type="checkbox" ng-model="config.Internal" /> <input type="checkbox" ng-model="config.Internal" />
<i></i> <i></i>
</label> </label>
@ -209,10 +201,8 @@
<!-- attachable --> <!-- attachable -->
<div class="form-group" ng-hide="config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'local'"> <div class="form-group" ng-hide="config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'local'">
<div class="col-sm-12"> <div class="col-sm-12">
<label for="attachable" class="control-label text-left"> <label for="attachable" class="control-label text-left"> Enable manual container attachment </label>
Enable manual container attachment <label name="attachable" class="switch" style="margin-left: 20px">
</label>
<label name="attachable" class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="config.Attachable" /> <input type="checkbox" ng-model="config.Attachable" />
<i></i> <i></i>
</label> </label>
@ -227,9 +217,7 @@
config.Driver !== 'macvlan' config.Driver !== 'macvlan'
" "
> >
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment </div>
Deployment
</div>
<!-- node-selection --> <!-- node-selection -->
<node-selector model="formValues.NodeName"> </node-selector> <node-selector model="formValues.NodeName"> </node-selector>
<!-- !node-selection --> <!-- !node-selection -->
@ -238,9 +226,7 @@
<por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form> <por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -253,8 +239,8 @@
<span ng-hide="state.actionInProgress">Create the network</span> <span ng-hide="state.actionInProgress">Create the network</span>
<span ng-show="state.actionInProgress">Creating network...</span> <span ng-show="state.actionInProgress">Creating network...</span>
</button> </button>
<i id="createResourceSpinner" class="fa fa-cog fa-spin" style="margin-left: 5px; display: none;"></i> <i id="createResourceSpinner" class="fa fa-cog fa-spin" style="margin-left: 5px; display: none"></i>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -31,19 +31,19 @@
Encode secret Encode secret
<portainer-tooltip position="bottom" message="Secrets need to be base64 encoded. Disable this if your secret is already base64 encoded."></portainer-tooltip> <portainer-tooltip position="bottom" message="Secrets need to be base64 encoded. Disable this if your secret is already base64 encoded."></portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" name="encode_secret" ng-model="formValues.encodeSecret" /><i></i> </label> <label class="switch" style="margin-left: 20px"> <input type="checkbox" name="encode_secret" ng-model="formValues.encodeSecret" /><i></i> </label>
</div> </div>
</div> </div>
<!-- !encode-secret --> <!-- !encode-secret -->
<!-- labels --> <!-- labels -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Labels</label> <label class="control-label text-left">Labels</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addLabel()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add label </span> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addLabel()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add label </span>
</div> </div>
<!-- labels-input-list --> <!-- labels-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="label in formValues.Labels" style="margin-top: 2px;"> <div ng-repeat="label in formValues.Labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" /> <input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
@ -64,9 +64,7 @@
<por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form> <por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -79,7 +77,7 @@
<span ng-hide="state.actionInProgress">Create the secret</span> <span ng-hide="state.actionInProgress">Create the secret</span>
<span ng-show="state.actionInProgress">Creating secret...</span> <span ng-show="state.actionInProgress">Creating secret...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -16,9 +16,7 @@
</div> </div>
</div> </div>
<!-- !name-input --> <!-- !name-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Image configuration </div>
Image configuration
</div>
<!-- image-and-registry --> <!-- image-and-registry -->
<por-image-registry <por-image-registry
model="formValues.RegistryModel" model="formValues.RegistryModel"
@ -32,16 +30,12 @@
> >
</por-image-registry> </por-image-registry>
<!-- !image-and-registry --> <!-- !image-and-registry -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Scheduling </div>
Scheduling
</div>
<!-- scheduling-mode --> <!-- scheduling-mode -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left"> <label class="control-label text-left"> Scheduling mode </label>
Scheduling mode <div class="btn-group btn-group-sm" style="margin-left: 20px">
</label>
<div class="btn-group btn-group-sm" style="margin-left: 20px;">
<label class="btn btn-primary" ng-model="formValues.Mode" uib-btn-radio="'global'">Global</label> <label class="btn btn-primary" ng-model="formValues.Mode" uib-btn-radio="'global'">Global</label>
<label class="btn btn-primary" ng-model="formValues.Mode" uib-btn-radio="'replicated'">Replicated</label> <label class="btn btn-primary" ng-model="formValues.Mode" uib-btn-radio="'replicated'">Replicated</label>
</div> </div>
@ -49,33 +43,29 @@
</div> </div>
<div class="form-group form-inline" ng-if="formValues.Mode === 'replicated'"> <div class="form-group form-inline" ng-if="formValues.Mode === 'replicated'">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left"> <label class="control-label text-left"> Replicas </label>
Replicas <input type="number" class="form-control" ng-model="formValues.Replicas" id="replicas" placeholder="e.g. 3" style="margin-left: 20px" />
</label>
<input type="number" class="form-control" ng-model="formValues.Replicas" id="replicas" placeholder="e.g. 3" style="margin-left: 20px;" />
</div> </div>
</div> </div>
<!-- !scheduling-mode --> <!-- !scheduling-mode -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Ports configuration </div>
Ports configuration
</div>
<!-- port-mapping --> <!-- port-mapping -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Port mapping</label> <label class="control-label text-left">Port mapping</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addPortBinding()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addPortBinding()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> map additional port <i class="fa fa-plus-circle" aria-hidden="true"></i> map additional port
</span> </span>
</div> </div>
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="portBinding in formValues.Ports" style="margin-top: 2px;"> <div ng-repeat="portBinding in formValues.Ports" style="margin-top: 2px">
<!-- host-port --> <!-- host-port -->
<div class="input-group col-sm-3 input-group-sm"> <div class="input-group col-sm-3 input-group-sm">
<span class="input-group-addon">host</span> <span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="portBinding.PublishedPort" placeholder="e.g. 80 or 1.2.3.4:80 (optional)" /> <input type="text" class="form-control" ng-model="portBinding.PublishedPort" placeholder="e.g. 80 or 1.2.3.4:80 (optional)" />
</div> </div>
<!-- !host-port --> <!-- !host-port -->
<span style="margin: 0 10px 0 10px;"> <span style="margin: 0 10px 0 10px">
<i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i> <i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i>
</span> </span>
<!-- container-port --> <!-- container-port -->
@ -106,9 +96,7 @@
<!-- !port-mapping --> <!-- !port-mapping -->
<!-- create-webhook --> <!-- create-webhook -->
<div ng-if="endpoint.Type !== 4"> <div ng-if="endpoint.Type !== 4">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Webhooks </div>
Webhooks
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left"> <label class="control-label text-left">
@ -118,7 +106,7 @@
message="Create a webhook (or callback URI) to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service." message="Create a webhook (or callback URI) to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="formValues.Webhook" /><i></i> </label> <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="formValues.Webhook" /><i></i> </label>
</div> </div>
</div> </div>
</div> </div>
@ -127,9 +115,7 @@
<por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form> <por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -142,7 +128,7 @@
<span ng-hide="state.actionInProgress">Create the service</span> <span ng-hide="state.actionInProgress">Create the service</span>
<span ng-show="state.actionInProgress">Creating service...</span> <span ng-show="state.actionInProgress">Creating service...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->
@ -171,10 +157,8 @@
<div class="tab-content"> <div class="tab-content">
<!-- tab-command --> <!-- tab-command -->
<div class="tab-pane active" id="command"> <div class="tab-pane active" id="command">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Command </div>
Command
</div>
<!-- command-input --> <!-- command-input -->
<div class="form-group"> <div class="form-group">
<label for="service_command" class="col-sm-2 col-lg-1 control-label text-left">Command</label> <label for="service_command" class="col-sm-2 col-lg-1 control-label text-left">Command</label>
@ -203,9 +187,7 @@
</div> </div>
</div> </div>
<!-- !workdir-user-input --> <!-- !workdir-user-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Logging </div>
Logging
</div>
<!-- logging-driver --> <!-- logging-driver -->
<div class="form-group"> <div class="form-group">
<label for="log-driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label> <label for="log-driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label>
@ -227,7 +209,7 @@
<!-- !logging-driver --> <!-- !logging-driver -->
<!-- logging-opts --> <!-- logging-opts -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left"> <label class="control-label text-left">
Options Options
<portainer-tooltip <portainer-tooltip
@ -237,15 +219,15 @@
</label> </label>
<span <span
class="label label-default interactive" class="label label-default interactive"
style="margin-left: 10px;" style="margin-left: 10px"
ng-click="!formValues.LogDriverName || formValues.LogDriverName === 'none' || addLogDriverOpt(formValues.LogDriverName)" ng-click="!formValues.LogDriverName || formValues.LogDriverName === 'none' || addLogDriverOpt(formValues.LogDriverName)"
> >
<i class="fa fa-plus-circle" aria-hidden="true"></i> add logging driver option <i class="fa fa-plus-circle" aria-hidden="true"></i> add logging driver option
</span> </span>
</div> </div>
<!-- logging-opts-input-list --> <!-- logging-opts-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="opt in formValues.LogDriverOpts" style="margin-top: 2px;"> <div ng-repeat="opt in formValues.LogDriverOpts" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">option</span> <span class="input-group-addon">option</span>
<input type="text" class="form-control" ng-model="opt.name" placeholder="e.g. FOO" /> <input type="text" class="form-control" ng-model="opt.name" placeholder="e.g. FOO" />
@ -267,19 +249,19 @@
<!-- !tab-command --> <!-- !tab-command -->
<!-- tab-volume --> <!-- tab-volume -->
<div class="tab-pane" id="volumes"> <div class="tab-pane" id="volumes">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- volumes --> <!-- volumes -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Volume mapping</label> <label class="control-label text-left">Volume mapping</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addVolume()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addVolume()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> map additional volume <i class="fa fa-plus-circle" aria-hidden="true"></i> map additional volume
</span> </span>
</div> </div>
<!-- volumes-input-list --> <!-- volumes-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="volume in formValues.Volumes"> <div ng-repeat="volume in formValues.Volumes">
<div class="col-sm-12" style="margin-top: 10px;"> <div class="col-sm-12" style="margin-top: 10px">
<!-- volume-line1 --> <!-- volume-line1 -->
<div class="col-sm-12 form-inline"> <div class="col-sm-12 form-inline">
<!-- container-path --> <!-- container-path -->
@ -292,7 +274,7 @@
</div> </div>
<!-- !container-path --> <!-- !container-path -->
<!-- volume-type --> <!-- volume-type -->
<div class="input-group col-sm-5" style="margin-left: 5px; vertical-align: top;"> <div class="input-group col-sm-5" style="margin-left: 5px; vertical-align: top">
<div class="btn-group btn-group-sm" ng-if="allowBindMounts"> <div class="btn-group btn-group-sm" ng-if="allowBindMounts">
<label class="btn btn-primary" ng-model="volume.Type" uib-btn-radio="'volume'" ng-click="volume.Source = null">Volume</label> <label class="btn btn-primary" ng-model="volume.Type" uib-btn-radio="'volume'" ng-click="volume.Source = null">Volume</label>
<label class="btn btn-primary" ng-model="volume.Type" uib-btn-radio="'bind'" ng-click="volume.Source = null">Bind</label> <label class="btn btn-primary" ng-model="volume.Type" uib-btn-radio="'bind'" ng-click="volume.Source = null">Bind</label>
@ -305,12 +287,12 @@
</div> </div>
<!-- !volume-line1 --> <!-- !volume-line1 -->
<!-- volume-line2 --> <!-- volume-line2 -->
<div class="col-sm-12 form-inline" style="margin-top: 5px;"> <div class="col-sm-12 form-inline" style="margin-top: 5px">
<div style="height: 30px; display: inline-block; vertical-align: top; display: inline-flex; align-items: center;"> <div style="height: 30px; display: inline-block; vertical-align: top; display: inline-flex; align-items: center">
<i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i> <i class="fa fa-long-arrow-alt-right" aria-hidden="true"></i>
</div> </div>
<!-- volume --> <!-- volume -->
<div class="col-sm-6 input-group" ng-if="volume.Type === 'volume'" style="float: none; padding: 0;"> <div class="col-sm-6 input-group" ng-if="volume.Type === 'volume'" style="float: none; padding: 0">
<div class="input-group input-group-sm w-full"> <div class="input-group input-group-sm w-full">
<span class="input-group-addon">volume</span> <span class="input-group-addon">volume</span>
<select <select
@ -334,7 +316,7 @@
</div> </div>
<!-- !bind --> <!-- !bind -->
<!-- read-only --> <!-- read-only -->
<div class="input-group input-group-sm col-sm-5" style="margin-left: 5px; vertical-align: top;"> <div class="input-group input-group-sm col-sm-5" style="margin-left: 5px; vertical-align: top">
<div class="btn-group btn-group-sm"> <div class="btn-group btn-group-sm">
<label class="btn btn-primary" ng-model="volume.ReadOnly" uib-btn-radio="false">Writable</label> <label class="btn btn-primary" ng-model="volume.ReadOnly" uib-btn-radio="false">Writable</label>
<label class="btn btn-primary" ng-model="volume.ReadOnly" uib-btn-radio="true">Read-only</label> <label class="btn btn-primary" ng-model="volume.ReadOnly" uib-btn-radio="true">Read-only</label>
@ -354,7 +336,7 @@
<!-- !tab-volume --> <!-- !tab-volume -->
<!-- tab-network --> <!-- tab-network -->
<div class="tab-pane" id="network"> <div class="tab-pane" id="network">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- network-input --> <!-- network-input -->
<div class="form-group"> <div class="form-group">
<label for="container_network" class="col-sm-2 col-lg-1 control-label text-left">Network</label> <label for="container_network" class="col-sm-2 col-lg-1 control-label text-left">Network</label>
@ -369,15 +351,15 @@
<!-- !network-input --> <!-- !network-input -->
<!-- extra-networks --> <!-- extra-networks -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Extra networks</label> <label class="control-label text-left">Extra networks</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addExtraNetwork()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addExtraNetwork()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add extra network <i class="fa fa-plus-circle" aria-hidden="true"></i> add extra network
</span> </span>
</div> </div>
<!-- network-input-list --> <!-- network-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="network in formValues.ExtraNetworks" style="margin-top: 2px;"> <div ng-repeat="network in formValues.ExtraNetworks" style="margin-top: 2px">
<select class="form-control" ng-model="network.Name"> <select class="form-control" ng-model="network.Name">
<option selected disabled hidden value="">Select a network</option> <option selected disabled hidden value="">Select a network</option>
<option ng-repeat="net in availableNetworks" ng-value="net.Name">{{ net.Name }}</option> <option ng-repeat="net in availableNetworks" ng-value="net.Name">{{ net.Name }}</option>
@ -392,15 +374,15 @@
<!-- !extra-networks --> <!-- !extra-networks -->
<!-- extra-hosts-variables --> <!-- extra-hosts-variables -->
<div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.25"> <div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.25">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Hosts file entries</label> <label class="control-label text-left">Hosts file entries</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addHostsEntry()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addHostsEntry()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add additional entry <i class="fa fa-plus-circle" aria-hidden="true"></i> add additional entry
</span> </span>
</div> </div>
<!-- hosts-input-list --> <!-- hosts-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="variable in formValues.HostsEntries" style="margin-top: 2px;"> <div ng-repeat="variable in formValues.HostsEntries" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span> <span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="variable.value" placeholder="e.g. host:IP" /> <input type="text" class="form-control" ng-model="variable.value" placeholder="e.g. host:IP" />
@ -427,18 +409,18 @@
<!-- !tab-env --> <!-- !tab-env -->
<!-- tab-labels --> <!-- tab-labels -->
<div class="tab-pane" id="labels"> <div class="tab-pane" id="labels">
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<!-- labels --> <!-- labels -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Service labels</label> <label class="control-label text-left">Service labels</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addLabel()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addLabel()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add service label <i class="fa fa-plus-circle" aria-hidden="true"></i> add service label
</span> </span>
</div> </div>
<!-- labels-input-list --> <!-- labels-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="label in formValues.Labels" style="margin-top: 2px;"> <div ng-repeat="label in formValues.Labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" /> <input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
@ -457,15 +439,15 @@
<!-- !labels--> <!-- !labels-->
<!-- container-labels --> <!-- container-labels -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Container labels</label> <label class="control-label text-left">Container labels</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addContainerLabel()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addContainerLabel()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add container label <i class="fa fa-plus-circle" aria-hidden="true"></i> add container label
</span> </span>
</div> </div>
<!-- container-labels-input-list --> <!-- container-labels-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="label in formValues.ContainerLabels" style="margin-top: 2px;"> <div ng-repeat="label in formValues.ContainerLabels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" /> <input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />

@ -1,17 +1,17 @@
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Configs</label> <label class="control-label text-left">Configs</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addConfig()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add a config </span> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addConfig()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add a config </span>
</div> </div>
<!-- info message --> <!-- info message -->
<div class="form-group" ng-show="formValues.Configs.$invalid" style="margin-bottom: 0px;"> <div class="form-group" ng-show="formValues.Configs.$invalid" style="margin-bottom: 0px">
<div class="col-sm-12 small text-warning" style="padding-left: 35px; padding-top: 20px;"> <div class="col-sm-12 small text-warning" style="padding-left: 35px; padding-top: 20px">
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i> {{ formValues.Configs.$error }} <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> {{ formValues.Configs.$error }}
</div> </div>
</div> </div>
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="config in formValues.Configs" style="margin-top: 2px;"> <div ng-repeat="config in formValues.Configs" style="margin-top: 2px">
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">config</span> <span class="input-group-addon">config</span>
<select class="form-control" ng-model="config.model" ng-change="checkIfConfigDuplicated()" ng-options="config.Name for config in availableConfigs | orderBy: 'Name'"> <select class="form-control" ng-model="config.model" ng-change="checkIfConfigDuplicated()" ng-options="config.Name for config in availableConfigs | orderBy: 'Name'">

@ -1,12 +1,8 @@
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Resources </div>
Resources
</div>
<!-- memory-reservation-input --> <!-- memory-reservation-input -->
<div class="form-group"> <div class="form-group">
<label for="memory-reservation" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px;"> <label for="memory-reservation" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> Memory reservation </label>
Memory reservation
</label>
<div class="col-sm-3"> <div class="col-sm-3">
<slider model="formValues.MemoryReservation" floor="0" ceil="state.sliderMaxMemory" step="256" ng-if="state.sliderMaxMemory"></slider> <slider model="formValues.MemoryReservation" floor="0" ceil="state.sliderMaxMemory" step="256" ng-if="state.sliderMaxMemory"></slider>
</div> </div>
@ -14,73 +10,57 @@
<input type="number" min="0" class="form-control" ng-model="formValues.MemoryReservation" /> <input type="number" min="0" class="form-control" ng-model="formValues.MemoryReservation" />
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
<p class="small text-muted" style="margin-top: 7px;"> <p class="small text-muted" style="margin-top: 7px"> Minimum memory available on a node to run a task (<b>MB</b>) </p>
Minimum memory available on a node to run a task (<b>MB</b>)
</p>
</div> </div>
</div> </div>
<!-- !memory-reservation-input --> <!-- !memory-reservation-input -->
<!-- memory-limit-input --> <!-- memory-limit-input -->
<div class="form-group"> <div class="form-group">
<label for="memory-limit" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px;"> <label for="memory-limit" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> Memory limit </label>
Memory limit
</label>
<div class="col-sm-3"> <div class="col-sm-3">
<slider model="formValues.MemoryLimit" floor="0" ceil="state.sliderMaxMemory" step="256" ng-if="state.sliderMaxMemory"></slider> <slider model="formValues.MemoryLimit" floor="0" ceil="state.sliderMaxMemory" step="256" ng-if="state.sliderMaxMemory"></slider>
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2">
<input type="number" min="0" class="form-control" ng-model="formValues.MemoryLimit" /> <input type="number" min="0" class="form-control" ng-model="formValues.MemoryLimit" />
</div> </div>
<div class="col-sm-4" style="margin-top: 7px;"> <div class="col-sm-4" style="margin-top: 7px">
<p class="small text-muted"> <p class="small text-muted"> Maximum memory usage per task (<b>MB</b>) </p>
Maximum memory usage per task (<b>MB</b>)
</p>
</div> </div>
</div> </div>
<!-- !memory-limit-input --> <!-- !memory-limit-input -->
<!-- cpu-reservation-input --> <!-- cpu-reservation-input -->
<div class="form-group"> <div class="form-group">
<label for="cpu-reservation" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px;"> <label for="cpu-reservation" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> CPU reservation </label>
CPU reservation
</label>
<div class="col-sm-5"> <div class="col-sm-5">
<slider model="formValues.CpuReservation" floor="0" ceil="state.sliderMaxCpu" step="0.25" precision="2" ng-if="state.sliderMaxCpu"></slider> <slider model="formValues.CpuReservation" floor="0" ceil="state.sliderMaxCpu" step="0.25" precision="2" ng-if="state.sliderMaxCpu"></slider>
</div> </div>
<div class="col-sm-4" style="margin-top: 20px;"> <div class="col-sm-4" style="margin-top: 20px">
<p class="small text-muted"> <p class="small text-muted"> Minimum CPU available on a node to run a task </p>
Minimum CPU available on a node to run a task
</p>
</div> </div>
</div> </div>
<!-- !cpu-reservation-input --> <!-- !cpu-reservation-input -->
<!-- cpu-limit-input --> <!-- cpu-limit-input -->
<div class="form-group"> <div class="form-group">
<label for="cpu-limit" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px;"> <label for="cpu-limit" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> CPU limit </label>
CPU limit
</label>
<div class="col-sm-5"> <div class="col-sm-5">
<slider model="formValues.CpuLimit" floor="0" ceil="state.sliderMaxCpu" step="0.25" precision="2" ng-if="state.sliderMaxCpu"></slider> <slider model="formValues.CpuLimit" floor="0" ceil="state.sliderMaxCpu" step="0.25" precision="2" ng-if="state.sliderMaxCpu"></slider>
</div> </div>
<div class="col-sm-4" style="margin-top: 20px;"> <div class="col-sm-4" style="margin-top: 20px">
<p class="small text-muted"> <p class="small text-muted"> Maximum CPU usage per task </p>
Maximum CPU usage per task
</p>
</div> </div>
</div> </div>
<!-- !cpu-limit-input --> <!-- !cpu-limit-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Placement </div>
Placement
</div>
<!-- placement-constraints --> <!-- placement-constraints -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Placement constraints</label> <label class="control-label text-left">Placement constraints</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addPlacementConstraint()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addPlacementConstraint()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> placement constraint <i class="fa fa-plus-circle" aria-hidden="true"></i> placement constraint
</span> </span>
</div> </div>
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="constraint in formValues.PlacementConstraints" style="margin-top: 2px;"> <div ng-repeat="constraint in formValues.PlacementConstraints" style="margin-top: 2px">
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="constraint.key" placeholder="e.g. node.role" /> <input type="text" class="form-control" ng-model="constraint.key" placeholder="e.g. node.role" />
@ -104,14 +84,14 @@
<!-- !placement-constraints --> <!-- !placement-constraints -->
<!-- placement-preferences --> <!-- placement-preferences -->
<div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.3"> <div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.3">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Placement preferences</label> <label class="control-label text-left">Placement preferences</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addPlacementPreference()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addPlacementPreference()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> placement preference <i class="fa fa-plus-circle" aria-hidden="true"></i> placement preference
</span> </span>
</div> </div>
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="preference in formValues.PlacementPreferences" style="margin-top: 2px;"> <div ng-repeat="preference in formValues.PlacementPreferences" style="margin-top: 2px">
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">strategy</span> <span class="input-group-addon">strategy</span>
<input type="text" class="form-control" ng-model="preference.strategy" placeholder="e.g. spread" /> <input type="text" class="form-control" ng-model="preference.strategy" placeholder="e.g. spread" />

@ -1,4 +1,4 @@
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="form-group"> <div class="form-group">
<div class="col-sm-12 small text-muted"> <div class="col-sm-12 small text-muted">
By default, secrets will be available under <code>/run/secrets/$SECRET_NAME</code> in containers (Linux) or By default, secrets will be available under <code>/run/secrets/$SECRET_NAME</code> in containers (Linux) or
@ -6,18 +6,18 @@
> >
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left">Secrets</label> <label class="control-label text-left">Secrets</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addSecret()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add a secret </span> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addSecret()"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add a secret </span>
</div> </div>
<!-- info message --> <!-- info message -->
<div class="form-group" ng-show="formValues.Secrets.$invalid" style="margin-bottom: 0px;"> <div class="form-group" ng-show="formValues.Secrets.$invalid" style="margin-bottom: 0px">
<div class="col-sm-12 small text-warning" style="padding-left: 35px; padding-top: 20px;"> <div class="col-sm-12 small text-warning" style="padding-left: 35px; padding-top: 20px">
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i> {{ formValues.Secrets.$error }} <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> {{ formValues.Secrets.$error }}
</div> </div>
</div> </div>
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="secret in formValues.Secrets track by $index" style="margin-top: 4px;"> <div ng-repeat="secret in formValues.Secrets track by $index" style="margin-top: 4px">
<div class="input-group col-sm-4 input-group-sm"> <div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">secret</span> <span class="input-group-addon">secret</span>
<select class="form-control" ng-model="secret.model" ng-change="checkIfSecretDuplicated()" ng-options="secret.Name for secret in availableSecrets | orderBy: 'Name'"> <select class="form-control" ng-model="secret.model" ng-change="checkIfSecretDuplicated()" ng-options="secret.Name for secret in availableSecrets | orderBy: 'Name'">

@ -1,7 +1,5 @@
<form class="form-horizontal" style="margin-top: 15px;"> <form class="form-horizontal" style="margin-top: 15px">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Update config </div>
Update config
</div>
<!-- parallelism-input --> <!-- parallelism-input -->
<div class="form-group"> <div class="form-group">
<label for="parallelism" class="col-sm-3 col-lg-2 control-label text-left">Update parallelism</label> <label for="parallelism" class="col-sm-3 col-lg-2 control-label text-left">Update parallelism</label>
@ -9,9 +7,7 @@
<input type="number" class="form-control" ng-model="formValues.Parallelism" id="parallelism" placeholder="e.g. 1" /> <input type="number" class="form-control" ng-model="formValues.Parallelism" id="parallelism" placeholder="e.g. 1" />
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Maximum number of tasks to be updated simultaneously (0 to update all at once). </p>
Maximum number of tasks to be updated simultaneously (0 to update all at once).
</p>
</div> </div>
</div> </div>
<!-- !parallelism-input --> <!-- !parallelism-input -->
@ -25,9 +21,7 @@
<input type="text" class="form-control" ng-model="formValues.UpdateDelay" id="update-delay" placeholder="e.g. 1m" ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i" /> <input type="text" class="form-control" ng-model="formValues.UpdateDelay" id="update-delay" placeholder="e.g. 1m" ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i" />
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0s, 0 seconds. </p>
Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0s, 0 seconds.
</p>
</div> </div>
</div> </div>
<!-- !delay-input --> <!-- !delay-input -->
@ -41,9 +35,7 @@
</div> </div>
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Action taken on failure to start after update. </p>
Action taken on failure to start after update.
</p>
</div> </div>
</div> </div>
<!-- !failureAction-input --> <!-- !failureAction-input -->
@ -57,16 +49,12 @@
</div> </div>
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Operation order on failure. </p>
Operation order on failure.
</p>
</div> </div>
</div> </div>
<!-- !order-input --> <!-- !order-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Restart policy </div>
Restart policy
</div>
<!-- restartCondition-input --> <!-- restartCondition-input -->
<div class="form-group"> <div class="form-group">
<label for="restart-condition" class="col-sm-3 col-lg-2 control-label text-left">Restart condition</label> <label for="restart-condition" class="col-sm-3 col-lg-2 control-label text-left">Restart condition</label>
@ -78,9 +66,7 @@
</div> </div>
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Restart when condition is met (default condition "any"). </p>
Restart when condition is met (default condition "any").
</p>
</div> </div>
</div> </div>
<!-- !restartCondition-input --> <!-- !restartCondition-input -->
@ -94,9 +80,7 @@
<input type="text" class="form-control" ng-model="formValues.RestartDelay" id="restart-delay" placeholder="e.g. 1m" ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i" /> <input type="text" class="form-control" ng-model="formValues.RestartDelay" id="restart-delay" placeholder="e.g. 1m" ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i" />
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Delay between restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 5s, 5 seconds. </p>
Delay between restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 5s, 5 seconds.
</p>
</div> </div>
</div> </div>
<!-- !restartDelay-input --> <!-- !restartDelay-input -->
@ -107,9 +91,7 @@
<input type="number" class="form-control" ng-model="formValues.RestartMaxAttempts" id="restart-max-attempts" placeholder="e.g. 0" /> <input type="number" class="form-control" ng-model="formValues.RestartMaxAttempts" id="restart-max-attempts" placeholder="e.g. 0" />
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<p class="small text-muted"> <p class="small text-muted"> Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited). </p>
Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited).
</p>
</div> </div>
</div> </div>
<!-- !restartMaxAttempts-input --> <!-- !restartMaxAttempts-input -->

@ -2,14 +2,14 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-tasks" title-text="Configs"> </rd-widget-header> <rd-widget-header icon="fa-tasks" title-text="Configs"> </rd-widget-header>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="form-inline" style="padding: 10px;" authorization="DockerServiceUpdate"> <div class="form-inline" style="padding: 10px" authorization="DockerServiceUpdate">
Add a config: Add a config:
<select class="form-control" ng-options="config.Name for config in configs | orderBy: 'Name'" ng-model="newConfig"> <select class="form-control" ng-options="config.Name for config in configs | orderBy: 'Name'" ng-model="newConfig">
<option selected disabled hidden value="">Select a config</option> <option selected disabled hidden value="">Select a config</option>
</select> </select>
<a class="btn btn-default btn-sm" ng-click="addConfig(service, newConfig)"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add config </a> <a class="btn btn-default btn-sm" ng-click="addConfig(service, newConfig)"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add config </a>
</div> </div>
<table class="table" style="margin-top: 5px;"> <table class="table" style="margin-top: 5px">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>

@ -10,9 +10,7 @@
><code ng-if="service.Command">{{ service.Command | command }}</code></td ><code ng-if="service.Command">{{ service.Command | command }}</code></td
> >
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Command to execute. </p>
Command to execute.
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -21,36 +19,28 @@
><code ng-if="service.Arguments">{{ service.Arguments }}</code></td ><code ng-if="service.Arguments">{{ service.Arguments }}</code></td
> >
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Arguments passed to command in container. </p>
Arguments passed to command in container.
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>User</td> <td>User</td>
<td>{{ service.User }}</td> <td>{{ service.User }}</td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Username or UID. </p>
Username or UID.
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Working directory</td> <td>Working directory</td>
<td>{{ service.Dir }}</td> <td>{{ service.Dir }}</td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Working directory inside the container. </p>
Working directory inside the container.
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Stop grace period</td> <td>Stop grace period</td>
<td>{{ service.StopGracePeriod }}</td> <td>{{ service.StopGracePeriod }}</td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Time to wait before force killing a container (default none). </p>
Time to wait before force killing a container (default none).
</p>
</td> </td>
</tr> </tr>
</tbody> </tbody>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-tasks" title-text="Logging driver"> </rd-widget-header> <rd-widget-header icon="fa-tasks" title-text="Logging driver"> </rd-widget-header>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="form-inline" style="padding: 10px;" authorization="DockerServiceUpdate"> <div class="form-inline" style="padding: 10px" authorization="DockerServiceUpdate">
Driver: Driver:
<select class="form-control" ng-model="service.LogDriverName" ng-change="updateLogDriverName(service)" ng-disabled="isUpdating"> <select class="form-control" ng-model="service.LogDriverName" ng-change="updateLogDriverName(service)" ng-disabled="isUpdating">
<option selected value="">Default logging driver</option> <option selected value="">Default logging driver</option>

@ -30,7 +30,7 @@
ng-change="updateNetwork(service)" ng-change="updateNetwork(service)"
ng-options="net.Id as net.Name for net in filterNetworks(swarmNetworks, network)" ng-options="net.Id as net.Name for net in filterNetworks(swarmNetworks, network)"
disable-authorization="DockerServiceUpdate" disable-authorization="DockerServiceUpdate"
style="width: initial; min-width: 50%;" style="width: initial; min-width: 50%"
> >
<option disabled value="" selected>Select a network</option> <option disabled value="" selected>Select a network</option>
</select> </select>

@ -5,9 +5,7 @@
<table class="table"> <table class="table">
<tbody> <tbody>
<tr> <tr>
<td style="vertical-align: middle;"> <td style="vertical-align: middle"> Memory reservation (MB) </td>
Memory reservation (MB)
</td>
<td> <td>
<input <input
class="input-sm" class="input-sm"
@ -19,16 +17,12 @@
disable-authorization="DockerServiceUpdate" disable-authorization="DockerServiceUpdate"
/> />
</td> </td>
<td style="vertical-align: middle;"> <td style="vertical-align: middle">
<p class="small text-muted"> <p class="small text-muted"> Minimum memory available on a node to run a task (set to 0 for unlimited) </p>
Minimum memory available on a node to run a task (set to 0 for unlimited)
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle;"> <td style="vertical-align: middle"> Memory limit (MB) </td>
Memory limit (MB)
</td>
<td> <td>
<input <input
class="input-sm" class="input-sm"
@ -40,17 +34,13 @@
disable-authorization="DockerServiceUpdate" disable-authorization="DockerServiceUpdate"
/> />
</td> </td>
<td style="vertical-align: middle;"> <td style="vertical-align: middle">
<p class="small text-muted"> <p class="small text-muted"> Maximum memory usage per task (set to 0 for unlimited) </p>
Maximum memory usage per task (set to 0 for unlimited)
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle;"> <td style="vertical-align: middle">
<div> <div> CPU reservation </div>
CPU reservation
</div>
</td> </td>
<td> <td>
<slider <slider
@ -64,17 +54,13 @@
disable-authorization="DockerServiceUpdate" disable-authorization="DockerServiceUpdate"
></slider> ></slider>
</td> </td>
<td style="vertical-align: middle;"> <td style="vertical-align: middle">
<p class="small text-muted"> <p class="small text-muted"> Minimum CPU available on a node to run a task </p>
Minimum CPU available on a node to run a task
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: middle;"> <td style="vertical-align: middle">
<div> <div> CPU limit </div>
CPU limit
</div>
</td> </td>
<td> <td>
<slider <slider
@ -88,10 +74,8 @@
disable-authorization="DockerServiceUpdate" disable-authorization="DockerServiceUpdate"
></slider> ></slider>
</td> </td>
<td style="vertical-align: middle;"> <td style="vertical-align: middle">
<p class="small text-muted"> <p class="small text-muted"> Maximum CPU usage per task </p>
Maximum CPU usage per task
</p>
</td> </td>
</tr> </tr>
</tbody> </tbody>

@ -21,9 +21,7 @@
</div> </div>
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Condition for restart. </p>
Condition for restart.
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -39,7 +37,7 @@
/> />
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px">
Delay between restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 5s, 5 seconds. Delay between restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 5s, 5 seconds.
</p> </p>
</td> </td>
@ -56,9 +54,7 @@
/> />
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited). </p>
Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited).
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -74,7 +70,7 @@
/> />
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px">
Time window to evaluate restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0 seconds, which is unbounded. Time window to evaluate restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0 seconds, which is unbounded.
</p> </p>
</td> </td>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-header icon="fa-tasks" title-text="Secrets"> </rd-widget-header> <rd-widget-header icon="fa-tasks" title-text="Secrets"> </rd-widget-header>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="form-inline" style="padding: 10px;" authorization="DockerServiceUpdate"> <div class="form-inline" style="padding: 10px" authorization="DockerServiceUpdate">
Add a secret: Add a secret:
<select class="form-control" ng-options="secret.Name for secret in secrets | orderBy: 'Name'" ng-model="state.addSecret.secret"> <select class="form-control" ng-options="secret.Name for secret in secrets | orderBy: 'Name'" ng-model="state.addSecret.secret">
<option selected disabled hidden value="">Select a secret</option> <option selected disabled hidden value="">Select a secret</option>
@ -17,7 +17,7 @@
</div> </div>
<a class="btn btn-default btn-sm" ng-click="addSecret(service, state.addSecret)"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add secret </a> <a class="btn btn-default btn-sm" ng-click="addSecret(service, state.addSecret)"> <i class="fa fa-plus-circle" aria-hidden="true"></i> add secret </a>
</div> </div>
<table class="table" style="margin-top: 5px;"> <table class="table" style="margin-top: 5px">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>

@ -14,12 +14,8 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th> <th> Label </th>
Label <th> Value </th>
</th>
<th>
Value
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

@ -16,9 +16,7 @@
/> />
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Maximum number of tasks to be updated simultaneously (0 to update all at once). </p>
Maximum number of tasks to be updated simultaneously (0 to update all at once).
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -34,9 +32,7 @@
/> />
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Example: 1m. </p>
Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Example: 1m.
</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -68,9 +64,7 @@
</div> </div>
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Action taken on failure to start after update. </p>
Action taken on failure to start after update.
</p>
</td> </td>
</tr> </tr>
<tr ng-if="applicationState.endpoint.apiVersion >= 1.29"> <tr ng-if="applicationState.endpoint.apiVersion >= 1.29">
@ -102,9 +96,7 @@
</div> </div>
</td> </td>
<td> <td>
<p class="small text-muted" style="margin-top: 10px;"> <p class="small text-muted" style="margin-top: 10px"> Operation order on failure. </p>
Operation order on failure.
</p>
</td> </td>
</tr> </tr>
</tbody> </tbody>

@ -81,7 +81,7 @@
position="top" position="top"
message="Webhook (or callback URI) used to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service." message="Webhook (or callback URI) used to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service."
></portainer-tooltip> ></portainer-tooltip>
<label class="switch" style="margin-left: 20px;"> <label class="switch" style="margin-left: 20px">
<input disable-authorization="DockerServiceUpdate" type="checkbox" ng-model="WebhookExists" ng-click="updateWebhook(service)" /><i></i> <input disable-authorization="DockerServiceUpdate" type="checkbox" ng-model="WebhookExists" ng-click="updateWebhook(service)" /><i></i>
</label> </label>
</td> </td>
@ -91,7 +91,7 @@
<span><i class="fa fa-copy space-right" aria-hidden="true"></i>Copy link</span> <span><i class="fa fa-copy space-right" aria-hidden="true"></i>Copy link</span>
</button> </button>
<span> <span>
<i id="copyNotification" class="fa fa-check green-icon" aria-hidden="true" style="margin-left: 7px; display: none;"></i> <i id="copyNotification" class="fa fa-check green-icon" aria-hidden="true" style="margin-left: 7px; display: none"></i>
</span> </span>
</td> </td>
</tr> </tr>

@ -34,34 +34,26 @@
</tbody> </tbody>
</table> </table>
<form class="form-horizontal"> <form class="form-horizontal">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Options </div>
Options
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left"> <label class="control-label text-left"> Only display running tasks </label>
Only display running tasks <label class="switch" style="margin-left: 20px">
</label>
<label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="state.DisplayOnlyRunningTasks" ng-change="changeDisplayOnlyRunningTasks()" /><i></i> <input type="checkbox" ng-model="state.DisplayOnlyRunningTasks" ng-change="changeDisplayOnlyRunningTasks()" /><i></i>
</label> </label>
</div> </div>
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left"> <label class="control-label text-left"> Display node labels </label>
Display node labels <label class="switch" style="margin-left: 20px"> <input type="checkbox" ng-model="state.DisplayNodeLabels" ng-change="changeDisplayNodeLabels()" /><i></i> </label>
</label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="state.DisplayNodeLabels" ng-change="changeDisplayNodeLabels()" /><i></i> </label>
</div> </div>
</div> </div>
</form> </form>
<form class="form-horizontal"> <form class="form-horizontal">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Refresh </div>
Refresh
</div>
<div class="form-group"> <div class="form-group">
<label for="refreshRate" class="col-sm-1 margin-sm-top control-label text-left"> <label for="refreshRate" class="col-sm-1 margin-sm-top control-label text-left">
Rate Rate
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="display: none"></i>
</label> </label>
<div class="col-sm-2"> <div class="col-sm-2">
<select id="refreshRate" ng-model="state.refreshRate" ng-change="changeUpdateRepeater()" class="form-control"> <select id="refreshRate" ng-model="state.refreshRate" ng-change="changeUpdateRepeater()" class="form-control">

@ -16,9 +16,7 @@
</div> </div>
</div> </div>
<!-- !name-input --> <!-- !name-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Driver configuration </div>
Driver configuration
</div>
<!-- driver-input --> <!-- driver-input -->
<div class="form-group"> <div class="form-group">
<label for="volume_driver" class="col-sm-2 col-md-1 control-label text-left">Driver</label> <label for="volume_driver" class="col-sm-2 col-md-1 control-label text-left">Driver</label>
@ -32,7 +30,7 @@
<!-- !driver-input --> <!-- !driver-input -->
<!-- driver-options --> <!-- driver-options -->
<div class="form-group" ng-hide="formValues.CIFSData.useCIFS || formValues.NFSData.useNFS"> <div class="form-group" ng-hide="formValues.CIFSData.useCIFS || formValues.NFSData.useNFS">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px">
<label class="control-label text-left"> <label class="control-label text-left">
Driver options Driver options
<portainer-tooltip <portainer-tooltip
@ -40,13 +38,13 @@
message="Driver options are specific to the selected driver. Please refer to the selected driver documentation." message="Driver options are specific to the selected driver. Please refer to the selected driver documentation."
></portainer-tooltip> ></portainer-tooltip>
</label> </label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="addDriverOption()"> <span class="label label-default interactive" style="margin-left: 10px" ng-click="addDriverOption()">
<i class="fa fa-plus-circle" aria-hidden="true"></i> add driver option <i class="fa fa-plus-circle" aria-hidden="true"></i> add driver option
</span> </span>
</div> </div>
<!-- driver-options-input-list --> <!-- driver-options-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px;"> <div class="col-sm-12 form-inline" style="margin-top: 10px">
<div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px;"> <div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span> <span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="option.name" placeholder="e.g. mountpoint" /> <input type="text" class="form-control" ng-model="option.name" placeholder="e.g. mountpoint" />
@ -65,42 +63,34 @@
<!-- !driver-options --> <!-- !driver-options -->
<!-- nfs-management --> <!-- nfs-management -->
<div class="form-group col-md-12"> <div class="form-group col-md-12">
<label for="useNFS" class="control-label text-left"> <label for="useNFS" class="control-label text-left"> Use NFS volume </label>
Use NFS volume <label class="switch" style="margin-left: 20px">
</label>
<label class="switch" style="margin-left: 20px;">
<input type="checkbox" name="useNFS" ng-model="formValues.NFSData.useNFS" ng-click="formValues.CIFSData.useCIFS = false" /> <input type="checkbox" name="useNFS" ng-model="formValues.NFSData.useNFS" ng-click="formValues.CIFSData.useCIFS = false" />
<i></i> <i></i>
</label> </label>
<div ng-if="formValues.NFSData.useNFS" class="small text-muted" style="margin-top: 10px;"> Ensure <code>nfs-utils</code> are installed on your hosts. </div> <div ng-if="formValues.NFSData.useNFS" class="small text-muted" style="margin-top: 10px"> Ensure <code>nfs-utils</code> are installed on your hosts. </div>
</div> </div>
<volumes-nfs-form data="formValues.NFSData" ng-show="formValues.Driver === 'local'"></volumes-nfs-form> <volumes-nfs-form data="formValues.NFSData" ng-show="formValues.Driver === 'local'"></volumes-nfs-form>
<!-- !nfs-management --> <!-- !nfs-management -->
<!-- cifs-management --> <!-- cifs-management -->
<div class="form-group col-md-12"> <div class="form-group col-md-12">
<label for="useCIFS" class="control-label text-left"> <label for="useCIFS" class="control-label text-left"> Use CIFS volume </label>
Use CIFS volume <label class="switch" style="margin-left: 20px">
</label>
<label class="switch" style="margin-left: 20px;">
<input type="checkbox" name="useCIFS" ng-model="formValues.CIFSData.useCIFS" ng-click="formValues.NFSData.useNFS = false" /> <input type="checkbox" name="useCIFS" ng-model="formValues.CIFSData.useCIFS" ng-click="formValues.NFSData.useNFS = false" />
<i></i> <i></i>
</label> </label>
<div ng-if="formValues.CIFSData.useCIFS" class="small text-muted" style="margin-top: 10px;"> Ensure <code>cifs-utils</code> are installed on your hosts. </div> <div ng-if="formValues.CIFSData.useCIFS" class="small text-muted" style="margin-top: 10px"> Ensure <code>cifs-utils</code> are installed on your hosts. </div>
</div> </div>
<volumes-cifs-form data="formValues.CIFSData" ng-show="formValues.Driver === 'local'"></volumes-cifs-form> <volumes-cifs-form data="formValues.CIFSData" ng-show="formValues.Driver === 'local'"></volumes-cifs-form>
<!-- !cifs-management --> <!-- !cifs-management -->
<!-- storidge --> <!-- storidge -->
<div ng-if="formValues.Driver === 'cio:latest'"> <div ng-if="formValues.Driver === 'cio:latest'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Storidge </div>
Storidge
</div>
<storidge-profile-selector storidge-profile="formValues.StoridgeProfile"></storidge-profile-selector> <storidge-profile-selector storidge-profile="formValues.StoridgeProfile"></storidge-profile-selector>
</div> </div>
<!-- storidge --> <!-- storidge -->
<div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && formValues.Driver === 'local'"> <div ng-if="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && formValues.Driver === 'local'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment </div>
Deployment
</div>
<!-- node-selection --> <!-- node-selection -->
<node-selector model="formValues.NodeName"> </node-selector> <node-selector model="formValues.NodeName"> </node-selector>
<!-- !node-selection --> <!-- !node-selection -->
@ -109,9 +99,7 @@
<por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form> <por-access-control-form form-data="formValues.AccessControlData"></por-access-control-form>
<!-- !access-control --> <!-- !access-control -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -124,7 +112,7 @@
<span ng-hide="state.actionInProgress">Create the volume</span> <span ng-hide="state.actionInProgress">Create the volume</span>
<span ng-show="state.actionInProgress">Creating volume...</span> <span ng-show="state.actionInProgress">Creating volume...</span>
</button> </button>
<span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px;">{{ state.formValidationError }}</span> <span class="text-danger" ng-if="state.formValidationError" style="margin-left: 5px">{{ state.formValidationError }}</span>
</div> </div>
</div> </div>
<!-- !actions --> <!-- !actions -->

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -62,9 +62,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -1,7 +1,5 @@
<form class="form-horizontal" name="edgeJobForm"> <form class="form-horizontal" name="edgeJobForm">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Edge job configuration </div>
Edge job configuration
</div>
<!-- name-input --> <!-- name-input -->
<div class="form-group"> <div class="form-group">
<label for="edgejob_name" class="col-sm-1 control-label text-left">Name</label> <label for="edgejob_name" class="col-sm-1 control-label text-left">Name</label>
@ -30,17 +28,15 @@
<!-- !name-input --> <!-- !name-input -->
<!-- cron-input --> <!-- cron-input -->
<!-- edge-job-method-select --> <!-- edge-job-method-select -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Edge job configuration </div>
Edge job configuration
</div>
<div class="form-group"></div> <div class="form-group"></div>
<div class="form-group" style="margin-bottom: 0;"> <div class="form-group" style="margin-bottom: 0">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div> <div>
<input type="radio" id="config_basic" ng-model="$ctrl.formValues.cronMethod" value="basic" /> <input type="radio" id="config_basic" ng-model="$ctrl.formValues.cronMethod" value="basic" />
<label for="config_basic"> <label for="config_basic">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-calendar-alt" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-calendar-alt" aria-hidden="true" style="margin-right: 2px"></i>
Basic configuration Basic configuration
</div> </div>
<p>Select date from calendar</p> <p>Select date from calendar</p>
@ -50,7 +46,7 @@
<input type="radio" id="config_advanced" ng-model="$ctrl.formValues.cronMethod" value="advanced" /> <input type="radio" id="config_advanced" ng-model="$ctrl.formValues.cronMethod" value="advanced" />
<label for="config_advanced"> <label for="config_advanced">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px"></i>
Advanced configuration Advanced configuration
</div> </div>
<p>Write your own cron rule</p> <p>Write your own cron rule</p>
@ -64,7 +60,7 @@
<div class="form-group"> <div class="form-group">
<label for="recurring" class="col-sm-2 control-label text-left">Recurring Edge job</label> <label for="recurring" class="col-sm-2 control-label text-left">Recurring Edge job</label>
<div class="col-sm-10"> <div class="col-sm-10">
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" name="recurring" ng-model="$ctrl.model.Recurring" /><i></i> </label> <label class="switch" style="margin-left: 20px"> <input type="checkbox" name="recurring" ng-model="$ctrl.model.Recurring" /><i></i> </label>
</div> </div>
</div> </div>
<!-- not-recurring --> <!-- not-recurring -->
@ -74,9 +70,7 @@
<div class="col-sm-10"> <div class="col-sm-10">
<input class="form-control" moment-picker ng-model="$ctrl.formValues.datetime" format="YYYY-MM-DD HH:mm" /> <input class="form-control" moment-picker ng-model="$ctrl.formValues.datetime" format="YYYY-MM-DD HH:mm" />
</div> </div>
<div class="col-sm-12 small text-muted" style="margin-top: 10px;"> <div class="col-sm-12 small text-muted" style="margin-top: 10px"> Time should be set according to the chosen environments' timezone. </div>
Time should be set according to the chosen environments' timezone.
</div>
<div ng-show="edgeJobForm.datepicker.$invalid"> <div ng-show="edgeJobForm.datepicker.$invalid">
<div class="col-sm-12 small text-warning"> <div class="col-sm-12 small text-warning">
<div ng-messages="edgeJobForm.datepicker.$error"> <div ng-messages="edgeJobForm.datepicker.$error">
@ -129,9 +123,7 @@
ng-pattern="$ctrl.cronRegex" ng-pattern="$ctrl.cronRegex"
/> />
</div> </div>
<div class="col-sm-12 small text-muted" style="margin-top: 10px;"> <div class="col-sm-12 small text-muted" style="margin-top: 10px"> Time should be set according to the chosen environments' timezone. </div>
Time should be set according to the chosen environments' timezone.
</div>
</div> </div>
<div class="form-group" ng-show="edgeJobForm.edgejob_cron.$invalid && edgeJobForm.edgejob_cron.$dirty"> <div class="form-group" ng-show="edgeJobForm.edgejob_cron.$invalid && edgeJobForm.edgejob_cron.$dirty">
<div class="col-sm-12 small text-warning"> <div class="col-sm-12 small text-warning">
@ -146,17 +138,15 @@
<!-- execution-method --> <!-- execution-method -->
<div ng-if="!$ctrl.model.Id"> <div ng-if="!$ctrl.model.Id">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Job content </div>
Job content
</div>
<div class="form-group"></div> <div class="form-group"></div>
<div class="form-group" style="margin-bottom: 0;"> <div class="form-group" style="margin-bottom: 0">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div> <div>
<input type="radio" id="method_editor" ng-model="$ctrl.formValues.method" value="editor" /> <input type="radio" id="method_editor" ng-model="$ctrl.formValues.method" value="editor" />
<label for="method_editor"> <label for="method_editor">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px"></i>
Web editor Web editor
</div> </div>
<p>Use our Web editor</p> <p>Use our Web editor</p>
@ -166,7 +156,7 @@
<input type="radio" id="method_upload" ng-model="$ctrl.formValues.method" value="upload" /> <input type="radio" id="method_upload" ng-model="$ctrl.formValues.method" value="upload" />
<label for="method_upload"> <label for="method_upload">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-upload" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-upload" aria-hidden="true" style="margin-right: 2px"></i>
Upload Upload
</div> </div>
<p>Upload from your computer</p> <p>Upload from your computer</p>
@ -178,9 +168,7 @@
<!-- !execution-method --> <!-- !execution-method -->
<!-- web-editor --> <!-- web-editor -->
<div ng-show="$ctrl.formValues.method === 'editor'"> <div ng-show="$ctrl.formValues.method === 'editor'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Web editor </div>
Web editor
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<code-editor <code-editor
@ -195,18 +183,14 @@
<!-- !web-editor --> <!-- !web-editor -->
<!-- upload --> <!-- upload -->
<div ng-show="$ctrl.formValues.method === 'upload'"> <div ng-show="$ctrl.formValues.method === 'upload'">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Upload </div>
Upload
</div>
<div class="form-group"> <div class="form-group">
<span class="col-sm-12 text-muted small"> <span class="col-sm-12 text-muted small"> You can upload a script file from your computer. </span>
You can upload a script file from your computer.
</span>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button type="button" class="btn btn-sm btn-primary" ngf-select ng-model="$ctrl.model.File">Select file</button> <button type="button" class="btn btn-sm btn-primary" ngf-select ng-model="$ctrl.model.File">Select file</button>
<span style="margin-left: 5px;"> <span style="margin-left: 5px">
{{ $ctrl.model.File.name }} {{ $ctrl.model.File.name }}
<i class="fa fa-times red-icon" ng-if="!$ctrl.model.File" aria-hidden="true"></i> <i class="fa fa-times red-icon" ng-if="!$ctrl.model.File" aria-hidden="true"></i>
</span> </span>
@ -214,9 +198,7 @@
</div> </div>
</div> </div>
<!-- !upload --> <!-- !upload -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Target environments </div>
Target environments
</div>
<!-- node-selection --> <!-- node-selection -->
<associated-endpoints-selector <associated-endpoints-selector
endpoint-ids="$ctrl.model.Endpoints" endpoint-ids="$ctrl.model.Endpoints"
@ -228,9 +210,7 @@
></associated-endpoints-selector> ></associated-endpoints-selector>
<!-- !node-selection --> <!-- !node-selection -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -247,7 +227,7 @@
<span ng-hide="$ctrl.actionInProgress">{{ $ctrl.formActionLabel }}</span> <span ng-hide="$ctrl.actionInProgress">{{ $ctrl.formActionLabel }}</span>
<span ng-show="$ctrl.actionInProgress">In progress...</span> <span ng-show="$ctrl.actionInProgress">In progress...</span>
</button> </button>
<span class="text-danger" ng-if="$ctrl.state.formValidationError" style="margin-left: 5px;"> <span class="text-danger" ng-if="$ctrl.state.formValidationError" style="margin-left: 5px">
{{ $ctrl.state.formValidationError }} {{ $ctrl.state.formValidationError }}
</span> </span>
</div> </div>

@ -31,7 +31,8 @@ export class EdgeJobFormController {
}; };
// see https://regexr.com/573i2 // see https://regexr.com/573i2
this.cronRegex = /(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ){4,6}((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*))/; this.cronRegex =
/(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ){4,6}((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*))/;
this.action = this.action.bind(this); this.action = this.action.bind(this);
this.editorUpdate = this.editorUpdate.bind(this); this.editorUpdate = this.editorUpdate.bind(this);

@ -3,7 +3,7 @@
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <div class="toolBarTitle">
<i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i>
{{ $ctrl.titleText }} {{ $ctrl.titleText }}
</div> </div>
</div> </div>
@ -22,9 +22,7 @@
Environment Environment
</a> </a>
</th> </th>
<th> <th> Actions </th>
Actions
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -35,18 +33,10 @@
{{ item.Endpoint.Name }} {{ item.Endpoint.Name }}
</td> </td>
<td> <td>
<button ng-if="item.LogsStatus === 0 || item.LogsStatus === 1" class="btn btn-sm btn-primary" ng-click="$ctrl.collectLogs(item.EndpointId)"> <button ng-if="item.LogsStatus === 0 || item.LogsStatus === 1" class="btn btn-sm btn-primary" ng-click="$ctrl.collectLogs(item.EndpointId)"> Retrieve logs </button>
Retrieve logs <button ng-if="item.LogsStatus === 3" class="btn btn-sm btn-primary" ng-click="$ctrl.onDownloadLogsClick(item.EndpointId)"> Download logs </button>
</button> <button ng-if="item.LogsStatus === 3" class="btn btn-sm btn-primary" ng-click="$ctrl.onClearLogsClick(item.EndpointId)"> Clear logs </button>
<button ng-if="item.LogsStatus === 3" class="btn btn-sm btn-primary" ng-click="$ctrl.onDownloadLogsClick(item.EndpointId)"> <span ng-if="item.LogsStatus === 2"> Logs marked for collection, please wait until the logs are available. </span>
Download logs
</button>
<button ng-if="item.LogsStatus === 3" class="btn btn-sm btn-primary" ng-click="$ctrl.onClearLogsClick(item.EndpointId)">
Clear logs
</button>
<span ng-if="item.LogsStatus === 2">
Logs marked for collection, please wait until the logs are available.
</span>
</td> </td>
</tr> </tr>
<tr ng-if="!$ctrl.dataset"> <tr ng-if="!$ctrl.dataset">
@ -62,9 +52,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="actionBar"> <div class="actionBar">
<button type="button" class="btn btn-sm btn-danger" ng-disabled="$ctrl.state.selectedItemCount === 0" ng-click="$ctrl.removeAction($ctrl.state.selectedItems)"> <button type="button" class="btn btn-sm btn-danger" ng-disabled="$ctrl.state.selectedItemCount === 0" ng-click="$ctrl.removeAction($ctrl.state.selectedItems)">
@ -76,9 +76,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -1,4 +1,2 @@
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Deployment type </div>
Deployment type
</div>
<box-selector radio-name="'deploymentType'" value="$ctrl.value" options="$ctrl.deploymentOptions" on-change="($ctrl.onChange)"></box-selector> <box-selector radio-name="'deploymentType'" value="$ctrl.value" options="$ctrl.deploymentOptions" on-change="($ctrl.onChange)"></box-selector>

@ -2,7 +2,7 @@
<rd-widget> <rd-widget>
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div>
</div> </div>
<div class="searchBar"> <div class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <i class="fa fa-search searchIcon" aria-hidden="true"></i>
@ -67,9 +67,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -3,7 +3,7 @@
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<div class="toolBar"> <div class="toolBar">
<div class="toolBarTitle"> <div class="toolBarTitle">
<i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i>
Edge Stacks Edge Stacks
</div> </div>
<div class="settings" data-cy="edgeStack-stackTableSettings"> <div class="settings" data-cy="edgeStack-stackTableSettings">
@ -11,9 +11,7 @@
<span uib-dropdown-toggle> <i class="fa fa-cog" aria-hidden="true"></i> Settings </span> <span uib-dropdown-toggle> <i class="fa fa-cog" aria-hidden="true"></i> Settings </span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> <div class="menuHeader"> Table settings </div>
Table settings
</div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox"> <div class="md-checkbox">
@ -27,9 +25,7 @@
<label for="setting_auto_refresh">Auto refresh</label> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> <label for="settings_refresh_rate"> Refresh rate </label>
Refresh rate
</label>
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select"> <select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
<option value="10">10s</option> <option value="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
@ -38,15 +34,13 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none;"></i> <i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i>
</span> </span>
</div> </div>
</div> </div>
</div> </div>
<div> <div>
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.settings.open = false;"> <a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.settings.open = false;"> Close </a>
Close
</a>
</div> </div>
</div> </div>
</div> </div>
@ -94,9 +88,7 @@
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"></i> <i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"></i>
</a> </a>
</th> </th>
<th> <th> Status </th>
Status
</th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('CreationDate')"> <a ng-click="$ctrl.changeOrderBy('CreationDate')">
Creation Date Creation Date
@ -127,9 +119,7 @@
<td colspan="4" class="text-center text-muted">Loading...</td> <td colspan="4" class="text-center text-muted">Loading...</td>
</tr> </tr>
<tr ng-if="$ctrl.state.filteredDataSet.length === 0" data-cy="edgeStack-noStackRow"> <tr ng-if="$ctrl.state.filteredDataSet.length === 0" data-cy="edgeStack-noStackRow">
<td colspan="4" class="text-center text-muted"> <td colspan="4" class="text-center text-muted"> No stack available. </td>
No stack available.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -139,9 +129,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -1,7 +1,5 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Edge Groups </div>
Edge Groups
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<edge-groups-selector model="$ctrl.model.EdgeGroups" items="$ctrl.edgeGroups" on-change="($ctrl.onChangeGroups)"></edge-groups-selector> <edge-groups-selector model="$ctrl.model.EdgeGroups" items="$ctrl.edgeGroups" on-change="($ctrl.onChangeGroups)"></edge-groups-selector>
@ -44,9 +42,7 @@
<editor-description> <editor-description>
<div> <div>
You can get more information about Compose file format in the You can get more information about Compose file format in the
<a href="https://docs.docker.com/compose/compose-file/" target="_blank"> <a href="https://docs.docker.com/compose/compose-file/" target="_blank"> official documentation </a>
official documentation
</a>
. .
</div> </div>
</editor-description> </editor-description>
@ -69,9 +65,7 @@
</web-editor-form> </web-editor-form>
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button

@ -1,8 +1,6 @@
<form class="form-horizontal" name="EdgeGroupForm" ng-submit="$ctrl.formAction()"> <form class="form-horizontal" name="EdgeGroupForm" ng-submit="$ctrl.formAction()">
<div class="form-group"> <div class="form-group">
<label for="group_name" class="col-sm-3 col-lg-2 control-label text-left"> <label for="group_name" class="col-sm-3 col-lg-2 control-label text-left"> Name </label>
Name
</label>
<div class="col-sm-9 col-lg-10"> <div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="group_name" name="group_name" ng-model="$ctrl.model.Name" required auto-focus data-cy="edgeGroupCreate-groupNameInput" /> <input type="text" class="form-control" id="group_name" name="group_name" ng-model="$ctrl.model.Name" required auto-focus data-cy="edgeGroupCreate-groupNameInput" />
</div> </div>
@ -18,16 +16,14 @@
</div> </div>
</div> </div>
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Group type </div>
Group type
</div>
<div class="form-group col-sm-12"> <div class="form-group col-sm-12">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div class="boxselector"> <div class="boxselector">
<input type="radio" id="static-group" ng-model="$ctrl.model.Dynamic" ng-value="false" ng-checked="!$ctrl.model.Dynamic" /> <input type="radio" id="static-group" ng-model="$ctrl.model.Dynamic" ng-value="false" ng-checked="!$ctrl.model.Dynamic" />
<label for="static-group"> <label for="static-group">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-list-ol" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-list-ol" aria-hidden="true" style="margin-right: 2px"></i>
Static Static
</div> </div>
<p>Manually select Edge environments</p> <p>Manually select Edge environments</p>
@ -37,7 +33,7 @@
<input type="radio" id="dynamic-group" ng-model="$ctrl.model.Dynamic" ng-value="true" ng-checked="$ctrl.model.Dynamic" /> <input type="radio" id="dynamic-group" ng-model="$ctrl.model.Dynamic" ng-value="true" ng-checked="$ctrl.model.Dynamic" />
<label for="dynamic-group"> <label for="dynamic-group">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-tags" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-tags" aria-hidden="true" style="margin-right: 2px"></i>
Dynamic Dynamic
</div> </div>
<p>Automatically associate environments via tags</p> <p>Automatically associate environments via tags</p>
@ -50,9 +46,7 @@
<div ng-if="!$ctrl.model.Dynamic"> <div ng-if="!$ctrl.model.Dynamic">
<div ng-if="!$ctrl.noEndpoints"> <div ng-if="!$ctrl.noEndpoints">
<!-- environments --> <!-- environments -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Associated environments </div>
Associated environments
</div>
<div class="form-group"> <div class="form-group">
<associated-endpoints-selector <associated-endpoints-selector
endpoint-ids="$ctrl.model.Endpoints" endpoint-ids="$ctrl.model.Endpoints"
@ -74,16 +68,14 @@
<!-- DynamicGroup --> <!-- DynamicGroup -->
<div ng-if="$ctrl.model.Dynamic"> <div ng-if="$ctrl.model.Dynamic">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Tags </div>
Tags
</div>
<div ng-if="$ctrl.tags.length" class="form-group col-sm-12"> <div ng-if="$ctrl.tags.length" class="form-group col-sm-12">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div class="boxselector"> <div class="boxselector">
<input type="radio" id="or-selector" ng-model="$ctrl.model.PartialMatch" ng-value="true" ng-checked="$ctrl.model.PartialMatch" /> <input type="radio" id="or-selector" ng-model="$ctrl.model.PartialMatch" ng-value="true" ng-checked="$ctrl.model.PartialMatch" />
<label for="or-selector"> <label for="or-selector">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-tag" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-tag" aria-hidden="true" style="margin-right: 2px"></i>
Partial match Partial match
</div> </div>
<p>Associate any environment matching at least one of the selected tags</p> <p>Associate any environment matching at least one of the selected tags</p>
@ -93,7 +85,7 @@
<input type="radio" id="and-selector" ng-model="$ctrl.model.PartialMatch" ng-value="false" ng-checked="!$ctrl.model.PartialMatch" /> <input type="radio" id="and-selector" ng-model="$ctrl.model.PartialMatch" ng-value="false" ng-checked="!$ctrl.model.PartialMatch" />
<label for="and-selector"> <label for="and-selector">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-tag" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-tag" aria-hidden="true" style="margin-right: 2px"></i>
Full match Full match
</div> </div>
<p>Associate any environment matching all of the selected tags</p> <p>Associate any environment matching all of the selected tags</p>
@ -107,9 +99,7 @@
No tags available. Head over to the <a ui-sref="portainer.tags">Tags view</a> to add tags No tags available. Head over to the <a ui-sref="portainer.tags">Tags view</a> to add tags
</div> </div>
</div> </div>
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Associated environments by tags </div>
Associated environments by tags
</div>
<div class="col-sm-12 form-group"> <div class="col-sm-12 form-group">
<group-association-table <group-association-table
loaded="$ctrl.loaded" loaded="$ctrl.loaded"
@ -130,9 +120,7 @@
<!-- !DynamicGroup --> <!-- !DynamicGroup -->
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button

@ -79,9 +79,7 @@
<td colspan="4" class="text-center text-muted">Loading...</td> <td colspan="4" class="text-center text-muted">Loading...</td>
</tr> </tr>
<tr ng-if="$ctrl.state.filteredDataSet.length === 0"> <tr ng-if="$ctrl.state.filteredDataSet.length === 0">
<td colspan="4" class="text-center text-muted"> <td colspan="4" class="text-center text-muted"> No Edge group available. </td>
No Edge group available.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -91,9 +89,7 @@
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px;"> <span style="margin-right: 5px"> Items per page </span>
Items per page
</span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>

@ -32,7 +32,7 @@
<uib-tab-heading> <i class="fa fa-tasks" aria-hidden="true"></i> Results </uib-tab-heading> <uib-tab-heading> <i class="fa fa-tasks" aria-hidden="true"></i> Results </uib-tab-heading>
<edge-job-results-datatable <edge-job-results-datatable
style="display: block; margin-top: 10px;" style="display: block; margin-top: 10px"
ng-if="$ctrl.results" ng-if="$ctrl.results"
title-text="Results" title-text="Results"
title-icon="fa-tasks" title-icon="fa-tasks"

@ -10,9 +10,7 @@
<form class="form-horizontal" name="$ctrl.form"> <form class="form-horizontal" name="$ctrl.form">
<!-- name-input --> <!-- name-input -->
<div class="form-group"> <div class="form-group">
<label for="stack_name" class="col-sm-1 control-label text-left"> <label for="stack_name" class="col-sm-1 control-label text-left"> Name </label>
Name
</label>
<div class="col-sm-11"> <div class="col-sm-11">
<input <input
type="text" type="text"
@ -29,9 +27,7 @@
</div> </div>
<!-- !name-input --> <!-- !name-input -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Edge Groups </div>
Edge Groups
</div>
<div class="form-group" ng-if="$ctrl.edgeGroups"> <div class="form-group" ng-if="$ctrl.edgeGroups">
<div class="col-sm-12"> <div class="col-sm-12">
<edge-groups-selector ng-if="!$ctrl.noGroups" model="$ctrl.formValues.Groups" on-change="($ctrl.onChangeGroups)" items="$ctrl.edgeGroups"></edge-groups-selector> <edge-groups-selector ng-if="!$ctrl.noGroups" model="$ctrl.formValues.Groups" on-change="($ctrl.onChangeGroups)" items="$ctrl.edgeGroups"></edge-groups-selector>
@ -62,9 +58,7 @@
<edge-stacks-kube-manifest-form ng-if="$ctrl.formValues.DeploymentType == 1" form-values="$ctrl.formValues" state="$ctrl.state"></edge-stacks-kube-manifest-form> <edge-stacks-kube-manifest-form ng-if="$ctrl.formValues.DeploymentType == 1" form-values="$ctrl.formValues" state="$ctrl.state"></edge-stacks-kube-manifest-form>
<!-- actions --> <!-- actions -->
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Actions </div>
Actions
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<button <button
@ -82,7 +76,7 @@
<span ng-hide="$ctrl.state.actionInProgress">Deploy the stack</span> <span ng-hide="$ctrl.state.actionInProgress">Deploy the stack</span>
<span ng-show="$ctrl.state.actionInProgress">Deployment in progress...</span> <span ng-show="$ctrl.state.actionInProgress">Deployment in progress...</span>
</button> </button>
<span class="text-danger" ng-if="$ctrl.state.formValidationError" style="margin-left: 5px;"> <span class="text-danger" ng-if="$ctrl.state.formValidationError" style="margin-left: 5px">
{{ $ctrl.state.formValidationError }} {{ $ctrl.state.formValidationError }}
</span> </span>
</div> </div>

@ -1,6 +1,4 @@
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Build method </div>
Build method
</div>
<box-selector radio-name="'method'" value="$ctrl.state.Method" options="$ctrl.methodOptions" on-change="($ctrl.onChangeMethod)"></box-selector> <box-selector radio-name="'method'" value="$ctrl.state.Method" options="$ctrl.methodOptions" on-change="($ctrl.onChangeMethod)"></box-selector>
<web-editor-form <web-editor-form
@ -14,17 +12,13 @@
> >
<editor-description> <editor-description>
You can get more information about Compose file format in the You can get more information about Compose file format in the
<a href="https://docs.docker.com/compose/compose-file/" target="_blank"> <a href="https://docs.docker.com/compose/compose-file/" target="_blank"> official documentation </a>
official documentation
</a>
. .
</editor-description> </editor-description>
</web-editor-form> </web-editor-form>
<file-upload-form ng-if="$ctrl.state.Method === 'upload'" file="$ctrl.formValues.StackFile" on-change="($ctrl.onChangeFile)" ng-required="true"> <file-upload-form ng-if="$ctrl.state.Method === 'upload'" file="$ctrl.formValues.StackFile" on-change="($ctrl.onChangeFile)" ng-required="true">
<file-upload-description> <file-upload-description> You can upload a Compose file from your computer. </file-upload-description>
You can upload a Compose file from your computer.
</file-upload-description>
</file-upload-form> </file-upload-form>
<git-form ng-if="$ctrl.state.Method === 'repository'" model="$ctrl.formValues" on-change="($ctrl.onChangeFormValues)"></git-form> <git-form ng-if="$ctrl.state.Method === 'repository'" model="$ctrl.formValues" on-change="($ctrl.onChangeFormValues)"></git-form>
@ -32,9 +26,7 @@
<!-- template --> <!-- template -->
<div ng-if="$ctrl.state.Method === 'template'"> <div ng-if="$ctrl.state.Method === 'template'">
<div class="form-group"> <div class="form-group">
<label for="stack_template" class="col-sm-1 control-label text-left"> <label for="stack_template" class="col-sm-1 control-label text-left"> Template </label>
Template
</label>
<div class="col-sm-11"> <div class="col-sm-11">
<select <select
class="form-control" class="form-control"
@ -48,9 +40,7 @@
</div> </div>
<!-- description --> <!-- description -->
<div ng-if="$ctrl.selectedTemplate.note"> <div ng-if="$ctrl.selectedTemplate.note">
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Information </div>
Information
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<div class="template-note" ng-bind-html="$ctrl.selectedTemplate.note"></div> <div class="template-note" ng-bind-html="$ctrl.selectedTemplate.note"></div>

@ -1,5 +1,5 @@
<p> <p>
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i>
This feature allows you to deploy any kind of Kubernetes resource in this environment (Deployment, Secret, ConfigMap...). This feature allows you to deploy any kind of Kubernetes resource in this environment (Deployment, Secret, ConfigMap...).
</p> </p>
<p> <p>

@ -1,6 +1,4 @@
<div class="col-sm-12 form-section-title"> <div class="col-sm-12 form-section-title"> Build method </div>
Build method
</div>
<box-selector radio-name="'method'" value="$ctrl.state.Method" options="$ctrl.methodOptions" on-change="($ctrl.onChangeMethod)"></box-selector> <box-selector radio-name="'method'" value="$ctrl.state.Method" options="$ctrl.methodOptions" on-change="($ctrl.onChangeMethod)"></box-selector>
<web-editor-form <web-editor-form

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save