Skip to content

Commit 72d8ec0

Browse files
claudeironAiken2
authored andcommitted
fix(FR-2825): standardize activate/deactivate confirmations to Popconfirm
Resolves #7259(FR-2825) ## Summary - Replaced `modal.confirm` with `popConfirm` action prop in `BAINameActionCell` for keypair activate/deactivate actions in `UserCredentialList.tsx` - Replaced `modal.confirm` with `popConfirm` action prop for resource group activate/deactivate toggle in `ResourceGroupList.tsx` - Replaced `modal.confirm` with `Popconfirm` wrapper for deployment revision deploy action in `DeploymentRevisionHistoryTab.tsx` (both table action and drawer button) - Removed unused `modal` destructuring and `App` imports where no longer needed - Did NOT touch any delete/purge actions (those are FR-2819 scope)
1 parent f942af5 commit 72d8ec0

3 files changed

Lines changed: 191 additions & 193 deletions

File tree

react/src/components/DeploymentRevisionHistoryTab.tsx

Lines changed: 72 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { useSetBAINotification } from '../hooks/useBAINotification';
1414
import { useBAISettingUserState } from '../hooks/useBAISetting';
1515
import DeploymentRevisionDetailDrawer from './DeploymentRevisionDetailDrawer';
1616
import { LoadingOutlined, PlayCircleOutlined } from '@ant-design/icons';
17-
import { App, Button, Typography, theme } from 'antd';
17+
import { Button, Popconfirm, theme, Typography } from 'antd';
1818
import {
1919
type BAIColumnType,
2020
BAIFetchKeyButton,
@@ -101,7 +101,6 @@ const DeploymentRevisionHistoryTab: React.FC<
101101
'use memo';
102102
const { t } = useTranslation();
103103
const { token } = theme.useToken();
104-
const { modal } = App.useApp();
105104
const { logger } = useBAILogger();
106105
const { upsertNotification } = useSetBAINotification();
107106
const [isPending, startTransition] = useTransition();
@@ -299,63 +298,45 @@ const DeploymentRevisionHistoryTab: React.FC<
299298
};
300299

301300
const handleRollback = (revision: RevisionNode): Promise<boolean> => {
302-
return new Promise<boolean>((resolveOuter) => {
303-
modal.confirm({
304-
title: t('deployment.Deploy'),
305-
content: t('deployment.DeployConfirm', {
306-
revisionNumber: revision.revisionNumber,
307-
}),
308-
okText: t('deployment.Deploy'),
309-
okButtonProps: {
310-
danger: true,
301+
return new Promise<boolean>((resolve) => {
302+
setRollingBackRevisionId(revision.id);
303+
commitActivate({
304+
variables: {
305+
input: {
306+
deploymentId: toLocalId(deployment.id),
307+
revisionId: toLocalId(revision.id),
308+
},
311309
},
312-
onCancel: () => resolveOuter(false),
313-
onOk: () => {
314-
return new Promise<void>((resolve) => {
315-
setRollingBackRevisionId(revision.id);
316-
commitActivate({
317-
variables: {
318-
input: {
319-
deploymentId: toLocalId(deployment.id),
320-
revisionId: toLocalId(revision.id),
321-
},
322-
},
323-
onCompleted: (_res, errors) => {
324-
setRollingBackRevisionId(null);
325-
if (errors && errors.length > 0) {
326-
logger.error(errors[0]);
327-
upsertNotification({
328-
open: true,
329-
message: errors[0]?.message || t('general.ErrorOccurred'),
330-
type: 'error',
331-
});
332-
resolveOuter(false);
333-
resolve();
334-
return;
335-
}
336-
upsertNotification({
337-
open: true,
338-
message: t('deployment.DeploySuccess', {
339-
revisionNumber: revision.revisionNumber,
340-
}),
341-
});
342-
handleRefresh();
343-
resolveOuter(true);
344-
resolve();
345-
},
346-
onError: (error) => {
347-
setRollingBackRevisionId(null);
348-
logger.error(error);
349-
upsertNotification({
350-
open: true,
351-
message: error?.message || t('general.ErrorOccurred'),
352-
type: 'error',
353-
});
354-
resolveOuter(false);
355-
resolve();
356-
},
310+
onCompleted: (_res, errors) => {
311+
setRollingBackRevisionId(null);
312+
if (errors && errors.length > 0) {
313+
logger.error(errors[0]);
314+
upsertNotification({
315+
open: true,
316+
message: errors[0]?.message || t('general.ErrorOccurred'),
317+
type: 'error',
357318
});
319+
resolve(false);
320+
return;
321+
}
322+
upsertNotification({
323+
open: true,
324+
message: t('deployment.DeploySuccess', {
325+
revisionNumber: revision.revisionNumber,
326+
}),
327+
});
328+
handleRefresh();
329+
resolve(true);
330+
},
331+
onError: (error) => {
332+
setRollingBackRevisionId(null);
333+
logger.error(error);
334+
upsertNotification({
335+
open: true,
336+
message: error?.message || t('general.ErrorOccurred'),
337+
type: 'error',
358338
});
339+
resolve(false);
359340
},
360341
});
361342
});
@@ -432,8 +413,19 @@ const DeploymentRevisionHistoryTab: React.FC<
432413
icon: <PlayCircleOutlined />,
433414
disabled: isDeployDisabled,
434415
disabledReason: deployDisabledReason,
435-
onClick: () => {
436-
void handleRollback(record);
416+
popConfirm: {
417+
title: t('deployment.Deploy'),
418+
description: t('deployment.DeployConfirm', {
419+
revisionNumber: record.revisionNumber,
420+
}),
421+
okText: t('deployment.Deploy'),
422+
cancelText: t('button.Cancel'),
423+
okButtonProps: {
424+
danger: true,
425+
},
426+
onConfirm: () => {
427+
void handleRollback(record);
428+
},
437429
},
438430
},
439431
]}
@@ -616,22 +608,32 @@ const DeploymentRevisionHistoryTab: React.FC<
616608
onClose={() => setDrawerRevision(null)}
617609
extra={
618610
drawerRevision ? (
619-
<Button
620-
type="primary"
621-
icon={<PlayCircleOutlined />}
622-
disabled={
623-
drawerRevision.status === 'current' ||
624-
drawerRevision.status === 'deploying' ||
625-
isDeploymentDestroying ||
626-
!!rollingBackRevisionId
627-
}
628-
onClick={async () => {
611+
<Popconfirm
612+
title={t('deployment.Deploy')}
613+
description={t('deployment.DeployConfirm', {
614+
revisionNumber: drawerRevision.frgmt.revisionNumber,
615+
})}
616+
okText={t('deployment.Deploy')}
617+
cancelText={t('button.Cancel')}
618+
okButtonProps={{ danger: true }}
619+
onConfirm={async () => {
629620
const success = await handleRollback(drawerRevision.frgmt);
630621
if (success) setDrawerRevision(null);
631622
}}
632623
>
633-
{t('deployment.Deploy')}
634-
</Button>
624+
<Button
625+
type="primary"
626+
icon={<PlayCircleOutlined />}
627+
disabled={
628+
drawerRevision.status === 'current' ||
629+
drawerRevision.status === 'deploying' ||
630+
isDeploymentDestroying ||
631+
!!rollingBackRevisionId
632+
}
633+
>
634+
{t('deployment.Deploy')}
635+
</Button>
636+
</Popconfirm>
635637
) : undefined
636638
}
637639
/>

react/src/components/ResourceGroupList.tsx

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ type ResourceGroup = NonNullable<
5757
const ResourceGroupList: React.FC = () => {
5858
const { t } = useTranslation();
5959
const { token } = theme.useToken();
60-
const { message, modal } = App.useApp();
60+
const { message } = App.useApp();
6161
const [activeType, setActiveType] = useState<'active' | 'inactive'>('active');
6262
const [openCreateModal, { toggle: toggleOpenCreateModal }] = useToggle(false);
6363
const [openInfoModal, { toggle: toggleOpenInfoModal }] = useToggle(false);
@@ -153,61 +153,59 @@ const ResourceGroupList: React.FC = () => {
153153
: t('resourceGroup.Activate'),
154154
icon: record.is_active ? <BanIcon /> : <UndoIcon />,
155155
type: record.is_active ? 'danger' : 'default',
156-
onClick: () => {
157-
modal.confirm({
158-
title: record.is_active
159-
? t('resourceGroup.DeactivateResourceGroup')
160-
: t('resourceGroup.ActivateResourceGroup'),
161-
content: record?.name,
162-
okType: record.is_active ? 'danger' : 'primary',
163-
okText: record.is_active
164-
? t('resourceGroup.Deactivate')
165-
: t('resourceGroup.Activate'),
166-
onOk: () => {
167-
return new Promise<void>((resolve) => {
168-
commitUpdateResourceGroup({
169-
variables: {
170-
name: record.name ?? '',
171-
input: {
172-
is_active: !record.is_active,
173-
},
156+
popConfirm: {
157+
title: record.is_active
158+
? t('resourceGroup.DeactivateResourceGroup')
159+
: t('resourceGroup.ActivateResourceGroup'),
160+
description: record?.name,
161+
okButtonProps: {
162+
danger: !!record.is_active,
163+
},
164+
okText: record.is_active
165+
? t('resourceGroup.Deactivate')
166+
: t('resourceGroup.Activate'),
167+
cancelText: t('button.Cancel'),
168+
onConfirm: () => {
169+
return new Promise<void>((resolve) => {
170+
commitUpdateResourceGroup({
171+
variables: {
172+
name: record.name ?? '',
173+
input: {
174+
is_active: !record.is_active,
174175
},
175-
onCompleted: (
176-
{ modify_scaling_group: res },
177-
errors,
178-
) => {
179-
if (!res?.ok) {
180-
message.error(res?.msg);
181-
resolve();
182-
return;
183-
}
184-
if (errors && errors.length > 0) {
185-
const errorMsgList = _.map(
186-
errors,
187-
(error: PayloadError) => error.message,
188-
);
189-
for (const error of errorMsgList) {
190-
message.error(error);
191-
}
192-
resolve();
193-
return;
194-
}
195-
message.success(
196-
t('resourceGroup.ResourceGroupModified'),
197-
);
198-
startRefetchTransition(() => {
199-
updateFetchKey();
200-
});
176+
},
177+
onCompleted: ({ modify_scaling_group: res }, errors) => {
178+
if (!res?.ok) {
179+
message.error(res?.msg);
201180
resolve();
202-
},
203-
onError: (err) => {
204-
message.error(err.message);
181+
return;
182+
}
183+
if (errors && errors.length > 0) {
184+
const errorMsgList = _.map(
185+
errors,
186+
(error: PayloadError) => error.message,
187+
);
188+
for (const error of errorMsgList) {
189+
message.error(error);
190+
}
205191
resolve();
206-
},
207-
});
192+
return;
193+
}
194+
message.success(
195+
t('resourceGroup.ResourceGroupModified'),
196+
);
197+
startRefetchTransition(() => {
198+
updateFetchKey();
199+
});
200+
resolve();
201+
},
202+
onError: (err) => {
203+
message.error(err.message);
204+
resolve();
205+
},
208206
});
209-
},
210-
});
207+
});
208+
},
211209
},
212210
},
213211
{

0 commit comments

Comments
 (0)