Skip to main content

Drop on Canvas

<DropOnCanvas /> component is a canvas widget to allow creating entity elements on the diagram by dragging then dropping a URL (IRI) to the canvas.

Example: palette to drag annotations from

Result
Loading...
Live Editor
function Palette() {
  const {model} = Reactodia.useWorkspace();
  const variants = ['default', 'primary', 'success', 'info', 'warning', 'danger'];
  return (
    <Reactodia.ViewportDock dock='n'>
      <div style={{
        display: 'flex',
        gap: 5,
        padding: 5,
        background: 'var(--reactodia-background-color-surface)',
      }}>
        {variants.map(variant =>
          <a key={variant}
            href={`urn:my:annotation:${variant}`}
            className={`reactodia-note-annotation--variant-${variant}`}
            style={{
              width: 16,
              height: 16,
              borderWidth: 8,
              borderStyle: 'solid',
            }}
            onClick={e => { e.preventDefault(); }}
          />
        )}
      </div>
    </Reactodia.ViewportDock>
  );
}

function Example() {
  const {defaultLayout} = Reactodia.useWorker(Layouts);

  const getDroppedItems = React.useCallback(
    (e: Reactodia.CanvasDropEvent): Reactodia.DropOnCanvasItem[] => {
      return Reactodia.defaultGetDroppedOnCanvasItems(e).map(item => {
        if (
          item.type === 'element' &&
          item.element instanceof Reactodia.EntityElement
        ) {
          const match = /^urn:my:annotation:([a-z]+)$/.exec(item.element.iri);
          if (match) {
            const element = new Reactodia.AnnotationElement({
              elementState: Reactodia.TemplateState.empty
                .set(Reactodia.TemplateProperties.ColorVariant, match[1]),
            });
            return {...item, element};
          }
          return item;
        }
      });
    }
  );

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

render(<Example />);