@macrostrat/feedback-components 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/extractions/index.cjs +5 -2
- package/dist/extractions/index.cjs.map +1 -1
- package/dist/extractions/index.js +2 -2
- package/dist/extractions/index.js.map +1 -1
- package/dist/extractions/main.module.sass.cjs +6 -1
- package/dist/extractions/main.module.sass.cjs.map +1 -1
- package/dist/extractions/main.module.sass.js +4 -1
- package/dist/extractions/main.module.sass.js.map +1 -1
- package/dist/feedback/edit-state.cjs +6 -4
- package/dist/feedback/edit-state.cjs.map +1 -1
- package/dist/feedback/feedback.module.sass.cjs +6 -1
- package/dist/feedback/feedback.module.sass.cjs.map +1 -1
- package/dist/feedback/feedback.module.sass.js +4 -1
- package/dist/feedback/feedback.module.sass.js.map +1 -1
- package/dist/feedback/graph.cjs +3 -1
- package/dist/feedback/graph.cjs.map +1 -1
- package/dist/feedback/graph.js +2 -2
- package/dist/feedback/graph.js.map +1 -1
- package/dist/feedback/index.cjs +6 -3
- package/dist/feedback/index.cjs.map +1 -1
- package/dist/feedback/index.js +2 -2
- package/dist/feedback/index.js.map +1 -1
- package/dist/feedback/matches.cjs +3 -1
- package/dist/feedback/matches.cjs.map +1 -1
- package/dist/feedback/matches.js +2 -2
- package/dist/feedback/matches.js.map +1 -1
- package/dist/feedback/node.cjs +4 -3
- package/dist/feedback/node.cjs.map +1 -1
- package/dist/feedback/node.js +2 -2
- package/dist/feedback/node.js.map +1 -1
- package/dist/feedback/text-visualizer.cjs +3 -1
- package/dist/feedback/text-visualizer.cjs.map +1 -1
- package/dist/feedback/text-visualizer.js +2 -2
- package/dist/feedback/text-visualizer.js.map +1 -1
- package/dist/feedback/type-selector/index.cjs +5 -2
- package/dist/feedback/type-selector/index.cjs.map +1 -1
- package/dist/feedback/type-selector/index.js +2 -2
- package/dist/feedback/type-selector/index.js.map +1 -1
- package/dist/feedback/type-selector/main.module.sass.cjs +6 -1
- package/dist/feedback/type-selector/main.module.sass.cjs.map +1 -1
- package/dist/feedback/type-selector/main.module.sass.js +4 -1
- package/dist/feedback/type-selector/main.module.sass.js.map +1 -1
- package/dist/feedback/typelist.cjs +3 -1
- package/dist/feedback/typelist.cjs.map +1 -1
- package/dist/feedback/typelist.js +2 -2
- package/dist/feedback/typelist.js.map +1 -1
- package/dist/feedback-components.css +2 -2
- package/package.json +18 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.2] - 2026-04-04 [_changes_](https://github.com/UW-Macrostrat/web-components/compare/@macrostrat/feedback-components-v2.0.1...@macrostrat/feedback-components-v2.0.2)
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated [BlueprintJS](https://blueprintjs.com) dependencies to latest `6.x.x`
|
|
8
|
+
series
|
|
9
|
+
[fa23ec06](https://github.com/UW-Macrostrat/web-components/commit/fa23ec06a42fefa638f1b95bdb68473f2fc9615b)
|
|
10
|
+
- Updated dependencies
|
|
11
|
+
[fa23ec06](https://github.com/UW-Macrostrat/web-components/commit/fa23ec06a42fefa638f1b95bdb68473f2fc9615b)
|
|
12
|
+
- @macrostrat/data-components@1.1.4
|
|
13
|
+
- @macrostrat/ui-components@5.0.6
|
|
14
|
+
- @macrostrat/data-sheet@3.0.3
|
|
15
|
+
|
|
3
16
|
All notable changes to this project will be documented in this file. The format
|
|
4
17
|
is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
|
|
5
18
|
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
19
|
|
|
20
|
+
## [2.0.1] - 2026-01-29
|
|
21
|
+
|
|
22
|
+
- Change layout of `package.json`
|
|
23
|
+
|
|
7
24
|
## [2.0.0] - 2026-01-26
|
|
8
25
|
|
|
9
26
|
- Update peer dependencies to React 18
|
|
@@ -6,7 +6,10 @@ const core = require("@blueprintjs/core");
|
|
|
6
6
|
const colorUtils = require("@macrostrat/color-utils");
|
|
7
7
|
const hyper = require("@macrostrat/hyper");
|
|
8
8
|
const uiComponents = require("@macrostrat/ui-components");
|
|
9
|
-
const
|
|
9
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
10
|
+
const classNames__default = /* @__PURE__ */ _interopDefault(classNames);
|
|
11
|
+
const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
|
|
12
|
+
const h = hyper__default.default.styled(main_module.default);
|
|
10
13
|
function buildHighlights(entities, parent) {
|
|
11
14
|
let highlights = [];
|
|
12
15
|
let parents = [];
|
|
@@ -108,7 +111,7 @@ function EntityTag({
|
|
|
108
111
|
matchComponent = null
|
|
109
112
|
}) {
|
|
110
113
|
const { name, type, match } = data;
|
|
111
|
-
const className =
|
|
114
|
+
const className = classNames__default.default(
|
|
112
115
|
{
|
|
113
116
|
matched: match != null,
|
|
114
117
|
type: data.type?.name ?? "lith"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/extractions/index.ts"],"sourcesContent":["import styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Tag } from \"@blueprintjs/core\";\nimport type { Entity, EntityExt, Highlight, EntityType } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { asChromaColor } from \"@macrostrat/color-utils\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDarkMode } from \"@macrostrat/ui-components\";\n\nexport type { Entity, EntityExt };\n\nconst h = hyper.styled(styles);\n\nexport function buildHighlights(\n entities: EntityExt[],\n parent: EntityExt | null,\n): Highlight[] {\n let highlights = [];\n let parents = [];\n if (parent != null) {\n parents = [parent.id, ...(parent.parents ?? [])];\n }\n\n for (const entity of entities) {\n highlights.push({\n start: entity.indices[0],\n end: entity.indices[1],\n text: entity.name,\n backgroundColor: entity.type?.color,\n tag: entity.type?.name ?? \"lith\",\n id: entity.id,\n parents,\n match: entity.match,\n });\n highlights.push(...buildHighlights(entity.children ?? [], entity));\n }\n return highlights;\n}\n\nexport function enhanceData(extractionData, models, entityTypes) {\n return {\n ...extractionData,\n model: models.get(extractionData.model_id),\n entities: extractionData.entities?.map((d) =>\n enhanceEntity(d, entityTypes),\n ),\n };\n}\n\nexport function getTagStyle(\n baseColor: string,\n options: {\n highlighted?: boolean;\n inDarkMode?: boolean;\n active?: boolean;\n showMatches?: boolean;\n } = {},\n): CSSProperties {\n const _baseColor = asChromaColor(baseColor ?? \"#fff\");\n const {\n highlighted = true,\n inDarkMode = useDarkMode().isEnabled,\n active = false,\n } = options;\n\n let mixAmount = highlighted ? 0.8 : 0.5;\n let backgroundAlpha = highlighted ? 0.8 : 0.2;\n\n if (active) {\n mixAmount = 1;\n backgroundAlpha = 1;\n }\n\n const mixTarget = \"black\";\n\n const color = active ? \"#000\" : _baseColor.mix(mixTarget, mixAmount).hex();\n const borderColor = highlighted\n ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex()\n : \"transparent\";\n\n let backgroundColor = active\n ? _baseColor.alpha(backgroundAlpha).hex()\n : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());\n\n // handle white backgrounds in light mode\n if (!inDarkMode && backgroundColor === \"#ffffff\") {\n backgroundColor = \"#f0f0f0\";\n }\n\n return {\n color,\n backgroundColor,\n boxSizing: \"border-box\",\n borderStyle: \"solid\",\n borderColor,\n borderWidth: \"1.5px\",\n fontWeight: active ? \"bold\" : \"normal\",\n fontSize: \"0.9em\",\n };\n}\n\nfunction enhanceEntity(\n entity: Entity,\n entityTypes: Map<number, EntityType>,\n): EntityExt {\n return {\n ...entity,\n type: addColor(entityTypes.get(entity.type), entity.match != null),\n children: entity.children?.map((d) => enhanceEntity(d, entityTypes)),\n };\n}\n\nfunction addColor(entityType: EntityType, match = false) {\n const color = asChromaColor(entityType.color ?? \"#fff\").brighten(\n match ? 1 : 2,\n );\n\n return { ...entityType, color: color.css() };\n}\n\nexport function ExtractionContext({\n data,\n entityTypes,\n matchComponent,\n}: {\n data: any;\n entityTypes: Map<number, EntityType>;\n matchComponent: MatchComponent;\n}) {\n const highlights = buildHighlights(data.entities, null);\n\n return h(\"div\", [\n h(\"p\", h(HighlightedText, { text: data.paragraph_text, highlights })),\n h(ModelInfo, { data: data.model }),\n h(\n \"ul.entities\",\n data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]);\n}\n\nexport function ModelInfo({ data }) {\n if (!data) return null;\n return h(\"p.model-name\", [\"Model: \", h(\"code.bp6-code\", data.name)]);\n}\n\nexport type MatchComponent = (props: { data: any }) => any;\n\ntype EntityTagProps = {\n data: EntityExt;\n highlighted?: boolean;\n active?: boolean;\n onClickType?: (type: EntityType) => void;\n matchComponent?: MatchComponent;\n};\n\nexport function EntityTag({\n data,\n highlighted = true,\n active = false,\n onClickType,\n matchComponent = null,\n}: EntityTagProps) {\n const { name, type, match } = data;\n\n const className = classNames(\n {\n matched: match != null,\n type: data.type?.name ?? \"lith\",\n },\n \"entity\",\n );\n\n const style = getTagStyle(type?.color, { highlighted, active });\n\n let _matchLink = null;\n if (match != null && matchComponent != null) {\n _matchLink = h(matchComponent, { data: match });\n }\n\n return h(Tag, { style, className }, [\n h(\"span.entity-name\", name),\n \" \",\n h(\n \"code.entity-type.bp6-code\",\n {\n onClick(evt) {\n if (active && onClickType != null) {\n onClickType(type);\n evt.stopPropagation();\n }\n },\n },\n [type?.name, _matchLink],\n ),\n ]);\n}\n\nfunction ExtractionInfo({\n data,\n matchComponent = null,\n}: {\n data: EntityExt;\n matchComponent: MatchComponent;\n}) {\n const children = data.children ?? [];\n\n return h(\"li.entity-row\", [\n h(EntityTag, { data, matchComponent }),\n h.if(children.length > 0)([\n h(\n \"ul.children\",\n children.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]),\n ]);\n}\n\nfunction HighlightedText(props: { text: string; highlights: Highlight[] }) {\n const { text, highlights = [] } = props;\n const parts = [];\n let start = 0;\n\n const sortedHighlights = highlights.sort((a, b) => a.start - b.start);\n const deconflictedHighlights = sortedHighlights.map((highlight, i) => {\n if (i === 0) return highlight;\n const prev = sortedHighlights[i - 1];\n if (highlight.start < prev.end) {\n highlight.start = prev.end;\n }\n return highlight;\n });\n\n for (const highlight of deconflictedHighlights) {\n const { start: s, end, ...rest } = highlight;\n parts.push(text.slice(start, s));\n parts.push(h(\"span.highlight\", { style: rest }, text.slice(s, end)));\n start = end;\n }\n parts.push(text.slice(start));\n return h(\"span\", parts);\n}\n\nfunction normalizeColor(hex8) {\n const background = useDarkMode().isEnabled ? \"#000000\" : \"#ffffff\";\n\n const r = parseInt(hex8.slice(1, 3), 16);\n const g = parseInt(hex8.slice(3, 5), 16);\n const b = parseInt(hex8.slice(5, 7), 16);\n const a = parseInt(hex8.slice(7, 9), 16) / 255;\n\n const bgR = parseInt(background.slice(1, 3), 16);\n const bgG = parseInt(background.slice(3, 5), 16);\n const bgB = parseInt(background.slice(5, 7), 16);\n\n const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);\n\n const blendedR = blend(r, bgR);\n const blendedG = blend(g, bgG);\n const blendedB = blend(b, bgB);\n\n return (\n \"#\" +\n blendedR.toString(16).padStart(2, \"0\") +\n blendedG.toString(16).padStart(2, \"0\") +\n blendedB.toString(16).padStart(2, \"0\")\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: any[]) {\n if (selectedNodes?.length === 0) return true;\n return (\n selectedNodes?.includes(id) ||\n nodes?.some(\n (node) =>\n selectedNodes?.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["styles","asChromaColor","useDarkMode","Tag"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/extractions/index.ts"],"sourcesContent":["import styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Tag } from \"@blueprintjs/core\";\nimport type { Entity, EntityExt, Highlight, EntityType } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { asChromaColor } from \"@macrostrat/color-utils\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDarkMode } from \"@macrostrat/ui-components\";\n\nexport type { Entity, EntityExt };\n\nconst h = hyper.styled(styles);\n\nexport function buildHighlights(\n entities: EntityExt[],\n parent: EntityExt | null,\n): Highlight[] {\n let highlights = [];\n let parents = [];\n if (parent != null) {\n parents = [parent.id, ...(parent.parents ?? [])];\n }\n\n for (const entity of entities) {\n highlights.push({\n start: entity.indices[0],\n end: entity.indices[1],\n text: entity.name,\n backgroundColor: entity.type?.color,\n tag: entity.type?.name ?? \"lith\",\n id: entity.id,\n parents,\n match: entity.match,\n });\n highlights.push(...buildHighlights(entity.children ?? [], entity));\n }\n return highlights;\n}\n\nexport function enhanceData(extractionData, models, entityTypes) {\n return {\n ...extractionData,\n model: models.get(extractionData.model_id),\n entities: extractionData.entities?.map((d) =>\n enhanceEntity(d, entityTypes),\n ),\n };\n}\n\nexport function getTagStyle(\n baseColor: string,\n options: {\n highlighted?: boolean;\n inDarkMode?: boolean;\n active?: boolean;\n showMatches?: boolean;\n } = {},\n): CSSProperties {\n const _baseColor = asChromaColor(baseColor ?? \"#fff\");\n const {\n highlighted = true,\n inDarkMode = useDarkMode().isEnabled,\n active = false,\n } = options;\n\n let mixAmount = highlighted ? 0.8 : 0.5;\n let backgroundAlpha = highlighted ? 0.8 : 0.2;\n\n if (active) {\n mixAmount = 1;\n backgroundAlpha = 1;\n }\n\n const mixTarget = \"black\";\n\n const color = active ? \"#000\" : _baseColor.mix(mixTarget, mixAmount).hex();\n const borderColor = highlighted\n ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex()\n : \"transparent\";\n\n let backgroundColor = active\n ? _baseColor.alpha(backgroundAlpha).hex()\n : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());\n\n // handle white backgrounds in light mode\n if (!inDarkMode && backgroundColor === \"#ffffff\") {\n backgroundColor = \"#f0f0f0\";\n }\n\n return {\n color,\n backgroundColor,\n boxSizing: \"border-box\",\n borderStyle: \"solid\",\n borderColor,\n borderWidth: \"1.5px\",\n fontWeight: active ? \"bold\" : \"normal\",\n fontSize: \"0.9em\",\n };\n}\n\nfunction enhanceEntity(\n entity: Entity,\n entityTypes: Map<number, EntityType>,\n): EntityExt {\n return {\n ...entity,\n type: addColor(entityTypes.get(entity.type), entity.match != null),\n children: entity.children?.map((d) => enhanceEntity(d, entityTypes)),\n };\n}\n\nfunction addColor(entityType: EntityType, match = false) {\n const color = asChromaColor(entityType.color ?? \"#fff\").brighten(\n match ? 1 : 2,\n );\n\n return { ...entityType, color: color.css() };\n}\n\nexport function ExtractionContext({\n data,\n entityTypes,\n matchComponent,\n}: {\n data: any;\n entityTypes: Map<number, EntityType>;\n matchComponent: MatchComponent;\n}) {\n const highlights = buildHighlights(data.entities, null);\n\n return h(\"div\", [\n h(\"p\", h(HighlightedText, { text: data.paragraph_text, highlights })),\n h(ModelInfo, { data: data.model }),\n h(\n \"ul.entities\",\n data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]);\n}\n\nexport function ModelInfo({ data }) {\n if (!data) return null;\n return h(\"p.model-name\", [\"Model: \", h(\"code.bp6-code\", data.name)]);\n}\n\nexport type MatchComponent = (props: { data: any }) => any;\n\ntype EntityTagProps = {\n data: EntityExt;\n highlighted?: boolean;\n active?: boolean;\n onClickType?: (type: EntityType) => void;\n matchComponent?: MatchComponent;\n};\n\nexport function EntityTag({\n data,\n highlighted = true,\n active = false,\n onClickType,\n matchComponent = null,\n}: EntityTagProps) {\n const { name, type, match } = data;\n\n const className = classNames(\n {\n matched: match != null,\n type: data.type?.name ?? \"lith\",\n },\n \"entity\",\n );\n\n const style = getTagStyle(type?.color, { highlighted, active });\n\n let _matchLink = null;\n if (match != null && matchComponent != null) {\n _matchLink = h(matchComponent, { data: match });\n }\n\n return h(Tag, { style, className }, [\n h(\"span.entity-name\", name),\n \" \",\n h(\n \"code.entity-type.bp6-code\",\n {\n onClick(evt) {\n if (active && onClickType != null) {\n onClickType(type);\n evt.stopPropagation();\n }\n },\n },\n [type?.name, _matchLink],\n ),\n ]);\n}\n\nfunction ExtractionInfo({\n data,\n matchComponent = null,\n}: {\n data: EntityExt;\n matchComponent: MatchComponent;\n}) {\n const children = data.children ?? [];\n\n return h(\"li.entity-row\", [\n h(EntityTag, { data, matchComponent }),\n h.if(children.length > 0)([\n h(\n \"ul.children\",\n children.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]),\n ]);\n}\n\nfunction HighlightedText(props: { text: string; highlights: Highlight[] }) {\n const { text, highlights = [] } = props;\n const parts = [];\n let start = 0;\n\n const sortedHighlights = highlights.sort((a, b) => a.start - b.start);\n const deconflictedHighlights = sortedHighlights.map((highlight, i) => {\n if (i === 0) return highlight;\n const prev = sortedHighlights[i - 1];\n if (highlight.start < prev.end) {\n highlight.start = prev.end;\n }\n return highlight;\n });\n\n for (const highlight of deconflictedHighlights) {\n const { start: s, end, ...rest } = highlight;\n parts.push(text.slice(start, s));\n parts.push(h(\"span.highlight\", { style: rest }, text.slice(s, end)));\n start = end;\n }\n parts.push(text.slice(start));\n return h(\"span\", parts);\n}\n\nfunction normalizeColor(hex8) {\n const background = useDarkMode().isEnabled ? \"#000000\" : \"#ffffff\";\n\n const r = parseInt(hex8.slice(1, 3), 16);\n const g = parseInt(hex8.slice(3, 5), 16);\n const b = parseInt(hex8.slice(5, 7), 16);\n const a = parseInt(hex8.slice(7, 9), 16) / 255;\n\n const bgR = parseInt(background.slice(1, 3), 16);\n const bgG = parseInt(background.slice(3, 5), 16);\n const bgB = parseInt(background.slice(5, 7), 16);\n\n const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);\n\n const blendedR = blend(r, bgR);\n const blendedG = blend(g, bgG);\n const blendedB = blend(b, bgB);\n\n return (\n \"#\" +\n blendedR.toString(16).padStart(2, \"0\") +\n blendedG.toString(16).padStart(2, \"0\") +\n blendedB.toString(16).padStart(2, \"0\")\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: any[]) {\n if (selectedNodes?.length === 0) return true;\n return (\n selectedNodes?.includes(id) ||\n nodes?.some(\n (node) =>\n selectedNodes?.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["hyper","styles","asChromaColor","useDarkMode","classNames","Tag"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import h$1 from "./main.module.sass.js";
|
|
2
2
|
import classNames from "classnames";
|
|
3
3
|
import { Tag } from "@blueprintjs/core";
|
|
4
4
|
import { asChromaColor } from "@macrostrat/color-utils";
|
|
5
5
|
import hyper from "@macrostrat/hyper";
|
|
6
6
|
import { useDarkMode } from "@macrostrat/ui-components";
|
|
7
|
-
const h = hyper.styled(
|
|
7
|
+
const h = hyper.styled(h$1);
|
|
8
8
|
function buildHighlights(entities, parent) {
|
|
9
9
|
let highlights = [];
|
|
10
10
|
let parents = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/extractions/index.ts"],"sourcesContent":["import styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Tag } from \"@blueprintjs/core\";\nimport type { Entity, EntityExt, Highlight, EntityType } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { asChromaColor } from \"@macrostrat/color-utils\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDarkMode } from \"@macrostrat/ui-components\";\n\nexport type { Entity, EntityExt };\n\nconst h = hyper.styled(styles);\n\nexport function buildHighlights(\n entities: EntityExt[],\n parent: EntityExt | null,\n): Highlight[] {\n let highlights = [];\n let parents = [];\n if (parent != null) {\n parents = [parent.id, ...(parent.parents ?? [])];\n }\n\n for (const entity of entities) {\n highlights.push({\n start: entity.indices[0],\n end: entity.indices[1],\n text: entity.name,\n backgroundColor: entity.type?.color,\n tag: entity.type?.name ?? \"lith\",\n id: entity.id,\n parents,\n match: entity.match,\n });\n highlights.push(...buildHighlights(entity.children ?? [], entity));\n }\n return highlights;\n}\n\nexport function enhanceData(extractionData, models, entityTypes) {\n return {\n ...extractionData,\n model: models.get(extractionData.model_id),\n entities: extractionData.entities?.map((d) =>\n enhanceEntity(d, entityTypes),\n ),\n };\n}\n\nexport function getTagStyle(\n baseColor: string,\n options: {\n highlighted?: boolean;\n inDarkMode?: boolean;\n active?: boolean;\n showMatches?: boolean;\n } = {},\n): CSSProperties {\n const _baseColor = asChromaColor(baseColor ?? \"#fff\");\n const {\n highlighted = true,\n inDarkMode = useDarkMode().isEnabled,\n active = false,\n } = options;\n\n let mixAmount = highlighted ? 0.8 : 0.5;\n let backgroundAlpha = highlighted ? 0.8 : 0.2;\n\n if (active) {\n mixAmount = 1;\n backgroundAlpha = 1;\n }\n\n const mixTarget = \"black\";\n\n const color = active ? \"#000\" : _baseColor.mix(mixTarget, mixAmount).hex();\n const borderColor = highlighted\n ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex()\n : \"transparent\";\n\n let backgroundColor = active\n ? _baseColor.alpha(backgroundAlpha).hex()\n : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());\n\n // handle white backgrounds in light mode\n if (!inDarkMode && backgroundColor === \"#ffffff\") {\n backgroundColor = \"#f0f0f0\";\n }\n\n return {\n color,\n backgroundColor,\n boxSizing: \"border-box\",\n borderStyle: \"solid\",\n borderColor,\n borderWidth: \"1.5px\",\n fontWeight: active ? \"bold\" : \"normal\",\n fontSize: \"0.9em\",\n };\n}\n\nfunction enhanceEntity(\n entity: Entity,\n entityTypes: Map<number, EntityType>,\n): EntityExt {\n return {\n ...entity,\n type: addColor(entityTypes.get(entity.type), entity.match != null),\n children: entity.children?.map((d) => enhanceEntity(d, entityTypes)),\n };\n}\n\nfunction addColor(entityType: EntityType, match = false) {\n const color = asChromaColor(entityType.color ?? \"#fff\").brighten(\n match ? 1 : 2,\n );\n\n return { ...entityType, color: color.css() };\n}\n\nexport function ExtractionContext({\n data,\n entityTypes,\n matchComponent,\n}: {\n data: any;\n entityTypes: Map<number, EntityType>;\n matchComponent: MatchComponent;\n}) {\n const highlights = buildHighlights(data.entities, null);\n\n return h(\"div\", [\n h(\"p\", h(HighlightedText, { text: data.paragraph_text, highlights })),\n h(ModelInfo, { data: data.model }),\n h(\n \"ul.entities\",\n data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]);\n}\n\nexport function ModelInfo({ data }) {\n if (!data) return null;\n return h(\"p.model-name\", [\"Model: \", h(\"code.bp6-code\", data.name)]);\n}\n\nexport type MatchComponent = (props: { data: any }) => any;\n\ntype EntityTagProps = {\n data: EntityExt;\n highlighted?: boolean;\n active?: boolean;\n onClickType?: (type: EntityType) => void;\n matchComponent?: MatchComponent;\n};\n\nexport function EntityTag({\n data,\n highlighted = true,\n active = false,\n onClickType,\n matchComponent = null,\n}: EntityTagProps) {\n const { name, type, match } = data;\n\n const className = classNames(\n {\n matched: match != null,\n type: data.type?.name ?? \"lith\",\n },\n \"entity\",\n );\n\n const style = getTagStyle(type?.color, { highlighted, active });\n\n let _matchLink = null;\n if (match != null && matchComponent != null) {\n _matchLink = h(matchComponent, { data: match });\n }\n\n return h(Tag, { style, className }, [\n h(\"span.entity-name\", name),\n \" \",\n h(\n \"code.entity-type.bp6-code\",\n {\n onClick(evt) {\n if (active && onClickType != null) {\n onClickType(type);\n evt.stopPropagation();\n }\n },\n },\n [type?.name, _matchLink],\n ),\n ]);\n}\n\nfunction ExtractionInfo({\n data,\n matchComponent = null,\n}: {\n data: EntityExt;\n matchComponent: MatchComponent;\n}) {\n const children = data.children ?? [];\n\n return h(\"li.entity-row\", [\n h(EntityTag, { data, matchComponent }),\n h.if(children.length > 0)([\n h(\n \"ul.children\",\n children.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]),\n ]);\n}\n\nfunction HighlightedText(props: { text: string; highlights: Highlight[] }) {\n const { text, highlights = [] } = props;\n const parts = [];\n let start = 0;\n\n const sortedHighlights = highlights.sort((a, b) => a.start - b.start);\n const deconflictedHighlights = sortedHighlights.map((highlight, i) => {\n if (i === 0) return highlight;\n const prev = sortedHighlights[i - 1];\n if (highlight.start < prev.end) {\n highlight.start = prev.end;\n }\n return highlight;\n });\n\n for (const highlight of deconflictedHighlights) {\n const { start: s, end, ...rest } = highlight;\n parts.push(text.slice(start, s));\n parts.push(h(\"span.highlight\", { style: rest }, text.slice(s, end)));\n start = end;\n }\n parts.push(text.slice(start));\n return h(\"span\", parts);\n}\n\nfunction normalizeColor(hex8) {\n const background = useDarkMode().isEnabled ? \"#000000\" : \"#ffffff\";\n\n const r = parseInt(hex8.slice(1, 3), 16);\n const g = parseInt(hex8.slice(3, 5), 16);\n const b = parseInt(hex8.slice(5, 7), 16);\n const a = parseInt(hex8.slice(7, 9), 16) / 255;\n\n const bgR = parseInt(background.slice(1, 3), 16);\n const bgG = parseInt(background.slice(3, 5), 16);\n const bgB = parseInt(background.slice(5, 7), 16);\n\n const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);\n\n const blendedR = blend(r, bgR);\n const blendedG = blend(g, bgG);\n const blendedB = blend(b, bgB);\n\n return (\n \"#\" +\n blendedR.toString(16).padStart(2, \"0\") +\n blendedG.toString(16).padStart(2, \"0\") +\n blendedB.toString(16).padStart(2, \"0\")\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: any[]) {\n if (selectedNodes?.length === 0) return true;\n return (\n selectedNodes?.includes(id) ||\n nodes?.some(\n (node) =>\n selectedNodes?.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/extractions/index.ts"],"sourcesContent":["import styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Tag } from \"@blueprintjs/core\";\nimport type { Entity, EntityExt, Highlight, EntityType } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { asChromaColor } from \"@macrostrat/color-utils\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useDarkMode } from \"@macrostrat/ui-components\";\n\nexport type { Entity, EntityExt };\n\nconst h = hyper.styled(styles);\n\nexport function buildHighlights(\n entities: EntityExt[],\n parent: EntityExt | null,\n): Highlight[] {\n let highlights = [];\n let parents = [];\n if (parent != null) {\n parents = [parent.id, ...(parent.parents ?? [])];\n }\n\n for (const entity of entities) {\n highlights.push({\n start: entity.indices[0],\n end: entity.indices[1],\n text: entity.name,\n backgroundColor: entity.type?.color,\n tag: entity.type?.name ?? \"lith\",\n id: entity.id,\n parents,\n match: entity.match,\n });\n highlights.push(...buildHighlights(entity.children ?? [], entity));\n }\n return highlights;\n}\n\nexport function enhanceData(extractionData, models, entityTypes) {\n return {\n ...extractionData,\n model: models.get(extractionData.model_id),\n entities: extractionData.entities?.map((d) =>\n enhanceEntity(d, entityTypes),\n ),\n };\n}\n\nexport function getTagStyle(\n baseColor: string,\n options: {\n highlighted?: boolean;\n inDarkMode?: boolean;\n active?: boolean;\n showMatches?: boolean;\n } = {},\n): CSSProperties {\n const _baseColor = asChromaColor(baseColor ?? \"#fff\");\n const {\n highlighted = true,\n inDarkMode = useDarkMode().isEnabled,\n active = false,\n } = options;\n\n let mixAmount = highlighted ? 0.8 : 0.5;\n let backgroundAlpha = highlighted ? 0.8 : 0.2;\n\n if (active) {\n mixAmount = 1;\n backgroundAlpha = 1;\n }\n\n const mixTarget = \"black\";\n\n const color = active ? \"#000\" : _baseColor.mix(mixTarget, mixAmount).hex();\n const borderColor = highlighted\n ? _baseColor.mix(mixTarget, mixAmount / 1.1).hex()\n : \"transparent\";\n\n let backgroundColor = active\n ? _baseColor.alpha(backgroundAlpha).hex()\n : normalizeColor(_baseColor.alpha(backgroundAlpha).hex());\n\n // handle white backgrounds in light mode\n if (!inDarkMode && backgroundColor === \"#ffffff\") {\n backgroundColor = \"#f0f0f0\";\n }\n\n return {\n color,\n backgroundColor,\n boxSizing: \"border-box\",\n borderStyle: \"solid\",\n borderColor,\n borderWidth: \"1.5px\",\n fontWeight: active ? \"bold\" : \"normal\",\n fontSize: \"0.9em\",\n };\n}\n\nfunction enhanceEntity(\n entity: Entity,\n entityTypes: Map<number, EntityType>,\n): EntityExt {\n return {\n ...entity,\n type: addColor(entityTypes.get(entity.type), entity.match != null),\n children: entity.children?.map((d) => enhanceEntity(d, entityTypes)),\n };\n}\n\nfunction addColor(entityType: EntityType, match = false) {\n const color = asChromaColor(entityType.color ?? \"#fff\").brighten(\n match ? 1 : 2,\n );\n\n return { ...entityType, color: color.css() };\n}\n\nexport function ExtractionContext({\n data,\n entityTypes,\n matchComponent,\n}: {\n data: any;\n entityTypes: Map<number, EntityType>;\n matchComponent: MatchComponent;\n}) {\n const highlights = buildHighlights(data.entities, null);\n\n return h(\"div\", [\n h(\"p\", h(HighlightedText, { text: data.paragraph_text, highlights })),\n h(ModelInfo, { data: data.model }),\n h(\n \"ul.entities\",\n data.entities.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]);\n}\n\nexport function ModelInfo({ data }) {\n if (!data) return null;\n return h(\"p.model-name\", [\"Model: \", h(\"code.bp6-code\", data.name)]);\n}\n\nexport type MatchComponent = (props: { data: any }) => any;\n\ntype EntityTagProps = {\n data: EntityExt;\n highlighted?: boolean;\n active?: boolean;\n onClickType?: (type: EntityType) => void;\n matchComponent?: MatchComponent;\n};\n\nexport function EntityTag({\n data,\n highlighted = true,\n active = false,\n onClickType,\n matchComponent = null,\n}: EntityTagProps) {\n const { name, type, match } = data;\n\n const className = classNames(\n {\n matched: match != null,\n type: data.type?.name ?? \"lith\",\n },\n \"entity\",\n );\n\n const style = getTagStyle(type?.color, { highlighted, active });\n\n let _matchLink = null;\n if (match != null && matchComponent != null) {\n _matchLink = h(matchComponent, { data: match });\n }\n\n return h(Tag, { style, className }, [\n h(\"span.entity-name\", name),\n \" \",\n h(\n \"code.entity-type.bp6-code\",\n {\n onClick(evt) {\n if (active && onClickType != null) {\n onClickType(type);\n evt.stopPropagation();\n }\n },\n },\n [type?.name, _matchLink],\n ),\n ]);\n}\n\nfunction ExtractionInfo({\n data,\n matchComponent = null,\n}: {\n data: EntityExt;\n matchComponent: MatchComponent;\n}) {\n const children = data.children ?? [];\n\n return h(\"li.entity-row\", [\n h(EntityTag, { data, matchComponent }),\n h.if(children.length > 0)([\n h(\n \"ul.children\",\n children.map((d) => h(ExtractionInfo, { data: d, matchComponent })),\n ),\n ]),\n ]);\n}\n\nfunction HighlightedText(props: { text: string; highlights: Highlight[] }) {\n const { text, highlights = [] } = props;\n const parts = [];\n let start = 0;\n\n const sortedHighlights = highlights.sort((a, b) => a.start - b.start);\n const deconflictedHighlights = sortedHighlights.map((highlight, i) => {\n if (i === 0) return highlight;\n const prev = sortedHighlights[i - 1];\n if (highlight.start < prev.end) {\n highlight.start = prev.end;\n }\n return highlight;\n });\n\n for (const highlight of deconflictedHighlights) {\n const { start: s, end, ...rest } = highlight;\n parts.push(text.slice(start, s));\n parts.push(h(\"span.highlight\", { style: rest }, text.slice(s, end)));\n start = end;\n }\n parts.push(text.slice(start));\n return h(\"span\", parts);\n}\n\nfunction normalizeColor(hex8) {\n const background = useDarkMode().isEnabled ? \"#000000\" : \"#ffffff\";\n\n const r = parseInt(hex8.slice(1, 3), 16);\n const g = parseInt(hex8.slice(3, 5), 16);\n const b = parseInt(hex8.slice(5, 7), 16);\n const a = parseInt(hex8.slice(7, 9), 16) / 255;\n\n const bgR = parseInt(background.slice(1, 3), 16);\n const bgG = parseInt(background.slice(3, 5), 16);\n const bgB = parseInt(background.slice(5, 7), 16);\n\n const blend = (fg, bg) => Math.round((1 - a) * bg + a * fg);\n\n const blendedR = blend(r, bgR);\n const blendedG = blend(g, bgG);\n const blendedB = blend(b, bgB);\n\n return (\n \"#\" +\n blendedR.toString(16).padStart(2, \"0\") +\n blendedG.toString(16).padStart(2, \"0\") +\n blendedB.toString(16).padStart(2, \"0\")\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: any[]) {\n if (selectedNodes?.length === 0) return true;\n return (\n selectedNodes?.includes(id) ||\n nodes?.some(\n (node) =>\n selectedNodes?.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["styles"],"mappings":"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"}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const hyper = require("@macrostrat/hyper");
|
|
4
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
5
|
+
const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
|
|
3
6
|
const entities = "_entities_m1o0j_1";
|
|
4
7
|
const entity = "_entity_m1o0j_9";
|
|
5
8
|
const styles = {
|
|
6
9
|
entities,
|
|
7
10
|
entity
|
|
8
11
|
};
|
|
9
|
-
|
|
12
|
+
let h = hyper__default.default.styled(styles);
|
|
13
|
+
Object.assign(h, styles);
|
|
14
|
+
exports.default = h;
|
|
10
15
|
exports.entities = entities;
|
|
11
16
|
exports.entity = entity;
|
|
12
17
|
//# sourceMappingURL=main.module.sass.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import hyper from "@macrostrat/hyper";
|
|
1
2
|
const entities = "_entities_m1o0j_1";
|
|
2
3
|
const entity = "_entity_m1o0j_9";
|
|
3
4
|
const styles = {
|
|
4
5
|
entities,
|
|
5
6
|
entity
|
|
6
7
|
};
|
|
8
|
+
let h = hyper.styled(styles);
|
|
9
|
+
Object.assign(h, styles);
|
|
7
10
|
export {
|
|
8
|
-
|
|
11
|
+
h as default,
|
|
9
12
|
entities,
|
|
10
13
|
entity
|
|
11
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const react = require("react");
|
|
4
4
|
const update = require("immutability-helper");
|
|
5
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
6
|
+
const update__default = /* @__PURE__ */ _interopDefault(update);
|
|
5
7
|
function useUpdatableTree(initialTree, entityTypes, viewOnly, matchMode2, autoSelect = []) {
|
|
6
8
|
const type = entityTypes.values().next().value;
|
|
7
9
|
let selectedNodes = [];
|
|
@@ -107,7 +109,7 @@ function treeReducer(state, action) {
|
|
|
107
109
|
let updateSpec = buildNestedSpec(keyPath, {
|
|
108
110
|
$splice: [[action.payload.index, 0, ...removedNodes]]
|
|
109
111
|
});
|
|
110
|
-
return { ...state, tree:
|
|
112
|
+
return { ...state, tree: update__default.default(newTree, updateSpec) };
|
|
111
113
|
case "delete-node":
|
|
112
114
|
const [newTree2, _removedNodes] = removeNodes(
|
|
113
115
|
state.tree,
|
|
@@ -182,7 +184,7 @@ function treeReducer(state, action) {
|
|
|
182
184
|
const nestedSpec = buildNestedSpec(keyPath2, {
|
|
183
185
|
type: { $set: action.payload }
|
|
184
186
|
});
|
|
185
|
-
newTree22 =
|
|
187
|
+
newTree22 = update__default.default(newTree22, nestedSpec);
|
|
186
188
|
}
|
|
187
189
|
return {
|
|
188
190
|
...state,
|
|
@@ -343,7 +345,7 @@ function matchMode(state, action) {
|
|
|
343
345
|
const matchUpdateSpec = buildNestedSpec(keyPath, {
|
|
344
346
|
match: { $set: action.payload.payload }
|
|
345
347
|
});
|
|
346
|
-
const updatedTree =
|
|
348
|
+
const updatedTree = update__default.default(state.tree, matchUpdateSpec);
|
|
347
349
|
return {
|
|
348
350
|
...state,
|
|
349
351
|
tree: updatedTree
|
|
@@ -360,7 +362,7 @@ function matchMode(state, action) {
|
|
|
360
362
|
const matchUpdateSpec = buildNestedSpec(keyPath, {
|
|
361
363
|
match: { $set: null }
|
|
362
364
|
});
|
|
363
|
-
const updatedTree =
|
|
365
|
+
const updatedTree = update__default.default(state.tree, matchUpdateSpec);
|
|
364
366
|
return {
|
|
365
367
|
...state,
|
|
366
368
|
tree: updatedTree
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-state.cjs","sources":["../../src/feedback/edit-state.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { createContext, Dispatch, useContext, useReducer } from \"react\";\nimport update, { Spec } from \"immutability-helper\";\nimport { EntityType } from \"../extractions/types\";\n\nexport enum ViewMode {\n Tree = \"tree\",\n Graph = \"graph\",\n}\n\ninterface TreeState {\n initialTree: TreeData[];\n tree: TreeData[];\n selectedNodes: number[];\n entityTypesMap: Map<number, EntityType>;\n selectedEntityType: EntityType;\n lastInternalId: number;\n isSelectingEntityType: boolean;\n viewMode: ViewMode;\n viewOnly: boolean;\n matchMode: boolean;\n}\n\ntype TextRange = {\n start: number;\n end: number;\n text: string;\n};\n\ntype TreeAction =\n | {\n type: \"move-node\";\n payload: { dragIds: number[]; parentId: number; index: number };\n }\n | { type: \"delete-node\"; payload: { ids: number[] } }\n | { type: \"select-node\"; payload: { ids: number[] } }\n | { type: \"toggle-node-selected\"; payload: { ids: number[] } }\n | { type: \"set-view-mode\"; payload: ViewMode }\n | { type: \"create-node\"; payload: TextRange }\n | { type: \"select-entity-type\"; payload: EntityType }\n | { type: \"toggle-entity-type-selector\"; payload?: boolean | null }\n | { type: \"deselect\" }\n | { type: \"reset\" }\n | { type: \"delete-entity-type\"; payload: { id: number } }\n | {\n type: \"add-entity-type\";\n payload: { name: string; description: string; color: string };\n }\n | {\n type: \"update-entity-type\";\n payload: { id: number; name: string; description: string; color: string };\n }\n | { type: \"select-range\"; payload: { ids: number[] } }\n | { type: \"add-match\"; payload: { id: number; payload: any } }\n | { type: \"remove-match\"; payload: { id: number } }\n | { type: \"toggle-match-mode\" }\n | { type: \"toggle-view-only\" };\n\nexport type TreeDispatch = Dispatch<TreeAction>;\n\nexport function useUpdatableTree(\n initialTree: TreeData[],\n entityTypes: Map<number, EntityType>,\n viewOnly: boolean,\n matchMode: boolean,\n autoSelect: string[] = [],\n): [TreeState, TreeDispatch] {\n // Get the first entity type\n // issue: grabs second entity instead of selected one\n const type = entityTypes.values().next().value;\n\n let selectedNodes = [];\n autoSelect = autoSelect.map((name) => name.toLowerCase());\n\n if (autoSelect.length > 0) {\n // If autoSelect is provided, find the nodes with the matching names\n selectedNodes = initialTree\n .flatMap((node) => node.children ?? [])\n .filter((node) => autoSelect.includes(node.name.toLowerCase()))\n .map((node) => node.id);\n }\n\n return useReducer(treeReducer, {\n initialTree,\n tree: initialTree,\n selectedNodes,\n entityTypesMap: entityTypes,\n selectedEntityType: type,\n lastInternalId: 0,\n isSelectingEntityType: false,\n viewMode: ViewMode.Tree,\n viewOnly,\n matchMode,\n });\n}\n\nexport const TreeDispatchContext = createContext<TreeDispatch | null>(null);\n\nexport function useTreeDispatch() {\n const dispatch = useContext(TreeDispatchContext);\n if (dispatch == null) {\n throw new Error(\"No dispatch context available\");\n }\n return dispatch;\n}\n\nfunction treeReducer(state: TreeState, action: TreeAction) {\n if (action.type === \"toggle-match-mode\") {\n return { ...state, matchMode: !state.matchMode };\n }\n\n if (action.type === \"toggle-view-only\") {\n return { ...state, viewOnly: !state.viewOnly, selectedNodes: [] };\n }\n\n if (state.viewOnly) return viewMode(state, action);\n\n if (state.matchMode) return matchMode(state, action);\n\n switch (action.type) {\n case \"add-entity-type\": {\n // Add a new entity type to the map\n const { name, description, color } = action.payload;\n const newId = state.lastInternalId - 1;\n const newType: EntityType = {\n id: newId,\n name,\n description: description === \"\" ? null : description,\n color,\n };\n\n const newEntityTypesMap = new Map(state.entityTypesMap);\n newEntityTypesMap.set(newId, newType);\n\n return {\n ...state,\n entityTypesMap: newEntityTypesMap,\n selectedEntityType: newType,\n lastInternalId: newId,\n };\n }\n case \"update-entity-type\": {\n // Update an existing entity type in the map\n const { id, name, description, color } = action.payload;\n const newEntityTypesMap = new Map(state.entityTypesMap);\n const oldType = newEntityTypesMap.get(id);\n\n if (!oldType) {\n console.warn(`Entity type with id ${id} not found`);\n return state;\n }\n\n const updatedType: EntityType = {\n ...oldType,\n name,\n description: description === \"\" ? null : description,\n color,\n };\n\n newEntityTypesMap.set(id, updatedType);\n\n // Update the tree to reflect the new type\n const newTree = updateTreeTypes(state.tree, oldType, updatedType);\n\n return {\n ...state,\n tree: newTree,\n entityTypesMap: newEntityTypesMap,\n selectedEntityType: updatedType,\n };\n }\n case \"select-range\":\n // Select a range of nodes by their IDs\n const payloadIds = action.payload.ids;\n const node1 = payloadIds[0];\n const node2 = payloadIds[1];\n\n // make list of nodes in order\n const allNodes = flattenAndSort(state.tree);\n\n // select all nodes between node1 and node2\n const startIndex = allNodes.findIndex((node) => node.id === node1);\n const endIndex = allNodes.findIndex((node) => node.id === node2);\n\n const selectedNodes = allNodes.slice(startIndex, endIndex + 1);\n\n console.log(\"Selecting range:\", selectedNodes);\n return {\n ...state,\n selectedNodes: selectedNodes.map((node) => node.id),\n };\n\n case \"move-node\":\n // For each node in the tree, if the node is in the dragIds, remove it from the tree and collect it\n const [newTree, removedNodes] = removeNodes(\n state.tree,\n action.payload.dragIds,\n );\n\n let keyPath: (number | \"children\")[] = [];\n if (action.payload.parentId) {\n keyPath = findNode(newTree, action.payload.parentId);\n keyPath.push(\"children\");\n }\n\n // Add removed nodes to the new tree at the correct location\n let updateSpec = buildNestedSpec(keyPath, {\n $splice: [[action.payload.index, 0, ...removedNodes]],\n });\n\n return { ...state, tree: update(newTree, updateSpec) };\n case \"delete-node\":\n // For each node in the tree, if the node is in the ids, remove it from the tree\n const [newTree2, _removedNodes] = removeNodes(\n state.tree,\n action.payload.ids,\n );\n // Get children of the removed nodes\n // If children are not present elsewhere in the tree, insert them\n\n const children = _removedNodes\n .flatMap((node) => node.children ?? [])\n .filter((child) => !nodeIsInTree(newTree2, child.id));\n\n // Reset the selection\n\n return {\n ...state,\n tree: [...newTree2, ...children],\n selectedNodes: state.selectedNodes.filter(\n (id) => !action.payload.ids.includes(id),\n ),\n };\n case \"select-node\":\n const { ids } = action.payload;\n\n const type =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, ids[0])?.type\n : null;\n\n return { ...state, selectedNodes: ids, selectedEntityType: type };\n // otherwise fall through to toggle-node-selected for a single ID\n case \"toggle-node-selected\":\n const nodesToAdd = action.payload.ids.filter(\n (id) => !state.selectedNodes.includes(id),\n );\n const nodesToKeep = state.selectedNodes.filter(\n (id) => !action.payload.ids.includes(id),\n );\n\n const newType =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, action.payload.ids[0])?.type\n : null;\n\n return {\n ...state,\n selectedNodes: [...nodesToKeep, ...nodesToAdd],\n selectedEntityType: newType,\n };\n\n case \"create-node\":\n const newId = state.lastInternalId - 1;\n const { text, start, end } = action.payload;\n const node: TreeData = {\n id: newId,\n name: text,\n children: [],\n indices: [start, end],\n type: state.selectedEntityType,\n };\n\n return {\n ...state,\n tree: [...state.tree, node],\n selectedNodes: [newId],\n lastInternalId: newId,\n };\n\n case \"delete-entity-type\": {\n // Remove the entity type from the map\n const { id } = action.payload;\n const newEntityTypesMap = new Map(state.entityTypesMap);\n const oldType = newEntityTypesMap.get(id);\n newEntityTypesMap.delete(id);\n\n const defaultType = newEntityTypesMap.values().next().value;\n const newTree = updateTreeTypes(state.tree, oldType, defaultType);\n\n return {\n ...state,\n tree: newTree,\n entityTypesMap: newEntityTypesMap,\n selectedNodes: [],\n };\n }\n\n /** Entity type selection */\n case \"toggle-entity-type-selector\":\n return {\n ...state,\n isSelectingEntityType: action.payload ?? !state.isSelectingEntityType,\n };\n case \"select-entity-type\": {\n // For each selected node, update the type\n let newTree2 = state.tree;\n for (let id of state.selectedNodes) {\n const keyPath = findNode(state.tree, id);\n const nestedSpec = buildNestedSpec(keyPath, {\n type: { $set: action.payload },\n });\n newTree2 = update(newTree2, nestedSpec);\n }\n\n return {\n ...state,\n tree: newTree2,\n selectedEntityType: action.payload,\n };\n }\n case \"deselect\":\n return { ...state, selectedNodes: [] };\n case \"reset\":\n return {\n ...state,\n tree: state.initialTree,\n selectedNodes: [],\n };\n case \"set-view-mode\":\n return { ...state, viewMode: action.payload };\n }\n}\n\nfunction nodeIsInTree(tree: TreeData[], id: number): boolean {\n for (let node of tree) {\n if (node.id == id) {\n return true;\n } else if (node.children) {\n if (nodeIsInTree(node.children, id)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction buildNestedSpec(\n keyPath: (number | \"children\")[],\n innerSpec: Spec<any>,\n): Spec<TreeData[]> {\n // Build a nested object from a key path\n\n let spec = innerSpec;\n for (let i = keyPath.length - 1; i >= 0; i--) {\n spec = { [keyPath[i]]: spec };\n }\n return spec as any;\n // Since we don't have a \"children\" key at the root, we make the top-level spec an array\n}\n\nfunction findNode(\n tree: TreeData[],\n id: number,\n): (number | \"children\")[] | null {\n // Find the index of the node with the given id in the tree, returning the key path\n for (let i = 0; i < tree.length; i++) {\n if (tree[i].id == id) {\n return [i];\n } else if (tree[i].children) {\n let path = findNode(tree[i].children, id);\n if (path != null) {\n return [i, \"children\", ...path];\n }\n }\n }\n return null;\n}\n\nfunction removeNodes(\n tree: TreeData[],\n ids: number[],\n): [TreeData[], TreeData[]] {\n /** Remove nodes with the given ids from the tree and return the new tree and the removed nodes */\n let newTree: TreeData[] = [];\n let removedNodes: TreeData[] = [];\n\n for (let node of tree) {\n if (ids.includes(node.id)) {\n removedNodes.push(node);\n } else {\n // Recurse into children\n if (node.children) {\n let [newChildren, removedChildren] = removeNodes(node.children, ids);\n node = { ...node, children: newChildren };\n removedNodes.push(...removedChildren);\n }\n newTree.push(node);\n }\n }\n\n return [newTree, removedNodes];\n}\n\nexport interface EntityOutput {\n id: number;\n type: number | null;\n txt_range: number[][];\n name: string;\n match: any | null;\n reasoning: string | null;\n color: string | null;\n children: any[] | null;\n}\n\nexport interface GraphData {\n nodes: EntityOutput[];\n edges: { source: number; dest: number }[];\n}\n\nexport function treeToGraph(tree: TreeData[]): GraphData {\n // Convert the tree to a graph\n let nodes: EntityOutput[] = [];\n let edges: { source: number; dest: number }[] = [];\n const nodeMap = new Map<number, TreeData>();\n\n for (let node of tree) {\n // If we've already found an instance of this node, we don't need to record\n // it again\n if (nodeMap.has(node.id)) {\n continue;\n }\n\n const { indices, id, name, type, children } = node;\n\n const nodeData: EntityOutput = {\n id,\n type: type.id,\n color: type.color,\n name,\n txt_range: [indices],\n reasoning: null,\n match: node.match,\n children,\n };\n\n nodeMap.set(node.id, node);\n nodes.push(nodeData);\n\n if (node.children) {\n for (let child of node.children) {\n edges.push({ source: node.id, dest: child.id });\n }\n\n // Now process the children\n const { nodes: childNodes, edges: childEdges } = treeToGraph(\n node.children,\n );\n nodes.push(...childNodes);\n edges.push(...childEdges);\n }\n }\n\n return { nodes, edges };\n}\n\nexport function findNodeById(tree, id) {\n for (const node of tree) {\n if (node.id === id) {\n return node;\n }\n if (node.children) {\n const found = findNodeById(node.children, id);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction updateTreeTypes(tree, oldType, defaultType) {\n return tree.map((node) => updateNodeType(node, oldType, defaultType));\n}\n\nfunction updateNodeType(node, oldType, defaultType) {\n const type = node.type.id === oldType.id ? defaultType : node.type;\n\n return {\n ...node,\n type,\n children: node.children\n ? updateTreeTypes(node.children, oldType, defaultType)\n : [],\n };\n}\n\nfunction flattenAndSort(nodes) {\n const result = [];\n\n function traverse(nodeList) {\n for (const node of nodeList) {\n result.push(node);\n if (Array.isArray(node.children) && node.children.length > 0) {\n traverse(node.children);\n }\n }\n }\n\n traverse(nodes);\n\n // sort by start\n return result.sort((a, b) => a.indices[0] - b.indices[0]);\n}\n\nfunction matchMode(state, action) {\n if (action.type === \"select-node\" || action.type === \"toggle-node-selected\") {\n const { ids } = action.payload;\n\n if (ids.length != 1) return state;\n\n if (state.selectedNodes.length === 1) {\n if (ids[0] === state.selectedNodes[0]) {\n // If the selected node is the same as the current selection, deselect it\n return { ...state, selectedNodes: [] };\n }\n }\n\n const type =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, ids[0])?.type\n : null;\n\n return { ...state, selectedNodes: ids, selectedEntityType: type };\n }\n\n if (action.type === \"add-match\") {\n const { id } = action.payload;\n\n // Find the node path\n const keyPath = findNode(state.tree, id);\n if (!keyPath) {\n console.warn(`Node with id ${id} not found`);\n return state;\n }\n\n // Build update spec to set the `match` property\n const matchUpdateSpec = buildNestedSpec(keyPath, {\n match: { $set: action.payload.payload },\n });\n\n const updatedTree = update(state.tree, matchUpdateSpec);\n\n return {\n ...state,\n tree: updatedTree,\n };\n }\n\n if (action.type === \"remove-match\") {\n const { id } = action.payload;\n\n console.log(\"Removing match for node with id:\", id);\n\n // Find the node path\n const keyPath = findNode(state.tree, id);\n if (!keyPath) {\n console.warn(`Node with id ${id} not found`);\n return state;\n }\n\n // Build update spec to unset the `match` property\n const matchUpdateSpec = buildNestedSpec(keyPath, {\n match: { $set: null },\n });\n\n const updatedTree = update(state.tree, matchUpdateSpec);\n\n return {\n ...state,\n tree: updatedTree,\n };\n }\n\n return state;\n}\n\nfunction viewMode(state, action) {\n if (action.type === \"set-view-mode\") {\n return { ...state, viewMode: action.payload };\n }\n\n return state;\n}\n"],"names":["matchMode","useReducer","createContext","useContext","newId","newType","newTree","node","newTree2","keyPath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"edit-state.cjs","sources":["../../src/feedback/edit-state.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { createContext, Dispatch, useContext, useReducer } from \"react\";\nimport update, { Spec } from \"immutability-helper\";\nimport { EntityType } from \"../extractions/types\";\n\nexport enum ViewMode {\n Tree = \"tree\",\n Graph = \"graph\",\n}\n\ninterface TreeState {\n initialTree: TreeData[];\n tree: TreeData[];\n selectedNodes: number[];\n entityTypesMap: Map<number, EntityType>;\n selectedEntityType: EntityType;\n lastInternalId: number;\n isSelectingEntityType: boolean;\n viewMode: ViewMode;\n viewOnly: boolean;\n matchMode: boolean;\n}\n\ntype TextRange = {\n start: number;\n end: number;\n text: string;\n};\n\ntype TreeAction =\n | {\n type: \"move-node\";\n payload: { dragIds: number[]; parentId: number; index: number };\n }\n | { type: \"delete-node\"; payload: { ids: number[] } }\n | { type: \"select-node\"; payload: { ids: number[] } }\n | { type: \"toggle-node-selected\"; payload: { ids: number[] } }\n | { type: \"set-view-mode\"; payload: ViewMode }\n | { type: \"create-node\"; payload: TextRange }\n | { type: \"select-entity-type\"; payload: EntityType }\n | { type: \"toggle-entity-type-selector\"; payload?: boolean | null }\n | { type: \"deselect\" }\n | { type: \"reset\" }\n | { type: \"delete-entity-type\"; payload: { id: number } }\n | {\n type: \"add-entity-type\";\n payload: { name: string; description: string; color: string };\n }\n | {\n type: \"update-entity-type\";\n payload: { id: number; name: string; description: string; color: string };\n }\n | { type: \"select-range\"; payload: { ids: number[] } }\n | { type: \"add-match\"; payload: { id: number; payload: any } }\n | { type: \"remove-match\"; payload: { id: number } }\n | { type: \"toggle-match-mode\" }\n | { type: \"toggle-view-only\" };\n\nexport type TreeDispatch = Dispatch<TreeAction>;\n\nexport function useUpdatableTree(\n initialTree: TreeData[],\n entityTypes: Map<number, EntityType>,\n viewOnly: boolean,\n matchMode: boolean,\n autoSelect: string[] = [],\n): [TreeState, TreeDispatch] {\n // Get the first entity type\n // issue: grabs second entity instead of selected one\n const type = entityTypes.values().next().value;\n\n let selectedNodes = [];\n autoSelect = autoSelect.map((name) => name.toLowerCase());\n\n if (autoSelect.length > 0) {\n // If autoSelect is provided, find the nodes with the matching names\n selectedNodes = initialTree\n .flatMap((node) => node.children ?? [])\n .filter((node) => autoSelect.includes(node.name.toLowerCase()))\n .map((node) => node.id);\n }\n\n return useReducer(treeReducer, {\n initialTree,\n tree: initialTree,\n selectedNodes,\n entityTypesMap: entityTypes,\n selectedEntityType: type,\n lastInternalId: 0,\n isSelectingEntityType: false,\n viewMode: ViewMode.Tree,\n viewOnly,\n matchMode,\n });\n}\n\nexport const TreeDispatchContext = createContext<TreeDispatch | null>(null);\n\nexport function useTreeDispatch() {\n const dispatch = useContext(TreeDispatchContext);\n if (dispatch == null) {\n throw new Error(\"No dispatch context available\");\n }\n return dispatch;\n}\n\nfunction treeReducer(state: TreeState, action: TreeAction) {\n if (action.type === \"toggle-match-mode\") {\n return { ...state, matchMode: !state.matchMode };\n }\n\n if (action.type === \"toggle-view-only\") {\n return { ...state, viewOnly: !state.viewOnly, selectedNodes: [] };\n }\n\n if (state.viewOnly) return viewMode(state, action);\n\n if (state.matchMode) return matchMode(state, action);\n\n switch (action.type) {\n case \"add-entity-type\": {\n // Add a new entity type to the map\n const { name, description, color } = action.payload;\n const newId = state.lastInternalId - 1;\n const newType: EntityType = {\n id: newId,\n name,\n description: description === \"\" ? null : description,\n color,\n };\n\n const newEntityTypesMap = new Map(state.entityTypesMap);\n newEntityTypesMap.set(newId, newType);\n\n return {\n ...state,\n entityTypesMap: newEntityTypesMap,\n selectedEntityType: newType,\n lastInternalId: newId,\n };\n }\n case \"update-entity-type\": {\n // Update an existing entity type in the map\n const { id, name, description, color } = action.payload;\n const newEntityTypesMap = new Map(state.entityTypesMap);\n const oldType = newEntityTypesMap.get(id);\n\n if (!oldType) {\n console.warn(`Entity type with id ${id} not found`);\n return state;\n }\n\n const updatedType: EntityType = {\n ...oldType,\n name,\n description: description === \"\" ? null : description,\n color,\n };\n\n newEntityTypesMap.set(id, updatedType);\n\n // Update the tree to reflect the new type\n const newTree = updateTreeTypes(state.tree, oldType, updatedType);\n\n return {\n ...state,\n tree: newTree,\n entityTypesMap: newEntityTypesMap,\n selectedEntityType: updatedType,\n };\n }\n case \"select-range\":\n // Select a range of nodes by their IDs\n const payloadIds = action.payload.ids;\n const node1 = payloadIds[0];\n const node2 = payloadIds[1];\n\n // make list of nodes in order\n const allNodes = flattenAndSort(state.tree);\n\n // select all nodes between node1 and node2\n const startIndex = allNodes.findIndex((node) => node.id === node1);\n const endIndex = allNodes.findIndex((node) => node.id === node2);\n\n const selectedNodes = allNodes.slice(startIndex, endIndex + 1);\n\n console.log(\"Selecting range:\", selectedNodes);\n return {\n ...state,\n selectedNodes: selectedNodes.map((node) => node.id),\n };\n\n case \"move-node\":\n // For each node in the tree, if the node is in the dragIds, remove it from the tree and collect it\n const [newTree, removedNodes] = removeNodes(\n state.tree,\n action.payload.dragIds,\n );\n\n let keyPath: (number | \"children\")[] = [];\n if (action.payload.parentId) {\n keyPath = findNode(newTree, action.payload.parentId);\n keyPath.push(\"children\");\n }\n\n // Add removed nodes to the new tree at the correct location\n let updateSpec = buildNestedSpec(keyPath, {\n $splice: [[action.payload.index, 0, ...removedNodes]],\n });\n\n return { ...state, tree: update(newTree, updateSpec) };\n case \"delete-node\":\n // For each node in the tree, if the node is in the ids, remove it from the tree\n const [newTree2, _removedNodes] = removeNodes(\n state.tree,\n action.payload.ids,\n );\n // Get children of the removed nodes\n // If children are not present elsewhere in the tree, insert them\n\n const children = _removedNodes\n .flatMap((node) => node.children ?? [])\n .filter((child) => !nodeIsInTree(newTree2, child.id));\n\n // Reset the selection\n\n return {\n ...state,\n tree: [...newTree2, ...children],\n selectedNodes: state.selectedNodes.filter(\n (id) => !action.payload.ids.includes(id),\n ),\n };\n case \"select-node\":\n const { ids } = action.payload;\n\n const type =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, ids[0])?.type\n : null;\n\n return { ...state, selectedNodes: ids, selectedEntityType: type };\n // otherwise fall through to toggle-node-selected for a single ID\n case \"toggle-node-selected\":\n const nodesToAdd = action.payload.ids.filter(\n (id) => !state.selectedNodes.includes(id),\n );\n const nodesToKeep = state.selectedNodes.filter(\n (id) => !action.payload.ids.includes(id),\n );\n\n const newType =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, action.payload.ids[0])?.type\n : null;\n\n return {\n ...state,\n selectedNodes: [...nodesToKeep, ...nodesToAdd],\n selectedEntityType: newType,\n };\n\n case \"create-node\":\n const newId = state.lastInternalId - 1;\n const { text, start, end } = action.payload;\n const node: TreeData = {\n id: newId,\n name: text,\n children: [],\n indices: [start, end],\n type: state.selectedEntityType,\n };\n\n return {\n ...state,\n tree: [...state.tree, node],\n selectedNodes: [newId],\n lastInternalId: newId,\n };\n\n case \"delete-entity-type\": {\n // Remove the entity type from the map\n const { id } = action.payload;\n const newEntityTypesMap = new Map(state.entityTypesMap);\n const oldType = newEntityTypesMap.get(id);\n newEntityTypesMap.delete(id);\n\n const defaultType = newEntityTypesMap.values().next().value;\n const newTree = updateTreeTypes(state.tree, oldType, defaultType);\n\n return {\n ...state,\n tree: newTree,\n entityTypesMap: newEntityTypesMap,\n selectedNodes: [],\n };\n }\n\n /** Entity type selection */\n case \"toggle-entity-type-selector\":\n return {\n ...state,\n isSelectingEntityType: action.payload ?? !state.isSelectingEntityType,\n };\n case \"select-entity-type\": {\n // For each selected node, update the type\n let newTree2 = state.tree;\n for (let id of state.selectedNodes) {\n const keyPath = findNode(state.tree, id);\n const nestedSpec = buildNestedSpec(keyPath, {\n type: { $set: action.payload },\n });\n newTree2 = update(newTree2, nestedSpec);\n }\n\n return {\n ...state,\n tree: newTree2,\n selectedEntityType: action.payload,\n };\n }\n case \"deselect\":\n return { ...state, selectedNodes: [] };\n case \"reset\":\n return {\n ...state,\n tree: state.initialTree,\n selectedNodes: [],\n };\n case \"set-view-mode\":\n return { ...state, viewMode: action.payload };\n }\n}\n\nfunction nodeIsInTree(tree: TreeData[], id: number): boolean {\n for (let node of tree) {\n if (node.id == id) {\n return true;\n } else if (node.children) {\n if (nodeIsInTree(node.children, id)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction buildNestedSpec(\n keyPath: (number | \"children\")[],\n innerSpec: Spec<any>,\n): Spec<TreeData[]> {\n // Build a nested object from a key path\n\n let spec = innerSpec;\n for (let i = keyPath.length - 1; i >= 0; i--) {\n spec = { [keyPath[i]]: spec };\n }\n return spec as any;\n // Since we don't have a \"children\" key at the root, we make the top-level spec an array\n}\n\nfunction findNode(\n tree: TreeData[],\n id: number,\n): (number | \"children\")[] | null {\n // Find the index of the node with the given id in the tree, returning the key path\n for (let i = 0; i < tree.length; i++) {\n if (tree[i].id == id) {\n return [i];\n } else if (tree[i].children) {\n let path = findNode(tree[i].children, id);\n if (path != null) {\n return [i, \"children\", ...path];\n }\n }\n }\n return null;\n}\n\nfunction removeNodes(\n tree: TreeData[],\n ids: number[],\n): [TreeData[], TreeData[]] {\n /** Remove nodes with the given ids from the tree and return the new tree and the removed nodes */\n let newTree: TreeData[] = [];\n let removedNodes: TreeData[] = [];\n\n for (let node of tree) {\n if (ids.includes(node.id)) {\n removedNodes.push(node);\n } else {\n // Recurse into children\n if (node.children) {\n let [newChildren, removedChildren] = removeNodes(node.children, ids);\n node = { ...node, children: newChildren };\n removedNodes.push(...removedChildren);\n }\n newTree.push(node);\n }\n }\n\n return [newTree, removedNodes];\n}\n\nexport interface EntityOutput {\n id: number;\n type: number | null;\n txt_range: number[][];\n name: string;\n match: any | null;\n reasoning: string | null;\n color: string | null;\n children: any[] | null;\n}\n\nexport interface GraphData {\n nodes: EntityOutput[];\n edges: { source: number; dest: number }[];\n}\n\nexport function treeToGraph(tree: TreeData[]): GraphData {\n // Convert the tree to a graph\n let nodes: EntityOutput[] = [];\n let edges: { source: number; dest: number }[] = [];\n const nodeMap = new Map<number, TreeData>();\n\n for (let node of tree) {\n // If we've already found an instance of this node, we don't need to record\n // it again\n if (nodeMap.has(node.id)) {\n continue;\n }\n\n const { indices, id, name, type, children } = node;\n\n const nodeData: EntityOutput = {\n id,\n type: type.id,\n color: type.color,\n name,\n txt_range: [indices],\n reasoning: null,\n match: node.match,\n children,\n };\n\n nodeMap.set(node.id, node);\n nodes.push(nodeData);\n\n if (node.children) {\n for (let child of node.children) {\n edges.push({ source: node.id, dest: child.id });\n }\n\n // Now process the children\n const { nodes: childNodes, edges: childEdges } = treeToGraph(\n node.children,\n );\n nodes.push(...childNodes);\n edges.push(...childEdges);\n }\n }\n\n return { nodes, edges };\n}\n\nexport function findNodeById(tree, id) {\n for (const node of tree) {\n if (node.id === id) {\n return node;\n }\n if (node.children) {\n const found = findNodeById(node.children, id);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction updateTreeTypes(tree, oldType, defaultType) {\n return tree.map((node) => updateNodeType(node, oldType, defaultType));\n}\n\nfunction updateNodeType(node, oldType, defaultType) {\n const type = node.type.id === oldType.id ? defaultType : node.type;\n\n return {\n ...node,\n type,\n children: node.children\n ? updateTreeTypes(node.children, oldType, defaultType)\n : [],\n };\n}\n\nfunction flattenAndSort(nodes) {\n const result = [];\n\n function traverse(nodeList) {\n for (const node of nodeList) {\n result.push(node);\n if (Array.isArray(node.children) && node.children.length > 0) {\n traverse(node.children);\n }\n }\n }\n\n traverse(nodes);\n\n // sort by start\n return result.sort((a, b) => a.indices[0] - b.indices[0]);\n}\n\nfunction matchMode(state, action) {\n if (action.type === \"select-node\" || action.type === \"toggle-node-selected\") {\n const { ids } = action.payload;\n\n if (ids.length != 1) return state;\n\n if (state.selectedNodes.length === 1) {\n if (ids[0] === state.selectedNodes[0]) {\n // If the selected node is the same as the current selection, deselect it\n return { ...state, selectedNodes: [] };\n }\n }\n\n const type =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, ids[0])?.type\n : null;\n\n return { ...state, selectedNodes: ids, selectedEntityType: type };\n }\n\n if (action.type === \"add-match\") {\n const { id } = action.payload;\n\n // Find the node path\n const keyPath = findNode(state.tree, id);\n if (!keyPath) {\n console.warn(`Node with id ${id} not found`);\n return state;\n }\n\n // Build update spec to set the `match` property\n const matchUpdateSpec = buildNestedSpec(keyPath, {\n match: { $set: action.payload.payload },\n });\n\n const updatedTree = update(state.tree, matchUpdateSpec);\n\n return {\n ...state,\n tree: updatedTree,\n };\n }\n\n if (action.type === \"remove-match\") {\n const { id } = action.payload;\n\n console.log(\"Removing match for node with id:\", id);\n\n // Find the node path\n const keyPath = findNode(state.tree, id);\n if (!keyPath) {\n console.warn(`Node with id ${id} not found`);\n return state;\n }\n\n // Build update spec to unset the `match` property\n const matchUpdateSpec = buildNestedSpec(keyPath, {\n match: { $set: null },\n });\n\n const updatedTree = update(state.tree, matchUpdateSpec);\n\n return {\n ...state,\n tree: updatedTree,\n };\n }\n\n return state;\n}\n\nfunction viewMode(state, action) {\n if (action.type === \"set-view-mode\") {\n return { ...state, viewMode: action.payload };\n }\n\n return state;\n}\n"],"names":["matchMode","useReducer","createContext","useContext","newId","newType","newTree","node","update","newTree2","keyPath"],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const hyper = require("@macrostrat/hyper");
|
|
4
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
5
|
+
const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
|
|
3
6
|
const selected = "_selected_65dbg_40";
|
|
4
7
|
const description = "_description_65dbg_76";
|
|
5
8
|
const highlight = "_highlight_65dbg_91";
|
|
@@ -37,8 +40,10 @@ const styles = {
|
|
|
37
40
|
"close-btn": "_close-btn_65dbg_188",
|
|
38
41
|
"match-link": "_match-link_65dbg_192"
|
|
39
42
|
};
|
|
43
|
+
let h = hyper__default.default.styled(styles);
|
|
44
|
+
Object.assign(h, styles);
|
|
40
45
|
exports.clickable = clickable;
|
|
41
|
-
exports.default =
|
|
46
|
+
exports.default = h;
|
|
42
47
|
exports.description = description;
|
|
43
48
|
exports.highlight = highlight;
|
|
44
49
|
exports.icons = icons;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feedback.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import hyper from "@macrostrat/hyper";
|
|
1
2
|
const selected = "_selected_65dbg_40";
|
|
2
3
|
const description = "_description_65dbg_76";
|
|
3
4
|
const highlight = "_highlight_65dbg_91";
|
|
@@ -35,9 +36,11 @@ const styles = {
|
|
|
35
36
|
"close-btn": "_close-btn_65dbg_188",
|
|
36
37
|
"match-link": "_match-link_65dbg_192"
|
|
37
38
|
};
|
|
39
|
+
let h = hyper.styled(styles);
|
|
40
|
+
Object.assign(h, styles);
|
|
38
41
|
export {
|
|
39
42
|
clickable,
|
|
40
|
-
|
|
43
|
+
h as default,
|
|
41
44
|
description,
|
|
42
45
|
highlight,
|
|
43
46
|
icons,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feedback.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/feedback/graph.cjs
CHANGED
|
@@ -8,7 +8,9 @@ const react = require("react");
|
|
|
8
8
|
const core = require("@blueprintjs/core");
|
|
9
9
|
const uiComponents = require("@macrostrat/ui-components");
|
|
10
10
|
const index = require("../extractions/index.cjs");
|
|
11
|
-
const
|
|
11
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
12
|
+
const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
|
|
13
|
+
const h = hyper__default.default.styled(feedback_module.default);
|
|
12
14
|
function GraphView(props) {
|
|
13
15
|
const { tree, width, height, dispatch, selectedNodes, viewOnly } = props;
|
|
14
16
|
const [nodes, setNodes] = react.useState(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.cjs","sources":["../../src/feedback/graph.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { treeToGraph } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport {\n forceSimulation,\n SimulationNodeDatum,\n SimulationLinkDatum,\n forceCenter,\n forceLink,\n forceManyBody,\n forceCollide,\n} from \"d3-force\";\nimport { useEffect, useState } from \"react\";\nimport { Spinner, Switch } from \"@blueprintjs/core\";\nimport { ErrorBoundary } from \"@macrostrat/ui-components\";\nimport { getTagStyle } from \"../extractions\";\n\nconst h = hyper.styled(styles);\n\nexport function GraphView(props: {\n tree: TreeData[];\n width: number;\n height: number;\n dispatch: (action: any) => void;\n selectedNodes: number[];\n viewOnly?: boolean;\n}) {\n // A graph view with react-flow\n // Get positions of nodes using force simulation\n const { tree, width, height, dispatch, selectedNodes, viewOnly } = props;\n\n const [nodes, setNodes] = useState<SimulationNodeDatum[]>(null);\n const [links, setLinks] = useState<SimulationLinkDatum[]>(null);\n const [showLabels, setShowLabels] = useState(false);\n\n useEffect(() => {\n const { nodes, edges } = treeToGraph(tree);\n\n const nodesMap = new Map<number, SimulationNodeDatum>(\n nodes.map((d) => [d.id, d]),\n );\n\n const links = edges.map((d) => {\n return {\n source: nodesMap.get(d.source),\n target: nodesMap.get(d.dest),\n strength: 1,\n };\n });\n\n const simulation = forceSimulation(nodes)\n .force(\"link\", forceLink(links))\n .force(\"charge\", forceManyBody().strength(-50))\n .force(\"center\", forceCenter(width / 2, height / 2))\n .force(\"collide\", forceCollide().radius(20))\n .on(\"tick\", () => {\n // Update the positions of the nodes\n // setNodes(nodes);\n console.log(\"Simulation tick\");\n })\n .on(\"end\", () => {\n // Update the positions of the nodes\n setNodes(nodes);\n setLinks(links);\n });\n\n return () => {\n simulation.stop();\n };\n }, [tree, width, height]);\n\n if (nodes == null || links == null) {\n return h(Spinner);\n }\n\n console.log(\"Graph\", nodes, links, selectedNodes);\n\n return h(\n ErrorBoundary,\n {\n description: \"An error occurred while rendering the graph view.\",\n },\n h(\"div.graph-view\", { style: { width, height } }, [\n h(Switch, {\n className: \"show-labels-switch\",\n label: \"Show Labels\",\n checked: showLabels,\n onChange: (e) => setShowLabels(e.target.checked),\n }),\n h(\"svg\", { width, height }, [\n h(\n \"g.links\",\n links.map((d) => {\n return h(\"line\", {\n x1: d.source.x,\n y1: d.source.y,\n x2: d.target.x,\n y2: d.target.y,\n stroke: \"black\",\n });\n }),\n ),\n h(\n \"g.nodes\",\n nodes.map((d) => {\n const active = selectedNodes.includes(d.id);\n const stroke = active ? \"white\" : \"black\";\n const highlighted = isHighlighted(d.id, selectedNodes, nodes);\n const style = getTagStyle(d.color, { highlighted, active });\n\n return h(\"g\", [\n h(\"circle\", {\n cx: d.x,\n cy: d.y,\n r: 8,\n fill: style.backgroundColor || \"blue\",\n onClick: (e) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === d.id && selectedNodes.length === 1)\n ) {\n // Toggle selection on ctrl/cmd click or when node is only selected node\n e.stopPropagation();\n dispatch({\n type: \"toggle-node-selected\",\n payload: { ids: [d.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [d.id] },\n });\n }\n },\n className: active\n ? \"selected\"\n : \"\" + (viewOnly ? \"\" : \" clickable\"),\n stroke,\n strokeWidth: 2,\n }),\n h.if(showLabels)(\n \"text\",\n {\n x: d.x + 10,\n y: d.y + 4,\n className: \"node-label\",\n },\n d.name || `Node ${d.id}`,\n ),\n h.if(!showLabels)(\"title\", d.name || `Node ${d.id}`),\n ]);\n }),\n ),\n ]),\n ]),\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: TreeData[]) {\n if (selectedNodes.length === 0) return true;\n return (\n selectedNodes.includes(id) ||\n nodes.some(\n (node) =>\n selectedNodes.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["styles","useState","useEffect","nodes","treeToGraph","links","forceSimulation","forceLink","forceManyBody","forceCenter","forceCollide","Spinner","ErrorBoundary","Switch","getTagStyle"],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph.cjs","sources":["../../src/feedback/graph.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { treeToGraph } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport {\n forceSimulation,\n SimulationNodeDatum,\n SimulationLinkDatum,\n forceCenter,\n forceLink,\n forceManyBody,\n forceCollide,\n} from \"d3-force\";\nimport { useEffect, useState } from \"react\";\nimport { Spinner, Switch } from \"@blueprintjs/core\";\nimport { ErrorBoundary } from \"@macrostrat/ui-components\";\nimport { getTagStyle } from \"../extractions\";\n\nconst h = hyper.styled(styles);\n\nexport function GraphView(props: {\n tree: TreeData[];\n width: number;\n height: number;\n dispatch: (action: any) => void;\n selectedNodes: number[];\n viewOnly?: boolean;\n}) {\n // A graph view with react-flow\n // Get positions of nodes using force simulation\n const { tree, width, height, dispatch, selectedNodes, viewOnly } = props;\n\n const [nodes, setNodes] = useState<SimulationNodeDatum[]>(null);\n const [links, setLinks] = useState<SimulationLinkDatum[]>(null);\n const [showLabels, setShowLabels] = useState(false);\n\n useEffect(() => {\n const { nodes, edges } = treeToGraph(tree);\n\n const nodesMap = new Map<number, SimulationNodeDatum>(\n nodes.map((d) => [d.id, d]),\n );\n\n const links = edges.map((d) => {\n return {\n source: nodesMap.get(d.source),\n target: nodesMap.get(d.dest),\n strength: 1,\n };\n });\n\n const simulation = forceSimulation(nodes)\n .force(\"link\", forceLink(links))\n .force(\"charge\", forceManyBody().strength(-50))\n .force(\"center\", forceCenter(width / 2, height / 2))\n .force(\"collide\", forceCollide().radius(20))\n .on(\"tick\", () => {\n // Update the positions of the nodes\n // setNodes(nodes);\n console.log(\"Simulation tick\");\n })\n .on(\"end\", () => {\n // Update the positions of the nodes\n setNodes(nodes);\n setLinks(links);\n });\n\n return () => {\n simulation.stop();\n };\n }, [tree, width, height]);\n\n if (nodes == null || links == null) {\n return h(Spinner);\n }\n\n console.log(\"Graph\", nodes, links, selectedNodes);\n\n return h(\n ErrorBoundary,\n {\n description: \"An error occurred while rendering the graph view.\",\n },\n h(\"div.graph-view\", { style: { width, height } }, [\n h(Switch, {\n className: \"show-labels-switch\",\n label: \"Show Labels\",\n checked: showLabels,\n onChange: (e) => setShowLabels(e.target.checked),\n }),\n h(\"svg\", { width, height }, [\n h(\n \"g.links\",\n links.map((d) => {\n return h(\"line\", {\n x1: d.source.x,\n y1: d.source.y,\n x2: d.target.x,\n y2: d.target.y,\n stroke: \"black\",\n });\n }),\n ),\n h(\n \"g.nodes\",\n nodes.map((d) => {\n const active = selectedNodes.includes(d.id);\n const stroke = active ? \"white\" : \"black\";\n const highlighted = isHighlighted(d.id, selectedNodes, nodes);\n const style = getTagStyle(d.color, { highlighted, active });\n\n return h(\"g\", [\n h(\"circle\", {\n cx: d.x,\n cy: d.y,\n r: 8,\n fill: style.backgroundColor || \"blue\",\n onClick: (e) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === d.id && selectedNodes.length === 1)\n ) {\n // Toggle selection on ctrl/cmd click or when node is only selected node\n e.stopPropagation();\n dispatch({\n type: \"toggle-node-selected\",\n payload: { ids: [d.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [d.id] },\n });\n }\n },\n className: active\n ? \"selected\"\n : \"\" + (viewOnly ? \"\" : \" clickable\"),\n stroke,\n strokeWidth: 2,\n }),\n h.if(showLabels)(\n \"text\",\n {\n x: d.x + 10,\n y: d.y + 4,\n className: \"node-label\",\n },\n d.name || `Node ${d.id}`,\n ),\n h.if(!showLabels)(\"title\", d.name || `Node ${d.id}`),\n ]);\n }),\n ),\n ]),\n ]),\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: TreeData[]) {\n if (selectedNodes.length === 0) return true;\n return (\n selectedNodes.includes(id) ||\n nodes.some(\n (node) =>\n selectedNodes.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["hyper","styles","useState","useEffect","nodes","treeToGraph","links","forceSimulation","forceLink","forceManyBody","forceCenter","forceCollide","Spinner","ErrorBoundary","Switch","getTagStyle"],"mappings":"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"}
|
package/dist/feedback/graph.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { treeToGraph } from "./edit-state.js";
|
|
2
|
-
import
|
|
2
|
+
import h$1 from "./feedback.module.sass.js";
|
|
3
3
|
import hyper from "@macrostrat/hyper";
|
|
4
4
|
import { forceSimulation, forceLink, forceManyBody, forceCenter, forceCollide } from "d3-force";
|
|
5
5
|
import { useState, useEffect } from "react";
|
|
6
6
|
import { Spinner, Switch } from "@blueprintjs/core";
|
|
7
7
|
import { ErrorBoundary } from "@macrostrat/ui-components";
|
|
8
8
|
import { getTagStyle } from "../extractions/index.js";
|
|
9
|
-
const h = hyper.styled(
|
|
9
|
+
const h = hyper.styled(h$1);
|
|
10
10
|
function GraphView(props) {
|
|
11
11
|
const { tree, width, height, dispatch, selectedNodes, viewOnly } = props;
|
|
12
12
|
const [nodes, setNodes] = useState(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sources":["../../src/feedback/graph.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { treeToGraph } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport {\n forceSimulation,\n SimulationNodeDatum,\n SimulationLinkDatum,\n forceCenter,\n forceLink,\n forceManyBody,\n forceCollide,\n} from \"d3-force\";\nimport { useEffect, useState } from \"react\";\nimport { Spinner, Switch } from \"@blueprintjs/core\";\nimport { ErrorBoundary } from \"@macrostrat/ui-components\";\nimport { getTagStyle } from \"../extractions\";\n\nconst h = hyper.styled(styles);\n\nexport function GraphView(props: {\n tree: TreeData[];\n width: number;\n height: number;\n dispatch: (action: any) => void;\n selectedNodes: number[];\n viewOnly?: boolean;\n}) {\n // A graph view with react-flow\n // Get positions of nodes using force simulation\n const { tree, width, height, dispatch, selectedNodes, viewOnly } = props;\n\n const [nodes, setNodes] = useState<SimulationNodeDatum[]>(null);\n const [links, setLinks] = useState<SimulationLinkDatum[]>(null);\n const [showLabels, setShowLabels] = useState(false);\n\n useEffect(() => {\n const { nodes, edges } = treeToGraph(tree);\n\n const nodesMap = new Map<number, SimulationNodeDatum>(\n nodes.map((d) => [d.id, d]),\n );\n\n const links = edges.map((d) => {\n return {\n source: nodesMap.get(d.source),\n target: nodesMap.get(d.dest),\n strength: 1,\n };\n });\n\n const simulation = forceSimulation(nodes)\n .force(\"link\", forceLink(links))\n .force(\"charge\", forceManyBody().strength(-50))\n .force(\"center\", forceCenter(width / 2, height / 2))\n .force(\"collide\", forceCollide().radius(20))\n .on(\"tick\", () => {\n // Update the positions of the nodes\n // setNodes(nodes);\n console.log(\"Simulation tick\");\n })\n .on(\"end\", () => {\n // Update the positions of the nodes\n setNodes(nodes);\n setLinks(links);\n });\n\n return () => {\n simulation.stop();\n };\n }, [tree, width, height]);\n\n if (nodes == null || links == null) {\n return h(Spinner);\n }\n\n console.log(\"Graph\", nodes, links, selectedNodes);\n\n return h(\n ErrorBoundary,\n {\n description: \"An error occurred while rendering the graph view.\",\n },\n h(\"div.graph-view\", { style: { width, height } }, [\n h(Switch, {\n className: \"show-labels-switch\",\n label: \"Show Labels\",\n checked: showLabels,\n onChange: (e) => setShowLabels(e.target.checked),\n }),\n h(\"svg\", { width, height }, [\n h(\n \"g.links\",\n links.map((d) => {\n return h(\"line\", {\n x1: d.source.x,\n y1: d.source.y,\n x2: d.target.x,\n y2: d.target.y,\n stroke: \"black\",\n });\n }),\n ),\n h(\n \"g.nodes\",\n nodes.map((d) => {\n const active = selectedNodes.includes(d.id);\n const stroke = active ? \"white\" : \"black\";\n const highlighted = isHighlighted(d.id, selectedNodes, nodes);\n const style = getTagStyle(d.color, { highlighted, active });\n\n return h(\"g\", [\n h(\"circle\", {\n cx: d.x,\n cy: d.y,\n r: 8,\n fill: style.backgroundColor || \"blue\",\n onClick: (e) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === d.id && selectedNodes.length === 1)\n ) {\n // Toggle selection on ctrl/cmd click or when node is only selected node\n e.stopPropagation();\n dispatch({\n type: \"toggle-node-selected\",\n payload: { ids: [d.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [d.id] },\n });\n }\n },\n className: active\n ? \"selected\"\n : \"\" + (viewOnly ? \"\" : \" clickable\"),\n stroke,\n strokeWidth: 2,\n }),\n h.if(showLabels)(\n \"text\",\n {\n x: d.x + 10,\n y: d.y + 4,\n className: \"node-label\",\n },\n d.name || `Node ${d.id}`,\n ),\n h.if(!showLabels)(\"title\", d.name || `Node ${d.id}`),\n ]);\n }),\n ),\n ]),\n ]),\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: TreeData[]) {\n if (selectedNodes.length === 0) return true;\n return (\n selectedNodes.includes(id) ||\n nodes.some(\n (node) =>\n selectedNodes.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["nodes","links"],"mappings":";;;;;;;;AAkBA,MAAM,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"graph.js","sources":["../../src/feedback/graph.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { treeToGraph } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport {\n forceSimulation,\n SimulationNodeDatum,\n SimulationLinkDatum,\n forceCenter,\n forceLink,\n forceManyBody,\n forceCollide,\n} from \"d3-force\";\nimport { useEffect, useState } from \"react\";\nimport { Spinner, Switch } from \"@blueprintjs/core\";\nimport { ErrorBoundary } from \"@macrostrat/ui-components\";\nimport { getTagStyle } from \"../extractions\";\n\nconst h = hyper.styled(styles);\n\nexport function GraphView(props: {\n tree: TreeData[];\n width: number;\n height: number;\n dispatch: (action: any) => void;\n selectedNodes: number[];\n viewOnly?: boolean;\n}) {\n // A graph view with react-flow\n // Get positions of nodes using force simulation\n const { tree, width, height, dispatch, selectedNodes, viewOnly } = props;\n\n const [nodes, setNodes] = useState<SimulationNodeDatum[]>(null);\n const [links, setLinks] = useState<SimulationLinkDatum[]>(null);\n const [showLabels, setShowLabels] = useState(false);\n\n useEffect(() => {\n const { nodes, edges } = treeToGraph(tree);\n\n const nodesMap = new Map<number, SimulationNodeDatum>(\n nodes.map((d) => [d.id, d]),\n );\n\n const links = edges.map((d) => {\n return {\n source: nodesMap.get(d.source),\n target: nodesMap.get(d.dest),\n strength: 1,\n };\n });\n\n const simulation = forceSimulation(nodes)\n .force(\"link\", forceLink(links))\n .force(\"charge\", forceManyBody().strength(-50))\n .force(\"center\", forceCenter(width / 2, height / 2))\n .force(\"collide\", forceCollide().radius(20))\n .on(\"tick\", () => {\n // Update the positions of the nodes\n // setNodes(nodes);\n console.log(\"Simulation tick\");\n })\n .on(\"end\", () => {\n // Update the positions of the nodes\n setNodes(nodes);\n setLinks(links);\n });\n\n return () => {\n simulation.stop();\n };\n }, [tree, width, height]);\n\n if (nodes == null || links == null) {\n return h(Spinner);\n }\n\n console.log(\"Graph\", nodes, links, selectedNodes);\n\n return h(\n ErrorBoundary,\n {\n description: \"An error occurred while rendering the graph view.\",\n },\n h(\"div.graph-view\", { style: { width, height } }, [\n h(Switch, {\n className: \"show-labels-switch\",\n label: \"Show Labels\",\n checked: showLabels,\n onChange: (e) => setShowLabels(e.target.checked),\n }),\n h(\"svg\", { width, height }, [\n h(\n \"g.links\",\n links.map((d) => {\n return h(\"line\", {\n x1: d.source.x,\n y1: d.source.y,\n x2: d.target.x,\n y2: d.target.y,\n stroke: \"black\",\n });\n }),\n ),\n h(\n \"g.nodes\",\n nodes.map((d) => {\n const active = selectedNodes.includes(d.id);\n const stroke = active ? \"white\" : \"black\";\n const highlighted = isHighlighted(d.id, selectedNodes, nodes);\n const style = getTagStyle(d.color, { highlighted, active });\n\n return h(\"g\", [\n h(\"circle\", {\n cx: d.x,\n cy: d.y,\n r: 8,\n fill: style.backgroundColor || \"blue\",\n onClick: (e) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === d.id && selectedNodes.length === 1)\n ) {\n // Toggle selection on ctrl/cmd click or when node is only selected node\n e.stopPropagation();\n dispatch({\n type: \"toggle-node-selected\",\n payload: { ids: [d.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [d.id] },\n });\n }\n },\n className: active\n ? \"selected\"\n : \"\" + (viewOnly ? \"\" : \" clickable\"),\n stroke,\n strokeWidth: 2,\n }),\n h.if(showLabels)(\n \"text\",\n {\n x: d.x + 10,\n y: d.y + 4,\n className: \"node-label\",\n },\n d.name || `Node ${d.id}`,\n ),\n h.if(!showLabels)(\"title\", d.name || `Node ${d.id}`),\n ]);\n }),\n ),\n ]),\n ]),\n );\n}\n\nfunction isHighlighted(id: number, selectedNodes: number[], nodes: TreeData[]) {\n if (selectedNodes.length === 0) return true;\n return (\n selectedNodes.includes(id) ||\n nodes.some(\n (node) =>\n selectedNodes.includes(node.id) &&\n node.children.some((child) => child.id === id),\n )\n );\n}\n"],"names":["styles","nodes","links"],"mappings":";;;;;;;;AAkBA,MAAM,IAAI,MAAM,OAAOA,GAAM;AAEtB,SAAS,UAAU,OAOvB;AAGD,QAAM,EAAE,MAAM,OAAO,QAAQ,UAAU,eAAe,aAAa;AAEnE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,IAAI;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,IAAI;AAC9D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,YAAU,MAAM;AACd,UAAM,EAAE,OAAAC,QAAO,MAAA,IAAU,YAAY,IAAI;AAEzC,UAAM,WAAW,IAAI;AAAA,MACnBA,OAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,IAAA;AAG5B,UAAMC,SAAQ,MAAM,IAAI,CAAC,MAAM;AAC7B,aAAO;AAAA,QACL,QAAQ,SAAS,IAAI,EAAE,MAAM;AAAA,QAC7B,QAAQ,SAAS,IAAI,EAAE,IAAI;AAAA,QAC3B,UAAU;AAAA,MAAA;AAAA,IAEd,CAAC;AAED,UAAM,aAAa,gBAAgBD,MAAK,EACrC,MAAM,QAAQ,UAAUC,MAAK,CAAC,EAC9B,MAAM,UAAU,cAAA,EAAgB,SAAS,GAAG,CAAC,EAC7C,MAAM,UAAU,YAAY,QAAQ,GAAG,SAAS,CAAC,CAAC,EAClD,MAAM,WAAW,aAAA,EAAe,OAAO,EAAE,CAAC,EAC1C,GAAG,QAAQ,MAAM;AAGhB,cAAQ,IAAI,iBAAiB;AAAA,IAC/B,CAAC,EACA,GAAG,OAAO,MAAM;AAEf,eAASD,MAAK;AACd,eAASC,MAAK;AAAA,IAChB,CAAC;AAEH,WAAO,MAAM;AACX,iBAAW,KAAA;AAAA,IACb;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,MAAM,CAAC;AAExB,MAAI,SAAS,QAAQ,SAAS,MAAM;AAClC,WAAO,EAAE,OAAO;AAAA,EAClB;AAEA,UAAQ,IAAI,SAAS,OAAO,OAAO,aAAa;AAEhD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,IAAA;AAAA,IAEf,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,OAAA,KAAY;AAAA,MAChD,EAAE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,OAAO;AAAA,MAAA,CAChD;AAAA,MACD,EAAE,OAAO,EAAE,OAAO,UAAU;AAAA,QAC1B;AAAA,UACE;AAAA,UACA,MAAM,IAAI,CAAC,MAAM;AACf,mBAAO,EAAE,QAAQ;AAAA,cACf,IAAI,EAAE,OAAO;AAAA,cACb,IAAI,EAAE,OAAO;AAAA,cACb,IAAI,EAAE,OAAO;AAAA,cACb,IAAI,EAAE,OAAO;AAAA,cACb,QAAQ;AAAA,YAAA,CACT;AAAA,UACH,CAAC;AAAA,QAAA;AAAA,QAEH;AAAA,UACE;AAAA,UACA,MAAM,IAAI,CAAC,MAAM;AACf,kBAAM,SAAS,cAAc,SAAS,EAAE,EAAE;AAC1C,kBAAM,SAAS,SAAS,UAAU;AAClC,kBAAM,cAAc,cAAc,EAAE,IAAI,eAAe,KAAK;AAC5D,kBAAM,QAAQ,YAAY,EAAE,OAAO,EAAE,aAAa,QAAQ;AAE1D,mBAAO,EAAE,KAAK;AAAA,cACZ,EAAE,UAAU;AAAA,gBACV,IAAI,EAAE;AAAA,gBACN,IAAI,EAAE;AAAA,gBACN,GAAG;AAAA,gBACH,MAAM,MAAM,mBAAmB;AAAA,gBAC/B,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAA;AACF,sBACE,EAAE,WACF,EAAE,WACD,cAAc,CAAC,MAAM,EAAE,MAAM,cAAc,WAAW,GACvD;AAEA,sBAAE,gBAAA;AACF,6BAAS;AAAA,sBACP,MAAM;AAAA,sBACN,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,EAAA;AAAA,oBAAE,CACxB;AAAA,kBACH,OAAO;AACL,6BAAS;AAAA,sBACP,MAAM;AAAA,sBACN,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,EAAA;AAAA,oBAAE,CACxB;AAAA,kBACH;AAAA,gBACF;AAAA,gBACA,WAAW,SACP,aACM,WAAW,KAAK;AAAA,gBAC1B;AAAA,gBACA,aAAa;AAAA,cAAA,CACd;AAAA,cACD,EAAE,GAAG,UAAU;AAAA,gBACb;AAAA,gBACA;AAAA,kBACE,GAAG,EAAE,IAAI;AAAA,kBACT,GAAG,EAAE,IAAI;AAAA,kBACT,WAAW;AAAA,gBAAA;AAAA,gBAEb,EAAE,QAAQ,QAAQ,EAAE,EAAE;AAAA,cAAA;AAAA,cAExB,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,QAAQ,EAAE,EAAE,EAAE;AAAA,YAAA,CACpD;AAAA,UACH,CAAC;AAAA,QAAA;AAAA,MACH,CACD;AAAA,IAAA,CACF;AAAA,EAAA;AAEL;AAEA,SAAS,cAAc,IAAY,eAAyB,OAAmB;AAC7E,MAAI,cAAc,WAAW,EAAG,QAAO;AACvC,SACE,cAAc,SAAS,EAAE,KACzB,MAAM;AAAA,IACJ,CAAC,SACC,cAAc,SAAS,KAAK,EAAE,KAC9B,KAAK,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AAAA,EAAA;AAGrD;"}
|
package/dist/feedback/index.cjs
CHANGED
|
@@ -15,7 +15,10 @@ const useElementDimensions = require("use-element-dimensions");
|
|
|
15
15
|
const graph = require("./graph.cjs");
|
|
16
16
|
const matches = require("./matches.cjs");
|
|
17
17
|
const typelist = require("./typelist.cjs");
|
|
18
|
-
const
|
|
18
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
19
|
+
const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
|
|
20
|
+
const useElementDimensions__default = /* @__PURE__ */ _interopDefault(useElementDimensions);
|
|
21
|
+
const h = hyper__default.default.styled(feedback_module.default);
|
|
19
22
|
function setsAreTheSame(a, b) {
|
|
20
23
|
if (a.size !== b.size) return false;
|
|
21
24
|
for (const item of a) {
|
|
@@ -52,7 +55,7 @@ function FeedbackComponent({
|
|
|
52
55
|
isSelectingEntityType,
|
|
53
56
|
entityTypesMap
|
|
54
57
|
} = state;
|
|
55
|
-
const [{ width, height }, ref] =
|
|
58
|
+
const [{ width, height }, ref] = useElementDimensions__default.default();
|
|
56
59
|
return h("div.page-wrapper", [
|
|
57
60
|
h(
|
|
58
61
|
"div.feedback-container",
|
|
@@ -262,7 +265,7 @@ function ManagedSelectionTree(props) {
|
|
|
262
265
|
const ref = react.useRef();
|
|
263
266
|
const clickedRef = react.useRef(false);
|
|
264
267
|
const _Node = react.useCallback(
|
|
265
|
-
(props2) => h(node
|
|
268
|
+
(props2) => h(node, { ...props2, matchComponent, viewOnly }),
|
|
266
269
|
[matchComponent, viewOnly]
|
|
267
270
|
);
|
|
268
271
|
react.useEffect(() => {
|