Skip to content

Commit f296705

Browse files
[AF-281] Unregistered template warning (#340)
1 parent 0cce318 commit f296705

4 files changed

Lines changed: 78 additions & 6 deletions

File tree

packages/ng-diagram/projects/ng-diagram/src/lib/components/diagram/ng-diagram.component.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ComponentFixture, TestBed } from '@angular/core/testing';
2-
import { Middleware, ModelAdapter } from '../../../core/src';
32
import { beforeEach, describe, expect, it, vi } from 'vitest';
3+
import { Middleware, ModelAdapter } from '../../../core/src';
44

55
import {
66
FlowCoreProviderService,
@@ -10,6 +10,7 @@ import {
1010
} from '../../services';
1111
import { CursorPositionTrackerService } from '../../services/cursor-position-tracker/cursor-position-tracker.service';
1212
import { InputEventsRouterService } from '../../services/input-events/input-events-router.service';
13+
import { TemplateProviderService } from '../../services/template-provider/template-provider.service';
1314
import { NgDiagramComponent } from './ng-diagram.component';
1415

1516
describe('AngularAdapterDiagramComponent', () => {
@@ -72,6 +73,9 @@ describe('AngularAdapterDiagramComponent', () => {
7273
setEnabled: vi.fn(),
7374
hasListeners: vi.fn(),
7475
},
76+
config: {
77+
debugMode: false,
78+
},
7579
}),
7680
isInitialized: vi.fn().mockReturnValue(true),
7781
},
@@ -83,6 +87,7 @@ describe('AngularAdapterDiagramComponent', () => {
8387
onDragStartFromPalette: vi.fn(),
8488
},
8589
},
90+
TemplateProviderService,
8691
CursorPositionTrackerService,
8792
InputEventsRouterService,
8893
],
@@ -148,6 +153,7 @@ describe('AngularAdapterDiagramComponent', () => {
148153
const templateMap = new Map([['test-type', mockTemplate]]);
149154

150155
fixture.componentRef.setInput('nodeTemplateMap', templateMap);
156+
fixture.detectChanges();
151157

152158
expect(component.getNodeTemplate('test-type')).toBe(mockTemplate);
153159
});
@@ -167,6 +173,7 @@ describe('AngularAdapterDiagramComponent', () => {
167173
const templateMap = new Map([['test-type', mockTemplate]]);
168174

169175
fixture.componentRef.setInput('edgeTemplateMap', templateMap);
176+
fixture.detectChanges();
170177

171178
expect(component.getEdgeTemplate('test-type')).toBe(mockTemplate);
172179
});

packages/ng-diagram/projects/ng-diagram/src/lib/components/diagram/ng-diagram.component.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { ZoomingPointerDirective } from '../../directives/input-events/zooming/z
3434
import { ZoomingWheelDirective } from '../../directives/input-events/zooming/zooming-wheel.directive';
3535
import { NgDiagramServicesAvailabilityCheckerDirective } from '../../directives/services-availability-checker/ng-diagram-services-availability-checker.directive';
3636
import { FlowCoreProviderService, FlowResizeBatchProcessorService, RendererService } from '../../services';
37+
import { TemplateProviderService } from '../../services/template-provider/template-provider.service';
3738
import { NgDiagramConfig, NgDiagramEdgeTemplateMap, NgDiagramNodeTemplateMap } from '../../types';
3839
import { BUILTIN_MIDDLEWARES } from '../../utils/create-middlewares';
3940
import { NgDiagramCanvasComponent } from '../canvas/ng-diagram-canvas.component';
@@ -82,6 +83,7 @@ export class NgDiagramComponent implements OnInit, OnDestroy {
8283
private readonly flowCoreProvider = inject(FlowCoreProviderService);
8384
private readonly renderer = inject(RendererService);
8485
private readonly flowResizeBatchProcessor = inject(FlowResizeBatchProcessorService);
86+
private readonly templateProviderService = inject(TemplateProviderService);
8587

8688
private initializedModel: ModelAdapter | null = null;
8789
private resizeObserver: ResizeObserver | null = null;
@@ -161,6 +163,16 @@ export class NgDiagramComponent implements OnInit, OnDestroy {
161163
this.setupEventBridge();
162164
}
163165
});
166+
167+
effect(() => {
168+
const nodeTemplateMap = this.nodeTemplateMap();
169+
this.templateProviderService.setNodeTemplateMap(nodeTemplateMap);
170+
});
171+
172+
effect(() => {
173+
const edgeTemplateMap = this.edgeTemplateMap();
174+
this.templateProviderService.setEdgeTemplateMap(edgeTemplateMap);
175+
});
164176
}
165177

166178
/** @ignore */
@@ -205,14 +217,11 @@ export class NgDiagramComponent implements OnInit, OnDestroy {
205217
* @throws This method does not throw exceptions - it handles all edge cases gracefully
206218
*/
207219
getNodeTemplate(nodeType: Node['type']) {
208-
return this.nodeTemplateMap().get(nodeType || '') ?? null;
220+
return this.templateProviderService.getNodeTemplate(nodeType);
209221
}
210222

211223
getEdgeTemplate(edgeType: Edge['type']) {
212-
if (!edgeType) {
213-
return null;
214-
}
215-
return this.edgeTemplateMap().get(edgeType) ?? null;
224+
return this.templateProviderService.getEdgeTemplate(edgeType);
216225
}
217226

218227
// Used by template @for track function to force view recreation after delete/re-add

packages/ng-diagram/projects/ng-diagram/src/lib/providers/ng-diagram.providers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { LinkingEventService } from '../services/input-events/linking-event.serv
1515
import { ManualLinkingService } from '../services/input-events/manual-linking.service';
1616
import { PaletteService } from '../services/palette/palette.service';
1717
import { RendererService } from '../services/renderer/renderer.service';
18+
import { TemplateProviderService } from '../services/template-provider/template-provider.service';
1819
import { UpdatePortsService } from '../services/update-ports/update-ports.service';
1920

2021
/**
@@ -61,5 +62,6 @@ export function provideNgDiagram(): Provider[] {
6162
NgDiagramGroupsService,
6263
LinkingEventService,
6364
ManualLinkingService,
65+
TemplateProviderService,
6466
];
6567
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { inject, Injectable } from '@angular/core';
2+
import { Edge, Node } from '../../../public-api';
3+
import { NgDiagramEdgeTemplateMap, NgDiagramNodeTemplateMap } from '../../types';
4+
import { FlowCoreProviderService } from '../flow-core-provider/flow-core-provider.service';
5+
6+
@Injectable()
7+
export class TemplateProviderService {
8+
private flowConfig = inject(FlowCoreProviderService);
9+
private nodeTemplateMap = new NgDiagramNodeTemplateMap();
10+
private edgeTemplateMap = new NgDiagramEdgeTemplateMap();
11+
12+
private accessedNodeTypes = new Set<Node['type']>();
13+
private accessedEdgeTypes = new Set<Edge['type']>();
14+
15+
setNodeTemplateMap(map: NgDiagramNodeTemplateMap): void {
16+
this.accessedNodeTypes.clear();
17+
this.nodeTemplateMap = map;
18+
}
19+
20+
setEdgeTemplateMap(map: NgDiagramEdgeTemplateMap): void {
21+
this.accessedEdgeTypes.clear();
22+
this.edgeTemplateMap = map;
23+
}
24+
25+
getNodeTemplate(nodeType: Node['type']) {
26+
if (nodeType === undefined) {
27+
return null;
28+
}
29+
30+
const template = this.nodeTemplateMap.get(nodeType || '');
31+
32+
if (!template && !this.accessedNodeTypes.has(nodeType) && this.flowConfig.provide().config.debugMode) {
33+
console.warn(`No template found for node type: '${nodeType}'`);
34+
this.accessedNodeTypes.add(nodeType);
35+
}
36+
37+
return template ?? null;
38+
}
39+
40+
getEdgeTemplate(edgeType: Edge['type']) {
41+
if (edgeType === undefined) {
42+
return null;
43+
}
44+
45+
const template = this.edgeTemplateMap.get(edgeType || '');
46+
47+
if (!template && !this.accessedEdgeTypes.has(edgeType) && this.flowConfig.provide().config.debugMode) {
48+
console.warn(`No template found for edge type: '${edgeType}'`);
49+
this.accessedEdgeTypes.add(edgeType);
50+
}
51+
52+
return template ?? null;
53+
}
54+
}

0 commit comments

Comments
 (0)