UNPKG

graph-explorer

Version:

Graph Explorer can be used to explore and RDF graphs in SPARQL endpoints or on the web.

1 lines 1.01 MB
{"version":3,"file":"graph-explorer.mjs","names":[],"sources":["../src/graph-explorer/data/utils.ts","../src/graph-explorer/data/model.ts","../src/graph-explorer/customization/templates/utils.ts","../src/graph-explorer/customization/templates/default.tsx","../src/graph-explorer/data/schema.ts","../src/graph-explorer/viewUtils/events.ts","../src/graph-explorer/diagram/geometry.ts","../src/graph-explorer/diagram/elements.ts","../src/graph-explorer/viewUtils/async.ts","../src/graph-explorer/viewUtils/keyedObserver.ts","../src/graph-explorer/diagram/history.ts","../src/graph-explorer/diagram/commands.ts","../images/icons/class.svg","../images/icons/objectProperty.svg","../images/icons/datatypeProperty.svg","../images/icons/person.svg","../images/icons/country.svg","../images/icons/organization.svg","../images/icons/location.svg","../images/icons/event.svg","../images/icons/object.svg","../src/graph-explorer/customization/defaultTypeStyles.ts","../src/graph-explorer/customization/defaultLinkStyles.ts","../src/graph-explorer/data/sparql/sparqlModels.ts","../src/graph-explorer/data/sparql/blankNodes.ts","../src/graph-explorer/diagram/linkRouter.ts","../src/graph-explorer/diagram/view.ts","../src/graph-explorer/diagram/elementLayer.tsx","../src/graph-explorer/diagram/linkLayer.tsx","../src/graph-explorer/diagram/paper.tsx","../src/graph-explorer/viewUtils/toSvg.ts","../src/graph-explorer/diagram/paperArea.tsx","../src/graph-explorer/diagram/embeddedLayer.tsx","../src/graph-explorer/customization/templates/group.tsx","../src/graph-explorer/workspace/workspaceContext.ts","../src/graph-explorer/viewUtils/collections.ts","../src/graph-explorer/editor/authoringState.ts","../src/graph-explorer/editor/authoredEntity.tsx","../src/graph-explorer/viewUtils/spinner.tsx","../src/graph-explorer/customization/templates/standard.tsx","../src/graph-explorer/customization/templates/index.ts","../src/graph-explorer/data/demo/provider.ts","../src/graph-explorer/data/sparql/responseHandler.ts","../src/graph-explorer/data/sparql/sparqlDataProviderSettings.ts","../src/graph-explorer/data/sparql/turtle.ts","../src/graph-explorer/data/sparql/sparqlDataProvider.ts","../src/graph-explorer/data/composite/mergeUtils.ts","../src/graph-explorer/data/composite/composite.ts","../src/graph-explorer/editor/serializedDiagram.ts","../src/graph-explorer/viewUtils/layout.ts","../src/graph-explorer/data/sparql/graphBuilder.ts","../src/graph-explorer/data/sparql/sparqlGraphBuilder.ts","../src/graph-explorer/diagram/graph.ts","../src/graph-explorer/diagram/model.ts","../src/graph-explorer/editor/dataFetcher.ts","../src/graph-explorer/editor/asyncModel.ts","../src/graph-explorer/workspace/draggableHandle.tsx","../src/graph-explorer/widgets/dialog.tsx","../src/graph-explorer/widgets/progressBar.tsx","../src/graph-explorer/widgets/listElementView.tsx","../src/graph-explorer/widgets/searchResults.tsx","../src/graph-explorer/widgets/connectionsMenu.tsx","../src/graph-explorer/forms/editEntityForm.tsx","../images/direction-in.png","../images/direction-out.png","../src/graph-explorer/widgets/instancesSearch.tsx","../src/graph-explorer/forms/elementTypeSelector.tsx","../src/graph-explorer/forms/linkTypeSelector.tsx","../src/graph-explorer/forms/editElementTypeForm.tsx","../src/graph-explorer/forms/editLinkForm.tsx","../src/graph-explorer/forms/editLinkLabelForm.tsx","../src/graph-explorer/widgets/halo.tsx","../src/graph-explorer/widgets/haloLink.tsx","../src/graph-explorer/editor/linkStateWidget.tsx","../src/graph-explorer/editor/elementDecorator.tsx","../src/graph-explorer/editor/temporaryState.ts","../src/graph-explorer/editor/editLayer.tsx","../src/graph-explorer/editor/validation.ts","../src/graph-explorer/editor/editorController.tsx","../src/graph-explorer/workspace/toolbar.tsx","../src/graph-explorer/widgets/navigator.tsx","../src/graph-explorer/widgets/classTree/treeModel.ts","../images/tree/expand-toggle.svg","../images/tree/collapse-toggle.svg","../images/tree/leaf-default.svg","../images/tree/leaf-folder.svg","../src/graph-explorer/widgets/classTree/leaf.tsx","../src/graph-explorer/widgets/classTree/classTree.tsx","../src/graph-explorer/widgets/linksToolbox.tsx","../src/graph-explorer/workspace/accordion.tsx","../src/graph-explorer/workspace/accordionItem.tsx","../src/graph-explorer/workspace/layout/layout.tsx","../src/graph-explorer/workspace/workspaceMarkup.tsx","../src/graph-explorer/workspace/workspace.ts","../src/graph-explorer/internalApi.ts"],"sourcesContent":["/** Generates random 32-digit hexadecimal string. */\nexport function generate128BitID() {\n  function random32BitDigits() {\n    return Math.floor((1 + Math.random()) * 0x100000000)\n      .toString(16)\n      .substring(1);\n  }\n  // generate by half because of restricted numerical precision\n  return (\n    random32BitDigits() +\n    random32BitDigits() +\n    random32BitDigits() +\n    random32BitDigits()\n  );\n}\n\n/**\n * Calculate a 32 bit FNV-1a hash\n * Found here: https://gist.github.com/vaiorabbit/5657561\n * Ref.: http://isthe.com/chongo/tech/comp/fnv/\n *\n * @param {string} str the input value\n * @param {integer} [seed] optionally pass the hash of the previous chunk\n * @returns {integer}\n */\nexport function hashFnv32a(str: string, seed = 0x811c9dc5): number {\n  let i: number,\n    l: number,\n    hval = seed & 0x7fffffff;\n\n  for (i = 0, l = str.length; i < l; i++) {\n    hval ^= str.charCodeAt(i);\n    hval +=\n      (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);\n  }\n  return hval >>> 0;\n}\n\n/**\n * Extracts local name for URI the same way as it's done in RDF4J.\n */\nexport function getUriLocalName(uri: string): string | undefined {\n  let index = uri.indexOf(\"#\");\n  if (index < 0) {\n    index = uri.lastIndexOf(\"/\");\n  }\n  if (index < 0) {\n    index = uri.lastIndexOf(\":\");\n  }\n  if (index < 0) {\n    return undefined;\n  }\n  return uri.substring(index + 1);\n}\n","import { hashFnv32a } from \"./utils\";\nimport { RdfIri } from \"./sparql/sparqlModels\";\n\nexport type Dictionary<T> = Record<string, T>;\n\nexport interface LocalizedString {\n  readonly value: string;\n  readonly language: string;\n  /** Equals `xsd:string` if not defined. */\n  readonly datatype?: { readonly value: string };\n}\n\nexport interface IriProperty {\n  type: \"uri\";\n  values: readonly RdfIri[];\n}\nexport interface LiteralProperty {\n  type: \"string\";\n  values: readonly LocalizedString[];\n}\nexport type Property = IriProperty | LiteralProperty;\n\nexport function isIriProperty(e: Property): e is IriProperty {\n  return e && e.type === \"uri\";\n}\nexport function isLiteralProperty(e: Property): e is LiteralProperty {\n  return e && e.type === \"string\";\n}\n\nexport type ElementIri = string & { readonly elementBrand: any };\nexport type ElementTypeIri = string & { readonly classBrand: any };\nexport type LinkTypeIri = string & { readonly linkTypeBrand: any };\nexport type PropertyTypeIri = string & { readonly propertyTypeBrand: any };\n\nexport interface ElementModel {\n  id: ElementIri;\n  types: ElementTypeIri[];\n  label: { values: LocalizedString[] };\n  image?: string;\n  properties: Record<string, Property>;\n  sources?: string[];\n}\n\nexport interface LinkModel {\n  linkTypeId: LinkTypeIri;\n  sourceId: ElementIri;\n  targetId: ElementIri;\n  properties?: Record<string, Property>;\n}\n\nexport interface ClassModel {\n  id: ElementTypeIri;\n  label: { values: LocalizedString[] };\n  count?: number;\n  children: ClassModel[];\n}\n\nexport interface LinkCount {\n  id: LinkTypeIri;\n  inCount: number;\n  outCount: number;\n}\n\nexport interface LinkType {\n  id: LinkTypeIri;\n  label: { values: LocalizedString[] };\n  count?: number;\n}\n\nexport interface PropertyModel {\n  id: PropertyTypeIri;\n  label: { values: LocalizedString[] };\n}\n\nexport function sameLink(left: LinkModel, right: LinkModel) {\n  return (\n    left.linkTypeId === right.linkTypeId &&\n    left.sourceId === right.sourceId &&\n    left.targetId === right.targetId\n  );\n}\n\nexport function hashLink(link: LinkModel): number {\n  const { linkTypeId, sourceId, targetId } = link;\n  let hash = hashFnv32a(linkTypeId);\n  hash = hash * 31 + hashFnv32a(sourceId);\n  hash = hash * 31 + hashFnv32a(targetId);\n  return hash;\n}\n\nexport function sameElement(left: ElementModel, right: ElementModel): boolean {\n  return (\n    left.id === right.id &&\n    isArraysEqual(left.types, right.types) &&\n    isLiteralsEqual(left.label.values, right.label.values) &&\n    left.image === right.image &&\n    isPropertiesEqual(left.properties, right.properties) &&\n    ((!left.sources && !right.sources) ||\n      (left.sources &&\n        right.sources &&\n        isArraysEqual(left.sources, right.sources)))\n  );\n}\n\nfunction isArraysEqual(left: string[], right: string[]): boolean {\n  if (left.length !== right.length) {\n    return false;\n  }\n  for (let i = 0; i < left.length; i++) {\n    if (left[i] !== right[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isLiteralsEqual(\n  left: readonly LocalizedString[],\n  right: readonly LocalizedString[]\n): boolean {\n  if (left.length !== right.length) {\n    return false;\n  }\n  for (let i = 0; i < left.length; i++) {\n    const leftValue = left[i];\n    const rightValue = right[i];\n    if (\n      leftValue.value !== rightValue.value ||\n      leftValue.language !== rightValue.language\n    ) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isIriPropertiesEqual(left: Property, right: Property): boolean {\n  if (!isIriProperty(left) || !isIriProperty(right)) {\n    return false;\n  }\n  if (left.values.length !== right.values.length) {\n    return false;\n  }\n  for (let i = 0; i < left.values.length; i++) {\n    const leftValue = left.values[i];\n    const rightValue = right.values[i];\n    if (leftValue.value !== rightValue.value) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isLiteralPropertiesEqual(left: Property, right: Property): boolean {\n  if (!isLiteralProperty(left) || !isLiteralProperty(right)) {\n    return false;\n  }\n  return isLiteralsEqual(left.values, right.values);\n}\n\nfunction isPropertiesEqual(\n  left: Record<string, Property>,\n  right: Record<string, Property>\n) {\n  if (Object.keys(left).length !== Object.keys(right).length) {\n    return false;\n  }\n  for (const key in left.properties) {\n    if (key in left.properties) {\n      const leftProperty = left[key];\n      const rightProperty = right[key];\n      if (!rightProperty) {\n        return false;\n      }\n      if (\n        !isIriPropertiesEqual(leftProperty, rightProperty) &&\n        !isLiteralPropertiesEqual(leftProperty, rightProperty)\n      ) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n","import {\n  Dictionary,\n  Property,\n  isIriProperty,\n  isLiteralProperty,\n} from \"../../data/model\";\n\nexport function getProperty(props: Dictionary<Property>, id: string) {\n  if (props && props[id]) {\n    return getPropertyValues(props[id]).join(\", \");\n  } else {\n    return undefined;\n  }\n}\n\nexport function getPropertyValues(property: Property): string[] {\n  if (isIriProperty(property)) {\n    return property.values.map(({ value }) => value);\n  } else if (isLiteralProperty(property)) {\n    return property.values.map(({ value }) => value);\n  }\n  return [];\n}\n","import * as React from \"react\";\n\nimport { TemplateProps } from \"../props\";\n\nimport { getPropertyValues } from \"./utils\";\n\nconst CLASS_NAME = \"graph-explorer-default-template\";\n\nexport class DefaultElementTemplate extends React.Component<TemplateProps, {}> {\n  render() {\n    const props = this.props;\n\n    const image = props.imgUrl ? (\n      <div className={`${CLASS_NAME}__thumbnail`}>\n        <img src={props.imgUrl} />\n      </div>\n    ) : undefined;\n\n    const expander = props.isExpanded ? (\n      <div>\n        <div className=\"graph-explorer-default-template_body_expander\">\n          <div className=\"graph-explorer-default-template_body_expander__iri_label\">\n            IRI:\n          </div>\n          <div className=\"graph-explorer-default-template_body_expander_iri\">\n            <a\n              className=\"graph-explorer-default-template_body_expander_iri__link\"\n              href={props.iri}\n              title={props.iri}\n            >\n              {props.iri}\n            </a>\n          </div>\n        </div>\n        <hr className=\"graph-explorer-default-template_body_expander__hr\" />\n        {this.renderPropertyTable()}\n      </div>\n    ) : null;\n\n    return (\n      <div\n        className=\"graph-explorer-default-template\"\n        style={{\n          backgroundColor: props.color,\n          borderColor: props.color,\n        }}\n        data-expanded={this.props.isExpanded}\n      >\n        <div\n          className=\"graph-explorer-default-template_type-line\"\n          title={props.label}\n        >\n          <div\n            className=\"graph-explorer-default-template_type-line__icon\"\n            aria-hidden=\"true\"\n          >\n            <img src={props.iconUrl} />\n          </div>\n          <div\n            title={props.types}\n            className=\"graph-explorer-default-template_type-line_text-container\"\n          >\n            <div className=\"graph-explorer-default-template_type-line_text-container__text\">\n              {props.types}\n            </div>\n          </div>\n        </div>\n        {image}\n        <div\n          className=\"graph-explorer-default-template_body\"\n          style={{ borderColor: props.color }}\n        >\n          <span\n            className=\"graph-explorer-default-template_body__label\"\n            title={props.label}\n          >\n            {props.label}\n          </span>\n          {expander}\n        </div>\n      </div>\n    );\n  }\n\n  renderPropertyTable() {\n    const { propsAsList } = this.props;\n    if (propsAsList && propsAsList.length > 0) {\n      return (\n        <div className=\"graph-explorer-default-template_body_expander_property-table\">\n          {propsAsList.map((prop) => {\n            const propertyValues = getPropertyValues(prop.property);\n            const values = propertyValues.map((text, index) => (\n              <div\n                className=\"graph-explorer-default-template_body_expander_property-table_row_key_values__value\"\n                key={index}\n                title={text}\n              >\n                {text}\n              </div>\n            ));\n            return (\n              <div\n                key={prop.id}\n                className=\"graph-explorer-default-template_body_expander_property-table_row\"\n              >\n                <div\n                  title={prop.name + \" (\" + prop.id + \")\"}\n                  className=\"graph-explorer-default-template_body_expander_property-table_row__key\"\n                >\n                  {prop.name}\n                </div>\n                <div className=\"graph-explorer-default-template_body_expander_property-table_row_key_values\">\n                  {values}\n                </div>\n              </div>\n            );\n          })}\n        </div>\n      );\n    } else {\n      return <div>no properties</div>;\n    }\n  }\n}\n","import { ElementTypeIri, LinkTypeIri } from \"./model\";\nimport { generate128BitID } from \"./utils\";\n\n// context could be imported directly from NPM package, e.g.\nexport const DIAGRAM_CONTEXT_URL_V1 =\n  \"https://graph-explorer.org/context/v1.json\";\n\nexport const PLACEHOLDER_ELEMENT_TYPE =\n  \"http://graph-explorer.org/NewEntity\" as ElementTypeIri;\nexport const PLACEHOLDER_LINK_TYPE =\n  \"http://graph-explorer.org/NewLink\" as LinkTypeIri;\nconst GRAPH_EXPLORER_ID_URL_PREFIX = \"http://graph-explorer.org/data/\";\n\nexport const GenerateID = {\n  forElement() {\n    return `${GRAPH_EXPLORER_ID_URL_PREFIX}e_${generate128BitID()}`;\n  },\n  forLink() {\n    return `${GRAPH_EXPLORER_ID_URL_PREFIX}l_${generate128BitID()}`;\n  },\n};\n\nexport const TemplateProperties = {\n  PinnedProperties: \"graph-explorer:pinnedProperties\",\n  CustomLabel: \"graph-explorer:customLabel\",\n};\n","export type Listener<Data, Key extends keyof Data> = (\n  data: Data[Key],\n  key: Key\n) => void;\nexport type AnyListener<Data> = (data: Partial<Data>, key: string) => void;\nexport type Unsubscribe = () => void;\n\nexport interface PropertyChange<Source, Value> {\n  source: Source;\n  previous: Value;\n}\n\nexport interface AnyEvent<Data> {\n  key: string;\n  data: Partial<Data>;\n}\n\nexport interface Events<Data> {\n  on<Key extends keyof Data>(\n    eventKey: Key,\n    listener: Listener<Data, Key>\n  ): void;\n  off<Key extends keyof Data>(\n    eventKey: Key,\n    listener: Listener<Data, Key>\n  ): void;\n  onAny(listener: AnyListener<Data>): void;\n  offAny(listener: AnyListener<Data>): void;\n}\n\nexport class EventSource<Data> implements Events<Data> {\n  private listeners = new Map<keyof Data, Listener<Data, any>[]>();\n  private anyListeners: AnyListener<Data>[] | undefined;\n\n  on<Key extends keyof Data>(\n    eventKey: Key,\n    listener: Listener<Data, Key>\n  ): void {\n    let listeners = this.listeners.get(eventKey);\n    if (!listeners) {\n      listeners = [];\n      this.listeners.set(eventKey, listeners);\n    }\n    listeners.push(listener);\n  }\n\n  onAny(listener: AnyListener<Data>): void {\n    let listeners = this.anyListeners;\n    if (!listeners) {\n      listeners = [];\n      this.anyListeners = listeners;\n    }\n    listeners.push(listener);\n  }\n\n  off<Key extends keyof Data>(\n    eventKey: Key,\n    listener: Listener<Data, Key>\n  ): void {\n    const listeners = this.listeners.get(eventKey);\n    if (!listeners) {\n      return;\n    }\n    const index = listeners.indexOf(listener);\n    if (index >= 0) {\n      listeners.splice(index, 1);\n    }\n  }\n\n  offAny(listener: AnyListener<Data>): void {\n    const listeners = this.anyListeners;\n    if (!listeners) {\n      return;\n    }\n    const index = listeners.indexOf(listener);\n    if (index >= 0) {\n      listeners.splice(index, 1);\n    }\n  }\n\n  trigger<Key extends keyof Data>(eventKey: Key, data: Data[Key]): void {\n    const listeners = this.listeners.get(eventKey);\n    if (listeners) {\n      for (const listener of listeners) {\n        listener(data, eventKey);\n      }\n    }\n\n    if (this.anyListeners) {\n      for (const anyListener of this.anyListeners) {\n        anyListener({ [eventKey]: data } as any, eventKey as string);\n      }\n    }\n  }\n}\n\nexport class EventObserver {\n  private unsubscribeByKey = new Map<string, Unsubscribe[]>();\n  private onDispose: Unsubscribe[] = [];\n\n  listen<Data, Key extends keyof Data>(\n    events: Events<Data>,\n    eventKey: Key,\n    listener: Listener<Data, Key>\n  ) {\n    events.on(eventKey, listener);\n    this.onDispose.push(() => events.off(eventKey, listener));\n  }\n\n  listenAny<Data>(events: Events<Data>, listener: AnyListener<Data>) {\n    events.onAny(listener);\n    this.onDispose.push(() => events.offAny(listener));\n  }\n\n  listenOnce<Data, Key extends keyof Data>(\n    events: Events<Data>,\n    eventKey: Key,\n    listener: Listener<Data, Key>\n  ) {\n    let handled = false;\n    const onceListener: Listener<Data, Key> = (data, key) => {\n      handled = true;\n      events.off(eventKey, onceListener);\n      listener(data, key);\n    };\n    events.on(eventKey, onceListener);\n    this.onDispose.push(() => {\n      if (handled) {\n        return;\n      }\n      events.off(eventKey, onceListener);\n    });\n  }\n\n  stopListening() {\n    for (const unsubscribe of this.onDispose) {\n      unsubscribe();\n    }\n    this.onDispose.length = 0;\n\n    this.unsubscribeByKey.forEach((unsubscribers) => {\n      for (const unsubscribe of unsubscribers) {\n        unsubscribe();\n      }\n    });\n    this.unsubscribeByKey.clear();\n  }\n}\n","import { Element } from \"./elements\";\n\nexport interface Vector {\n  readonly x: number;\n  readonly y: number;\n}\nexport const Vector = {\n  equals(a: Vector, b: Vector) {\n    return a.x === b.x && a.y === b.y;\n  },\n  length({ x, y }: Vector) {\n    return Math.sqrt(x * x + y * y);\n  },\n  normalize({ x, y }: Vector) {\n    if (x === 0 && y === 0) {\n      return { x, y };\n    }\n    const inverseLength = 1 / Math.sqrt(x * x + y * y);\n    return { x: x * inverseLength, y: y * inverseLength };\n  },\n  dot({ x: x1, y: y1 }: Vector, { x: x2, y: y2 }: Vector): number {\n    return x1 * x2 + y1 * y2;\n  },\n  cross2D({ x: x1, y: y1 }: Vector, { x: x2, y: y2 }: Vector) {\n    return x1 * y2 - y1 * x2;\n  },\n};\n\nexport interface Size {\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface Rect {\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport const Rect = {\n  center({ x, y, width, height }: Rect) {\n    return { x: x + width / 2, y: y + height / 2 };\n  },\n};\n\nexport function boundsOf(element: Element): Rect {\n  const { x, y } = element.position;\n  const { width, height } = element.size;\n  return { x, y, width, height };\n}\n\nfunction intersectRayFromRectangleCenter(sourceRect: Rect, rayTarget: Vector) {\n  const isTargetInsideRect =\n    sourceRect.width === 0 ||\n    sourceRect.height === 0 ||\n    (rayTarget.x > sourceRect.x &&\n      rayTarget.x < sourceRect.x + sourceRect.width &&\n      rayTarget.y > sourceRect.y &&\n      rayTarget.y < sourceRect.y + sourceRect.height);\n\n  const halfWidth = sourceRect.width / 2;\n  const halfHeight = sourceRect.height / 2;\n  const center = {\n    x: sourceRect.x + halfWidth,\n    y: sourceRect.y + halfHeight,\n  };\n  if (isTargetInsideRect) {\n    return center;\n  }\n\n  const direction = Vector.normalize({\n    x: rayTarget.x - center.x,\n    y: rayTarget.y - center.y,\n  });\n\n  const rightDirection = { x: Math.abs(direction.x), y: direction.y };\n  const isHorizontal =\n    Vector.cross2D({ x: halfWidth, y: -halfHeight }, rightDirection) > 0 &&\n    Vector.cross2D({ x: halfWidth, y: halfHeight }, rightDirection) < 0;\n\n  if (isHorizontal) {\n    return {\n      x: center.x + halfWidth * Math.sign(direction.x),\n      y: center.y + (halfWidth * direction.y) / Math.abs(direction.x),\n    };\n  } else {\n    return {\n      x: center.x + (halfHeight * direction.x) / Math.abs(direction.y),\n      y: center.y + halfHeight * Math.sign(direction.y),\n    };\n  }\n}\n\nexport function isPolylineEqual(\n  left: readonly Vector[],\n  right: readonly Vector[]\n) {\n  if (left === right) {\n    return true;\n  }\n  if (left.length !== right.length) {\n    return false;\n  }\n  for (let i = 0; i < left.length; i++) {\n    const a = left[i];\n    const b = right[i];\n    if (!(a.x === b.x && a.y === b.y)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function computePolyline(\n  source: Element,\n  target: Element,\n  vertices: readonly Vector[]\n): Vector[] {\n  const sourceRect = boundsOf(source);\n  const targetRect = boundsOf(target);\n  const startPoint = intersectRayFromRectangleCenter(\n    sourceRect,\n    vertices.length > 0 ? vertices[0] : Rect.center(targetRect)\n  );\n  const endPoint = intersectRayFromRectangleCenter(\n    targetRect,\n    vertices.length > 0\n      ? vertices[vertices.length - 1]\n      : Rect.center(sourceRect)\n  );\n  return [startPoint, ...vertices, endPoint];\n}\n\nexport function computePolylineLength(polyline: readonly Vector[]): number {\n  let previous: Vector;\n  return polyline.reduce((acc, point) => {\n    const segmentLength = previous\n      ? Vector.length({ x: point.x - previous.x, y: point.y - previous.y })\n      : 0;\n    previous = point;\n    return acc + segmentLength;\n  }, 0);\n}\n\nexport function getPointAlongPolyline(\n  polyline: readonly Vector[],\n  offset: number\n): Vector {\n  if (polyline.length === 0) {\n    throw new Error(\"Cannot compute a point for empty polyline\");\n  }\n  if (offset < 0) {\n    return polyline[0];\n  }\n  let currentOffset = 0;\n  for (let i = 1; i < polyline.length; i++) {\n    const previous = polyline[i - 1];\n    const point = polyline[i];\n    const segment = { x: point.x - previous.x, y: point.y - previous.y };\n    const segmentLength = Vector.length(segment);\n    const newOffset = currentOffset + segmentLength;\n    if (offset < newOffset) {\n      const leftover = (offset - currentOffset) / segmentLength;\n      return {\n        x: previous.x + leftover * segment.x,\n        y: previous.y + leftover * segment.y,\n      };\n    } else {\n      currentOffset = newOffset;\n    }\n  }\n  return polyline[polyline.length - 1];\n}\n\nexport function findNearestSegmentIndex(\n  polyline: readonly Vector[],\n  location: Vector\n): number {\n  let minDistance = Infinity;\n  let foundIndex = 0;\n\n  for (let i = 0; i < polyline.length - 1; i++) {\n    const pivot = polyline[i];\n    const next = polyline[i + 1];\n\n    const target = { x: location.x - pivot.x, y: location.y - pivot.y };\n    const segment = { x: next.x - pivot.x, y: next.y - pivot.y };\n    const segmentLength = Vector.length(segment);\n\n    const projectionToSegment = Vector.dot(target, segment) / segmentLength;\n    if (projectionToSegment < 0 || projectionToSegment > segmentLength) {\n      continue;\n    }\n\n    const distanceToSegment =\n      Math.abs(Vector.cross2D(target, segment)) / segmentLength;\n    if (distanceToSegment < minDistance) {\n      minDistance = distanceToSegment;\n      foundIndex = i;\n    }\n  }\n  return foundIndex;\n}\n\nexport function findElementAtPoint(\n  elements: readonly Element[],\n  point: Vector\n): Element | undefined {\n  for (let i = elements.length - 1; i >= 0; i--) {\n    const element = elements[i];\n    const { x, y, width, height } = boundsOf(element);\n\n    if (element.temporary) {\n      continue;\n    }\n\n    if (\n      point.x >= x &&\n      point.x <= x + width &&\n      point.y >= y &&\n      point.y <= y + height\n    ) {\n      return element;\n    }\n  }\n  return undefined;\n}\n\nexport function computeGrouping(\n  elements: readonly Element[]\n): Map<string, Element[]> {\n  const grouping = new Map<string, Element[]>();\n  for (const element of elements) {\n    const group = element.group;\n    if (typeof group === \"string\") {\n      let children = grouping.get(group);\n      if (!children) {\n        children = [];\n        grouping.set(group, children);\n      }\n      children.push(element);\n    }\n  }\n  return grouping;\n}\n","import {\n  ElementModel,\n  LinkModel,\n  LocalizedString,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n  PropertyTypeIri,\n} from \"../data/model\";\nimport { GenerateID } from \"../data/schema\";\n\nimport { EventSource, Events, PropertyChange } from \"../viewUtils/events\";\n\nimport { Vector, Size, isPolylineEqual, Rect } from \"./geometry\";\n\nexport type Cell = Element | Link | LinkVertex;\n\nexport enum LinkDirection {\n  in = \"in\",\n  out = \"out\",\n}\n\nexport interface ElementEvents {\n  changeData: PropertyChange<Element, ElementModel>;\n  changePosition: PropertyChange<Element, Vector>;\n  changeSize: PropertyChange<Element, Size>;\n  changeExpanded: PropertyChange<Element, boolean>;\n  changeGroup: PropertyChange<Element, string>;\n  changeElementState: PropertyChange<Element, ElementTemplateState | undefined>;\n  requestedFocus: { source: Element };\n  requestedGroupContent: { source: Element };\n  requestedAddToFilter: {\n    source: Element;\n    linkType?: FatLinkType;\n    direction?: \"in\" | \"out\";\n  };\n  requestedRedraw: { source: Element };\n}\n\nexport class Element {\n  private readonly source = new EventSource<ElementEvents>();\n  readonly events: Events<ElementEvents> = this.source;\n\n  readonly id: string;\n  /** All in and out links of the element */\n  readonly links: Link[] = [];\n\n  private _data: ElementModel;\n  private _position: Vector;\n  private _size: Size;\n  private _expanded: boolean;\n  private _group: string | undefined;\n  private _elementState: ElementTemplateState | undefined;\n  private _temporary: boolean;\n\n  constructor(props: {\n    id: string;\n    data: ElementModel;\n    position?: Vector;\n    size?: Size;\n    expanded?: boolean;\n    group?: string;\n    elementState?: ElementTemplateState;\n    temporary?: boolean;\n  }) {\n    const {\n      id,\n      data,\n      position = { x: 0, y: 0 },\n      size = { width: 0, height: 0 },\n      expanded = false,\n      group,\n      elementState,\n      temporary = false,\n    } = props;\n\n    this.id = id;\n    this._data = data;\n    this._position = position;\n    this._size = size;\n    this._expanded = expanded;\n    this._group = group;\n    this._elementState = elementState;\n    this._temporary = temporary;\n  }\n\n  get iri() {\n    return this._data.id;\n  }\n\n  get data() {\n    return this._data;\n  }\n  setData(value: ElementModel) {\n    const previous = this._data;\n    if (previous === value) {\n      return;\n    }\n    this._data = value;\n    this.source.trigger(\"changeData\", { source: this, previous });\n    updateLinksToReferByNewIri(this, previous.id, value.id);\n  }\n\n  get position(): Vector {\n    return this._position;\n  }\n  setPosition(value: Vector) {\n    const previous = this._position;\n    const same = previous.x === value.x && previous.y === value.y;\n    if (same) {\n      return;\n    }\n    this._position = value;\n    this.source.trigger(\"changePosition\", { source: this, previous });\n  }\n\n  get size(): Size {\n    return this._size;\n  }\n  setSize(value: Size) {\n    const previous = this._size;\n    const same =\n      previous.width === value.width && previous.height === value.height;\n    if (same) {\n      return;\n    }\n    this._size = value;\n    this.source.trigger(\"changeSize\", { source: this, previous });\n  }\n\n  get isExpanded(): boolean {\n    return this._expanded;\n  }\n  setExpanded(value: boolean) {\n    const previous = this._expanded;\n    if (previous === value) {\n      return;\n    }\n    this._expanded = value;\n    this.source.trigger(\"changeExpanded\", { source: this, previous });\n  }\n\n  get group(): string | undefined {\n    return this._group;\n  }\n  setGroup(value: string | undefined) {\n    const previous = this._group;\n    if (previous === value) {\n      return;\n    }\n    this._group = value;\n    this.source.trigger(\"changeGroup\", { source: this, previous });\n  }\n\n  get elementState(): ElementTemplateState | undefined {\n    return this._elementState;\n  }\n  setElementState(value: ElementTemplateState | undefined) {\n    const previous = this._elementState;\n    if (previous === value) {\n      return;\n    }\n    this._elementState = value;\n    this.source.trigger(\"changeElementState\", { source: this, previous });\n  }\n\n  get temporary(): boolean {\n    return this._temporary;\n  }\n\n  focus() {\n    this.source.trigger(\"requestedFocus\", { source: this });\n  }\n\n  requestGroupContent() {\n    this.source.trigger(\"requestedGroupContent\", { source: this });\n  }\n\n  addToFilter(linkType?: FatLinkType, direction?: \"in\" | \"out\") {\n    this.source.trigger(\"requestedAddToFilter\", {\n      source: this,\n      linkType,\n      direction,\n    });\n  }\n\n  redraw() {\n    this.source.trigger(\"requestedRedraw\", { source: this });\n  }\n}\n\nexport type ElementTemplateState = Record<string, any>;\n\nexport interface AddToFilterRequest {\n  element: Element;\n  linkType?: FatLinkType;\n  direction?: \"in\" | \"out\";\n}\n\nfunction updateLinksToReferByNewIri(\n  element: Element,\n  oldIri: ElementIri,\n  newIri: ElementIri\n) {\n  if (oldIri === newIri) {\n    return;\n  }\n  for (const link of element.links) {\n    let data = link.data;\n    if (data.sourceId === oldIri) {\n      data = { ...data, sourceId: newIri };\n    }\n    if (data.targetId === oldIri) {\n      data = { ...data, targetId: newIri };\n    }\n    link.setData(data);\n  }\n}\n\nexport interface FatClassModelEvents {\n  changeLabel: PropertyChange<FatClassModel, readonly LocalizedString[]>;\n  changeCount: PropertyChange<FatClassModel, number | undefined>;\n}\n\nexport class FatClassModel {\n  private readonly source = new EventSource<FatClassModelEvents>();\n  readonly events: Events<FatClassModelEvents> = this.source;\n\n  readonly id: ElementTypeIri;\n\n  private _label: readonly LocalizedString[];\n  private _count: number | undefined;\n\n  constructor(props: {\n    id: ElementTypeIri;\n    label?: readonly LocalizedString[];\n    count?: number;\n  }) {\n    const { id, label = [], count } = props;\n    this.id = id;\n    this._label = label;\n    this._count = count;\n  }\n\n  get label() {\n    return this._label;\n  }\n  setLabel(value: readonly LocalizedString[]) {\n    const previous = this._label;\n    if (previous === value) {\n      return;\n    }\n    this._label = value;\n    this.source.trigger(\"changeLabel\", { source: this, previous });\n  }\n\n  get count() {\n    return this._count;\n  }\n  setCount(value: number | undefined) {\n    const previous = this._count;\n    if (previous === value) {\n      return;\n    }\n    this._count = value;\n    this.source.trigger(\"changeCount\", { source: this, previous });\n  }\n}\n\nexport interface RichPropertyEvents {\n  changeLabel: PropertyChange<RichProperty, readonly LocalizedString[]>;\n}\n\nexport class RichProperty {\n  private readonly source = new EventSource<RichPropertyEvents>();\n  readonly events: Events<RichPropertyEvents> = this.source;\n\n  readonly id: PropertyTypeIri;\n\n  private _label: readonly LocalizedString[];\n\n  constructor(props: {\n    id: PropertyTypeIri;\n    label?: readonly LocalizedString[];\n  }) {\n    const { id, label = [] } = props;\n    this.id = id;\n    this._label = label;\n  }\n\n  get label(): readonly LocalizedString[] {\n    return this._label;\n  }\n  setLabel(value: readonly LocalizedString[]) {\n    const previous = this._label;\n    if (previous === value) {\n      return;\n    }\n    this._label = value;\n    this.source.trigger(\"changeLabel\", { source: this, previous });\n  }\n}\n\nexport interface LinkEvents {\n  changeData: PropertyChange<Link, LinkModel>;\n  changeLayoutOnly: PropertyChange<Link, boolean>;\n  changeVertices: PropertyChange<Link, readonly Vector[]>;\n  changeLabelBounds: PropertyChange<Link, Rect>;\n  changeLinkState: PropertyChange<Link, LinkTemplateState | undefined>;\n}\n\nexport class Link {\n  private readonly source = new EventSource<LinkEvents>();\n  readonly events: Events<LinkEvents> = this.source;\n\n  readonly id: string;\n\n  private _typeId: LinkTypeIri;\n  private _sourceId: string;\n  private _targetId: string;\n\n  private _data: LinkModel | undefined;\n  private _labelBounds: Rect | undefined;\n  private _layoutOnly: boolean;\n  private _vertices: readonly Vector[];\n\n  private _linkState: LinkTemplateState | undefined;\n\n  constructor(props: {\n    id?: string;\n    typeId: LinkTypeIri;\n    sourceId: string;\n    targetId: string;\n    data?: LinkModel;\n    vertices?: readonly Vector[];\n    linkState?: LinkTemplateState;\n  }) {\n    const {\n      id = GenerateID.forLink(),\n      typeId,\n      sourceId,\n      targetId,\n      data,\n      vertices = [],\n      linkState,\n    } = props;\n    this.id = id;\n    this._typeId = typeId;\n    this._sourceId = sourceId;\n    this._targetId = targetId;\n    this._data = data;\n    this._vertices = vertices;\n    this._linkState = linkState;\n  }\n\n  get typeId() {\n    return this._typeId;\n  }\n  get sourceId(): string {\n    return this._sourceId;\n  }\n  get targetId(): string {\n    return this._targetId;\n  }\n\n  get data() {\n    return this._data;\n  }\n  setData(value: LinkModel | undefined) {\n    const previous = this._data;\n    if (previous === value) {\n      return;\n    }\n    this._data = value;\n    this._typeId = value.linkTypeId;\n    this.source.trigger(\"changeData\", { source: this, previous });\n  }\n\n  get labelBounds() {\n    return this._labelBounds;\n  }\n  setLabelBounds(value: Rect | undefined) {\n    const previous = this._labelBounds;\n    if (previous === value) {\n      return;\n    }\n    this._labelBounds = value;\n    this.source.trigger(\"changeLabelBounds\", { source: this, previous });\n  }\n\n  get layoutOnly(): boolean {\n    return this._layoutOnly;\n  }\n  setLayoutOnly(value: boolean) {\n    const previous = this._layoutOnly;\n    if (previous === value) {\n      return;\n    }\n    this._layoutOnly = value;\n    this.source.trigger(\"changeLayoutOnly\", { source: this, previous });\n  }\n\n  get vertices(): readonly Vector[] {\n    return this._vertices;\n  }\n  setVertices(value: readonly Vector[]) {\n    const previous = this._vertices;\n    if (isPolylineEqual(this._vertices, value)) {\n      return;\n    }\n    this._vertices = value;\n    this.source.trigger(\"changeVertices\", { source: this, previous });\n  }\n\n  get linkState(): LinkTemplateState | undefined {\n    return this._linkState;\n  }\n  setLinkState(value: LinkTemplateState | undefined) {\n    const previous = this._linkState;\n    if (previous === value) {\n      return;\n    }\n    this._linkState = value;\n    this.source.trigger(\"changeLinkState\", { source: this, previous });\n  }\n}\n\nexport type LinkTemplateState = Record<string, any>;\n\nexport function linkMarkerKey(linkTypeIndex: number, startMarker: boolean) {\n  return `graph-explorer-${startMarker ? \"mstart\" : \"mend\"}-${linkTypeIndex}`;\n}\n\nexport interface FatLinkTypeEvents {\n  changeLabel: PropertyChange<FatLinkType, readonly LocalizedString[]>;\n  changeIsNew: PropertyChange<FatLinkType, boolean>;\n  changeVisibility: {\n    source: FatLinkType;\n    preventLoading: boolean;\n  };\n}\n\n/**\n * Properties:\n *     visible: boolean\n *     showLabel: boolean\n *     isNew?: boolean\n *     label?: { values: LocalizedString[] }\n */\nexport class FatLinkType {\n  private readonly source = new EventSource<FatLinkTypeEvents>();\n  readonly events: Events<FatLinkTypeEvents> = this.source;\n\n  readonly id: LinkTypeIri;\n\n  private _index: number | undefined;\n\n  private _label: readonly LocalizedString[];\n  private _isNew = false;\n\n  private _visible = true;\n  private _showLabel = true;\n\n  constructor(props: {\n    id: LinkTypeIri;\n    index?: number;\n    label?: readonly LocalizedString[];\n  }) {\n    const { id, index, label = [] } = props;\n    this.id = id;\n    this._index = index;\n    this._label = label;\n  }\n\n  get index() {\n    return this._index;\n  }\n  setIndex(value: number) {\n    if (typeof this._index === \"number\") {\n      throw new Error(\"Cannot set index for link type more than once.\");\n    }\n    this._index = value;\n  }\n\n  get label() {\n    return this._label;\n  }\n  setLabel(value: readonly LocalizedString[]) {\n    const previous = this._label;\n    if (previous === value) {\n      return;\n    }\n    this._label = value;\n    this.source.trigger(\"changeLabel\", { source: this, previous });\n  }\n\n  get visible() {\n    return this._visible;\n  }\n  get showLabel() {\n    return this._showLabel;\n  }\n  setVisibility(params: {\n    visible: boolean;\n    showLabel: boolean;\n    preventLoading?: boolean;\n  }) {\n    const same =\n      this._visible === params.visible && this._showLabel === params.showLabel;\n    if (same) {\n      return;\n    }\n    const preventLoading =\n      Boolean(params.preventLoading) || this._visible === params.visible;\n    this._visible = params.visible;\n    this._showLabel = params.showLabel;\n    this.source.trigger(\"changeVisibility\", { source: this, preventLoading });\n  }\n\n  get isNew() {\n    return this._isNew;\n  }\n  setIsNew(value: boolean) {\n    const previous = this._isNew;\n    if (previous === value) {\n      return;\n    }\n    this._isNew = value;\n    this.source.trigger(\"changeIsNew\", { source: this, previous });\n  }\n}\n\nexport class LinkVertex {\n  constructor(readonly link: Link, readonly vertexIndex: number) {}\n\n  createAt(location: Vector) {\n    const vertices = [...this.link.vertices];\n    vertices.splice(this.vertexIndex, 0, location);\n    this.link.setVertices(vertices);\n  }\n\n  moveTo(location: Vector) {\n    const vertices = [...this.link.vertices];\n    vertices.splice(this.vertexIndex, 1, location);\n    this.link.setVertices(vertices);\n  }\n\n  remove() {\n    const vertices = [...this.link.vertices];\n    vertices.splice(this.vertexIndex, 1);\n    this.link.setVertices(vertices);\n  }\n}\n","import { EventSource } from \"./events\";\n\nexport abstract class BatchingScheduler {\n  private useAnimationFrame: boolean;\n  private scheduled: number | undefined;\n\n  constructor(readonly waitingTime = 0) {\n    this.useAnimationFrame = waitingTime === 0;\n    this.runSynchronously = this.runSynchronously.bind(this);\n  }\n\n  protected schedule() {\n    if (typeof this.scheduled === \"undefined\") {\n      if (this.useAnimationFrame) {\n        this.scheduled = requestAnimationFrame(this.runSynchronously);\n      } else {\n        this.scheduled = Number(\n          setTimeout(this.runSynchronously, this.waitingTime)\n        );\n      }\n    }\n  }\n\n  protected abstract run(): void;\n\n  runSynchronously() {\n    const wasScheduled = this.cancelScheduledTimeout();\n    if (wasScheduled) {\n      this.run();\n    }\n  }\n\n  dispose() {\n    this.cancelScheduledTimeout();\n  }\n\n  private cancelScheduledTimeout(): boolean {\n    if (typeof this.scheduled !== \"undefined\") {\n      if (this.useAnimationFrame) {\n        cancelAnimationFrame(this.scheduled);\n      } else {\n        clearTimeout(this.scheduled);\n      }\n      this.scheduled = undefined;\n      return true;\n    }\n    return false;\n  }\n}\n\nexport class BufferingQueue<Key extends string> extends BatchingScheduler {\n  private fetchingQueue: Record<string, true> = Object.create(null);\n\n  constructor(private onFetch: (keys: Key[]) => void, waitingTime = 200) {\n    super(waitingTime);\n  }\n\n  push(key: Key) {\n    this.fetchingQueue[key] = true;\n    this.schedule();\n  }\n\n  clear() {\n    this.fetchingQueue = Object.create(null);\n  }\n\n  protected run() {\n    const { fetchingQueue, onFetch } = this;\n    this.fetchingQueue = Object.create(null);\n    onFetch(Object.keys(fetchingQueue) as Key[]);\n  }\n}\n\nexport class Debouncer extends BatchingScheduler {\n  private callback: (() => void) | undefined;\n\n  call(callback: () => void) {\n    this.callback = callback;\n    this.schedule();\n  }\n\n  protected run() {\n    const callback = this.callback;\n    callback();\n  }\n}\n\nexport class Cancellation {\n  public static NEVER_SIGNAL: CancellationToken = {\n    aborted: false,\n    addEventListener: () => {\n      /* nothing */\n    },\n    removeEventListener: () => {\n      /* nothing */\n    },\n  };\n  private source: EventSource<{ abort: undefined }> | undefined =\n    new EventSource();\n  private aborted = false;\n\n  readonly signal: CancellationToken;\n\n  constructor() {\n    this.signal = new (class {\n      constructor(private parent: Cancellation) {}\n      get aborted() {\n        return this.parent.aborted;\n      }\n      addEventListener(event: \"abort\", handler: () => void) {\n        if (event !== \"abort\") {\n          return;\n        }\n        if (this.parent.source) {\n          this.parent.source.on(\"abort\", handler);\n        } else {\n          handler();\n        }\n      }\n      removeEventListener(event: \"abort\", handler: () => void) {\n        if (event !== \"abort\") {\n          return;\n        }\n        if (this.parent.source) {\n          this.parent.source.off(\"abort\", handler);\n        }\n      }\n    })(this);\n  }\n\n  abort() {\n    if (this.aborted) {\n      return;\n    }\n    this.aborted = true;\n    this.source.trigger(\"abort\", undefined);\n    this.source = undefined;\n  }\n}\n\nexport interface CancellationToken {\n  readonly aborted: boolean;\n  addEventListener(event: \"abort\", handler: () => void): void;\n  removeEventListener(event: \"abort\", handler: () => void): void;\n}\n\nexport const CancellationToken = {\n  throwIfAborted(ct: CancellationToken): void {\n    if (ct.aborted) {\n      throw new CancelledError();\n    }\n  },\n\n  mapCancelledToNull<T>(\n    ct: CancellationToken,\n    promise: Promise<T>\n  ): Promise<T | null> {\n    const onResolve = (value: T): T | null => {\n      if (ct.aborted) {\n        return null;\n      }\n      return value;\n    };\n    const onReject = (err: any): null | Promise<null> => {\n      if (ct.aborted) {\n        return null;\n      }\n      return Promise.reject(err);\n    };\n    return promise.then(onResolve, onReject);\n  },\n};\n\nexport class CancelledError extends Error {\n  constructor(message = \"Operation was cancelled\") {\n    super(message);\n    this.name = CancelledError.name;\n    Object.setPrototypeOf(this, CancelledError.prototype);\n  }\n}\n\nexport function delay(timeout: number) {\n  return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\nexport function animateInterval(\n  duration: number,\n  onProgress: (progress: number) => void,\n  cancellation?: Cancellation\n): Promise<void> {\n  return new Promise((resolve) => {\n    let animationFrameId: number;\n    let start: number;\n\n    const animate = (time: number) => {\n      if (cancellation && cancellation.signal.aborted) {\n        return;\n      }\n\n      start = start || time;\n      let timePassed = time - start;\n      if (timePassed > duration) {\n        timePassed = duration;\n      }\n\n      onProgress(timePassed / duration);\n\n      if (timePassed < duration) {\n        animationFrameId = requestAnimationFrame(animate);\n      } else {\n        resolve();\n      }\n    };\n\n    cancellation.signal.addEventListener(\"abort\", () => {\n      cancelAnimationFrame(animationFrameId);\n      resolve();\n    });\n    animationFrameId = requestAnimationFrame(animate);\n  });\n}\n\nexport function easeInOutBezier(t: number) {\n  if (t < 0) {\n    return 0;\n  }\n  if (t > 1) {\n    return 1;\n  }\n  return t * t * (3.0 - 2.0 * t);\n}\n","import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from \"../data/model\";\n\nimport {\n  FatClassModelEvents,\n  FatLinkTypeEvents,\n  RichPropertyEvents,\n} from \"../diagram/elements\";\nimport { DiagramModel } from \"../diagram/model\";\n\nimport { Unsubscribe, Listener } from \"./events\";\n\nexport class KeyedObserver<Key extends string> {\n  private observedKeys = new Map<string, Unsubscribe>();\n\n  constructor(readonly subscribe: (key: Key) => Unsubscribe | undefined) {}\n\n  observe(keys: readonly Key[]) {\n    if (keys.length === 0 && this.observedKeys.size === 0) {\n      return;\n    }\n    const newObservedKeys = new Map<string, Unsubscribe>();\n\n    for (const key of keys) {\n      if (newObservedKeys.has(key)) {\n        continue;\n      }\n      let unsubscribe = this.observedKeys.get(key);\n      if (!unsubscribe) {\n        unsubscribe = this.subscribe(key);\n      }\n      newObservedKeys.set(key, unsubscribe);\n    }\n\n    this.observedKeys.forEach((unsubscribe, key) => {\n      if (!newObservedKeys.has(key)) {\n        unsubscribe();\n      }\n    });\n\n    this.observedKeys = newObservedKeys;\n  }\n\n  stopListening() {\n    this.observe([]);\n  }\n}\n\nexport function observeElementTypes<Event extends keyof FatClassModelEvents>(\n  model: DiagramModel,\n  event: Event,\n  listener: Listener<FatClassModelEvents, Event>\n) {\n  return new KeyedObserver<ElementTypeIri>((key) => {\n    const type = model.getClass(key);\n    if (type) {\n      type.events.on(event, listener);\n      return () => type.events.off(event, listener);\n    }\n    return undefined;\n  });\n}\n\nexport function observeProperties<Event extends keyof RichPropertyEvents>(\n  model: DiagramModel,\n  event: Event,\n  listener: Listener<RichPropertyEvents, Event>\n) {\n  return new KeyedObserver<PropertyTypeIri>((key) => {\n    const property = model.getProperty(key);\n    if (property) {\n      property.events.on(event, listener);\n      return () => property.events.off(event, listener);\n    }\n    return undefined;\n  });\n}\n\nexport function observeLinkTypes<Event extends keyof FatLinkTypeEvents>(\n  model: DiagramModel,\n  event: Event,\n  listener: Listener<FatLinkTypeEvents, Event>\n) {\n  return new KeyedObserver<LinkTypeIri>((key) => {\n    const type = model.createLinkType(key);\n    if (type) {\n      type.events.on(event, listener);\n      return () => type.events.off(event, listener);\n    }\n    return undefined;\n  });\n}\n","import { EventSource, Events } from \"../viewUtils/events\";\n\nexport interface Command {\n  readonly title?: string;\n  readonly invoke: CommandAction;\n}\n\n/** @returns Inverse command */\nexport type CommandAction = () => Command;\n\nfunction createAction(title: string, action: CommandAction): Command {\n  return { title, invoke: action };\n}\n\nfunction effectAction(title: string, body: () => void): Command {\n  const perform = {\n    title,\n    invoke: () => {\n      body();\n      return skip;\n    },\n  };\n  const skip = {\n    title: \"Skipped effect: \" + title,\n    invoke: () => perform,\n  };\n  return perform;\n}\n\nexport const Command = {\n  create: createAction,\n  effect: effectAction,\n};\n\nexport interface CommandHistoryEvents {\n  historyChanged: { hasChanges: boolean };\n}\n\nexport interface CommandHistory {\n  readonly events: Events<CommandHistoryEvents>;\n  readonly undoStack: readonly Command[];\n  readonly redoStack: readonly Command[];\n  reset(): void;\n  undo(): void;\n  redo(): void;\n  execute(command: Command): void;\n  registerToUndo(command: Command): void;\n  startBatch(title?: string): Batch;\n}\n\nexport interface Batch {\n  readonly history: CommandHistory;\n  store(): void;\n  discard(): void;\n}\n\nexport class NonRememberingHistory implements CommandHistory {\n  private readonly source = new EventSource<CommandHistoryEvents>();\n  readonly events: Events<CommandHistoryEvents> = this.source;\n\n  readonly undoStack: readonly Command[] = [];\n  readonly redoStack: readonly Command[] = [];\n\n  reset() {\n    this.source.trigger(\"historyChanged\", { hasChanges: false });\n  }\n  undo() {\n    throw new Error(\"Undo is unsupported\");\n  }\n  redo() {\n    throw new Error(\"Redo is unsupported\");\n  }\n\n  execute(command: Command) {\n    command.invoke();\n    this.source.trigger(\"historyChanged\", { hasChanges: true });\n  }\n  registerToUndo(_command: Command) {\n    this.source.trigger(\"historyChanged\", { hasChanges: true });\n  }\n  startBatch(_title?: string): Batch {\n    return {\n      history: this,\n      store: this.storeBatch,\n      discard: this.discardBatch,\n    };\n  }\n  private storeBatch = () => {\n    /* nothing */\n  };\n  private discardBatch = () => {\n    /* nothing */\n  };\n}\n","import { ElementModel, ElementIri, LinkModel, sameLink } from \"../data/model\";\n\nimport { Element, Link, FatLinkType } from \"./elements\";\nimport { Vector, isPolylineEqual } from \"./geometry\";\nimport { Command } from \"./history\";\nimport { DiagramModel } from \"./model\";\n\nexport class RestoreGeometry implements Command {\n  readonly title = \"Move elements and links\";\n\n  constructor(\n    private elementState: readonly { element: Element; position: Vector }[],\n    private linkState: readonly {\n      link: Link;\n      vertices: readonly Vector[];\n    }[]\n  ) {}\n\n  static capture(model: DiagramModel) {\n    return RestoreGeometry.captureElementsAndLinks(model.elements, model.links);\n  }\n\n  private static captureElementsAndLinks(\n    elements: readonly Element[],\n    links: readonly Link[]\n  ) {\n    return new RestoreGeometry(\n      elements.map((element) => ({ element, position: element.position })),\n      links.map((link) => ({ link, vertices: link.vertices }))\n    );\n  }\n\n  hasChanges() {\n    return this.elementState.length > 0 || this.linkState.length > 0;\n  }\n\n  filterOutUnchanged(): RestoreGeometry {\n    return new RestoreGeometry(\n      this.elementState.filter(\n        ({ element, position }) => !Vector.equals(element.position, position)\n      ),\n      this.linkState.filter(\n        ({ link, vertices }) => !isPolylineEqual(link.vertices, vertices)\n      )\n    );\n  }\n\n  invoke(): RestoreGeometry {\n    const previous = RestoreGeometry.captureElementsAndLinks(\n      this.elementState.map((state) => state.element),\n      this.linkState.map((state) => state.link)\n    );\n    // restore in reverse order to workaround position changed event\n    // handling in EmbeddedLayer inside nested elements\n    // (child's position change causes group to resize or move itself)\n    for (const { element, position } of [...this.elementState].reverse()) {\n      element.setPosition(position);\n    }\n    for (const { link, vertices } of this.linkState) {\n      link.setVertices(vertices);\n    }\n    return previous;\n  }\n}\n\nexport function restoreCapturedLinkGeometry(link: Link): Command {\n  const vertices = link.vertices;\n  return Command.create(\"Change link vertices\", () => {\n    const capturedInverse = restoreCapturedLinkGeometry(link);\n    link.setVertices(vertices);\n    return capturedInverse;\n  });\n}\n\nexport function setElementExpanded(\n  element: Element,\n  expanded: boolean\n): Command {\n  const title = expanded ? \"Expand element\" : \"Collapse element\";\n  return Command.create(title, () => {\n    element.setExpanded(expanded);\n    return setElementExpanded(element, !expanded);\n  });\n}\n\nexport function changeLinkTypeVisibility(params: {\n  linkType: FatLinkType;\n  visible: boolean;\n  showLabel: boolean;\n  preventLoading?: boolean;\n}): Command {\n  const { linkType, visible, showLabel, preventLoading } = params;\n  return Command.create(\"Change link type visibility\", () => {\n    const previousVisible = linkType.visible;\n    const previousShowLabel = linkType.showLabel;\n    linkType.setVisibility({ visible, showLabel, preventLoading });\n    return changeLinkTypeVisibility({\n      linkType,\n      visible: previousVisible,\n      showLabel: previousShowLabel,\n      preventLoading,\n    });\n  });\n}\n\nexport function setElementData(\n  model: DiagramModel,\n  target: ElementIri,\n  data: ElementModel\n): Command {\n  const elements = model.elements.filter((el) => el.iri === target);\n  const previous = elements.length > 0 ? elements[0].data : undefined;\n  return Command.create(\"Set element data\", () => {\n    for (const element of model.elements.filter((el) => el.iri === target)) {\n      element.setData(data);\n    }\n    return setElementData(model, data.id, previous);\n  });\n}\n\nexport function setLinkData(\n  model: DiagramModel,\n  oldData: LinkModel,\n  newData: LinkModel\n): Command {\n  if (!sameLink(oldData, newData)) {\n    throw new Error(\n      \"Cannot change typeId, sourceId or targetId when changing link data\"\n    );\n  }\n  return Command.create(\"Set link data\", () => {\n    for (const link of model.links) {\n      if (sameLink(link.data, oldData)) {\n        link.setData(newData);\n      }\n    }\n    return setLinkData(model, newData, oldData);\n  });\n}\n","export default \"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCAyNiAyNiI+CiAgICA8dGV4dCB4PSIzIiB5PSIyMiIgY2xhc3M9InRleHQiIGZpbGw9IiNlYWFjNzciCiAgICAgICAgc3R5bGU9ImZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAyNnB4OyBmb250LXdlaWdodDogYm9sZDsiPgogICAgICAgIEMKICAgIDwvdGV4dD4KPC9zdmc+Cg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCAyNiAyNiI+CiAgICA8dGV4dCB4PSIwIiB5PSIyMCIgY2xhc3M9InRleHQiIGZpbGw9IiMzNGM3ZjMiCiAgICAgICAgc3R5bGU9ImZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogYm9sZDsiPgogICAgICAgIE9QCiAgICA8L3RleHQ+Cjwvc3ZnPgo=\"","export default \"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCAyNiAyNiI+CiAgICA8dGV4dCB4PSIwIiB5PSIyMCIgY2xhc3M9InRleHQiIGZpbGw9IiMzNGM3ZjMiCiAgICAgICAgc3R5bGU9ImZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogYm9sZDsiPgogICAgICAgIERQCiAgICA8L3RleHQ+Cjwvc3ZnPgo=\"","export default \"data:image/svg+xml,%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20x='0px'%20y='0px'%20viewBox='0%200%20350%20350'%3e%3cpath%20fill='%23eb7777'%20d='M175,171.173c38.914,0,70.463-38.318,70.463-85.586C245.463,38.318,235.105,0,175,0s-70.465,38.318-70.465,85.587%20C104.535,132.855,136.084,171.173,175,171.173z'/%3e%3cpath%20fill='%23eb7777'%20d='M41.909,301.853C41.897,298.971,41.885,301.041,41.909,301.853L41.909,301.853z'/%3e%3cpath%20fill='%23eb7777'%20d='M308.085,304.104C308.123,303.315,308.098,298.63,308.085,304.104L308.085,304.104z'/%3e%3cpath%20fill='%23eb7777'%20d='M307.935,298.397c-1.305-82.342-12.059-105.805-94.352-120.657c0,0-11.584,14.761-38.584,14.761%20s-38.586-14.761-38.586-14.761c-81.395,14.69-92.803,37.805-94.303,117.982c-0.123,6.547-0.18,6.891-0.202,6.131%20c0.005,1.424,0.011,4.058,0.011,8.651c0,0,19.592,39.496,133.08,39.496c113.486,0,133.08-39.496,133.08-39.496%20c0-2.951,0.002-5.003,0.005-6.399C308.062,304.575,308.018,303.664,307.935,298.397z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20x='0px'%20y='0px'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%2377ca98'%20d='M472.928,34.752c-4.416-3.008-10.016-3.552-14.944-1.6c-1.024,0.416-106.88,42.048-195.168,0.384%20C186.72-2.432,102.912,14.4,64,25.76V16c0-8.832-7.168-16-16-16c-8.832,0-16,7.168-16,16v32v256v192c0,8.832,7.168,16,16,16%20c8.832,0,16-7.168,16-16V315.328c28.384-9.184,112.608-31.136,185.184,3.136c34.592,16.352,70.784,21.792,103.648,21.792%20c63.2,0,114.016-20.128,117.184-21.408c6.016-2.464,9.984-8.32,9.984-14.848V48C480,42.688,477.344,37.728,472.928,34.752z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20x='0px'%20y='0px'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%2377ca98'%20d='M155,0H15C6.716,0,0,6.716,0,15v35h170V15C170,6.716,163.284,0,155,0z'/%3e%3cpath%20fill='%2377ca98'%20d='M504.464,142.989c-4.662-2.674-10.397-2.651-15.036,0.063L341,229.852V156c0-5.374-2.875-10.337-7.536-13.011%20c-4.662-2.674-10.397-2.651-15.036,0.063L170,229.852V80H0v417c0,8.284,6.716,15,15,15h482c8.284,0,15-6.716,15-15V156%20C512,150.626,509.125,145.663,504.464,142.989z%20M230,406.5c0,8.284-6.716,15-15,15h-60c-8.284,0-15-6.716-15-15v-60%20c0-8.284,6.716-15,15-15h60c8.284,0,15,6.716,15,15V406.5z%20M401,406.5c0,8.284-6.716,15-15,15h-60c-8.284,0-15-6.716-15-15v-60%20c0-8.284,6.716-15,15-15h60c8.284,0,15,6.716,15,15V406.5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20x='0px'%20y='0px'%20width='47.825px'%20height='47.825px'%20viewBox='0%200%2047.825%2047.825'%3e%3cpath%20fill='%23bebc71'%20d='M36.439,12.646c0-6.919-5.608-12.527-12.528-12.527S11.384,5.727,11.384,12.646c0,9.913,12.527,24.582,12.527,24.582%20S36.439,22.508,36.439,12.646z%20M17.733,11.898c0-3.413,2.767-6.179,6.179-6.179s6.179,2.766,6.179,6.179%20c0,3.413-2.767,6.179-6.179,6.179S17.733,15.311,17.733,11.898z'/%3e%3ccircle%20fill='%23bebc71'%20cx='23.911'%20cy='11.898'%20r='3.038'/%3e%3cpath%20fill='%23bebc71'%20d='M30.994,32.87c-1.021,1.476-1.979,2.761-2.777,3.793c7.916,0.476,13.104,2.185,15.034,3.456%20c-2.261,1.491-8.979,3.587-19.338,3.587c-10.358,0-17.077-2.097-19.338-3.587c1.93-1.271,7.114-2.979,15.022-3.455%20c-0.8-1.032-1.759-2.316-2.781-3.792C7.075,33.831,0,36.713,0,40.118c0,4.19,10.707,7.588,23.913,7.588%20c13.207,0,23.912-3.396,23.912-7.588C47.827,36.711,40.744,33.828,30.994,32.87z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20x='0px'%20y='0px'%20width='97.473px'%20height='97.473px'%20viewBox='0%200%2097.473%2097.473'%3e%3crect%20fill='%23b4b1fb'%20x='41.569'%20y='47.753'%20width='14.333'%20height='14.333'/%3e%3crect%20fill='%23b4b1fb'%20x='41.569'%20y='67.754'%20width='14.333'%20height='14.332'/%3e%3crect%20fill='%23b4b1fb'%20x='18.569'%20y='67.754'%20width='14.333'%20height='14.332'/%3e%3crect%20fill='%23b4b1fb'%20x='18.569'%20y='47.753'%20width='14.333'%20height='14.333'/%3e%3cpath%20fill='%23b4b1fb'%20d='M95.472,14.466H84.427V2.701c0-1.104-0.896-2-2-2H65.811c-1.104,0-2,0.896-2,2v11.765H33.662V2.701c0-1.104-0.896-2-2-2%20H15.045c-1.104,0-2,0.896-2,2v11.765H2c-1.104,0-2,0.896-2,2v78.305c0,1.104,0.896,2,2,2h93.473c1.104,0,2-0.896,2-2V16.466%20C97.472,15.362,96.576,14.466,95.472,14.466z%20M69.645,8.037c0-0.828,0.672-1.5,1.5-1.5h5.947c0.829,0,1.5,0.672,1.5,1.5v20.34%20c0,0.828-0.671,1.5-1.5,1.5h-5.947c-0.828,0-1.5-0.672-1.5-1.5V8.037z%20M18.88,8.037c0-0.828,0.671-1.5,1.5-1.5h5.947%20c0.829,0,1.5,0.672,1.5,1.5v20.34c0,0.828-0.671,1.5-1.5,1.5H20.38c-0.829,0-1.5-0.672-1.5-1.5V8.037z%20M87.068,84.902%20c0,0.828-0.67,1.5-1.5,1.5H11.903c-0.829,0-1.5-0.672-1.5-1.5v-40c0-0.828,0.671-1.5,1.5-1.5h73.666c0.83,0,1.5,0.672,1.5,1.5%20V84.902z'/%3e%3crect%20fill='%23b4b1fb'%20x='64.568'%20y='47.753'%20width='14.334'%20height='14.333'/%3e%3crect%20fill='%23b4b1fb'%20x='64.568'%20y='67.754'%20width='14.334'%20height='14.332'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20x='0px'%20y='0px'%20width='50px'%20height='50px'%20viewBox='0%200%2050%2050'%3e%3cpath%20fill='%2353ccb2'%20d='M26.12,14.488c0.879-1.468,2.27-3.569,4.027-5.585h0.002c1.488-1.711,4.402-3.907,4.402-3.907%20c0.438-0.331,0.391-0.792-0.107-1.024l-3.522-1.646c-0.498-0.233-1.175-0.063-1.505,0.376c0,0-2.605,3.737-5.671,11.692%20c-9.48-4.288-18.491,1.718-18.491,12.162c0,10.909,8.393,27.48,19.743,22.478c11.954,5.173,19.749-11.568,19.749-22.478%20C44.747,16.022,36.647,9.846,26.12,14.488z'/%3e%3cpath%20fill='%2353ccb2'%20d='M23.997,10.955c0.548-0.046,1.032-0.531,1.076-1.078c0,0,0.352-4.266-2.621-7.242c-2.982-2.977-7.24-2.622-7.24-2.622%20c-0.548,0.046-1.032,0.531-1.077,1.078c0,0-0.358,4.268,2.619,7.245C19.729,11.31,23.997,10.955,23.997,10.955z'/%3e%3c/svg%3e\"","import { TypeStyleResolver } from \"./props\";\n\nimport classIcon from \"../../../images/icons/class.svg\";\nimport objectPropertyIcon from \"../../../images/icons/objectProperty.svg\";\nimport datatypePropertyIcon from \"../../../images/icons/datatypeProperty.svg\";\nimport personIcon from \"../../../images/icons/person.svg\";\nimport countryIcon from \"../../../images/icons/country.svg\";\nimport organizationIcon from \"../../../images/icons/organization.svg\";\nimport locationIcon from \"../../../images/icons/location.svg\";\nimport eventIcon from \"../../../images/icons/event.svg\";\nimport objectIcon from \"../../../images/icons/object.svg\";\n\nexport const DefaultTypeStyleBundle: TypeStyleResolver = (types) => {\n  if (\n    types.indexOf(\"http://www.w3.org/2002/07/owl#Class\") !== -1 ||\n    types.indexOf(\"http://www.w3.org/2000/01/rdf-schema#Class\") !== -1\n  ) {\n    return { color: \"#eaac77\", icon: classIcon };\n  } else if (\n    types.indexOf(\"http://www.w3.org/2002/07/owl#ObjectProperty\") !== -1\n  ) {\n    return { color: \"#34c7f3\", icon: objectPropertyIcon };\n  } else if (\n    types.indexOf(\"http://www.w3.org/2002/07/owl#DatatypeProperty\") !== -1\n  ) {\n    return { color: \"#34c7f3\", icon: datatypePropertyIcon };\n  } else if (\n    types.indexOf(\"http://xmlns.com/foaf/0.1/Person\") !== -1 ||\n    types.indexOf(\"http://www.wikidata.org/entity/Q5\") !== -1\n  ) {\n    return { color: \"#eb7777\", icon: personIcon };\n  } else if (types.indexOf(\"http://www.wikidata.org/entity/Q6256\") !== -1) {\n    return { color: \"#77ca98\", icon: countryIcon };\n  } else if (\n    types.indexOf(\"http://schema.org/Organization\") !== -1 ||\n    types.indexOf(\"http://dbpedia.org/ontology/Organisation\") !== -1 ||\n    types.indexOf(\"http://xmlns.com/foaf/0.1/Organization\") !== -1 ||\n    types.indexOf(\"http://www.wikidata.org/entity/Q43229\") !== -1\n  ) {\n    return { color: \"#77ca98\", icon: organizationIcon };\n  } else if (types.indexOf(\"http://www.wikidata.org/entity/Q618123\") !== -1) {\n    return { color: \"#bebc71\", icon: locationIcon };\n  } else if (types.indexOf(\"http://www.wikidata.org/entity/Q1190554\") !== -1) {\n    return { color: \"#b4b1fb\", icon: eventIcon };\n  } else if (types.indexOf(\"http://www.wikidata.org/entity/Q488383\") !== -1) {\n    return { color: \"#53ccb2\", icon: objectIcon };\n  } else {\n    return undefined;\n  }\n};\n","import { LinkTemplate, LinkTemplateResolver } from \"./props\";\nimport { PLACEHOLDER_LINK_TYPE } from \"../data/schema\";\n\nexport const LINK_SHOW_IRI: LinkTemplate = {\n  renderLink: (link) => ({\n    properties: [\n      {\n        position: 0.5,\n        attrs: {\n          text: {\n            text: [\n              {\n                value: link.typeId,\n                language: \"\",\n              },\n            ],\n            fill: \"gray\",\n            \"font-size\": 12,\n            \"font-weight\": \"lighter\",\n          },\n        },\n      },\n    ],\n  }),\n};\n\nconst LINK_SUB_CLASS_OF: LinkTemplate = {\n  markerTarget: {\n    fill: \"#f8a485\",\n    stroke: \"#cf8e76\",\n  },\n  renderLink: () => ({\n    connection: {\n      stroke: \"#f8a485\",\n      \"stroke-width\": 2,\n    },\n  }),\n};\n\nconst LINK_DOMAIN: LinkTemplate = {\n  markerTarget: {\n    fill: \"#34c7f3\",\n    stroke: \"#38b5db\",\n  },\n  renderLink: () => ({\n    connection: {\n      stroke: \"#34c7f3\",\n      \"stroke-width\": 2,\n    },\n  }),\n};\n\nconst LINK_RANGE: LinkTemplate = {\n  markerTarget: {\n    fill: \"#34c7f3\",\n    stroke: \"#38b5db\",\n  },\n  renderLink: () => ({\n    connection: {\n      stroke: \"#34c7f3\",\n      \"stroke-width\": 2,\n    },\n  }),\n};\n\nconst LINK_TYPE_OF: LinkTemplate = {\n  markerTarget: {\n    fill: \"#8cd965\",\n    stroke: \"#5b9a3b\",\n  },\n  renderLink: () => ({\n    connection: {\n      stroke: \"#8cd965\",\n      \"stroke-width\": 2,\n    },\n  }),\n};\n\nexport const DefaultLinkTemplateBundle: LinkTemplateResolver = (type) => {\n  if (type === \"http://www.w3.org/2000/01/rdf-schema#subClassOf\") {\n    return LINK_SUB_CLASS_OF;\n  } else if (type === \"http://www.w3.org/2000/01/rdf-schema#domain\") {\n    return LINK_DOMAIN;\n  } else if (type === \"http://www.w3.org/2000/01/rdf-schema#range\") {\n    return LINK_RANGE;\n  } else if (type === \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\") {\n    return LINK_TYPE_OF;\n  } else if (type === PLACEHOLDER_LINK_TYPE) {\n    return { markerTarget: { fill: \"none\" } };\n  } else {\n    return undefined;\n  }\n};\n","export type RdfNode = RdfIri | RdfLiteral | RdfBlank;\n\nexport interface RdfIri {\n  type: \"uri\";\n  value: string;\n}\n\nexport interface RdfBlank {\n  type: \"bnode\";\n  value: string;\n}\n\nexport interface RdfLiteral {\n  type: \"literal\";\n  value: string;\n  datatype?: string;\n  \"xml:lang\": string;\n}\n\nexport interface Triple {\n  subject: RdfNode;\n  predicate: RdfNode;\n  object: RdfNode;\n}\n\nexport function isRdfBlank(e: RdfNode): e is RdfBlank {\n  return e && e.type === \"bnode\";\n}\n\nexport function isRdfIri(e: RdfNode): e is RdfIri {\n  return e && e.type === \"uri\";\n}\n\nexport function isRdfLiteral(e: RdfNode): e is RdfLiteral {\n  return e && e.type === \"literal\";\n}\n\nexport interface BlankBinding extends ElementBinding {\n  blankType: {\n    value: \"listHead\" | \"blankNode\";\n  };\n  blankTrgProp: RdfNode;\n  blankTrg: RdfNode;\n  blankSrc?: RdfNode;\n  blankSrcProp?: RdfNode;\n  newInst?: RdfIri | RdfBlank;\n}\n\nexport function isBlankBinding(\n  binding: ElementBinding | BlankBinding\n): binding is BlankBinding {\n  const blank = binding as BlankBinding;\n  return (\n    blank.blankTrgProp !== undefined ||\n    blank.blankTrg !== undefined ||\n    blank.blankSrcProp !== undefined ||\n    blank.blankSrc !== undefined\n  );\n}\n\nexport interface ElementBinding {\n  inst: RdfIri | RdfBlank;\n  class?: RdfIri;\n  label?: RdfLiteral;\n  propType?: RdfIri;\n  propValue?: RdfIri | RdfLiteral;\n}\n\nexport interface ClassBinding {\n  class: RdfIri;\n  instcount?: RdfLiteral;\n  label?: RdfLiteral;\n  parent?: RdfIri;\n}\n\nexport interface PropertyBinding {\n  property: RdfIri;\n  label?: RdfLiteral;\n}\n\nexport interface LinkBinding {\n  source: RdfIri | RdfBlank;\n  type: RdfIri;\n  target: RdfIri | RdfBlank;\n  propType?: RdfIri;\n  propValue?: RdfLiteral;\n}\n\nexport interface LinkCountBinding {\n  link: RdfIri | RdfBlank;\n  inCount: RdfLiteral;\n  outCount: RdfLiteral;\n}\n\nexport interface LinkTypeBinding {\n  link: RdfIri;\n  label?: RdfLiteral;\n  instcount?: RdfLiteral;\n}\n\nexport interface ElementImageBinding {\n  inst: RdfIri;\n  linkType: RdfIri;\n  image: RdfIri;\n}\n\nexport interface ElementTypeBinding {\n  inst: RdfIri;\n  class: RdfIri;\n}\n\nexport interface FilterBinding {\n  classAll?: RdfIri;\n  link?: RdfIri;\n  direction?: RdfLiteral;\n}\n\nexport interface SparqlResponse<Binding> {\n  head: { vars: string[] };\n  results: { bindings: Binding[] };\n}\n","import { Dictionary } from \"../model\";\nimport { FilterParams } from \"../provider\";\nimport { getUriLocalName } from \"../utils\";\n\nimport { SparqlDataProviderSettings } from \"./sparqlDataProviderSettings\";\nimport {\n  ElementBinding,\n  LinkBinding,\n  BlankBinding,\n  FilterBinding,\n  LinkCountBinding,\n  ElementTypeBinding,\n  SparqlResponse,\n  RdfLiteral,\n  isRdfIri,\n  isRdfBlank,\n  isBlankBinding,\n} from \"./sparqlModels\";\n\nexport const MAX_RECURSION_DEEP = 3;\n\nexport const ENCODED_PREFIX = \"sparql-blank:\";\n\nexport const BLANK_NODE_QUERY_PARAMETERS =\n  \"?blankTrgProp ?blankTrg ?blankSrc ?blankSrcProp ?listHead\";\n\nexport const BLANK_NODE_QUERY = `\n    OPTIONAL {\n        FILTER (ISBLANK(?inst)).\n        {\n            ?inst ?blankTrgProp ?blankTrg.\n            ?blankSrc ?blankSrcProp ?inst.\n            FILTER NOT EXISTS { ?inst rdf:first _:smth1 }.\n            BIND(\"blankNode\" as ?blankType)\n        } UNION {\n            ?inst rdf:rest*/rdf:first ?blankTrg.\n            ?blankSrc ?blankSrcProp ?inst.\n            _:smth2 rdf:first ?blankTrg.\n            BIND(?blankSrcProp as ?blankTrgProp)\n            BIND(\"listHead\" as ?blankType)\n            FILTER NOT EXISTS { _:smth3 rdf:rest ?inst }.\n        } UNION {\n            ?listHead rdf:rest* ?inst.\n            FILTER NOT EXISTS { _:smth4 rdf:rest ?listHead }.\n\n            ?listHead rdf:rest*/rdf:first ?blankTrg.\n            ?blankSrc ?blankSrcProp ?listHead.\n            _:smth5 rdf:first ?blankTrg.\n            BIND(?blankSrcProp as ?blankTrgProp)\n            BIND(\"listHead\" as ?blankType)\n        }\n    }\n`;\n\nexport function isEncodedBlank(id: string): boolean {\n  return id.startsWith(ENCODED_PREFIX);\n}\n\nexport class QueryExecutor {\n  queryDictionary: Dictionary<Promise<SparqlResponse<BlankBinding>>> = {};\n  constructor(\n    public queryFunction: (\n      query: string\n    ) => Promise<SparqlResponse<BlankBinding>>\n  ) {}\n\n  executeQuery(query: string): Promise<SparqlResponse<BlankBinding>> {\n    const execution = this.queryDictionary[query];\n    if (execution) {\n      return execution;\n    } else {\n      this.queryDictionary[query] = this.queryFunction(query).then(\n        (response) => {\n          // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n          delete this.queryDictionary[query];\n          return response;\n        }\n      );\n      return this.queryDictionary[query];\n    }\n  }\n}\n\nexport function updateFilterResults(\n  result: SparqlResponse<ElementBinding & FilterBinding>,\n  queryFunction: (query: string) => Promise<SparqlResponse<BlankBinding>>,\n  settings: SparqlDataProviderSettings\n): Promise<SparqlResponse<ElementBinding & FilterBinding>> {\n  const completeBindings: (ElementBinding & FilterBinding)[] = [];\n  const blankBindings: (BlankBinding & FilterBinding)[] = [];\n\n  for (const binding of result.results.bindings) {\n    if (isBlankBinding(binding)) {\n      blankBindings.push(binding);\n    } else {\n      completeBindings.push(binding);\n    }\n  }\n  return processBlankBindings(\n    blankBindings,\n    (callBackQuery: string) => {\n      return queryFunction(callBackQuery);\n    },\n    settings\n  ).then((processedBindings) => {\n    result.results.bindings = completeBindings.concat(processedBindings);\n    return result;\n  });\n}\n\nexport function processBlankBindings(\n  blankBindings: BlankBinding[],\n  queryFunction: (query: string) => Promise<SparqlResponse<BlankBinding>>,\n  settings: SparqlDataProviderSettings\n): Promise<BlankBinding[]> {\n  const bindingGroupsById: Dictionary<BlankBinding[]> = {};\n  for (const binding of blankBindings) {\n    if (binding.newInst) {\n      binding.inst = binding.newInst;\n    }\n    if (!bindingGroupsById[binding.inst.value]) {\n      bindingGroupsById[binding.inst.value] = [];\n    }\n    bindingGroupsById[binding.inst.value].push(binding);\n  }\n\n  const relatedBlankBindnings: BlankBinding[][] = [];\n  for (const b of blankBindings) {\n    if (isRdfBlank(b.blankTrg)) {\n      relatedBlankBindnings.push([b]);\n    }\n  }\n\n  const queryExecutor = new QueryExecutor(queryFunction);\n\n  return loadRelatedBlankNodes(\n    relatedBlankBindnings,\n    queryExecutor,\n    settings\n  ).then((loadedGroupsById) => {\n    const idsMap = getEncodedIdDictionary(loadedGroupsById);\n    const groups = Object.keys(bindingGroupsById).map(\n      (key) => bindingGroupsById[key]\n    );\n\n    for (const group of groups) {\n      for (const blankBinding of group) {\n        if (!blankBinding.label) {\n          blankBinding.label = createLabelForBlankBinding(blankBinding);\n        }\n        const encodedId4LoadedElement = idsMap[blankBinding.blankTrg.value];\n        if (encodedId4LoadedElement) {\n          blankBinding.blankTrg.value = encodedId4LoadedElement;\n        }\n      }\n      const encodedId = encodeId(group);\n      updateGroupIds(group, encodedId);\n    }\n\n    return blankBindings;\n  });\n}\n\nfunction getEncodedIdDictionary(\n  blankBindingGroups: Dictionary<BlankBinding[]>\n): Dictionary<string> {\n  const idDictionary: Dictionary<string> = {};\n  const keys = Object.keys(blankBindingGroups);\n  for (const key of keys) {\n    idDictionary[key] = encodeId(blankBindingGroups[key]);\n    updateGroupIds(blankBindingGroups[key], idDictionary[key]);\n  }\n  return idDictionary;\n}\n\nfunction updateGroupIds(group: BlankBinding[], newId: string) {\n  for (const loadedBlankBinding of group) {\n    loadedBlankBinding.inst.value = newId;\n  }\n}\n\nexport function encodeId(blankBindings: BlankBinding[]): string {\n  const bindingSet: Dictionary<BlankBinding> = {};\n  for (const binding of blankBindings) {\n    // leave out instance unique ID\n    const { inst: _inst, ...exceptInst } = binding;\n    const encodedBinding = JSON.stringify(exceptInst);\n    bindingSet[encodedBinding] = exceptInst as BlankBinding;\n  }\n\n  const normalizedBindings = Object.keys(bindingSet)\n    .sort()\n    .map((key) => bindingSet[key]);\n  return ENCODED_PREFIX + encodeURI(JSON.stringify(normalizedBindings));\n}\n\nexport function decodeId(id: string): BlankBinding[] {\n  if (!isEncodedBlank(id)) {\n    return undefined;\n  }\n  try {\n    const clearId = id.substring(ENCODED_PREFIX.length, id.length);\n    const parsedBindings: BlankBinding[] = JSON.parse(decodeURI(clearId));\n    const bindings = parsedBindings.map((binding) => {\n      // restore instance unique ID\n      binding.inst = { type: \"uri\", value: id };\n      return binding;\n    });\n    return bindings;\n  } catch (_error) {\n    /* silent */\n    return undefined;\n  }\n}\n\nexport function createLabelForBlankBinding(bn: BlankBinding): RdfLiteral {\n  if (bn.blankType.value === \"listHead\") {\n    return {\n      type: \"literal\",\n      value: \"RDFList\",\n      \"xml:lang\": \"\",\n    };\n  } else {\n    return {\n      type: \"literal\",\n      value: bn.class\n        ? getUriLocalName(bn.class.value) || bn.class.value\n        : \"anonymous\",\n      \"xml:lang\": \"\",\n    };\n  }\n}\n\nfunction loadRelatedBlankNodes(\n  blankChains: BlankBinding[][],\n  queryExecutor: QueryExecutor,\n  settings: SparqlDataProviderSettings,\n  recursionDeep?: number\n): Promise<Dictionary<BlankBinding[]>> {\n  recursionDeep = recursionDeep || 1;\n\n  if (recursionDeep > MAX_RECURSION_DEEP) {\n    return Promise.resolve({});\n  }\n\n  const queryPairs = blankChains.map((chain) => ({\n    query: getQueryForChain(chain, settings),\n    chain: chain,\n  }));\n\n  const promises = queryPairs.map((pair) =>\n    queryExecutor.executeQuery(pair.query).then((response) => ({\n      response: response,\n      chain: pair.chain,\n    }))\n  );\n\n  return Promise.all(promises).then((results) => {\n    const recursionPromises: Promise<boolean>[] = [];\n\n    const loadedBlankBindings: Dictionary<BlankBinding[]> = {};\n    for (const result of results) {\n      const bindings = result.response.results.bindings;\n      if (bindings.length > 0) {\n        const relatedBlankBindings: BlankBinding[][] = [];\n\n        for (const binding of bindings) {\n          if (isRdfBlank(binding.blankTrg)) {\n            relatedBlankBindings.push(result.chain.concat([binding]));\n          }\n        }\n\n        recursionPromises.push(\n          loadRelatedBlankNodes(\n            relatedBlankBindings,\n            queryExecutor,\n            settings,\n            recursionDeep + 1\n          ).then((loadedGroupsById) => {\n            const idsMap = getEncodedIdDictionary(loadedGroupsById);\n            const mergedResults: Dictionary<BlankBinding[]> = {};\n\n            for (const binding of bindings) {\n              binding.label = createLabelForBlankBinding(binding);\n\n              const encodedId = idsMap[binding.blankTrg.value];\n\n              if (encodedId) {\n                binding.blankTrg.value = encodedId;\n              }\n\n              if (!mergedResults[binding.inst.value]) {\n                mergedResults[binding.inst.value] = [];\n              }\n\n              mergedResults[binding.inst.value].push(binding);\n            }\n\n            Object.keys(mergedResults).forEach((key) => {\n              const group = mergedResults[key];\n              const originalId = group[0].inst.value;\n              loadedBlankBindings[originalId] = group;\n            });\n\n            return true;\n          })\n        );\n      }\n    }\n    return Promise.all(recursionPromises).then(() => {\n      return loadedBlankBindings;\n    });\n  });\n}\n\nfunction getQueryForChain(\n  blankNodes: BlankBinding[],\n  sparqlDataProviderSettings: SparqlDataProviderSettings\n): string {\n  function getQueryBlock(\n    blankNode: BlankBinding,\n    index: number,\n    maxIndex: number\n  ) {\n    // if blankNode has type 'listHead' then his target and targetProperty is artificial,\n    // and we can't include this id in chain\n    const trustableTrgProp =\n      index === 0 || blankNode.blankType.value !== \"listHead\";\n\n    const sourceId =\n      index > 0 ? \"?inst\" + (index - 1) : \"<\" + blankNode.blankSrc.value + \">\";\n    const sourcePropId = trustableTrgProp\n      ? index > 0\n        ? \"?blankTrgProp\" + (index - 1)\n        : \"<\" + blankNode.blankSrcProp.value + \">\"\n      : \"?anyType\" + index;\n\n    const instPostfix = index === maxIndex ? \"\" : index.toString();\n\n    const targetPropId = trustableTrgProp\n      ? \"<\" + blankNode.blankTrgProp.value + \">\"\n      : \"?anyType0\" + index;\n\n    const firstRelation =\n      index === 0 && blankNode.blankType.value === \"listHead\"\n        ? `\n            ?blankSrc${index} rdf:rest*/rdf:first ?inst${instPostfix}.\n            `\n        : `?blankSrc${index} ${targetPropId} ?inst${instPostfix}.`;\n\n    return `\n        # ======================\n        ${sourceId} ${sourcePropId} ?blankSrc${index}.\n        ${firstRelation}\n        BIND (<${blankNode.blankTrgProp.value}> as ?blankSrcProp${index}).\n        FILTER (ISBLANK(?inst${instPostfix})).\n        {\n            ?inst${instPostfix} ?blankTrgProp${instPostfix} ?blankTrg${instPostfix}.\n            BIND(\"blankNode\" as ?blankType${instPostfix}).\n            FILTER NOT EXISTS { ?inst${instPostfix} rdf:first _:smth1${index} }.\n        } UNION {\n            ?inst${instPostfix} rdf:rest*/rdf:first ?blankTrg${instPostfix}.\n            ?blankSrc${index} ?blankSrcProp${index} ?inst${instPostfix}.\n            _:smth2${index} rdf:first ?blankTrg${instPostfix}.\n            BIND(?blankSrcProp${index} as ?blankTrgProp${instPostfix})\n            BIND(\"listHead\" as ?blankType${instPostfix})\n            FILTER NOT EXISTS { _:smth3${index} rdf:rest ?inst${instPostfix} }.\n        }\n        OPTIONAL {\n            ?inst${instPostfix} rdf:type ?class${instPostfix}.\n        }\n    `;\n  }\n\n  const body = blankNodes\n    .map((bn, index) => getQueryBlock(bn, index, blankNodes.length - 1))\n    .join(\"\\n\");\n  const query = `${sparqlDataProviderSettings.defaultPrefix}\n    SELECT ?inst ?class ?label ?blankTrgProp ?blankTrg ?blankType\n        WHERE {\n           ${body}\n        }\n    `;\n  return query;\n}\n\nexport function elementInfo(\n  elementIds: string[]\n): SparqlResponse<ElementBinding> {\n  const ids = elementIds.filter((id) => isEncodedBlank(id));\n\n  return {\n    head: undefined,\n    results: { bindings: getElementBindings(ids) },\n  };\n}\n\nexport function linksInfo(elementIds: string[]): SparqlResponse<LinkBinding> {\n  return {\n    head: undefined,\n    results: { bindings: getLinkBinding(elementIds) },\n  };\n}\n\nexport function linkTypesOf(params: {\n  elementId: string;\n}): SparqlResponse<LinkCountBinding> {\n  return {\n    head: undefined,\n    results: { bindings: getLinkCountBinding(params.elementId) },\n  };\n}\n\nexport function filter(params: FilterParams): SparqlResponse<ElementBinding> {\n  const filterResponse: SparqlResponse<ElementBinding> = {\n    head: undefined,\n    results: { bindings: [] },\n  };\n  if (params.limit === 0) {\n    params.limit = 100;\n  }\n\n  if (params.elementTypeId) {\n    filterResponse.results.bindings = [];\n  } else if (params.refElementId && params.refElementLinkId) {\n    filterResponse.results.bindings = getAllRelatedByLinkTypeElements(\n      params.refElementId,\n      params.refElementLinkId,\n      params.linkDirection\n    );\n  } else if (params.refElementId) {\n    filterResponse.results.bindings = getAllRelatedElements(\n      params.refElementId\n    );\n  }\n\n  if (params.text && filterResponse.results.bindings.length !== 0) {\n    filterResponse.results.bindings = filterResponse.results.bindings.filter(\n      (be) => be.inst.value.toLowerCase().indexOf(params.text) !== -1\n    );\n  }\n\n  return filterResponse;\n}\n\nexport function getElementTypes(\n  elementIds: readonly string[]\n): SparqlResponse<ElementTypeBinding> {\n  const bindings: ElementTypeBinding[] = [];\n  for (const id of elementIds) {\n    const blankBindings = decodeId(id);\n    if (blankBindings) {\n      for (const be of blankBindings) {\n        if (isRdfIri(be.inst) && be.class) {\n          bindings.push({ inst: be.inst, class: be.class });\n        }\n      }\n    }\n  }\n  return { head: undefined, results: { bindings } };\n}\n\nfunction getAllRelatedByLinkTypeElements(\n  refElementId: string,\n  refElementLinkId: string,\n  linkDirection: string\n): ElementBinding[] {\n  const blankElements = (decodeId(refElementId) || []).concat(\n    decodeId(refElementLinkId) || []\n  );\n  let bindings: ElementBinding[] = [];\n  if (blankElements.length > 0) {\n    for (const be of blankElements) {\n      if (linkDirection === \"in\") {\n        if (\n          be.inst.value === refElementId &&\n          (isRdfIri(be.blankSrc) || isRdfBlank(be.blankSrc)) &&\n          refElementLinkId === be.blankSrcProp.value\n        ) {\n          if (isRdfIri(be.blankSrc)) {\n            bindings.push({\n              inst: be.blankSrc,\n            });\n          } else {\n            bindings = bindings.concat(\n              decodeId(be.blankSrc.value) || [{ inst: be.blankSrc }]\n            );\n          }\n        } else if (\n          be.blankTrg.value === refElementId &&\n          refElementLinkId === be.blankTrgProp.value\n        ) {\n          bindings.push(be);\n        }\n      } else {\n        if (\n          be.inst.value === refElementId &&\n          (isRdfIri(be.blankTrg) || isRdfBlank(be.blankTrg)) &&\n          refElementLinkId === be.blankTrgProp.value\n        ) {\n          if (isRdfIri(be.blankTrg)) {\n            bindings.push({\n              inst: be.blankTrg,\n            });\n          } else {\n            bindings = bindings.concat(\n              decodeId(be.blankTrg.value) || [{ inst: be.blankTrg }]\n            );\n          }\n        } else if (\n          be.blankSrc.value === refElementId &&\n          refElementLinkId === be.blankSrcProp.value\n        ) {\n          bindings.push(be);\n        }\n      }\n    }\n  }\n  return bindings;\n}\n\nfunction getAllRelatedElements(id: string): ElementBinding[] {\n  const blankElements = decodeId(id);\n  let bindings: ElementBinding[] = [];\n  if (blankElements) {\n    for (const be of blankElements) {\n      if (\n        be.inst.value === id ||\n        id === be.blankSrc.value ||\n        id === be.blankTrg.value\n      ) {\n        bindings.push(be);\n        if (isRdfIri(be.blankSrc)) {\n          bindings.push({ inst: be.blankSrc });\n        } else if (isRdfBlank(be.blankSrc)) {\n          bindings = bindings.concat(\n            decodeId(be.blankSrc.value) || [{ inst: be.blankSrc }]\n          );\n        }\n        if (isRdfIri(be.blankTrg)) {\n          bindings.push({ inst: be.blankTrg });\n        } else if (isRdfBlank(be.blankTrg)) {\n          bindings = bindings.concat(\n            decodeId(be.blankTrg.value) || [{ inst: be.blankTrg }]\n          );\n        }\n      }\n    }\n  }\n  return bindings;\n}\n\nfunction getElementBindings(ids: string[]): ElementBinding[] {\n  let blankElements: BlankBinding[] = [];\n  for (const id of ids) {\n    const blankBindings = decodeId(id);\n    if (blankBindings) {\n      blankElements = blankElements.concat(decodeId(id));\n    }\n  }\n  return blankElements.filter((be) => {\n    return ids.indexOf(be.inst.value) !== -1;\n  });\n}\n\nfunction getLinkBinding(ids: string[]): LinkBinding[] {\n  let blankElements: BlankBinding[] = [];\n  for (const id of ids) {\n    const blankBindings = decodeId(id);\n    if (blankBindings) {\n      blankElements = blankElements.concat(decodeId(id));\n    }\n  }\n\n  const bindings: LinkBinding[] = [];\n  for (const be of blankElements) {\n    if (ids.indexOf(be.inst.value) !== -1) {\n      if (\n        (isRdfIri(be.blankSrc) || isRdfBlank(be.blankSrc)) &&\n        isRdfIri(be.blankSrcProp) &&\n        ids.indexOf(be.blankSrc.value) !== -1\n      ) {\n        bindings.push({\n          source: be.blankSrc,\n          type: be.blankSrcProp,\n          target: be.inst,\n        });\n      }\n      if (\n        (isRdfIri(be.blankTrg) || isRdfBlank(be.blankTrg)) &&\n        isRdfIri(be.blankTrgProp) &&\n        ids.indexOf(be.blankTrg.value) !== -1\n      ) {\n        bindings.push({\n          source: be.inst,\n          type: be.blankTrgProp,\n          target: be.blankTrg,\n        });\n      }\n    }\n  }\n  return bindings;\n}\n\nfunction getLinkCountBinding(id: string): LinkCountBinding[] {\n  const blankElements = decodeId(id);\n\n  const dictionary: Dictionary<LinkCountBinding> = {};\n\n  for (const be of blankElements) {\n    if (id === be.inst.value) {\n      if (\n        (isRdfIri(be.blankTrg) || isRdfBlank(be.blankTrg)) &&\n        isRdfIri(be.blankTrgProp)\n      ) {\n        if (\n          (isRdfIri(be.blankSrc) || isRdfBlank(be.blankSrc)) &&\n          isRdfIri(be.blankSrcProp)\n        ) {\n          if (!dictionary[be.blankSrcProp.value]) {\n            dictionary[be.blankSrcProp.value] = {\n              link: be.blankSrcProp,\n              inCount: {\n                type: \"literal\",\n                value: \"1\",\n                \"xml:lang\": \"\",\n              },\n              outCount: {\n                type: \"literal\",\n                value: \"0\",\n                \"xml:lang\": \"\",\n              },\n            };\n          }\n        }\n        if (!dictionary[be.blankTrgProp.value]) {\n          dictionary[be.blankTrgProp.value] = {\n            link: be.blankTrgProp,\n            inCount: {\n              type: \"literal\",\n              value: \"0\",\n              \"xml:lang\": \"\",\n            },\n            outCount: {\n              type: \"literal\",\n              value: \"1\",\n              \"xml:lang\": \"\",\n            },\n          };\n        } else {\n          dictionary[be.blankTrgProp.value].outCount.value = (\n            +dictionary[be.blankTrgProp.value].outCount.value + 1\n          ).toString();\n        }\n      }\n    }\n  }\n  return Object.keys(dictionary).map((k) => dictionary[k]);\n}\n","import { LinkRouter, RoutedLinks, Vertex } from \"../customization/props\";\nimport { DiagramModel } from \"./model\";\nimport { Link as DiagramLink, Element as DiagramElement } from \"./elements\";\nimport { Vector } from \"./geometry\";\n\nexport class DefaultLinkRouter implements LinkRouter {\n  constructor(private gap = 20) {}\n\n  route(model: DiagramModel): RoutedLinks {\n    const routings: RoutedLinks = new Map();\n\n    for (const link of model.links) {\n      if (routings.has(link.id)) {\n        continue;\n      }\n      // The cell is a link. Let's find its source and target models.\n      const { sourceId, targetId } = link;\n      if (!sourceId || !targetId) {\n        continue;\n      } else if (sourceId === targetId) {\n        this.routeFeedbackSiblingLinks(model, sourceId, routings);\n      } else {\n        this.routeNormalSiblingLinks(model, sourceId, targetId, routings);\n      }\n    }\n\n    return routings;\n  }\n\n  private routeFeedbackSiblingLinks(\n    model: DiagramModel,\n    elementId: string,\n    routings: RoutedLinks\n  ) {\n    const element = model.getElement(elementId);\n    const { x, y } = element.position;\n    const { width, height } = element.size;\n\n    let index = 0;\n    for (const sibling of element.links) {\n      if (routings.has(sibling.id) || hasUserPlacedVertices(sibling)) {\n        continue;\n      }\n      const { sourceId, targetId } = sibling;\n      if (sourceId === targetId) {\n        const offset = this.gap * (index + 1);\n        const vertices: Vertex[] = [\n          { x: x - offset, y: y + height / 2 },\n          { x: x - offset, y: y - offset },\n          { x: x + width / 2, y: y - offset },\n        ];\n        routings.set(sibling.id, { linkId: sibling.id, vertices });\n        index++;\n      }\n    }\n  }\n\n  private routeNormalSiblingLinks(\n    model: DiagramModel,\n    sourceId: string,\n    targetId: string,\n    routings: RoutedLinks\n  ) {\n    const source = model.getElement(sourceId);\n    const target = model.getElement(targetId);\n\n    const sourceCenter = centerOfElement(source);\n    const targetCenter = centerOfElement(target);\n    const midPoint = {\n      x: (sourceCenter.x + targetCenter.x) / 2,\n      y: (sourceCenter.y + targetCenter.y) / 2,\n    };\n    const direction = Vector.normalize({\n      x: targetCenter.x - sourceCenter.x,\n      y: targetCenter.y - sourceCenter.y,\n    });\n\n    const siblings = source.links.filter(\n      (link) =>\n        (link.sourceId === targetId || link.targetId === targetId) &&\n        !routings.has(link.id) &&\n        !hasUserPlacedVertices(link)\n    );\n    if (siblings.length <= 1) {\n      return;\n    }\n    const indexModifier = siblings.length % 2 ? 0 : 1;\n\n    siblings.forEach((sibling, siblingIndex) => {\n      // For mor beautifull positioning\n      const index = siblingIndex + indexModifier;\n      // We want the offset values to be calculated as follows 0, 50, 50, 100, 100, 150, 150 ..\n      const offset =\n        this.gap * Math.ceil(index / 2) - (indexModifier ? this.gap / 2 : 0);\n      // Now we need the vertices to be placed at points which are 'offset' pixels distant\n      // from the first link and forms a perpendicular angle to it. And as index goes up\n      // alternate left and right.\n      //\n      //  ^  odd indexes\n      //  |\n      //  |---->  index 0 line (straight line between a source center and a target center.\n      //  |\n      //  v  even indexes\n      const offsetDirection =\n        index % 2\n          ? { x: -direction.y, y: direction.x } // rotate by 90 degrees counter-clockwise\n          : { x: direction.y, y: -direction.x }; // rotate by 90 degrees clockwise\n      // We found the vertex.\n      const vertex = {\n        x: midPoint.x + offsetDirection.x * offset,\n        y: midPoint.y + offsetDirection.y * offset,\n      };\n      routings.set(sibling.id, {\n        linkId: sibling.id,\n        vertices: [vertex],\n        labelTextAnchor: this.getLabelAlignment(\n          direction,\n          siblingIndex,\n          siblings.length\n        ),\n      });\n    });\n  }\n\n  private getLabelAlignment(\n    connectionDirection: Vector,\n    siblingIndex: number,\n    siblingCount: number\n  ): \"start\" | \"middle\" | \"end\" {\n    // offset direction angle in [0; 2 Pi] interval\n    const angle = Math.atan2(connectionDirection.y, connectionDirection.x);\n    const absoluteAngle = Math.abs(angle);\n    const isHorizontal =\n      absoluteAngle < (Math.PI * 1) / 8 || absoluteAngle > (Math.PI * 7) / 8;\n    const isTop = angle < 0;\n    const isBottom = angle > 0;\n\n    const firstOuter = siblingCount - 2;\n    const secondOuter = siblingCount - 1;\n\n    if (!isHorizontal) {\n      if (\n        (isTop && siblingIndex === secondOuter) ||\n        (isBottom && siblingIndex === firstOuter)\n      ) {\n        return \"end\";\n      } else if (\n        (isTop && siblingIndex === firstOuter) ||\n        (isBottom && siblingIndex === secondOuter)\n      ) {\n        return \"start\";\n      }\n    }\n\n    return \"middle\";\n  }\n}\n\nfunction hasUserPlacedVertices(link: DiagramLink) {\n  const vertices = link.vertices;\n  return vertices && vertices.length > 0;\n}\n\nfunction centerOfElement(element: DiagramElement): Vector {\n  const { x, y } = element.position;\n  const { width, height } = element.size;\n  return { x: x + width / 2, y: y + height / 2 };\n}\n","import { ReactNode } from \"react\";\nimport { hcl } from \"d3-color\";\nimport { defaultsDeep, cloneDeep } from \"lodash\";\nimport { ReactElement, MouseEvent } from \"react\";\n\nimport {\n  LinkRouter,\n  TypeStyleResolver,\n  LinkTemplateResolver,\n  TemplateResolver,\n  ElementTemplate,\n  LinkTemplate,\n  RoutedLink,\n  RoutedLinks,\n} from \"../customization/props\";\nimport { DefaultTypeStyleBundle } from \"../customization/defaultTypeStyles\";\nimport { DefaultLinkTemplateBundle } from \"../customization/defaultLinkStyles\";\nimport {\n  StandardTemplate,\n  DefaultElementTemplateBundle,\n} from \"../customization/templates\";\n\nimport {\n  ElementModel,\n  LocalizedString,\n  ElementTypeIri,\n  LinkTypeIri,\n} from \"../data/model\";\nimport { isEncodedBlank } from \"../data/sparql/blankNodes\";\nimport { hashFnv32a, getUriLocalName } from \"../data/utils\";\n\nimport {\n  Events,\n  EventSource,\n  EventObserver,\n  PropertyChange,\n} from \"../viewUtils/events\";\n\nimport { Element, Link, FatLinkType } from \"./elements\";\nimport { Vector, isPolylineEqual } from \"./geometry\";\nimport { DefaultLinkRouter } from \"./linkRouter\";\nimport { DiagramModel } from \"./model\";\n\nexport enum IriClickIntent {\n  JumpToEntity = \"jumpToEntity\",\n  OpenEntityIri = \"openEntityIri\",\n  OpenOtherIri = \"openOtherIri\",\n}\nexport interface IriClickEvent {\n  iri: string;\n  element: Element;\n  clickIntent: IriClickIntent;\n  originalEvent: MouseEvent<any>;\n}\nexport type IriClickHandler = (event: IriClickEvent) => void;\n\nexport type LabelLanguageSelector = (\n  labels: readonly LocalizedString[],\n  language: string\n) => LocalizedString | undefined;\n\nexport interface ViewOptions {\n  typeStyleResolver?: TypeStyleResolver;\n  linkTemplateResolver?: LinkTemplateResolver;\n  elementTemplateResolver?: TemplateResolver;\n  selectLabelLanguage?: LabelLanguageSelector;\n  linkRouter?: LinkRouter;\n  onIriClick?: IriClickHandler;\n}\n\nexport interface TypeStyle {\n  color: { h: number; c: number; l: number };\n  icon?: string;\n}\n\nexport enum RenderingLayer {\n  Element = 1,\n  ElementSize,\n  PaperArea,\n  Link,\n  Editor,\n\n  FirstToUpdate = Element,\n  LastToUpdate = Editor,\n}\n\nexport interface DiagramViewEvents {\n  changeLanguage: PropertyChange<DiagramView, string>;\n  changeLinkTemplates: {};\n  syncUpdate: { layer: RenderingLayer };\n  updateWidgets: UpdateWidgetsEvent;\n  dispose: {};\n  changeHighlight: PropertyChange<DiagramView, Highlighter>;\n  updateRoutings: PropertyChange<DiagramView, RoutedLinks>;\n}\n\nexport interface UpdateWidgetsEvent {\n  widgets: Record<string, WidgetDescription>;\n}\n\nexport enum WidgetAttachment {\n  Viewport = 1,\n  OverElements,\n  OverLinks,\n}\n\nexport interface WidgetDescription {\n  element: ReactElement<any>;\n  attachment: WidgetAttachment;\n}\n\nexport interface DropOnPaperEvent {\n  dragEvent: DragEvent;\n  paperPosition: Vector;\n}\n\nexport type Highlighter = ((item: Element | Link) => boolean) | undefined;\n\nexport type ElementDecoratorResolver = (\n  element: Element\n) => ReactNode | undefined;\n\nexport class DiagramView {\n  private readonly listener = new EventObserver();\n  private readonly source = new EventSource<DiagramViewEvents>();\n  readonly events: Events<DiagramViewEvents> = this.source;\n\n  private disposed = false;\n\n  private readonly colorSeed = 0x0badbeef;\n\n  private readonly resolveTypeStyle: TypeStyleResolver;\n  private readonly resolveLinkTemplate: LinkTemplateResolver;\n  private readonly resolveElementTemplate: TemplateResolver;\n\n  private _language = \"en\";\n\n  private linkTemplates = new Map<LinkTypeIri, LinkTemplate>();\n  private router: LinkRouter;\n  private routings: RoutedLinks = new Map<string, RoutedLink>();\n  private dropOnPaperHandler: ((e: DropOnPaperEvent) => void) | undefined;\n\n  private _highlighter: Highlighter;\n\n  private _elementDecorator: ElementDecoratorResolver;\n\n  constructor(\n    public readonly model: DiagramModel,\n    public readonly options: ViewOptions = {}\n  ) {\n    this.resolveTypeStyle = options.typeStyleResolver || DefaultTypeStyleBundle;\n    this.resolveLinkTemplate =\n      options.linkTemplateResolver || DefaultLinkTemplateBundle;\n    this.resolveElementTemplate =\n      options.elementTemplateResolver || DefaultElementTemplateBundle;\n\n    this.initRouting();\n  }\n\n  private initRouting() {\n    this.router = this.options.linkRouter || new DefaultLinkRouter();\n    this.updateRoutings();\n\n    this.listener.listen(this.model.events, \"changeCells\", () =>\n      this.updateRoutings()\n    );\n    this.listener.listen(\n      this.model.events,\n      \"linkEvent\",\n      ({ key: _key, data }) => {\n        if (data.changeVertices) {\n          this.updateRoutings();\n        }\n      }\n    );\n    this.listener.listen(\n      this.model.events,\n      \"elementEvent\",\n      ({ key: _key, data }) => {\n        if (data.changePosition || data.changeSize) {\n          this.updateRoutings();\n        }\n      }\n    );\n  }\n\n  private updateRoutings() {\n    const previousRoutes = this.routings;\n    const computedRoutes = this.router.route(this.model);\n    previousRoutes.forEach((previous, linkId) => {\n      const computed = computedRoutes.get(linkId);\n      if (computed && sameRoutedLink(previous, computed)) {\n        // replace new route with the old one if they're equal\n        // so other components can use a simple reference equality checks\n        computedRoutes.set(linkId, previous);\n      }\n    });\n    this.routings = computedRoutes;\n    this.source.trigger(\"updateRoutings\", {\n      source: this,\n      previous: previousRoutes,\n    });\n  }\n\n  getRoutings() {\n    return this.routings;\n  }\n\n  getRouting(linkId: string): RoutedLink {\n    return this.routings.get(linkId);\n  }\n\n  getLanguage(): string {\n    return this._language;\n  }\n  setLanguage(value: string) {\n    if (!value) {\n      throw new Error(\"Cannot set empty language.\");\n    }\n    const previous = this._language;\n    if (previous === value) {\n      return;\n    }\n    this._language = value;\n    this.source.trigger(\"changeLanguage\", { source: this, previous });\n  }\n\n  getLinkTemplates(): ReadonlyMap<LinkTypeIri, LinkTemplate> {\n    return this.linkTemplates;\n  }\n\n  performSyncUpdate() {\n    for (\n      let layer = RenderingLayer.FirstToUpdate;\n      layer <= RenderingLayer.LastToUpdate;\n      layer++\n    ) {\n      this.source.trigger(\"syncUpdate\", { layer });\n    }\n  }\n\n  onIriClick(\n    iri: string,\n    element: Element,\n    clickIntent: IriClickIntent,\n    event: React.MouseEvent<any>\n  ) {\n    event.persist();\n    event.preventDefault();\n    const { onIriClick } = this.options;\n    if (onIriClick) {\n      onIriClick({ iri, element, clickIntent, originalEvent: event });\n    }\n  }\n\n  setPaperWidget(widget: {\n    key: string;\n    widget: ReactElement<any> | undefined;\n    attachment: WidgetAttachment;\n  }) {\n    const { key, widget: element, attachment } = widget;\n    const widgets = { [key]: element ? { element, attachment } : undefined };\n    this.source.trigger(\"updateWidgets\", { widgets });\n  }\n\n  setHandlerForNextDropOnPaper(handler: (e: DropOnPaperEvent) => void) {\n    this.dropOnPaperHandler = handler;\n  }\n\n  _tryHandleDropOnPaper(e: DropOnPaperEvent): boolean {\n    const { dropOnPaperHandler } = this;\n    if (dropOnPaperHandler) {\n      this.dropOnPaperHandler = undefined;\n      dropOnPaperHandler(e);\n      return true;\n    }\n    return false;\n  }\n\n  selectLabel(\n    labels: readonly LocalizedString[],\n    language?: string\n  ): LocalizedString | undefined {\n    const targetLanguage =\n      typeof language === \"undefined\" ? this.getLanguage() : language;\n    const { selectLabelLanguage = defaultSelectLabel } = this.options;\n    return selectLabelLanguage(labels, targetLanguage);\n  }\n\n  formatLabel(\n    labels: readonly LocalizedString[],\n    fallbackIri: string,\n    language?: string\n  ): string {\n    const label = this.selectLabel(labels, language);\n    return resolveLabel(label, fallbackIri);\n  }\n\n  public getElementTypeString(elementModel: ElementModel): string {\n    return elementModel.types\n      .map((typeId) => {\n        const type = this.model.createClass(typeId);\n        return this.formatLabel(type.label, type.id);\n      })\n      .sort()\n      .join(\", \");\n  }\n\n  public getTypeStyle(types: ElementTypeIri[]): TypeStyle {\n    types.sort();\n\n    const customStyle = this.resolveTypeStyle(types);\n\n    const icon = customStyle ? customStyle.icon : undefined;\n    let color: { h: number; c: number; l: number };\n    if (customStyle && customStyle.color) {\n      color = hcl(customStyle.color);\n    } else {\n      const hue = getHueFromClasses(types, this.colorSeed);\n      color = { h: hue, c: 40, l: 75 };\n    }\n    return { icon, color };\n  }\n\n  formatIri(iri: string): string {\n    if (isEncodedBlank(iri)) {\n      return \"(blank node)\";\n    }\n    return `<${iri}>`;\n  }\n\n  public getElementTemplate(types: ElementTypeIri[]): ElementTemplate {\n    return this.resolveElementTemplate(types) || StandardTemplate;\n  }\n\n  createLinkTemplate(linkType: FatLinkType): LinkTemplate {\n    const existingTemplate = this.linkTemplates.get(linkType.id);\n    if (existingTemplate) {\n      return existingTemplate;\n    }\n\n    let template: LinkTemplate = {};\n    const result = this.resolveLinkTemplate(linkType.id);\n    if (result) {\n      template = cloneDeep(result);\n    }\n\n    fillLinkTemplateDefaults(template);\n    this.linkTemplates.set(linkType.id, template);\n    this.source.trigger(\"changeLinkTemplates\", {});\n    return template;\n  }\n\n  dispose() {\n    if (this.disposed) {\n      return;\n    }\n    this.source.trigger(\"dispose\", {});\n    this.listener.stopListening();\n    this.disposed = true;\n  }\n\n  get highlighter() {\n    return this._highlighter;\n  }\n  setHighlighter(value: Highlighter) {\n    const previous = this._highlighter;\n    if (previous === value) {\n      return;\n    }\n    this._highlighter = value;\n    this.source.trigger(\"changeHighlight\", { source: this, previous });\n  }\n\n  _setElementDecorator(decorator: ElementDecoratorResolver) {\n    this._elementDecorator = decorator;\n  }\n\n  _decorateElement(element: Element): ReactNode | undefined {\n    return this._elementDecorator(element);\n  }\n}\n\nfunction sameRoutedLink(a: RoutedLink, b: RoutedLink) {\n  return (\n    a.linkId === b.linkId &&\n    a.labelTextAnchor === b.labelTextAnchor &&\n    isPolylineEqual(a.vertices, b.vertices)\n  );\n}\n\nfunction getHueFromClasses(\n  classes: readonly ElementTypeIri[],\n  seed?: number\n): number {\n  let hash = seed;\n  for (const name of classes) {\n    hash = hashFnv32a(name, hash);\n  }\n  const MAX_INT32 = 0x7fffffff;\n  return 360 * ((hash === undefined ? 0 : hash) / MAX_INT32);\n}\n\nfunction fillLinkTemplateDefaults(template: LinkTemplate) {\n  const defaults: Partial<LinkTemplate> = {\n    markerTarget: { d: \"M0,0 L0,8 L9,4 z\", width: 9, height: 8, fill: \"black\" },\n  };\n  defaultsDeep(template, defaults);\n  if (!template.renderLink) {\n    template.renderLink = () => ({});\n  }\n}\n\nfunction defaultSelectLabel(\n  texts: readonly LocalizedString[],\n  language: string\n): LocalizedString | undefined {\n  if (texts.length === 0) {\n    return undefined;\n  }\n  let defaultValue: LocalizedString;\n  let englishValue: LocalizedString;\n  for (const text of texts) {\n    if (text.language === language) {\n      return text;\n    } else if (text.language === \"\") {\n      defaultValue = text;\n    } else if (text.language === \"en\") {\n      englishValue = text;\n    }\n  }\n  return defaultValue !== undefined\n    ? defaultValue\n    : englishValue !== undefined\n    ? englishValue\n    : texts[0];\n}\n\nfunction resolveLabel(\n  label: LocalizedString | undefined,\n  fallbackIri: string\n): string {\n  if (label) {\n    return label.value;\n  }\n  return getUriLocalName(fallbackIri) || fallbackIri;\n}\n","import * as React from \"react\";\nimport { hcl } from \"d3-color\";\n\nimport { Property, ElementTypeIri, PropertyTypeIri } from \"../data/model\";\nimport { TemplateProps } from \"../customization/props\";\nimport { Debouncer } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport {\n  KeyedObserver,\n  observeElementTypes,\n  observeProperties,\n} from \"../viewUtils/keyedObserver\";\n\nimport { setElementExpanded } from \"./commands\";\nimport { Element } from \"./elements\";\nimport { DiagramView, RenderingLayer, IriClickIntent } from \"./view\";\n\nexport interface Props {\n  view: DiagramView;\n  group?: string;\n  style: React.CSSProperties;\n}\n\ninterface State {\n  readonly elementStates?: ReadonlyMap<string, ElementState>;\n}\n\ninterface ElementState {\n  element: Element;\n  templateProps: TemplateProps;\n  blurred: boolean;\n}\n\nenum RedrawFlags {\n  None = 0,\n  Render = 1,\n  RecomputeTemplate = 1 | 2,\n  RecomputeBlurred = 1 | 4,\n}\n\ninterface RedrawBatch {\n  requests: Map<string, RedrawFlags>;\n  forAll: RedrawFlags;\n}\n\ninterface SizeUpdateRequest {\n  element: Element;\n  node: HTMLDivElement;\n}\n\nexport class ElementLayer extends React.Component<Props, State> {\n  private readonly listener = new EventObserver();\n\n  private redrawBatch: RedrawBatch = {\n    requests: new Map<string, RedrawFlags>(),\n    forAll: RedrawFlags.None,\n  };\n  private delatedRedraw = new Debouncer();\n\n  private sizeRequests = new Map<string, SizeUpdateRequest>();\n  private delayedUpdateSizes = new Debouncer();\n\n  private layer: HTMLDivElement;\n\n  constructor(props: Props, context: any) {\n    super(props, context);\n    const { view, group } = this.props;\n    this.state = {\n      elementStates: applyRedrawRequests(\n        view,\n        group,\n        this.redrawBatch,\n        new Map<string, ElementState>()\n      ),\n    };\n  }\n\n  render() {\n    const { view, style } = this.props;\n    const { elementStates } = this.state;\n\n    const elementsToRender: ElementState[] = [];\n    for (const { id } of view.model.elements) {\n      const state = elementStates.get(id);\n      if (state) {\n        elementsToRender.push(state);\n      }\n    }\n\n    return (\n      <div\n        className=\"graph-explorer-element-layer\"\n        ref={this.onMount}\n        style={style}\n      >\n        {elementsToRender.map((state) => {\n          const overlayElement = (\n            <OverlayedElement\n              key={state.element.id}\n              state={state}\n              view={view}\n              onInvalidate={this.requestRedraw}\n              onResize={this.requestSizeUpdate}\n            />\n          );\n          const elementDecorator = view._decorateElement(state.element);\n          if (elementDecorator) {\n            return (\n              <div key={state.element.id}>\n                {overlayElement}\n                {elementDecorator}\n              </div>\n            );\n          }\n          return overlayElement;\n        })}\n      </div>\n    );\n  }\n\n  private onMount = (layer: HTMLDivElement) => {\n    this.layer = layer;\n  };\n\n  componentDidMount() {\n    const { view } = this.props;\n    this.listener.listen(view.model.events, \"changeCells\", (e) => {\n      if (e.updateAll) {\n        this.requestRedrawAll(RedrawFlags.None);\n      } else {\n        if (e.changedElement) {\n          this.requestRedraw(e.changedElement, RedrawFlags.None);\n        }\n      }\n    });\n    this.listener.listen(view.events, \"changeLanguage\", () => {\n      this.requestRedrawAll(RedrawFlags.RecomputeTemplate);\n    });\n    this.listener.listen(view.events, \"changeHighlight\", () => {\n      this.requestRedrawAll(RedrawFlags.RecomputeBlurred);\n    });\n    this.listener.listen(view.model.events, \"elementEvent\", ({ data }) => {\n      const invalidatesTemplate =\n        data.changeData || data.changeExpanded || data.changeElementState;\n      if (invalidatesTemplate) {\n        this.requestRedraw(\n          invalidatesTemplate.source,\n          RedrawFlags.RecomputeTemplate\n        );\n      }\n      const invalidatesRender = data.changePosition || data.requestedRedraw;\n      if (invalidatesRender) {\n        this.requestRedraw(invalidatesRender.source, RedrawFlags.Render);\n      }\n    });\n    this.listener.listen(view.events, \"syncUpdate\", ({ layer }) => {\n      if (layer === RenderingLayer.Element) {\n        this.delatedRedraw.runSynchronously();\n      } else if (layer === RenderingLayer.ElementSize) {\n        this.delayedUpdateSizes.runSynchronously();\n      }\n    });\n  }\n\n  componentDidUpdate(nextProps: Props) {\n    if (this.props.group !== nextProps.group) {\n      this.setState(\n        (state): State => ({\n          elementStates: applyRedrawRequests(\n            nextProps.view,\n            nextProps.group,\n            this.redrawBatch,\n            state.elementStates\n          ),\n        })\n      );\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.delatedRedraw.dispose();\n    this.delayedUpdateSizes.dispose();\n  }\n\n  private requestRedraw = (element: Element, request: RedrawFlags) => {\n    const flagsWithForAll = this.redrawBatch.forAll | request;\n    if (flagsWithForAll === this.redrawBatch.forAll) {\n      // forAll flags already include the request\n      return;\n    }\n    const existing = this.redrawBatch.requests.get(element.id);\n    this.redrawBatch.requests.set(element.id, existing | request);\n    this.delatedRedraw.call(this.redrawElements);\n  };\n\n  private requestRedrawAll(request: RedrawFlags) {\n    this.redrawBatch.forAll |= request;\n    this.delatedRedraw.call(this.redrawElements);\n  }\n\n  private redrawElements = () => {\n    const props = this.props;\n    this.setState(\n      (state): State => ({\n        elementStates: applyRedrawRequests(\n          props.view,\n          props.group,\n          this.redrawBatch,\n          state.elementStates\n        ),\n      })\n    );\n  };\n\n  private requestSizeUpdate = (element: Element, node: HTMLDivElement) => {\n    this.sizeRequests.set(element.id, { element, node });\n    this.delayedUpdateSizes.call(this.recomputeQueuedSizes);\n  };\n\n  private recomputeQueuedSizes = () => {\n    const batch = this.sizeRequests;\n    this.sizeRequests = new Map<string, SizeUpdateRequest>();\n    batch.forEach(({ element, node }) => {\n      const { clientWidth, clientHeight } = node;\n      element.setSize({ width: clientWidth, height: clientHeight });\n    });\n  };\n}\n\nfunction applyRedrawRequests(\n  view: DiagramView,\n  targetGroup: string | undefined,\n  batch: RedrawBatch,\n  previous: ReadonlyMap<string, ElementState>\n): ReadonlyMap<string, ElementState> {\n  const computed = new Map<string, ElementState>();\n  for (const element of view.model.elements) {\n    if (element.group !== targetGroup) {\n      continue;\n    }\n    const elementId = element.id;\n    if (previous.has(elementId)) {\n      let state = previous.get(elementId);\n      const request =\n        (batch.requests.get(elementId) || RedrawFlags.None) | batch.forAll;\n      if (request & RedrawFlags.Render) {\n        state = {\n          element,\n          templateProps:\n            (request & RedrawFlags.RecomputeTemplate) ===\n            RedrawFlags.RecomputeTemplate\n              ? computeTemplateProps(state.element, view)\n              : state.templateProps,\n          blurred:\n            (request & RedrawFlags.RecomputeBlurred) ===\n            RedrawFlags.RecomputeBlurred\n              ? computeIsBlurred(state.element, view)\n              : state.blurred,\n        };\n      }\n      computed.set(elementId, state);\n      batch.requests.delete(elementId);\n    } else {\n      computed.set(element.id, {\n        element,\n        templateProps: computeTemplateProps(element, view),\n        blurred: computeIsBlurred(element, view),\n      });\n    }\n  }\n  batch.forAll = RedrawFlags.None;\n  return computed;\n}\n\ninterface OverlayedElementProps {\n  state: ElementState;\n  view: DiagramView;\n  onInvalidate: (model: Element, request: RedrawFlags) => void;\n  onResize: (model: Element, node: HTMLDivElement) => void;\n}\n\nexport interface ElementContextWrapper {\n  graphExplorerElement: ElementContext;\n}\n\nexport interface ElementContext {\n  element: Element;\n}\n\nexport const ElementContext = React.createContext<ElementContextWrapper>(null);\n\nclass OverlayedElement extends React.Component<OverlayedElementProps, {}> {\n  private element: HTMLElement | null = null;\n\n  private readonly listener = new EventObserver();\n  private disposed = false;\n\n  private typesObserver: KeyedObserver<ElementTypeIri>;\n  private propertiesObserver: KeyedObserver<PropertyTypeIri>;\n\n  private rerenderTemplate = () => {\n    if (this.disposed) {\n      return;\n    }\n    this.props.onInvalidate(\n      this.props.state.element,\n      RedrawFlags.RecomputeTemplate\n    );\n  };\n\n  render(): React.ReactElement<any> {\n    const {\n      state: { element, blurred },\n    } = this.props;\n    if (element.temporary) {\n      return <div />;\n    }\n\n    const { x = 0, y = 0 } = element.position;\n    const transform = `translate(${x}px,${y}px)`;\n\n    // const angle = model.get('angle') || 0;\n    // if (angle) { transform += `rotate(${angle}deg)`; }\n\n    const className = `graph-explorer-overlayed-element ${\n      blurred ? \"graph-explorer-overlayed-element--blurred\" : \"\"\n    }`;\n    return (\n      <ElementContext.Provider value={{ graphExplorerElement: { element } }}>\n        <div\n          className={className}\n          // set `element-id` to translate mouse events to paper\n          data-element-id={element.id}\n          style={{ position: \"absolute\", transform }}\n          tabIndex={0}\n          ref={this.onMount}\n          // resize element when child image loaded\n          onLoad={this.onLoadOrErrorEvent}\n          onError={this.onLoadOrErrorEvent}\n          onClick={this.onClick}\n          onDoubleClick={this.onDoubleClick}\n        >\n          <TemplatedElement {...this.props} />\n        </div>\n      </ElementContext.Provider>\n    );\n  }\n\n  private onMount = (node: HTMLDivElement | null) => {\n    this.element = node;\n    if (!node) {\n      return;\n    }\n    const { state, onResize } = this.props;\n    onResize(state.element, node);\n  };\n\n  private onLoadOrErrorEvent = () => {\n    const { state, onResize } = this.props;\n    if (this.element) {\n      onResize(state.element, this.element as HTMLDivElement);\n    }\n  };\n\n  private onClick = (e: React.MouseEvent<EventTarget>) => {\n    if (e.target instanceof HTMLElement && e.target.localName === \"a\") {\n      const anchor = e.target as HTMLAnchorElement;\n      const { view, state } = this.props;\n      const clickIntent =\n        e.target.getAttribute(\"data-iri-click-intent\") ===\n        IriClickIntent.OpenEntityIri\n          ? IriClickIntent.OpenEntityIri\n          : IriClickIntent.OpenOtherIri;\n      view.onIriClick(decodeURI(anchor.href), state.element, clickIntent, e);\n    }\n  };\n\n  private onDoubleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n    const {\n      view,\n      state: { element },\n    } = this.props;\n    view.model.history.execute(\n      setElementExpanded(element, !element.isExpanded)\n    );\n  };\n\n  componentDidMount() {\n    const { state, view } = this.props;\n    this.listener.listen(state.element.events, \"requestedFocus\", () => {\n      if (this.element) {\n        this.element.focus();\n      }\n    });\n    this.typesObserver = observeElementTypes(\n      view.model,\n      \"changeLabel\",\n      this.rerenderTemplate\n    );\n    this.propertiesObserver = observeProperties(\n      view.model,\n      \"changeLabel\",\n      this.rerenderTemplate\n    );\n    this.observeTypes();\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.typesObserver.stopListening();\n    this.propertiesObserver.stopListening();\n    this.disposed = true;\n  }\n\n  shouldComponentUpdate(nextProps: OverlayedElementProps) {\n    return this.props.state !== nextProps.state;\n  }\n\n  componentDidUpdate() {\n    this.observeTypes();\n    if (this.element) {\n      this.props.onResize(\n        this.props.state.element,\n        this.element as HTMLDivElement\n      );\n    }\n  }\n\n  private observeTypes() {\n    const {\n      state: { element },\n    } = this.props;\n    this.typesObserver.observe(element.data.types);\n    this.propertiesObserver.observe(\n      Object.keys(element.data.properties) as PropertyTypeIri[]\n    );\n  }\n}\n\nclass TemplatedElement extends React.Component<OverlayedElementProps, {}> {\n  private cachedTemplateClass: React.ComponentClass<TemplateProps>;\n  private cachedTemplateProps: TemplateProps;\n\n  render() {\n    const { state, view } = this.props;\n    const { element, templateProps } = state;\n    const templateClass = view.getElementTemplate(element.data.types);\n    this.cachedTemplateClass = templateClass;\n    this.cachedTemplateProps = templateProps;\n    return React.createElement(templateClass, templateProps);\n  }\n\n  shouldComponentUpdate(nextProps: OverlayedElementProps) {\n    const templateClass = nextProps.view.getElementTemplate(\n      nextProps.state.element.data.types\n    );\n    return !(\n      this.cachedTemplateClass === templateClass &&\n      this.cachedTemplateProps === nextProps.state.templateProps\n    );\n  }\n}\n\nfunction computeTemplateProps(\n  model: Element,\n  view: DiagramView\n): TemplateProps {\n  const types =\n    model.data.types.length > 0\n      ? view.getElementTypeString(model.data)\n      : \"Thing\";\n  const label = view.formatLabel(model.data.label.values, model.iri);\n  const { color, icon } = computeStyleFor(model, view);\n  const propsAsList = computePropertyTable(model, view);\n\n  return {\n    elementId: model.id,\n    data: model.data,\n    iri: model.iri,\n    types,\n    label,\n    color,\n    iconUrl: icon,\n    imgUrl: model.data.image,\n    isExpanded: model.isExpanded,\n    props: model.data.properties,\n    propsAsList,\n  };\n}\n\nfunction computePropertyTable(\n  model: Element,\n  view: DiagramView\n): { id: string; name: string; property: Property }[] {\n  if (!model.data.properties) {\n    return [];\n  }\n\n  const propertyIris = Object.keys(model.data.properties) as PropertyTypeIri[];\n  const propTable = propertyIris.map((key) => {\n    const property = view.model.createProperty(key);\n    const name = view.formatLabel(property.label, key);\n    return {\n      id: key,\n      name: name,\n      property: model.data.properties[key],\n    };\n  });\n\n  propTable.sort((a, b) => {\n    const aLabel = (a.name || a.id).toLowerCase();\n    const bLabel = (b.name || b.id).toLowerCase();\n    return aLabel.localeCompare(bLabel);\n  });\n  return propTable;\n}\n\nfunction computeStyleFor(model: Element, view: DiagramView) {\n  const {\n    color: { h, c, l },\n    icon,\n  } = view.getTypeStyle(model.data.types);\n  return {\n    icon,\n    color: hcl(h, c, l).toString(),\n  };\n}\n\nfunction computeIsBlurred(element: Element, view: DiagramView): boolean {\n  return view.highlighter && !view.highlighter(element);\n}\n","import * as React from \"react\";\nimport { Component, ReactElement, SVGAttributes, CSSProperties } from \"react\";\n\nimport { LocalizedString } from \"../data/model\";\nimport {\n  LinkTemplate,\n  LinkStyle,\n  LinkLabel as LinkLabelProperties,\n  LinkMarkerStyle,\n  RoutedLink,\n  RoutedLinks,\n} from \"../customization/props\";\nimport { Debouncer } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\n\nimport { restoreCapturedLinkGeometry } from \"./commands\";\nimport {\n  Element as DiagramElement,\n  Link as DiagramLink,\n  LinkVertex,\n  linkMarkerKey,\n  FatLinkType,\n} from \"./elements\";\nimport {\n  Vector,\n  computePolyline,\n  computePolylineLength,\n  getPointAlongPolyline,\n  computeGrouping,\n  Rect,\n} from \"./geometry\";\nimport { DiagramView, RenderingLayer } from \"./view\";\n\nexport interface LinkLayerProps {\n  view: DiagramView;\n  links: readonly DiagramLink[];\n  group?: string;\n}\n\nenum UpdateRequest {\n  /** Some part of layer requested an update */\n  Partial = 1,\n  /** Full update requested */\n  All,\n}\n\nconst CLASS_NAME = \"graph-explorer-link-layer\";\n\nexport class LinkLayer extends Component<LinkLayerProps, {}> {\n  private readonly listener = new EventObserver();\n  private readonly delayedUpdate = new Debouncer();\n\n  private updateState = UpdateRequest.Partial;\n  /** List of link IDs to update at the next flush event */\n  private scheduledToUpdate = new Set<string>();\n\n  componentDidMount() {\n    const { view } = this.props;\n\n    const scheduleUpdateElementLinks = (element: DiagramElement) => {\n      for (const link of element.links) {\n        this.scheduleUpdateLink(link.id);\n      }\n    };\n    this.listener.listen(view.events, \"changeLanguage\", this.scheduleUpdateAll);\n    this.listener.listen(\n      view.events,\n      \"changeHighlight\",\n      this.scheduleUpdateAll\n    );\n    const updateChangedRoutes = (\n      changed: RoutedLinks,\n      previous: RoutedLinks\n    ) => {\n      changed.forEach((routing, linkId) => {\n        if (previous.get(linkId) !== routing) {\n          this.scheduleUpdateLink(linkId);\n        }\n      });\n    };\n    this.listener.listen(view.events, \"updateRoutings\", ({ previous }) => {\n      const newRoutes = view.getRoutings();\n      updateChangedRoutes(newRoutes, previous);\n      updateChangedRoutes(previous, newRoutes);\n    });\n    this.listener.listen(view.model.events, \"changeCells\", (e) => {\n      if (e.updateAll) {\n        this.scheduleUpdateAll();\n      } else {\n        if (e.changedElement) {\n          scheduleUpdateElementLinks(e.changedElement);\n        }\n        if (e.changedLinks) {\n          for (const link of e.changedLinks) {\n            this.scheduleUpdateLink(link.id);\n          }\n        }\n      }\n    });\n    this.listener.listen(view.model.events, \"elementEvent\", ({ data }) => {\n      const elementEvent = data.changePosition || data.changeSize;\n      if (!elementEvent) {\n        return;\n      }\n      scheduleUpdateElementLinks(elementEvent.source);\n    });\n    this.listener.listen(view.model.events, \"linkEvent\", ({ data }) => {\n      const linkEvent =\n        data.changeData ||\n        data.changeLayoutOnly ||\n        data.changeVertices ||\n        data.changeLinkState;\n      if (linkEvent) {\n        this.scheduleUpdateLink(linkEvent.source.id);\n      }\n    });\n    this.listener.listen(view.model.events, \"linkTypeEvent\", ({ data }) => {\n      const linkTypeEvent = data.changeLabel || data.changeVisibility;\n      if (!linkTypeEvent) {\n        return;\n      }\n      const linkTypeId = linkTypeEvent.source.id;\n      for (const link of view.model.linksOfType(linkTypeId)) {\n        this.scheduleUpdateLink(link.id);\n      }\n    });\n    this.listener.listen(view.events, \"syncUpdate\", ({ layer }) => {\n      if (layer !== RenderingLayer.Link) {\n        return;\n      }\n      this.delayedUpdate.runSynchronously();\n    });\n  }\n\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.delayedUpdate.dispose();\n  }\n\n  private scheduleUpdateAll = () => {\n    if (this.updateState !== UpdateRequest.All) {\n      this.updateState = UpdateRequest.All;\n      this.scheduledToUpdate = new Set<string>();\n    }\n    this.delayedUpdate.call(this.performUpdate);\n  };\n\n  private scheduleUpdateLink(linkId: string) {\n    if (this.updateState === UpdateRequest.Partial) {\n      this.scheduledToUpdate.add(linkId);\n    }\n    this.delayedUpdate.call(this.performUpdate);\n  }\n\n  private popShouldUpdatePredicate(): (model: DiagramLink) => boolean {\n    const { updateState, scheduledToUpdate } = this;\n    this.scheduledToUpdate = new Set<string>();\n    this.updateState = UpdateRequest.Partial;\n    return updateState === UpdateRequest.All\n      ? () => true\n      : (link) => scheduledToUpdate.has(link.id);\n  }\n\n  private performUpdate = () => {\n    this.forceUpdate();\n  };\n\n  private getLinks = () => {\n    const { view, links, group } = this.props;\n\n    if (!group) {\n      return links;\n    }\n\n    const grouping = computeGrouping(view.model.elements);\n    const nestedElements = computeDeepNestedElements(grouping, group);\n\n    return links.filter((link) => {\n      const { sourceId, targetId } = link;\n\n      const source = view.model.getElement(sourceId);\n      const target = view.model.getElement(targetId);\n\n      if (!source || !target) {\n        return false;\n      }\n\n      const sourceGroup = source.group;\n      const targetGroup = target.group;\n\n      return nestedElements[sourceGroup] || nestedElements[targetGroup];\n    });\n  };\n\n  render() {\n    const { view } = this.props;\n    const shouldUpdate = this.popShouldUpdatePredicate();\n\n    return (\n      <g className={CLASS_NAME}>\n        {this.getLinks().map((model) => (\n          <LinkView\n            key={model.id}\n            view={view}\n            model={model}\n            shouldUpdate={shouldUpdate(model)}\n            route={view.getRouting(model.id)}\n          />\n        ))}\n      </g>\n    );\n  }\n}\n\nfunction computeDeepNestedElements(\n  grouping: Map<string, DiagramElement[]>,\n  groupId: string\n): Record<string, true> {\n  const deepChildren: Record<string, true> = {};\n\n  function collectNestedItems(parentId: string) {\n    deepChildren[parentId] = true;\n    const children = grouping.get(parentId);\n    if (!children) {\n      return;\n    }\n    for (const element of children) {\n      if (element.group !== parentId) {\n        continue;\n      }\n      collectNestedItems(element.id);\n    }\n  }\n\n  collectNestedItems(groupId);\n  return deepChildren;\n}\n\ninterface LinkViewProps {\n  view: DiagramView;\n  model: DiagramLink;\n  shouldUpdate: boolean;\n  route?: RoutedLink;\n}\n\nconst LINK_CLASS = \"graph-explorer-link\";\nconst LABEL_GROUPING_PRECISION = 100;\n// temporary, cleared-before-render map to hold line numbers for labels\n// grouped on the same link offset\nconst TEMPORARY_LABEL_LINES = new Map<number, number>();\n\nclass LinkView extends Component<LinkViewProps, {}> {\n  private linkType: FatLinkType;\n  private template: LinkTemplate;\n\n  constructor(props: LinkViewProps, context: any) {\n    super(props, context);\n    this.grabLinkTemplate(this.props);\n  }\n\n  componentDidUpdate(nextProps: LinkViewProps) {\n    if (this.linkType.id !== nextProps.model.typeId) {\n      this.grabLinkTemplate(nextProps);\n    }\n  }\n\n  shouldComponentUpdate(nextProps: LinkViewProps, _nextState: {}) {\n    return nextProps.shouldUpdate;\n  }\n\n  private grabLinkTemplate(props: LinkViewProps) {\n    this.linkType = props.view.model.getLinkType(props.model.typeId);\n    this.template = props.view.createLinkTemplate(this.linkType);\n  }\n\n  render() {\n    const { view, model, route } = this.props;\n    const source = view.model.getElement(model.sourceId);\n    const target = view.model.getElement(model.targetId);\n    if (!(source && target)) {\n      return null;\n    }\n\n    const verticesDefinedByUser = model.vertices || [];\n    const vertices = route ? route.vertices : verticesDefinedByUser;\n    const polyline = computePolyline(source, target, vertices);\n\n    const path = \"M\" + polyline.map(({ x, y }) => `${x},${y}`).join(\" L\");\n\n    const { index: typeIndex, showLabel } = this.linkType;\n    const style = this.template.renderLink(model);\n    const pathAttributes = getPathAttributes(model, style);\n\n    const isBlurred = view.highlighter && !view.highlighter(model);\n    const className = `${LINK_CLASS} ${\n      isBlurred ? `${LINK_CLASS}--blurred` : \"\"\n    }`;\n    return (\n      <g\n        className={className}\n        data-link-id={model.id}\n        data-source-id={source.id}\n        data-target-id={target.id}\n      >\n        <path\n          className={`${LINK_CLASS}__connection`}\n          d={path}\n          {...pathAttributes}\n          markerStart={`url(#${linkMarkerKey(typeIndex, true)})`}\n          markerEnd={`url(#${linkMarkerKey(typeIndex, false)})`}\n        />\n        <path className={`${LINK_CLASS}__wrap`} d={path} />\n        {showLabel ? this.renderLabels(polyline, style) : undefined}\n        {this.renderVertices(verticesDefinedByUser, pathAttributes.stroke)}\n      </g>\n    );\n  }\n\n  private renderVertices(vertices: readonly Vector[], fill: string) {\n    const elements: ReactElement<any>[] = [];\n\n    const vertexClass = `${LINK_CLASS}__vertex`;\n    const vertexRadius = 10;\n\n    let index = 0;\n    for (const { x, y } of vertices) {\n      elements.push(\n        <circle\n          key={index * 2}\n          data-vertex={index}\n          className={vertexClass}\n          cx={x}\n          cy={y}\n          r={vertexRadius}\n          fill={fill}\n        />\n      );\n      elements.push(\n        <VertexTools\n          key={index * 2 + 1}\n          className={`${LINK_CLASS}__vertex-tools`}\n          model={this.props.model}\n          vertexIndex={index}\n          vertexRadius={vertexRadius}\n          x={x}\n          y={y}\n          onRemove={this.onRemoveLinkVertex}\n        />\n      );\n      index++;\n    }\n\n    return <g className={`${LINK_CLASS}__vertices`}>{elements}</g>;\n  }\n\n  private onRemoveLinkVertex = (vertex: LinkVertex) => {\n    const model = this.props.view.model;\n    model.history.registerToUndo(restoreCapturedLinkGeometry(vertex.link));\n    vertex.remove();\n  };\n\n  private onBoundsUpdate = (newBounds: Rect | undefined) => {\n    const { model } = this.props;\n    model.setLabelBounds(newBounds);\n  };\n\n  private renderLabels(polyline: readonly Vector[], style: LinkStyle) {\n    const { view, model, route } = this.props;\n\n    const labels = computeLinkLabels(model, style, view);\n\n    let textAnchor: \"start\" | \"middle\" | \"end\" = \"middle\";\n    if (route && route.labelTextAnchor) {\n      textAnchor = route.labelTextAnchor;\n    }\n\n    const polylineLength = computePolylineLength(polyline);\n    TEMPORARY_LABEL_LINES.clear();\n\n    return (\n      <g className={`${LINK_CLASS}__labels`}>\n        {labels.map((label, index) => {\n          const { x, y } = getPointAlongPolyline(\n            polyline,\n            polylineLength * label.offset\n          );\n          const groupKey =\n            Math.round(label.offset * LABEL_GROUPING_PRECISION) /\n            LABEL_GROUPING_PRECISION;\n          const line = TEMPORARY_LABEL_LINES.get(groupKey) || 0;\n          TEMPORARY_LABEL_LINES.set(groupKey, line + 1);\n          return (\n            <LinkLabel\n              key={index}\n              x={x}\n              y={y}\n              line={line}\n              label={label}\n              textAnchor={textAnchor}\n              onBoundsUpdate={index === 0 ? this.onBoundsUpdate : undefined}\n            />\n          );\n        })}\n      </g>\n    );\n  }\n}\n\nfunction computeLinkLabels(\n  model: DiagramLink,\n  style: LinkStyle,\n  view: DiagramView\n) {\n  const labels: LabelAttributes[] = [];\n\n  const labelStyle = style.label || {};\n  const labelTexts =\n    labelStyle.attrs && labelStyle.attrs.text\n      ? labelStyle.attrs.text.text\n      : undefined;\n\n  let text: LocalizedString | undefined;\n  let title: string | undefined = labelStyle.title;\n  if (labelTexts && labelTexts.length > 0) {\n    text = view.selectLabel(labelTexts);\n  } else {\n    const type = view.model.getLinkType(model.typeId);\n    text = view.selectLabel(type.label) || {\n      value: view.formatLabel(type.label, type.id),\n      language: \"\",\n    };\n    if (title === undefined) {\n      title = `${text.value} ${view.formatIri(model.typeId)}`;\n    }\n  }\n\n  labels.push({\n    offset: labelStyle.position || 0.5,\n    text,\n    title,\n    attributes: {\n      text: getLabelTextAttributes(labelStyle),\n      rect: getLabelRectAttributes(labelStyle),\n    },\n  });\n\n  if (style.properties) {\n    for (const property of style.properties) {\n      if (\n        !(property.attrs && property.attrs.text && property.attrs.text.text)\n      ) {\n        continue;\n      }\n      labels.push({\n        offset: property.position || 0.5,\n        text: view.selectLabel(property.attrs.text.text),\n        title: property.title,\n        attributes: {\n          text: getLabelTextAttributes(property),\n          rect: getLabelRectAttributes(property),\n        },\n      });\n    }\n  }\n\n  return labels;\n}\n\nfunction getPathAttributes(\n  model: DiagramLink,\n  style: LinkStyle\n): SVGAttributes<SVGPathElement> {\n  const connectionAttributes: LinkStyle[\"connection\"] = style.connection || {};\n  const defaultStrokeDasharray = model.layoutOnly ? \"5,5\" : undefined;\n  const {\n    fill = \"none\",\n    stroke = \"black\",\n    \"stroke-width\": strokeWidth,\n    \"stroke-dasharray\": strokeDasharray = defaultStrokeDasharray,\n  } = connectionAttributes;\n  return { fill, stroke, strokeWidth, strokeDasharray };\n}\n\nfunction getLabelTextAttributes(label: LinkLabelProperties): CSSProperties {\n  const {\n    fill = \"black\",\n    stroke = \"none\",\n    \"stroke-width\": strokeWidth = 0,\n    \"font-family\":\n      fontFamily = '\"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif',\n    \"font-size\": fontSize = \"inherit\",\n    \"font-weight\": fontWeight = \"bold\",\n  } = label.attrs ? label.attrs.text : {};\n  return {\n    fill,\n    stroke,\n    strokeWidth,\n    fontFamily,\n    fontSize,\n    fontWeight: fontWeight as CSSProperties[\"fontWeight\"],\n  };\n}\n\nfunction getLabelRectAttributes(label: LinkLabelProperties): CSSProperties {\n  const {\n    fill = \"white\",\n    stroke = \"none\",\n    \"stroke-width\": strokeWidth = 0,\n  } = label.attrs && label.attrs.rect ? label.attrs.rect : {};\n  return { fill, stroke, strokeWidth };\n}\n\ninterface LabelAttributes {\n  offset: number;\n  text: LocalizedString;\n  title?: string;\n  attributes: {\n    text: CSSProperties;\n    rect: CSSProperties;\n  };\n}\n\ninterface LinkLabelProps {\n  x: number;\n  y: number;\n  line: number;\n  label: LabelAttributes;\n  textAnchor: \"start\" | \"middle\" | \"end\";\n  onBoundsUpdate?: (newBounds: Rect) => void;\n}\n\ninterface LinkLabelState {\n  readonly width?: number;\n  readonly height?: number;\n}\n\nconst GROUPED_LABEL_MARGIN = 2;\n\nclass LinkLabel extends Component<LinkLabelProps, LinkLabelState> {\n  private text: SVGTextElement | undefined;\n  private shouldUpdateBounds = true;\n\n  constructor(props: LinkLabelProps) {\n    super(props);\n    this.state = { width: 0, height: 0 };\n  }\n\n  render() {\n    const { x, y, label, line, textAnchor } = this.props;\n    const { width, height } = this.state;\n    const { x: rectX, y: rectY } = this.getLabelRectangle(width, height);\n\n    const transform =\n      line === 0\n        ? undefined\n        : `translate(0, ${line * (height + GROUPED_LABEL_MARGIN)}px)`;\n    // HACK: 'alignment-baseline' and 'dominant-baseline' are not supported in Edge and IE\n    const dy = \"0.6ex\";\n\n    return (\n      <g style={transform ? { transform } : undefined}>\n        {label.title ? <title>{label.title}</title> : undefined}\n        <rect\n          x={rectX}\n          y={rectY}\n          width={width}\n          height={height}\n          style={label.attributes.rect}\n        />\n        <text\n          ref={this.onTextMount}\n          x={x}\n          y={y}\n          dy={dy}\n          textAnchor={textAnchor}\n          style={label.attributes.text}\n        >\n          {label.text.value}\n        </text>\n      </g>\n    );\n  }\n\n  private getLabelRectangle(width: number, height: number): Rect {\n    const { x, y, textAnchor } = this.props;\n\n    let xOffset = 0;\n    if (textAnchor === \"middle\") {\n      xOffset = -width / 2;\n    } else if (textAnchor === \"end\") {\n      xOffset = -width;\n    }\n\n    return {\n      x: x + xOffset,\n      y: y - height / 2,\n      width,\n      height,\n    };\n  }\n\n  private onTextMount = (text: SVGTextElement | undefined) => {\n    this.text = text;\n  };\n\n  componentDidMount() {\n    this.recomputeBounds(this.props);\n  }\n\n  componentWillUnmount() {\n    const { onBoundsUpdate } = this.props;\n    onBoundsUpdate(undefined);\n  }\n\n  componentDidUpdate(_nextProps: LinkLabelProps) {\n    this.shouldUpdateBounds = true;\n  }\n  UNSAFE_componentWillReceiveProps() {\n    this.recomputeBounds(this.props);\n  }\n\n  private recomputeBounds(_props: LinkLabelProps) {\n    if (this.shouldUpdateBounds) {\n      const { onBoundsUpdate } = this.props;\n      this.shouldUpdateBounds = false;\n      const bounds = this.text.getBBox();\n\n      if (onBoundsUpdate) {\n        const labelBounds = this.getLabelRectangle(bounds.width, bounds.height);\n        onBoundsUpdate(labelBounds);\n      }\n\n      this.setState({\n        width: bounds.width,\n        height: bounds.height,\n      });\n    }\n  }\n}\n\nclass VertexTools extends Component<\n  {\n    className: string;\n    model: DiagramLink;\n    vertexIndex: number;\n    vertexRadius: number;\n    x: number;\n    y: number;\n    onRemove: (vertex: LinkVertex) => void;\n  },\n  {}\n> {\n  render() {\n    const { className, vertexRadius, x, y } = this.props;\n    const transform = `translate(${x + 2 * vertexRadius},${\n      y - 2 * vertexRadius\n    })scale(${vertexRadius})`;\n    return (\n      <g\n        className={className}\n        transform={transform}\n        onMouseDown={this.onRemoveVertex}\n      >\n        <title>Remove vertex</title>\n        <circle r={1} />\n        <path\n          d=\"M-0.5,-0.5 L0.5,0.5 M0.5,-0.5 L-0.5,0.5\"\n          strokeWidth={2 / vertexRadius}\n        />\n      </g>\n    );\n  }\n\n  private onRemoveVertex = (e: React.MouseEvent<SVGElement>) => {\n    if (e.button !== 0 /* left button */) {\n      return;\n    }\n    e.preventDefault();\n    e.stopPropagation();\n    const { onRemove, model, vertexIndex } = this.props;\n    onRemove(new LinkVertex(model, vertexIndex));\n  };\n}\n\nexport class LinkMarkers extends Component<{ view: DiagramView }, {}> {\n  private readonly listener = new EventObserver();\n  private readonly delayedUpdate = new Debouncer();\n\n  render() {\n    const { view } = this.props;\n    const markers: ReactElement<LinkMarkerProps>[] = [];\n\n    view.getLinkTemplates().forEach((template, linkTypeId) => {\n      const type = view.model.getLinkType(linkTypeId);\n      if (!type) {\n        return;\n      }\n\n      const typeIndex = type.index;\n      if (template.markerSource) {\n        markers.push(\n          <LinkMarker\n            key={typeIndex * 2}\n            linkTypeIndex={typeIndex}\n            style={template.markerSource}\n            isStartMarker={true}\n          />\n        );\n      }\n      if (template.markerTarget) {\n        markers.push(\n          <LinkMarker\n            key={typeIndex * 2 + 1}\n            linkTypeIndex={typeIndex}\n            style={template.markerTarget}\n            isStartMarker={false}\n          />\n        );\n      }\n    });\n\n    return <defs>{markers}</defs>;\n  }\n\n  componentDidMount() {\n    const { view } = this.props;\n    this.listener.listen(view.events, \"syncUpdate\", ({ layer }) => {\n      if (layer !== RenderingLayer.Link) {\n        return;\n      }\n      this.delayedUpdate.runSynchronously();\n    });\n    this.listener.listen(view.events, \"changeLinkTemplates\", () => {\n      this.delayedUpdate.call(() => this.forceUpdate());\n    });\n  }\n\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.delayedUpdate.dispose();\n  }\n}\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\" as const;\n\ninterface LinkMarkerProps {\n  linkTypeIndex: number;\n  isStartMarker: boolean;\n  style: LinkMarkerStyle;\n}\n\nclass LinkMarker extends Component<LinkMarkerProps, {}> {\n  render() {\n    return <marker ref={this.onMarkerMount}></marker>;\n  }\n\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  private onMarkerMount = (marker: SVGMarkerElement) => {\n    if (!marker) {\n      return;\n    }\n\n    const { linkTypeIndex, isStartMarker, style } = this.props;\n\n    marker.setAttribute(\"id\", linkMarkerKey(linkTypeIndex, isStartMarker));\n    marker.setAttribute(\"markerWidth\", style.width.toString());\n    marker.setAttribute(\"markerHeight\", style.height.toString());\n    marker.setAttribute(\"orient\", \"auto\");\n\n    const xOffset = isStartMarker ? 0 : style.width - 1;\n    marker.setAttribute(\"refX\", xOffset.toString());\n    marker.setAttribute(\"refY\", (style.height / 2).toString());\n    marker.setAttribute(\"markerUnits\", \"userSpaceOnUse\");\n\n    const path = document.createElementNS(SVG_NAMESPACE, \"path\");\n    path.setAttribute(\"d\", style.d);\n    if (style.fill !== undefined) {\n      path.setAttribute(\"fill\", style.fill);\n    }\n    if (style.stroke !== undefined) {\n      path.setAttribute(\"stroke\", style.stroke);\n    }\n    if (style.strokeWidth !== undefined) {\n      path.setAttribute(\"stroke-width\", style.strokeWidth);\n    }\n\n    marker.appendChild(path);\n  };\n}\n","import * as React from \"react\";\nimport { Component, CSSProperties } from \"react\";\n\nimport { Cell, LinkVertex } from \"./elements\";\nimport { ElementLayer } from \"./elementLayer\";\nimport { Vector } from \"./geometry\";\nimport { LinkLayer, LinkMarkers } from \"./linkLayer\";\nimport { DiagramModel } from \"./model\";\nimport { DiagramView } from \"./view\";\n\nexport interface PaperProps {\n  view: DiagramView;\n  paperTransform: PaperTransform;\n  onPointerDown?: (\n    e: React.MouseEvent<HTMLElement>,\n    cell: Cell | undefined\n  ) => void;\n  group?: string;\n  linkLayerWidgets?: React.ReactElement<any>;\n  elementLayerWidgets?: React.ReactElement<any>;\n}\n\nconst CLASS_NAME = \"graph-explorer-paper\";\n\nexport class Paper extends Component<PaperProps, {}> {\n  render() {\n    const {\n      view,\n      group,\n      paperTransform,\n      linkLayerWidgets,\n      elementLayerWidgets,\n    } = this.props;\n    const { width, height, originX, originY, scale, paddingX, paddingY } =\n      paperTransform;\n\n    const scaledWidth = width * scale;\n    const scaledHeight = height * scale;\n    // using padding instead of margin in combination with setting width and height\n    // on .paper element to avoid \"over-constrained\" margins, see an explanation here:\n    // https://stackoverflow.com/questions/11695354\n    const style: CSSProperties = {\n      width: scaledWidth + paddingX,\n      height: scaledHeight + paddingY,\n      marginLeft: paddingX,\n      marginTop: paddingY,\n      paddingRight: paddingX,\n      paddingBottom: paddingY,\n    };\n    const htmlTransformStyle: React.CSSProperties = {\n      position: \"absolute\",\n      left: 0,\n      top: 0,\n      transform: `scale(${scale},${scale})translate(${originX}px,${originY}px)`,\n    };\n\n    return (\n      <div className={CLASS_NAME} style={style} onMouseDown={this.onMouseDown}>\n        <TransformedSvgCanvas\n          className={`${CLASS_NAME}__canvas`}\n          style={{ overflow: \"visible\" }}\n          paperTransform={paperTransform}\n        >\n          <LinkMarkers view={view} />\n          <LinkLayer view={view} links={view.model.links} group={group} />\n        </TransformedSvgCanvas>\n        {linkLayerWidgets}\n        <ElementLayer view={view} group={group} style={htmlTransformStyle} />\n        {elementLayerWidgets}\n      </div>\n    );\n  }\n\n  private onMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n    const { view, onPointerDown } = this.props;\n    const cell =\n      e.target instanceof Element\n        ? findCell(e.target, e.currentTarget, view.model)\n        : undefined;\n    if (onPointerDown) {\n      onPointerDown(e, cell);\n    }\n  };\n}\n\nfunction findCell(\n  bottom: Element,\n  top: Element,\n  model: DiagramModel\n): Cell | undefined {\n  let target: Node = bottom;\n  let vertexIndex: number | undefined;\n  while (true) {\n    if (target instanceof Element) {\n      if (target.hasAttribute(\"data-element-id\")) {\n        return model.getElement(target.getAttribute(\"data-element-id\"));\n      } else if (target.hasAttribute(\"data-link-id\")) {\n        const link = model.getLinkById(target.getAttribute(\"data-link-id\"));\n        return typeof vertexIndex === \"number\"\n          ? new LinkVertex(link, vertexIndex)\n          : link;\n      } else if (target.hasAttribute(\"data-vertex\")) {\n        vertexIndex = Number(target.getAttribute(\"data-vertex\"));\n      }\n    }\n    if (!target || target === top) {\n      break;\n    }\n    target = target.parentNode;\n  }\n  return undefined;\n}\n\nexport interface PaperTransform {\n  width: number;\n  height: number;\n  originX: number;\n  originY: number;\n  scale: number;\n  paddingX: number;\n  paddingY: number;\n}\n\nexport interface TransformedSvgCanvasProps\n  extends React.SVGProps<SVGSVGElement> {\n  paperTransform: PaperTransform;\n}\n\nexport class TransformedSvgCanvas extends Component<\n  TransformedSvgCanvasProps,\n  {}\n> {\n  private static readonly SVG_STYLE: CSSProperties = {\n    position: \"absolute\",\n    top: 0,\n    left: 0,\n  };\n  render() {\n    const { paperTransform, style, children, ...otherProps } = this.props;\n    const { width, height, originX, originY, scale } = paperTransform;\n    const scaledWidth = width * scale;\n    const scaledHeight = height * scale;\n    let svgStyle = TransformedSvgCanvas.SVG_STYLE;\n    if (style) {\n      svgStyle = { ...svgStyle, ...style };\n    }\n    return (\n      <svg\n        width={scaledWidth}\n        height={scaledHeight}\n        style={svgStyle}\n        {...otherProps}\n      >\n        <g\n          transform={`scale(${scale},${scale})translate(${originX},${originY})`}\n        >\n          {children}\n        </g>\n      </svg>\n    );\n  }\n}\n\n/**\n * @returns scrollable pane size in non-scaled pane coords.\n */\nexport function totalPaneSize(pt: PaperTransform): Vector {\n  return {\n    x: pt.width * pt.scale + pt.paddingX * 2,\n    y: pt.height * pt.scale + pt.paddingY * 2,\n  };\n}\n\n/**\n * @returns scrollable pane top-left corner position in non-scaled pane coords.\n */\nexport function paneTopLeft(pt: PaperTransform): Vector {\n  return { x: -pt.paddingX, y: -pt.paddingY };\n}\n\nexport function paneFromPaperCoords(paper: Vector, pt: PaperTransform): Vector {\n  return {\n    x: (paper.x + pt.originX) * pt.scale,\n    y: (paper.y + pt.originY) * pt.scale,\n  };\n}\n\nexport function paperFromPaneCoords(pane: Vector, pt: PaperTransform): Vector {\n  return {\n    x: pane.x / pt.scale - pt.originX,\n    y: pane.y / pt.scale - pt.originY,\n  };\n}\n","/* eslint-disable @typescript-eslint/prefer-for-of */\n\nimport { uniqueId } from \"lodash\";\n\nimport { DiagramModel } from \"../diagram/model\";\nimport { Rect, Vector, boundsOf } from \"../diagram/geometry\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\" as const;\n\nexport interface ToSVGOptions {\n  model: DiagramModel;\n  paper: SVGSVGElement;\n  contentBox: Rect;\n  getOverlayedElement: (id: string) => HTMLElement;\n  preserveDimensions?: boolean;\n  convertImagesToDataUris?: boolean;\n  blacklistedCssAttributes?: string[];\n  elementsToRemoveSelector?: string;\n  mockImages?: boolean;\n  watermarkSvg?: string;\n}\n\ninterface Bounds {\n  width: number;\n  height: number;\n}\n\n/**\n * Padding (in px) for <foreignObject> elements of exported SVG to\n * mitigate issues with elements body overflow caused by missing styles\n * in exported image.\n */\nconst FOREIGN_OBJECT_SIZE_PADDING = 2;\nconst BORDER_PADDING = 100;\n\nexport function toSVG(options: ToSVGOptions): Promise<string> {\n  return exportSVG(options).then((svg) =>\n    new XMLSerializer().serializeToString(svg)\n  );\n}\n\nfunction exportSVG(options: ToSVGOptions): Promise<SVGElement> {\n  const { contentBox: bbox, watermarkSvg } = options;\n  const { svgClone, imageBounds } = clonePaperSvg(\n    options,\n    FOREIGN_OBJECT_SIZE_PADDING\n  );\n\n  const paddedWidth = bbox.width + 2 * BORDER_PADDING;\n  const paddedHeight = bbox.height + 2 * BORDER_PADDING;\n\n  if (options.preserveDimensions) {\n    svgClone.setAttribute(\"width\", paddedWidth.toString());\n    svgClone.setAttribute(\"height\", paddedHeight.toString());\n  } else {\n    svgClone.setAttribute(\"width\", \"100%\");\n    svgClone.setAttribute(\"height\", \"100%\");\n  }\n\n  const viewBox: Rect = {\n    x: bbox.x - BORDER_PADDING,\n    y: bbox.y - BORDER_PADDING,\n    width: paddedWidth,\n    height: paddedHeight,\n  };\n  svgClone.setAttribute(\n    \"viewBox\",\n    `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`\n  );\n\n  addWatermark(svgClone, viewBox, watermarkSvg);\n\n  const images: HTMLImageElement[] = [];\n  const nodes = svgClone.querySelectorAll(\"img\");\n  foreachNode(nodes, (node) => images.push(node));\n\n  const convertingImages = Promise.all(\n    images.map((img) => {\n      const exportKey = img.getAttribute(\"export-key\");\n      img.removeAttribute(\"export-key\");\n      if (exportKey) {\n        const { width, height } = imageBounds[exportKey];\n        img.setAttribute(\"width\", width.toString());\n        img.setAttribute(\"height\", height.toString());\n        if (!options.convertImagesToDataUris) {\n          return Promise.resolve();\n        }\n        return exportAsDataUri(img)\n          .then((dataUri) => {\n            // check for empty svg data URI which happens when mockJointXHR catches an exception\n            if (dataUri && dataUri !== \"data:image/svg+xml,\") {\n              img.src = dataUri;\n            }\n          })\n          .catch((err) => {\n            console.warn(\"Failed to export image: \" + img.src, err);\n          });\n      } else {\n        return Promise.resolve();\n      }\n    })\n  );\n\n  return convertingImages.then(() => {\n    // workaround to include only graph-explorer-related stylesheets\n    const exportedCssText = extractCSSFromDocument(svgClone);\n    // design tokens have to be re-declared on the detached export root,\n    // otherwise the `var(--…)` references in the rules above resolve to nothing\n    const exportedVariables = extractCSSVariables(\n      options.paper.closest(\".graph-explorer\")\n    );\n\n    const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n    defs.innerHTML = `<style>${exportedVariables}\\n${exportedCssText}</style>`;\n    svgClone.insertBefore(defs, svgClone.firstChild);\n\n    if (options.elementsToRemoveSelector) {\n      foreachNode(\n        svgClone.querySelectorAll(options.elementsToRemoveSelector),\n        (node) => node.remove()\n      );\n    }\n\n    return svgClone;\n  });\n}\n\nfunction addWatermark(svg: SVGElement, viewBox: Rect, watermarkSvg: string) {\n  const WATERMARK_CLASS = \"graph-explorer-exported-watermark\";\n  const WATERMARK_MAX_WIDTH = 120;\n  const WATERMARK_PADDING = 20;\n\n  const image = document.createElementNS(SVG_NAMESPACE, \"image\");\n  image.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"href\", watermarkSvg);\n  image.setAttribute(\"class\", WATERMARK_CLASS);\n\n  const width = Math.min(viewBox.width * 0.2, WATERMARK_MAX_WIDTH);\n  const x = viewBox.x + viewBox.width - width - WATERMARK_PADDING;\n  const y = viewBox.y + WATERMARK_PADDING;\n\n  image.setAttribute(\"x\", x.toString());\n  image.setAttribute(\"y\", y.toString());\n  image.setAttribute(\"width\", width.toString());\n  image.setAttribute(\"opacity\", \"0.3\");\n\n  svg.insertBefore(image, svg.firstChild);\n}\n\nfunction _clearAttributes(svg: SVGElement) {\n  const availableIds: Record<string, boolean> = {};\n  const defss = svg.querySelectorAll(\"defs\");\n  foreachNode(defss, (defs) => {\n    foreachNode(defs.childNodes, (def) => {\n      const id = (def as SVGElement).getAttribute(\"id\");\n      if (id) {\n        availableIds[id] = true;\n      }\n    });\n  });\n  const paths = svg.querySelectorAll(\"*\");\n  foreachNode(paths, (path) => {\n    const markerStart = extractId(path.getAttribute(\"marker-start\"));\n    if (markerStart && !availableIds[markerStart]) {\n      path.removeAttribute(\"marker-start\");\n    }\n    const markerEnd = extractId(path.getAttribute(\"marker-end\"));\n    if (markerEnd && !availableIds[markerEnd]) {\n      path.removeAttribute(\"marker-end\");\n    }\n    const filterId = extractId(path.getAttribute(\"filter\"));\n    if (filterId && !availableIds[filterId]) {\n      path.removeAttribute(\"filter\");\n    }\n  });\n\n  function extractId(attributeValue: string) {\n    if (attributeValue) {\n      return (attributeValue.match(/#(.*?)\\)/) || [])[1];\n    }\n    return undefined;\n  }\n}\n\nfunction forEachStyleRule(callback: (rule: CSSStyleRule) => void) {\n  for (let i = 0; i < document.styleSheets.length; i++) {\n    let rules: CSSRuleList;\n    try {\n      const cssSheet = document.styleSheets[i] as CSSStyleSheet;\n      rules = cssSheet.cssRules || cssSheet.rules;\n      if (!rules) {\n        continue;\n      }\n    } catch (_e) {\n      // cross-origin stylesheets cannot be inspected\n      continue;\n    }\n\n    for (let j = 0; j < rules.length; j++) {\n      const rule = rules[j];\n      if (rule instanceof CSSStyleRule) {\n        callback(rule);\n      }\n    }\n  }\n}\n\n/**\n * The exported SVG is detached from the workspace, so CSS custom properties\n * (the design tokens) declared on the workspace root are not in scope and every\n * `var(--…)` reference in the exported rules would resolve to nothing, dropping\n * colours, radii and shadows. Re-declare the resolved values on the exported\n * root so the export matches what is on the canvas.\n */\nfunction extractCSSVariables(source: Element | null | undefined): string {\n  if (!source) {\n    return \"\";\n  }\n  const computed = getComputedStyle(source);\n  const declarations = new Map<string, string>();\n\n  forEachStyleRule((rule) => {\n    for (let i = 0; i < rule.style.length; i++) {\n      const property = rule.style.item(i);\n      if (!property.startsWith(\"--\") || declarations.has(property)) {\n        continue;\n      }\n      const value = computed.getPropertyValue(property).trim();\n      if (value) {\n        declarations.set(property, value);\n      }\n    }\n  });\n\n  if (declarations.size === 0) {\n    return \"\";\n  }\n  const variables = Array.from(\n    declarations,\n    ([name, value]) => `${name}: ${value};`\n  ).join(\" \");\n  return `svg { ${variables} }`;\n}\n\nfunction extractCSSFromDocument(targetSubtree: Element): string {\n  const exportedRules = new Set<CSSStyleRule>();\n  forEachStyleRule((rule) => {\n    try {\n      if (targetSubtree.querySelector(rule.selectorText)) {\n        exportedRules.add(rule);\n      }\n    } catch (_e) {\n      // selectors that are not valid for querySelector (e.g. pseudo-elements)\n      // must not abort the whole export\n    }\n  });\n\n  const exportedCssTexts: string[] = [];\n  exportedRules.forEach((rule) => exportedCssTexts.push(rule.cssText));\n  return exportedCssTexts.join(\"\\n\");\n}\n\nfunction clonePaperSvg(\n  options: ToSVGOptions,\n  elementSizePadding: number\n): {\n  svgClone: SVGSVGElement;\n  imageBounds: Record<string, Bounds>;\n} {\n  const { model, paper, getOverlayedElement } = options;\n  const svgClone = paper.cloneNode(true) as SVGSVGElement;\n  svgClone.removeAttribute(\"class\");\n  svgClone.removeAttribute(\"style\");\n\n  function findViewport() {\n    let child = svgClone.firstChild;\n    while (child) {\n      if (child instanceof SVGGElement) {\n        return child;\n      }\n      child = child.nextSibling;\n    }\n    return undefined;\n  }\n\n  const viewport = findViewport();\n  viewport.removeAttribute(\"transform\");\n\n  const imageBounds: Record<string, Bounds> = {};\n\n  for (const element of model.elements) {\n    const modelId = element.id;\n    const overlayedView = getOverlayedElement(modelId);\n    if (!overlayedView) {\n      continue;\n    }\n\n    const elementRoot = document.createElementNS(SVG_NAMESPACE, \"g\");\n    const overlayedViewContent = overlayedView.firstChild.cloneNode(\n      true\n    ) as HTMLElement;\n    elementRoot.setAttribute(\"class\", \"graph-explorer-exported-element\");\n\n    const newRoot = document.createElementNS(SVG_NAMESPACE, \"foreignObject\");\n    newRoot.appendChild(overlayedViewContent);\n\n    const { x, y, width, height } = boundsOf(element);\n    newRoot.setAttribute(\"transform\", `translate(${x},${y})`);\n    newRoot.setAttribute(\"width\", (width + elementSizePadding).toString());\n    newRoot.setAttribute(\"height\", (height + elementSizePadding).toString());\n\n    elementRoot.appendChild(newRoot);\n    viewport.appendChild(elementRoot);\n\n    const clonedNodes = overlayedViewContent.querySelectorAll(\"img\");\n\n    foreachNode(overlayedView.querySelectorAll(\"img\"), (img, index) => {\n      const exportKey = uniqueId(\"export-key-\");\n      clonedNodes[index].setAttribute(\"export-key\", exportKey);\n      imageBounds[exportKey] = {\n        width: img.clientWidth,\n        height: img.clientHeight,\n      };\n    });\n  }\n\n  return { svgClone, imageBounds };\n}\n\nfunction exportAsDataUri(original: HTMLImageElement): Promise<string> {\n  const url = original.src;\n  if (!url || url.startsWith(\"data:\")) {\n    return Promise.resolve(url);\n  }\n\n  return loadCrossOriginImage(original.src).then((image) => {\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = image.width;\n    canvas.height = image.height;\n\n    const context = canvas.getContext(\"2d\");\n    context.drawImage(image, 0, 0);\n\n    // match extensions like htttp://example.com/images/foo.JPG&w=200\n    const extensionMatch = url.match(/\\.([a-zA-Z0-9]+)[^.a-zA-Z0-9]?[^.]*$/);\n    const extension = extensionMatch ? extensionMatch[1].toLowerCase() : \"png\";\n\n    try {\n      const mimeType = \"image/\" + (extension === \"jpg\" ? \"jpeg\" : extension);\n      const dataUri = canvas.toDataURL(mimeType);\n      return Promise.resolve(dataUri);\n    } catch (_e) {\n      if (extension !== \"svg\") {\n        return Promise.reject(\"Failed to convert image to data URI\");\n      }\n      return fetch(url)\n        .then((response) => response.text())\n        .then((svg) =>\n          svg.length > 0 ? \"data:image/svg+xml,\" + encodeURIComponent(svg) : \"\"\n        );\n    }\n  });\n}\n\nfunction loadCrossOriginImage(src: string): Promise<HTMLImageElement> {\n  const image = new Image();\n  image.crossOrigin = \"anonymous\";\n  const promise = new Promise<HTMLImageElement>((resolve, reject) => {\n    image.onload = () => resolve(image);\n    image.onerror = (ev) => reject(ev);\n  });\n  image.src = src;\n  return promise;\n}\n\nfunction foreachNode<T extends Node>(\n  nodeList: NodeListOf<T>,\n  callback: (node?: T, index?: number) => void\n) {\n  for (let i = 0; i < nodeList.length; i++) {\n    callback(nodeList[i], i);\n  }\n}\n\nexport interface ToDataURLOptions {\n  /** 'image/png' | 'image/jpeg' | ... */\n  mimeType?: string;\n  width?: number;\n  height?: number;\n  /** Background color, transparent by default. */\n  backgroundColor?: string;\n  quality?: number;\n}\n\nconst MAX_CANVAS_LENGTH = 4096;\n\nexport async function toDataURL(\n  options: ToSVGOptions & ToDataURLOptions\n): Promise<string> {\n  const { paper: _paper, mimeType = \"image/png\" } = options;\n  const svgOptions = {\n    ...options,\n    convertImagesToDataUris: true,\n    mockImages: false,\n    preserveDimensions: true,\n  };\n  const svg = await exportSVG(svgOptions);\n  const svgBox: Bounds = {\n    width: Number(svg.getAttribute(\"width\")),\n    height: Number(svg.getAttribute(\"height\")),\n  };\n\n  const containerSize =\n    typeof options.width === \"number\" || typeof options.height === \"number\"\n      ? { width: options.width, height: options.height }\n      : fallbackContainerSize(svgBox);\n\n  const { innerSize, outerSize, offset } = computeAutofit(\n    svgBox,\n    containerSize\n  );\n  svg.setAttribute(\"width\", innerSize.width.toString());\n  svg.setAttribute(\"height\", innerSize.height.toString());\n  const svgString = new XMLSerializer().serializeToString(svg);\n\n  const { canvas, context } = createCanvas(\n    outerSize.width,\n    outerSize.height,\n    options.backgroundColor\n  );\n\n  const image = await loadImage(\n    \"data:image/svg+xml,\" + encodeURIComponent(svgString)\n  );\n  context.drawImage(\n    image,\n    offset.x,\n    offset.y,\n    innerSize.width,\n    innerSize.height\n  );\n  return canvas.toDataURL(mimeType, options.quality);\n\n  function createCanvas(\n    canvasWidth: number,\n    canvasHeight: number,\n    backgroundColor?: string\n  ) {\n    const cnv = document.createElement(\"canvas\");\n    cnv.width = canvasWidth;\n    cnv.height = canvasHeight;\n    const cnt = cnv.getContext(\"2d\");\n    if (backgroundColor) {\n      cnt.fillStyle = backgroundColor;\n      cnt.fillRect(0, 0, canvasWidth, canvasHeight);\n    }\n    return { canvas: cnv, context: cnt };\n  }\n}\n\nexport function loadImage(source: string): Promise<HTMLImageElement> {\n  return new Promise((resolve, reject) => {\n    const image = new Image();\n    image.onload = function () {\n      resolve(image);\n    };\n    image.onerror = function (ev) {\n      reject(ev);\n    };\n    image.src = source;\n  });\n}\n\nfunction computeAutofit(itemSize: Bounds, containerSize: Bounds) {\n  const fit = fitRectKeepingAspectRatio(\n    itemSize.width,\n    itemSize.height,\n    containerSize.width,\n    containerSize.height\n  );\n  const innerSize: Bounds = {\n    width: Math.floor(fit.width),\n    height: Math.floor(fit.height),\n  };\n  const outerSize: Bounds = {\n    width:\n      typeof containerSize.width === \"number\"\n        ? containerSize.width\n        : innerSize.width,\n    height:\n      typeof containerSize.height === \"number\"\n        ? containerSize.height\n        : innerSize.height,\n  };\n  const offset: Vector = {\n    x: Math.round((outerSize.width - innerSize.width) / 2),\n    y: Math.round((outerSize.height - innerSize.height) / 2),\n  };\n  return { innerSize, outerSize, offset };\n}\n\nfunction fallbackContainerSize(itemSize: Bounds): Bounds {\n  const maxResolutionScale = Math.min(\n    MAX_CANVAS_LENGTH / itemSize.width,\n    MAX_CANVAS_LENGTH / itemSize.height\n  );\n  const resolutionScale = Math.min(2.0, maxResolutionScale);\n  const width = Math.floor(itemSize.width * resolutionScale);\n  const height = Math.floor(itemSize.height * resolutionScale);\n  return { width, height };\n}\n\nexport function fitRectKeepingAspectRatio(\n  sourceWidth: number,\n  sourceHeight: number,\n  targetWidth: number | undefined,\n  targetHeight: number | undefined\n): { width: number; height: number } {\n  if (!(typeof targetWidth === \"number\" || typeof targetHeight === \"number\")) {\n    return { width: sourceWidth, height: sourceHeight };\n  }\n  const sourceAspectRatio = sourceWidth / sourceHeight;\n  targetWidth =\n    typeof targetWidth === \"number\"\n      ? targetWidth\n      : targetHeight * sourceAspectRatio;\n  targetHeight =\n    typeof targetHeight === \"number\"\n      ? targetHeight\n      : targetWidth / sourceAspectRatio;\n  if (targetHeight * sourceAspectRatio <= targetWidth) {\n    return { width: targetHeight * sourceAspectRatio, height: targetHeight };\n  } else {\n    return { width: targetWidth, height: targetWidth / sourceAspectRatio };\n  }\n}\n\n/**\n * Creates and returns a blob from a data URL (either base64 encoded or not).\n *\n * @param {string} dataURL The data URL to convert.\n * @return {Blob} A blob representing the array buffer data.\n */\nexport function dataURLToBlob(dataURL: string): Blob {\n  const BASE64_MARKER = \";base64,\";\n  if (dataURL.indexOf(BASE64_MARKER) === -1) {\n    const parts = dataURL.split(\",\");\n    const contentType = parts[0].split(\":\")[1];\n    const raw = decodeURIComponent(parts[1]);\n\n    return new Blob([raw], { type: contentType });\n  } else {\n    const parts = dataURL.split(BASE64_MARKER);\n    const contentType = parts[0].split(\":\")[1];\n    const raw = window.atob(parts[1]);\n    const rawLength = raw.length;\n\n    const uInt8Array = new Uint8Array(rawLength);\n\n    for (let i = 0; i < rawLength; ++i) {\n      uInt8Array[i] = raw.charCodeAt(i);\n    }\n\n    return new Blob([uInt8Array], { type: contentType });\n  }\n}\n","import * as React from \"react\";\n\nimport {\n  Debouncer,\n  Cancellation,\n  animateInterval,\n  delay,\n  easeInOutBezier,\n} from \"../viewUtils/async\";\nimport {\n  EventObserver,\n  Events,\n  EventSource,\n  PropertyChange,\n} from \"../viewUtils/events\";\nimport {\n  ToSVGOptions,\n  ToDataURLOptions,\n  toSVG,\n  toDataURL,\n  fitRectKeepingAspectRatio,\n} from \"../viewUtils/toSvg\";\n\nimport { RestoreGeometry } from \"./commands\";\nimport { Element, Link, Cell, LinkVertex } from \"./elements\";\nimport {\n  Vector,\n  Rect,\n  computePolyline,\n  findNearestSegmentIndex,\n} from \"./geometry\";\nimport { Batch } from \"./history\";\nimport {\n  DiagramView,\n  RenderingLayer,\n  WidgetDescription,\n  WidgetAttachment,\n} from \"./view\";\nimport { Paper, PaperTransform } from \"./paper\";\n\nexport interface PaperAreaProps {\n  view: DiagramView;\n  zoomOptions?: ZoomOptions;\n  hideScrollBars?: boolean;\n  watermarkSvg?: string;\n  watermarkUrl?: string;\n  onDragDrop?: (e: DragEvent, paperPosition: { x: number; y: number }) => void;\n  onZoom?: (scaleX: number, scaleY: number) => void;\n}\n\nexport interface ZoomOptions {\n  min?: number;\n  max?: number;\n  step?: number;\n  /** Used when zooming to fit to limit zoom of small diagrams */\n  maxFit?: number;\n  fitPadding?: number;\n  requireCtrl?: boolean;\n}\n\nexport interface PaperAreaEvents {\n  pointerDown: PointerEvent;\n  pointerMove: PointerEvent;\n  pointerUp: PointerUpEvent;\n  scroll: { source: PaperArea };\n  changeAnimatingGraph: PropertyChange<PaperArea, boolean>;\n}\n\nexport interface PointerEvent {\n  source: PaperArea;\n  sourceEvent: React.MouseEvent<Element> | MouseEvent;\n  target: Cell | undefined;\n  panning: boolean;\n}\n\nexport interface PointerUpEvent extends PointerEvent {\n  triggerAsClick: boolean;\n}\n\nexport interface PaperWidgetProps {\n  paperArea?: PaperArea;\n  paperTransform?: PaperTransform;\n}\n\nexport interface State {\n  readonly paperWidth?: number;\n  readonly paperHeight?: number;\n  readonly originX?: number;\n  readonly originY?: number;\n  readonly scale?: number;\n  readonly paddingX?: number;\n  readonly paddingY?: number;\n  readonly renderedWidgets?: readonly WidgetDescription[];\n}\n\nexport interface PaperAreaContextWrapper {\n  paperArea: PaperAreaContext;\n}\n\nexport interface PaperAreaContext {\n  paperArea: PaperArea;\n  view: DiagramView;\n}\n\nexport const PaperAreaContext =\n  React.createContext<PaperAreaContextWrapper>(null);\n\ninterface PointerMoveState {\n  pointerMoved: boolean;\n  target: Cell | undefined;\n  panning: boolean;\n  origin: {\n    readonly pageX: number;\n    readonly pageY: number;\n  };\n  batch: Batch;\n  restoreGeometry: RestoreGeometry;\n}\n\ninterface ViewportState {\n  /** Center of the viewport in paper coordinates. */\n  readonly center: Vector;\n  readonly scale: Vector;\n}\n\ninterface ViewportAnimation {\n  readonly from: ViewportState;\n  readonly to: ViewportState;\n  readonly cancellation: Cancellation;\n}\n\nexport interface ViewportOptions {\n  /**\n   * True if operation should be animated.\n   * If duration is not provided assumes default one.\n   */\n  animate?: boolean;\n  /**\n   * Animation duration in milliseconds.\n   * Implicitly sets `animate: true` if greater than zero.\n   */\n  duration?: number;\n  /**\n   * Elements to apply layout and zoomToFit operations.\n   * (In other words we narrowing down viewPort to selected elements)\n   */\n  elements?: ReadonlySet<Element>;\n}\n\nexport interface ScaleOptions extends ViewportOptions {\n  pivot?: { x: number; y: number };\n}\n\nconst CLASS_NAME = \"graph-explorer-paper-area\";\nconst DEFAULT_ANIMATION_DURATION = 500;\nconst LEFT_MOUSE_BUTTON = 0;\nconst MIDDLE_MOUSE_BUTTON = 1;\n/** Spacing of the background dot grid, in paper (unscaled) coordinates. */\nconst GRID_STEP = 24;\n\nexport class PaperArea extends React.Component<PaperAreaProps, State> {\n  private readonly listener = new EventObserver();\n  private readonly source = new EventSource<PaperAreaEvents>();\n  readonly events: Events<PaperAreaEvents> = this.source;\n\n  private outer: HTMLDivElement;\n  private area: HTMLDivElement;\n  private widgets: Record<string, WidgetDescription> = {};\n\n  private readonly pageSize = { x: 1500, y: 800 };\n\n  private viewportAnimation: ViewportAnimation | undefined;\n  private cssAnimations = 0;\n\n  private movingState: PointerMoveState | undefined;\n  private panningScrollOrigin: { scrollLeft: number; scrollTop: number };\n  private movingElementOrigin: {\n    pointerX: number;\n    pointerY: number;\n    elementX: number;\n    elementY: number;\n  };\n\n  private delayedPaperAdjust = new Debouncer();\n  private scrollBeforeUpdate:\n    | undefined\n    | {\n        left: number;\n        top: number;\n      };\n\n  private get zoomOptions(): ZoomOptions {\n    const {\n      min = 0.2,\n      max = 2,\n      step = 0.1,\n      maxFit = 1,\n      fitPadding = 20,\n      requireCtrl = true,\n    } = this.props.zoomOptions || {};\n    return { min, max, step, maxFit, fitPadding, requireCtrl };\n  }\n\n  constructor(props: PaperAreaProps, context: any) {\n    super(props, context);\n    this.state = {\n      paperWidth: this.pageSize.x,\n      paperHeight: this.pageSize.y,\n      originX: 0,\n      originY: 0,\n      scale: 1,\n      paddingX: 0,\n      paddingY: 0,\n      renderedWidgets: [],\n    };\n  }\n\n  render() {\n    const { view, watermarkSvg, watermarkUrl } = this.props;\n    const {\n      paperWidth,\n      paperHeight,\n      originX,\n      originY,\n      scale,\n      paddingX,\n      paddingY,\n      renderedWidgets,\n    } = this.state;\n    const paperTransform: PaperTransform = {\n      width: paperWidth,\n      height: paperHeight,\n      originX,\n      originY,\n      scale,\n      paddingX,\n      paddingY,\n    };\n    const widgetProps: PaperWidgetProps = { paperArea: this, paperTransform };\n\n    let areaClass = `${CLASS_NAME}__area`;\n    if (this.props.hideScrollBars) {\n      areaClass += ` ${CLASS_NAME}--hide-scrollbars`;\n    }\n\n    let componentClass = CLASS_NAME;\n    if (this.isAnimatingGraph()) {\n      componentClass += ` ${CLASS_NAME}--animated`;\n    }\n\n    // Anchor the background dot grid to the diagram's coordinate space so it\n    // scales with the zoom level and stays aligned with the content while\n    // panning. Paper origin (0,0) sits at (padding + origin * scale) within the\n    // scrollable content, which is what `background-attachment: local` uses as\n    // its positioning origin.\n    const gridStep = GRID_STEP * scale;\n    const gridStyle: React.CSSProperties = {\n      backgroundSize: `${gridStep}px ${gridStep}px`,\n      backgroundPosition:\n        `${paddingX + originX * scale}px ` +\n        `${paddingY + originY * scale}px`,\n    };\n\n    return (\n      <PaperAreaContext.Provider\n        value={{ paperArea: { paperArea: this, view } }}\n      >\n        <div className={componentClass} ref={this.onOuterMount}>\n          <div\n            className={areaClass}\n            ref={this.onAreaMount}\n            style={gridStyle}\n            onMouseDown={this.onAreaPointerDown}\n          >\n            <Paper\n              view={view}\n              paperTransform={paperTransform}\n              onPointerDown={this.onPaperPointerDown}\n              linkLayerWidgets={\n                <div\n                  className={`${CLASS_NAME}__widgets`}\n                  onMouseDown={this.onWidgetsMouseDown}\n                >\n                  {renderedWidgets\n                    .filter((w) => w.attachment === WidgetAttachment.OverLinks)\n                    .map((widget) =>\n                      React.cloneElement(widget.element, widgetProps)\n                    )}\n                </div>\n              }\n              elementLayerWidgets={\n                <div\n                  className={`${CLASS_NAME}__widgets`}\n                  onMouseDown={this.onWidgetsMouseDown}\n                >\n                  {renderedWidgets\n                    .filter(\n                      (w) => w.attachment === WidgetAttachment.OverElements\n                    )\n                    .map((widget) =>\n                      React.cloneElement(widget.element, widgetProps)\n                    )}\n                </div>\n              }\n            />\n            {watermarkSvg ? (\n              <a href={watermarkUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n                <img\n                  className={`${CLASS_NAME}__watermark`}\n                  src={watermarkSvg}\n                  draggable={false}\n                />\n              </a>\n            ) : null}\n          </div>\n          {renderedWidgets\n            .filter((w) => w.attachment === WidgetAttachment.Viewport)\n            .map((widget) => {\n              return React.cloneElement(widget.element, widgetProps);\n            })}\n        </div>\n      </PaperAreaContext.Provider>\n    );\n  }\n\n  private onOuterMount = (outer: HTMLDivElement) => {\n    this.outer = outer;\n  };\n  private onAreaMount = (area: HTMLDivElement) => {\n    this.area = area;\n  };\n\n  componentDidMount() {\n    this.adjustPaper(() => this.centerTo());\n\n    const { view } = this.props;\n    const delayedAdjust = () => this.delayedPaperAdjust.call(this.adjustPaper);\n    this.listener.listen(view.model.events, \"changeCells\", delayedAdjust);\n    this.listener.listen(view.model.events, \"elementEvent\", ({ data }) => {\n      if (data.changePosition || data.changeSize) {\n        delayedAdjust();\n      }\n    });\n    this.listener.listen(view.model.events, \"linkEvent\", ({ data }) => {\n      if (data.changeVertices) {\n        delayedAdjust();\n      }\n    });\n    this.listener.listen(view.events, \"syncUpdate\", ({ layer }) => {\n      if (layer !== RenderingLayer.PaperArea) {\n        return;\n      }\n      this.delayedPaperAdjust.runSynchronously();\n    });\n    this.listener.listen(view.events, \"updateWidgets\", ({ widgets }) => {\n      this.updateWidgets(widgets);\n    });\n\n    this.area.addEventListener(\"dragover\", this.onDragOver);\n    this.area.addEventListener(\"drop\", this.onDragDrop);\n    this.area.addEventListener(\"scroll\", this.onScroll);\n    this.area.addEventListener(\"wheel\", this.onWheel, { passive: false });\n  }\n\n  componentDidUpdate(prevProps: PaperAreaProps, prevState: State) {\n    if (this.scrollBeforeUpdate) {\n      const { scale, originX, originY, paddingX, paddingY } = this.state;\n      const scrollX =\n        (originX - prevState.originX) * scale + (paddingX - prevState.paddingX);\n      const scrollY =\n        (originY - prevState.originY) * scale + (paddingY - prevState.paddingY);\n\n      const scrollLeft = this.scrollBeforeUpdate.left + scrollX;\n      const scrollTop = this.scrollBeforeUpdate.top + scrollY;\n\n      this.area.scrollLeft = scrollLeft;\n      this.area.scrollTop = scrollTop;\n\n      this.scrollBeforeUpdate = undefined;\n    }\n  }\n\n  componentWillUnmount() {\n    this.stopListeningToPointerMove();\n    this.listener.stopListening();\n    this.area.removeEventListener(\"dragover\", this.onDragOver);\n    this.area.removeEventListener(\"drop\", this.onDragDrop);\n    this.area.removeEventListener(\"scroll\", this.onScroll);\n    this.area.removeEventListener(\"wheel\", this.onWheel);\n  }\n\n  private updateWidgets(update: Record<string, WidgetDescription>) {\n    this.widgets = { ...this.widgets, ...update };\n    const renderedWidgets = Object.keys(this.widgets)\n      .filter((key) => this.widgets[key])\n      .map((key) => {\n        const widget = this.widgets[key];\n        const element = React.cloneElement(widget.element, { key });\n        return { ...widget, element };\n      });\n    this.setState({ renderedWidgets });\n  }\n\n  private onWidgetsMouseDown = (e: React.MouseEvent<any>) => {\n    // prevent PaperArea from generating click on a blank area\n    e.stopPropagation();\n  };\n\n  pageToPaperCoords(pageX: number, pageY: number) {\n    const { left, top } = this.area.getBoundingClientRect();\n    return this.clientToPaperCoords(\n      pageX - (left + window.pageXOffset),\n      pageY - (top + window.pageYOffset)\n    );\n  }\n\n  clientToPaperCoords(areaClientX: number, areaClientY: number) {\n    const { x: paneX, y: paneY } = this.clientToScrollablePaneCoords(\n      areaClientX,\n      areaClientY\n    );\n    return this.scrollablePaneToPaperCoords(paneX, paneY);\n  }\n\n  clientToScrollablePaneCoords(areaClientX: number, areaClientY: number) {\n    const { paddingX, paddingY } = this.state;\n    const paneX = areaClientX + this.area.scrollLeft - paddingX;\n    const paneY = areaClientY + this.area.scrollTop - paddingY;\n    return { x: paneX, y: paneY };\n  }\n\n  scrollablePaneToPaperCoords(paneX: number, paneY: number) {\n    const { scale, originX, originY } = this.state;\n    const paperX = paneX / scale - originX;\n    const paperY = paneY / scale - originY;\n    return { x: paperX, y: paperY };\n  }\n\n  paperToScrollablePaneCoords(paperX: number, paperY: number) {\n    const { scale, originX, originY } = this.state;\n    const paneX = (paperX + originX) * scale;\n    const paneY = (paperY + originY) * scale;\n    return { x: paneX, y: paneY };\n  }\n\n  /** Returns bounding box of paper content in paper coordinates. */\n  getContentFittingBox() {\n    const { elements, links } = this.props.view.model;\n    return getContentFittingBox(elements, links);\n  }\n\n  /** Returns paper size in paper coordinates. */\n  getPaperSize(): { width: number; height: number } {\n    const { paperWidth: width, paperHeight: height, scale } = this.state;\n    return { width: width / scale, height: height / scale };\n  }\n\n  getAreaMetrics() {\n    const { clientWidth, clientHeight, offsetWidth, offsetHeight } = this.area;\n    return { clientWidth, clientHeight, offsetWidth, offsetHeight };\n  }\n\n  private computeAdjustedBox(): Partial<State> {\n    // bbox in paper coordinates\n    const bbox = this.getContentFittingBox();\n    const bboxLeft = bbox.x;\n    const bboxTop = bbox.y;\n    const bboxRight = bbox.x + bbox.width;\n    const bboxBottom = bbox.y + bbox.height;\n\n    const { x: gridWidth, y: gridHeight } = this.pageSize;\n\n    // bbox in integer grid coordinates (open-closed intervals)\n    const bboxGrid = {\n      left: Math.floor(bboxLeft / gridWidth),\n      top: Math.floor(bboxTop / gridHeight),\n      right: Math.ceil(bboxRight / gridWidth),\n      bottom: Math.ceil(bboxBottom / gridHeight),\n    };\n\n    // const oldOrigin = this.paper.options.origin;\n    const originX = -bboxGrid.left * gridWidth;\n    const originY = -bboxGrid.top * gridHeight;\n\n    const paperWidth = Math.max(bboxGrid.right - bboxGrid.left, 1) * gridWidth;\n    const paperHeight =\n      Math.max(bboxGrid.bottom - bboxGrid.top, 1) * gridHeight;\n\n    return { paperWidth, paperHeight, originX, originY };\n  }\n\n  private adjustPaper = (callback?: () => void) => {\n    const { clientWidth, clientHeight } = this.area;\n    const adjusted: Partial<State> = {\n      ...this.computeAdjustedBox(),\n      paddingX: Math.ceil(clientWidth),\n      paddingY: Math.ceil(clientHeight),\n    };\n    const previous = this.state;\n    const samePaperProps =\n      adjusted.paperWidth === previous.paperWidth &&\n      adjusted.paperHeight === previous.paperHeight &&\n      adjusted.originX === previous.originX &&\n      adjusted.originY === previous.originY &&\n      adjusted.paddingX === previous.paddingX &&\n      adjusted.paddingY === previous.paddingY;\n    if (!samePaperProps) {\n      this.scrollBeforeUpdate = {\n        left: this.area.scrollLeft,\n        top: this.area.scrollTop,\n      };\n      this.setState(adjusted, callback);\n    } else if (callback) {\n      callback();\n    }\n  };\n\n  private shouldStartZooming(e: MouseEvent | React.MouseEvent<any>) {\n    return (\n      (Boolean(e.ctrlKey) && Boolean(this.zoomOptions.requireCtrl)) ||\n      !this.zoomOptions.requireCtrl\n    );\n  }\n\n  private shouldStartPanning(e: MouseEvent | React.MouseEvent<any>) {\n    // middle mouse button always pans, from anywhere on the canvas\n    if (e.button === MIDDLE_MOUSE_BUTTON) {\n      return true;\n    }\n    const modifierPressed = e.ctrlKey || e.shiftKey || e.altKey;\n    return e.button === LEFT_MOUSE_BUTTON && !modifierPressed;\n  }\n\n  private onPaperPointerDown = (\n    e: React.MouseEvent<HTMLElement>,\n    cell: Cell | undefined\n  ) => {\n    if (this.movingState) {\n      return;\n    }\n\n    const restore = RestoreGeometry.capture(this.props.view.model);\n    const batch = this.props.view.model.history.startBatch(restore.title);\n\n    if (cell && e.button === LEFT_MOUSE_BUTTON) {\n      if (cell instanceof Element) {\n        e.preventDefault();\n        this.startMoving(e, cell);\n        this.listenToPointerMove(e, cell, batch, restore);\n      } else {\n        e.preventDefault();\n        this.listenToPointerMove(e, cell, batch, restore);\n      }\n    } else {\n      e.preventDefault();\n      this.listenToPointerMove(e, undefined, batch, restore);\n    }\n  };\n\n  private onAreaPointerDown = (e: React.MouseEvent<HTMLDivElement>) => {\n    if (e.target === this.area) {\n      this.onPaperPointerDown(e, undefined);\n    }\n  };\n\n  private startMoving(e: React.MouseEvent<HTMLElement>, element: Element) {\n    const { x: pointerX, y: pointerY } = this.pageToPaperCoords(\n      e.pageX,\n      e.pageY\n    );\n    const { x: elementX, y: elementY } = element.position;\n    this.movingElementOrigin = { pointerX, pointerY, elementX, elementY };\n  }\n\n  private startPanning(_event: React.MouseEvent<any>) {\n    const { scrollLeft, scrollTop } = this.area;\n    this.panningScrollOrigin = { scrollLeft, scrollTop };\n    this.clearTextSelectionInArea();\n  }\n\n  /** Clears accidental text selection in the diagram area. */\n  private clearTextSelectionInArea() {\n    if (document.getSelection) {\n      const selection = document.getSelection();\n      if (selection.removeAllRanges) {\n        selection.removeAllRanges();\n      }\n    }\n  }\n\n  private generateLinkVertex(link: Link, location: Vector): LinkVertex {\n    const previous = link.vertices;\n    const vertices = previous ? [...previous] : [];\n    const model = this.props.view.model;\n    const polyline = computePolyline(\n      model.getElement(link.sourceId),\n      model.getElement(link.targetId),\n      vertices\n    );\n    const segmentIndex = findNearestSegmentIndex(polyline, location);\n    return new LinkVertex(link, segmentIndex);\n  }\n\n  private listenToPointerMove(\n    event: React.MouseEvent<any>,\n    cell: Cell | undefined,\n    batch: Batch,\n    restoreGeometry: RestoreGeometry\n  ) {\n    if (this.movingState) {\n      return;\n    }\n    const panning = cell === undefined && this.shouldStartPanning(event);\n    if (panning) {\n      this.startPanning(event);\n    }\n    const { pageX, pageY } = event;\n    this.movingState = {\n      origin: { pageX, pageY },\n      target: cell,\n      panning,\n      pointerMoved: false,\n      batch,\n      restoreGeometry,\n    };\n    document.addEventListener(\"mousemove\", this.onPointerMove);\n    document.addEventListener(\"mouseup\", this.stopListeningToPointerMove);\n    this.source.trigger(\"pointerDown\", {\n      source: this,\n      sourceEvent: event,\n      target: cell,\n      panning,\n    });\n  }\n\n  private onPointerMove = (e: MouseEvent) => {\n    if (!this.movingState || this.scrollBeforeUpdate) {\n      return;\n    }\n\n    const { origin, target, panning } = this.movingState;\n    const pageOffsetX = e.pageX - origin.pageX;\n    const pageOffsetY = e.pageY - origin.pageY;\n    if (Math.abs(pageOffsetX) >= 1 && Math.abs(pageOffsetY) >= 1) {\n      this.movingState.pointerMoved = true;\n    }\n\n    if (typeof target === \"undefined\") {\n      if (panning) {\n        this.area.scrollLeft =\n          this.panningScrollOrigin.scrollLeft - pageOffsetX;\n        this.area.scrollTop = this.panningScrollOrigin.scrollTop - pageOffsetY;\n      }\n      this.source.trigger(\"pointerMove\", {\n        source: this,\n        sourceEvent: e,\n        target,\n        panning,\n      });\n    } else if (target instanceof Element) {\n      const { x, y } = this.pageToPaperCoords(e.pageX, e.pageY);\n      const { pointerX, pointerY, elementX, elementY } =\n        this.movingElementOrigin;\n      target.setPosition({\n        x: elementX + x - pointerX,\n        y: elementY + y - pointerY,\n      });\n      this.source.trigger(\"pointerMove\", {\n        source: this,\n        sourceEvent: e,\n        target,\n        panning,\n      });\n      this.props.view.performSyncUpdate();\n    } else if (target instanceof Link) {\n      const location = this.pageToPaperCoords(e.pageX, e.pageY);\n      const linkVertex = this.generateLinkVertex(target, location);\n      linkVertex.createAt(location);\n      this.movingState.target = linkVertex;\n    } else if (target instanceof LinkVertex) {\n      const location = this.pageToPaperCoords(e.pageX, e.pageY);\n      target.moveTo(location);\n      this.source.trigger(\"pointerMove\", {\n        source: this,\n        sourceEvent: e,\n        target,\n        panning,\n      });\n      this.props.view.performSyncUpdate();\n    }\n  };\n\n  private stopListeningToPointerMove = (e?: MouseEvent) => {\n    const movingState = this.movingState;\n    this.movingState = undefined;\n\n    if (movingState) {\n      document.removeEventListener(\"mousemove\", this.onPointerMove);\n      document.removeEventListener(\"mouseup\", this.stopListeningToPointerMove);\n    }\n\n    if (e && movingState) {\n      const { pointerMoved, target, batch, restoreGeometry } = movingState;\n      this.source.trigger(\"pointerUp\", {\n        source: this,\n        sourceEvent: e,\n        target,\n        panning: movingState.panning,\n        triggerAsClick: !pointerMoved,\n      });\n\n      const restore = restoreGeometry.filterOutUnchanged();\n      if (restore.hasChanges()) {\n        batch.history.registerToUndo(restore);\n      }\n      batch.store();\n    }\n  };\n\n  private onWheel = (e: WheelEvent) => {\n    if (this.shouldStartZooming(e)) {\n      e.preventDefault();\n      const delta = Math.max(-1, Math.min(1, e.deltaY || e.deltaX));\n      const pivot = this.pageToPaperCoords(e.pageX, e.pageY);\n      this.zoomBy(-delta * 0.1, { pivot });\n    }\n  };\n\n  centerTo(\n    paperPosition?: { x: number; y: number },\n    options: ViewportOptions = {}\n  ): Promise<void> {\n    const { paperWidth, paperHeight } = this.state;\n    const paperCenter = paperPosition || {\n      x: paperWidth / 2,\n      y: paperHeight / 2,\n    };\n    const viewportState: Partial<ViewportState> = {\n      center: paperCenter,\n    };\n    return this.setViewportState(viewportState, options);\n  }\n\n  centerContent(options: ViewportOptions = {}): Promise<void> {\n    const bbox = this.getContentFittingBox();\n    return this.centerTo(\n      {\n        x: bbox.x + bbox.width / 2,\n        y: bbox.y + bbox.height / 2,\n      },\n      options\n    );\n  }\n\n  getScale() {\n    return this.state.scale;\n  }\n\n  setScale(value: number, options?: ScaleOptions): Promise<void> {\n    let scale = value;\n\n    const { min, max } = this.zoomOptions;\n    scale = Math.max(scale, min);\n    scale = Math.min(scale, max);\n\n    let viewportState: Partial<ViewportState>;\n    if (options && options.pivot) {\n      const { x, y } = options.pivot;\n      const paperCenter = this.clientToPaperCoords(\n        this.area.clientWidth / 2,\n        this.area.clientHeight / 2\n      );\n      const previousScale = this.state.scale;\n      const scaledBy = scale / previousScale;\n      viewportState = {\n        center: {\n          x: x - (x - paperCenter.x) / scaledBy,\n          y: y - (y - paperCenter.y) / scaledBy,\n        },\n        scale: { x: scale, y: scale },\n      };\n    } else {\n      viewportState = {\n        scale: { x: scale, y: scale },\n      };\n    }\n    return this.setViewportState(viewportState, options);\n  }\n\n  zoomBy(value: number, options?: ScaleOptions) {\n    return this.setScale(this.getScale() + value, options);\n  }\n\n  zoomIn(scaleOptions?: ScaleOptions) {\n    return this.zoomBy(this.zoomOptions.step, scaleOptions);\n  }\n\n  zoomOut(scaleOptions?: ScaleOptions) {\n    return this.zoomBy(-this.zoomOptions.step, scaleOptions);\n  }\n\n  zoomToFit(options: ViewportOptions = {}): Promise<void> {\n    if (options.elements && options.elements.size === 0) {\n      return;\n    }\n    if (this.props.view.model.elements.length === 0) {\n      return this.centerTo();\n    }\n\n    let elements: readonly Element[];\n    if (options.elements) {\n      const selectionElements: Element[] = [];\n      options.elements.forEach((el) => selectionElements.push(el));\n      elements = selectionElements;\n    } else {\n      elements = this.props.view.model.elements;\n    }\n    const bbox = getContentFittingBox(elements, []);\n    return this.zoomToFitRect(bbox, options);\n  }\n\n  zoomToFitRect(bbox: Rect, options: ViewportOptions = {}) {\n    const { clientWidth, clientHeight } = this.area;\n\n    if (bbox.width === 0) {\n      return;\n    }\n\n    const { width } = fitRectKeepingAspectRatio(\n      bbox.width,\n      bbox.height,\n      clientWidth,\n      clientHeight\n    );\n\n    let scale = width / bbox.width;\n    const { min, maxFit } = this.zoomOptions;\n    scale = Math.max(scale, min);\n    scale = Math.min(scale, maxFit);\n\n    const center = {\n      x: bbox.x + bbox.width / 2,\n      y: bbox.y + bbox.height / 2,\n    };\n\n    const viewPortState: ViewportState = {\n      center,\n      scale: { x: scale, y: scale },\n    };\n\n    return this.setViewportState(viewPortState, options);\n  }\n\n  private onDragOver = (e: DragEvent) => {\n    // Necessary. Allows us to drop.\n    if (e.preventDefault) {\n      e.preventDefault();\n    }\n    e.dataTransfer.dropEffect = \"move\";\n    const { x: _x, y: _y } = clientCoordsFor(this.area, e);\n    return false;\n  };\n\n  private onDragDrop = (e: DragEvent) => {\n    if (this.props.onDragDrop) {\n      const { x, y } = clientCoordsFor(this.area, e);\n      const paperPosition = this.clientToPaperCoords(x, y);\n      this.props.onDragDrop(e, paperPosition);\n    }\n  };\n\n  private onScroll = () => {\n    this.source.trigger(\"scroll\", { source: this });\n  };\n\n  private makeToSVGOptions(): ToSVGOptions {\n    const svg = this.area.querySelector(\".graph-explorer-paper__canvas\");\n    if (!svg) {\n      throw new Error(\"Cannot find SVG canvas to export\");\n    }\n    return {\n      model: this.props.view.model,\n      paper: svg as SVGSVGElement,\n      contentBox: this.getContentFittingBox(),\n      getOverlayedElement: (id) =>\n        this.area.querySelector(`[data-element-id='${id}']`) as HTMLElement,\n      preserveDimensions: true,\n      convertImagesToDataUris: true,\n      elementsToRemoveSelector: \".graph-explorer-link__vertex-tools\",\n      watermarkSvg: this.props.watermarkSvg,\n    };\n  }\n\n  exportSVG(): Promise<string> {\n    return toSVG(this.makeToSVGOptions());\n  }\n\n  exportPNG(options: ToDataURLOptions): Promise<string> {\n    return toDataURL({ ...options, ...this.makeToSVGOptions() });\n  }\n\n  isAnimatingGraph(): boolean {\n    return this.cssAnimations > 0;\n  }\n\n  /**\n   * Starts animation for graph elements and links.\n   *\n   * @param setupChanges immediately called function to perform animatable changes on graph\n   * @param duration animation duration in milliseconds (requires custom CSS to override)\n   * @returns promise which resolves when this animation ends\n   */\n  animateGraph(setupChanges: () => void, duration?: number): Promise<void> {\n    this.changeGraphAnimationCount(+1);\n    setupChanges();\n\n    const timeout =\n      typeof duration === \"number\" ? duration : DEFAULT_ANIMATION_DURATION;\n    return delay(timeout).then(() => this.onGraphAnimationEnd());\n  }\n\n  private onGraphAnimationEnd() {\n    this.changeGraphAnimationCount(-1);\n  }\n\n  private changeGraphAnimationCount(change: number) {\n    const newValue = this.cssAnimations + change;\n    if (newValue < 0) {\n      return;\n    }\n\n    const previous = this.isAnimatingGraph();\n    this.cssAnimations = newValue;\n\n    const current = this.isAnimatingGraph();\n    if (previous !== current) {\n      this.forceUpdate();\n      this.source.trigger(\"changeAnimatingGraph\", { source: this, previous });\n    }\n  }\n\n  private get viewportState(): ViewportState {\n    const { clientWidth, clientHeight } = this.area;\n    const { originX, originY, paddingX, paddingY, scale } = this.state;\n\n    const scrollCenterX = this.area.scrollLeft + clientWidth / 2 - paddingX;\n    const scrollCenterY = this.area.scrollTop + clientHeight / 2 - paddingY;\n    const paperCenter = {\n      x: scrollCenterX / scale - originX,\n      y: scrollCenterY / scale - originY,\n    };\n\n    return {\n      center: paperCenter,\n      scale: {\n        x: scale,\n        y: scale,\n      },\n    };\n  }\n\n  private setViewportState(\n    state: Partial<ViewportState>,\n    options?: ViewportOptions\n  ): Promise<void> {\n    if (this.viewportAnimation) {\n      this.viewportAnimation.cancellation.abort();\n    }\n    const from = this.viewportState;\n    const to = { ...from, ...state };\n    const animate = options && (options.animate || options.duration > 0);\n    if (animate) {\n      const viewportAnimation: ViewportAnimation = {\n        from,\n        to,\n        cancellation: new Cancellation(),\n      };\n      const durationMs =\n        typeof options.duration === \"number\"\n          ? options.duration\n          : DEFAULT_ANIMATION_DURATION;\n\n      const awaitPromise = animateInterval(\n        durationMs,\n        (progress) => {\n          const t = easeInOutBezier(progress);\n          const computed: ViewportState = {\n            center: {\n              x: from.center.x + (to.center.x - from.center.x) * t,\n              y: from.center.y + (to.center.y - from.center.y) * t,\n            },\n            scale: {\n              x: from.scale.x + (to.scale.x - from.scale.x) * t,\n              y: from.scale.y + (to.scale.y - from.scale.y) * t,\n            },\n          };\n          this.applyViewportState(computed);\n        },\n        viewportAnimation.cancellation\n      );\n\n      this.viewportAnimation = viewportAnimation;\n      return awaitPromise.then(() => {\n        this.viewportAnimation = undefined;\n      });\n    } else {\n      this.applyViewportState(to);\n      return Promise.resolve();\n    }\n  }\n\n  applyViewportState = (targetState: ViewportState) => {\n    const scale = targetState.scale.x;\n    const paperCenter = targetState.center;\n\n    this.setState({ scale }, () => {\n      const { originX, originY, paddingX, paddingY } = this.state;\n      const scrollCenterX = (paperCenter.x + originX) * scale;\n      const scrollCenterY = (paperCenter.y + originY) * scale;\n      const { clientWidth, clientHeight } = this.area;\n\n      this.area.scrollLeft = scrollCenterX - clientWidth / 2 + paddingX;\n      this.area.scrollTop = scrollCenterY - clientHeight / 2 + paddingY;\n\n      if (this.props.onZoom) {\n        this.props.onZoom(scale, scale);\n      }\n    });\n  };\n}\n\nfunction clientCoordsFor(container: HTMLElement, e: MouseEvent) {\n  const target =\n    e.target instanceof SVGElement && e.target.ownerSVGElement !== null\n      ? e.target.ownerSVGElement\n      : (e.target as HTMLElement);\n  const targetBox = target.getBoundingClientRect();\n  const containerBox = container.getBoundingClientRect();\n  return {\n    x: e.offsetX + (targetBox.left - containerBox.left),\n    y: e.offsetY + (targetBox.top - containerBox.top),\n  };\n}\n\nexport function getContentFittingBox(\n  elements: readonly Element[],\n  links: readonly Link[]\n): { x: number; y: number; width: number; height: number } {\n  let minX = Infinity,\n    minY = Infinity;\n  let maxX = -Infinity,\n    maxY = -Infinity;\n\n  for (const element of elements) {\n    const { x, y } = element.position;\n    const size = element.size;\n    minX = Math.min(minX, x);\n    minY = Math.min(minY, y);\n    maxX = Math.max(maxX, x + size.width);\n    maxY = Math.max(maxY, y + size.height);\n  }\n\n  for (const link of links) {\n    const vertices = link.vertices || [];\n    for (const { x, y } of vertices) {\n      minX = Math.min(minX, x);\n      minY = Math.min(minY, y);\n      maxX = Math.max(maxX, x);\n      maxY = Math.max(maxY, y);\n    }\n  }\n\n  return {\n    x: Number.isFinite(minX) ? minX : 0,\n    y: Number.isFinite(minY) ? minY : 0,\n    width: Number.isFinite(minX) && Number.isFinite(maxX) ? maxX - minX : 0,\n    height: Number.isFinite(minY) && Number.isFinite(maxY) ? maxY - minY : 0,\n  };\n}\n","import * as React from \"react\";\n\nimport { Paper, PaperTransform } from \"./paper\";\nimport { PaperAreaContext, PaperAreaContextWrapper } from \"./paperArea\";\nimport { Element, Cell } from \"./elements\";\nimport { ElementContext, ElementContextWrapper } from \"./elementLayer\";\nimport { EventObserver } from \"../viewUtils/events\";\n\nimport { Vector, Rect } from \"./geometry\";\nimport { getContentFittingBox } from \"./paperArea\";\n\nexport interface State {\n  paperWidth?: number;\n  paperHeight?: number;\n  offsetX?: number;\n  offsetY?: number;\n}\n\ninterface EmbeddedLayerProps {\n  context: ElementContextWrapper & PaperAreaContextWrapper;\n}\n\nclass EmbeddedLayerInner extends React.Component<EmbeddedLayerProps, State> {\n  private readonly listener = new EventObserver();\n  private nestedElementListener = new EventObserver();\n\n  private layerOffsetLeft = 0;\n  private layerOffsetTop = 0;\n\n  private isApplyingParentMove = false;\n  private isNestedElementMoving = false;\n  private previousPositions: { id: string; position: Vector }[] = [];\n\n  constructor(props: EmbeddedLayerProps) {\n    super(props);\n    this.state = { paperWidth: 0, paperHeight: 0, offsetX: 0, offsetY: 0 };\n  }\n\n  componentDidMount() {\n    const { element } = this.props.context.graphExplorerElement;\n    const { paperArea, view } = this.props.context.paperArea;\n\n    this.listener.listen(\n      view.model.events,\n      \"changeGroupContent\",\n      ({ group }) => {\n        if (group === element.id) {\n          this.listenNestedElements(this.getNestedElements());\n          const { offsetX, offsetY } = this.getOffset();\n          this.moveNestedElements(offsetX, offsetY);\n        }\n      }\n    );\n\n    this.listener.listen(element.events, \"changePosition\", () => {\n      if (this.isNestedElementMoving) {\n        return;\n      }\n\n      const { offsetX, offsetY } = this.getOffset();\n      const { x, y } = this.getContentFittingBox();\n\n      const diffX = offsetX - x;\n      const diffY = offsetY - y;\n      this.moveNestedElements(diffX, diffY);\n\n      this.setState({ offsetX, offsetY });\n    });\n\n    this.listener.listen(paperArea.events, \"pointerUp\", (_e) => {\n      this.isNestedElementMoving = false;\n    });\n\n    const nestedElements = this.getNestedElements();\n    this.listenNestedElements(nestedElements);\n\n    if (nestedElements.length > 0) {\n      const {\n        x: offsetX,\n        y: offsetY,\n        width: paperWidth,\n        height: paperHeight,\n      } = this.getContentFittingBox();\n      this.setState({ offsetX, offsetY, paperWidth, paperHeight }, () =>\n        element.redraw()\n      );\n    } else {\n      element.requestGroupContent();\n    }\n  }\n\n  private listenNestedElements(nestedElements: readonly Element[]) {\n    const listener = new EventObserver();\n    for (const nestedElement of nestedElements) {\n      listener.listen(\n        nestedElement.events,\n        \"changePosition\",\n        this.recomputeSelfBounds\n      );\n      listener.listen(\n        nestedElement.events,\n        \"changeSize\",\n        this.recomputeSelfBounds\n      );\n    }\n    this.nestedElementListener.stopListening();\n    this.nestedElementListener = listener;\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.nestedElementListener.stopListening();\n    this.removeElements();\n    this.setState({ paperWidth: 0, paperHeight: 0, offsetX: 0, offsetY: 0 });\n  }\n\n  private getNestedElements() {\n    const { element } = this.props.context.graphExplorerElement;\n    const { view } = this.props.context.paperArea;\n    return view.model.elements.filter((el) => el.group === element.id);\n  }\n\n  private getContentFittingBox(): Rect {\n    const nestedElements = this.getNestedElements();\n    return getContentFittingBox(nestedElements, []);\n  }\n\n  private removeElements() {\n    const { view } = this.props.context.paperArea;\n    const batch = view.model.history.startBatch();\n    for (const element of this.getNestedElements()) {\n      view.model.removeElement(element.id);\n    }\n    batch.discard();\n  }\n\n  private getOffset(): { offsetX: number; offsetY: number } {\n    const { element } = this.props.context.graphExplorerElement;\n    const { x: elementX, y: elementY } = element.position;\n\n    const offsetX = elementX + this.layerOffsetLeft;\n    const offsetY = elementY + this.layerOffsetTop;\n\n    return { offsetX, offsetY };\n  }\n\n  private moveNestedElements = (offsetX: number, offsetY: number) => {\n    this.isApplyingParentMove = true;\n    try {\n      for (const element of this.getNestedElements()) {\n        const { x, y } = element.position;\n        const newPosition = { x: x + offsetX, y: y + offsetY };\n        element.setPosition(newPosition);\n      }\n    } finally {\n      this.isApplyingParentMove = false;\n      this.recomputeSelfBounds();\n    }\n  };\n\n  private recomputeSelfBounds = () => {\n    if (this.isApplyingParentMove) {\n      return;\n    }\n\n    const { element } = this.props.context.graphExplorerElement;\n    const {\n      x: offsetX,\n      y: offsetY,\n      width: paperWidth,\n      height: paperHeight,\n    } = this.getContentFittingBox();\n\n    if (this.isNestedElementMoving) {\n      const position = {\n        x: offsetX - this.layerOffsetLeft,\n        y: offsetY - this.layerOffsetTop,\n      };\n      element.setPosition(position);\n    }\n\n    this.setState({ offsetX, offsetY, paperWidth, paperHeight }, () =>\n      element.redraw()\n    );\n  };\n\n  private onPaperPointerDown = (\n    e: React.MouseEvent<HTMLElement>,\n    cell: Cell | undefined\n  ) => {\n    if (e.button !== 0 /* left mouse button */) {\n      return;\n    }\n\n    if (cell && cell instanceof Element) {\n      e.preventDefault();\n      this.isNestedElementMoving = true;\n    }\n  };\n\n  private calculateOffset(layer: HTMLElement): { left: number; top: number } {\n    const { paperArea } = this.props.context.paperArea;\n    const scale = paperArea.getScale();\n    const parent = findParentElement(layer);\n    const { left, top } = layer.getBoundingClientRect();\n    const { left: parentLeft, top: parentTop } = parent.getBoundingClientRect();\n\n    return {\n      left: (left - parentLeft) / scale,\n      top: (top - parentTop) / scale,\n    };\n  }\n\n  private onLayerInit = (layer: HTMLElement) => {\n    if (!layer) {\n      return;\n    }\n\n    const { left, top } = this.calculateOffset(layer);\n\n    this.layerOffsetLeft = left;\n    this.layerOffsetTop = top;\n  };\n\n  render() {\n    const { element } = this.props.context.graphExplorerElement;\n    const { view } = this.props.context.paperArea;\n    const { paperWidth, paperHeight, offsetX, offsetY } = this.state;\n\n    const paperTransform: PaperTransform = {\n      width: paperWidth,\n      height: paperHeight,\n      originX: -offsetX,\n      originY: -offsetY,\n      scale: 1,\n      paddingX: 0,\n      paddingY: 0,\n    };\n\n    return (\n      <div className=\"graph-explorer-embedded-layer\" ref={this.onLayerInit}>\n        <Paper\n          view={view}\n          paperTransform={paperTransform}\n          onPointerDown={this.onPaperPointerDown}\n          group={element.id}\n        ></Paper>\n      </div>\n    );\n  }\n}\n\nexport function EmbeddedLayer() {\n  const elementContext = React.useContext(ElementContext);\n  const paperAreaContext = React.useContext(PaperAreaContext);\n  return (\n    <EmbeddedLayerInner\n      context={{ ...elementContext, ...paperAreaContext }}\n    />\n  );\n}\n\nfunction findParentElement(layer: HTMLElement): HTMLElement {\n  const parent = layer.parentElement;\n  if (!parent) {\n    throw new Error(\"Cannot find parent diagram element for EmbeddedLayer\");\n  } else if (parent.hasAttribute(\"data-element-id\")) {\n    return parent;\n  } else {\n    return findParentElement(parent);\n  }\n}\n","import * as React from \"react\";\n\nimport { TemplateProps } from \"../props\";\nimport { EmbeddedLayer } from \"../../diagram/embeddedLayer\";\n\nconst CLASS = \"graph-explorer-group-template\";\n\nexport class GroupTemplate extends React.Component<TemplateProps, {}> {\n  render() {\n    const { label, iconUrl, types, color, isExpanded } = this.props;\n\n    return (\n      <div className={CLASS}>\n        <div\n          className={`${CLASS}__wrap`}\n          style={{\n            backgroundColor: color,\n            borderColor: color,\n          }}\n        >\n          <div className={`${CLASS}__type-line`} title={label}>\n            <div className={`${CLASS}__type-line-icon`}>\n              <img src={iconUrl} />\n            </div>\n            <div title={types} className={`${CLASS}__type-line-text-container`}>\n              <div className={`${CLASS}__type-line-text`}>{types}</div>\n            </div>\n          </div>\n          <div className={`${CLASS}__body`} style={{ borderColor: color }}>\n            <span className={`${CLASS}__label`} title={label}>\n              {label}\n            </span>\n            {isExpanded ? (\n              <div className={`${CLASS}__embedded-layer`}>\n                <EmbeddedLayer />\n              </div>\n            ) : null}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import { createContext } from \"react\";\nimport { EditorController } from \"../editor/editorController\";\n\nexport type WorkspaceEventHandler = (key: WorkspaceEventKey) => void;\nexport enum WorkspaceEventKey {\n  searchUpdateCriteria = \"search:updateCriteria\",\n  searchQueryItem = \"search:queryItems\",\n  connectionsLoadLinks = \"connections:loadLinks\",\n  connectionsExpandLink = \"connections:expandLink\",\n  connectionsLoadElements = \"connections:loadElements\",\n  editorChangeSelection = \"editor:changeSelection\",\n  editorToggleDialog = \"editor:toggleDialog\",\n  editorAddElements = \"editor:addElements\",\n}\n\nexport interface WorkspaceContextWrapper {\n  workspace: WorkspaceContext;\n}\n\nexport interface WorkspaceContext {\n  editor: EditorController;\n  triggerWorkspaceEvent: WorkspaceEventHandler;\n}\n\nexport const WorkspaceContext =\n  createContext<WorkspaceContextWrapper>(null);\n","export function objectValues<T>(obj: Record<string, T>): T[] {\n  const items: T[] = [];\n  for (const key in obj) {\n    if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n      continue;\n    }\n    items.push(obj[key]);\n  }\n  return items;\n}\n\nexport function isEmptyMap(map: object) {\n  for (const key in map) {\n    if (Object.prototype.hasOwnProperty.call(map, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * Clones Map collection. Required due to IE11 not supporing `new Map(map)`.\n */\nexport function cloneMap<K, V>(map: ReadonlyMap<K, V>): Map<K, V> {\n  const clone = new Map<K, V>();\n  map.forEach((value, key) => clone.set(key, value));\n  return clone;\n}\n\n/**\n * Clones Set collection. Required due to IE11 not supporing `new Set(set)`.\n */\nexport function cloneSet<T>(set: ReadonlySet<T>): Set<T> {\n  const clone = new Set<T>();\n  set.forEach((item) => clone.add(item));\n  return clone;\n}\n\nexport function getOrCreateArrayInMap<K, V>(map: Map<K, V[]>, key: K): V[] {\n  let values = map.get(key);\n  if (!values) {\n    values = [];\n    map.set(key, values);\n  }\n  return values;\n}\n\nexport function getOrCreateSetInMap<K, V>(map: Map<K, Set<V>>, key: K): Set<V> {\n  let values = map.get(key);\n  if (!values) {\n    values = new Set();\n    map.set(key, values);\n  }\n  return values;\n}\n\nexport class OrderedMap<V> {\n  private mapping = new Map<string, V>();\n  private ordered: V[] = [];\n\n  reorder(compare: (a: V, b: V) => number) {\n    this.ordered.sort(compare);\n  }\n\n  get items(): readonly V[] {\n    return this.ordered;\n  }\n\n  get(key: string): V | undefined {\n    return this.mapping.get(key);\n  }\n\n  push(key: string, value: V) {\n    if (this.mapping.has(key)) {\n      const previous = this.mapping.get(key);\n      if (previous === value) {\n        return;\n      }\n      const index = this.ordered.indexOf(previous);\n      this.ordered.splice(index, 1);\n    }\n    this.mapping.set(key, value);\n    this.ordered.push(value);\n  }\n\n  delete(key: string): V | undefined {\n    if (!this.mapping.has(key)) {\n      return undefined;\n    }\n    const previous = this.mapping.get(key);\n    const index = this.ordered.indexOf(previous);\n    this.ordered.splice(index, 1);\n    this.mapping.delete(key);\n    return previous;\n  }\n}\n\nexport interface ReadonlyHashMap<K, V> {\n  readonly size: number;\n  has(key: K): boolean;\n  get(key: K): V | undefined;\n  forEach(\n    callback: (value: V, key: K, map: ReadonlyHashMap<K, V>) => void\n  ): void;\n  clone(): HashMap<K, V>;\n}\n\nexport class HashMap<K, V> implements ReadonlyHashMap<K, V> {\n  private readonly map = new Map<number, { key: K; value: V }[]>();\n  private _size = 0;\n\n  constructor(\n    private hashCode: (key: K) => number,\n    private equals: (k1: K, k2: K) => boolean\n  ) {}\n\n  get size() {\n    return this._size;\n  }\n\n  has(key: K): boolean {\n    const items = this.map.get(this.hashCode(key));\n    if (!items) {\n      return false;\n    }\n    return Boolean(items.find((p) => this.equals(p.key, key)));\n  }\n\n  get(key: K): V | undefined {\n    const items = this.map.get(this.hashCode(key));\n    if (!items) {\n      return undefined;\n    }\n    const pair = items.find((p) => this.equals(p.key, key));\n    return pair ? pair.value : undefined;\n  }\n\n  set(key: K, value: V): this {\n    const hash = this.hashCode(key);\n    let items = this.map.get(hash);\n    if (items) {\n      const index = items.findIndex((p) => this.equals(p.key, key));\n      if (index >= 0) {\n        items.splice(index, 1);\n      } else {\n        this._size++;\n      }\n      items.push({ key, value });\n    } else {\n      items = [{ key, value }];\n      this.map.set(hash, items);\n      this._size++;\n    }\n    return this;\n  }\n\n  delete(key: K): boolean {\n    const items = this.map.get(this.hashCode(key));\n    if (!items) {\n      return false;\n    }\n    const index = items.findIndex((p) => this.equals(p.key, key));\n    if (index >= 0) {\n      items.splice(index, 1);\n      this._size--;\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  clear(): void {\n    this.map.clear();\n    this._size = 0;\n  }\n\n  forEach(callback: (value: V, key: K, map: HashMap<K, V>) => void) {\n    this.map.forEach((items) => {\n      for (const { key, value } of items) {\n        callback(value, key, this);\n      }\n    });\n  }\n\n  clone(): HashMap<K, V> {\n    const clone = new HashMap<K, V>(this.hashCode, this.equals);\n    clone._size = this.size;\n    this.map.forEach((value, key) => clone.map.set(key, [...value]));\n    return clone;\n  }\n}\n\nexport enum MoveDirection {\n  ToStart = -1,\n  ToEnd = 1,\n}\n\nexport function makeMoveComparator<T>(\n  items: readonly T[],\n  selected: readonly T[],\n  moveDirection: MoveDirection\n): (a: T, b: T) => number {\n  const orderMap = new Map<T, number>();\n  const selectionIndexOffset = moveDirection * items.length;\n\n  items.forEach((item, index) => {\n    orderMap.set(item, index);\n  });\n\n  for (const selectedItem of selected) {\n    orderMap.set(\n      selectedItem,\n      selectionIndexOffset + orderMap.get(selectedItem)\n    );\n  }\n\n  return (a: T, b: T) => {\n    const orderA = orderMap.get(a);\n    const orderB = orderMap.get(b);\n    return orderA > orderB ? 1 : orderA < orderB ? -1 : 0;\n  };\n}\n","import {\n  ElementModel,\n  LinkModel,\n  ElementIri,\n  sameLink,\n  hashLink,\n} from \"../data/model\";\n\nimport { HashMap, ReadonlyHashMap, cloneMap } from \"../viewUtils/collections\";\n\nexport interface AuthoringState {\n  readonly elements: ReadonlyMap<ElementIri, ElementChange>;\n  readonly links: ReadonlyHashMap<LinkModel, LinkChange>;\n}\n\nexport type AuthoringEvent = ElementChange | LinkChange;\n\nexport enum AuthoringKind {\n  ChangeElement = \"changeElement\",\n  ChangeLink = \"changeLink\",\n}\n\nexport interface ElementChange {\n  readonly type: AuthoringKind.ChangeElement;\n  readonly before?: ElementModel;\n  readonly after: ElementModel;\n  readonly newIri?: ElementIri;\n  readonly deleted: boolean;\n}\n\nexport interface LinkChange {\n  readonly type: AuthoringKind.ChangeLink;\n  readonly before?: LinkModel;\n  readonly after: LinkModel;\n  readonly deleted: boolean;\n}\n\ninterface MutableAuthoringState extends AuthoringState {\n  readonly elements: Map<ElementIri, ElementChange>;\n  readonly links: HashMap<LinkModel, LinkChange>;\n}\n\nexport const AuthoringState = {\n  empty: {\n    elements: new Map<ElementIri, ElementChange>(),\n    links: new HashMap<LinkModel, LinkChange>(hashLink, sameLink),\n  } as AuthoringState,\n\n  isEmpty(state: AuthoringState) {\n    return state.elements.size === 0 && state.links.size === 0;\n  },\n\n  clone(index: AuthoringState): MutableAuthoringState {\n    return {\n      elements: cloneMap(index.elements),\n      links: index.links.clone(),\n    };\n  },\n\n  has(state: AuthoringState, event: AuthoringEvent): boolean {\n    return event.type === AuthoringKind.ChangeElement\n      ? state.elements.get(event.after.id) === event\n      : state.links.get(event.after) === event;\n  },\n\n  discard(state: AuthoringState, discarded: AuthoringEvent): AuthoringState {\n    if (!this.has(state, discarded)) {\n      return state;\n    }\n    const newState = this.clone(state);\n    if (discarded.type === AuthoringKind.ChangeElement) {\n      newState.elements.delete(discarded.after.id);\n      if (!discarded.before) {\n        state.links.forEach((e) => {\n          if (isLinkConnectedToElement(e.after, discarded.after.id)) {\n            newState.links.delete(e.after);\n          }\n        });\n      }\n    } else {\n      newState.links.delete(discarded.after);\n    }\n    return newState;\n  },\n\n  addElement(state: AuthoringState, item: ElementModel): AuthoringState {\n    const event: ElementChange = {\n      type: AuthoringKind.ChangeElement,\n      after: item,\n      deleted: false,\n    };\n    const newState = this.clone(state);\n    newState.elements.set(event.after.id, event);\n    return newState;\n  },\n\n  addLink(state: AuthoringState, item: LinkModel): AuthoringState {\n    const event: LinkChange = {\n      type: AuthoringKind.ChangeLink,\n      after: item,\n      deleted: false,\n    };\n    const newState = this.clone(state);\n    newState.links.set(event.after, event);\n    return newState;\n  },\n\n  changeElement(\n    state: AuthoringState,\n    before: ElementModel,\n    after: ElementModel\n  ): AuthoringState {\n    const newState = this.clone(state);\n    // delete previous state for an entity\n    newState.elements.delete(before.id);\n\n    const previous = state.elements.get(before.id);\n    if (previous && !previous.before) {\n      // adding or changing new entity\n      newState.elements.set(after.id, {\n        type: AuthoringKind.ChangeElement,\n        after,\n        deleted: false,\n      });\n      if (before.id !== after.id) {\n        state.links.forEach((e) => {\n          if (!e.before && isLinkConnectedToElement(e.after, before.id)) {\n            const updatedLink = updateLinkToReferByNewIri(\n              e.after,\n              before.id,\n              after.id\n            );\n            newState.links.delete(e.after);\n            newState.links.set(updatedLink, {\n              type: AuthoringKind.ChangeLink,\n              after: updatedLink,\n              deleted: false,\n            });\n          }\n        });\n      }\n    } else {\n      // changing existing entity\n      const iriChanged = after.id !== before.id;\n      const previousBefore = previous ? previous.before : undefined;\n      newState.elements.set(before.id, {\n        type: AuthoringKind.ChangeElement,\n        // always initialize 'before', otherwise entity will be considered new\n        before: previousBefore || before,\n        after: iriChanged ? { ...after, id: before.id } : after,\n        newIri: iriChanged ? after.id : undefined,\n        deleted: false,\n      });\n    }\n\n    return newState;\n  },\n\n  changeLink(\n    state: AuthoringState,\n    before: LinkModel,\n    after: LinkModel\n  ): AuthoringState {\n    if (!sameLink(before, after)) {\n      throw new Error(\"Cannot move link to another element or change its type\");\n    }\n    const newState = this.clone(state);\n    const previous = state.links.get(before);\n    newState.links.set(before, {\n      type: AuthoringKind.ChangeLink,\n      before: previous ? previous.before : undefined,\n      after: after,\n      deleted: false,\n    });\n    return newState;\n  },\n\n  deleteElement(state: AuthoringState, model: ElementModel): AuthoringState {\n    const newState = this.clone(state);\n    newState.elements.delete(model.id);\n    state.links.forEach((e) => {\n      if (isLinkConnectedToElement(e.after, model.id)) {\n        newState.links.delete(e.after);\n      }\n    });\n    if (!this.isNewElement(state, model.id)) {\n      newState.elements.set(model.id, {\n        type: AuthoringKind.ChangeElement,\n        before: model,\n        after: model,\n        deleted: true,\n      });\n    }\n    return newState;\n  },\n\n  deleteLink(state: AuthoringState, target: LinkModel): AuthoringState {\n    const newState = this.clone(state);\n    newState.links.delete(target);\n    if (!this.isNewLink(state, target)) {\n      newState.links.set(target, {\n        type: AuthoringKind.ChangeLink,\n        before: target,\n        after: target,\n        deleted: true,\n      });\n    }\n    return newState;\n  },\n\n  deleteNewLinksConnectedToElements(\n    state: AuthoringState,\n    elementIris: Set<ElementIri>\n  ): AuthoringState {\n    const newState = this.clone(state);\n    state.links.forEach((e) => {\n      if (!e.before) {\n        const target = e.after;\n        if (\n          elementIris.has(target.sourceId) ||\n          elementIris.has(target.targetId)\n        ) {\n          newState.links.delete(target);\n        }\n      }\n    });\n    return newState;\n  },\n\n  isNewElement(state: AuthoringState, target: ElementIri): boolean {\n    const event = state.elements.get(target);\n    return event && event.type === AuthoringKind.ChangeElement && !event.before;\n  },\n\n  isDeletedElement(state: AuthoringState, target: ElementIri): boolean {\n    const event = state.elements.get(target);\n    return event && event.deleted;\n  },\n\n  isElementWithModifiedIri(state: AuthoringState, target: ElementIri): boolean {\n    const event = state.elements.get(target);\n    return (\n      event &&\n      event.type === AuthoringKind.ChangeElement &&\n      event.before &&\n      Boolean(event.newIri)\n    );\n  },\n\n  isNewLink(state: AuthoringState, linkModel: LinkModel): boolean {\n    const event = state.links.get(linkModel);\n    return event && !event.before;\n  },\n\n  isDeletedLink(state: AuthoringState, linkModel: LinkModel): boolean {\n    const event = state.links.get(linkModel);\n    return (\n      (event && event.deleted) ||\n      this.isDeletedElement(state, linkModel.sourceId) ||\n      this.isDeletedElement(state, linkModel.targetId)\n    );\n  },\n\n  isUncertainLink(state: AuthoringState, linkModel: LinkModel): boolean {\n    return (\n      !this.isDeletedLink(state, linkModel) &&\n      (this.isElementWithModifiedIri(state, linkModel.sourceId) ||\n        this.isElementWithModifiedIri(state, linkModel.targetId))\n    );\n  },\n};\n\nexport function isLinkConnectedToElement(\n  link: LinkModel,\n  elementIri: ElementIri\n) {\n  return link.sourceId === elementIri || link.targetId === elementIri;\n}\n\nfunction updateLinkToReferByNewIri(\n  link: LinkModel,\n  oldIri: ElementIri,\n  newIri: ElementIri\n): LinkModel {\n  return {\n    ...link,\n    sourceId: link.sourceId === oldIri ? newIri : link.sourceId,\n    targetId: link.targetId === oldIri ? newIri : link.targetId,\n  };\n}\n","import * as React from \"react\";\n\nimport { TemplateProps } from \"../customization/props\";\n\nimport { ElementModel } from \"../data/model\";\n\nimport { DiagramView } from \"../diagram/view\";\nimport {\n  PaperAreaContext,\n  PaperAreaContextWrapper,\n} from \"../diagram/paperArea\";\n\nimport { Cancellation, CancellationToken } from \"../viewUtils/async\";\nimport { Listener } from \"../viewUtils/events\";\n\nimport {\n  WorkspaceContext,\n  WorkspaceContextWrapper,\n} from \"../workspace/workspaceContext\";\n\nimport { AuthoringState, AuthoringKind } from \"./authoringState\";\nimport { EditorController, EditorEvents } from \"./editorController\";\n\nexport interface AuthoredEntityProps {\n  templateProps: TemplateProps;\n  children: (context: AuthoredEntityContext) => React.ReactElement<any>;\n}\n\nexport interface AuthoredEntityContext {\n  editor: EditorController;\n  editedIri?: string;\n  view: DiagramView;\n  canEdit: boolean | undefined;\n  canDelete: boolean | undefined;\n  onEdit: () => void;\n  onDelete: () => void;\n}\n\nexport interface State {\n  canEdit?: boolean;\n  canDelete?: boolean;\n}\n\ninterface AuthoredEntityInnerProps extends AuthoredEntityProps {\n  context: PaperAreaContextWrapper & WorkspaceContextWrapper;\n}\n\n/**\n * Component to simplify tracking changes in validation messages (property and link type labels).\n */\nclass AuthoredEntityInner extends React.Component<\n  AuthoredEntityInnerProps,\n  State\n> {\n  private queryCancellation = new Cancellation();\n\n  constructor(props: AuthoredEntityInnerProps) {\n    super(props);\n    this.state = {};\n  }\n\n  componentDidMount() {\n    const { editor } = this.props.context.workspace;\n    editor.events.on(\"changeAuthoringState\", this.onChangeAuthoringState);\n    this.queryAllowedActions();\n  }\n\n  componentDidUpdate(prevProps: AuthoredEntityProps) {\n    const shouldUpdateAllowedActions = !(\n      this.props.templateProps.data === prevProps.templateProps.data &&\n      this.props.templateProps.isExpanded === prevProps.templateProps.isExpanded\n    );\n    if (shouldUpdateAllowedActions) {\n      this.queryAllowedActions();\n    }\n  }\n\n  componentWillUnmount() {\n    const { editor } = this.props.context.workspace;\n    editor.events.off(\"changeAuthoringState\", this.onChangeAuthoringState);\n    this.queryCancellation.abort();\n  }\n\n  private onChangeAuthoringState: Listener<\n    EditorEvents,\n    \"changeAuthoringState\"\n  > = (e) => {\n      const { source: editor, previous } = e;\n      const iri = this.props.templateProps.data.id;\n      const current = editor.authoringState;\n      if (current.elements.get(iri) !== previous.elements.get(iri)) {\n        this.queryAllowedActions();\n      }\n    };\n\n  private queryAllowedActions() {\n    const { isExpanded, data } = this.props.templateProps;\n    // only fetch whether it's allowed to edit when expanded\n    if (!isExpanded) {\n      return;\n    }\n    this.queryCancellation.abort();\n    this.queryCancellation = new Cancellation();\n\n    const { editor } = this.props.context.workspace;\n\n    if (\n      !editor.metadataApi ||\n      AuthoringState.isDeletedElement(editor.authoringState, data.id)\n    ) {\n      this.setState({ canEdit: false, canDelete: false });\n    } else {\n      this.queryCanEdit(data);\n      this.queryCanDelete(data);\n    }\n  }\n\n  private queryCanEdit(data: ElementModel) {\n    const { editor } = this.props.context.workspace;\n    const signal = this.queryCancellation.signal;\n    this.setState({ canEdit: undefined });\n    CancellationToken.mapCancelledToNull(\n      signal,\n      editor.metadataApi.canEditElement(data, signal)\n    ).then((canEdit) => {\n      if (canEdit === null) {\n        return;\n      }\n      this.setState({ canEdit });\n    });\n  }\n\n  private queryCanDelete(data: ElementModel) {\n    const { editor } = this.props.context.workspace;\n    const signal = this.queryCancellation.signal;\n    this.setState({ canDelete: undefined });\n    CancellationToken.mapCancelledToNull(\n      signal,\n      editor.metadataApi.canDeleteElement(data, signal)\n    ).then((canDelete) => {\n      if (canDelete === null) {\n        return;\n      }\n      this.setState({ canDelete });\n    });\n  }\n\n  render() {\n    const { children: renderTemplate } = this.props;\n    const { view } = this.props.context.paperArea;\n    const { editor } = this.props.context.workspace;\n    const { canEdit, canDelete } = this.state;\n\n    const iri = this.props.templateProps.iri;\n    const elementEvent = editor.authoringState.elements.get(iri);\n    const editedIri =\n      elementEvent && elementEvent.type === AuthoringKind.ChangeElement\n        ? elementEvent.newIri\n        : undefined;\n\n    return renderTemplate({\n      editor,\n      view,\n      canEdit,\n      canDelete,\n      editedIri,\n      onEdit: this.onEdit,\n      onDelete: this.onDelete,\n    });\n  }\n\n  private onEdit = () => {\n    const { editor } = this.props.context.workspace;\n    const { elementId } = this.props.templateProps;\n    const element = editor.model.getElement(elementId);\n    editor.showEditEntityForm(element);\n  };\n\n  private onDelete = () => {\n    const { editor } = this.props.context.workspace;\n    const { data } = this.props.templateProps;\n    editor.deleteEntity(data.id);\n  };\n}\n\nexport function AuthoredEntity(props: AuthoredEntityProps) {\n  const paperAreaContext = React.useContext(PaperAreaContext);\n  const workspaceContext = React.useContext(WorkspaceContext);\n  return (\n    <AuthoredEntityInner\n      {...props}\n      context={{ ...paperAreaContext, ...workspaceContext }}\n    />\n  );\n}\n","import * as React from \"react\";\n\nexport interface SpinnerProps {\n  size?: number;\n  position?: { x: number; y: number };\n  maxWidth?: number;\n  statusText?: string;\n  errorOccured?: boolean;\n}\n\nconst CLASS_NAME = \"graph-explorer-spinner\";\n\nexport class Spinner extends React.Component<SpinnerProps, {}> {\n  render() {\n    const {\n      position = { x: 0, y: 0 },\n      size = 50,\n      statusText,\n      errorOccured,\n    } = this.props;\n\n    const textLeftMargin = 5;\n    const pathGeometry =\n      \"m3.47,-19.7 a20,20 0 1,1 -6.95,0 m0,0 l-6,5 m6,-5 l-8,-0\" +\n      (errorOccured ? \"M-8,-8L8,8M-8,8L8,-8\" : \"\");\n\n    return (\n      <g\n        className={CLASS_NAME}\n        data-error={errorOccured}\n        transform={`translate(${position.x},${position.y})`}\n      >\n        <g className={`${CLASS_NAME}__arrow`}>\n          <path\n            d={pathGeometry}\n            transform={`scale(0.02)scale(${size})`}\n            fill=\"none\"\n            stroke={errorOccured ? \"red\" : \"black\"}\n            strokeWidth=\"3\"\n            strokeLinecap=\"round\"\n          />\n        </g>\n        <text\n          style={{ dominantBaseline: \"middle\" }}\n          x={size / 2 + textLeftMargin}\n        >\n          {statusText}\n        </text>\n      </g>\n    );\n  }\n}\n\nexport class HtmlSpinner extends React.Component<\n  { width: number; height: number },\n  {}\n> {\n  render() {\n    const { width, height } = this.props;\n    const size = Math.min(width, height);\n    return (\n      <svg width={width} height={height}>\n        <Spinner size={size} position={{ x: width / 2, y: height / 2 }} />\n      </svg>\n    );\n  }\n}\n","import * as React from \"react\";\nimport { Component } from \"react\";\n\nimport { isEncodedBlank } from \"../../data/sparql/blankNodes\";\n\nimport { TemplateProps, PropArray } from \"../props\";\nimport { getProperty, getPropertyValues } from \"./utils\";\n\nimport { TemplateProperties } from \"../../data/schema\";\n\nimport {\n  AuthoredEntity,\n  AuthoredEntityContext,\n} from \"../../editor/authoredEntity\";\nimport { AuthoringState } from \"../../editor/authoringState\";\n\nimport { HtmlSpinner } from \"../../viewUtils/spinner\";\n\nconst FOAF_NAME = \"http://xmlns.com/foaf/0.1/name\";\n\nconst CLASS_NAME = \"graph-explorer-standard-template\";\n\nexport class StandardTemplate extends Component<TemplateProps, {}> {\n  render() {\n    return (\n      <AuthoredEntity templateProps={this.props}>\n        {(context) => this.renderTemplate(context)}\n      </AuthoredEntity>\n    );\n  }\n\n  private renderTemplate(context: AuthoredEntityContext) {\n    const { color, types, isExpanded, iri, propsAsList } = this.props;\n    const label = this.getLabel();\n\n    const { editor } = context;\n    const isNewElement = AuthoringState.isNewElement(\n      editor.authoringState,\n      iri\n    );\n    const leftStripeColor = isNewElement ? \"white\" : color;\n    const pinnedProperties = this.findPinnedProperties(context);\n\n    return (\n      <div className={CLASS_NAME}>\n        <div\n          className={`${CLASS_NAME}__main`}\n          style={{ backgroundColor: leftStripeColor, borderColor: color }}\n        >\n          <div\n            className={`${CLASS_NAME}__body`}\n            style={{ borderLeftColor: color }}\n          >\n            <div className={`${CLASS_NAME}__body-horizontal`}>\n              {this.renderThumbnail()}\n              <div className={`${CLASS_NAME}__body-content`}>\n                <div title={types} className={`${CLASS_NAME}__type`}>\n                  <div className={`${CLASS_NAME}__type-value`}>\n                    {this.getTypesLabel()}\n                  </div>\n                </div>\n                <div className={`${CLASS_NAME}__label`} title={label}>\n                  {label}\n                </div>\n              </div>\n            </div>\n            {pinnedProperties ? (\n              <div\n                className={`${CLASS_NAME}__pinned-props`}\n                style={{ borderColor: color }}\n              >\n                {this.renderProperties(pinnedProperties)}\n              </div>\n            ) : null}\n          </div>\n        </div>\n        {isExpanded ? (\n          <div\n            className={`${CLASS_NAME}__dropdown`}\n            style={{ borderColor: color }}\n          >\n            {this.renderPhoto()}\n            <div className={`${CLASS_NAME}__dropdown-content`}>\n              {this.renderIri(context)}\n              {this.renderProperties(propsAsList)}\n              {editor.inAuthoringMode ? (\n                <hr className={`${CLASS_NAME}__hr`} />\n              ) : null}\n              {editor.inAuthoringMode ? this.renderActions(context) : null}\n            </div>\n          </div>\n        ) : null}\n      </div>\n    );\n  }\n\n  private findPinnedProperties(\n    context: AuthoredEntityContext\n  ): PropArray | undefined {\n    const { isExpanded, propsAsList, elementId } = this.props;\n    if (isExpanded) {\n      return undefined;\n    }\n    const templateState = context.view.model.getElement(elementId).elementState;\n    if (!templateState) {\n      return undefined;\n    }\n    const pinned = templateState[\n      TemplateProperties.PinnedProperties\n    ] as PinnedProperties;\n    if (!pinned) {\n      return undefined;\n    }\n    const filtered = propsAsList.filter((prop) => Boolean(pinned[prop.id]));\n    return filtered.length === 0 ? undefined : filtered;\n  }\n\n  private renderProperties(propsAsList: PropArray) {\n    if (!propsAsList.length) {\n      return <div>no properties</div>;\n    }\n\n    return (\n      <div className={`${CLASS_NAME}__properties`}>\n        {propsAsList.map(({ name, id, property }) => {\n          const propertyValues = getPropertyValues(property);\n          return (\n            <div key={id} className={`${CLASS_NAME}__properties-row`}>\n              <div\n                className={`${CLASS_NAME}__properties-key`}\n                title={`${name} (${id})`}\n              >\n                {name}\n              </div>\n              <div className={`${CLASS_NAME}__properties-values`}>\n                {propertyValues.map((text, index) => (\n                  <div\n                    className={`${CLASS_NAME}__properties-value`}\n                    key={index}\n                    title={text}\n                  >\n                    {text}\n                  </div>\n                ))}\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n\n  private renderPhoto() {\n    const { color, imgUrl } = this.props;\n\n    if (!imgUrl) {\n      return null;\n    }\n\n    return (\n      <div className={`${CLASS_NAME}__photo`} style={{ borderColor: color }}>\n        <img src={imgUrl} className={`${CLASS_NAME}__photo-image`} />\n      </div>\n    );\n  }\n\n  private renderIri(context: AuthoredEntityContext) {\n    const { iri } = this.props;\n    const finalIri = context.editedIri === undefined ? iri : context.editedIri;\n    return (\n      <div>\n        <div className={`${CLASS_NAME}__iri`}>\n          <div className={`${CLASS_NAME}__iri-key`}>\n            IRI{context.editedIri ? \"\\u00A0(edited)\" : \"\"}:\n          </div>\n          <div className={`${CLASS_NAME}__iri-value`}>\n            {isEncodedBlank(finalIri) ? (\n              <span>(blank node)</span>\n            ) : (\n              <a\n                href={finalIri}\n                title={finalIri}\n                data-iri-click-intent=\"openEntityIri\"\n              >\n                {finalIri}\n              </a>\n            )}\n          </div>\n        </div>\n        <hr className={`${CLASS_NAME}__hr`} />\n      </div>\n    );\n  }\n\n  private renderThumbnail() {\n    const { color, imgUrl, iconUrl } = this.props;\n\n    if (imgUrl) {\n      return (\n        <div className={`${CLASS_NAME}__thumbnail`} aria-hidden=\"true\">\n          <img src={imgUrl} className={`${CLASS_NAME}__thumbnail-image`} />\n        </div>\n      );\n    } else if (iconUrl) {\n      return (\n        <div className={`${CLASS_NAME}__thumbnail`} aria-hidden=\"true\">\n          <img src={iconUrl} className={`${CLASS_NAME}__thumbnail-icon`} />\n        </div>\n      );\n    }\n\n    const typeLabel = this.getTypesLabel();\n    return (\n      <div\n        className={`${CLASS_NAME}__thumbnail`}\n        aria-hidden=\"true\"\n        style={{ color }}\n      >\n        {typeLabel.length > 0 ? typeLabel.charAt(0).toUpperCase() : \"✳\"}\n      </div>\n    );\n  }\n\n  protected getTypesLabel(): string {\n    return this.props.types;\n  }\n\n  private getLabel() {\n    const { label, props } = this.props;\n    return getProperty(props, FOAF_NAME) || label;\n  }\n\n  private renderActions(context: AuthoredEntityContext) {\n    const { canEdit, canDelete, onEdit, onDelete } = context;\n    const SPINNER_WIDTH = 15;\n    const SPINNER_HEIGHT = 12;\n    return (\n      <div className={`${CLASS_NAME}__actions`}>\n        <button\n          type=\"button\"\n          className=\"graph-explorer-btn graph-explorer-btn-default\"\n          title={\n            canDelete\n              ? \"Delete entity\"\n              : \"Deletion is unavailable for the selected element\"\n          }\n          disabled={!canDelete}\n          onClick={onDelete}\n        >\n          <span className=\"fa fa-trash\" />\n          &nbsp;\n          {canEdit === undefined ? (\n            <HtmlSpinner width={SPINNER_WIDTH} height={SPINNER_HEIGHT} />\n          ) : (\n            \"Delete\"\n          )}\n        </button>\n        <button\n          type=\"button\"\n          className=\"graph-explorer-btn graph-explorer-btn-default\"\n          title={\n            canEdit\n              ? \"Edit entity\"\n              : \"Editing is unavailable for the selected element\"\n          }\n          disabled={!canEdit}\n          onClick={onEdit}\n        >\n          <span className=\"fa fa-edit\" />\n          &nbsp;\n          {canEdit === undefined ? (\n            <HtmlSpinner width={SPINNER_WIDTH} height={SPINNER_HEIGHT} />\n          ) : (\n            \"Edit\"\n          )}\n        </button>\n      </div>\n    );\n  }\n}\n\ntype PinnedProperties = Record<string, boolean>;\n","import { TemplateResolver } from \"../props\";\n\nexport * from \"./default\";\nexport * from \"./group\";\nexport * from \"./standard\";\n\nexport const DefaultElementTemplateBundle: TemplateResolver = (_types) =>\n  undefined;\n","import { cloneDeep, keyBy, map, each } from \"lodash\";\nimport { DataProvider, LinkElementsParams, FilterParams } from \"../provider\";\nimport {\n  Dictionary,\n  ClassModel,\n  LinkType,\n  ElementModel,\n  LinkModel,\n  LinkCount,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n} from \"../model\";\n\nexport class DemoDataProvider implements DataProvider {\n  constructor(\n    private allClasses: ClassModel[],\n    private allLinkTypes: LinkType[],\n    private allElements: Dictionary<ElementModel>,\n    private allLinks: LinkModel[]\n  ) {}\n\n  private simulateNetwork<T>(result: T) {\n    const MEAN_DELAY = 200;\n    const cloned = cloneDeep(result);\n    // simulate exponential distribution\n    const delay = -Math.log(Math.random()) * MEAN_DELAY;\n    return new Promise<T>((resolve) => {\n      setTimeout(() => resolve(cloned), delay);\n    });\n  }\n\n  classTree() {\n    return this.simulateNetwork(this.allClasses);\n  }\n\n  classInfo(params: { classIds: ElementTypeIri[] }) {\n    const classIds = params.classIds || [];\n    return this.simulateNetwork(\n      this.allClasses.filter((cl) => classIds.indexOf(cl.id))\n    );\n  }\n\n  linkTypes() {\n    return this.simulateNetwork(this.allLinkTypes);\n  }\n\n  linkTypesInfo(params: { linkTypeIds: LinkTypeIri[] }): Promise<LinkType[]> {\n    const types = keyBy(params.linkTypeIds);\n    const linkTypes = this.allLinkTypes.filter((type) => types[type.id]);\n    return this.simulateNetwork(linkTypes);\n  }\n\n  elementInfo(params: {\n    elementIds: ElementIri[];\n  }): Promise<Dictionary<ElementModel>> {\n    const elements = params.elementIds\n      .map((elementId) => this.allElements[elementId])\n      .filter((element) => element !== undefined);\n    return this.simulateNetwork(keyBy(elements, (element) => element.id));\n  }\n\n  linksInfo(params: { elementIds: ElementIri[]; linkTypeIds: LinkTypeIri[] }) {\n    const nodes = keyBy(params.elementIds);\n    const types = keyBy(params.linkTypeIds);\n    const links = this.allLinks.filter(\n      (link) =>\n        types[link.linkTypeId] && nodes[link.sourceId] && nodes[link.targetId]\n    );\n    return this.simulateNetwork(links);\n  }\n\n  linkTypesOf(params: { elementId: ElementIri }) {\n    const counts: Dictionary<LinkCount> = {};\n    for (const link of this.allLinks) {\n      if (\n        link.sourceId === params.elementId ||\n        link.targetId === params.elementId\n      ) {\n        const linkCount = counts[link.linkTypeId];\n        const isSource = link.sourceId === params.elementId;\n        if (linkCount) {\n          if (isSource) {\n            linkCount.outCount++;\n          } else {\n            linkCount.inCount++;\n          }\n        } else {\n          counts[link.linkTypeId] = isSource\n            ? { id: link.linkTypeId, inCount: 0, outCount: 1 }\n            : { id: link.linkTypeId, inCount: 1, outCount: 0 };\n        }\n      }\n    }\n    return this.simulateNetwork(map(counts));\n  }\n\n  linkElements(params: LinkElementsParams): Promise<Dictionary<ElementModel>> {\n    // for sparql we have rich filtering features and we just reuse filter.\n    return this.filter({\n      refElementId: params.elementId,\n      refElementLinkId: params.linkId,\n      linkDirection: params.direction,\n      limit: params.limit,\n      offset: params.offset,\n      languageCode: \"\",\n    });\n  }\n\n  filter(params: FilterParams): Promise<Dictionary<ElementModel>> {\n    if (params.limit === undefined) {\n      params.limit = 100;\n    }\n\n    if (params.offset > 0) {\n      return Promise.resolve({});\n    }\n\n    let filtered: Dictionary<ElementModel> = {};\n    if (params.elementTypeId) {\n      each(this.allElements, (element) => {\n        if (element.types.indexOf(params.elementTypeId) >= 0) {\n          filtered[element.id] = element;\n        }\n      });\n    } else if (params.refElementId) {\n      const filteredLinks = params.refElementLinkId\n        ? this.allLinks.filter(\n            (link) => link.linkTypeId === params.refElementLinkId\n          )\n        : this.allLinks;\n      const nodeId = params.refElementId;\n      for (const link of filteredLinks) {\n        let linkedElementId: string;\n        if (link.sourceId === nodeId && params.linkDirection !== \"in\") {\n          linkedElementId = link.targetId;\n        } else if (link.targetId === nodeId && params.linkDirection !== \"out\") {\n          linkedElementId = link.sourceId;\n        }\n        if (linkedElementId !== undefined) {\n          const linkedElement = this.allElements[linkedElementId];\n          if (linkedElement) {\n            filtered[linkedElement.id] = linkedElement;\n          }\n        }\n      }\n    } else if (params.text) {\n      filtered = this.allElements; // filtering by text is done below\n    } else {\n      return Promise.reject(\n        new Error(\"This type of filter is not implemented\")\n      );\n    }\n\n    if (params.text) {\n      const filteredByText: Dictionary<ElementModel> = {};\n      const text = params.text.toLowerCase();\n      each(filtered, (element) => {\n        const found =\n          element.id.toLowerCase().indexOf(text) >= 0 ||\n          element.label.values.some(\n            (label) => label.value.toLowerCase().indexOf(text) >= 0\n          );\n        if (found) {\n          filteredByText[element.id] = element;\n        }\n      });\n      return this.simulateNetwork(filteredByText);\n    } else {\n      return this.simulateNetwork(filtered);\n    }\n  }\n}\n","import {\n  LinkConfiguration,\n  PropertyConfiguration,\n} from \"./sparqlDataProviderSettings\";\nimport {\n  RdfLiteral,\n  isRdfLiteral,\n  SparqlResponse,\n  ClassBinding,\n  ElementBinding,\n  LinkBinding,\n  isRdfIri,\n  isRdfBlank,\n  RdfIri,\n  ElementImageBinding,\n  LinkCountBinding,\n  LinkTypeBinding,\n  PropertyBinding,\n  ElementTypeBinding,\n  FilterBinding,\n  Triple,\n} from \"./sparqlModels\";\nimport {\n  Dictionary,\n  LocalizedString,\n  LinkType,\n  ClassModel,\n  ElementModel,\n  LinkModel,\n  Property,\n  PropertyModel,\n  LinkCount,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n  PropertyTypeIri,\n  isIriProperty,\n  isLiteralProperty,\n  sameLink,\n  hashLink,\n} from \"../model\";\nimport { HashMap, getOrCreateSetInMap } from \"../../viewUtils/collections\";\n\nconst LABEL_URI = \"http://www.w3.org/2000/01/rdf-schema#label\";\nconst RDF_TYPE_URI = \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\";\n\nconst EMPTY_MAP: ReadonlyMap<any, any> = new Map();\n\nexport function getClassTree(\n  response: SparqlResponse<ClassBinding>\n): ClassModel[] {\n  const treeNodes = createClassMap(response.results.bindings);\n  const allNodes: ClassModel[] = [];\n\n  // createClassMap ensures we get both elements and parents and we can use treeNodes[treeNode.parent] safely\n  treeNodes.forEach((node) => {\n    allNodes.push(node);\n    node.parents.forEach((parent) => {\n      treeNodes.get(parent).children.push(node);\n    });\n    node.parents = undefined;\n  });\n\n  const withoutCycles = breakCyclesAndCalculateCounts(allNodes);\n  const leafs = new Set<ElementTypeIri>();\n  for (const node of withoutCycles) {\n    for (const child of node.children) {\n      leafs.add(child.id);\n    }\n  }\n\n  const tree = withoutCycles.filter((node) => !leafs.has(node.id));\n  return tree;\n}\n\nexport function flattenClassTree(classTree: readonly ClassModel[]) {\n  const all: ClassModel[] = [];\n  const visitClasses = (classes: readonly ClassModel[]) => {\n    for (const model of classes) {\n      all.push(model);\n      visitClasses(model.children);\n    }\n  };\n  visitClasses(classTree);\n  return all;\n}\n\n/**\n * This extension of ClassModel is used only in processing, parent links are not needed in UI (yet?)\n */\ninterface HierarchicalClassModel extends ClassModel {\n  parents?: Set<ElementTypeIri>;\n}\n\nfunction createClassMap(\n  bindings: ClassBinding[]\n): Map<ElementTypeIri, HierarchicalClassModel> {\n  const treeNodes = new Map<ElementTypeIri, HierarchicalClassModel>();\n\n  for (const binding of bindings) {\n    if (!isRdfIri(binding.class)) {\n      continue;\n    }\n    const classIri = binding.class.value as ElementTypeIri;\n\n    let node = treeNodes.get(classIri);\n    if (!node) {\n      node = createEmptyModel(classIri);\n      treeNodes.set(classIri, node);\n    }\n\n    if (binding.label) {\n      appendLabel(node.label, getLocalizedString(binding.label));\n    }\n    if (binding.parent) {\n      const parentIri = binding.parent.value as ElementTypeIri;\n      node.parents.add(parentIri);\n    }\n    if (binding.instcount) {\n      node.count = getInstCount(binding.instcount);\n    }\n  }\n\n  // ensuring parent will always be there\n  for (const binding of bindings) {\n    if (binding.parent) {\n      const parentIri = binding.parent.value as ElementTypeIri;\n      if (!treeNodes.has(parentIri)) {\n        treeNodes.set(parentIri, createEmptyModel(parentIri));\n      }\n    }\n  }\n\n  function createEmptyModel(iri: ElementTypeIri): HierarchicalClassModel {\n    return {\n      id: iri as ElementTypeIri,\n      children: [],\n      label: { values: [] },\n      count: undefined,\n      parents: new Set<ElementTypeIri>(),\n    };\n  }\n\n  return treeNodes;\n}\n\nfunction breakCyclesAndCalculateCounts(tree: ClassModel[]): ClassModel[] {\n  const visiting = new Set<ElementTypeIri>();\n\n  function reduceChildren(acc: ClassModel[], node: ClassModel): ClassModel[] {\n    if (visiting.has(node.id)) {\n      // prevent unbounded recursion\n      return acc;\n    }\n    // no more to count\n    if (!node.children) {\n      return;\n    }\n    // ensure all children have their counts completed;\n    visiting.add(node.id);\n    node.children = node.children.reduce(reduceChildren, []);\n    visiting.delete(node.id);\n    // we have to preserve no data here. If nor element nor childs have no count information,\n    // we just pass undefined upwards.\n    let childCount: number;\n\n    node.children.forEach(({ count }) => {\n      if (count === undefined) {\n        return;\n      }\n\n      childCount = childCount === undefined ? count : childCount + count;\n    });\n\n    if (childCount !== undefined) {\n      node.count =\n        node.count === undefined ? childCount : node.count + childCount;\n    }\n\n    acc.push(node);\n    return acc;\n  }\n\n  return tree.reduce(reduceChildren, []);\n}\n\nexport function getClassInfo(\n  response: SparqlResponse<ClassBinding>\n): ClassModel[] {\n  const classes: Record<string, ClassModel> = {};\n  for (const binding of response.results.bindings) {\n    if (!binding.class) {\n      continue;\n    }\n    const id = binding.class.value as ElementTypeIri;\n    const model = classes[id];\n    if (model) {\n      appendLabel(model.label, getLocalizedString(binding.label));\n      const instanceCount = getInstCount(binding.instcount);\n      if (instanceCount !== undefined) {\n        model.count = Math.max(model.count, instanceCount);\n      }\n    } else {\n      const label = getLocalizedString(binding.label);\n      classes[id] = {\n        id,\n        children: [],\n        label: { values: label ? [label] : [] },\n        count: getInstCount(binding.instcount),\n      };\n    }\n  }\n\n  const classesList: ClassModel[] = [];\n  for (const id in classes) {\n    if (!Object.prototype.hasOwnProperty.call(classes, id)) {\n      continue;\n    }\n    const model = classes[id];\n    classesList.push(model);\n  }\n\n  return classesList;\n}\n\nexport function getPropertyInfo(\n  response: SparqlResponse<PropertyBinding>\n): Dictionary<PropertyModel> {\n  const models: Dictionary<PropertyModel> = {};\n\n  for (const sProperty of response.results.bindings) {\n    const sPropertyTypeId = sProperty.property.value as PropertyTypeIri;\n    if (models[sPropertyTypeId]) {\n      if (sProperty.label) {\n        const label = models[sPropertyTypeId].label;\n        if (label.values.length === 1 && !label.values[0].language) {\n          label.values = [];\n        }\n        label.values.push(getLocalizedString(sProperty.label));\n      }\n    } else {\n      models[sPropertyTypeId] = getPropertyModel(sProperty);\n    }\n  }\n  return models;\n}\n\nexport function getLinkTypes(\n  response: SparqlResponse<LinkTypeBinding>\n): LinkType[] {\n  const sInst = response.results.bindings;\n  const linkTypes: LinkType[] = [];\n  const linkTypesMap: Dictionary<LinkType> = {};\n\n  for (const sLink of sInst) {\n    const sInstTypeId = sLink.link.value as LinkTypeIri;\n    if (linkTypesMap[sInstTypeId]) {\n      if (sLink.label) {\n        const label = linkTypesMap[sInstTypeId].label;\n        if (label.values.length === 1 && !label.values[0].language) {\n          label.values = [];\n        }\n        label.values.push(getLocalizedString(sLink.label));\n      }\n    } else {\n      linkTypesMap[sInstTypeId] = getLinkTypeInfo(sLink);\n      linkTypes.push(linkTypesMap[sInstTypeId]);\n    }\n  }\n\n  return linkTypes;\n}\n\nexport function triplesToElementBinding(\n  triples: Triple[]\n): SparqlResponse<ElementBinding> {\n  const map: Dictionary<ElementBinding> = {};\n  const convertedResponse: SparqlResponse<ElementBinding> = {\n    head: {\n      vars: [\"inst\", \"class\", \"label\", \"blankType\", \"propType\", \"propValue\"],\n    },\n    results: {\n      bindings: [],\n    },\n  };\n  for (const triple of triples) {\n    const trippleId = triple.subject.value;\n    if (!map[trippleId]) {\n      map[trippleId] = createAndPushBinding(triple);\n    }\n\n    if (triple.predicate.value === LABEL_URI && isRdfLiteral(triple.object)) {\n      // Label\n      if (map[trippleId].label) {\n        map[trippleId] = createAndPushBinding(triple);\n      }\n      map[trippleId].label = triple.object;\n    } else if (\n      // Class\n      triple.predicate.value === RDF_TYPE_URI &&\n      isRdfIri(triple.object) &&\n      isRdfIri(triple.predicate)\n    ) {\n      if (map[trippleId].class) {\n        map[trippleId] = createAndPushBinding(triple);\n      }\n      map[trippleId].class = triple.object;\n    } else if (!isRdfBlank(triple.object) && isRdfIri(triple.predicate)) {\n      // Property\n      if (map[trippleId].propType) {\n        map[trippleId] = createAndPushBinding(triple);\n      }\n      map[trippleId].propType = triple.predicate;\n      map[trippleId].propValue = triple.object;\n    }\n  }\n\n  function createAndPushBinding(tripple: Triple): ElementBinding {\n    const binding: ElementBinding = {\n      inst: tripple.subject as RdfIri,\n    };\n    convertedResponse.results.bindings.push(binding);\n    return binding;\n  }\n\n  return convertedResponse;\n}\n\nexport function getElementsInfo(\n  response: SparqlResponse<ElementBinding>,\n  types: ReadonlyMap<ElementIri, ReadonlySet<ElementTypeIri>> = EMPTY_MAP,\n  propertyByPredicate: ReadonlyMap<\n    string,\n    readonly PropertyConfiguration[]\n  > = EMPTY_MAP,\n  openWorldProperties = true\n): Dictionary<ElementModel> {\n  const instancesMap: Dictionary<ElementModel> = {};\n\n  for (const binding of response.results.bindings) {\n    if (!isRdfIri(binding.inst)) {\n      continue;\n    }\n    const iri = binding.inst.value as ElementIri;\n    let model = instancesMap[iri];\n    if (!model) {\n      model = emptyElementInfo(iri);\n      instancesMap[iri] = model;\n    }\n    enrichElement(model, binding);\n  }\n\n  if (!openWorldProperties || propertyByPredicate.size > 0) {\n    for (const iri in instancesMap) {\n      if (!Object.hasOwnProperty.call(instancesMap, iri)) {\n        continue;\n      }\n      const model = instancesMap[iri];\n      const modelTypes = types.get(model.id);\n      model.properties = mapPropertiesByConfig(\n        model,\n        modelTypes,\n        propertyByPredicate,\n        openWorldProperties\n      );\n    }\n  }\n\n  return instancesMap;\n}\n\nfunction mapPropertiesByConfig(\n  model: ElementModel,\n  modelTypes: ReadonlySet<ElementTypeIri> | undefined,\n  propertyByPredicate: ReadonlyMap<string, readonly PropertyConfiguration[]>,\n  openWorldProperties: boolean\n): ElementModel[\"properties\"] {\n  const mapped: ElementModel[\"properties\"] = {};\n  for (const propertyIri in model.properties) {\n    if (!Object.hasOwnProperty.call(model.properties, propertyIri)) {\n      continue;\n    }\n    const properties = propertyByPredicate.get(propertyIri);\n    if (properties && properties.length > 0) {\n      for (const property of properties) {\n        if (typeMatchesDomain(property, modelTypes)) {\n          mapped[property.id] = model.properties[propertyIri];\n        }\n      }\n    } else if (openWorldProperties) {\n      mapped[propertyIri] = model.properties[propertyIri];\n    }\n  }\n  return mapped;\n}\n\nexport function enrichElementsWithImages(\n  response: SparqlResponse<ElementImageBinding>,\n  elementsInfo: Dictionary<ElementModel>\n): void {\n  const respElements = response.results.bindings;\n  for (const respEl of respElements) {\n    const elementInfo = elementsInfo[respEl.inst.value];\n    if (elementInfo) {\n      elementInfo.image = respEl.image.value;\n    }\n  }\n}\n\nexport function getElementTypes(\n  response: SparqlResponse<ElementTypeBinding>\n): Map<ElementIri, Set<ElementTypeIri>> {\n  const types = new Map<ElementIri, Set<ElementTypeIri>>();\n  for (const binding of response.results.bindings) {\n    if (isRdfIri(binding.inst) && isRdfIri(binding.class)) {\n      const element = binding.inst.value as ElementIri;\n      const type = binding.class.value as ElementTypeIri;\n      getOrCreateSetInMap(types, element).add(type);\n    }\n  }\n  return types;\n}\n\nexport function getLinksInfo(\n  response: SparqlResponse<LinkBinding>,\n  types: ReadonlyMap<ElementIri, ReadonlySet<ElementTypeIri>> = EMPTY_MAP,\n  linkByPredicateType: ReadonlyMap<\n    string,\n    readonly LinkConfiguration[]\n  > = EMPTY_MAP,\n  openWorldLinks = true\n): LinkModel[] {\n  const sparqlLinks = response.results.bindings;\n  const links = new HashMap<LinkModel, LinkModel>(hashLink, sameLink);\n\n  for (const binding of sparqlLinks) {\n    const model: LinkModel = {\n      sourceId: binding.source.value as ElementIri,\n      linkTypeId: binding.type.value as LinkTypeIri,\n      targetId: binding.target.value as ElementIri,\n      properties: {},\n    };\n    if (links.has(model)) {\n      // this can only happen due to error in sparql or when merging properties\n      if (binding.propType) {\n        const existing = links.get(model);\n        mergeProperties(\n          existing.properties,\n          binding.propType,\n          binding.propValue\n        );\n      }\n    } else {\n      if (binding.propType) {\n        mergeProperties(model.properties, binding.propType, binding.propValue);\n      }\n      const linkConfigs = linkByPredicateType.get(model.linkTypeId);\n      if (linkConfigs && linkConfigs.length > 0) {\n        for (const linkConfig of linkConfigs) {\n          if (typeMatchesDomain(linkConfig, types.get(model.sourceId))) {\n            const mappedModel: LinkModel = isDirectLink(linkConfig)\n              ? { ...model, linkTypeId: linkConfig.id as LinkTypeIri }\n              : model;\n            links.set(mappedModel, mappedModel);\n          }\n        }\n      } else if (openWorldLinks) {\n        links.set(model, model);\n      }\n    }\n  }\n\n  const linkArray: LinkModel[] = [];\n  links.forEach((value) => linkArray.push(value));\n  return linkArray;\n}\n\nexport function getLinksTypesOf(\n  response: SparqlResponse<LinkCountBinding>\n): LinkCount[] {\n  const sparqlLinkTypes = response.results.bindings.filter(\n    (b) => !isRdfBlank(b.link)\n  );\n  return sparqlLinkTypes.map((sLink: LinkCountBinding) => getLinkCount(sLink));\n}\n\nexport function getLinksTypeIds(\n  response: SparqlResponse<LinkTypeBinding>,\n  linkByPredicateType: ReadonlyMap<\n    string,\n    readonly LinkConfiguration[]\n  > = EMPTY_MAP,\n  openWorldLinks = true\n): LinkTypeIri[] {\n  const linkTypes: LinkTypeIri[] = [];\n  for (const binding of response.results.bindings) {\n    if (!isRdfIri(binding.link)) {\n      continue;\n    }\n    const linkConfigs = linkByPredicateType.get(binding.link.value);\n    if (linkConfigs && linkConfigs.length > 0) {\n      for (const linkConfig of linkConfigs) {\n        const mappedLinkType = isDirectLink(linkConfig)\n          ? linkConfig.id\n          : binding.link.value;\n        linkTypes.push(mappedLinkType as LinkTypeIri);\n      }\n    } else if (openWorldLinks) {\n      linkTypes.push(binding.link.value as LinkTypeIri);\n    }\n  }\n  return linkTypes;\n}\n\nexport function getLinkStatistics(\n  response: SparqlResponse<LinkCountBinding>\n): LinkCount | undefined {\n  for (const binding of response.results.bindings) {\n    if (isRdfIri(binding.link)) {\n      return getLinkCount(binding);\n    }\n  }\n  return undefined;\n}\n\nexport function getFilteredData(\n  response: SparqlResponse<ElementBinding & FilterBinding>,\n  sourceTypes?: ReadonlySet<ElementTypeIri>,\n  linkByPredicateType: ReadonlyMap<\n    string,\n    readonly LinkConfiguration[]\n  > = EMPTY_MAP,\n  openWorldLinks = true\n): Dictionary<ElementModel> {\n  const instancesMap: Dictionary<ElementModel> = {};\n  const resultTypes = new Map<ElementIri, Set<ElementTypeIri>>();\n  const outPredicates = new Map<ElementIri, Set<string>>();\n  const inPredicates = new Map<ElementIri, Set<string>>();\n\n  for (const binding of response.results.bindings) {\n    if (!isRdfIri(binding.inst) && !isRdfBlank(binding.inst)) {\n      continue;\n    }\n\n    const iri = binding.inst.value as ElementIri;\n    let model = instancesMap[iri];\n    if (!model) {\n      model = emptyElementInfo(iri);\n      instancesMap[iri] = model;\n    }\n    enrichElement(model, binding);\n\n    if (isRdfIri(binding.classAll)) {\n      getOrCreateSetInMap(resultTypes, iri).add(\n        binding.classAll.value as ElementTypeIri\n      );\n    }\n\n    if (!openWorldLinks && binding.link && binding.direction) {\n      const predicates =\n        binding.direction.value === \"out\" ? outPredicates : inPredicates;\n      getOrCreateSetInMap(predicates, model.id).add(binding.link.value);\n    }\n  }\n\n  if (!openWorldLinks) {\n    for (const id of Object.keys(instancesMap)) {\n      const model = instancesMap[id];\n      const targetTypes = resultTypes.get(model.id);\n      const doesMatchesDomain =\n        matchesDomainForLink(\n          sourceTypes,\n          outPredicates.get(model.id),\n          linkByPredicateType\n        ) &&\n        matchesDomainForLink(\n          targetTypes,\n          inPredicates.get(model.id),\n          linkByPredicateType\n        );\n      if (!doesMatchesDomain) {\n        // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n        delete instancesMap[id];\n      }\n    }\n  }\n\n  return instancesMap;\n}\n\nfunction matchesDomainForLink(\n  types: ReadonlySet<ElementTypeIri> | undefined,\n  predicates: Set<string> | undefined,\n  linkByPredicateType: ReadonlyMap<string, readonly LinkConfiguration[]>\n) {\n  if (!predicates) {\n    return true;\n  }\n\n  let hasMatch = false;\n  predicates.forEach((predicate) => {\n    const matched = linkByPredicateType.get(predicate);\n    if (matched) {\n      for (const link of matched) {\n        if (typeMatchesDomain(link, types)) {\n          hasMatch = true;\n        }\n      }\n    }\n  });\n  return hasMatch;\n}\n\nexport function isDirectLink(link: LinkConfiguration) {\n  // link configuration is path-based if includes any variables\n  const pathBased = /[?$][a-zA-Z]+\\b/.test(link.path);\n  return !pathBased;\n}\n\nexport function isDirectProperty(property: PropertyConfiguration) {\n  // property configuration is path-based if includes any variables\n  const pathBased = /[?$][a-zA-Z]+\\b/.test(property.path);\n  return !pathBased;\n}\n\nfunction typeMatchesDomain(\n  config: { readonly domain?: readonly string[] },\n  types: ReadonlySet<ElementTypeIri> | undefined\n): boolean {\n  if (!config.domain || config.domain.length === 0) {\n    return true;\n  } else if (!types) {\n    return false;\n  } else {\n    for (const type of config.domain) {\n      if (types.has(type as ElementTypeIri)) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n\n/**\n * Modifies properties with merging with new values, couls be new peroperty or new value for existing properties.\n * @param properties\n * @param propType\n * @param propValue\n */\nfunction mergeProperties(\n  properties: Record<string, Property>,\n  propType: RdfIri,\n  propValue: RdfIri | RdfLiteral\n) {\n  let property = properties[propType.value];\n  if (isRdfIri(propValue)) {\n    if (!property) {\n      property = { type: \"uri\", values: [] };\n    }\n    if (\n      isIriProperty(property) &&\n      property.values.every(({ value }) => value !== propValue.value)\n    ) {\n      property.values = [...property.values, propValue];\n    }\n  } else if (isRdfLiteral(propValue)) {\n    if (!property) {\n      property = { type: \"string\", values: [] };\n    }\n    const propertyValue = getLocalizedString(propValue);\n    if (\n      isLiteralProperty(property) &&\n      property.values.every((value) => !isLocalizedEqual(value, propertyValue))\n    ) {\n      property.values = [...property.values, propertyValue];\n    }\n  }\n  properties[propType.value] = property;\n}\n\nexport function enrichElement(element: ElementModel, sInst: ElementBinding) {\n  if (!element) {\n    return;\n  }\n  if (sInst.label) {\n    const label = getLocalizedString(sInst.label);\n\n    if (\n      element.label.values.every((value) => !isLocalizedEqual(value, label))\n    ) {\n      element.label.values.push(label);\n    }\n  }\n  if (\n    sInst.class &&\n    element.types.indexOf(sInst.class.value as ElementTypeIri) < 0\n  ) {\n    element.types.push(sInst.class.value as ElementTypeIri);\n  }\n  if (sInst.propType && sInst.propType.value !== LABEL_URI) {\n    mergeProperties(element.properties, sInst.propType, sInst.propValue);\n  }\n}\n\nfunction appendLabel(\n  container: { values: LocalizedString[] },\n  newLabel: LocalizedString | undefined\n) {\n  if (!newLabel) {\n    return;\n  }\n  for (const existing of container.values) {\n    if (isLocalizedEqual(existing, newLabel)) {\n      return;\n    }\n  }\n  container.values.push(newLabel);\n}\n\nfunction isLocalizedEqual(left: LocalizedString, right: LocalizedString) {\n  return left.language === right.language && left.value === right.value;\n}\n\nexport function getLocalizedString(\n  label: RdfLiteral\n): LocalizedString | undefined {\n  if (label) {\n    return {\n      value: label.value,\n      language: label[\"xml:lang\"],\n      datatype: label.datatype ? { value: label.datatype } : undefined,\n    };\n  } else {\n    return undefined;\n  }\n}\n\nexport function getInstCount(instcount: RdfLiteral): number | undefined {\n  return instcount ? +instcount.value : undefined;\n}\n\nexport function getPropertyModel(node: PropertyBinding): PropertyModel {\n  const label = getLocalizedString(node.label);\n  return {\n    id: node.property.value as PropertyTypeIri,\n    label: { values: label ? [label] : [] },\n  };\n}\n\nexport function getLinkCount(sLinkType: LinkCountBinding): LinkCount {\n  return {\n    id: sLinkType.link.value as LinkTypeIri,\n    inCount: getInstCount(sLinkType.inCount),\n    outCount: getInstCount(sLinkType.outCount),\n  };\n}\n\nexport function emptyElementInfo(id: ElementIri): ElementModel {\n  const elementInfo: ElementModel = {\n    id: id,\n    label: { values: [] },\n    types: [],\n    properties: {},\n  };\n  return elementInfo;\n}\n\nexport function getLinkTypeInfo(sLinkInfo: LinkTypeBinding): LinkType {\n  if (!sLinkInfo) {\n    return undefined;\n  }\n  const label = getLocalizedString(sLinkInfo.label);\n  return {\n    id: sLinkInfo.link.value as LinkTypeIri,\n    label: { values: label ? [label] : [] },\n    count: getInstCount(sLinkInfo.instcount),\n  };\n}\n\nexport function prependAdditionalBindings<Binding>(\n  base: SparqlResponse<Binding>,\n  additional: SparqlResponse<Binding> | undefined\n): SparqlResponse<Binding> {\n  if (!additional) {\n    return base;\n  }\n  return {\n    head: { vars: base.head.vars },\n    results: {\n      bindings: [...additional.results.bindings, ...base.results.bindings],\n    },\n  };\n}\n","/**\n * Dataset-schema specific settings for SPARQL data provider.\n */\nexport interface SparqlDataProviderSettings {\n  /**\n   * Default prefix to be used in every query.\n   */\n  defaultPrefix: string;\n\n  /**\n   * Property path for querying schema labels in schema (classes, link types, properties).\n   */\n  schemaLabelProperty: string;\n\n  /**\n   * Property path for querying instance data labels (elements, links).\n   */\n  dataLabelProperty: string;\n\n  /**\n   * Full-text search settings.\n   */\n  fullTextSearch: FullTextSearchSettings;\n\n  /**\n   * SELECT query to retreive class tree.\n   *\n   * Parametrized variables:\n   *   - `${schemaLabelProperty}` `schemaLabelProperty` property from the settings\n   *\n   * Expected output bindings:\n   *   - `?class`\n   *   - `?label` (optional)\n   *   - `?parent` (optional)\n   *   - `?instcount` (optional)\n   */\n  classTreeQuery?: string;\n\n  /**\n   * SELECT query to retrieve data for each class in a set.\n   *\n   * Parametrized variables:\n   *   - `${ids}` VALUES clause content with class IRIs\n   *   - `${schemaLabelProperty}` `schemaLabelProperty` property from the settings\n   *\n   * Expected output bindings:\n   *   - `?class`\n   *   - `?label` (optional)\n   *   - `?instcount` (optional)\n   */\n  classInfoQuery?: string;\n\n  /**\n   * SELECT query to retrieve initial link types.\n   *\n   * Parametrized variables:\n   *   - `${linkTypesPattern}` `linkTypesPattern` property from the settings\n   *   - `${schemaLabelProperty}` `schemaLabelProperty` property from the settings\n   *\n   * Expected output bindings:\n   *   - `?link`\n   *   - `?label` (optional)\n   *   - `?instcount` (optional)\n   */\n  linkTypesQuery?: string;\n\n  /**\n   * Overridable part of `linkTypesQuery` with same output bindings.\n   *\n   * Parametrized variables: none\n   */\n  linkTypesPattern?: string;\n\n  /**\n   * SELECT query to retrieve data for each link type in a set.\n   *\n   * Parametrized variables:\n   *   - `${ids}` VALUES clause content with link type IRIs\n   *   - `${schemaLabelProperty}` `schemaLabelProperty` property from the settings\n   *\n   * Expected output bindings:\n   *   - `?link`\n   *   - `?label` (optional)\n   *   - `?instcount` (optional)\n   */\n  linkTypesInfoQuery?: string;\n\n  /**\n   * SELECT query to retrieve data for each datatype property in a set.\n   *\n   * Parametrized variables:\n   *   - `${ids}` VALUES clause content with datatype property IRIs\n   *   - `${schemaLabelProperty}` `schemaLabelProperty` property from the settings\n   *\n   * Expected output bindings:\n   *   - `?property`\n   *   - `?label` (optional)\n   */\n  propertyInfoQuery?: string;\n\n  /**\n   * CONSTRUCT query to retrieve data for each element (types, labels, properties).\n   *\n   * Parametrized variables:\n   *   - `${ids}` VALUES clause content with element IRIs\n   *   - `${dataLabelProperty}` `dataLabelProperty` property from the settings\n   *   - `${propertyConfigurations}`\n   *\n   * Expected output format for triples:\n   *   - `?inst rdf:type ?class` element has type\n   *   - `?inst rdfs:label ?label` element has label\n   *   - `?inst ?property ?value` element has value for a datatype property\n   */\n  elementInfoQuery: string;\n\n  /**\n   * SELECT query to retrieve all links between specified elements.\n   *\n   * Parametrized variables:\n   *   - `${ids}` VALUES clause content with element IRIs\n   *   - `${linkConfigurations}`\n   *\n   * Expected output bindings:\n   *   - `?type` link type\n   *   - `?source` link source\n   *   - `?target` link target\n   *   - `?propType` (optional) link property type\n   *   - `?propValue` (optional) link property value\n   */\n  linksInfoQuery: string;\n\n  /**\n   * Query pattern to retrieve image URL for an element.\n   *\n   * Expected bindings:\n   *   - `?inst` element IRI\n   *   - `?linkType` image property IRI\n   *   - `?image` result image URL\n   */\n  imageQueryPattern: string;\n\n  /**\n   * SELECT query to retrieve incoming/outgoing link types from specified element with statistics.\n   *\n   * Parametrized variables:\n   *   - `${elementIri}`\n   *   - `${linkConfigurations}`\n   *\n   * Expected bindings:\n   *   - `?link`\n   *   - `?label` (optional)\n   *   - `?instcount` (optional)\n   */\n  linkTypesOfQuery: string;\n\n  /**\n   * SELECT query to retrieve statistics of incoming/outgoing link types for specified element.\n   *\n   * Parametrized variables:\n   *   - `${linkId}`\n   *   - `${elementIri}`\n   *   - `${linkConfigurationOut}`\n   *   - `${linkConfigurationIn}`\n   *   - `${navigateElementFilterOut}` (optional; for blank node support only)\n   *   - `${navigateElementFilterIn}` (optional; for blank node support only)\n   *\n   * Expected bindings:\n   *   - `?link` link type\n   *   - `?inCount` incoming links count\n   *   - `?outCount` outgoing links count\n   */\n  linkTypesStatisticsQuery: string;\n\n  /**\n   * when fetching all links from element, we could specify additional filter\n   */\n  filterRefElementLinkPattern: string;\n\n  /**\n   * SPARQL query pattern to retrieve transitive type sets for elements.\n   *\n   * Expected output bindings:\n   *   - `?inst` element IRI\n   *   - `?class` element type (there may be multiple or transitive types for an element)\n   */\n  filterTypePattern: string;\n\n  /**\n   * how to fetch elements info when fetching data.\n   */\n  filterElementInfoPattern: string;\n\n  /**\n   * imposes additional filtering on elements within filter\n   */\n  filterAdditionalRestriction: string;\n\n  /**\n   * Abstract links configuration - one could abstract a property path as a link on the diagram.\n   */\n  linkConfigurations: LinkConfiguration[];\n\n  /**\n   * (Experimental) Allows data provider to find links other than specified in `linkConfigurations`\n   * when `linkConfigurations` has at least one value set.\n   *\n   * @default false\n   */\n  openWorldLinks?: boolean;\n\n  /**\n   * Abstract property configuration similar to abstract link configuration. Not type-specific yet.\n   */\n  propertyConfigurations: PropertyConfiguration[];\n\n  /**\n   * (Experimental) Allows data provider to find element properties other than specified in\n   * `propertyConfigurations` when `propertyConfigurations` has at least one value set.\n   *\n   * @default false\n   */\n  openWorldProperties?: boolean;\n}\n\n/**\n * Full text search settings,\n * developer could use anything from search extensions of triplestore to regular expressions match\n * See wikidata and dbpedia examples for reusing full text search capabilities of Blazegraph and Virtuozo\n */\nexport interface FullTextSearchSettings {\n  /**\n   * Prefixes to use in full text search queries.\n   */\n  prefix: string;\n\n  /**\n   * SPARQL query pattern to search/restrict results by text token.\n   *\n   * Mutually exclusive with `queryPatternPerWord` — set exactly one of\n   * the two.\n   *\n   * Parametrized variables:\n   *   - `${text}` text token, as typed by the user (may contain multiple words)\n   *   - `${dataLabelProperty}` `dataLabelProperty` property from the settings\n   *\n   * Expected bindings:\n   *   - `?inst` link type\n   *   - `?score` numerical score for ordering search results by relevance\n   *   - `?extractedLabel` (optional; if `extractLabel` is enabled)\n   */\n  queryPattern?: string;\n\n  /**\n   * SPARQL query pattern applied once per whitespace-separated word in the\n   * search text (the resulting patterns are concatenated with an implicit\n   * AND), for full-text search syntaxes that only accept a single word per\n   * triple — e.g. QLever's `ql:has-word` magic property. Mutually exclusive\n   * with `queryPattern` — set exactly one of the two.\n   *\n   * Parametrized variables:\n   *   - `${word}` a single word from the search text (SPARQL-string-escaped)\n   *   - `${dataLabelProperty}` `dataLabelProperty` property from the settings\n   *\n   * Expected bindings: same as `queryPattern`, except `?score` only needs to\n   * be bound once overall (the generated query does this once after all the\n   * per-word patterns, not per word — repeated `BIND` of the same variable\n   * in one scope is invalid SPARQL).\n   */\n  queryPatternPerWord?: string;\n\n  /**\n   * When enabled, adds SPARQL patterns to try to extract label from IRI and\n   * makes it available as `?extractedLabel` binding in `queryPattern`.\n   */\n  extractLabel?: boolean;\n\n  /**\n   * run type filter first?\n   */\n  elementFirst?: boolean;\n}\n\n/**\n * Link abstraction configuration.\n */\nexport interface LinkConfiguration {\n  /**\n   * IRI of the \"virtual\" link\n   */\n  id: string;\n\n  /**\n   * Optional domain constraint for source element of the link.\n   * If specified checks RDF type of source element to match one from this set.\n   */\n  domain?: readonly string[];\n\n  /**\n   * SPARQL predicate or pattern connecting source element to target element.\n   *\n   * Expected bindings (if it is a pattern):\n   *   - `?source` source element\n   *   - `?target` target element\n   *\n   * @example\n   * Direct configuration: `ex:relatedToOther`\n   *\n   * Pattern configuration: `\n   *   ?source ex:hasAddress ?addr .\n   *   ?addr ex:hasCountry ?target .\n   *   OPTIONAL {\n   *     BIND(ex:addressType as ?propType)\n   *     ?addr ex:addressType ?propValue\n   *   }\n   * `\n   */\n  path: string;\n\n  /**\n   * Additional SPARQL patterns can be used for getting properties of the link.\n   *\n   * Expected bindings\n   *   - `?source` source element\n   *   - `?target` target element\n   *   - `?propType` link property type\n   *   - `?propValue` link property value\n   */\n  properties?: string;\n}\n\n/**\n * Specifies property abstraction configuration\n */\nexport interface PropertyConfiguration {\n  /**\n   * IRI of the \"virtual\" link\n   */\n  id: string;\n\n  /**\n   * Optional domain constraint for source element of the property.\n   * If specified checks RDF type of source element to match one from this set.\n   */\n  domain?: readonly string[];\n\n  /**\n   * SPARQL predicate or pattern connecting source element to property value.\n   *\n   * Expected bindings (if it is a pattern):\n   *   - `?inst` source element\n   *   - `?value` property value\n   *\n   * @example\n   * Direct configuration: `ex:firstName`\n   *\n   * Pattern configuration: `\n   *   ?inst ex:hasAddress ?addr .\n   *   ?addr ex:hasApartmentNumber ?value\n   * `\n   */\n  path: string;\n}\n\nexport const RDFSettings: SparqlDataProviderSettings = {\n  linkConfigurations: [],\n  openWorldLinks: false,\n\n  propertyConfigurations: [],\n  openWorldProperties: false,\n\n  linksInfoQuery: `SELECT ?source ?type ?target\n            WHERE {\n                \\${linkConfigurations}\n                VALUES (?source) {\\${ids}}\n                VALUES (?target) {\\${ids}}\n            }`,\n\n  defaultPrefix: \"\",\n\n  schemaLabelProperty: \"rdfs:label\",\n  dataLabelProperty: \"rdfs:label\",\n\n  fullTextSearch: {\n    prefix: \"\",\n    queryPattern: ``,\n    elementFirst: false,\n  },\n\n  classTreeQuery: ``,\n\n  classInfoQuery: `SELECT ?class ?label ?instcount WHERE {\n    VALUES(?class) {\\${ids}}\n    OPTIONAL { ?class \\${schemaLabelProperty} ?label }\n    BIND(\"\" as ?instcount)\n}`,\n\n  linkTypesQuery: `SELECT DISTINCT ?link ?instcount ?label WHERE {\n    \\${linkTypesPattern}\n    OPTIONAL { ?link \\${schemaLabelProperty} ?label }\n}`,\n\n  linkTypesPattern: ``,\n\n  linkTypesInfoQuery: `SELECT ?link ?label WHERE {\n    VALUES(?link) {\\${ids}}\n    OPTIONAL { ?link \\${schemaLabelProperty} ?label }\n}`,\n\n  propertyInfoQuery: `SELECT ?property ?label WHERE {\n    VALUES(?property) {\\${ids}}\n    OPTIONAL { ?property \\${schemaLabelProperty} ?label }\n}`,\n\n  elementInfoQuery: ``,\n  imageQueryPattern: ``,\n\n  linkTypesOfQuery: ``,\n  linkTypesStatisticsQuery: ``,\n  filterRefElementLinkPattern: \"\",\n  filterTypePattern: ``,\n  filterAdditionalRestriction: ``,\n  filterElementInfoPattern: ``,\n};\n\nconst WikidataSettingsOverride: Partial<SparqlDataProviderSettings> = {\n  defaultPrefix: `PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n PREFIX wdt: <http://www.wikidata.org/prop/direct/>\n PREFIX wd: <http://www.wikidata.org/entity/>\n PREFIX owl:  <http://www.w3.org/2002/07/owl#>\n\n`,\n\n  schemaLabelProperty: \"rdfs:label\",\n  dataLabelProperty: \"rdfs:label\",\n\n  fullTextSearch: {\n    prefix: \"PREFIX bds: <http://www.bigdata.com/rdf/search#>\" + \"\\n\",\n    queryPattern: `\n              ?inst rdfs:label ?searchLabel.\n              SERVICE bds:search {\n                     ?searchLabel bds:search \"\\${text}*\" ;\n                                  bds:minRelevance '0.5' ;\n                                  bds:matchAllTerms 'true' .\n              }\n              BIND(IF(STRLEN(?strInst) > 33,\n                            0-<http://www.w3.org/2001/XMLSchema#integer>(SUBSTR(?strInst, 33)),\n                            -10000) as ?score)\n            `,\n  },\n\n  classTreeQuery: `\n            SELECT distinct ?class ?label ?parent WHERE {\n              ?class rdfs:label ?label.\n              { ?class wdt:P279 wd:Q35120. }\n                UNION\n              { ?parent wdt:P279 wd:Q35120.\n                ?class wdt:P279 ?parent. }\n                UNION\n              { ?parent wdt:P279/wdt:P279 wd:Q35120.\n                ?class wdt:P279 ?parent. }\n            }\n        `,\n\n  // todo: think more, maybe add a limit here?\n  linkTypesPattern: `?link wdt:P279* wd:Q18616576.\n    BIND(0 as ?instcount)\n`,\n\n  elementInfoQuery: `\n        CONSTRUCT {\n            ?inst rdf:type ?class .\n            ?inst rdfs:label ?label .\n            ?inst ?propType ?propValue.\n        } WHERE {\n            VALUES (?inst) {\\${ids}}\n            OPTIONAL {\n                ?inst wdt:P31 ?class\n            }\n            OPTIONAL {?inst rdfs:label ?label}\n            OPTIONAL {\n                \\${propertyConfigurations}\n                FILTER (isLiteral(?propValue))\n            }\n        }\n    `,\n  imageQueryPattern: ` { ?inst ?linkType ?fullImage } union { ?inst wdt:P163/wdt:P18 ?fullImage }\n                BIND(CONCAT(\"https://commons.wikimedia.org/w/thumb.php?f=\",\n                    STRAFTER(STR(?fullImage), \"Special:FilePath/\"), \"&w=200\") AS ?image)`,\n  linkTypesOfQuery: `\n        SELECT DISTINCT ?link\n        WHERE {\n            \\${linkConfigurations}\n            ?claim <http://wikiba.se/ontology#directClaim> ?link .\n        }\n    `,\n  linkTypesStatisticsQuery: `\n        SELECT (\\${linkId} as ?link) (COUNT(?outObject) AS ?outCount) (COUNT(?inObject) AS ?inCount)\n        WHERE {\n            {\n                {\n                    SELECT DISTINCT ?outObject WHERE {\n                        \\${linkConfigurationOut}\n                        FILTER(ISIRI(?outObject))\n                        ?outObject ?someprop ?someobj.\n                    }\n                    LIMIT 101\n                }\n            } UNION {\n                {\n                    SELECT DISTINCT ?inObject WHERE {\n                        \\${linkConfigurationIn}\n                        FILTER(ISIRI(?inObject))\n                        ?inObject ?someprop ?someobj.\n                    }\n                    LIMIT 101\n                }\n            }\n        }\n    `,\n  filterRefElementLinkPattern:\n    \"?claim <http://wikiba.se/ontology#directClaim> ?link .\",\n  filterTypePattern: `?inst wdt:P31 ?instType. ?instType wdt:P279* ?class`,\n  filterAdditionalRestriction: `FILTER ISIRI(?inst)\n                        BIND(STR(?inst) as ?strInst)\n                        FILTER exists {?inst ?someprop ?someobj}\n`,\n  filterElementInfoPattern: `OPTIONAL {?inst wdt:P31 ?foundClass}\n                BIND (coalesce(?foundClass, owl:Thing) as ?class)\n                OPTIONAL {?inst rdfs:label ?label}\n`,\n};\n\nexport const WikidataSettings: SparqlDataProviderSettings = {\n  ...RDFSettings,\n  ...WikidataSettingsOverride,\n};\n\nexport const OWLRDFSSettingsOverride: Partial<SparqlDataProviderSettings> = {\n  defaultPrefix: `PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n PREFIX owl:  <http://www.w3.org/2002/07/owl#>\n`,\n  schemaLabelProperty: \"rdfs:label\",\n  dataLabelProperty: \"rdfs:label\",\n  fullTextSearch: {\n    prefix: \"\",\n    queryPattern: ` OPTIONAL {?inst \\${dataLabelProperty} ?search1}\n        FILTER regex(COALESCE(str(?search1), str(?extractedLabel)), \"\\${text}\", \"i\")\n        BIND(0 as ?score)\n`,\n    extractLabel: true,\n  },\n  classTreeQuery: `\n            SELECT ?class ?label ?parent\n            WHERE {\n                {\n                    ?class a rdfs:Class\n                } UNION {\n                    ?class a owl:Class\n                }\n                FILTER ISIRI(?class)\n                OPTIONAL {?class rdfs:label ?label}\n                OPTIONAL {?class rdfs:subClassOf ?parent. FILTER ISIRI(?parent)}\n            }\n        `,\n\n  // todo: think more, maybe add a limit here?\n  linkTypesPattern: `{  ?link a rdf:Property\n                    } UNION {\n                    ?link a owl:ObjectProperty\n                }\n                BIND('' as ?instcount)\n    `,\n  elementInfoQuery: `\n        CONSTRUCT {\n            ?inst rdf:type ?class .\n            ?inst rdfs:label ?label .\n            ?inst ?propType ?propValue.\n        } WHERE {\n            VALUES (?inst) {\\${ids}}\n            OPTIONAL { ?inst a ?class }\n            OPTIONAL {?inst \\${dataLabelProperty} ?label}\n            OPTIONAL {\n                \\${propertyConfigurations}\n                FILTER (isLiteral(?propValue))\n            }\n        }\n    `,\n  imageQueryPattern: `{ ?inst ?linkType ?image } UNION { [] ?linkType ?inst. BIND(?inst as ?image) }`,\n  linkTypesOfQuery: `\n        SELECT DISTINCT ?link\n        WHERE {\n            \\${linkConfigurations}\n        }\n    `,\n  linkTypesStatisticsQuery: `\n        SELECT ?link ?outCount ?inCount\n        WHERE {\n            {\n                SELECT (\\${linkId} as ?link) (count(?outObject) as ?outCount) WHERE {\n                    \\${linkConfigurationOut}\n                    \\${navigateElementFilterOut}\n                } LIMIT 101\n            } {\n                SELECT (\\${linkId} as ?link) (count(?inObject) as ?inCount) WHERE {\n                    \\${linkConfigurationIn}\n                    \\${navigateElementFilterIn}\n                } LIMIT 101\n            }\n        }\n    `,\n  filterRefElementLinkPattern: \"\",\n  filterTypePattern: `?inst a ?instType. ?instType rdfs:subClassOf* ?class`,\n  filterElementInfoPattern: `OPTIONAL {?inst rdf:type ?foundClass}\n                BIND (coalesce(?foundClass, owl:Thing) as ?class)\n                OPTIONAL {?inst \\${dataLabelProperty} ?label}`,\n  filterAdditionalRestriction: \"\",\n};\n\nexport const OWLRDFSSettings: SparqlDataProviderSettings = {\n  ...RDFSettings,\n  ...OWLRDFSSettingsOverride,\n};\n\nconst OWLStatsOverride: Partial<SparqlDataProviderSettings> = {\n  classTreeQuery: `\n        SELECT ?class ?instcount ?label ?parent\n        WHERE {\n            {SELECT ?class (count(?inst) as ?instcount)\n                WHERE {\n                    ?inst rdf:type ?class.\n                    FILTER ISIRI(?class)\n                } GROUP BY ?class } UNION\n            {\n                ?class rdf:type rdfs:Class\n            } UNION {\n                ?class rdf:type owl:Class\n            }\n            OPTIONAL {?class rdfs:label ?label}\n            OPTIONAL {?class rdfs:subClassOf ?parent. FILTER ISIRI(?parent)}\n        }\n    `,\n};\nexport const OWLStatsSettings: SparqlDataProviderSettings = {\n  ...OWLRDFSSettings,\n  ...OWLStatsOverride,\n};\n\nconst DBPediaOverride: Partial<SparqlDataProviderSettings> = {\n  fullTextSearch: {\n    prefix: \"PREFIX dbo: <http://dbpedia.org/ontology/>\\n\",\n    queryPattern: `\n              ?inst rdfs:label ?searchLabel.\n              ?searchLabel bif:contains \"\\${text}\".\n              ?inst dbo:wikiPageID ?origScore .\n              BIND(0-?origScore as ?score)\n        `,\n  },\n\n  classTreeQuery: `\n        SELECT distinct ?class ?label ?parent WHERE {\n            ?class rdfs:label ?label.\n            OPTIONAL {?class rdfs:subClassOf ?parent}\n            ?root rdfs:subClassOf owl:Thing.\n            ?class rdfs:subClassOf? | rdfs:subClassOf/rdfs:subClassOf ?root\n        }\n    `,\n\n  elementInfoQuery: `\n        CONSTRUCT {\n            ?inst rdf:type ?class .\n            ?inst rdfs:label ?label .\n            ?inst ?propType ?propValue.\n        } WHERE {\n            VALUES (?inst) {\\${ids}}\n            ?inst a ?class .\n            ?inst rdfs:label ?label .\n            FILTER (!contains(str(?class), 'http://dbpedia.org/class/yago'))\n            OPTIONAL {\n                \\${propertyConfigurations}\n                FILTER (isLiteral(?propValue))\n            }\n        }\n    `,\n\n  filterTypePattern: `?inst a ?instType. ?instType rdfs:subClassOf* ?class`,\n  filterElementInfoPattern: `\n        OPTIONAL {?inst rdf:type ?foundClass. FILTER (!contains(str(?foundClass), 'http://dbpedia.org/class/yago'))}\n        BIND (coalesce(?foundClass, owl:Thing) as ?class)\n        OPTIONAL {?inst \\${dataLabelProperty} ?label}`,\n\n  imageQueryPattern: ` { ?inst ?linkType ?fullImage } UNION { [] ?linkType ?inst. BIND(?inst as ?fullImage) }\n            BIND(CONCAT(\"https://commons.wikimedia.org/w/thumb.php?f=\",\n            STRAFTER(STR(?fullImage), \"Special:FilePath/\"), \"&w=200\") AS ?image)\n    `,\n};\nexport const DBPediaSettings: SparqlDataProviderSettings = {\n  ...OWLRDFSSettings,\n  ...DBPediaOverride,\n};\n\nconst QLeverOverride: Partial<SparqlDataProviderSettings> = {\n  fullTextSearch: {\n    prefix: \"PREFIX ql: <http://qlever.cs.uni-freiburg.de/builtin-functions/>\\n\",\n    // QLever's `ql:has-word` magic property only matches a single word per\n    // triple (case-insensitively); multiple words need one triple each,\n    // ANDed together, hence `queryPatternPerWord` instead of `queryPattern`.\n    queryPatternPerWord: `\n              ?inst \\${dataLabelProperty} ?searchLabel .\n              ?searchLabel ql:has-word \"\\${word}\" .\n        `,\n  },\n};\nexport const QLeverSettings: SparqlDataProviderSettings = {\n  ...OWLRDFSSettings,\n  ...QLeverOverride,\n};\n","import * as N3 from \"n3\";\nimport * as RDF from \"@rdfjs/types\";\n\nimport { RdfNode, Triple } from \"./sparqlModels\";\n\nexport function parseTurtleText(turtleText: string): Promise<Triple[]> {\n  return new Promise<Triple[]>((resolve, reject) => {\n    const triples: Triple[] = [];\n    new N3.Parser().parse(turtleText, (error, triple, _hash) => {\n      if (error) {\n        reject(error);\n      } else if (triple) {\n        triples.push({\n          subject: n3toRdfNode(triple.subject),\n          predicate: n3toRdfNode(triple.predicate),\n          object: n3toRdfNode(triple.object),\n        });\n      } else {\n        resolve(triples);\n      }\n    });\n  });\n}\n\nexport function n3toRdfNode(entity: RDF.Term): RdfNode {\n  if (N3.Util.isLiteral(entity)) {\n    const literal = entity as RDF.Literal;\n    return {\n      type: \"literal\",\n      value: literal.value,\n      datatype: literal.datatype.value,\n      \"xml:lang\": literal.language,\n    };\n  } else {\n    return { type: \"uri\", value: entity.value };\n  }\n}\n","import {\n  objectValues,\n  getOrCreateArrayInMap,\n} from \"../../viewUtils/collections\";\nimport { DataProvider, LinkElementsParams, FilterParams } from \"../provider\";\nimport {\n  Dictionary,\n  ClassModel,\n  LinkType,\n  ElementModel,\n  LinkModel,\n  LinkCount,\n  PropertyModel,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n  PropertyTypeIri,\n  LocalizedString,\n} from \"../model\";\nimport {\n  prependAdditionalBindings,\n  enrichElementsWithImages,\n  flattenClassTree,\n  getClassTree,\n  getClassInfo,\n  getPropertyInfo,\n  getLinkTypes,\n  getElementsInfo,\n  getElementTypes,\n  getLinksInfo,\n  getLinksTypeIds,\n  getFilteredData,\n  getLinksTypesOf,\n  getLinkStatistics,\n  triplesToElementBinding,\n  isDirectLink,\n  isDirectProperty,\n} from \"./responseHandler\";\nimport {\n  ClassBinding,\n  ElementBinding,\n  LinkBinding,\n  PropertyBinding,\n  BlankBinding,\n  FilterBinding,\n  LinkCountBinding,\n  LinkTypeBinding,\n  ElementImageBinding,\n  ElementTypeBinding,\n  SparqlResponse,\n  Triple,\n} from \"./sparqlModels\";\nimport {\n  SparqlDataProviderSettings,\n  OWLStatsSettings,\n  LinkConfiguration,\n  PropertyConfiguration,\n} from \"./sparqlDataProviderSettings\";\nimport * as BlankNodes from \"./blankNodes\";\nimport { parseTurtleText } from \"./turtle\";\n\nexport enum SparqlQueryMethod {\n  GET = 1,\n  POST,\n}\n\nexport type QueryFunction = (params: {\n  url: string;\n  body?: string;\n  headers: Record<string, string>;\n  method: string;\n}) => Promise<Response>;\n\n/**\n * Runtime settings of SPARQL data provider\n */\nexport interface SparqlDataProviderOptions {\n  /**\n   * If it's true then blank nodes will be present on the paper\n   * By default blank nodes wont be shown\n   */\n  acceptBlankNodes?: boolean;\n\n  /**\n   *  sparql endpoint URL to use\n   */\n  endpointUrl: string;\n\n  // there are two options for fetching images: specify imagePropertyUris\n  // to use as image properties or specify a function to fetch image URLs\n\n  /**\n   * properties to use as image URLs\n   */\n  imagePropertyUris?: string[];\n\n  /**\n   * Allows to extract/fetch image URLs externally instead of using `imagePropertyUris` option.\n   */\n  prepareImages?: (\n    elementInfo: Dictionary<ElementModel>\n  ) => Promise<Dictionary<string>>;\n\n  /**\n   * Allows to extract/fetch labels separately from SPARQL query as an alternative or\n   * in addition to `label` output binding.\n   */\n  prepareLabels?: (\n    resources: Set<string>\n  ) => Promise<Map<string, LocalizedString[]>>;\n\n  /**\n   * wether to use GET (more compatible (Virtuozo), more error-prone due to large request URLs)\n   * or POST(less compatible, better on large data sets)\n   */\n  queryMethod?: SparqlQueryMethod;\n\n  /*\n   * function to send sparql requests\n   */\n  queryFunction?: QueryFunction;\n}\n\nexport class SparqlDataProvider implements DataProvider {\n  readonly options: SparqlDataProviderOptions;\n  readonly settings: SparqlDataProviderSettings;\n\n  private linkByPredicate = new Map<string, LinkConfiguration[]>();\n  private linkById = new Map<LinkTypeIri, LinkConfiguration>();\n  private openWorldLinks: boolean;\n\n  private propertyByPredicate = new Map<string, PropertyConfiguration[]>();\n  private openWorldProperties: boolean;\n\n  constructor(\n    options: SparqlDataProviderOptions,\n    settings: SparqlDataProviderSettings = OWLStatsSettings\n  ) {\n    const { queryFunction = queryInternal } = options;\n    this.options = { ...options, queryFunction };\n    this.settings = settings;\n\n    for (const link of settings.linkConfigurations) {\n      this.linkById.set(link.id as LinkTypeIri, link);\n      const predicate = isDirectLink(link) ? link.path : link.id;\n      getOrCreateArrayInMap(this.linkByPredicate, predicate).push(link);\n    }\n    this.openWorldLinks =\n      settings.linkConfigurations.length === 0 ||\n      Boolean(settings.openWorldLinks);\n\n    for (const property of settings.propertyConfigurations) {\n      const predicate = isDirectProperty(property)\n        ? property.path\n        : property.id;\n      getOrCreateArrayInMap(this.propertyByPredicate, predicate).push(property);\n    }\n    this.openWorldProperties =\n      settings.propertyConfigurations.length === 0 ||\n      Boolean(settings.openWorldProperties);\n  }\n\n  async classTree(): Promise<ClassModel[]> {\n    const { defaultPrefix, schemaLabelProperty, classTreeQuery } =\n      this.settings;\n    if (!classTreeQuery) {\n      return [];\n    }\n\n    const query =\n      defaultPrefix +\n      resolveTemplate(classTreeQuery, {\n        schemaLabelProperty,\n      });\n    const result = await this.executeSparqlQuery<ClassBinding>(query);\n    const classTree = getClassTree(result);\n\n    if (this.options.prepareLabels) {\n      await attachLabels(\n        flattenClassTree(classTree),\n        this.options.prepareLabels\n      );\n    }\n\n    return classTree;\n  }\n\n  async propertyInfo(params: {\n    propertyIds: PropertyTypeIri[];\n  }): Promise<Dictionary<PropertyModel>> {\n    const { defaultPrefix, schemaLabelProperty, propertyInfoQuery } =\n      this.settings;\n\n    let properties: Dictionary<PropertyModel>;\n    if (propertyInfoQuery) {\n      const ids = params.propertyIds\n        .map(escapeIri)\n        .map((id) => ` ( ${id} )`)\n        .join(\" \");\n      const query =\n        defaultPrefix +\n        resolveTemplate(propertyInfoQuery, {\n          ids,\n          schemaLabelProperty,\n        });\n      const result = await this.executeSparqlQuery<PropertyBinding>(query);\n      properties = getPropertyInfo(result);\n    } else {\n      properties = {};\n      for (const id of params.propertyIds) {\n        properties[id] = { id, label: { values: [] } };\n      }\n    }\n\n    if (this.options.prepareLabels) {\n      await attachLabels(objectValues(properties), this.options.prepareLabels);\n    }\n\n    return properties;\n  }\n\n  async classInfo(params: {\n    classIds: ElementTypeIri[];\n  }): Promise<ClassModel[]> {\n    const { defaultPrefix, schemaLabelProperty, classInfoQuery } =\n      this.settings;\n\n    let classes: ClassModel[];\n    if (classInfoQuery) {\n      const ids = params.classIds\n        .map(escapeIri)\n        .map((id) => ` ( ${id} )`)\n        .join(\" \");\n      const query =\n        defaultPrefix +\n        resolveTemplate(classInfoQuery, {\n          ids,\n          schemaLabelProperty,\n        });\n      const result = await this.executeSparqlQuery<ClassBinding>(query);\n      classes = getClassInfo(result);\n    } else {\n      classes = params.classIds.map(\n        (id): ClassModel => ({ id, label: { values: [] }, children: [] })\n      );\n    }\n\n    if (this.options.prepareLabels) {\n      await attachLabels(classes, this.options.prepareLabels);\n    }\n\n    return classes;\n  }\n\n  async linkTypesInfo(params: {\n    linkTypeIds: LinkTypeIri[];\n  }): Promise<LinkType[]> {\n    const { defaultPrefix, schemaLabelProperty, linkTypesInfoQuery } =\n      this.settings;\n\n    let linkTypes: LinkType[];\n    if (linkTypesInfoQuery) {\n      const ids = params.linkTypeIds\n        .map(escapeIri)\n        .map((id) => ` ( ${id} )`)\n        .join(\" \");\n      const query =\n        defaultPrefix +\n        resolveTemplate(linkTypesInfoQuery, {\n          ids,\n          schemaLabelProperty,\n        });\n      const result = await this.executeSparqlQuery<LinkTypeBinding>(query);\n      linkTypes = getLinkTypes(result);\n    } else {\n      linkTypes = params.linkTypeIds.map(\n        (id): LinkType => ({ id, label: { values: [] } })\n      );\n    }\n\n    if (this.options.prepareLabels) {\n      await attachLabels(linkTypes, this.options.prepareLabels);\n    }\n\n    return linkTypes;\n  }\n\n  async linkTypes(): Promise<LinkType[]> {\n    const {\n      defaultPrefix,\n      schemaLabelProperty,\n      linkTypesQuery,\n      linkTypesPattern,\n    } = this.settings;\n    if (!linkTypesQuery) {\n      return [];\n    }\n\n    const query =\n      defaultPrefix +\n      resolveTemplate(linkTypesQuery, {\n        linkTypesPattern,\n        schemaLabelProperty,\n      });\n    const result = await this.executeSparqlQuery<LinkTypeBinding>(query);\n    const linkTypes = getLinkTypes(result);\n\n    if (this.options.prepareLabels) {\n      await attachLabels(linkTypes, this.options.prepareLabels);\n    }\n\n    return linkTypes;\n  }\n\n  async elementInfo(params: {\n    elementIds: ElementIri[];\n  }): Promise<Dictionary<ElementModel>> {\n    const nonBlankResources = params.elementIds.filter(\n      (id) => !BlankNodes.isEncodedBlank(id)\n    );\n    const blankNodeResponse = this.options.acceptBlankNodes\n      ? BlankNodes.elementInfo(params.elementIds)\n      : undefined;\n\n    let triples: Triple[];\n    if (nonBlankResources.length > 0) {\n      const ids = nonBlankResources\n        .map(escapeIri)\n        .map((id) => ` (${id})`)\n        .join(\" \");\n      const { defaultPrefix, dataLabelProperty, elementInfoQuery } =\n        this.settings;\n      const query =\n        defaultPrefix +\n        resolveTemplate(elementInfoQuery, {\n          ids,\n          dataLabelProperty,\n          propertyConfigurations: this.formatPropertyInfo(),\n        });\n      triples = await this.executeSparqlConstruct(query);\n    } else {\n      triples = [];\n    }\n\n    const types = this.queryManyElementTypes(\n      this.settings.propertyConfigurations.length > 0 ? params.elementIds : []\n    );\n\n    const bindings = triplesToElementBinding(triples);\n    const bindingsWithBlanks = prependAdditionalBindings(\n      bindings,\n      blankNodeResponse\n    );\n    const elementModels = getElementsInfo(\n      bindingsWithBlanks,\n      await types,\n      this.propertyByPredicate,\n      this.openWorldProperties\n    );\n\n    if (this.options.prepareLabels) {\n      await attachLabels(\n        objectValues(elementModels),\n        this.options.prepareLabels\n      );\n    }\n\n    if (this.options.prepareImages) {\n      await prepareElementImages(this.options.prepareImages, elementModels);\n    } else if (\n      this.options.imagePropertyUris &&\n      this.options.imagePropertyUris.length\n    ) {\n      await this.attachImages(elementModels, this.options.imagePropertyUris);\n    }\n\n    return elementModels;\n  }\n\n  private async attachImages(\n    elementsInfo: Dictionary<ElementModel>,\n    types: string[]\n  ): Promise<void> {\n    const ids = Object.keys(elementsInfo)\n      .filter((id) => !BlankNodes.isEncodedBlank(id))\n      .map(escapeIri)\n      .map((id) => ` ( ${id} )`)\n      .join(\" \");\n    const typesString = types\n      .map(escapeIri)\n      .map((id) => ` ( ${id} )`)\n      .join(\" \");\n\n    const query =\n      this.settings.defaultPrefix +\n      `\n            SELECT ?inst ?linkType ?image\n            WHERE {{\n                VALUES (?inst) {${ids}}\n                VALUES (?linkType) {${typesString}}\n                ${this.settings.imageQueryPattern}\n            }}\n        `;\n    try {\n      const bindings = await this.executeSparqlQuery<ElementImageBinding>(\n        query\n      );\n      enrichElementsWithImages(bindings, elementsInfo);\n    } catch (err) {\n      console.error(err);\n    }\n  }\n\n  async linksInfo(params: {\n    elementIds: ElementIri[];\n    linkTypeIds: LinkTypeIri[];\n  }): Promise<LinkModel[]> {\n    const nonBlankResources = params.elementIds.filter(\n      (id) => !BlankNodes.isEncodedBlank(id)\n    );\n    const blankNodeResponse = this.options.acceptBlankNodes\n      ? BlankNodes.linksInfo(params.elementIds)\n      : undefined;\n\n    const linkConfigurations = this.formatLinkLinks();\n\n    let bindings: Promise<SparqlResponse<LinkBinding>>;\n    let types: Promise<Map<ElementIri, Set<ElementTypeIri>>>;\n    if (nonBlankResources.length > 0) {\n      const ids = nonBlankResources\n        .map(escapeIri)\n        .map((id) => ` ( ${id} )`)\n        .join(\" \");\n      const linksInfoQuery =\n        this.settings.defaultPrefix +\n        resolveTemplate(this.settings.linksInfoQuery, {\n          ids,\n          linkConfigurations,\n        });\n      bindings = this.executeSparqlQuery<LinkBinding>(linksInfoQuery);\n      types = this.queryManyElementTypes(params.elementIds);\n    } else {\n      bindings = Promise.resolve({\n        head: { vars: [] },\n        results: { bindings: [] },\n      });\n      types = this.queryManyElementTypes([]);\n    }\n\n    const bindingsWithBlanks = prependAdditionalBindings(\n      await bindings,\n      blankNodeResponse\n    );\n    const linksInfo = getLinksInfo(\n      bindingsWithBlanks,\n      await types,\n      this.linkByPredicate,\n      this.openWorldLinks\n    );\n    return linksInfo;\n  }\n\n  async linkTypesOf(params: { elementId: ElementIri }): Promise<LinkCount[]> {\n    if (\n      this.options.acceptBlankNodes &&\n      BlankNodes.isEncodedBlank(params.elementId)\n    ) {\n      return Promise.resolve(getLinksTypesOf(BlankNodes.linkTypesOf(params)));\n    }\n    const {\n      defaultPrefix,\n      linkTypesOfQuery,\n      linkTypesStatisticsQuery,\n      filterTypePattern,\n    } = this.settings;\n\n    const elementIri = escapeIri(params.elementId);\n    const forAll = this.formatLinkUnion(\n      params.elementId,\n      undefined,\n      undefined,\n      \"?outObject\",\n      \"?inObject\",\n      false\n    );\n    if (forAll.usePredicatePart) {\n      forAll.unionParts.push(`{ ${elementIri} ?link ?outObject }`);\n      forAll.unionParts.push(`{ ?inObject ?link ${elementIri} }`);\n    }\n\n    const query =\n      defaultPrefix +\n      resolveTemplate(linkTypesOfQuery, {\n        elementIri,\n        linkConfigurations: forAll.unionParts.join(\"\\nUNION\\n\"),\n      });\n\n    const linkTypeBindings = await this.executeSparqlQuery<LinkTypeBinding>(\n      query\n    );\n    const linkTypeIds = getLinksTypeIds(\n      linkTypeBindings,\n      this.linkByPredicate,\n      this.openWorldLinks\n    );\n\n    const navigateElementFilterOut = this.options.acceptBlankNodes\n      ? `FILTER (IsIri(?outObject) || IsBlank(?outObject))`\n      : `FILTER IsIri(?outObject)`;\n    const navigateElementFilterIn = this.options.acceptBlankNodes\n      ? `FILTER (IsIri(?inObject) || IsBlank(?inObject))`\n      : `FILTER IsIri(?inObject)`;\n\n    const foundLinkStats: LinkCount[] = [];\n    await Promise.all(\n      linkTypeIds.map(async (linkId) => {\n        const linkConfig = this.linkById.get(linkId);\n        let linkConfigurationOut: string;\n        let linkConfigurationIn: string;\n\n        if (!linkConfig || isDirectLink(linkConfig)) {\n          const predicate = escapeIri(\n            linkConfig && isDirectLink(linkConfig) ? linkConfig.path : linkId\n          );\n          linkConfigurationOut = `${elementIri} ${predicate} ?outObject`;\n          linkConfigurationIn = `?inObject ${predicate} ${elementIri}`;\n        } else {\n          linkConfigurationOut = this.formatLinkPath(\n            linkConfig.path,\n            elementIri,\n            \"?outObject\"\n          );\n          linkConfigurationIn = this.formatLinkPath(\n            linkConfig.path,\n            \"?inObject\",\n            elementIri\n          );\n        }\n\n        if (linkConfig && linkConfig.domain?.length > 0) {\n          const commaSeparatedDomains = linkConfig.domain\n            .map(escapeIri)\n            .join(\", \");\n          const restrictionOut = filterTypePattern.replace(\n            /[?$]inst\\b/g,\n            elementIri\n          );\n          const restrictionIn = filterTypePattern.replace(\n            /[?$]inst\\b/g,\n            \"?inObject\"\n          );\n          linkConfigurationOut += ` { ${restrictionOut} FILTER(?class IN (${commaSeparatedDomains})) }`;\n          linkConfigurationIn += ` { ${restrictionIn} FILTER(?class IN (${commaSeparatedDomains})) }`;\n        }\n\n        const statsQuery =\n          defaultPrefix +\n          resolveTemplate(linkTypesStatisticsQuery, {\n            linkId: escapeIri(linkId),\n            elementIri,\n            linkConfigurationOut,\n            linkConfigurationIn,\n            navigateElementFilterOut,\n            navigateElementFilterIn,\n          });\n\n        const bindings = await this.executeSparqlQuery<LinkCountBinding>(\n          statsQuery\n        );\n        const linkStats = getLinkStatistics(bindings);\n        if (linkStats) {\n          foundLinkStats.push(linkStats);\n        }\n      })\n    );\n    return foundLinkStats;\n  }\n\n  linkElements(params: LinkElementsParams): Promise<Dictionary<ElementModel>> {\n    // for sparql we have rich filtering features and we just reuse filter.\n    return this.filter({\n      refElementId: params.elementId,\n      refElementLinkId: params.linkId,\n      linkDirection: params.direction,\n      limit: params.limit,\n      offset: params.offset,\n      languageCode: \"\",\n    });\n  }\n\n  async filter(baseParams: FilterParams): Promise<Dictionary<ElementModel>> {\n    const params: FilterParams = { ...baseParams };\n    if (params.limit === undefined) {\n      params.limit = 100;\n    }\n\n    // query types to match link configuration domains\n    const types = this.querySingleElementTypes(\n      params.refElementId && this.settings.linkConfigurations.length > 0\n        ? params.refElementId\n        : undefined\n    );\n\n    const blankFiltration = this.options.acceptBlankNodes\n      ? BlankNodes.filter(params)\n      : undefined;\n    if (blankFiltration && blankFiltration.results.bindings.length > 0) {\n      return getFilteredData(\n        blankFiltration,\n        await types,\n        this.linkByPredicate,\n        this.openWorldLinks\n      );\n    }\n\n    const filterQuery = this.createFilterQuery(params);\n    const bindings = await this.executeSparqlQuery<\n      ElementBinding & FilterBinding\n    >(filterQuery);\n\n    let bindingsWithBlanks: SparqlResponse<ElementBinding & FilterBinding>;\n    if (this.options.acceptBlankNodes) {\n      bindingsWithBlanks = await BlankNodes.updateFilterResults(\n        bindings,\n        (blankQuery) => this.executeSparqlQuery<BlankBinding>(blankQuery),\n        this.settings\n      );\n    } else {\n      bindingsWithBlanks = bindings as SparqlResponse<\n        ElementBinding & FilterBinding\n      >;\n    }\n\n    const elementModels = getFilteredData(\n      bindingsWithBlanks,\n      await types,\n      this.linkByPredicate,\n      this.openWorldLinks\n    );\n\n    if (this.options.prepareLabels) {\n      await attachLabels(\n        objectValues(elementModels),\n        this.options.prepareLabels\n      );\n    }\n\n    return elementModels;\n  }\n\n  private createFilterQuery(params: FilterParams): string {\n    if (!params.refElementId && params.refElementLinkId) {\n      throw new Error(\n        \"Cannot execute refElementLink filter without refElement\"\n      );\n    }\n\n    let outerProjection = \"?inst ?class ?label ?blankType\";\n    let innerProjection = \"?inst\";\n\n    let refQueryPart = \"\";\n    let refQueryTypes = \"\";\n    if (params.refElementId) {\n      outerProjection += \" ?link ?direction\";\n      innerProjection += \" ?link ?direction\";\n      refQueryPart = this.createRefQueryPart({\n        elementId: params.refElementId,\n        linkId: params.refElementLinkId,\n        direction: params.linkDirection,\n      });\n\n      if (this.settings.linkConfigurations.length > 0) {\n        outerProjection += \" ?classAll\";\n        refQueryTypes = this.settings.filterTypePattern.replace(\n          /[?$]class\\b/g,\n          \"?classAll\"\n        );\n      }\n    }\n\n    let elementTypePart = \"\";\n    if (params.elementTypeId) {\n      const elementTypeIri = escapeIri(params.elementTypeId);\n      elementTypePart = this.settings.filterTypePattern.replace(\n        /[?$]class\\b/g,\n        elementTypeIri\n      );\n      elementTypePart += \" .\";\n    }\n\n    const { defaultPrefix, fullTextSearch, dataLabelProperty } = this.settings;\n\n    let textSearchPart = \"\";\n    if (params.text) {\n      innerProjection += \" ?score\";\n      if (this.settings.fullTextSearch.extractLabel) {\n        // NOTE: pre-existing dead store — this value is overwritten by the\n        // assignment below, so the extracted-label part is currently discarded.\n        // Kept as-is to avoid changing SPARQL query behaviour during the upgrade.\n        // eslint-disable-next-line no-useless-assignment\n        textSearchPart += sparqlExtractLabel(\"?inst\", \"?extractedLabel\");\n      }\n      if (fullTextSearch.queryPatternPerWord) {\n        const words = params.text.trim().split(/\\s+/).filter(Boolean);\n        textSearchPart =\n          words\n            .map((word) =>\n              resolveTemplate(fullTextSearch.queryPatternPerWord, {\n                word: escapeSparqlStringLiteral(word),\n                dataLabelProperty,\n              })\n            )\n            .join(\"\\n\") + \"\\nBIND(0 as ?score)\";\n      } else {\n        textSearchPart = resolveTemplate(fullTextSearch.queryPattern, {\n          text: params.text,\n          dataLabelProperty,\n        });\n      }\n    }\n\n    const blankNodes = this.options.acceptBlankNodes;\n    if (blankNodes) {\n      outerProjection += ` ${BlankNodes.BLANK_NODE_QUERY_PARAMETERS}`;\n    }\n\n    return `${defaultPrefix}\n            ${fullTextSearch.prefix}\n\n        SELECT ${outerProjection}\n        WHERE {\n            {\n                SELECT DISTINCT ${innerProjection} WHERE {\n                    ${fullTextSearch.elementFirst ? \"\" : textSearchPart}\n                    ${elementTypePart}\n                    ${refQueryPart}\n                    ${fullTextSearch.elementFirst ? textSearchPart : \"\"}\n                    ${this.settings.filterAdditionalRestriction}\n                }\n                ${textSearchPart ? \"ORDER BY DESC(?score)\" : \"\"}\n                LIMIT ${params.limit} OFFSET ${params.offset}\n            }\n            ${refQueryTypes}\n            ${resolveTemplate(this.settings.filterElementInfoPattern, {\n              dataLabelProperty,\n            })}\n            ${blankNodes ? BlankNodes.BLANK_NODE_QUERY : \"\"}\n        } ${textSearchPart ? \"ORDER BY DESC(?score)\" : \"\"}\n        `;\n  }\n\n  executeSparqlQuery<Binding>(query: string) {\n    const method = this.options.queryMethod\n      ? this.options.queryMethod\n      : SparqlQueryMethod.GET;\n    return executeSparqlQuery<Binding>(\n      this.options.endpointUrl,\n      query,\n      method,\n      this.options.queryFunction\n    );\n  }\n\n  executeSparqlConstruct(query: string): Promise<Triple[]> {\n    const method = this.options.queryMethod\n      ? this.options.queryMethod\n      : SparqlQueryMethod.GET;\n    return executeSparqlConstruct(\n      this.options.endpointUrl,\n      query,\n      method,\n      this.options.queryFunction\n    );\n  }\n\n  protected createRefQueryPart(params: {\n    elementId: ElementIri;\n    linkId?: LinkTypeIri;\n    direction?: \"in\" | \"out\";\n  }) {\n    const { elementId, linkId, direction } = params;\n\n    const { unionParts, usePredicatePart } = this.formatLinkUnion(\n      elementId,\n      linkId,\n      direction,\n      \"?inst\",\n      \"?inst\",\n      true\n    );\n\n    if (usePredicatePart) {\n      const refElementIRI = escapeIri(params.elementId);\n      let refLinkType: string | undefined;\n      if (linkId) {\n        const link = this.linkById.get(linkId);\n        refLinkType =\n          link && isDirectLink(link) ? escapeIri(link.path) : escapeIri(linkId);\n      }\n\n      const linkPattern = refLinkType || \"?link\";\n      const bindType = refLinkType ? `BIND(${refLinkType} as ?link)` : \"\";\n      // FILTER ISIRI is used to prevent blank nodes appearing in results\n      const blankFilter = this.options.acceptBlankNodes\n        ? \"FILTER(isIri(?inst) || isBlank(?inst))\"\n        : \"FILTER(isIri(?inst))\";\n\n      if (!direction || direction === \"out\") {\n        unionParts.push(\n          `{ ${refElementIRI} ${linkPattern} ?inst BIND(\"out\" as ?direction) ${bindType} ${blankFilter} }`\n        );\n      }\n      if (!direction || direction === \"in\") {\n        unionParts.push(\n          `{ ?inst ${linkPattern} ${refElementIRI} BIND(\"in\" as ?direction) ${bindType} ${blankFilter} }`\n        );\n      }\n    }\n\n    let resultPattern =\n      unionParts.length === 0 ? \"FILTER(false)\" : unionParts.join(`\\nUNION\\n`);\n\n    const useAllLinksPattern =\n      !linkId && this.settings.filterRefElementLinkPattern.length > 0;\n    if (useAllLinksPattern) {\n      resultPattern += `\\n${this.settings.filterRefElementLinkPattern}`;\n    }\n\n    return resultPattern;\n  }\n\n  private formatLinkUnion(\n    refElementIri: ElementIri,\n    linkIri: LinkTypeIri | undefined,\n    direction: \"in\" | \"out\" | undefined,\n    outElementVar: string,\n    inElementVar: string,\n    bindDirection: boolean\n  ) {\n    const { linkConfigurations } = this.settings;\n    const fixedIri = escapeIri(refElementIri);\n\n    const unionParts: string[] = [];\n    let hasDirectLink = false;\n\n    for (const link of linkConfigurations) {\n      if (linkIri && link.id !== linkIri) {\n        continue;\n      }\n      if (isDirectLink(link)) {\n        hasDirectLink = true;\n      } else {\n        const linkType = escapeIri(link.id);\n        if (!direction || direction === \"out\") {\n          const path = this.formatLinkPath(link.path, fixedIri, outElementVar);\n          const boundedDirection = bindDirection\n            ? `BIND(\"out\" as ?direction) `\n            : \"\";\n          unionParts.push(\n            `{ ${path} BIND(${linkType} as ?link) ${boundedDirection}}`\n          );\n        }\n        if (!direction || direction === \"in\") {\n          const path = this.formatLinkPath(link.path, inElementVar, fixedIri);\n          const boundedDirection = bindDirection\n            ? `BIND(\"in\" as ?direction) `\n            : \"\";\n          unionParts.push(\n            `{ ${path} BIND(${linkType} as ?link) ${boundedDirection}}`\n          );\n        }\n      }\n    }\n\n    const usePredicatePart = this.openWorldLinks || hasDirectLink;\n    return { unionParts, usePredicatePart };\n  }\n\n  formatLinkLinks(): string {\n    const unionParts: string[] = [];\n    let hasDirectLink = false;\n    for (const link of this.settings.linkConfigurations) {\n      if (isDirectLink(link)) {\n        hasDirectLink = true;\n      } else {\n        const linkType = escapeIri(link.id);\n        unionParts.push(\n          `{ ${this.formatLinkPath(\n            link.path,\n            \"?source\",\n            \"?target\"\n          )} BIND(${linkType} as ?type) }`\n        );\n      }\n    }\n\n    const usePredicatePart = this.openWorldLinks || hasDirectLink;\n    if (usePredicatePart) {\n      unionParts.push(`{ ?source ?type ?target }`);\n    }\n\n    return unionParts.join(\"\\nUNION\\n\");\n  }\n\n  formatLinkPath(path: string, source: string, target: string): string {\n    return path\n      .replace(/[?$]source\\b/g, source)\n      .replace(/[?$]target\\b/g, target);\n  }\n\n  formatPropertyInfo(): string {\n    const unionParts: string[] = [];\n    let hasDirectProperty = false;\n    for (const property of this.settings.propertyConfigurations) {\n      if (isDirectProperty(property)) {\n        hasDirectProperty = true;\n      } else {\n        const propType = escapeIri(property.id);\n        const formatted = this.formatPropertyPath(\n          property.path,\n          \"?inst\",\n          \"?propValue\"\n        );\n        unionParts.push(`{ ${formatted} BIND(${propType} as ?propType) }`);\n      }\n    }\n\n    const usePredicatePart = this.openWorldProperties || hasDirectProperty;\n    if (usePredicatePart) {\n      unionParts.push(`{ ?inst ?propType ?propValue }`);\n    }\n\n    return unionParts.join(\"\\nUNION\\n\");\n  }\n\n  formatPropertyPath(path: string, subject: string, value: string): string {\n    return path.replace(/[?$]inst\\b/g, subject).replace(/[?$]value\\b/g, value);\n  }\n\n  private async querySingleElementTypes(\n    element: ElementIri | undefined\n  ): Promise<Set<ElementTypeIri> | undefined> {\n    const types = await this.queryManyElementTypes(element ? [element] : []);\n    return types.get(element);\n  }\n\n  private async queryManyElementTypes(\n    elements: readonly ElementIri[]\n  ): Promise<Map<ElementIri, Set<ElementTypeIri>>> {\n    if (elements.length === 0) {\n      return new Map();\n    }\n    const { filterTypePattern } = this.settings;\n    const ids = elements\n      .filter((iri) => !BlankNodes.isEncodedBlank(iri))\n      .map((iri) => `(${escapeIri(iri)})`)\n      .join(\" \");\n\n    const queryTemplate =\n      this.settings.defaultPrefix +\n      `SELECT ?inst ?class { VALUES(?inst) { \\${ids} } \\${filterTypePattern} }`;\n    const query = resolveTemplate(queryTemplate, { ids, filterTypePattern });\n    let response = await this.executeSparqlQuery<ElementTypeBinding>(query);\n\n    if (\n      this.options.acceptBlankNodes &&\n      elements.find(BlankNodes.isEncodedBlank)\n    ) {\n      const blankResponse = BlankNodes.getElementTypes(elements);\n      response = prependAdditionalBindings(response, blankResponse);\n    }\n\n    return getElementTypes(response);\n  }\n}\n\ninterface LabeledItem {\n  id: string;\n  label: { values: LocalizedString[] };\n}\n\nasync function attachLabels(\n  items: readonly LabeledItem[],\n  fetchLabels: SparqlDataProviderOptions[\"prepareLabels\"]\n): Promise<void> {\n  const resources = new Set<string>();\n  for (const item of items) {\n    if (BlankNodes.isEncodedBlank(item.id)) {\n      continue;\n    }\n    resources.add(item.id);\n  }\n  const labels = await fetchLabels(resources);\n  for (const item of items) {\n    if (labels.has(item.id)) {\n      item.label = { values: labels.get(item.id) };\n    }\n  }\n}\n\nfunction prepareElementImages(\n  fetchImages: SparqlDataProviderOptions[\"prepareImages\"],\n  elementsInfo: Dictionary<ElementModel>\n): Promise<void> {\n  return fetchImages(elementsInfo).then((images) => {\n    for (const iri in images) {\n      if (\n        Object.prototype.hasOwnProperty.call(images, iri) &&\n        elementsInfo[iri]\n      ) {\n        elementsInfo[iri].image = images[iri];\n      }\n    }\n  });\n}\n\nfunction resolveTemplate(template: string, values: Dictionary<string>) {\n  let result = template;\n  for (const replaceKey in values) {\n    if (!Object.prototype.hasOwnProperty.call(values, replaceKey)) {\n      continue;\n    }\n    const replaceValue = values[replaceKey];\n    if (replaceValue) {\n      result = result.replace(\n        new RegExp(\"\\\\${\" + replaceKey + \"}\", \"g\"),\n        replaceValue\n      );\n    }\n  }\n  return result;\n}\n\nexport function executeSparqlQuery<Binding>(\n  endpoint: string,\n  query: string,\n  method: SparqlQueryMethod,\n  queryFunction: QueryFunction\n): Promise<SparqlResponse<Binding>> {\n  let internalQuery: Promise<Response>;\n  if (method === SparqlQueryMethod.GET) {\n    internalQuery = queryFunction({\n      url: appendQueryParams(endpoint, { query }),\n      headers: {\n        Accept: \"application/sparql-results+json\",\n      },\n      method: \"GET\",\n    });\n  } else {\n    internalQuery = queryFunction({\n      url: endpoint,\n      body: query,\n      headers: {\n        Accept: \"application/sparql-results+json\",\n        \"Content-Type\": \"application/sparql-query; charset=UTF-8\",\n      },\n      method: \"POST\",\n    });\n  }\n  return internalQuery.then((response): Promise<SparqlResponse<Binding>> => {\n    if (response.ok) {\n      return response.json();\n    } else {\n      const error = new Error(response.statusText);\n      (error as any).response = response;\n      throw error;\n    }\n  });\n}\n\nexport function executeSparqlConstruct(\n  endpoint: string,\n  query: string,\n  method: SparqlQueryMethod,\n  queryFunction: QueryFunction\n): Promise<Triple[]> {\n  let internalQuery: Promise<Response>;\n  if (method === SparqlQueryMethod.GET) {\n    internalQuery = queryFunction({\n      url: appendQueryParams(endpoint, { query }),\n      headers: {\n        Accept: \"text/turtle\",\n      },\n      method: \"GET\",\n    });\n  } else {\n    internalQuery = queryFunction({\n      url: endpoint,\n      body: query,\n      headers: {\n        Accept: \"text/turtle\",\n        \"Content-Type\": \"application/sparql-query; charset=UTF-8\",\n      },\n      method: \"POST\",\n    });\n  }\n  return internalQuery\n    .then((response) => {\n      if (response.ok) {\n        return response.text();\n      } else {\n        const error = new Error(response.statusText);\n        (error as any).response = response;\n        throw error;\n      }\n    })\n    .then(parseTurtleText);\n}\n\nfunction appendQueryParams(\n  endpoint: string,\n  queryParams: Record<string, string> = {}\n) {\n  const initialSeparator = endpoint.indexOf(\"?\") < 0 ? \"?\" : \"&\";\n  const additionalParams =\n    initialSeparator +\n    Object.keys(queryParams)\n      .map((key) => `${key}=${encodeURIComponent(queryParams[key])}`)\n      .join(\"&\");\n  return endpoint + additionalParams;\n}\n\nfunction queryInternal(params: {\n  url: string;\n  body?: string;\n  headers: any;\n  method: string;\n}) {\n  return fetch(params.url, {\n    method: params.method,\n    body: params.body,\n    credentials: \"same-origin\",\n    mode: \"cors\",\n    cache: \"default\",\n    headers: params.headers,\n  });\n}\n\nfunction sparqlExtractLabel(subject: string, label: string): string {\n  return `\n        BIND ( str( ${subject} ) as ?uriStr)\n        BIND ( strafter(?uriStr, \"#\") as ?label3)\n        BIND ( strafter(strafter(?uriStr, \"//\"), \"/\") as ?label6)\n        BIND ( strafter(?label6, \"/\") as ?label5)\n        BIND ( strafter(?label5, \"/\") as ?label4)\n        BIND (if (?label3 != \"\", ?label3,\n            if (?label4 != \"\", ?label4,\n            if (?label5 != \"\", ?label5, ?label6))) as ${label})\n    `;\n}\n\nfunction escapeIri(iri: string) {\n  if (typeof iri !== \"string\") {\n    throw new Error(`Cannot escape IRI of type \"${typeof iri}\"`);\n  }\n  return `<${iri}>`;\n}\n\n/** Escapes a value for embedding in a double-quoted SPARQL string literal. */\nfunction escapeSparqlStringLiteral(value: string) {\n  return value\n    .replace(/\\\\/g, \"\\\\\\\\\")\n    .replace(/\"/g, '\\\\\"')\n    .replace(/\\n/g, \"\\\\n\")\n    .replace(/\\r/g, \"\\\\r\");\n}\n","import {\n  Dictionary,\n  ClassModel,\n  LinkType,\n  ElementModel,\n  LinkModel,\n  LinkCount,\n  Property,\n  PropertyModel,\n  LocalizedString,\n} from \"../model\";\n\nconst DATA_PROVIDER_PROPERTY =\n  \"http://graph-explorer.org/property/DataProvider\";\n\nexport interface CompositeResponse<Type> {\n  dataSourceName: string;\n  useInStats?: boolean;\n  response: Type;\n}\n\nexport function mergeClassTree(\n  composite: CompositeResponse<ClassModel[]>[]\n): ClassModel[] {\n  const lists = composite\n    .filter((r) => r.response)\n    .map(({ useInStats, response }) => ({\n      useInStats,\n      classes: classTreeToArray(response),\n    }));\n  const dictionary: Dictionary<ClassModel> = {};\n  const topLevelModels: Dictionary<ClassModel> = {};\n  const childrenMap: Dictionary<string[]> = {};\n\n  for (const { useInStats, classes } of lists) {\n    for (const model of classes) {\n      const childrenIds: string[] = childrenMap[model.id] || [];\n      model.children\n        .map((ch) => ch.id)\n        .forEach((id) => {\n          if (childrenIds.indexOf(id) === -1) {\n            childrenIds.push(id);\n          }\n        });\n      model.children = [];\n\n      if (!useInStats) {\n        delete model.count;\n      }\n\n      if (!dictionary[model.id]) {\n        topLevelModels[model.id] = model;\n        dictionary[model.id] = model;\n        childrenMap[model.id] = childrenIds;\n      } else {\n        topLevelModels[model.id] = mergeClassModel(dictionary[model.id], model);\n        dictionary[model.id] = topLevelModels[model.id];\n      }\n    }\n  }\n\n  const models = Object.keys(dictionary).map((key) => dictionary[key]);\n\n  for (const m of models) {\n    m.children = (childrenMap[m.id] || []).map((id) => {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete topLevelModels[id];\n      return dictionary[id];\n    });\n  }\n\n  return Object.keys(topLevelModels).map((key) => topLevelModels[key]);\n}\n\nexport function mergePropertyInfo(\n  response: CompositeResponse<Dictionary<PropertyModel>>[]\n): Dictionary<PropertyModel> {\n  const result: Dictionary<PropertyModel> = {};\n  const props = response.filter((r) => r.response).map((r) => r.response);\n  for (const model of props) {\n    const keys = Object.keys(model);\n    for (const key of keys) {\n      const prop = model[key];\n      if (!result[key]) {\n        result[key] = prop;\n      } else {\n        result[key].label = mergeLabels(result[key].label, prop.label);\n      }\n    }\n  }\n  return result;\n}\n\nexport function mergeClassInfo(\n  response: CompositeResponse<ClassModel[]>[]\n): ClassModel[] {\n  const dictionaries = response\n    .filter((r) => r.response)\n    .map((r) => r.response);\n  const dictionary: Dictionary<ClassModel> = {};\n\n  for (const models of dictionaries) {\n    for (const model of models) {\n      if (!dictionary[model.id]) {\n        dictionary[model.id] = model;\n      } else {\n        dictionary[model.id] = mergeClassModel(dictionary[model.id], model);\n      }\n    }\n  }\n  return Object.keys(dictionary).map((key) => dictionary[key]);\n}\n\nexport function mergeLinkTypesInfo(\n  response: CompositeResponse<LinkType[]>[]\n): LinkType[] {\n  const lists = response.filter((r) => r.response).map((r) => r.response);\n\n  const mergeLinkType = (a: LinkType, b: LinkType): LinkType => {\n    return {\n      id: a.id,\n      label: mergeLabels(a.label, b.label),\n      count: a.count + b.count,\n    };\n  };\n\n  const dictionary: Dictionary<LinkType> = {};\n\n  for (const linkTypes of lists) {\n    for (const linkType of linkTypes) {\n      if (!dictionary[linkType.id]) {\n        dictionary[linkType.id] = linkType;\n      } else {\n        dictionary[linkType.id] = mergeLinkType(\n          dictionary[linkType.id],\n          linkType\n        );\n      }\n    }\n  }\n  return Object.keys(dictionary).map((key) => dictionary[key]);\n}\n\nexport function mergeLinkTypes(\n  response: CompositeResponse<LinkType[]>[]\n): LinkType[] {\n  return mergeLinkTypesInfo(response);\n}\n\nexport function mergeElementInfo(\n  response: CompositeResponse<Dictionary<ElementModel>>[]\n): Dictionary<ElementModel> {\n  const mergeElementModels = (\n    a: ElementModel,\n    b: ElementModel\n  ): ElementModel => {\n    const types = a.types;\n    for (const t of b.types) {\n      if (types.indexOf(t) === -1) {\n        types.push(t);\n      }\n    }\n    const sources: string[] = [];\n    for (const s of a.sources) {\n      if (sources.indexOf(s) === -1) {\n        sources.push(s);\n      }\n    }\n    for (const s of b.sources) {\n      if (sources.indexOf(s) === -1) {\n        sources.push(s);\n      }\n    }\n    return {\n      id: a.id,\n      label: mergeLabels(a.label, b.label),\n      types: types,\n      image: a.image || b.image,\n      properties: mergeProperties(a.properties, b.properties),\n      sources: sources,\n    };\n  };\n\n  const dictionary: Dictionary<ElementModel> = {};\n\n  for (const resp of response) {\n    if (!resp.response) {\n      continue;\n    }\n    const list = Object.keys(resp.response).map((k) => resp.response[k]);\n\n    for (const em of list) {\n      em.sources = [resp.dataSourceName];\n      em.properties[DATA_PROVIDER_PROPERTY] = {\n        type: \"string\",\n        values: [{ value: resp.dataSourceName, language: \"\" }],\n      };\n      if (!dictionary[em.id]) {\n        dictionary[em.id] = em;\n      } else {\n        dictionary[em.id] = mergeElementModels(dictionary[em.id], em);\n      }\n    }\n  }\n  return dictionary;\n}\n\nexport function mergeProperties(\n  a: Dictionary<Property>,\n  b: Dictionary<Property>\n): Dictionary<Property> {\n  const aLists = Object.keys(a);\n  const bLists = Object.keys(b);\n\n  const result: Dictionary<Property> = {};\n\n  function createIdForProperty(baseId: string): string {\n    let counter = 1;\n    while (result[baseId + \"_\" + counter]) {\n      counter++;\n    }\n    return baseId + \"_\" + counter;\n  }\n\n  for (const pKey of aLists) {\n    const prop = a[pKey];\n    if (!result[pKey]) {\n      result[pKey] = prop;\n    } else {\n      result[createIdForProperty(pKey)] = prop;\n    }\n  }\n  for (const pKey of bLists) {\n    const prop = b[pKey];\n    if (!result[pKey]) {\n      result[pKey] = prop;\n    } else {\n      result[createIdForProperty(pKey)] = prop;\n    }\n  }\n\n  return result;\n}\n\nexport function mergeLinksInfo(\n  response: CompositeResponse<LinkModel[]>[]\n): LinkModel[] {\n  const lists = response.filter((r) => r.response).map((r) => r.response);\n  const resultInfo: LinkModel[] = [];\n\n  function compareLinksInfo(a: LinkModel, b: LinkModel): boolean {\n    return (\n      a.sourceId === b.sourceId &&\n      a.targetId === b.targetId &&\n      a.linkTypeId === b.linkTypeId\n    );\n  }\n\n  for (const linkInfo of lists) {\n    for (const linkModel of linkInfo) {\n      if (!resultInfo.some((l) => compareLinksInfo(l, linkModel))) {\n        resultInfo.push(linkModel);\n      }\n    }\n  }\n  return resultInfo;\n}\n\nexport function mergeLinkTypesOf(\n  response: CompositeResponse<LinkCount[]>[]\n): LinkCount[] {\n  const lists = response.filter((r) => r.response).map((r) => r.response);\n  const dictionary: Dictionary<LinkCount> = {};\n\n  const merge = (a: LinkCount, b: LinkCount): LinkCount => {\n    return {\n      id: a.id,\n      inCount: a.inCount + b.inCount,\n      outCount: a.outCount + b.outCount,\n    };\n  };\n\n  for (const linkCount of lists) {\n    for (const lCount of linkCount) {\n      if (!dictionary[lCount.id]) {\n        dictionary[lCount.id] = lCount;\n      } else {\n        dictionary[lCount.id] = merge(lCount, dictionary[lCount.id]);\n      }\n    }\n  }\n  return Object.keys(dictionary).map((key) => dictionary[key]);\n}\n\nexport function mergeLinkElements(\n  response: CompositeResponse<Dictionary<ElementModel>>[]\n): Dictionary<ElementModel> {\n  return mergeElementInfo(response);\n}\n\nexport function mergeFilter(\n  response: CompositeResponse<Dictionary<ElementModel>>[]\n): Dictionary<ElementModel> {\n  return mergeElementInfo(response);\n}\n\nexport function classTreeToArray(models: ClassModel[]): ClassModel[] {\n  let resultArray: ClassModel[] = models;\n\n  function getDescendants(model: ClassModel): ClassModel[] {\n    let descendants = model.children || [];\n    for (const descendant of descendants) {\n      const nextGeneration = getDescendants(descendant);\n      descendants = descendants.concat(nextGeneration);\n    }\n    return descendants;\n  }\n\n  for (const model of models) {\n    const descendants = getDescendants(model);\n    resultArray = resultArray.concat(descendants);\n  }\n\n  return resultArray;\n}\n\nexport function mergeLabels(\n  a: { values: LocalizedString[] },\n  b: { values: LocalizedString[] }\n): { values: LocalizedString[] } {\n  function compareLabels(l1: LocalizedString, l2: LocalizedString): boolean {\n    return l1.language === l2.language && l1.value === l2.value;\n  }\n\n  const mergedValuesList = a.values;\n\n  for (const locStr of b.values) {\n    if (!mergedValuesList.some((l) => compareLabels(l, locStr))) {\n      mergedValuesList.push(locStr);\n    }\n  }\n\n  return {\n    values: mergedValuesList,\n  };\n}\n\nexport function mergeCounts(a?: number, b?: number): number | undefined {\n  if (a === undefined && b === undefined) {\n    return undefined;\n  }\n\n  return (a || 0) + (b || 0);\n}\n\nexport function mergeClassModel(a: ClassModel, b: ClassModel): ClassModel {\n  const childrenDictionary: Dictionary<ClassModel> = {};\n  for (const child of a.children.concat(b.children)) {\n    if (!childrenDictionary[child.id]) {\n      childrenDictionary[child.id] = child;\n    }\n  }\n\n  return {\n    id: a.id,\n    label: mergeLabels(a.label, b.label),\n    count: mergeCounts(a.count, b.count),\n    children: Object.keys(childrenDictionary).map(\n      (key) => childrenDictionary[key]\n    ),\n  };\n}\n","import { DataProvider, LinkElementsParams, FilterParams } from \"../provider\";\nimport {\n  Dictionary,\n  ClassModel,\n  LinkType,\n  ElementModel,\n  LinkModel,\n  LinkCount,\n  PropertyModel,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n  PropertyTypeIri,\n} from \"../model\";\nimport {\n  CompositeResponse,\n  mergeClassTree,\n  mergePropertyInfo,\n  mergeClassInfo,\n  mergeLinkTypesInfo,\n  mergeLinkTypes,\n  mergeElementInfo,\n  mergeLinksInfo,\n  mergeLinkTypesOf,\n  mergeLinkElements,\n  mergeFilter,\n} from \"./mergeUtils\";\n\nexport interface DPDefinition {\n  name: string;\n  dataProvider: DataProvider;\n  useInStats?: boolean;\n}\n\nfunction isDefinition(dp: DataProvider | DPDefinition): dp is DPDefinition {\n  const definition = dp as Partial<DPDefinition>;\n  return definition.name !== undefined && definition.dataProvider !== undefined;\n}\n\nexport type MergeMode = \"fetchAll\" | \"sequentialFetching\";\n\nexport class CompositeDataProvider implements DataProvider {\n  public dataProviders: DPDefinition[];\n  public mergeMode: MergeMode = \"fetchAll\";\n\n  constructor(\n    dataProviders: (DataProvider | DPDefinition)[],\n    params?: {\n      mergeMode?: MergeMode;\n    }\n  ) {\n    let dpCounter = 1;\n    this.dataProviders = dataProviders.map((dp) => {\n      if (isDefinition(dp)) {\n        return dp;\n      } else {\n        return {\n          name: \"dataProvider_\" + dpCounter++,\n          dataProvider: dp,\n        };\n      }\n    });\n\n    if (params && params.mergeMode) {\n      this.mergeMode = params.mergeMode;\n    }\n  }\n\n  classTree(): Promise<ClassModel[]> {\n    return this.fetchSequentially(\"classTree\", mergeClassTree, undefined);\n  }\n\n  propertyInfo(params: {\n    propertyIds: PropertyTypeIri[];\n  }): Promise<Dictionary<PropertyModel>> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"propertyInfo\", mergePropertyInfo, params);\n    } else {\n      let propertyIds = params.propertyIds;\n      return this.queueProcessResults(\n        (previousResult: Dictionary<PropertyModel>, dp: DPDefinition) => {\n          propertyIds = propertyIds.filter(\n            (id) => !previousResult || !previousResult[id]\n          );\n          return propertyIds.length > 0\n            ? dp.dataProvider.propertyInfo({ propertyIds: propertyIds })\n            : undefined;\n        }\n      ).then(mergePropertyInfo);\n    }\n  }\n\n  classInfo(params: { classIds: ElementTypeIri[] }): Promise<ClassModel[]> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"classInfo\", mergeClassInfo, params);\n    } else {\n      let classIds = params.classIds;\n      return this.queueProcessResults(\n        (previousResult: ClassModel[], dp: DPDefinition) => {\n          classIds = classIds.filter(\n            (id) =>\n              !previousResult ||\n              previousResult.map((cm) => cm.id).indexOf(id) === -1\n          );\n          return classIds.length > 0\n            ? dp.dataProvider.classInfo({ classIds: classIds })\n            : undefined;\n        }\n      ).then(mergeClassInfo);\n    }\n  }\n\n  linkTypesInfo(params: { linkTypeIds: LinkTypeIri[] }): Promise<LinkType[]> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\n        \"linkTypesInfo\",\n        mergeLinkTypesInfo,\n        params\n      );\n    } else {\n      let linkTypeIds = params.linkTypeIds;\n      return this.queueProcessResults(\n        (previousResult: LinkType[], dp: DPDefinition) => {\n          linkTypeIds = linkTypeIds.filter(\n            (id) =>\n              !previousResult ||\n              previousResult.map((lt) => lt.id).indexOf(id) === -1\n          );\n          return linkTypeIds.length > 0\n            ? dp.dataProvider.linkTypesInfo({ linkTypeIds: linkTypeIds })\n            : undefined;\n        }\n      ).then(mergeLinkTypesInfo);\n    }\n  }\n\n  linkTypes(): Promise<LinkType[]> {\n    return this.fetchSequentially(\"linkTypes\", mergeLinkTypes, undefined);\n  }\n\n  elementInfo(params: {\n    elementIds: ElementIri[];\n  }): Promise<Dictionary<ElementModel>> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"elementInfo\", mergeElementInfo, params);\n    } else {\n      let elementIds = params.elementIds;\n      return this.queueProcessResults(\n        (previousResult: Dictionary<ElementModel>, dp: DPDefinition) => {\n          elementIds = elementIds.filter(\n            (id) => !previousResult || !previousResult[id]\n          );\n          return elementIds.length > 0\n            ? dp.dataProvider.elementInfo({ elementIds: elementIds })\n            : undefined;\n        }\n      ).then(mergeElementInfo);\n    }\n  }\n\n  linksInfo(params: {\n    elementIds: ElementIri[];\n    linkTypeIds: LinkTypeIri[];\n  }): Promise<LinkModel[]> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"linksInfo\", mergeLinksInfo, params);\n    } else {\n      let elementIds = params.elementIds;\n      return this.queueProcessResults(\n        (previousResult: LinkModel[], dp: DPDefinition) => {\n          elementIds = elementIds.filter((id) => {\n            if (previousResult) {\n              for (const linkModel of previousResult) {\n                if (linkModel.sourceId === id) {\n                  return false;\n                }\n              }\n            }\n            return true;\n          });\n          return elementIds.length > 0\n            ? dp.dataProvider.linksInfo({\n                elementIds: elementIds,\n                linkTypeIds: params.linkTypeIds,\n              })\n            : undefined;\n        }\n      ).then(mergeLinksInfo);\n    }\n  }\n\n  linkTypesOf(params: { elementId: ElementIri }): Promise<LinkCount[]> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"linkTypesOf\", mergeLinkTypesOf, params);\n    } else {\n      return this.queueProcessResults(\n        (previousResult: LinkCount[], dp: DPDefinition) => {\n          if (\n            !previousResult ||\n            (previousResult && previousResult.length === 0)\n          ) {\n            return dp.dataProvider.linkTypesOf(params);\n          } else {\n            return undefined;\n          }\n        }\n      ).then(mergeLinkTypesOf);\n    }\n  }\n\n  linkElements(params: LinkElementsParams): Promise<Dictionary<ElementModel>> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"linkElements\", mergeLinkElements, params);\n    } else {\n      return this.queueProcessResults(\n        (previousResult: Dictionary<ElementModel>, dp: DPDefinition) => {\n          if (\n            !previousResult ||\n            (previousResult && Object.keys(previousResult).length === 0)\n          ) {\n            return dp.dataProvider.linkElements(params);\n          } else {\n            return undefined;\n          }\n        }\n      ).then(mergeLinkElements);\n    }\n  }\n\n  filter(params: FilterParams): Promise<Dictionary<ElementModel>> {\n    if (this.mergeMode === \"fetchAll\") {\n      return this.fetchSequentially(\"filter\", mergeFilter, params);\n    } else {\n      return this.queueProcessResults(\n        (previousResult: Dictionary<ElementModel>, dp: DPDefinition) => {\n          if (\n            !previousResult ||\n            (previousResult && Object.keys(previousResult).length === 0)\n          ) {\n            return dp.dataProvider.filter(params);\n          } else {\n            return undefined;\n          }\n        }\n      ).then(mergeFilter);\n    }\n  }\n\n  private processResults<ResponseType>(\n    responsePromise: Promise<ResponseType>,\n    dpName: string,\n    useProviderInStats?: boolean\n  ): Promise<CompositeResponse<ResponseType>> {\n    return responsePromise\n      .then((response) => ({\n        dataSourceName: dpName,\n        useInStats: useProviderInStats,\n        response: response,\n      }))\n      .catch((error) => {\n        console.error(error);\n        return {\n          dataSourceName: dpName,\n          useInStats: useProviderInStats,\n          response: undefined as any,\n        };\n      });\n  }\n\n  private queueProcessResults<ResponseType>(\n    callBack: (\n      previousResult: ResponseType,\n      dp: DPDefinition\n    ) => Promise<ResponseType>\n  ): Promise<CompositeResponse<ResponseType>[]> {\n    let counter = 0;\n    const responseList: CompositeResponse<ResponseType>[] = [];\n\n    const recursiveCall = (\n      result?: ResponseType\n    ): Promise<CompositeResponse<ResponseType>[]> => {\n      if (this.dataProviders.length > counter) {\n        const dp = this.dataProviders[counter++];\n        const callBackResult = callBack(result, dp);\n\n        if (!callBackResult) {\n          return Promise.resolve(responseList);\n        }\n        return callBackResult\n          .then((newResult) => {\n            responseList.push({\n              dataSourceName: dp.name,\n              response: newResult,\n            });\n            return recursiveCall(newResult);\n          })\n          .catch((error) => {\n            console.error(error);\n            return recursiveCall(result);\n          });\n      } else {\n        return Promise.resolve(responseList);\n      }\n    };\n    return recursiveCall();\n  }\n\n  private fetchSequentially<K extends keyof DataProvider>(\n    functionName: K,\n    mergeFunction: (\n      response: CompositeResponse<OperationResult<K>>[]\n    ) => OperationResult<K>,\n    params: OperationParams<K>\n  ) {\n    const resultPromises = this.dataProviders.map((dp: DPDefinition) => {\n      const providerMethod = dp.dataProvider[functionName] as any as (\n        this: DataProvider,\n        params: OperationParams<K>\n      ) => Promise<OperationResult<K>>;\n      return this.processResults(\n        providerMethod.call(dp.dataProvider, params),\n        dp.name,\n        dp.useInStats\n      );\n    });\n    return Promise.all(resultPromises).then(mergeFunction);\n  }\n}\n\ntype OperationParams<K extends keyof DataProvider> = DataProvider[K] extends (\n  params: infer P\n) => any\n  ? P\n  : never;\ntype OperationResult<K extends keyof DataProvider> = ReturnType<\n  DataProvider[K]\n> extends Promise<infer R>\n  ? R\n  : never;\n","import { pick } from \"lodash\";\n\nimport { ElementIri, LinkTypeIri } from \"../data/model\";\nimport { DIAGRAM_CONTEXT_URL_V1 } from \"../data/schema\";\n\nimport {\n  Element,\n  ElementTemplateState,\n  Link,\n  LinkTemplateState,\n} from \"../diagram/elements\";\nimport { Vector, Size } from \"../diagram/geometry\";\n\nexport interface SerializedDiagram {\n  \"@context\": any;\n  \"@type\": \"Diagram\";\n  layoutData: LayoutData;\n  linkTypeOptions?: readonly LinkTypeOptions[];\n}\n\nexport interface LinkTypeOptions {\n  \"@type\": \"LinkTypeOptions\";\n  property: LinkTypeIri;\n  visible: boolean;\n  showLabel?: boolean;\n}\n\nexport interface LayoutData {\n  \"@type\": \"Layout\";\n  elements: readonly LayoutElement[];\n  links: readonly LayoutLink[];\n}\n\nexport interface LayoutElement {\n  \"@type\": \"Element\";\n  \"@id\": string;\n  iri: ElementIri;\n  position: Vector;\n  size?: Size;\n  angle?: number;\n  isExpanded?: boolean;\n  group?: string;\n  elementState?: ElementTemplateState;\n}\n\nexport interface LayoutLink {\n  \"@type\": \"Link\";\n  \"@id\": string;\n  property: LinkTypeIri;\n  source: { \"@id\": string };\n  target: { \"@id\": string };\n  vertices?: readonly Vector[];\n  linkState?: LinkTemplateState;\n}\n\nconst serializedCellProperties = [\n  // common properties\n  \"id\",\n  \"type\",\n  // element properties\n  \"size\",\n  \"angle\",\n  \"isExpanded\",\n  \"position\",\n  \"iri\",\n  \"group\",\n  // link properties\n  \"typeId\",\n  \"source\",\n  \"target\",\n  \"vertices\",\n];\n\nexport function emptyDiagram(): SerializedDiagram {\n  return {\n    \"@context\": DIAGRAM_CONTEXT_URL_V1,\n    \"@type\": \"Diagram\",\n    layoutData: emptyLayoutData(),\n    linkTypeOptions: [],\n  };\n}\n\nexport function emptyLayoutData(): LayoutData {\n  return { \"@type\": \"Layout\", elements: [], links: [] };\n}\n\nexport function convertToSerializedDiagram(params: {\n  layoutData: any;\n  linkTypeOptions: any;\n}): SerializedDiagram {\n  const elements: LayoutElement[] = [];\n  const links: LayoutLink[] = [];\n\n  for (const cell of params.layoutData.cells) {\n    // get rid of unused properties\n    const newCell: any = pick(cell, serializedCellProperties);\n\n    // normalize type\n    if (\n      newCell.type === \"GraphExplorer.Element\" ||\n      newCell.type === \"element\"\n    ) {\n      newCell.type = \"Element\";\n    }\n\n    // normalize type\n    if (newCell.type === \"link\") {\n      newCell.type = \"Link\";\n    }\n\n    if (!newCell.iri) {\n      newCell.iri = newCell.id;\n    }\n\n    // rename to @id and @type to match JSON-LD\n    newCell[\"@id\"] = newCell.id;\n    delete newCell.id;\n\n    newCell[\"@type\"] = newCell.type;\n    delete newCell.type;\n\n    // make two separate lists\n    switch (newCell[\"@type\"]) {\n      case \"Element\":\n        elements.push(newCell);\n        break;\n      case \"Link\":\n        // rename internal IDs\n        newCell.source[\"@id\"] = newCell.source.id;\n        delete newCell.source.id;\n        newCell.target[\"@id\"] = newCell.target.id;\n        delete newCell.target.id;\n        // rename typeID to property\n        newCell.property = newCell.typeId;\n        delete newCell.typeId;\n        links.push(newCell);\n        break;\n    }\n  }\n\n  return {\n    ...emptyDiagram(),\n    layoutData: { \"@type\": \"Layout\", elements, links },\n    linkTypeOptions: params.linkTypeOptions,\n  };\n}\n\nexport function makeSerializedDiagram(params: {\n  layoutData?: LayoutData;\n  linkTypeOptions?: readonly LinkTypeOptions[];\n}): SerializedDiagram {\n  const diagram: SerializedDiagram = {\n    ...emptyDiagram(),\n    linkTypeOptions: params.linkTypeOptions,\n  };\n  // layout data is a complex structure we want to persist\n  if (params.layoutData) {\n    diagram.layoutData = params.layoutData;\n  }\n  return diagram;\n}\n\nexport function makeLayoutData(\n  modelElements: readonly Element[],\n  modelLinks: readonly Link[]\n): LayoutData {\n  const elements = modelElements.map(\n    (element): LayoutElement => ({\n      \"@type\": \"Element\",\n      \"@id\": element.id,\n      iri: element.iri,\n      position: element.position,\n      size: element.size,\n      isExpanded: element.isExpanded,\n      group: element.group,\n      elementState: element.elementState,\n    })\n  );\n  const links = modelLinks.map(\n    (link): LayoutLink => ({\n      \"@type\": \"Link\",\n      \"@id\": link.id,\n      property: link.typeId,\n      source: { \"@id\": link.sourceId },\n      target: { \"@id\": link.targetId },\n      vertices: [...link.vertices],\n      linkState: link.linkState,\n    })\n  );\n  return { \"@type\": \"Layout\", elements, links };\n}\n","import * as cola from \"webcola\";\n\nimport { DiagramModel } from \"../diagram/model\";\nimport { boundsOf, Vector, computeGrouping, Size } from \"../diagram/geometry\";\nimport { Element } from \"../diagram/elements\";\nimport { EventObserver } from \"./events\";\nimport { getContentFittingBox } from \"../diagram/paperArea\";\n\nexport interface LayoutNode {\n  id?: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  bounds?: any;\n  fixed?: number;\n  innerBounds?: any;\n}\n\nexport interface LayoutLink {\n  source: LayoutNode;\n  target: LayoutNode;\n}\n\nexport function groupForceLayout(params: {\n  nodes: LayoutNode[];\n  links: LayoutLink[];\n  preferredLinkLength: number;\n  avoidOvelaps?: boolean;\n}) {\n  const layout = new cola.Layout()\n    .nodes(params.nodes)\n    .links(params.links)\n    .avoidOverlaps(params.avoidOvelaps)\n    .convergenceThreshold(1e-9)\n    .jaccardLinkLengths(params.preferredLinkLength)\n    .handleDisconnected(true);\n  layout.start(30, 0, 10, undefined, false);\n}\n\nexport function groupRemoveOverlaps(nodes: LayoutNode[]) {\n  const nodeRectangles: cola.Rectangle[] = [];\n  for (const node of nodes) {\n    nodeRectangles.push(\n      new cola.Rectangle(\n        node.x,\n        node.x + node.width,\n        node.y,\n        node.y + node.height\n      )\n    );\n  }\n\n  cola.removeOverlaps(nodeRectangles);\n\n  for (let i = 0; i < nodeRectangles.length; i++) {\n    const node = nodes[i];\n    const rectangle = nodeRectangles[i];\n    node.x = rectangle.x;\n    node.y = rectangle.y;\n  }\n}\n\nexport function translateToPositiveQuadrant(\n  positions: Map<string, Vector>,\n  offset: Vector\n) {\n  let minX = Infinity,\n    minY = Infinity;\n  positions.forEach((position) => {\n    minX = Math.min(minX, position.x);\n    minY = Math.min(minY, position.y);\n  });\n\n  const { x, y } = offset;\n  positions.forEach((position, key) => {\n    positions.set(key, {\n      x: position.x - minX + x,\n      y: position.y - minY + y,\n    });\n  });\n}\n\nexport function uniformGrid(params: {\n  rows: number;\n  cellSize: Vector;\n}): (cellIndex: number) => LayoutNode {\n  return (cellIndex) => {\n    const row = Math.floor(cellIndex / params.rows);\n    const column = cellIndex - row * params.rows;\n    return {\n      x: column * params.cellSize.x,\n      y: row * params.cellSize.y,\n      width: params.cellSize.x,\n      height: params.cellSize.y,\n    };\n  };\n}\n\nexport function padded(\n  nodes: LayoutNode[],\n  padding: { x: number; y: number } | undefined,\n  transform: () => void\n) {\n  if (padding) {\n    for (const node of nodes) {\n      node.x -= padding.x;\n      node.y -= padding.y;\n      node.width += 2 * padding.x;\n      node.height += 2 * padding.y;\n    }\n  }\n\n  transform();\n\n  if (padding) {\n    for (const node of nodes) {\n      node.x += padding.x;\n      node.y += padding.y;\n      node.width -= 2 * padding.x;\n      node.height -= 2 * padding.y;\n    }\n  }\n}\n\nexport function biasFreePadded(\n  nodes: LayoutNode[],\n  padding: { x: number; y: number } | undefined,\n  transform: () => void\n) {\n  const nodeSizeMap = new Map<string, Size>();\n  const possibleCompression = { x: Infinity, y: Infinity };\n  for (const node of nodes) {\n    nodeSizeMap.set(node.id, { width: node.width, height: node.height });\n    const maxSide = Math.max(node.width, node.height);\n\n    const compressionX = node.width ? maxSide / node.width : 1;\n    const compressionY = node.height ? maxSide / node.height : 1;\n    possibleCompression.x = Math.min(\n      1 + (compressionX - 1),\n      possibleCompression.x\n    );\n    possibleCompression.y = Math.min(\n      1 + (compressionY - 1),\n      possibleCompression.y\n    );\n\n    node.height = maxSide;\n    node.width = maxSide;\n  }\n  padded(nodes, padding, () => transform());\n\n  const fittingBox = getContentFittingBoxForLayout(nodes);\n  for (const node of nodes) {\n    const size = nodeSizeMap.get(node.id);\n    node.x = (node.x - fittingBox.x) / possibleCompression.x + fittingBox.x;\n    node.y = (node.y - fittingBox.y) / possibleCompression.y + fittingBox.y;\n    node.height = size.height;\n    node.width = size.width;\n  }\n}\n\nexport type CalculatedLayout = object & { readonly layoutBrand: any };\n\nexport interface UnzippedCalculatedLayout extends CalculatedLayout {\n  group?: string;\n  keepAveragePosition: boolean;\n  positions: Map<string, Vector>;\n  nestedLayouts: UnzippedCalculatedLayout[];\n}\n\nexport function calculateLayout(params: {\n  model: DiagramModel;\n  layoutFunction: (\n    nodes: LayoutNode[],\n    links: LayoutLink[],\n    group: string\n  ) => void;\n  fixedElements?: ReadonlySet<Element>;\n  group?: string;\n  selectedElements?: ReadonlySet<Element>;\n}): CalculatedLayout {\n  const grouping = computeGrouping(params.model.elements);\n  const { layoutFunction, model, fixedElements, selectedElements } = params;\n\n  if (selectedElements && selectedElements.size <= 1) {\n    return {\n      positions: new Map(),\n      nestedLayouts: [],\n      keepAveragePosition: false,\n    } as UnzippedCalculatedLayout;\n  }\n  return internalRecursion(params.group);\n\n  function internalRecursion(group: string): CalculatedLayout {\n    const elementsToProcess = group\n      ? grouping.get(group)\n      : model.elements.filter((el) => el.group === undefined);\n    const elements = selectedElements\n      ? elementsToProcess.filter((el) => selectedElements.has(el))\n      : elementsToProcess;\n\n    const nestedLayouts: CalculatedLayout[] = [];\n    for (const element of elements) {\n      if (grouping.has(element.id)) {\n        nestedLayouts.push(internalRecursion(element.id));\n      }\n    }\n\n    const nodes: LayoutNode[] = [];\n    const nodeById: Record<string, LayoutNode> = {};\n    for (const element of elements) {\n      const { x, y, width, height } = boundsOf(element);\n      const node: LayoutNode = {\n        id: element.id,\n        x,\n        y,\n        width,\n        height,\n        fixed: fixedElements && fixedElements.has(element) ? 1 : 0,\n      };\n      nodeById[element.id] = node;\n      nodes.push(node);\n    }\n\n    const links: LayoutLink[] = [];\n    for (const link of model.links) {\n      if (!model.isSourceAndTargetVisible(link)) {\n        continue;\n      }\n      const source = model.sourceOf(link);\n      const target = model.targetOf(link);\n      const sourceNode = nodeById[source.id];\n      const targetNode = nodeById[target.id];\n      if (sourceNode && targetNode) {\n        links.push({ source: sourceNode, target: targetNode });\n      }\n    }\n    layoutFunction(nodes, links, group);\n\n    const positions = new Map<string, Vector>();\n    for (const node of nodes) {\n      positions.set(node.id, { x: node.x, y: node.y });\n    }\n\n    return {\n      positions,\n      group,\n      nestedLayouts,\n      keepAveragePosition: Boolean(selectedElements),\n    } as UnzippedCalculatedLayout;\n  }\n}\n\nexport function applyLayout(model: DiagramModel, layout: CalculatedLayout) {\n  const { positions, group, nestedLayouts, keepAveragePosition } =\n    layout as UnzippedCalculatedLayout;\n  const elements = model.elements.filter(({ id }) => positions.has(id));\n  for (const nestedLayout of nestedLayouts) {\n    applyLayout(model, nestedLayout);\n  }\n\n  if (group) {\n    const offset: Vector = getContentFittingBox(elements, []);\n    translateToPositiveQuadrant(positions, offset);\n  }\n\n  const averagePosition = keepAveragePosition\n    ? calculateAveragePosition(elements)\n    : undefined;\n  for (const element of elements) {\n    element.setPosition(positions.get(element.id));\n  }\n\n  if (keepAveragePosition) {\n    const newAveragePosition = calculateAveragePosition(elements);\n    const averageDiff = {\n      x: averagePosition.x - newAveragePosition.x,\n      y: averagePosition.y - newAveragePosition.y,\n    };\n    positions.forEach((position, elementId) => {\n      const element = model.getElement(elementId);\n      element.setPosition({\n        x: position.x + averageDiff.x,\n        y: position.y + averageDiff.y,\n      });\n    });\n  }\n}\n\nexport function calculateAveragePosition(position: readonly Element[]): Vector {\n  let xSum = 0;\n  let ySum = 0;\n  for (const element of position) {\n    xSum += element.position.x + element.size.width / 2;\n    ySum += element.position.y + element.size.height / 2;\n  }\n  return {\n    x: xSum / position.length,\n    y: ySum / position.length,\n  };\n}\n\nexport function placeElementsAround(params: {\n  model: DiagramModel;\n  elements: readonly Element[];\n  prefferedLinksLength: number;\n  targetElement: Element;\n  startAngle?: number;\n}) {\n  const { model, elements, targetElement, prefferedLinksLength } = params;\n  const targetElementBounds = boundsOf(targetElement);\n  const targetPosition: Vector = {\n    x: targetElementBounds.x + targetElementBounds.width / 2,\n    y: targetElementBounds.y + targetElementBounds.height / 2,\n  };\n  let outgoingAngle = 0;\n  if (targetElement.links.length > 0) {\n    const averageSourcePosition = calculateAveragePosition(\n      targetElement.links.map((link) => {\n        const linkSource = model.sourceOf(link);\n        return linkSource !== targetElement ? linkSource : model.targetOf(link);\n      })\n    );\n    const vectorDiff: Vector = {\n      x: targetPosition.x - averageSourcePosition.x,\n      y: targetPosition.y - averageSourcePosition.y,\n    };\n    if (vectorDiff.x !== 0 || vectorDiff.y !== 0) {\n      outgoingAngle = Math.atan2(vectorDiff.y, vectorDiff.x);\n    }\n  }\n\n  const step = Math.min(Math.PI / elements.length, Math.PI / 6);\n  const elementsSteck: Element[] = [].concat(elements);\n\n  const placeElementFromSteck = (curAngle: number, element: Element) => {\n    if (element) {\n      const size = element.size;\n      element.setPosition({\n        x:\n          targetPosition.x +\n          prefferedLinksLength * Math.cos(curAngle) -\n          size.width / 2,\n        y:\n          targetPosition.y +\n          prefferedLinksLength * Math.sin(curAngle) -\n          size.height / 2,\n      });\n    }\n  };\n\n  const isOddLength = elementsSteck.length % 2 === 0;\n  if (isOddLength) {\n    for (let angle = step / 2; elementsSteck.length > 0; angle += step) {\n      placeElementFromSteck(outgoingAngle - angle, elementsSteck.pop());\n      placeElementFromSteck(outgoingAngle + angle, elementsSteck.pop());\n    }\n  } else {\n    placeElementFromSteck(outgoingAngle, elementsSteck.pop());\n    for (let angle = step; elementsSteck.length > 0; angle += step) {\n      placeElementFromSteck(outgoingAngle - angle, elementsSteck.pop());\n      placeElementFromSteck(outgoingAngle + angle, elementsSteck.pop());\n    }\n  }\n\n  return new Promise((resolve) => {\n    const listener = new EventObserver();\n    listener.listen(model.events, \"changeCells\", () => {\n      listener.stopListening();\n\n      removeOverlaps({\n        model,\n        padding: { x: 15, y: 15 },\n      });\n      resolve(true);\n    });\n  });\n}\n\nexport function removeOverlaps(params: {\n  model: DiagramModel;\n  fixedElements?: ReadonlySet<Element>;\n  padding?: Vector;\n  group?: string;\n  selectedElements?: ReadonlySet<Element>;\n}): CalculatedLayout {\n  const { padding, model, group, fixedElements, selectedElements } = params;\n  return calculateLayout({\n    model,\n    group,\n    fixedElements,\n    selectedElements,\n    layoutFunction: (nodes) => {\n      padded(nodes, padding, () => groupRemoveOverlaps(nodes));\n    },\n  });\n}\n\nexport function forceLayout(params: {\n  model: DiagramModel;\n  fixedElements?: ReadonlySet<Element>;\n  group?: string;\n  selectedElements?: ReadonlySet<Element>;\n}): CalculatedLayout {\n  const { model, group, fixedElements, selectedElements } = params;\n  return calculateLayout({\n    model,\n    group,\n    fixedElements,\n    selectedElements,\n    layoutFunction: (nodes, links) => {\n      if (fixedElements && fixedElements.size > 0) {\n        biasFreePadded(nodes, { x: 50, y: 50 }, () =>\n          groupForceLayout({\n            nodes,\n            links,\n            preferredLinkLength: 200,\n            avoidOvelaps: true,\n          })\n        );\n      } else {\n        groupForceLayout({ nodes, links, preferredLinkLength: 200 });\n        biasFreePadded(nodes, { x: 50, y: 50 }, () =>\n          groupRemoveOverlaps(nodes)\n        );\n      }\n    },\n  });\n}\n\nexport function getContentFittingBoxForLayout(nodes: readonly LayoutNode[]): {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n} {\n  let minX = Infinity,\n    minY = Infinity;\n  let maxX = -Infinity,\n    maxY = -Infinity;\n\n  for (const node of nodes) {\n    const { x, y, width, height } = node;\n    minX = Math.min(minX, x);\n    minY = Math.min(minY, y);\n    maxX = Math.max(maxX, x + width);\n    maxY = Math.max(maxY, y + height);\n  }\n\n  return {\n    x: Number.isFinite(minX) ? minX : 0,\n    y: Number.isFinite(minY) ? minY : 0,\n    width: Number.isFinite(minX) && Number.isFinite(maxX) ? maxX - minX : 0,\n    height: Number.isFinite(minY) && Number.isFinite(maxY) ? maxY - minY : 0,\n  };\n}\n","import { keyBy } from \"lodash\";\n\nimport { GenerateID } from \"../schema\";\nimport {\n  LayoutElement,\n  LayoutLink,\n  SerializedDiagram,\n  makeSerializedDiagram,\n} from \"../../editor/serializedDiagram\";\nimport { uniformGrid } from \"../../viewUtils/layout\";\n\nimport {\n  Dictionary,\n  ElementModel,\n  LinkModel,\n  ElementIri,\n  LinkTypeIri,\n} from \"../model\";\nimport { DataProvider } from \"../provider\";\nimport { Triple } from \"./sparqlModels\";\nimport { parseTurtleText } from \"./turtle\";\n\nconst GREED_STEP = 150;\n\nexport class GraphBuilder {\n  constructor(public dataProvider: DataProvider) {}\n\n  createGraph(graph: {\n    elementIds: ElementIri[];\n    links: LinkModel[];\n  }): Promise<{\n    preloadedElements: Dictionary<ElementModel>;\n    diagram: SerializedDiagram;\n  }> {\n    return this.dataProvider\n      .elementInfo({ elementIds: graph.elementIds })\n      .then((elementsInfo) => ({\n        preloadedElements: elementsInfo,\n        diagram: makeLayout(graph.elementIds, graph.links),\n      }));\n  }\n\n  getGraphFromRDFGraph(graph: Triple[]): Promise<{\n    preloadedElements: Dictionary<ElementModel>;\n    diagram: SerializedDiagram;\n  }> {\n    const { elementIds, links } = makeGraphItems(graph);\n    return this.createGraph({ elementIds, links });\n  }\n\n  getGraphFromTurtleGraph(graph: string): Promise<{\n    preloadedElements: Dictionary<ElementModel>;\n    diagram: SerializedDiagram;\n  }> {\n    return parseTurtleText(graph).then((triples) =>\n      this.getGraphFromRDFGraph(triples)\n    );\n  }\n}\n\nexport function makeGraphItems(response: readonly Triple[]): {\n  elementIds: ElementIri[];\n  links: LinkModel[];\n} {\n  const elements: Dictionary<boolean> = {};\n  const links: LinkModel[] = [];\n\n  for (const { subject, predicate, object } of response) {\n    if (subject.type === \"uri\" && !elements[subject.value]) {\n      elements[subject.value] = true;\n    }\n\n    if (object.type === \"uri\" && !elements[object.value]) {\n      elements[object.value] = true;\n    }\n\n    if (subject.type === \"uri\" && object.type === \"uri\") {\n      links.push({\n        linkTypeId: predicate.value as LinkTypeIri,\n        sourceId: subject.value as ElementIri,\n        targetId: object.value as ElementIri,\n      });\n    }\n  }\n  return { elementIds: Object.keys(elements) as ElementIri[], links };\n}\n\nexport function makeLayout(\n  elementsIds: readonly ElementIri[],\n  linksInfo: readonly LinkModel[]\n): SerializedDiagram {\n  const rows = Math.ceil(Math.sqrt(elementsIds.length));\n  const grid = uniformGrid({\n    rows,\n    cellSize: { x: GREED_STEP, y: GREED_STEP },\n  });\n\n  const elements: LayoutElement[] = elementsIds.map<LayoutElement>(\n    (id, index) => {\n      const { x, y } = grid(index);\n      return {\n        \"@type\": \"Element\",\n        \"@id\": GenerateID.forElement(),\n        iri: id,\n        position: { x, y },\n      };\n    }\n  );\n\n  const layoutElementsMap: Record<string, LayoutElement> = keyBy(\n    elements,\n    \"iri\"\n  );\n  const links: LayoutLink[] = [];\n\n  linksInfo.forEach((link, _index) => {\n    const source = layoutElementsMap[link.sourceId];\n    const target = layoutElementsMap[link.targetId];\n\n    if (!source || !target) {\n      return;\n    }\n\n    links.push({\n      \"@type\": \"Link\",\n      \"@id\": GenerateID.forLink(),\n      property: link.linkTypeId,\n      source: { \"@id\": source[\"@id\"] },\n      target: { \"@id\": target[\"@id\"] },\n    });\n  });\n  return makeSerializedDiagram({\n    layoutData: { \"@type\": \"Layout\", elements, links },\n    linkTypeOptions: [],\n  });\n}\n","import { SerializedDiagram } from \"../../editor/serializedDiagram\";\n\nimport { Dictionary, ElementModel } from \"../model\";\n\nimport { GraphBuilder } from \"./graphBuilder\";\nimport { SparqlDataProvider } from \"./sparqlDataProvider\";\n\nconst DEFAULT_PREFIX =\n  `PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n PREFIX owl:  <http://www.w3.org/2002/07/owl#>` + \"\\n\\n\";\n\nexport class SparqlGraphBuilder {\n  graphBuilder: GraphBuilder;\n\n  constructor(public dataProvider: SparqlDataProvider) {\n    this.graphBuilder = new GraphBuilder(dataProvider);\n  }\n\n  getGraphFromConstruct(constructQuery: string): Promise<{\n    preloadedElements: Dictionary<ElementModel>;\n    diagram: SerializedDiagram;\n  }> {\n    const query = DEFAULT_PREFIX + constructQuery;\n    return this.dataProvider\n      .executeSparqlConstruct(query)\n      .then((graph) => this.graphBuilder.getGraphFromRDFGraph(graph));\n  }\n}\n","import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from \"../data/model\";\nimport { OrderedMap } from \"../viewUtils/collections\";\nimport {\n  EventSource,\n  Events,\n  AnyEvent,\n  AnyListener,\n} from \"../viewUtils/events\";\n\nimport {\n  Element as DiagramElement,\n  ElementEvents,\n  Link as DiagramLink,\n  LinkEvents,\n  FatLinkType,\n  FatLinkTypeEvents,\n  FatClassModel,\n  FatClassModelEvents,\n  RichProperty,\n} from \"./elements\";\n\nexport interface GraphEvents {\n  changeCells: CellsChangedEvent;\n  elementEvent: AnyEvent<ElementEvents>;\n  linkEvent: AnyEvent<LinkEvents>;\n  linkTypeEvent: AnyEvent<FatLinkTypeEvents>;\n  classEvent: AnyEvent<FatClassModelEvents>;\n}\n\nexport interface CellsChangedEvent {\n  readonly updateAll: boolean;\n  readonly changedElement?: DiagramElement;\n  readonly changedLinks?: readonly DiagramLink[];\n}\n\nexport class Graph {\n  private readonly source = new EventSource<GraphEvents>();\n  readonly events: Events<GraphEvents> = this.source;\n\n  private elements = new OrderedMap<DiagramElement>();\n  private links = new OrderedMap<DiagramLink>();\n\n  private classesById = new Map<ElementTypeIri, FatClassModel>();\n  private propertiesById = new Map<PropertyTypeIri, RichProperty>();\n\n  private linkTypes = new Map<LinkTypeIri, FatLinkType>();\n  private static nextLinkTypeIndex = 0;\n\n  getElements() {\n    return this.elements.items;\n  }\n  getLinks() {\n    return this.links.items;\n  }\n\n  getLink(linkId: string): DiagramLink | undefined {\n    return this.links.get(linkId);\n  }\n\n  findLink(\n    linkTypeId: LinkTypeIri,\n    sourceId: string,\n    targetId: string\n  ): DiagramLink | undefined {\n    const source = this.getElement(sourceId);\n    if (!source) {\n      return undefined;\n    }\n    const index = findLinkIndex(source.links, linkTypeId, sourceId, targetId);\n    return index >= 0 ? source.links[index] : undefined;\n  }\n\n  sourceOf(link: DiagramLink) {\n    return this.getElement(link.sourceId);\n  }\n\n  targetOf(link: DiagramLink) {\n    return this.getElement(link.targetId);\n  }\n\n  reorderElements(compare: (a: DiagramElement, b: DiagramElement) => number) {\n    this.elements.reorder(compare);\n  }\n\n  getElement(elementId: string): DiagramElement | undefined {\n    return this.elements.get(elementId);\n  }\n\n  addElement(element: DiagramElement): void {\n    if (this.getElement(element.id)) {\n      throw new Error(`Element '${element.id}' already exists.`);\n    }\n    element.events.onAny(this.onElementEvent);\n    this.elements.push(element.id, element);\n    this.source.trigger(\"changeCells\", {\n      updateAll: false,\n      changedElement: element,\n    });\n  }\n\n  private onElementEvent: AnyListener<ElementEvents> = (data, key) => {\n    this.source.trigger(\"elementEvent\", { key, data });\n  };\n\n  removeElement(elementId: string): void {\n    const element = this.elements.get(elementId);\n    if (element) {\n      const options = { silent: true };\n      // clone links to prevent modifications during iteration\n      const changedLinks = [...element.links];\n      for (const link of changedLinks) {\n        this.removeLink(link.id, options);\n      }\n      this.elements.delete(elementId);\n      element.events.offAny(this.onElementEvent);\n      this.source.trigger(\"changeCells\", {\n        updateAll: false,\n        changedElement: element,\n        changedLinks,\n      });\n    }\n  }\n\n  addLink(link: DiagramLink): void {\n    if (this.getLink(link.id)) {\n      throw new Error(`Link '${link.id}' already exists.`);\n    }\n    const linkType = this.getLinkType(link.typeId);\n    if (!linkType) {\n      throw new Error(`Link type '${link.typeId}' not found.`);\n    }\n    this.registerLink(link);\n  }\n\n  private registerLink(link: DiagramLink) {\n    this.sourceOf(link).links.push(link);\n    if (link.sourceId !== link.targetId) {\n      this.targetOf(link).links.push(link);\n    }\n\n    link.events.onAny(this.onLinkEvent);\n    this.links.push(link.id, link);\n    this.source.trigger(\"changeCells\", {\n      updateAll: false,\n      changedLinks: [link],\n    });\n  }\n\n  private onLinkEvent: AnyListener<LinkEvents> = (data, key) => {\n    this.source.trigger(\"linkEvent\", { key, data });\n  };\n\n  removeLink(linkId: string, options?: { silent?: boolean }) {\n    const link = this.links.delete(linkId);\n    if (link) {\n      const { typeId, sourceId, targetId } = link;\n      link.events.offAny(this.onLinkEvent);\n      this.removeLinkReferences(typeId, sourceId, targetId);\n      if (!(options && options.silent)) {\n        this.source.trigger(\"changeCells\", {\n          updateAll: false,\n          changedLinks: [link],\n        });\n      }\n    }\n  }\n\n  private removeLinkReferences(\n    linkTypeId: LinkTypeIri,\n    sourceId: string,\n    targetId: string\n  ) {\n    const source = this.getElement(sourceId);\n    if (source) {\n      removeLinkFrom(source.links, linkTypeId, sourceId, targetId);\n    }\n    const target = this.getElement(targetId);\n    if (target) {\n      removeLinkFrom(target.links, linkTypeId, sourceId, targetId);\n    }\n  }\n\n  getLinkTypes(): FatLinkType[] {\n    const result: FatLinkType[] = [];\n    this.linkTypes.forEach((type) => result.push(type));\n    return result;\n  }\n\n  getLinkType(linkTypeId: LinkTypeIri): FatLinkType | undefined {\n    return this.linkTypes.get(linkTypeId);\n  }\n\n  addLinkType(linkType: FatLinkType): void {\n    if (this.getLinkType(linkType.id)) {\n      throw new Error(`Link type '${linkType.id}' already exists.`);\n    }\n    linkType.setIndex(Graph.nextLinkTypeIndex++);\n    linkType.events.onAny(this.onLinkTypeEvent);\n    this.linkTypes.set(linkType.id, linkType);\n  }\n\n  private onLinkTypeEvent: AnyListener<FatLinkTypeEvents> = (data, key) => {\n    this.source.trigger(\"linkTypeEvent\", { key, data });\n  };\n\n  getProperty(propertyId: PropertyTypeIri): RichProperty | undefined {\n    return this.propertiesById.get(propertyId);\n  }\n\n  addProperty(property: RichProperty): void {\n    if (this.getProperty(property.id)) {\n      throw new Error(`Property '${property.id}' already exists.`);\n    }\n    this.propertiesById.set(property.id, property);\n  }\n\n  getClass(classId: ElementTypeIri): FatClassModel | undefined {\n    return this.classesById.get(classId);\n  }\n\n  getClasses(): FatClassModel[] {\n    const classes: FatClassModel[] = [];\n    this.classesById.forEach((richClass) => classes.push(richClass));\n    return classes;\n  }\n\n  addClass(classModel: FatClassModel): void {\n    if (this.getClass(classModel.id)) {\n      throw new Error(`Class '${classModel.id}' already exists.`);\n    }\n    classModel.events.onAny(this.onClassEvent);\n    this.classesById.set(classModel.id, classModel);\n  }\n\n  private onClassEvent: AnyListener<FatClassModelEvents> = (data, key) => {\n    this.source.trigger(\"classEvent\", { key, data });\n  };\n}\n\nfunction removeLinkFrom(\n  links: DiagramLink[],\n  linkTypeId: LinkTypeIri,\n  sourceId: string,\n  targetId: string\n) {\n  if (!links) {\n    return;\n  }\n  while (true) {\n    const index = findLinkIndex(links, linkTypeId, sourceId, targetId);\n    if (index < 0) {\n      break;\n    }\n    links.splice(index, 1);\n  }\n}\n\nfunction findLinkIndex(\n  haystack: DiagramLink[],\n  linkTypeId: LinkTypeIri,\n  sourceId: string,\n  targetId: string\n) {\n  for (let i = 0; i < haystack.length; i++) {\n    const link = haystack[i];\n    if (\n      link.sourceId === sourceId &&\n      link.targetId === targetId &&\n      link.typeId === linkTypeId\n    ) {\n      return i;\n    }\n  }\n  return -1;\n}\n","import {\n  ElementModel,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n  PropertyTypeIri,\n} from \"../data/model\";\nimport { GenerateID } from \"../data/schema\";\n\nimport {\n  EventSource,\n  Events,\n  EventObserver,\n  AnyEvent,\n} from \"../viewUtils/events\";\n\nimport {\n  Element,\n  ElementEvents,\n  Link,\n  LinkEvents,\n  FatLinkType,\n  FatLinkTypeEvents,\n  FatClassModel,\n  FatClassModelEvents,\n  RichProperty,\n} from \"./elements\";\nimport { Graph, CellsChangedEvent } from \"./graph\";\nimport { CommandHistory, Command } from \"./history\";\n\nexport interface DiagramModelEvents {\n  changeCells: CellsChangedEvent;\n  elementEvent: AnyEvent<ElementEvents>;\n  linkEvent: AnyEvent<LinkEvents>;\n  linkTypeEvent: AnyEvent<FatLinkTypeEvents>;\n  classEvent: AnyEvent<FatClassModelEvents>;\n  changeGroupContent: { group: string };\n}\n\n/**\n * Model of diagram.\n */\nexport class DiagramModel {\n  protected readonly source = new EventSource<DiagramModelEvents>();\n  readonly events: Events<DiagramModelEvents> = this.source;\n\n  protected graph = new Graph();\n  protected graphListener = new EventObserver();\n\n  constructor(readonly history: CommandHistory) {}\n\n  get elements() {\n    return this.graph.getElements();\n  }\n  get links() {\n    return this.graph.getLinks();\n  }\n\n  getElement(elementId: string): Element | undefined {\n    return this.graph.getElement(elementId);\n  }\n\n  getLinkById(linkId: string): Link | undefined {\n    return this.graph.getLink(linkId);\n  }\n\n  linksOfType(linkTypeId: LinkTypeIri): readonly Link[] {\n    return this.graph.getLinks().filter((link) => link.typeId === linkTypeId);\n  }\n\n  findLink(\n    linkTypeId: LinkTypeIri,\n    sourceId: string,\n    targetId: string\n  ): Link | undefined {\n    return this.graph.findLink(linkTypeId, sourceId, targetId);\n  }\n\n  sourceOf(link: Link) {\n    return this.getElement(link.sourceId);\n  }\n  targetOf(link: Link) {\n    return this.getElement(link.targetId);\n  }\n  isSourceAndTargetVisible(link: Link): boolean {\n    return Boolean(this.sourceOf(link) && this.targetOf(link));\n  }\n\n  resetGraph() {\n    if (this.graphListener) {\n      this.graphListener.stopListening();\n      this.graphListener = new EventObserver();\n    }\n    this.graph = new Graph();\n  }\n\n  subscribeGraph() {\n    this.graphListener.listen(this.graph.events, \"changeCells\", (e) => {\n      this.source.trigger(\"changeCells\", e);\n    });\n    this.graphListener.listen(this.graph.events, \"elementEvent\", (e) => {\n      this.source.trigger(\"elementEvent\", e);\n    });\n    this.graphListener.listen(this.graph.events, \"linkEvent\", (e) => {\n      this.source.trigger(\"linkEvent\", e);\n    });\n    this.graphListener.listen(this.graph.events, \"linkTypeEvent\", (e) => {\n      this.source.trigger(\"linkTypeEvent\", e);\n    });\n    this.graphListener.listen(this.graph.events, \"classEvent\", (e) => {\n      this.source.trigger(\"classEvent\", e);\n    });\n\n    this.source.trigger(\"changeCells\", { updateAll: true });\n  }\n\n  reorderElements(compare: (a: Element, b: Element) => number) {\n    this.graph.reorderElements(compare);\n  }\n\n  createElement(\n    elementIriOrModel: ElementIri | ElementModel,\n    group?: string\n  ): Element {\n    const elementIri =\n      typeof elementIriOrModel === \"string\"\n        ? elementIriOrModel\n        : (elementIriOrModel as ElementModel).id;\n\n    const elements = this.elements.filter(\n      (el) => el.iri === elementIri && el.group === group\n    );\n    if (elements.length > 0) {\n      // usually there should be only one element\n      return elements[0];\n    }\n\n    let data =\n      typeof elementIriOrModel === \"string\"\n        ? placeholderDataFromIri(elementIri)\n        : (elementIriOrModel as ElementModel);\n    data = { ...data, id: data.id };\n    const element = new Element({ id: GenerateID.forElement(), data, group });\n    this.addElement(element);\n    return element;\n  }\n\n  addElement(element: Element): void {\n    this.history.execute(addElement(this.graph, element, []));\n  }\n\n  removeElement(elementId: string) {\n    const element = this.getElement(elementId);\n    if (element) {\n      this.history.execute(removeElement(this.graph, element));\n    }\n  }\n\n  addLink(link: Link): Link {\n    const { typeId, sourceId, targetId, data } = link;\n    if (data && data.linkTypeId !== typeId) {\n      throw new Error(\"linkTypeId must match linkType.id\");\n    }\n\n    const existingLink = this.findLink(typeId, sourceId, targetId);\n    if (existingLink) {\n      if (link.data) {\n        existingLink.setLayoutOnly(false);\n        existingLink.setData(data);\n      }\n      return existingLink;\n    }\n\n    const linkType = this.createLinkType(link.typeId);\n    const source = this.getElement(sourceId);\n    const target = this.getElement(targetId);\n    const shouldBeVisible = linkType.visible && source && target;\n    if (!shouldBeVisible) {\n      return undefined;\n    }\n\n    if (!link.data) {\n      link.setData({\n        linkTypeId: typeId,\n        sourceId: source.iri,\n        targetId: target.iri,\n      });\n    }\n    this.graph.addLink(link);\n    return link;\n  }\n\n  removeLink(linkId: string) {\n    this.graph.removeLink(linkId);\n  }\n\n  getClass(classIri: ElementTypeIri): FatClassModel {\n    return this.graph.getClass(classIri);\n  }\n\n  createClass(classIri: ElementTypeIri): FatClassModel {\n    const existing = this.graph.getClass(classIri);\n    if (existing) {\n      return existing;\n    }\n    const classModel = new FatClassModel({ id: classIri });\n    this.addClass(classModel);\n    return classModel;\n  }\n\n  addClass(model: FatClassModel) {\n    this.graph.addClass(model);\n  }\n\n  getLinkType(linkTypeIri: LinkTypeIri): FatLinkType | undefined {\n    return this.graph.getLinkType(linkTypeIri);\n  }\n\n  createLinkType(linkTypeIri: LinkTypeIri): FatLinkType {\n    const existing = this.graph.getLinkType(linkTypeIri);\n    if (existing) {\n      return existing;\n    }\n    const linkType = new FatLinkType({ id: linkTypeIri });\n    this.graph.addLinkType(linkType);\n    return linkType;\n  }\n\n  getProperty(propertyTypeIri: PropertyTypeIri): RichProperty {\n    return this.graph.getProperty(propertyTypeIri);\n  }\n\n  createProperty(propertyIri: PropertyTypeIri): RichProperty {\n    const existing = this.graph.getProperty(propertyIri);\n    if (existing) {\n      return existing;\n    }\n    const property = new RichProperty({ id: propertyIri });\n    this.graph.addProperty(property);\n    return property;\n  }\n\n  triggerChangeGroupContent(group: string) {\n    this.source.trigger(\"changeGroupContent\", { group });\n  }\n\n  createTemporaryElement(): Element {\n    const target = new Element({\n      id: GenerateID.forElement(),\n      data: placeholderDataFromIri(\"\" as ElementIri),\n      temporary: true,\n    });\n\n    this.graph.addElement(target);\n\n    return target;\n  }\n}\n\nexport function placeholderDataFromIri(iri: ElementIri): ElementModel {\n  return {\n    id: iri,\n    types: [],\n    label: { values: [] },\n    properties: {},\n  };\n}\n\nfunction addElement(\n  graph: Graph,\n  element: Element,\n  connectedLinks: readonly Link[]\n): Command {\n  return Command.create(\"Add element\", () => {\n    graph.addElement(element);\n    for (const link of connectedLinks) {\n      const existing =\n        graph.getLink(link.id) ||\n        graph.findLink(link.typeId, link.sourceId, link.targetId);\n      if (!existing) {\n        graph.addLink(link);\n      }\n    }\n    return removeElement(graph, element);\n  });\n}\n\nfunction removeElement(graph: Graph, element: Element): Command {\n  return Command.create(\"Remove element\", () => {\n    const connectedLinks = [...element.links];\n    graph.removeElement(element.id);\n    return addElement(graph, element, connectedLinks);\n  });\n}\n","import {\n  ElementModel,\n  ClassModel,\n  LinkType,\n  PropertyModel,\n  ElementIri,\n  ElementTypeIri,\n  LinkTypeIri,\n  PropertyTypeIri,\n} from \"../data/model\";\nimport { DataProvider } from \"../data/provider\";\n\nimport { FatClassModel, FatLinkType, RichProperty } from \"../diagram/elements\";\nimport { Graph } from \"../diagram/graph\";\n\nimport { BufferingQueue } from \"../viewUtils/async\";\n\nexport class DataFetcher {\n  private classQueue = new BufferingQueue<ElementTypeIri>((classIds) => {\n    this.dataProvider.classInfo({ classIds }).then(this.onClassesLoaded);\n  });\n  private linkTypeQueue = new BufferingQueue<LinkTypeIri>((linkTypeIds) => {\n    this.dataProvider\n      .linkTypesInfo({ linkTypeIds })\n      .then(this.onLinkTypesLoaded);\n  });\n  private propertyTypeQueue = new BufferingQueue<PropertyTypeIri>(\n    (propertyIds) => {\n      this.dataProvider\n        .propertyInfo({ propertyIds })\n        .then(this.onPropertyTypesLoaded);\n    }\n  );\n\n  constructor(private graph: Graph, private dataProvider: DataProvider) {}\n\n  fetchElementData(elementIris: readonly ElementIri[]): Promise<void> {\n    if (elementIris.length === 0) {\n      return Promise.resolve();\n    }\n    return this.dataProvider\n      .elementInfo({ elementIds: [...elementIris] })\n      .then(this.onElementInfoLoaded);\n  }\n\n  private onElementInfoLoaded = (elements: Record<string, ElementModel>) => {\n    for (const element of this.graph.getElements()) {\n      const loadedModel = elements[element.iri];\n      if (loadedModel) {\n        element.setData(loadedModel);\n      }\n    }\n  };\n\n  fetchClass(model: FatClassModel): void {\n    this.classQueue.push(model.id);\n  }\n\n  private onClassesLoaded = (classInfos: ClassModel[]) => {\n    for (const { id, label, count } of classInfos) {\n      const model = this.graph.getClass(id);\n      if (!model) {\n        continue;\n      }\n      model.setLabel(label.values);\n      if (typeof count === \"number\") {\n        model.setCount(count);\n      }\n    }\n  };\n\n  fetchLinkType(linkType: FatLinkType): void {\n    this.linkTypeQueue.push(linkType.id);\n  }\n\n  private onLinkTypesLoaded = (linkTypesInfo: LinkType[]) => {\n    for (const { id, label } of linkTypesInfo) {\n      const model = this.graph.getLinkType(id);\n      if (!model) {\n        continue;\n      }\n      model.setLabel(label.values);\n    }\n  };\n\n  fetchPropertyType(propertyType: RichProperty): void {\n    if (!this.dataProvider.propertyInfo) {\n      return;\n    }\n    this.propertyTypeQueue.push(propertyType.id);\n  }\n\n  private onPropertyTypesLoaded = (\n    propertyModels: Record<string, PropertyModel>\n  ) => {\n    for (const propId in propertyModels) {\n      if (!Object.prototype.hasOwnProperty.call(propertyModels, propId)) {\n        continue;\n      }\n      const { id, label } = propertyModels[propId];\n      const targetProperty = this.graph.getProperty(id);\n      if (targetProperty) {\n        targetProperty.setLabel(label.values);\n      }\n    }\n  };\n}\n","import {\n  Dictionary,\n  ElementModel,\n  LinkModel,\n  LinkType,\n  ElementIri,\n  LinkTypeIri,\n  ElementTypeIri,\n  PropertyTypeIri,\n} from \"../data/model\";\nimport { DataProvider } from \"../data/provider\";\nimport { PLACEHOLDER_LINK_TYPE } from \"../data/schema\";\n\nimport {\n  Element,\n  FatLinkType,\n  FatClassModel,\n  RichProperty,\n  FatLinkTypeEvents,\n  Link,\n} from \"../diagram/elements\";\nimport { CommandHistory, Command } from \"../diagram/history\";\nimport {\n  DiagramModel,\n  DiagramModelEvents,\n  placeholderDataFromIri,\n} from \"../diagram/model\";\n\nimport { EventSource, Events, Listener } from \"../viewUtils/events\";\n\nimport { DataFetcher } from \"./dataFetcher\";\nimport {\n  LayoutData,\n  makeLayoutData,\n  emptyDiagram,\n  LinkTypeOptions,\n  SerializedDiagram,\n  makeSerializedDiagram,\n  emptyLayoutData,\n} from \"./serializedDiagram\";\n\nexport interface GroupBy {\n  linkType: string;\n  linkDirection: \"in\" | \"out\";\n}\n\nexport interface AsyncModelEvents extends DiagramModelEvents {\n  loadingStart: { source: AsyncModel };\n  loadingSuccess: { source: AsyncModel };\n  loadingError: {\n    source: AsyncModel;\n    error: any;\n  };\n  createLoadedLink: {\n    source: AsyncModel;\n    model: LinkModel;\n    cancel(): void;\n  };\n}\n\nexport class AsyncModel extends DiagramModel {\n  readonly events: Events<AsyncModelEvents>;\n\n  private _dataProvider: DataProvider;\n  private fetcher: DataFetcher;\n\n  private linkSettings: Record<string, LinkTypeOptions> = {};\n\n  constructor(\n    history: CommandHistory,\n    private groupByProperties: readonly GroupBy[]\n  ) {\n    super(history);\n  }\n\n  private get asyncSource(): EventSource<AsyncModelEvents> {\n    return this.source as EventSource<any>;\n  }\n\n  get dataProvider() {\n    return this._dataProvider;\n  }\n\n  subscribeGraph() {\n    super.subscribeGraph();\n\n    this.graphListener.listen(this.graph.events, \"linkTypeEvent\", (e) => {\n      if (e.key === \"changeVisibility\") {\n        this.onLinkTypeVisibilityChanged(e.data[e.key], e.key);\n      }\n    });\n  }\n\n  private setDataProvider(dataProvider: DataProvider) {\n    this._dataProvider = dataProvider;\n    this.fetcher = new DataFetcher(this.graph, dataProvider);\n  }\n\n  createNewDiagram(dataProvider: DataProvider): Promise<void> {\n    this.resetGraph();\n    this.setDataProvider(dataProvider);\n    this.asyncSource.trigger(\"loadingStart\", { source: this });\n\n    return this.dataProvider\n      .linkTypes()\n      .then((linkTypes: LinkType[]) => {\n        const allLinkTypes = this.initLinkTypes(linkTypes);\n        return this.loadAndRenderLayout({\n          allLinkTypes,\n          markLinksAsLayoutOnly: false,\n        });\n      })\n      .catch((error) => {\n        console.error(error);\n        this.asyncSource.trigger(\"loadingError\", { source: this, error });\n        return Promise.reject(error);\n      });\n  }\n\n  importLayout(params: {\n    dataProvider: DataProvider;\n    preloadedElements?: Dictionary<ElementModel>;\n    validateLinks?: boolean;\n    diagram?: SerializedDiagram;\n    hideUnusedLinkTypes?: boolean;\n  }): Promise<void> {\n    this.resetGraph();\n    this.setDataProvider(params.dataProvider);\n    this.asyncSource.trigger(\"loadingStart\", { source: this });\n\n    return this.dataProvider\n      .linkTypes()\n      .then((linkTypes) => {\n        const allLinkTypes = this.initLinkTypes(linkTypes);\n        const diagram = params.diagram ? params.diagram : emptyDiagram();\n        this.setLinkSettings(diagram.linkTypeOptions);\n        const loadingModels = this.loadAndRenderLayout({\n          layoutData: diagram.layoutData,\n          preloadedElements: params.preloadedElements || {},\n          markLinksAsLayoutOnly: params.validateLinks || false,\n          allLinkTypes,\n          hideUnusedLinkTypes: params.hideUnusedLinkTypes,\n        });\n        const requestingLinks = params.validateLinks\n          ? this.requestLinksOfType()\n          : Promise.resolve();\n        return Promise.all([loadingModels, requestingLinks]);\n      })\n      .then(() => {\n        this.asyncSource.trigger(\"loadingSuccess\", { source: this });\n      })\n      .catch((error) => {\n        console.error(error);\n        this.asyncSource.trigger(\"loadingError\", { source: this, error });\n        return Promise.reject(error);\n      });\n  }\n\n  exportLayout(): SerializedDiagram {\n    const layoutData = makeLayoutData(\n      this.graph.getElements(),\n      this.graph.getLinks()\n    );\n    const linkTypeOptions = this.graph\n      .getLinkTypes()\n      // do not serialize default link type options\n      .filter(\n        (linkType) =>\n          (!linkType.visible || !linkType.showLabel) &&\n          linkType.id !== PLACEHOLDER_LINK_TYPE\n      )\n      .map(\n        ({ id, visible, showLabel }): LinkTypeOptions => ({\n          \"@type\": \"LinkTypeOptions\",\n          property: id,\n          visible,\n          showLabel,\n        })\n      );\n    return makeSerializedDiagram({ layoutData, linkTypeOptions });\n  }\n\n  private initLinkTypes(linkTypes: LinkType[]): FatLinkType[] {\n    const types: FatLinkType[] = [];\n    for (const { id, label } of linkTypes) {\n      const linkType = new FatLinkType({ id, label: label.values });\n      this.graph.addLinkType(linkType);\n      types.push(linkType);\n    }\n    return types;\n  }\n\n  private setLinkSettings(settings: readonly LinkTypeOptions[]) {\n    if (!settings) {\n      return;\n    }\n    for (const setting of settings) {\n      const { visible = true, showLabel = true } = setting;\n      const linkTypeId = setting.property as LinkTypeIri;\n      this.linkSettings[linkTypeId] = {\n        \"@type\": \"LinkTypeOptions\",\n        property: linkTypeId,\n        visible,\n        showLabel,\n      };\n      const linkType = this.getLinkType(linkTypeId);\n      if (linkType) {\n        linkType.setVisibility({ visible, showLabel });\n      }\n    }\n  }\n\n  private loadAndRenderLayout(params: {\n    layoutData?: LayoutData;\n    preloadedElements?: Dictionary<ElementModel>;\n    markLinksAsLayoutOnly: boolean;\n    allLinkTypes: readonly FatLinkType[];\n    hideUnusedLinkTypes?: boolean;\n  }) {\n    const {\n      layoutData = emptyLayoutData(),\n      preloadedElements = {},\n      markLinksAsLayoutOnly,\n      hideUnusedLinkTypes,\n    } = params;\n\n    const elementIrisToRequestData: ElementIri[] = [];\n    const usedLinkTypes: Record<string, FatLinkType> = {};\n\n    for (const layoutElement of layoutData.elements) {\n      const {\n        \"@id\": id,\n        iri,\n        position,\n        size,\n        isExpanded,\n        group,\n        elementState,\n      } = layoutElement;\n      const template = preloadedElements[iri];\n      const data = template || placeholderDataFromIri(iri);\n      const element = new Element({\n        id,\n        data,\n        position,\n        size,\n        expanded: isExpanded,\n        group,\n        elementState,\n      });\n      this.graph.addElement(element);\n      if (!template) {\n        elementIrisToRequestData.push(element.iri);\n      }\n    }\n\n    for (const layoutLink of layoutData.links) {\n      const {\n        \"@id\": id,\n        property,\n        source,\n        target,\n        vertices,\n        linkState,\n      } = layoutLink;\n      const linkType = this.createLinkType(property);\n      usedLinkTypes[linkType.id] = linkType;\n      const link = this.addLink(\n        new Link({\n          id,\n          typeId: linkType.id,\n          sourceId: source[\"@id\"],\n          targetId: target[\"@id\"],\n          vertices,\n          linkState,\n        })\n      );\n      if (link) {\n        link.setLayoutOnly(markLinksAsLayoutOnly);\n      }\n    }\n\n    this.subscribeGraph();\n    const requestingModels = this.requestElementData(elementIrisToRequestData);\n\n    if (hideUnusedLinkTypes && params.allLinkTypes) {\n      this.hideUnusedLinkTypes(params.allLinkTypes, usedLinkTypes);\n    }\n\n    return requestingModels;\n  }\n\n  private hideUnusedLinkTypes(\n    allTypes: readonly FatLinkType[],\n    usedTypes: Record<string, FatLinkType>\n  ) {\n    for (const linkType of allTypes) {\n      if (!usedTypes[linkType.id]) {\n        linkType.setVisibility({\n          visible: false,\n          showLabel: linkType.showLabel,\n        });\n      }\n    }\n  }\n\n  requestElementData(elementIris: readonly ElementIri[]): Promise<void> {\n    return this.fetcher.fetchElementData(elementIris);\n  }\n\n  requestLinksOfType(linkTypeIds?: LinkTypeIri[]): Promise<void> {\n    const linkTypes =\n      linkTypeIds ||\n      this.graph\n        .getLinkTypes()\n        .filter((type) => type.visible)\n        .map((type) => type.id);\n    return this.dataProvider\n      .linksInfo({\n        elementIds: this.graph.getElements().map((element) => element.iri),\n        linkTypeIds: linkTypes,\n      })\n      .then((links) => this.onLinkInfoLoaded(links));\n  }\n\n  createClass(classId: ElementTypeIri): FatClassModel {\n    if (this.graph.getClass(classId)) {\n      return super.getClass(classId);\n    }\n    const classModel = super.createClass(classId);\n    this.fetcher.fetchClass(classModel);\n    return classModel;\n  }\n\n  createLinkType(linkTypeId: LinkTypeIri): FatLinkType {\n    if (this.graph.getLinkType(linkTypeId)) {\n      return super.createLinkType(linkTypeId);\n    }\n    const linkType = super.createLinkType(linkTypeId);\n    const setting = this.linkSettings[linkType.id];\n    if (setting) {\n      const { visible, showLabel } = setting;\n      linkType.setVisibility({ visible, showLabel, preventLoading: true });\n    }\n    this.fetcher.fetchLinkType(linkType);\n    return linkType;\n  }\n\n  createProperty(propertyIri: PropertyTypeIri): RichProperty {\n    if (this.graph.getProperty(propertyIri)) {\n      return super.createProperty(propertyIri);\n    }\n    const property = super.createProperty(propertyIri);\n    this.fetcher.fetchPropertyType(property);\n    return property;\n  }\n\n  private onLinkTypeVisibilityChanged: Listener<\n    FatLinkTypeEvents,\n    \"changeVisibility\"\n  > = (e) => {\n    if (e.source.visible) {\n      if (!e.preventLoading) {\n        this.requestLinksOfType([e.source.id]);\n      }\n    } else {\n      for (const link of this.linksOfType(e.source.id)) {\n        this.graph.removeLink(link.id);\n      }\n    }\n  };\n\n  private onLinkInfoLoaded(links: LinkModel[]) {\n    let allowToCreate: boolean;\n    const cancel = () => {\n      allowToCreate = false;\n    };\n\n    for (const linkModel of links) {\n      this.createLinkType(linkModel.linkTypeId);\n      allowToCreate = true;\n      this.asyncSource.trigger(\"createLoadedLink\", {\n        source: this,\n        model: linkModel,\n        cancel,\n      });\n      if (allowToCreate) {\n        this.createLinks(linkModel);\n      }\n    }\n  }\n\n  createLinks(data: LinkModel) {\n    const sources = this.graph\n      .getElements()\n      .filter((el) => el.iri === data.sourceId);\n    const targets = this.graph\n      .getElements()\n      .filter((el) => el.iri === data.targetId);\n    const typeId = data.linkTypeId;\n\n    for (const source of sources) {\n      for (const target of targets) {\n        this.addLink(\n          new Link({ typeId, sourceId: source.id, targetId: target.id, data })\n        );\n      }\n    }\n  }\n\n  loadEmbeddedElements(\n    elementIri: ElementIri\n  ): Promise<Dictionary<ElementModel>> {\n    const elements = this.groupByProperties.map((groupBy) =>\n      this.dataProvider.linkElements({\n        elementId: elementIri,\n        linkId: groupBy.linkType as LinkTypeIri,\n        offset: 0,\n        direction: groupBy.linkDirection,\n      })\n    );\n    return Promise.all(elements).then((res) =>\n      res.reduce((memo, current) => Object.assign(memo, current), {})\n    );\n  }\n}\n\nexport function requestElementData(\n  model: AsyncModel,\n  elementIris: readonly ElementIri[]\n): Command {\n  return Command.effect(\"Fetch element data\", () => {\n    model.requestElementData(elementIris);\n  });\n}\n\nexport function restoreLinksBetweenElements(model: AsyncModel): Command {\n  return Command.effect(\"Restore links between elements\", () => {\n    model.requestLinksOfType();\n  });\n}\n","import * as React from \"react\";\n\nexport interface Props extends React.HTMLAttributes<HTMLDivElement> {\n  onBeginDragHandle: (e: React.MouseEvent<HTMLDivElement>) => void;\n  onDragHandle: (e: MouseEvent, dx: number, dy: number) => void;\n  onEndDragHandle?: (e: MouseEvent) => void;\n}\n\nexport class DraggableHandle extends React.Component<Props, {}> {\n  private isHoldingMouse = false;\n  private originPageX: number;\n  private originPageY: number;\n\n  render() {\n    // remove custom handlers from `div` props\n    const {\n      onBeginDragHandle: _onBeginDragHandle,\n      onDragHandle: _onDragHandle,\n      onEndDragHandle: _onEndDragHandle,\n      ...props\n    } = this.props;\n    return (\n      <div {...props} onMouseDown={this.onHandleMouseDown}>\n        {this.props.children}\n      </div>\n    );\n  }\n\n  componentWillUnmount() {\n    this.removeListeners();\n  }\n\n  private onHandleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n    if (e.target !== e.currentTarget) {\n      return;\n    }\n    if (this.isHoldingMouse) {\n      return;\n    }\n\n    const LEFT_BUTTON = 0;\n    if (e.button !== LEFT_BUTTON) {\n      return;\n    }\n\n    this.isHoldingMouse = true;\n    this.originPageX = e.pageX;\n    this.originPageY = e.pageY;\n    document.addEventListener(\"mousemove\", this.onMouseMove);\n    document.addEventListener(\"mouseup\", this.onMouseUp);\n    this.props.onBeginDragHandle(e);\n  };\n\n  private onMouseMove = (e: MouseEvent) => {\n    if (!this.isHoldingMouse) {\n      return;\n    }\n    e.preventDefault();\n    this.props.onDragHandle(\n      e,\n      e.pageX - this.originPageX,\n      e.pageY - this.originPageY\n    );\n  };\n\n  private onMouseUp = (e: MouseEvent) => {\n    this.removeListeners();\n    if (this.props.onEndDragHandle) {\n      this.props.onEndDragHandle(e);\n    }\n  };\n\n  private removeListeners() {\n    if (this.isHoldingMouse) {\n      this.isHoldingMouse = false;\n      document.removeEventListener(\"mousemove\", this.onMouseMove);\n      document.removeEventListener(\"mouseup\", this.onMouseUp);\n    }\n  }\n}\n","import * as React from \"react\";\n\nimport { DiagramView } from \"../diagram/view\";\nimport { Element, Link } from \"../diagram/elements\";\nimport { EventObserver, Unsubscribe } from \"../viewUtils/events\";\nimport { PaperWidgetProps } from \"../diagram/paperArea\";\nimport {\n  boundsOf,\n  computePolyline,\n  computePolylineLength,\n  getPointAlongPolyline,\n  Vector,\n} from \"../diagram/geometry\";\nimport { DraggableHandle } from \"../workspace/draggableHandle\";\n\nconst DEFAULT_WIDTH = 300;\nconst DEFAULT_HEIGHT = 300;\nconst MIN_WIDTH = 250;\nconst MIN_HEIGHT = 250;\nconst MAX_WIDTH = 800;\nconst MAX_HEIGHT = 800;\n\nconst ELEMENT_OFFSET = 40;\nconst LINK_OFFSET = 20;\nconst FOCUS_OFFSET = 20;\n\nconst CLASS_NAME = \"graph-explorer-dialog\";\n\nexport interface Props extends PaperWidgetProps {\n  view: DiagramView;\n  target: Element | Link;\n  size?: { width: number; height: number };\n  caption?: string;\n  offset?: Vector;\n  calculatePosition?: () => Vector;\n  onClose: () => void;\n  children?: React.ReactNode;\n}\n\nexport interface State {\n  width?: number;\n  height?: number;\n}\n\nexport class Dialog extends React.Component<Props, State> {\n  private static defaultProps: Partial<Props> = {\n    size: { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT },\n  };\n\n  private unsubscribeFromTarget: Unsubscribe | undefined = undefined;\n  private readonly handler = new EventObserver();\n\n  private updateAll = () => this.forceUpdate();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {};\n  }\n\n  componentDidMount() {\n    this.listenToTarget(this.props.target);\n    this.focusOn();\n  }\n\n  componentDidUpdate(nextProps: Props) {\n    if (nextProps.target !== this.props.target) {\n      this.listenToTarget(nextProps.target);\n    }\n  }\n\n  componentWillUnmount() {\n    this.listenToTarget(undefined);\n  }\n\n  private listenToTarget(target?: Element | Link) {\n    if (this.unsubscribeFromTarget) {\n      this.unsubscribeFromTarget();\n      this.unsubscribeFromTarget = undefined;\n    }\n\n    if (target) {\n      const { view } = this.props;\n\n      if (target instanceof Element) {\n        this.listenToElement(target);\n      } else if (target instanceof Link) {\n        this.listenToLink(target);\n      }\n\n      this.handler.listen(view.events, \"changeLanguage\", this.updateAll);\n\n      this.unsubscribeFromTarget = () => {\n        this.handler.stopListening();\n      };\n    }\n  }\n\n  private listenToElement(element: Element) {\n    this.handler.listen(element.events, \"changePosition\", this.updateAll);\n    this.handler.listen(element.events, \"changeSize\", this.updateAll);\n  }\n\n  private listenToLink(link: Link) {\n    const { view } = this.props;\n\n    const source = view.model.getElement(link.sourceId);\n    const target = view.model.getElement(link.targetId);\n\n    this.listenToElement(source);\n    this.listenToElement(target);\n\n    this.handler.listen(link.events, \"changeVertices\", this.updateAll);\n    this.handler.listen(link.events, \"changeLabelBounds\", this.updateAll);\n  }\n\n  private calculatePositionForElement(element: Element): Vector {\n    const { paperArea, size } = this.props;\n\n    const bbox = boundsOf(element);\n    const { y: y0 } = paperArea.paperToScrollablePaneCoords(bbox.x, bbox.y);\n    const { x: x1, y: y1 } = paperArea.paperToScrollablePaneCoords(\n      bbox.x + bbox.width,\n      bbox.y + bbox.height\n    );\n\n    return {\n      x: x1 + ELEMENT_OFFSET,\n      y: (y0 + y1) / 2 - size.height / 2,\n    };\n  }\n\n  private calculatePositionForLink(link: Link): Vector {\n    const { view, paperArea } = this.props;\n\n    const source = view.model.getElement(link.sourceId);\n    const target = view.model.getElement(link.targetId);\n\n    if (!source || !target) {\n      throw new Error(\"Source and target are not specified\");\n    }\n\n    const route = view.getRouting(link.id);\n    const verticesDefinedByUser = link.vertices || [];\n    const vertices = route ? route.vertices : verticesDefinedByUser;\n\n    const polyline = computePolyline(source, target, vertices);\n    const polylineLength = computePolylineLength(polyline);\n    const targetPoint = getPointAlongPolyline(polyline, polylineLength / 2);\n\n    const { x, y } = paperArea.paperToScrollablePaneCoords(\n      targetPoint.x,\n      targetPoint.y\n    );\n\n    return { y: y + LINK_OFFSET, x: x + LINK_OFFSET };\n  }\n\n  private calculatePosition(): Vector {\n    const {\n      target,\n      paperArea,\n      offset = { x: 0, y: 0 },\n      calculatePosition,\n    } = this.props;\n\n    if (calculatePosition) {\n      const pos = calculatePosition();\n      const { x, y } = paperArea.paperToScrollablePaneCoords(pos.x, pos.y);\n      return { x: x + offset.x, y: y + offset.y };\n    }\n\n    if (target instanceof Element) {\n      return this.calculatePositionForElement(target);\n    } else if (target instanceof Link) {\n      return this.calculatePositionForLink(target);\n    }\n\n    throw new Error(\"Unknown target type\");\n  }\n\n  private getViewPortScrollablePoints(): { min: Vector; max: Vector } {\n    const { paperArea } = this.props;\n    const paperAreaMetrix = paperArea.getAreaMetrics();\n    const min = paperArea.clientToScrollablePaneCoords(0, 0);\n    const max = paperArea.clientToScrollablePaneCoords(\n      paperAreaMetrix.clientWidth,\n      paperAreaMetrix.clientHeight\n    );\n    return { min, max };\n  }\n\n  private getDialogScrollablePoints(): { min: Vector; max: Vector } {\n    const { size } = this.props;\n    const { x, y } = this.calculatePosition();\n    const min = {\n      x: x - FOCUS_OFFSET,\n      y: y - FOCUS_OFFSET,\n    };\n    const max = {\n      x: min.x + size.width + FOCUS_OFFSET * 2,\n      y: min.y + size.height + FOCUS_OFFSET * 2,\n    };\n    return { min, max };\n  }\n\n  private focusOn() {\n    const { paperArea } = this.props;\n    const { min: viewPortMin, max: viewPortMax } =\n      this.getViewPortScrollablePoints();\n    const { min, max } = this.getDialogScrollablePoints();\n\n    let xOffset = 0;\n    if (min.x < viewPortMin.x) {\n      xOffset = min.x - viewPortMin.x;\n    } else if (max.x > viewPortMax.x) {\n      xOffset = max.x - viewPortMax.x;\n    }\n\n    let yOffset = 0;\n    if (min.y < viewPortMin.y) {\n      yOffset = min.y - viewPortMin.y;\n    } else if (max.y > viewPortMax.y) {\n      yOffset = max.y - viewPortMax.y;\n    }\n\n    const curScrollableCenter = {\n      x: viewPortMin.x + (viewPortMax.x - viewPortMin.x) / 2,\n      y: viewPortMin.y + (viewPortMax.y - viewPortMin.y) / 2,\n    };\n    const newScrollabalCenter = {\n      x: curScrollableCenter.x + xOffset,\n      y: curScrollableCenter.y + yOffset,\n    };\n    const paperCenter = paperArea.scrollablePaneToPaperCoords(\n      newScrollabalCenter.x,\n      newScrollabalCenter.y\n    );\n    paperArea.centerTo(paperCenter);\n  }\n\n  private startSize: Vector;\n  private onStartDragging = (_e: React.MouseEvent<HTMLDivElement>) => {\n    this.preventSelection();\n    const { size } = this.props;\n    this.startSize = {\n      x: this.state.width || size.width,\n      y: this.state.height || size.height,\n    };\n  };\n\n  private calculateHeight(height: number) {\n    const { size } = this.props;\n    const minHeight = Math.min(size.height, MIN_HEIGHT);\n    const maxHeight = Math.max(size.height, MAX_HEIGHT);\n    return Math.max(minHeight, Math.min(maxHeight, height));\n  }\n\n  private calculateWidth(width: number) {\n    const { size } = this.props;\n    const minWidth = Math.min(size.width, MIN_WIDTH);\n    const maxWidth = Math.max(size.width, MAX_WIDTH);\n    return Math.max(minWidth, Math.min(maxWidth, width));\n  }\n\n  private onDragHandleBottom = (e: MouseEvent, dx: number, dy: number) => {\n    const height = this.calculateHeight(this.startSize.y + dy);\n    this.setState({ height });\n  };\n\n  private onDragHandleRight = (e: MouseEvent, dx: number) => {\n    const width = this.calculateWidth(this.startSize.x + dx);\n    this.setState({ width });\n  };\n\n  private onDragHandleBottomRight = (e: MouseEvent, dx: number, dy: number) => {\n    const width = this.calculateWidth(this.startSize.x + dx);\n    const height = this.calculateHeight(this.startSize.y + dy);\n    this.setState({ width, height });\n  };\n\n  private preventSelection = () => {\n    const onMouseUp = () => {\n      document.body.classList.remove(\"graph-explorer--unselectable\");\n      document.removeEventListener(\"mouseup\", onMouseUp);\n    };\n    document.addEventListener(\"mouseup\", onMouseUp);\n    document.body.classList.add(\"graph-explorer--unselectable\");\n  };\n\n  render() {\n    const { size, caption } = this.props;\n    const { x, y } = this.calculatePosition();\n    const width = this.state.width || size.width;\n    const height = this.state.height || size.height;\n    const style = {\n      top: y,\n      left: x,\n      width,\n      height,\n    };\n\n    return (\n      <div className={CLASS_NAME} style={style}>\n        <button\n          className={`${CLASS_NAME}__close-button`}\n          onClick={() => this.props.onClose()}\n        />\n        {caption ? (\n          <div className=\"graph-explorer-dialog__caption\">{caption}</div>\n        ) : null}\n        {this.props.children}\n        <DraggableHandle\n          className={`${CLASS_NAME}__bottom-handle`}\n          onBeginDragHandle={this.onStartDragging}\n          onDragHandle={this.onDragHandleBottom}\n        ></DraggableHandle>\n        <DraggableHandle\n          className={`${CLASS_NAME}__right-handle`}\n          onBeginDragHandle={this.onStartDragging}\n          onDragHandle={this.onDragHandleRight}\n        ></DraggableHandle>\n        <DraggableHandle\n          className={`${CLASS_NAME}__bottom-right-handle`}\n          onBeginDragHandle={this.onStartDragging}\n          onDragHandle={this.onDragHandleBottomRight}\n        ></DraggableHandle>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nexport enum ProgressState {\n  none = \"none\",\n  loading = \"loading\",\n  error = \"error\",\n  completed = \"completed\",\n}\n\nexport interface ProgressBarProps {\n  state: ProgressState;\n  percent?: number;\n  height?: number;\n}\n\nconst CLASS_NAME = \"graph-explorer-progress-bar\";\n\nexport class ProgressBar extends React.Component<ProgressBarProps, {}> {\n  render() {\n    const { state, percent = 100, height = 20 } = this.props;\n    const className = `${CLASS_NAME} ${CLASS_NAME}--${state}`;\n    const showBar =\n      state === ProgressState.loading || state === ProgressState.error;\n    return (\n      <div className={className} style={{ height: showBar ? height : 0 }}>\n        <div\n          className={`${CLASS_NAME}__bar`}\n          role=\"progressbar\"\n          style={{ width: `${percent}%` }}\n          aria-valuemin={0}\n          aria-valuemax={100}\n          aria-valuenow={percent}\n        ></div>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\nimport { hcl } from \"d3-color\";\n\nimport { ElementModel } from \"../data/model\";\nimport { DiagramView } from \"../diagram/view\";\n\nexport interface ListElementViewProps {\n  className?: string;\n  view: DiagramView;\n  model: ElementModel;\n  highlightText?: string;\n  disabled?: boolean;\n  selected?: boolean;\n  onClick?: (event: React.MouseEvent<any>, model: ElementModel) => void;\n  onDragStart?: React.HTMLProps<HTMLElement>[\"onDragStart\"];\n}\n\nconst CLASS_NAME = \"graph-explorer-list-element-view\";\n\nexport class ListElementView extends React.Component<ListElementViewProps, {}> {\n  render() {\n    const {\n      className,\n      view,\n      model,\n      highlightText,\n      disabled,\n      selected,\n      onDragStart,\n    } = this.props;\n\n    const { h, c, l } = view.getTypeStyle(model.types).color;\n    const frontColor =\n      selected && !disabled ? hcl(h, c, l * 1.2) : hcl(\"white\");\n\n    let classNames = `${CLASS_NAME}`;\n    classNames += disabled ? ` ${CLASS_NAME}--disabled` : \"\";\n    classNames += className ? ` ${className}` : \"\";\n    const localizedText = view.formatLabel(model.label.values, model.id);\n    const classesString =\n      model.types.length > 0\n        ? `\\nClasses: ${view.getElementTypeString(model)}`\n        : \"\";\n\n    return (\n      <li\n        className={classNames}\n        draggable={!disabled && Boolean(onDragStart)}\n        title={`${localizedText} ${view.formatIri(model.id)}${classesString}`}\n        style={{ background: hcl(h, c, l).toString() }}\n        onClick={this.onClick}\n        onDragStart={onDragStart}\n      >\n        <div\n          className={`${CLASS_NAME}__label`}\n          style={{ background: frontColor.toString() }}\n        >\n          {highlightSubstring(localizedText, highlightText)}\n        </div>\n      </li>\n    );\n  }\n\n  private onClick = (event: React.MouseEvent<any>) => {\n    const { disabled, model, onClick } = this.props;\n    if (!disabled && onClick) {\n      event.persist();\n      onClick(event, model);\n    }\n  };\n}\n\nexport function startDragElements(\n  e: React.DragEvent<{}>,\n  iris: readonly string[]\n) {\n  try {\n    e.dataTransfer.setData(\n      \"application/x-graph-explorer-elements\",\n      JSON.stringify(iris)\n    );\n  } catch (_ex) {\n    // IE fix\n    e.dataTransfer.setData(\"text\", JSON.stringify(iris));\n  }\n  return false;\n}\n\nconst DEFAULT_HIGHLIGHT_PROPS: React.HTMLProps<HTMLSpanElement> = {\n  className: `graph-explorer-text-highlight`,\n};\n\nexport function highlightSubstring(\n  text: string,\n  substring: string | undefined,\n  highlightProps = DEFAULT_HIGHLIGHT_PROPS\n) {\n  if (!substring) {\n    return <span>{text}</span>;\n  }\n\n  const start = text.toLowerCase().indexOf(substring.toLowerCase());\n  if (start < 0) {\n    return <span>{text}</span>;\n  }\n\n  const end = start + substring.length;\n  const before = text.substring(0, start);\n  const highlighted = text.substring(start, end);\n  const after = text.substring(end);\n\n  return (\n    <span>\n      {before}\n      <span {...highlightProps}>{highlighted}</span>\n      {after}\n    </span>\n  );\n}\n","import * as React from \"react\";\n\nimport { ElementModel, ElementIri } from \"../data/model\";\nimport { DiagramView } from \"../diagram/view\";\nimport { cloneSet } from \"../viewUtils/collections\";\nimport { Debouncer } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { ListElementView, startDragElements } from \"./listElementView\";\n\nconst CLASS_NAME = \"graph-explorer-search-results\";\n\nexport interface SearchResultProps {\n  view: DiagramView;\n  items: readonly ElementModel[];\n  selection: ReadonlySet<ElementIri>;\n  onSelectionChanged: (newSelection: ReadonlySet<ElementIri>) => void;\n  highlightText?: string;\n  /** @default true */\n  useDragAndDrop?: boolean;\n}\n\nconst enum Direction {\n  Up,\n  Down,\n}\n\nexport class SearchResults extends React.Component<SearchResultProps, {}> {\n  static defaultProps: Partial<SearchResultProps> = {\n    useDragAndDrop: true,\n  };\n\n  private readonly listener = new EventObserver();\n  private readonly delayedChangeCells = new Debouncer();\n\n  private root: HTMLElement;\n\n  private startSelection = 0;\n  private endSelection = 0;\n\n  constructor(props: SearchResultProps) {\n    super(props);\n    this.state = {\n      selection: props.selection || {},\n    };\n  }\n\n  render(): React.ReactElement<any> {\n    const items = this.props.items || [];\n    return (\n      <ul\n        className={CLASS_NAME}\n        ref={this.onRootMount}\n        tabIndex={-1}\n        onFocus={this.addKeyListener}\n        onBlur={this.removeKeyListener}\n      >\n        {items.map(this.renderResultItem)}\n      </ul>\n    );\n  }\n\n  private onRootMount = (root: HTMLElement) => {\n    this.root = root;\n  };\n\n  private renderResultItem = (model: ElementModel) => {\n    const { useDragAndDrop } = this.props;\n    const canBeSelected = this.canBeSelected(model);\n    return (\n      <ListElementView\n        key={model.id}\n        model={model}\n        view={this.props.view}\n        highlightText={this.props.highlightText}\n        disabled={!canBeSelected}\n        selected={this.props.selection.has(model.id)}\n        onClick={canBeSelected ? this.onItemClick : undefined}\n        onDragStart={\n          useDragAndDrop\n            ? (e) => {\n                const { selection } = this.props;\n                const iris: ElementIri[] = [];\n                selection.forEach((iri) => iris.push(iri));\n                if (!selection.has(model.id)) {\n                  iris.push(model.id);\n                }\n                return startDragElements(e, iris);\n              }\n            : undefined\n        }\n      />\n    );\n  };\n\n  componentDidMount() {\n    this.listener.listen(this.props.view.model.events, \"changeCells\", () => {\n      this.delayedChangeCells.call(this.onChangeCells);\n    });\n  }\n\n  private onChangeCells = () => {\n    const { items, selection } = this.props;\n    if (selection.size === 0) {\n      if (items && items.length > 0) {\n        // redraw \"already on diagram\" state\n        this.forceUpdate();\n      }\n    } else {\n      const newSelection = cloneSet(selection);\n      for (const element of this.props.view.model.elements) {\n        if (element.group === undefined && selection.has(element.iri)) {\n          newSelection.delete(element.iri);\n        }\n      }\n      this.updateSelection(newSelection);\n    }\n  };\n\n  UNSAFE_componentWillReceiveProps(props: SearchResultProps) {\n    this.setState({ selection: props.selection || {} });\n  }\n\n  componentWillUnmount() {\n    this.removeKeyListener();\n    this.listener.stopListening();\n    this.delayedChangeCells.dispose();\n  }\n\n  private updateSelection(selection: ReadonlySet<ElementIri>) {\n    const { onSelectionChanged } = this.props;\n    onSelectionChanged(selection);\n  }\n\n  private addKeyListener = () => {\n    document.addEventListener(\"keydown\", this.onKeyUp);\n  };\n\n  private removeKeyListener = () => {\n    document.removeEventListener(\"keydown\", this.onKeyUp);\n  };\n\n  private onKeyUp = (event: KeyboardEvent) => {\n    const { items } = this.props;\n    const isPressedUp = event.keyCode === 38 || event.which === 38;\n    const isPressDown = event.keyCode === 40 || event.which === 40;\n\n    if (isPressedUp || isPressDown) {\n      if (event.shiftKey) {\n        // select range\n        if (isPressedUp) {\n          this.endSelection = this.getNextIndex(\n            this.endSelection,\n            Direction.Up\n          );\n        } else if (isPressDown) {\n          this.endSelection = this.getNextIndex(\n            this.endSelection,\n            Direction.Down\n          );\n        }\n        const startIndex = Math.min(this.startSelection, this.endSelection);\n        const finishIndex = Math.max(this.startSelection, this.endSelection);\n        const selection = this.selectRange(startIndex, finishIndex);\n\n        this.updateSelection(selection);\n        this.focusOn(this.endSelection);\n      } else {\n        // change focus\n        const startIndex = Math.min(this.startSelection, this.endSelection);\n        const finishIndex = Math.max(this.startSelection, this.endSelection);\n\n        if (isPressedUp) {\n          this.startSelection = this.getNextIndex(startIndex, Direction.Up);\n        } else if (isPressDown) {\n          this.startSelection = this.getNextIndex(finishIndex, Direction.Down);\n        }\n        this.endSelection = this.startSelection;\n\n        const focusElement = items[this.startSelection];\n        const newSelection = new Set<ElementIri>();\n        newSelection.add(focusElement.id);\n\n        this.updateSelection(newSelection);\n        this.focusOn(this.startSelection);\n      }\n    }\n    event.preventDefault();\n  };\n\n  private onItemClick = (event: React.MouseEvent<any>, model: ElementModel) => {\n    event.preventDefault();\n\n    const { items, selection, onSelectionChanged } = this.props;\n    const modelIndex = items.indexOf(model);\n\n    let newSelection: Set<ElementIri>;\n\n    if (event.shiftKey && this.startSelection !== -1) {\n      // select range\n      const start = Math.min(this.startSelection, modelIndex);\n      const end = Math.max(this.startSelection, modelIndex);\n      newSelection = this.selectRange(start, end);\n    } else {\n      this.endSelection = this.startSelection = modelIndex;\n      const ctrlKey = event.ctrlKey || event.metaKey;\n\n      if (ctrlKey) {\n        // select/deselect\n        newSelection = cloneSet(selection);\n        if (selection.has(model.id)) {\n          newSelection.delete(model.id);\n        } else {\n          newSelection.add(model.id);\n        }\n      } else {\n        // single click\n        newSelection = new Set<ElementIri>();\n        newSelection.add(model.id);\n      }\n    }\n\n    onSelectionChanged(newSelection);\n  };\n\n  private selectRange(start: number, end: number): Set<ElementIri> {\n    const { items } = this.props;\n    const selection = new Set<ElementIri>();\n    for (let i = start; i <= end; i++) {\n      const selectedModel = items[i];\n      if (this.canBeSelected(selectedModel)) {\n        selection.add(selectedModel.id);\n      }\n    }\n    return selection;\n  }\n\n  private getNextIndex(startIndex: number, direction: Direction) {\n    const { items } = this.props;\n    if (items.length === 0) {\n      return startIndex;\n    }\n    const indexDelta = direction === Direction.Up ? -1 : 1;\n    for (let step = 1; step < items.length; step++) {\n      let nextIndex = startIndex + step * indexDelta;\n      if (nextIndex < 0) {\n        nextIndex += items.length;\n      }\n      if (nextIndex >= items.length) {\n        nextIndex -= items.length;\n      }\n      if (this.canBeSelected(items[nextIndex])) {\n        return nextIndex;\n      }\n    }\n    return startIndex;\n  }\n\n  private canBeSelected(model: ElementModel) {\n    const alreadyOnDiagram =\n      this.props.view.model.elements.findIndex(\n        (element) => element.iri === model.id && element.group === undefined\n      ) >= 0;\n    return !this.props.useDragAndDrop || !alreadyOnDiagram;\n  }\n\n  private focusOn(index: number) {\n    const scrollableContainer = this.root.parentElement;\n\n    const containerBounds = scrollableContainer.getBoundingClientRect();\n\n    const item = this.root.children.item(index) as HTMLElement;\n    const itemBounds = item.getBoundingClientRect();\n    const itemTop = itemBounds.top - containerBounds.top;\n    const itemBottom = itemBounds.bottom - containerBounds.top;\n\n    if (itemTop < 0) {\n      scrollableContainer.scrollTop += itemTop;\n    } else if (itemBottom > containerBounds.height) {\n      scrollableContainer.scrollTop += itemBottom - containerBounds.height;\n    }\n\n    item.focus();\n  }\n}\n","import * as React from \"react\";\n\nimport {\n  Dictionary,\n  ElementModel,\n  ElementIri,\n  LinkTypeIri,\n} from \"../data/model\";\n\nimport { FatLinkType, Element } from \"../diagram/elements\";\nimport { DiagramView } from \"../diagram/view\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { ProgressBar, ProgressState } from \"./progressBar\";\nimport { highlightSubstring } from \"./listElementView\";\nimport { SearchResults } from \"./searchResults\";\n\nimport {\n  WorkspaceContext,\n  WorkspaceEventKey,\n} from \"../workspace/workspaceContext\";\n\ninterface ConnectionCount {\n  inCount: number;\n  outCount: number;\n}\n\nexport interface ReactElementModel {\n  model: ElementModel;\n  presentOnDiagram: boolean;\n}\n\nconst MAX_LINK_COUNT = 100;\nconst ALL_RELATED_ELEMENTS_LINK: FatLinkType = new FatLinkType({\n  id: \"allRelatedElements\" as LinkTypeIri,\n  label: [{ value: \"All\", language: \"\" }],\n});\n\nexport interface PropertySuggestionParams {\n  elementId: string;\n  token: string;\n  properties: string[];\n  lang: string;\n}\nexport type PropertySuggestionHandler = (\n  params: PropertySuggestionParams\n) => Promise<Dictionary<PropertyScore>>;\n\ntype SortMode = \"alphabet\" | \"smart\";\n\nexport interface PropertyScore {\n  propertyIri: string;\n  score: number;\n}\n\nexport interface LinkDataChunk {\n  link: FatLinkType;\n  direction?: \"in\" | \"out\";\n  expectedCount: number;\n  offset?: number;\n}\n\nexport interface ObjectsData {\n  linkDataChunk: LinkDataChunk;\n  objects: ReactElementModel[];\n}\n\nexport interface ConnectionsMenuProps {\n  view: DiagramView;\n  editor: EditorController;\n  target: Element;\n  onClose: () => void;\n  onAddElements: (\n    elementIris: ElementIri[],\n    linkType: FatLinkType | undefined\n  ) => void;\n  suggestProperties?: PropertySuggestionHandler;\n}\n\nexport class ConnectionsMenu extends React.Component<ConnectionsMenuProps, {}> {\n  static contextType = WorkspaceContext;\n  declare readonly context: React.ContextType<typeof WorkspaceContext>;\n\n  private readonly handler = new EventObserver();\n  private readonly linkTypesListener = new EventObserver();\n  private loadingState = ProgressState.none;\n\n  private links: FatLinkType[];\n  private countMap: Record<string, ConnectionCount>;\n\n  private linkDataChunk: LinkDataChunk;\n  private objects: ReactElementModel[];\n\n  private updateAll = () => this.forceUpdate();\n\n  componentDidMount() {\n    const { view } = this.props;\n    this.handler.listen(view.events, \"changeLanguage\", this.updateAll);\n\n    this.loadLinks();\n  }\n\n  componentWillUnmount() {\n    this.handler.stopListening();\n    this.linkTypesListener.stopListening();\n  }\n\n  private resubscribeOnLinkTypeEvents(\n    linkTypesOfElement: readonly FatLinkType[]\n  ) {\n    this.linkTypesListener.stopListening();\n    for (const linkType of linkTypesOfElement) {\n      this.linkTypesListener.listen(\n        linkType.events,\n        \"changeLabel\",\n        this.updateAll\n      );\n      this.linkTypesListener.listen(\n        linkType.events,\n        \"changeVisibility\",\n        this.updateAll\n      );\n    }\n  }\n\n  private loadLinks() {\n    const { view, editor, target } = this.props;\n\n    this.loadingState = ProgressState.loading;\n    this.links = [];\n    this.countMap = {};\n    editor.model.dataProvider\n      .linkTypesOf({ elementId: target.iri })\n      .then((linkTypes) => {\n        this.loadingState = ProgressState.completed;\n\n        const countMap: Dictionary<ConnectionCount> = {};\n        const links: FatLinkType[] = [];\n        for (const { id: linkTypeId, inCount, outCount } of linkTypes) {\n          countMap[linkTypeId] = { inCount, outCount };\n          links.push(view.model.createLinkType(linkTypeId));\n        }\n\n        countMap[ALL_RELATED_ELEMENTS_LINK.id] = Object.keys(countMap)\n          .map((key) => countMap[key])\n          .reduce(\n            (a, b) => {\n              return {\n                inCount: a.inCount + b.inCount,\n                outCount: a.outCount + b.outCount,\n              };\n            },\n            { inCount: 0, outCount: 0 }\n          );\n\n        this.countMap = countMap;\n        this.links = links;\n        this.resubscribeOnLinkTypeEvents(this.links);\n\n        this.updateAll();\n\n        this.context.workspace.triggerWorkspaceEvent(\n          WorkspaceEventKey.connectionsLoadLinks\n        );\n      })\n      .catch((err) => {\n        console.error(err);\n        this.loadingState = ProgressState.error;\n        this.updateAll();\n      });\n    this.updateAll();\n  }\n\n  private loadObjects(linkDataChunk: LinkDataChunk) {\n    const { view, editor, target } = this.props;\n    const { link, direction } = linkDataChunk;\n    const offset = linkDataChunk.offset || 0;\n\n    this.loadingState = ProgressState.loading;\n    this.linkDataChunk = linkDataChunk;\n    this.objects = [];\n\n    editor.model.dataProvider\n      .linkElements({\n        elementId: target.iri,\n        linkId: link === ALL_RELATED_ELEMENTS_LINK ? undefined : link.id,\n        limit: offset + MAX_LINK_COUNT,\n        offset: offset,\n        direction,\n      })\n      .then((elements) => {\n        this.loadingState = ProgressState.completed;\n        this.objects = Object.keys(elements).map((iri) => ({\n          model: elements[iri],\n          presentOnDiagram:\n            view.model.elements.findIndex(\n              (element) => element.iri === iri && element.group === undefined\n            ) >= 0,\n        }));\n        this.updateAll();\n\n        this.context.workspace.triggerWorkspaceEvent(\n          WorkspaceEventKey.connectionsLoadElements\n        );\n      })\n      .catch((err) => {\n        console.error(err);\n        this.loadingState = ProgressState.error;\n        this.updateAll();\n      });\n  }\n\n  private addSelectedElements = (selectedObjects: ReactElementModel[]) => {\n    const { onClose, onAddElements } = this.props;\n\n    const addedElementsIris = selectedObjects.map((item) => item.model.id);\n    const linkType = this.linkDataChunk ? this.linkDataChunk.link : undefined;\n    const hasChosenLinkType =\n      this.linkDataChunk && linkType !== ALL_RELATED_ELEMENTS_LINK;\n\n    onAddElements(addedElementsIris, hasChosenLinkType ? linkType : undefined);\n    onClose();\n  };\n\n  private onExpandLink = (linkDataChunk: LinkDataChunk) => {\n    const alreadyLoaded =\n      this.objects &&\n      this.linkDataChunk &&\n      this.linkDataChunk.link === linkDataChunk.link &&\n      this.linkDataChunk.direction === linkDataChunk.direction;\n    if (!alreadyLoaded) {\n      this.loadObjects(linkDataChunk);\n    }\n    this.updateAll();\n\n    this.context.workspace.triggerWorkspaceEvent(\n      WorkspaceEventKey.connectionsExpandLink\n    );\n  };\n\n  private onMoveToFilter = (linkDataChunk: LinkDataChunk) => {\n    const { view, target } = this.props;\n    const { link, direction } = linkDataChunk;\n\n    if (link === ALL_RELATED_ELEMENTS_LINK) {\n      target.addToFilter();\n    } else {\n      const selectedElement = view.model.getElement(target.id);\n      selectedElement.addToFilter(link, direction);\n    }\n  };\n\n  render() {\n    const connectionsData = {\n      links: this.links || [],\n      countMap: this.countMap || {},\n    };\n\n    let objectsData: ObjectsData = null;\n\n    if (this.linkDataChunk && this.objects) {\n      objectsData = {\n        linkDataChunk: this.linkDataChunk,\n        objects: this.objects,\n      };\n    }\n\n    const { view, target, suggestProperties } = this.props;\n    return (\n      <ConnectionsMenuMarkup\n        target={target}\n        connectionsData={connectionsData}\n        objectsData={objectsData}\n        state={this.loadingState}\n        view={view}\n        onExpandLink={this.onExpandLink}\n        onPressAddSelected={this.addSelectedElements}\n        onMoveToFilter={this.onMoveToFilter}\n        propertySuggestionCall={suggestProperties}\n      />\n    );\n  }\n}\n\ninterface ConnectionsMenuMarkupProps {\n  target: Element;\n\n  connectionsData: {\n    links: FatLinkType[];\n    countMap: Record<string, ConnectionCount>;\n  };\n\n  objectsData?: ObjectsData;\n\n  view: DiagramView;\n  state: ProgressState;\n\n  onExpandLink?: (linkDataChunk: LinkDataChunk) => void;\n  onPressAddSelected?: (selectedObjects: ReactElementModel[]) => void;\n  onMoveToFilter?: (linkDataChunk: LinkDataChunk) => void;\n\n  propertySuggestionCall?: PropertySuggestionHandler;\n}\n\ninterface ConnectionsMenuMarkupState {\n  filterKey?: string;\n  panel?: string;\n  sortMode?: SortMode;\n}\n\nclass ConnectionsMenuMarkup extends React.Component<\n  ConnectionsMenuMarkupProps,\n  ConnectionsMenuMarkupState\n> {\n  constructor(props: ConnectionsMenuMarkupProps) {\n    super(props);\n    this.state = {\n      filterKey: \"\",\n      panel: \"connections\",\n      sortMode: \"alphabet\",\n    };\n  }\n\n  private onChangeFilter = (e: React.FormEvent<HTMLInputElement>) => {\n    const filterKey = e.currentTarget.value;\n    this.setState({ filterKey });\n  };\n\n  private getTitle = () => {\n    if (this.props.objectsData && this.state.panel === \"objects\") {\n      return \"Objects\";\n    } else if (\n      this.props.connectionsData &&\n      this.state.panel === \"connections\"\n    ) {\n      return \"Connections\";\n    }\n    return \"Error\";\n  };\n\n  private onExpandLink = (linkDataChunk: LinkDataChunk) => {\n    this.setState({ filterKey: \"\", panel: \"objects\" });\n    this.props.onExpandLink(linkDataChunk);\n  };\n\n  private onCollapseLink = () => {\n    this.setState({ filterKey: \"\", panel: \"connections\" });\n  };\n\n  private getBreadCrumbs = () => {\n    if (this.props.objectsData && this.state.panel === \"objects\") {\n      const { link, direction } = this.props.objectsData.linkDataChunk;\n      const localizedText = this.props.view.formatLabel(link.label, link.id);\n\n      return (\n        <span className=\"graph-explorer-connections-menu_bread-crumbs\">\n          <a\n            className=\"graph-explorer-connections-menu__link\"\n            onClick={this.onCollapseLink}\n          >\n            Connections\n          </a>\n          {\"\\u00A0\" + \"/\" + \"\\u00A0\"}\n          {localizedText} {direction ? `(${direction})` : null}\n        </span>\n      );\n    } else {\n      return null;\n    }\n  };\n\n  private getBody = () => {\n    if (this.props.state === \"error\") {\n      return (\n        <label className=\"graph-explorer-label graph-explorer-connections-menu__error\">\n          Error\n        </label>\n      );\n    } else if (this.props.objectsData && this.state.panel === \"objects\") {\n      return (\n        <ObjectsPanel\n          data={this.props.objectsData}\n          onMoveToFilter={this.props.onMoveToFilter}\n          view={this.props.view}\n          filterKey={this.state.filterKey}\n          loading={this.props.state === ProgressState.loading}\n          onPressAddSelected={this.props.onPressAddSelected}\n        />\n      );\n    } else if (\n      this.props.connectionsData &&\n      this.state.panel === \"connections\"\n    ) {\n      if (this.props.state === ProgressState.loading) {\n        return (\n          <label className=\"graph-explorer-label graph-explorer-connections-menu__loading\">\n            Loading...\n          </label>\n        );\n      }\n\n      return (\n        <ConnectionsList\n          id={this.props.target.id}\n          data={this.props.connectionsData}\n          view={this.props.view}\n          filterKey={this.state.filterKey}\n          onExpandLink={this.onExpandLink}\n          onMoveToFilter={this.props.onMoveToFilter}\n          propertySuggestionCall={this.props.propertySuggestionCall}\n          sortMode={this.state.sortMode}\n        />\n      );\n    } else {\n      return <div />;\n    }\n  };\n\n  private onSortChange = (e: React.FormEvent<HTMLInputElement>) => {\n    const value = (e.target as HTMLInputElement).value as SortMode;\n\n    if (this.state.sortMode === value) {\n      return;\n    }\n\n    this.setState({ sortMode: value });\n  };\n\n  private renderSortSwitch = (id: string, icon: string, title: string) => {\n    return (\n      <div>\n        <input\n          type=\"radio\"\n          name=\"sort\"\n          id={id}\n          value={id}\n          className=\"graph-explorer-connections-menu__sort-switch\"\n          onChange={this.onSortChange}\n          checked={this.state.sortMode === id}\n        />\n        <label\n          htmlFor={id}\n          className=\"graph-explorer-connections-menu__sort-switch-label\"\n          title={title}\n        >\n          <i className={`fa ${icon}`} />\n        </label>\n      </div>\n    );\n  };\n\n  private renderSortSwitches = () => {\n    if (\n      this.state.panel !== \"connections\" ||\n      !this.props.propertySuggestionCall\n    ) {\n      return null;\n    }\n\n    return (\n      <div className=\"graph-explorer-connections-menu_search-line-sort-switches\">\n        {this.renderSortSwitch(\n          \"alphabet\",\n          \"fa-sort-alpha-asc\",\n          \"Sort alphabetically\"\n        )}\n        {this.renderSortSwitch(\"smart\", \"fa-lightbulb-o\", \"Smart sort\")}\n      </div>\n    );\n  };\n\n  render() {\n    return (\n      <div className=\"graph-explorer-connections-menu\">\n        <label className=\"graph-explorer-label graph-explorer-connections-menu__title-label\">\n          {this.getTitle()}\n        </label>\n        {this.getBreadCrumbs()}\n        <div className=\"graph-explorer-connections-menu_search-line\">\n          <input\n            type=\"text\"\n            className=\"search-input graph-explorer-form-control graph-explorer-connections-menu__search-line-input\"\n            value={this.state.filterKey}\n            onChange={this.onChangeFilter}\n            placeholder=\"Search for...\"\n          />\n          {this.renderSortSwitches()}\n        </div>\n        <ProgressBar state={this.props.state} height={10} />\n        {this.getBody()}\n      </div>\n    );\n  }\n}\n\ninterface ConnectionsListProps {\n  id: string;\n  data: {\n    links: FatLinkType[];\n    countMap: Record<string, ConnectionCount>;\n  };\n  view: DiagramView;\n  filterKey: string;\n\n  onExpandLink?: (linkDataChunk: LinkDataChunk) => void;\n  onMoveToFilter?: (linkDataChunk: LinkDataChunk) => void;\n\n  propertySuggestionCall?: PropertySuggestionHandler;\n  sortMode: SortMode;\n}\n\nclass ConnectionsList extends React.Component<\n  ConnectionsListProps,\n  { scores: Dictionary<PropertyScore> }\n> {\n  constructor(props: ConnectionsListProps) {\n    super(props);\n    this.state = { scores: {} };\n    this.updateScores(props);\n  }\n\n  componentDidUpdate(newProps: ConnectionsListProps) {\n    this.updateScores(newProps);\n  }\n\n  private updateScores = (props: ConnectionsListProps) => {\n    if (\n      props.propertySuggestionCall &&\n      (props.filterKey || props.sortMode === \"smart\")\n    ) {\n      const { id, data, view, filterKey } = props;\n      const lang = view.getLanguage();\n      const token = filterKey.trim();\n      const properties = data.links.map((l) => l.id);\n      props\n        .propertySuggestionCall({ elementId: id, token, properties, lang })\n        .then((scores) => this.setState({ scores }));\n    }\n  };\n\n  private isSmartMode(): boolean {\n    return this.props.sortMode === \"smart\" && !this.props.filterKey;\n  }\n\n  private compareLinks = (a: FatLinkType, b: FatLinkType) => {\n    const { view } = this.props;\n    const aText = view.formatLabel(a.label, a.id);\n    const bText = view.formatLabel(b.label, b.id);\n    return aText.localeCompare(bText);\n  };\n\n  private compareLinksByWeight = (a: FatLinkType, b: FatLinkType) => {\n    const { view } = this.props;\n    const aText = view.formatLabel(a.label, a.id);\n    const bText = view.formatLabel(b.label, b.id);\n\n    const aWeight = this.state.scores[a.id] ? this.state.scores[a.id].score : 0;\n    const bWeight = this.state.scores[b.id] ? this.state.scores[b.id].score : 0;\n\n    return aWeight > bWeight\n      ? -1\n      : aWeight < bWeight\n      ? 1\n      : aText.localeCompare(bText);\n  };\n\n  private getLinks = () => {\n    const { view, data, filterKey } = this.props;\n    return (data.links || [])\n      .filter((link) => {\n        const text = view.formatLabel(link.label, link.id).toLowerCase();\n        return !filterKey || text.indexOf(filterKey.toLowerCase()) >= 0;\n      })\n      .sort(this.compareLinks);\n  };\n\n  private getProbableLinks = () => {\n    const isSmartMode = this.isSmartMode();\n    return (this.props.data.links || [])\n      .filter((link) => {\n        return (\n          this.state.scores[link.id] &&\n          (this.state.scores[link.id].score > 0 || isSmartMode)\n        );\n      })\n      .sort(this.compareLinksByWeight);\n  };\n\n  private getViews = (links: FatLinkType[], notSure?: boolean) => {\n    const { view } = this.props;\n    const countMap = this.props.data.countMap || {};\n\n    const views: React.JSX.Element[] = [];\n    const addView = (link: FatLinkType, direction: \"in\" | \"out\") => {\n      const count =\n        direction === \"in\"\n          ? countMap[link.id].inCount\n          : countMap[link.id].outCount;\n      if (count === 0) {\n        return;\n      }\n      const postfix = notSure ? \"-probable\" : \"\";\n      views.push(\n        <LinkInPopupMenu\n          key={`${direction}-${link.id}-${postfix}`}\n          link={link}\n          onExpandLink={this.props.onExpandLink}\n          view={view}\n          count={count}\n          direction={direction}\n          filterKey={notSure ? \"\" : this.props.filterKey}\n          onMoveToFilter={this.props.onMoveToFilter}\n          probability={\n            this.state.scores[link.id] && notSure\n              ? this.state.scores[link.id].score\n              : 0\n          }\n        />\n      );\n    };\n\n    for (const link of links) {\n      addView(link, \"in\");\n      addView(link, \"out\");\n    }\n\n    return views;\n  };\n\n  render() {\n    const { view } = this.props;\n    const isSmartMode = this.isSmartMode();\n\n    const links = isSmartMode ? [] : this.getLinks();\n    const probableLinks = this.getProbableLinks().filter(\n      (link) => links.indexOf(link) === -1\n    );\n    const views = this.getViews(links);\n    const probableViews = this.getViews(probableLinks, true);\n\n    let viewList: React.ReactElement<any> | React.ReactElement<any>[];\n    if (views.length === 0 && probableViews.length === 0) {\n      viewList = (\n        <label className=\"graph-explorer-label graph-explorer-connections-menu_links-list__empty\">\n          List empty\n        </label>\n      );\n    } else {\n      viewList = views;\n      if (views.length > 1 || (isSmartMode && probableViews.length > 1)) {\n        const countMap = this.props.data.countMap || {};\n        const allRelatedElements = countMap[ALL_RELATED_ELEMENTS_LINK.id];\n        viewList = [\n          <LinkInPopupMenu\n            key={ALL_RELATED_ELEMENTS_LINK.id}\n            link={ALL_RELATED_ELEMENTS_LINK}\n            onExpandLink={this.props.onExpandLink}\n            view={view}\n            count={allRelatedElements.inCount + allRelatedElements.outCount}\n            onMoveToFilter={this.props.onMoveToFilter}\n          />,\n          <hr\n            key=\"graph-explorer-hr-line\"\n            className=\"graph-explorer-connections-menu_links-list__hr\"\n          />,\n        ].concat(viewList);\n      }\n    }\n    let probablePart = null;\n    if (probableViews.length !== 0) {\n      probablePart = [\n        isSmartMode ? null : (\n          <li key=\"probable-links\">\n            <span className=\"graph-explorer-label\">\n              Probably, you&lsquo;re looking for..\n            </span>\n          </li>\n        ),\n        probableViews,\n      ];\n    }\n    return (\n      <ul\n        className={\n          \"graph-explorer-connections-menu_links-list \" +\n          (views.length === 0 && probableViews.length === 0\n            ? \"ocm_links-list-empty\"\n            : \"\")\n        }\n      >\n        {viewList}\n        {probablePart}\n      </ul>\n    );\n  }\n}\n\ninterface LinkInPopupMenuProps {\n  link: FatLinkType;\n  count: number;\n  direction?: \"in\" | \"out\";\n  view: DiagramView;\n  filterKey?: string;\n  onExpandLink?: (linkDataChunk: LinkDataChunk) => void;\n  onMoveToFilter?: (linkDataChunk: LinkDataChunk) => void;\n  probability?: number;\n}\n\nclass LinkInPopupMenu extends React.Component<LinkInPopupMenuProps, {}> {\n  private onExpandLink = (expectedCount: number, direction?: \"in\" | \"out\") => {\n    this.props.onExpandLink({\n      link: this.props.link,\n      direction,\n      expectedCount,\n    });\n  };\n\n  private onMoveToFilter = (evt: React.MouseEvent<any>) => {\n    evt.stopPropagation();\n    this.props.onMoveToFilter({\n      link: this.props.link,\n      direction: this.props.direction,\n      expectedCount: this.props.count,\n    });\n  };\n\n  render() {\n    const { view, link } = this.props;\n    const fullText = view.formatLabel(link.label, link.id);\n    const probability = Math.round(this.props.probability * 100);\n    const textLine = highlightSubstring(\n      fullText + (probability > 0 ? \" (\" + probability + \"%)\" : \"\"),\n      this.props.filterKey\n    );\n    const directionName =\n      this.props.direction === \"in\"\n        ? \"source\"\n        : this.props.direction === \"out\"\n        ? \"target\"\n        : \"all connected\";\n\n    return (\n      <li\n        data-linktypeid={this.props.link.id}\n        className=\"link-in-popup-menu\"\n        title={`${directionName} of \"${fullText}\" ${view.formatIri(link.id)}`}\n        onClick={() =>\n          this.onExpandLink(this.props.count, this.props.direction)\n        }\n      >\n        {this.props.direction === \"in\" || this.props.direction === \"out\" ? (\n          <div className=\"link-in-popup-menu_direction\">\n            {this.props.direction === \"in\" && (\n              <div className=\"link-in-popup-menu_direction__in-direction\" />\n            )}\n            {this.props.direction === \"out\" && (\n              <div className=\"link-in-popup-menu_direction__out-direction\" />\n            )}\n          </div>\n        ) : null}\n        <div className=\"link-in-popup-menu__link-title\">{textLine}</div>\n        <span className=\"graph-explorer-badge link-in-popup-menu__count\">\n          {this.props.count <= MAX_LINK_COUNT ? this.props.count : \"100+\"}\n        </span>\n        <div\n          className=\"link-in-popup-menu__filter-button\"\n          onClick={this.onMoveToFilter}\n          title=\"Set as filter in the Instances panel\"\n        />\n        <div\n          className=\"link-in-popup-menu__navigate-button\"\n          title={`Navigate to ${directionName} \"${fullText}\" elements`}\n        />\n      </li>\n    );\n  }\n}\n\ninterface ObjectsPanelProps {\n  data: ObjectsData;\n  loading?: boolean;\n  view: DiagramView;\n  filterKey?: string;\n  onPressAddSelected?: (selectedObjects: ReactElementModel[]) => void;\n  onMoveToFilter?: (linkDataChunk: LinkDataChunk) => void;\n}\n\ninterface ObjectsPanelState {\n  selection: ReadonlySet<ElementIri>;\n}\n\nclass ObjectsPanel extends React.Component<\n  ObjectsPanelProps,\n  ObjectsPanelState\n> {\n  constructor(props: ObjectsPanelProps) {\n    super(props);\n    this.state = { selection: new Set<ElementIri>() };\n  }\n\n  componentDidUpdate(nextProps: ObjectsPanelProps) {\n    if (this.props.data.objects.length < nextProps.data.objects.length) {\n      this.setState({ selection: new Set<ElementIri>() });\n    }\n  }\n\n  private onSelectAll = () => {\n    const objects = this.props.data.objects;\n    if (objects.length === 0) {\n      return;\n    }\n    const allSelected = allNonPresentedAreSelected(\n      objects,\n      this.state.selection\n    );\n    const newSelection = allSelected\n      ? new Set<ElementIri>()\n      : selectNonPresented(this.props.data.objects);\n    this.updateSelection(newSelection);\n  };\n\n  private getFilteredObjects(): ReactElementModel[] {\n    if (!this.props.filterKey) {\n      return this.props.data.objects;\n    }\n    const filterKey = this.props.filterKey.toLowerCase();\n    return this.props.data.objects.filter((element) => {\n      const text = this.props.view\n        .formatLabel(element.model.label.values, element.model.id)\n        .toLowerCase();\n      return text && text.indexOf(filterKey) >= 0;\n    });\n  }\n\n  private getItems(list: readonly ReactElementModel[]) {\n    const added: Record<string, true> = {};\n    const result: ElementModel[] = [];\n    for (const obj of list) {\n      if (added[obj.model.id]) {\n        continue;\n      }\n      added[obj.model.id] = true;\n      result.push(obj.model);\n    }\n    return result;\n  }\n\n  private updateSelection = (newSelection: ReadonlySet<ElementIri>) => {\n    this.setState({ selection: newSelection });\n  };\n\n  private counter = (activeObjCount: number) => {\n    const countString = `${activeObjCount}\\u00A0of\\u00A0${this.props.data.objects.length}`;\n\n    const wrongNodes =\n      Math.min(MAX_LINK_COUNT, this.props.data.linkDataChunk.expectedCount) -\n      this.props.data.objects.length;\n    const wrongNodesString =\n      Math.abs(wrongNodes) > MAX_LINK_COUNT\n        ? `${MAX_LINK_COUNT}+`\n        : Math.abs(wrongNodes).toString();\n    const wrongNodesCount =\n      wrongNodes === 0\n        ? \"\"\n        : wrongNodes < 0\n        ? `\\u00A0(${wrongNodesString})`\n        : `\\u00A0(${wrongNodesString})`;\n    const wrongNodesTitle =\n      wrongNodes === 0\n        ? \"\"\n        : wrongNodes > 0\n        ? \"Unavailable nodes\"\n        : \"Extra nodes\";\n\n    return (\n      <div className=\"graph-explorer-label graph-explorer-connections-menu_objects-panel_bottom-panel__count-label\">\n        <span>{countString}</span>\n        <span\n          className=\"graph-explorer-connections-menu_objects-panel_bottom-panel__extra-elements\"\n          title={wrongNodesTitle}\n        >\n          {wrongNodesCount}\n        </span>\n      </div>\n    );\n  };\n\n  render() {\n    const { onPressAddSelected, filterKey } = this.props;\n    const { selection } = this.state;\n    const objects = this.getFilteredObjects();\n    const isAllSelected = allNonPresentedAreSelected(objects, selection);\n\n    const nonPresented = objects.filter((el) => !el.presentOnDiagram);\n    const active = nonPresented.filter((el) => selection.has(el.model.id));\n\n    return (\n      <div className=\"graph-explorer-connections-menu_objects-panel\">\n        <div className=\"graph-explorer-connections-menu_objects-panel__select-all\">\n          <label>\n            <input\n              type=\"checkbox\"\n              checked={isAllSelected && nonPresented.length > 0}\n              onChange={this.onSelectAll}\n              disabled={nonPresented.length === 0}\n            />\n            Select All\n          </label>\n        </div>\n        {this.props.loading ? (\n          <label className=\"graph-explorer-label graph-explorer-connections-menu__loading-objects\">\n            Loading...\n          </label>\n        ) : objects.length === 0 ? (\n          <label className=\"graph-explorer-label graph-explorer-connections-menu__loading-objects\">\n            No available nodes\n          </label>\n        ) : (\n          <div className=\"graph-explorer-connections-menu_objects-panel_objects-list\">\n            <SearchResults\n              view={this.props.view}\n              items={this.getItems(objects)}\n              selection={this.state.selection}\n              onSelectionChanged={this.updateSelection}\n              highlightText={filterKey}\n            />\n            {this.props.data.linkDataChunk.expectedCount > MAX_LINK_COUNT ? (\n              <div\n                className=\"graph-explorer-connections-menu__move-to-filter\"\n                onClick={() =>\n                  this.props.onMoveToFilter(this.props.data.linkDataChunk)\n                }\n              >\n                The list was truncated, for more data click here to use the\n                filter panel\n              </div>\n            ) : null}\n          </div>\n        )}\n        <div className=\"graph-explorer-connections-menu_objects-panel_bottom-panel\">\n          {this.counter(active.length)}\n          <button\n            className={\n              \"graph-explorer-btn graph-explorer-btn-primary pull-right \" +\n              \"graph-explorer-connections-menu_objects-panel_bottom-panel__add-button\"\n            }\n            disabled={this.props.loading || nonPresented.length === 0}\n            onClick={() =>\n              onPressAddSelected(active.length > 0 ? active : nonPresented)\n            }\n          >\n            {active.length > 0 ? \"Add selected\" : \"Add all\"}\n          </button>\n        </div>\n      </div>\n    );\n  }\n}\n\nfunction selectNonPresented(objects: readonly ReactElementModel[]) {\n  const selection = new Set<ElementIri>();\n  for (const object of objects) {\n    if (object.presentOnDiagram) {\n      continue;\n    }\n    selection.add(object.model.id);\n  }\n  return selection;\n}\n\nfunction allNonPresentedAreSelected(\n  objects: readonly ReactElementModel[],\n  selection: ReadonlySet<ElementIri>\n): boolean {\n  let allSelected = true;\n  for (const object of objects) {\n    if (object.presentOnDiagram) {\n      continue;\n    }\n    allSelected = allSelected && selection.has(object.model.id);\n  }\n  return allSelected;\n}\n","import * as React from \"react\";\n\nimport { DiagramView } from \"../diagram/view\";\nimport {\n  ElementModel,\n  LocalizedString,\n  PropertyTypeIri,\n  Property,\n  LiteralProperty,\n  isLiteralProperty,\n  ElementIri,\n} from \"../data/model\";\n\nconst CLASS_NAME = \"graph-explorer-edit-form\";\n\nexport interface Props {\n  view: DiagramView;\n  entity: ElementModel;\n  onApply: (entity: ElementModel) => void;\n  onCancel: () => void;\n}\n\nexport interface State {\n  elementModel?: ElementModel;\n}\n\nexport class EditEntityForm extends React.Component<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = { elementModel: props.entity };\n  }\n\n  componentDidUpdate(nextProps: Props) {\n    if (this.props.entity !== nextProps.entity) {\n      this.setState({ elementModel: nextProps.entity });\n    }\n  }\n\n  private renderProperty = (key: PropertyTypeIri, property: Property) => {\n    const { view } = this.props;\n    const richProperty = view.model.getProperty(key);\n    const label = view.formatLabel(richProperty.label, key);\n\n    let values: any[] = [];\n    if (isLiteralProperty(property)) {\n      values = property.values.map(({ value, language }) => {\n        return { value: value, language: language };\n      });\n    }\n    return (\n      <div key={key} className={`${CLASS_NAME}__form-row`}>\n        <label>\n          {label}\n          {values.map((value, index) => (\n            <input\n              key={index}\n              className=\"graph-explorer-form-control\"\n              defaultValue={value.value}\n              lang={value.language}\n              onChange={this.onChangeProp}\n              data-iri={key}\n            />\n          ))}\n        </label>\n      </div>\n    );\n  };\n\n  private renderProperties() {\n    const { properties } = this.props.entity;\n    const propertyIris = Object.keys(properties) as PropertyTypeIri[];\n    return (\n      <div>\n        {propertyIris.map((iri) => {\n          return this.renderProperty(iri, properties[iri]);\n        })}\n      </div>\n    );\n  }\n\n  private renderType() {\n    const { view } = this.props;\n    const { elementModel } = this.state;\n    const label = view.getElementTypeString(elementModel);\n    return (\n      <label>\n        Type\n        <input\n          className=\"graph-explorer-form-control\"\n          value={label}\n          disabled={true}\n        />\n      </label>\n    );\n  }\n\n  private onChangeIri = (e: React.FormEvent<HTMLInputElement>) => {\n    const target = e.target as HTMLInputElement;\n    const iri = target.value as ElementIri;\n    this.setState((prevState) => {\n      return {\n        elementModel: {\n          ...prevState.elementModel,\n          id: iri,\n        },\n      };\n    });\n  };\n\n  private renderIri() {\n    const { elementModel } = this.state;\n    return (\n      <label>\n        IRI\n        <input\n          className=\"graph-explorer-form-control\"\n          defaultValue={elementModel.id}\n          onChange={this.onChangeIri}\n        />\n      </label>\n    );\n  }\n\n  private onChangeLabel = (e: React.FormEvent<HTMLInputElement>) => {\n    const target = e.target as HTMLInputElement;\n\n    const labels: LocalizedString[] =\n      target.value.length > 0 ? [{ value: target.value, language: \"\" }] : [];\n\n    this.setState({\n      elementModel: {\n        ...this.state.elementModel,\n        label: { values: labels },\n      },\n    });\n  };\n\n  private onChangeProp = (e: React.FormEvent<HTMLInputElement>) => {\n    const target = e.target as HTMLInputElement;\n    const values: any[] = [];\n    target.parentElement\n      .querySelectorAll('[data-iri=\"' + target.dataset[\"iri\"] + '\"]')\n      .forEach((Element) => {\n        const typedElement = Element as HTMLInputElement;\n        values.push({ value: typedElement.value, language: typedElement.lang });\n      });\n    this.setState({\n      elementModel: {\n        ...this.state.elementModel,\n        properties: {\n          ...this.state.elementModel.properties,\n          [target.dataset[\"iri\"]]: {\n            type: \"string\",\n            values: values,\n          } as LiteralProperty,\n        },\n      },\n    });\n  };\n\n  private renderLabel() {\n    const { view } = this.props;\n    const label = view.selectLabel(this.state.elementModel.label.values);\n    const text = label ? label.value : \"\";\n    return (\n      <label>\n        Label\n        <input\n          className=\"graph-explorer-form-control\"\n          value={text}\n          onChange={this.onChangeLabel}\n        />\n      </label>\n    );\n  }\n\n  render() {\n    return (\n      <div className={CLASS_NAME}>\n        <div className={`${CLASS_NAME}__body`}>\n          <div className={`${CLASS_NAME}__form-row`}>{this.renderIri()}</div>\n          <div className={`${CLASS_NAME}__form-row`}>{this.renderType()}</div>\n          <div className={`${CLASS_NAME}__form-row`}>{this.renderLabel()}</div>\n          {this.renderProperties()}\n        </div>\n        <div className={`${CLASS_NAME}__controls`}>\n          <button\n            className={`graph-explorer-btn graph-explorer-btn-success ${CLASS_NAME}__apply-button`}\n            onClick={() => this.props.onApply(this.state.elementModel)}\n          >\n            Apply\n          </button>\n          <button\n            className=\"graph-explorer-btn graph-explorer-btn-danger\"\n            onClick={this.props.onCancel}\n          >\n            Cancel\n          </button>\n        </div>\n      </div>\n    );\n  }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAbCAYAAAAOEM1uAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAZEQAAGREBkIelaAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAG2SURBVFiFzde9axRRFMbhJ3Hjx0YRgkWElGIRGyVgaaG9XQpBrNIETJHKjxBSJCA2NiIWdhYKgoqCIELq/AU2tiJpAiliDMHEWEyKZfdO5szHrr4wzcx77vnNnXPnnktcK9jBwYCuLcwNBeHGsIGovyltDweNbYOHg9Eo4D9Tq0bsGj40BXKoO5isEjiht4ifHuE/qVpJvO/O049PvIxN/MBMH8ZP6pzeGVxK+C4kfAsl8vTMYBnI1x1Bv3E54bmWSHCAx2KfvBbgKGbxJAfOIcS7HMjnKCqpWoBRtfE5B/IVRsoAtnAGd3GlQchd/NE7Y7dwCtPYiw72xuD216KFk/zN3Ii+SYOajhqHZUU9aK1GjS3M4xumFK+yMuPexLHEsy9YbChPJR3HW+na+yjbBvNU+zdzHbcxfoTnUw7cS8XNSS3AFx1B6zif8FzKgXsmVj6VAduyFrwzcCUHcL/L9yiaJAUYXRRjON1172zC9xX3ZS+ziTk8KAFYWWX7wRGcqJAnudVV1RTu1YhP6WL3jWjXO4HvzbLE9N8fmqKAv/SpNyvQdmorSmlHVvhX1TsJltFPPPwL/+nTC6wUIf8AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAbCAYAAAAOEM1uAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAZEQAAGREBkIelaAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGCSURBVFiFzdi9ShxRFAfwn+uiaAoRVBQbbfMEFqIoFja+QCoLLQQr8R0sbdIJgTQiSgT1AcTKzkdIQhpTaOlX0GyK2WJ2c8d1Pt0/XBjOnTnnP+eerxnYxj0aJa9nfEOvlLirgFx8zaQhV8Ng2jfKiVT2amWxKAr1gOwElwXpH8NWXiXtMbKZV2EMHwP6F2P7dR1O8T2PeBW/8EMHp5TpwWGtJewF06JEuWmzu4ueqgnC55juw6ZsHE8B218F8qJsgkS1b0Grh74EbDdwioGqCYbQj6MEkhcYIlxm3opZrGEyh47eJqH22JvDOZbJ5sEJ4Rgqeh1nLTMr6Mv4bBpMZSV4hj9FMknA96wxeC3qCOvyxWAd88L17wobdHkWV0VwxP+e3ksgd6LiOrgtyvhn7DRlo3gM2K68kwziNqb7QTSC9eN3m9136cWvjVuf8FOHaSZPJ8mLfRw0r/8m3RQiuIQPBZEY67CfSCyOsttV0hG/CV3/0VQTTbxVIrW9rv6z8A+8NRQ5z9bcwQAAAABJRU5ErkJggg==\"","import * as React from \"react\";\n\nimport { ElementModel, ElementIri, Dictionary } from \"../data/model\";\nimport { FilterParams } from \"../data/provider\";\n\nimport {\n  Element as DiagramElement,\n  FatLinkType,\n  FatClassModel,\n} from \"../diagram/elements\";\nimport { DiagramView } from \"../diagram/view\";\n\nimport { AsyncModel } from \"../editor/asyncModel\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { ProgressBar, ProgressState } from \"./progressBar\";\nimport { SearchResults } from \"./searchResults\";\n\nimport {\n  WorkspaceContext,\n  WorkspaceEventKey,\n} from \"../workspace/workspaceContext\";\n\nimport DirectionInImage from \"../../../images/direction-in.png\";\nimport DirectionOutImage from \"../../../images/direction-out.png\";\n\nexport interface InstancesSearchProps {\n  className?: string;\n  model: AsyncModel;\n  view: DiagramView;\n  criteria: SearchCriteria;\n  onCriteriaChanged: (criteria: SearchCriteria) => void;\n}\n\nexport interface SearchCriteria {\n  readonly text?: string;\n  readonly elementType?: FatClassModel;\n  readonly refElement?: DiagramElement;\n  readonly refElementLink?: FatLinkType;\n  readonly linkDirection?: \"in\" | \"out\";\n}\n\nexport interface State {\n  readonly inputText?: string;\n  readonly quering?: boolean;\n  readonly resultId?: number;\n  readonly error?: any;\n  readonly items?: readonly ElementModel[];\n  readonly selection?: ReadonlySet<ElementIri>;\n  readonly moreItemsAvailable?: boolean;\n}\n\nconst CLASS_NAME = \"graph-explorer-instances-search\";\n\nexport class InstancesSearch extends React.Component<\n  InstancesSearchProps,\n  State\n> {\n  static contextType = WorkspaceContext;\n  declare readonly context: React.ContextType<typeof WorkspaceContext>;\n\n  private readonly listener = new EventObserver();\n\n  private currentRequest: FilterParams;\n\n  constructor(props: InstancesSearchProps) {\n    super(props);\n    this.state = {\n      resultId: 0,\n      selection: new Set<ElementIri>(),\n    };\n  }\n\n  render() {\n    const ENTER_KEY_CODE = 13;\n\n    const className = `${CLASS_NAME} ${this.props.className || \"\"}`;\n    const progressState = this.state.quering\n      ? ProgressState.loading\n      : this.state.error\n      ? ProgressState.error\n      : this.state.items\n      ? ProgressState.completed\n      : ProgressState.none;\n\n    const searchTerm =\n      this.state.inputText === undefined\n        ? this.props.criteria.text\n        : this.state.inputText;\n\n    return (\n      <div className={className}>\n        <ProgressBar state={progressState} />\n        <div className={`${CLASS_NAME}__criteria`}>\n          {this.renderCriteria()}\n          <div\n            className={`${CLASS_NAME}__text-criteria graph-explorer-input-group`}\n          >\n            <input\n              type=\"text\"\n              className=\"graph-explorer-form-control\"\n              placeholder=\"Search for...\"\n              value={searchTerm || \"\"}\n              onChange={(e) =>\n                this.setState({ inputText: e.currentTarget.value })\n              }\n              onKeyUp={(e) => {\n                if (e.keyCode === ENTER_KEY_CODE) {\n                  this.submitCriteriaUpdate();\n                }\n              }}\n            />\n            <span className=\"graph-explorer-input-group-btn\">\n              <button\n                className=\"graph-explorer-btn graph-explorer-btn-default\"\n                type=\"button\"\n                title=\"Search\"\n                onClick={() => this.submitCriteriaUpdate()}\n              >\n                <span className=\"fa fa-search\" aria-hidden=\"true\" />\n              </button>\n            </span>\n          </div>\n        </div>\n        {/* specify resultId as key to reset scroll position when loaded new search results */}\n        <div\n          className={`${CLASS_NAME}__rest graph-explorer-scrollable`}\n          key={this.state.resultId}\n        >\n          <SearchResults\n            view={this.props.view}\n            items={this.state.items}\n            highlightText={this.props.criteria.text}\n            selection={this.state.selection}\n            onSelectionChanged={this.onSelectionChanged}\n          />\n          <div className={`${CLASS_NAME}__rest-end`}>\n            <button\n              type=\"button\"\n              className={`${CLASS_NAME}__load-more graph-explorer-btn graph-explorer-btn-primary`}\n              disabled={this.state.quering}\n              style={{\n                display: this.state.moreItemsAvailable ? undefined : \"none\",\n              }}\n              onClick={() => this.queryItems(true)}\n            >\n              <span className=\"fa fa-chevron-down\" aria-hidden=\"true\" />\n              &nbsp;Show more\n            </button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  private onSelectionChanged = (newSelection: ReadonlySet<ElementIri>) => {\n    this.setState({ selection: newSelection });\n  };\n\n  private renderCriteria(): React.ReactElement<any> {\n    const { criteria = {}, view } = this.props;\n    const criterions: React.ReactElement<any>[] = [];\n\n    if (criteria.elementType) {\n      const classInfo = criteria.elementType;\n      const classLabel = view.formatLabel(classInfo.label, classInfo.id);\n      criterions.push(\n        <div key=\"hasType\" className={`${CLASS_NAME}__criterion`}>\n          {this.renderRemoveCriterionButtons(() =>\n            this.props.onCriteriaChanged({\n              ...this.props.criteria,\n              elementType: undefined,\n            })\n          )}\n          Has type{\" \"}\n          <span\n            className={`${CLASS_NAME}__criterion-class`}\n            title={classInfo.id}\n          >\n            {classLabel}\n          </span>\n        </div>\n      );\n    } else if (criteria.refElement) {\n      const element = criteria.refElement;\n      const elementLabel = view.formatLabel(\n        element.data.label.values,\n        element.iri\n      );\n\n      const linkType = criteria.refElementLink;\n      const linkTypeLabel = linkType\n        ? view.formatLabel(linkType.label, linkType.id)\n        : undefined;\n\n      criterions.push(\n        <div key=\"hasLinkedElement\" className={`${CLASS_NAME}__criterion`}>\n          {this.renderRemoveCriterionButtons(() =>\n            this.props.onCriteriaChanged({\n              ...this.props.criteria,\n              refElement: undefined,\n              refElementLink: undefined,\n            })\n          )}\n          Connected to{\" \"}\n          <span\n            className={`${CLASS_NAME}__criterion-element`}\n            title={element ? element.iri : undefined}\n          >\n            {elementLabel}\n          </span>\n          {linkType && (\n            <span>\n              {\" through \"}\n              <span\n                className={`${CLASS_NAME}__criterion-link-type`}\n                title={linkType ? linkType.id : undefined}\n              >\n                {linkTypeLabel}\n              </span>\n              {criteria.linkDirection === \"in\" && (\n                <span>\n                  {\" as \"}\n                  <img\n                    className={`${CLASS_NAME}__link-direction`}\n                    src={DirectionInImage}\n                  />\n                  &nbsp;source\n                </span>\n              )}\n              {criteria.linkDirection === \"out\" && (\n                <span>\n                  {\" as \"}\n                  <img\n                    className={`${CLASS_NAME}__link-direction`}\n                    src={DirectionOutImage}\n                  />\n                  &nbsp;target\n                </span>\n              )}\n            </span>\n          )}\n        </div>\n      );\n    }\n\n    return <div className={`${CLASS_NAME}__criterions`}>{criterions}</div>;\n  }\n\n  private renderRemoveCriterionButtons(onClick: () => void) {\n    return (\n      <div\n        className={`${CLASS_NAME}__criterion-remove ontoidia-btn-group graph-explorer-btn-group-xs`}\n      >\n        <button\n          type=\"button\"\n          className=\"graph-explorer-btn graph-explorer-btn-default\"\n          title=\"Remove criteria\"\n          onClick={onClick}\n        >\n          <span className=\"fa fa-times\" aria-hidden=\"true\"></span>\n        </button>\n      </div>\n    );\n  }\n\n  private submitCriteriaUpdate() {\n    let text =\n      this.state.inputText === undefined\n        ? this.props.criteria.text\n        : this.state.inputText;\n    text = text === \"\" ? undefined : text;\n    this.props.onCriteriaChanged({ ...this.props.criteria, text });\n  }\n\n  componentDidMount() {\n    this.listener.listen(this.props.view.events, \"changeLanguage\", () =>\n      this.forceUpdate()\n    );\n    this.queryItems(false);\n  }\n\n  componentDidUpdate(nextProps: InstancesSearchProps) {\n    const languageChanged = this.currentRequest\n      ? this.currentRequest.languageCode !== nextProps.view.getLanguage()\n      : false;\n\n    if (this.props.criteria !== nextProps.criteria || languageChanged) {\n      this.setState({ inputText: undefined }, () => this.queryItems(false));\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.currentRequest = undefined;\n  }\n\n  private queryItems(loadMoreItems: boolean) {\n    let request: FilterParams;\n    if (loadMoreItems) {\n      if (!this.currentRequest) {\n        throw new Error(\"Cannot request more items without initial request.\");\n      }\n      const { offset, limit } = this.currentRequest;\n      request = { ...this.currentRequest, offset: offset + limit };\n    } else {\n      request = createRequest(\n        this.props.criteria,\n        this.props.view.getLanguage()\n      );\n    }\n\n    if (\n      !(\n        request.text ||\n        request.elementTypeId ||\n        request.refElementId ||\n        request.refElementLinkId\n      )\n    ) {\n      this.setState({\n        quering: false,\n        error: undefined,\n        items: undefined,\n        selection: new Set<ElementIri>(),\n        moreItemsAvailable: false,\n      });\n      return;\n    }\n\n    this.currentRequest = request;\n    this.setState({\n      quering: true,\n      error: undefined,\n      moreItemsAvailable: false,\n    });\n\n    this.props.model.dataProvider\n      .filter(request)\n      .then((elements) => {\n        if (this.currentRequest !== request) {\n          return;\n        }\n        this.processFilterData(elements);\n        this.context.workspace.triggerWorkspaceEvent(\n          WorkspaceEventKey.searchQueryItem\n        );\n      })\n      .catch((error) => {\n        if (this.currentRequest !== request) {\n          return;\n        }\n        console.error(error);\n        this.setState({ quering: false, error });\n      });\n  }\n\n  private processFilterData(elements: Dictionary<ElementModel>) {\n    const requestedAdditionalItems = this.currentRequest.offset > 0;\n\n    const existingIris: Record<string, true> = {};\n\n    if (requestedAdditionalItems) {\n      this.state.items.forEach((item) => (existingIris[item.id] = true));\n    }\n\n    const items = requestedAdditionalItems ? [...this.state.items] : [];\n    for (const iri in elements) {\n      if (!Object.prototype.hasOwnProperty.call(elements, iri)) {\n        continue;\n      }\n      if (existingIris[iri]) {\n        continue;\n      }\n      items.push(elements[iri]);\n    }\n\n    const moreItemsAvailable =\n      Object.keys(elements).length >= this.currentRequest.limit;\n\n    if (requestedAdditionalItems) {\n      this.setState({\n        quering: false,\n        items,\n        error: undefined,\n        moreItemsAvailable,\n      });\n    } else {\n      this.setState({\n        quering: false,\n        resultId: this.state.resultId + 1,\n        items,\n        selection: new Set<ElementIri>(),\n        error: undefined,\n        moreItemsAvailable,\n      });\n    }\n  }\n}\n\nexport function createRequest(\n  criteria: SearchCriteria,\n  language: string\n): FilterParams {\n  const { text, elementType, refElement, refElementLink, linkDirection } =\n    criteria;\n  return {\n    text,\n    elementTypeId: elementType ? elementType.id : undefined,\n    refElementId: refElement ? refElement.iri : undefined,\n    refElementLinkId: refElementLink ? refElementLink.id : undefined,\n    linkDirection,\n    offset: 0,\n    limit: 100,\n    languageCode: language || \"en\",\n  };\n}\n","import * as React from \"react\";\n\nimport { PLACEHOLDER_ELEMENT_TYPE } from \"../data/schema\";\nimport { ElementModel, ElementTypeIri } from \"../data/model\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { DiagramView } from \"../diagram/view\";\nimport { MetadataApi } from \"../data/metadataApi\";\n\nimport { createRequest } from \"../widgets/instancesSearch\";\nimport { ListElementView } from \"../widgets/listElementView\";\n\nimport { Cancellation, CancellationToken } from \"../viewUtils/async\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nconst CLASS_NAME = \"graph-explorer-edit-form\";\n\nexport interface ElementValue {\n  value: ElementModel;\n  isNew: boolean;\n  loading: boolean;\n  error?: string;\n  validated: boolean;\n  allowChange: boolean;\n}\n\nexport interface Props {\n  editor: EditorController;\n  view: DiagramView;\n  metadataApi: MetadataApi | undefined;\n  source: ElementModel;\n  elementValue: ElementValue;\n  onChange: (state: Pick<ElementValue, \"value\" | \"isNew\" | \"loading\">) => void;\n}\n\nexport interface State {\n  elementTypes?: readonly ElementTypeIri[];\n  searchString?: string;\n  isLoading?: boolean;\n  existingElements?: readonly ElementModel[];\n}\n\nexport class ElementTypeSelector extends React.Component<Props, State> {\n  private readonly cancellation = new Cancellation();\n  private filterCancellation = new Cancellation();\n  private loadingItemCancellation = new Cancellation();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = { searchString: \"\", existingElements: [] };\n  }\n\n  componentDidMount() {\n    this.fetchPossibleElementTypes();\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { searchString } = this.state;\n    if (searchString !== prevState.searchString) {\n      this.searchExistingElements();\n    }\n  }\n\n  componentWillUnmount() {\n    this.cancellation.abort();\n    this.filterCancellation.abort();\n    this.loadingItemCancellation.abort();\n  }\n\n  private async fetchPossibleElementTypes() {\n    const { view, metadataApi, source } = this.props;\n    if (!metadataApi) {\n      return;\n    }\n    const elementTypes = await CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.typesOfElementsDraggedFrom(source, this.cancellation.signal)\n    );\n    if (elementTypes === null) {\n      return;\n    }\n    elementTypes.sort(makeElementTypeComparatorByLabel(view));\n    this.setState({ elementTypes });\n  }\n\n  private searchExistingElements() {\n    const { editor, view } = this.props;\n    const { searchString } = this.state;\n    this.setState({ existingElements: [] });\n    if (searchString.length > 0) {\n      this.setState({ isLoading: true });\n\n      this.filterCancellation.abort();\n      this.filterCancellation = new Cancellation();\n      const signal = this.filterCancellation.signal;\n\n      const request = createRequest({ text: searchString }, view.getLanguage());\n      editor.model.dataProvider.filter(request).then((elements) => {\n        if (signal.aborted) {\n          return;\n        }\n        const existingElements = Object.keys(elements).map(\n          (key) => elements[key]\n        );\n        this.setState({ existingElements, isLoading: false });\n      });\n    }\n  }\n\n  private onElementTypeChange = async (\n    e: React.FormEvent<HTMLSelectElement>\n  ) => {\n    this.setState({ isLoading: true });\n\n    this.loadingItemCancellation.abort();\n    this.loadingItemCancellation = new Cancellation();\n    const signal = this.loadingItemCancellation.signal;\n\n    const { onChange, metadataApi } = this.props;\n    const classId = (e.target as HTMLSelectElement).value as ElementTypeIri;\n    const elementModel = await CancellationToken.mapCancelledToNull(\n      signal,\n      metadataApi.generateNewElement([classId], signal)\n    );\n    if (elementModel === null) {\n      return;\n    }\n    this.setState({ isLoading: false });\n    onChange({\n      value: elementModel,\n      isNew: true,\n      loading: false,\n    });\n  };\n\n  private renderPossibleElementType = (elementType: ElementTypeIri) => {\n    const { view } = this.props;\n    const type = view.model.createClass(elementType);\n    const label = view.formatLabel(type.label, type.id);\n    return (\n      <option key={elementType} value={elementType}>\n        {label}\n      </option>\n    );\n  };\n\n  private renderElementTypeSelector() {\n    const { elementValue } = this.props;\n    const { elementTypes, isLoading } = this.state;\n    const value = elementValue.value.types.length\n      ? elementValue.value.types[0]\n      : \"\";\n    if (isLoading) {\n      return <HtmlSpinner width={20} height={20} />;\n    }\n    return (\n      <div className={`${CLASS_NAME}__control-row`}>\n        <label>Entity Type</label>\n        {elementTypes ? (\n          <select\n            className=\"graph-explorer-form-control\"\n            value={value}\n            onChange={this.onElementTypeChange}\n          >\n            <option value={PLACEHOLDER_ELEMENT_TYPE} disabled={true}>\n              Select entity type\n            </option>\n            {elementTypes.map(this.renderPossibleElementType)}\n          </select>\n        ) : (\n          <div>\n            <HtmlSpinner width={20} height={20} />\n          </div>\n        )}\n        {elementValue.error ? (\n          <span className={`${CLASS_NAME}__control-error`}>\n            {elementValue.error}\n          </span>\n        ) : (\n          \"\"\n        )}\n      </div>\n    );\n  }\n\n  private renderExistingElementsList() {\n    const { view, editor, elementValue } = this.props;\n    const { elementTypes, isLoading, existingElements } = this.state;\n    if (isLoading) {\n      return <HtmlSpinner width={20} height={20} />;\n    }\n    if (existingElements.length > 0) {\n      return existingElements.map((element) => {\n        const isAlreadyOnDiagram =\n          !editor.temporaryState.elements.has(element.id) &&\n          Boolean(\n            editor.model.elements.find(\n              ({ iri, group }) => iri === element.id && group === undefined\n            )\n          );\n        const hasAppropriateType = Boolean(\n          elementTypes.find((type) => element.types.indexOf(type) >= 0)\n        );\n        return (\n          <ListElementView\n            key={element.id}\n            view={view}\n            model={element}\n            disabled={isAlreadyOnDiagram || !hasAppropriateType}\n            selected={element.id === elementValue.value.id}\n            onClick={(e, model) => this.onSelectExistingItem(model)}\n          />\n        );\n      });\n    }\n    return <span>No results</span>;\n  }\n\n  private async onSelectExistingItem(model: ElementModel) {\n    const { editor, onChange } = this.props;\n\n    this.loadingItemCancellation.abort();\n    this.loadingItemCancellation = new Cancellation();\n    const signal = this.loadingItemCancellation.signal;\n\n    onChange({ value: model, isNew: false, loading: true });\n    const result = await editor.model.dataProvider.elementInfo({\n      elementIds: [model.id],\n    });\n    if (signal.aborted) {\n      return;\n    }\n\n    const loadedModel = result[model.id];\n    onChange({ value: loadedModel, isNew: false, loading: false });\n  }\n\n  render() {\n    const { searchString } = this.state;\n    return (\n      <div\n        className={`${CLASS_NAME}__form-row ${CLASS_NAME}__element-selector`}\n      >\n        <div className={`${CLASS_NAME}__search`}>\n          <i className={`fa fa-search ${CLASS_NAME}__search-icon`} />\n          <input\n            value={searchString}\n            onChange={(e) =>\n              this.setState({\n                searchString: (e.target as HTMLInputElement).value,\n              })\n            }\n            className={`graph-explorer-form-control ${CLASS_NAME}__search-input`}\n            placeholder=\"Search for...\"\n            autoFocus\n          />\n        </div>\n        {searchString.length > 0 ? (\n          <div className={`${CLASS_NAME}__existing-elements-list`}>\n            {this.renderExistingElementsList()}\n          </div>\n        ) : (\n          <div>\n            <div className={`${CLASS_NAME}__separator`}>\n              <i className={`${CLASS_NAME}__separator-text`}>\n                or create new entity\n              </i>\n            </div>\n            {this.renderElementTypeSelector()}\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nfunction makeElementTypeComparatorByLabel(view: DiagramView) {\n  return (a: ElementTypeIri, b: ElementTypeIri) => {\n    const typeA = view.model.createClass(a);\n    const typeB = view.model.createClass(b);\n    const labelA = view.formatLabel(typeA.label, typeA.id);\n    const labelB = view.formatLabel(typeB.label, typeB.id);\n    return labelA.localeCompare(labelB);\n  };\n}\n\nexport function validateElementType(\n  element: ElementModel\n): Promise<Pick<ElementValue, \"error\" | \"allowChange\">> {\n  const isElementTypeSelected =\n    element.types.indexOf(PLACEHOLDER_ELEMENT_TYPE) < 0;\n  const error = !isElementTypeSelected ? \"Required.\" : undefined;\n  return Promise.resolve({ error, allowChange: true });\n}\n","import * as React from \"react\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { LinkModel, ElementModel, sameLink } from \"../data/model\";\nimport { PLACEHOLDER_LINK_TYPE } from \"../data/schema\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { FatLinkType, LinkDirection } from \"../diagram/elements\";\nimport { DiagramView } from \"../diagram/view\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { Cancellation, CancellationToken } from \"../viewUtils/async\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nconst CLASS_NAME = \"graph-explorer-edit-form\";\n\nexport interface Value {\n  link: LinkModel;\n  direction: LinkDirection;\n}\n\nexport interface LinkValue {\n  value: Value;\n  error?: string;\n  validated: boolean;\n  allowChange: boolean;\n}\n\ninterface DirectedFatLinkType {\n  fatLinkType: FatLinkType;\n  direction: LinkDirection;\n}\n\nexport interface Props {\n  editor: EditorController;\n  view: DiagramView;\n  metadataApi: MetadataApi | undefined;\n  linkValue: LinkValue;\n  source: ElementModel;\n  target: ElementModel;\n  onChange: (value: Value) => void;\n  disabled?: boolean;\n}\n\nexport interface State {\n  fatLinkTypes?: DirectedFatLinkType[];\n}\n\nexport class LinkTypeSelector extends React.Component<Props, State> {\n  private readonly listener = new EventObserver();\n  private readonly cancellation = new Cancellation();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      fatLinkTypes: [],\n    };\n  }\n\n  private updateAll = () => this.forceUpdate();\n\n  componentDidMount() {\n    this.fetchPossibleLinkTypes();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    const { source, target } = this.props;\n    if (prevProps.source !== source || prevProps.target !== target) {\n      this.setState({ fatLinkTypes: undefined });\n      this.fetchPossibleLinkTypes();\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.cancellation.abort();\n  }\n\n  private async fetchPossibleLinkTypes() {\n    const { view, metadataApi, source, target } = this.props;\n    if (!metadataApi) {\n      return;\n    }\n    const linkTypes = await CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.possibleLinkTypes(source, target, this.cancellation.signal)\n    );\n    if (linkTypes === null) {\n      return;\n    }\n    const fatLinkTypes: DirectedFatLinkType[] = [];\n    linkTypes.forEach(({ linkTypeIri, direction }) => {\n      const fatLinkType = view.model.createLinkType(linkTypeIri);\n      fatLinkTypes.push({ fatLinkType, direction });\n    });\n    fatLinkTypes.sort(makeLinkTypeComparatorByLabelAndDirection(view));\n    this.setState({ fatLinkTypes });\n    this.listenToLinkLabels(fatLinkTypes);\n  }\n\n  private listenToLinkLabels(\n    fatLinkTypes: { fatLinkType: FatLinkType; direction: LinkDirection }[]\n  ) {\n    fatLinkTypes.forEach(({ fatLinkType }) =>\n      this.listener.listen(fatLinkType.events, \"changeLabel\", this.updateAll)\n    );\n  }\n\n  private onChangeType = (e: React.FormEvent<HTMLSelectElement>) => {\n    const { link: originalLink, direction: originalDirection } =\n      this.props.linkValue.value;\n    const index = parseInt(e.currentTarget.value, 10);\n    const { fatLinkType, direction } = this.state.fatLinkTypes[index];\n    const link: LinkModel = { ...originalLink, linkTypeId: fatLinkType.id };\n    // switches source and target if the direction has changed\n    if (originalDirection !== direction) {\n      link.sourceId = originalLink.targetId;\n      link.targetId = originalLink.sourceId;\n    }\n    this.props.onChange({ link, direction });\n  };\n\n  private renderPossibleLinkType = (\n    {\n      fatLinkType,\n      direction,\n    }: { fatLinkType: FatLinkType; direction: LinkDirection },\n    index: number\n  ) => {\n    const { view, source, target } = this.props;\n    const label = view.formatLabel(fatLinkType.label, fatLinkType.id);\n    let [sourceLabel, targetLabel] = [source, target].map((element) =>\n      view.formatLabel(element.label.values, element.id)\n    );\n    if (direction === LinkDirection.in) {\n      [sourceLabel, targetLabel] = [targetLabel, sourceLabel];\n    }\n    return (\n      <option key={index} value={index}>\n        {label} [{sourceLabel} &rarr; {targetLabel}]\n      </option>\n    );\n  };\n\n  render() {\n    const { linkValue, disabled } = this.props;\n    const { fatLinkTypes } = this.state;\n    const value = (fatLinkTypes || []).findIndex(\n      ({ fatLinkType, direction }) =>\n        fatLinkType.id === linkValue.value.link.linkTypeId &&\n        direction === linkValue.value.direction\n    );\n    return (\n      <div className={`${CLASS_NAME}__control-row`}>\n        <label>Link Type</label>\n        {fatLinkTypes ? (\n          <select\n            className=\"graph-explorer-form-control\"\n            value={value}\n            onChange={this.onChangeType}\n            disabled={disabled}\n          >\n            <option value={-1} disabled={true}>\n              Select link type\n            </option>\n            {fatLinkTypes.map(this.renderPossibleLinkType)}\n          </select>\n        ) : (\n          <div>\n            <HtmlSpinner width={20} height={20} />\n          </div>\n        )}\n        {linkValue.error ? (\n          <span className={`${CLASS_NAME}__control-error`}>\n            {linkValue.error}\n          </span>\n        ) : (\n          \"\"\n        )}\n      </div>\n    );\n  }\n}\n\nfunction makeLinkTypeComparatorByLabelAndDirection(view: DiagramView) {\n  return (a: DirectedFatLinkType, b: DirectedFatLinkType) => {\n    const labelA = view.formatLabel(a.fatLinkType.label, a.fatLinkType.id);\n    const labelB = view.formatLabel(b.fatLinkType.label, b.fatLinkType.id);\n    const labelCompareResult = labelA.localeCompare(labelB);\n    if (labelCompareResult !== 0) {\n      return labelCompareResult;\n    }\n    if (a.direction === LinkDirection.out && b.direction === LinkDirection.in) {\n      return -1;\n    }\n    if (a.direction === LinkDirection.in && b.direction === LinkDirection.out) {\n      return 1;\n    }\n    return 0;\n  };\n}\n\nexport function validateLinkType(\n  editor: EditorController,\n  currentLink: LinkModel,\n  originalLink: LinkModel\n): Promise<Pick<LinkValue, \"error\" | \"allowChange\">> {\n  if (currentLink.linkTypeId === PLACEHOLDER_LINK_TYPE) {\n    return Promise.resolve({ error: \"Required.\", allowChange: true });\n  }\n  if (sameLink(currentLink, originalLink)) {\n    return Promise.resolve({ error: undefined, allowChange: true });\n  }\n  const alreadyOnDiagram = editor.model.links.find(\n    ({ data: { linkTypeId, sourceId, targetId } }) =>\n      linkTypeId === currentLink.linkTypeId &&\n      sourceId === currentLink.sourceId &&\n      targetId === currentLink.targetId &&\n      !editor.temporaryState.links.has(currentLink)\n  );\n  if (alreadyOnDiagram) {\n    return Promise.resolve({\n      error: \"The link already exists.\",\n      allowChange: false,\n    });\n  }\n  return editor.model.dataProvider\n    .linksInfo({\n      elementIds: [currentLink.sourceId, currentLink.targetId],\n      linkTypeIds: [currentLink.linkTypeId],\n    })\n    .then((links): Pick<LinkValue, \"error\" | \"allowChange\"> => {\n      const alreadyExists = links.some((link) => sameLink(link, currentLink));\n      return alreadyExists\n        ? { error: \"The link already exists.\", allowChange: false }\n        : { error: undefined, allowChange: true };\n    });\n}\n","import * as React from \"react\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { DiagramView } from \"../diagram/view\";\nimport { ElementModel, LinkModel } from \"../data/model\";\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { LinkDirection } from \"../diagram/elements\";\n\nimport { Cancellation } from \"../viewUtils/async\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nimport { ProgressBar, ProgressState } from \"../widgets/progressBar\";\n\nimport {\n  ElementTypeSelector,\n  ElementValue,\n  validateElementType,\n} from \"./elementTypeSelector\";\nimport {\n  LinkTypeSelector,\n  LinkValue,\n  validateLinkType,\n} from \"./linkTypeSelector\";\n\nconst CLASS_NAME = \"graph-explorer-edit-form\";\n\nexport interface Props {\n  editor: EditorController;\n  view: DiagramView;\n  metadataApi?: MetadataApi;\n  link: LinkModel;\n  source: ElementModel;\n  target: {\n    value: ElementModel;\n    isNew: boolean;\n  };\n  onChangeElement: (value: ElementModel) => void;\n  onChangeLink: (value: LinkModel) => void;\n  onApply: (\n    elementData: ElementModel,\n    isNewElement: boolean,\n    linkData: LinkModel\n  ) => void;\n  onCancel: () => void;\n}\n\nexport interface State {\n  elementValue?: ElementValue;\n  linkValue?: LinkValue;\n  isValidating?: boolean;\n}\n\nexport class EditElementTypeForm extends React.Component<Props, State> {\n  private validationCancellation = new Cancellation();\n\n  constructor(props: Props) {\n    super(props);\n    const { target, link } = this.props;\n    this.state = {\n      elementValue: {\n        value: target.value,\n        isNew: target.isNew,\n        loading: false,\n        validated: true,\n        allowChange: true,\n      },\n      linkValue: {\n        value: { link, direction: LinkDirection.out },\n        validated: true,\n        allowChange: true,\n      },\n    };\n  }\n\n  componentDidMount() {\n    this.validate();\n  }\n\n  componentWillUnmount() {\n    this.validationCancellation.abort();\n  }\n\n  private setElementOrLink({\n    elementValue,\n    linkValue,\n  }: {\n    elementValue?: ElementValue;\n    linkValue?: LinkValue;\n  }) {\n    this.setState(\n      (state) => ({\n        elementValue: elementValue || state.elementValue,\n        linkValue: linkValue || state.linkValue,\n      }),\n      () => {\n        if (\n          (elementValue && !elementValue.validated) ||\n          (linkValue && !linkValue.validated)\n        ) {\n          this.validate();\n        }\n        if (\n          elementValue &&\n          elementValue.validated &&\n          elementValue.allowChange\n        ) {\n          this.props.onChangeElement(elementValue.value);\n        }\n        if (linkValue && linkValue.validated && linkValue.allowChange) {\n          this.props.onChangeLink(linkValue.value.link);\n        }\n      }\n    );\n  }\n\n  private validate() {\n    const { editor, link: originalLink } = this.props;\n    const { elementValue, linkValue } = this.state;\n    this.setState({ isValidating: true });\n\n    this.validationCancellation.abort();\n    this.validationCancellation = new Cancellation();\n    const signal = this.validationCancellation.signal;\n\n    const validateElement = validateElementType(elementValue.value);\n    const validateLink = validateLinkType(\n      editor,\n      linkValue.value.link,\n      originalLink\n    );\n    Promise.all([validateElement, validateLink]).then(\n      ([elementError, linkError]) => {\n        if (signal.aborted) {\n          return;\n        }\n        this.setState({ isValidating: false });\n        this.setElementOrLink({\n          elementValue: { ...elementValue, ...elementError, validated: true },\n          linkValue: { ...linkValue, ...linkError, validated: true },\n        });\n      }\n    );\n  }\n\n  render() {\n    const {\n      editor,\n      view,\n      metadataApi,\n      source,\n      link: originalLink,\n    } = this.props;\n    const { elementValue, linkValue, isValidating } = this.state;\n    const isValid = !elementValue.error && !linkValue.error;\n    return (\n      <div className={CLASS_NAME}>\n        <div className={`${CLASS_NAME}__body`}>\n          <ElementTypeSelector\n            editor={editor}\n            view={view}\n            metadataApi={metadataApi}\n            source={source}\n            elementValue={elementValue}\n            onChange={(newState) => {\n              this.setElementOrLink({\n                elementValue: {\n                  value: newState.value,\n                  isNew: newState.isNew,\n                  loading: newState.loading,\n                  error: undefined,\n                  validated: false,\n                  allowChange: false,\n                },\n                linkValue: {\n                  value: {\n                    link: { ...originalLink, targetId: newState.value.id },\n                    direction: LinkDirection.out,\n                  },\n                  validated: false,\n                  allowChange: false,\n                },\n              });\n            }}\n          />\n          {elementValue.loading ? (\n            <div style={{ display: \"flex\" }}>\n              <HtmlSpinner width={20} height={20} />\n              &nbsp;Loading entity...\n            </div>\n          ) : (\n            <LinkTypeSelector\n              editor={editor}\n              view={view}\n              metadataApi={metadataApi}\n              linkValue={linkValue}\n              source={source}\n              target={elementValue.value}\n              onChange={(value) =>\n                this.setElementOrLink({\n                  linkValue: {\n                    value,\n                    error: undefined,\n                    validated: false,\n                    allowChange: false,\n                  },\n                })\n              }\n              disabled={elementValue.error !== undefined}\n            />\n          )}\n          {isValidating ? (\n            <div className={`${CLASS_NAME}__progress`}>\n              <ProgressBar state={ProgressState.loading} height={10} />\n            </div>\n          ) : null}\n        </div>\n        <div className={`${CLASS_NAME}__controls`}>\n          <button\n            className={`graph-explorer-btn graph-explorer-btn-success ${CLASS_NAME}__apply-button`}\n            onClick={() =>\n              this.props.onApply(\n                elementValue.value,\n                elementValue.isNew,\n                linkValue.value.link\n              )\n            }\n            disabled={elementValue.loading || !isValid || isValidating}\n          >\n            Apply\n          </button>\n          <button\n            className=\"graph-explorer-btn graph-explorer-btn-danger\"\n            onClick={this.props.onCancel}\n          >\n            Cancel\n          </button>\n        </div>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { ElementModel, LinkModel, sameLink } from \"../data/model\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { DiagramView } from \"../diagram/view\";\nimport { LinkDirection } from \"../diagram/elements\";\n\nimport { Cancellation } from \"../viewUtils/async\";\n\nimport { ProgressBar, ProgressState } from \"../widgets/progressBar\";\n\nimport {\n  LinkTypeSelector,\n  LinkValue,\n  validateLinkType,\n} from \"./linkTypeSelector\";\n\nconst CLASS_NAME = \"graph-explorer-edit-form\";\n\nexport interface Props {\n  editor: EditorController;\n  view: DiagramView;\n  metadataApi: MetadataApi | undefined;\n  link: LinkModel;\n  source: ElementModel;\n  target: ElementModel;\n  onChange: (entity: LinkModel) => void;\n  onApply: (entity: LinkModel) => void;\n  onCancel: () => void;\n}\n\nexport interface State {\n  linkValue?: LinkValue;\n  isValidating?: boolean;\n}\n\nexport class EditLinkForm extends React.Component<Props, State> {\n  private validationCancellation = new Cancellation();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      linkValue: {\n        value: { link: props.link, direction: LinkDirection.out },\n        validated: true,\n        allowChange: true,\n      },\n    };\n  }\n\n  componentDidMount() {\n    this.validate();\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { linkValue } = this.state;\n    if (!sameLink(linkValue.value.link, prevState.linkValue.value.link)) {\n      this.validate();\n    }\n    if (\n      linkValue !== prevState.linkValue &&\n      linkValue.validated &&\n      linkValue.allowChange\n    ) {\n      this.props.onChange(linkValue.value.link);\n    }\n  }\n\n  componentWillUnmount() {\n    this.validationCancellation.abort();\n  }\n\n  private validate() {\n    const { editor, link: originalLink } = this.props;\n    const {\n      linkValue: { value },\n    } = this.state;\n    this.setState({ isValidating: true });\n\n    this.validationCancellation.abort();\n    this.validationCancellation = new Cancellation();\n    const signal = this.validationCancellation.signal;\n\n    validateLinkType(editor, value.link, originalLink).then((error) => {\n      if (signal.aborted) {\n        return;\n      }\n      this.setState(({ linkValue }) => ({\n        linkValue: { ...linkValue, ...error, validated: true },\n        isValidating: false,\n      }));\n    });\n  }\n\n  render() {\n    const { editor, view, metadataApi, source, target } = this.props;\n    const { linkValue, isValidating } = this.state;\n    const isValid = !linkValue.error;\n    return (\n      <div className={CLASS_NAME}>\n        <div className={`${CLASS_NAME}__body`}>\n          <LinkTypeSelector\n            editor={editor}\n            view={view}\n            metadataApi={metadataApi}\n            linkValue={linkValue}\n            source={source}\n            target={target}\n            onChange={(value) =>\n              this.setState({\n                linkValue: {\n                  value,\n                  error: undefined,\n                  validated: false,\n                  allowChange: false,\n                },\n              })\n            }\n          />\n          {isValidating ? (\n            <div className={`${CLASS_NAME}__progress`}>\n              <ProgressBar state={ProgressState.loading} height={10} />\n            </div>\n          ) : null}\n        </div>\n        <div className={`${CLASS_NAME}__controls`}>\n          <button\n            className={`graph-explorer-btn graph-explorer-btn-success ${CLASS_NAME}__apply-button`}\n            onClick={() => this.props.onApply(linkValue.value.link)}\n            disabled={!isValid || isValidating}\n          >\n            Apply\n          </button>\n          <button\n            className=\"graph-explorer-btn graph-explorer-btn-danger\"\n            onClick={this.props.onCancel}\n          >\n            Cancel\n          </button>\n        </div>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nimport { Link } from \"../diagram/elements\";\nimport { DiagramView } from \"../diagram/view\";\n\nconst CLASS_NAME = \"graph-explorer-edit-form\";\n\nexport interface Props {\n  view: DiagramView;\n  link: Link;\n  onApply: (label: string) => void;\n  onCancel: () => void;\n}\n\nexport interface State {\n  label?: string;\n}\n\nexport class EditLinkLabelForm extends React.Component<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    const label = this.computeLabel();\n    this.state = { label };\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    if (this.props.link.typeId !== prevProps.link.typeId) {\n      const label = this.computeLabel();\n      this.setState({ label });\n    }\n  }\n\n  private computeLabel(): string {\n    const { view, link } = this.props;\n\n    const linkType = view.model.getLinkType(link.typeId);\n    const template = view.createLinkTemplate(linkType);\n    const { label = {} } = template.renderLink(link);\n\n    const labelTexts =\n      label.attrs && label.attrs.text ? label.attrs.text.text : undefined;\n    return labelTexts && labelTexts.length > 0\n      ? view.selectLabel(labelTexts).value\n      : view.formatLabel(linkType.label, linkType.id);\n  }\n\n  render() {\n    const { onApply, onCancel } = this.props;\n    const { label } = this.state;\n    return (\n      <div className={CLASS_NAME}>\n        <div className={`${CLASS_NAME}__body`}>\n          <div className={`${CLASS_NAME}__form-row`}>\n            <label>Link Label</label>\n            <input\n              className=\"graph-explorer-form-control\"\n              value={label}\n              onChange={(e) =>\n                this.setState({ label: (e.target as HTMLInputElement).value })\n              }\n            />\n          </div>\n        </div>\n        <div className={`${CLASS_NAME}__controls`}>\n          <button\n            className={`graph-explorer-btn graph-explorer-btn-success ${CLASS_NAME}__apply-button`}\n            onClick={() => onApply(label)}\n          >\n            Apply\n          </button>\n          <button\n            className=\"graph-explorer-btn graph-explorer-btn-danger\"\n            onClick={() => onCancel()}\n          >\n            Cancel\n          </button>\n        </div>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\n\nimport {\n  Element as DiagramElement,\n  ElementEvents,\n  Element,\n} from \"../diagram/elements\";\nimport { Vector, boundsOf } from \"../diagram/geometry\";\nimport { PaperWidgetProps } from \"../diagram/paperArea\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { AuthoringState } from \"../editor/authoringState\";\n\nimport { AnyListener, EventObserver } from \"../viewUtils/events\";\nimport { Cancellation, CancellationToken, Debouncer } from \"../viewUtils/async\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nexport interface Props extends PaperWidgetProps {\n  target: DiagramElement | undefined;\n  editor: EditorController;\n  metadataApi?: MetadataApi;\n  onRemove?: () => void;\n  onExpand?: () => void;\n  navigationMenuOpened?: boolean;\n  onToggleNavigationMenu?: () => void;\n  onAddToFilter?: () => void;\n  onEstablishNewLink?: (point: Vector) => void;\n  onFollowLink?: (element: Element, event: React.MouseEvent<any>) => void;\n}\n\nexport interface State {\n  canLink?: boolean;\n}\n\nconst CLASS_NAME = \"graph-explorer-halo\";\n\nexport class Halo extends React.Component<Props, State> {\n  private readonly listener = new EventObserver();\n  private targetListener = new EventObserver();\n  private queryDebouncer = new Debouncer();\n  private queryCancellation = new Cancellation();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {};\n  }\n\n  componentDidMount() {\n    const { editor, target } = this.props;\n    this.listener.listen(editor.events, \"changeAuthoringState\", () => {\n      this.queryAllowedActions();\n    });\n    this.listenToElement(target);\n    this.queryAllowedActions();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    if (prevProps.target !== this.props.target) {\n      this.listenToElement(this.props.target);\n      this.queryAllowedActions();\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.listenToElement(undefined);\n    this.queryDebouncer.dispose();\n    this.queryCancellation.abort();\n  }\n\n  listenToElement(element: DiagramElement | undefined) {\n    this.targetListener.stopListening();\n    if (element) {\n      this.targetListener.listenAny(element.events, this.onElementEvent);\n    }\n  }\n\n  private queryAllowedActions() {\n    this.queryDebouncer.call(() => {\n      this.queryCancellation.abort();\n      this.queryCancellation = new Cancellation();\n      this.canLink(this.props.target);\n    });\n  }\n\n  private canLink(target: DiagramElement) {\n    const { metadataApi, editor } = this.props;\n    if (!metadataApi) {\n      this.setState({ canLink: false });\n      return;\n    }\n    const event = editor.authoringState.elements.get(target.iri);\n    if (event && event.deleted) {\n      this.setState({ canLink: false });\n    } else {\n      this.setState({ canLink: undefined });\n      const signal = this.queryCancellation.signal;\n      CancellationToken.mapCancelledToNull(\n        signal,\n        metadataApi.canLinkElement(target.data, signal)\n      ).then((canLink) => {\n        if (canLink === null) {\n          return;\n        }\n        if (this.props.target.iri === target.iri) {\n          this.setState({ canLink });\n        }\n      });\n    }\n  }\n\n  private onElementEvent: AnyListener<ElementEvents> = (data) => {\n    if (data.changePosition || data.changeSize || data.changeExpanded) {\n      this.forceUpdate();\n    }\n    if (data.changeData) {\n      this.queryAllowedActions();\n    }\n  };\n\n  render() {\n    const {\n      paperArea,\n      editor,\n      target,\n      navigationMenuOpened,\n      onToggleNavigationMenu,\n      onAddToFilter,\n      onExpand,\n      onFollowLink,\n    } = this.props;\n\n    if (!target) {\n      return <div className={CLASS_NAME} style={{ display: \"none\" }} />;\n    }\n\n    const bbox = boundsOf(target);\n    const { x: x0, y: y0 } = paperArea.paperToScrollablePaneCoords(\n      bbox.x,\n      bbox.y\n    );\n    const { x: x1, y: y1 } = paperArea.paperToScrollablePaneCoords(\n      bbox.x + bbox.width,\n      bbox.y + bbox.height\n    );\n    const MARGIN = 5;\n    const style: React.CSSProperties = {\n      left: x0 - MARGIN,\n      top: y0 - MARGIN,\n      width: x1 - x0 + MARGIN * 2,\n      height: y1 - y0 + MARGIN * 2,\n    };\n\n    return (\n      <div className={CLASS_NAME} style={style}>\n        {this.renderRemoveOrDeleteButton()}\n        {onToggleNavigationMenu && (\n          <div\n            className={\n              `${CLASS_NAME}__navigate ` +\n              `${CLASS_NAME}__navigate--${\n                navigationMenuOpened ? \"closed\" : \"open\"\n              }`\n            }\n            role=\"button\"\n            title=\"Open a dialog to navigate to connected elements\"\n            onClick={onToggleNavigationMenu}\n          />\n        )}\n        {onFollowLink && (\n          <a\n            className={`${CLASS_NAME}__folow`}\n            href={target.iri}\n            role=\"button\"\n            title=\"Jump to resource\"\n            onClick={(e) => onFollowLink(target, e)}\n          />\n        )}\n        {onAddToFilter && (\n          <div\n            className={`${CLASS_NAME}__add-to-filter`}\n            role=\"button\"\n            title=\"Search for connected elements\"\n            onClick={onAddToFilter}\n          />\n        )}\n        {onExpand && (\n          <div\n            className={\n              `${CLASS_NAME}__expand ` +\n              `${CLASS_NAME}__expand--${target.isExpanded ? \"closed\" : \"open\"}`\n            }\n            role=\"button\"\n            title={`Expand an element to reveal additional properties`}\n            onClick={onExpand}\n          />\n        )}\n        {editor.inAuthoringMode ? this.renderEstablishNewLinkButton() : null}\n      </div>\n    );\n  }\n\n  private renderRemoveOrDeleteButton() {\n    const { editor, target, onRemove } = this.props;\n    if (!onRemove) {\n      return null;\n    }\n\n    const isNewElement = AuthoringState.isNewElement(\n      editor.authoringState,\n      target.iri\n    );\n    return (\n      <div\n        className={\n          isNewElement ? `${CLASS_NAME}__delete` : `${CLASS_NAME}__remove`\n        }\n        role=\"button\"\n        title={\n          isNewElement\n            ? \"Delete new element\"\n            : \"Remove an element from the diagram\"\n        }\n        onClick={onRemove}\n      ></div>\n    );\n  }\n\n  private renderEstablishNewLinkButton() {\n    const { onEstablishNewLink } = this.props;\n    const { canLink } = this.state;\n    if (!onEstablishNewLink) {\n      return null;\n    }\n    if (canLink === undefined) {\n      return (\n        <div className={`${CLASS_NAME}__establish-connection-spinner`}>\n          <HtmlSpinner width={20} height={20} />\n        </div>\n      );\n    }\n    const title = canLink\n      ? \"Establish connection\"\n      : \"Establishing connection is unavailable for the selected element\";\n    return (\n      <button\n        className={`${CLASS_NAME}__establish-connection`}\n        title={title}\n        onMouseDown={this.onEstablishNewLink}\n        disabled={!canLink}\n      />\n    );\n  }\n\n  private onEstablishNewLink = (e: React.MouseEvent<HTMLElement>) => {\n    const point = this.props.paperArea.pageToPaperCoords(e.pageX, e.pageY);\n    this.props.onEstablishNewLink(point);\n  };\n}\n","import * as React from \"react\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\n\nimport { Element, Link } from \"../diagram/elements\";\nimport {\n  computePolyline,\n  computePolylineLength,\n  getPointAlongPolyline,\n  Vector,\n} from \"../diagram/geometry\";\nimport { PaperWidgetProps } from \"../diagram/paperArea\";\nimport { DiagramView } from \"../diagram/view\";\n\nimport { EditorController } from \"../editor/editorController\";\nimport { AuthoringState } from \"../editor/authoringState\";\n\nimport { EventObserver } from \"../viewUtils/events\";\nimport { Cancellation, CancellationToken, Debouncer } from \"../viewUtils/async\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nconst CLASS_NAME = \"graph-explorer-halo-link\";\nconst BUTTON_SIZE = 20;\nconst BUTTON_MARGIN = 5;\n\nexport interface Props extends PaperWidgetProps {\n  view: DiagramView;\n  editor: EditorController;\n  metadataApi?: MetadataApi;\n  target: Link;\n  onEdit: () => void;\n  onDelete: () => void;\n  onSourceMove: (point: { x: number; y: number }) => void;\n  onTargetMove: (point: { x: number; y: number }) => void;\n  onEditLabel: () => void;\n}\n\nexport interface State {\n  canDelete?: boolean;\n  canEdit?: boolean;\n}\n\nexport class HaloLink extends React.Component<Props, State> {\n  private readonly listener = new EventObserver();\n  private targetListener = new EventObserver();\n  private queryDebouncer = new Debouncer();\n  private queryCancellation = new Cancellation();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {};\n  }\n\n  private updateAll = () => this.forceUpdate();\n\n  componentDidMount() {\n    const { target, editor } = this.props;\n    this.listener.listen(editor.events, \"changeAuthoringState\", () => {\n      this.queryAllowedActions();\n    });\n    this.listenToTarget(target);\n    this.queryAllowedActions();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    if (prevProps.target !== this.props.target) {\n      this.listenToTarget(this.props.target);\n      this.queryAllowedActions();\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.listenToTarget(undefined);\n    this.queryDebouncer.dispose();\n    this.queryCancellation.abort();\n  }\n\n  private queryAllowedActions() {\n    this.queryDebouncer.call(() => {\n      this.queryCancellation.abort();\n      this.queryCancellation = new Cancellation();\n      this.queryCanDelete(this.props.target);\n      this.queryCanEdit(this.props.target);\n    });\n  }\n\n  private queryCanDelete(link: Link) {\n    const { metadataApi, editor, view } = this.props;\n    if (!metadataApi) {\n      this.setState({ canDelete: false });\n      return;\n    }\n    if (isSourceOrTargetDeleted(editor.authoringState, link)) {\n      this.setState({ canDelete: false });\n    } else {\n      this.setState({ canDelete: undefined });\n      const source = view.model.getElement(link.sourceId);\n      const target = view.model.getElement(link.targetId);\n      const signal = this.queryCancellation.signal;\n      CancellationToken.mapCancelledToNull(\n        signal,\n        metadataApi.canDeleteLink(link.data, source.data, target.data, signal)\n      ).then((canDelete) => {\n        if (canDelete === null) {\n          return;\n        }\n        if (this.props.target.id === link.id) {\n          this.setState({ canDelete });\n        }\n      });\n    }\n  }\n\n  private queryCanEdit(link: Link) {\n    const { metadataApi, editor, view } = this.props;\n    if (!metadataApi) {\n      this.setState({ canEdit: false });\n      return;\n    }\n    if (isDeletedLink(editor.authoringState, link)) {\n      this.setState({ canEdit: false });\n    } else {\n      this.setState({ canEdit: undefined });\n      const source = view.model.getElement(link.sourceId);\n      const target = view.model.getElement(link.targetId);\n      const signal = this.queryCancellation.signal;\n      CancellationToken.mapCancelledToNull(\n        signal,\n        metadataApi.canEditLink(link.data, source.data, target.data, signal)\n      ).then((canEdit) => {\n        if (canEdit === null) {\n          return;\n        }\n        if (this.props.target.id === link.id) {\n          this.setState({ canEdit });\n        }\n      });\n    }\n  }\n\n  private listenToTarget(link: Link | undefined) {\n    const { view } = this.props;\n\n    this.targetListener.stopListening();\n    if (link) {\n      const source = view.model.getElement(link.sourceId);\n      const target = view.model.getElement(link.targetId);\n\n      const listenToElement = (element: Element) => {\n        this.targetListener.listen(\n          element.events,\n          \"changePosition\",\n          this.updateAll\n        );\n        this.targetListener.listen(\n          element.events,\n          \"changeSize\",\n          this.updateAll\n        );\n      };\n\n      listenToElement(source);\n      listenToElement(target);\n      this.targetListener.listen(link.events, \"changeVertices\", this.updateAll);\n      this.targetListener.listen(\n        link.events,\n        \"changeLabelBounds\",\n        this.updateAll\n      );\n    }\n  }\n\n  private paperToScrollablePaneCoords(point: Vector): Vector {\n    return this.props.paperArea.paperToScrollablePaneCoords(point.x, point.y);\n  }\n\n  private computePolyline(): readonly Vector[] {\n    const { view, target } = this.props;\n\n    const sourceElement = view.model.getElement(target.sourceId);\n    const targetElement = view.model.getElement(target.targetId);\n\n    if (!(sourceElement && targetElement)) {\n      return undefined;\n    }\n\n    const route = view.getRouting(target.id);\n    const verticesDefinedByUser = target.vertices || [];\n    const vertices = route ? route.vertices : verticesDefinedByUser;\n\n    return computePolyline(sourceElement, targetElement, vertices);\n  }\n\n  private calculateDegree(source: Vector, target: Vector): number {\n    const x = target.x - source.x;\n    const y = target.y - source.y;\n    const r = Math.sqrt(x * x + y * y);\n    const unit = { x: x / r, y: y / r };\n    return Math.atan2(unit.y, unit.x) * (180 / Math.PI);\n  }\n\n  private onSourceMove = (e: React.MouseEvent<HTMLElement>) => {\n    const point = this.props.paperArea.pageToPaperCoords(e.pageX, e.pageY);\n    this.props.onSourceMove(point);\n  };\n\n  private renderSourceButton(polyline: readonly Vector[]) {\n    const { editor, target } = this.props;\n    const point = getPointAlongPolyline(polyline, 0);\n    const { x, y } = this.paperToScrollablePaneCoords(point);\n\n    const style = { top: y - BUTTON_SIZE / 2, left: x - BUTTON_SIZE / 2 };\n\n    return (\n      <button\n        className={`${CLASS_NAME}__button`}\n        style={style}\n        disabled={isDeletedLink(editor.authoringState, target)}\n        onMouseDown={this.onSourceMove}\n      >\n        <svg width={BUTTON_SIZE} height={BUTTON_SIZE}>\n          <g transform={`scale(${BUTTON_SIZE})`}>\n            <circle r={0.5} cx={0.5} cy={0.5} fill=\"#198AD3\" />\n          </g>\n        </svg>\n      </button>\n    );\n  }\n\n  private onTargetMove = (e: React.MouseEvent<HTMLElement>) => {\n    const point = this.props.paperArea.pageToPaperCoords(e.pageX, e.pageY);\n    this.props.onTargetMove(point);\n  };\n\n  private getButtonPosition(\n    polyline: readonly Vector[],\n    index: number\n  ): { top: number; left: number } {\n    const polylineLength = computePolylineLength(polyline);\n    const point = getPointAlongPolyline(\n      polyline,\n      polylineLength - (BUTTON_SIZE + BUTTON_MARGIN) * index\n    );\n    const { x, y } = this.paperToScrollablePaneCoords(point);\n\n    return { top: y - BUTTON_SIZE / 2, left: x - BUTTON_SIZE / 2 };\n  }\n\n  private renderTargetButton(polyline: readonly Vector[]) {\n    const { editor, target } = this.props;\n    const style = this.getButtonPosition(polyline, 0);\n\n    const { length } = polyline;\n    const degree = this.calculateDegree(\n      polyline[length - 1],\n      polyline[length - 2]\n    );\n\n    return (\n      <button\n        className={`${CLASS_NAME}__button`}\n        style={style}\n        disabled={isDeletedLink(editor.authoringState, target)}\n        onMouseDown={this.onTargetMove}\n      >\n        <svg\n          width={BUTTON_SIZE}\n          height={BUTTON_SIZE}\n          style={{ transform: `rotate(${degree}deg)` }}\n        >\n          <g transform={`scale(${BUTTON_SIZE})`}>\n            <polygon points={\"0,0.5 1,1 1,0\"} fill=\"#198AD3\" />\n          </g>\n        </svg>\n      </button>\n    );\n  }\n\n  private renderEditButton(polyline: readonly Vector[]) {\n    const { canEdit } = this.state;\n    const style = this.getButtonPosition(polyline, 1);\n    if (canEdit === undefined) {\n      return (\n        <div className={`${CLASS_NAME}__spinner`} style={style}>\n          <HtmlSpinner width={20} height={20} />\n        </div>\n      );\n    }\n    const title = canEdit\n      ? \"Edit link\"\n      : \"Editing is unavailable for the selected link\";\n    return (\n      <button\n        className={`${CLASS_NAME}__button ${CLASS_NAME}__edit`}\n        style={style}\n        title={title}\n        onClick={this.props.onEdit}\n        disabled={!canEdit}\n      />\n    );\n  }\n\n  private renderDeleteButton(polyline: readonly Vector[]) {\n    const { canDelete } = this.state;\n    const style = this.getButtonPosition(polyline, 2);\n    if (canDelete === undefined) {\n      return (\n        <div className={`${CLASS_NAME}__spinner`} style={style}>\n          <HtmlSpinner width={20} height={20} />\n        </div>\n      );\n    }\n    const title = canDelete\n      ? \"Delete link\"\n      : \"Deletion is unavailable for the selected link\";\n    return (\n      <button\n        className={`${CLASS_NAME}__button ${CLASS_NAME}__delete`}\n        style={style}\n        title={title}\n        onClick={this.props.onDelete}\n        disabled={!canDelete}\n      />\n    );\n  }\n\n  // Link editing implementation could be rethought in the future.\n  private renderEditLabelButton() {\n    const { view, target, paperArea, onEditLabel } = this.props;\n\n    const linkType = view.model.getLinkType(target.typeId);\n    const template = view.createLinkTemplate(linkType);\n\n    if (!template.setLinkLabel || !target.labelBounds) {\n      return null;\n    }\n\n    const { x, y, width, height } = target.labelBounds;\n    const { x: left, y: top } = paperArea.paperToScrollablePaneCoords(\n      x + width,\n      y + height / 2\n    );\n    const size = { width: 15, height: 17 };\n    const style = {\n      width: size.width,\n      height: size.height,\n      top: top - size.height / 2,\n      left,\n    };\n    return (\n      <button\n        className={`${CLASS_NAME}__edit-label-button`}\n        style={style}\n        onClick={() => onEditLabel()}\n        title={\"Edit Link Label\"}\n      />\n    );\n  }\n\n  render() {\n    const { editor, target, metadataApi } = this.props;\n    const polyline = this.computePolyline();\n    if (!polyline) {\n      return null;\n    }\n\n    const isAuthoringMode = Boolean(metadataApi);\n    const deleteButton =\n      isDeletedByItself(editor.authoringState, target) ||\n      isSourceOrTargetDeleted(editor.authoringState, target)\n        ? null\n        : this.renderDeleteButton(polyline);\n\n    return (\n      <div className={`${CLASS_NAME}`}>\n        {isAuthoringMode ? this.renderTargetButton(polyline) : null}\n        {isAuthoringMode ? this.renderSourceButton(polyline) : null}\n        {!isAuthoringMode || isDeletedLink(editor.authoringState, target)\n          ? null\n          : this.renderEditButton(polyline)}\n        {isAuthoringMode ? deleteButton : null}\n        {this.renderEditLabelButton()}\n      </div>\n    );\n  }\n}\n\nfunction isDeletedLink(state: AuthoringState, link: Link) {\n  return isDeletedByItself(state, link) || isSourceOrTargetDeleted(state, link);\n}\n\nfunction isDeletedByItself(state: AuthoringState, link: Link) {\n  const event = state.links.get(link.data);\n  return event && event.deleted;\n}\n\nfunction isSourceOrTargetDeleted(state: AuthoringState, link: Link) {\n  const sourceEvent = state.elements.get(link.data.sourceId);\n  const targetEvent = state.elements.get(link.data.targetId);\n  return (\n    (sourceEvent && sourceEvent.deleted) || (targetEvent && targetEvent.deleted)\n  );\n}\n","import * as React from \"react\";\n\nimport { LinkModel } from \"../data/model\";\n\nimport {\n  Vector,\n  computePolyline,\n  getPointAlongPolyline,\n  computePolylineLength,\n} from \"../diagram/geometry\";\nimport { TransformedSvgCanvas } from \"../diagram/paper\";\nimport { PaperWidgetProps } from \"../diagram/paperArea\";\nimport { DiagramView, RenderingLayer } from \"../diagram/view\";\nimport { Link } from \"../diagram/elements\";\n\nimport { Debouncer } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nimport { EditorController } from \"./editorController\";\n\nimport { AuthoringKind, AuthoringState } from \"./authoringState\";\nimport { LinkValidation, ElementValidation } from \"./validation\";\n\nexport interface Props extends PaperWidgetProps {\n  view: DiagramView;\n  editor: EditorController;\n}\n\nconst CLASS_NAME = `graph-explorer-authoring-state`;\nconst LINK_LABEL_MARGIN = 5;\n\nexport class LinkStateWidget extends React.Component<Props, {}> {\n  private readonly listener = new EventObserver();\n  private readonly delayedUpdate = new Debouncer();\n\n  componentDidMount() {\n    this.listenEvents();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    const sameEventSources = this.props.view === prevProps.view;\n    if (!sameEventSources) {\n      this.listener.stopListening();\n      this.listenEvents();\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n  }\n\n  private listenEvents() {\n    const { editor, view } = this.props;\n    this.listener.listen(editor.model.events, \"elementEvent\", ({ data }) => {\n      if (data.changeSize || data.changePosition) {\n        this.scheduleUpdate();\n      }\n    });\n    this.listener.listen(editor.model.events, \"linkEvent\", ({ data }) => {\n      if (data.changeVertices || data.changeLabelBounds) {\n        this.scheduleUpdate();\n      }\n    });\n    this.listener.listen(\n      editor.model.events,\n      \"changeCells\",\n      this.scheduleUpdate\n    );\n    this.listener.listen(\n      editor.events,\n      \"changeAuthoringState\",\n      this.scheduleUpdate\n    );\n    this.listener.listen(\n      editor.events,\n      \"changeTemporaryState\",\n      this.scheduleUpdate\n    );\n    this.listener.listen(\n      editor.events,\n      \"changeValidationState\",\n      this.scheduleUpdate\n    );\n    this.listener.listen(view.events, \"syncUpdate\", ({ layer }) => {\n      if (layer === RenderingLayer.Editor) {\n        this.delayedUpdate.runSynchronously();\n      }\n    });\n  }\n\n  private scheduleUpdate = () => {\n    this.delayedUpdate.call(this.performUpdate);\n  };\n\n  private performUpdate = () => {\n    this.forceUpdate();\n  };\n\n  private calculateLinkPath(link: Link) {\n    const polyline = this.calculatePolyline(link);\n    return \"M\" + polyline.map(({ x, y }) => `${x},${y}`).join(\" L\");\n  }\n\n  private calculatePolyline(link: Link) {\n    const { editor, view } = this.props;\n\n    const source = editor.model.getElement(link.sourceId);\n    const target = editor.model.getElement(link.targetId);\n\n    const route = view.getRouting(link.id);\n    const verticesDefinedByUser = link.vertices || [];\n    const vertices = route ? route.vertices : verticesDefinedByUser;\n\n    return computePolyline(source, target, vertices);\n  }\n\n  private renderLinkStateLabels() {\n    const { editor } = this.props;\n\n    return editor.model.links.map((link) => {\n      let renderedState: React.JSX.Element | null = null;\n      const state = editor.authoringState.links.get(link.data);\n      if (state) {\n        const onCancel = () => editor.discardChange(state);\n\n        let statusText: string;\n        let title: string;\n\n        if (state.deleted) {\n          statusText = \"Delete\";\n          title = \"Revert deletion of the link\";\n        } else if (!state.before) {\n          statusText = \"New\";\n          title = \"Revert creation of the link\";\n        } else {\n          statusText = \"Change\";\n          title = \"Revert all changes in properties of the link\";\n        }\n\n        if (statusText && title) {\n          renderedState = (\n            <span>\n              <span className={`${CLASS_NAME}__state-label`}>{statusText}</span>\n              [\n              <span\n                className={`${CLASS_NAME}__state-cancel`}\n                onClick={onCancel}\n                title={title}\n              >\n                cancel\n              </span>\n              ]\n            </span>\n          );\n        }\n      }\n\n      const renderedErrors = this.renderLinkErrors(link.data);\n      if (renderedState || renderedErrors) {\n        const labelPosition = this.getLinkStateLabelPosition(link);\n        if (!labelPosition) {\n          return null;\n        }\n        const style = { left: labelPosition.x, top: labelPosition.y };\n        return (\n          <div\n            className={`${CLASS_NAME}__state-indicator`}\n            key={link.id}\n            style={style}\n          >\n            <div className={`${CLASS_NAME}__state-indicator-container`}>\n              <div className={`${CLASS_NAME}__state-indicator-body`}>\n                {renderedState}\n                {renderedErrors}\n              </div>\n            </div>\n          </div>\n        );\n      } else {\n        return null;\n      }\n    });\n  }\n\n  private renderLinkStateHighlighting() {\n    const { editor } = this.props;\n    return editor.model.links.map((link) => {\n      if (editor.temporaryState.links.has(link.data)) {\n        const path = this.calculateLinkPath(link);\n        return (\n          <path\n            key={link.id}\n            d={path}\n            fill={\"none\"}\n            stroke={\"grey\"}\n            strokeWidth={5}\n            strokeOpacity={0.5}\n            strokeDasharray={\"8 8\"}\n          />\n        );\n      }\n      const event = editor.authoringState.links.get(link.data);\n      const isDeletedLink = AuthoringState.isDeletedLink(\n        editor.authoringState,\n        link.data\n      );\n      const isUncertainLink = AuthoringState.isUncertainLink(\n        editor.authoringState,\n        link.data\n      );\n      if (event || isDeletedLink || isUncertainLink) {\n        const path = this.calculateLinkPath(link);\n        let color: string;\n        if (isDeletedLink) {\n          color = \"red\";\n        } else if (isUncertainLink) {\n          color = \"blue\";\n        } else if (event && event.type === AuthoringKind.ChangeLink) {\n          color = event.before ? \"blue\" : \"green\";\n        }\n        return (\n          <path\n            key={link.id}\n            d={path}\n            fill={\"none\"}\n            stroke={color}\n            strokeWidth={5}\n            strokeOpacity={0.5}\n          />\n        );\n      }\n      return null;\n    });\n  }\n\n  private getLinkStateLabelPosition(link: Link): Vector {\n    if (link.labelBounds) {\n      const { x, y } = link.labelBounds;\n      return { x, y: y - LINK_LABEL_MARGIN / 2 };\n    } else {\n      const polyline = this.calculatePolyline(link);\n      const polylineLength = computePolylineLength(polyline);\n      return getPointAlongPolyline(polyline, polylineLength / 2);\n    }\n  }\n\n  private renderLinkErrors(linkModel: LinkModel) {\n    const { editor } = this.props;\n    const { validationState } = editor;\n\n    const validation = validationState.links.get(linkModel);\n    if (!validation) {\n      return null;\n    }\n    const title = validation.errors.map((error) => error.message).join(\"\\n\");\n\n    return this.renderErrorIcon(title, validation);\n  }\n\n  private renderErrorIcon(\n    title: string,\n    validation: LinkValidation | ElementValidation\n  ): React.JSX.Element {\n    return (\n      <div className={`${CLASS_NAME}__item-error`} title={title}>\n        {validation.loading ? (\n          <HtmlSpinner width={15} height={17} />\n        ) : (\n          <div className={`${CLASS_NAME}__item-error-icon`} />\n        )}\n        {!validation.loading && validation.errors.length > 0\n          ? validation.errors.length\n          : undefined}\n      </div>\n    );\n  }\n\n  render() {\n    const { editor, paperTransform } = this.props;\n    const { scale, originX, originY } = paperTransform;\n    if (!editor.inAuthoringMode) {\n      return null;\n    }\n    const htmlTransformStyle: React.CSSProperties = {\n      position: \"absolute\",\n      left: 0,\n      top: 0,\n      transform: `scale(${scale},${scale})translate(${originX}px,${originY}px)`,\n    };\n    return (\n      <div className={`${CLASS_NAME}`}>\n        <TransformedSvgCanvas\n          paperTransform={paperTransform}\n          style={{ overflow: \"visible\", pointerEvents: \"none\" }}\n        >\n          {this.renderLinkStateHighlighting()}\n        </TransformedSvgCanvas>\n        <div\n          className={`${CLASS_NAME}__validation-layer`}\n          style={htmlTransformStyle}\n        >\n          {this.renderLinkStateLabels()}\n        </div>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nimport { EventObserver } from \"../viewUtils/events\";\nimport { HtmlSpinner } from \"../viewUtils/spinner\";\n\nimport { Element } from \"../diagram/elements\";\nimport { DiagramView } from \"../diagram/view\";\nimport { Vector } from \"../diagram/geometry\";\n\nimport { EditorController } from \"./editorController\";\nimport { ElementChange } from \"./authoringState\";\nimport { ElementValidation, LinkValidation } from \"./validation\";\n\nconst CLASS_NAME = `graph-explorer-authoring-state`;\n\nexport interface ElementDecoratorProps {\n  model: Element;\n  view: DiagramView;\n  editor: EditorController;\n  position: Vector;\n}\n\ninterface State {\n  state?: ElementChange;\n  validation?: ElementValidation;\n  isTemporary?: boolean;\n}\n\nexport class ElementDecorator extends React.Component<\n  ElementDecoratorProps,\n  State\n> {\n  private readonly listener = new EventObserver();\n\n  constructor(props: ElementDecoratorProps) {\n    super(props);\n    const { model, editor } = props;\n    this.state = {\n      state: editor.authoringState.elements.get(model.iri),\n      validation: editor.validationState.elements.get(model.iri),\n      isTemporary: editor.temporaryState.elements.has(model.iri),\n    };\n  }\n\n  componentDidMount() {\n    const { model, editor } = this.props;\n    this.listener.listen(model.events, \"changeSize\", () => this.forceUpdate());\n    this.listener.listen(editor.events, \"changeAuthoringState\", (e) => {\n      const state = editor.authoringState.elements.get(model.iri);\n      if (state === e.previous.elements.get(model.iri)) {\n        return;\n      }\n      this.setState({ state });\n    });\n    this.listener.listen(editor.events, \"changeValidationState\", (e) => {\n      const validation = editor.validationState.elements.get(model.iri);\n      if (validation === e.previous.elements.get(model.iri)) {\n        return;\n      }\n      this.setState({ validation });\n    });\n    this.listener.listen(editor.events, \"changeTemporaryState\", (e) => {\n      const isTemporary = editor.temporaryState.elements.has(model.iri);\n      if (isTemporary === e.previous.elements.has(model.iri)) {\n        return;\n      }\n      this.setState({ isTemporary });\n    });\n    this.listener.listen(model.events, \"changeData\", (e) => {\n      if (e.previous.id !== model.iri) {\n        this.setState({\n          isTemporary: editor.temporaryState.elements.has(model.iri),\n          validation: editor.validationState.elements.get(model.iri),\n          state: editor.authoringState.elements.get(model.iri),\n        });\n      }\n    });\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n  }\n\n  shouldComponentUpdate(nextProps: ElementDecoratorProps, nextState: State) {\n    return (\n      this.state.state !== nextState.state ||\n      this.state.validation !== nextState.validation ||\n      this.state.isTemporary !== nextState.isTemporary ||\n      this.props.position !== nextProps.position\n    );\n  }\n\n  private renderElementOutlines() {\n    const { model } = this.props;\n    const { state, isTemporary } = this.state;\n    const { width, height } = model.size;\n    if (isTemporary) {\n      return [\n        <rect\n          key={`${model.id}-opacity`}\n          x={0}\n          y={0}\n          width={width}\n          height={height}\n          fill=\"rgba(255, 255, 255, 0.5)\"\n        />,\n        <rect\n          key={`${model.id}-stripes`}\n          x={0}\n          y={0}\n          width={width}\n          height={height}\n          fill=\"url(#stripe-pattern)\"\n        />,\n      ];\n    }\n    if (state && state.deleted) {\n      const right = width;\n      const bottom = height;\n      return (\n        <g key={model.id}>\n          <rect\n            x={0}\n            y={0}\n            width={width}\n            height={height}\n            fill=\"white\"\n            fillOpacity={0.5}\n          />\n          <line x1={0} y1={0} x2={right} y2={bottom} stroke=\"red\" />\n          <line x1={right} y1={0} x2={0} y2={bottom} stroke=\"red\" />\n        </g>\n      );\n    }\n    return null;\n  }\n\n  private renderErrorIcon(\n    title: string,\n    validation: LinkValidation | ElementValidation\n  ) {\n    return (\n      <div className={`${CLASS_NAME}__item-error`} title={title}>\n        {validation.loading ? (\n          <HtmlSpinner width={15} height={17} />\n        ) : (\n          <div className={`${CLASS_NAME}__item-error-icon`} />\n        )}\n        {!validation.loading && validation.errors.length > 0\n          ? validation.errors.length\n          : undefined}\n      </div>\n    );\n  }\n\n  private renderElementErrors() {\n    const { view } = this.props;\n    const { validation } = this.state;\n    if (!validation) {\n      return null;\n    }\n    const title = validation.errors\n      .map((error) => {\n        if (error.propertyType) {\n          const { id, label } = view.model.createProperty(error.propertyType);\n          const source = view.formatLabel(label, id);\n          return `${source}: ${error.message}`;\n        } else {\n          return error.message;\n        }\n      })\n      .join(\"\\n\");\n\n    return this.renderErrorIcon(title, validation);\n  }\n\n  private renderElementState() {\n    const { model, editor } = this.props;\n    const { state } = this.state;\n    if (state) {\n      const onCancel = () => editor.discardChange(state);\n\n      let renderedState: React.ReactElement<any>;\n      let statusText: string;\n      let title: string;\n\n      if (state.deleted) {\n        statusText = \"Delete\";\n        title = \"Revert deletion of the element\";\n      } else if (!state.before) {\n        statusText = \"New\";\n        title = \"Revert creation of the element\";\n      } else {\n        statusText = \"Change\";\n        title = \"Revert all changes in properties of the element\";\n      }\n\n      if (statusText && title) {\n        renderedState = (\n          <span>\n            <span className={`${CLASS_NAME}__state-label`}>{statusText}</span>[\n            <span\n              className={`${CLASS_NAME}__state-cancel`}\n              onClick={onCancel}\n              title={title}\n            >\n              cancel\n            </span>\n            ]\n          </span>\n        );\n      }\n\n      const renderedErrors = this.renderElementErrors();\n      if (renderedState || renderedErrors) {\n        return (\n          <div\n            className={`${CLASS_NAME}__state-indicator`}\n            key={model.id}\n            style={{ left: 0, top: 0 }}\n          >\n            <div className={`${CLASS_NAME}__state-indicator-container`}>\n              <div className={`${CLASS_NAME}__state-indicator-body`}>\n                {renderedState}\n                {renderedErrors}\n              </div>\n            </div>\n          </div>\n        );\n      }\n    }\n    return null;\n  }\n\n  render() {\n    const { position, size } = this.props.model;\n    const transform = `translate(${position.x}px,${position.y}px)`;\n    const outlines = this.renderElementOutlines();\n    const state = this.renderElementState();\n    if (!outlines && !state) {\n      return null;\n    }\n    return (\n      <div style={{ position: \"absolute\", transform }}>\n        {outlines ? (\n          <svg\n            width={size.width}\n            height={size.height}\n            style={{\n              position: \"absolute\",\n              pointerEvents: \"none\",\n              overflow: \"visible\",\n            }}\n          >\n            <defs>\n              <pattern\n                id=\"stripe-pattern\"\n                patternUnits=\"userSpaceOnUse\"\n                width={13}\n                height={13}\n                patternTransform=\"rotate(45)\"\n              >\n                <line\n                  x1={0}\n                  y={0}\n                  x2={0}\n                  y2={13}\n                  stroke=\"#ddd\"\n                  strokeWidth={10}\n                  strokeOpacity={0.2}\n                />\n              </pattern>\n            </defs>\n            {this.renderElementOutlines()}\n          </svg>\n        ) : null}\n        {state}\n      </div>\n    );\n  }\n}\n","import {\n  ElementModel,\n  LinkModel,\n  ElementIri,\n  sameLink,\n  hashLink,\n} from \"../data/model\";\n\nimport { HashMap, ReadonlyHashMap, cloneMap } from \"../viewUtils/collections\";\n\nexport interface TemporaryState {\n  readonly elements: ReadonlyMap<ElementIri, ElementModel>;\n  readonly links: ReadonlyHashMap<LinkModel, LinkModel>;\n}\nexport const TemporaryState = {\n  empty: {\n    elements: new Map<ElementIri, ElementModel>(),\n    links: new HashMap<LinkModel, LinkModel>(hashLink, sameLink),\n  } as TemporaryState,\n\n  addElement(state: TemporaryState, element: ElementModel) {\n    const elements = cloneMap(state.elements);\n    elements.set(element.id, element);\n    return { ...state, elements };\n  },\n\n  deleteElement(state: TemporaryState, element: ElementModel) {\n    const elements = cloneMap(state.elements);\n    elements.delete(element.id);\n    return { ...state, elements };\n  },\n\n  addLink(state: TemporaryState, link: LinkModel) {\n    const links = state.links.clone();\n    links.set(link, link);\n    return { ...state, links };\n  },\n  deleteLink(state: TemporaryState, link: LinkModel) {\n    const links = state.links.clone();\n    links.delete(link);\n    return { ...state, links };\n  },\n};\n","import * as React from \"react\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { ElementModel, LinkModel } from \"../data/model\";\nimport {\n  PLACEHOLDER_ELEMENT_TYPE,\n  PLACEHOLDER_LINK_TYPE,\n} from \"../data/schema\";\n\nimport { DiagramView } from \"../diagram/view\";\nimport { LinkLayer, LinkMarkers } from \"../diagram/linkLayer\";\nimport { Element, Link, LinkDirection } from \"../diagram/elements\";\nimport { boundsOf, Vector, findElementAtPoint } from \"../diagram/geometry\";\nimport { TransformedSvgCanvas } from \"../diagram/paper\";\nimport { PaperWidgetProps } from \"../diagram/paperArea\";\n\nimport { Cancellation, CancellationToken } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { Spinner } from \"../viewUtils/spinner\";\n\nimport { TemporaryState } from \"./temporaryState\";\nimport { EditorController } from \"./editorController\";\n\nexport enum EditLayerMode {\n  establishLink,\n  moveLinkSource,\n  moveLinkTarget,\n}\n\nexport interface Props extends PaperWidgetProps {\n  view: DiagramView;\n  editor: EditorController;\n  metadataApi: MetadataApi | undefined;\n  mode: EditLayerMode;\n  target: Element | Link;\n  point: { x: number; y: number };\n  onFinishEditing: () => void;\n}\n\nexport interface State {\n  targetElement?: Element;\n  canLinkFrom?: boolean;\n  canDropOnCanvas?: boolean;\n  canDropOnElement?: boolean;\n  waitingForMetadata?: boolean;\n}\n\nexport class EditLayer extends React.Component<Props, State> {\n  private readonly listener = new EventObserver();\n  private readonly cancellation = new Cancellation();\n\n  private canDropOnElementCancellation = new Cancellation();\n\n  private temporaryLink: Link | undefined;\n  private temporaryElement: Element | undefined;\n  private oldLink: Link | undefined;\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {};\n  }\n\n  componentDidMount() {\n    const { mode, target, point } = this.props;\n    if (mode === EditLayerMode.establishLink) {\n      this.beginCreatingLink({ sourceId: target.id, point });\n    } else if (\n      mode === EditLayerMode.moveLinkSource ||\n      mode === EditLayerMode.moveLinkTarget\n    ) {\n      this.beginMovingLink(target as Link, point);\n    } else {\n      throw new Error(\"Unknown edit mode\");\n    }\n    this.forceUpdate();\n    this.queryCanLinkFrom();\n    this.queryCanDropOnCanvas();\n    document.addEventListener(\"mousemove\", this.onMouseMove);\n    document.addEventListener(\"mouseup\", this.onMouseUp);\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.cancellation.abort();\n    this.canDropOnElementCancellation.abort();\n    document.removeEventListener(\"mousemove\", this.onMouseMove);\n    document.removeEventListener(\"mouseup\", this.onMouseUp);\n  }\n\n  private beginCreatingLink = (params: { sourceId: string; point: Vector }) => {\n    const { editor } = this.props;\n    const { sourceId, point } = params;\n\n    const temporaryElement = this.createTemporaryElement(point);\n    const linkTemplate = new Link({\n      typeId: PLACEHOLDER_LINK_TYPE,\n      sourceId,\n      targetId: temporaryElement.id,\n    });\n    const temporaryLink = editor.createNewLink({\n      link: linkTemplate,\n      temporary: true,\n    });\n    const fatLinkType = editor.model.createLinkType(temporaryLink.typeId);\n    fatLinkType.setVisibility({ visible: true, showLabel: false });\n\n    this.temporaryElement = temporaryElement;\n    this.temporaryLink = temporaryLink;\n  };\n\n  private beginMovingLink(target: Link, startingPoint: Vector) {\n    const { editor, mode } = this.props;\n\n    if (\n      !(\n        mode === EditLayerMode.moveLinkSource ||\n        mode === EditLayerMode.moveLinkTarget\n      )\n    ) {\n      throw new Error(\"Unexpected edit mode for moving link\");\n    }\n\n    this.oldLink = target;\n    editor.model.removeLink(target.id);\n    const { id: _id, typeId, sourceId, targetId, ...otherProps } = target;\n\n    const temporaryElement = this.createTemporaryElement(startingPoint);\n    const linkTemplate = new Link({\n      typeId,\n      sourceId:\n        mode === EditLayerMode.moveLinkSource ? temporaryElement.id : sourceId,\n      targetId:\n        mode === EditLayerMode.moveLinkTarget ? temporaryElement.id : targetId,\n      ...otherProps,\n    });\n    const temporaryLink = editor.createNewLink({\n      link: linkTemplate,\n      temporary: true,\n    });\n\n    this.temporaryElement = temporaryElement;\n    this.temporaryLink = temporaryLink;\n  }\n\n  private createTemporaryElement(point: Vector) {\n    const temporaryElement = this.props.view.model.createTemporaryElement();\n    temporaryElement.setPosition(point);\n\n    return temporaryElement;\n  }\n\n  private onMouseMove = (e: MouseEvent) => {\n    const { view, paperArea } = this.props;\n    const { targetElement, waitingForMetadata } = this.state;\n\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (waitingForMetadata) {\n      return;\n    }\n\n    const point = paperArea.pageToPaperCoords(e.pageX, e.pageY);\n    this.temporaryElement.setPosition(point);\n\n    const newTargetElement = findElementAtPoint(view.model.elements, point);\n\n    if (newTargetElement !== targetElement) {\n      this.queryCanDropOnElement(newTargetElement);\n    }\n    this.setState({ targetElement: newTargetElement });\n  };\n\n  private queryCanLinkFrom() {\n    const { editor, metadataApi } = this.props;\n\n    if (!metadataApi) {\n      this.setState({ canLinkFrom: false });\n      return;\n    }\n\n    this.setState({ canLinkFrom: undefined });\n\n    const source = editor.model.getElement(this.temporaryLink.sourceId);\n    CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.canLinkElement(source.data, this.cancellation.signal)\n    ).then(\n      (canLinkFrom) => {\n        if (canLinkFrom === null) {\n          return;\n        }\n        this.setState({ canLinkFrom });\n      },\n      (error) => {\n        console.error(\"Error calling canLinkElement:\", error);\n        this.setState({ canLinkFrom: false });\n      }\n    );\n  }\n\n  private queryCanDropOnCanvas() {\n    const { mode, editor, metadataApi } = this.props;\n\n    if (!metadataApi || mode !== EditLayerMode.establishLink) {\n      this.setState({ canDropOnCanvas: false });\n      return;\n    }\n\n    this.setState({ canDropOnCanvas: undefined });\n\n    const source = editor.model.getElement(this.temporaryLink.sourceId);\n    CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.canDropOnCanvas(source.data, this.cancellation.signal)\n    ).then(\n      (canDropOnCanvas) => {\n        if (canDropOnCanvas === null) {\n          return;\n        }\n        this.setState({ canDropOnCanvas });\n      },\n      (error) => {\n        console.error(\"Error calling canDropOnCanvas:\", error);\n        this.setState({ canDropOnCanvas: false });\n      }\n    );\n  }\n\n  private queryCanDropOnElement(targetElement: Element | undefined) {\n    const { mode, editor, metadataApi } = this.props;\n\n    this.canDropOnElementCancellation.abort();\n    this.canDropOnElementCancellation = new Cancellation();\n\n    if (!(metadataApi && targetElement)) {\n      this.setState({ canDropOnElement: false });\n      return;\n    }\n\n    this.setState({ canDropOnElement: undefined });\n\n    let source: ElementModel;\n    let target: ElementModel;\n\n    if (\n      mode === EditLayerMode.establishLink ||\n      mode === EditLayerMode.moveLinkTarget\n    ) {\n      source = editor.model.getElement(this.temporaryLink.sourceId).data;\n      target = targetElement.data;\n    } else if (mode === EditLayerMode.moveLinkSource) {\n      source = targetElement.data;\n      target = editor.model.getElement(this.temporaryLink.targetId).data;\n    }\n\n    const signal = this.canDropOnElementCancellation.signal;\n    CancellationToken.mapCancelledToNull(\n      signal,\n      metadataApi.canDropOnElement(source, target, signal)\n    ).then((canDropOnElement) => {\n      if (canDropOnElement === null) {\n        return;\n      }\n      this.setState({ canDropOnElement });\n    });\n  }\n\n  private onMouseUp = (e: MouseEvent) => {\n    if (this.state.waitingForMetadata) {\n      return;\n    }\n    // show spinner while waiting for additinal MetadataApi queries\n    this.setState({ waitingForMetadata: true });\n    const selectedPosition = this.props.paperArea.pageToPaperCoords(\n      e.pageX,\n      e.pageY\n    );\n    this.executeEditOperation(selectedPosition);\n  };\n\n  private async executeEditOperation(selectedPosition: Vector): Promise<void> {\n    const { view, editor, mode } = this.props;\n\n    try {\n      const { targetElement, canLinkFrom, canDropOnCanvas, canDropOnElement } =\n        this.state;\n\n      if (this.oldLink) {\n        editor.model.addLink(this.oldLink);\n      }\n\n      const canDrop = targetElement ? canDropOnElement : canDropOnCanvas;\n      if (canLinkFrom && canDrop) {\n        let modifiedLink: Link | undefined;\n        let createdTarget: Element | undefined = targetElement;\n\n        switch (mode) {\n          case EditLayerMode.establishLink: {\n            if (!createdTarget) {\n              const source = editor.model.getElement(\n                this.temporaryLink.sourceId\n              );\n              createdTarget = await this.createNewElement(source.data);\n              createdTarget.setPosition(selectedPosition);\n              view.performSyncUpdate();\n              centerElementAtPoint(createdTarget, selectedPosition);\n            }\n            const sourceElement = editor.model.getElement(\n              this.temporaryLink.sourceId\n            );\n            modifiedLink = await this.createNewLink(\n              sourceElement,\n              createdTarget\n            );\n            break;\n          }\n          case EditLayerMode.moveLinkSource: {\n            modifiedLink = editor.moveLinkSource({\n              link: this.oldLink,\n              newSource: targetElement,\n            });\n            break;\n          }\n          case EditLayerMode.moveLinkTarget: {\n            modifiedLink = editor.moveLinkTarget({\n              link: this.oldLink,\n              newTarget: targetElement,\n            });\n            break;\n          }\n          default: {\n            throw new Error(\"Unknown edit mode\");\n          }\n        }\n\n        if (targetElement) {\n          const focusedLink = modifiedLink || this.oldLink;\n          editor.setSelection([focusedLink]);\n          editor.showEditLinkForm(focusedLink);\n        } else if (createdTarget && modifiedLink) {\n          editor.setSelection([createdTarget]);\n          const source = editor.model.getElement(modifiedLink.sourceId);\n          editor.showEditElementTypeForm({\n            link: modifiedLink,\n            source,\n            target: createdTarget,\n            targetIsNew: true,\n          });\n        }\n      }\n    } finally {\n      this.cleanupAndFinish();\n    }\n  }\n\n  private createNewElement = async (\n    source: ElementModel\n  ): Promise<Element | undefined> => {\n    const { editor, metadataApi } = this.props;\n    if (!metadataApi) {\n      return;\n    }\n    const elementTypes = await CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.typesOfElementsDraggedFrom(source, this.cancellation.signal)\n    );\n    if (elementTypes === null) {\n      return;\n    }\n    const classId =\n      elementTypes.length === 1 ? elementTypes[0] : PLACEHOLDER_ELEMENT_TYPE;\n    const elementModel = await CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.generateNewElement([classId], this.cancellation.signal)\n    );\n    if (elementModel === null) {\n      return;\n    }\n    return editor.createNewEntity({ elementModel, temporary: true });\n  };\n\n  private async createNewLink(\n    source: Element,\n    target: Element\n  ): Promise<Link | undefined> {\n    const { editor, metadataApi } = this.props;\n    if (!metadataApi) {\n      return undefined;\n    }\n    const linkTypes = await CancellationToken.mapCancelledToNull(\n      this.cancellation.signal,\n      metadataApi.possibleLinkTypes(\n        source.data,\n        target.data,\n        this.cancellation.signal\n      )\n    );\n    if (linkTypes === null) {\n      return undefined;\n    }\n    const placeholder = {\n      linkTypeIri: PLACEHOLDER_LINK_TYPE,\n      direction: LinkDirection.out,\n    };\n    const { linkTypeIri: typeId, direction } =\n      linkTypes.length === 1 ? linkTypes[0] : placeholder;\n    const data: LinkModel = {\n      linkTypeId: typeId,\n      sourceId: source.iri,\n      targetId: target.iri,\n    };\n    let [sourceId, targetId] = [source.id, target.id];\n    // switches source and target if the direction equals 'in'\n    if (direction === LinkDirection.in) {\n      data.sourceId = target.iri;\n      data.targetId = source.iri;\n      [sourceId, targetId] = [targetId, sourceId];\n    }\n    const link = new Link({ typeId, sourceId, targetId, data });\n    const existingLink = editor.model.findLink(\n      link.typeId,\n      link.sourceId,\n      link.targetId\n    );\n    return existingLink || editor.createNewLink({ link, temporary: true });\n  }\n\n  private cleanupAndFinish() {\n    const { editor, onFinishEditing } = this.props;\n\n    const batch = editor.model.history.startBatch();\n    editor.model.removeElement(this.temporaryElement.id);\n    editor.model.removeLink(this.temporaryLink.id);\n    editor.setTemporaryState(\n      TemporaryState.deleteLink(editor.temporaryState, this.temporaryLink.data)\n    );\n    batch.discard();\n\n    onFinishEditing();\n  }\n\n  render() {\n    const { view, paperTransform } = this.props;\n    const { waitingForMetadata } = this.state;\n\n    if (!this.temporaryLink) {\n      return null;\n    }\n\n    return (\n      <TransformedSvgCanvas\n        paperTransform={paperTransform}\n        style={{ overflow: \"visible\" }}\n      >\n        <LinkMarkers view={view} />\n        {this.renderHighlight()}\n        {this.renderCanDropIndicator()}\n        {waitingForMetadata ? null : (\n          <LinkLayer view={view} links={[this.temporaryLink]} />\n        )}\n      </TransformedSvgCanvas>\n    );\n  }\n\n  private renderHighlight() {\n    const { targetElement, canLinkFrom, canDropOnElement, waitingForMetadata } =\n      this.state;\n\n    if (!targetElement) {\n      return null;\n    }\n\n    const { x, y, width, height } = boundsOf(targetElement);\n\n    if (\n      canLinkFrom === undefined ||\n      canDropOnElement === undefined ||\n      waitingForMetadata\n    ) {\n      return (\n        <g transform={`translate(${x},${y})`}>\n          <rect\n            width={width}\n            height={height}\n            fill={\"white\"}\n            fillOpacity={0.5}\n          />\n          <Spinner size={30} position={{ x: width / 2, y: height / 2 }} />\n        </g>\n      );\n    }\n\n    const stroke = canLinkFrom && canDropOnElement ? \"#5cb85c\" : \"#c9302c\";\n    return (\n      <rect\n        x={x}\n        y={y}\n        width={width}\n        height={height}\n        fill={\"transparent\"}\n        stroke={stroke}\n        strokeWidth={3}\n      />\n    );\n  }\n\n  private renderCanDropIndicator() {\n    const { targetElement, canLinkFrom, canDropOnCanvas, waitingForMetadata } =\n      this.state;\n\n    if (targetElement) {\n      return null;\n    }\n\n    const { x, y } = this.temporaryElement.position;\n\n    let indicator: React.ReactElement<any>;\n    if (canLinkFrom === undefined || canDropOnCanvas === undefined) {\n      indicator = <Spinner size={1.2} position={{ x: 0.5, y: -0.5 }} />;\n    } else if (canLinkFrom && canDropOnCanvas) {\n      indicator = (\n        <path\n          d=\"M0.5,0 L0.5,-1 M0,-0.5 L1,-0.5\"\n          strokeWidth={0.2}\n          stroke=\"#5cb85c\"\n        />\n      );\n    } else {\n      indicator = (\n        <g>\n          <circle\n            cx=\"0.5\"\n            cy=\"-0.5\"\n            r=\"0.5\"\n            fill=\"none\"\n            strokeWidth={0.2}\n            stroke=\"#c9302c\"\n          />\n          <path\n            d=\"M0.5,0 L0.5,-1\"\n            strokeWidth={0.2}\n            stroke=\"#c9302c\"\n            transform=\"rotate(-45 0.5 -0.5)\"\n          />\n        </g>\n      );\n    }\n\n    return (\n      <g transform={`translate(${x} ${y})scale(40)`}>\n        <rect\n          x={-0.5}\n          y={-0.5}\n          width={1}\n          height={1}\n          fill=\"rgba(0, 0, 0, 0.1)\"\n          rx={0.25}\n          ry={0.25}\n        />\n        {waitingForMetadata ? (\n          <Spinner size={0.8} />\n        ) : (\n          <g transform={`translate(${0.5}, -${0.5})scale(${0.25})`}>\n            {indicator}\n          </g>\n        )}\n      </g>\n    );\n  }\n}\n\nfunction centerElementAtPoint(element: Element, point: Vector) {\n  element.setPosition({\n    x: point.x - element.size.width / 2,\n    y: point.y - element.size.height / 2,\n  });\n}\n","import { ElementIri, LinkModel, hashLink, sameLink } from \"../data/model\";\nimport {\n  ValidationApi,\n  ValidationEvent,\n  ElementError,\n  LinkError,\n} from \"../data/validationApi\";\nimport { CancellationToken } from \"../viewUtils/async\";\nimport { HashMap, ReadonlyHashMap, cloneMap } from \"../viewUtils/collections\";\nimport { AuthoringState } from \"./authoringState\";\nimport { EditorController } from \"./editorController\";\n\nexport interface ValidationState {\n  readonly elements: ReadonlyMap<ElementIri, ElementValidation>;\n  readonly links: ReadonlyHashMap<LinkModel, LinkValidation>;\n}\n\nexport interface ElementValidation {\n  readonly loading: boolean;\n  readonly errors: readonly ElementError[];\n}\n\nexport interface LinkValidation {\n  readonly loading: boolean;\n  readonly errors: readonly LinkError[];\n}\n\nconst empty: ValidationState = createMutable();\nconst emptyElement: ElementValidation = { loading: false, errors: [] };\nconst emptyLink: LinkValidation = { loading: false, errors: [] };\n\nfunction createMutable() {\n  return {\n    elements: new Map<ElementIri, ElementValidation>(),\n    links: new HashMap<LinkModel, LinkValidation>(hashLink, sameLink),\n  };\n}\n\nfunction setElementErrors(\n  state: ValidationState,\n  target: ElementIri,\n  errors: readonly ElementError[]\n): ValidationState {\n  const elements = cloneMap(state.elements);\n  if (errors.length > 0) {\n    elements.set(target, { loading: false, errors });\n  } else {\n    elements.delete(target);\n  }\n  return { ...state, elements };\n}\n\nfunction setLinkErrors(\n  state: ValidationState,\n  target: LinkModel,\n  errors: readonly LinkError[]\n): ValidationState {\n  const links = state.links.clone();\n  if (errors.length > 0) {\n    links.set(target, { loading: false, errors });\n  } else {\n    links.delete(target);\n  }\n  return { ...state, links };\n}\n\nexport const ValidationState = {\n  empty,\n  emptyElement,\n  emptyLink,\n  createMutable,\n  setElementErrors,\n  setLinkErrors,\n};\n\nexport function changedElementsToValidate(\n  previousAuthoring: AuthoringState,\n  editor: EditorController\n) {\n  const currentAuthoring = editor.authoringState;\n\n  const links = new HashMap<LinkModel, true>(hashLink, sameLink);\n  previousAuthoring.links.forEach((e, model) => links.set(model, true));\n  currentAuthoring.links.forEach((e, model) => links.set(model, true));\n\n  const toValidate = new Set<ElementIri>();\n  links.forEach((value, linkModel) => {\n    const current = currentAuthoring.links.get(linkModel);\n    const previous = previousAuthoring.links.get(linkModel);\n    if (current !== previous) {\n      toValidate.add(linkModel.sourceId);\n    }\n  });\n\n  for (const element of editor.model.elements) {\n    const current = currentAuthoring.elements.get(element.iri);\n    const previous = previousAuthoring.elements.get(element.iri);\n    if (current !== previous) {\n      toValidate.add(element.iri);\n\n      // when we remove element incoming link are removed as well so we should update their sources\n      if ((current || previous).deleted) {\n        for (const link of element.links) {\n          if (link.data.sourceId !== element.iri) {\n            toValidate.add(link.data.sourceId);\n          }\n        }\n      }\n    }\n  }\n\n  return toValidate;\n}\n\nexport function validateElements(\n  targets: ReadonlySet<ElementIri>,\n  validationApi: ValidationApi,\n  editor: EditorController,\n  cancellationToken: CancellationToken\n) {\n  const previousState = editor.validationState;\n  const newState = ValidationState.createMutable();\n\n  for (const element of editor.model.elements) {\n    if (newState.elements.has(element.iri)) {\n      continue;\n    }\n\n    const outboundLinks = element.links.reduce((acc: LinkModel[], link) => {\n      if (link.sourceId === element.id) {\n        acc.push(link.data);\n      }\n      return acc;\n    }, []);\n\n    if (targets.has(element.iri)) {\n      const event: ValidationEvent = {\n        target: element.data,\n        outboundLinks,\n        state: editor.authoringState,\n        model: editor.model,\n        cancellation: cancellationToken,\n      };\n      const result = CancellationToken.mapCancelledToNull(\n        cancellationToken,\n        validationApi.validate(event)\n      );\n\n      const loadingElement: ElementValidation = { loading: true, errors: [] };\n      const loadingLink: LinkValidation = { loading: true, errors: [] };\n      newState.elements.set(element.iri, loadingElement);\n      outboundLinks.forEach((link) => newState.links.set(link, loadingLink));\n\n      processValidationResult(\n        result,\n        loadingElement,\n        loadingLink,\n        event,\n        editor\n      );\n    } else {\n      // use previous state for element and outbound links\n      newState.elements.set(\n        element.iri,\n        previousState.elements.get(element.iri)\n      );\n      for (const link of outboundLinks) {\n        newState.links.set(link, previousState.links.get(link));\n      }\n    }\n  }\n\n  editor.setValidationState(newState);\n}\n\nasync function processValidationResult(\n  result: Promise<(ElementError | LinkError)[] | null>,\n  previousElement: ElementValidation,\n  previousLink: LinkValidation,\n  e: ValidationEvent,\n  editor: EditorController\n) {\n  let allErrors: (ElementError | LinkError)[] | null;\n  try {\n    allErrors = await result;\n    if (allErrors === null) {\n      // validation was cancelled\n      return;\n    }\n  } catch (err) {\n    console.error(`Failed to validate element`, e.target, err);\n    allErrors = [\n      {\n        type: \"element\",\n        target: e.target.id,\n        message: `Failed to validate element`,\n      },\n    ];\n  }\n\n  const elementErrors: ElementError[] = [];\n  const linkErrors = new HashMap<LinkModel, LinkError[]>(hashLink, sameLink);\n  e.outboundLinks.forEach((link) => linkErrors.set(link, []));\n\n  for (const error of allErrors) {\n    if (error.type === \"element\" && error.target === e.target.id) {\n      elementErrors.push(error);\n    } else if (error.type === \"link\" && linkErrors.has(error.target)) {\n      linkErrors.get(error.target).push(error);\n    }\n  }\n\n  let state = editor.validationState;\n  if (state.elements.get(e.target.id) === previousElement) {\n    state = ValidationState.setElementErrors(state, e.target.id, elementErrors);\n  }\n  linkErrors.forEach((errors, link) => {\n    if (state.links.get(link) === previousLink) {\n      state = ValidationState.setLinkErrors(state, link, errors);\n    }\n  });\n  editor.setValidationState(state);\n}\n","import * as React from \"react\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { ValidationApi } from \"../data/validationApi\";\nimport { ElementModel, LinkModel, ElementIri, sameLink } from \"../data/model\";\n\nimport {\n  setElementExpanded,\n  setElementData,\n  setLinkData,\n  changeLinkTypeVisibility,\n} from \"../diagram/commands\";\nimport { Element, Link, LinkVertex, FatLinkType } from \"../diagram/elements\";\nimport { Vector, boundsOf } from \"../diagram/geometry\";\nimport { Command } from \"../diagram/history\";\nimport {\n  PaperArea,\n  PointerUpEvent,\n  PaperWidgetProps,\n} from \"../diagram/paperArea\";\nimport { DiagramView, IriClickIntent, WidgetAttachment } from \"../diagram/view\";\n\nimport {\n  Events,\n  EventSource,\n  EventObserver,\n  PropertyChange,\n} from \"../viewUtils/events\";\n\nimport { Dialog } from \"../widgets/dialog\";\nimport {\n  ConnectionsMenu,\n  PropertySuggestionHandler,\n} from \"../widgets/connectionsMenu\";\nimport { EditEntityForm } from \"../forms/editEntityForm\";\nimport { EditElementTypeForm } from \"../forms/editElementTypeForm\";\nimport { EditLinkForm } from \"../forms/editLinkForm\";\nimport { EditLinkLabelForm } from \"../forms/editLinkLabelForm\";\nimport { Halo } from \"../widgets/halo\";\nimport { HaloLink } from \"../widgets/haloLink\";\nimport { LinkStateWidget } from \"./linkStateWidget\";\nimport { ElementDecorator } from \"./elementDecorator\";\n\nimport {\n  placeElementsAround,\n  forceLayout,\n  applyLayout,\n} from \"../viewUtils/layout\";\nimport { Spinner, SpinnerProps } from \"../viewUtils/spinner\";\n\nimport {\n  AsyncModel,\n  requestElementData,\n  restoreLinksBetweenElements,\n} from \"./asyncModel\";\nimport {\n  AuthoringState,\n  AuthoringKind,\n  AuthoringEvent,\n  ElementChange,\n} from \"./authoringState\";\nimport { TemporaryState } from \"./temporaryState\";\nimport { EditLayer, EditLayerMode } from \"./editLayer\";\nimport {\n  ValidationState,\n  changedElementsToValidate,\n  validateElements,\n} from \"./validation\";\n\nimport { Cancellation } from \"../viewUtils/async\";\nimport { makeMoveComparator, MoveDirection } from \"../viewUtils/collections\";\n\nexport interface PropertyEditorOptions {\n  elementData: ElementModel;\n  onSubmit: (newData: ElementModel) => void;\n  onCancel?: () => void;\n}\nexport type PropertyEditor = (\n  options: PropertyEditorOptions\n) => React.ReactElement<any>;\n\nexport enum DialogTypes {\n  ConnectionsMenu,\n  EditEntityForm,\n  EditLinkForm,\n  EditEntityTypeForm,\n  EditLinkLabelForm,\n}\n\nexport type SelectionItem = Element | Link;\n\nexport interface EditorProps extends EditorOptions {\n  model: AsyncModel;\n  view: DiagramView;\n}\n\nexport interface EditorOptions {\n  disableHalo?: boolean;\n  suggestProperties?: PropertySuggestionHandler;\n  validationApi?: ValidationApi;\n  propertyEditor?: PropertyEditor;\n}\n\nexport interface EditorEvents {\n  changeMode: { source: EditorController };\n  changeSelection: PropertyChange<EditorController, readonly SelectionItem[]>;\n  changeAuthoringState: PropertyChange<EditorController, AuthoringState>;\n  changeValidationState: PropertyChange<EditorController, ValidationState>;\n  changeTemporaryState: PropertyChange<EditorController, TemporaryState>;\n  toggleDialog: { isOpened: boolean };\n  addElements: { elements: readonly Element[] };\n}\n\nexport class EditorController {\n  private readonly listener = new EventObserver();\n  private readonly source = new EventSource<EditorEvents>();\n  readonly events: Events<EditorEvents> = this.source;\n\n  readonly model: AsyncModel;\n  private readonly view: DiagramView;\n  private readonly options: EditorOptions;\n\n  private _metadataApi: MetadataApi | undefined;\n  private _authoringState = AuthoringState.empty;\n  private _validationState = ValidationState.empty;\n  private _temporaryState = TemporaryState.empty;\n  private _selection: readonly SelectionItem[] = [];\n\n  private dialogType: DialogTypes;\n  private dialogTarget: SelectionItem;\n\n  private readonly cancellation = new Cancellation();\n\n  constructor(props: EditorProps) {\n    const { model, view, ...options } = props;\n    this.model = model;\n    this.view = view;\n    this.options = options;\n\n    this.listener.listen(this.events, \"changeValidationState\", (e) => {\n      for (const element of this.model.elements) {\n        const previous = e.previous.elements.get(element.iri);\n        const current = this.validationState.elements.get(element.iri);\n        if (current !== previous) {\n          element.redraw();\n        }\n      }\n    });\n    this.listener.listen(this.events, \"changeAuthoringState\", (e) => {\n      if (this.options.validationApi) {\n        const changedElements = changedElementsToValidate(e.previous, this);\n        validateElements(\n          changedElements,\n          this.options.validationApi,\n          this,\n          this.cancellation.signal\n        );\n      }\n    });\n\n    this.view._setElementDecorator((element: Element) => (\n      <ElementDecorator\n        model={element}\n        view={this.view}\n        editor={this}\n        position={element.position}\n      />\n    ));\n  }\n\n  _initializePaperComponents(paperArea: PaperArea) {\n    this.listener.listen(paperArea.events, \"pointerUp\", (e) =>\n      this.onPaperPointerUp(e)\n    );\n    this.listener.listen(this.model.events, \"changeCells\", () =>\n      this.onCellsChanged()\n    );\n    this.listener.listen(this.model.events, \"elementEvent\", (e) => {\n      if (e.key === \"requestedGroupContent\") {\n        this.loadGroupContent(e.data.requestedGroupContent.source);\n      }\n    });\n\n    this.listener.listen(this.model.events, \"loadingStart\", () =>\n      this.setSpinner({})\n    );\n    this.listener.listen(this.model.events, \"loadingSuccess\", () => {\n      this.setSpinner(undefined);\n\n      const widget = <LinkStateWidget view={this.view} editor={this} />;\n      this.view.setPaperWidget({\n        key: \"states\",\n        widget,\n        attachment: WidgetAttachment.OverLinks,\n      });\n    });\n    this.listener.listen(this.model.events, \"loadingError\", ({ error }) => {\n      const statusText = error ? error.message : undefined;\n      this.setSpinner({ statusText, errorOccured: true });\n    });\n\n    if (!this.options.disableHalo) {\n      this.configureHalo();\n      document.addEventListener(\"keyup\", this.onKeyUp);\n      this.listener.listen(this.view.events, \"dispose\", () => {\n        document.removeEventListener(\"keyup\", this.onKeyUp);\n      });\n    }\n  }\n\n  get inAuthoringMode(): boolean {\n    return Boolean(this._metadataApi);\n  }\n\n  get metadataApi() {\n    return this._metadataApi;\n  }\n  setMetadataApi(value: MetadataApi) {\n    const previous = this._metadataApi;\n    if (value === previous) {\n      return;\n    }\n    this._metadataApi = value;\n    if (Boolean(value) !== Boolean(previous)) {\n      // authoring mode changed\n      this.source.trigger(\"changeMode\", { source: this });\n    }\n  }\n\n  get authoringState() {\n    return this._authoringState;\n  }\n  setAuthoringState(value: AuthoringState) {\n    const previous = this._authoringState;\n    if (previous === value) {\n      return;\n    }\n    this.model.history.execute(this.updateAuthoringState(value));\n  }\n\n  private updateAuthoringState(state: AuthoringState): Command {\n    const previous = this._authoringState;\n    return Command.create(\"Create or delete entities and links\", () => {\n      this._authoringState = state;\n      this.source.trigger(\"changeAuthoringState\", { source: this, previous });\n      return this.updateAuthoringState(previous);\n    });\n  }\n\n  get validationState() {\n    return this._validationState;\n  }\n  setValidationState(value: ValidationState) {\n    const previous = this._validationState;\n    if (value === previous) {\n      return;\n    }\n    this._validationState = value;\n    this.source.trigger(\"changeValidationState\", { source: this, previous });\n  }\n\n  get temporaryState() {\n    return this._temporaryState;\n  }\n  setTemporaryState(value: TemporaryState) {\n    const previous = this._temporaryState;\n    if (value === previous) {\n      return;\n    }\n    this._temporaryState = value;\n    this.source.trigger(\"changeTemporaryState\", { source: this, previous });\n  }\n\n  get selection() {\n    return this._selection;\n  }\n  setSelection(value: readonly SelectionItem[]) {\n    const previous = this._selection;\n    if (previous === value) {\n      return;\n    }\n    this._selection = value;\n    this.source.trigger(\"changeSelection\", { source: this, previous });\n  }\n\n  cancelSelection() {\n    this.setSelection([]);\n  }\n\n  private onKeyUp = (e: KeyboardEvent) => {\n    const DELETE_KEY_CODE = 46;\n    if (\n      e.keyCode === DELETE_KEY_CODE &&\n      document.activeElement.localName !== \"input\"\n    ) {\n      this.removeSelectedElements();\n    }\n  };\n\n  removeSelectedElements() {\n    const itemsToRemove = this.selection;\n    if (itemsToRemove.length === 0) {\n      return;\n    }\n\n    this.cancelSelection();\n    this.removeItems(itemsToRemove);\n  }\n\n  removeItems(items: readonly SelectionItem[]) {\n    const batch = this.model.history.startBatch();\n    const deletedElementIris = new Set<ElementIri>();\n\n    for (const item of items) {\n      if (item instanceof Element) {\n        const event = this.authoringState.elements.get(item.iri);\n        if (event) {\n          this.discardChange(event);\n        }\n        this.model.removeElement(item.id);\n        deletedElementIris.add(item.iri);\n      } else if (item instanceof Link) {\n        if (AuthoringState.isNewLink(this.authoringState, item.data)) {\n          this.deleteLink(item.data);\n        }\n      }\n    }\n\n    if (deletedElementIris.size > 0) {\n      const newState = AuthoringState.deleteNewLinksConnectedToElements(\n        this.authoringState,\n        deletedElementIris\n      );\n      this.setAuthoringState(newState);\n    }\n\n    batch.store();\n  }\n\n  private onPaperPointerUp(event: PointerUpEvent) {\n    if (this.options.disableHalo) {\n      return;\n    }\n    const { sourceEvent, target, triggerAsClick } = event;\n\n    if (sourceEvent.ctrlKey || sourceEvent.shiftKey || sourceEvent.metaKey) {\n      return;\n    }\n\n    if (this.dialogTarget && this.dialogType === DialogTypes.EditEntityForm) {\n      return;\n    }\n\n    if (target instanceof Element) {\n      this.setSelection([target]);\n      target.focus();\n    } else if (target instanceof Link) {\n      this.setSelection([target]);\n    } else if (target instanceof LinkVertex) {\n      this.setSelection([target.link]);\n    } else if (!target && triggerAsClick) {\n      this.setSelection([]);\n      this.hideDialog();\n      if (document.activeElement) {\n        (document.activeElement as HTMLElement).blur();\n      }\n    }\n  }\n\n  private onCellsChanged() {\n    if (this.selection.length === 0) {\n      return;\n    }\n    const newSelection = this.selection.filter((item) =>\n      item instanceof Element\n        ? this.model.getElement(item.id)\n        : item instanceof Link\n        ? this.model.getLinkById(item.id)\n        : false\n    );\n    if (newSelection.length < this.selection.length) {\n      this.setSelection(newSelection);\n    }\n  }\n\n  setSpinner(props: SpinnerProps | undefined) {\n    const widget = props ? <LoadingWidget spinnerProps={props} /> : undefined;\n    this.view.setPaperWidget({\n      key: LoadingWidget.Key,\n      widget,\n      attachment: WidgetAttachment.Viewport,\n    });\n  }\n\n  private configureHalo() {\n    if (this.options.disableHalo) {\n      return;\n    }\n\n    this.listener.listen(this.events, \"changeSelection\", () => {\n      const selected =\n        this.selection.length === 1 ? this.selection[0] : undefined;\n      if (this.dialogTarget && selected !== this.dialogTarget) {\n        this.hideDialog();\n      }\n      this.bringSelectedElementsToFront();\n      this.renderDefaultHalo();\n    });\n\n    this.listener.listen(\n      this.events,\n      \"toggleDialog\",\n      ({ isOpened: _isOpened }) => {\n        this.renderDefaultHalo();\n      }\n    );\n\n    this.renderDefaultHalo();\n  }\n\n  private bringSelectedElementsToFront() {\n    if (this.selection.length === 0) {\n      return;\n    }\n    this.model.reorderElements(\n      makeMoveComparator(\n        this.model.elements,\n        this.selection.filter((item) => item instanceof Element),\n        MoveDirection.ToEnd\n      )\n    );\n  }\n\n  private renderDefaultHalo() {\n    const selected =\n      this.selection.length === 1 ? this.selection[0] : undefined;\n\n    let halo: React.ReactElement<Halo | HaloLink>;\n\n    if (selected instanceof Element) {\n      halo = (\n        <Halo\n          editor={this}\n          metadataApi={this.metadataApi}\n          target={selected}\n          onRemove={() => this.removeSelectedElements()}\n          onExpand={() => {\n            this.model.history.execute(\n              setElementExpanded(selected, !selected.isExpanded)\n            );\n          }}\n          navigationMenuOpened={this.dialogType === DialogTypes.ConnectionsMenu}\n          onToggleNavigationMenu={() => {\n            if (\n              this.dialogTarget &&\n              this.dialogType === DialogTypes.ConnectionsMenu\n            ) {\n              this.hideDialog();\n            } else {\n              this.showConnectionsMenu(selected);\n            }\n            this.renderDefaultHalo();\n          }}\n          onAddToFilter={() => selected.addToFilter()}\n          onEstablishNewLink={(point: { x: number; y: number }) =>\n            this.startEditing({\n              target: selected,\n              mode: EditLayerMode.establishLink,\n              point,\n            })\n          }\n          onFollowLink={(element, e) =>\n            this.view.onIriClick(\n              element.iri,\n              element,\n              IriClickIntent.JumpToEntity,\n              e\n            )\n          }\n        />\n      );\n    } else if (selected instanceof Link) {\n      halo = (\n        <HaloLink\n          view={this.view}\n          editor={this}\n          metadataApi={this.metadataApi}\n          target={selected}\n          onEdit={() => this.showEditLinkForm(selected)}\n          onDelete={() => this.deleteLink(selected.data)}\n          onSourceMove={(point: { x: number; y: number }) =>\n            this.startEditing({\n              target: selected,\n              mode: EditLayerMode.moveLinkSource,\n              point,\n            })\n          }\n          onTargetMove={(point: { x: number; y: number }) =>\n            this.startEditing({\n              target: selected,\n              mode: EditLayerMode.moveLinkTarget,\n              point,\n            })\n          }\n          onEditLabel={() => this.showEditLinkLabelForm(selected)}\n        />\n      );\n    }\n\n    this.view.setPaperWidget({\n      key: \"halo\",\n      widget: halo,\n      attachment: WidgetAttachment.OverElements,\n    });\n  }\n\n  showConnectionsMenu(target: Element) {\n    const dialogType = DialogTypes.ConnectionsMenu;\n    const onClose = () => this.hideDialog();\n    const content = (\n      <ConnectionsMenu\n        view={this.view}\n        editor={this}\n        target={target}\n        onAddElements={(iris, linkType) =>\n          this.onAddElementsInConnectionMenu(iris, target, linkType)\n        }\n        onClose={onClose}\n        suggestProperties={this.options.suggestProperties}\n      />\n    );\n    this.showDialog({ target, dialogType, content, onClose });\n  }\n\n  showEditEntityForm(target: Element) {\n    const { propertyEditor } = this.options;\n    const dialogType = DialogTypes.EditEntityForm;\n    const onSubmit = (newData: ElementModel) => {\n      this.hideDialog();\n      this.changeEntityData(target.data.id, newData);\n    };\n    const isIriModified = AuthoringState.isElementWithModifiedIri(\n      this.authoringState,\n      target.data.id\n    );\n    let modelToEdit;\n    if (isIriModified) {\n      const relatedEvent = this.authoringState.elements.get(target.data.id);\n      modelToEdit = {\n        ...target.data,\n        id: (relatedEvent as ElementChange).newIri,\n      };\n    } else {\n      modelToEdit = target.data;\n    }\n    const onCancel = () => this.hideDialog();\n    const content = propertyEditor ? (\n      propertyEditor({ elementData: target.data, onSubmit, onCancel })\n    ) : (\n      <EditEntityForm\n        view={this.view}\n        entity={modelToEdit}\n        onApply={onSubmit}\n        onCancel={onCancel}\n      />\n    );\n    this.showDialog({ target, dialogType, content, onClose: onCancel });\n  }\n\n  showEditElementTypeForm({\n    link,\n    source,\n    target,\n    targetIsNew,\n  }: {\n    link: Link;\n    source: Element;\n    target: Element;\n    targetIsNew: boolean;\n  }) {\n    const dialogType = DialogTypes.EditEntityTypeForm;\n    const onCancel = () => {\n      this.removeTemporaryElement(target);\n      this.removeTemporaryLink(link);\n      this.hideDialog();\n    };\n    const content = (\n      <EditElementTypeForm\n        editor={this}\n        view={this.view}\n        metadataApi={this.metadataApi}\n        link={link.data}\n        source={source.data}\n        target={{ value: target.data, isNew: targetIsNew }}\n        onChangeElement={(data: ElementModel) => {\n          const previous = target.data;\n          this.setTemporaryState(\n            TemporaryState.deleteElement(this.temporaryState, previous)\n          );\n          target.setData(data);\n          this.setTemporaryState(\n            TemporaryState.addElement(this.temporaryState, data)\n          );\n        }}\n        onChangeLink={(data: LinkModel) => {\n          this.removeTemporaryLink(link);\n          const newLink = makeLinkWithDirection(\n            new Link({\n              typeId: data.linkTypeId,\n              sourceId: source.id,\n              targetId: target.id,\n              data: {\n                ...data,\n                sourceId: source.iri,\n                targetId: target.iri,\n              },\n            }),\n            data\n          );\n          link = this.createNewLink({ link: newLink, temporary: true });\n        }}\n        onApply={(\n          elementData: ElementModel,\n          isNewElement: boolean,\n          linkData: LinkModel\n        ) => {\n          this.removeTemporaryElement(target);\n          this.removeTemporaryLink(link);\n\n          const batch = this.model.history.startBatch(\n            isNewElement ? \"Create new entity\" : \"Link to entity\"\n          );\n\n          this.model.addElement(target);\n          if (isNewElement) {\n            target.setExpanded(true);\n            this.setAuthoringState(\n              AuthoringState.addElement(this._authoringState, target.data)\n            );\n          } else {\n            this.model.requestLinksOfType();\n          }\n\n          const newLink = makeLinkWithDirection(\n            new Link({\n              typeId: link.typeId,\n              sourceId: source.id,\n              targetId: target.id,\n              data: {\n                ...link.data,\n                sourceId: source.iri,\n                targetId: target.iri,\n              },\n            }),\n            linkData\n          );\n          this.createNewLink({ link: newLink });\n\n          batch.store();\n\n          this.hideDialog();\n          if (isNewElement) {\n            this.showEditEntityForm(target);\n          }\n        }}\n        onCancel={onCancel}\n      />\n    );\n    this.showDialog({\n      target,\n      dialogType,\n      content,\n      caption: \"Establish New Connection\",\n      onClose: onCancel,\n    });\n  }\n\n  showEditLinkForm(link: Link) {\n    const dialogType = DialogTypes.EditLinkForm;\n    const source = this.model.getElement(link.sourceId).data;\n    const target = this.model.getElement(link.targetId).data;\n    const onCancel = () => {\n      if (this.temporaryState.links.has(link.data)) {\n        this.removeTemporaryLink(link);\n      }\n      this.hideDialog();\n    };\n    const content = (\n      <EditLinkForm\n        editor={this}\n        view={this.view}\n        metadataApi={this.metadataApi}\n        link={link.data}\n        source={source}\n        target={target}\n        onChange={(data: LinkModel) => {\n          if (this.temporaryState.links.has(link.data)) {\n            this.removeTemporaryLink(link);\n            const newLink = makeLinkWithDirection(link, data);\n            this.showEditLinkForm(\n              this.createNewLink({ link: newLink, temporary: true })\n            );\n          }\n        }}\n        onApply={(data: LinkModel) => {\n          if (this.temporaryState.links.has(link.data)) {\n            this.removeTemporaryLink(link);\n            const newLink = makeLinkWithDirection(link, data);\n            this.createNewLink({ link: newLink });\n          } else {\n            this.changeLink(link.data, data);\n          }\n          this.hideDialog();\n        }}\n        onCancel={onCancel}\n      />\n    );\n    const caption = this.temporaryState.links.has(link.data)\n      ? \"Establish New Connection\"\n      : \"Edit Connection\";\n    this.showDialog({\n      target: link,\n      dialogType,\n      content,\n      size: { width: 300, height: 160 },\n      caption,\n      onClose: onCancel,\n    });\n  }\n\n  // Link editing implementation could be rethought in the future.\n  private showEditLinkLabelForm(link: Link) {\n    const linkType = this.view.model.getLinkType(link.typeId);\n    const template = this.view.createLinkTemplate(linkType);\n    const size = { width: 300, height: 145 };\n    const onCancel = () => this.hideDialog();\n    this.showDialog({\n      target: link,\n      dialogType: DialogTypes.EditLinkLabelForm,\n      content: (\n        <EditLinkLabelForm\n          view={this.view}\n          link={link}\n          onApply={(label: string) => {\n            template.setLinkLabel(link, label);\n            this.hideDialog();\n          }}\n          onCancel={onCancel}\n        />\n      ),\n      size,\n      caption: \"Edit Link Label\",\n      offset: { x: 25, y: -size.height / 2 },\n      calculatePosition: () => {\n        const { x, y, width, height } = link.labelBounds;\n        return { x: x + width, y: y + height / 2 };\n      },\n      onClose: onCancel,\n    });\n  }\n\n  showDialog(params: {\n    target: SelectionItem;\n    dialogType: DialogTypes;\n    content: React.ReactElement<any>;\n    size?: { width: number; height: number };\n    caption?: string;\n    offset?: Vector;\n    calculatePosition?: () => Vector;\n    onClose: () => void;\n  }) {\n    const {\n      target,\n      dialogType,\n      content,\n      size,\n      caption,\n      offset,\n      calculatePosition,\n      onClose,\n    } = params;\n\n    this.dialogTarget = target;\n    this.dialogType = dialogType;\n\n    const dialog = (\n      <Dialog\n        view={this.view}\n        target={target}\n        size={size}\n        caption={caption}\n        offset={offset}\n        calculatePosition={calculatePosition}\n        onClose={onClose}\n      >\n        {content}\n      </Dialog>\n    );\n    this.view.setPaperWidget({\n      key: \"dialog\",\n      widget: dialog,\n      attachment: WidgetAttachment.OverElements,\n    });\n    this.source.trigger(\"toggleDialog\", { isOpened: true });\n  }\n\n  hideDialog() {\n    if (this.dialogTarget) {\n      const isTemporaryElement =\n        this.dialogTarget instanceof Element &&\n        this.temporaryState.elements.has(this.dialogTarget.iri);\n      const isTemporaryLink =\n        this.dialogTarget instanceof Link &&\n        this.temporaryState.links.has(this.dialogTarget.data);\n      if (isTemporaryElement || isTemporaryLink) {\n        this.resetTemporaryState();\n      }\n      this.dialogType = undefined;\n      this.dialogTarget = undefined;\n      this.view.setPaperWidget({\n        key: \"dialog\",\n        widget: undefined,\n        attachment: WidgetAttachment.OverElements,\n      });\n      this.source.trigger(\"toggleDialog\", { isOpened: false });\n    }\n  }\n\n  onDragDrop(\n    dragged: readonly (ElementIri | ElementModel)[],\n    paperPosition: Vector\n  ) {\n    const batch = this.model.history.startBatch(\"Drag and drop onto diagram\");\n    const placedElements = placeElements(this.view, dragged, paperPosition);\n    const irisToLoad = placedElements.map((elem) => elem.iri);\n    batch.history.execute(requestElementData(this.model, irisToLoad));\n    batch.history.execute(restoreLinksBetweenElements(this.model));\n    batch.store();\n\n    if (placedElements.length > 0) {\n      placedElements[placedElements.length - 1].focus();\n    }\n\n    this.setSelection(placedElements);\n\n    this.source.trigger(\"addElements\", { elements: placedElements });\n  }\n\n  onAddElementsInConnectionMenu(\n    elementIris: ElementIri[],\n    targetElement: Element,\n    linkType: FatLinkType | undefined\n  ) {\n    const batch = this.view.model.history.startBatch();\n\n    const elements = elementIris.map((iri) => this.model.createElement(iri));\n    this.view.performSyncUpdate();\n\n    placeElementsAround({\n      model: this.model,\n      elements,\n      targetElement,\n      prefferedLinksLength: 300,\n    }).then(() => {\n      this.source.trigger(\"addElements\", { elements });\n    });\n\n    if (linkType && !linkType.visible) {\n      batch.history.execute(\n        changeLinkTypeVisibility({\n          linkType,\n          visible: true,\n          showLabel: true,\n          preventLoading: true,\n        })\n      );\n    }\n\n    batch.history.execute(requestElementData(this.model, elementIris));\n    batch.history.execute(restoreLinksBetweenElements(this.model));\n    batch.store();\n  }\n\n  private loadGroupContent(element: Element): Promise<void> {\n    return this.model.loadEmbeddedElements(element.iri).then((models) => {\n      const batch = this.model.history.startBatch();\n      const elementIris = Object.keys(models) as ElementIri[];\n      elementIris.map((key) =>\n        this.model.createElement(models[key], element.id)\n      );\n      batch.discard();\n\n      return Promise.all([\n        this.model.requestElementData(elementIris),\n        this.model.requestLinksOfType(),\n      ]).then(() => {\n        this.view.performSyncUpdate();\n        applyLayout(\n          this.model,\n          forceLayout({\n            model: this.model,\n            group: element.id,\n          })\n        );\n        this.model.triggerChangeGroupContent(element.id);\n      });\n    });\n  }\n\n  createNewEntity({\n    elementModel,\n    temporary,\n  }: {\n    elementModel: ElementModel;\n    temporary?: boolean;\n  }): Element {\n    const batch = this.model.history.startBatch(\"Create new entity\");\n\n    const element = this.model.createElement(elementModel);\n    element.setExpanded(true);\n\n    if (temporary) {\n      this.setTemporaryState(\n        TemporaryState.addElement(this.temporaryState, element.data)\n      );\n      batch.discard();\n    } else {\n      this.setAuthoringState(\n        AuthoringState.addElement(this._authoringState, element.data)\n      );\n      batch.store();\n    }\n    return element;\n  }\n\n  changeEntityData(targetIri: ElementIri, newData: ElementModel) {\n    const elements = this.model.elements.filter((el) => el.iri === targetIri);\n    if (elements.length === 0) {\n      return;\n    }\n    const oldData = elements[0].data;\n    const batch = this.model.history.startBatch(\"Edit entity\");\n\n    const newState = AuthoringState.changeElement(\n      this._authoringState,\n      oldData,\n      newData\n    );\n    // get created authoring event by either old or new IRI (in case of new entities)\n    const event =\n      newState.elements.get(targetIri) || newState.elements.get(newData.id);\n    this.model.history.execute(\n      setElementData(this.model, targetIri, event.after)\n    );\n    this.setAuthoringState(newState);\n\n    batch.store();\n  }\n\n  deleteEntity(elementIri: ElementIri) {\n    const state = this.authoringState;\n    const elements = this.model.elements.filter((el) => el.iri === elementIri);\n    if (elements.length === 0) {\n      return;\n    }\n\n    const batch = this.model.history.startBatch(\"Delete entity\");\n    const model = elements[0].data;\n\n    const event = state.elements.get(elementIri);\n    // remove new connected links\n    const linksToRemove = new Set<string>();\n    for (const element of elements) {\n      for (const link of element.links) {\n        if (link.data && AuthoringState.isNewLink(state, link.data)) {\n          linksToRemove.add(link.id);\n        }\n      }\n    }\n    linksToRemove.forEach((linkId) => this.model.removeLink(linkId));\n\n    if (event) {\n      this.discardChange(event);\n    }\n    this.setAuthoringState(AuthoringState.deleteElement(state, model));\n    batch.store();\n  }\n\n  createNewLink(params: { link: Link; temporary?: boolean }): Link {\n    const { link: base, temporary } = params;\n    const existingLink = this.model.findLink(\n      base.typeId,\n      base.sourceId,\n      base.targetId\n    );\n    if (existingLink) {\n      throw Error(\"The link already exists\");\n    }\n\n    const batch = this.model.history.startBatch(\"Create new link\");\n\n    const addedLink = this.model.addLink(base);\n    if (!temporary) {\n      this.model.createLinks(base.data);\n    }\n\n    const links = this.model.links.filter((link) =>\n      sameLink(link.data, base.data)\n    );\n    if (links.length > 0) {\n      if (temporary) {\n        this.setTemporaryState(\n          TemporaryState.addLink(this.temporaryState, base.data)\n        );\n        batch.discard();\n      } else {\n        this.setAuthoringState(\n          AuthoringState.addLink(this._authoringState, base.data)\n        );\n        batch.store();\n      }\n    } else {\n      batch.discard();\n    }\n\n    return addedLink;\n  }\n\n  changeLink(oldData: LinkModel, newData: LinkModel) {\n    const batch = this.model.history.startBatch(\"Change link\");\n    if (sameLink(oldData, newData)) {\n      this.model.history.execute(setLinkData(this.model, oldData, newData));\n      this.setAuthoringState(\n        AuthoringState.changeLink(this._authoringState, oldData, newData)\n      );\n    } else {\n      let newState = this._authoringState;\n      newState = AuthoringState.deleteLink(newState, oldData);\n      newState = AuthoringState.addLink(newState, newData);\n\n      if (AuthoringState.isNewLink(this._authoringState, oldData)) {\n        this.model.links\n          .filter((link) => sameLink(link.data, oldData))\n          .forEach((link) => this.model.removeLink(link.id));\n      }\n      this.model.createLinks(newData);\n      this.setAuthoringState(newState);\n    }\n    batch.store();\n  }\n\n  moveLinkSource(params: { link: Link; newSource: Element }): Link {\n    const { link, newSource } = params;\n    const batch = this.model.history.startBatch(\"Move link to another element\");\n    this.changeLink(link.data, { ...link.data, sourceId: newSource.iri });\n    const newLink = this.model.findLink(\n      link.typeId,\n      newSource.id,\n      link.targetId\n    );\n    newLink.setVertices(link.vertices);\n    batch.store();\n    return newLink;\n  }\n\n  moveLinkTarget(params: { link: Link; newTarget: Element }): Link {\n    const { link, newTarget } = params;\n    const batch = this.model.history.startBatch(\"Move link to another element\");\n    this.changeLink(link.data, { ...link.data, targetId: newTarget.iri });\n    const newLink = this.model.findLink(\n      link.typeId,\n      link.sourceId,\n      newTarget.id\n    );\n    newLink.setVertices(link.vertices);\n    batch.store();\n    return newLink;\n  }\n\n  deleteLink(model: LinkModel) {\n    const state = this.authoringState;\n    if (AuthoringState.isDeletedLink(state, model)) {\n      return;\n    }\n    const batch = this.model.history.startBatch(\"Delete link\");\n    const newState = AuthoringState.deleteLink(state, model);\n    if (AuthoringState.isNewLink(state, model)) {\n      this.model.links\n        .filter(({ data }) => sameLink(data, model))\n        .forEach((link) => this.model.removeLink(link.id));\n    }\n    this.setAuthoringState(newState);\n    batch.store();\n  }\n\n  private startEditing(params: {\n    target: Element | Link;\n    mode: EditLayerMode;\n    point: Vector;\n  }) {\n    const { target, mode, point } = params;\n    const onFinishEditing = () => {\n      this.view.setPaperWidget({\n        key: \"editLayer\",\n        widget: undefined,\n        attachment: WidgetAttachment.OverElements,\n      });\n    };\n    const editLayer = (\n      <EditLayer\n        view={this.view}\n        editor={this}\n        metadataApi={this.metadataApi}\n        mode={mode}\n        target={target}\n        point={point}\n        onFinishEditing={onFinishEditing}\n      />\n    );\n    this.view.setPaperWidget({\n      key: \"editLayer\",\n      widget: editLayer,\n      attachment: WidgetAttachment.OverElements,\n    });\n  }\n\n  private resetTemporaryState() {\n    if (this.temporaryState.elements.size) {\n      this.model.elements.forEach((element) => {\n        if (this.temporaryState.elements.has(element.iri)) {\n          this.removeTemporaryElement(element);\n        }\n      });\n    }\n    if (this.temporaryState.links.size) {\n      this.model.links.forEach((link) => {\n        if (this.temporaryState.links.get(link.data)) {\n          this.removeTemporaryLink(link);\n        }\n      });\n    }\n  }\n\n  private removeTemporaryElement(element: Element) {\n    const batch = this.model.history.startBatch();\n    this.model.removeElement(element.id);\n    batch.discard();\n    this.setTemporaryState(\n      TemporaryState.deleteElement(this.temporaryState, element.data)\n    );\n  }\n\n  private removeTemporaryLink(link: Link) {\n    this.model.removeLink(link.id);\n    this.setTemporaryState(\n      TemporaryState.deleteLink(this.temporaryState, link.data)\n    );\n  }\n\n  discardChange(event: AuthoringEvent) {\n    const newState = AuthoringState.discard(this._authoringState, event);\n    if (newState === this._authoringState) {\n      return;\n    }\n\n    const batch = this.model.history.startBatch(\"Discard change\");\n    if (event.type === AuthoringKind.ChangeElement) {\n      if (event.deleted) {\n        /* nothing */\n      } else if (event.before) {\n        this.model.history.execute(\n          setElementData(this.model, event.after.id, event.before)\n        );\n      } else {\n        this.model.elements\n          .filter((el) => el.iri === event.after.id)\n          .forEach((el) => this.model.removeElement(el.id));\n      }\n    } else if (event.type === AuthoringKind.ChangeLink) {\n      if (event.deleted) {\n        /* nothing */\n      } else if (event.before) {\n        this.model.history.execute(\n          setLinkData(this.model, event.after, event.before)\n        );\n      } else {\n        this.model.links\n          .filter(({ data }) => sameLink(data, event.after))\n          .forEach((link) => this.model.removeLink(link.id));\n      }\n    }\n    this.setAuthoringState(newState);\n    batch.store();\n  }\n}\n\ninterface LoadingWidgetProps extends PaperWidgetProps {\n  spinnerProps: Partial<SpinnerProps>;\n}\n\nclass LoadingWidget extends React.Component<LoadingWidgetProps, {}> {\n  static readonly Key = \"loadingWidget\";\n\n  render() {\n    const { spinnerProps, paperArea } = this.props;\n    const areaMetrics = paperArea.getAreaMetrics();\n    const paneWidth = areaMetrics.clientWidth;\n    const paneHeight = areaMetrics.clientHeight;\n\n    const x = spinnerProps.statusText ? paneWidth / 3 : paneWidth / 2;\n    const position = { x, y: paneHeight / 2 };\n    return (\n      <div className=\"graph-explorer-loading-widget\">\n        <svg width={paneWidth} height={paneHeight}>\n          <Spinner position={position} {...spinnerProps} />\n        </svg>\n      </div>\n    );\n  }\n}\n\nfunction placeElements(\n  view: DiagramView,\n  dragged: readonly (ElementIri | ElementModel)[],\n  position: Vector\n): Element[] {\n  const elements = dragged.map((item) => view.model.createElement(item));\n  for (const element of elements) {\n    // intialally anchor element at top left corner to preserve canvas scroll state,\n    // measure it and only then move to center-anchored position\n    element.setPosition(position);\n  }\n  view.performSyncUpdate();\n\n  let { x, y } = position;\n  let isFirst = true;\n  for (const element of elements) {\n    let { width, height } = boundsOf(element);\n    if (width === 0) {\n      width = 100;\n    }\n    if (height === 0) {\n      height = 50;\n    }\n\n    if (isFirst) {\n      isFirst = false;\n      x -= width / 2;\n      y -= height / 2;\n    }\n\n    element.setPosition({ x, y });\n    y += height + 20;\n  }\n\n  return elements;\n}\n\nfunction makeLinkWithDirection(original: Link, data: LinkModel): Link {\n  if (\n    !(\n      data.sourceId === original.data.sourceId ||\n      data.sourceId === original.data.targetId\n    )\n  ) {\n    throw new Error(\"New link source IRI is unrelated to original link\");\n  }\n  if (\n    !(\n      data.targetId === original.data.sourceId ||\n      data.targetId === original.data.targetId\n    )\n  ) {\n    throw new Error(\"New link target IRI is unrelated to original link\");\n  }\n  const sourceId =\n    data.sourceId === original.data.sourceId\n      ? original.sourceId\n      : original.targetId;\n  const targetId =\n    data.targetId === original.data.targetId\n      ? original.targetId\n      : original.sourceId;\n  return new Link({ typeId: data.linkTypeId, sourceId, targetId, data });\n}\n","import * as React from \"react\";\n\nimport { WorkspaceLanguage } from \"./workspace\";\n\nexport interface ToolbarProps {\n  canSaveDiagram?: boolean;\n  onSaveDiagram?: () => void;\n  canPersistChanges?: boolean;\n  onPersistChanges?: () => void;\n  onForceLayout?: () => void;\n  onClearAll?: () => void;\n  onZoomIn?: () => void;\n  onZoomOut?: () => void;\n  onZoomToFit?: () => void;\n  onExportSVG?: (fileName?: string) => void;\n  onExportPNG?: (fileName?: string) => void;\n  onPrint?: () => void;\n  languages?: readonly WorkspaceLanguage[];\n  selectedLanguage?: string;\n  onChangeLanguage?: (language: string) => void;\n  hidePanels?: boolean;\n}\n\ninterface ToolbarState {\n  clearAllArmed?: boolean;\n}\n\nconst CLASS_NAME = \"graph-explorer-toolbar\";\n// how long the \"Clear All\" confirmation stays armed before reverting on its own\nconst CLEAR_ALL_ARM_TIMEOUT = 4000;\n\nexport class DefaultToolbar extends React.Component<ToolbarProps, ToolbarState> {\n  state: ToolbarState = {};\n  private clearAllTimeout: ReturnType<typeof setTimeout> | undefined;\n\n  componentWillUnmount() {\n    this.clearClearAllTimeout();\n  }\n\n  private clearClearAllTimeout() {\n    if (this.clearAllTimeout !== undefined) {\n      clearTimeout(this.clearAllTimeout);\n      this.clearAllTimeout = undefined;\n    }\n  }\n\n  private onClearAllClick = () => {\n    if (this.state.clearAllArmed) {\n      this.clearClearAllTimeout();\n      this.setState({ clearAllArmed: false });\n      this.props.onClearAll();\n    } else {\n      this.clearClearAllTimeout();\n      this.clearAllTimeout = setTimeout(() => {\n        this.setState({ clearAllArmed: false });\n      }, CLEAR_ALL_ARM_TIMEOUT);\n      this.setState({ clearAllArmed: true });\n    }\n  };\n\n  private onChangeLanguage = (\n    event: React.SyntheticEvent<HTMLSelectElement>\n  ) => {\n    const value = event.currentTarget.value;\n    this.props.onChangeLanguage(value);\n  };\n\n  private onExportSVG = () => {\n    this.props.onExportSVG();\n  };\n\n  private onExportPNG = () => {\n    this.props.onExportPNG();\n  };\n\n  private renderSaveDiagramButton() {\n    if (!this.props.onSaveDiagram) {\n      return null;\n    }\n    return (\n      <button\n        type=\"button\"\n        className=\"saveDiagramButton graph-explorer-btn graph-explorer-btn-primary\"\n        disabled={this.props.canSaveDiagram === false}\n        onClick={this.props.onSaveDiagram}\n      >\n        <span className=\"fa fa-floppy-o\" aria-hidden=\"true\" /> Save diagram\n      </button>\n    );\n  }\n\n  private renderPersistAuthoredChangesButton() {\n    if (!this.props.onPersistChanges) {\n      return null;\n    }\n    return (\n      <button\n        type=\"button\"\n        className=\"saveDiagramButton graph-explorer-btn graph-explorer-btn-success\"\n        disabled={this.props.canPersistChanges === false}\n        onClick={this.props.onPersistChanges}\n      >\n        <span className=\"fa fa-floppy-o\" aria-hidden=\"true\" /> Save data\n      </button>\n    );\n  }\n\n  private renderLanguages() {\n    const { selectedLanguage, languages } = this.props;\n    if (languages.length <= 1) {\n      return null;\n    }\n\n    return (\n      <span\n        className={`graph-explorer-btn-group ${CLASS_NAME}__language-selector`}\n      >\n        <label className=\"graph-explorer-label\">\n          <span>Data Language</span>\n        </label>\n        <select value={selectedLanguage} onChange={this.onChangeLanguage}>\n          {languages.map(({ code, label }) => (\n            <option key={code} value={code}>\n              {label}\n            </option>\n          ))}\n        </select>\n      </span>\n    );\n  }\n\n  render() {\n    return (\n      <div className={CLASS_NAME}>\n        <div className=\"graph-explorer-btn-group graph-explorer-btn-group-sm\">\n          {this.renderSaveDiagramButton()}\n          {this.renderPersistAuthoredChangesButton()}\n          {this.props.onClearAll ? (\n            <button\n              type=\"button\"\n              className={\n                this.state.clearAllArmed\n                  ? \"graph-explorer-btn graph-explorer-btn-danger\"\n                  : \"graph-explorer-btn graph-explorer-btn-default\"\n              }\n              title={\n                this.state.clearAllArmed\n                  ? \"Click again to confirm\"\n                  : \"Clear All\"\n              }\n              onClick={this.onClearAllClick}\n              onBlur={() => this.setState({ clearAllArmed: false })}\n            >\n              <span className=\"fa fa-trash\" aria-hidden=\"true\" />\n              &nbsp;{this.state.clearAllArmed ? \"Are you sure?\" : \"Clear All\"}\n            </button>\n          ) : null}\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Force layout\"\n            onClick={this.props.onForceLayout}\n          >\n            <span className=\"fa fa-sitemap\" aria-hidden=\"true\" /> Layout\n          </button>\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Zoom In\"\n            onClick={this.props.onZoomIn}\n          >\n            <span className=\"fa fa-search-plus\" aria-hidden=\"true\" />\n          </button>\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Zoom Out\"\n            onClick={this.props.onZoomOut}\n          >\n            <span className=\"fa fa-search-minus\" aria-hidden=\"true\" />\n          </button>\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Fit to Screen\"\n            onClick={this.props.onZoomToFit}\n          >\n            <span className=\"fa fa-arrows-alt\" aria-hidden=\"true\" />\n          </button>\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Export diagram as PNG\"\n            onClick={this.onExportPNG}\n          >\n            <span className=\"fa fa-picture-o\" aria-hidden=\"true\" /> PNG\n          </button>\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Export diagram as SVG\"\n            onClick={this.onExportSVG}\n          >\n            <span className=\"fa fa-picture-o\" aria-hidden=\"true\" /> SVG\n          </button>\n          <button\n            type=\"button\"\n            className=\"graph-explorer-btn graph-explorer-btn-default\"\n            title=\"Print diagram\"\n            onClick={this.props.onPrint}\n          >\n            <span className=\"fa fa-print\" aria-hidden=\"true\" />\n          </button>\n          {this.renderLanguages()}\n        </div>\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\nimport { hcl } from \"d3-color\";\n\nimport { Element } from \"../diagram/elements\";\nimport { DiagramView } from \"../diagram/view\";\nimport { PaperWidgetProps } from \"../diagram/paperArea\";\n\nimport { Debouncer } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport {\n  PaperTransform,\n  totalPaneSize,\n  paneTopLeft,\n  paneFromPaperCoords,\n  paperFromPaneCoords,\n} from \"../diagram/paper\";\nimport { Vector } from \"../diagram/geometry\";\n\nexport interface NavigatorProps extends PaperWidgetProps {\n  view: DiagramView;\n  width?: number;\n  height?: number;\n  scalePadding?: number;\n  expanded?: boolean;\n}\n\ninterface NavigatorTransform {\n  scale: number;\n  canvasOffset: Vector;\n  paneOffset: Vector;\n}\n\nconst CLASS_NAME = \"graph-explorer-navigator\";\nconst MIN_SCALE = 0.25;\n\ninterface State {\n  expanded?: boolean;\n}\n\nexport class Navigator extends React.Component<NavigatorProps, State> {\n  static defaultProps: Partial<NavigatorProps> = {\n    width: 300,\n    height: 160,\n    scalePadding: 0.2,\n    expanded: true,\n  };\n\n  private readonly delayedRedraw = new Debouncer();\n  private readonly listener = new EventObserver();\n  private canvas: HTMLCanvasElement;\n\n  private transform: NavigatorTransform;\n  private isDraggingViewport: boolean;\n\n  constructor(props: NavigatorProps, context: any) {\n    super(props, context);\n    this.state = { expanded: this.props.expanded };\n  }\n\n  componentDidMount() {\n    const { view, paperArea } = this.props;\n    this.listener.listen(view.events, \"changeHighlight\", this.scheduleRedraw);\n    this.listener.listen(view.model.events, \"changeCells\", this.scheduleRedraw);\n    this.listener.listen(\n      view.model.events,\n      \"elementEvent\",\n      this.scheduleRedraw\n    );\n    this.listener.listen(paperArea.events, \"pointerMove\", this.scheduleRedraw);\n    this.listener.listen(paperArea.events, \"scroll\", this.scheduleRedraw);\n  }\n\n  shouldComponentUpdate(nextProps: NavigatorProps, nextState: State) {\n    return nextState !== this.state;\n  }\n\n  componentWillUnmount() {\n    this.delayedRedraw.dispose();\n    this.listener.stopListening();\n    this.stopDraggingViewport();\n  }\n\n  private scheduleRedraw = () => {\n    if (this.state.expanded) {\n      this.delayedRedraw.call(this.draw);\n    }\n  };\n\n  private draw = () => {\n    const { paperTransform: pt, width, height } = this.props;\n\n    this.calculateTransform();\n\n    const ctx = this.canvas.getContext(\"2d\");\n    ctx.fillStyle = \"#EEEEEE\";\n    ctx.clearRect(0, 0, width, height);\n    ctx.fillRect(0, 0, width, height);\n\n    const paneStart = paneTopLeft(pt);\n    const paneSize = totalPaneSize(pt);\n    const paneEnd = {\n      x: paneStart.x + paneSize.x,\n      y: paneStart.y + paneSize.y,\n    };\n\n    const start = canvasFromPaneCoords(paneStart, pt, this.transform);\n    const end = canvasFromPaneCoords(paneEnd, pt, this.transform);\n    ctx.fillStyle = \"white\";\n    ctx.fillRect(start.x, start.y, end.x - start.x, end.y - start.y);\n\n    ctx.save();\n\n    this.drawElements(ctx);\n    this.drawViewport(ctx);\n\n    ctx.restore();\n  };\n\n  private drawElements(ctx: CanvasRenderingContext2D) {\n    const { view, paperTransform: pt } = this.props;\n    view.model.elements.forEach((element) => {\n      const { position, size } = element;\n      ctx.fillStyle = this.chooseElementColor(element);\n\n      const { x: x1, y: y1 } = canvasFromPaperCoords(\n        position,\n        pt,\n        this.transform\n      );\n      const { x: x2, y: y2 } = canvasFromPaperCoords(\n        {\n          x: position.x + size.width,\n          y: position.y + size.height,\n        },\n        pt,\n        this.transform\n      );\n\n      ctx.fillRect(x1, y1, x2 - x1, y2 - y1);\n    });\n  }\n\n  private chooseElementColor(element: Element): string {\n    const { view } = this.props;\n    const isBlurred = view.highlighter && !view.highlighter(element);\n    if (isBlurred) {\n      return \"lightgray\";\n    }\n    const {\n      color: { h, c, l },\n    } = view.getTypeStyle(element.data.types);\n    return hcl(h, c, l).toString();\n  }\n\n  private drawViewport(ctx: CanvasRenderingContext2D) {\n    const { paperArea, paperTransform: pt, width, height } = this.props;\n\n    ctx.strokeStyle = \"#337ab7\";\n    ctx.lineWidth = 2;\n\n    const { clientWidth, clientHeight } = paperArea.getAreaMetrics();\n    const viewportStart = paperArea.clientToScrollablePaneCoords(0, 0);\n    const viewportEnd = paperArea.clientToScrollablePaneCoords(\n      clientWidth,\n      clientHeight\n    );\n\n    const { x: x1, y: y1 } = canvasFromPaneCoords(\n      viewportStart,\n      pt,\n      this.transform\n    );\n    const { x: x2, y: y2 } = canvasFromPaneCoords(\n      viewportEnd,\n      pt,\n      this.transform\n    );\n\n    // draw visible viewport rectangle\n    ctx.strokeRect(x1, y1, x2 - x1, y2 - y1);\n\n    // draw \"out of area\" viewport borders\n    ctx.beginPath();\n    if (x1 < 0) {\n      ctx.moveTo(0, y1);\n      ctx.lineTo(0, y2);\n    }\n    if (y1 < 0) {\n      ctx.moveTo(x1, 0);\n      ctx.lineTo(x2, 0);\n    }\n    if (x2 > width) {\n      ctx.moveTo(width, y1);\n      ctx.lineTo(width, y2);\n    }\n    if (y2 > height) {\n      ctx.moveTo(x1, height);\n      ctx.lineTo(x2, height);\n    }\n\n    ctx.lineWidth = 4;\n    ctx.strokeStyle = \"#a0d2ff\";\n    ctx.setLineDash([5, 5]);\n    ctx.stroke();\n  }\n\n  private calculateTransform() {\n    const {\n      paperArea,\n      paperTransform: pt,\n      width,\n      height,\n      scalePadding,\n    } = this.props;\n\n    const box = paperArea.getContentFittingBox();\n    const displayPadding: Vector = {\n      x: Math.max(box.width, width / MIN_SCALE) * scalePadding,\n      y: Math.max(box.height, height / MIN_SCALE) * scalePadding,\n    };\n    const displayStart = paneFromPaperCoords(\n      {\n        x: box.x - displayPadding.x,\n        y: box.y - displayPadding.y,\n      },\n      pt\n    );\n    const displayEnd = paneFromPaperCoords(\n      {\n        x: box.x + box.width + displayPadding.x,\n        y: box.y + box.height + displayPadding.y,\n      },\n      pt\n    );\n    const displaySize: Vector = {\n      x: displayEnd.x - displayStart.x,\n      y: displayEnd.y - displayStart.y,\n    };\n\n    const scale = Math.min(width / displaySize.x, height / displaySize.y);\n    const canvasOffset: Vector = {\n      x: (width - displaySize.x * scale) / 2,\n      y: (height - displaySize.y * scale) / 2,\n    };\n    this.transform = { scale, canvasOffset, paneOffset: displayStart };\n  }\n\n  private canvasFromPageCoords(pageX: number, pageY: number): Vector {\n    const { top, left } = this.canvas.getBoundingClientRect();\n    return {\n      x: pageX - left - window.pageXOffset,\n      y: pageY - top - window.pageYOffset,\n    };\n  }\n\n  render() {\n    const { width, height } = this.props;\n    const { expanded } = this.state;\n    return (\n      <div\n        className={`${CLASS_NAME} ${CLASS_NAME}--${\n          expanded ? \"expanded\" : \"collapsed\"\n        }`}\n        style={expanded ? { width, height } : undefined}\n      >\n        <canvas\n          ref={(canvas) => {\n            this.canvas = canvas;\n          }}\n          width={width}\n          height={height}\n          onMouseDown={(e) => {\n            this.startDragginViewport();\n            this.onDragViewport(e);\n          }}\n          onWheel={this.onWheel}\n        />\n        <button\n          className={`${CLASS_NAME}__toggle`}\n          title={expanded ? \"Collapse navigator\" : \"Expand navigator\"}\n          onClick={this.onToggleClick}\n        >\n          <div className={`${CLASS_NAME}__toggle-icon`} />\n        </button>\n      </div>\n    );\n  }\n\n  private startDragginViewport() {\n    if (!this.isDraggingViewport) {\n      this.isDraggingViewport = true;\n      document.addEventListener(\"mousemove\", this.onDragViewport);\n      document.addEventListener(\"mouseup\", this.onMouseUp);\n    }\n  }\n\n  private stopDraggingViewport() {\n    if (this.isDraggingViewport) {\n      this.isDraggingViewport = false;\n      document.removeEventListener(\"mousemove\", this.onDragViewport);\n      document.removeEventListener(\"mouseup\", this.onMouseUp);\n    }\n  }\n\n  private onDragViewport = (e: MouseEvent | React.MouseEvent<{}>) => {\n    e.preventDefault();\n    if (this.isDraggingViewport) {\n      const canvas = this.canvasFromPageCoords(e.pageX, e.pageY);\n      const paper = paperFromCanvasCoords(\n        canvas,\n        this.props.paperTransform,\n        this.transform\n      );\n      this.props.paperArea.centerTo(paper);\n    }\n  };\n\n  private onMouseUp = () => {\n    this.stopDraggingViewport();\n  };\n\n  private onWheel = (e: React.WheelEvent<{}>) => {\n    e.preventDefault();\n    const delta = Math.max(-1, Math.min(1, e.deltaY || e.deltaX));\n    this.props.paperArea.zoomBy(-delta * 0.1);\n  };\n\n  private onToggleClick = () => {\n    this.setState(\n      (state): State => ({ expanded: !state.expanded }),\n      this.scheduleRedraw\n    );\n  };\n}\n\nfunction canvasFromPaneCoords(\n  pane: Vector,\n  pt: PaperTransform,\n  nt: NavigatorTransform\n): Vector {\n  return {\n    x: nt.canvasOffset.x + (pane.x - nt.paneOffset.x) * nt.scale,\n    y: nt.canvasOffset.y + (pane.y - nt.paneOffset.y) * nt.scale,\n  };\n}\n\nfunction canvasFromPaperCoords(\n  paper: Vector,\n  pt: PaperTransform,\n  nt: NavigatorTransform\n): Vector {\n  const pane = paneFromPaperCoords(paper, pt);\n  return canvasFromPaneCoords(pane, pt, nt);\n}\n\nfunction paperFromCanvasCoords(\n  canvas: Vector,\n  pt: PaperTransform,\n  nt: NavigatorTransform\n): Vector {\n  const pane = {\n    x: nt.paneOffset.x + (canvas.x - nt.canvasOffset.x) / nt.scale,\n    y: nt.paneOffset.y + (canvas.y - nt.canvasOffset.y) / nt.scale,\n  };\n  return paperFromPaneCoords(pane, pt);\n}\n","import { FatClassModel } from \"../../diagram/elements\";\n\nexport interface TreeNode {\n  model: FatClassModel;\n  label: string;\n  derived: readonly TreeNode[];\n}\n\nexport const TreeNode = {\n  setDerived: (node: TreeNode, derived: readonly TreeNode[]): TreeNode => ({\n    ...node,\n    derived,\n  }),\n};\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewbox='0%200%20128%20128'%3e%3cellipse%20stroke='%23000'%20ry='60'%20rx='60'%20cy='64'%20cx='64'%20stroke-width='5'%20fill='none'/%3e%3cline%20y2='63.4375'%20x2='104.5'%20y1='63.4375'%20x1='22.5'%20stroke-width='5'%20stroke='%23000'%20fill='none'/%3e%3cline%20y2='102.444349'%20x2='63.5'%20y1='29.4375'%20x1='63.5'%20stroke-width='5'%20stroke='%23000'%20fill='none'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewbox='0%200%20128%20128'%3e%3cellipse%20stroke='%23000'%20ry='60'%20rx='60'%20cy='64'%20cx='64'%20stroke-width='5'%20fill='none'/%3e%3cline%20y2='63.4375'%20x2='104.5'%20y1='63.4375'%20x1='22.5'%20stroke-width='5'%20stroke='%23000'%20fill='none'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3csvg%20xmlns:svg='http://www.w3.org/2000/svg'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'%20xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'%20width='128'%20height='128'%20viewbox='0%200%20128%20128'%20version='1.1'%20id='svg4507'%20sodipodi:docname='tree-leaf.svg'%20inkscape:version='0.92.1%20r15371'%3e%3cdefs%20id='defs4511'%20/%3e%3csodipodi:namedview%20pagecolor='%23ffffff'%20bordercolor='%23666666'%20borderopacity='1'%20objecttolerance='10'%20gridtolerance='10'%20guidetolerance='10'%20inkscape:pageopacity='0'%20inkscape:pageshadow='2'%20inkscape:window-width='1920'%20inkscape:window-height='1017'%20id='namedview4509'%20showgrid='false'%20inkscape:zoom='0.90509668'%20inkscape:cx='-272.6847'%20inkscape:cy='-5.8596487'%20inkscape:window-x='-8'%20inkscape:window-y='-8'%20inkscape:window-maximized='1'%20inkscape:current-layer='svg4507'%20/%3e%3cg%20id='g4505'%3e%3ccircle%20id='svg_1'%20cy='64'%20cx='64'%20stroke-opacity='null'%20style='fill:none;stroke:%231573b0;stroke-width:5'%20r='60'%20/%3e%3ccircle%20id='svg_3'%20cy='64'%20cx='64'%20stroke-opacity='null'%20style='fill:%231573b0;stroke:%231573b0;stroke-width:5.71026325'%20r='37'%20/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3csvg%20xmlns:svg='http://www.w3.org/2000/svg'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'%20xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'%20width='128'%20height='128'%20viewbox='0%200%20128%20128'%20version='1.1'%20id='svg5088'%20sodipodi:docname='tree-leaf-folder.svg'%20inkscape:version='0.92.1%20r15371'%3e%3cdefs%20id='defs5092'%20/%3e%3csodipodi:namedview%20pagecolor='%23ffffff'%20bordercolor='%23666666'%20borderopacity='1'%20objecttolerance='10'%20gridtolerance='10'%20guidetolerance='10'%20inkscape:pageopacity='0'%20inkscape:pageshadow='2'%20inkscape:window-width='1920'%20inkscape:window-height='1017'%20id='namedview5090'%20showgrid='false'%20inkscape:zoom='2.6074563'%20inkscape:cx='128.74614'%20inkscape:cy='30.905472'%20inkscape:window-x='-8'%20inkscape:window-y='-8'%20inkscape:window-maximized='1'%20inkscape:current-layer='svg5088'%20/%3e%3cg%20id='g5086'%3e%3ccircle%20id='svg_1'%20cy='64'%20cx='64'%20style='fill:none;stroke:%231573b0;stroke-width:5'%20r='60'%20/%3e%3ccircle%20id='svg_3'%20cy='64'%20cx='64'%20stroke-opacity='null'%20style='fill:%231573b0;stroke:%231573b0;stroke-width:5'%20r='37'%20/%3e%3cpath%20id='svg_5'%20d='m%20127.2258,86.546643%20c%20-0.0105,-5.971065%20-4.72314,-10.809034%20-10.54009,-10.817147%20v%20-0.0027%20H%2084.380152%20c%20-1.33102,-4.386353%20-5.300357,-7.593637%20-10.028771,-7.60175%20h%20-7.577587%20c%20-5.819586,0.0054%20-10.534822,4.846082%20-10.545365,10.817147%20v%2038.368417%20c%200.01054,5.96565%204.725778,10.80362%2010.545365,10.81444%20h%2049.914556%20c%205.81167,-0.0108%2010.52955,-4.84879%2010.54009,-10.81444%20V%2086.546643%20Z'%20inkscape:connector-curvature='0'%20style='fill:%230f5376'%20sodipodi:nodetypes='ccccccccccccc'%20/%3e%3c/g%3e%3c/svg%3e\"","import * as React from \"react\";\n\nimport { ElementTypeIri } from \"../../data/model\";\nimport { DiagramView } from \"../../diagram/view\";\nimport { highlightSubstring } from \"../listElementView\";\n\nimport { TreeNode } from \"./treeModel\";\n\nimport EXPAND_ICON from \"../../../../images/tree/expand-toggle.svg\";\nimport COLLAPSE_ICON from \"../../../../images/tree/collapse-toggle.svg\";\nimport DEFAULT_LEAF_ICON from \"../../../../images/tree/leaf-default.svg\";\nimport DEFAULT_PARENT_ICON from \"../../../../images/tree/leaf-folder.svg\";\n\ninterface CommonProps {\n  view: DiagramView;\n  searchText?: string;\n  selectedNode?: TreeNode;\n  onSelect: (node: TreeNode) => void;\n  creatableClasses: ReadonlyMap<ElementTypeIri, boolean>;\n  onClickCreate: (node: TreeNode) => void;\n  onDragCreate: (node: TreeNode) => void;\n}\n\nexport interface LeafProps extends CommonProps {\n  node: TreeNode;\n}\n\ninterface State {\n  expanded?: boolean;\n}\n\nconst LEAF_CLASS = \"graph-explorer-class-leaf\";\n\nexport class Leaf extends React.Component<LeafProps, State> {\n  constructor(props: LeafProps) {\n    super(props);\n    this.state = {\n      expanded: Boolean(this.props.searchText),\n    };\n  }\n\n  componentDidUpdate(nextProps: LeafProps) {\n    if (this.props.searchText !== nextProps.searchText) {\n      this.setState({\n        expanded: Boolean(nextProps.searchText),\n      });\n    }\n  }\n\n  render() {\n    const { node, ...otherProps } = this.props;\n    const { view, selectedNode, searchText, creatableClasses } = otherProps;\n    const { expanded } = this.state;\n\n    let toggleIcon: string | undefined;\n    if (node.derived.length > 0) {\n      toggleIcon = expanded ? COLLAPSE_ICON : EXPAND_ICON;\n    }\n\n    let { icon } = view.getTypeStyle([node.model.id]);\n    if (!icon) {\n      icon =\n        node.derived.length === 0 ? DEFAULT_LEAF_ICON : DEFAULT_PARENT_ICON;\n    }\n\n    let bodyClass = `${LEAF_CLASS}__body`;\n    if (selectedNode && selectedNode.model === node.model) {\n      bodyClass += ` ${LEAF_CLASS}__body--selected`;\n    }\n\n    const label = highlightSubstring(node.label, searchText, {\n      className: `${LEAF_CLASS}__highlighted-term`,\n    });\n\n    return (\n      <div className={LEAF_CLASS} role=\"tree-item\">\n        <div className={`${LEAF_CLASS}__row`}>\n          <div\n            className={`${LEAF_CLASS}__toggle`}\n            onClick={this.toggle}\n            role=\"button\"\n          >\n            {toggleIcon ? (\n              <img className={`${LEAF_CLASS}__toggle-icon`} src={toggleIcon} />\n            ) : null}\n          </div>\n          <a className={bodyClass} href={node.model.id} onClick={this.onClick}>\n            <div className={`${LEAF_CLASS}__icon-container`}>\n              <img className={`${LEAF_CLASS}__icon`} src={icon} />\n            </div>\n            <span className={`${LEAF_CLASS}__label`}>{label}</span>\n            {node.model.count ? (\n              <span className={`${LEAF_CLASS}__count graph-explorer-badge`}>\n                {node.model.count}\n              </span>\n            ) : null}\n          </a>\n          {creatableClasses.get(node.model.id) ? (\n            <div\n              className={`${LEAF_CLASS}__create graph-explorer-btn-group graph-explorer-btn-group-xs`}\n            >\n              <button\n                className=\"graph-explorer-btn graph-explorer-btn-default\"\n                title={\"Click or drag to create new entity of this type\"}\n                draggable={true}\n                onClick={this.onClickCreate}\n                onDragStart={this.onDragCreate}\n              >\n                +\n              </button>\n            </div>\n          ) : null}\n        </div>\n        {expanded && node.derived.length > 0 ? (\n          <Forest\n            className={`${LEAF_CLASS}__children`}\n            nodes={node.derived}\n            {...otherProps}\n          />\n        ) : null}\n      </div>\n    );\n  }\n\n  private onClick = (e: React.MouseEvent<{}>) => {\n    e.preventDefault();\n    const { node, onSelect } = this.props;\n    onSelect(node);\n  };\n\n  private toggle = () => {\n    this.setState((state): State => ({ expanded: !state.expanded }));\n  };\n\n  private onClickCreate = () => {\n    this.props.onClickCreate(this.props.node);\n  };\n\n  private onDragCreate = (e: React.DragEvent<any>) => {\n    // sets the drag data to support drag-n-drop in Firefox\n    // see https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations for more details\n    // IE supports only 'text' and 'URL' formats, see https://msdn.microsoft.com/en-us/ie/ms536744(v=vs.94)\n    e.dataTransfer.setData(\"text\", \"\");\n\n    this.props.onDragCreate(this.props.node);\n  };\n}\n\nexport interface ForestProps extends CommonProps {\n  className?: string;\n  nodes: readonly TreeNode[];\n}\n\nexport class Forest extends React.Component<ForestProps, {}> {\n  render() {\n    const { nodes, className, ...otherProps } = this.props;\n    return (\n      <div className={className} role=\"tree\">\n        {nodes.map((node) => (\n          <Leaf key={`node-${node.model.id}`} node={node} {...otherProps} />\n        ))}\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nimport { ElementTypeIri, ClassModel } from \"../../data/model\";\nimport { DataProvider } from \"../../data/provider\";\nimport { FatClassModel } from \"../../diagram/elements\";\nimport { Vector } from \"../../diagram/geometry\";\nimport { DiagramView } from \"../../diagram/view\";\nimport { EditorController } from \"../../editor/editorController\";\nimport {\n  Cancellation,\n  CancellationToken,\n  Debouncer,\n} from \"../../viewUtils/async\";\nimport { cloneMap } from \"../../viewUtils/collections\";\nimport { EventObserver } from \"../../viewUtils/events\";\nimport { HtmlSpinner } from \"../../viewUtils/spinner\";\nimport { ProgressBar, ProgressState } from \"../progressBar\";\n\nimport { TreeNode } from \"./treeModel\";\nimport { Forest } from \"./leaf\";\n\nexport interface ClassTreeProps {\n  view: DiagramView;\n  editor: EditorController;\n  onClassSelected: (classId: ElementTypeIri) => void;\n  onCreateInstance: (classId: ElementTypeIri, position?: Vector) => void;\n}\n\nexport interface State {\n  refreshingState?: ProgressState;\n  roots?: readonly TreeNode[];\n  filteredRoots?: readonly TreeNode[];\n  requestedSearchText?: string;\n  appliedSearchText?: string;\n  selectedNode?: TreeNode;\n  constructibleClasses?: ReadonlyMap<ElementTypeIri, boolean>;\n  showOnlyConstructible?: boolean;\n}\n\nconst CLASS_NAME = \"graph-explorer-class-tree\";\nconst MIN_TERM_LENGTH = 3;\n\nexport class ClassTree extends React.Component<ClassTreeProps, State> {\n  private readonly listener = new EventObserver();\n  private readonly delayedClassUpdate = new Debouncer();\n  private readonly delayedSearch = new Debouncer(200 /* ms */);\n  private classTree: readonly ClassModel[] | undefined;\n  private dataProvider: DataProvider | undefined;\n\n  private loadClassesOperation = new Cancellation();\n  private refreshOperation = new Cancellation();\n\n  constructor(props: ClassTreeProps) {\n    super(props);\n    this.state = {\n      refreshingState: ProgressState.none,\n      roots: [],\n      filteredRoots: [],\n      requestedSearchText: \"\",\n      appliedSearchText: \"\",\n      constructibleClasses: new Map(),\n      showOnlyConstructible: false,\n    };\n  }\n\n  render() {\n    const { view, editor } = this.props;\n    const {\n      refreshingState,\n      requestedSearchText,\n      appliedSearchText,\n      filteredRoots,\n      selectedNode,\n      constructibleClasses,\n      showOnlyConstructible,\n    } = this.state;\n    const normalizedSearchText = normalizeSearchText(requestedSearchText);\n    // highlight search term only if actual tree is already filtered by current or previous term:\n    //  - this immediately highlights typed characters thus making it look more responsive,\n    //  - prevents expanding non-filtered tree (which can be too large) just to highlight the term\n    const searchText = appliedSearchText ? normalizedSearchText : undefined;\n\n    return (\n      <div className={CLASS_NAME}>\n        <div className={`${CLASS_NAME}__filter`}>\n          <div className={`${CLASS_NAME}__filter-group`}>\n            <input\n              type=\"text\"\n              className=\"search-input graph-explorer-form-control\"\n              placeholder=\"Search for...\"\n              value={this.state.requestedSearchText}\n              onChange={this.onSearchTextChange}\n            />\n            {editor.inAuthoringMode ? (\n              <label className={`${CLASS_NAME}__only-creatable`}>\n                <input\n                  type=\"checkbox\"\n                  checked={showOnlyConstructible}\n                  onChange={this.onShowOnlyCreatableChange}\n                />{\" \"}\n                Show only constructible\n              </label>\n            ) : null}\n          </div>\n        </div>\n        <ProgressBar state={refreshingState} />\n        {this.classTree ? (\n          <Forest\n            className={`${CLASS_NAME}__tree graph-explorer-scrollable`}\n            view={view}\n            nodes={filteredRoots}\n            searchText={searchText}\n            selectedNode={selectedNode}\n            onSelect={this.onSelectNode}\n            creatableClasses={constructibleClasses}\n            onClickCreate={this.onCreateInstance}\n            onDragCreate={this.onDragCreate}\n          />\n        ) : (\n          <div className={`${CLASS_NAME}__spinner`}>\n            <HtmlSpinner width={30} height={30} />\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  componentDidMount() {\n    const { view, editor } = this.props;\n    this.listener.listen(view.events, \"changeLanguage\", () =>\n      this.refreshClassTree()\n    );\n    this.listener.listen(editor.model.events, \"loadingStart\", () => {\n      this.initClassTree();\n    });\n    this.listener.listen(editor.model.events, \"classEvent\", ({ data }) => {\n      if (data.changeLabel || data.changeCount) {\n        this.delayedClassUpdate.call(this.refreshClassTree);\n      }\n    });\n    this.initClassTree();\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.delayedClassUpdate.dispose();\n    this.delayedSearch.dispose();\n    this.loadClassesOperation.abort();\n    this.refreshOperation.abort();\n  }\n\n  private async initClassTree() {\n    if (this.dataProvider !== this.props.editor.model.dataProvider) {\n      this.dataProvider = this.props.editor.model.dataProvider;\n      this.classTree = undefined;\n\n      const cancellation = new Cancellation();\n      this.loadClassesOperation.abort();\n      this.loadClassesOperation = cancellation;\n\n      const classes = await this.dataProvider.classTree();\n      if (cancellation.signal.aborted) {\n        return;\n      }\n      this.setClassTree(classes);\n    }\n    this.refreshClassTree();\n  }\n\n  private onSearchTextChange = (e: React.FormEvent<HTMLInputElement>) => {\n    const requestedSearchText = e.currentTarget.value;\n    this.setState({ requestedSearchText });\n    this.delayedSearch.call(this.performSearch);\n  };\n\n  private performSearch = () => {\n    const { requestedSearchText } = this.state;\n    const requested = normalizeSearchText(requestedSearchText);\n    if (requested === this.state.appliedSearchText) {\n      return;\n    }\n\n    const appliedSearchText =\n      requested.length < MIN_TERM_LENGTH ? undefined : requested;\n    this.setState(\n      (state): State => applyFilters({ ...state, appliedSearchText })\n    );\n  };\n\n  private onShowOnlyCreatableChange = (\n    _e: React.ChangeEvent<HTMLInputElement>\n  ) => {\n    this.setState(\n      (state): State =>\n        applyFilters({\n          ...state,\n          showOnlyConstructible: !state.showOnlyConstructible,\n        })\n    );\n  };\n\n  private onSelectNode = (node: TreeNode) => {\n    const { onClassSelected } = this.props;\n    this.setState({ selectedNode: node });\n    onClassSelected(node.model.id);\n  };\n\n  private onCreateInstance = (node: TreeNode) => {\n    const { onCreateInstance } = this.props;\n    onCreateInstance(node.model.id);\n  };\n\n  private onDragCreate = (node: TreeNode) => {\n    const { view, onCreateInstance } = this.props;\n    view.setHandlerForNextDropOnPaper((e) => {\n      onCreateInstance(node.model.id, e.paperPosition);\n    });\n  };\n\n  private refreshClassTree = () => {\n    const cancellation = new Cancellation();\n    const { editor } = this.props;\n    this.refreshOperation.abort();\n    this.refreshOperation = cancellation;\n\n    this.setState((state, props): State => {\n      if (!this.classTree) {\n        return { refreshingState: ProgressState.none };\n      }\n\n      let refreshingState = ProgressState.none;\n      if (editor.inAuthoringMode) {\n        const newIris = getNewClassIris(\n          state.constructibleClasses,\n          this.classTree\n        );\n\n        if (newIris.size > 0) {\n          refreshingState = ProgressState.loading;\n          this.queryCreatableTypes(newIris, cancellation.signal);\n        }\n      }\n\n      const roots = createRoots(this.classTree, props.view);\n      return applyFilters({\n        ...state,\n        roots: sortTree(roots),\n        refreshingState,\n      });\n    });\n  };\n\n  private setClassTree(roots: ClassModel[]) {\n    const diagramModel = this.props.editor.model;\n    const visiting = new Set<ElementTypeIri>();\n    const reduceNonCycle = (acc: ClassModel[], model: ClassModel) => {\n      if (!visiting.has(model.id)) {\n        visiting.add(model.id);\n        const children = model.children.reduce(reduceNonCycle, []);\n        acc.push({ ...model, children });\n        visiting.delete(model.id);\n      }\n      return acc;\n    };\n    this.classTree = roots.reduce(reduceNonCycle, []);\n\n    const addClass = (model: ClassModel) => {\n      const existing = diagramModel.getClass(model.id);\n      if (!existing) {\n        const { id, label, count, children } = model;\n        const richClass = new FatClassModel({ id, label: label.values, count });\n        diagramModel.addClass(richClass);\n        children.forEach(addClass);\n      }\n    };\n    this.classTree.forEach(addClass);\n\n    this.refreshClassTree();\n  }\n\n  private async queryCreatableTypes(\n    typeIris: Set<ElementTypeIri>,\n    ct: CancellationToken\n  ) {\n    try {\n      const result = await CancellationToken.mapCancelledToNull(\n        ct,\n        this.props.editor.metadataApi.filterConstructibleTypes(typeIris, ct)\n      );\n      if (result === null) {\n        return;\n      }\n      this.setState((state): State => {\n        const constructibleClasses = cloneMap(state.constructibleClasses);\n        typeIris.forEach((type) => {\n          constructibleClasses.set(type, result.has(type));\n        });\n        return applyFilters({\n          ...state,\n          constructibleClasses,\n          refreshingState: ProgressState.completed,\n        });\n      });\n    } catch (err) {\n      console.error(err);\n      if (ct.aborted) {\n        return;\n      }\n      this.setState(\n        (state): State =>\n          applyFilters({ ...state, refreshingState: ProgressState.error })\n      );\n    }\n  }\n}\n\nfunction createRoots(classTree: readonly ClassModel[], view: DiagramView) {\n  const mapClass = (model: ClassModel): TreeNode => {\n    const richClass = view.model.createClass(model.id);\n    return {\n      model: richClass,\n      label: view.formatLabel(richClass.label, richClass.id),\n      derived: model.children.map(mapClass),\n    };\n  };\n  return classTree.map(mapClass);\n}\n\nfunction getNewClassIris(\n  existingClasses: ReadonlyMap<ElementTypeIri, boolean>,\n  classTree: readonly ClassModel[]\n) {\n  const classIris = new Set<ElementTypeIri>();\n  const visitClass = (model: ClassModel) => {\n    if (!existingClasses.has(model.id)) {\n      classIris.add(model.id);\n    }\n    model.children.forEach(visitClass);\n  };\n  classTree.forEach(visitClass);\n  return classIris;\n}\n\nfunction normalizeSearchText(text: string) {\n  return text.trim().toLowerCase();\n}\n\nfunction sortTree(roots: readonly TreeNode[]): readonly TreeNode[] {\n  function mapNodes(nodes: readonly TreeNode[]): readonly TreeNode[] {\n    if (nodes.length === 0) {\n      return nodes;\n    }\n    const mapped = nodes.map(mapNode);\n    mapped.sort(compareByLabel);\n    return mapped;\n  }\n  function mapNode(node: TreeNode): TreeNode {\n    return TreeNode.setDerived(node, mapNodes(node.derived));\n  }\n  function compareByLabel(left: TreeNode, right: TreeNode) {\n    return left.label.localeCompare(right.label);\n  }\n  return mapNodes(roots);\n}\n\nfunction applyFilters(state: State): State {\n  let filteredRoots = state.roots;\n  if (state.appliedSearchText) {\n    filteredRoots = filterByKeyword(filteredRoots, state.appliedSearchText);\n  }\n  if (state.showOnlyConstructible) {\n    filteredRoots = filterOnlyCreatable(\n      filteredRoots,\n      state.constructibleClasses\n    );\n  }\n  return { ...state, filteredRoots };\n}\n\nfunction filterByKeyword(\n  roots: readonly TreeNode[],\n  searchText: string\n): readonly TreeNode[] {\n  if (roots.length === 0) {\n    return roots;\n  }\n  function collectByKeyword(acc: TreeNode[], node: TreeNode) {\n    const derived = node.derived.reduce(collectByKeyword, []);\n    // keep parent if children is included or label contains keyword\n    if (\n      derived.length > 0 ||\n      node.label.toLowerCase().indexOf(searchText) >= 0\n    ) {\n      acc.push(TreeNode.setDerived(node, derived));\n    }\n    return acc;\n  }\n  return roots.reduce(collectByKeyword, []);\n}\n\nfunction filterOnlyCreatable(\n  roots: readonly TreeNode[],\n  creatableClasses: ReadonlyMap<ElementTypeIri, boolean>\n): readonly TreeNode[] {\n  function collectOnlyCreatable(acc: TreeNode[], node: TreeNode) {\n    const derived = node.derived.reduce(collectOnlyCreatable, []);\n    if (derived.length > 0 || creatableClasses.get(node.model.id)) {\n      acc.push(TreeNode.setDerived(node, derived));\n    }\n    return acc;\n  }\n  return roots.reduce(collectOnlyCreatable, []);\n}\n","import * as React from \"react\";\n\nimport { LinkCount } from \"../data/model\";\nimport { changeLinkTypeVisibility } from \"../diagram/commands\";\nimport { Element, FatLinkType } from \"../diagram/elements\";\nimport { CommandHistory } from \"../diagram/history\";\nimport { DiagramView } from \"../diagram/view\";\n\nimport { EditorController } from \"../editor/editorController\";\n\nimport { Debouncer } from \"../viewUtils/async\";\nimport { EventObserver } from \"../viewUtils/events\";\nimport { highlightSubstring } from \"./listElementView\";\nimport { ProgressBar, ProgressState } from \"./progressBar\";\n\ninterface LinkInToolBoxProps {\n  view: DiagramView;\n  link: FatLinkType;\n  count: number;\n  onPressFilter?: (type: FatLinkType) => void;\n  filterKey?: string;\n}\n\ntype LinkTypeVisibility = \"invisible\" | \"withoutLabels\" | \"allVisible\";\n\nclass LinkInToolBox extends React.Component<LinkInToolBoxProps, {}> {\n  private onPressFilter = () => {\n    if (this.props.onPressFilter) {\n      this.props.onPressFilter(this.props.link);\n    }\n  };\n\n  private changeState = (state: LinkTypeVisibility) => {\n    const history = this.props.view.model.history;\n    changeLinkTypeState(history, state, [this.props.link]);\n  };\n\n  private isChecked = (stateName: LinkTypeVisibility): boolean => {\n    let curState: LinkTypeVisibility;\n    if (!this.props.link.visible) {\n      curState = \"invisible\";\n    } else if (!this.props.link.showLabel) {\n      curState = \"withoutLabels\";\n    } else {\n      curState = \"allVisible\";\n    }\n    return stateName === curState;\n  };\n\n  private getText = () => {\n    const { link: linkType, view, filterKey } = this.props;\n    const fullText = view.formatLabel(linkType.label, linkType.id);\n    return highlightSubstring(fullText, filterKey);\n  };\n\n  render() {\n    const newIcon = this.props.link.isNew ? (\n      <span className=\"linkInToolBox__new-tag\">new</span>\n    ) : (\n      \"\"\n    );\n    const countIcon =\n      this.props.count > 0 ? (\n        <span className=\"graph-explorer-badge\">{this.props.count}</span>\n      ) : (\n        \"\"\n      );\n    const badgeContainer =\n      newIcon || countIcon ? (\n        <div>\n          {newIcon}\n          {countIcon}\n        </div>\n      ) : (\n        \"\"\n      );\n\n    return (\n      <li\n        data-linktypeid={this.props.link.id}\n        className=\"graph-explorer-list-group-item linkInToolBox clearfix\"\n      >\n        <span\n          className=\"graph-explorer-btn-group graph-explorer-btn-group-xs\"\n          data-toggle=\"buttons\"\n        >\n          <label\n            className={\n              \"graph-explorer-btn graph-explorer-btn-default\" +\n              (this.isChecked(\"invisible\") ? \" active\" : \"\")\n            }\n            id=\"invisible\"\n            title=\"Hide links and labels\"\n            onClick={() => this.changeState(\"invisible\")}\n          >\n            <span className=\"fa fa-times\" aria-hidden=\"true\" />\n          </label>\n          <label\n            className={\n              \"graph-explorer-btn graph-explorer-btn-default\" +\n              (this.isChecked(\"withoutLabels\") ? \" active\" : \"\")\n            }\n            id=\"withoutLabels\"\n            title=\"Show links without labels\"\n            onClick={() => this.changeState(\"withoutLabels\")}\n          >\n            <span className=\"fa fa-arrows-h\" aria-hidden=\"true\" />\n          </label>\n          <label\n            className={\n              \"graph-explorer-btn graph-explorer-btn-default\" +\n              (this.isChecked(\"allVisible\") ? \" active\" : \"\")\n            }\n            id=\"allVisible\"\n            title=\"Show links with labels\"\n            onClick={() => this.changeState(\"allVisible\")}\n          >\n            <span className=\"fa fa-text-width\" aria-hidden=\"true\" />\n          </label>\n        </span>\n        <div className=\"link-title\">{this.getText()}</div>\n        {badgeContainer}\n        <div\n          className=\"linkInToolBox__filter-button\"\n          onClick={this.onPressFilter}\n        />\n      </li>\n    );\n  }\n}\n\ninterface LinkTypesToolboxViewProps {\n  view: DiagramView;\n  links: readonly FatLinkType[];\n  countMap: Readonly<Record<string, number>>;\n  selectedElement: Element;\n  dataState: ProgressState;\n  filterCallback: (type: FatLinkType) => void;\n}\n\nclass LinkTypesToolboxView extends React.Component<\n  LinkTypesToolboxViewProps,\n  { filterKey: string }\n> {\n  constructor(props: LinkTypesToolboxViewProps) {\n    super(props);\n    this.state = { filterKey: \"\" };\n  }\n\n  private compareLinks = (a: FatLinkType, b: FatLinkType) => {\n    const { view } = this.props;\n    const aText = view.formatLabel(a.label, a.id);\n    const bText = view.formatLabel(b.label, b.id);\n    return aText.localeCompare(bText);\n  };\n\n  private onChangeInput = (e: React.SyntheticEvent<HTMLInputElement>) => {\n    this.setState({ filterKey: e.currentTarget.value });\n  };\n\n  private onDropFilter = () => {\n    this.setState({ filterKey: \"\" });\n  };\n\n  private getLinks = () => {\n    const { view, links = [] } = this.props;\n    return links\n      .filter((linkType) => {\n        const text = view\n          .formatLabel(linkType.label, linkType.id)\n          .toLowerCase();\n        return (\n          !this.state.filterKey ||\n          text.indexOf(this.state.filterKey.toLowerCase()) >= 0\n        );\n      })\n      .sort(this.compareLinks);\n  };\n\n  private getViews = (links: FatLinkType[]) => {\n    const countMap = this.props.countMap || {};\n    const views: React.ReactElement<any>[] = [];\n    for (const link of links) {\n      views.push(\n        <LinkInToolBox\n          key={link.id}\n          view={this.props.view}\n          link={link}\n          onPressFilter={this.props.filterCallback}\n          count={countMap[link.id] || 0}\n          filterKey={this.state.filterKey}\n        />\n      );\n    }\n    return views;\n  };\n\n  render() {\n    const className = \"link-types-toolbox\";\n    const { view, dataState, selectedElement } = this.props;\n    const history = view.model.history;\n\n    const links = this.getLinks();\n    const views = this.getViews(links);\n\n    let connectedTo: React.JSX.Element | null = null;\n    if (selectedElement) {\n      const selectedElementLabel = view.formatLabel(\n        selectedElement.data.label.values,\n        selectedElement.iri\n      );\n      connectedTo = (\n        <h4 className=\"links-heading\" style={{ display: \"block\" }}>\n          Connected to{\"\\u00A0\"}\n          <span>{selectedElementLabel}</span>\n        </h4>\n      );\n    }\n\n    let dropButton: React.JSX.Element | null = null;\n    if (this.state.filterKey) {\n      dropButton = (\n        <button\n          type=\"button\"\n          className={`${className}__clearSearch`}\n          onClick={this.onDropFilter}\n        >\n          <span className=\"fa fa-times\" aria-hidden=\"true\"></span>\n        </button>\n      );\n    }\n\n    return (\n      <div className={className}>\n        <div className={`${className}__heading`}>\n          <div className={`${className}__searching-box`}>\n            <input\n              className=\"search-input graph-explorer-form-control\"\n              type=\"text\"\n              value={this.state.filterKey}\n              onChange={this.onChangeInput}\n              placeholder=\"Search for...\"\n            />\n            {dropButton}\n          </div>\n          <div className={`${className}__switch-all`}>\n            <div className=\"graph-explorer-btn-group graph-explorer-btn-group-xs\">\n              <label\n                className=\"graph-explorer-btn graph-explorer-btn-default\"\n                title=\"Hide links and labels\"\n                onClick={() => changeLinkTypeState(history, \"invisible\", links)}\n              >\n                <span className=\"fa fa-times\" aria-hidden=\"true\" />\n              </label>\n              <label\n                className=\"graph-explorer-btn graph-explorer-btn-default\"\n                title=\"Show links without labels\"\n                onClick={() =>\n                  changeLinkTypeState(history, \"withoutLabels\", links)\n                }\n              >\n                <span className=\"fa fa-arrows-h\" aria-hidden=\"true\" />\n              </label>\n              <label\n                className=\"graph-explorer-btn graph-explorer-btn-default\"\n                title=\"Show links with labels\"\n                onClick={() =>\n                  changeLinkTypeState(history, \"allVisible\", links)\n                }\n              >\n                <span className=\"fa fa-text-width\" aria-hidden=\"true\" />\n              </label>\n            </div>\n            <span>&nbsp;Switch all</span>\n          </div>\n        </div>\n        <ProgressBar state={dataState} />\n        <div className={`${className}__rest`}>\n          {connectedTo}\n          <div className=\"graph-explorer-scrollable\">\n            <ul className=\"graph-explorer-list-group connected-links\">\n              {views}\n            </ul>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport interface LinkTypesToolboxProps {\n  view: DiagramView;\n  editor: EditorController;\n}\n\nexport interface LinkTypesToolboxState {\n  readonly dataState?: ProgressState;\n  readonly selectedElement?: Element;\n  readonly linksOfElement?: readonly FatLinkType[];\n  readonly countMap?: Readonly<Record<string, number>>;\n}\n\nexport class LinkTypesToolbox extends React.Component<\n  LinkTypesToolboxProps,\n  LinkTypesToolboxState\n> {\n  private readonly listener = new EventObserver();\n  private readonly linkListener = new EventObserver();\n  private readonly debounceSelection = new Debouncer(50 /* ms */);\n\n  private currentRequest: { elementId: string } | undefined;\n\n  constructor(props: LinkTypesToolboxProps, context: any) {\n    super(props, context);\n\n    const { view, editor } = this.props;\n\n    this.listener.listen(view.events, \"changeLanguage\", () =>\n      this.updateOnCurrentSelection()\n    );\n    this.listener.listen(editor.model.events, \"loadingSuccess\", () =>\n      this.updateOnCurrentSelection()\n    );\n    this.listener.listen(editor.events, \"changeSelection\", () => {\n      this.debounceSelection.call(this.updateOnCurrentSelection);\n    });\n\n    this.state = { dataState: ProgressState.none };\n  }\n\n  componentDidMount() {\n    this.updateOnCurrentSelection();\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.linkListener.stopListening();\n    this.debounceSelection.dispose();\n  }\n\n  private updateOnCurrentSelection = () => {\n    const { editor } = this.props;\n    const single = editor.selection.length === 1 ? editor.selection[0] : null;\n    if (single !== this.state.selectedElement && single instanceof Element) {\n      this.requestLinksOf(single);\n    }\n  };\n\n  private requestLinksOf(selectedElement: Element) {\n    if (selectedElement) {\n      const request = { elementId: selectedElement.iri };\n      this.currentRequest = request;\n      this.setState({ dataState: ProgressState.loading, selectedElement });\n      this.props.editor.model.dataProvider\n        .linkTypesOf(request)\n        .then((linkTypes) => {\n          if (this.currentRequest !== request) {\n            return;\n          }\n          const { linksOfElement, countMap } =\n            this.computeStateFromRequestResult(linkTypes);\n          this.subscribeOnLinksEvents(linksOfElement);\n          this.setState({\n            dataState: ProgressState.completed,\n            linksOfElement,\n            countMap,\n          });\n        })\n        .catch((error) => {\n          if (this.currentRequest !== request) {\n            return;\n          }\n          console.error(error);\n          this.setState({\n            dataState: ProgressState.error,\n            linksOfElement: undefined,\n            countMap: {},\n          });\n        });\n    } else {\n      this.currentRequest = null;\n      this.setState({\n        dataState: ProgressState.completed,\n        selectedElement,\n        linksOfElement: undefined,\n        countMap: {},\n      });\n    }\n  }\n\n  private computeStateFromRequestResult(linkTypes: readonly LinkCount[]) {\n    const linksOfElement: FatLinkType[] = [];\n    const countMap: Record<string, number> = {};\n\n    const model = this.props.editor.model;\n    for (const linkType of linkTypes) {\n      const type = model.createLinkType(linkType.id);\n      linksOfElement.push(type);\n      countMap[linkType.id] = linkType.inCount + linkType.outCount;\n    }\n\n    return { linksOfElement, countMap };\n  }\n\n  private subscribeOnLinksEvents(linksOfElement: FatLinkType[]) {\n    this.linkListener.stopListening();\n\n    const listener = this.linkListener;\n    for (const link of linksOfElement) {\n      listener.listen(link.events, \"changeLabel\", this.onLinkChanged);\n      listener.listen(link.events, \"changeVisibility\", this.onLinkChanged);\n    }\n  }\n\n  private onLinkChanged = () => {\n    this.forceUpdate();\n  };\n\n  render() {\n    const { view } = this.props;\n    const { selectedElement, dataState, linksOfElement, countMap } = this.state;\n    return (\n      <LinkTypesToolboxView\n        view={view}\n        dataState={dataState}\n        links={linksOfElement}\n        countMap={countMap}\n        filterCallback={this.onAddToFilter}\n        selectedElement={selectedElement}\n      />\n    );\n  }\n\n  private onAddToFilter = (linkType: FatLinkType) => {\n    const { selectedElement } = this.state;\n    selectedElement.addToFilter(linkType);\n  };\n}\n\nfunction changeLinkTypeState(\n  history: CommandHistory,\n  state: LinkTypeVisibility,\n  links: readonly FatLinkType[]\n) {\n  const batch = history.startBatch();\n  const { visible, showLabel } =\n    state === \"invisible\"\n      ? { visible: false, showLabel: false }\n      : state === \"withoutLabels\"\n        ? { visible: true, showLabel: false }\n        : state === \"allVisible\"\n          ? { visible: true, showLabel: true }\n          : undefined;\n  for (const linkType of links) {\n    history.execute(changeLinkTypeVisibility({ linkType, visible, showLabel }));\n  }\n  batch.store();\n}\n","import * as React from \"react\";\n\nimport { AccordionItem, Props as ItemProps } from \"./accordionItem\";\n\nexport interface Props {\n  onStartResize?: (direction: \"vertical\" | \"horizontal\") => void;\n  onResize?: (direction: \"vertical\" | \"horizontal\") => void;\n  /** AccordionItem[] */\n  children?: React.ReactElement[];\n  direction?: \"vertical\" | \"horizontal\";\n  animationDuration?: number;\n}\n\nexport interface DefaultProps {\n  defaultSize?: number;\n  defaultCollapsed?: boolean;\n  collapsedSize?: number;\n  minSize?: number;\n}\n\nexport interface State {\n  /**\n   * Items' sizes in pixels.\n   * Undefined until first resize or toggle initiated by user.\n   */\n  readonly sizes?: number[];\n  /**\n   * Items' sizes in percent.\n   */\n  readonly percents?: string[];\n  /**\n   * Per-item collapsed state: true if corresponding item is collapsed;\n   * otherwise false.\n   */\n  readonly collapsed?: boolean[];\n  readonly resizing?: boolean;\n}\n\nconst CLASS_NAME = \"graph-explorer-accordion\";\n\nexport class Accordion extends React.Component<Props, State> {\n  static defaultProps: Partial<Props> = {\n    direction: \"vertical\",\n    animationDuration: 300,\n  };\n\n  private element: HTMLDivElement;\n\n  private items: AccordionItem[] = [];\n  private originSizes: readonly number[];\n  private originCollapsed: readonly boolean[];\n  private originTotalSize: number;\n\n  private defaultProps?: ReadonlyMap<number, DefaultProps>;\n\n  private isScrollable = false;\n\n  constructor(props: Props) {\n    super(props);\n    const childCount = React.Children.count(this.props.children);\n    this.state = {\n      collapsed: [],\n      resizing: false,\n      percents: React.Children.map(\n        this.props.children,\n        () => `${100 / childCount}%`\n      ),\n    };\n  }\n\n  componentDidMount() {\n    this.updateSizes();\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { direction, children, onResize, animationDuration } = this.props;\n    if (\n      React.Children.count(children) !==\n      React.Children.count(prevProps.children)\n    ) {\n      this.updateSizes();\n    }\n    const { sizes, resizing } = this.state;\n    if (sizes !== prevState.sizes && onResize) {\n      if (resizing) {\n        onResize(direction);\n      } else {\n        // triggers the callback after finishing CSS animation\n        setTimeout(() => onResize(direction), animationDuration);\n      }\n    }\n  }\n\n  private get isVertical() {\n    return this.props.direction === \"vertical\";\n  }\n\n  private clientSize(element: HTMLElement) {\n    const { clientWidth, clientHeight } = element;\n    return this.isVertical ? clientHeight : clientWidth;\n  }\n\n  private offsetSize(element: HTMLElement) {\n    const { offsetWidth, offsetHeight } = element;\n    return this.isVertical ? offsetHeight : offsetWidth;\n  }\n\n  private updateSizes = () => {\n    const { children } = this.props;\n    const defaultProps = new Map<number, DefaultProps>();\n    React.Children.forEach(children, (child, index) => {\n      if (typeof child !== \"object\") {\n        return;\n      }\n      const { defaultSize, defaultCollapsed, collapsedSize, minSize } = (\n        child as React.ReactElement<ItemProps>\n      ).props;\n      // enables the scrollbar in the accordion if at least one item has min size\n      if (minSize !== undefined) {\n        this.isScrollable = true;\n      }\n      defaultProps.set(index, {\n        defaultSize,\n        defaultCollapsed,\n        collapsedSize,\n        minSize,\n      });\n    });\n    this.defaultProps = defaultProps;\n    this.setState(({ collapsed }): State => {\n      const totalSize = this.clientSize(this.element.parentElement);\n      let leftSize = totalSize;\n      let leftChildCount = React.Children.count(children);\n      const newCollapsed: boolean[] = [];\n      this.defaultProps.forEach(\n        ({ defaultSize, defaultCollapsed = false }, index) => {\n          // preserves items collapsed by user\n          let itemCollapsed =\n            collapsed[index] === undefined\n              ? defaultCollapsed\n              : collapsed[index];\n          // if no expanded items, expands the last one\n          const isLastItem = index === this.defaultProps.size - 1;\n          const noExpandedItems = newCollapsed.findIndex((c) => !c) < 0;\n          if (isLastItem && noExpandedItems) {\n            itemCollapsed = false;\n          }\n          const size = itemCollapsed\n            ? this.sizeWhenCollapsed(index)\n            : defaultSize;\n          if (size) {\n            leftSize = leftSize - size;\n            leftChildCount = leftChildCount - 1;\n          }\n          newCollapsed.push(itemCollapsed);\n        }\n      );\n      const newSizes: number[] = [];\n      const newPercents: string[] = [];\n      this.defaultProps.forEach(({ defaultSize, minSize }, index) => {\n        let size = leftSize / leftChildCount;\n        const collapsedSize = this.sizeWhenCollapsed(index);\n        if (newCollapsed[index]) {\n          size = collapsedSize;\n        } else if (defaultSize !== undefined) {\n          size = defaultSize;\n        } else if (size < minSize) {\n          size = collapsedSize + minSize;\n        }\n        if (size < collapsedSize) {\n          size = collapsedSize;\n          newCollapsed[index] = true;\n        }\n        const percent = `${(100 * size) / totalSize}%`;\n        newSizes.push(size);\n        newPercents.push(percent);\n      });\n      return {\n        sizes: newSizes,\n        percents: newPercents,\n        collapsed: newCollapsed,\n      };\n    });\n  };\n\n  render() {\n    const { direction } = this.props;\n    const { resizing } = this.state;\n    const resizingClassName = resizing ? `${CLASS_NAME}--resizing` : \"\";\n    const scrollableClassName = this.isScrollable\n      ? `${CLASS_NAME}--scrollable`\n      : \"\";\n    return (\n      <div\n        className={`${CLASS_NAME} ${CLASS_NAME}--${direction} ${resizingClassName} ${scrollableClassName}`}\n        ref={(element) => {\n          this.element = element;\n        }}\n      >\n        {this.renderItems()}\n      </div>\n    );\n  }\n\n  private renderItems() {\n    const { sizes, percents, collapsed } = this.state;\n    const { children, direction } = this.props;\n\n    return React.Children.map(children, (child, index) => {\n      if (typeof child !== \"object\") {\n        throw new Error(\n          \"Accordion should have only AccordionItem elements as children\"\n        );\n      }\n      const lastChild = index === React.Children.count(children) - 1;\n      const size = collapsed[index] ? sizes[index] : percents[index];\n\n      const additionalProps: Partial<ItemProps> &\n        React.ClassAttributes<AccordionItem> = {\n        ref: (element) => {\n          this.items[index] = element;\n        },\n        collapsed: collapsed[index],\n        size,\n        direction,\n        onChangeCollapsed: (itemCollapsed) =>\n          this.onItemChangeCollapsed({ itemIndex: index, itemCollapsed }),\n        onBeginDragHandle: lastChild\n          ? undefined\n          : () => this.onBeginDragHandle(index),\n        onDragHandle: lastChild\n          ? undefined\n          : (dx, dy) => this.onDragHandle(index, dx, dy),\n        onEndDragHandle: this.onEndDragHandle,\n      };\n      return React.cloneElement(child, additionalProps);\n    });\n  }\n\n  private onBeginDragHandle = (_itemIndex: number) => {\n    this.originTotalSize = this.clientSize(this.element);\n    this.originSizes = this.computeEffectiveItemSizes();\n    this.originCollapsed = [...this.state.collapsed];\n    this.setState({ resizing: true }, () => {\n      const { direction, onStartResize } = this.props;\n      if (onStartResize) {\n        onStartResize(direction);\n      }\n    });\n  };\n\n  private onEndDragHandle = () => {\n    this.setState({ resizing: false });\n  };\n\n  private computeEffectiveItemSizes(): number[] {\n    const sizes: number[] = [];\n    this.items.forEach((item, index) => {\n      if (!item) {\n        return;\n      }\n      if (this.state.collapsed[index]) {\n        const collapsedSize = this.sizeWhenCollapsed(index);\n        sizes.push(collapsedSize);\n      } else {\n        sizes.push(this.offsetSize(item.element));\n      }\n    });\n    return sizes;\n  }\n\n  private sizeWhenCollapsed = (index: number) => {\n    const item = this.items[index];\n    const { collapsedSize } = this.defaultProps.get(index);\n    if (collapsedSize !== undefined) {\n      return collapsedSize;\n    }\n    const headerSize = item.header ? this.clientSize(item.header) : 0;\n    return (\n      headerSize +\n      (this.offsetSize(item.element) - this.clientSize(item.element))\n    );\n  };\n\n  private onDragHandle = (itemIndex: number, dx: number, dy: number) => {\n    const sizes = [...this.originSizes];\n    const collapsed = [...this.originCollapsed];\n\n    new SizeDistributor(\n      sizes,\n      collapsed,\n      this.originTotalSize,\n      this.sizeWhenCollapsed\n    ).distribute(itemIndex + 1, this.isVertical ? dy : dx);\n\n    const percents = sizes.map(\n      (size) => `${(100 * size) / this.originTotalSize}%`\n    );\n\n    this.setState({ sizes, percents, collapsed });\n  };\n\n  private onItemChangeCollapsed({\n    itemIndex,\n    itemCollapsed,\n  }: {\n    itemIndex: number;\n    itemCollapsed: boolean;\n  }) {\n    const totalSize = this.clientSize(this.element);\n    const sizes = this.computeEffectiveItemSizes();\n\n    if (sizes.length === 1) {\n      return;\n    }\n\n    const collapsed = [...this.state.collapsed];\n\n    const effectiveSize = sizes[itemIndex];\n\n    const collapsedSize = this.sizeWhenCollapsed(itemIndex);\n    const distributor = new SizeDistributor(\n      sizes,\n      collapsed,\n      totalSize,\n      this.sizeWhenCollapsed\n    );\n\n    if (itemCollapsed) {\n      const splitShift = Math.max(effectiveSize - collapsedSize, 0);\n      sizes[itemIndex] = collapsedSize;\n      if (itemIndex === sizes.length - 1) {\n        distributor.expand(splitShift, itemIndex - 1);\n      } else {\n        distributor.expand(splitShift, itemIndex + 1);\n      }\n    } else {\n      const { defaultSize, minSize } = this.defaultProps.get(itemIndex);\n      const shift = (defaultSize || totalSize / sizes.length) - collapsedSize;\n      let freeSize: number;\n      if (itemIndex === sizes.length - 1) {\n        freeSize = distributor.collapseForward({\n          shift,\n          from: itemIndex - 1,\n          to: itemIndex,\n        });\n      } else {\n        freeSize = distributor.collapseForward({\n          shift,\n          from: itemIndex + 1,\n          to: sizes.length,\n        });\n      }\n      freeSize = Math.max(freeSize, distributor.leftoverSize());\n      if (freeSize < shift) {\n        freeSize += distributor.collapseForward({\n          shift: shift - freeSize,\n          from: 0,\n          to: itemIndex,\n        });\n      }\n      if (freeSize < minSize) {\n        freeSize = minSize;\n      }\n      sizes[itemIndex] = Math.round(collapsedSize + freeSize);\n    }\n\n    collapsed[itemIndex] = itemCollapsed;\n\n    const percents = sizes.map((size) => `${(100 * size) / totalSize}%`);\n\n    this.setState({ sizes, percents, collapsed });\n  }\n}\n\nclass SizeDistributor {\n  constructor(\n    readonly sizes: number[],\n    readonly collapsed: boolean[],\n    readonly totalSize: number,\n    readonly sizeWhenCollapsed: (index: number) => number\n  ) {}\n\n  distribute(splitIndex: number, splitShift: number) {\n    if (splitShift > 0) {\n      let freeSize = this.collapseForward({\n        shift: splitShift,\n        from: splitIndex,\n        to: this.sizes.length,\n      });\n      freeSize = Math.max(freeSize, this.leftoverSize());\n      this.expand(freeSize, splitIndex - 1);\n    } else {\n      let freeSize = this.collapseBackward({\n        shift: -splitShift,\n        from: 0,\n        to: splitIndex,\n      });\n      freeSize = Math.max(freeSize, this.leftoverSize());\n      this.expand(freeSize, splitIndex);\n    }\n  }\n\n  collapseForward({\n    shift,\n    from,\n    to,\n  }: {\n    shift: number;\n    from: number;\n    to: number;\n  }) {\n    if (shift <= 0) {\n      return 0;\n    }\n    let shiftLeft = shift;\n    for (let i = from; i < to; i++) {\n      shiftLeft = this.collapse(shiftLeft, i);\n    }\n    return shift - shiftLeft;\n  }\n\n  collapseBackward({\n    shift,\n    from,\n    to,\n  }: {\n    shift: number;\n    from: number;\n    to: number;\n  }) {\n    if (shift <= 0) {\n      return 0;\n    }\n    let shiftLeft = shift;\n    for (let i = to - 1; i >= from; i--) {\n      shiftLeft = this.collapse(shiftLeft, i);\n    }\n    return shift - shiftLeft;\n  }\n\n  private collapse(shift: number, index: number) {\n    if (this.collapsed[index]) {\n      return shift;\n    }\n    const size = this.sizes[index];\n    const collapsedSize = this.sizeWhenCollapsed(index);\n    const newSize = Math.round(Math.max(size - shift, collapsedSize));\n    this.sizes[index] = newSize;\n    this.collapsed[index] = newSize <= collapsedSize;\n    return shift - (size - newSize);\n  }\n\n  expand(shift: number, index: number) {\n    if (shift <= 0) {\n      return 0;\n    }\n    const oldSize = this.sizes[index];\n    const newSize = Math.round(oldSize + shift);\n    this.sizes[index] = newSize;\n    this.collapsed[index] = newSize <= this.sizeWhenCollapsed(index);\n    return newSize - oldSize;\n  }\n\n  leftoverSize() {\n    const sizeSum = this.sizes.reduce((sum, size) => sum + size, 0);\n    return Math.max(this.totalSize - sizeSum, 0);\n  }\n}\n","import * as React from \"react\";\n\nimport { DraggableHandle } from \"./draggableHandle\";\n\nexport enum DockSide {\n  Left = 1,\n  Right,\n}\n\nexport interface Props {\n  heading?: React.ReactNode;\n  bodyClassName?: string;\n  bodyRef?: (body: HTMLDivElement) => void;\n  children?: React.ReactNode;\n  defaultSize?: number;\n  defaultCollapsed?: boolean;\n  collapsedSize?: number;\n  minSize?: number;\n\n  // props provided by Accordion\n  collapsed?: boolean;\n  size?: number | string;\n  direction?: \"vertical\" | \"horizontal\";\n  dockSide?: DockSide;\n  onChangeCollapsed?: (collapsed: boolean) => void;\n  onBeginDragHandle?: () => void;\n  onDragHandle?: (dx: number, dy: number) => void;\n  onEndDragHandle?: () => void;\n}\n\nconst CLASS_NAME = \"graph-explorer-accordion-item\";\n\nexport interface State {\n  resizing?: boolean;\n}\n\nexport class AccordionItem extends React.Component<Props, State> {\n  static defaultProps: Partial<Props> = {\n    direction: \"vertical\",\n  };\n\n  private _element: HTMLDivElement;\n  private _header: HTMLDivElement;\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      resizing: false,\n    };\n  }\n\n  get element() {\n    return this._element;\n  }\n  get header() {\n    return this._header;\n  }\n\n  private get isVertical() {\n    return this.props.direction === \"vertical\";\n  }\n\n  private renderToggleButton() {\n    const { collapsed, dockSide, onChangeCollapsed } = this.props;\n    if (!dockSide) {\n      return null;\n    }\n    const side = dockSide === DockSide.Left ? \"left\" : \"right\";\n    return (\n      <div\n        className={`${CLASS_NAME}__handle-btn ${CLASS_NAME}__handle-btn-${side}`}\n        onClick={() => onChangeCollapsed(!collapsed)}\n      />\n    );\n  }\n\n  render() {\n    const {\n      heading,\n      bodyClassName,\n      children,\n      bodyRef,\n      collapsed,\n      size,\n      direction,\n      onBeginDragHandle,\n      onDragHandle,\n      onEndDragHandle,\n      dockSide,\n    } = this.props;\n    const { resizing } = this.state;\n    const shouldRenderHandle =\n      onBeginDragHandle && onDragHandle && onEndDragHandle;\n    const style: React.CSSProperties = this.isVertical\n      ? { height: size }\n      : { width: size };\n\n    // unmount child component when the accordion item is collapsed and has dockSide\n    const isMounted = !(collapsed && dockSide);\n\n    return (\n      <div\n        className={`${CLASS_NAME} ${CLASS_NAME}--${\n          collapsed ? \"collapsed\" : \"expanded\"\n        } ${CLASS_NAME}--${direction}\n                ${resizing ? `${CLASS_NAME}--resizing` : \"\"}`}\n        ref={(element) => {\n          this._element = element;\n        }}\n        style={style}\n      >\n        <div className={`${CLASS_NAME}__inner`}>\n          {heading ? (\n            <div\n              className={`${CLASS_NAME}__header`}\n              ref={(header) => {\n                this._header = header;\n              }}\n              onClick={() => this.props.onChangeCollapsed(!collapsed)}\n            >\n              {heading}\n            </div>\n          ) : null}\n          <div className={`${CLASS_NAME}__body`}>\n            {children && isMounted ? (\n              children\n            ) : (\n              <div ref={bodyRef} className={`${bodyClassName || \"\"}`} />\n            )}\n          </div>\n        </div>\n        {shouldRenderHandle ? (\n          <DraggableHandle\n            className={`${CLASS_NAME}__handle ${CLASS_NAME}__handle-${direction}`}\n            onBeginDragHandle={(_e) => {\n              this.setState({ resizing: true });\n              onBeginDragHandle();\n            }}\n            onDragHandle={(_e, x, y) => onDragHandle(x, y)}\n            onEndDragHandle={(_e) => {\n              this.setState({ resizing: false });\n              onEndDragHandle();\n            }}\n          />\n        ) : null}\n        {this.renderToggleButton()}\n      </div>\n    );\n  }\n}\n","import * as React from \"react\";\n\nimport { Accordion } from \"../accordion\";\nimport { AccordionItem, DockSide } from \"../accordionItem\";\n\nconst DEFAULT_HORIZONTAL_COLLAPSED_SIZE = 28;\n\nexport enum WorkspaceLayoutType {\n  Row = \"row\",\n  Column = \"column\",\n  Component = \"component\",\n}\n\nexport type WorkspaceLayoutNode = Container | Component;\n\ninterface Container {\n  type: WorkspaceLayoutType.Row | WorkspaceLayoutType.Column;\n  children: readonly WorkspaceLayoutNode[];\n  defaultSize?: number;\n  defaultCollapsed?: boolean;\n  collapsedSize?: number;\n  minSize?: number;\n  undocked?: boolean;\n  animationDuration?: number;\n}\n\ninterface Component {\n  id: string;\n  type: WorkspaceLayoutType.Component;\n  content: React.ReactElement<any>;\n  heading?: React.ReactNode;\n  defaultSize?: number;\n  defaultCollapsed?: boolean;\n  collapsedSize?: number;\n  minSize?: number;\n  undocked?: boolean;\n}\n\nexport interface WorkspaceLayoutProps {\n  layout: WorkspaceLayoutNode;\n  _onStartResize?: (direction: \"vertical\" | \"horizontal\") => void;\n  _onResize?: (direction: \"vertical\" | \"horizontal\") => void;\n}\n\nexport class WorkspaceLayout extends React.Component<WorkspaceLayoutProps, {}> {\n  private renderAccordion({\n    children,\n    direction,\n    animationDuration,\n  }: {\n    children: readonly WorkspaceLayoutNode[];\n    direction: \"horizontal\" | \"vertical\";\n    animationDuration?: number;\n  }) {\n    const { _onStartResize, _onResize } = this.props;\n    const items = children.map((child, index) => {\n      let dockSide: DockSide;\n      if (direction === \"horizontal\" && !child.undocked) {\n        if (index === 0) {\n          dockSide = DockSide.Left;\n        } else if (index === children.length - 1) {\n          dockSide = DockSide.Right;\n        }\n      }\n      let collapsedSize = child.collapsedSize;\n      if (collapsedSize === undefined && direction === \"horizontal\") {\n        collapsedSize = DEFAULT_HORIZONTAL_COLLAPSED_SIZE;\n      }\n      return (\n        <AccordionItem\n          key={child.type === WorkspaceLayoutType.Component ? child.id : index}\n          heading={\n            child.type === WorkspaceLayoutType.Component\n              ? child.heading\n              : undefined\n          }\n          dockSide={dockSide}\n          defaultSize={child.defaultSize}\n          defaultCollapsed={child.defaultCollapsed}\n          collapsedSize={collapsedSize}\n          minSize={child.minSize}\n        >\n          {this.renderLayout(child)}\n        </AccordionItem>\n      );\n    });\n    return (\n      <Accordion\n        direction={direction}\n        onStartResize={_onStartResize}\n        onResize={_onResize}\n        animationDuration={animationDuration}\n      >\n        {items}\n      </Accordion>\n    );\n  }\n\n  private renderLayout(layout: WorkspaceLayoutNode) {\n    if (layout.type === WorkspaceLayoutType.Row) {\n      return this.renderAccordion({\n        children: layout.children,\n        direction: \"horizontal\",\n        animationDuration: layout.animationDuration,\n      });\n    }\n    if (layout.type === WorkspaceLayoutType.Column) {\n      return this.renderAccordion({\n        children: layout.children,\n        direction: \"vertical\",\n        animationDuration: layout.animationDuration,\n      });\n    }\n    if (layout.type === WorkspaceLayoutType.Component) {\n      return React.Children.only(layout.content);\n    }\n    return null;\n  }\n\n  render() {\n    const { layout } = this.props;\n    return this.renderLayout(layout);\n  }\n}\n","import * as React from \"react\";\n\nimport { ElementIri, ElementTypeIri } from \"../data/model\";\n\nimport { Element } from \"../diagram/elements\";\nimport { Vector } from \"../diagram/geometry\";\nimport {\n  DiagramView,\n  DropOnPaperEvent,\n  WidgetAttachment,\n} from \"../diagram/view\";\nimport { PaperArea, ZoomOptions } from \"../diagram/paperArea\";\n\nimport { ClassTree } from \"../widgets/classTree\";\nimport { InstancesSearch, SearchCriteria } from \"../widgets/instancesSearch\";\nimport { LinkTypesToolbox } from \"../widgets/linksToolbox\";\n\nimport { AsyncModel } from \"../editor/asyncModel\";\nimport { EditorController } from \"../editor/editorController\";\n\nimport {\n  WorkspaceContext,\n  WorkspaceEventHandler,\n  WorkspaceEventKey,\n} from \"./workspaceContext\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { Cancellation, CancellationToken } from \"../viewUtils/async\";\n\nimport {\n  WorkspaceLayout,\n  WorkspaceLayoutType,\n  WorkspaceLayoutNode,\n} from \"./layout/layout\";\n\nexport interface WorkspaceMarkupProps {\n  toolbar: React.ReactElement<any>;\n  model: AsyncModel;\n  view: DiagramView;\n  editor: EditorController;\n  metadataApi?: MetadataApi;\n  hidePanels?: boolean;\n  hideToolbar?: boolean;\n  hideScrollBars?: boolean;\n  searchCriteria?: SearchCriteria;\n  onSearchCriteriaChanged: (criteria: SearchCriteria) => void;\n  zoomOptions?: ZoomOptions;\n  onZoom?: (scaleX: number, scaleY: number) => void;\n  isLeftPanelOpen?: boolean;\n  isRightPanelOpen?: boolean;\n  onWorkspaceEvent?: WorkspaceEventHandler;\n  watermarkSvg?: string;\n  watermarkUrl?: string;\n  elementsSearchPanel?: React.ReactElement<any>;\n}\n\nexport class WorkspaceMarkup extends React.Component<WorkspaceMarkupProps, {}> {\n  element: HTMLElement;\n  paperArea: PaperArea;\n\n  private untilMouseUpClasses: string[] = [];\n  private readonly cancellation = new Cancellation();\n\n  private triggerWorkspaceEvent = (key: WorkspaceEventKey) => {\n    const { onWorkspaceEvent } = this.props;\n    if (onWorkspaceEvent) {\n      onWorkspaceEvent(key);\n    }\n  };\n\n  private addToolbarWidgetToPaper() {\n    const { hideToolbar, view, toolbar } = this.props;\n    if (!hideToolbar) {\n      view.setPaperWidget({\n        key: \"toolbar\",\n        widget: <ToolbarWidget>{toolbar}</ToolbarWidget>,\n        attachment: WidgetAttachment.Viewport,\n      });\n    }\n  }\n\n  private onCreateInstance = async (\n    classId: ElementTypeIri,\n    position?: Vector\n  ) => {\n    const { editor, view, model, metadataApi } = this.props;\n    await forceNonReactExecutionContext();\n    const batch = model.history.startBatch();\n\n    const signal = this.cancellation.signal;\n    const elementModel = await CancellationToken.mapCancelledToNull(\n      signal,\n      metadataApi.generateNewElement([classId], signal)\n    );\n    if (elementModel === null) {\n      return;\n    }\n\n    const element = editor.createNewEntity({ elementModel });\n    const targetPosition =\n      position || getViewportCenterInPaperCoords(this.paperArea);\n    element.setPosition(targetPosition);\n\n    view.performSyncUpdate();\n    centerElementToPosition(element, targetPosition);\n\n    batch.store();\n    editor.setSelection([element]);\n    editor.showEditEntityForm(element);\n  };\n\n  private getLeftPanelLayout(): WorkspaceLayoutNode {\n    const { view, editor, model, searchCriteria, onSearchCriteriaChanged } =\n      this.props;\n    const classTree = (\n      <ClassTree\n        view={view}\n        editor={editor}\n        onClassSelected={(classId) => {\n          const elementType = model.createClass(classId);\n          onSearchCriteriaChanged({ elementType });\n        }}\n        onCreateInstance={this.onCreateInstance}\n      />\n    );\n    const instancesSearch = (\n      <InstancesSearch\n        view={view}\n        model={model}\n        criteria={searchCriteria || {}}\n        onCriteriaChanged={onSearchCriteriaChanged}\n      />\n    );\n    return {\n      type: WorkspaceLayoutType.Column,\n      children: [\n        {\n          id: \"classes\",\n          type: WorkspaceLayoutType.Component,\n          content: classTree,\n          heading: \"Classes\",\n        },\n        {\n          id: \"instances\",\n          type: WorkspaceLayoutType.Component,\n          content: instancesSearch,\n          heading: \"Instances\",\n        },\n      ],\n      defaultSize: 275,\n      defaultCollapsed: !this.props.isLeftPanelOpen,\n    };\n  }\n\n  private getRightPanelLayout(): WorkspaceLayoutNode {\n    const { view, editor, elementsSearchPanel } = this.props;\n    const rightPanel: WorkspaceLayoutNode = {\n      type: WorkspaceLayoutType.Column,\n      children: [\n        {\n          id: \"connections\",\n          type: WorkspaceLayoutType.Component,\n          content: <LinkTypesToolbox view={view} editor={editor} />,\n          heading: \"Connections\",\n        },\n      ],\n      defaultSize: 275,\n      defaultCollapsed: !this.props.isRightPanelOpen,\n    };\n    if (elementsSearchPanel) {\n      rightPanel.children = [\n        ...rightPanel.children,\n        {\n          id: \"search\",\n          type: WorkspaceLayoutType.Component,\n          content: React.cloneElement(elementsSearchPanel, { view, editor }),\n          heading: \"Search in diagram\",\n        },\n      ];\n    }\n    return rightPanel;\n  }\n\n  render() {\n    const paper: WorkspaceLayoutNode = {\n      id: \"paper\",\n      type: WorkspaceLayoutType.Component,\n      content: (\n        <div\n          className=\"graph-explorer__main-panel\"\n          style={{ flex: \"1 1 0px\", width: \"100%\" }}\n        >\n          <PaperArea\n            ref={(el) => {\n              this.paperArea = el;\n            }}\n            view={this.props.view}\n            zoomOptions={this.props.zoomOptions}\n            hideScrollBars={this.props.hideScrollBars}\n            watermarkSvg={this.props.watermarkSvg}\n            watermarkUrl={this.props.watermarkUrl}\n            onDragDrop={this.onDropOnPaper}\n            onZoom={this.props.onZoom}\n          ></PaperArea>\n        </div>\n      ),\n    };\n    const workspaceLayout: WorkspaceLayoutNode = this.props.hidePanels\n      ? paper\n      : {\n          type: WorkspaceLayoutType.Row,\n          children: [\n            this.getLeftPanelLayout(),\n            paper,\n            this.getRightPanelLayout(),\n          ],\n        };\n    return (\n      <WorkspaceContext.Provider\n        value={{\n          workspace: {\n            editor: this.props.editor,\n            triggerWorkspaceEvent: this.triggerWorkspaceEvent,\n          },\n        }}\n      >\n        <div\n          ref={(e) => {\n            this.element = e;\n          }}\n          className=\"graph-explorer\"\n        >\n          <div className=\"graph-explorer__workspace\">\n            <WorkspaceLayout\n              layout={workspaceLayout}\n              _onStartResize={(direction) =>\n                this.untilMouseUp({\n                  preventTextSelection: true,\n                  verticalResizing: direction === \"vertical\",\n                  horizontalResizing: direction === \"horizontal\",\n                })\n              }\n            />\n          </div>\n        </div>\n      </WorkspaceContext.Provider>\n    );\n  }\n\n  componentDidMount() {\n    document.addEventListener(\"mouseup\", this.onDocumentMouseUp);\n    this.addToolbarWidgetToPaper();\n  }\n\n  componentWillUnmount() {\n    document.removeEventListener(\"mouseup\", this.onDocumentMouseUp);\n    this.cancellation.abort();\n  }\n\n  preventTextSelection() {\n    this.untilMouseUp({ preventTextSelection: true });\n  }\n\n  private untilMouseUp(params: {\n    preventTextSelection?: boolean;\n    horizontalResizing?: boolean;\n    verticalResizing?: boolean;\n  }) {\n    this.untilMouseUpClasses = [];\n    if (params.preventTextSelection) {\n      this.untilMouseUpClasses.push(\"graph-explorer--unselectable\");\n    }\n    if (params.horizontalResizing) {\n      this.untilMouseUpClasses.push(\"graph-explorer--horizontal-resizing\");\n    }\n    if (params.verticalResizing) {\n      this.untilMouseUpClasses.push(\"graph-explorer--vertical-resizing\");\n    }\n\n    for (const className of this.untilMouseUpClasses) {\n      this.element.classList.add(className);\n    }\n  }\n\n  private onDocumentMouseUp = () => {\n    for (const className of this.untilMouseUpClasses) {\n      this.element.classList.remove(className);\n    }\n    this.untilMouseUpClasses = [];\n  };\n\n  private onDropOnPaper = (e: DragEvent, paperPosition: Vector) => {\n    e.preventDefault();\n\n    const event: DropOnPaperEvent = { dragEvent: e, paperPosition };\n    if (this.props.view._tryHandleDropOnPaper(event)) {\n      return;\n    }\n\n    const iris = tryParseDefaultDragAndDropData(e);\n    if (iris.length > 0) {\n      this.props.editor.onDragDrop(iris, paperPosition);\n    }\n  };\n}\n\nclass ToolbarWidget extends React.Component<{ children: React.JSX.Element }> {\n  render() {\n    return (\n      <div className=\"graph-explorer__toolbar-widget\">\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\nfunction forceNonReactExecutionContext(): Promise<void> {\n  // force non-React executing context to resolve forceUpdate() synchronously\n  return Promise.resolve();\n}\n\nfunction getViewportCenterInPaperCoords(paperArea: PaperArea): Vector {\n  const viewport = paperArea.getAreaMetrics();\n  return paperArea.clientToPaperCoords(\n    viewport.clientWidth / 2,\n    viewport.clientHeight / 2\n  );\n}\n\nfunction centerElementToPosition(element: Element, center: Vector) {\n  const position = {\n    x: center.x - element.size.width / 2,\n    y: center.y - element.size.height / 2,\n  };\n  element.setPosition(position);\n}\n\nfunction tryParseDefaultDragAndDropData(e: DragEvent): ElementIri[] {\n  const tryGetIri = (type: string, decode = false) => {\n    try {\n      const iriString = e.dataTransfer.getData(type);\n      if (!iriString) {\n        return undefined;\n      }\n      let iris: ElementIri[];\n      try {\n        iris = JSON.parse(iriString);\n      } catch (_e) {\n        iris = [(decode ? decodeURI(iriString) : iriString) as ElementIri];\n      }\n      return iris.length === 0 ? undefined : iris;\n    } catch (_e) {\n      return undefined;\n    }\n  };\n\n  return (\n    tryGetIri(\"application/x-graph-explorer-elements\") ||\n    tryGetIri(\"text/uri-list\", true) ||\n    tryGetIri(\"text\") || // IE11, Edge\n    []\n  );\n}\n","import { Component, createElement, ReactElement, cloneElement } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport saveAs from \"file-saverjs\";\n\nimport {\n  LinkRouter,\n  LinkTemplateResolver,\n  TemplateResolver,\n  TypeStyleResolver,\n} from \"../customization/props\";\n\nimport { MetadataApi } from \"../data/metadataApi\";\nimport { ValidationApi } from \"../data/validationApi\";\n\nimport { Rect } from \"../diagram/geometry\";\nimport { RestoreGeometry } from \"../diagram/commands\";\nimport { CommandHistory, NonRememberingHistory } from \"../diagram/history\";\nimport {\n  PaperArea,\n  ZoomOptions,\n  PointerEvent,\n  PointerUpEvent,\n} from \"../diagram/paperArea\";\nimport {\n  DiagramView,\n  IriClickHandler,\n  LabelLanguageSelector,\n  WidgetAttachment,\n} from \"../diagram/view\";\n\nimport { AsyncModel, GroupBy } from \"../editor/asyncModel\";\nimport { AuthoringState } from \"../editor/authoringState\";\nimport { EditorController, PropertyEditor } from \"../editor/editorController\";\n\nimport { EventObserver } from \"../viewUtils/events\";\nimport { dataURLToBlob } from \"../viewUtils/toSvg\";\n\nimport { PropertySuggestionHandler } from \"../widgets/connectionsMenu\";\nimport { SearchCriteria } from \"../widgets/instancesSearch\";\nimport { Navigator } from \"../widgets/navigator\";\n\nimport { DefaultToolbar, ToolbarProps } from \"./toolbar\";\nimport { WorkspaceMarkup, WorkspaceMarkupProps } from \"./workspaceMarkup\";\nimport { WorkspaceEventHandler, WorkspaceEventKey } from \"./workspaceContext\";\nimport { forceLayout, applyLayout } from \"../viewUtils/layout\";\n\nconst GRAPH_EXPLORER_WEBSITE = \"https://graph-explorer.org/\";\nconst GRAPH_EXPLORER_LOGO_SVG: string | undefined = undefined;\n\nexport interface WorkspaceProps {\n  /** Saves diagram layout (position and state of elements and links). */\n  onSaveDiagram?: (workspace: Workspace) => void;\n  /** Persists authored changes in the editor. */\n  onPersistChanges?: (workspace: Workspace) => void;\n  onPointerDown?: (e: PointerEvent) => void;\n  onPointerMove?: (e: PointerEvent) => void;\n  onPointerUp?: (e: PointerUpEvent) => void;\n\n  /**\n   * Custom toolbar to replace the default one.\n   */\n  toolbar?: ReactElement<any>;\n  /** @default false */\n  hidePanels?: boolean;\n  /** @default false */\n  hideToolbar?: boolean;\n  /** @default false */\n  hideScrollBars?: boolean;\n  /** @default false */\n  hideHalo?: boolean;\n  /** @default true */\n  hideTutorial?: boolean;\n  /** @default false */\n  hideNavigator?: boolean;\n  /** @default false */\n  collapseNavigator?: boolean;\n  /** @default true */\n  leftPanelInitiallyOpen?: boolean;\n  /** @default false */\n  rightPanelInitiallyOpen?: boolean;\n\n  /**\n   * Set of languages to display diagram data.\n   */\n  languages?: readonly WorkspaceLanguage[];\n  /**\n   * Currently selected language.\n   */\n  language?: string;\n  /**\n   * Called when user selected another language from the UI.\n   *\n   * If this function is set, language selection will work in controlled mode;\n   * otherwise language selection will function in uncontrolled mode.\n   */\n  onLanguageChange?: (language: string) => void;\n\n  zoomOptions?: ZoomOptions;\n  onZoom?: (scaleX: number, scaleY: number) => void;\n\n  history?: CommandHistory;\n  viewOptions?: DiagramViewOptions;\n\n  /**\n   * If provided, switches editor into \"authoring mode\".\n   */\n  metadataApi?: MetadataApi;\n  validationApi?: ValidationApi;\n  propertyEditor?: PropertyEditor;\n  onWorkspaceEvent?: WorkspaceEventHandler;\n\n  /**\n   * Custom panel to search existing elements on the diagram.\n   */\n  _elementsSearchPanel?: ReactElement<any>;\n\n  typeStyleResolver?: TypeStyleResolver;\n  linkTemplateResolver?: LinkTemplateResolver;\n  elementTemplateResolver?: TemplateResolver;\n  /**\n   * Overrides label selection based on target language.\n   */\n  selectLabelLanguage?: LabelLanguageSelector;\n}\n\nexport interface DiagramViewOptions {\n  linkRouter?: LinkRouter;\n  onIriClick?: IriClickHandler;\n  groupBy?: GroupBy[];\n  disableDefaultHalo?: boolean;\n  suggestProperties?: PropertySuggestionHandler;\n}\n\nexport interface WorkspaceLanguage {\n  code: string;\n  label: string;\n}\n\nexport interface WorkspaceState {\n  readonly criteria?: SearchCriteria;\n}\n\nexport class Workspace extends Component<WorkspaceProps, WorkspaceState> {\n  static readonly defaultProps: Partial<WorkspaceProps> = {\n    hideTutorial: true,\n    collapseNavigator: false,\n    leftPanelInitiallyOpen: true,\n    rightPanelInitiallyOpen: false,\n    languages: [\n      { code: \"en\", label: \"English\" },\n      { code: \"ru\", label: \"Russian\" },\n    ],\n    language: \"en\",\n  };\n\n  private readonly listener = new EventObserver();\n\n  private readonly model: AsyncModel;\n  private readonly view: DiagramView;\n  private readonly editor: EditorController;\n\n  private markup: WorkspaceMarkup;\n\n  private _watermarkSvg: string | undefined = GRAPH_EXPLORER_LOGO_SVG;\n  private _watermarkUrl: string | undefined = GRAPH_EXPLORER_WEBSITE;\n\n  constructor(props: WorkspaceProps) {\n    super(props);\n\n    const {\n      hideHalo,\n      history,\n      viewOptions = {},\n      metadataApi,\n      validationApi,\n      propertyEditor,\n      elementTemplateResolver,\n      linkTemplateResolver,\n      typeStyleResolver,\n      selectLabelLanguage,\n    } = this.props;\n    const {\n      linkRouter,\n      onIriClick,\n      disableDefaultHalo,\n      suggestProperties,\n      groupBy,\n    } = viewOptions;\n\n    this.model = new AsyncModel(\n      history || new NonRememberingHistory(),\n      groupBy || []\n    );\n    this.view = new DiagramView(this.model, {\n      elementTemplateResolver,\n      linkTemplateResolver,\n      typeStyleResolver,\n      selectLabelLanguage,\n      linkRouter,\n      onIriClick,\n    });\n    this.editor = new EditorController({\n      model: this.model,\n      view: this.view,\n      disableHalo: hideHalo || disableDefaultHalo,\n      suggestProperties,\n      validationApi,\n      propertyEditor,\n    });\n    this.editor.setMetadataApi(metadataApi);\n\n    this.view.setLanguage(this.props.language);\n    this.state = {};\n  }\n\n  _getPaperArea(): PaperArea | undefined {\n    return this.markup ? this.markup.paperArea : undefined;\n  }\n\n  _setWatermark(\n    watermarkSvg: string | undefined,\n    watermarkUrl: string | undefined\n  ) {\n    this._watermarkSvg = watermarkSvg;\n    this._watermarkUrl = watermarkUrl;\n    this.forceUpdate();\n  }\n\n  render(): ReactElement<any> {\n    const {\n      hidePanels,\n      hideToolbar,\n      metadataApi,\n      hideScrollBars,\n      onWorkspaceEvent,\n      _elementsSearchPanel,\n    } = this.props;\n    return createElement(WorkspaceMarkup, {\n      ref: (markup) => {\n        this.markup = markup;\n      },\n      hidePanels,\n      hideToolbar,\n      hideScrollBars,\n      model: this.model,\n      view: this.view,\n      editor: this.editor,\n      metadataApi,\n      leftPanelInitiallyOpen: this.props.leftPanelInitiallyOpen,\n      rightPanelInitiallyOpen: this.props.rightPanelInitiallyOpen,\n      searchCriteria: this.state.criteria,\n      onSearchCriteriaChanged: (criteria) => this.setState({ criteria }),\n      zoomOptions: this.props.zoomOptions,\n      onZoom: this.props.onZoom,\n      isLeftPanelOpen: this.props.leftPanelInitiallyOpen,\n      isRightPanelOpen: this.props.rightPanelInitiallyOpen,\n      toolbar: createElement(ToolbarWrapper, { workspace: this }),\n      onWorkspaceEvent,\n      watermarkSvg: this._watermarkSvg,\n      watermarkUrl: this._watermarkUrl,\n      elementsSearchPanel: _elementsSearchPanel,\n    } as WorkspaceMarkupProps & React.ClassAttributes<WorkspaceMarkup>);\n  }\n\n  componentDidMount() {\n    const { onWorkspaceEvent } = this.props;\n\n    this.editor._initializePaperComponents(this.markup.paperArea);\n    this.updateNavigator(!this.props.hideNavigator);\n\n    this.listener.listen(this.model.events, \"loadingSuccess\", () => {\n      this.view.performSyncUpdate();\n      this.markup.paperArea.centerContent();\n    });\n\n    this.listener.listen(\n      this.model.events,\n      \"elementEvent\",\n      ({ key: _key, data }) => {\n        if (!data.requestedAddToFilter) {\n          return;\n        }\n        const { source, linkType, direction } = data.requestedAddToFilter;\n        this.setState({\n          criteria: {\n            refElement: source,\n            refElementLink: linkType,\n            linkDirection: direction,\n          },\n        });\n        if (onWorkspaceEvent) {\n          onWorkspaceEvent(WorkspaceEventKey.searchUpdateCriteria);\n        }\n      }\n    );\n\n    this.listener.listen(this.markup.paperArea.events, \"pointerUp\", (e) => {\n      if (this.props.onPointerUp) {\n        this.props.onPointerUp(e);\n      }\n    });\n    this.listener.listen(this.markup.paperArea.events, \"pointerMove\", (e) => {\n      if (this.props.onPointerMove) {\n        this.props.onPointerMove(e);\n      }\n    });\n    this.listener.listen(this.markup.paperArea.events, \"pointerDown\", (e) => {\n      if (this.props.onPointerDown) {\n        this.props.onPointerDown(e);\n      }\n    });\n\n    if (onWorkspaceEvent) {\n      this.listener.listen(this.editor.events, \"changeSelection\", () =>\n        onWorkspaceEvent(WorkspaceEventKey.editorChangeSelection)\n      );\n      this.listener.listen(this.editor.events, \"toggleDialog\", () =>\n        onWorkspaceEvent(WorkspaceEventKey.editorToggleDialog)\n      );\n      this.listener.listen(this.editor.events, \"addElements\", () =>\n        onWorkspaceEvent(WorkspaceEventKey.editorAddElements)\n      );\n    }\n  }\n\n  componentDidUpdate(nextProps: WorkspaceProps) {\n    const controlledLanguage = Boolean(nextProps.onLanguageChange);\n    if (controlledLanguage && nextProps.language !== this.view.getLanguage()) {\n      this.view.setLanguage(nextProps.language);\n    }\n\n    if (nextProps.metadataApi !== this.editor.metadataApi) {\n      this.editor.setMetadataApi(nextProps.metadataApi);\n    }\n\n    if (nextProps.hideNavigator !== this.props.hideNavigator) {\n      this.updateNavigator(!nextProps.hideNavigator);\n    }\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n    this.view.dispose();\n  }\n\n  private updateNavigator(showNavigator: boolean) {\n    if (showNavigator) {\n      const widget = createElement(Navigator, {\n        view: this.view,\n        expanded: !this.props.collapseNavigator,\n      });\n      this.view.setPaperWidget({\n        key: \"navigator\",\n        widget,\n        attachment: WidgetAttachment.Viewport,\n      });\n    } else {\n      this.view.setPaperWidget({\n        key: \"navigator\",\n        widget: undefined,\n        attachment: WidgetAttachment.Viewport,\n      });\n    }\n  }\n\n  getModel() {\n    return this.model;\n  }\n  getDiagram() {\n    return this.view;\n  }\n  getEditor() {\n    return this.editor;\n  }\n\n  preventTextSelectionUntilMouseUp() {\n    this.markup.preventTextSelection();\n  }\n\n  zoomToFit = () => {\n    this.markup.paperArea.zoomToFit();\n  };\n\n  zoomToFitRect = (bbox: Rect) => {\n    this.markup.paperArea.zoomToFitRect(bbox);\n  };\n\n  clearAll = () => {\n    this.editor.removeItems([...this.model.elements]);\n  };\n\n  showWaitIndicatorWhile(operation: Promise<any>) {\n    this.editor.setSpinner({});\n    if (operation) {\n      operation\n        .then(() => {\n          this.editor.setSpinner(undefined);\n        })\n        .catch((error) => {\n          console.error(error);\n          this.editor.setSpinner({\n            statusText: \"Unknown error occured\",\n            errorOccured: true,\n          });\n        });\n    }\n  }\n\n  forceLayout = () => {\n    const batch = this.model.history.startBatch(\"Force layout\");\n    batch.history.registerToUndo(RestoreGeometry.capture(this.model));\n\n    applyLayout(this.model, forceLayout({ model: this.model }));\n\n    for (const link of this.model.links) {\n      link.setVertices([]);\n    }\n\n    batch.store();\n  };\n\n  exportSvg = (fileName?: string) => {\n    this.markup.paperArea.exportSVG().then((svg) => {\n      fileName = fileName || \"diagram.svg\";\n      const xmlEncodingHeader = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>';\n      const blob = new Blob([xmlEncodingHeader + svg], {\n        type: \"image/svg+xml\",\n      });\n      saveAs(blob, fileName);\n    });\n  };\n\n  exportPng = (fileName?: string) => {\n    fileName = fileName || \"diagram.png\";\n    this.markup.paperArea\n      .exportPNG({ backgroundColor: \"white\" })\n      .then((dataUri) => {\n        const blob = dataURLToBlob(dataUri);\n        saveAs(blob, fileName);\n      });\n  };\n\n  undo = () => {\n    this.model.history.undo();\n  };\n\n  redo = () => {\n    this.model.history.redo();\n  };\n\n  zoomBy = (value: number) => {\n    this.markup.paperArea.zoomBy(value);\n  };\n\n  zoomIn = () => {\n    this.markup.paperArea.zoomIn();\n  };\n\n  zoomOut = () => {\n    this.markup.paperArea.zoomOut();\n  };\n\n  print = () => {\n    this.markup.paperArea.exportSVG().then((svg) => {\n      const printWindow = window.open(\"\", undefined, \"width=1280,height=720\");\n      printWindow.document.write(svg);\n      printWindow.document.close();\n      printWindow.print();\n    });\n  };\n\n  changeLanguage = (language: string) => {\n    const { onLanguageChange } = this.props;\n    // if language is in controlled mode we'll just forward the change\n    if (onLanguageChange) {\n      onLanguageChange(language);\n    } else {\n      this.view.setLanguage(language);\n      // since we have toolbar dependent on language, we're forcing update here\n      this.forceUpdate();\n    }\n  };\n\n  centerTo = (paperPosition?: { x: number; y: number }) => {\n    this.markup.paperArea.centerTo(paperPosition);\n  };\n}\n\ninterface ToolbarWrapperProps {\n  workspace: Workspace;\n}\n\nclass ToolbarWrapper extends Component<ToolbarWrapperProps, {}> {\n  private readonly listener = new EventObserver();\n\n  render() {\n    const { workspace } = this.props;\n    const view = workspace.getDiagram();\n    const editor = workspace.getEditor();\n    const { languages, onSaveDiagram, onPersistChanges, hidePanels, toolbar } =\n      workspace.props;\n\n    const canPersistChanges = onPersistChanges\n      ? !AuthoringState.isEmpty(editor.authoringState)\n      : undefined;\n    const canSaveDiagram = !canPersistChanges;\n\n    const defaultToolbarProps: ToolbarProps = {\n      onZoomIn: workspace.zoomIn,\n      onZoomOut: workspace.zoomOut,\n      onZoomToFit: workspace.zoomToFit,\n      onPrint: workspace.print,\n      onExportSVG: workspace.exportSvg,\n      onExportPNG: workspace.exportPng,\n      canSaveDiagram,\n      onSaveDiagram: onSaveDiagram ? () => onSaveDiagram(workspace) : undefined,\n      canPersistChanges,\n      onPersistChanges: onPersistChanges\n        ? () => onPersistChanges(workspace)\n        : undefined,\n      onForceLayout: () => {\n        workspace.forceLayout();\n        workspace.getDiagram().performSyncUpdate();\n        workspace.zoomToFit();\n      },\n      onClearAll: workspace.clearAll,\n      languages,\n      selectedLanguage: view.getLanguage(),\n      onChangeLanguage: workspace.changeLanguage,\n      hidePanels,\n    };\n    if (toolbar) {\n      const toolbarProps: ToolbarProps = {\n        ...defaultToolbarProps,\n        ...toolbar.props,\n      };\n      return cloneElement(toolbar, toolbarProps);\n    } else {\n      return createElement(DefaultToolbar, defaultToolbarProps);\n    }\n  }\n\n  componentDidMount() {\n    const { workspace } = this.props;\n    const editor = workspace.getEditor();\n    const view = workspace.getDiagram();\n    this.listener.listen(editor.events, \"changeAuthoringState\", () => {\n      this.forceUpdate();\n    });\n    // The toolbar is registered as a paper widget once, so its element keeps the\n    // same reference and React bails out of re-rendering it when an ancestor\n    // updates. Re-render from here instead, otherwise the language `<select>`\n    // keeps showing the previously selected language.\n    this.listener.listen(view.events, \"changeLanguage\", () => {\n      this.forceUpdate();\n    });\n  }\n\n  componentWillUnmount() {\n    this.listener.stopListening();\n  }\n}\n\nexport function renderTo<WorkspaceComponentProps>(\n  workspace: React.ComponentClass<WorkspaceComponentProps>,\n  container: HTMLElement,\n  props: WorkspaceComponentProps\n) {\n  createRoot(container).render(createElement(workspace, props));\n}\n","export { LINK_SHOW_IRI } from \"./customization/defaultLinkStyles\";\n\nexport { TemplateProperties } from \"./data/schema\";\n\nexport * from \"./diagram/paper\";\nexport * from \"./diagram/paperArea\";\n\nexport * from \"./viewUtils/async\";\nexport * from \"./viewUtils/collections\";\nexport * from \"./viewUtils/keyedObserver\";\nexport * from \"./viewUtils/spinner\";\n\nexport * from \"./widgets/listElementView\";\nexport * from \"./widgets/searchResults\";\n\nexport { WorkspaceContext } from \"./workspace/workspaceContext\";\nexport type { WorkspaceContextWrapper } from \"./workspace/workspaceContext\";\n\nexport {\n  groupForceLayout,\n  groupRemoveOverlaps,\n  padded,\n  biasFreePadded,\n  getContentFittingBoxForLayout,\n} from \"./viewUtils/layout\";\n"],"mappings":"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"}