Skip to main content

Annotation Support

<AnnotationSupport /> component is a canvas widget to provide UI for the annotation elements and links.

important

<AnnotationSupport /> widget must be provided to the canvas to in order to enable annotation UI features such as creating a new annotation with <SelectionActionAnnotate />, linking annotation to an element with <SelectionActionEstablishLink /> or <LinkActionMoveEndpoint />.

The component observes AnnotationTopic command bus topic.

Result
Loading...
Live Editor
function Example() {
  const {defaultLayout} = Reactodia.useWorker(Layouts);

  const {onMount} = Reactodia.useLoadedWorkspace(async ({context, signal}) => {
    const {model, view, performLayout} = context;
    const entity = model.createElement('http://example.com/entity1');
    const annotation1 = new Reactodia.AnnotationElement({
      elementState: Reactodia.TemplateState.empty
        .set(Reactodia.TemplateProperties.AnnotationContent, {
          type: 'plaintext',
          text: 'Double-click to edit\nnote about "entity1"',
        }),
    });
    const annotation2 = new Reactodia.AnnotationElement({
      elementState: Reactodia.TemplateState.empty
        .set(Reactodia.TemplateProperties.AnnotationContent, {
          type: 'plaintext',
          text: 'Note about entity AND annotation',
        })
        .set(Reactodia.TemplateProperties.ColorVariant, 'primary'),
    });
    model.addElement(annotation1);
    model.addElement(annotation2);
    model.addLink(new Reactodia.AnnotationLink({
      sourceId: annotation1.id,
      targetId: entity.id,
    }));
    model.addLink(new Reactodia.AnnotationLink({
      sourceId: annotation2.id,
      targetId: entity.id,
    }));
    model.addLink(new Reactodia.AnnotationLink({
      sourceId: annotation2.id,
      targetId: annotation1.id,
      linkState: Reactodia.TemplateState.empty
        .set(
          Reactodia.TemplateProperties.CustomLabel,
          'note about another note'
        ),
    }));
    await performLayout({signal});
  }, []);

  return (
    <div className='reactodia-live-editor'>
      <Reactodia.Workspace ref={onMount}
        defaultLayout={defaultLayout}>
        <Reactodia.WorkspaceRoot>
          <Reactodia.Canvas>
            <Reactodia.Halo />
            <Reactodia.HaloLink />
            <Reactodia.Selection />
            <Reactodia.AnnotationSupport />
          </Reactodia.Canvas>
        </Reactodia.WorkspaceRoot>
      </Reactodia.Workspace>
    </div>
  );
}

render(<Example />);