From d336a14e502316e09deabb34c558ff6dcf8f0c2c Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Wed, 27 Mar 2024 09:56:00 +0200 Subject: [PATCH] feat(docker/services): show port ranges [EE-4012] (#10657) --- .eslintrc.yml | 2 + app/assets/css/vendor-override.css | 4 + app/docker/react/components/services.ts | 21 +- .../views/services/edit/includes/configs.html | 2 +- .../services/edit/includes/constraints.html | 2 +- .../edit/includes/containerlabels.html | 2 +- .../edit/includes/environmentvariables.html | 6 +- .../views/services/edit/includes/hosts.html | 2 +- .../views/services/edit/includes/image.html | 2 +- .../views/services/edit/includes/logging.html | 2 +- .../views/services/edit/includes/mounts.html | 2 +- .../services/edit/includes/networks.html | 2 +- .../edit/includes/placementPreferences.html | 2 +- .../views/services/edit/includes/ports.html | 108 ------- .../services/edit/includes/resources.html | 2 +- .../views/services/edit/includes/restart.html | 2 +- .../views/services/edit/includes/secrets.html | 2 +- .../services/edit/includes/servicelabels.html | 2 +- .../services/edit/includes/updateconfig.html | 2 +- app/docker/views/services/edit/service.html | 14 +- .../views/services/edit/serviceController.js | 32 +- app/react/components/Widget/Widget.tsx | 21 +- .../components/datatables/TableContainer.tsx | 6 +- .../components/form-components/Checkbox.tsx | 6 +- .../components/form-components/FormError.tsx | 4 + .../form-components/InputList/InputList.tsx | 42 ++- .../PortMappingField/PortsMappingField.tsx | 209 +++++++++++++ .../PortMappingField/RangeOrNumberField.tsx | 127 ++++++++ .../ItemView/PortMappingField/index.ts | 12 + .../PortMappingField/toRequest.test.ts | 118 ++++++++ .../ItemView/PortMappingField/toRequest.ts | 62 ++++ .../PortMappingField/toViewModel.test.ts | 280 ++++++++++++++++++ .../ItemView/PortMappingField/toViewModel.ts | 253 ++++++++++++++++ .../ItemView/PortMappingField/types.ts | 25 ++ .../ItemView/PortMappingField/validation.ts | 64 ++++ .../ItemView/ServiceWidget.stories.tsx | 29 ++ .../services/ItemView/ServiceWidget.tsx | 81 +++++ 37 files changed, 1406 insertions(+), 148 deletions(-) delete mode 100644 app/docker/views/services/edit/includes/ports.html create mode 100644 app/react/docker/services/ItemView/PortMappingField/PortsMappingField.tsx create mode 100644 app/react/docker/services/ItemView/PortMappingField/RangeOrNumberField.tsx create mode 100644 app/react/docker/services/ItemView/PortMappingField/index.ts create mode 100644 app/react/docker/services/ItemView/PortMappingField/toRequest.test.ts create mode 100644 app/react/docker/services/ItemView/PortMappingField/toRequest.ts create mode 100644 app/react/docker/services/ItemView/PortMappingField/toViewModel.test.ts create mode 100644 app/react/docker/services/ItemView/PortMappingField/toViewModel.ts create mode 100644 app/react/docker/services/ItemView/PortMappingField/types.ts create mode 100644 app/react/docker/services/ItemView/PortMappingField/validation.ts create mode 100644 app/react/docker/services/ItemView/ServiceWidget.stories.tsx create mode 100644 app/react/docker/services/ItemView/ServiceWidget.tsx diff --git a/.eslintrc.yml b/.eslintrc.yml index 53e1a3f02..5cc4ad07b 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -140,9 +140,11 @@ overrides: 'react/jsx-no-constructed-context-values': off '@typescript-eslint/no-restricted-imports': off no-restricted-imports: off + 'react/jsx-props-no-spreading': off - files: - app/**/*.stories.* rules: 'no-alert': off '@typescript-eslint/no-restricted-imports': off no-restricted-imports: off + 'react/jsx-props-no-spreading': off diff --git a/app/assets/css/vendor-override.css b/app/assets/css/vendor-override.css index 92f4bac6a..d927ce52d 100644 --- a/app/assets/css/vendor-override.css +++ b/app/assets/css/vendor-override.css @@ -42,6 +42,10 @@ z-index: unset; } +.input-group-sm > .input-group-addon { + line-height: 1; +} + .text-danger { color: var(--ui-error-9); } diff --git a/app/docker/react/components/services.ts b/app/docker/react/components/services.ts index ebac9b128..76eeeb63b 100644 --- a/app/docker/react/components/services.ts +++ b/app/docker/react/components/services.ts @@ -1,12 +1,19 @@ import angular from 'angular'; +import { SchemaOf } from 'yup'; import { r2a } from '@/react-tools/react2angular'; import { withUIRouter } from '@/react-tools/withUIRouter'; import { withCurrentUser } from '@/react-tools/withCurrentUser'; import { ServicesDatatable } from '@/react/docker/services/ListView/ServicesDatatable'; import { TasksDatatable } from '@/react/docker/services/ItemView/TasksDatatable'; +import { + PortsMappingField, + portsMappingUtils, + PortsMappingValues, +} from '@/react/docker/services/ItemView/PortMappingField'; +import { withFormValidation } from '@/react-tools/withFormValidation'; -export const servicesModule = angular +const ngModule = angular .module('portainer.docker.react.components.services', []) .component( 'dockerServiceTasksDatatable', @@ -25,4 +32,14 @@ export const servicesModule = angular 'onRefresh', 'titleIcon', ]) - ).name; + ); + +export const servicesModule = ngModule.name; + +withFormValidation( + ngModule, + withUIRouter(withCurrentUser(PortsMappingField)), + 'dockerServicePortsMappingField', + ['disabled', 'readOnly', 'hasChanges', 'onReset', 'onSubmit'], + portsMappingUtils.validation as unknown as () => SchemaOf +); diff --git a/app/docker/views/services/edit/includes/configs.html b/app/docker/views/services/edit/includes/configs.html index b246c9937..d3c242110 100644 --- a/app/docker/views/services/edit/includes/configs.html +++ b/app/docker/views/services/edit/includes/configs.html @@ -57,7 +57,7 @@