@@ -261,93 +261,114 @@ export const SDCPNProvider: React.FC<SDCPNProviderProps> = ({
261261
262262 return null ;
263263 } ,
264- deleteItemsByIds ( ids ) {
264+ deleteItemsByIds ( items ) {
265265 rest . mutatePetriNetDefinition ( ( sdcpn ) => {
266- const idsToProcess = new Set ( ids ) ;
266+ // Partition selection by type for targeted deletion
267+ const placeIds = new Set < string > ( ) ;
268+ const transitionIds = new Set < string > ( ) ;
269+ const arcIds = new Set < string > ( ) ;
270+ const typeIds = new Set < string > ( ) ;
271+ const equationIds = new Set < string > ( ) ;
272+ const parameterIds = new Set < string > ( ) ;
267273
268- /**
269- * Deal with the transitions first because we always need to check them,
270- * in case they, an arc within them or a place referenced by an arc is being deleted.
271- */
272- for ( let i = sdcpn . transitions . length - 1 ; i >= 0 ; i -- ) {
273- const transition = sdcpn . transitions [ i ] ! ;
274- if ( idsToProcess . has ( transition . id ) ) {
275- sdcpn . transitions . splice ( i , 1 ) ;
276- idsToProcess . delete ( transition . id ) ;
277- continue ;
274+ for ( const [ id , item ] of items ) {
275+ switch ( item . type ) {
276+ case "place" :
277+ placeIds . add ( id ) ;
278+ break ;
279+ case "transition" :
280+ transitionIds . add ( id ) ;
281+ break ;
282+ case "arc" :
283+ arcIds . add ( id ) ;
284+ break ;
285+ case "type" :
286+ typeIds . add ( id ) ;
287+ break ;
288+ case "differentialEquation" :
289+ equationIds . add ( id ) ;
290+ break ;
291+ case "parameter" :
292+ parameterIds . add ( id ) ;
293+ break ;
278294 }
295+ }
279296
280- for (
281- let inputArcIndex = transition . inputArcs . length - 1 ;
282- inputArcIndex >= 0 ;
283- inputArcIndex --
284- ) {
285- const inputArc = transition . inputArcs [ inputArcIndex ] ! ;
286- const arcId = generateArcId ( {
287- inputId : inputArc . placeId ,
288- outputId : transition . id ,
289- } ) ;
297+ // Transitions need special handling: we always iterate them when places,
298+ // transitions, or arcs are being deleted, because arcs live inside transitions
299+ // and deleting a place must cascade to remove its connected arcs.
300+ const hasCanvasDeletes =
301+ placeIds . size > 0 || transitionIds . size > 0 || arcIds . size > 0 ;
290302
291- if ( idsToProcess . has ( arcId ) || idsToProcess . has ( inputArc . placeId ) ) {
292- transition . inputArcs . splice ( inputArcIndex , 1 ) ;
293- idsToProcess . delete ( arcId ) ;
303+ if ( hasCanvasDeletes ) {
304+ for ( let i = sdcpn . transitions . length - 1 ; i >= 0 ; i -- ) {
305+ const transition = sdcpn . transitions [ i ] ! ;
306+ if ( transitionIds . has ( transition . id ) ) {
307+ sdcpn . transitions . splice ( i , 1 ) ;
308+ continue ;
294309 }
295- }
296-
297- for (
298- let outputArcIndex = transition . outputArcs . length - 1 ;
299- outputArcIndex >= 0 ;
300- outputArcIndex --
301- ) {
302- const outputArc = transition . outputArcs [ outputArcIndex ] ! ;
303- const arcId = generateArcId ( {
304- inputId : transition . id ,
305- outputId : outputArc . placeId ,
306- } ) ;
307310
308- if (
309- idsToProcess . has ( arcId ) ||
310- idsToProcess . has ( outputArc . placeId )
311+ for (
312+ let arcIdx = transition . inputArcs . length - 1 ;
313+ arcIdx >= 0 ;
314+ arcIdx --
311315 ) {
312- transition . outputArcs . splice ( outputArcIndex , 1 ) ;
313- idsToProcess . delete ( arcId ) ;
316+ const inputArc = transition . inputArcs [ arcIdx ] ! ;
317+ const arcId = generateArcId ( {
318+ inputId : inputArc . placeId ,
319+ outputId : transition . id ,
320+ } ) ;
321+
322+ if ( arcIds . has ( arcId ) || placeIds . has ( inputArc . placeId ) ) {
323+ transition . inputArcs . splice ( arcIdx , 1 ) ;
324+ }
314325 }
315- }
316326
317- if ( idsToProcess . size === 0 ) {
318- return ;
327+ for (
328+ let arcIdx = transition . outputArcs . length - 1 ;
329+ arcIdx >= 0 ;
330+ arcIdx --
331+ ) {
332+ const outputArc = transition . outputArcs [ arcIdx ] ! ;
333+ const arcId = generateArcId ( {
334+ inputId : transition . id ,
335+ outputId : outputArc . placeId ,
336+ } ) ;
337+
338+ if ( arcIds . has ( arcId ) || placeIds . has ( outputArc . placeId ) ) {
339+ transition . outputArcs . splice ( arcIdx , 1 ) ;
340+ }
341+ }
319342 }
320- }
321343
322- for ( let i = sdcpn . places . length - 1 ; i >= 0 ; i -- ) {
323- const place = sdcpn . places [ i ] ! ;
324- if ( idsToProcess . has ( place . id ) ) {
325- sdcpn . places . splice ( i , 1 ) ;
326- idsToProcess . delete ( place . id ) ;
344+ for ( let i = sdcpn . places . length - 1 ; i >= 0 ; i -- ) {
345+ if ( placeIds . has ( sdcpn . places [ i ] ! . id ) ) {
346+ sdcpn . places . splice ( i , 1 ) ;
347+ }
327348 }
328349 }
329350
330- for ( let i = sdcpn . types . length - 1 ; i >= 0 ; i -- ) {
331- const type = sdcpn . types [ i ] ! ;
332- if ( idsToProcess . has ( type . id ) ) {
333- sdcpn . types . splice ( i , 1 ) ;
334- idsToProcess . delete ( type . id ) ;
351+ if ( typeIds . size > 0 ) {
352+ for ( let i = sdcpn . types . length - 1 ; i >= 0 ; i -- ) {
353+ if ( typeIds . has ( sdcpn . types [ i ] ! . id ) ) {
354+ sdcpn . types . splice ( i , 1 ) ;
355+ }
335356 }
336357 }
337358
338- for ( let i = sdcpn . differentialEquations . length - 1 ; i >= 0 ; i -- ) {
339- const equation = sdcpn . differentialEquations [ i ] ! ;
340- if ( idsToProcess . has ( equation . id ) ) {
341- sdcpn . differentialEquations . splice ( i , 1 ) ;
342- idsToProcess . delete ( equation . id ) ;
359+ if ( equationIds . size > 0 ) {
360+ for ( let i = sdcpn . differentialEquations . length - 1 ; i >= 0 ; i -- ) {
361+ if ( equationIds . has ( sdcpn . differentialEquations [ i ] ! . id ) ) {
362+ sdcpn . differentialEquations . splice ( i , 1 ) ;
363+ }
343364 }
344365 }
345366
346- for ( let i = sdcpn . parameters . length - 1 ; i >= 0 ; i -- ) {
347- const parameter = sdcpn . parameters [ i ] ! ;
348- if ( idsToProcess . has ( parameter . id ) ) {
349- sdcpn . parameters . splice ( i , 1 ) ;
350- idsToProcess . delete ( parameter . id ) ;
367+ if ( parameterIds . size > 0 ) {
368+ for ( let i = sdcpn . parameters . length - 1 ; i >= 0 ; i -- ) {
369+ if ( parameterIds . has ( sdcpn . parameters [ i ] ! . id ) ) {
370+ sdcpn . parameters . splice ( i , 1 ) ;
371+ }
351372 }
352373 }
353374 } ) ;
0 commit comments