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
Source Map (JSON)
{"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 \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 \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‘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 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 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 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} → {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 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 {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> 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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"}