From bb0bbd8a6e074caff15b2cf1f9807688709bbf6d Mon Sep 17 00:00:00 2001 From: BChoudhury-ms Date: Thu, 27 Nov 2025 10:34:08 +0530 Subject: [PATCH] show default copy job name (#2266) --- src/Explorer/ContainerCopy/CopyJobUtils.ts | 39 ++++++++++++++++++- .../Screens/PreviewCopyJob/PreviewCopyJob.tsx | 10 ++++- .../Utils/useCreateCopyJobScreensList.tsx | 2 +- .../ContainerCopy/containerCopyStyles.less | 5 ++- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/Explorer/ContainerCopy/CopyJobUtils.ts b/src/Explorer/ContainerCopy/CopyJobUtils.ts index 1a9e46aad..7f97367db 100644 --- a/src/Explorer/ContainerCopy/CopyJobUtils.ts +++ b/src/Explorer/ContainerCopy/CopyJobUtils.ts @@ -1,5 +1,5 @@ import { DatabaseAccount } from "Contracts/DataModels"; -import { CopyJobErrorType } from "./Types/CopyJobTypes"; +import { CopyJobErrorType, CopyJobType } from "./Types/CopyJobTypes"; const azurePortalMpacEndpoint = "https://ms.portal.azure.com/"; @@ -124,3 +124,40 @@ export function isIntraAccountCopy(sourceAccountId: string | undefined, targetAc sourceAccountDetails?.accountName === targetAccountDetails?.accountName ); } + +export function isEqual(prevJobs: CopyJobType[], newJobs: CopyJobType[]): boolean { + if (prevJobs.length !== newJobs.length) { + return false; + } + return prevJobs.every((prevJob: CopyJobType) => { + const newJob = newJobs.find((job) => job.Name === prevJob.Name); + if (!newJob) { + return false; + } + return prevJob.Status === newJob.Status; + }); +} + +const truncateLength = 5; +const truncateName = (name: string, length: number = truncateLength): string => { + return name.length <= length ? name : name.slice(0, length); +}; + +export function getDefaultJobName( + selectedDatabaseAndContainers: { + sourceDatabaseName?: string; + sourceContainerName?: string; + targetDatabaseName?: string; + targetContainerName?: string; + }[], +): string { + if (selectedDatabaseAndContainers.length === 1) { + const { sourceDatabaseName, sourceContainerName, targetDatabaseName, targetContainerName } = + selectedDatabaseAndContainers[0]; + const timestamp = new Date().getTime().toString(); + const sourcePart = `${truncateName(sourceDatabaseName)}.${truncateName(sourceContainerName)}`; + const targetPart = `${truncateName(targetDatabaseName)}.${truncateName(targetContainerName)}`; + return `${sourcePart}_${targetPart}_${timestamp}`; + } + return ""; +} diff --git a/src/Explorer/ContainerCopy/CreateCopyJob/Screens/PreviewCopyJob/PreviewCopyJob.tsx b/src/Explorer/ContainerCopy/CreateCopyJob/Screens/PreviewCopyJob/PreviewCopyJob.tsx index c270ccdf5..050d696e9 100644 --- a/src/Explorer/ContainerCopy/CreateCopyJob/Screens/PreviewCopyJob/PreviewCopyJob.tsx +++ b/src/Explorer/ContainerCopy/CreateCopyJob/Screens/PreviewCopyJob/PreviewCopyJob.tsx @@ -1,8 +1,9 @@ import { DetailsList, DetailsListLayoutMode, Stack, Text, TextField } from "@fluentui/react"; -import FieldRow from "Explorer/ContainerCopy/CreateCopyJob/Screens/Components/FieldRow"; -import React from "react"; +import React, { useEffect } from "react"; import ContainerCopyMessages from "../../../ContainerCopyMessages"; import { useCopyJobContext } from "../../../Context/CopyJobContext"; +import { getDefaultJobName } from "../../../CopyJobUtils"; +import FieldRow from "../Components/FieldRow"; import { getPreviewCopyJobDetailsListColumns } from "./Utils/PreviewCopyJobUtils"; const PreviewCopyJob: React.FC = () => { @@ -16,6 +17,11 @@ const PreviewCopyJob: React.FC = () => { targetContainerName: copyJobState.target?.containerId, }, ]; + + useEffect(() => { + onJobNameChange(undefined, getDefaultJobName(selectedDatabaseAndContainers)); + }, []); + const jobName = copyJobState.jobName; const onJobNameChange = (_ev?: React.FormEvent, newValue?: string) => { diff --git a/src/Explorer/ContainerCopy/CreateCopyJob/Utils/useCreateCopyJobScreensList.tsx b/src/Explorer/ContainerCopy/CreateCopyJob/Utils/useCreateCopyJobScreensList.tsx index 1b0c74f05..475cca684 100644 --- a/src/Explorer/ContainerCopy/CreateCopyJob/Utils/useCreateCopyJobScreensList.tsx +++ b/src/Explorer/ContainerCopy/CreateCopyJob/Utils/useCreateCopyJobScreensList.tsx @@ -56,7 +56,7 @@ function useCreateCopyJobScreensList() { validations: [ { validate: (state: CopyJobContextState) => - !!(typeof state?.jobName === "string" && state?.jobName && /^[a-zA-Z0-9-.]+$/.test(state?.jobName)), + !!(typeof state?.jobName === "string" && state?.jobName && /^[a-zA-Z0-9-._]+$/.test(state?.jobName)), message: "Please enter a job name to proceed", }, ], diff --git a/src/Explorer/ContainerCopy/containerCopyStyles.less b/src/Explorer/ContainerCopy/containerCopyStyles.less index 25ebb0311..73cb3052f 100644 --- a/src/Explorer/ContainerCopy/containerCopyStyles.less +++ b/src/Explorer/ContainerCopy/containerCopyStyles.less @@ -118,8 +118,9 @@ .jobNameLink { color: @LinkColor; - text-decoration: underline; - cursor: pointer; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } } }