diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.styles.ts
deleted file mode 100644
index 8c92b9067c..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.styles.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- label: {
- display: 'inline-flex',
- alignItems: 'center',
- cursor: 'pointer',
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.tsx
index 178c6a0fae..0dbb8e2c54 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvSwitches/FeatureOverviewEnvSwitch/FeatureOverviewEnvSwitch.tsx
@@ -8,12 +8,12 @@ import StringTruncator from 'component/common/StringTruncator/StringTruncator';
import { UPDATE_FEATURE_ENVIRONMENT } from 'component/providers/AccessProvider/permissions';
import React from 'react';
import { formatUnknownError } from 'utils/formatUnknownError';
-import { useStyles } from './FeatureOverviewEnvSwitch.styles';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import { useChangeRequestToggle } from 'hooks/useChangeRequestToggle';
import { ChangeRequestDialogue } from 'component/changeRequest/ChangeRequestConfirmDialog/ChangeRequestConfirmDialog';
import { UpdateEnabledMessage } from '../../../../../changeRequest/ChangeRequestConfirmDialog/ChangeRequestMessages/UpdateEnabledMessage';
import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled';
+import { styled } from '@mui/material';
interface IFeatureOverviewEnvSwitchProps {
env: IFeatureEnvironment;
@@ -22,6 +22,12 @@ interface IFeatureOverviewEnvSwitchProps {
showInfoBox: () => void;
}
+const StyledLabel = styled('label')({
+ display: 'inline-flex',
+ alignItems: 'center',
+ cursor: 'pointer',
+});
+
const FeatureOverviewEnvSwitch = ({
env,
callback,
@@ -34,7 +40,6 @@ const FeatureOverviewEnvSwitch = ({
useFeatureApi();
const { refetchFeature } = useFeature(projectId, featureId);
const { setToastData, setToastApiError } = useToast();
- const { classes: styles } = useStyles();
const { isChangeRequestConfigured } = useChangeRequestsEnabled(projectId);
const {
onChangeRequestToggle,
@@ -110,7 +115,7 @@ const FeatureOverviewEnvSwitch = ({
return (
-
+
{content}
-
+
({
- accordionBodyInnerContainer: {
- [theme.breakpoints.down(400)]: {
- padding: '0.5rem',
- },
- },
- accordionBody: {
- width: '100%',
- position: 'relative',
- paddingBottom: '1rem',
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/EnvironmentAccordionBody.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/EnvironmentAccordionBody.tsx
index 4f738d3406..38a274b104 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/EnvironmentAccordionBody.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/EnvironmentAccordionBody.tsx
@@ -1,5 +1,5 @@
import { DragEventHandler, RefObject, useEffect, useState } from 'react';
-import { Alert } from '@mui/material';
+import { Alert, styled } from '@mui/material';
import useFeatureStrategyApi from 'hooks/api/actions/useFeatureStrategyApi/useFeatureStrategyApi';
import { formatUnknownError } from 'utils/formatUnknownError';
import useToast from 'hooks/useToast';
@@ -8,7 +8,6 @@ import { StrategyDraggableItem } from './StrategyDraggableItem/StrategyDraggable
import { IFeatureEnvironment } from 'interfaces/featureToggle';
import { FeatureStrategyEmpty } from 'component/feature/FeatureStrategy/FeatureStrategyEmpty/FeatureStrategyEmpty';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
-import { useStyles } from './EnvironmentAccordionBody.styles';
import { useFeature } from 'hooks/api/getters/useFeature/useFeature';
interface IEnvironmentAccordionBodyProps {
@@ -17,6 +16,18 @@ interface IEnvironmentAccordionBodyProps {
otherEnvironments?: IFeatureEnvironment['name'][];
}
+const StyledAccordionBody = styled('div')(({ theme }) => ({
+ width: '100%',
+ position: 'relative',
+ paddingBottom: theme.spacing(2),
+}));
+
+const StyledAccordionBodyInnerContainer = styled('div')(({ theme }) => ({
+ [theme.breakpoints.down(400)]: {
+ padding: theme.spacing(1),
+ },
+}));
+
const EnvironmentAccordionBody = ({
featureEnvironment,
isDisabled,
@@ -35,7 +46,6 @@ const EnvironmentAccordionBody = ({
index: number;
height: number;
} | null>(null);
- const { classes: styles } = useStyles();
useEffect(() => {
// Use state to enable drag and drop, but switch to API output when it arrives
setStrategies(featureEnvironment?.strategies || []);
@@ -128,8 +138,8 @@ const EnvironmentAccordionBody = ({
};
return (
-
-
+
+
0 && isDisabled}
show={() => (
@@ -166,8 +176,8 @@ const EnvironmentAccordionBody = ({
/>
}
/>
-
-
+
+
);
};
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.styles.ts
deleted file mode 100644
index dc31d5fc97..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.styles.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- container: {
- width: '100%',
- padding: theme.spacing(2, 3),
- borderRadius: theme.shape.borderRadiusMedium,
- border: `1px solid ${theme.palette.divider}`,
- },
- chip: {
- margin: '0.25rem',
- },
- paragraph: {
- display: 'inline',
- margin: '0.25rem 0',
- maxWidth: '95%',
- textAlign: 'center',
- wordBreak: 'break-word',
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.tsx
index 727d9ce42d..40b697890f 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/ConstraintItem/ConstraintItem.tsx
@@ -1,6 +1,5 @@
-import { Chip } from '@mui/material';
+import { Chip, styled } from '@mui/material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
-import { useStyles } from './ConstraintItem.styles';
import StringTruncator from 'component/common/StringTruncator/StringTruncator';
interface IConstraintItemProps {
@@ -8,22 +7,40 @@ interface IConstraintItemProps {
text: string;
}
+const StyledContainer = styled('div')(({ theme }) => ({
+ width: '100%',
+ padding: theme.spacing(2, 3),
+ borderRadius: theme.shape.borderRadiusMedium,
+ border: `1px solid ${theme.palette.divider}`,
+}));
+
+const StyledParagraph = styled('p')(({ theme }) => ({
+ display: 'inline',
+ margin: theme.spacing(0.5, 0),
+ maxWidth: '95%',
+ textAlign: 'center',
+ wordBreak: 'break-word',
+}));
+
+const StyledChip = styled(Chip)(({ theme }) => ({
+ margin: theme.spacing(0.5),
+}));
+
export const ConstraintItem = ({ value, text }: IConstraintItemProps) => {
- const { classes: styles } = useStyles();
return (
-
+
No {text}s added yet.}
elseShow={
-
+
{value.length}{' '}
{value.length > 1 ? `${text}s` : text} will get
access.
-
+
{value.map((v: string) => (
-
{
maxLength={50}
/>
}
- className={styles.chip}
/>
))}
}
/>
-
+
);
};
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.styles.ts
deleted file mode 100644
index a570236fbd..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.styles.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- valueContainer: {
- padding: theme.spacing(2, 3),
- border: `1px solid ${theme.palette.dividerAlternative}`,
- borderRadius: theme.shape.borderRadiusMedium,
- },
- valueSeparator: {
- color: theme.palette.grey[700],
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx
index 62de42ff6f..8202c01c02 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx
@@ -1,6 +1,6 @@
import { Fragment, useMemo, VFC } from 'react';
-import { Box, Chip } from '@mui/material';
-import { IFeatureStrategy, IFeatureStrategyPayload } from 'interfaces/strategy';
+import { Box, Chip, styled } from '@mui/material';
+import { IFeatureStrategyPayload } from 'interfaces/strategy';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import PercentageCircle from 'component/common/PercentageCircle/PercentageCircle';
import { StrategySeparator } from 'component/common/StrategySeparator/StrategySeparator';
@@ -10,7 +10,6 @@ import { useSegments } from 'hooks/api/getters/useSegments/useSegments';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { FeatureOverviewSegment } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewSegment/FeatureOverviewSegment';
import { ConstraintAccordionList } from 'component/common/ConstraintAccordion/ConstraintAccordionList/ConstraintAccordionList';
-import { useStyles } from './StrategyExecution.styles';
import {
parseParameterNumber,
parseParameterString,
@@ -28,11 +27,20 @@ const NoItems: VFC = () => (
);
+const StyledValueContainer = styled(Box)(({ theme }) => ({
+ padding: theme.spacing(2, 3),
+ border: `1px solid ${theme.palette.dividerAlternative}`,
+ borderRadius: theme.shape.borderRadiusMedium,
+}));
+
+const StyledValueSeparator = styled('span')(({ theme }) => ({
+ color: theme.palette.neutral.main,
+}));
+
export const StrategyExecution: VFC = ({
strategy,
}) => {
const { parameters, constraints = [] } = strategy;
- const { classes: styles } = useStyles();
const { strategies } = useStrategies();
const { uiConfig } = useUiConfig();
const { segments } = useSegments();
@@ -54,8 +62,7 @@ export const StrategyExecution: VFC = ({
const percentage = parseParameterNumber(parameters[key]);
return (
-
@@ -77,7 +84,7 @@ export const StrategyExecution: VFC = ({
: ''}{' '}
is included.
-
+
);
case 'userIds':
case 'UserIds':
@@ -101,12 +108,12 @@ export const StrategyExecution: VFC = ({
return null;
}
});
- }, [parameters, definition, constraints, styles]);
+ }, [parameters, definition, constraints]);
const customStrategyList = useMemo(() => {
if (!parameters || !definition?.editable) return null;
const isSetTo = (
- {' is set to '}
+ {' is set to '}
);
return definition?.parameters.map(param => {
@@ -123,9 +130,9 @@ export const StrategyExecution: VFC = ({
const values = parseParameterStrings(parameters[name]);
return values.length > 0 ? (
-
+
{nameItem}{' '}
-
+
has {values.length}{' '}
{values.length > 1 ? `items` : 'item'}:{' '}
{values.map((item: string) => (
@@ -141,15 +148,14 @@ export const StrategyExecution: VFC = ({
sx={{ mr: 0.5 }}
/>
))}
-
-
+
+
) : null;
case 'percentage':
const percentage = parseParameterNumber(parameters[name]);
return parameters[name] !== '' ? (
-
@@ -168,13 +174,13 @@ export const StrategyExecution: VFC = ({
label={`${percentage}%`}
/>
-
+
) : null;
case 'boolean':
return parameters[name] === 'true' ||
parameters[name] === 'false' ? (
-
+
= ({
size="small"
label={parameters[name]}
/>
-
+
) : null;
case 'string':
const value = parseParameterString(parameters[name]);
return typeof parameters[name] !== 'undefined' ? (
-
+
{nameItem}
+
{' is an empty string'}
-
+
}
elseShow={
<>
@@ -217,13 +223,13 @@ export const StrategyExecution: VFC = ({
>
}
/>
-
+
) : null;
case 'number':
const number = parseParameterNumber(parameters[name]);
return parameters[name] !== '' && number !== undefined ? (
-
+
{nameItem}
{isSetTo}
= ({
text={String(number)}
maxLength={50}
/>
-
+
) : null;
case 'default':
return null;
@@ -239,7 +245,7 @@ export const StrategyExecution: VFC = ({
return null;
});
- }, [parameters, definition, styles]);
+ }, [parameters, definition]);
if (!parameters) {
return ;
@@ -259,7 +265,7 @@ export const StrategyExecution: VFC = ({
),
strategy.name === 'default' && (
<>
-
+
The standard strategy is{' '}
= ({
label="ON"
/>{' '}
for all users.
-
+
>
),
...(parametersList ?? []),
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.styles.ts
deleted file mode 100644
index 06e265773d..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.styles.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- featureOverviewEnvironment: {
- borderRadius: theme.shape.borderRadiusLarge,
- marginBottom: theme.spacing(2),
- backgroundColor: theme.palette.background.paper,
- },
- accordion: {
- boxShadow: 'none',
- background: 'none',
- },
- accordionHeader: {
- boxShadow: 'none',
- padding: '1rem 2rem',
- [theme.breakpoints.down(400)]: {
- padding: '0.5rem 1rem',
- },
- },
- accordionBodyInnerContainer: {
- [theme.breakpoints.down(400)]: {
- padding: '0.5rem',
- },
- },
- accordionDetails: {
- padding: theme.spacing(3),
- background: theme.palette.secondaryContainer,
- borderBottomLeftRadius: theme.shape.borderRadiusLarge,
- borderBottomRightRadius: theme.shape.borderRadiusLarge,
- borderBottom: `4px solid ${theme.palette.primary.light}`,
-
- [theme.breakpoints.down('md')]: {
- padding: theme.spacing(2, 1),
- },
- },
- accordionDetailsDisabled: {
- borderBottom: `4px solid ${theme.palette.neutral.border}`,
- },
- accordionBody: {
- width: '100%',
- position: 'relative',
- paddingBottom: theme.spacing(2),
- },
- header: {
- display: 'flex',
- justifyContent: 'center',
- flexDirection: 'column',
- },
- headerTitle: {
- display: 'flex',
- alignItems: 'center',
- [theme.breakpoints.down(560)]: {
- flexDirection: 'column',
- textAlign: 'center',
- },
- },
- headerIcon: {
- [theme.breakpoints.down(560)]: {
- marginBottom: '0.5rem',
- },
- },
- iconContainer: {
- backgroundColor: theme.palette.primary.light,
- borderRadius: '50%',
- width: '28px',
- height: '28px',
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center',
- marginRight: '0.5rem',
- },
- icon: {
- fill: '#fff',
- width: '17px',
- height: '17px',
- },
- linkContainer: {
- display: 'flex',
- justifyContent: 'flex-end',
- marginBottom: '1rem',
- },
- truncator: {
- fontSize: theme.fontSizes.bodySize,
- fontWeight: theme.typography.fontWeightMedium,
- [theme.breakpoints.down(560)]: {
- textAlign: 'center',
- },
- },
- container: {
- display: 'flex',
- alignItems: 'center',
- marginLeft: '1.8rem',
- [theme.breakpoints.down(560)]: {
- flexDirection: 'column',
- marginLeft: '0',
- },
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx
index 0441e4016f..e6a926fda4 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx
@@ -4,9 +4,8 @@ import {
AccordionSummary,
Box,
Chip,
- useTheme,
+ styled,
} from '@mui/material';
-import classNames from 'classnames';
import { ExpandMore } from '@mui/icons-material';
import { useFeature } from 'hooks/api/getters/useFeature/useFeature';
import useFeatureMetrics from 'hooks/api/getters/useFeatureMetrics/useFeatureMetrics';
@@ -15,7 +14,6 @@ import { getFeatureMetrics } from 'utils/getFeatureMetrics';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import EnvironmentIcon from 'component/common/EnvironmentIcon/EnvironmentIcon';
import StringTruncator from 'component/common/StringTruncator/StringTruncator';
-import { useStyles } from './FeatureOverviewEnvironment.styles';
import EnvironmentAccordionBody from './EnvironmentAccordionBody/EnvironmentAccordionBody';
import { EnvironmentFooter } from './EnvironmentFooter/EnvironmentFooter';
import FeatureOverviewEnvironmentMetrics from './FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics';
@@ -23,17 +21,104 @@ import { FeatureStrategyMenu } from 'component/feature/FeatureStrategy/FeatureSt
import { FEATURE_ENVIRONMENT_ACCORDION } from 'utils/testIds';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import { FeatureStrategyIcons } from 'component/feature/FeatureStrategy/FeatureStrategyIcons/FeatureStrategyIcons';
-// import { Badge } from 'component/common/Badge/Badge';
interface IFeatureOverviewEnvironmentProps {
env: IFeatureEnvironment;
}
+const StyledFeatureOverviewEnvironment = styled('div', {
+ shouldForwardProp: prop => prop !== 'enabled',
+})<{ enabled: boolean }>(({ theme, enabled }) => ({
+ borderRadius: theme.shape.borderRadiusLarge,
+ marginBottom: theme.spacing(2),
+ backgroundColor: theme.palette.background.paper,
+ background: enabled
+ ? theme.palette.background.paper
+ : theme.palette.neutral.light,
+}));
+
+const StyledAccordion = styled(Accordion)({
+ boxShadow: 'none',
+ background: 'none',
+});
+
+const StyledAccordionSummary = styled(AccordionSummary)(({ theme }) => ({
+ boxShadow: 'none',
+ padding: theme.spacing(2, 4),
+ [theme.breakpoints.down(400)]: {
+ padding: theme.spacing(1, 2),
+ },
+}));
+
+const StyledAccordionDetails = styled(AccordionDetails, {
+ shouldForwardProp: prop => prop !== 'enabled',
+})<{ enabled: boolean }>(({ theme, enabled }) => ({
+ padding: theme.spacing(3),
+ background: theme.palette.secondaryContainer,
+ borderBottomLeftRadius: theme.shape.borderRadiusLarge,
+ borderBottomRightRadius: theme.shape.borderRadiusLarge,
+ borderBottom: `4px solid ${
+ enabled ? theme.palette.primary.light : theme.palette.neutral.border
+ }`,
+
+ [theme.breakpoints.down('md')]: {
+ padding: theme.spacing(2, 1),
+ },
+}));
+
+const StyledEnvironmentAccordionBody = styled(EnvironmentAccordionBody)(
+ ({ theme }) => ({
+ width: '100%',
+ position: 'relative',
+ paddingBottom: theme.spacing(2),
+ })
+);
+
+const StyledHeader = styled('div', {
+ shouldForwardProp: prop => prop !== 'enabled',
+})<{ enabled: boolean }>(({ theme, enabled }) => ({
+ display: 'flex',
+ justifyContent: 'center',
+ flexDirection: 'column',
+ color: enabled ? theme.palette.text.primary : theme.palette.text.secondary,
+}));
+
+const StyledHeaderTitle = styled('div')(({ theme }) => ({
+ display: 'flex',
+ alignItems: 'center',
+ [theme.breakpoints.down(560)]: {
+ flexDirection: 'column',
+ textAlign: 'center',
+ },
+}));
+
+const StyledEnvironmentIcon = styled(EnvironmentIcon)(({ theme }) => ({
+ [theme.breakpoints.down(560)]: {
+ marginBottom: '0.5rem',
+ },
+}));
+
+const StyledStringTruncator = styled(StringTruncator)(({ theme }) => ({
+ fontSize: theme.fontSizes.bodySize,
+ fontWeight: theme.typography.fontWeightMedium,
+ [theme.breakpoints.down(560)]: {
+ textAlign: 'center',
+ },
+}));
+
+const StyledContainer = styled('div')(({ theme }) => ({
+ display: 'flex',
+ alignItems: 'center',
+ marginLeft: '1.8rem',
+ [theme.breakpoints.down(560)]: {
+ flexDirection: 'column',
+ marginLeft: '0',
+ },
+}));
+
const FeatureOverviewEnvironment = ({
env,
}: IFeatureOverviewEnvironmentProps) => {
- const { classes: styles } = useStyles();
- const theme = useTheme();
const projectId = useRequiredPathParam('projectId');
const featureId = useRequiredPathParam('featureId');
const { metrics } = useFeatureMetrics(projectId, featureId);
@@ -48,40 +133,19 @@ const FeatureOverviewEnvironment = ({
);
return (
-
-
+
- }
>
-
-
-
+
+
+
-
@@ -97,8 +161,8 @@ const FeatureOverviewEnvironment = ({
/>
}
/>
-
-
+
+
-
-
+
+
-
+
-
-
+
}
/>
-
-
-
+
+
+
);
};
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts
deleted file mode 100644
index 1b4e6c6918..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- container: {
- marginLeft: 'auto',
- display: 'flex',
- alignItems: 'center',
- },
- info: {
- marginRight: '0.5rem',
- display: 'flex',
- flexDirection: 'column',
- },
- icon: {
- fill: theme.palette.grey[300],
- height: '75px',
- width: '75px',
- [theme.breakpoints.down(500)]: {
- display: 'none',
- },
- },
- infoParagraph: {
- maxWidth: '270px',
- marginTop: '0.25rem',
- fontSize: theme.fontSizes.smallBody,
- textAlign: 'right',
- [theme.breakpoints.down(700)]: {
- display: 'none',
- },
- },
- percentage: {
- color: theme.palette.primary.main,
- textAlign: 'right',
- fontSize: theme.fontSizes.bodySize,
- },
- percentageCircle: {
- margin: '0 1rem',
- [theme.breakpoints.down(500)]: {
- display: 'none',
- },
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx
index b64e38b290..7ca34960ac 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx
@@ -3,19 +3,62 @@ import { useTheme } from '@mui/system';
import { IFeatureEnvironmentMetrics } from 'interfaces/featureToggle';
import { calculatePercentage } from 'utils/calculatePercentage';
import PercentageCircle from 'component/common/PercentageCircle/PercentageCircle';
-import { useStyles } from './FeatureOverviewEnvironmentMetrics.styles';
import { PrettifyLargeNumber } from 'component/common/PrettifyLargeNumber/PrettifyLargeNumber';
+import { styled } from '@mui/material';
interface IFeatureOverviewEnvironmentMetrics {
environmentMetric?: IFeatureEnvironmentMetrics;
disabled?: boolean;
}
+const StyledContainer = styled('div')({
+ marginLeft: 'auto',
+ display: 'flex',
+ alignItems: 'center',
+});
+
+const StyledInfo = styled('div')(({ theme }) => ({
+ marginRight: theme.spacing(1),
+ display: 'flex',
+ flexDirection: 'column',
+}));
+
+const StyledPercentage = styled('p')(({ theme }) => ({
+ color: theme.palette.primary.main,
+ textAlign: 'right',
+ fontSize: theme.fontSizes.bodySize,
+}));
+
+const StyledInfoParagraph = styled('p')(({ theme }) => ({
+ maxWidth: '270px',
+ marginTop: theme.spacing(0.5),
+ fontSize: theme.fontSizes.smallBody,
+ textAlign: 'right',
+ [theme.breakpoints.down(700)]: {
+ display: 'none',
+ },
+}));
+
+const StyledIcon = styled(FiberManualRecord)(({ theme }) => ({
+ fill: theme.palette.standaloneBackground,
+ height: '75px',
+ width: '75px',
+ [theme.breakpoints.down(500)]: {
+ display: 'none',
+ },
+}));
+
+const StyledPercentageCircle = styled('div')(({ theme }) => ({
+ margin: theme.spacing(0, 2),
+ [theme.breakpoints.down(500)]: {
+ display: 'none',
+ },
+}));
+
const FeatureOverviewEnvironmentMetrics = ({
environmentMetric,
disabled = false,
}: IFeatureOverviewEnvironmentMetrics) => {
- const { classes: styles } = useStyles();
const theme = useTheme();
if (!environmentMetric) return null;
@@ -28,10 +71,9 @@ const FeatureOverviewEnvironmentMetrics = ({
(environmentMetric.yes === 0 && environmentMetric.no === 0)
) {
return (
-
-
-
+
+
{percentage}%
-
-
+ 0 times and
exposed
0 times in the last hour
-
-
-
-
+
+
+
+
);
}
return (
-
-
-
{percentage}%
-
+
+
+ {percentage}%
+
The feature has been requested{' '}
times
@@ -79,12 +116,12 @@ const FeatureOverviewEnvironmentMetrics = ({
times
{' '}
in the last hour
-
-
-
-
+
+
);
};
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx
index 2645ccb7e7..eead57694a 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx
@@ -1,10 +1,8 @@
-import { capitalize } from '@mui/material';
-import classnames from 'classnames';
+import { capitalize, styled } from '@mui/material';
import { Link } from 'react-router-dom';
import { useFeature } from 'hooks/api/getters/useFeature/useFeature';
import { getFeatureTypeIcons } from 'utils/getFeatureTypeIcons';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
-import { useStyles } from './FeatureOverviewMetadata.styles';
import { Edit } from '@mui/icons-material';
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
import { UPDATE_FEATURE } from 'component/providers/AccessProvider/permissions';
@@ -13,9 +11,62 @@ import FeatureOverviewTags from './FeatureOverviewTags/FeatureOverviewTags';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
+const StyledContainer = styled('div')(({ theme }) => ({
+ borderRadius: theme.shape.borderRadiusLarge,
+ color: theme.palette.text.tertiaryContrast,
+ backgroundColor: theme.palette.featureMetaData,
+ display: 'flex',
+ flexDirection: 'column',
+ maxWidth: '350px',
+ minWidth: '350px',
+ marginRight: theme.spacing(2),
+ [theme.breakpoints.down(1000)]: {
+ width: '100%',
+ maxWidth: 'none',
+ minWidth: 'auto',
+ },
+}));
+
+const StyledPaddingContainerTop = styled('div')({
+ padding: '1.5rem 1.5rem 0 1.5rem',
+});
+
+const StyledPaddingContainerBottom = styled('div')(({ theme }) => ({
+ padding: '0 1.5rem 1.5rem 1.5rem',
+ borderTop: `1px solid ${theme.palette.divider}`,
+}));
+
+const StyledMetaDataHeader = styled('div')({
+ display: 'flex',
+ alignItems: 'center',
+});
+
+const StyledHeader = styled('h2')(({ theme }) => ({
+ fontSize: theme.fontSizes.bodySize,
+ fontWeight: 'normal',
+ margin: 0,
+}));
+
+const StyledBody = styled('div')(({ theme }) => ({
+ margin: theme.spacing(2, 0),
+ display: 'flex',
+ flexDirection: 'column',
+}));
+
+const StyledBodyItem = styled('span')(({ theme }) => ({
+ margin: theme.spacing(1, 0),
+ fontSize: theme.fontSizes.bodySize,
+ wordBreak: 'break-all',
+}));
+
+const StyledDescriptionContainer = styled('div')(({ theme }) => ({
+ display: 'flex',
+ alignItems: 'center',
+ color: theme.palette.text.tertiaryContrast,
+}));
+
const FeatureOverviewMetaData = () => {
const { uiConfig } = useUiConfig();
- const { classes: styles } = useStyles();
const projectId = useRequiredPathParam('projectId');
const featureId = useRequiredPathParam('featureId');
const { tags } = useTags(featureId);
@@ -25,24 +76,29 @@ const FeatureOverviewMetaData = () => {
const IconComponent = getFeatureTypeIcons(type);
return (
-
-
-
- {' '}
-
- {capitalize(type || '')} toggle
-
-
-
-
+
+
+
+ ({
+ marginRight: theme.spacing(2),
+ height: '40px',
+ width: '40px',
+ fill: theme.palette.text.tertiaryContrast,
+ })}
+ />{' '}
+ {capitalize(type || '')} toggle
+
+
+
Project: {project}
-
+
+
Description:
-
+
{description}
{
title: 'Edit description',
}}
>
-
+ ({
+ color: theme.palette.text
+ .tertiaryContrast,
+ })}
+ />
-
-
+
+
}
elseShow={
-
+
No description.{' '}
{
title: 'Edit description',
}}
>
-
+ ({
+ color: theme.palette.text
+ .tertiaryContrast,
+ })}
+ />
-
+
}
/>
-
-
+
+
0 &&
!Boolean(uiConfig.flags.variantsPerEnvironment)
}
show={
-
+
-
+
}
/>
-
+
);
};
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetadata.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetadata.styles.ts
deleted file mode 100644
index 6923d7c385..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetadata.styles.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- container: {
- borderRadius: theme.shape.borderRadiusLarge,
- color: '#fff',
- backgroundColor: theme.palette.featureMetaData,
- display: 'flex',
- flexDirection: 'column',
- maxWidth: '350px',
- minWidth: '350px',
- marginRight: '1rem',
- [theme.breakpoints.down(1000)]: {
- width: '100%',
- maxWidth: 'none',
- minWidth: 'auto',
- },
- },
- paddingContainerTop: {
- padding: '1.5rem 1.5rem 0 1.5rem',
- },
- paddingContainerBottom: {
- padding: '0 1.5rem 1.5rem 1.5rem',
- borderTop: `1px solid ${theme.palette.grey[300]}`,
- },
- metaDataHeader: {
- display: 'flex',
- alignItems: 'center',
- },
- header: {
- fontSize: theme.fontSizes.bodySize,
- fontWeight: 'normal',
- margin: 0,
- },
- body: {
- margin: '1rem 0',
- display: 'flex',
- flexDirection: 'column',
- },
- bodyItem: {
- margin: '0.5rem 0',
- fontSize: theme.fontSizes.bodySize,
- wordBreak: 'break-all',
- },
- headerIcon: {
- marginRight: '1rem',
- height: '40px',
- width: '40px',
- fill: '#fff',
- },
- descriptionContainer: {
- display: 'flex',
- alignItems: 'center',
- color: '#fff',
- },
- editIcon: {
- color: '#fff',
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.styles.ts
deleted file mode 100644
index 6e2a4c6af2..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.styles.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- container: {
- borderRadius: theme.shape.borderRadiusLarge,
- backgroundColor: theme.palette.primary.main,
- display: 'flex',
- flexDirection: 'column',
- marginRight: '1rem',
- marginTop: '1rem',
- [theme.breakpoints.down(800)]: {
- width: '100%',
- maxWidth: 'none',
- },
- },
- tagHeader: {
- display: 'flex',
- alignItems: 'center',
- },
- tag: {
- height: '40px',
- width: '40px',
- fill: theme.palette.primary.main,
- marginRight: '0.8rem',
- },
- tagChip: {
- marginRight: '0.25rem',
- marginTop: '0.5rem',
- backgroundColor: '#fff',
- fontSize: theme.fontSizes.smallBody,
- },
- closeIcon: {
- color: theme.palette.primary.light,
- '&:hover': {
- color: theme.palette.primary.light,
- },
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.tsx
index ad5e890a63..246cc10945 100644
--- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewTags/FeatureOverviewTags.tsx
@@ -1,8 +1,7 @@
import React, { useContext, useState } from 'react';
-import { Chip } from '@mui/material';
+import { Chip, styled } from '@mui/material';
import { Close, Label } from '@mui/icons-material';
import useTags from 'hooks/api/getters/useTags/useTags';
-import { useStyles } from './FeatureOverviewTags.styles';
import slackIcon from 'assets/icons/slack.svg';
import jiraIcon from 'assets/icons/jira.svg';
import webhookIcon from 'assets/icons/webhooks.svg';
@@ -18,10 +17,37 @@ import AccessContext from 'contexts/AccessContext';
import { formatUnknownError } from 'utils/formatUnknownError';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
-interface IFeatureOverviewTagsProps extends React.HTMLProps {
+interface IFeatureOverviewTagsProps {
projectId: string;
}
+const StyledContainer = styled('div')(({ theme }) => ({
+ borderRadius: theme.shape.borderRadiusLarge,
+ backgroundColor: theme.palette.primary.main,
+ display: 'flex',
+ flexDirection: 'column',
+ marginRight: theme.spacing(2),
+ marginTop: theme.spacing(2),
+ [theme.breakpoints.down(800)]: {
+ width: '100%',
+ maxWidth: 'none',
+ },
+}));
+
+const StyledTagChip = styled(Chip)(({ theme }) => ({
+ marginRight: theme.spacing(0.5),
+ marginTop: theme.spacing(1),
+ backgroundColor: theme.palette.text.tertiaryContrast,
+ fontSize: theme.fontSizes.smallBody,
+}));
+
+const StyledCloseIcon = styled(Close)(({ theme }) => ({
+ color: theme.palette.primary.light,
+ '&:hover': {
+ color: theme.palette.primary.light,
+ },
+}));
+
const FeatureOverviewTags: React.FC = ({
projectId,
...rest
@@ -31,7 +57,6 @@ const FeatureOverviewTags: React.FC = ({
value: '',
type: '',
});
- const { classes: styles } = useStyles();
const featureId = useRequiredPathParam('featureId');
const { tags, refetch } = useTags(featureId);
const { tagTypes } = useTagTypes();
@@ -98,15 +123,12 @@ const FeatureOverviewTags: React.FC = ({
};
const renderTag = (t: ITag) => (
-
- }
+ deleteIcon={ }
onDelete={
canDeleteTag
? () => {
@@ -119,7 +141,7 @@ const FeatureOverviewTags: React.FC = ({
);
return (
-
+
{
@@ -141,7 +163,7 @@ const FeatureOverviewTags: React.FC = ({
elseShow={No tags to display
}
/>
-
+
);
};
diff --git a/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.styles.ts b/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.styles.ts
deleted file mode 100644
index 6413100062..0000000000
--- a/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.styles.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { makeStyles } from 'tss-react/mui';
-
-export const useStyles = makeStyles()(theme => ({
- innerContainer: {
- display: 'flex',
- },
- bodyContainer: {
- padding: 0,
- },
- listContainer: {
- width: '20%',
- borderRight: `1px solid ${theme.palette.grey[300]}`,
- padding: '1rem 0',
- [theme.breakpoints.down('md')]: {
- width: '35%',
- },
- },
- listItem: {
- padding: '0.75rem 2rem',
- },
- innerBodyContainer: {
- padding: '2rem',
- display: 'flex',
- flexDirection: 'column',
- width: 400,
- ['& > *']: {
- margin: '0.5rem 0',
- },
- },
-}));
diff --git a/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.tsx b/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.tsx
index 82b04f0661..4b1dfa3287 100644
--- a/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.tsx
+++ b/frontend/src/component/feature/FeatureView/FeatureSettings/FeatureSettings.tsx
@@ -1,7 +1,6 @@
import { useState } from 'react';
import { PageContent } from 'component/common/PageContent/PageContent';
-import { useStyles } from './FeatureSettings.styles';
-import { List, ListItem } from '@mui/material';
+import { Box, List, ListItem, styled } from '@mui/material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import FeatureSettingsProject from './FeatureSettingsProject/FeatureSettingsProject';
import { FeatureSettingsInformation } from './FeatureSettingsInformation/FeatureSettingsInformation';
@@ -11,21 +10,39 @@ import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
const METADATA = 'metadata';
const PROJECT = 'project';
+const StyledListContainer = styled('div')(({ theme }) => ({
+ width: '20%',
+ borderRight: `1px solid ${theme.palette.divider}`,
+ padding: theme.spacing(2, 0),
+ [theme.breakpoints.down('md')]: {
+ width: '35%',
+ },
+}));
+
+const StyledInnerBodyContainer = styled('div')(({ theme }) => ({
+ padding: theme.spacing(4),
+ display: 'flex',
+ flexDirection: 'column',
+ width: 400,
+ ['& > *']: {
+ margin: theme.spacing(1, 0),
+ },
+}));
+
export const FeatureSettings = () => {
- const { classes: styles } = useStyles();
const projectId = useRequiredPathParam('projectId');
const featureId = useRequiredPathParam('featureId');
const [settings, setSettings] = useState(METADATA);
const { uiConfig } = useUiConfig();
return (
-
-
-
+
+
+
setSettings(METADATA)}
selected={settings === METADATA}
@@ -34,7 +51,7 @@ export const FeatureSettings = () => {
setSettings(PROJECT)}
selected={settings === PROJECT}
@@ -43,8 +60,8 @@ export const FeatureSettings = () => {
Project
-
-
+
+
{
condition={settings === PROJECT && uiConfig.flags.P}
show={ }
/>
-
-
+
+
);
};