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,