Skip to content

Commit c8568ac

Browse files
committed
fix(FR-1784): correct logic for disabling delete button in the MyEnvironment Page
1 parent 7026414 commit c8568ac

1 file changed

Lines changed: 97 additions & 88 deletions

File tree

react/src/components/CustomizedImageList.tsx

Lines changed: 97 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ import {
2222
SettingOutlined,
2323
} from '@ant-design/icons';
2424
import { useToggle } from 'ahooks';
25-
import { App, Button, Input, Popconfirm, theme, Typography } from 'antd';
25+
import { Alert, App, Button, Input, theme, Typography } from 'antd';
2626
import { AnyObject } from 'antd/es/_util/type';
2727
import { ColumnsType, ColumnType } from 'antd/es/table';
2828
import {
2929
filterOutEmpty,
3030
filterOutNullAndUndefined,
3131
BAIFlex,
32+
BAIModal,
3233
BAITable,
3334
} from 'backend.ai-ui';
3435
import _ from 'lodash';
@@ -53,9 +54,10 @@ const CustomizedImageList: React.FC = () => {
5354
const [isRefetchPending, startRefetchTransition] = useTransition();
5455
const [customizedImageListFetchKey, updateCustomizedImageListFetchKey] =
5556
useUpdatableState('initial-fetch');
56-
const [inFlightImageId, setInFlightImageId] = useState<string>();
5757
const [imageSearch, setImageSearch] = useState('');
5858
const [isPendingSearchTransition, startSearchTransition] = useTransition();
59+
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
60+
const [imageToDelete, setImageToDelete] = useState<string | null>(null);
5961
const [, { getBaseVersion, getBaseImages, getBaseImage, tagAlias, getTags }] =
6062
useBackendAIImageMetaData();
6163

@@ -358,93 +360,15 @@ const CustomizedImageList: React.FC = () => {
358360
fixed: 'right',
359361
render: (_text, row) => (
360362
<BAIFlex direction="row" align="stretch" justify="center" gap="xxs">
361-
<Popconfirm
362-
title={t('dialog.ask.DoYouWantToProceed')}
363-
description={t('dialog.warning.CannotBeUndone')}
364-
okType="danger"
365-
okText={t('button.Delete')}
366-
onConfirm={() => {
367-
if (row?.id) {
368-
setInFlightImageId(row.id + customizedImageListFetchKey);
369-
// TODO: when BA-1905 resolved. use commitPurgeImage
370-
commitUntag({
371-
variables: { id: row.id },
372-
onCompleted: (res, errors) => {
373-
if (
374-
!_.isNil(res.untag_image_from_registry) &&
375-
!res.untag_image_from_registry.ok
376-
) {
377-
message.error(res.untag_image_from_registry.msg);
378-
return;
379-
}
380-
if (errors && errors?.length > 0) {
381-
const errorMsgList = _.map(
382-
errors,
383-
(error) => error.message,
384-
);
385-
for (const errorMsg of errorMsgList) {
386-
message.error(errorMsg);
387-
}
388-
return;
389-
}
390-
commitForget({
391-
variables: { id: row.id },
392-
onCompleted: (res, errors) => {
393-
setInFlightImageId(undefined);
394-
if (
395-
!_.isNil(res.forget_image_by_id) &&
396-
!res.forget_image_by_id.ok
397-
) {
398-
message.error(res.forget_image_by_id.msg);
399-
return;
400-
}
401-
if (errors && errors?.length > 0) {
402-
const errorMsgList = _.map(
403-
errors,
404-
(error) => error.message,
405-
);
406-
for (const errorMsg of errorMsgList) {
407-
message.error(errorMsg);
408-
}
409-
return;
410-
}
411-
startRefetchTransition(() => {
412-
updateCustomizedImageListFetchKey();
413-
});
414-
message.success(
415-
t('environment.CustomizedImageSuccessfullyDeleted'),
416-
);
417-
},
418-
onError: () => {
419-
message.error(
420-
t('environment.FailedToDeleteCustomizedImage'),
421-
);
422-
},
423-
});
424-
},
425-
onError: () => {
426-
message.error(
427-
t('environment.FailedToDeleteCustomizedImage'),
428-
);
429-
},
430-
});
431-
}
363+
<Button
364+
type="text"
365+
icon={<DeleteOutlined />}
366+
onClick={() => {
367+
setImageToDelete(row?.id || null);
368+
setIsDeleteModalOpen(true);
432369
}}
433-
>
434-
<Button
435-
type="text"
436-
icon={<DeleteOutlined />}
437-
danger
438-
loading={
439-
(isInFlightForget || isInFlightUntag) &&
440-
inFlightImageId === row?.id + customizedImageListFetchKey
441-
}
442-
disabled={
443-
(isInFlightForget || isInFlightUntag) &&
444-
inFlightImageId !== row?.id + customizedImageListFetchKey
445-
}
446-
/>
447-
</Popconfirm>
370+
danger
371+
/>
448372
</BAIFlex>
449373
),
450374
},
@@ -518,6 +442,91 @@ const CustomizedImageList: React.FC = () => {
518442
columns={columns}
519443
hiddenColumnKeys={hiddenColumnKeys}
520444
/>
445+
<BAIModal
446+
open={isDeleteModalOpen}
447+
title={t('dialog.ask.DoYouWantToProceed')}
448+
okText={t('button.Delete')}
449+
okButtonProps={{
450+
danger: true,
451+
loading: isInFlightForget || isInFlightUntag,
452+
}}
453+
cancelButtonProps={{
454+
disabled: isInFlightForget || isInFlightUntag,
455+
}}
456+
onOk={() => {
457+
if (imageToDelete) {
458+
// TODO: when BA-1905 resolved. use commitPurgeImage
459+
commitUntag({
460+
variables: { id: imageToDelete },
461+
onCompleted: (res, errors) => {
462+
if (
463+
!_.isNil(res.untag_image_from_registry) &&
464+
!res.untag_image_from_registry.ok
465+
) {
466+
message.error(res.untag_image_from_registry.msg);
467+
return;
468+
}
469+
if (errors && errors?.length > 0) {
470+
const errorMsgList = _.map(errors, (error) => error.message);
471+
for (const errorMsg of errorMsgList) {
472+
message.error(errorMsg);
473+
}
474+
return;
475+
}
476+
commitForget({
477+
variables: { id: imageToDelete },
478+
onCompleted: (res, errors) => {
479+
if (
480+
!_.isNil(res.forget_image_by_id) &&
481+
!res.forget_image_by_id.ok
482+
) {
483+
message.error(res.forget_image_by_id.msg);
484+
return;
485+
}
486+
if (errors && errors?.length > 0) {
487+
const errorMsgList = _.map(
488+
errors,
489+
(error) => error.message,
490+
);
491+
for (const errorMsg of errorMsgList) {
492+
message.error(errorMsg);
493+
}
494+
495+
return;
496+
}
497+
startRefetchTransition(() => {
498+
updateCustomizedImageListFetchKey();
499+
});
500+
message.success(
501+
t('environment.CustomizedImageSuccessfullyDeleted'),
502+
);
503+
setIsDeleteModalOpen(false);
504+
setImageToDelete(null);
505+
},
506+
onError: () => {
507+
message.error(
508+
t('environment.FailedToDeleteCustomizedImage'),
509+
);
510+
},
511+
});
512+
},
513+
onError: () => {
514+
message.error(t('environment.FailedToDeleteCustomizedImage'));
515+
},
516+
});
517+
}
518+
}}
519+
onCancel={() => {
520+
setIsDeleteModalOpen(false);
521+
setImageToDelete(null);
522+
}}
523+
>
524+
<Alert
525+
type="warning"
526+
showIcon
527+
message={t('dialog.warning.CannotBeUndone')}
528+
/>
529+
</BAIModal>
521530
</BAIFlex>
522531
);
523532
};

0 commit comments

Comments
 (0)