From b4d77bbd780f9c1998c9b42b5f5c76e129b2eb22 Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Thu, 16 May 2024 17:53:13 +0200 Subject: [PATCH 1/7] fix: ensured release is retrieved on deployment recreation Ticket: MEN-7228 Changelog: Title Signed-off-by: Manuel Zedel --- src/js/components/deployments/createdeployment.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/components/deployments/createdeployment.js b/src/js/components/deployments/createdeployment.js index 56cd71ea52..618ded1fa9 100644 --- a/src/js/components/deployments/createdeployment.js +++ b/src/js/components/deployments/createdeployment.js @@ -39,7 +39,7 @@ import DeltaIcon from '../../../assets/img/deltaicon.svg'; import { createDeployment, getDeploymentsConfig } from '../../actions/deploymentActions'; import { getGroupDevices } from '../../actions/deviceActions'; import { advanceOnboarding } from '../../actions/onboardingActions'; -import { getReleases } from '../../actions/releaseActions'; +import { getRelease, getReleases } from '../../actions/releaseActions'; import { ALL_DEVICES } from '../../constants/deviceConstants'; import { onboardingSteps } from '../../constants/onboardingConstants'; import { toggle, validatePhases } from '../../helpers'; @@ -149,6 +149,7 @@ export const CreateDeployment = props => { const { devices = [], group, release } = deploymentObject; if (release) { dispatch(advanceOnboarding(onboardingSteps.SCHEDULING_ARTIFACT_SELECTION)); + dispatch(getRelease(release.name)); } dispatch(advanceOnboarding(onboardingSteps.SCHEDULING_GROUP_SELECTION)); let nextDeploymentObject = { deploymentDeviceCount: devices.length ? devices.length : 0 }; From 0173f1b9ccb045d49b63be9249787faa9db9fdad Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Thu, 16 May 2024 17:54:11 +0200 Subject: [PATCH 2/7] fix: slightly improved deployment recreation to better work with deleted releases, devices, groups Ticket: None Changelog: None Signed-off-by: Manuel Zedel --- src/js/components/deployments/deployments.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/js/components/deployments/deployments.js b/src/js/components/deployments/deployments.js index c8d8fbc289..587847c280 100644 --- a/src/js/components/deployments/deployments.js +++ b/src/js/components/deployments/deployments.js @@ -19,6 +19,8 @@ import { Link, useNavigate } from 'react-router-dom'; import { Button, Tab, Tabs } from '@mui/material'; +import { isUUID } from 'validator'; + import { setSnackbar } from '../../actions/appActions'; import { abortDeployment, setDeploymentsState } from '../../actions/deploymentActions'; import { getDynamicGroups, getGroups } from '../../actions/deviceActions'; @@ -129,14 +131,17 @@ export const Deployments = () => { const retryDeployment = (deployment, deploymentDeviceIds) => { const { artifact_name, name, update_control_map = {} } = deployment; - const release = releases[artifact_name]; + const release = releases[artifact_name] || { name: artifact_name }; const enterpriseSettings = isEnterprise ? { phases: [{ batch_size: 100, start_ts: undefined, delay: 0 }], update_control_map: { states: update_control_map.states || {} } } : {}; - const targetDevicesConfig = name === ALL_DEVICES || groupsById[name] ? { group: name } : { devices: [devicesById[name]] }; + const targetDevicesConfig = + name === ALL_DEVICES || groupsById[name] + ? { group: name } + : { devices: isUUID(name) ? [devicesById[name]] : deploymentDeviceIds.map(id => devicesById[id] ?? { id }) }; const deploymentObject = { deploymentDeviceIds, release, From 5d6942ae00a5507ae306a1a390308a68de8dc86e Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Thu, 30 May 2024 15:49:55 +0200 Subject: [PATCH 3/7] fix: fixed an issue that prevented accessing releases with routing relevant symbols in their name Ticket: MEN-7209 Changelog: Title Signed-off-by: Manuel Zedel --- src/js/components/releases/releasedetails.js | 5 +++-- src/js/utils/locationutils.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/js/components/releases/releasedetails.js b/src/js/components/releases/releasedetails.js index 2e97ea3a17..edd5dfd413 100644 --- a/src/js/components/releases/releasedetails.js +++ b/src/js/components/releases/releasedetails.js @@ -52,6 +52,7 @@ import { removeArtifact, removeRelease, selectRelease, setReleaseTags, updateRel import { DEPLOYMENT_ROUTES } from '../../constants/deploymentConstants'; import { FileSize, customSort, formatTime, toggle } from '../../helpers'; import { getReleaseListState, getReleaseTags, getSelectedRelease, getUserCapabilities } from '../../selectors'; +import { generateReleasesPath } from '../../utils/locationutils'; import useWindowSize from '../../utils/resizehook'; import ChipSelect from '../common/chipselect'; import { ConfirmationButtons, EditButton } from '../common/confirm'; @@ -396,8 +397,8 @@ export const ReleaseDetails = () => { const onRemoveArtifact = artifact => dispatch(removeArtifact(artifact.id)).finally(() => setShowRemoveArtifactDialog(false)); const copyLinkToClipboard = () => { - const location = window.location.href.substring(0, window.location.href.indexOf('/releases') + '/releases'.length); - copy(`${location}/${releaseName}`); + const location = window.location.href.substring(0, window.location.href.indexOf('/releases')); + copy(`${location}${generateReleasesPath({ pageState: { selectedRelease: releaseName } })}`); dispatch(setSnackbar('Link copied to clipboard')); }; diff --git a/src/js/utils/locationutils.js b/src/js/utils/locationutils.js index bc48376883..c4f822d1c7 100644 --- a/src/js/utils/locationutils.js +++ b/src/js/utils/locationutils.js @@ -396,14 +396,15 @@ export const formatReleases = ({ pageState: { searchTerm, selectedTags = [], tab ) .join('&'); -export const generateReleasesPath = ({ pageState: { selectedRelease } }) => `${releasesRoot}${selectedRelease ? `/${selectedRelease}` : ''}`; +export const generateReleasesPath = ({ pageState: { selectedRelease } }) => + `${releasesRoot}${selectedRelease ? `/${encodeURIComponent(selectedRelease)}` : ''}`; export const parseReleasesQuery = (queryParams, extraProps) => { const name = queryParams.has('name') ? queryParams.get('name') : ''; const tab = queryParams.has('tab') ? queryParams.get('tab') : undefined; const tags = queryParams.has('tag') ? queryParams.getAll('tag') : []; const type = queryParams.has('type') ? queryParams.get('type') : ''; - let selectedRelease = extraProps.location.pathname.substring(releasesRoot.length + 1); + let selectedRelease = decodeURIComponent(extraProps.location.pathname.substring(releasesRoot.length + 1)); if (!selectedRelease && extraProps.pageState.id?.length) { selectedRelease = extraProps.pageState.id[0]; } From 39a6971936d0c9eea637bb0b12a1359058be866c Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Thu, 30 May 2024 15:50:45 +0200 Subject: [PATCH 4/7] fix: fixed an issue that prevented the release name explanation tooltip from showing Ticket: None Changelog: None Signed-off-by: Manuel Zedel --- .../dialogs/__snapshots__/artifactinformationform.test.js.snap | 3 +-- src/js/components/releases/dialogs/artifactinformationform.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/js/components/releases/dialogs/__snapshots__/artifactinformationform.test.js.snap b/src/js/components/releases/dialogs/__snapshots__/artifactinformationform.test.js.snap index 13baaa3d57..ed37e90bad 100644 --- a/src/js/components/releases/dialogs/__snapshots__/artifactinformationform.test.js.snap +++ b/src/js/components/releases/dialogs/__snapshots__/artifactinformationform.test.js.snap @@ -935,10 +935,9 @@ label+.emotion-16 { class="MuiFormControl-root emotion-4" >