diff --git a/app/docker/views/services/create/createservice.html b/app/docker/views/services/create/createservice.html index 0fe9cf2b7..49527fadb 100644 --- a/app/docker/views/services/create/createservice.html +++ b/app/docker/views/services/create/createservice.html @@ -8,7 +8,7 @@
-
+
@@ -18,8 +18,8 @@ Scheduling
-
- -
+
+ +
-
- - +
+ +
+ +
Ports configuration
-
- - - map additional port - + +
+ map additional port
diff --git a/app/docker/views/services/edit/includes/configs.html b/app/docker/views/services/edit/includes/configs.html index 386652f2f..dd152d93e 100644 --- a/app/docker/views/services/edit/includes/configs.html +++ b/app/docker/views/services/edit/includes/configs.html @@ -4,7 +4,7 @@
Add a config: - add config diff --git a/app/docker/views/services/edit/includes/container-specs.html b/app/docker/views/services/edit/includes/container-specs.html index 44000d42d..181c2e1c7 100644 --- a/app/docker/views/services/edit/includes/container-specs.html +++ b/app/docker/views/services/edit/includes/container-specs.html @@ -2,10 +2,10 @@ - +
- + diff --git a/app/docker/views/services/edit/includes/logging.html b/app/docker/views/services/edit/includes/logging.html index 6ec1e0c47..81bb5911b 100644 --- a/app/docker/views/services/edit/includes/logging.html +++ b/app/docker/views/services/edit/includes/logging.html @@ -4,7 +4,7 @@
Driver: - @@ -22,7 +22,7 @@
-
CMDCMD {{ service.Command | command }}
+
name diff --git a/app/docker/views/services/edit/includes/mounts.html b/app/docker/views/services/edit/includes/mounts.html index 206ea42d2..906c4e2ee 100644 --- a/app/docker/views/services/edit/includes/mounts.html +++ b/app/docker/views/services/edit/includes/mounts.html @@ -9,7 +9,7 @@

There are no mounts for this service.

- +
@@ -20,11 +20,11 @@ - - + - -
Type
+
- + + + + +
+
Source is required.
- - - -
Source is required.
+ -
Target is required.
+
+
Target is required.
- + - diff --git a/app/docker/views/services/edit/includes/networks.html b/app/docker/views/services/edit/includes/networks.html index 8ec0294b0..94a396cd3 100644 --- a/app/docker/views/services/edit/includes/networks.html +++ b/app/docker/views/services/edit/includes/networks.html @@ -23,7 +23,7 @@ - diff --git a/app/docker/views/services/edit/includes/ports.html b/app/docker/views/services/edit/includes/ports.html index 9ff9fa956..54da2a584 100644 --- a/app/docker/views/services/edit/includes/ports.html +++ b/app/docker/views/services/edit/includes/ports.html @@ -25,7 +25,7 @@
- host + host
- container + container
- diff --git a/app/docker/views/services/edit/includes/restart.html b/app/docker/views/services/edit/includes/restart.html index eb4cbed44..c4ae69594 100644 --- a/app/docker/views/services/edit/includes/restart.html +++ b/app/docker/views/services/edit/includes/restart.html @@ -9,7 +9,7 @@
+
diff --git a/app/docker/views/services/edit/includes/updateconfig.html b/app/docker/views/services/edit/includes/updateconfig.html index 6e49a7c0a..2f224e741 100644 --- a/app/docker/views/services/edit/includes/updateconfig.html +++ b/app/docker/views/services/edit/includes/updateconfig.html @@ -2,7 +2,7 @@ - +
@@ -38,8 +38,8 @@
Update Parallelism
Update Failure Action -
-
Order -
+
-
@@ -17,7 +16,7 @@ - + @@ -66,26 +65,29 @@ - - + diff --git a/app/docker/views/services/edit/serviceController.js b/app/docker/views/services/edit/serviceController.js index 7ce4c7f2b..571101cba 100644 --- a/app/docker/views/services/edit/serviceController.js +++ b/app/docker/views/services/edit/serviceController.js @@ -236,6 +236,13 @@ angular.module('portainer.docker').controller('ServiceController', [ updateServiceArray(service, 'ServiceMounts', service.ServiceMounts); }; + $scope.toggleMountReadOnly = function toggleMountReadOnly(isReadOnly, index) { + $scope.$evalAsync(function () { + updateServiceArray($scope.service, 'ServiceMounts', $scope.service.ServiceMounts); + $scope.service.ServiceMounts[index].ReadOnly = isReadOnly; + }); + }; + $scope.addNetwork = function addNetwork(service) { if (!service.Networks) { service.Networks = []; @@ -334,9 +341,11 @@ angular.module('portainer.docker').controller('ServiceController', [ }; $scope.onWebhookChange = function (enabled) { + enabled = enabled | ''; $scope.$evalAsync(() => { $scope.updateWebhook($scope.service); $scope.WebhookExists = enabled; + updateServiceAttribute($scope.service, 'Webhooks', enabled); }); }; @@ -724,6 +733,7 @@ angular.module('portainer.docker').controller('ServiceController', [ $scope.isAdmin = Authentication.isAdmin(); $scope.availableNetworks = data.availableNetworks; $scope.swarmNetworks = _.filter($scope.availableNetworks, (network) => network.Scope === 'swarm'); + $scope.WebhookExists = false; const serviceNetworks = _.uniqBy(_.concat($scope.service.Model.Spec.Networks || [], $scope.service.Model.Spec.TaskTemplate.Networks || []), 'Target'); const networks = _.filter( diff --git a/app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.html b/app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.html index 0b2ba3753..6f667294f 100644 --- a/app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.html +++ b/app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.html @@ -6,6 +6,15 @@ Switch to advanced mode to copy & paste multiple variables +
+ +
-
- -
Environment changes will not take effect until redeployment occurs manually or via webhook. diff --git a/app/portainer/react/components/switch-field.ts b/app/portainer/react/components/switch-field.ts index 4b306328f..bd8743efe 100644 --- a/app/portainer/react/components/switch-field.ts +++ b/app/portainer/react/components/switch-field.ts @@ -5,6 +5,7 @@ import { SwitchField } from '@@/form-components/SwitchField'; export const switchField = r2a(SwitchField, [ 'tooltip', 'checked', + 'index', 'label', 'name', 'labelClass', diff --git a/app/react/components/form-components/SwitchField/Switch.tsx b/app/react/components/form-components/SwitchField/Switch.tsx index 4d815a978..2472a0aca 100644 --- a/app/react/components/form-components/SwitchField/Switch.tsx +++ b/app/react/components/form-components/SwitchField/Switch.tsx @@ -13,8 +13,9 @@ export interface Props { checked: boolean; id: string; name: string; - onChange(checked: boolean): void; + onChange(checked: boolean, index?: number): void; + index?: number; className?: string; dataCy?: string; disabled?: boolean; @@ -28,6 +29,7 @@ export function Switch({ disabled, dataCy, onChange, + index, featureId, className, }: Props) { @@ -47,7 +49,7 @@ export function Switch({ id={id} checked={checked} disabled={disabled || limitedToBE} - onChange={({ target: { checked } }) => onChange(checked)} + onChange={({ target: { checked } }) => onChange(checked, index)} /> diff --git a/app/react/components/form-components/SwitchField/SwitchField.test.tsx b/app/react/components/form-components/SwitchField/SwitchField.test.tsx index cc61f7561..8bfebeaa3 100644 --- a/app/react/components/form-components/SwitchField/SwitchField.test.tsx +++ b/app/react/components/form-components/SwitchField/SwitchField.test.tsx @@ -7,6 +7,7 @@ function renderDefault({ checked = false, label = 'label', onChange = jest.fn(), + index, }: Partial = {}) { return render( ); } @@ -33,5 +35,17 @@ test('clicking should emit on-change with the opposite value', async () => { const switchElem = await findByRole('checkbox'); fireEvent.click(switchElem); - expect(onChange).toHaveBeenCalledWith(!checked); + expect(onChange).toHaveBeenCalledWith(!checked, undefined); +}); + +test('clicking should emit on-change with the opposite value and index', async () => { + const onChange = jest.fn(); + const checked = true; + const index = 3; + const { findByRole } = renderDefault({ onChange, checked, index }); + + const switchElem = await findByRole('checkbox'); + fireEvent.click(switchElem); + + expect(onChange).toHaveBeenCalledWith(!checked, index); }); diff --git a/app/react/components/form-components/SwitchField/SwitchField.tsx b/app/react/components/form-components/SwitchField/SwitchField.tsx index c65276dff..0bd13d008 100644 --- a/app/react/components/form-components/SwitchField/SwitchField.tsx +++ b/app/react/components/form-components/SwitchField/SwitchField.tsx @@ -11,8 +11,9 @@ import { Switch } from './Switch'; export interface Props { label: string; checked: boolean; - onChange(value: boolean): void; + onChange(value: boolean, index?: number): void; + index?: number; name?: string; tooltip?: ComponentProps['message']; setTooltipHtmlMessage?: ComponentProps['setHtmlMessage']; @@ -28,6 +29,7 @@ export function SwitchField({ tooltip, checked, label, + index, name, labelClass, fieldClass, @@ -57,6 +59,7 @@ export function SwitchField({ checked={checked} disabled={disabled} onChange={onChange} + index={index} featureId={featureId} dataCy={dataCy} /> diff --git a/app/react/portainer/access-control/AccessControlPanel/AccessControlPanelDetails.tsx b/app/react/portainer/access-control/AccessControlPanel/AccessControlPanelDetails.tsx index 9b2fcebc2..f89f02a8c 100644 --- a/app/react/portainer/access-control/AccessControlPanel/AccessControlPanelDetails.tsx +++ b/app/react/portainer/access-control/AccessControlPanel/AccessControlPanelDetails.tsx @@ -47,7 +47,7 @@ export function AccessControlPanelDetails({
NameName {{ service.Image }}
- - - {{ webhookURL | truncatelr }} - - - - + + + +
+ + + {{ webhookURL | truncatelr }} + + + + + +
- +
OwnershipOwnership