diff --git a/opencti-platform/opencti-front/lang/front/de.json b/opencti-platform/opencti-front/lang/front/de.json index 9338aef25746f..c4458f4821eb0 100644 --- a/opencti-platform/opencti-front/lang/front/de.json +++ b/opencti-platform/opencti-front/lang/front/de.json @@ -340,6 +340,7 @@ "Content": "Inhalt", "Content mapping view": "Ansicht des Content Mappings", "Content max marking definition levels": "Maximale Markierungsdefinitionsstufen für Inhalte", + "Content view": "Ansicht des Inhalts", "contest": "Flüchtige Gruppierung", "Context": "Kontext", "context": "Kontext", diff --git a/opencti-platform/opencti-front/lang/front/en.json b/opencti-platform/opencti-front/lang/front/en.json index 3dc1394f4a314..febf5e3765f19 100644 --- a/opencti-platform/opencti-front/lang/front/en.json +++ b/opencti-platform/opencti-front/lang/front/en.json @@ -340,6 +340,7 @@ "Content": "Content", "Content mapping view": "Content mapping view", "Content max marking definition levels": "Content max marking definition levels", + "Content view": "Content view", "contest": "Ephemeral groupment", "Context": "Context", "context": "Context", diff --git a/opencti-platform/opencti-front/lang/front/es.json b/opencti-platform/opencti-front/lang/front/es.json index a9e013c298ee1..95ddadc301c03 100644 --- a/opencti-platform/opencti-front/lang/front/es.json +++ b/opencti-platform/opencti-front/lang/front/es.json @@ -340,6 +340,7 @@ "Content": "Contenido", "Content mapping view": "Vista de mapeo de contenidos", "Content max marking definition levels": "Niveles de definición de marcado máximo de contenido", + "Content view": "Vista del contenido", "contest": "Movimiento espontáneo", "context": "Contexto", "Context": "Contexto", diff --git a/opencti-platform/opencti-front/lang/front/fr.json b/opencti-platform/opencti-front/lang/front/fr.json index 08edefa5cca03..5f8d3511bd18b 100644 --- a/opencti-platform/opencti-front/lang/front/fr.json +++ b/opencti-platform/opencti-front/lang/front/fr.json @@ -340,6 +340,7 @@ "Content": "Contenu", "Content mapping view": "Vue de la cartographie du contenu", "Content max marking definition levels": "Niveaux de marquage maximum du contenu", + "Content view": "Vue du contenu", "contest": "Mouvement spontané", "context": "Contexte", "Context": "Contexte", diff --git a/opencti-platform/opencti-front/lang/front/ja.json b/opencti-platform/opencti-front/lang/front/ja.json index d29dc73b3e30d..75028d639a005 100644 --- a/opencti-platform/opencti-front/lang/front/ja.json +++ b/opencti-platform/opencti-front/lang/front/ja.json @@ -340,6 +340,7 @@ "Content": "内容", "Content mapping view": "コンテンツマッピングビュー", "Content max marking definition levels": "コンテンツの最大マーキング定義レベル", + "Content view": "コンテンツビュー", "contest": "一時的なグループ", "context": "コンテキスト", "Context": "コンテキスト", diff --git a/opencti-platform/opencti-front/lang/front/zh.json b/opencti-platform/opencti-front/lang/front/zh.json index 195098dd6fcd9..4d739a5a2fa2b 100644 --- a/opencti-platform/opencti-front/lang/front/zh.json +++ b/opencti-platform/opencti-front/lang/front/zh.json @@ -340,6 +340,7 @@ "Content": "内容", "Content mapping view": "内容映射视图", "Content max marking definition levels": "内容最大标记定义级别", + "Content view": "内容视图", "contest": "比赛", "context": "关联", "Context": "上下文", diff --git a/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingCreation.tsx b/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingCreation.tsx index 7ea0f864842dd..46bac32182925 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingCreation.tsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingCreation.tsx @@ -96,6 +96,8 @@ export const GroupingCreationForm: FunctionComponent = ({ const classes = useStyles(); const { t_i18n } = useFormatter(); const navigate = useNavigate(); + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); const [mapAfter, setMapAfter] = useState(false); const basicShape = { name: Yup.string().trim().min(2).required(t_i18n('This field is required')), @@ -149,9 +151,15 @@ export const GroupingCreationForm: FunctionComponent = ({ onClose(); } if (mapAfter) { - navigate( - `/dashboard/analyses/groupings/${response.groupingAdd?.id}/knowledge/content`, - ); + if (contentMappingFeatureFlag) { + navigate( + `/dashboard/analyses/groupings/${response.groupingAdd?.id}/content/mapping`, + ); + } else { + navigate( + `/dashboard/analyses/groupings/${response.groupingAdd?.id}/knowledge/content`, + ); + } } }, }); diff --git a/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingKnowledge.jsx b/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingKnowledge.jsx index 005ea3e57647b..2aa3dc87af33b 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingKnowledge.jsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/groupings/GroupingKnowledge.jsx @@ -14,8 +14,8 @@ import Loader, { LoaderVariant } from '../../../../components/Loader'; import GroupingPopover from './GroupingPopover'; import AttackPatternsMatrix from '../../techniques/attack_patterns/AttackPatternsMatrix'; import { buildViewParamsFromUrlAndStorage, saveViewParameters } from '../../../../utils/ListParameters'; -import ContainerContent, { containerContentQuery } from '../../common/containers/ContainerContent'; import investigationAddFromContainer from '../../../../utils/InvestigationUtils'; +import ContainerContent, { containerContentQuery } from '../../common/containers/ContainerContent'; import withRouter from '../../../../utils/compat-router/withRouter'; const styles = () => ({ @@ -210,7 +210,7 @@ class GroupingKnowledgeComponent extends Component { ); }} /> - } + } /> { const enableReferences = useIsEnforceReference('Grouping') && !useGranted([BYPASSREFERENCE]); const { t_i18n } = useFormatter(); useSubscription(subConfig); + return ( <> { if (props) { if (props.grouping) { const { grouping } = props; - let paddingRight = 0; const isOverview = location.pathname === `/dashboard/analyses/groupings/${grouping.id}`; - if ( - location.pathname.includes( - `/dashboard/analyses/groupings/${grouping.id}/entities`, - ) - || location.pathname.includes( - `/dashboard/analyses/groupings/${grouping.id}/observables`, - ) - ) { - paddingRight = 250; - } - if ( - location.pathname.includes( - `/dashboard/analyses/groupings/${grouping.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, grouping.id, '/dashboard/analyses/groupings', false); return (
{ }} > { } /> } /> diff --git a/opencti-platform/opencti-front/src/private/components/analyses/malware_analyses/Root.tsx b/opencti-platform/opencti-front/src/private/components/analyses/malware_analyses/Root.tsx index ade119a39b7f0..ff4852dd387d2 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/malware_analyses/Root.tsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/malware_analyses/Root.tsx @@ -9,6 +9,7 @@ import { GraphQLSubscriptionConfig } from 'relay-runtime'; import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; +import StixCoreObjectContentRoot from '@components/common/stix_core_objects/StixCoreObjectContentRoot'; import { QueryRenderer } from '../../../../relay/environment'; import ErrorNotFound from '../../../../components/ErrorNotFound'; import Loader from '../../../../components/Loader'; @@ -24,6 +25,7 @@ import StixCoreRelationship from '../../common/stix_core_relationships/StixCoreR import { useFormatter } from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import { getMainRepresentative } from '../../../../utils/defaultRepresentatives'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootMalwareAnalysisSubscription($id: ID!) { @@ -86,8 +88,9 @@ const RootMalwareAnalysis = () => { if (props) { if (props.malwareAnalysis) { const { malwareAnalysis } = props; + const paddingRight = getPaddingRight(location.pathname, malwareAnalysis.id, '/dashboard/analyses/malware_analyses', false); return ( - <> +
{ entityType={'Malware-Analysis'} stixDomainObject={malwareAnalysis} PopoverComponent={ - - } + + } noAliases={true} /> { }} > { value={`/dashboard/analyses/malware_analyses/${malwareAnalysis.id}/knowledge`} label={t_i18n('Knowledge')} /> + { entityId={malwareAnalysisId} />} /> + + } + /> { />} /> - +
); } - return ; + return ; } return ; }} diff --git a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx index 193692fe8678b..7aeb8ec84e3f0 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportCreation.tsx @@ -105,6 +105,8 @@ export const ReportCreationForm: FunctionComponent = ({ const classes = useStyles(); const { t_i18n } = useFormatter(); const navigate = useNavigate(); + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); const [mapAfter, setMapAfter] = useState(false); const basicShape = { name: Yup.string().trim().min(2, t_i18n('Name must be at least 2 characters')).required(t_i18n('This field is required')), @@ -163,9 +165,15 @@ export const ReportCreationForm: FunctionComponent = ({ onClose(); } if (mapAfter) { - navigate( - `/dashboard/analyses/reports/${response.reportAdd?.id}/knowledge/content`, - ); + if (contentMappingFeatureFlag) { + navigate( + `/dashboard/analyses/reports/${response.reportAdd?.id}/content/mapping`, + ); + } else { + navigate( + `/dashboard/analyses/reports/${response.reportAdd?.id}/knowledge/content`, + ); + } } }, }); diff --git a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportKnowledge.jsx b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportKnowledge.jsx index b9cb01b2f6735..8fb693c710573 100644 --- a/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportKnowledge.jsx +++ b/opencti-platform/opencti-front/src/private/components/analyses/reports/ReportKnowledge.jsx @@ -310,7 +310,7 @@ class ReportKnowledgeComponent extends Component { ); }} /> - )} + )} /> { const enableReferences = useIsEnforceReference('Report') && !useGranted([BYPASSREFERENCE]); const { t_i18n } = useFormatter(); useSubscription(subConfig); + return ( <> { if (props) { if (props.report) { const { report } = props; - let paddingRight = 0; const isOverview = location.pathname === `/dashboard/analyses/reports/${report.id}`; - if ( - location.pathname.includes( - `/dashboard/analyses/reports/${report.id}/entities`, - ) - || location.pathname.includes( - `/dashboard/analyses/reports/${report.id}/observables`, - ) - ) { - paddingRight = 250; - } - if ( - location.pathname.includes( - `/dashboard/analyses/reports/${report.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, reportId, '/dashboard/analyses/reports', false); return (
{ }} > { )} /> } /> diff --git a/opencti-platform/opencti-front/src/private/components/arsenal/channels/Root.jsx b/opencti-platform/opencti-front/src/private/components/arsenal/channels/Root.jsx index bd4cce5ef3b80..3c17fa2a5e45d 100644 --- a/opencti-platform/opencti-front/src/private/components/arsenal/channels/Root.jsx +++ b/opencti-platform/opencti-front/src/private/components/arsenal/channels/Root.jsx @@ -6,11 +6,11 @@ import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import * as R from 'ramda'; +import StixCoreObjectContentRoot from '../../common/stix_core_objects/StixCoreObjectContentRoot'; import { QueryRenderer, requestSubscription } from '../../../../relay/environment'; import Channel from './Channel'; import ChannelKnowledge from './ChannelKnowledge'; import StixDomainObjectHeader from '../../common/stix_domain_objects/StixDomainObjectHeader'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; import FileManager from '../../common/files/FileManager'; import ChannelPopover from './ChannelPopover'; import Loader from '../../../../components/Loader'; @@ -21,6 +21,7 @@ import ErrorNotFound from '../../../../components/ErrorNotFound'; import inject18n from '../../../../components/i18n'; import withRouter from '../../../../utils/compat-router/withRouter'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootChannelSubscription($id: ID!) { @@ -115,21 +116,7 @@ class RootChannel extends Component { if (props) { if (props.channel) { const { channel } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/arsenal/channels/${channel.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/arsenal/channels/${channel.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, channel.id, '/dashboard/arsenal/channels'); return (
- )} + } /> @@ -122,21 +124,7 @@ class RootMalware extends Component { if (props.malware) { const { malware } = props; const isOverview = location.pathname === `/dashboard/arsenal/malwares/${malwareId}`; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/arsenal/malwares/${malware.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/arsenal/malwares/${malware.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, malware.id, '/dashboard/arsenal/malwares'); return (
} /> - )} + } /> @@ -116,21 +118,7 @@ class RootTool extends Component { if (props) { if (props.tool) { const { tool } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/arsenal/tools/${tool.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/arsenal/tools/${tool.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, tool.id, '/dashboard/arsenal/tools'); return (
- )} + } /> - )} + } /> = ({ const classes = useStyles(); const { t_i18n } = useFormatter(); const navigate = useNavigate(); + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); const [mapAfter, setMapAfter] = useState(false); const basicShape = { name: Yup.string().trim().min(2).required(t_i18n('This field is required')), @@ -152,9 +155,15 @@ export const CaseIncidentCreationForm: FunctionComponent = ({ onClose(); } if (mapAfter) { - navigate( - `/dashboard/cases/incidents/${response.caseIncidentAdd?.id}/knowledge/content`, - ); + if (contentMappingFeatureFlag) { + navigate( + `/dashboard/cases/incidents/${response.caseIncidentAdd?.id}/content/mapping`, + ); + } else { + navigate( + `/dashboard/cases/incidents/${response.caseIncidentAdd?.id}/knowledge/content`, + ); + } } }, }); diff --git a/opencti-platform/opencti-front/src/private/components/cases/case_incidents/Root.tsx b/opencti-platform/opencti-front/src/private/components/cases/case_incidents/Root.tsx index acea821ea866e..0ac7ed6fe8d4b 100644 --- a/opencti-platform/opencti-front/src/private/components/cases/case_incidents/Root.tsx +++ b/opencti-platform/opencti-front/src/private/components/cases/case_incidents/Root.tsx @@ -10,6 +10,7 @@ import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import StixCoreObjectSimulationResult from '@components/common/stix_core_objects/StixCoreObjectSimulationResult'; +import StixCoreObjectContentRoot from '@components/common/stix_core_objects/StixCoreObjectContentRoot'; import ErrorNotFound from '../../../../components/ErrorNotFound'; import Loader, { LoaderVariant } from '../../../../components/Loader'; import useQueryLoading from '../../../../utils/hooks/useQueryLoading'; @@ -17,7 +18,6 @@ import ContainerHeader from '../../common/containers/ContainerHeader'; import ContainerStixCyberObservables from '../../common/containers/ContainerStixCyberObservables'; import ContainerStixDomainObjects from '../../common/containers/ContainerStixDomainObjects'; import StixCoreObjectFilesAndHistory from '../../common/stix_core_objects/StixCoreObjectFilesAndHistory'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; import { RootIncidentCaseQuery } from './__generated__/RootIncidentCaseQuery.graphql'; import CaseIncident from './CaseIncident'; import CaseIncidentPopover from './CaseIncidentPopover'; @@ -28,6 +28,7 @@ import { useFormatter } from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import { useIsEnforceReference } from '../../../../utils/hooks/useEntitySettings'; import useGranted, { BYPASSREFERENCE } from '../../../../utils/hooks/useGranted'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootIncidentCaseSubscription($id: ID!) { @@ -84,32 +85,14 @@ const RootCaseIncidentComponent = ({ queryRef, caseId }) => { const enableReferences = useIsEnforceReference('Case-Incident') && !useGranted([BYPASSREFERENCE]); const { t_i18n } = useFormatter(); useSubscription(subConfig); + const { caseIncident: caseData, connectorsForExport, connectorsForImport, } = usePreloadedQuery(caseIncidentQuery, queryRef); - let paddingRight = 0; - const isOverview = location.pathname === `/dashboard/cases/incidents/${caseData.id}`; - if (caseData) { - if ( - location.pathname.includes( - `/dashboard/cases/incidents/${caseData.id}/entities`, - ) - || location.pathname.includes( - `/dashboard/cases/incidents/${caseData.id}/observables`, - ) - ) { - paddingRight = 250; - } - if ( - location.pathname.includes( - `/dashboard/cases/incidents/${caseData.id}/content`, - ) - ) { - paddingRight = 350; - } - } + const isOverview = location.pathname === `/dashboard/cases/incidents/${caseData?.id}`; + const paddingRight = getPaddingRight(location.pathname, caseData?.id, '/dashboard/cases/incidents', false); return ( <> {caseData ? ( @@ -135,13 +118,7 @@ const RootCaseIncidentComponent = ({ queryRef, caseId }) => { }} > { />} /> } + isContainer={true} + /> + } /> = ({ const classes = useStyles(); const { t_i18n } = useFormatter(); const navigate = useNavigate(); + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); const [mapAfter, setMapAfter] = useState(false); const basicShape = { name: Yup.string().trim().min(2).required(t_i18n('This field is required')), @@ -150,9 +153,15 @@ export const CaseRfiCreationForm: FunctionComponent = ({ onClose(); } if (mapAfter) { - navigate( - `/dashboard/cases/rfis/${response.caseRfiAdd?.id}/knowledge/content`, - ); + if (contentMappingFeatureFlag) { + navigate( + `/dashboard/cases/rfis/${response.caseRfiAdd?.id}/content/mapping`, + ); + } else { + navigate( + `/dashboard/cases/rfis/${response.caseRfiAdd?.id}/knowledge/content`, + ); + } } }, }); diff --git a/opencti-platform/opencti-front/src/private/components/cases/case_rfis/CaseRfiKnowledge.jsx b/opencti-platform/opencti-front/src/private/components/cases/case_rfis/CaseRfiKnowledge.jsx index b7ffd75222cc4..9f5fa20c12f26 100644 --- a/opencti-platform/opencti-front/src/private/components/cases/case_rfis/CaseRfiKnowledge.jsx +++ b/opencti-platform/opencti-front/src/private/components/cases/case_rfis/CaseRfiKnowledge.jsx @@ -315,7 +315,7 @@ class CaseRfiKnowledgeComponent extends Component { ); }} /> - } + } /> { const enableReferences = useIsEnforceReference('Case-Rfi') && !useGranted([BYPASSREFERENCE]); const { t_i18n } = useFormatter(); useSubscription(subConfig); + const { caseRfi: caseData, connectorsForExport, connectorsForImport, } = usePreloadedQuery(caseRfiQuery, queryRef); - let paddingRight = 0; - if (caseData) { - if ( - location.pathname.includes( - `/dashboard/cases/rfis/${caseData.id}/entities`, - ) - || location.pathname.includes( - `/dashboard/cases/rfis/${caseData.id}/observables`, - ) - ) { - paddingRight = 250; - } - if ( - location.pathname.includes(`/dashboard/cases/rfis/${caseData.id}/content`) - ) { - paddingRight = 350; - } - } + + const paddingRight = getPaddingRight(location.pathname, caseData?.id, '/dashboard/cases/rfis', false); + return ( <> {caseData ? ( @@ -132,13 +119,7 @@ const RootCaseRfiComponent = ({ queryRef, caseId }) => { }} > { } /> } /> diff --git a/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftCreation.tsx b/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftCreation.tsx index 0d7f7ca338a62..2cf2c6d1b712e 100644 --- a/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftCreation.tsx +++ b/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftCreation.tsx @@ -32,6 +32,7 @@ import RichTextField from '../../../../components/fields/RichTextField'; import ObjectParticipantField from '../../common/form/ObjectParticipantField'; import CustomFileUploader from '../../common/files/CustomFileUploader'; import useApiMutation from '../../../../utils/hooks/useApiMutation'; +import useHelper from '../../../../utils/hooks/useHelper'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -102,6 +103,8 @@ export const CaseRftCreationForm: FunctionComponent = ({ const classes = useStyles(); const { t_i18n } = useFormatter(); const navigate = useNavigate(); + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); const [mapAfter, setMapAfter] = useState(false); const basicShape = { name: Yup.string().trim().min(2).required(t_i18n('This field is required')), @@ -152,9 +155,15 @@ export const CaseRftCreationForm: FunctionComponent = ({ onClose(); } if (mapAfter) { - navigate( - `/dashboard/cases/rfts/${response.caseRftAdd?.id}/knowledge/content`, - ); + if (contentMappingFeatureFlag) { + navigate( + `/dashboard/cases/rfts/${response.caseRftAdd?.id}/content/mapping`, + ); + } else { + navigate( + `/dashboard/cases/rfts/${response.caseRftAdd?.id}/knowledge/content`, + ); + } } }, }); diff --git a/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftKnowledge.jsx b/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftKnowledge.jsx index 85a57b16c8f28..395bf817eb450 100644 --- a/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftKnowledge.jsx +++ b/opencti-platform/opencti-front/src/private/components/cases/case_rfts/CaseRftKnowledge.jsx @@ -17,6 +17,7 @@ import CaseRftKnowledgeGraph, { caseRftKnowledgeGraphQuery } from './CaseRftKnow import CaseRftKnowledgeTimeLine, { caseRftKnowledgeTimeLineQuery } from './CaseRftKnowledgeTimeLine'; import CaseRftKnowledgeCorrelation, { caseRftKnowledgeCorrelationQuery } from './CaseRftKnowledgeCorrelation'; import ContentKnowledgeTimeLineBar from '../../common/containers/ContainertKnowledgeTimeLineBar'; +import ContainerContent, { containerContentQuery } from '../../common/containers/ContainerContent'; import investigationAddFromContainer from '../../../../utils/InvestigationUtils'; import withRouter from '../../../../utils/compat-router/withRouter'; @@ -296,6 +297,26 @@ class CaseRftKnowledgeComponent extends Component { /> )} /> + { + if (props && props.container) { + return ; + } + return ( + + ); + }} + /> + )} + /> { const enableReferences = useIsEnforceReference('Case-Rft') && !useGranted([BYPASSREFERENCE]); const { t_i18n } = useFormatter(); useSubscription(subConfig); + const { caseRft: caseData, connectorsForExport, connectorsForImport, } = usePreloadedQuery(caseRftQuery, queryRef); - let paddingRight = 0; - if (caseData) { - if ( - location.pathname.includes( - `/dashboard/cases/rfts/${caseData.id}/entities`, - ) - || location.pathname.includes( - `/dashboard/cases/rfts/${caseData.id}/observables`, - ) - ) { - paddingRight = 250; - } - if ( - location.pathname.includes(`/dashboard/cases/rfts/${caseData.id}/content`) - ) { - paddingRight = 350; - } - } + const paddingRight = getPaddingRight(location.pathname, caseData?.id, '/dashboard/cases/rfts', false); return ( <> {caseData ? ( @@ -131,13 +116,7 @@ const RootCaseRftComponent = ({ queryRef, caseId }) => { }} > { )} /> - )} + } /> { const location = useLocation(); const { t_i18n } = useFormatter(); useSubscription(subConfig); + const { feedback: feedbackData, connectorsForExport, connectorsForImport, } = usePreloadedQuery(feedbackQuery, queryRef); - let paddingRight = 0; - if (feedbackData) { - if ( - location.pathname.includes( - `/dashboard/cases/feedbacks/${feedbackData.id}/content`, - ) - ) { - paddingRight = 350; - } - } + const paddingRight = getPaddingRight(location.pathname, feedbackData?.id, '/dashboard/cases/feedbacks'); const canManage = feedbackData?.currentUserAccessRight === 'admin'; return ( <> @@ -147,13 +140,7 @@ const RootFeedbackComponent = ({ queryRef, caseId }) => { }} > { />} /> } diff --git a/opencti-platform/opencti-front/src/private/components/cases/tasks/Root.tsx b/opencti-platform/opencti-front/src/private/components/cases/tasks/Root.tsx index 657f5512f1958..5b7481aa52a41 100644 --- a/opencti-platform/opencti-front/src/private/components/cases/tasks/Root.tsx +++ b/opencti-platform/opencti-front/src/private/components/cases/tasks/Root.tsx @@ -9,11 +9,11 @@ import { GraphQLSubscriptionConfig } from 'relay-runtime'; import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; +import StixCoreObjectContentRoot from '@components/common/stix_core_objects/StixCoreObjectContentRoot'; import ErrorNotFound from '../../../../components/ErrorNotFound'; import useQueryLoading from '../../../../utils/hooks/useQueryLoading'; import Loader, { LoaderVariant } from '../../../../components/Loader'; import ContainerHeader from '../../common/containers/ContainerHeader'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; import StixCoreObjectFilesAndHistory from '../../common/stix_core_objects/StixCoreObjectFilesAndHistory'; import StixCoreObjectHistory from '../../common/stix_core_objects/StixCoreObjectHistory'; import CaseTask from './Task'; @@ -22,6 +22,7 @@ import { RootTaskQuery } from './__generated__/RootTaskQuery.graphql'; import { RootTaskSubscription } from './__generated__/RootTaskSubscription.graphql'; import { useFormatter } from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootTaskSubscription($id: ID!) { @@ -76,14 +77,7 @@ const RootTaskComponent = ({ queryRef, taskId }) => { connectorsForExport, connectorsForImport, } = usePreloadedQuery(TaskQuery, queryRef); - let paddingRight = 0; - if (data) { - if ( - location.pathname.includes(`/dashboard/cases/tasks/${data.id}/content`) - ) { - paddingRight = 350; - } - } + const paddingRight = getPaddingRight(location.pathname, data?.id, '/dashboard/cases/tasks'); return ( <> {data ? ( @@ -108,13 +102,7 @@ const RootTaskComponent = ({ queryRef, taskId }) => { }} > { element={} /> + } /> { const [selectedEntity, setSelectedEntity] = useState({}); const [applying, setApplying] = useState([]); const [applied, setApplied] = useState([]); + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); // Suggestions const resolveThreats = (objects) => objects.filter( (o) => [ @@ -814,7 +817,7 @@ const ContainerHeader = (props) => { )} - {modes.includes('content') && ( + {!contentMappingFeatureFlag && modes.includes('content') && ( = ({ + currentMode, + modes, +}) => { + const { t_i18n } = useFormatter(); + + return ( +
+ + {modes.includes('content') && ( + + + + + + )} + {modes.includes('mapping') && ( + + + + + + )} + +
+ ); +}; + +export default StixCoreObjectContentHeader; diff --git a/opencti-platform/opencti-front/src/private/components/common/stix_core_objects/StixCoreObjectContentRoot.tsx b/opencti-platform/opencti-front/src/private/components/common/stix_core_objects/StixCoreObjectContentRoot.tsx new file mode 100644 index 0000000000000..f6df73a9e598c --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/common/stix_core_objects/StixCoreObjectContentRoot.tsx @@ -0,0 +1,66 @@ +import React, { FunctionComponent } from 'react'; +import StixCoreObjectContentHeader from '@components/common/stix_core_objects/StixCoreObjectContentHeader'; +import { Route, Routes, useLocation } from 'react-router-dom'; +import ContainerContent, { containerContentQuery } from '@components/common/containers/ContainerContent'; +import StixCoreObjectContent from '@components/common/stix_core_objects/StixCoreObjectContent'; +import { ContainerContentQuery$data } from '@components/common/containers/__generated__/ContainerContentQuery.graphql'; +import { StixCoreObjectContent_stixCoreObject$data } from '@components/common/stix_core_objects/__generated__/StixCoreObjectContent_stixCoreObject.graphql'; +import { QueryRenderer } from '../../../../relay/environment'; +import Loader, { LoaderVariant } from '../../../../components/Loader'; +import useHelper from '../../../../utils/hooks/useHelper'; + +interface StixCoreObjectContentRootProps { + stixCoreObject: StixCoreObjectContent_stixCoreObject$data; + isContainer?: boolean; +} + +const StixCoreObjectContentRoot: FunctionComponent = ({ + stixCoreObject, isContainer = false, +}) => { + const { pathname } = useLocation(); + const currentMode = pathname.endsWith('/mapping') ? 'mapping' : 'content'; + const modes = isContainer ? ['content', 'mapping'] : []; + const { isFeatureEnable } = useHelper(); + const contentMappingFeatureFlag = isFeatureEnable('CONTENT_MAPPING'); + return ( + <> + {contentMappingFeatureFlag && ( + ) + } + + { + if (props && props.container) { + return ; + } + return ( + + ); + }} + /> + } + /> + } + /> + + + ); +}; + +export default StixCoreObjectContentRoot; diff --git a/opencti-platform/opencti-front/src/private/components/entities/events/Root.jsx b/opencti-platform/opencti-front/src/private/components/entities/events/Root.jsx index 1afe464c5ad5e..bc0ad054f8986 100644 --- a/opencti-platform/opencti-front/src/private/components/entities/events/Root.jsx +++ b/opencti-platform/opencti-front/src/private/components/entities/events/Root.jsx @@ -6,7 +6,7 @@ import * as R from 'ramda'; import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; +import StixCoreObjectContentRoot from '../../common/stix_core_objects/StixCoreObjectContentRoot'; import withRouter from '../../../../utils/compat-router/withRouter'; import { QueryRenderer, requestSubscription } from '../../../../relay/environment'; import Event from './Event'; @@ -22,6 +22,7 @@ import ErrorNotFound from '../../../../components/ErrorNotFound'; import EntityStixSightingRelationships from '../../events/stix_sighting_relationships/EntityStixSightingRelationships'; import inject18n from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootEventsSubscription($id: ID!) { @@ -85,6 +86,7 @@ class RootEvent extends Component { params: { eventId }, } = this.props; const link = `/dashboard/entities/events/${eventId}/knowledge`; + return ( <> @@ -115,21 +117,7 @@ class RootEvent extends Component { if (props) { if (props.event) { const { event } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/entities/events/${event.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/entities/events/${event.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, event.id, '/dashboard/entities/events'); return (
- )} + } /> @@ -150,19 +152,8 @@ class RootIndividual extends Component { if (props.individual) { const { individual } = props; let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/entities/individuals/${individual.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/entities/individuals/${individual.id}/content`, - ) - ) { - paddingRight = 350; + if (viewAs === 'knowledge') { + paddingRight = getPaddingRight(location.pathname, individual.id, '/dashboard/entities/individuals'); } return (
@@ -190,13 +181,7 @@ class RootIndividual extends Component { }} > - )} + } /> @@ -152,21 +154,7 @@ class RootOrganization extends Component { if (props) { if (props.organization) { const { organization } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/entities/organizations/${organization.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/entities/organizations/${organization.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, organization.id, '/dashboard/entities/organizations'); return (
- )} + } /> @@ -115,21 +117,7 @@ class RootSector extends Component { if (props) { if (props.sector) { const { sector } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/entities/sectors/${sector.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/entities/sectors/${sector.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, sector.id, '/dashboard/entities/sectors'); return (
- )} + } /> @@ -146,21 +148,7 @@ class RootSystem extends Component { if (props) { if (props.system) { const { system } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/entities/systems/${system.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/entities/systems/${system.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, system.id, '/dashboard/entities/systems'); return (
- )} + } /> { const paddingRightValue = () => { if (location.pathname.includes(`/dashboard/events/incidents/${incident.id}/knowledge`)) return 200; if (location.pathname.includes(`/dashboard/events/incidents/${incident.id}/content`)) return 350; + if (location.pathname.includes(`/dashboard/events/incidents/${incident.id}/content/mapping`)) return 0; return 0; }; return ( @@ -110,13 +111,7 @@ const RootIncidentComponent = ({ queryRef }) => { sx={{ borderBottom: 1, borderColor: 'divider', marginBottom: 4 }} > { element={} /> - )} + } /> {administrativeArea ? ( @@ -127,13 +114,7 @@ const RootAdministrativeAreaComponent = ({ }} > + } /> - )} + path="/knowledge/*" + element={ + + } /> { const { t_i18n } = useFormatter(); const data = usePreloadedQuery(cityQuery, queryRef); const { city, connectorsForImport, connectorsForExport } = data; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/locations/cities/${city.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/locations/cities/${city.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, city.id, '/dashboard/locations/cities'); return ( <> {city ? ( @@ -119,13 +106,7 @@ const RootCityComponent = ({ queryRef, cityId, link }) => { }} > { element={} /> - )} + } /> { const { t_i18n } = useFormatter(); const data = usePreloadedQuery(countryQuery, queryRef); const { country, connectorsForImport, connectorsForExport } = data; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/locations/countries/${country.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/locations/countries/${country.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, country?.id, '/dashboard/locations/countries'); return ( <> {country ? ( @@ -121,13 +108,7 @@ const RootCountryComponent = ({ queryRef, countryId, link }) => { }} > { element={} /> - )} + } /> @@ -119,21 +121,7 @@ class RootPosition extends Component { if (props) { if (props.position) { const { position } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/locations/positions/${position.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/locations/positions/${position.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, position.id, '/dashboard/locations/positions'); return (
- )} + } /> { const { t_i18n } = useFormatter(); const data = usePreloadedQuery(regionQuery, queryRef); const { region, connectorsForImport, connectorsForExport } = data; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/locations/regions/${region.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/locations/regions/${region.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, region?.id, '/dashboard/locations/regions'); return ( <> {region ? ( @@ -122,13 +109,7 @@ const RootRegionComponent = ({ queryRef, regionId, link }) => { }} > { element={} /> - )} + } /> +
- )} + )} /> - } + } /> - )} + } /> - )} + )} /> - )} + )} /> - )} + )} /> - )} + )} /> - )} + )} /> - +
); } return ; diff --git a/opencti-platform/opencti-front/src/private/components/observations/indicators/Root.jsx b/opencti-platform/opencti-front/src/private/components/observations/indicators/Root.jsx index 2e5fe29d90845..8468dedab551d 100644 --- a/opencti-platform/opencti-front/src/private/components/observations/indicators/Root.jsx +++ b/opencti-platform/opencti-front/src/private/components/observations/indicators/Root.jsx @@ -6,7 +6,7 @@ import * as R from 'ramda'; import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; +import StixCoreObjectContentRoot from '../../common/stix_core_objects/StixCoreObjectContentRoot'; import { QueryRenderer, requestSubscription } from '../../../../relay/environment'; import StixCoreRelationship from '../../common/stix_core_relationships/StixCoreRelationship'; import Indicator from './Indicator'; @@ -23,6 +23,7 @@ import StixCoreObjectOrStixCoreRelationshipContainers from '../../common/contain import inject18n from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; import withRouter from '../../../../utils/compat-router/withRouter'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootIndicatorSubscription($id: ID!) { @@ -95,8 +96,9 @@ class RootIndicator extends Component { if (props) { if (props.indicator) { const { indicator } = props; + const paddingRight = getPaddingRight(location.pathname, indicator.id, '/dashboard/observations/indicators', false); return ( - <> +
} + PopoverComponent={} noAliases={true} /> )} + element={()} /> - )} + } /> - )} + )} /> - )} + )} /> - )} + )} /> - )} + )} /> - )} + )} /> - )} + )} /> - )} + )} /> - +
); } return ; diff --git a/opencti-platform/opencti-front/src/private/components/observations/infrastructures/Root.tsx b/opencti-platform/opencti-front/src/private/components/observations/infrastructures/Root.tsx index 88c010fcb7e03..4cf44e85747ae 100644 --- a/opencti-platform/opencti-front/src/private/components/observations/infrastructures/Root.tsx +++ b/opencti-platform/opencti-front/src/private/components/observations/infrastructures/Root.tsx @@ -9,9 +9,9 @@ import { GraphQLSubscriptionConfig } from 'relay-runtime'; import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; +import StixCoreObjectContentRoot from '@components/common/stix_core_objects/StixCoreObjectContentRoot'; import InfrastructureKnowledge from './InfrastructureKnowledge'; import StixDomainObjectHeader from '../../common/stix_domain_objects/StixDomainObjectHeader'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; import FileManager from '../../common/files/FileManager'; import InfrastructurePopover from './InfrastructurePopover'; import Loader, { LoaderVariant } from '../../../../components/Loader'; @@ -24,6 +24,7 @@ import Infrastructure from './Infrastructure'; import useQueryLoading from '../../../../utils/hooks/useQueryLoading'; import { useFormatter } from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { getCurrentTab } from '../../../../utils/utils'; const subscription = graphql` subscription RootInfrastructureSubscription($id: ID!) { @@ -78,17 +79,17 @@ const RootInfrastructureComponent = ({ queryRef, infrastructureId }) => { useSubscription(subConfig); const data = usePreloadedQuery(infrastructureQuery, queryRef); const { infrastructure, connectorsForImport, connectorsForExport } = data; + const paddingRightValue = () => { + if (location.pathname.includes(`/dashboard/observations/infrastructures/${infrastructure.id}/knowledge`)) return 200; + if (location.pathname.includes(`/dashboard/observations/infrastructures/${infrastructure.id}/content`)) return 350; + if (location.pathname.includes(`/dashboard/observations/infrastructures/${infrastructure.id}/content/mapping`)) return 0; + return 0; + }; return ( <> {infrastructure ? (
{ sx={{ borderBottom: 1, borderColor: 'divider', marginBottom: 4 }} > { } + element={} /> { replace={true} to={`/dashboard/observations/infrastructures/${infrastructureId}/knowledge/overview`} /> - )} + )} /> } + element={} /> - )} + } /> {
) : ( - + )} ); diff --git a/opencti-platform/opencti-front/src/private/components/observations/stix_cyber_observables/Root.jsx b/opencti-platform/opencti-front/src/private/components/observations/stix_cyber_observables/Root.jsx index fc672c21ffc6e..56613e78edd52 100644 --- a/opencti-platform/opencti-front/src/private/components/observations/stix_cyber_observables/Root.jsx +++ b/opencti-platform/opencti-front/src/private/components/observations/stix_cyber_observables/Root.jsx @@ -6,7 +6,7 @@ import * as R from 'ramda'; import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; +import StixCoreObjectContentRoot from '../../common/stix_core_objects/StixCoreObjectContentRoot'; import withRouter from '../../../../utils/compat-router/withRouter'; import { QueryRenderer, requestSubscription } from '../../../../relay/environment'; import StixCoreRelationship from '../../common/stix_core_relationships/StixCoreRelationship'; @@ -22,6 +22,7 @@ import StixCoreObjectOrStixCoreRelationshipContainers from '../../common/contain import FileManager from '../../common/files/FileManager'; import inject18n from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootStixCyberObservableSubscription($id: ID!) { @@ -86,6 +87,7 @@ class RootStixCyberObservable extends Component { location, params: { observableId }, } = this.props; + const link = `/dashboard/observations/observables/${observableId}/knowledge`; return ( <> @@ -96,8 +98,9 @@ class RootStixCyberObservable extends Component { if (props) { if (props.stixCyberObservable) { const { stixCyberObservable } = props; + const paddingRight = getPaddingRight(location.pathname, stixCyberObservable.id, '/dashboard/observations/observables', false); return ( - <> +
- } + } /> - } + } /> - )} + } /> - } + } /> - } + } /> - } + } /> - } + } /> - } + } /> - } + } /> - +
); } - return ; + return ; } return ; }} diff --git a/opencti-platform/opencti-front/src/private/components/techniques/attack_patterns/Root.jsx b/opencti-platform/opencti-front/src/private/components/techniques/attack_patterns/Root.jsx index 78e8cd11a9385..ac5b66293faac 100644 --- a/opencti-platform/opencti-front/src/private/components/techniques/attack_patterns/Root.jsx +++ b/opencti-platform/opencti-front/src/private/components/techniques/attack_patterns/Root.jsx @@ -6,7 +6,7 @@ import Box from '@mui/material/Box'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import * as R from 'ramda'; -import StixCoreObjectContent from '../../common/stix_core_objects/StixCoreObjectContent'; +import StixCoreObjectContentRoot from '../../common/stix_core_objects/StixCoreObjectContentRoot'; import withRouter from '../../../../utils/compat-router/withRouter'; import { QueryRenderer, requestSubscription } from '../../../../relay/environment'; import AttackPattern from './AttackPattern'; @@ -21,6 +21,7 @@ import StixCoreObjectKnowledgeBar from '../../common/stix_core_objects/StixCoreO import ErrorNotFound from '../../../../components/ErrorNotFound'; import inject18n from '../../../../components/i18n'; import Breadcrumbs from '../../../../components/Breadcrumbs'; +import { getCurrentTab, getPaddingRight } from '../../../../utils/utils'; const subscription = graphql` subscription RootAttackPatternSubscription($id: ID!) { @@ -85,6 +86,7 @@ class RootAttackPattern extends Component { location, params: { attackPatternId }, } = this.props; + const link = `/dashboard/techniques/attack_patterns/${attackPatternId}/knowledge`; return (
@@ -117,21 +119,7 @@ class RootAttackPattern extends Component { if (props) { if (props.attackPattern) { const { attackPattern } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/techniques/attack_patterns/${attackPattern.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/techniques/attack_patterns/${attackPattern.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, attackPattern.id, '/dashboard/techniques/attack_patterns'); return (
- )} + } /> - )} + } /> { if (props) { if (props.dataComponent) { const { dataComponent } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/techniques/data_components/${dataComponent.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/techniques/data_components/${dataComponent.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, dataComponent.id, '/dashboard/techniques/data_components'); return (
{ }} > { } /> - )} + } /> { const { t_i18n } = useFormatter(); const data = usePreloadedQuery(dataSourceQuery, queryRef); const { dataSource, connectorsForImport, connectorsForExport, settings } = data; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/techniques/data_sources/${dataSource.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/techniques/data_sources/${dataSource.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, dataSource?.id, '/dashboard/techniques/data_sources'); return ( <> {dataSource ? ( @@ -114,13 +101,7 @@ const RootDataSourceComponent = ({ queryRef, dataSourceId }) => { sx={{ borderBottom: 1, borderColor: 'divider', marginBottom: 4 }} > { } /> - )} + } /> @@ -114,21 +116,7 @@ class RootNarrative extends Component { if (props) { if (props.narrative) { const { narrative } = props; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/techniques/narratives/${narrative.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/techniques/narratives/${narrative.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, narrative.id, '/dashboard/techniques/narratives'); return (
- )} + } /> @@ -122,21 +124,7 @@ class RootCampaign extends Component { if (props.campaign) { const { campaign } = props; const isOverview = location.pathname === `/dashboard/threats/campaigns/${campaign.id}`; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/threats/campaigns/${campaign.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/threats/campaigns/${campaign.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, campaign.id, '/dashboard/threats/campaigns'); return (
- )} + } /> @@ -128,21 +130,7 @@ class RootIntrusionSet extends Component { if (props.intrusionSet) { const { intrusionSet } = props; const isOverview = location.pathname === `/dashboard/threats/intrusion_sets/${intrusionSet.id}`; - let paddingRight = 0; - if ( - location.pathname.includes( - `/dashboard/threats/intrusion_sets/${intrusionSet.id}/knowledge`, - ) - ) { - paddingRight = 200; - } - if ( - location.pathname.includes( - `/dashboard/threats/intrusion_sets/${intrusionSet.id}/content`, - ) - ) { - paddingRight = 350; - } + const paddingRight = getPaddingRight(location.pathname, intrusionSet.id, '/dashboard/threats/intrusion_sets'); return (
- )} + } /> - )} + } /> @@ -161,13 +148,7 @@ const RootThreatActorIndividualComponent = ({ sx={{ borderBottom: 1, borderColor: 'divider', marginBottom: 4 }} > - )} + } /> { }; export const generateUniqueItemsArray = (submittedArray: IterableIterator | Array) => Array.from(new Set(submittedArray)); + +export const getCurrentTab = (locationPath: string, entityId: string, entityTypePath: string) => { + if (locationPath.includes(`${entityTypePath}/${entityId}/knowledge`)) return `${entityTypePath}/${entityId}/knowledge`; + if (locationPath.includes(`${entityTypePath}/${entityId}/content`)) return `${entityTypePath}/${entityId}/content`; + return locationPath; +}; + +export const getPaddingRight = (locationPath: string, entityId: string, entityTypePath: string, applyKnowledgePadding = true) => { + let paddingRight = 0; + if (entityId) { + if ( + locationPath.includes( + `${entityTypePath}/${entityId}/entities`, + ) + || locationPath.includes( + `${entityTypePath}/${entityId}/observables`, + ) + ) { + paddingRight = 250; + } + if ( + applyKnowledgePadding && locationPath.includes( + `${entityTypePath}/${entityId}/knowledge`, + ) + ) { + paddingRight = 200; + } + if ( + locationPath.includes( + `${entityTypePath}/${entityId}/content`, + ) + ) { + paddingRight = 350; + } + if ( + locationPath.includes( + `${entityTypePath}/${entityId}/content/mapping`, + ) + ) { + paddingRight = 0; + } + } + return paddingRight; +}; diff --git a/opencti-platform/opencti-graphql/config/default.json b/opencti-platform/opencti-graphql/config/default.json index d6f33438822ab..ea4e59a7d4163 100644 --- a/opencti-platform/opencti-graphql/config/default.json +++ b/opencti-platform/opencti-graphql/config/default.json @@ -4,7 +4,7 @@ "base_path": "", "base_url": "http://localhost:4000/", "enabled": true, - "disabled_dev_features": ["FAB_REPLACEMENT"], + "disabled_dev_features": ["FAB_REPLACEMENT", "CONTENT_MAPPING"], "https_cert": { "ca": [], "key": null,