Skip to content

Commit a71dc99

Browse files
committed
deletion service
1 parent 2422558 commit a71dc99

2 files changed

Lines changed: 50 additions & 2 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { DeletionService, IDesignItem } from '@node-projects/web-component-designer';
2+
import { edgeTags } from './bpmnRegistry.js';
3+
4+
function collectItems(roots: IDesignItem[]) {
5+
const all: IDesignItem[] = [];
6+
const stack = [...roots];
7+
while (stack.length) {
8+
const item = stack.pop()!;
9+
all.push(item);
10+
stack.push(...item.children());
11+
}
12+
return all;
13+
}
14+
15+
function getBpmnId(item: IDesignItem) {
16+
return item.element.getAttribute('bpmn-id');
17+
}
18+
19+
export class BpmnDeletionService extends DeletionService {
20+
override removeItems(items: IDesignItem[]) {
21+
if (!items.length) {
22+
return;
23+
}
24+
25+
const selectedAndDescendants = collectItems(items);
26+
const deletedIds = new Set(
27+
selectedAndDescendants
28+
.map(item => getBpmnId(item))
29+
.filter((id): id is string => !!id)
30+
);
31+
32+
const rootItems = Array.from(items[0].instanceServiceContainer.designerCanvas.rootDesignItem.children());
33+
const allCanvasItems = collectItems(rootItems);
34+
35+
const connectedEdges = allCanvasItems.filter(item => {
36+
if (!edgeTags.has(item.element.localName)) {
37+
return false;
38+
}
39+
40+
const sourceRef = item.element.getAttribute('source-ref');
41+
const targetRef = item.element.getAttribute('target-ref');
42+
return !!sourceRef && !!targetRef && (deletedIds.has(sourceRef) || deletedIds.has(targetRef));
43+
});
44+
45+
const finalItems = Array.from(new Set([...selectedAndDescendants, ...connectedEdges]));
46+
super.removeItems(finalItems);
47+
}
48+
}

src/setupBpmnDesignerServiceContainer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
DefaultPropertyEditorTypesService,
88
DefaultInstanceService,
99
DefaultModelCommandService,
10-
DeletionService,
1110
DesignItemDocumentPositionService,
1211
DesignItemService,
1312
DragDropService,
@@ -42,6 +41,7 @@ import {
4241
ZoomToolButtonProvider
4342
} from '@node-projects/web-component-designer';
4443
import { BpmnParserService } from './services/BpmnParserService.js';
44+
import { BpmnDeletionService } from './services/BpmnDeletionService.js';
4545
import { BpmnPlacementService } from './services/BpmnPlacementService.js';
4646
import { BpmnPropertyGroupsService } from './services/BpmnPropertyGroupsService.js';
4747
import { BpmnContextPadExtensionProvider } from './extensions/BpmnContextPadExtension.js';
@@ -71,7 +71,7 @@ export function createBpmnDesignerServiceContainer() {
7171
serviceContainer.register('propertyGroupsService', new BpmnPropertyGroupsService());
7272
serviceContainer.register('propertyService', new BaseCustomWebComponentPropertiesService(true));
7373
serviceContainer.register('designItemService', new DesignItemService());
74-
serviceContainer.register('deletionService', new DeletionService());
74+
serviceContainer.register('deletionService', new BpmnDeletionService());
7575
serviceContainer.register('elementsService', new PreDefinedElementsService('bpmn', bpmnElements));
7676

7777
serviceContainer.register('undoService', (designerCanvas: IDesignerCanvas) => new UndoService(designerCanvas));

0 commit comments

Comments
 (0)