diff --git a/src/assets/scss/_custom.scss b/src/assets/scss/_custom.scss
index b6803f96a..7da6502bb 100644
--- a/src/assets/scss/_custom.scss
+++ b/src/assets/scss/_custom.scss
@@ -508,3 +508,9 @@ td a.detail-icon {
display: inline;
white-space: nowrap;
}
+
+
+.icon-cellend {
+ float: right;
+ padding-top: 0.3rem;
+}
diff --git a/src/assets/scss/_variables.scss b/src/assets/scss/_variables.scss
index f56286ba9..2e93ce6a2 100644
--- a/src/assets/scss/_variables.scss
+++ b/src/assets/scss/_variables.scss
@@ -36,6 +36,7 @@ $severity-medium: $yellow;
$severity-low: $green;
$severity-info: $blue;
$severity-unassigned: #777777;
+$collection-logic-changed: #0000FF;
$severity-label-bg: $grey-900 !default;
$notification-fail: $red;
@@ -229,6 +230,7 @@ $recessed: $grey-850;
--severity-low: #{$severity-low};
--severity-info: #{$severity-info};
--severity-unassigned: #{$severity-unassigned};
+ --collection-logic-changed: #{$collection-logic-changed};
--notification-fail: #{$notification-fail};
--notification-warn: #{$notification-warn};
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index b878319fd..514d13e08 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -362,6 +362,12 @@
"close": "Schließen",
"code_not_present": "Code nicht vorhanden",
"code_not_reachable": "Code nicht erreichbar",
+ "collectionLogic": "Projektsammlungslogik",
+ "collection_logic_changed": "Projektsammlungslogik geändert",
+ "collection_logic_metrics_by_aggregate_direct_children": "Die Metriken des Sammlungsprojekts werden durch die Aggregation der Zahlen aller direkten untergeordneten Elemente berechnet.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Die Metriken des Sammlungsprojekts werden berechnet, indem die Zahlen aller direkten untergeordneten Elemente mit dem Tag „{tag}“ aggregiert werden.",
+ "collection_logic_metrics_by_aggregate_latest_version": "Die Metriken des Sammlungsprojekts werden durch die Aggregation der Anzahl der neuesten Versionen direkter untergeordneter Elemente berechnet.",
+ "collection_projects": "Projekte in Sammlung",
"comment": "Kommentar",
"comments": "Kommentare",
"component": "Komponente",
@@ -374,9 +380,11 @@
"component_container": "Container",
"component_cpe_desc": "Die CPE v2.2- oder v2.3-URI, wie von MITRE oder NIST bereitgestellt. Für alle Assets (Anwendungen, Betriebssysteme und Hardware) sollte ein CPE angegeben werden",
"component_created": "Komponente erstellt",
+ "component_data": "Daten",
"component_deleted": "Komponente gelöscht",
"component_details": "Komponentendetails",
"component_device": "Gerät",
+ "component_device_driver": "Gerätetreiber",
"component_file": "Datei",
"component_filename_desc": "Gibt den beobachteten Dateinamen der Komponente an",
"component_firmware": "Firmware",
@@ -388,11 +396,14 @@
"component_library": "Bibliothek",
"component_license_expression_desc": "Gibt Lizenzinformationen für die Komponente in Form eines SPDX-Ausdrucks an",
"component_license_url_desc": "Gibt die URL zur Lizenz der Komponente an",
+ "component_machine_learning_model": "Modell des maschinellen Lernens",
"component_name": "Komponentenname",
"component_name_desc": "Der vom Lieferanten angegebene Name der Komponente",
"component_namespace_group_vendor": "Namespace/Gruppe/Anbieter",
+ "component_none_classifier": "Keiner",
"component_operating_system": "Betriebssystem",
"component_package_url_desc": "Für Bibliotheken und Frameworks ist eine gültige Paket-URL erforderlich. PURL-Syntax: pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "Plattform",
"component_properties": "Komponenteneigenschaften",
"component_search": "Komponentensuche",
"component_spdx_license_desc": "Gibt die SPDX-Lizenz-ID der Komponente an",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Portfolio-Schwachstellen",
"profile_update": "Profil aktualisieren",
"profile_updated": "Profil aktualisiert",
+ "project_add_collection_tag": "Summiere Daten von Kindern mit diesem Tag",
"project_cloning_in_progress": "Das Projekt wird mit den angegebenen Klonoptionen erstellt",
+ "project_collection_logic_aggregate_direct_children": "Summiere Daten von direkten Kindern",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Summiere Daten von direkten Kindern mit Tag",
+ "project_collection_logic_desc": "Gibt an, ob das Projekt ein Sammlungsprojekt ist und welche Berechnung für die Metriken verwendet werden soll. Sammlungsprojekte haben keine eigenen Komponenten, sondern zeigen Daten ihrer Kinder an, basierend auf der gewählten Berechnungsart.",
+ "project_collection_logic_latest_version_children": "Summiere Daten direkter Kinder, die als letzte Version markiert sind",
+ "project_collection_logic_none": "Keine",
"project_created": "Projekt erstellt",
"project_delete_message": "Durch das Löschen dieses Projekts werden auch alle zugehörigen untergeordneten Projekte dauerhaft gelöscht. \nDiese Aktion kann nicht rückgängig gemacht werden. \nSind Sie sicher, dass Sie fortfahren möchten?",
"project_delete_title": "Bestätigen Sie die Projektlöschung",
diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json
index efa8b29ab..a5bcdd990 100644
--- a/src/i18n/locales/en.json
+++ b/src/i18n/locales/en.json
@@ -362,6 +362,12 @@
"close": "Close",
"code_not_present": "Code not present",
"code_not_reachable": "Code not reachable",
+ "collectionLogic": "Project Collection Logic",
+ "collection_logic_changed": "Project Collection Logic Changed",
+ "collection_logic_metrics_by_aggregate_direct_children": "Metrics of collection project are calculated by aggregating numbers of all direct children.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Metrics of collection project are calculated by aggregating numbers of direct children with tag '{tag}'.",
+ "collection_logic_metrics_by_aggregate_latest_version": "Metrics of collection project are calculated by aggregating numbers of latest versions of direct children.",
+ "collection_projects": "Collection Projects",
"comment": "Comment",
"comments": "Comments",
"component": "Component",
@@ -374,9 +380,11 @@
"component_container": "Container",
"component_cpe_desc": "The CPE v2.2 or v2.3 URI as provided by MITRE or NIST. All assets (applications, operating systems, and hardware) should have a CPE specified",
"component_created": "Component created",
+ "component_data": "Data",
"component_deleted": "Component deleted",
"component_details": "Component Details",
"component_device": "Device",
+ "component_device_driver": "Device Driver",
"component_file": "File",
"component_filename_desc": "Specifies the observed filename of the component",
"component_firmware": "Firmware",
@@ -388,11 +396,14 @@
"component_library": "Library",
"component_license_expression_desc": "Specifies license information for the component in the form of an SPDX expression",
"component_license_url_desc": "Specifies the URL to the license of the component",
+ "component_machine_learning_model": "Machine Learning Model",
"component_name": "Component name",
"component_name_desc": "The name of the component as provided by the supplier",
"component_namespace_group_vendor": "Namespace / group / vendor",
+ "component_none_classifier": "None",
"component_operating_system": "Operating system",
"component_package_url_desc": "A Valid Package URL is required for libraries and frameworks. PURL syntax: pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "Platform",
"component_properties": "Component Properties",
"component_search": "Component Search",
"component_spdx_license_desc": "Specifies the SPDX license ID of the component",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Portfolio Vulnerabilities",
"profile_update": "Update Profile",
"profile_updated": "Profile updated",
+ "project_add_collection_tag": "Aggregate data of children with this tag",
"project_cloning_in_progress": "The project is being created with the cloning options specified",
+ "project_collection_logic_aggregate_direct_children": "Aggregate direct children",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Aggregate direct children with tag",
+ "project_collection_logic_desc": "Specifies if this project is a collection project and which metrics calculation logic to apply for a collection project. Collection projects do not have own components but display data of their children using one of the available logics.",
+ "project_collection_logic_latest_version_children": "Aggregate direct children marked as latest",
+ "project_collection_logic_none": "None",
"project_created": "Project created",
"project_delete_message": "Deleting this project will also permanently delete all associated child projects. This action cannot be undone. Are you sure you want to proceed?",
"project_delete_title": "Confirm Project Deletion",
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index cd1a6b071..616a36f05 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -362,6 +362,12 @@
"close": "Cerrar",
"code_not_present": "Código no presente",
"code_not_reachable": "Código no accesible",
+ "collectionLogic": "Lógica de recopilación de proyectos",
+ "collection_logic_changed": "Lógica de colección de proyectos cambiada",
+ "collection_logic_metrics_by_aggregate_direct_children": "Las métricas del proyecto de recopilación se calculan sumando los números de todos los hijos directos.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Las métricas del proyecto de recopilación se calculan agregando números de hijos directos con la etiqueta '{tag}'.",
+ "collection_logic_metrics_by_aggregate_latest_version": "Las métricas del proyecto de recopilación se calculan agregando números de las últimas versiones de los hijos directos.",
+ "collection_projects": "Proyectos de colección",
"comment": "Comentario",
"comments": "Comentarios",
"component": "Componente",
@@ -374,9 +380,11 @@
"component_container": "Contenedor",
"component_cpe_desc": "El URI de CPE v2.2 o v2.3 proporcionado por MITRE o NIST. Todos los activos (aplicaciones, sistemas operativos y hardware) deben tener un CPE especificado.",
"component_created": "Componente creado",
+ "component_data": "Datos",
"component_deleted": "Componente eliminado",
"component_details": "Detalles del componente",
"component_device": "Dispositivo",
+ "component_device_driver": "Controlador de dispositivo",
"component_file": "Archivo",
"component_filename_desc": "Especifica el nombre de archivo observado del componente.",
"component_firmware": "Firmware",
@@ -388,11 +396,14 @@
"component_library": "Biblioteca",
"component_license_expression_desc": "Especifica información de licencia para el componente en forma de expresión SPDX.",
"component_license_url_desc": "Especifica la URL de la licencia del componente.",
+ "component_machine_learning_model": "Modelo de aprendizaje automático",
"component_name": "Nombre del componente",
"component_name_desc": "El nombre del componente proporcionado por el proveedor.",
"component_namespace_group_vendor": "Espacio de nombres/grupo/proveedor",
+ "component_none_classifier": "Ninguno",
"component_operating_system": "Sistema operativo",
"component_package_url_desc": "Se requiere una URL de paquete válida para bibliotecas y marcos. Sintaxis PURL: paquete:tipo/espacio de nombres/nombre@versión?calificadores#subruta",
+ "component_platform": "Plataforma",
"component_properties": "Propiedades de los componentes",
"component_search": "Búsqueda de componentes",
"component_spdx_license_desc": "Especifica el ID de licencia SPDX del componente.",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Vulnerabilidades de la cartera",
"profile_update": "Actualización del perfil",
"profile_updated": "Perfil actualizado",
+ "project_add_collection_tag": "Datos agregados de niños con esta etiqueta",
"project_cloning_in_progress": "El proyecto se está creando con las opciones de clonación especificadas.",
+ "project_collection_logic_aggregate_direct_children": "Hijos directos agregados",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Agregar hijos directos con etiqueta",
+ "project_collection_logic_desc": "Especifica si este proyecto es un proyecto de recopilación y qué lógica de cálculo de métricas se aplicará para un proyecto de recopilación. \nLos proyectos de colección no tienen componentes propios pero muestran datos de sus hijos usando una de las lógicas disponibles.",
+ "project_collection_logic_latest_version_children": "Hijos directos agregados marcados como más recientes",
+ "project_collection_logic_none": "Ninguno",
"project_created": "Proyecto creado",
"project_delete_message": "Al eliminar este proyecto, también se eliminarán permanentemente todos los proyectos secundarios asociados. \nEsta acción no se puede deshacer. \n¿Estás seguro de que quieres continuar?",
"project_delete_title": "Confirmar la eliminación del proyecto",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 92d5ce3a1..c4a36a2b1 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -362,6 +362,12 @@
"close": "Fermer",
"code_not_present": "Code non présent",
"code_not_reachable": "Code inaccessible",
+ "collectionLogic": "Logique de collecte de projets",
+ "collection_logic_changed": "La logique de collecte du projet a été modifiée",
+ "collection_logic_metrics_by_aggregate_direct_children": "Les mesures du projet de collecte sont calculées en agrégeant le nombre de tous les enfants directs.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Les métriques du projet de collection sont calculées en agrégeant le nombre d'enfants directs avec la balise « {tag} ».",
+ "collection_logic_metrics_by_aggregate_latest_version": "Les mesures du projet de collection sont calculées en agrégeant le nombre des dernières versions des enfants directs.",
+ "collection_projects": "Projets de collecte",
"comment": "Commentaire",
"comments": "Commentaires",
"component": "Composant",
@@ -374,9 +380,11 @@
"component_container": "Conteneur",
"component_cpe_desc": "L'URI CPE v2.2 ou v2.3 tel que fourni par MITRE ou NIST. Tous les actifs (applications, systèmes d'exploitation et matériels) doivent avoir un CPE spécifié",
"component_created": "Composant créé",
+ "component_data": "Données",
"component_deleted": "Composant supprimé",
"component_details": "Détails des composants",
"component_device": "Équipement",
+ "component_device_driver": "Pilote de périphérique",
"component_file": "Fichier",
"component_filename_desc": "Spécifie le nom de fichier observé du composant",
"component_firmware": "Microprogramme",
@@ -388,11 +396,14 @@
"component_library": "Bibliothèque",
"component_license_expression_desc": "Spécifie les informations de licence pour le composant sous la forme d'une expression SPDX",
"component_license_url_desc": "Spécifie l'URL de la licence du composant",
+ "component_machine_learning_model": "Modèle d'apprentissage automatique",
"component_name": "Nom du composant",
"component_name_desc": "Le nom du composant tel que fourni par le fournisseur",
"component_namespace_group_vendor": "Espace de noms/groupe/fournisseur",
+ "component_none_classifier": "Aucun",
"component_operating_system": "Système d'exploitation",
"component_package_url_desc": "Une PackageURL valide est requise pour les bibliothèques et les frameworks. Syntaxe PURL : pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "Plate-forme",
"component_properties": "Propriétés des composants",
"component_search": "Recherche de composants",
"component_spdx_license_desc": "Spécifie l'ID de licence SPDX du composant",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Vulnérabilités du portefolio",
"profile_update": "Mettre à jour le profil",
"profile_updated": "Profil mis à jour",
+ "project_add_collection_tag": "Agréger les données des enfants avec cette balise",
"project_cloning_in_progress": "Le projet est en cours de création avec les options de clonage spécifiées",
+ "project_collection_logic_aggregate_direct_children": "Agréger les enfants directs",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Agréger les enfants directs avec la balise",
+ "project_collection_logic_desc": "Spécifie si ce projet est un projet de collection et quelle logique de calcul de métriques appliquer pour un projet de collection. \nLes projets de collection n'ont pas de composants propres mais affichent les données de leurs enfants en utilisant l'une des logiques disponibles.",
+ "project_collection_logic_latest_version_children": "Agréger les enfants directs marqués comme les plus récents",
+ "project_collection_logic_none": "Aucun",
"project_created": "Projet créé",
"project_delete_message": "La suppression de ce projet supprimera également définitivement tous les projets enfants associés. \nCette action ne peut pas être annulée. \nÊtes-vous sûr de vouloir continuer ?",
"project_delete_title": "Confirmer la suppression du projet",
diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json
index 70487ab93..90f0d6f18 100644
--- a/src/i18n/locales/hi.json
+++ b/src/i18n/locales/hi.json
@@ -362,6 +362,12 @@
"close": "बंद करना",
"code_not_present": "कोड मौजूद नहीं है",
"code_not_reachable": "कोड उपलब्ध नहीं है",
+ "collectionLogic": "परियोजना संग्रह तर्क",
+ "collection_logic_changed": "प्रोजेक्ट संग्रह तर्क बदल गया",
+ "collection_logic_metrics_by_aggregate_direct_children": "संग्रह परियोजना के मेट्रिक्स की गणना सभी प्रत्यक्ष बच्चों की कुल संख्या द्वारा की जाती है।",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "संग्रह परियोजना के मेट्रिक्स की गणना '{टैग}' टैग वाले प्रत्यक्ष बच्चों की संख्या को एकत्रित करके की जाती है।",
+ "collection_logic_metrics_by_aggregate_latest_version": "संग्रह परियोजना के मेट्रिक्स की गणना प्रत्यक्ष बच्चों के नवीनतम संस्करणों की संख्या को एकत्रित करके की जाती है।",
+ "collection_projects": "संग्रह परियोजनाएँ",
"comment": "टिप्पणी",
"comments": "टिप्पणियाँ",
"component": "अवयव",
@@ -374,9 +380,11 @@
"component_container": "कंटेनर",
"component_cpe_desc": "MITRE या NIST द्वारा प्रदान किया गया CPE v2.2 या v2.3 URI। सभी संपत्तियों (अनुप्रयोग, ऑपरेटिंग सिस्टम और हार्डवेयर) में CPE निर्दिष्ट होना चाहिए",
"component_created": "घटक बनाया गया",
+ "component_data": "डेटा",
"component_deleted": "घटक हटा दिया गया",
"component_details": "घटक विवरण",
"component_device": "डिवाइस",
+ "component_device_driver": "डिवाइस ड्राइवर",
"component_file": "फ़ाइल",
"component_filename_desc": "घटक का प्रेक्षित फ़ाइल नाम निर्दिष्ट करता है",
"component_firmware": "फर्मवेयर",
@@ -388,11 +396,14 @@
"component_library": "लाइब्रेरी",
"component_license_expression_desc": "SPDX अभिव्यक्ति के रूप में घटक के लिए लाइसेंस जानकारी निर्दिष्ट करता है",
"component_license_url_desc": "घटक के लाइसेंस का URL निर्दिष्ट करता है",
+ "component_machine_learning_model": "मशीन लर्निंग मॉडल",
"component_name": "घटक का नाम",
"component_name_desc": "आपूर्तिकर्ता द्वारा प्रदान किया गया घटक का नाम",
"component_namespace_group_vendor": "नामस्थान / समूह / विक्रेता",
+ "component_none_classifier": "कोई नहीं",
"component_operating_system": "ऑपरेटिंग सिस्टम",
"component_package_url_desc": "लाइब्रेरीज़ और फ़्रेमवर्क के लिए एक मान्य पैकेज URL आवश्यक है। PURL सिंटैक्स: pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "प्लैटफ़ॉर्म",
"component_properties": "घटक गुण",
"component_search": "घटक खोज",
"component_spdx_license_desc": "घटक की SPDX लाइसेंस आईडी निर्दिष्ट करता है",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "पोर्टफोलियो की कमजोरियां",
"profile_update": "प्रोफ़ाइल अपडेट करें",
"profile_updated": "प्रोफाइल अद्यतन किया गया",
+ "project_add_collection_tag": "इस टैग के साथ बच्चों का समग्र डेटा",
"project_cloning_in_progress": "परियोजना को निर्दिष्ट क्लोनिंग विकल्पों के साथ बनाया जा रहा है",
+ "project_collection_logic_aggregate_direct_children": "प्रत्यक्ष बच्चों को एकत्रित करें",
+ "project_collection_logic_aggregate_direct_children_with_tag": "टैग के साथ प्रत्यक्ष बच्चों को एकत्रित करें",
+ "project_collection_logic_desc": "निर्दिष्ट करता है कि क्या यह प्रोजेक्ट एक संग्रह प्रोजेक्ट है और संग्रह प्रोजेक्ट के लिए कौन सा मेट्रिक्स गणना तर्क लागू करना है। \nसंग्रह परियोजनाओं में स्वयं के घटक नहीं होते हैं, लेकिन उपलब्ध तर्कों में से किसी एक का उपयोग करके अपने बच्चों का डेटा प्रदर्शित करते हैं।",
+ "project_collection_logic_latest_version_children": "समग्र प्रत्यक्ष बच्चों को नवीनतम के रूप में चिह्नित किया गया",
+ "project_collection_logic_none": "कोई नहीं",
"project_created": "प्रोजेक्ट बनाया गया",
"project_delete_message": "इस प्रोजेक्ट को हटाने से सभी संबद्ध चाइल्ड प्रोजेक्ट भी स्थायी रूप से हटा दिए जाएंगे। \nइस एक्शन को वापस नहीं किया जा सकता। \nक्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
"project_delete_title": "प्रोजेक्ट विलोपन की पुष्टि करें",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index ee254427a..f5272ee3d 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -362,6 +362,12 @@
"close": "Vicino",
"code_not_present": "Codice non presente",
"code_not_reachable": "Codice non raggiungibile",
+ "collectionLogic": "Logica della raccolta dei progetti",
+ "collection_logic_changed": "Logica della raccolta progetti modificata",
+ "collection_logic_metrics_by_aggregate_direct_children": "Le metriche del progetto di raccolta vengono calcolate aggregando i numeri di tutti i figli diretti.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Le metriche del progetto di raccolta vengono calcolate aggregando il numero di figli diretti con tag '{tag}'.",
+ "collection_logic_metrics_by_aggregate_latest_version": "Le metriche del progetto di raccolta vengono calcolate aggregando i numeri delle ultime versioni dei figli diretti.",
+ "collection_projects": "Progetti di raccolta",
"comment": "Commento",
"comments": "Commenti",
"component": "Componente",
@@ -374,9 +380,11 @@
"component_container": "Contenitore",
"component_cpe_desc": "L'URI CPE v2.2 o v2.3 fornito da MITRE o NIST. Per tutte le risorse (applicazioni, sistemi operativi e hardware) deve essere specificato un CPE",
"component_created": "Componente creato",
+ "component_data": "Dati",
"component_deleted": "Componente eliminato",
"component_details": "Dettagli dei componenti",
"component_device": "Dispositivo",
+ "component_device_driver": "Driver del dispositivo",
"component_file": "File",
"component_filename_desc": "Specifica il nome file osservato del componente",
"component_firmware": "Firmware",
@@ -388,11 +396,14 @@
"component_library": "Libreria",
"component_license_expression_desc": "Specifica le informazioni sulla licenza per il componente sotto forma di espressione SPDX",
"component_license_url_desc": "Specifica l'URL della licenza del componente",
+ "component_machine_learning_model": "Modello di apprendimento automatico",
"component_name": "Nome del componente",
"component_name_desc": "Il nome del componente fornito dal fornitore",
"component_namespace_group_vendor": "Spazio dei nomi/gruppo/fornitore",
+ "component_none_classifier": "Nessuno",
"component_operating_system": "Sistema operativo",
"component_package_url_desc": "Per librerie e framework è richiesto un URL del pacchetto valido. Sintassi PURL: pkg:tipo/spazio dei nomi/nome@versione?qualificatori#sottopercorso",
+ "component_platform": "Piattaforma",
"component_properties": "Proprietà del componente",
"component_search": "Ricerca componente",
"component_spdx_license_desc": "Specifica l'ID della licenza SPDX del componente",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Vulnerabilità del portafoglio",
"profile_update": "Aggiorna il profilo",
"profile_updated": "profilo aggiornato",
+ "project_add_collection_tag": "Aggrega i dati dei bambini con questo tag",
"project_cloning_in_progress": "Il progetto viene creato con le opzioni di clonazione specificate",
+ "project_collection_logic_aggregate_direct_children": "Aggregare i figli diretti",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Aggrega i figli diretti con il tag",
+ "project_collection_logic_desc": "Specifica se questo progetto è un progetto di raccolta e quale logica di calcolo delle metriche applicare per un progetto di raccolta. \nI progetti di raccolta non hanno componenti propri ma visualizzano i dati dei propri figli utilizzando una delle logiche disponibili.",
+ "project_collection_logic_latest_version_children": "Figli diretti aggregati contrassegnati come ultimi",
+ "project_collection_logic_none": "Nessuno",
"project_created": "Progetto creato",
"project_delete_message": "L'eliminazione di questo progetto eliminerà definitivamente anche tutti i progetti secondari associati. \nQuesta azione non può essere annullata. \nSei sicuro di voler procedere?",
"project_delete_title": "Conferma l'eliminazione del progetto",
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 87bca4b92..47cc30a25 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -362,6 +362,12 @@
"close": "閉じる",
"code_not_present": "コードが存在しません",
"code_not_reachable": "コードにアクセスできません",
+ "collectionLogic": "プロジェクト収集ロジック",
+ "collection_logic_changed": "プロジェクト収集ロジックの変更",
+ "collection_logic_metrics_by_aggregate_direct_children": "コレクション プロジェクトのメトリクスは、すべての直接の子の数を集計することによって計算されます。",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "コレクション プロジェクトのメトリクスは、タグ「{tag}」を持つ直接の子の数を集計することによって計算されます。",
+ "collection_logic_metrics_by_aggregate_latest_version": "コレクション プロジェクトのメトリックは、直接の子の最新バージョンの数を集計することによって計算されます。",
+ "collection_projects": "コレクションプロジェクト",
"comment": "コメント",
"comments": "コメント",
"component": "コンポーネント",
@@ -374,9 +380,11 @@
"component_container": "コンテナ",
"component_cpe_desc": "MITREまたはNISTによって提供されるCPE v2.2またはv2.3 URI。すべての資産(アプリケーション、オペレーティングシステム、ハードウェア)にはCPEを指定する必要があります。",
"component_created": "コンポーネントが作成されました",
+ "component_data": "データ",
"component_deleted": "コンポーネントが削除されました",
"component_details": "コンポーネントの詳細",
"component_device": "デバイス",
+ "component_device_driver": "デバイスドライバー",
"component_file": "ファイル",
"component_filename_desc": "コンポーネントの監視ファイル名を指定します",
"component_firmware": "ファームウェア",
@@ -388,11 +396,14 @@
"component_library": "ライブラリ",
"component_license_expression_desc": "SPDX式の形式でコンポーネントのライセンス情報を指定します",
"component_license_url_desc": "コンポーネントのライセンスのURLを指定します",
+ "component_machine_learning_model": "機械学習モデル",
"component_name": "コンポーネント名",
"component_name_desc": "サプライヤーから提供されたコンポーネントの名前",
"component_namespace_group_vendor": "名前空間 / グループ / ベンダー",
+ "component_none_classifier": "なし",
"component_operating_system": "オペレーティング システム",
"component_package_url_desc": "ライブラリとフレームワークには有効なパッケージ URL が必要です。PURL 構文: pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "プラットフォーム",
"component_properties": "コンポーネントのプロパティ",
"component_search": "コンポーネント検索",
"component_spdx_license_desc": "コンポーネントのSPDXライセンスIDを指定します",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "ポートフォリオの脆弱性",
"profile_update": "プロフィールを更新",
"profile_updated": "プロフィール更新",
+ "project_add_collection_tag": "このタグを持つ子のデータを集約します",
"project_cloning_in_progress": "プロジェクトは指定されたクローンオプションで作成されています",
+ "project_collection_logic_aggregate_direct_children": "直接の子を集約する",
+ "project_collection_logic_aggregate_direct_children_with_tag": "タグを使用して直接の子を集約する",
+ "project_collection_logic_desc": "このプロジェクトが収集プロジェクトであるかどうか、および収集プロジェクトにどのメトリック計算ロジックを適用するかを指定します。\nコレクション プロジェクトには独自のコンポーネントはありませんが、利用可能なロジックの 1 つを使用して子のデータを表示します。",
+ "project_collection_logic_latest_version_children": "最新としてマークされた直接の子を集約する",
+ "project_collection_logic_none": "なし",
"project_created": "プロジェクトが作成されました",
"project_delete_message": "このプロジェクトを削除すると、関連するすべての子プロジェクトも完全に削除されます。\nこの操作は元に戻すことができません。\n続行してもよろしいですか?",
"project_delete_title": "プロジェクトの削除の確認",
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index b11cc9047..fcc55a9c2 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -362,6 +362,12 @@
"close": "Zamknąć",
"code_not_present": "Brak kodu",
"code_not_reachable": "Kod nieosiągalny",
+ "collectionLogic": "Logika kolekcji projektów",
+ "collection_logic_changed": "Zmieniono logikę kolekcji projektów",
+ "collection_logic_metrics_by_aggregate_direct_children": "Metryki projektu kolekcji są obliczane poprzez agregację liczb wszystkich bezpośrednich elementów podrzędnych.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Metryki projektu kolekcji są obliczane poprzez agregację liczby bezpośrednich elementów podrzędnych ze znacznikiem „{tag}”.",
+ "collection_logic_metrics_by_aggregate_latest_version": "Metryki projektu kolekcji są obliczane poprzez agregację liczby najnowszych wersji bezpośrednich elementów podrzędnych.",
+ "collection_projects": "Projekty kolekcji",
"comment": "Komentarz",
"comments": "Uwagi",
"component": "Część",
@@ -374,9 +380,11 @@
"component_container": "Kontener",
"component_cpe_desc": "Identyfikator URI CPE v2.2 lub v2.3 dostarczony przez MITRE lub NIST. Wszystkie zasoby (aplikacje, systemy operacyjne i sprzęt) powinny mieć określony CPE",
"component_created": "Komponent został utworzony",
+ "component_data": "Dane",
"component_deleted": "Komponent usunięty",
"component_details": "Szczegóły komponentu",
"component_device": "Urządzenie",
+ "component_device_driver": "Sterownik urządzenia",
"component_file": "Plik",
"component_filename_desc": "Określa obserwowaną nazwę pliku komponentu",
"component_firmware": "Oprogramowanie sprzętowe",
@@ -388,11 +396,14 @@
"component_library": "Biblioteka",
"component_license_expression_desc": "Określa informacje licencyjne dla komponentu w formie wyrażenia SPDX",
"component_license_url_desc": "Określa adres URL licencji komponentu",
+ "component_machine_learning_model": "Model uczenia maszynowego",
"component_name": "Nazwa komponentu",
"component_name_desc": "Nazwa komponentu podana przez dostawcę",
"component_namespace_group_vendor": "Przestrzeń nazw / grupa / dostawca",
+ "component_none_classifier": "Nic",
"component_operating_system": "System operacyjny",
"component_package_url_desc": "W przypadku bibliotek i struktur wymagany jest prawidłowy adres URL pakietu. Składnia PURL: pkg:typ/przestrzeń nazw/nazwa@wersja?kwalifikatory#podścieżka",
+ "component_platform": "Platforma",
"component_properties": "Właściwości komponentu",
"component_search": "Wyszukiwanie komponentów",
"component_spdx_license_desc": "Określa identyfikator licencji SPDX komponentu",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Luki w zabezpieczeniach portfela",
"profile_update": "Zaktualizować profil",
"profile_updated": "Profil zaktualizowany",
+ "project_add_collection_tag": "Zbiorcze dane dzieci z tym tagiem",
"project_cloning_in_progress": "Projekt jest tworzony z określonymi opcjami klonowania",
+ "project_collection_logic_aggregate_direct_children": "Zagregowane bezpośrednie dzieci",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Zagreguj bezpośrednie dzieci ze znacznikiem",
+ "project_collection_logic_desc": "Określa, czy ten projekt jest projektem kolekcji i jaką logikę obliczania metryk należy zastosować w projekcie kolekcji. \nProjekty kolekcji nie mają własnych komponentów, ale wyświetlają dane swoich dzieci przy użyciu jednej z dostępnych logiki.",
+ "project_collection_logic_latest_version_children": "Łączne bezpośrednie elementy podrzędne oznaczone jako najnowsze",
+ "project_collection_logic_none": "Nic",
"project_created": "Projekt stworzony",
"project_delete_message": "Usunięcie tego projektu spowoduje również trwałe usunięcie wszystkich powiązanych projektów podrzędnych. \nTej akcji nie można cofnąć. \nCzy na pewno chcesz kontynuować?",
"project_delete_title": "Potwierdź usunięcie projektu",
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 53c8abfd8..26ffe6771 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -362,6 +362,12 @@
"close": "Fechar",
"code_not_present": "Código não presente",
"code_not_reachable": "Código não acessível",
+ "collectionLogic": "Lógica de coleção de projetos",
+ "collection_logic_changed": "Lógica de coleção de projetos alterada",
+ "collection_logic_metrics_by_aggregate_direct_children": "As métricas do projeto de coleta são calculadas agregando o número de todos os filhos diretos.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "As métricas do projeto de coleção são calculadas agregando o número de filhos diretos com a tag '{tag}'.",
+ "collection_logic_metrics_by_aggregate_latest_version": "As métricas do projeto de coleta são calculadas agregando os números das versões mais recentes dos filhos diretos.",
+ "collection_projects": "Projetos de Coleção",
"comment": "Comente",
"comments": "Comentários",
"component": "Componente",
@@ -374,9 +380,11 @@
"component_container": "Contêiner",
"component_cpe_desc": "O URI do CPE v2.2 ou v2.3 conforme fornecido pelo MITRE ou NIST. Todos os ativos (aplicativos, sistemas operacionais e hardware) devem ter um CPE especificado",
"component_created": "Componente criado",
+ "component_data": "Dados",
"component_deleted": "Componente excluído",
"component_details": "Detalhes do componente",
"component_device": "Dispositivo",
+ "component_device_driver": "Driver de dispositivo",
"component_file": "Arquivo",
"component_filename_desc": "Especifica o nome do arquivo observado do componente",
"component_firmware": "Firmware",
@@ -388,11 +396,14 @@
"component_library": "Biblioteca",
"component_license_expression_desc": "Especifica informações de licença do componente na forma de uma expressão SPDX",
"component_license_url_desc": "Especifica o URL para a licença do componente",
+ "component_machine_learning_model": "Modelo de aprendizado de máquina",
"component_name": "Nome do componente",
"component_name_desc": "O nome do componente conforme fornecido pelo fornecedor",
"component_namespace_group_vendor": "Namespace/grupo/fornecedor",
+ "component_none_classifier": "Nenhum",
"component_operating_system": "Sistema operacional",
"component_package_url_desc": "Um URL de pacote válido é necessário para bibliotecas e estruturas. Sintaxe PURL: pkg:tipo/namespace/nome@versão?qualificadores#subcaminho",
+ "component_platform": "Plataforma",
"component_properties": "Propriedades do Componente",
"component_search": "Pesquisa de Componentes",
"component_spdx_license_desc": "Especifica o ID de licença SPDX do componente",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Vulnerabilidades do portfólio",
"profile_update": "Atualizar perfil",
"profile_updated": "perfil atualizado",
+ "project_add_collection_tag": "Dados agregados de crianças com esta tag",
"project_cloning_in_progress": "O projeto está sendo criado com as opções de clonagem especificadas",
+ "project_collection_logic_aggregate_direct_children": "Agregar filhos diretos",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Agregar filhos diretos com tag",
+ "project_collection_logic_desc": "Especifica se este projeto é um projeto de coleção e qual lógica de cálculo de métricas aplicar a um projeto de coleção. \nOs projetos de coleção não possuem componentes próprios, mas exibem os dados de seus filhos utilizando uma das lógicas disponíveis.",
+ "project_collection_logic_latest_version_children": "Agregar filhos diretos marcados como os mais recentes",
+ "project_collection_logic_none": "Nenhum",
"project_created": "Projeto criado",
"project_delete_message": "A exclusão deste projeto também excluirá permanentemente todos os projetos secundários associados. \nEsta ação não pode ser desfeita. \nTem certeza de que deseja prosseguir?",
"project_delete_title": "Confirmar exclusão do projeto",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 439ead554..3ac3c4c6a 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -362,6 +362,12 @@
"close": "Fechar",
"code_not_present": "Código não presente",
"code_not_reachable": "Código não acessível",
+ "collectionLogic": "Lógica de coleção de projetos",
+ "collection_logic_changed": "Lógica de coleção de projetos alterada",
+ "collection_logic_metrics_by_aggregate_direct_children": "As métricas do projeto de coleta são calculadas agregando o número de todos os filhos diretos.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "As métricas do projeto de coleção são calculadas agregando o número de filhos diretos com a tag '{tag}'.",
+ "collection_logic_metrics_by_aggregate_latest_version": "As métricas do projeto de coleta são calculadas agregando os números das versões mais recentes dos filhos diretos.",
+ "collection_projects": "Projetos de Coleção",
"comment": "Comente",
"comments": "Comentários",
"component": "Componente",
@@ -374,9 +380,11 @@
"component_container": "Contêiner",
"component_cpe_desc": "O URI do CPE v2.2 ou v2.3 conforme fornecido pelo MITRE ou NIST. Todos os ativos (aplicativos, sistemas operacionais e hardware) devem ter um CPE especificado",
"component_created": "Componente criado",
+ "component_data": "Dados",
"component_deleted": "Componente excluído",
"component_details": "Detalhes do componente",
"component_device": "Dispositivo",
+ "component_device_driver": "Driver de dispositivo",
"component_file": "Arquivo",
"component_filename_desc": "Especifica o nome do arquivo observado do componente",
"component_firmware": "Firmware",
@@ -388,11 +396,14 @@
"component_library": "Biblioteca",
"component_license_expression_desc": "Especifica informações de licença do componente na forma de uma expressão SPDX",
"component_license_url_desc": "Especifica o URL para a licença do componente",
+ "component_machine_learning_model": "Modelo de aprendizado de máquina",
"component_name": "Nome do componente",
"component_name_desc": "O nome do componente conforme fornecido pelo fornecedor",
"component_namespace_group_vendor": "Namespace/grupo/fornecedor",
+ "component_none_classifier": "Nenhum",
"component_operating_system": "Sistema operacional",
"component_package_url_desc": "Um URL de pacote válido é necessário para bibliotecas e estruturas. Sintaxe PURL: pkg:tipo/namespace/nome@versão?qualificadores#subcaminho",
+ "component_platform": "Plataforma",
"component_properties": "Propriedades do Componente",
"component_search": "Pesquisa de Componentes",
"component_spdx_license_desc": "Especifica o ID de licença SPDX do componente",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Vulnerabilidades do portfólio",
"profile_update": "Atualizar perfil",
"profile_updated": "perfil atualizado",
+ "project_add_collection_tag": "Dados agregados de crianças com esta tag",
"project_cloning_in_progress": "O projeto está sendo criado com as opções de clonagem especificadas",
+ "project_collection_logic_aggregate_direct_children": "Agregar filhos diretos",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Agregar filhos diretos com tag",
+ "project_collection_logic_desc": "Especifica se este projeto é um projeto de coleção e qual lógica de cálculo de métricas aplicar a um projeto de coleção. \nOs projetos de coleção não possuem componentes próprios, mas exibem os dados de seus filhos utilizando uma das lógicas disponíveis.",
+ "project_collection_logic_latest_version_children": "Agregar filhos diretos marcados como os mais recentes",
+ "project_collection_logic_none": "Nenhum",
"project_created": "Projeto criado",
"project_delete_message": "A exclusão deste projeto também excluirá permanentemente todos os projetos secundários associados. \nEsta ação não pode ser desfeita. \nTem certeza de que deseja prosseguir?",
"project_delete_title": "Confirmar exclusão do projeto",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 51ff07db9..1c8818fe2 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -362,6 +362,12 @@
"close": "Закрыть",
"code_not_present": "Код отсутствует",
"code_not_reachable": "Код недоступен",
+ "collectionLogic": "Логика коллекции проектов",
+ "collection_logic_changed": "Изменена логика сбора проектов",
+ "collection_logic_metrics_by_aggregate_direct_children": "Метрики проекта сбора рассчитываются путем агрегирования количества всех прямых дочерних элементов.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Метрики проекта сбора рассчитываются путем агрегирования количества прямых дочерних элементов с тегом «{tag}».",
+ "collection_logic_metrics_by_aggregate_latest_version": "Метрики проекта сбора рассчитываются путем агрегирования количества последних версий прямых дочерних элементов.",
+ "collection_projects": "Коллекционные проекты",
"comment": "Комментарий",
"comments": "Комментарии",
"component": "Компонент",
@@ -374,9 +380,11 @@
"component_container": "Контейнер",
"component_cpe_desc": "URI CPE v2.2 или v2.3, предоставленный MITRE или NIST. Все активы должны иметь указанный CPE",
"component_created": "Компонент создан",
+ "component_data": "Данные",
"component_deleted": "Компонент удален",
"component_details": "Детали компонента",
"component_device": "Устройство",
+ "component_device_driver": "Драйвер устройства",
"component_file": "Файл",
"component_filename_desc": "Указывает наблюдаемое имя файла компонента",
"component_firmware": "Прошивка",
@@ -388,11 +396,14 @@
"component_library": "Библиотека",
"component_license_expression_desc": "Указывает информацию о лицензии компонента в виде выражения SPDX",
"component_license_url_desc": "Указывает URL лицензии компонента",
+ "component_machine_learning_model": "Модель машинного обучения",
"component_name": "Имя компонента",
"component_name_desc": "Название компонента, предоставленное поставщиком",
"component_namespace_group_vendor": "Пространство имен / группа / поставщик",
+ "component_none_classifier": "Никто",
"component_operating_system": "Операционная система",
"component_package_url_desc": "Действительный Package URL требуется для библиотек и фреймворков. Синтаксис PURL: pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "Платформа",
"component_properties": "Свойства компонента",
"component_search": "Поиск компонента",
"component_spdx_license_desc": "Указывает идентификатор лицензии SPDX компонента",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Уязвимости портфеля",
"profile_update": "Обновить профиль",
"profile_updated": "Профиль обновлён",
+ "project_add_collection_tag": "Совокупные данные детей с этим тегом",
"project_cloning_in_progress": "Проект создаётся с указанными параметрами клонирования",
+ "project_collection_logic_aggregate_direct_children": "Агрегировать прямых дочерних элементов",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Объединить прямых дочерних элементов с помощью тега",
+ "project_collection_logic_desc": "Указывает, является ли этот проект проектом сбора и какую логику расчета метрик следует применить для проекта сбора. \nПроекты-коллекции не имеют собственных компонентов, а отображают данные своих дочерних элементов, используя одну из доступных логик.",
+ "project_collection_logic_latest_version_children": "Совокупные прямые дочерние элементы, отмеченные как последние",
+ "project_collection_logic_none": "Никто",
"project_created": "Проект создан",
"project_delete_message": "Удаление этого проекта также приведёт к удалению всех связанных дочерних проектов. Это действие нельзя отменить. Вы уверены, что хотите продолжить?",
"project_delete_title": "Подтвердить удаление проекта",
diff --git a/src/i18n/locales/uk-UA.json b/src/i18n/locales/uk-UA.json
index bbcfd19c6..f0888da5c 100644
--- a/src/i18n/locales/uk-UA.json
+++ b/src/i18n/locales/uk-UA.json
@@ -362,6 +362,12 @@
"close": "Закрити",
"code_not_present": "Код відсутній",
"code_not_reachable": "Код недоступний",
+ "collectionLogic": "Логіка збору проектів",
+ "collection_logic_changed": "Змінено логіку збирання проекту",
+ "collection_logic_metrics_by_aggregate_direct_children": "Показники проекту колекції обчислюються шляхом агрегування чисел усіх прямих дочірніх елементів.",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "Показники проекту колекції обчислюються шляхом агрегування кількості прямих дочірніх елементів із тегом \"{tag}\".",
+ "collection_logic_metrics_by_aggregate_latest_version": "Показники проекту колекції обчислюються шляхом агрегування чисел останніх версій прямих дочірніх елементів.",
+ "collection_projects": "Колекція проектів",
"comment": "коментар",
"comments": "Коментарі",
"component": "компонент",
@@ -374,9 +380,11 @@
"component_container": "Контейнер",
"component_cpe_desc": "URI CPE версії 2.2 або версії 2.3, наданий МІТЕР або NIST. \nУсі активи (додатки, операційні системи та апаратне забезпечення) повинні мати CPE",
"component_created": "Компонент створено",
+ "component_data": "Дані",
"component_deleted": "Компонент видалено",
"component_details": "Деталі компонента",
"component_device": "пристрій",
+ "component_device_driver": "Драйвер пристрою",
"component_file": "Файл",
"component_filename_desc": "Визначає спостережуване ім'я файлу компонента",
"component_firmware": "Прошивка",
@@ -388,11 +396,14 @@
"component_library": "Бібліотека",
"component_license_expression_desc": "Вказує інформацію про ліцензію для компонента у формі виразу SPDX",
"component_license_url_desc": "Вказує URL-адресу ліцензії компонента",
+ "component_machine_learning_model": "Модель машинного навчання",
"component_name": "Назва компонента",
"component_name_desc": "Назва компонента, надана постачальником",
"component_namespace_group_vendor": "Простір імен/група/постачальник",
+ "component_none_classifier": "Жодного",
"component_operating_system": "Операційна система",
"component_package_url_desc": "Для бібліотек і фреймворків потрібна дійсна URL-адреса пакета. \nСинтаксис PURL: pkg:type/namespace/name@version?qualifiers",
+ "component_platform": "Платформа",
"component_properties": "Властивості компонента",
"component_search": "Пошук компонентів",
"component_spdx_license_desc": "Визначає ідентифікатор ліцензії SPDX компонента",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Вразливості портфоліо",
"profile_update": "Оновити профіль",
"profile_updated": "Профіль оновлено",
+ "project_add_collection_tag": "Сукупні дані дітей з цим тегом",
"project_cloning_in_progress": "Проект створюється із зазначеними параметрами клонування",
+ "project_collection_logic_aggregate_direct_children": "Сукупність прямих дітей",
+ "project_collection_logic_aggregate_direct_children_with_tag": "Агрегувати прямі дочірні елементи з тегом",
+ "project_collection_logic_desc": "Визначає, чи є цей проект колекційним проектом і яку логіку обчислення показників застосовувати для колекційного проекту. \nКолекційні проекти не мають власних компонентів, але відображають дані своїх дітей за допомогою однієї з доступних логік.",
+ "project_collection_logic_latest_version_children": "Сукупні прямі дочірні елементи позначено як останні",
+ "project_collection_logic_none": "Жодного",
"project_created": "Проект створено",
"project_delete_message": "Видалення цього проекту призведе до остаточного видалення всіх пов’язаних дочірніх проектів. \nЦю дію не можна скасувати. \nВи впевнені, що бажаєте продовжити?",
"project_delete_title": "Підтвердити видалення проекту",
diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json
index f1acf593b..93a7a31be 100644
--- a/src/i18n/locales/zh.json
+++ b/src/i18n/locales/zh.json
@@ -362,6 +362,12 @@
"close": "关闭",
"code_not_present": "代码不存在",
"code_not_reachable": "代码无法访问",
+ "collectionLogic": "项目集合逻辑",
+ "collection_logic_changed": "项目集合逻辑已更改",
+ "collection_logic_metrics_by_aggregate_direct_children": "收集项目的指标是通过汇总所有直系子女的数量来计算的。",
+ "collection_logic_metrics_by_aggregate_direct_children_with_tags": "收集项目的指标是通过聚合带有标签“{tag}”的直接子项的数量来计算的。",
+ "collection_logic_metrics_by_aggregate_latest_version": "收集项目的指标是通过汇总直接子项的最新版本的数量来计算的。",
+ "collection_projects": "收藏项目",
"comment": "评论",
"comments": "评论",
"component": "组件",
@@ -374,9 +380,11 @@
"component_container": "容器",
"component_cpe_desc": "MITRE 或 NIST 提供的 CPE v2.2 或 v2.3 URI。所有资产(应用程序、操作系统和硬件)都应指定 CPE",
"component_created": "组件已创建",
+ "component_data": "数据",
"component_deleted": "组件已删除",
"component_details": "组件详细信息",
"component_device": "设备",
+ "component_device_driver": "设备驱动程序",
"component_file": "文件",
"component_filename_desc": "指定观察到的组件的文件名",
"component_firmware": "固件",
@@ -388,11 +396,14 @@
"component_library": "库",
"component_license_expression_desc": "以 SPDX 表达式的形式指定组件的许可证信息",
"component_license_url_desc": "指定组件许可证的 URL",
+ "component_machine_learning_model": "机器学习模型",
"component_name": "组件名称",
"component_name_desc": "供应商提供的组件名称",
"component_namespace_group_vendor": "命名空间/组/供应商",
+ "component_none_classifier": "没有任何",
"component_operating_system": "操作系统",
"component_package_url_desc": "库和框架需要有效的包 URL。PURL 语法:pkg:type/namespace/name@version?qualifiers#subpath",
+ "component_platform": "平台",
"component_properties": "组件属性",
"component_search": "组件搜索",
"component_spdx_license_desc": "指定组件的 SPDX 许可证 ID",
@@ -711,7 +722,13 @@
"portfolio_vulnerabilities": "Portfolio 漏洞",
"profile_update": "更新个人信息",
"profile_updated": "个人资料已更新",
+ "project_add_collection_tag": "具有此标签的儿童的汇总数据",
"project_cloning_in_progress": "正在使用指定的克隆选项创建项目",
+ "project_collection_logic_aggregate_direct_children": "聚合直接子项",
+ "project_collection_logic_aggregate_direct_children_with_tag": "使用标签聚合直接子项",
+ "project_collection_logic_desc": "指定此项目是否是集合项目以及要为集合项目应用哪些指标计算逻辑。\n集合项目没有自己的组件,但使用可用逻辑之一显示其子组件的数据。",
+ "project_collection_logic_latest_version_children": "聚合标记为最新的直接子项",
+ "project_collection_logic_none": "没有任何",
"project_created": "项目已创建",
"project_delete_message": "删除此项目还将永久删除所有关联的子项目。\n此操作无法撤消。\n您确定要继续吗?",
"project_delete_title": "确认项目删除",
diff --git a/src/mixins/availableClassifiersMixin.js b/src/mixins/availableClassifiersMixin.js
new file mode 100644
index 000000000..1a6bae605
--- /dev/null
+++ b/src/mixins/availableClassifiersMixin.js
@@ -0,0 +1,50 @@
+export default {
+ data() {
+ return {
+ availableClassifiers: [
+ {
+ value: 'NONE',
+ text: this.$i18n.t('message.component_none_classifier'),
+ },
+ {
+ value: 'APPLICATION',
+ text: this.$i18n.t('message.component_application'),
+ },
+ {
+ value: 'FRAMEWORK',
+ text: this.$i18n.t('message.component_framework'),
+ },
+ { value: 'LIBRARY', text: this.$i18n.t('message.component_library') },
+ {
+ value: 'CONTAINER',
+ text: this.$i18n.t('message.component_container'),
+ },
+ {
+ value: 'OPERATING_SYSTEM',
+ text: this.$i18n.t('message.component_operating_system'),
+ },
+ { value: 'DEVICE', text: this.$i18n.t('message.component_device') },
+ { value: 'FIRMWARE', text: this.$i18n.t('message.component_firmware') },
+ { value: 'FILE', text: this.$i18n.t('message.component_file') },
+ { value: 'PLATFORM', text: this.$i18n.t('message.component_platform') },
+ {
+ value: 'DEVICE_DRIVER',
+ text: this.$i18n.t('message.component_device_driver'),
+ },
+ {
+ value: 'MACHINE_LEARNING_MODEL',
+ text: this.$i18n.t('message.component_machine_learning_model'),
+ },
+ { value: 'DATA', text: this.$i18n.t('message.component_data') },
+ ],
+ };
+ },
+ computed: {
+ sortAvailableClassifiers: function () {
+ this.availableClassifiers.sort(function (a, b) {
+ return a.value === 'NONE' ? -1 : a.text.localeCompare(b.text);
+ });
+ return this.availableClassifiers;
+ },
+ },
+};
diff --git a/src/mixins/availableCollectionLogicsMixin.js b/src/mixins/availableCollectionLogicsMixin.js
new file mode 100644
index 000000000..bb7b8ab45
--- /dev/null
+++ b/src/mixins/availableCollectionLogicsMixin.js
@@ -0,0 +1,30 @@
+export default {
+ data() {
+ return {
+ availableCollectionLogics: [
+ {
+ value: 'NONE',
+ text: this.$i18n.t('message.project_collection_logic_none'),
+ },
+ {
+ value: 'AGGREGATE_DIRECT_CHILDREN',
+ text: this.$i18n.t(
+ 'message.project_collection_logic_aggregate_direct_children',
+ ),
+ },
+ {
+ value: 'AGGREGATE_DIRECT_CHILDREN_WITH_TAG',
+ text: this.$i18n.t(
+ 'message.project_collection_logic_aggregate_direct_children_with_tag',
+ ),
+ },
+ {
+ value: 'AGGREGATE_LATEST_VERSION_CHILDREN',
+ text: this.$i18n.t(
+ 'message.project_collection_logic_latest_version_children',
+ ),
+ },
+ ],
+ };
+ },
+};
diff --git a/src/plugins/table.js b/src/plugins/table.js
index bd3b95274..d7476ad30 100644
--- a/src/plugins/table.js
+++ b/src/plugins/table.js
@@ -6,6 +6,7 @@ import 'bootstrap';
import 'jquery-treegrid/js/jquery.treegrid.min.js';
import 'bootstrap-table/dist/bootstrap-table.js';
import 'bootstrap-table/dist/extensions/treegrid/bootstrap-table-treegrid.min.js';
+import 'bootstrap-table/dist/extensions/defer-url/bootstrap-table-defer-url.js';
import BootstrapTable from 'bootstrap-table/dist/bootstrap-table-vue.esm.js';
Vue.component('BootstrapTable', BootstrapTable);
diff --git a/src/router/index.js b/src/router/index.js
index 96c9da708..977ff6069 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -10,7 +10,8 @@ const DefaultContainer = () => import('@/containers/DefaultContainer');
// Views
const Dashboard = () => import('@/views/Dashboard');
-const ProjectList = () => import('@/views/portfolio/projects/ProjectList');
+const ProjectListView = () =>
+ import('@/views/portfolio/projects/ProjectListView');
const TagList = () => import('@/views/portfolio/tags/TagList.vue');
const ComponentSearch = () =>
import('@/views/portfolio/components/ComponentSearch');
@@ -133,7 +134,7 @@ function configRoutes() {
{
path: 'projects',
name: 'Projects',
- component: ProjectList,
+ component: ProjectListView,
meta: {
title: i18n.t('message.projects'),
i18n: 'message.projects',
@@ -148,6 +149,7 @@ function configRoutes() {
alias: [
'projects/:uuid/overview',
'projects/:uuid/components',
+ 'projects/:uuid/collectionprojects',
'projects/:uuid/services',
'projects/:uuid/dependencyGraph',
'projects/:uuid/findings',
diff --git a/src/shared/common.js b/src/shared/common.js
index fb294b253..97c00134e 100644
--- a/src/shared/common.js
+++ b/src/shared/common.js
@@ -407,7 +407,14 @@ $common.componentClassifierLabelFormatter = (i18n) => {
*/
$common.componentClassifierLabelProjectUrlFormatter = (i18n) => {
return function (value) {
- let url = '../projects/?classifier=' + value;
+ // if column defines a routerFunc returning the router we use a more robust solution
+ let url = !this.routerFunc
+ ? '../projects/?classifier=' + value
+ : this.routerFunc().resolve({
+ name: 'Projects',
+ query: { classifier: value },
+ }).href;
+
switch (value) {
case 'APPLICATION':
case 'FRAMEWORK':
diff --git a/src/views/dashboard/ChartAuditingFindingsProgress.vue b/src/views/dashboard/ChartAuditingFindingsProgress.vue
index 969a71dc4..94aa3d169 100644
--- a/src/views/dashboard/ChartAuditingFindingsProgress.vue
+++ b/src/views/dashboard/ChartAuditingFindingsProgress.vue
@@ -13,15 +13,20 @@ export default {
render: function (metrics) {
const totalStyle = getStyle('--severity-unassigned');
const auditedStyle = getStyle('--severity-low');
+ const collectionLogicChangedStyle = getStyle(
+ '--collection-logic-changed',
+ );
let labels = [];
let totalData = [];
let auditedData = [];
+ let collectionLogicChangedData = [];
for (let i = 0; i < metrics.length; i++) {
labels.push(common.formatTimestamp(metrics[i].firstOccurrence));
totalData.push(metrics[i].findingsTotal);
auditedData.push(metrics[i].findingsAudited);
+ collectionLogicChangedData.push(metrics[i].collectionLogicChanged);
if (i === metrics.length - 1) {
labels.push(common.formatTimestamp(metrics[i].lastOccurrence));
@@ -48,6 +53,23 @@ export default {
pointHoverBackgroundColor: '#fff',
data: auditedData,
},
+ {
+ label: this.$t('message.collection_logic_changed'),
+ backgroundColor: 'transparent',
+ borderColor: collectionLogicChangedStyle,
+ showLine: false,
+ pointBorderColor: (context) => {
+ const value = context.dataset.data[context.dataIndex];
+ return value === true
+ ? collectionLogicChangedStyle
+ : 'transparent';
+ },
+ pointBorderWidth: 400,
+ pointHoverBorderWidth: 400,
+ data: collectionLogicChangedData,
+ pointStyle: 'line',
+ pointRadius: 1,
+ },
],
},
{
diff --git a/src/views/dashboard/ChartAuditingViolationsProgress.vue b/src/views/dashboard/ChartAuditingViolationsProgress.vue
index b66169ae2..94a304145 100644
--- a/src/views/dashboard/ChartAuditingViolationsProgress.vue
+++ b/src/views/dashboard/ChartAuditingViolationsProgress.vue
@@ -13,15 +13,20 @@ export default {
render: function (metrics) {
const totalStyle = getStyle('--severity-unassigned');
const auditedStyle = getStyle('--severity-low');
+ const collectionLogicChangedStyle = getStyle(
+ '--collection-logic-changed',
+ );
let labels = [];
let totalData = [];
let auditedData = [];
+ let collectionLogicChangedData = [];
for (let i = 0; i < metrics.length; i++) {
labels.push(common.formatTimestamp(metrics[i].firstOccurrence));
totalData.push(metrics[i].policyViolationsTotal);
auditedData.push(metrics[i].policyViolationsAudited);
+ collectionLogicChangedData.push(metrics[i].collectionLogicChanged);
if (i === metrics.length - 1) {
labels.push(common.formatTimestamp(metrics[i].lastOccurrence));
@@ -48,6 +53,23 @@ export default {
pointHoverBackgroundColor: '#fff',
data: auditedData,
},
+ {
+ label: this.$t('message.collection_logic_changed'),
+ backgroundColor: 'transparent',
+ borderColor: collectionLogicChangedStyle,
+ showLine: false,
+ pointBorderColor: (context) => {
+ const value = context.dataset.data[context.dataIndex];
+ return value === true
+ ? collectionLogicChangedStyle
+ : 'transparent';
+ },
+ pointBorderWidth: 400,
+ pointHoverBorderWidth: 400,
+ data: collectionLogicChangedData,
+ pointStyle: 'line',
+ pointRadius: 1,
+ },
],
},
{
diff --git a/src/views/dashboard/ChartComponentVulnerabilities.vue b/src/views/dashboard/ChartComponentVulnerabilities.vue
index 932b9849c..49de50fd0 100644
--- a/src/views/dashboard/ChartComponentVulnerabilities.vue
+++ b/src/views/dashboard/ChartComponentVulnerabilities.vue
@@ -14,11 +14,15 @@ export default {
const totalStyle = getStyle('--notification-note');
const affectedStyle = getStyle('--notification-warn');
const nonAffectedStyle = getStyle('--notification-pass');
+ const collectionLogicChangedStyle = getStyle(
+ '--collection-logic-changed',
+ );
let labels = [];
let totalData = [];
let affectedData = [];
let nonAffectedData = [];
+ let collectionLogicChangedData = [];
for (let i = 0; i < metrics.length; i++) {
labels.push(common.formatTimestamp(metrics[i].firstOccurrence));
@@ -27,6 +31,7 @@ export default {
nonAffectedData.push(
metrics[i].components - metrics[i].vulnerableComponents,
);
+ collectionLogicChangedData.push(metrics[i].collectionLogicChanged);
if (i === metrics.length - 1) {
labels.push(common.formatTimestamp(metrics[i].lastOccurrence));
@@ -63,6 +68,23 @@ export default {
pointHoverBackgroundColor: '#fff',
data: affectedData,
},
+ {
+ label: this.$t('message.collection_logic_changed'),
+ backgroundColor: 'transparent',
+ borderColor: collectionLogicChangedStyle,
+ showLine: false,
+ pointBorderColor: (context) => {
+ const value = context.dataset.data[context.dataIndex];
+ return value === true
+ ? collectionLogicChangedStyle
+ : 'transparent';
+ },
+ pointBorderWidth: 400,
+ pointHoverBorderWidth: 400,
+ data: collectionLogicChangedData,
+ pointStyle: 'line',
+ pointRadius: 1,
+ },
],
},
{
diff --git a/src/views/dashboard/ChartPolicyViolationsState.vue b/src/views/dashboard/ChartPolicyViolationsState.vue
index 20e187028..98026fac9 100644
--- a/src/views/dashboard/ChartPolicyViolationsState.vue
+++ b/src/views/dashboard/ChartPolicyViolationsState.vue
@@ -14,17 +14,22 @@ export default {
const failStyle = getStyle('--notification-fail');
const warnStyle = getStyle('--notification-warn');
const infoStyle = getStyle('--notification-info');
+ const collectionLogicChangedStyle = getStyle(
+ '--collection-logic-changed',
+ );
let labels = [];
let failData = [];
let warnData = [];
let infoData = [];
+ let collectionLogicChangedData = [];
for (let i = 0; i < metrics.length; i++) {
labels.push(common.formatTimestamp(metrics[i].firstOccurrence));
failData.push(metrics[i].policyViolationsFail);
warnData.push(metrics[i].policyViolationsWarn);
infoData.push(metrics[i].policyViolationsInfo);
+ collectionLogicChangedData.push(metrics[i].collectionLogicChanged);
if (i === metrics.length - 1) {
labels.push(common.formatTimestamp(metrics[i].lastOccurrence));
@@ -59,6 +64,23 @@ export default {
pointHoverBackgroundColor: '#fff',
data: infoData,
},
+ {
+ label: this.$t('message.collection_logic_changed'),
+ backgroundColor: 'transparent',
+ borderColor: collectionLogicChangedStyle,
+ showLine: false,
+ pointBorderColor: (context) => {
+ const value = context.dataset.data[context.dataIndex];
+ return value === true
+ ? collectionLogicChangedStyle
+ : 'transparent';
+ },
+ pointBorderWidth: 400,
+ pointHoverBorderWidth: 400,
+ data: collectionLogicChangedData,
+ pointStyle: 'line',
+ pointRadius: 1,
+ },
],
},
{
diff --git a/src/views/dashboard/ChartPortfolioVulnerabilities.vue b/src/views/dashboard/ChartPortfolioVulnerabilities.vue
index 1da1ebea0..42ec1f061 100644
--- a/src/views/dashboard/ChartPortfolioVulnerabilities.vue
+++ b/src/views/dashboard/ChartPortfolioVulnerabilities.vue
@@ -16,6 +16,9 @@ export default {
const mediumStyle = getStyle('--severity-medium');
const lowStyle = getStyle('--severity-low');
const unassignedStyle = getStyle('--severity-unassigned');
+ const collectionLogicChangedStyle = getStyle(
+ '--collection-logic-changed',
+ );
let labels = [];
let criticalData = [];
@@ -23,6 +26,7 @@ export default {
let mediumData = [];
let lowData = [];
let unassignedData = [];
+ let collectionLogicChangedData = [];
for (let i = 0; i < metrics.length; i++) {
labels.push(common.formatTimestamp(metrics[i].firstOccurrence));
@@ -31,6 +35,7 @@ export default {
mediumData.push(metrics[i].medium);
lowData.push(metrics[i].low);
unassignedData.push(metrics[i].unassigned);
+ collectionLogicChangedData.push(metrics[i].collectionLogicChanged);
if (i === metrics.length - 1) {
labels.push(common.formatTimestamp(metrics[i].lastOccurrence));
@@ -81,6 +86,23 @@ export default {
pointHoverBackgroundColor: '#fff',
data: unassignedData,
},
+ {
+ label: this.$t('message.collection_logic_changed'),
+ backgroundColor: 'transparent',
+ borderColor: collectionLogicChangedStyle,
+ showLine: false,
+ pointBorderColor: (context) => {
+ const value = context.dataset.data[context.dataIndex];
+ return value === true
+ ? collectionLogicChangedStyle
+ : 'transparent';
+ },
+ pointBorderWidth: 400,
+ pointHoverBorderWidth: 400,
+ data: collectionLogicChangedData,
+ pointStyle: 'line',
+ pointRadius: 1,
+ },
],
},
{
diff --git a/src/views/portfolio/projects/ComponentDetailsModal.vue b/src/views/portfolio/projects/ComponentDetailsModal.vue
index 5506d9383..df25e253e 100644
--- a/src/views/portfolio/projects/ComponentDetailsModal.vue
+++ b/src/views/portfolio/projects/ComponentDetailsModal.vue
@@ -125,7 +125,7 @@
id="component-classifier-input"
required="true"
v-model="component.classifier"
- :options="availableClassifiers"
+ :options="sortAvailableClassifiers"
:label="$t('message.classifier')"
:tooltip="$t('message.component_classifier_desc')"
:disabled="this.isNotPermitted(PERMISSIONS.PORTFOLIO_MANAGEMENT)"
@@ -391,10 +391,11 @@ import ComponentPropertiesModal from './ComponentPropertiesModal.vue';
import permissionsMixin from '../../../mixins/permissionsMixin';
import xssFilters from 'xss-filters';
import common from '@/shared/common';
+import availableClassifiersMixin from '@/mixins/availableClassifiersMixin';
export default {
name: 'ComponentDetailsModal',
- mixins: [permissionsMixin],
+ mixins: [permissionsMixin, availableClassifiersMixin],
components: {
BInputGroupFormInput,
BInputGroupFormSelect,
@@ -405,28 +406,6 @@ export default {
},
data() {
return {
- availableClassifiers: [
- {
- value: 'APPLICATION',
- text: this.$i18n.t('message.component_application'),
- },
- {
- value: 'FRAMEWORK',
- text: this.$i18n.t('message.component_framework'),
- },
- { value: 'LIBRARY', text: this.$i18n.t('message.component_library') },
- {
- value: 'CONTAINER',
- text: this.$i18n.t('message.component_container'),
- },
- {
- value: 'OPERATING_SYSTEM',
- text: this.$i18n.t('message.component_operating_system'),
- },
- { value: 'DEVICE', text: this.$i18n.t('message.component_device') },
- { value: 'FIRMWARE', text: this.$i18n.t('message.component_firmware') },
- { value: 'FILE', text: this.$i18n.t('message.component_file') },
- ],
selectableLicenses: [],
selectedLicense: '',
supplierUrlsTableColumns: [
diff --git a/src/views/portfolio/projects/Project.vue b/src/views/portfolio/projects/Project.vue
index 24cbad614..243b652c6 100644
--- a/src/views/portfolio/projects/Project.vue
+++ b/src/views/portfolio/projects/Project.vue
@@ -71,6 +71,13 @@
{{ project.version }}
+
{{ $t('message.inactive').toUpperCase() }}
@@ -223,7 +230,11 @@
style="border-left: 0; border-right: 0; border-top: 0"
/>
-
+
{{ $t('message.components') }}
{{ totalComponents }}
-
+
+
+ {{ $t('message.collection_projects') }}
+
+
+
{{ $t('message.services') }}
{{ totalServices }}
-
+
{{ $t('message.dependency_graph') }}
{{
@@ -262,7 +297,7 @@
@@ -286,11 +321,7 @@
v-on:total="totalFindingsIncludingAliases = $event"
/>
-
+
{{ $t('message.exploit_predictions') }}
{{ totalEpss }}
{
this.project = response.data;
+ // metrics are not always returned by API, fix error sometimes raised in following lines
+ if (!Object.hasOwn(this.project, 'metrics')) {
+ this.project.metrics = {};
+ }
this.currentCritical = common.valueWithDefault(
this.project.metrics.critical,
0,
@@ -571,6 +609,56 @@ export default {
let tab = pattern.exec(this.$route.fullPath.toLowerCase());
return this.$refs[tab && tab[1] ? tab[1].toLowerCase() : 'overview'];
},
+ getCollectionLogicText: function (project) {
+ switch (project.collectionLogic) {
+ case 'NONE':
+ return '';
+ case 'AGGREGATE_DIRECT_CHILDREN':
+ return this.$t(
+ 'message.collection_logic_metrics_by_aggregate_direct_children',
+ );
+ case 'AGGREGATE_DIRECT_CHILDREN_WITH_TAG':
+ const tag = !project.collectionTag
+ ? ''
+ : xssFilters.inDoubleQuotedAttr(project.collectionTag.name);
+ return this.$t(
+ 'message.collection_logic_metrics_by_aggregate_direct_children_with_tags',
+ { tag: tag },
+ );
+ case 'AGGREGATE_LATEST_VERSION_CHILDREN':
+ return this.$t(
+ 'message.collection_logic_metrics_by_aggregate_latest_version',
+ );
+ }
+ return '';
+ },
+ isCollectionProject: function () {
+ return this.project.collectionLogic !== 'NONE';
+ },
+ isShowComponents: function () {
+ return !this.isCollectionProject();
+ },
+ isShowCollectionProjects: function () {
+ return this.isCollectionProject();
+ },
+ isShowServices: function () {
+ return !this.isCollectionProject();
+ },
+ isShowDependencyGraph: function () {
+ return !this.isCollectionProject();
+ },
+ isShowFindings: function () {
+ return (
+ !this.isCollectionProject() &&
+ this.isPermitted(this.PERMISSIONS.VIEW_VULNERABILITY)
+ );
+ },
+ isShowPolicyViolations: function () {
+ return (
+ !this.isCollectionProject() &&
+ this.isPermitted(this.PERMISSIONS.VIEW_POLICY_VIOLATION)
+ );
+ },
},
beforeMount() {
this.uuid = this.$route.params.uuid;
diff --git a/src/views/portfolio/projects/ProjectAddComponentModal.vue b/src/views/portfolio/projects/ProjectAddComponentModal.vue
index aa8e07bb0..dd39dcfb2 100644
--- a/src/views/portfolio/projects/ProjectAddComponentModal.vue
+++ b/src/views/portfolio/projects/ProjectAddComponentModal.vue
@@ -86,7 +86,7 @@
id="component-classifier-input"
required="true"
v-model="component.classifier"
- :options="availableClassifiers"
+ :options="sortAvailableClassifiers"
:label="$t('message.classifier')"
:tooltip="$t('message.component_classifier_desc')"
/>
@@ -256,10 +256,11 @@
import BInputGroupFormInput from '../../../forms/BInputGroupFormInput';
import BInputGroupFormSelect from '../../../forms/BInputGroupFormSelect';
import permissionsMixin from '../../../mixins/permissionsMixin';
+import availableClassifiersMixin from '@/mixins/availableClassifiersMixin';
export default {
name: 'ProjectAddComponentModal',
- mixins: [permissionsMixin],
+ mixins: [permissionsMixin, availableClassifiersMixin],
components: {
BInputGroupFormInput,
BInputGroupFormSelect,
@@ -269,28 +270,6 @@ export default {
},
data() {
return {
- availableClassifiers: [
- {
- value: 'APPLICATION',
- text: this.$i18n.t('message.component_application'),
- },
- {
- value: 'FRAMEWORK',
- text: this.$i18n.t('message.component_framework'),
- },
- { value: 'LIBRARY', text: this.$i18n.t('message.component_library') },
- {
- value: 'CONTAINER',
- text: this.$i18n.t('message.component_container'),
- },
- {
- value: 'OPERATING_SYSTEM',
- text: this.$i18n.t('message.component_operating_system'),
- },
- { value: 'DEVICE', text: this.$i18n.t('message.component_device') },
- { value: 'FIRMWARE', text: this.$i18n.t('message.component_firmware') },
- { value: 'FILE', text: this.$i18n.t('message.component_file') },
- ],
selectableLicenses: [],
selectedLicense: '',
component: {},
diff --git a/src/views/portfolio/projects/ProjectCollectionProjects.vue b/src/views/portfolio/projects/ProjectCollectionProjects.vue
new file mode 100644
index 000000000..16cbd65e5
--- /dev/null
+++ b/src/views/portfolio/projects/ProjectCollectionProjects.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/src/views/portfolio/projects/ProjectCreateProjectModal.vue b/src/views/portfolio/projects/ProjectCreateProjectModal.vue
index b7646ee7f..707fa0e7d 100644
--- a/src/views/portfolio/projects/ProjectCreateProjectModal.vue
+++ b/src/views/portfolio/projects/ProjectCreateProjectModal.vue
@@ -67,6 +67,31 @@
:tooltip="$t('message.component_team_desc')"
:disabled="isDisabled"
/>
+
+ (this.collectionTags = newCollectionTags)
+ "
+ class="mw-100 bg-transparent text-lowercase"
+ :max-tags="1"
+ v-show="showCollectionTags"
+ :readonly="this.isNotPermitted(PERMISSIONS.PORTFOLIO_MANAGEMENT)"
+ />
+