diff --git a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantModal/EnvironmentVariantModal.tsx b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantModal/EnvironmentVariantModal.tsx index 3f3b78dc3f..b369d0bd43 100644 --- a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantModal/EnvironmentVariantModal.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantModal/EnvironmentVariantModal.tsx @@ -27,6 +27,7 @@ import cloneDeep from 'lodash.clonedeep'; import { CloudCircle } from '@mui/icons-material'; import PermissionSwitch from 'component/common/PermissionSwitch/PermissionSwitch'; import { UPDATE_FEATURE_VARIANTS } from 'component/providers/AccessProvider/permissions'; +import { WeightType } from 'constants/variantTypes'; const StyledFormSubtitle = styled('div')(({ theme }) => ({ display: 'flex', @@ -121,11 +122,6 @@ const payloadOptions = [ { key: 'csv', label: 'csv' }, ]; -enum WeightType { - FIX = 'fix', - VARIABLE = 'variable', -} - const EMPTY_PAYLOAD = { type: 'string', value: '' }; enum ErrorField { diff --git a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/EnvironmentVariantsTable.tsx b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/EnvironmentVariantsTable.tsx index 345b3425c2..f229817357 100644 --- a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/EnvironmentVariantsTable.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/EnvironmentVariantsTable.tsx @@ -20,6 +20,7 @@ import { PayloadCell } from './PayloadCell/PayloadCell'; import { OverridesCell } from './OverridesCell/OverridesCell'; import { VariantsActionCell } from './VariantsActionsCell/VariantsActionsCell'; import { useConditionallyHiddenColumns } from 'hooks/useConditionallyHiddenColumns'; +import { WeightType } from 'constants/variantTypes'; const StyledTableContainer = styled('div')(({ theme }) => ({ margin: theme.spacing(3, 0), @@ -112,6 +113,7 @@ export const EnvironmentVariantsTable = ({ { + const isVariable = variant.weightType === WeightType.VARIABLE; + + const atLeastOneFixedVariant = variants.some(variant => { + return variant.weightType === WeightType.FIX; + }); + + const hasOnlyOneVariableVariant = + variants.filter(variant => { + return variant.weightType === WeightType.VARIABLE; + }).length == 1; + + return ( + atLeastOneFixedVariant && hasOnlyOneVariableVariant && isVariable + ); + }; + const { data, getSearchText } = useSearch(columns, searchValue, variants); const { headerGroups, rows, prepareRow, setHiddenColumns } = useTable( diff --git a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/VariantsActionsCell/VariantsActionsCell.tsx b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/VariantsActionsCell/VariantsActionsCell.tsx index c06a66bf9e..e242030370 100644 --- a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/VariantsActionsCell/VariantsActionsCell.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/EnvironmentVariantsCard/EnvironmentVariantsTable/VariantsActionsCell/VariantsActionsCell.tsx @@ -4,10 +4,11 @@ import { ActionCell } from 'component/common/Table/cells/ActionCell/ActionCell'; import { UPDATE_FEATURE_ENVIRONMENT_VARIANTS } from 'component/providers/AccessProvider/permissions'; import { IFeatureVariant } from 'interfaces/featureToggle'; -interface IVarintsActionCellProps { +interface IVariantsActionCellProps { projectId: string; environmentId: string; variant: IFeatureVariant; + isLastVariableVariant: boolean; editVariant: (variant: IFeatureVariant) => void; deleteVariant: (variant: IFeatureVariant) => void; } @@ -16,9 +17,10 @@ export const VariantsActionCell = ({ projectId, environmentId, variant, + isLastVariableVariant, editVariant, deleteVariant, -}: IVarintsActionCellProps) => { +}: IVariantsActionCellProps) => { return ( deleteVariant(variant)} tooltipProps={{ - title: 'Delete variant', + title: isLastVariableVariant + ? 'You need to have at least one variable variant' + : 'Delete variant', }} > diff --git a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/FeatureEnvironmentVariants.tsx b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/FeatureEnvironmentVariants.tsx index 25d8c05bf5..d3a63395aa 100644 --- a/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/FeatureEnvironmentVariants.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureVariants/FeatureEnvironmentVariants/FeatureEnvironmentVariants.tsx @@ -66,12 +66,8 @@ export const FeatureEnvironmentVariants = () => { patch: jsonpatch.Operation[]; error?: string; } => { - try { - const updatedNewVariants = updateWeight(newVariants, 1000); - return { patch: createPatch(variants, updatedNewVariants) }; - } catch (error: unknown) { - return { patch: [], error: formatUnknownError(error) }; - } + const updatedNewVariants = updateWeight(newVariants, 1000); + return { patch: createPatch(variants, updatedNewVariants) }; }; const updateVariants = async ( diff --git a/frontend/src/constants/variantTypes.ts b/frontend/src/constants/variantTypes.ts new file mode 100644 index 0000000000..53414f88ff --- /dev/null +++ b/frontend/src/constants/variantTypes.ts @@ -0,0 +1,4 @@ +export enum WeightType { + FIX = 'fix', + VARIABLE = 'variable', +}