1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-10 17:53:36 +02:00

add featureSwitchRefactor flag

This commit is contained in:
Tymoteusz Czech 2023-10-18 16:01:42 +02:00
parent 581fb40554
commit 7e6ef0539f
No known key found for this signature in database
GPG Key ID: 133555230D88D75F
9 changed files with 44 additions and 38 deletions

View File

@ -4,8 +4,7 @@ import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import { styled } from '@mui/material';
import StringTruncator from 'component/common/StringTruncator/StringTruncator';
import { FeatureOverviewSidePanelEnvironmentHider } from './FeatureOverviewSidePanelEnvironmentHider';
import { FeatureToggleSwitch } from 'component/project/Project/ProjectFeatureToggles/FeatureToggleSwitch/FeatureToggleSwitch';
import { useMemo } from 'react';
import { FeatureToggleSwitch } from 'component/project/Project/ProjectFeatureToggles/FeatureToggleSwitch/LegacyFeatureToggleSwitch';
const StyledContainer = styled('div')(({ theme }) => ({
marginLeft: theme.spacing(-1.5),
@ -59,20 +58,6 @@ export const FeatureOverviewSidePanelEnvironmentSwitch = ({
if (callback) callback();
};
const featureEnvironment = feature?.environments?.find(
(env) => env.name === environment.name,
);
const hasStrategies =
featureEnvironment?.strategies &&
featureEnvironment?.strategies?.length > 0;
const hasEnabledStrategies =
hasStrategies &&
featureEnvironment?.strategies?.some(
(strategy) => strategy.disabled !== true,
);
return (
<StyledContainer>
<StyledLabel>
@ -80,12 +65,9 @@ export const FeatureOverviewSidePanelEnvironmentSwitch = ({
featureId={feature.name}
projectId={projectId}
environmentName={environment.name}
type={featureEnvironment?.type || ''}
onToggle={handleToggle}
onError={showInfoBox}
value={enabled}
hasStrategies={hasStrategies}
hasEnabledStrategies={hasEnabledStrategies}
/>
{children ?? defaultContent}
</StyledLabel>

View File

@ -39,7 +39,7 @@ interface IFeatureToggleSwitchProps {
}
/**
* @deprecated
* @deprecated remove when flag `featureSwitchRefactor` is removed
*/
export const FeatureToggleSwitch: VFC<IFeatureToggleSwitchProps> = ({
projectId,

View File

@ -112,7 +112,7 @@ const defaultSort: SortingRule<string> & {
} = { id: 'createdAt' };
/**
* @deprecated
* @deprecated remove when flag `featureSwitchRefactor` is removed
*/
export const ProjectFeatureToggles = ({
features,

View File

@ -4,11 +4,13 @@ import useProject, {
} from 'hooks/api/getters/useProject/useProject';
import { Box, styled } from '@mui/material';
import { ProjectFeatureToggles as LegacyProjectFeatureToggles } from './ProjectFeatureToggles/LegacyProjectFeatureToggles';
import { ProjectFeatureToggles } from './ProjectFeatureToggles/ProjectFeatureToggles';
import ProjectInfo from './ProjectInfo/ProjectInfo';
import { usePageTitle } from 'hooks/usePageTitle';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import { useLastViewedProject } from 'hooks/useLastViewedProject';
import { ProjectStats } from './ProjectStats/ProjectStats';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
const refreshInterval = 15 * 1000;
@ -59,11 +61,24 @@ const ProjectOverview = () => {
<StyledContentContainer>
<ProjectStats stats={project.stats} />
<StyledProjectToggles>
<LegacyProjectFeatureToggles
key={loading ? 'loading' : 'ready'}
features={features}
environments={environments}
loading={loading}
<ConditionallyRender
condition={true}
show={() => (
<ProjectFeatureToggles
key={loading ? 'loading' : 'ready'}
features={features}
environments={environments}
loading={loading}
/>
)}
elseShow={() => (
<LegacyProjectFeatureToggles
key={loading ? 'loading' : 'ready'}
features={features}
environments={environments}
loading={loading}
/>
)}
/>
</StyledProjectToggles>
</StyledContentContainer>

View File

@ -72,6 +72,7 @@ export type UiFlags = {
internalMessageBanners?: boolean;
disableEnvsOnRevive?: boolean;
playgroundImprovements?: boolean;
featureSwitchRefactor?: boolean;
};
export interface IVersionInfo {

View File

@ -601,15 +601,17 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
];
}
selectColumns = [
...selectColumns,
this.db.raw(
'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment) as has_strategies',
),
this.db.raw(
'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment AND (feature_strategies.disabled IS NULL OR feature_strategies.disabled = false)) as has_enabled_strategies',
),
];
if (this.flagResolver.isEnabled('featureSwitchRefactor')) {
selectColumns = [
...selectColumns,
this.db.raw(
'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment) as has_strategies',
),
this.db.raw(
'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment AND (feature_strategies.disabled IS NULL OR feature_strategies.disabled = false)) as has_enabled_strategies',
),
];
}
query = query.select(selectColumns);
const rows = await query;

View File

@ -38,7 +38,8 @@ export type IFlagKey =
| 'internalMessageBanner'
| 'separateAdminClientApi'
| 'disableEnvsOnRevive'
| 'playgroundImprovements';
| 'playgroundImprovements'
| 'featureSwitchRefactor';
export type IFlags = Partial<{ [key in IFlagKey]: boolean | Variant }>;
@ -178,6 +179,10 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_PLAYGROUND_IMPROVEMENTS,
false,
),
featureSwitchRefactor: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_FEATURE_SWITCH_REFACTOR,
false,
),
};
export const defaultExperimentalOptions: IExperimentalOptions = {

View File

@ -194,8 +194,8 @@ export interface IEnvironmentBase {
export interface IEnvironmentOverview extends IEnvironmentBase {
variantCount: number;
hasStrategies: boolean;
hasEnabledStrategies: boolean;
hasStrategies?: boolean;
hasEnabledStrategies?: boolean;
}
export interface IFeatureOverview {

View File

@ -49,6 +49,7 @@ process.nextTick(async () => {
useLastSeenRefactor: true,
separateAdminClientApi: true,
playgroundImprovements: true,
featureSwitchRefactor: true,
},
},
authentication: {