diff --git a/frontend/common/stores/feature-list-store.ts b/frontend/common/stores/feature-list-store.ts index 1ad15ec5209d..e491387468b3 100644 --- a/frontend/common/stores/feature-list-store.ts +++ b/frontend/common/stores/feature-list-store.ts @@ -549,7 +549,8 @@ const controller = { if ( !feature_states_to_create.length && !feature_states_to_update.length && - !segment_ids_to_delete_overrides.length + !segment_ids_to_delete_overrides.length && + !changeRequest.ignore_conflicts ) { throw new Error('Change request contains no changes') } diff --git a/frontend/common/types/requests.ts b/frontend/common/types/requests.ts index e37a97b4b556..3aa1d7645f82 100644 --- a/frontend/common/types/requests.ts +++ b/frontend/common/types/requests.ts @@ -620,6 +620,7 @@ export type Req = { description: string multivariate_options: MultivariateOption[] title: string + ignore_conflicts?: boolean } getFeatureStates: { environment?: number diff --git a/frontend/web/components/modals/ChangeRequestModal.tsx b/frontend/web/components/modals/ChangeRequestModal.tsx index ff6a15ccca36..de708286e2d1 100644 --- a/frontend/web/components/modals/ChangeRequestModal.tsx +++ b/frontend/web/components/modals/ChangeRequestModal.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, FC, useMemo } from 'react' +import React, { FC, useEffect, useMemo, useState } from 'react' import UserSelect from 'components/UserSelect' import OrganisationProvider from 'common/providers/OrganisationProvider' import Button from 'components/base/forms/Button' @@ -15,13 +15,17 @@ import Utils from 'common/utils/utils' import { Approval, ChangeRequest, User } from 'common/types/responses' import { Req } from 'common/types/requests' import getUserDisplayName from 'common/utils/getUserDisplayName' +import Checkbox from 'components/base/forms/Checkbox' interface ChangeRequestModalProps { changeRequest?: ChangeRequest onSave: ( - data: Omit, + data: Omit & { + ignore_conflicts?: boolean + }, ) => void isScheduledChange?: boolean + showIgnoreConflicts?: boolean showAssignees?: boolean } @@ -30,6 +34,7 @@ const ChangeRequestModal: FC = ({ isScheduledChange, onSave, showAssignees, + showIgnoreConflicts, }) => { const [approvals, setApprovals] = useState([ ...(changeRequest?.approvals ?? []), @@ -46,6 +51,7 @@ const ChangeRequestModal: FC = ({ const [showUsers, setShowUsers] = useState(false) const [showGroups, setShowGroups] = useState(false) const [currDate, setCurrDate] = useState(new Date()) + const [ignoreConflicts, setIgnoreConflicts] = useState(false) const { data: groups } = useGetMyGroupsQuery({ orgId: AccountStore.getOrganisation().id, @@ -89,6 +95,7 @@ const ChangeRequestModal: FC = ({ onSave({ approvals, description, + ignore_conflicts: ignoreConflicts, live_from: liveFrom || undefined, title, }) @@ -282,6 +289,18 @@ const ChangeRequestModal: FC = ({ size='-sm' /> )} + {!changeRequest && showIgnoreConflicts && ( + + } + /> + )}