chore(data-cy): require data-cy attributes [EE-6880] (#11453)

pull/10999/head
Ali 8 months ago committed by GitHub
parent 3cad13388c
commit d38085a560
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,6 +1,6 @@
<div class="form-group">
<label for="target_node" class="col-sm-1 control-label text-left">Node</label>
<div class="col-sm-11">
<select class="form-control" ng-model="$ctrl.model" ng-options="agent.NodeName as agent.NodeName for agent in $ctrl.agents"></select>
<select class="form-control" ng-model="$ctrl.model" ng-options="agent.NodeName as agent.NodeName for agent in $ctrl.agents" data-cy="target-node-c"></select>
</div>
</div>

@ -5,7 +5,8 @@
<span>Name</span>
</td>
<td>
<select class="form-control" ng-model="$ctrl.state.editModel.name" disable-authorization="DockerContainerUpdate">
<select class="form-control" ng-model="$ctrl.state.editModel.name" disable-authorization="DockerContainerUpdate" data-cy="container-restart-policy-select">
>
<option value="no">None</option>
<option value="on-failure">On Failure</option>
<option value="always">Always</option>
@ -19,7 +20,7 @@
<tr ng-if="$ctrl.state.editModel.name === 'on-failure'">
<td class="col-md-3">Maximum Retry Count</td>
<td colspan="2">
<input type="number" class="form-control" ng-model="$ctrl.state.editModel.maximumRetryCount" />
<input type="number" class="form-control" ng-model="$ctrl.state.editModel.maximumRetryCount" data-cy="container-restart-max-retry-input" />
</td>
</tr>
</table>

@ -1,5 +1,6 @@
<div class="input-group input-group-sm">
<select name="nodeAvailability" class="selectpicker form-control" ng-model="$ctrl.availability" ng-change="$ctrl.onChange()">
<select name="nodeAvailability" class="selectpicker form-control" ng-model="$ctrl.availability" ng-change="$ctrl.onChange()" data-cy="node-availability-select">
>
<option value="active">Active</option>
<option value="pause">Pause</option>
<option value="drain">Drain</option>

@ -4,11 +4,18 @@
<div ng-repeat="label in $ctrl.labels" class="mt-1">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.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)"
data-cy="node-label-input_{{ $index }}"
/>
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" ng-change="$ctrl.updateLabel(label)" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" ng-change="$ctrl.updateLabel(label)" data-cy="node-label-value_{{ $index }}" />
</div>
<button class="btn btn-light" type="button" ng-click="$ctrl.removeLabel($index)">
<pr-icon icon="'trash-2'" class-name="'icon-secondary icon-md'"></pr-icon>

@ -4,6 +4,7 @@
<label for="image_registry" class="control-label col-sm-3 col-lg-2 text-left" ng-class="$ctrl.labelClass"> Registry </label>
<div ng-class="$ctrl.inputClass" class="col-sm-8">
<select
data-cy="component-registrySelect"
ng-options="registry as registry.Name for registry in $ctrl.registries track by registry.Id"
ng-model="$ctrl.model.Registry"
id="image_registry"
@ -19,6 +20,7 @@
<span class="input-group-addon" id="registry-name">{{ $ctrl.displayedRegistryURL() }}</span>
<input
type="text"
data-cy="component-imageInput"
class="form-control"
aria-describedby="registry-name"
uib-typeahead="image for image in $ctrl.availableImages | filter:$viewValue | limitTo:5"
@ -27,7 +29,6 @@
placeholder="e.g. my-image:my-tag"
ng-change="$ctrl.onImageChange()"
required
data-cy="component-imageInput"
/>
<span ng-if="$ctrl.isDockerHubRegistry()" class="input-group-btn">
<a
@ -51,7 +52,15 @@
</span>
<label for="image_name" ng-class="$ctrl.labelClass" class="control-label col-sm-3 col-lg-2 required text-left">Image </label>
<div ng-class="$ctrl.inputClass" class="col-sm-8">
<input type="text" class="form-control" ng-model="$ctrl.model.Image" name="image_name" placeholder="e.g. registry:port/my-image:my-tag" required />
<input
type="text"
class="form-control"
ng-model="$ctrl.model.Image"
name="image_name"
placeholder="e.g. registry:port/my-image:my-tag"
required
data-cy="component-imageInput"
/>
</div>
</div>
</div>

@ -19,6 +19,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="macvlan-network-card-input"
class="form-control"
name="network_card"
ng-model="$ctrl.data.ParentNetworkCard"
@ -69,6 +70,7 @@
ng-model="$ctrl.data.SelectedNetworkConfig"
name="config_network"
ng-required="$ctrl.requiredConfigSelection()"
data-cy="macvlanConfigNetworkSelector"
>
<option selected disabled hidden value="">Select a network</option>
</select>

@ -6,7 +6,15 @@
<div class="form-group col-md-12">
<label for="cifs_address" class="col-sm-2 col-md-1 control-label required text-left">Address</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="$ctrl.data.serverAddress" name="cifs_address" placeholder="e.g. my.cifs-server.com OR xxx.xxx.xxx.xxx" required />
<input
type="text"
class="form-control"
ng-model="$ctrl.data.serverAddress"
name="cifs_address"
placeholder="e.g. my.cifs-server.com OR xxx.xxx.xxx.xxx"
required
data-cy="cifs-address-input"
/>
</div>
</div>
<div class="form-group col-md-12" ng-show="cifsInformationForm.cifs_address.$invalid">
@ -21,7 +29,7 @@
<div class="form-group col-md-12">
<label for="cifs_share" class="col-sm-2 col-md-1 control-label required text-left">Share</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="$ctrl.data.share" name="cifs_share" placeholder="e.g. /myshare" required />
<input type="text" class="form-control" ng-model="$ctrl.data.share" name="cifs_share" placeholder="e.g. /myshare" required data-cy="cifs-share-input" />
</div>
</div>
<div class="form-group col-md-12" ng-show="cifsInformationForm.cifs_share.$invalid">
@ -36,7 +44,14 @@
<div class="form-group col-md-12">
<label for="cifs_version" class="col-sm-2 col-md-1 control-label text-left">CIFS Version</label>
<div class="col-sm-10 col-md-11">
<select class="form-control" ng-model="$ctrl.data.version" name="cifs_version" ng-options="version for version in $ctrl.data.versions" required></select>
<select
class="form-control"
ng-model="$ctrl.data.version"
name="cifs_version"
ng-options="version for version in $ctrl.data.versions"
required
data-cy="cifs-version-select"
></select>
</div>
</div>
<div class="form-group col-md-12" ng-show="cifsInformationForm.cifs_version.$invalid">
@ -51,7 +66,7 @@
<div class="form-group col-md-12">
<label for="cifs_username" class="col-sm-2 col-md-1 control-label required text-left">Username</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="$ctrl.data.username" name="cifs_username" required />
<input type="text" class="form-control" ng-model="$ctrl.data.username" name="cifs_username" required data-cy="cifs-username-input" />
</div>
</div>
<div class="form-group col-md-12" ng-show="cifsInformationForm.cifs_username.$invalid">
@ -66,7 +81,7 @@
<div class="form-group col-md-12">
<label for="cifs_password" class="col-sm-2 col-md-1 control-label text-left">Password</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="$ctrl.data.password" name="cifs_password" required />
<input type="text" class="form-control" ng-model="$ctrl.data.password" name="cifs_password" required data-cy="cifs-password-input" />
</div>
</div>
<div class="form-group col-md-12" ng-show="cifsInformationForm.password.$invalid">

@ -6,7 +6,15 @@
<div class="form-group col-md-12">
<label for="nfs_address" class="col-sm-2 col-md-1 control-label required text-left">Address</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="$ctrl.data.serverAddress" name="nfs_address" placeholder="e.g. my.nfs-server.com OR xxx.xxx.xxx.xxx" required />
<input
type="text"
class="form-control"
ng-model="$ctrl.data.serverAddress"
name="nfs_address"
placeholder="e.g. my.nfs-server.com OR xxx.xxx.xxx.xxx"
required
data-cy="nfs-address-input"
/>
</div>
</div>
<div class="form-group col-md-12" ng-show="nfsInformationForm.nfs_address.$invalid">
@ -21,7 +29,14 @@
<div class="form-group col-md-12">
<label for="nfs_version" class="col-sm-2 col-md-1 control-label text-left">NFS Version</label>
<div class="col-sm-10 col-md-11">
<select class="form-control" ng-model="$ctrl.data.version" name="nfs_version" ng-options="version for version in $ctrl.data.versions" required></select>
<select
class="form-control"
ng-model="$ctrl.data.version"
name="nfs_version"
ng-options="version for version in $ctrl.data.versions"
required
data-cy="nfs-version-select"
></select>
</div>
</div>
<div class="form-group col-md-12" ng-show="nfsInformationForm.nfs_version.$invalid">
@ -38,6 +53,7 @@
<div class="col-sm-10 col-md-11">
<input
type="text"
data-cy="nfs-mountpoint-input"
class="form-control"
ng-model="$ctrl.data.mountPoint"
name="nfs_mountpoint"
@ -61,7 +77,7 @@
<portainer-tooltip message="'Comma separated list of options'"></portainer-tooltip>
</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="$ctrl.data.options" name="nfs_options" placeholder="e.g. rw,noatime,tcp ..." required />
<input type="text" class="form-control" ng-model="$ctrl.data.options" name="nfs_options" placeholder="e.g. rw,noatime,tcp ..." required data-cy="nfs-options-input" />
</div>
</div>
<div class="form-group col-md-12" ng-show="nfsInformationForm.nfs_options.$invalid">

@ -9,7 +9,7 @@
<div class="form-group">
<label for="config_name" class="col-sm-1 control-label text-left">Name</label>
<div class="col-sm-11">
<input type="text" class="form-control" ng-model="ctrl.formValues.Name" id="config_name" placeholder="e.g. myConfig" />
<input type="text" class="form-control" ng-model="ctrl.formValues.Name" id="config_name" placeholder="e.g. myConfig" data-cy="config-name-input" />
</div>
</div>
<!-- !name-input -->
@ -37,11 +37,11 @@
<div ng-repeat="label in ctrl.formValues.Labels" class="mt-1">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" />
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" data-cy="config-label-input_{{ $index }}" />
</div>
<div class="input-group col-sm-6 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" data-cy="config-label-value_{{ $index }}" />
<span class="input-group-btn">
<button class="btn btn-dangerlight" type="button" ng-click="ctrl.removeLabel($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>

@ -26,7 +26,7 @@
<pr-icon ng-if="imageOS == 'linux'" icon="'svg-linux'"></pr-icon>
<pr-icon ng-if="imageOS == 'windows'" icon="'layout-grid'"></pr-icon>
</span>
<select class="form-control" ng-model="formValues.command" id="command">
<select class="form-control" ng-model="formValues.command" id="command" data-cy="command-select">
<option value="ash" ng-if="imageOS == 'linux'">/bin/ash</option>
<option value="bash" ng-if="imageOS == 'linux'">/bin/bash</option>
<option value="sh" ng-if="imageOS == 'linux'">/bin/sh</option>
@ -35,7 +35,15 @@
<option ng-repeat="command in containerCommands" value="{{ command.command }}">{{ command.title }}: {{ command.command }}</option>
</select>
</div>
<input class="form-control" ng-if="formValues.isCustomCommand" type="text" name="custom-command" ng-model="formValues.customCommand" placeholder="e.g. ps aux" />
<input
class="form-control"
ng-if="formValues.isCustomCommand"
type="text"
name="custom-command"
ng-model="formValues.customCommand"
placeholder="e.g. ps aux"
data-cy="custom-command"
/>
</div>
</div>
<!-- !command-list -->
@ -53,7 +61,7 @@
<portainer-tooltip message="'Format is one of: user, user:group, uid or uid:gid'"></portainer-tooltip>
</label>
<div class="col-lg-11 col-sm-10">
<input class="form-control" type="text" ng-model="formValues.user" placeholder="root" />
<input class="form-control" type="text" ng-model="formValues.user" placeholder="root" data-cy="container-exec-user" />
</div>
</div>
<div class="form-group">
@ -70,8 +78,8 @@
</div>
<div ng-if="state !== states.disconnected">
<label
>Exec into container as <code class="!text-sm align-baseline">{{ ::formValues.user || 'default user' }}</code> using command
<code class="!text-sm align-baseline">{{ formValues.isCustomCommand ? formValues.customCommand : formValues.command }}</code>
>Exec into container as <code class="align-baseline !text-sm">{{ ::formValues.user || 'default user' }}</code> using command
<code class="align-baseline !text-sm">{{ formValues.isCustomCommand ? formValues.customCommand : formValues.command }}</code>
<terminal-tooltip class="align-sub"> </terminal-tooltip>
</label>
<button type="button" class="btn btn-primary" ng-click="disconnect()">

@ -72,7 +72,7 @@
<rd-widget>
<rd-widget-header icon="box" title-text="Container status"></rd-widget-header>
<rd-widget-body classes="no-padding">
<table class="table">
<table class="table" data-cy="container-status-table">
<tbody>
<tr>
<td class="col-xs-6 col-sm-4 col-md-3 col-lg-3">ID</td>
@ -88,7 +88,7 @@
</td>
<td ng-if="container.edit">
<form ng-submit="renameContainer()">
<input type="text" class="containerNameInput" ng-model="container.newContainerName" />
<input type="text" class="containerNameInput" ng-model="container.newContainerName" data-cy="containerNameInput" />
<a href="" ng-click="container.edit = false;">
<pr-icon icon="'x'"></pr-icon>
</a>
@ -327,7 +327,7 @@
<rd-widget>
<rd-widget-header icon="database" title-text="Volumes"></rd-widget-header>
<rd-widget-body classes="no-padding">
<table class="table">
<table class="table" data-cy="container-volumes-table">
<thead>
<tr>
<th>Host/volume</th>

@ -27,7 +27,7 @@
<div class="form-group">
<label for="refreshRate" class="col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left"> Refresh rate </label>
<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" data-cy="docker-containers-stats-refresh-rate">
<option value="1">1s</option>
<option value="3">3s</option>
<option value="5">5s</option>

@ -40,7 +40,15 @@
<!-- name-input -->
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="item.Name" ng-change="checkName($index)" placeholder="e.g. my-image:my-tag" auto-focus />
<input
type="text"
class="form-control"
ng-model="item.Name"
ng-change="checkName($index)"
placeholder="e.g. my-image:my-tag"
auto-focus
data-cy="image-name-input"
/>
<span class="input-group-addon" ng-if="!item.Valid">
<pr-icon icon="'x'" mode="'danger'"></pr-icon>
</span>
@ -101,9 +109,7 @@
</span>
</div>
<button class="btn btn-sm btn-primary" ngf-select="selectAdditionalFiles($files)" ngf-multiple="true">Select files</button>
<span ng-repeat="item in formValues.AdditionalFiles track by $index" class="mx-2">
{{ item.name }}
</span>
<span ng-repeat="item in formValues.AdditionalFiles track by $index" class="mx-2"> {{ item.name }} </span>
</div>
</div>
</div>
@ -133,7 +139,7 @@
<div class="form-group">
<label for="image_path" class="col-sm-2 control-label text-left">Dockerfile path</label>
<div class="col-sm-10">
<input type="text" class="form-control" ng-model="formValues.Path" id="image_path" placeholder="Dockerfile" />
<input type="text" class="form-control" ng-model="formValues.Path" id="image_path" placeholder="Dockerfile" data-cy="image-path-input" />
</div>
</div>
</div>
@ -156,6 +162,7 @@
<div class="col-sm-10">
<input
type="text"
data-cy="image-url-input"
class="form-control"
ng-model="formValues.URL"
id="image_url"
@ -172,7 +179,7 @@
<div class="form-group">
<label for="image_path" class="col-sm-2 control-label text-left">Dockerfile path</label>
<div class="col-sm-10">
<input type="text" class="form-control" ng-model="formValues.Path" id="image_path" placeholder="Dockerfile" />
<input type="text" class="form-control" ng-model="formValues.Path" id="image_path" placeholder="Dockerfile" data-cy="image-path-input" />
</div>
</div>
</div>

@ -9,7 +9,7 @@
<div class="form-group">
<label for="network_name" class="col-sm-2 col-lg-1 control-label text-left">Name</label>
<div class="col-sm-10 col-lg-11">
<input type="text" class="form-control" ng-model="config.Name" id="network_name" placeholder="e.g. myNetwork" />
<input type="text" class="form-control" ng-model="config.Name" id="network_name" placeholder="e.g. myNetwork" data-cy="network-name-input" />
</div>
</div>
<!-- !name-input -->
@ -18,10 +18,24 @@
<div class="form-group">
<label for="network_driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label>
<div class="col-sm-10 col-lg-11">
<select class="form-control" ng-options="driver for driver in availableNetworkDrivers" ng-model="config.Driver" ng-if="availableNetworkDrivers.length > 0">
<select
class="form-control"
ng-options="driver for driver in availableNetworkDrivers"
ng-model="config.Driver"
ng-if="availableNetworkDrivers.length > 0"
data-cy="network-driver-select"
>
<option disabled hidden value="">Select a driver</option>
</select>
<input type="text" class="form-control" ng-model="config.Driver" id="network_driver" placeholder="e.g. driverName" ng-if="availableNetworkDrivers.length === 0" />
<input
type="text"
class="form-control"
ng-model="config.Driver"
id="network_driver"
placeholder="e.g. driverName"
ng-if="availableNetworkDrivers.length === 0"
data-cy="network-driver-input"
/>
</div>
</div>
<!-- !driver-input -->
@ -38,11 +52,17 @@
<div ng-repeat="option in formValues.DriverOptions" class="mt-1">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="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"
data-cy="network-driver-option-name-input"
/>
</div>
<div class="input-group col-sm-6 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="option.value" placeholder="e.g. true" />
<input type="text" class="form-control" ng-model="option.value" placeholder="e.g. true" data-cy="network-driver-option-value-input" />
<span class="input-group-btn">
<button class="btn btn-dangerlight" type="button" ng-click="removeDriverOption($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
@ -64,11 +84,25 @@
<div class="form-group">
<label for="ipv4_network_subnet" class="col-sm-2 col-lg-1 control-label text-left">Subnet</label>
<div class="col-sm-4 col-lg-5">
<input type="text" class="form-control" ng-model="formValues.IPV4.Subnet" id="ipv4_network_subnet" placeholder="e.g. 172.20.0.0/16" />
<input
type="text"
class="form-control"
ng-model="formValues.IPV4.Subnet"
id="ipv4_network_subnet"
placeholder="e.g. 172.20.0.0/16"
data-cy="network-ipv4-subnet-input"
/>
</div>
<label for="ipv4_network_gateway" class="col-sm-2 col-lg-1 control-label text-left">Gateway</label>
<div class="col-sm-4 col-lg-5">
<input type="text" class="form-control" ng-model="formValues.IPV4.Gateway" id="ipv4_network_gateway" placeholder="e.g. 172.20.10.11" />
<input
type="text"
class="form-control"
ng-model="formValues.IPV4.Gateway"
id="ipv4_network_gateway"
placeholder="e.g. 172.20.10.11"
data-cy="network-ipv4-gateway-input"
/>
</div>
</div>
<!-- !subnet-gateway-inputs -->
@ -76,7 +110,14 @@
<div class="form-group">
<label for="ipv4_network_iprange" class="col-sm-2 col-lg-1 control-label text-left">IP range</label>
<div class="col-sm-4 col-lg-5">
<input type="text" class="form-control" ng-model="formValues.IPV4.IPRange" id="ipv4_network_iprange" placeholder="e.g. 172.20.10.128/25" />
<input
type="text"
class="form-control"
ng-model="formValues.IPV4.IPRange"
id="ipv4_network_iprange"
placeholder="e.g. 172.20.10.128/25"
data-cy="network-ipv4-iprange-input"
/>
</div>
</div>
<div ng-repeat="auxAddress in formValues.IPV4.AuxiliaryAddresses track by $index" class="form-group">
@ -84,6 +125,7 @@
<div class="col-sm-4 col-lg-5">
<input
type="text"
data-cy="network-ipv4-auxaddr-input"
class="form-control"
ng-model="formValues.IPV4.AuxiliaryAddresses[$index]"
ng-change="checkIPV4AuxiliaryAddress($index)"
@ -111,11 +153,25 @@
<div class="form-group">
<label for="ipv6_network_subnet" class="col-sm-2 col-lg-1 control-label text-left">Subnet</label>
<div class="col-sm-4 col-lg-5">
<input type="text" class="form-control" ng-model="formValues.IPV6.Subnet" id="ipv6_network_subnet" placeholder="e.g. 2001:db8::/48" />
<input
type="text"
class="form-control"
ng-model="formValues.IPV6.Subnet"
id="ipv6_network_subnet"
placeholder="e.g. 2001:db8::/48"
data-cy="network-ipv6-subnet-input"
/>
</div>
<label for="ipv6_network_gateway" class="col-sm-2 col-lg-1 control-label text-left">Gateway</label>
<div class="col-sm-4 col-lg-5">
<input type="text" class="form-control" ng-model="formValues.IPV6.Gateway" id="ipv6_network_gateway" placeholder="e.g. 2001:db8::1" />
<input
type="text"
class="form-control"
ng-model="formValues.IPV6.Gateway"
id="ipv6_network_gateway"
placeholder="e.g. 2001:db8::1"
data-cy="network-ipv6-gateway-input"
/>
</div>
</div>
<!-- !subnet-gateway-inputs -->
@ -123,7 +179,14 @@
<div class="form-group">
<label for="ipv6_network_iprange" class="col-sm-2 col-lg-1 control-label text-left">IP range</label>
<div class="col-sm-4 col-lg-5">
<input type="text" class="form-control" ng-model="formValues.IPV6.IPRange" id="ipv6_network_iprange" placeholder="e.g. 2001:db8::/64" />
<input
type="text"
class="form-control"
ng-model="formValues.IPV6.IPRange"
id="ipv6_network_iprange"
placeholder="e.g. 2001:db8::/64"
data-cy="network-ipv6-iprange-input"
/>
</div>
</div>
<div ng-repeat="auxAddress in formValues.IPV6.AuxiliaryAddresses track by $index" class="form-group">
@ -131,6 +194,7 @@
<div class="col-sm-4 col-lg-5">
<input
type="text"
data-cy="network-ipv6-auxaddr-input"
class="form-control"
ng-model="formValues.IPV6.AuxiliaryAddresses[$index]"
ng-change="checkIPV6AuxiliaryAddress($index)"
@ -160,11 +224,11 @@
<div ng-repeat="label in formValues.Labels" class="mt-1">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" data-cy="network-label-key-input" />
</div>
<div class="input-group col-sm-6 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" data-cy="network-label-value-input" />
<span class="input-group-btn">
<button class="btn btn-dangerlight" type="button" ng-click="removeLabel($index)"> <pr-icon icon="'trash-2'" size="'md'"></pr-icon> </button
></span>

@ -9,7 +9,7 @@
<div class="form-group">
<label for="secret_name" class="col-sm-2 control-label text-left">Name</label>
<div class="col-sm-10">
<input type="text" class="form-control" ng-model="formValues.Name" id="secret_name" placeholder="e.g. mySecret" />
<input type="text" class="form-control" ng-model="formValues.Name" id="secret_name" placeholder="e.g. mySecret" data-cy="createSecret-nameInput" />
</div>
</div>
<!-- !name-input -->
@ -17,7 +17,7 @@
<div class="form-group">
<label for="secret_data" class="col-sm-2 control-label text-left">Secret</label>
<div class="col-sm-10">
<textarea class="form-control" rows="5" ng-model="formValues.Data" ng-trim="false"></textarea>
<textarea class="form-control" rows="5" ng-model="formValues.Data" ng-trim="false" data-cy="createSecret-secretDataInput"></textarea>
</div>
</div>
<!-- !secret-data -->
@ -45,11 +45,11 @@
<div ng-repeat="label in formValues.Labels" class="mt-1">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" data-cy="createSecret-labelNameInput" />
</div>
<div class="input-group col-sm-6 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" data-cy="createSecret-labelValueInput" />
<span class="input-group-btn">
<button class="btn btn-dangerlight" type="button" ng-click="removeLabel($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>

@ -9,7 +9,7 @@
<div class="form-group">
<label for="service_name" class="col-sm-2 control-label text-left">Name</label>
<div class="col-sm-8">
<input type="text" class="form-control" ng-model="formValues.Name" id="service_name" placeholder="e.g. myService" />
<input type="text" class="form-control" ng-model="formValues.Name" id="service_name" placeholder="e.g. myService" data-cy="service-name-input" />
</div>
</div>
<!-- !name-input -->
@ -42,7 +42,7 @@
<div>
<label class="control-label col-sm-2 text-left"> Replicas </label>
<div class="col-sm-8">
<input type="number" class="form-control" ng-model="formValues.Replicas" id="replicas" placeholder="e.g. 3" />
<input type="number" class="form-control" ng-model="formValues.Replicas" id="replicas" placeholder="e.g. 3" data-cy="docker-service-create-replica-count-input" />
</div>
</div>
</div>
@ -59,7 +59,7 @@
<!-- host-port -->
<div class="input-group col-sm-3 input-group-sm">
<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)" data-cy="host-port-input" />
</div>
<!-- !host-port -->
<span style="margin: 0 10px 0 10px">
@ -68,7 +68,7 @@
<!-- container-port -->
<div class="input-group col-sm-3 input-group-sm">
<span class="input-group-addon">container</span>
<input type="text" class="form-control" ng-model="portBinding.TargetPort" placeholder="e.g. 80" />
<input type="text" class="form-control" ng-model="portBinding.TargetPort" placeholder="e.g. 80" data-cy="container-port-input" />
</div>
<!-- !container-port -->
<!-- protocol-actions -->
@ -159,7 +159,14 @@
<div class="form-group">
<label for="service_command" class="col-sm-2 col-lg-1 control-label text-left">Command</label>
<div class="col-sm-9">
<input type="text" class="form-control" ng-model="formValues.Command" id="service_command" placeholder="e.g. /usr/bin/nginx -t -c /mynginx.conf" />
<input
type="text"
class="form-control"
ng-model="formValues.Command"
id="service_command"
placeholder="e.g. /usr/bin/nginx -t -c /mynginx.conf"
data-cy="service-command-input"
/>
</div>
</div>
<!-- !command-input -->
@ -167,7 +174,14 @@
<div class="form-group">
<label for="service_entrypoint" class="col-sm-2 col-lg-1 control-label text-left">Entrypoint</label>
<div class="col-sm-9">
<input type="text" class="form-control" ng-model="formValues.EntryPoint" id="service_entrypoint" placeholder="e.g. /bin/sh -c" />
<input
type="text"
class="form-control"
ng-model="formValues.EntryPoint"
id="service_entrypoint"
placeholder="e.g. /bin/sh -c"
data-cy="service-entrypoint-input"
/>
</div>
</div>
<!-- !entrypoint-input -->
@ -175,11 +189,11 @@
<div class="form-group">
<label for="service_workingdir" class="col-sm-2 col-lg-1 control-label text-left">Working Dir</label>
<div class="col-sm-4">
<input type="text" class="form-control" ng-model="formValues.WorkingDir" id="service_workingdir" placeholder="e.g. /myapp" />
<input type="text" class="form-control" ng-model="formValues.WorkingDir" id="service_workingdir" placeholder="e.g. /myapp" data-cy="service-workingdir-input" />
</div>
<label for="service_user" class="col-sm-1 control-label text-left">User</label>
<div class="col-sm-4">
<input type="text" class="form-control" ng-model="formValues.User" id="service_user" placeholder="e.g. nginx" />
<input type="text" class="form-control" ng-model="formValues.User" id="service_user" placeholder="e.g. nginx" data-cy="service-user-input" />
</div>
</div>
<!-- !workdir-user-input -->
@ -188,7 +202,7 @@
<div class="form-group">
<label for="log-driver" class="col-sm-2 col-lg-1 control-label text-left">Driver</label>
<div class="col-sm-4">
<select class="form-control" ng-model="formValues.LogDriverName" id="log-driver">
<select class="form-control" ng-model="formValues.LogDriverName" id="log-driver" data-cy="service-creation-logging-driver">
<option selected value="">Default logging driver</option>
<option ng-repeat="driver in availableLoggingDrivers" ng-value="driver">{{ driver }}</option>
<option value="none">none</option>
@ -226,11 +240,11 @@
<div ng-repeat="opt in formValues.LogDriverOpts" class="mt-1">
<div class="input-group col-sm-5 input-group-sm">
<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" data-cy="service-creation-logging-driver-option" />
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="opt.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="opt.value" placeholder="e.g. bar" data-cy="service-creation-logging-driver-option-value" />
</div>
<button class="btn btn-dangerlight" type="button" ng-click="removeLogDriverOpt($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
@ -264,7 +278,13 @@
<div class="input-group col-sm-6">
<div class="input-group input-group-sm w-full">
<span class="input-group-addon">container</span>
<input type="text" class="form-control" ng-model="volume.Target" placeholder="e.g. /path/in/container" />
<input
type="text"
class="form-control"
ng-model="volume.Target"
placeholder="e.g. /path/in/container"
data-cy="service-creation-volume-container-path"
/>
</div>
<div class="small text-warning" ng-show="!volume.Target"> <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon> Target is required. </div>
</div>
@ -295,6 +315,7 @@
class="form-control"
ng-model="volume.Source"
ng-options="vol as ((vol.Id|truncate:30) + ' - ' + (vol.Driver|truncate:30)) for vol in availableVolumes"
data-cy="volume-source-select"
>
<option selected disabled value="">Select a volume</option>
</select>
@ -306,7 +327,7 @@
<div class="input-group input-group-sm col-sm-6" ng-if="volume.Type === 'bind'">
<div class="input-group input-group-sm w-full">
<span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="volume.Source" placeholder="e.g. /path/on/host" />
<input type="text" class="form-control" ng-model="volume.Source" placeholder="e.g. /path/on/host" data-cy="service-creation-volume-host-path" />
</div>
<div class="small text-warning" ng-show="!volume.Source"> <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon> Source is required. </div>
</div>
@ -337,7 +358,7 @@
<div class="form-group">
<label for="container_network" class="col-sm-2 col-lg-1 control-label text-left">Network</label>
<div class="col-sm-9">
<select class="form-control" ng-model="formValues.Network">
<select class="form-control" ng-model="formValues.Network" data-cy="create-service-network-select">
<option selected disabled hidden value="">Select a network</option>
<option ng-repeat="net in availableNetworks | orderBy: 'Name'" ng-value="net.Name">{{ net.Name }}</option>
</select>
@ -356,7 +377,7 @@
<!-- network-input-list -->
<div class="col-sm-12 form-inline" style="margin-top: 10px">
<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" data-cy="create-service-extra-network-select-{{ $index }}">
<option selected disabled hidden value="">Select a network</option>
<option ng-repeat="net in availableNetworks" ng-value="net.Name">{{ net.Name }}</option>
</select>
@ -381,7 +402,7 @@
<div ng-repeat="variable in formValues.HostsEntries" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="variable.value" placeholder="e.g. host:IP" />
<input type="text" class="form-control" ng-model="variable.value" placeholder="e.g. host:IP" data-cy="service-creation-hosts-entry" />
</div>
<button class="btn btn-dangerlight" type="button" ng-click="removeHostsEntry($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
@ -421,11 +442,11 @@
<div ng-repeat="label in formValues.Labels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" data-cy="service-creation-label" />
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" data-cy="service-creation-label-value" />
</div>
<button class="btn btn-dangerlight" type="button" ng-click="removeLabel($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
@ -448,11 +469,11 @@
<div ng-repeat="label in formValues.ContainerLabels" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" />
<input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" data-cy="service-creation-container-label" />
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" data-cy="service-creation-container-label-value" />
</div>
<button class="btn btn-dangerlight" type="button" ng-click="removeContainerLabel($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>

@ -14,7 +14,13 @@
<div ng-repeat="config in formValues.Configs" style="margin-top: 2px">
<div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">config</span>
<select class="form-control" ng-change="checkIfConfigDuplicated()" ng-model="config.model" ng-options="config.Name for config in availableConfigs | orderBy: 'Name'">
<select
class="form-control"
ng-change="checkIfConfigDuplicated()"
ng-model="config.model"
ng-options="config.Name for config in availableConfigs | orderBy: 'Name'"
data-cy="docker-stack-configs-select"
>
<option value="" selected="selected">Select a config</option>
</select>
</div>

@ -4,10 +4,17 @@
<div class="form-group">
<label for="memory-reservation" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> Memory reservation </label>
<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"
data-cy="docker-services-create-memory-reservation-slider"
></slider>
</div>
<div class="col-sm-2">
<input type="number" min="0" class="form-control" ng-model="formValues.MemoryReservation" />
<input type="number" data-cy="docker-services-create-memory-reservation-input" min="0" class="form-control" ng-model="formValues.MemoryReservation" />
</div>
<div class="col-sm-4">
<p class="small text-muted" style="margin-top: 7px"> Minimum memory available on a node to run a task (<b>MB</b>) </p>
@ -18,10 +25,17 @@
<div class="form-group">
<label for="memory-limit" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> Memory limit </label>
<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"
data-cy="docker-services-create-memory-limit-slider"
></slider>
</div>
<div class="col-sm-2">
<input type="number" min="0" class="form-control" ng-model="formValues.MemoryLimit" />
<input type="number" data-cy="docker-services-create-memory-limit-input" min="0" class="form-control" ng-model="formValues.MemoryLimit" />
</div>
<div class="col-sm-4" style="margin-top: 7px">
<p class="small text-muted"> Maximum memory usage per task (<b>MB</b>) </p>
@ -32,7 +46,15 @@
<div class="form-group">
<label for="cpu-reservation" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> CPU reservation </label>
<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"
data-cy="docker-services-create-cpu-reservation-slider"
></slider>
</div>
<div class="col-sm-4" style="margin-top: 20px">
<p class="small text-muted"> Minimum CPU available on a node to run a task </p>
@ -43,7 +65,15 @@
<div class="form-group">
<label for="cpu-limit" class="col-sm-3 col-lg-2 control-label text-left" style="margin-top: 20px"> CPU limit </label>
<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"
data-cy="docker-services-create-cpu-limit-slider"
></slider>
</div>
<div class="col-sm-4" style="margin-top: 20px">
<p class="small text-muted"> Maximum CPU usage per task </p>
@ -63,17 +93,17 @@
<div ng-repeat="constraint in formValues.PlacementConstraints" style="margin-top: 2px">
<div class="input-group col-sm-4 input-group-sm">
<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" data-cy="docker-services-create-placement-constraint-name-{{ $index }}" />
</div>
<div class="input-group col-sm-1 input-group-sm">
<select name="constraintOperator" class="form-control" ng-model="constraint.operator">
<select name="constraintOperator" class="form-control" ng-model="constraint.operator" data-cy="docker-services-create-placement-constraint-operator-">
<option value="==">==</option>
<option value="!=">!=</option>
</select>
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="constraint.value" placeholder="e.g. manager" />
<input type="text" class="form-control" ng-model="constraint.value" placeholder="e.g. manager" data-cy="docker-services-create-placement-constraint-value-{{ $index }}" />
</div>
<button class="btn btn-dangerlight" type="button" ng-click="removePlacementConstraint($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
@ -94,11 +124,23 @@
<div ng-repeat="preference in formValues.PlacementPreferences" style="margin-top: 2px">
<div class="input-group col-sm-4 input-group-sm">
<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"
data-cy="docker-services-create-placement-preference-strategy-{{ $index }}"
/>
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="preference.value" placeholder="e.g. node.labels.datacenter" />
<input
type="text"
class="form-control"
ng-model="preference.value"
placeholder="e.g. node.labels.datacenter"
data-cy="docker-services-create-placement-preference-value-{{ $index }}"
/>
</div>
<button class="btn btn-dangerlight" type="button" ng-click="removePlacementPreference($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>

@ -20,7 +20,13 @@
<div ng-repeat="secret in formValues.Secrets track by $index" style="margin-top: 4px">
<div class="input-group col-sm-4 input-group-sm">
<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'"
data-cy="docker-stack-secrets-select"
>
<option value="" selected="selected">Select a secret</option>
</select>
</div>

@ -4,7 +4,7 @@
<div class="form-group">
<label for="parallelism" class="col-sm-3 col-lg-2 control-label text-left">Update parallelism</label>
<div class="col-sm-4 col-lg-3">
<input type="number" class="form-control" ng-model="formValues.Parallelism" id="parallelism" placeholder="e.g. 1" />
<input type="number" data-cy="docker-service-update-parallelism-input" class="form-control" ng-model="formValues.Parallelism" id="parallelism" placeholder="e.g. 1" />
</div>
<div class="col-sm-5">
<p class="small text-muted"> Maximum number of tasks to be updated simultaneously (0 to update all at once). </p>
@ -18,7 +18,15 @@
<portainer-tooltip message="'Supported format examples: 1h, 5m, 10s, 1000ms, 15us, 60ns.'"></portainer-tooltip>
</label>
<div class="col-sm-4 col-lg-3">
<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"
data-cy="docker-service-update-delay-input"
/>
</div>
<div class="col-sm-5">
<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>
@ -77,7 +85,15 @@
<portainer-tooltip message="'Supported format examples: 1h, 5m, 10s, 1000ms, 15us, 60ns.'"></portainer-tooltip>
</label>
<div class="col-sm-4 col-lg-3">
<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"
data-cy="docker-service-restart-delay-input"
/>
</div>
<div class="col-sm-5">
<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>
@ -88,7 +104,14 @@
<div class="form-group">
<label for="restart-max-attempts" class="col-sm-3 col-lg-2 control-label text-left">Restart max attempts</label>
<div class="col-sm-4 col-lg-3">
<input type="number" class="form-control" ng-model="formValues.RestartMaxAttempts" id="restart-max-attempts" placeholder="e.g. 0" />
<input
type="number"
data-cy="docker-service-restart-max-attempts-input"
class="form-control"
ng-model="formValues.RestartMaxAttempts"
id="restart-max-attempts"
placeholder="e.g. 0"
/>
</div>
<div class="col-sm-5">
<p class="small text-muted"> Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited). </p>
@ -102,7 +125,15 @@
<portainer-tooltip message="'Supported format examples: 1h, 5m, 10s, 1000ms, 15us, 60ns.'"></portainer-tooltip>
</label>
<div class="col-sm-4 col-lg-3">
<input type="text" class="form-control" ng-model="formValues.RestartWindow" id="restart-window" placeholder="e.g. 1m" ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i" />
<input
type="text"
class="form-control"
ng-model="formValues.RestartWindow"
id="restart-window"
placeholder="e.g. 1m"
ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i"
data-cy="docker-service-restart-window-input"
/>
</div>
<div class="col-sm-5">
<p class="small text-muted">

@ -4,7 +4,12 @@
<rd-widget-body classes="no-padding">
<div class="form-inline" style="padding: 10px" authorization="DockerServiceUpdate">
Add a config:
<select class="form-control !h-[30px] !text-[13px]" ng-options="config.Name for config in filterConfigs(configs) | orderBy: 'Name'" ng-model="newConfig">
<select
class="form-control !h-[30px] !text-[13px]"
ng-options="config.Name for config in filterConfigs(configs) | orderBy: 'Name'"
ng-model="newConfig"
data-cy="service-configs-select"
>
<option selected disabled hidden value="">Select a config</option>
</select>
<a class="btn btn-default btn-sm" ng-click="addConfig(service, newConfig)"> <pr-icon icon="'plus'"></pr-icon> add config </a>

@ -25,6 +25,7 @@
<div class="input-group input-group-sm">
<input
type="text"
data-cy="placement-constraint-key-input-{{ $index }}"
class="form-control"
ng-model="constraint.key"
placeholder="e.g. node.role"
@ -43,6 +44,7 @@
ng-change="updatePlacementConstraint(service, constraint)"
ng-disabled="isUpdating"
disable-authorization="DockerServiceUpdate"
data-cy="placement-constraint-operator=selectoer"
>
<option value="==">==</option>
<option value="!=">!=</option>
@ -53,6 +55,7 @@
<div class="input-group input-group-sm">
<input
type="text"
data-cy="placement-constraint-value-input-{{ $index }}"
class="form-control"
ng-model="constraint.value"
placeholder="e.g. manager"

@ -25,6 +25,7 @@
<span class="input-group-addon fit-text-size">name</span>
<input
type="text"
data-cy="container-label-key-{{ $index }}"
class="form-control"
ng-model="label.key"
placeholder="e.g. com.example.foo"
@ -39,6 +40,7 @@
<span class="input-group-addon fit-text-size">value</span>
<input
type="text"
data-cy="container-label-value_{{ $index }}"
class="form-control"
ng-model="label.value"
placeholder="e.g. bar"

@ -25,6 +25,7 @@
<input
type="text"
class="form-control"
data-cy="hosts-entry-hostname-input-{{ $index }}"
ng-model="entry.hostname"
placeholder="e.g. example.com"
ng-change="updateHostsEntry(service, entry)"
@ -37,6 +38,7 @@
<div class="input-group input-group-sm">
<input
type="text"
data-cy="hosts-entry-ip-input-{{ $index }}"
class="form-control"
ng-model="entry.ip"
placeholder="e.g. 10.0.1.1"

@ -4,7 +4,13 @@
<rd-widget-body classes="no-padding">
<div class="form-inline" style="padding: 10px" authorization="DockerServiceUpdate">
Driver:
<select class="form-control !h-[30px] !text-[13px]" ng-model="service.LogDriverName" ng-change="updateLogDriverName(service)" ng-disabled="isUpdating">
<select
class="form-control !h-[30px] !text-[13px]"
ng-model="service.LogDriverName"
ng-change="updateLogDriverName(service)"
ng-disabled="isUpdating"
data-cy="logging-driver-selector"
>
<option selected value="">Default logging driver</option>
<option ng-repeat="driver in availableLoggingDrivers" ng-value="driver">{{ driver }}</option>
<option value="none">none</option>
@ -25,7 +31,14 @@
<td class="w-1/2">
<div class="input-group input-group-sm">
<span class="input-group-addon fit-text-size">name</span>
<input type="text" class="form-control" ng-model="option.key" ng-disabled="option.added || isUpdating" placeholder="e.g. FOO" />
<input
type="text"
data-cy="service-logging-driver-option-name-input-{{ $index }}"
class="form-control"
ng-model="option.key"
ng-disabled="option.added || isUpdating"
placeholder="e.g. FOO"
/>
</div>
</td>
<td>
@ -33,6 +46,7 @@
<span class="input-group-addon fit-text-size">value</span>
<input
type="text"
data-cy="service-logging-driver-option-value-input-{{ $index }}"
class="form-control"
ng-model="option.value"
ng-change="updateLogDriverOpt(service, option)"

@ -24,6 +24,7 @@
<td class="!pt-6 !align-top" ng-if="isAdmin || allowBindMounts">
<select
name="mountType"
data-cy="mount-type-selector"
class="form-control !h-[30px] !text-[13px]"
ng-model="mount.Type"
ng-change="onChangeMountType(service, mount)"
@ -43,11 +44,13 @@
ng-options="vol.Id as ((vol.Id|truncate:30) + ' - ' + (vol.Driver|truncate:30)) for vol in availableVolumes"
ng-if="mount.Type === 'volume'"
disable-authorization="DockerServiceUpdate"
data-cy="volume-selector"
>
<option selected disabled hidden value="">Select a volume</option>
</select>
<input
type="text"
data-cy="bind-mount-source-input-{{ index }}"
class="form-control !h-[30px] !text-[13px]"
name=""
ng-model="mount.Source"
@ -64,6 +67,7 @@
<td class="!pb-0 !pt-6 !align-top">
<input
type="text"
data-cy="mount-target-input-{{ index }}"
class="form-control mb-6 !h-[30px] !text-[13px]"
ng-model="mount.Target"
placeholder="e.g. /tmp/portainer/data"

@ -29,6 +29,7 @@
ng-options="net.Id as net.Name for net in filterNetworks(swarmNetworks, network)"
disable-authorization="DockerServiceUpdate"
style="width: initial; min-width: 50%"
data-cy="network-selector_{{ network.Name }}"
>
<option disabled value="" selected>Select a network</option>
</select>
@ -37,9 +38,7 @@
<td>
<a ui-sref="docker.networks.network({id: network.Id})">{{ network.Id }}</a>
</td>
<td>
{{ network.Addr }}
</td>
<td> {{ network.Addr }} </td>
<td ng-if="network.Editable" authorization="DockerServiceUpdate">
<span class="input-group-btn">
<button class="btn btn-sm btn-dangerlight" type="button" ng-click="removeNetwork(service, $index)" ng-disabled="isUpdating">

@ -24,6 +24,7 @@
<div class="input-group input-group-sm">
<input
type="text"
data-cy="placement-preference-strategy-input-{{ $index }}"
class="form-control"
ng-model="preference.strategy"
placeholder="e.g. node.role"
@ -37,6 +38,7 @@
<div class="input-group input-group-sm">
<input
type="text"
data-cy="placement-preference-value-input-{{ $index }}"
class="form-control"
ng-model="preference.value"
placeholder="e.g. manager"

@ -10,6 +10,7 @@
<input
class="input-sm"
type="number"
data-cy="docker-service-memory-reservation-input"
step="0.125"
min="0"
ng-model="service.ReservationMemoryBytes"
@ -27,6 +28,7 @@
<input
class="input-sm"
type="number"
data-cy="docker-service-memory-limit-input"
step="0.125"
min="0"
ng-model="service.LimitMemoryBytes"
@ -44,6 +46,7 @@
</td>
<td>
<slider
data-cy="docker-service-cpu-reservation-slider"
model="service.ReservationNanoCPUs"
floor="0"
ceil="state.sliderMaxCpu"
@ -64,6 +67,7 @@
</td>
<td>
<slider
data-cy="docker-service-cpu-limit-slider"
model="service.LimitNanoCPUs"
floor="0"
ceil="state.sliderMaxCpu"

@ -10,6 +10,7 @@
<div class="input-group input-group-sm">
<select
class="selectpicker form-control !rounded"
data-cy="docker-service-restart-condition-select"
ng-model="service.RestartCondition"
ng-change="updateServiceAttribute(service, 'RestartCondition')"
disable-authorization="DockerServiceUpdate"
@ -30,6 +31,7 @@
<input
class="input-sm"
type="text"
data-cy="docker-service-restart-delay-input"
ng-model="service.RestartDelay"
ng-change="updateServiceAttribute(service, 'RestartDelay')"
ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i"
@ -48,6 +50,7 @@
<input
class="input-sm"
type="number"
data-cy="docker-service-restart-max-attempts-input"
ng-model="service.RestartMaxAttempts"
ng-change="updateServiceAttribute(service, 'RestartMaxAttempts')"
disable-authorization="DockerServiceUpdate"
@ -63,6 +66,7 @@
<input
class="input-sm"
type="text"
data-cy="docker-service-restart-window-input"
ng-model="service.RestartWindow"
ng-change="updateServiceAttribute(service, 'RestartWindow')"
ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i"

@ -4,7 +4,12 @@
<rd-widget-body classes="no-padding">
<div class="form-inline" style="padding: 10px" authorization="DockerServiceUpdate">
Add a secret:
<select class="form-control !h-[30px] !text-[13px]" ng-options="secret.Name for secret in secrets | orderBy: 'Name'" ng-model="state.addSecret.secret">
<select
class="form-control !h-[30px] !text-[13px]"
ng-options="secret.Name for secret in secrets | orderBy: 'Name'"
ng-model="state.addSecret.secret"
data-cy="service-secrets-select"
>
<option selected disabled hidden value="">Select a secret</option>
</select>
<div class="form-group" ng-if="applicationState.endpoint.apiVersion >= 1.3 && state.addSecret.override">

@ -23,6 +23,7 @@
<span class="input-group-addon fit-text-size">name</span>
<input
type="text"
data-cy="service-label-key-{{ $index }}"
class="form-control"
ng-model="label.key"
placeholder="e.g. com.example.foo"
@ -37,6 +38,7 @@
<span class="input-group-addon fit-text-size">value</span>
<input
type="text"
data-cy="service-label-value_{{ $index }}"
class="form-control"
ng-model="label.value"
placeholder="e.g. bar"

@ -10,6 +10,7 @@
<input
class="input-sm"
type="number"
data-cy="docker-service-update-parallelism-input"
ng-model="service.UpdateParallelism"
ng-change="updateServiceAttribute(service, 'UpdateParallelism')"
disable-authorization="DockerServiceUpdate"
@ -25,6 +26,7 @@
<input
class="input-sm"
type="text"
data-cy="docker-service-update-delay-input"
ng-model="service.UpdateDelay"
ng-change="updateServiceAttribute(service, 'UpdateDelay')"
ng-pattern="/^([0-9]+)(h|m|s|ms|us|ns)$/i"
@ -43,6 +45,7 @@
<input
type="radio"
name="failure_action"
data-cy="update-failure-action-continue"
ng-model="service.UpdateFailureAction"
value="continue"
ng-change="updateServiceAttribute(service, 'UpdateFailureAction')"
@ -54,6 +57,7 @@
<input
type="radio"
name="failure_action"
data-cy="update-failure-action-pause"
ng-model="service.UpdateFailureAction"
value="pause"
ng-change="updateServiceAttribute(service, 'UpdateFailureAction')"
@ -75,6 +79,7 @@
<input
type="radio"
name="updateconfig_order"
data-cy="update-order-start-first"
ng-model="service.UpdateOrder"
value="start-first"
ng-change="updateServiceAttribute(service, 'UpdateOrder')"
@ -86,6 +91,7 @@
<input
type="radio"
name="updateconfig_order"
data-cy="update-order-stop-first"
ng-model="service.UpdateOrder"
value="stop-first"
ng-change="updateServiceAttribute(service, 'UpdateOrder')"

@ -18,17 +18,20 @@
<tr>
<td class="w-1/5">Name</td>
<td ng-if="applicationState.endpoint.apiVersion <= 1.24">
<input type="text" class="form-control" ng-model="service.Name" ng-change="updateServiceAttribute(service, 'Name')" ng-disabled="isUpdating" />
</td>
<td ng-if="applicationState.endpoint.apiVersion >= 1.25">
{{ service.Name }}
<input
type="text"
class="form-control"
ng-model="service.Name"
ng-change="updateServiceAttribute(service, 'Name')"
ng-disabled="isUpdating"
data-cy="docker-service-edit-name"
/>
</td>
<td ng-if="applicationState.endpoint.apiVersion >= 1.25"> {{ service.Name }} </td>
</tr>
<tr>
<td>ID</td>
<td>
{{ service.Id }}
</td>
<td> {{ service.Id }} </td>
</tr>
<tr ng-if="service.CreatedAt">
<td>Created at</td>
@ -53,6 +56,7 @@
<input
class="input-sm"
type="number"
data-cy="docker-service-edit-replicas-input"
ng-model="service.Replicas"
ng-change="updateServiceAttribute(service, 'Replicas')"
disable-authorization="DockerServiceUpdate"

@ -57,7 +57,7 @@
<pr-icon id="refreshRateChange" icon="'check'" mode="'success'" size="'sm'" style="display: none"></pr-icon>
</label>
<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" data-cy="swarm-refreshRate-select">
<option value="5">5s</option>
<option value="10">10s</option>
<option value="30">30s</option>
@ -97,9 +97,7 @@
<div class="node_labels" ng-if="node.Labels.length > 0 && state.DisplayNodeLabels">
<div>Labels</div>
<div class="node_label" ng-repeat="label in node.Labels">
<span class="label_key">
{{ label.key }}
</span>
<span class="label_key"> {{ label.key }} </span>
<span class="label_value" ng-if="label.value"> = {{ label.value }} </span>
</div>
</div>

@ -9,7 +9,7 @@
<div class="form-group">
<label for="volume_name" class="col-sm-2 col-md-1 control-label text-left">Name</label>
<div class="col-sm-10 col-md-11">
<input type="text" class="form-control" ng-model="formValues.Name" id="volume_name" placeholder="e.g. myVolume" />
<input type="text" class="form-control" ng-model="formValues.Name" id="volume_name" placeholder="e.g. myVolume" data-cy="volume-name-input" />
</div>
</div>
<!-- !name-input -->
@ -18,10 +18,24 @@
<div class="form-group">
<label for="volume_driver" class="col-sm-2 col-md-1 control-label text-left">Driver</label>
<div class="col-sm-10 col-md-11">
<select class="form-control" ng-options="driver for driver in availableVolumeDrivers" ng-model="formValues.Driver" ng-if="availableVolumeDrivers.length > 0">
<select
class="form-control"
ng-options="driver for driver in availableVolumeDrivers"
ng-model="formValues.Driver"
ng-if="availableVolumeDrivers.length > 0"
data-cy="volume-driver-select"
>
<option disabled hidden value="">Select a driver</option>
</select>
<input type="text" class="form-control" ng-model="formValues.Driver" id="volume_driver" placeholder="e.g. driverName" ng-if="availableVolumeDrivers.length === 0" />
<input
type="text"
class="form-control"
ng-model="formValues.Driver"
id="volume_driver"
placeholder="e.g. driverName"
ng-if="availableVolumeDrivers.length === 0"
data-cy="volume-driver-input"
/>
</div>
</div>
<!-- !driver-input -->
@ -41,11 +55,11 @@
<div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="option.name" placeholder="e.g. mountpoint" />
<input type="text" class="form-control" ng-model="option.name" placeholder="e.g. mountpoint" data-cy="driver-option-name-input" />
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="option.value" placeholder="e.g. /path/on/host" />
<input type="text" class="form-control" ng-model="option.value" placeholder="e.g. /path/on/host" data-cy="driver-option-value-input" />
</div>
<button class="btn btn-sm btn-light" type="button" ng-click="removeDriverOption($index)">
<pr-icon icon="'trash-2'" class-name="'icon-secondary icon-md'"></pr-icon>

@ -6,6 +6,7 @@
<div class="col-sm-10">
<input
type="text"
data-cy="edgejob-name-input"
class="form-control"
ng-model="$ctrl.model.Name"
ng-pattern="/^[a-zA-Z0-9][a-zA-Z0-9_.-]+$/"
@ -43,7 +44,9 @@
<div class="form-group">
<label for="recurring" class="col-sm-2 control-label text-left">Recurring Edge job</label>
<div class="col-sm-10">
<label class="switch"><input type="checkbox" name="recurring" ng-model="$ctrl.model.Recurring" /><span class="slider round"></span></label>
<label class="switch"
><input type="checkbox" name="recurring" ng-model="$ctrl.model.Recurring" data-cy="recurring-edge-job-checkbox" /><span class="slider round"></span
></label>
</div>
</div>
<!-- not-recurring -->
@ -51,7 +54,7 @@
<div class="form-group">
<label for="edgejob_cron" class="col-sm-2 control-label text-left">Schedule date</label>
<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" data-cy="edge-job-date-time-picker" />
</div>
<div class="col-sm-12 small text-muted mt-2.5"> Time should be set according to the chosen environments' timezone. </div>
<div ng-show="edgeJobForm.datepicker.$invalid">
@ -73,6 +76,7 @@
<div class="col-sm-10">
<select
id="edgejob_value"
data-cy="edge-job-time-select"
name="edgejob_value"
class="form-control"
ng-model="$ctrl.formValues.scheduleValue"
@ -101,6 +105,7 @@
<div class="col-sm-10">
<input
type="text"
data-cy="edge-job-cron-input"
class="form-control"
ng-model="$ctrl.model.CronExpression"
id="edgejob_cron"
@ -193,9 +198,7 @@
<span ng-hide="$ctrl.actionInProgress">{{ $ctrl.formActionLabel }}</span>
<span ng-show="$ctrl.actionInProgress">In progress...</span>
</button>
<span class="text-danger space-left" ng-if="$ctrl.state.formValidationError">
{{ $ctrl.state.formValidationError }}
</span>
<span class="text-danger space-left" ng-if="$ctrl.state.formValidationError"> {{ $ctrl.state.formValidationError }} </span>
</div>
</div>
<!-- !actions -->

@ -4,13 +4,13 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="edgeGroupCreate-groupNameInput"
class="form-control"
id="group_name"
name="group_name"
ng-model="$ctrl.model.Name"
required
auto-focus
data-cy="edgeGroupCreate-groupNameInput"
placeholder="e.g. mygroup"
/>
<div class="help-block" ng-show="EdgeGroupForm.group_name.$invalid">

@ -11,6 +11,7 @@
<div class="col-sm-11">
<input
type="text"
data-cy="edgeStackCreate-nameInput"
class="form-control"
ng-model="$ctrl.formValues.Name"
id="stack_name"
@ -19,7 +20,6 @@
placeholder="e.g. mystack"
auto-focus
required
data-cy="edgeStackCreate-nameInput"
/>
<div class="help-block" ng-show="$ctrl.form.$invalid">
<div class="small text-warning">
@ -90,9 +90,7 @@
<span ng-hide="$ctrl.state.actionInProgress">Deploy the stack</span>
<span ng-show="$ctrl.state.actionInProgress">Deployment in progress...</span>
</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>
<!-- !actions -->

@ -21,7 +21,13 @@
<div class="menuContent">
<div>
<div class="md-checkbox" ng-if="$ctrl.isAdmin">
<input id="applications_setting_show_system" type="checkbox" ng-model="$ctrl.settings.showSystem" ng-change="$ctrl.onSettingsShowSystemChange()" />
<input
id="applications_setting_show_system"
type="checkbox"
ng-model="$ctrl.settings.showSystem"
ng-change="$ctrl.onSettingsShowSystemChange()"
data-cy="k8sApp-showSystemCheckbox"
/>
<label for="applications_setting_show_system">Show system resources</label>
</div>
<div class="md-checkbox">
@ -100,20 +106,20 @@
<pr-icon icon="'search'" class-name="'searchIcon'"></pr-icon>
<input
type="text"
data-cy="k8sApp-searchApplicationsInput"
class="searchInput"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search..."
auto-focus
ng-model-options="{ debounce: 300 }"
data-cy="k8sApp-searchApplicationsInput"
/>
</div>
</div>
</div>
<div class="toolBar !pt-0">
<div class="w-full">
<div class="form-group float-right !h-[30px] min-w-[140px] mr-2">
<div class="form-group float-right mr-2 !h-[30px] min-w-[140px]">
<div class="input-group">
<span class="input-group-addon">
<div className="flex items-center gap-1">
@ -218,7 +224,13 @@
<div class="menuHeader"> Filter by application type </div>
<div class="menuContent">
<div class="md-checkbox" ng-repeat="filter in $ctrl.filters.state.values track by $index">
<input id="filter_state_{{ $index }}" type="checkbox" ng-model="filter.display" ng-change="$ctrl.onStateFilterChange()" />
<input
id="filter_state_{{ $index }}"
type="checkbox"
ng-model="filter.display"
ng-change="$ctrl.onStateFilterChange()"
data-cy="k8sApp-filter-state-{{ $index }}"
/>
<label for="filter_state_{{ $index }}">{{ filter.type }}</label>
</div>
</div>
@ -261,6 +273,7 @@
<input
id="select_{{ $index }}"
type="checkbox"
data-cy="k8sApp-checkbox-{{ item.Name }}"
ng-model="item.Checked"
ng-click="$ctrl.selectItem(item, $event); $event.stopPropagation()"
ng-disabled="$ctrl.isSystemNamespace(item)"
@ -307,13 +320,9 @@
>
<span ng-if="item.KubernetesApplications">{{ item.Status }}</span>
</td>
<td ng-if="item.ApplicationType === $ctrl.KubernetesApplicationTypes.Pod">
{{ item.Pods[0].Status }}
</td>
<td ng-if="item.ApplicationType === $ctrl.KubernetesApplicationTypes.Pod"> {{ item.Pods[0].Status }} </td>
<td>
<span>
{{ item.Services.length === 0 ? 'No' : 'Yes' }}
</span>
<span> {{ item.Services.length === 0 ? 'No' : 'Yes' }} </span>
</td>
<td>{{ item.CreationDate | getisodate }} {{ item.ApplicationOwner ? 'by ' + item.ApplicationOwner : '' }}</td>
</tr>

@ -10,13 +10,13 @@
<pr-icon icon="'search'" class="vertical-center"></pr-icon>
<input
type="text"
data-cy="k8sConfigDetail-eventsTableSearchInput"
class="searchInput ml-1"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search for an event..."
auto-focus
ng-model-options="{ debounce: 300 }"
data-cy="k8sConfigDetail-eventsTableSearchInput"
/>
</div>
<div class="settings">
@ -28,12 +28,24 @@
<div class="menuContent">
<div>
<div class="md-checkbox">
<input id="setting_auto_refresh" type="checkbox" ng-model="$ctrl.settings.repeater.autoRefresh" ng-change="$ctrl.onSettingsRepeaterChange()" />
<input
id="setting_auto_refresh"
type="checkbox"
ng-model="$ctrl.settings.repeater.autoRefresh"
ng-change="$ctrl.onSettingsRepeaterChange()"
data-cy="k8sConfigDetail-eventsTableAutoRefreshCheckbox"
/>
<label for="setting_auto_refresh">Auto refresh</label>
</div>
<div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> 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"
data-cy="k8sConfigDetail-eventsTableRefreshRateSelect"
>
<option value="10">10s</option>
<option value="30">30s</option>
<option value="60">1min</option>

@ -1,12 +1,19 @@
<section class="datatable" aria-label="Helm charts">
<div class="toolBar vertical-center relative w-full flex-wrap !gap-x-5 !gap-y-1 !px-0">
<div class="toolBarTitle vertical-center">
{{ $ctrl.titleText }}
</div>
<div class="toolBarTitle vertical-center"> {{ $ctrl.titleText }} </div>
<div class="searchBar vertical-center !mr-0">
<pr-icon icon="'search'" class="searchIcon"></pr-icon>
<input type="text" class="searchInput" ng-model="$ctrl.state.textFilter" placeholder="Search..." auto-focus ng-model-options="{ debounce: 300 }" aria-label="Search input" />
<input
type="text"
data-cy="helm-templates-search"
class="searchInput"
ng-model="$ctrl.state.textFilter"
placeholder="Search..."
auto-focus
ng-model-options="{ debounce: 300 }"
aria-label="Search input"
/>
</div>
<div class="w-1/5">
<por-select
@ -20,7 +27,7 @@
</div>
</div>
<div class="w-full">
<div class="mb-2 small text-muted"
<div class="small text-muted mb-2"
>Select the Helm chart to use. Bring further Helm charts into your selection list via
<a ui-sref="portainer.account({'#': 'helm-repositories'})">User settings - Helm repositories</a>.</div
>

@ -72,6 +72,7 @@
<div class="col-sm-8 col-lg-9">
<input
type="text"
data-cy="k8sConfigCreate-keyInput"
class="form-control"
maxlength="253"
id="configuration_data_key_{{ index }}"
@ -111,6 +112,7 @@
<div class="col-sm-8 col-lg-9">
<textarea
class="form-control"
data-cy="k8sConfigCreate-configurationDataValue"
rows="5"
id="configuration_data_value_{{ index }}"
name="configuration_data_value_{{ index }}"
@ -156,7 +158,7 @@
</div>
<div class="form-group !px-[15px]" ng-if="!$ctrl.formValues.IsSimple">
<input type="text" ng-model="$ctrl.formValues.DataYaml" required style="display: none" />
<input type="text" ng-model="$ctrl.formValues.DataYaml" required style="display: none" data-cy="k8sConfigCreate-configurationDataYaml" />
<web-editor-form
identifier="kubernetes-configuration-editor"

@ -142,6 +142,7 @@ export const ngModule = angular
'identifier',
'data',
'hideMessage',
'data-cy',
])
)
.component(
@ -227,6 +228,7 @@ export const ngModule = angular
'onRefresh',
'tableKey',
'tableTitle',
'dataCy',
])
);

@ -57,7 +57,7 @@
<div class="form-group">
<label for="refreshRate" class="col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left"> Refresh rate </label>
<div class="col-sm-3 col-md-2">
<select id="refreshRate" ng-model="ctrl.state.refreshRate" ng-change="ctrl.changeUpdateRepeater()" class="form-control">
<select id="refreshRate" ng-model="ctrl.state.refreshRate" ng-change="ctrl.changeUpdateRepeater()" class="form-control" data-cy="app-stats-refresh-rate">
<option value="30">30s</option>
<option value="60">60s</option>
</select>

@ -40,19 +40,21 @@
<tr>
<td>Status</td>
<td>
<span class="label label-{{ ctrl.node.Status | kubernetesNodeStatusColor }}">
{{ ctrl.node.Status }}
</span>
<span ng-if="ctrl.node.Status == 'Warning'" class="text text-warning">
{{ ctrl.node.Conditions | kubernetesNodeConditionsMessage }}
</span>
<span class="label label-{{ ctrl.node.Status | kubernetesNodeStatusColor }}"> {{ ctrl.node.Status }} </span>
<span ng-if="ctrl.node.Status == 'Warning'" class="text text-warning"> {{ ctrl.node.Conditions | kubernetesNodeConditionsMessage }} </span>
</td>
</tr>
<tr>
<td class="col-xs-3"> Availability </td>
<td class="col-xs-9">
<div class="flex flex-col">
<select class="form-control" name="availability" style="display: inline-block; width: 16rem" ng-model="ctrl.formValues.Availability">
<select
class="form-control"
data-cy="node-availability-select"
name="availability"
style="display: inline-block; width: 16rem"
ng-model="ctrl.formValues.Availability"
>
<option>{{ ctrl.availabilities.ACTIVE }}</option>
<option>{{ ctrl.availabilities.PAUSE }}</option>
<option>{{ ctrl.availabilities.DRAIN }}</option>
@ -99,6 +101,7 @@
<span class="input-group-addon">Key</span>
<input
type="text"
data-cy="label-key-input-{{ $index }}"
class="form-control"
name="label_key_{{ $index }}"
ng-model="label.Key"
@ -111,6 +114,7 @@
<span class="input-group-addon">Value</span>
<input
type="text"
data-cy="label-value-input-{{ $index }}"
class="form-control"
name="label_value_{{ $index }}"
ng-change="ctrl.onChangeLabel($index)"
@ -158,15 +162,31 @@
<div class="form-inline" ng-repeat="taint in ctrl.formValues.Taints" style="padding: 3px 0 3px 0">
<div class="input-group col-sm-3 input-group-sm" ng-class="{ striked: taint.NeedsDeletion }">
<span class="input-group-addon">Key</span>
<input type="text" class="form-control" name="taint_key_{{ $index }}" ng-model="taint.Key" ng-change="ctrl.onChangeTaintKey($index)" required />
<input
type="text"
data-cy="taint-key-input-{{ $index }}"
class="form-control"
name="taint_key_{{ $index }}"
ng-model="taint.Key"
ng-change="ctrl.onChangeTaintKey($index)"
required
/>
</div>
<div class="input-group col-sm-3 input-group-sm" ng-class="{ striked: taint.NeedsDeletion }">
<span class="input-group-addon">Value</span>
<input type="text" class="form-control" name="taint_value_{{ $index }}" ng-model="taint.Value" ng-change="ctrl.onChangeTaint($index)" />
<input
type="text"
data-cy="taint-value-input-{{ $index }}"
class="form-control"
name="taint_value_{{ $index }}"
ng-model="taint.Value"
ng-change="ctrl.onChangeTaint($index)"
/>
</div>
<div class="input-group col-sm-3 input-group-sm" ng-class="{ striked: taint.NeedsDeletion }">
<span class="input-group-addon">Effect</span>
<select
data-cy="taint_effect_{{ $index }}"
id="taint_effect_{{ $index }}"
name="taint_effect_{{ $index }}"
class="form-control"
@ -247,7 +267,7 @@
<div class="flex-center gap-1"> <pr-icon icon="'code'" size="'sm'"></pr-icon> YAML </div>
</uib-tab-heading>
<div style="padding-right: 25px" ng-if="ctrl.state.showEditorTab">
<kube-yaml-inspector identifier="'node-yaml'" data="ctrl.node.Yaml" hide-message="true" />
<kube-yaml-inspector identifier="'node-yaml'" data="ctrl.node.Yaml" hide-message="true" data-cy="node-yaml-inspector" />
</div>
</uib-tab>
</uib-tabset>

@ -45,7 +45,7 @@
<div class="form-group">
<label for="refreshRate" class="col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left"> Refresh rate </label>
<div class="col-sm-3 col-md-2">
<select id="refreshRate" ng-model="ctrl.state.refreshRate" ng-change="ctrl.changeUpdateRepeater()" class="form-control">
<select id="refreshRate" ng-model="ctrl.state.refreshRate" ng-change="ctrl.changeUpdateRepeater()" class="form-control" data-cy="node-stats-refresh-rate">
<option value="30">30s</option>
<option value="60">60s</option>
</select>

@ -33,9 +33,7 @@
<tbody>
<tr>
<td class="w-[40%] !border-none !pl-0">Name</td>
<td class="!border-none">
{{ ctrl.configuration.Name }}
</td>
<td class="!border-none"> {{ ctrl.configuration.Name }} </td>
</tr>
<tr>
<td class="!pl-0">Namespace</td>
@ -75,7 +73,7 @@
YAML
</uib-tab-heading>
<div class="px-5 !pt-5" ng-if="ctrl.state.showEditorTab">
<kube-yaml-inspector identifier="'configuration-yaml'" data="ctrl.configuration.Yaml" hide-message="true" />
<kube-yaml-inspector data-cy="k8sConfigDetail-yamlInspector" identifier="'configuration-yaml'" data="ctrl.configuration.Yaml" hide-message="true" />
</div>
</uib-tab>
</uib-tabset>

@ -48,6 +48,7 @@
<div class="col-sm-8 col-lg-9 mb-0">
<input
type="text"
data-cy="k8sConfigCreate-nameInput"
class="form-control"
id="configuration_name"
name="configuration_name"
@ -57,7 +58,6 @@
placeholder="my-secret"
auto-focus
required
data-cy="k8sConfigCreate-nameInput"
/>
<div ng-show="kubernetesConfigurationCreationForm.configuration_name.$invalid || ctrl.state.alreadyExist">
<div class="help-block small text-warning">
@ -102,6 +102,7 @@
ng-model="ctrl.formValues.Type"
ng-options="value.value as value.name for (name, value) in ctrl.KubernetesSecretTypeOptions"
ng-change="ctrl.onSecretTypeChange()"
data-cy="k8sConfigCreate-typeDropdown"
></select>
<div class="col-sm-3 col-lg-2"></div>
@ -141,6 +142,7 @@
<div class="col-sm-8 col-lg-9">
<input
type="text"
data-cy="k8sConfigCreate-customType-input"
name="custom_type"
class="form-control"
id="configuration_data_customtype"

@ -47,9 +47,7 @@
</tr>
<tr ng-if="ctrl.secretTypeName">
<td class="!pl-0">Secret Type</td>
<td>
{{ ctrl.secretTypeName }}
</td>
<td> {{ ctrl.secretTypeName }} </td>
</tr>
</tbody>
</table>
@ -82,7 +80,7 @@
YAML
</uib-tab-heading>
<div class="px-5 !pt-5" ng-if="ctrl.state.showEditorTab">
<kube-yaml-inspector identifier="'secret-yaml'" data="ctrl.configuration.Yaml" hide-message="true" />
<kube-yaml-inspector data-cy="k8sConfigDetail-yamlInspector" identifier="'secret-yaml'" data="ctrl.configuration.Yaml" hide-message="true" />
</div>
</uib-tab>
</uib-tabset>

@ -33,7 +33,7 @@
</label>
<div class="col-sm-8 vertical-center pt-3">
<label class="switch">
<input type="checkbox" name="toggle_logo" ng-model="ctrl.formValues.namespace_toggle" />
<input type="checkbox" name="toggle_logo" ng-model="ctrl.formValues.namespace_toggle" data-cy="use-namespce-from-menifest" />
<span class="slider round"></span>
</label>
</div>
@ -44,6 +44,7 @@
<div class="col-sm-8">
<select
ng-if="!ctrl.formValues.namespace_toggle || ctrl.state.BuildMethod === ctrl.BuildMethods.HELM"
data-cy="namespace-select"
ng-disabled="ctrl.formValues.namespace_toggle && ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM"
class="form-control"
ng-model="ctrl.formValues.Namespace"
@ -71,6 +72,7 @@
<div class="col-sm-8" ng-if="ctrl.state.BuildMethod === ctrl.BuildMethods.HELM">
<input
type="text"
data-cy="name-input"
class="form-control"
ng-model="ctrl.formValues.Name"
id="name"
@ -87,7 +89,7 @@
</div>
<div ng-if="!ctrl.deploymentOptions.hideStacksFunctionality && ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM">
<div class="w-fit mb-4">
<div class="mb-4 w-fit">
<stack-name-label-insight></stack-name-label-insight>
</div>
<kube-stack-name stack-name="ctrl.formValues.StackName" set-stack-name="(ctrl.setStackName)" stacks="ctrl.stacks"></kube-stack-name>
@ -175,11 +177,11 @@
<div class="col-sm-8">
<input
type="text"
data-cy="k8sAppDeploy-urlFileUrl"
class="form-control"
ng-model="ctrl.formValues.ManifestURL"
id="manifest_url"
placeholder="https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml"
data-cy="k8sAppDeploy-urlFileUrl"
/>
</div>
</div>

@ -100,6 +100,7 @@
<input
name="memory_limit"
type="number"
data-cy="k8sNamespaceEdit-memoryLimitInput"
min="{{ ctrl.ResourceQuotaDefaults.MemoryLimit }}"
max="{{ ctrl.state.sliderMaxMemory }}"
class="form-control"
@ -188,9 +189,7 @@
<div class="form-group" ng-if="!ctrl.isAdmin || ctrl.isSystem">
<label class="col-sm-3 col-lg-2 control-label text-left" style="padding-top: 0"> Selected registries </label>
<div class="col-sm-9 col-lg-4">
{{ ctrl.selectedRegistries ? ctrl.selectedRegistries : 'None' }}
</div>
<div class="col-sm-9 col-lg-4"> {{ ctrl.selectedRegistries ? ctrl.selectedRegistries : 'None' }} </div>
</div>
<div ng-if="ctrl.isAdmin && !ctrl.isSystem">
@ -300,7 +299,7 @@
<uib-tab index="2" ng-if="ctrl.pool.Yaml" select="ctrl.showEditor()" classes="btn-sm">
<uib-tab-heading class="vertical-center"><pr-icon icon="'code'"></pr-icon> YAML </uib-tab-heading>
<div class="px-5" ng-if="ctrl.state.showEditorTab">
<kube-yaml-inspector identifier="'namespace-yaml'" data="ctrl.pool.Yaml" hide-message="true" />
<kube-yaml-inspector identifier="'namespace-yaml'" data="ctrl.pool.Yaml" data-cy="k8sNamespaceEdit-yamlEditor" hide-message="true" />
</div>
</uib-tab>
</uib-tabset>

@ -56,7 +56,7 @@
<td>Access Modes</td>
<td data-cy="k8sVolDetail-volAccessPolicy">
<div ng-repeat="(index, accessPolicy) in ctrl.state.volumeSharedAccessPolicies" class="flex flex-col gap-y-1">
<div class="items-center flex gap-x-1">
<div class="flex items-center gap-x-1">
{{ accessPolicy }}
<portainer-tooltip
ng-if="ctrl.state.volumeSharedAccessPolicyTooltips[index]"
@ -95,6 +95,7 @@
<div class="input-group input-group-sm">
<input
type="number"
data-cy="k8sVolDetail-increaseSizeInput"
class="form-control"
name="size"
ng-model="ctrl.state.volumeSize"
@ -171,7 +172,7 @@
<uib-tab index="2" ng-if="ctrl.volume.PersistentVolumeClaim.Yaml" select="ctrl.showEditor()" classes="btn-sm">
<uib-tab-heading class="vertical-center" data-cy="k8sVolDetail-volYamlTab"> <pr-icon icon="'code'"></pr-icon> YAML </uib-tab-heading>
<div class="px-5" ng-if="ctrl.state.showEditorTab">
<kube-yaml-inspector identifier="'volume-yaml'" data="ctrl.volume.PersistentVolumeClaim.Yaml" hide-message="true" />
<kube-yaml-inspector data-cy="k8sVolDetail-volYaml" identifier="'volume-yaml'" data="ctrl.volume.PersistentVolumeClaim.Yaml" hide-message="true" />
</div>
</uib-tab>
</uib-tabset>

@ -12,6 +12,7 @@
<pr-icon icon="'search'" class-name="'searchIcon'"></pr-icon>
<input
type="text"
data-cy="accessDatatable-searchInput"
class="searchInput"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
@ -46,7 +47,7 @@
<th>
<div class="vertical-center">
<span class="md-checkbox">
<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()" data-cy="select-all-checkbox" />
<label for="select_all"></label>
</span>
<table-column-header
@ -76,7 +77,14 @@
>
<td>
<span class="md-checkbox">
<input id="select_{{ $index }}" type="checkbox" ng-model="item.Checked" ng-disabled="$ctrl.disableRemove(item)" ng-click="$ctrl.selectItem(item, $event)" />
<input
id="select_{{ $index }}"
type="checkbox"
ng-model="item.Checked"
ng-disabled="$ctrl.disableRemove(item)"
ng-click="$ctrl.selectItem(item, $event)"
data-cy="select-checkbox"
/>
<label for="select_{{ $index }}"></label>
</span>
{{ item.Name }}

@ -26,6 +26,7 @@
<div>
<select
class="form-control"
data-cy="access-management-role-select"
ng-model="ctrl.formValues.selectedRole"
ng-options="role as ctrl.roleLabel(role) disable when ctrl.isRoleLimitedToBE(role) for role in ctrl.roles"
>

@ -4,6 +4,7 @@
<div class="col-sm-8 vertical-center">
<select
ng-if="$ctrl.templates.length"
data-cy="custom-template-selector"
class="form-control"
ng-model="$ctrl.value"
ng-options="template.Id as template.label for template in $ctrl.templates"

@ -7,7 +7,7 @@
<div class="menuHeader"> Show / Hide Columns </div>
<div class="menuContent">
<div class="md-checkbox" ng-repeat="(key, value) in $ctrl.columns">
<input id="col_vis_{{::key}}" ng-change="$ctrl.onChange($ctrl.columns)" type="checkbox" ng-model="value.display" />
<input id="col_vis_{{::key}}" ng-change="$ctrl.onChange($ctrl.columns)" type="checkbox" ng-model="value.display" data-cy="column-visibility-checkbox" />
<label for="col_vis_{{::key}}">{{ value.label }}</label>
</div>
</div>

@ -14,13 +14,12 @@
<input
id="filter_{{ $ctrl.filterKey }}_{{ $index }}"
type="checkbox"
data-cy="filter-checkbox"
ng-value="filter.value"
ng-checked="$ctrl.state.includes(filter.value)"
ng-click="$ctrl.onChangeItem(filter.value)"
/>
<label for="filter_{{ $ctrl.filterKey }}_{{ $index }}">
{{ filter.label }}
</label>
<label for="filter_{{ $ctrl.filterKey }}_{{ $index }}"> {{ filter.label }} </label>
</div>
</div>
<div>

@ -2,7 +2,7 @@
<form class="form-inline">
<span class="limitSelector">
<span style="margin-right: 5px"> Items per page </span>
<select class="form-control" ng-model="$ctrl.limit" ng-change="$ctrl.onChangeLimit($ctrl.limit)">
<select class="form-control" ng-model="$ctrl.limit" ng-change="$ctrl.onChangeLimit($ctrl.limit)" data-cy="pagination-limit-select">
<option ng-if="$ctrl.enableNoLimit" ng-value="0">All</option>
<option ng-value="10">10</option>
<option ng-value="25">25</option>

@ -3,7 +3,7 @@
<div class="form-group">
<label for="group_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" name="group_name" ng-model="$ctrl.model.Name" placeholder="e.g. my-group" required auto-focus />
<input type="text" class="form-control" name="group_name" ng-model="$ctrl.model.Name" placeholder="e.g. my-group" required auto-focus data-cy="group-name-input" />
<div class="help-block" ng-show="endpointGroupForm.group_name.$invalid">
<div class="small text-warning">
<div ng-messages="endpointGroupForm.group_name.$error">
@ -21,7 +21,14 @@
<div class="form-group">
<label for="group_description" class="col-sm-3 col-lg-2 control-label text-left">Description</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="group_description" ng-model="$ctrl.model.Description" placeholder="e.g. production environments..." />
<input
type="text"
class="form-control"
id="group_description"
ng-model="$ctrl.model.Description"
placeholder="e.g. production environments..."
data-cy="group-description-input"
/>
</div>
</div>
<!-- !description-input -->

@ -13,7 +13,17 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="my-ecr-registry" required auto-focus />
<input
type="text"
class="form-control"
id="registry_name"
name="registry_name"
ng-model="$ctrl.model.Name"
placeholder="my-ecr-registry"
required
auto-focus
data-cy="registry-name-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormEcr.registry_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormEcr.registry_name.$error">
@ -41,6 +51,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="registry-url-input"
class="form-control"
id="registry_url"
name="registry_url"
@ -83,7 +94,7 @@
<div class="form-group">
<label for="registry_access_key" class="col-sm-3 col-lg-2 control-label required text-left">AWS Access Key</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_access_key" name="registry_access_key" ng-model="$ctrl.model.Username" required />
<input type="text" class="form-control" id="registry_access_key" name="registry_access_key" ng-model="$ctrl.model.Username" required data-cy="registry-access-key-input" />
<div class="help-block" ng-show="$ctrl.registryFormEcr.registry_access_key.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormEcr.registry_access_key.$error">
@ -121,7 +132,16 @@
<div class="form-group">
<label for="registry_region" class="col-sm-3 col-lg-2 control-label required text-left">Region</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_region" name="registry_region" placeholder="us-west-1" ng-model="$ctrl.model.Ecr.Region" required />
<input
type="text"
class="form-control"
id="registry_region"
name="registry_region"
placeholder="us-west-1"
ng-model="$ctrl.model.Ecr.Region"
required
data-cy="registry-region-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormEcr.registry_region.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormEcr.registry_region.$error">

@ -4,7 +4,17 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="my-azure-registry" required auto-focus />
<input
type="text"
class="form-control"
id="registry_name"
name="registry_name"
ng-model="$ctrl.model.Name"
placeholder="my-azure-registry"
required
auto-focus
data-cy="registry-name-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormAzure.registry_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormAzure.registry_name.$error">
@ -29,7 +39,16 @@
<portainer-tooltip message="'URL of an Azure Container Registry. Any protocol will be stripped.'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_url" name="registry_url" ng-model="$ctrl.model.URL" placeholder="myproject.azurecr.io" required />
<input
type="text"
class="form-control"
id="registry_url"
name="registry_url"
ng-model="$ctrl.model.URL"
placeholder="myproject.azurecr.io"
required
data-cy="registry-url-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormAzure.registry_url.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormAzure.registry_url.$error">
@ -47,7 +66,7 @@
<div class="form-group">
<label for="registry_username" class="col-sm-3 col-lg-2 control-label required text-left">Username</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required />
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required data-cy="registry-username-input" />
<div class="help-block" ng-show="$ctrl.registryFormAzure.registry_username.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormAzure.registry_username.$error">

@ -11,7 +11,17 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="my-custom-registry" required auto-focus />
<input
type="text"
class="form-control"
id="registry_name"
name="registry_name"
ng-model="$ctrl.model.Name"
placeholder="my-custom-registry"
required
auto-focus
data-cy="component-registryNameInput"
/>
<div class="help-block" ng-show="$ctrl.registryFormCustom.registry_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormCustom.registry_name.$error">
@ -36,7 +46,16 @@
<portainer-tooltip message="'URL or IP address of a Docker registry. Any protocol and trailing slash will be stripped if present.'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_url" name="registry_url" ng-model="$ctrl.model.URL" placeholder="10.0.0.10:5000 or myregistry.domain.tld" required />
<input
type="text"
class="form-control"
id="registry_url"
name="registry_url"
ng-model="$ctrl.model.URL"
placeholder="10.0.0.10:5000 or myregistry.domain.tld"
required
data-cy="component-registryUrlInput"
/>
<div class="help-block" ng-show="$ctrl.registryFormCustom.registry_url.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormCustom.registry_url.$error">
@ -70,7 +89,15 @@
<div class="form-group">
<label for="registry_username" class="col-sm-3 col-lg-2 control-label required text-left">Username</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required />
<input
type="text"
class="form-control"
id="registry_username"
name="registry_username"
ng-model="$ctrl.model.Username"
required
data-cy="component-registryUsernameInput"
/>
<div class="help-block" ng-show="$ctrl.registryFormCustom.registry_username.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormCustom.registry_username.$error">

@ -13,7 +13,16 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="dockerhub-prod-us" required />
<input
type="text"
class="form-control"
id="registry_name"
name="registry_name"
ng-model="$ctrl.model.Name"
placeholder="dockerhub-prod-us"
required
data-cy="component-registryName"
/>
<div class="help-block" ng-show="$ctrl.registryFormDockerhub.registry_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormDockerhub.registry_name.$error">
@ -35,7 +44,7 @@
<div class="form-group">
<label for="registry_username" class="col-sm-3 col-lg-2 control-label required text-left">DockerHub username</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required />
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required data-cy="component-registryUsername" />
<div class="help-block" ng-show="$ctrl.registryFormDockerhub.registry_username.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormDockerhub.registry_username.$error">

@ -13,7 +13,7 @@
<div class="form-group">
<label for="registry_username" class="col-sm-3 col-lg-2 control-label required text-left">Username</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required />
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required data-cy="registry-username-input" />
<div class="help-block" ng-show="registryFormGitlab.registry_username.$invalid">
<div class="small text-warning">
<div ng-messages="registryFormGitlab.registry_username.$error">
@ -76,7 +76,16 @@
<portainer-tooltip message="'URL of Gitlab instance.'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="instance_url" name="instance_url" ng-model="$ctrl.model.Gitlab.InstanceURL" placeholder="https://gitlab.com" required />
<input
type="text"
class="form-control"
id="instance_url"
name="instance_url"
ng-model="$ctrl.model.Gitlab.InstanceURL"
placeholder="https://gitlab.com"
required
data-cy="instance-url-input"
/>
<div class="help-block" ng-show="registryFormGitlab.instance_url.$invalid">
<div class="small text-warning">
<div ng-messages="registryFormGitlab.instance_url.$error">
@ -97,7 +106,16 @@
<portainer-tooltip message="'URL of Gitlab registry instance.'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_url" name="registry_url" ng-model="$ctrl.model.URL" placeholder="https://registry.gitlab.com" required />
<input
type="text"
class="form-control"
id="registry_url"
name="registry_url"
ng-model="$ctrl.model.URL"
placeholder="https://registry.gitlab.com"
required
data-cy="registry-url-input"
/>
<div class="help-block" ng-show="registryFormGitlab.registry_url.$invalid">
<div class="small text-warning">
<div ng-messages="registryFormGitlab.registry_url.$error">

@ -11,7 +11,17 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="proget-registry" required auto-focus />
<input
type="text"
class="form-control"
id="registry_name"
name="registry_name"
ng-model="$ctrl.model.Name"
placeholder="proget-registry"
required
auto-focus
data-cy="registry-name-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormProGet.registry_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormProGet.registry_name.$error">
@ -36,7 +46,16 @@
<portainer-tooltip message="'The URL of the ProGet registry including the Feed name'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_url" name="registry_url" ng-model="$ctrl.model.URL" placeholder="proget.example.com/example-registry" required />
<input
type="text"
class="form-control"
id="registry_url"
name="registry_url"
ng-model="$ctrl.model.URL"
placeholder="proget.example.com/example-registry"
required
data-cy="registry-url-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormProGet.registry_url.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormProGet.registry_url.$error">
@ -57,7 +76,16 @@
<portainer-tooltip message="'The base URL of the ProGet registry'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_base_url" name="registry_base_url" ng-model="$ctrl.model.BaseURL" placeholder="proget.example.com" required />
<input
type="text"
class="form-control"
id="registry_base_url"
name="registry_base_url"
ng-model="$ctrl.model.BaseURL"
placeholder="proget.example.com"
required
data-cy="registry-base-url-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormProGet.registry_base_url.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormProGet.registry_base_url.$error">
@ -76,7 +104,7 @@
<div class="form-group">
<label for="registry_username" class="col-sm-3 col-lg-2 control-label required text-left">Username</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required />
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required data-cy="registry-username-input" />
<div class="help-block" ng-show="$ctrl.registryFormProGet.registry_username.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormProGet.registry_username.$error">

@ -4,7 +4,7 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="Quay" required />
<input type="text" class="form-control" id="registry_name" name="registry_name" ng-model="$ctrl.model.Name" placeholder="Quay" required data-cy="registry-name-input" />
<div class="help-block" ng-show="$ctrl.registryFormQuay.registry_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormQuay.registry_name.$error">
@ -26,7 +26,16 @@
<div class="form-group">
<label for="registry_username" class="col-sm-3 col-lg-2 control-label required text-left">Username</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_username" name="registry_username" ng-model="$ctrl.model.Username" required auto-focus />
<input
type="text"
class="form-control"
id="registry_username"
name="registry_username"
ng-model="$ctrl.model.Username"
required
auto-focus
data-cy="registry-username-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormQuay.registry_username.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormQuay.registry_username.$error">
@ -76,7 +85,15 @@
<div class="form-group">
<label for="organisation_name" class="col-sm-3 col-lg-2 control-label required text-left">Organization name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="organisation_name" name="organisation_name" ng-model="$ctrl.model.Quay.organisationName" required />
<input
type="text"
class="form-control"
id="organisation_name"
name="organisation_name"
ng-model="$ctrl.model.Quay.organisationName"
required
data-cy="registry-organisation-name-input"
/>
<div class="help-block" ng-show="$ctrl.registryFormQuay.organisation_name.$invalid">
<div class="small text-warning">
<div ng-messages="$ctrl.registryFormQuay.organisation_name.$error">

@ -16,7 +16,16 @@
<div class="form-group">
<label for="template_name" class="col-sm-2 control-label text-left">Name</label>
<div class="col-sm-6">
<input type="text" name="template_name" class="form-control" ng-model="$ctrl.formValues.name" ng-pattern="$ctrl.nameRegex" placeholder="e.g. myStack" required />
<input
type="text"
name="template_name"
class="form-control"
ng-model="$ctrl.formValues.name"
ng-pattern="$ctrl.nameRegex"
placeholder="e.g. myStack"
required
data-cy="stack-name-input"
/>
<div class="form-group" ng-if="stackTemplateForm.template_name.$invalid">
<div class="col-sm-12 small text-warning">
<div ng-messages="stackTemplateForm.template_name.$error">
@ -39,8 +48,8 @@
<portainer-tooltip ng-if="var.description" message="var.description"></portainer-tooltip>
</label>
<div class="col-sm-6">
<input type="text" class="form-control" ng-if="!var.select" ng-model="var.value" id="field_{{ $index }}" />
<select class="form-control" ng-if="var.select" ng-model="var.value" id="field_{{ $index }}">
<input type="text" class="form-control" ng-if="!var.select" ng-model="var.value" id="field_{{ $index }}" data-cy="stackFromTemplateForm-input" />
<select class="form-control" ng-if="var.select" ng-model="var.value" id="field_{{ $index }}" data-cy="stackFromTemplateForm-select">
<option selected disabled hidden value="">Select value</option>
<option ng-repeat="choice in var.select" value="{{ choice.value }}">{{ choice.text }}</option>
</select>

@ -4,7 +4,15 @@
<div class="form-group">
<label for="azure_credential_appid" class="col-sm-3 col-lg-2 control-label text-left">Application ID</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" name="azure_credential_appid" ng-model="$ctrl.applicationId" placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" required />
<input
type="text"
class="form-control"
name="azure_credential_appid"
ng-model="$ctrl.applicationId"
placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
required
data-cy="azure-credential-appid-input"
/>
</div>
</div>
<!-- !applicationId-input -->
@ -12,7 +20,15 @@
<div class="form-group">
<label for="azure_credential_tenantid" class="col-sm-3 col-lg-2 control-label text-left">Tenant ID</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" name="azure_credential_tenantid" ng-model="$ctrl.tenantId" placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" required />
<input
type="text"
class="form-control"
name="azure_credential_tenantid"
ng-model="$ctrl.tenantId"
placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
required
data-cy="azure-credential-tenantid-input"
/>
</div>
</div>
<!-- !tenantId-input -->
@ -22,6 +38,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="azure-credential-authkey-input"
class="form-control"
name="azure_credential_authkey"
ng-model="$ctrl.authenticationKey"

@ -65,6 +65,7 @@
ng-disabled="$ctrl.settings.OAuthAutoMapTeamMemberships"
ng-model="$ctrl.settings.DefaultTeamID"
ng-options="team.Id as team.Name for team in $ctrl.teams"
data-cy="default-team-select"
>
<option value="">No team</option>
</select>
@ -106,7 +107,14 @@
</label>
<div class="col-sm-9 col-lg-10">
<div class="col-xs-11 col-lg-10">
<input type="text" class="form-control" id="oauth_token_claim_name" ng-model="$ctrl.settings.TeamMemberships.OAuthClaimName" placeholder="groups" />
<input
type="text"
class="form-control"
id="oauth_token_claim_name"
ng-model="$ctrl.settings.TeamMemberships.OAuthClaimName"
placeholder="groups"
data-cy="oauth-token-claim-name"
/>
</div>
</div>
</div>
@ -122,13 +130,14 @@
<div class="col-sm-12 form-inline" ng-repeat="mapping in $ctrl.settings.TeamMemberships.OAuthClaimMappings" style="margin-top: 0.75em">
<div class="input-group input-group-sm col-sm-5">
<span class="input-group-addon">claim value regex</span>
<input type="text" class="form-control" ng-model="mapping.ClaimValRegex" />
<input type="text" class="form-control" ng-model="mapping.ClaimValRegex" data-cy="claim-value-regex" />
</div>
<span style="margin: 0px 0.5em">maps to</span>
<div class="input-group input-group-sm col-sm-3 col-lg-4">
<span class="input-group-addon">team</span>
<select
class="form-control"
data-cy="team-select"
ng-init="mapping.Team = mapping.Team || $ctrl.settings.DefaultTeamID"
ng-model="mapping.Team"
ng-options="team.Id as team.Name for team in $ctrl.teams"
@ -159,7 +168,7 @@
<div class="col-sm-9" ng-if="$ctrl.teams.length > 0">
<div class="col-xs-11">
<select class="form-control" ng-model="$ctrl.settings.DefaultTeamID" ng-options="team.Id as team.Name for team in $ctrl.teams">
<select class="form-control" ng-model="$ctrl.settings.DefaultTeamID" ng-options="team.Id as team.Name for team in $ctrl.teams" data-cy="default-team-select">
<option value="">No team</option>
</select>
</div>
@ -191,9 +200,7 @@
</div>
<div class="form-group">
<label for="oauth_client_secret" class="col-sm-3 col-lg-2 control-label text-left">
{{ $ctrl.state.provider == 'microsoft' ? 'Application key' : 'Client secret' }}
</label>
<label for="oauth_client_secret" class="col-sm-3 col-lg-2 control-label text-left"> {{ $ctrl.state.provider == 'microsoft' ? 'Application key' : 'Client secret' }} </label>
<div class="col-sm-9 col-lg-10">
<input
type="password"
@ -217,6 +224,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-authorization-uri"
class="form-control"
id="oauth_authorization_uri"
ng-model="$ctrl.settings.AuthorizationURI"
@ -235,6 +243,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-access-token-uri"
class="form-control"
id="oauth_access_token_uri"
ng-model="$ctrl.settings.AccessTokenURI"
@ -253,6 +262,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-resource-uri"
class="form-control"
id="oauth_resource_uri"
ng-model="$ctrl.settings.ResourceURI"
@ -273,6 +283,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-redirect-uri"
class="form-control"
id="oauth_redirect_uri"
ng-model="$ctrl.settings.RedirectURI"
@ -293,6 +304,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-logout-url"
class="form-control"
id="oauth_logout_url"
ng-model="$ctrl.settings.LogoutURI"
@ -312,6 +324,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-user-identifier"
class="form-control"
id="oauth_user_identifier"
ng-model="$ctrl.settings.UserIdentifier"
@ -332,6 +345,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-scopes"
class="form-control"
id="oauth_scopes"
ng-model="$ctrl.settings.Scopes"
@ -364,6 +378,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-microsoft-tenant-id"
class="form-control"
id="oauth_microsoft_tenant_id"
placeholder="xxxxxxxxxxxxxxxxxxxx"
@ -386,6 +401,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="oauth-client-id"
id="oauth_client_id"
ng-model="$ctrl.settings.ClientID"
placeholder="xxxxxxxxxxxxxxxxxxxx"
@ -397,9 +413,7 @@
</div>
<div class="form-group">
<label for="oauth_client_secret" class="col-sm-3 col-lg-2 control-label text-left">
{{ $ctrl.state.provider == 'microsoft' ? 'Application key' : 'Client secret' }}
</label>
<label for="oauth_client_secret" class="col-sm-3 col-lg-2 control-label text-left"> {{ $ctrl.state.provider == 'microsoft' ? 'Application key' : 'Client secret' }} </label>
<div class="col-sm-9 col-lg-10">
<input
type="password"

@ -9,6 +9,7 @@ export const fileUploadField = r2a(FileUploadField, [
'required',
'accept',
'inputId',
'data-cy',
'color',
'name',
]);

@ -78,6 +78,7 @@ export const ngModule = angular
'buttonText',
'className',
'buttonClassName',
'data-cy',
])
)
.component(
@ -224,6 +225,7 @@ export const ngModule = angular
'onChange',
'value',
'height',
'data-cy',
])
)
.component(

@ -6,7 +6,7 @@
<div class="col-sm-12 vertical-center">
<label for="tls" class="control-label !pt-0 text-left"> Automatic user provisioning </label>
<label class="switch my-0 ml-6">
<input type="checkbox" ng-model="$ctrl.ngModel" />
<input type="checkbox" ng-model="$ctrl.ngModel" data-cy="auto-user-provision-toggle" />
<span class="slider round"></span>
</label>
</div>

@ -48,6 +48,7 @@
<div ng-repeat="url in $ctrl.settings.URLs track by $index" style="display: flex; margin-bottom: 10px">
<input
type="text"
data-cy="ldap-url"
class="form-control"
id="ldap_url"
ng-model="$ctrl.settings.URLs[$index]"
@ -77,6 +78,7 @@
<div class="col-sm-9">
<input
type="text"
data-cy="ldap-username"
class="form-control"
id="ldap_username"
ng-model="$ctrl.settings.ReaderDN"

@ -17,6 +17,7 @@
<div class="col-sm-8 col-md-4">
<input
type="text"
data-cy="ldap-admin-group-basedn"
class="form-control"
id="ldap_admin_group_basedn_{{ $index }}"
ng-model="config.GroupBaseDN"
@ -35,6 +36,7 @@
<div class="col-sm-8 col-md-4">
<input
type="text"
data-cy="ldap-admin-group-att"
class="form-control"
id="ldap_admin_group_att_{{ $index }}"
ng-model="config.GroupAttribute"
@ -54,6 +56,7 @@
<div class="col-sm-8 col-md-10 vertical-center">
<input
type="text"
data-cy="ldap-admin-group-filter"
class="form-control"
id="ldap_admin_group_filter_{{ $index }}"
ng-model="config.GroupFilter"
@ -102,7 +105,14 @@
Assign admin rights to group(s)
</label>
<label class="switch my-0 ml-7" ng-class="{ 'business limited': $ctrl.isLimitedFeatureSelfContained }">
<input id="admin-auto-populate" ng-disabled="!$ctrl.enableAssignAdminGroup" name="admin-auto-populate" type="checkbox" ng-model="$ctrl.settings.AdminAutoPopulate" />
<input
id="admin-auto-populate"
ng-disabled="!$ctrl.enableAssignAdminGroup"
name="admin-auto-populate"
type="checkbox"
ng-model="$ctrl.settings.AdminAutoPopulate"
data-cy="admin-auto-populate"
/>
<span class="slider round before:content-['']"></span>
</label>
</div>

@ -12,7 +12,14 @@
<portainer-tooltip message="'The distinguished name of the element from which the LDAP server will search for groups.'"></portainer-tooltip>
</label>
<div class="col-sm-8 col-md-4">
<input type="text" class="form-control" id="ldap_group_basedn_{{ $index }}" ng-model="config.GroupBaseDN" placeholder="dc=ldap,dc=domain,dc=tld" />
<input
type="text"
class="form-control"
id="ldap_group_basedn_{{ $index }}"
ng-model="config.GroupBaseDN"
placeholder="dc=ldap,dc=domain,dc=tld"
data-cy="ldap-group-basedn-input"
/>
</div>
<label for="ldap_group_att_{{ $index }}" class="col-sm-4 col-md-2 control-label text-left">
@ -20,7 +27,7 @@
<portainer-tooltip message="'LDAP attribute which denotes the group membership.'"></portainer-tooltip>
</label>
<div class="col-sm-8 col-md-4">
<input type="text" class="form-control" id="ldap_group_att_{{ $index }}" ng-model="config.GroupAttribute" placeholder="member" />
<input type="text" class="form-control" id="ldap_group_att_{{ $index }}" ng-model="config.GroupAttribute" placeholder="member" data-cy="ldap-group-attribute-input" />
</div>
</div>
<div class="form-group">
@ -29,7 +36,14 @@
<portainer-tooltip message="'The LDAP search filter used to select group elements, optional.'"></portainer-tooltip>
</label>
<div class="col-sm-8 col-md-10 vertical-center">
<input type="text" class="form-control" id="ldap_group_filter_{{ $index }}" ng-model="config.GroupFilter" placeholder="(objectClass=account)" />
<input
type="text"
class="form-control"
id="ldap_group_filter_{{ $index }}"
ng-model="config.GroupFilter"
placeholder="(objectClass=account)"
data-cy="ldap-group-filter-input"
/>
<button class="btn btn-md btn-danger" type="button" ng-click="$ctrl.onRemoveClick($index)" ng-if="$index > 0">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
</button>

@ -12,7 +12,7 @@
<portainer-tooltip message="'The distinguished name of the element from which the LDAP server will search for users.'"></portainer-tooltip>
</label>
<div class="col-sm-8 col-md-4">
<input type="text" class="form-control" id="ldap_basedn_{{ $index }}" ng-model="config.BaseDN" placeholder="dc=ldap,dc=domain,dc=tld" />
<input type="text" class="form-control" id="ldap_basedn_{{ $index }}" ng-model="config.BaseDN" placeholder="dc=ldap,dc=domain,dc=tld" data-cy="ldap-basedn-input" />
</div>
<label for="ldap_username_att_{{ $index }}" class="col-sm-4 col-md-3 col-lg-2 control-label text-left">
@ -20,7 +20,7 @@
<portainer-tooltip message="'LDAP attribute which denotes the username.'"></portainer-tooltip>
</label>
<div class="col-sm-8 col-md-3 col-lg-4">
<input type="text" class="form-control" id="ldap_username_att_{{ $index }}" ng-model="config.UserNameAttribute" placeholder="uid" />
<input type="text" class="form-control" id="ldap_username_att_{{ $index }}" ng-model="config.UserNameAttribute" placeholder="uid" data-cy="ldap-username-attribute-input" />
</div>
</div>
<div class="form-group">
@ -29,7 +29,7 @@
<portainer-tooltip message="'The LDAP search filter used to select user elements, optional.'"></portainer-tooltip>
</label>
<div class="col-sm-8 col-md-10 vertical-center">
<input type="text" class="form-control" id="ldap_filter_{{ $index }}" ng-model="config.Filter" placeholder="(objectClass=account)" />
<input type="text" class="form-control" id="ldap_filter_{{ $index }}" ng-model="config.Filter" placeholder="(objectClass=account)" data-cy="ldap-filter-input" />
<button class="btn btn-md btn-danger" type="button" ng-click="$ctrl.onRemoveClick($index)" ng-if="$index > 0">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
</button>

@ -22,9 +22,7 @@
<div class="form-group">
<label class="col-sm-4 col-md-2 control-label text-left"> Group Base DN </label>
<div class="col-sm-8 col-md-10">
{{ $ctrl.config.GroupBaseDN }}
</div>
<div class="col-sm-8 col-md-10"> {{ $ctrl.config.GroupBaseDN }} </div>
</div>
<div class="form-group">
@ -39,7 +37,14 @@
<div class="w-full px-5 pt-3">
<div class="form-group no-margin-last-child" ng-repeat="entry in $ctrl.groups">
<div class="col-sm-4">
<select class="form-control" ng-model="entry.type" ng-change="$ctrl.onGroupsChange()" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1">
<select
class="form-control"
data-cy="ldap-group-search-item-select"
ng-model="entry.type"
ng-change="$ctrl.onGroupsChange()"
limited-feature-dir="{{::$ctrl.limitedFeatureId}}"
limited-feature-tabindex="-1"
>
<option value="ou">OU Name</option>
<option value="cn">Folder Name</option>
</select>
@ -71,8 +76,6 @@
<div class="form-group no-margin-last-child">
<label class="col-sm-4 col-md-2 control-label text-left"> Group Filter </label>
<div class="col-sm-8 col-md-10">
{{ $ctrl.config.GroupFilter }}
</div>
<div class="col-sm-8 col-md-10"> {{ $ctrl.config.GroupFilter }} </div>
</div>
</div>

@ -21,7 +21,15 @@
<label for="ldap_url" class="col-sm-3 col-lg-2 control-label flex flex-wrap text-left"> LDAP Server </label>
<div class="col-sm-9 col-lg-10">
<div class="mb-3 flex" ng-repeat="url in $ctrl.settings.URLs track by $index">
<input type="text" class="form-control" id="ldap_url" ng-model="$ctrl.settings.URLs[$index]" placeholder="e.g. 10.0.0.10:389 or myldap.domain.tld:389" required />
<input
type="text"
class="form-control"
id="ldap_url"
ng-model="$ctrl.settings.URLs[$index]"
placeholder="e.g. 10.0.0.10:389 or myldap.domain.tld:389"
required
data-cy="ldap-url-input"
/>
<button ng-if="$index > 0" class="btn btn-sm btn-danger" type="button" ng-click="$ctrl.removeLDAPUrl($index)">
<pr-icon icon="'trash-2'" size="'md'"></pr-icon>
</button>
@ -45,7 +53,14 @@
</label>
<div class="col-sm-9 col-lg-10">
<label class="switch">
<input type="checkbox" id="anonymous_mode" ng-model="$ctrl.settings.AnonymousMode" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" />
<input
type="checkbox"
id="anonymous_mode"
ng-model="$ctrl.settings.AnonymousMode"
limited-feature-dir="{{::$ctrl.limitedFeatureId}}"
limited-feature-tabindex="-1"
data-cy="anonymous-mode-checkbox"
/>
<span class="slider round"></span>
</label>
</div>
@ -59,7 +74,7 @@
<portainer-tooltip message="'Account that will be used to search for users.'"></portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="ldap_username" ng-model="$ctrl.settings.ReaderDN" placeholder="cn=user,dc=domain,dc=tld" />
<input type="text" class="form-control" id="ldap_username" ng-model="$ctrl.settings.ReaderDN" placeholder="cn=user,dc=domain,dc=tld" data-cy="ldap-username-input" />
</div>
</div>

@ -18,7 +18,15 @@
<rd-widget-body>
<div class="form-group no-margin-last-child" ng-repeat="entry in $ctrl.entries">
<div class="col-sm-4">
<select class="form-control" ng-model="entry.type" ng-change="$ctrl.onEntriesChange()" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1">
<select
class="form-control"
ng-model="entry.type"
ng-change="$ctrl.onEntriesChange()"
limited-feature-dir="{{::$ctrl.limitedFeatureId}}"
limited-feature-tabindex="-1"
data-cy="ldap-dn-builder-select"
>
>
<option value="ou">OU Name</option>
<option value="cn">Folder Name</option>
</select>

@ -3,6 +3,7 @@
<div class="col-sm-7" style="padding-left: 0">
<input
type="text"
data-cy="group-name-input"
class="form-control"
id="group-name-input"
ng-model="$ctrl.groupName"

@ -40,6 +40,7 @@
<div ng-repeat="url in $ctrl.settings.URLs track by $index" style="display: flex; margin-bottom: 10px">
<input
type="text"
data-cy="ldap-url"
class="form-control"
id="ldap_url"
ng-model="$ctrl.settings.URLs[$index]"
@ -71,7 +72,14 @@
<div class="col-sm-9 col-lg-10">
<label class="switch">
<input type="checkbox" id="anonymous_mode" ng-model="$ctrl.settings.AnonymousMode" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" />
<input
type="checkbox"
id="anonymous_mode"
ng-model="$ctrl.settings.AnonymousMode"
limited-feature-dir="{{::$ctrl.limitedFeatureId}}"
limited-feature-tabindex="-1"
data-cy="ldap-anonymous-mode"
/>
<span class="slider round"></span>
</label>
</div>
@ -88,6 +96,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="ldap-reader-dn"
class="form-control"
id="ldap_username"
ng-model="$ctrl.settings.ReaderDN"
@ -124,6 +133,7 @@
<div class="col-sm-9">
<input
type="text"
data-cy="ldap-domain-root"
class="form-control"
id="ldap_domain_root"
ng-model="$ctrl.domainSuffix"

@ -1,6 +1,4 @@
<div class="col-sm-12 form-section-title">
{{ $ctrl.title || 'LDAP security' }}
</div>
<div class="col-sm-12 form-section-title"> {{ $ctrl.title || 'LDAP security' }} </div>
<!-- starttls -->
<div class="form-group" ng-if="!$ctrl.settings.TLSConfig.TLS">
@ -10,7 +8,7 @@
</label>
<div class="col-sm-9 col-lg-10">
<label class="switch">
<input type="checkbox" ng-model="$ctrl.settings.StartTLS" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" />
<input type="checkbox" ng-model="$ctrl.settings.StartTLS" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" data-cy="starttls-toggle" />
<span class="slider round"></span>
</label>
</div>
@ -25,7 +23,7 @@
</label>
<div class="col-sm-9 col-lg-10">
<label class="switch">
<input type="checkbox" ng-model="$ctrl.settings.TLSConfig.TLS" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" />
<input type="checkbox" ng-model="$ctrl.settings.TLSConfig.TLS" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" data-cy="tls-toggle" />
<span class="slider round"></span>
</label>
</div>
@ -40,7 +38,13 @@
</label>
<div class="col-sm-9 col-lg-10">
<label class="switch">
<input type="checkbox" ng-model="$ctrl.settings.TLSConfig.TLSSkipVerify" limited-feature-dir="{{::$ctrl.limitedFeatureId}}" limited-feature-tabindex="-1" />
<input
type="checkbox"
ng-model="$ctrl.settings.TLSConfig.TLSSkipVerify"
limited-feature-dir="{{::$ctrl.limitedFeatureId}}"
limited-feature-tabindex="-1"
data-cy="tls-skip-verify-toggle"
/>
<span class="slider round"></span>
</label>
</div>

@ -22,6 +22,7 @@
limited-feature-class=" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}"
ng-disabled="{{ $ctrl.isLimitedFeatureSelfContained }}"
limited-feature-tabindex="-1"
data-cy="ldap-test-username"
/>
</div>

@ -62,11 +62,11 @@
<input
id="username"
type="text"
data-cy="auth-usernameInput"
class="form-control"
name="username"
ng-model="ctrl.formValues.Username"
auto-focus
data-cy="auth-usernameInput"
placeholder="Enter your username"
/>
</div>

@ -70,6 +70,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="deviceImport-deviceNameInput"
class="form-control"
name="device_name"
placeholder="e.g. FDO-Test01"
@ -77,7 +78,6 @@
ng-required="state.vouchersUploaded"
ng-disabled="!state.vouchersUploaded"
auto-focus
data-cy="deviceImport-deviceNameInput"
/>
</div>
</div>
@ -104,6 +104,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="deviceImport-suffixInput"
class="form-control"
name="suffix"
ng-model="formValues.Suffix"
@ -112,7 +113,6 @@
ng-pattern="/^[0-9]+$/"
placeholder="1"
required
data-cy="deviceImport-suffixInput"
/>
</div>
</div>
@ -140,6 +140,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="deviceImport-portainerServerUrlInput"
class="form-control"
name="endpoint_url"
ng-model="formValues.PortainerURL"
@ -147,7 +148,6 @@
ng-disabled="!state.vouchersUploaded"
placeholder="e.g. https://10.0.0.10:9443"
required
data-cy="deviceImport-portainerServerUrlInput"
/>
</div>
</div>
@ -167,7 +167,14 @@
<div class="form-group">
<label for="device_profile" class="col-sm-3 col-lg-2 control-label text-left">Device Profile</label>
<div class="col-sm-9 col-lg-10">
<select id="device_profile" ng-model="formValues.DeviceProfile" class="form-control" ng-required="state.vouchersUploaded" ng-disabled="!state.vouchersUploaded">
<select
id="device_profile"
data-cy="deviceImport-deviceProfileSelect"
ng-model="formValues.DeviceProfile"
class="form-control"
ng-required="state.vouchersUploaded"
ng-disabled="!state.vouchersUploaded"
>
<option selected disabled hidden value="">Select a profile for your device</option>
<option ng-repeat="profile in profiles | orderBy: 'name'" ng-value="profile.id">{{ profile.name }}</option>
</select>
@ -190,6 +197,7 @@
<div class="col-sm-9 col-lg-10">
<select
class="form-control"
data-cy="deviceImport-deviceGroupSelect"
ng-options="group.Id as group.Name for group in groups"
ng-model="formValues.GroupId"
id="device_group"

@ -10,7 +10,16 @@
<div class="form-group">
<label for="stack_name" class="col-sm-1 control-label text-left">Name</label>
<div class="col-sm-11">
<input type="text" class="form-control" ng-model="formValues.name" id="profile_name" name="profile_name" placeholder="e.g. myprofile" auto-focus />
<input
type="text"
class="form-control"
ng-model="formValues.name"
id="profile_name"
name="profile_name"
placeholder="e.g. myprofile"
auto-focus
data-cy="profile-name-input"
/>
</div>
</div>
<!-- !name-input -->

@ -10,7 +10,16 @@
<div class="form-group">
<label for="stack_name" class="col-sm-1 control-label text-left">Name</label>
<div class="col-sm-11">
<input type="text" class="form-control" ng-model="formValues.name" id="profile_name" name="profile_name" placeholder="e.g. myprofile" auto-focus />
<input
type="text"
class="form-control"
ng-model="formValues.name"
id="profile_name"
name="profile_name"
placeholder="e.g. myprofile"
auto-focus
data-cy="profile-name-input"
/>
</div>
</div>
<!-- !name-input -->

@ -73,7 +73,14 @@
<div class="form-group">
<label for="container_name" class="col-sm-3 col-lg-2 control-label text-left">Name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="container_name" ng-model="endpoint.Name" placeholder="e.g. kubernetes-cluster01 / docker-prod01" />
<input
type="text"
data-cy="container-name-input"
class="form-control"
id="container_name"
ng-model="endpoint.Name"
placeholder="e.g. kubernetes-cluster01 / docker-prod01"
/>
</div>
</div>
<!-- !name-input -->
@ -93,6 +100,7 @@
<input
ng-disabled="endpointType === 'local' || state.azureEndpoint"
type="text"
data-cy="endpoint-url-input"
class="form-control"
id="endpoint_url"
ng-model="endpoint.URL"
@ -109,7 +117,14 @@
</portainer-tooltip>
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="endpoint_public_url" ng-model="endpoint.PublicURL" placeholder="e.g. 10.0.0.10 or mydocker.mydomain.com" />
<input
type="text"
class="form-control"
id="endpoint_public_url"
ng-model="endpoint.PublicURL"
placeholder="e.g. 10.0.0.10 or mydocker.mydomain.com"
data-cy="public-url-input"
/>
</div>
</div>
@ -138,7 +153,13 @@
<div class="form-group">
<label for="endpoint_group" class="col-sm-3 col-lg-2 control-label text-left"> Group </label>
<div class="col-sm-9 col-lg-10">
<select ng-options="group.Id as group.Name for group in groups" ng-model="endpoint.GroupId" id="endpoint_group" class="form-control"></select>
<select
ng-options="group.Id as group.Name for group in groups"
ng-model="endpoint.GroupId"
id="endpoint_group"
class="form-control"
data-cy="endpoint-group-select"
></select>
</div>
</div>
<!-- !group -->
@ -152,14 +173,30 @@
<div class="form-group">
<label for="endpoint_managementinfoVersion" class="col-sm-3 col-lg-2 control-label text-left"> AMT Version </label>
<div class="col-sm-9 col-lg-10">
<input type="text" ng-disabled="true" class="form-control" id="endpoint_managementinfoVersion" ng-model="endpoint.ManagementInfo['AMT']" placeholder="Loading..." />
<input
type="text"
ng-disabled="true"
class="form-control"
id="endpoint_managementinfoVersion"
ng-model="endpoint.ManagementInfo['AMT']"
placeholder="Loading..."
data-cy="endpoint-managementinfoVersion"
/>
</div>
</div>
<div class="form-group">
<label for="endpoint_managementinfoUUID" class="col-sm-3 col-lg-2 control-label text-left"> UUID </label>
<div class="col-sm-9 col-lg-10">
<input type="text" ng-disabled="true" class="form-control" id="endpoint_managementinfoUUID" ng-model="endpoint.ManagementInfo['UUID']" placeholder="Loading..." />
<input
type="text"
ng-disabled="true"
class="form-control"
id="endpoint_managementinfoUUID"
ng-model="endpoint.ManagementInfo['UUID']"
placeholder="Loading..."
data-cy="endpoint-managementinfoUUID"
/>
</div>
</div>
@ -168,6 +205,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="endpoint-managementinfoBuildNumber"
ng-disabled="true"
class="form-control"
id="endpoint_managementinfoBuildNumber"
@ -182,6 +220,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="endpoint-managementinfoControlMode"
ng-disabled="true"
class="form-control"
id="endpoint_managementinfoControlMode"
@ -196,6 +235,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="endpoint-managementinfoDNSSuffix"
ng-disabled="true"
class="form-control"
id="endpoint_managementinfoDNSSuffix"

@ -36,7 +36,7 @@
<div class="form-group">
<label for="username" class="col-sm-4 control-label text-left"> Username </label>
<div class="col-sm-8">
<input type="text" class="form-control" id="username" ng-model="formValues.Username" placeholder="e.g. admin" />
<input type="text" class="form-control" id="username" ng-model="formValues.Username" placeholder="e.g. admin" data-cy="init-username" />
</div>
</div>
<!-- !username-input -->
@ -92,7 +92,7 @@
<!-- enableTelemetry-->
<div class="form-group">
<div class="col-sm-12 vertical-center">
<input type="checkbox" name="toggle_enableTelemetry" ng-model="formValues.enableTelemetry" />
<input type="checkbox" name="toggle_enableTelemetry" ng-model="formValues.enableTelemetry" data-cy="init-enableTelemetry" />
<span class="text-muted small"
>Allow collection of anonymous statistics. You can find more information about this in our
<a class="hyperlink" href="https://www.portainer.io/documentation/in-app-analytics-and-privacy-policy/" target="_blank">privacy policy</a>.</span
@ -192,12 +192,12 @@
<div class="col-sm-9">
<input
type="password"
data-cy="init-secretAccessKeyInput"
class="form-control"
id="secret_access_key"
name="secret_access_key"
ng-model="formValues.SecretAccessKey"
required
data-cy="init-secretAccessKeyInput"
/>
</div>
</div>
@ -208,12 +208,12 @@
<div class="col-sm-9">
<input
type="text"
data-cy="init-s3RegionInput"
class="form-control"
placeholder="default region is us-east-1 if left empty"
id="backup-s3-region"
name="backup-s3-region"
ng-model="formValues.Region"
data-cy="init-s3RegionInput"
/>
</div>
</div>
@ -235,12 +235,12 @@
<div class="col-sm-9">
<input
type="text"
data-cy="init-s3CompatibleHostInput"
class="form-control"
id="s3-compatible-host"
name="s3-compatible-host"
ng-model="formValues.S3CompatibleHost"
placeholder="leave empty for AWS S3"
data-cy="init-s3CompatibleHostInput"
/>
</div>
</div>
@ -251,12 +251,12 @@
<div class="col-sm-9">
<input
type="text"
data-cy="init-backupFilenameInput"
class="form-control"
id="backup-s3-filename"
name="backup-s3-filename"
ng-model="formValues.Filename"
required
data-cy="init-backupFilenameInput"
/>
</div>
</div>

@ -9,7 +9,7 @@
<div class="form-group">
<label for="registry_name" class="col-sm-3 col-lg-2 control-label text-left">Provider</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" ng-model="$ctrl.provider" disabled />
<input type="text" class="form-control" ng-model="$ctrl.provider" disabled data-cy="registries-provider-input" />
</div>
</div>
@ -19,6 +19,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="registry-name-input"
class="form-control"
id="registry_name"
name="registry_name"
@ -59,6 +60,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="registry-url-input"
class="form-control"
id="registry_url"
name="registry_url"
@ -90,6 +92,7 @@
<div class="col-sm-9 col-lg-10">
<input
type="text"
data-cy="registry-base-url-input"
class="form-control"
id="registry_base_url"
name="registry_base_url"
@ -141,7 +144,15 @@
{{ $ctrl.registry.Type === $ctrl.RegistryTypes.ECR ? 'AWS Access Key' : 'Username' }}
</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="credentials_username" name="credentials_username" ng-model="$ctrl.registry.Username" required />
<input
type="text"
class="form-control"
id="credentials_username"
name="credentials_username"
ng-model="$ctrl.registry.Username"
required
data-cy="registries-username-credential-input"
/>
</div>
</div>
<div class="form-group" ng-show="editRegistry.credentials_username.$invalid">
@ -157,9 +168,7 @@
<!-- !credentials-user -->
<!-- credentials-password -->
<div class="form-group">
<label for="credentials_password" class="col-sm-3 col-lg-2 control-label text-left">
{{ $ctrl.passwordLabel() }}
</label>
<label for="credentials_password" class="col-sm-3 col-lg-2 control-label text-left"> {{ $ctrl.passwordLabel() }} </label>
<div class="col-sm-9 col-lg-10">
<input
type="password"
@ -187,7 +196,16 @@
<div class="form-group">
<label for="registry_region" class="col-sm-3 col-lg-2 control-label required text-left">Region</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="registry_region" name="registry_region" ng-model="$ctrl.registry.Ecr.Region" placeholder="us-west-1" required />
<input
type="text"
class="form-control"
id="registry_region"
name="registry_region"
ng-model="$ctrl.registry.Ecr.Region"
placeholder="us-west-1"
required
data-cy="registries-region-credential-input"
/>
</div>
</div>
<div class="form-group" ng-show="editRegistry.registry_region.$invalid">
@ -224,7 +242,15 @@
<div class="form-group">
<label for="organisation_name" class="col-sm-3 col-lg-2 control-label required text-left">Organization name</label>
<div class="col-sm-9 col-lg-10">
<input type="text" class="form-control" id="organisation_name" name="organisation_name" ng-model="$ctrl.registry.Quay.OrganisationName" required />
<input
type="text"
class="form-control"
id="organisation_name"
name="organisation_name"
ng-model="$ctrl.registry.Quay.OrganisationName"
required
data-cy="registries-organisation-credential-input"
/>
</div>
</div>
<div class="form-group" ng-show="editRegistry.organisation_name.$invalid">

@ -15,6 +15,7 @@
<div class="col-sm-10">
<select
id="user_timeout"
data-cy="user-timeout-select"
class="form-control"
ng-model="settings.UserSessionTimeout"
ng-options="opt.value as opt.key for opt in state.availableUserSessionTimeoutOptions"

@ -11,6 +11,7 @@
<div class="col-sm-11">
<input
type="text"
data-cy="stack-name-input"
class="form-control"
ng-model="formValues.Name"
id="stack_name"

@ -12,6 +12,7 @@
<div class="col-sm-10">
<input
type="text"
data-cy="tag-name-input"
class="form-control"
name="name"
ng-model="formValues.Name"

@ -31,7 +31,7 @@
<div class="form-group">
<label for="container_name" class="col-sm-2 control-label text-left">Name</label>
<div class="col-sm-6">
<input type="text" name="container_name" class="form-control" ng-model="formValues.name" placeholder="e.g. web (optional)" />
<input type="text" name="container_name" class="form-control" ng-model="formValues.name" placeholder="e.g. web (optional)" data-cy="container-name-input" />
</div>
</div>
<!-- !name-input -->
@ -39,7 +39,7 @@
<div class="form-group">
<label for="container_network" class="col-sm-2 control-label text-left">Network</label>
<div class="col-sm-6">
<select class="form-control" ng-options="net.Name for net in availableNetworks | orderBy: 'Name'" ng-model="formValues.network">
<select class="form-control" ng-options="net.Name for net in availableNetworks | orderBy: 'Name'" ng-model="formValues.network" data-cy="network-select">
<option disabled hidden value="">Select a network</option>
</select>
</div>
@ -52,8 +52,8 @@
<portainer-tooltip ng-if="var.description" message="var.description"></portainer-tooltip>
</label>
<div class="col-sm-6">
<input type="text" class="form-control" ng-if="!var.select" ng-model="var.value" id="field_{{ $index }}" />
<select class="form-control" ng-if="var.select" ng-model="var.value" id="field_{{ $index }}">
<input type="text" class="form-control" ng-if="!var.select" ng-model="var.value" id="field_{{ $index }}" data-cy="env-input-{{ $index}" />
<select class="form-control" ng-if="var.select" ng-model="var.value" id="field_{{ $index }}" data-cy="env-select-{{ $index }}">
<option selected disabled hidden value="">Select value</option>
<option ng-repeat="choice in var.select" value="{{ choice.value }}">{{ choice.text }}</option>
</select>
@ -82,14 +82,20 @@
<!-- host-port -->
<div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="portBinding.hostPort" placeholder="e.g. 80 or 1.2.3.4:80 (optional)" />
<input
type="text"
class="form-control"
ng-model="portBinding.hostPort"
placeholder="e.g. 80 or 1.2.3.4:80 (optional)"
data-cy="host-port-input-{{ $index }}"
/>
</div>
<!-- !host-port -->
<pr-icon icon="'arrow-right'"></pr-icon>
<!-- container-port -->
<div class="input-group col-sm-4 input-group-sm">
<span class="input-group-addon">container</span>
<input type="text" class="form-control" ng-model="portBinding.containerPort" placeholder="e.g. 80" />
<input type="text" class="form-control" ng-model="portBinding.containerPort" placeholder="e.g. 80" data-cy="container-port-input-{{ $index }}" />
</div>
<!-- !container-port -->
<!-- protocol-actions -->
@ -125,7 +131,7 @@
<!-- container-path -->
<div class="input-group input-group-sm col-sm-6">
<span class="input-group-addon">container</span>
<input type="text" class="form-control" ng-model="volume.container" placeholder="e.g. /path/in/container" />
<input type="text" class="form-control" ng-model="volume.container" placeholder="e.g. /path/in/container" data-cy="container-path-input-{{ $index }}" />
</div>
<!-- !container-path -->
<!-- volume-type -->
@ -150,7 +156,7 @@
<div class="col-sm-12 input-group">
<span class="input-group-addon">volume</span>
<div class="col-sm-12 input-group">
<select class="form-control" ng-model="volume.bind" ng-options="vol.Name as vol.Name for vol in availableVolumes">
<select class="form-control" ng-model="volume.bind" ng-options="vol.Name as vol.Name for vol in availableVolumes" data-cy="volume-bind-select">
<option value="" disabled selected>Select a volume</option>
</select>
</div>
@ -160,7 +166,7 @@
<!-- bind -->
<div class="input-group input-group-sm col-sm-6" ng-if="volume.type === 'bind'">
<span class="input-group-addon">host</span>
<input type="text" class="form-control" ng-model="volume.bind" placeholder="e.g. /path/on/host" />
<input type="text" class="form-control" ng-model="volume.bind" placeholder="e.g. /path/on/host" data-cy="host-path-input-{{ $index }}" />
</div>
<!-- !bind -->
<!-- read-only -->
@ -192,7 +198,7 @@
<div class="form-inline mt-2" ng-repeat="(idx, host) in state.selectedTemplate.Hosts track by $index">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="state.selectedTemplate.Hosts[idx]" placeholder="e.g. host:IP" />
<input type="text" class="form-control" ng-model="state.selectedTemplate.Hosts[idx]" placeholder="e.g. host:IP" data-cy="host-input-{{ $index }}" />
</div>
<button class="btn btn-light" type="button" ng-click="removeExtraHost($index)">
<pr-icon icon="'trash-2'" class-name="'icon-secondary icon-md'"></pr-icon>
@ -216,11 +222,11 @@
<div class="form-inline mt-2" ng-repeat="label in state.selectedTemplate.Labels">
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">name</span>
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" />
<input type="text" class="form-control" ng-model="label.name" placeholder="e.g. com.example.foo" data-cy="label-name-input-{{ $index }}" />
</div>
<div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">value</span>
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" />
<input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" data-cy="label-value-input-{{ $index }}" />
</div>
<button class="btn btn-light" type="button" ng-click="removeLabel($index)">
<pr-icon icon="'trash-2'" class-name="'icon-secondary icon-md'"></pr-icon>
@ -238,7 +244,14 @@
<div class="form-group mt-4">
<label for="container_hostname" class="col-sm-2 control-label text-left">Hostname</label>
<div class="col-sm-6">
<input type="text" name="container_hostname" class="form-control" ng-model="state.selectedTemplate.Hostname" placeholder="leave empty to use docker default" />
<input
type="text"
name="container_hostname"
class="form-control"
ng-model="state.selectedTemplate.Hostname"
placeholder="leave empty to use docker default"
data-cy="hostname-input"
/>
</div>
</div>
<!-- !hostname -->

@ -16,13 +16,13 @@
<div class="input-group">
<input
type="text"
data-cy="user-usernameInput"
class="form-control"
id="username"
ng-model="formValues.Username"
ng-change="checkUsernameValidity()"
placeholder="e.g. jdoe"
auto-focus
data-cy="user-usernameInput"
/>
<span class="input-group-addon">
<pr-icon mode="'success'" icon="'check'" ng-if="state.validUsername"></pr-icon>

@ -34,6 +34,7 @@ export function DashboardView() {
<DashboardGrid>
<DashboardItem
value={subscriptionsCount as number}
dataCy="subscriptions-count"
isLoading={subscriptionsQuery.isLoading}
isRefetching={subscriptionsQuery.isRefetching}
icon={Subscription}
@ -42,6 +43,7 @@ export function DashboardView() {
{!resourceGroupsQuery.isError && !resourceGroupsQuery.isLoading && (
<DashboardItem
value={resourceGroupsCount}
dataCy="resource-groups-count"
isLoading={resourceGroupsQuery.isLoading}
icon={Package}
type="Resource group"

@ -197,6 +197,7 @@ export function CreateContainerInstanceForm() {
isLoading={isSubmitting}
loadingText="Deployment in progress..."
icon={Plus}
data-cy="aci-create-button"
>
Deploy the container
</LoadingButton>

@ -49,6 +49,7 @@ export function PortsMappingField({
errors={errors}
disabled={disabled}
readOnly={readOnly}
data-cy="aci-ports-mapping"
/>
{typeof errors === 'string' && (
<div className="form-group col-md-12">
@ -65,6 +66,7 @@ function Item({
error,
disabled,
readOnly,
index,
}: ItemProps<PortMapping>) {
return (
<div className={styles.item}>
@ -80,6 +82,7 @@ function Item({
disabled={disabled}
readOnly={readOnly}
type="number"
data-cy={`aci-ports-mapping-host-input_${index}`}
/>
</InputGroup>
@ -98,6 +101,7 @@ function Item({
disabled={disabled}
readOnly={readOnly}
type="number"
data-cy={`aci-ports-mapping-container-port-input_${index}`}
/>
</InputGroup>

@ -82,6 +82,7 @@ export function ItemView() {
id="subscription-input"
value={container.subscriptionName}
readOnly
data-cy="aci-container-subscription-input"
/>
</FormControl>
@ -91,6 +92,7 @@ export function ItemView() {
id="resourceGroup-input"
value={container.resourceGroupName}
readOnly
data-cy="aci-container-resourceGroup-input"
/>
</FormControl>
@ -100,6 +102,7 @@ export function ItemView() {
id="location-input"
value={container.location}
readOnly
data-cy="aci-container-location-input"
/>
</FormControl>
@ -111,6 +114,7 @@ export function ItemView() {
id="name-input"
readOnly
value={container.name}
data-cy="aci-container-name-input"
/>
</FormControl>
@ -120,6 +124,7 @@ export function ItemView() {
id="image-input"
value={container.imageName}
readOnly
data-cy="aci-container-image-input"
/>
</FormControl>
@ -129,6 +134,7 @@ export function ItemView() {
id="os-input"
readOnly
value={container.osType}
data-cy="aci-container-os-input"
/>
</FormControl>
@ -140,6 +146,7 @@ export function ItemView() {
id="public-ip"
readOnly
value={container.ipAddress}
data-cy="aci-container-public-ip"
/>
</FormControl>
@ -153,6 +160,7 @@ export function ItemView() {
placeholder="1"
readOnly
value={container.cpu}
data-cy="aci-container-cpu-input"
/>
</FormControl>
@ -164,6 +172,7 @@ export function ItemView() {
placeholder="1"
readOnly
value={container.memory}
data-cy="aci-container-memory-input"
/>
</FormControl>
</WidgetBody>

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

Loading…
Cancel
Save