55 AnalyticalTableScaleWidthMode ,
66 Title ,
77} from '@ui5/webcomponents-react' ;
8- import { useApiResource , useCRDItemsMapping } from '../../lib/api/useApiResource' ;
8+ import { useApiResource , useApiResourceMutation } from '../../lib/api/useApiResource' ;
99import { ManagedResourcesRequest } from '../../lib/api/types/crossplane/listManagedResources' ;
1010import { formatDateAsTimeAgo } from '../../utils/i18n/timeAgo' ;
1111import IllustratedError from '../Shared/IllustratedError' ;
@@ -19,9 +19,13 @@ import { Resource } from '../../utils/removeManagedFieldsAndFilterData.ts';
1919import { ManagedResourceItem } from '../../lib/shared/types.ts' ;
2020import { ManagedResourceDeleteDialog } from '../Dialogs/ManagedResourceDeleteDialog.tsx' ;
2121import { RowActionsMenu } from './ManagedResourcesActionMenu.tsx' ;
22- import styles from './ManagedResources.module.css' ;
23-
24- const getItemKey = ( item : ManagedResourceItem ) : string => `${ item . kind } -${ item . metadata . name } ` ;
22+ import { useToast } from '../../context/ToastContext.tsx' ;
23+ import {
24+ DeleteManagedResourceType ,
25+ DeleteMCPManagedResource ,
26+ PatchResourceForForceDeletion ,
27+ } from '../../lib/api/types/crate/deleteResource' ;
28+ import { useResourcePluralNames } from '../../hooks/useResourcePluralNames' ;
2529
2630interface CellData < T > {
2731 cell : {
@@ -47,9 +51,8 @@ type ResourceRow = {
4751
4852export function ManagedResources ( ) {
4953 const { t } = useTranslation ( ) ;
50- const [ deleteDialogOpen , setDeleteDialogOpen ] = useState ( false ) ;
51- const [ selectedItem , setSelectedItem ] = useState < ManagedResourceItem | null > ( null ) ;
52- const [ deletingItems , setDeletingItems ] = useState < Set < string > > ( new Set ( ) ) ;
54+ const toast = useToast ( ) ;
55+ const [ pendingDeleteItem , setPendingDeleteItem ] = useState < ManagedResourceItem | null > ( null ) ;
5356
5457 const {
5558 data : managedResources ,
@@ -59,19 +62,20 @@ export function ManagedResources() {
5962 refreshInterval : resourcesInterval ,
6063 } ) ;
6164
62- const openDeleteDialog = ( item : ManagedResourceItem ) => {
63- setSelectedItem ( item ) ;
64- setDeleteDialogOpen ( true ) ;
65- } ;
65+ const { getPluralKind, isLoading : isLoadingPluralNames , error : pluralNamesError } = useResourcePluralNames ( ) ;
6666
67- const handleDeleteStart = ( item : ManagedResourceItem ) => {
68- const itemKey = getItemKey ( item ) ;
69- setDeletingItems ( ( prev ) => new Set ( prev . add ( itemKey ) ) ) ;
70- } ;
67+ const resourceName = pendingDeleteItem ?. metadata ?. name ?? '' ;
68+ const apiVersion = pendingDeleteItem ?. apiVersion ?? '' ;
69+ const pluralKind = pendingDeleteItem ? getPluralKind ( pendingDeleteItem . kind ) : '' ;
70+ const namespace = pendingDeleteItem ?. metadata ?. namespace ?? '' ;
7171
72- const { data : kindMapping } = useCRDItemsMapping ( {
73- refreshInterval : resourcesInterval ,
74- } ) ;
72+ const { trigger : deleteTrigger } = useApiResourceMutation < DeleteManagedResourceType > (
73+ DeleteMCPManagedResource ( apiVersion , pluralKind , resourceName , namespace ) ,
74+ ) ;
75+
76+ const { trigger : patchTrigger } = useApiResourceMutation < undefined > (
77+ PatchResourceForForceDeletion ( apiVersion , pluralKind , resourceName , namespace ) ,
78+ ) ;
7579
7680 const columns : AnalyticalTableColumnDefinition [ ] = useMemo (
7781 ( ) => [
@@ -134,32 +138,27 @@ export function ManagedResources() {
134138 } ,
135139 } ,
136140 {
137- Header : ' ' ,
141+ Header : t ( 'ManagedResources.actionColumnHeader' ) ,
138142 hAlign : 'Center' ,
139143 width : 60 ,
140144 disableFilters : true ,
141145 Cell : ( cellData : CellData < ResourceRow > ) => {
142146 const item = cellData . cell . row . original ?. item as ManagedResourceItem ;
143- const itemKey = item ? getItemKey ( item ) : '' ;
144- const isDeleting = deletingItems . has ( itemKey ) ;
145147
146148 return cellData . cell . row . original ?. item ? (
147- < RowActionsMenu item = { item } isDeleting = { isDeleting } onOpen = { openDeleteDialog } />
149+ < RowActionsMenu item = { item } onOpen = { openDeleteDialog } />
148150 ) : undefined ;
149151 } ,
150152 } ,
151153 ] ,
152- [ t , deletingItems ] ,
154+ [ t ] ,
153155 ) ;
154156
155157 const rows : ResourceRow [ ] =
156158 managedResources
157159 ?. filter ( ( managedResource ) => managedResource . items )
158160 . flatMap ( ( managedResource ) =>
159161 managedResource . items ?. map ( ( item ) => {
160- const itemKey = getItemKey ( item ) ;
161- const isDeleting = deletingItems . has ( itemKey ) ;
162-
163162 const conditionSynced = item . status ?. conditions ?. find ( ( condition ) => condition . type === 'Synced' ) ;
164163 const conditionReady = item . status ?. conditions ?. find ( ( condition ) => condition . type === 'Ready' ) ;
165164
@@ -174,26 +173,46 @@ export function ManagedResources() {
174173 item : item ,
175174 conditionSyncedMessage : conditionSynced ?. message ?? conditionSynced ?. reason ?? '' ,
176175 conditionReadyMessage : conditionReady ?. message ?? conditionReady ?. reason ?? '' ,
177- className : isDeleting ? styles . deletingRow : undefined ,
178176 } ;
179177 } ) ,
180178 ) ?? [ ] ;
181179
180+ const openDeleteDialog = ( item : ManagedResourceItem ) => {
181+ setPendingDeleteItem ( item ) ;
182+ } ;
183+
184+ const handleDeletionConfirmed = async ( item : ManagedResourceItem , force : boolean ) => {
185+ toast . show ( t ( 'ManagedResources.deleteStarted' , { resourceName : item . metadata . name } ) ) ;
186+
187+ try {
188+ await deleteTrigger ( ) ;
189+
190+ if ( force ) {
191+ await patchTrigger ( ) ;
192+ }
193+ } catch ( _ ) {
194+ // Ignore errors - will be handled by the mutation hook
195+ }
196+ } ;
197+
198+ const combinedError = error || pluralNamesError ;
199+ const combinedLoading = isLoading || isLoadingPluralNames ;
200+
182201 return (
183202 < >
184203 < Title level = "H4" > { t ( 'ManagedResources.header' ) } </ Title >
185204
186- { error && < IllustratedError details = { error . message } /> }
205+ { combinedError && < IllustratedError details = { combinedError . message } /> }
187206
188- { ! error && (
207+ { ! combinedError && (
189208 < >
190209 < AnalyticalTable
191210 columns = { columns }
192211 data = { rows }
193212 minRows = { 1 }
194213 groupBy = { [ 'kind' ] }
195214 scaleWidthMode = { AnalyticalTableScaleWidthMode . Smart }
196- loading = { isLoading }
215+ loading = { combinedLoading }
197216 filterable
198217 retainColumnWidth
199218 reactTableOptions = { {
@@ -209,11 +228,10 @@ export function ManagedResources() {
209228 } }
210229 />
211230 < ManagedResourceDeleteDialog
212- kindMapping = { kindMapping }
213- open = { deleteDialogOpen }
214- item = { selectedItem }
215- onClose = { ( ) => setDeleteDialogOpen ( false ) }
216- onDeleteStart = { handleDeleteStart }
231+ open = { ! ! pendingDeleteItem }
232+ item = { pendingDeleteItem }
233+ onClose = { ( ) => setPendingDeleteItem ( null ) }
234+ onDeletionConfirmed = { handleDeletionConfirmed }
217235 />
218236 </ >
219237 ) }
0 commit comments