diff --git a/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx b/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx new file mode 100644 index 0000000000..8165c36ded --- /dev/null +++ b/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx @@ -0,0 +1,49 @@ +import React, { useState } from 'react'; +import { Box, styled, Typography } from '@mui/material'; +import { Dialogue } from 'component/common/Dialogue/Dialogue'; +import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect'; + +interface IAddDependencyDialogueProps { + showDependencyDialogue: boolean; + onClose: () => void; +} + +const StyledSelect = styled(GeneralSelect)(({ theme }) => ({ + marginTop: theme.spacing(2), + marginBottom: theme.spacing(1.5), +})); + +export const AddDependencyDialogue = ({ + showDependencyDialogue, + onClose, +}: IAddDependencyDialogueProps) => { + const [dependency, setDependency] = useState(''); + + return ( + {}} + primaryButtonText={'Add'} + secondaryButtonText="Cancel" + > + + You feature will be evaluated only when the selected parent + feature is enabled in the same environment. +
+
+ What feature do you want to depend on? + +
+
+ ); +}; diff --git a/frontend/src/component/feature/FeatureView/FeatureEnvironmentSeen/FeatureEnvironmentSeen.tsx b/frontend/src/component/feature/FeatureView/FeatureEnvironmentSeen/FeatureEnvironmentSeen.tsx index 00a037dd30..49e67ebd71 100644 --- a/frontend/src/component/feature/FeatureView/FeatureEnvironmentSeen/FeatureEnvironmentSeen.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureEnvironmentSeen/FeatureEnvironmentSeen.tsx @@ -105,7 +105,10 @@ export const FeatureEnvironmentSeen = ({ ) } elseShow={ - + } diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverview.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverview.tsx index 0e61d6b7e1..d20bf30591 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverview.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverview.tsx @@ -1,6 +1,6 @@ import FeatureOverviewMetaData from './FeatureOverviewMetaData/FeatureOverviewMetaData'; import FeatureOverviewEnvironments from './FeatureOverviewEnvironments/FeatureOverviewEnvironments'; -import { Routes, Route, useNavigate } from 'react-router-dom'; +import { Route, Routes, useNavigate } from 'react-router-dom'; import { FeatureStrategyCreate } from 'component/feature/FeatureStrategy/FeatureStrategyCreate/FeatureStrategyCreate'; import { SidebarModal } from 'component/common/SidebarModal/SidebarModal'; import { @@ -12,9 +12,6 @@ import { usePageTitle } from 'hooks/usePageTitle'; import { FeatureOverviewSidePanel } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanel'; import { useHiddenEnvironments } from 'hooks/useHiddenEnvironments'; import { styled } from '@mui/material'; -import { AddDependency } from '../../Dependencies/AddDependency'; -import { useUiFlag } from 'hooks/useUiFlag'; -import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; const StyledContainer = styled('div')(({ theme }) => ({ display: 'flex', @@ -42,7 +39,6 @@ const FeatureOverview = () => { useHiddenEnvironments(); const onSidebarClose = () => navigate(featurePath); usePageTitle(featureId); - const dependentFeatures = useUiFlag('dependentFeatures'); return ( @@ -54,16 +50,6 @@ const FeatureOverview = () => { /> - - } - /> - diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.test.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.test.tsx new file mode 100644 index 0000000000..5a5612e576 --- /dev/null +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.test.tsx @@ -0,0 +1,30 @@ +import { screen } from '@testing-library/react'; +import { render } from 'utils/testRenderer'; +import { FeatureOverviewSidePanelDetails } from './FeatureOverviewSidePanelDetails'; +import { IFeatureToggle } from 'interfaces/featureToggle'; +import { testServerRoute, testServerSetup } from 'utils/testServer'; + +const server = testServerSetup(); + +testServerRoute(server, '/api/admin/ui-config', { + flags: { + dependentFeatures: true, + }, +}); + +test('show dependency dialogue', async () => { + render( + + ); + + const addParentButton = await screen.findByText('Add parent feature'); + + addParentButton.click(); + + expect( + screen.getByText('Add parent feature dependency') + ).toBeInTheDocument(); +}); diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx index 85ed4bdda3..46a0a9669c 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx @@ -1,14 +1,20 @@ import { IFeatureToggle } from 'interfaces/featureToggle'; -import { styled } from '@mui/material'; +import { Button, styled, Box } from '@mui/material'; import { useLocationSettings } from 'hooks/useLocationSettings'; import { formatDateYMD } from 'utils/formatDate'; import { parseISO } from 'date-fns'; import { FeatureEnvironmentSeen } from '../../../FeatureEnvironmentSeen/FeatureEnvironmentSeen'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; +import { Add } from '@mui/icons-material'; +import { useUiFlag } from 'hooks/useUiFlag'; +import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; +import { AddDependencyDialogue } from 'component/feature/Dependencies/AddDependencyDialogue'; +import { useState } from 'react'; const StyledContainer = styled('div')(({ theme }) => ({ display: 'flex', flexDirection: 'column', + justifyItems: 'center', padding: theme.spacing(3), fontSize: theme.fontSizes.smallBody, })); @@ -40,11 +46,14 @@ export const FeatureOverviewSidePanelDetails = ({ }: IFeatureOverviewSidePanelDetailsProps) => { const { locationSettings } = useLocationSettings(); const { uiConfig } = useUiConfig(); + const dependentFeatures = useUiFlag('dependentFeatures'); const showLastSeenByEnvironment = Boolean( uiConfig.flags.lastSeenByEnvironment ); + const [showDependencyDialogue, setShowDependencyDialogue] = useState(false); + return ( {header} @@ -66,6 +75,30 @@ export const FeatureOverviewSidePanelDetails = ({ /> )} + + + Dependency: + + + + } + /> + setShowDependencyDialogue(false)} + showDependencyDialogue={ + dependentFeatures && showDependencyDialogue + } + /> ); };