Skip to main content

glint-diagram-view

The glint-diagram-view component is responsible for dynamically rendering diagrams associated with a given model. It selects applicable diagrams based on the model's type. If multiple diagrams are relevant, they will be presented within a tabbed interface for easy navigation.

Here's how to use it:

<glint-diagram-view [model]="model"></glint-diagram-view>

Properties

  • [model]: This property accepts the model object for which diagrams should be rendered. The component will use the type of this model to determine which diagrams to display.

Diagram Component

To create a diagram that can be rendered by glint-diagram-view, you need to implement the DiagramComponent interface. This interface ensures your component provides the necessary templates for the diagram's header (especially when displayed in tabs) and its content.

@Component({
template: `
<ng-template glintDiagramTabHeader>
<div>My Diagram</div>
</ng-template>
<ng-template glintDiagramTabContent>
<glint-class-diagram [graph]="graph()"></glint-class-diagram>
</ng-template>
`
})
class MyDiagramComponent implements DiagramComponent<ApplicationModel> {

// The DiagramComponent interface expects templates for the (tab) header and the diagram content
@ViewChild(DiagramTabHeader, {read: TemplateRef, static: true}) tabHeader!: TemplateRef<any>;
@ViewChild(DiagramTabContent, {read: TemplateRef, static: true}) tabContent!: TemplateRef<any>;

/**
* The model provided to the glint-diagram-view component.
* This property is automatically set by the glint-diagram-view.
*/
model!: ApplicationModel;

/**
* A signal or computed property that determines when the diagram should be shown.
* Return `true` if the diagram should be visible, `false` otherwise.
*/
visible = computed(() => {
// Define when the diagram should be shown, e.g., based on model properties
return true;
});

/**
* A computed property that provides the data for your diagram.
* This example uses `glint-class-diagram`.
*/
graph = computed(() => { /* ... generate graph data from this.model ... */ });

}

Important Considerations for DiagramComponent

  • @ViewChild for Templates: Ensure you have @ViewChild decorators for DiagramTabHeader and DiagramTabContent to capture the TemplateRef instances. These templates define what appears in the tab header (if applicable) and the main diagram area.
  • model Property: The glint-diagram-view component will automatically inject the model object into your DiagramComponent instance.
  • visible Computed Property (optional): Implement the visible computed property (or a signal) to control when your diagram should be displayed. This is useful for conditionally showing diagrams based on the model's state or properties.
  • Diagram-Specific Inputs: Your diagram component (glint-class-diagram in the example) will likely have its own inputs (e.g., [graph]). Use computed properties or signals within your DiagramComponent to prepare the data required by your specific diagram rendering component.

Providing Diagram Components

You can make your DiagramComponents available to glint-diagram-view through two main mechanisms:

Via @Component providers

This method allows you to associate diagram components directly within the providers array of an Angular @Component decorator. This is suitable for diagrams specific to a particular component's context.

@Component({
providers: [
{
provide: DIAGRAM, // This token is used to register diagram components
multi: true, // Allows multiple diagram components to be registered
useValue: [
{
// Matches a specific model type for which this diagram is applicable
_type: 'elements::Application::model',
// The DiagramComponent to be rendered
component: MyDiagramComponent
}
]
}
]
})

For more modularity and reusability, especially when developing plugins, it is highly recommended to provide diagram components via an ExtensionModule. This allows you to bundle related diagrams and extensions.

@NgModule({
imports: [
ExtensionModule.forExtension({
diagrams: [ // The 'diagrams' array within the extension configuration
{
type: 'elements::Application', // The type of the model this diagram applies to
component: MyDiagramComponent // The DiagramComponent itself
}
]
})
]
})
export class MyExtensionModule {}