Selection
Learn how to programmatically select and unselect annotations, and handle selection events.
Overview
The annotations controller provides methods to manage annotation selection. Selected annotations can be visually distinguished and manipulated as a group.
Selecting Annotations
Use the select() method to select annotations programmatically:
// Select a single annotation by ID
controller.select("annotation-id");
// Select multiple annotations
controller.select(["annotation-1", "annotation-2", "annotation-3"]);
// Select an annotation object
const annotation = controller.getAnnotation("text-id");
if (annotation) {
controller.select(annotation);
}Getting Selected Annotations
Retrieve currently selected annotations using getSelectedAnnotations():
// Get the collection of selected annotations
const selected = controller.getSelectedAnnotations();
console.log(`${selected.features.length} annotations selected`);
// Iterate over selected annotations
selected.features.forEach((annotation) => {
console.log(`Selected: ${annotation.properties.type} (${annotation.id})`);
});The method returns an AnnotationCollection containing all selected features.
Unselecting Annotations
Use the unselect() method to remove selection:
// Unselect specific annotation
controller.unselect("annotation-id");
// Unselect multiple annotations
controller.unselect(["annotation-1", "annotation-2"]);
// Unselect all annotations (no arguments)
controller.unselect();Selection Events
Listen to selection changes using event handlers:
// Listen for selection
controller.on("select", (event) => {
console.log("Selected:", event.feature);
console.log("Annotation type:", event.feature.properties.type);
});
// Listen for unselection
controller.on("unselect", (event) => {
console.log("Unselected:", event.feature);
});See FeatureEvents for all available events.
Practical Examples
Select All Annotations
// Get all annotations and select them
const all = controller.getAnnotations();
const ids = all.features.map((f) => f.id);
controller.select(ids);Select by Type
// Select all text annotations
const all = controller.getAnnotations();
const textIds = all.features
.filter((f) => f.properties.type === "text")
.map((f) => f.id);
controller.select(textIds);Toggle Selection
function toggleAnnotation(id: string) {
const selected = controller.getSelectedAnnotations();
const isSelected = selected.features.some((f) => f.id === id);
if (isSelected) {
controller.unselect(id);
} else {
controller.select(id);
}
}Clear Selection on Background Click
import { Control } from "@linkurious/ogma-annotations";
const controller = new Control(ogma);
// Clear selection when clicking on empty space
ogma.events.on("click", (event) => {
// Check if click was on empty space (not on nodes/edges/annotations)
if (!event.target) {
controller.unselect();
}
});Multi-Select with Ctrl/Cmd
let lastSelectedId: string | null = null;
controller.on("select", (event) => {
const isMultiSelect = event.originalEvent?.ctrlKey || event.originalEvent?.metaKey;
if (!isMultiSelect && lastSelectedId && lastSelectedId !== event.feature.id) {
// Single select mode: unselect previous
controller.unselect(lastSelectedId);
}
lastSelectedId = event.feature.id;
});Visual Feedback
Selected annotations are automatically highlighted by the controller. The default behavior adds a visual distinction to selected items, but you can customize this through the controller options.
Best Practices
1. Clear Selection Before Batch Operations
// Clear selection before importing new annotations
controller.unselect();
controller.add(newAnnotations);2. Track Selection State
// Keep track of selected IDs in your application state
let selectedIds: string[] = [];
controller.on("select", (event) => {
if (!selectedIds.includes(event.feature.id)) {
selectedIds.push(event.feature.id);
}
});
controller.on("unselect", (event) => {
selectedIds = selectedIds.filter((id) => id !== event.feature.id);
});3. Validate Before Selection
function safeSelect(id: string) {
const annotation = controller.getAnnotation(id);
if (annotation) {
controller.select(id);
return true;
}
console.warn(`Annotation ${id} not found`);
return false;
}See Also
- Modification - Update selected annotations
- Deletion - Delete selected annotations
FeatureEvents- Selection eventsControl- Controller API reference