diff --git a/frontend/src/scenes/feature-flags/FeatureFlag.tsx b/frontend/src/scenes/feature-flags/FeatureFlag.tsx index bb569cae82789..8eb162417e5f1 100644 --- a/frontend/src/scenes/feature-flags/FeatureFlag.tsx +++ b/frontend/src/scenes/feature-flags/FeatureFlag.tsx @@ -546,6 +546,13 @@ export function FeatureFlag({ id }: { id?: string } = {}): JSX.Element { )} + + Duplicate feature flag + + )} + + Duplicate feature flag + + Try out in Insights diff --git a/frontend/src/scenes/feature-flags/featureFlagLogic.ts b/frontend/src/scenes/feature-flags/featureFlagLogic.ts index f6febfbf8dd31..7f7e68fdcc952 100644 --- a/frontend/src/scenes/feature-flags/featureFlagLogic.ts +++ b/frontend/src/scenes/feature-flags/featureFlagLogic.ts @@ -574,6 +574,31 @@ export const featureFlagLogic = kea([ loaders(({ values, props, actions }) => ({ featureFlag: { loadFeatureFlag: async () => { + const sourceId = router.values.searchParams.sourceId + if (props.id === 'new' && sourceId) { + // Used when "duplicating a feature flag". This populates the form with the source flag's data. + const sourceFlag = await api.featureFlags.get(sourceId) + const { + id, + created_at, + created_by, + is_simple_flag, + experiment_set, + features, + surveys, + ...flagToKeep + } = sourceFlag + + // Remove sourceId from URL + router.actions.replace(router.values.location.pathname) + + return { + ...NEW_FLAG, + ...flagToKeep, + key: '', + } as FeatureFlagType + } + if (props.id && props.id !== 'new' && props.id !== 'link') { try { const retrievedFlag: FeatureFlagType = await api.featureFlags.get(props.id) @@ -1205,6 +1230,11 @@ export const featureFlagLogic = kea([ }, })), afterMount(({ props, actions }) => { + if (props.id === 'new' && router.values.searchParams.sourceId) { + actions.loadFeatureFlag() + return + } + const foundFlag = featureFlagsLogic .findMounted() ?.values.featureFlags.results.find((flag) => flag.id === props.id) diff --git a/frontend/src/scenes/urls.ts b/frontend/src/scenes/urls.ts index 6c65829783b0c..7bd391cfccb0f 100644 --- a/frontend/src/scenes/urls.ts +++ b/frontend/src/scenes/urls.ts @@ -178,6 +178,7 @@ export const urls = { experimentsSharedMetric: (id: string | number): string => `/experiments/shared-metrics/${id}`, featureFlags: (tab?: string): string => `/feature_flags${tab ? `?tab=${tab}` : ''}`, featureFlag: (id: string | number): string => `/feature_flags/${id}`, + featureFlagDuplicate: (sourceId: number | string | null): string => `/feature_flags/new?sourceId=${sourceId}`, featureManagement: (id?: string | number): string => `/features${id ? `/${id}` : ''}`, errorTracking: (): string => '/error_tracking', errorTrackingConfiguration: (): string => '/error_tracking/configuration',