diff --git a/messages/en.json b/messages/en.json index 05c70903..aeef19ab 100644 --- a/messages/en.json +++ b/messages/en.json @@ -670,6 +670,7 @@ "There are some errors while creating project": "There are some errors while creating project", "This currently only supports SPDX RDF/XML files with a uniq described top level node": "This currently only supports SPDX RDF/XML files with a uniq described top level node", "This function is meant to be followed by a new license import": "This function is meant to be followed by a new license import.", + "This project contains": "This project {name} contains", "This release contains": "This release {name} contains: ", "Title": "Title", "To": "To", diff --git a/src/app/[locale]/projects/components/DeleteProjectDialog.tsx b/src/app/[locale]/projects/components/DeleteProjectDialog.tsx index 80159006..61ac63b8 100644 --- a/src/app/[locale]/projects/components/DeleteProjectDialog.tsx +++ b/src/app/[locale]/projects/components/DeleteProjectDialog.tsx @@ -24,9 +24,17 @@ const DEFAULT_PROJECT_DATA: Project = { 'sw360:releases': [], 'sw360:projects': [], 'sw360:attachments': [], + 'sw360:packages': [], }, } +interface Data { + attachment?: number + project?: number + release?: number + package?: number +} + interface Props { projectId?: string show?: boolean @@ -38,10 +46,12 @@ const DeleteProjectDialog = ({ projectId, show, setShow }: Props) => { const t = useTranslations('default') const router = useRouter() const [project, setProject] = useState(DEFAULT_PROJECT_DATA) + const [internalData, setInternalData] = useState({ attachment: 0, project: 0, release: 0, package: 0 }) const [variant, setVariant] = useState('success') const [message, setMessage] = useState('') const [showMessage, setShowMessage] = useState(false) const [reloadPage, setReloadPage] = useState(false) + const [visuallyHideLinkedData, setVisuallyHideLinkedData] = useState(true) const [comment, setComment] = useState('') const displayMessage = (variant: string, message: string) => { @@ -76,35 +86,27 @@ const DeleteProjectDialog = ({ projectId, show, setShow }: Props) => { } } - const fetchData = useCallback( - async (signal: AbortSignal) => { - if (session) { - const projectsResponse = await ApiUtils.GET(`projects/${projectId}`, session.user.access_token, signal) - if (projectsResponse.status == HttpStatus.OK) { - const project = (await projectsResponse.json()) as Project - setProject(project) - } else if (projectsResponse.status == HttpStatus.UNAUTHORIZED) { - await signOut() - } else { - setProject(DEFAULT_PROJECT_DATA) - handleError() - } + const fetchData = async (projectId: string) => { + if (session) { + const projectsResponse = await ApiUtils.GET(`projects/${projectId}`, session.user.access_token) + if (projectsResponse.status == HttpStatus.OK) { + const projectData = (await projectsResponse.json()) as Project + setProject(projectData) + handleInternalDataCount(projectData) + } else if (projectsResponse.status == HttpStatus.UNAUTHORIZED) { + await signOut() + } else { + setProject(DEFAULT_PROJECT_DATA) + handleError() } - }, - [projectId, handleError, session] - ) + } + } useEffect(() => { - const controller = new AbortController() - const signal = controller.signal - fetchData(signal).catch((err) => { + fetchData(projectId).catch((err) => { console.error(err) }) - - return () => { - controller.abort() - } - }, [show, projectId, fetchData]) + }, [show, projectId]) const handleSubmit = () => { deleteProject().catch((err) => { @@ -116,11 +118,33 @@ const DeleteProjectDialog = ({ projectId, show, setShow }: Props) => { setShow(!show) setShowMessage(false) setComment('') + setVisuallyHideLinkedData(!visuallyHideLinkedData) if (reloadPage === true) { window.location.reload() } } + const handleInternalDataCount = (projectData: Project) => { + const dataCount: Data = {} + if (projectData._embedded['sw360:attachments']) { + dataCount.attachment = projectData._embedded['sw360:attachments'].length + setVisuallyHideLinkedData(false) + } + if (projectData._embedded['sw360:projects']) { + dataCount.project = projectData._embedded['sw360:projects'].length + setVisuallyHideLinkedData(false) + } + if (projectData._embedded['sw360:releases']) { + dataCount.release = projectData._embedded['sw360:releases'].length + setVisuallyHideLinkedData(false) + } + if (projectData._embedded['sw360:packages']) { + dataCount.package = projectData._embedded['sw360:packages'].length + setVisuallyHideLinkedData(false) + } + setInternalData(dataCount) + } + const handleUserComment = (e: any) => { setComment(e.target.value) } @@ -145,6 +169,19 @@ const DeleteProjectDialog = ({ projectId, show, setShow }: Props) => { strong: (data) => {data}, })} +
+ + {t.rich('This project contains', { + name: project.name, + strong: (data) => {data}, + visuallyHideLinkedData, + })} +
    + {Object.entries(internalData).map(([key, value]) => ( +
  • {`${value} linked ${key}`}
  • + ))} +
+

diff --git a/src/object-types/Package.ts b/src/object-types/Package.ts new file mode 100644 index 00000000..2c5f9e72 --- /dev/null +++ b/src/object-types/Package.ts @@ -0,0 +1,28 @@ +// Copyright (C) Siemens AG, 2023. Part of the SW360 Frontend Project. + +// This program and the accompanying materials are made +// available under the terms of the Eclipse Public License 2.0 +// which is available at https://www.eclipse.org/legal/epl-2.0/ + +// SPDX-License-Identifier: EPL-2.0 +// License-Filename: LICENSE + +interface Package { + id?: string + rev?: string + type?: string + name: string + version?: string + purl?: string + packageType?: string + releaseId?: string + licenseIds?: Array + description?: string + homepageUrl?: string + vcs?: string + createdOn?: string + createdBy?: string + packageManager?: string +} + +export default Package diff --git a/src/object-types/Project.ts b/src/object-types/Project.ts index a3f57c78..b5e2ab61 100644 --- a/src/object-types/Project.ts +++ b/src/object-types/Project.ts @@ -9,10 +9,10 @@ // SPDX-License-Identifier: EPL-2.0 // License-Filename: LICENSE -import { Attachment, Links, Release, User } from '@/object-types' +import { Attachment, Links, Package, Release, User } from '@/object-types' interface Project { - id: string + id?: string name: string considerReleasesFromExternalList?: boolean additionalData?: object @@ -58,6 +58,7 @@ interface Project { 'sw360:releases'?: Array 'sw360:attachments'?: Array 'sw360:projects'?: Array + 'sw360:packages'?: Array } } diff --git a/src/object-types/index.ts b/src/object-types/index.ts index 92f4be5a..23a1e3a9 100644 --- a/src/object-types/index.ts +++ b/src/object-types/index.ts @@ -35,6 +35,7 @@ import Moderators from './Moderators' import ModeratorsType from './ModeratorsType' import NodeData from './NodeData' import OAuthClient from './OAuthClient' +import Package from './Package' import Project from './Project' import ProjectReleaseEcc from './ProjectReleaseEcc' import Release from './Release' @@ -85,6 +86,7 @@ export type { ModeratorsType, NodeData, OAuthClient, + Package, Project, ProjectReleaseEcc, Release,