@@ -22,13 +22,14 @@ import {
2222 SettingOutlined ,
2323} from '@ant-design/icons' ;
2424import { useToggle } from 'ahooks' ;
25- import { App , Button , Input , Popconfirm , theme , Typography } from 'antd' ;
25+ import { Alert , App , Button , Input , theme , Typography } from 'antd' ;
2626import { AnyObject } from 'antd/es/_util/type' ;
2727import { ColumnsType , ColumnType } from 'antd/es/table' ;
2828import {
2929 filterOutEmpty ,
3030 filterOutNullAndUndefined ,
3131 BAIFlex ,
32+ BAIModal ,
3233 BAITable ,
3334} from 'backend.ai-ui' ;
3435import _ 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