diff --git a/opencti-platform/opencti-front/lang/front/de.json b/opencti-platform/opencti-front/lang/front/de.json index fb8f308b30ff..573808026e83 100644 --- a/opencti-platform/opencti-front/lang/front/de.json +++ b/opencti-platform/opencti-front/lang/front/de.json @@ -1,6 +1,7 @@ { " (reversed)": "(umgedreht)", " & ": "&", + "... successfully deleted": "{entity_type} erfolgreich gelöscht", "+ N override(s)": "+ {count} Überschreibung(en)", "0 equals no maximum": "0 entspricht keinem Maximum", "24 hours": "24 Stunden", diff --git a/opencti-platform/opencti-front/lang/front/en.json b/opencti-platform/opencti-front/lang/front/en.json index 4c0418be5ad0..6822c960b279 100644 --- a/opencti-platform/opencti-front/lang/front/en.json +++ b/opencti-platform/opencti-front/lang/front/en.json @@ -1,6 +1,7 @@ { " (reversed)": " (reversed)", " & ": " & ", + "... successfully deleted": "{entity_type} successfully deleted", "+ N override(s)": "+ {count} override(s)", "0 equals no maximum": "0 equals no maximum", "24 hours": "24 hours", diff --git a/opencti-platform/opencti-front/lang/front/es.json b/opencti-platform/opencti-front/lang/front/es.json index 44e1483d1b30..8e51a3b8e7b7 100644 --- a/opencti-platform/opencti-front/lang/front/es.json +++ b/opencti-platform/opencti-front/lang/front/es.json @@ -1,6 +1,7 @@ { " (reversed)": "(invertido)", " & ": "&", + "... successfully deleted": "{entity_type} eliminado exitosamente", "+ N override(s)": "+ {count} anulación(es)", "0 equals no maximum": "0 es igual a ningún máximo", "24 hours": "24 horas", diff --git a/opencti-platform/opencti-front/lang/front/fr.json b/opencti-platform/opencti-front/lang/front/fr.json index 6ab583f0518b..4b446aa34637 100644 --- a/opencti-platform/opencti-front/lang/front/fr.json +++ b/opencti-platform/opencti-front/lang/front/fr.json @@ -1,6 +1,7 @@ { " (reversed)": "(inversé)", " & ": " & ", + "... successfully deleted": "{entity_type} supprimé·e avec succès", "+ N override(s)": "+ {count} surcharge(s)", "0 equals no maximum": "0 pour aucun maximum", "24 hours": "24 heures", diff --git a/opencti-platform/opencti-front/lang/front/ja.json b/opencti-platform/opencti-front/lang/front/ja.json index ba0b101e8117..c87da48372be 100644 --- a/opencti-platform/opencti-front/lang/front/ja.json +++ b/opencti-platform/opencti-front/lang/front/ja.json @@ -1,6 +1,7 @@ { " (reversed)": "(逆)", " & ": "&;", + "... successfully deleted": "{entity_type} 正常に削除されました", "+ N override(s)": "+ {count} オーバーライド(複数可)", "0 equals no maximum": "0 は最大値なし", "24 hours": "24時間", diff --git a/opencti-platform/opencti-front/lang/front/ko.json b/opencti-platform/opencti-front/lang/front/ko.json index 366dd881fb44..610d30fbc241 100644 --- a/opencti-platform/opencti-front/lang/front/ko.json +++ b/opencti-platform/opencti-front/lang/front/ko.json @@ -1,6 +1,7 @@ { " (reversed)": " (역순)", " & ": " & ", + "... successfully deleted": "{entity_type} 성공적으로 삭제되었습니다", "+ N override(s)": "+ {count} 재정의", "0 equals no maximum": "0은 최대치 없음", "24 hours": "24시간", diff --git a/opencti-platform/opencti-front/lang/front/zh.json b/opencti-platform/opencti-front/lang/front/zh.json index be9d932ef0e8..13e7686cdcf7 100644 --- a/opencti-platform/opencti-front/lang/front/zh.json +++ b/opencti-platform/opencti-front/lang/front/zh.json @@ -1,6 +1,7 @@ { " (reversed)": "(反向)", " & ": "&;", + "... successfully deleted": "{entity_type} 成功删除", "+ N override(s)": "+ {count} 覆盖", "0 equals no maximum": "0 等于没有最大值", "24 hours": "24小时", diff --git a/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaDeletion.tsx b/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaDeletion.tsx new file mode 100644 index 000000000000..83228819f5d6 --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaDeletion.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import { graphql } from 'react-relay'; +import { useNavigate } from 'react-router-dom'; +import { useFormatter } from '../../../../components/i18n'; +import Security from '../../../../utils/Security'; +import Transition from '../../../../components/Transition'; +import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted'; +import useDeletion from '../../../../utils/hooks/useDeletion'; +import useApiMutation from '../../../../utils/hooks/useApiMutation'; + +const AdministrativeAreaDeletionDeleteMutation = graphql` + mutation AdministrativeAreaDeletionDeleteMutation($id: ID!) { + administrativeAreaDelete(id: $id) + } +`; + +const AdministrativeAreaDeletion = ({ id }: { id: string }) => { + const { t_i18n } = useFormatter(); + const navigate = useNavigate(); + const deleteSuccessMessage = t_i18n('', { + id: '... successfully deleted', + values: { entity_type: t_i18n('entity_Administrative-Area') }, + }); + const [commit] = useApiMutation( + AdministrativeAreaDeletionDeleteMutation, + undefined, + { successMessage: deleteSuccessMessage }, + ); + const handleClose = () => {}; + const { + deleting, + handleOpenDelete, + displayDelete, + handleCloseDelete, + setDeleting, + } = useDeletion({ handleClose }); + const submitDelete = () => { + setDeleting(true); + commit({ + variables: { + id, + }, + onCompleted: () => { + setDeleting(false); + handleClose(); + navigate('/dashboard/locations/administrative_areas'); + }, + }); + }; + return ( + <> + + + + + + + {t_i18n('Do you want to delete this area?')} + + + + + + + + + ); +}; + +export default AdministrativeAreaDeletion; diff --git a/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaEditionOverview.tsx b/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaEditionOverview.tsx index ae293141fc10..d22a4899aa5a 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaEditionOverview.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaEditionOverview.tsx @@ -4,6 +4,7 @@ import { Field, Form, Formik } from 'formik'; import * as Yup from 'yup'; import { FormikConfig } from 'formik/dist/types'; import ConfidenceField from '@components/common/form/ConfidenceField'; +import useHelper from 'src/utils/hooks/useHelper'; import TextField from '../../../../components/TextField'; import { SubscriptionFocus } from '../../../../components/Subscription'; import CreatedByField from '../../common/form/CreatedByField'; @@ -21,6 +22,7 @@ import useFormEditor, { GenericData } from '../../../../utils/hooks/useFormEdito import { fieldSpacingContainerStyle } from '../../../../utils/field'; import { GenericContext } from '../../common/model/GenericContextModel'; import AlertConfidenceForEntity from '../../../../components/AlertConfidenceForEntity'; +import AdministrativeAreaDeletion from './AdministrativeAreaDeletion'; const administrativeAreaMutationFieldPatch = graphql` mutation AdministrativeAreaEditionOverviewFieldPatchMutation( @@ -230,6 +232,8 @@ AdministrativeAreaEditionOverviewProps x_opencti_workflow_id: convertStatus(t_i18n, administrativeArea) as Option, references: [], }; + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); return ( )} + {isFABReplaced && ( + + )} )} diff --git a/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaPopover.tsx b/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaPopover.tsx index e153fb27e9e4..ccb53a80abbc 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaPopover.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/administrative_areas/AdministrativeAreaPopover.tsx @@ -20,6 +20,7 @@ import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted' import { AdministrativeAreaEditionContainerQuery } from './__generated__/AdministrativeAreaEditionContainerQuery.graphql'; import useDeletion from '../../../../utils/hooks/useDeletion'; import useApiMutation from '../../../../utils/hooks/useApiMutation'; +import useHelper from '../../../../utils/hooks/useHelper'; const AdministrativeAreaPopoverDeletionMutation = graphql` mutation AdministrativeAreaPopoverDeletionMutation($id: ID!) { @@ -67,53 +68,58 @@ const AdministrativeAreaPopover = ({ id }: { id: string }) => { }, }); }; - return ( - <> - - - - - {t_i18n('Update')} - - {t_i18n('Delete')} - - - - - - {t_i18n('Do you want to delete this area?')} - - - - - - - - {queryRef && ( - }> - - - )} - - ); + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); + + return isFABReplaced + ? (<>) + : ( + <> + + + + + {t_i18n('Update')} + + {t_i18n('Delete')} + + + + + + {t_i18n('Do you want to delete this area?')} + + + + + + + + {queryRef && ( + }> + + + )} + + ); }; export default AdministrativeAreaPopover; diff --git a/opencti-platform/opencti-front/src/private/components/locations/cities/CityDeletion.tsx b/opencti-platform/opencti-front/src/private/components/locations/cities/CityDeletion.tsx new file mode 100644 index 000000000000..8b29625761c2 --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/locations/cities/CityDeletion.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import { graphql } from 'react-relay'; +import { useNavigate } from 'react-router-dom'; +import { useFormatter } from '../../../../components/i18n'; +import Security from '../../../../utils/Security'; +import Transition from '../../../../components/Transition'; +import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted'; +import useDeletion from '../../../../utils/hooks/useDeletion'; +import useApiMutation from '../../../../utils/hooks/useApiMutation'; + +const CityDeletionDeleteMutation = graphql` + mutation CityDeletionDeleteMutation($id: ID!) { + cityEdit(id: $id) { + delete + } + } +`; + +const CityDeletion = ({ id }: { id: string }) => { + const { t_i18n } = useFormatter(); + const navigate = useNavigate(); + const deleteSuccessMessage = t_i18n('', { + id: '... successfully deleted', + values: { entity_type: t_i18n('entity_City') }, + }); + const [commit] = useApiMutation( + CityDeletionDeleteMutation, + undefined, + { successMessage: deleteSuccessMessage }, + ); + const handleClose = () => { }; + const { + deleting, + handleOpenDelete, + displayDelete, + handleCloseDelete, + setDeleting, + } = useDeletion({ handleClose }); + + const submitDelete = () => { + setDeleting(true); + commit({ + variables: { + id, + }, + onCompleted: () => { + setDeleting(false); + handleClose(); + navigate('/dashboard/locations/cities'); + }, + }); + }; + return ( +
+ + + + + + + {t_i18n('Do you want to delete this city?')} + + + + + + + +
+ ); +}; + +export default CityDeletion; diff --git a/opencti-platform/opencti-front/src/private/components/locations/cities/CityEditionOverview.tsx b/opencti-platform/opencti-front/src/private/components/locations/cities/CityEditionOverview.tsx index a8de69230a0f..f91306d3319c 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/cities/CityEditionOverview.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/cities/CityEditionOverview.tsx @@ -5,6 +5,7 @@ import * as Yup from 'yup'; import { FormikConfig } from 'formik/dist/types'; import { GenericContext } from '@components/common/model/GenericContextModel'; import ConfidenceField from '@components/common/form/ConfidenceField'; +import useHelper from 'src/utils/hooks/useHelper'; import TextField from '../../../../components/TextField'; import { SubscriptionFocus } from '../../../../components/Subscription'; import CreatedByField from '../../common/form/CreatedByField'; @@ -21,6 +22,7 @@ import { useSchemaEditionValidation } from '../../../../utils/hooks/useEntitySet import useFormEditor, { GenericData } from '../../../../utils/hooks/useFormEditor'; import { fieldSpacingContainerStyle } from '../../../../utils/field'; import AlertConfidenceForEntity from '../../../../components/AlertConfidenceForEntity'; +import CityDeletion from './CityDeletion'; const cityMutationFieldPatch = graphql` mutation CityEditionOverviewFieldPatchMutation( @@ -217,6 +219,8 @@ const CityEditionOverview: FunctionComponent = ({ objectMarking: convertMarkings(city), x_opencti_workflow_id: convertStatus(t_i18n, city) as Option, }; + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); return ( = ({ id={city.id} /> )} + {isFABReplaced && ( + + )} )} diff --git a/opencti-platform/opencti-front/src/private/components/locations/cities/CityPopover.tsx b/opencti-platform/opencti-front/src/private/components/locations/cities/CityPopover.tsx index 915eb5d72093..02177dd65c1c 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/cities/CityPopover.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/cities/CityPopover.tsx @@ -21,6 +21,7 @@ import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted' import { CityEditionContainerQuery } from './__generated__/CityEditionContainerQuery.graphql'; import useDeletion from '../../../../utils/hooks/useDeletion'; 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. @@ -80,53 +81,58 @@ const CityPopover = ({ id }: { id: string }) => { }, }); }; - return ( -
- - - - - {t_i18n('Update')} - - {t_i18n('Delete')} - - - - - - {t_i18n('Do you want to delete this city?')} - - - - - - - - {queryRef && ( - }> - - - )} -
- ); + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); + + return isFABReplaced + ? (<>) + : ( +
+ + + + + {t_i18n('Update')} + + {t_i18n('Delete')} + + + + + + {t_i18n('Do you want to delete this city?')} + + + + + + + + {queryRef && ( + }> + + + )} +
+ ); }; export default CityPopover; diff --git a/opencti-platform/opencti-front/src/private/components/locations/countries/CountryDeletion.tsx b/opencti-platform/opencti-front/src/private/components/locations/countries/CountryDeletion.tsx new file mode 100644 index 000000000000..f705e1726e4f --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/locations/countries/CountryDeletion.tsx @@ -0,0 +1,96 @@ +import React, { useState } from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import { graphql } from 'react-relay'; +import { useNavigate } from 'react-router-dom'; +import { useFormatter } from '../../../../components/i18n'; +import Security from '../../../../utils/Security'; +import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted'; +import Transition from '../../../../components/Transition'; +import useApiMutation from '../../../../utils/hooks/useApiMutation'; + +const CountryDeletionDeleteMutation = graphql` + mutation CountryDeletionDeleteMutation($id: ID!) { + countryEdit(id: $id) { + delete + } + } +`; + +const CountryDeletion = ({ id }: { id: string }) => { + const { t_i18n } = useFormatter(); + const navigate = useNavigate(); + const [deleting, setDeleting] = useState(false); + const [displayDelete, setDisplayDelete] = useState(false); + const deleteSuccessMessage = t_i18n('', { + id: '... successfully deleted', + values: { entity_type: t_i18n('entity_Country') }, + }); + const [commit] = useApiMutation( + CountryDeletionDeleteMutation, + undefined, + { successMessage: deleteSuccessMessage }, + ); + const handleClose = () => {}; + const handleOpenDelete = () => { + setDisplayDelete(true); + handleClose(); + }; + const handleCloseDelete = () => { + setDisplayDelete(false); + }; + const submitDelete = () => { + setDeleting(true); + commit({ + variables: { + id, + }, + onCompleted: () => { + setDeleting(false); + handleClose(); + navigate('/dashboard/locations/countries'); + }, + }); + }; + return ( + <> + + + + + + + {t_i18n('Do you want to delete this country?')} + + + + + + + + + ); +}; + +export default CountryDeletion; diff --git a/opencti-platform/opencti-front/src/private/components/locations/countries/CountryEditionOverview.tsx b/opencti-platform/opencti-front/src/private/components/locations/countries/CountryEditionOverview.tsx index 511895451dd7..e7e7c381d444 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/countries/CountryEditionOverview.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/countries/CountryEditionOverview.tsx @@ -4,6 +4,7 @@ import { Field, Form, Formik } from 'formik'; import * as Yup from 'yup'; import { FormikConfig } from 'formik/dist/types'; import ConfidenceField from '@components/common/form/ConfidenceField'; +import useHelper from 'src/utils/hooks/useHelper'; import { useFormatter } from '../../../../components/i18n'; import TextField from '../../../../components/TextField'; import { SubscriptionFocus } from '../../../../components/Subscription'; @@ -21,6 +22,7 @@ import useFormEditor, { GenericData } from '../../../../utils/hooks/useFormEdito import { fieldSpacingContainerStyle } from '../../../../utils/field'; import { GenericContext } from '../../common/model/GenericContextModel'; import AlertConfidenceForEntity from '../../../../components/AlertConfidenceForEntity'; +import CountryDeletion from './CountryDeletion'; const countryMutationFieldPatch = graphql` mutation CountryEditionOverviewFieldPatchMutation( @@ -213,6 +215,8 @@ CountryEditionOverviewProps objectMarking: convertMarkings(country), x_opencti_workflow_id: convertStatus(t_i18n, country) as Option, }; + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); return ( )} + {isFABReplaced && ( + + )} )} diff --git a/opencti-platform/opencti-front/src/private/components/locations/countries/CountryPopover.tsx b/opencti-platform/opencti-front/src/private/components/locations/countries/CountryPopover.tsx index 812f56cf9ce2..64870afee52f 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/countries/CountryPopover.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/countries/CountryPopover.tsx @@ -18,6 +18,7 @@ import { CountryEditionContainerQuery } from './__generated__/CountryEditionCont import Transition from '../../../../components/Transition'; import CountryEditionContainer, { countryEditionQuery } from './CountryEditionContainer'; import useApiMutation from '../../../../utils/hooks/useApiMutation'; +import useHelper from '../../../../utils/hooks/useHelper'; const CountryPopoverDeletionMutation = graphql` mutation CountryPopoverDeletionMutation($id: ID!) { @@ -69,53 +70,59 @@ const CountryPopover = ({ id }: { id: string }) => { }, }); }; - return ( - <> - - - - - {t_i18n('Update')} - - {t_i18n('Delete')} - - - - - - {t_i18n('Do you want to delete this country?')} - - - - - - - - {queryRef && ( - }> - - - )} - - ); + + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); + + return isFABReplaced + ? (<>) + : ( + <> + + + + + {t_i18n('Update')} + + {t_i18n('Delete')} + + + + + + {t_i18n('Do you want to delete this country?')} + + + + + + + + {queryRef && ( + }> + + + )} + + ); }; export default CountryPopover; diff --git a/opencti-platform/opencti-front/src/private/components/locations/positions/PositionDeletion.tsx b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionDeletion.tsx new file mode 100644 index 000000000000..eea2de2e59b5 --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionDeletion.tsx @@ -0,0 +1,97 @@ +import React, { FunctionComponent, useState } from 'react'; +import { graphql } from 'react-relay'; +import { useNavigate } from 'react-router-dom'; +import { Button, Dialog, DialogActions, DialogContent, DialogContentText } from '@mui/material'; +import { useFormatter } from '../../../../components/i18n'; +import useApiMutation from '../../../../utils/hooks/useApiMutation'; +import Security from '../../../../utils/Security'; +import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted'; +import Transition from '../../../../components/Transition'; + +const positionDeletionMutation = graphql` + mutation PositionDeletionMutation($id: ID!) { + positionEdit(id: $id) { + delete + } + } +`; + +interface PositionDeletionProps { + positionId: string; + handleClose?: () => void; +} + +const PositionDeletion: FunctionComponent = ({ + positionId, + handleClose, +}) => { + const { t_i18n } = useFormatter(); + const navigate = useNavigate(); + const [displayDelete, setDisplayDelete] = useState(false); + const [deleting, setDeleting] = useState(false); + const deleteSuccessMessage = t_i18n('', { + id: '... successfully deleted', + values: { entity_type: t_i18n('entity_Position') }, + }); + const [commitMutation] = useApiMutation( + positionDeletionMutation, + undefined, + { successMessage: deleteSuccessMessage }, + ); + + const handleOpenDelete = () => setDisplayDelete(true); + const handleCloseDelete = () => { + setDeleting(false); + setDisplayDelete(false); + }; + + const submitDelete = () => { + setDeleting(true); + commitMutation({ + variables: { id: positionId }, + onCompleted: () => { + setDeleting(false); + if (typeof handleClose === 'function') handleClose(); + navigate('/dashboard/locations/positions'); + }, + }); + }; + + return ( + <> + + + + + + + {t_i18n('Do you want to delete this position?')} + + + + + + + + + ); +}; + +export default PositionDeletion; diff --git a/opencti-platform/opencti-front/src/private/components/locations/positions/PositionEditionContainer.jsx b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionEditionContainer.jsx index 8bae158b6f2f..913a09f560b4 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/positions/PositionEditionContainer.jsx +++ b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionEditionContainer.jsx @@ -5,11 +5,12 @@ import PositionEditionOverview from './PositionEditionOverview'; import { useIsEnforceReference } from '../../../../utils/hooks/useEntitySettings'; import Drawer, { DrawerVariant } from '../../common/drawer/Drawer'; import useHelper from '../../../../utils/hooks/useHelper'; +import PositionDeletion from './PositionDeletion'; const PositionEditionContainer = (props) => { const { t_i18n } = useFormatter(); const { isFeatureEnable } = useHelper(); - const FABReplaced = isFeatureEnable('FAB_REPLACEMENT'); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); const { handleClose, position, open, controlledDial } = props; const { editContext } = position; return ( @@ -17,16 +18,23 @@ const PositionEditionContainer = (props) => { title={t_i18n('Update a position')} open={open} onClose={handleClose} - variant={!FABReplaced && open == null ? DrawerVariant.update : undefined} + variant={!isFABReplaced && open == null ? DrawerVariant.update : undefined} context={editContext} - controlledDial={FABReplaced ? controlledDial : undefined} + controlledDial={isFABReplaced ? controlledDial : undefined} > - + <> + + {isFABReplaced && ( + + )} + ); }; diff --git a/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopover.jsx b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopover.jsx index 15b50f65c77d..a697a28e59f1 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopover.jsx +++ b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopover.jsx @@ -1,144 +1,76 @@ -import React, { Component } from 'react'; -import * as PropTypes from 'prop-types'; -import { compose } from 'ramda'; +import React, { useState } from 'react'; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; -import Button from '@mui/material/Button'; import ToggleButton from '@mui/material/ToggleButton'; -import Dialog from '@mui/material/Dialog'; -import DialogActions from '@mui/material/DialogActions'; -import DialogContent from '@mui/material/DialogContent'; -import DialogContentText from '@mui/material/DialogContentText'; import Slide from '@mui/material/Slide'; import MoreVert from '@mui/icons-material/MoreVert'; -import { graphql } from 'react-relay'; -import withRouter from '../../../../utils/compat_router/withRouter'; -import inject18n from '../../../../components/i18n'; -import { commitMutation, QueryRenderer } from '../../../../relay/environment'; +import { useFormatter } from '../../../../components/i18n'; import { positionEditionQuery } from './PositionEdition'; import PositionEditionContainer from './PositionEditionContainer'; import Security from '../../../../utils/Security'; import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted'; +import useHelper from '../../../../utils/hooks/useHelper'; +import { QueryRenderer } from '../../../../relay/environment'; +import PositionPopoverDeletion from './PositionPopoverDeletion'; const Transition = React.forwardRef((props, ref) => ( )); Transition.displayName = 'TransitionSlide'; -const PositionPopoverDeletionMutation = graphql` - mutation PositionPopoverDeletionMutation($id: ID!) { - positionEdit(id: $id) { - delete - } - } -`; +const PositionPopover = ({ id }) => { + const { t_i18n } = useFormatter(); + const [anchorEl, setAnchorEl] = useState(null); + const [displayDelete, setDisplayDelete] = useState(false); + const [displayEdit, setDisplayEdit] = useState(false); + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); + const handleOpen = (event) => setAnchorEl(event.currentTarget); + const handleClose = () => setAnchorEl(null); + const handleOpenDelete = () => { + setDisplayDelete(true); + handleClose(); + }; + const handleCloseDelete = () => { + setDisplayDelete(false); + }; + const handleOpenEdit = () => { + setDisplayEdit(true); + handleClose(); + }; + const handleCloseEdit = () => setDisplayEdit(false); -class PositionPopover extends Component { - constructor(props) { - super(props); - this.state = { - anchorEl: null, - displayDelete: false, - displayEdit: false, - deleting: false, - }; - } - - handleOpen(event) { - this.setState({ anchorEl: event.currentTarget }); - } - - handleClose() { - this.setState({ anchorEl: null }); - } - - handleOpenDelete() { - this.setState({ displayDelete: true }); - this.handleClose(); - } - - handleCloseDelete() { - this.setState({ displayDelete: false }); - } - - submitDelete() { - this.setState({ deleting: true }); - commitMutation({ - mutation: PositionPopoverDeletionMutation, - variables: { - id: this.props.id, - }, - onCompleted: () => { - this.setState({ deleting: false }); - this.handleClose(); - this.props.navigate('/dashboard/locations/positions'); - }, - }); - } - - handleOpenEdit() { - this.setState({ displayEdit: true }); - this.handleClose(); - } - - handleCloseEdit() { - this.setState({ displayEdit: false }); - } - - render() { - const { t, id } = this.props; - return ( + return isFABReplaced + ? (<>) + : ( <> - - {t('Update')} + + {t_i18n('Update')} - - {t('Delete')} + + {t_i18n('Delete')} - - - - {t('Do you want to delete this position?')} - - - - - - - + ); } @@ -157,13 +89,5 @@ class PositionPopover extends Component { /> ); - } -} - -PositionPopover.propTypes = { - id: PropTypes.string, - t: PropTypes.func, - navigate: PropTypes.func, }; - -export default compose(inject18n, withRouter)(PositionPopover); +export default PositionPopover; diff --git a/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopoverDeletion.tsx b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopoverDeletion.tsx new file mode 100644 index 000000000000..ad60da3f6b8a --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/locations/positions/PositionPopoverDeletion.tsx @@ -0,0 +1,81 @@ +import { graphql } from 'react-relay'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import React, { FunctionComponent, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import DialogContentText from '@mui/material/DialogContentText'; +import { useFormatter } from '../../../../components/i18n'; +import Transition from '../../../../components/Transition'; +import useApiMutation from '../../../../utils/hooks/useApiMutation'; + +const PositionPopoverDeletionMutation = graphql` + mutation PositionPopoverDeletionMutation($id: ID!) { + positionEdit(id: $id) { + delete + } + } +`; + +interface PositionPopoverDeletionProps { + positionId: string; + displayDelete: boolean; + handleClose: () => void; + handleCloseDelete: () => void; +} + +const PositionPopoverDeletion: FunctionComponent = ({ + positionId, + displayDelete, + handleClose, + handleCloseDelete, +}) => { + const { t_i18n } = useFormatter(); + const navigate = useNavigate(); + const [deleting, setDeleting] = useState(false); + const deleteSuccessMessage = t_i18n('', { + id: '... successfully deleted', + values: { entity_type: t_i18n('entity_Position') }, + }); + const [commitMutation] = useApiMutation( + PositionPopoverDeletionMutation, + undefined, + { successMessage: deleteSuccessMessage }, + ); + const submitDelete = () => { + setDeleting(true); + commitMutation({ + variables: { id: positionId }, + onCompleted: () => { + setDeleting(false); + handleClose(); + navigate('/dashboard/locations/positions'); + }, + }); + }; + return ( + + + + {t_i18n('Do you want to delete this position?')} + + + + + + + + ); +}; + +export default PositionPopoverDeletion; diff --git a/opencti-platform/opencti-front/src/private/components/locations/positions/Root.tsx b/opencti-platform/opencti-front/src/private/components/locations/positions/Root.tsx index 3bd6e88f728a..1813fde0eb13 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/positions/Root.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/positions/Root.tsx @@ -141,7 +141,7 @@ const RootPosition = ({ positionId, queryRef }: RootPositionProps) => { entityType="Position" disableSharing={true} stixDomainObject={position} - PopoverComponent={} + PopoverComponent={} EditComponent={isFABReplaced && ( diff --git a/opencti-platform/opencti-front/src/private/components/locations/regions/RegionDeletion.tsx b/opencti-platform/opencti-front/src/private/components/locations/regions/RegionDeletion.tsx new file mode 100644 index 000000000000..4f15d3e255a1 --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/locations/regions/RegionDeletion.tsx @@ -0,0 +1,97 @@ +import React, { useState } from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import { graphql } from 'react-relay'; +import { useNavigate } from 'react-router-dom'; +import { useFormatter } from '../../../../components/i18n'; +import Security from '../../../../utils/Security'; +import { KNOWLEDGE_KNUPDATE_KNDELETE } from '../../../../utils/hooks/useGranted'; +import useApiMutation from '../../../../utils/hooks/useApiMutation'; +import Transition from '../../../../components/Transition'; + +const RegionDeletionDeleteMutation = graphql` + mutation RegionDeletionDeleteMutation($id: ID!) { + regionEdit(id: $id) { + delete + } + } +`; + +const RegionDeletion = ({ id }: { id: string }) => { + const { t_i18n } = useFormatter(); + const navigate = useNavigate(); + const [deleting, setDeleting] = useState(false); + const [displayDelete, setDisplayDelete] = useState(false); + const deleteSuccessMessage = t_i18n('', { + id: '... successfully deleted', + values: { entity_type: t_i18n('entity_Region') }, + }); + const [commit] = useApiMutation( + RegionDeletionDeleteMutation, + undefined, + { successMessage: deleteSuccessMessage }, + ); + const handleClose = () => {}; + const handleOpenDelete = () => { + setDisplayDelete(true); + handleClose(); + }; + const handleCloseDelete = () => { + setDisplayDelete(false); + }; + const submitDelete = () => { + setDeleting(true); + commit({ + variables: { + id, + }, + onCompleted: () => { + setDeleting(false); + handleClose(); + navigate('/dashboard/locations/regions'); + }, + }); + }; + + return ( +
+ + + + + + + {t_i18n('Do you want to delete this region?')} + + + + + + + +
+ ); +}; + +export default RegionDeletion; diff --git a/opencti-platform/opencti-front/src/private/components/locations/regions/RegionEditionOverview.tsx b/opencti-platform/opencti-front/src/private/components/locations/regions/RegionEditionOverview.tsx index 28220dda0ae8..9b48a24d37cd 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/regions/RegionEditionOverview.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/regions/RegionEditionOverview.tsx @@ -4,6 +4,7 @@ import { Field, Form, Formik } from 'formik'; import * as Yup from 'yup'; import { FormikConfig } from 'formik/dist/types'; import ConfidenceField from '@components/common/form/ConfidenceField'; +import useHelper from 'src/utils/hooks/useHelper'; import TextField from '../../../../components/TextField'; import { SubscriptionFocus } from '../../../../components/Subscription'; import CreatedByField from '../../common/form/CreatedByField'; @@ -21,6 +22,7 @@ import useFormEditor, { GenericData } from '../../../../utils/hooks/useFormEdito import { fieldSpacingContainerStyle } from '../../../../utils/field'; import { GenericContext } from '../../common/model/GenericContextModel'; import AlertConfidenceForEntity from '../../../../components/AlertConfidenceForEntity'; +import RegionDeletion from './RegionDeletion'; const regionMutationFieldPatch = graphql` mutation RegionEditionOverviewFieldPatchMutation( @@ -213,6 +215,8 @@ RegionEdititionOverviewProps x_opencti_workflow_id: convertStatus(t_i18n, region) as Option, references: [], }; + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); return ( )} + {isFABReplaced && ( + + )} )} diff --git a/opencti-platform/opencti-front/src/private/components/locations/regions/RegionPopover.tsx b/opencti-platform/opencti-front/src/private/components/locations/regions/RegionPopover.tsx index c09250301c7a..e601829aa9ed 100644 --- a/opencti-platform/opencti-front/src/private/components/locations/regions/RegionPopover.tsx +++ b/opencti-platform/opencti-front/src/private/components/locations/regions/RegionPopover.tsx @@ -19,6 +19,7 @@ import { RegionEditionContainerQuery } from './__generated__/RegionEditionContai import Transition from '../../../../components/Transition'; import RegionEditionContainer, { regionEditionQuery } from './RegionEditionContainer'; 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. @@ -80,53 +81,59 @@ const RegionPopover = ({ id }: { id: string }) => { }, }); }; - return ( -
- - - - - {t_i18n('Update')} - - {t_i18n('Delete')} - - - - - - {t_i18n('Do you want to delete this region?')} - - - - - - - - {queryRef && ( - }> - - - )} -
- ); + + const { isFeatureEnable } = useHelper(); + const isFABReplaced = isFeatureEnable('FAB_REPLACEMENT'); + + return isFABReplaced + ? (<>) + : ( +
+ + + + + {t_i18n('Update')} + + {t_i18n('Delete')} + + + + + + {t_i18n('Do you want to delete this region?')} + + + + + + + + {queryRef && ( + }> + + + )} +
+ ); }; export default RegionPopover;