@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/extractions/index.cjs +5 -2
  3. package/dist/extractions/index.cjs.map +1 -1
  4. package/dist/extractions/index.js +2 -2
  5. package/dist/extractions/index.js.map +1 -1
  6. package/dist/extractions/main.module.sass.cjs +6 -1
  7. package/dist/extractions/main.module.sass.cjs.map +1 -1
  8. package/dist/extractions/main.module.sass.js +4 -1
  9. package/dist/extractions/main.module.sass.js.map +1 -1
  10. package/dist/feedback/edit-state.cjs +6 -4
  11. package/dist/feedback/edit-state.cjs.map +1 -1
  12. package/dist/feedback/feedback.module.sass.cjs +6 -1
  13. package/dist/feedback/feedback.module.sass.cjs.map +1 -1
  14. package/dist/feedback/feedback.module.sass.js +4 -1
  15. package/dist/feedback/feedback.module.sass.js.map +1 -1
  16. package/dist/feedback/graph.cjs +3 -1
  17. package/dist/feedback/graph.cjs.map +1 -1
  18. package/dist/feedback/graph.js +2 -2
  19. package/dist/feedback/graph.js.map +1 -1
  20. package/dist/feedback/index.cjs +6 -3
  21. package/dist/feedback/index.cjs.map +1 -1
  22. package/dist/feedback/index.js +2 -2
  23. package/dist/feedback/index.js.map +1 -1
  24. package/dist/feedback/matches.cjs +3 -1
  25. package/dist/feedback/matches.cjs.map +1 -1
  26. package/dist/feedback/matches.js +2 -2
  27. package/dist/feedback/matches.js.map +1 -1
  28. package/dist/feedback/node.cjs +4 -3
  29. package/dist/feedback/node.cjs.map +1 -1
  30. package/dist/feedback/node.js +2 -2
  31. package/dist/feedback/node.js.map +1 -1
  32. package/dist/feedback/text-visualizer.cjs +3 -1
  33. package/dist/feedback/text-visualizer.cjs.map +1 -1
  34. package/dist/feedback/text-visualizer.js +2 -2
  35. package/dist/feedback/text-visualizer.js.map +1 -1
  36. package/dist/feedback/type-selector/index.cjs +5 -2
  37. package/dist/feedback/type-selector/index.cjs.map +1 -1
  38. package/dist/feedback/type-selector/index.js +2 -2
  39. package/dist/feedback/type-selector/index.js.map +1 -1
  40. package/dist/feedback/type-selector/main.module.sass.cjs +6 -1
  41. package/dist/feedback/type-selector/main.module.sass.cjs.map +1 -1
  42. package/dist/feedback/type-selector/main.module.sass.js +4 -1
  43. package/dist/feedback/type-selector/main.module.sass.js.map +1 -1
  44. package/dist/feedback/typelist.cjs +3 -1
  45. package/dist/feedback/typelist.cjs.map +1 -1
  46. package/dist/feedback/typelist.js +2 -2
  47. package/dist/feedback/typelist.js.map +1 -1
  48. package/dist/feedback-components.css +2 -2
  49. package/package.json +18 -13
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/feedback/index.ts"],"sourcesContent":["import styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nimport { Tree, TreeApi } from \"react-arborist\";\nimport Node from \"./node\";\nimport { FeedbackText } from \"./text-visualizer\";\nimport type { InternalEntity, TreeData } from \"./types\";\nimport type { Entity } from \"../extractions\";\nimport { getTagStyle, ModelInfo } from \"../extractions\";\nimport {\n TreeDispatchContext,\n treeToGraph,\n useUpdatableTree,\n ViewMode,\n} from \"./edit-state\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n ButtonGroup,\n Card,\n SegmentedControl,\n Divider,\n} from \"@blueprintjs/core\";\nimport { OmniboxSelector } from \"./type-selector\";\nimport {\n CancelButton,\n ErrorBoundary,\n FlexRow,\n SaveButton,\n} from \"@macrostrat/ui-components\";\nimport useElementDimensions from \"use-element-dimensions\";\nimport { GraphView } from \"./graph\";\n\nimport { Matches } from \"./matches\";\nimport { TypeList } from \"./typelist\";\n\nexport type { GraphData } from \"./edit-state\";\nexport { treeToGraph } from \"./edit-state\";\nexport type { TreeData } from \"./types\";\n\nconst h = hyper.styled(styles);\n\nfunction setsAreTheSame<T>(a: Set<T>, b: Set<T>) {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n}\n\nexport function FeedbackComponent({\n entities = [],\n text,\n model,\n entityTypes,\n matchComponent,\n onSave,\n allowOverlap,\n matchLinks,\n view = false,\n autoSelect = [],\n}) {\n const [viewOnly, setViewOnly] = useState(view);\n const [match, setMatchLinks] = useState(matchLinks);\n const matchMode = match !== undefined;\n\n // Get the input arguments\n const [state, dispatch] = useUpdatableTree(\n entities.map(processEntity) as any,\n entityTypes,\n viewOnly,\n matchMode,\n autoSelect,\n );\n\n const {\n selectedNodes,\n tree,\n selectedEntityType,\n isSelectingEntityType,\n entityTypesMap,\n } = state;\n\n const [{ width, height }, ref] = useElementDimensions();\n\n return h(\"div.page-wrapper\", [\n h(\n \"div.feedback-container\",\n h(TreeDispatchContext.Provider, { value: dispatch }, [\n h.if(!view)(SegmentedControl, {\n options: [\n { label: \"View\", value: \"view\" },\n { label: \"Edit\", value: \"edit\" },\n ],\n value: viewOnly ? \"view\" : \"edit\",\n small: true,\n onValueChange() {\n setViewOnly(!viewOnly);\n dispatch({ type: \"toggle-view-only\" });\n },\n role: \"toolbar\",\n }),\n h(\n ErrorBoundary,\n {\n description:\n \"An error occurred while rendering the feedback text component.\",\n },\n h(FeedbackText, {\n text,\n dispatch,\n // @ts-ignore\n nodes: tree,\n selectedNodes,\n allowOverlap,\n matchLinks: match,\n viewOnly,\n }),\n ),\n h(\n FlexRow,\n { alignItems: \"baseline\", justifyContent: \"space-between\" },\n [\n h(ModelInfo, { data: model }),\n h(SegmentedControl, {\n options: [\n { label: \"Tree\", value: \"tree\" },\n { label: \"Graph\", value: \"graph\" },\n ],\n value: state.viewMode,\n small: true,\n onValueChange(value: ViewMode) {\n console.log(\"Setting view mode\", value);\n dispatch({ type: \"set-view-mode\", payload: value });\n },\n }),\n ],\n ),\n h(\n \"div.entity-panel\",\n {\n ref,\n },\n [\n h.if(state.viewMode == \"tree\")(ManagedSelectionTree, {\n selectedNodes,\n dispatch,\n tree,\n width,\n height,\n matchComponent,\n viewOnly,\n }),\n h.if(state.viewMode == \"graph\")(GraphView, {\n tree,\n width,\n height,\n dispatch,\n selectedNodes,\n viewOnly,\n }),\n ],\n ),\n ]),\n ),\n h(Card, { className: \"control-panel\" }, [\n h(\"div.control-content\", [\n h.if(!viewOnly)(\n ButtonGroup,\n {\n vertical: true,\n fill: true,\n minimal: true,\n alignText: \"left\",\n },\n [\n h(\n CancelButton,\n {\n icon: \"trash\",\n disabled: state.initialTree == state.tree,\n onClick() {\n dispatch({ type: \"reset\" });\n },\n },\n \"Reset\",\n ),\n h(\n SaveButton,\n {\n onClick() {\n onSave(state.tree);\n },\n disabled: state.initialTree == state.tree,\n },\n \"Save\",\n ),\n ],\n ),\n h.if(!viewOnly)(Matches, {\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n }),\n h.if(!viewOnly)(Divider),\n h(EntityTypeSelector, {\n entityTypes: entityTypesMap,\n selected: selectedEntityType,\n onChange(payload) {\n dispatch({ type: \"select-entity-type\", payload });\n },\n dispatch,\n tree,\n selectedNodes,\n isOpen: isSelectingEntityType,\n setOpen: (isOpen: boolean) =>\n dispatch({\n type: \"toggle-entity-type-selector\",\n payload: isOpen,\n }),\n viewOnly,\n matchMode,\n }),\n ]),\n ]),\n ]);\n}\n\nfunction processEntity(entity: Entity): InternalEntity {\n // @ts-ignore\n return {\n ...entity,\n // @ts-ignore\n term_type: entity.type.name,\n txt_range: [entity.indices],\n children: entity.children?.map(processEntity) ?? [],\n };\n}\n\nfunction EntityTypeSelector({\n entityTypes,\n selected,\n isOpen,\n setOpen,\n onChange,\n tree,\n dispatch,\n selectedNodes = [],\n viewOnly,\n matchMode,\n}) {\n // Show all entity types when selected is null\n const _selected = selected != null ? selected : undefined;\n const [inputValue, setInputValue] = useState(\"\");\n const types = Array.from(entityTypes.values());\n\n const items =\n inputValue !== \"\"\n ? types.filter((d) =>\n d.name.toLowerCase().includes(inputValue.toLowerCase()),\n )\n : types;\n\n return h(\"div.entity-type-selector\", [\n h(TypeList, {\n types: entityTypes,\n selected: _selected,\n dispatch,\n selectedNodes,\n tree,\n viewOnly: viewOnly || matchMode,\n }),\n h(OmniboxSelector, {\n isOpen,\n items,\n selectedItem: _selected,\n onSelectItem(item) {\n setOpen(false);\n onChange(item);\n },\n onQueryChange(query) {\n setInputValue(query);\n },\n onClose() {\n setOpen(false);\n },\n }),\n ]);\n}\n\nfunction countNodes(tree) {\n if (!tree) return 0;\n let count = 0;\n\n function recurse(nodes) {\n for (const node of nodes) {\n count++;\n if (node.children && Array.isArray(node.children)) {\n recurse(node.children);\n }\n }\n }\n\n recurse(tree);\n return count;\n}\n\nfunction ManagedSelectionTree(props) {\n const {\n selectedNodes,\n dispatch,\n tree,\n height,\n width,\n matchComponent,\n viewOnly,\n } = props;\n\n const ref = useRef<TreeApi<TreeData>>();\n // Use a ref to track clicks (won't cause rerender)\n const clickedRef = useRef(false);\n\n const _Node = useCallback(\n (props) => h(Node, { ...props, matchComponent, viewOnly }),\n [matchComponent, viewOnly],\n );\n\n // Update Tree selection when selectedNodes change\n useEffect(() => {\n if (ref.current == null) return;\n\n const selection = new Set(selectedNodes.map((d) => d.toString()));\n const currentSelection = ref.current.selectedIds;\n if (setsAreTheSame(selection, currentSelection)) return;\n\n ref.current.setSelection({\n ids: selectedNodes.map((d) => d.toString()),\n anchor: null,\n mostRecent: null,\n });\n }, [selectedNodes]);\n\n // Mark clicked when user clicks inside the tree container\n function handleClick() {\n clickedRef.current = true;\n }\n\n const ctrlPressedRef = useRef(false);\n\n useEffect(() => {\n const down = (e) => {\n if (e.ctrlKey || e.metaKey) ctrlPressedRef.current = true;\n };\n const up = () => (ctrlPressedRef.current = false);\n\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n };\n }, []);\n\n const handleSelect = useCallback(\n (nodes) => {\n if (!clickedRef.current) return;\n clickedRef.current = false;\n const isMultiSelect = ctrlPressedRef.current;\n\n let ids = nodes.map((d) => parseInt(d.id));\n\n if (isMultiSelect) {\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n } else {\n if (ids.length === 1 && ids[0] === selectedNodes[0]) {\n ids = [];\n }\n\n dispatch({ type: \"select-node\", payload: { ids } });\n }\n },\n [selectedNodes, dispatch],\n );\n\n return h(\n \"div.selection-tree-wrapper\",\n { onPointerDown: handleClick },\n h(Tree, {\n className: \"selection-tree\",\n height,\n width,\n ref,\n data: tree,\n onMove({ dragIds, parentId, index }) {\n dispatch({\n type: \"move-node\",\n payload: {\n dragIds: dragIds.map((d) => parseInt(d)),\n parentId: parentId ? parseInt(parentId) : null,\n index,\n },\n });\n },\n onDelete({ ids }) {\n dispatch({\n type: \"delete-node\",\n payload: { ids: ids.map((d) => parseInt(d)) },\n });\n },\n onSelect: handleSelect,\n children: _Node,\n idAccessor(d) {\n return d.id.toString();\n },\n }),\n );\n}\n"],"names":["styles","useState","useUpdatableTree","TreeDispatchContext","SegmentedControl","ErrorBoundary","FeedbackText","FlexRow","ModelInfo","GraphView","Card","ButtonGroup","CancelButton","SaveButton","Matches","Divider","TypeList","OmniboxSelector","useRef","useCallback","props","Node","useEffect","Tree","index"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/feedback/index.ts"],"sourcesContent":["import styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nimport { Tree, TreeApi } from \"react-arborist\";\nimport Node from \"./node\";\nimport { FeedbackText } from \"./text-visualizer\";\nimport type { InternalEntity, TreeData } from \"./types\";\nimport type { Entity } from \"../extractions\";\nimport { getTagStyle, ModelInfo } from \"../extractions\";\nimport {\n TreeDispatchContext,\n treeToGraph,\n useUpdatableTree,\n ViewMode,\n} from \"./edit-state\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n ButtonGroup,\n Card,\n SegmentedControl,\n Divider,\n} from \"@blueprintjs/core\";\nimport { OmniboxSelector } from \"./type-selector\";\nimport {\n CancelButton,\n ErrorBoundary,\n FlexRow,\n SaveButton,\n} from \"@macrostrat/ui-components\";\nimport useElementDimensions from \"use-element-dimensions\";\nimport { GraphView } from \"./graph\";\n\nimport { Matches } from \"./matches\";\nimport { TypeList } from \"./typelist\";\n\nexport type { GraphData } from \"./edit-state\";\nexport { treeToGraph } from \"./edit-state\";\nexport type { TreeData } from \"./types\";\n\nconst h = hyper.styled(styles);\n\nfunction setsAreTheSame<T>(a: Set<T>, b: Set<T>) {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n}\n\nexport function FeedbackComponent({\n entities = [],\n text,\n model,\n entityTypes,\n matchComponent,\n onSave,\n allowOverlap,\n matchLinks,\n view = false,\n autoSelect = [],\n}) {\n const [viewOnly, setViewOnly] = useState(view);\n const [match, setMatchLinks] = useState(matchLinks);\n const matchMode = match !== undefined;\n\n // Get the input arguments\n const [state, dispatch] = useUpdatableTree(\n entities.map(processEntity) as any,\n entityTypes,\n viewOnly,\n matchMode,\n autoSelect,\n );\n\n const {\n selectedNodes,\n tree,\n selectedEntityType,\n isSelectingEntityType,\n entityTypesMap,\n } = state;\n\n const [{ width, height }, ref] = useElementDimensions();\n\n return h(\"div.page-wrapper\", [\n h(\n \"div.feedback-container\",\n h(TreeDispatchContext.Provider, { value: dispatch }, [\n h.if(!view)(SegmentedControl, {\n options: [\n { label: \"View\", value: \"view\" },\n { label: \"Edit\", value: \"edit\" },\n ],\n value: viewOnly ? \"view\" : \"edit\",\n small: true,\n onValueChange() {\n setViewOnly(!viewOnly);\n dispatch({ type: \"toggle-view-only\" });\n },\n role: \"toolbar\",\n }),\n h(\n ErrorBoundary,\n {\n description:\n \"An error occurred while rendering the feedback text component.\",\n },\n h(FeedbackText, {\n text,\n dispatch,\n // @ts-ignore\n nodes: tree,\n selectedNodes,\n allowOverlap,\n matchLinks: match,\n viewOnly,\n }),\n ),\n h(\n FlexRow,\n { alignItems: \"baseline\", justifyContent: \"space-between\" },\n [\n h(ModelInfo, { data: model }),\n h(SegmentedControl, {\n options: [\n { label: \"Tree\", value: \"tree\" },\n { label: \"Graph\", value: \"graph\" },\n ],\n value: state.viewMode,\n small: true,\n onValueChange(value: ViewMode) {\n console.log(\"Setting view mode\", value);\n dispatch({ type: \"set-view-mode\", payload: value });\n },\n }),\n ],\n ),\n h(\n \"div.entity-panel\",\n {\n ref,\n },\n [\n h.if(state.viewMode == \"tree\")(ManagedSelectionTree, {\n selectedNodes,\n dispatch,\n tree,\n width,\n height,\n matchComponent,\n viewOnly,\n }),\n h.if(state.viewMode == \"graph\")(GraphView, {\n tree,\n width,\n height,\n dispatch,\n selectedNodes,\n viewOnly,\n }),\n ],\n ),\n ]),\n ),\n h(Card, { className: \"control-panel\" }, [\n h(\"div.control-content\", [\n h.if(!viewOnly)(\n ButtonGroup,\n {\n vertical: true,\n fill: true,\n minimal: true,\n alignText: \"left\",\n },\n [\n h(\n CancelButton,\n {\n icon: \"trash\",\n disabled: state.initialTree == state.tree,\n onClick() {\n dispatch({ type: \"reset\" });\n },\n },\n \"Reset\",\n ),\n h(\n SaveButton,\n {\n onClick() {\n onSave(state.tree);\n },\n disabled: state.initialTree == state.tree,\n },\n \"Save\",\n ),\n ],\n ),\n h.if(!viewOnly)(Matches, {\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n }),\n h.if(!viewOnly)(Divider),\n h(EntityTypeSelector, {\n entityTypes: entityTypesMap,\n selected: selectedEntityType,\n onChange(payload) {\n dispatch({ type: \"select-entity-type\", payload });\n },\n dispatch,\n tree,\n selectedNodes,\n isOpen: isSelectingEntityType,\n setOpen: (isOpen: boolean) =>\n dispatch({\n type: \"toggle-entity-type-selector\",\n payload: isOpen,\n }),\n viewOnly,\n matchMode,\n }),\n ]),\n ]),\n ]);\n}\n\nfunction processEntity(entity: Entity): InternalEntity {\n // @ts-ignore\n return {\n ...entity,\n // @ts-ignore\n term_type: entity.type.name,\n txt_range: [entity.indices],\n children: entity.children?.map(processEntity) ?? [],\n };\n}\n\nfunction EntityTypeSelector({\n entityTypes,\n selected,\n isOpen,\n setOpen,\n onChange,\n tree,\n dispatch,\n selectedNodes = [],\n viewOnly,\n matchMode,\n}) {\n // Show all entity types when selected is null\n const _selected = selected != null ? selected : undefined;\n const [inputValue, setInputValue] = useState(\"\");\n const types = Array.from(entityTypes.values());\n\n const items =\n inputValue !== \"\"\n ? types.filter((d) =>\n d.name.toLowerCase().includes(inputValue.toLowerCase()),\n )\n : types;\n\n return h(\"div.entity-type-selector\", [\n h(TypeList, {\n types: entityTypes,\n selected: _selected,\n dispatch,\n selectedNodes,\n tree,\n viewOnly: viewOnly || matchMode,\n }),\n h(OmniboxSelector, {\n isOpen,\n items,\n selectedItem: _selected,\n onSelectItem(item) {\n setOpen(false);\n onChange(item);\n },\n onQueryChange(query) {\n setInputValue(query);\n },\n onClose() {\n setOpen(false);\n },\n }),\n ]);\n}\n\nfunction countNodes(tree) {\n if (!tree) return 0;\n let count = 0;\n\n function recurse(nodes) {\n for (const node of nodes) {\n count++;\n if (node.children && Array.isArray(node.children)) {\n recurse(node.children);\n }\n }\n }\n\n recurse(tree);\n return count;\n}\n\nfunction ManagedSelectionTree(props) {\n const {\n selectedNodes,\n dispatch,\n tree,\n height,\n width,\n matchComponent,\n viewOnly,\n } = props;\n\n const ref = useRef<TreeApi<TreeData>>();\n // Use a ref to track clicks (won't cause rerender)\n const clickedRef = useRef(false);\n\n const _Node = useCallback(\n (props) => h(Node, { ...props, matchComponent, viewOnly }),\n [matchComponent, viewOnly],\n );\n\n // Update Tree selection when selectedNodes change\n useEffect(() => {\n if (ref.current == null) return;\n\n const selection = new Set(selectedNodes.map((d) => d.toString()));\n const currentSelection = ref.current.selectedIds;\n if (setsAreTheSame(selection, currentSelection)) return;\n\n ref.current.setSelection({\n ids: selectedNodes.map((d) => d.toString()),\n anchor: null,\n mostRecent: null,\n });\n }, [selectedNodes]);\n\n // Mark clicked when user clicks inside the tree container\n function handleClick() {\n clickedRef.current = true;\n }\n\n const ctrlPressedRef = useRef(false);\n\n useEffect(() => {\n const down = (e) => {\n if (e.ctrlKey || e.metaKey) ctrlPressedRef.current = true;\n };\n const up = () => (ctrlPressedRef.current = false);\n\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n };\n }, []);\n\n const handleSelect = useCallback(\n (nodes) => {\n if (!clickedRef.current) return;\n clickedRef.current = false;\n const isMultiSelect = ctrlPressedRef.current;\n\n let ids = nodes.map((d) => parseInt(d.id));\n\n if (isMultiSelect) {\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n } else {\n if (ids.length === 1 && ids[0] === selectedNodes[0]) {\n ids = [];\n }\n\n dispatch({ type: \"select-node\", payload: { ids } });\n }\n },\n [selectedNodes, dispatch],\n );\n\n return h(\n \"div.selection-tree-wrapper\",\n { onPointerDown: handleClick },\n h(Tree, {\n className: \"selection-tree\",\n height,\n width,\n ref,\n data: tree,\n onMove({ dragIds, parentId, index }) {\n dispatch({\n type: \"move-node\",\n payload: {\n dragIds: dragIds.map((d) => parseInt(d)),\n parentId: parentId ? parseInt(parentId) : null,\n index,\n },\n });\n },\n onDelete({ ids }) {\n dispatch({\n type: \"delete-node\",\n payload: { ids: ids.map((d) => parseInt(d)) },\n });\n },\n onSelect: handleSelect,\n children: _Node,\n idAccessor(d) {\n return d.id.toString();\n },\n }),\n );\n}\n"],"names":["hyper","styles","useState","useUpdatableTree","useElementDimensions","TreeDispatchContext","SegmentedControl","ErrorBoundary","FeedbackText","FlexRow","ModelInfo","GraphView","Card","ButtonGroup","CancelButton","SaveButton","Matches","Divider","TypeList","OmniboxSelector","useRef","useCallback","props","Node","useEffect","Tree","index"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,IAAIA,eAAAA,QAAM,OAAOC,uBAAM;AAE7B,SAAS,eAAkB,GAAW,GAAW;AAC/C,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,aAAW,QAAQ,GAAG;AACpB,QAAI,CAAC,EAAE,IAAI,IAAI,EAAG,QAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB;AAAA,EAChC,WAAW,CAAA;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,aAAa,CAAA;AACf,GAAG;AACD,QAAM,CAAC,UAAU,WAAW,IAAIC,MAAAA,SAAS,IAAI;AAC7C,QAAM,CAAC,OAAO,aAAa,IAAIA,MAAAA,SAAS,UAAU;AAClD,QAAM,YAAY,UAAU;AAG5B,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAAA;AAAAA,IACxB,SAAS,IAAI,aAAa;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,CAAC,EAAE,OAAO,UAAU,GAAG,IAAIC,8BAAAA,QAAA;AAEjC,SAAO,EAAE,oBAAoB;AAAA,IAC3B;AAAA,MACE;AAAA,MACA,EAAEC,UAAAA,oBAAoB,UAAU,EAAE,OAAO,YAAY;AAAA,QACnD,EAAE,GAAG,CAAC,IAAI,EAAEC,KAAAA,kBAAkB;AAAA,UAC5B,SAAS;AAAA,YACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,YACxB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,UAAO;AAAA,UAEjC,OAAO,WAAW,SAAS;AAAA,UAC3B,OAAO;AAAA,UACP,gBAAgB;AACd,wBAAY,CAAC,QAAQ;AACrB,qBAAS,EAAE,MAAM,oBAAoB;AAAA,UACvC;AAAA,UACA,MAAM;AAAA,QAAA,CACP;AAAA,QACD;AAAA,UACEC,aAAAA;AAAAA,UACA;AAAA,YACE,aACE;AAAA,UAAA;AAAA,UAEJ,EAAEC,eAAAA,cAAc;AAAA,YACd;AAAA,YACA;AAAA;AAAA,YAEA,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH;AAAA,UACEC,aAAAA;AAAAA,UACA,EAAE,YAAY,YAAY,gBAAgB,gBAAA;AAAA,UAC1C;AAAA,YACE,EAAEC,MAAAA,WAAW,EAAE,MAAM,OAAO;AAAA,YAC5B,EAAEJ,KAAAA,kBAAkB;AAAA,cAClB,SAAS;AAAA,gBACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,gBACxB,EAAE,OAAO,SAAS,OAAO,QAAA;AAAA,cAAQ;AAAA,cAEnC,OAAO,MAAM;AAAA,cACb,OAAO;AAAA,cACP,cAAc,OAAiB;AAC7B,wBAAQ,IAAI,qBAAqB,KAAK;AACtC,yBAAS,EAAE,MAAM,iBAAiB,SAAS,OAAO;AAAA,cACpD;AAAA,YAAA,CACD;AAAA,UAAA;AAAA,QACH;AAAA,QAEF;AAAA,UACE;AAAA,UACA;AAAA,YACE;AAAA,UAAA;AAAA,UAEF;AAAA,YACE,EAAE,GAAG,MAAM,YAAY,MAAM,EAAE,sBAAsB;AAAA,cACnD;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,CACD;AAAA,YACD,EAAE,GAAG,MAAM,YAAY,OAAO,EAAEK,MAAAA,WAAW;AAAA,cACzC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,CACD;AAAA,UAAA;AAAA,QACH;AAAA,MACF,CACD;AAAA,IAAA;AAAA,IAEH,EAAEC,KAAAA,MAAM,EAAE,WAAW,mBAAmB;AAAA,MACtC,EAAE,uBAAuB;AAAA,QACvB,EAAE,GAAG,CAAC,QAAQ;AAAA,UACZC,KAAAA;AAAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,MAAM;AAAA,YACN,SAAS;AAAA,YACT,WAAW;AAAA,UAAA;AAAA,UAEb;AAAA,YACE;AAAA,cACEC,aAAAA;AAAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU,MAAM,eAAe,MAAM;AAAA,gBACrC,UAAU;AACR,2BAAS,EAAE,MAAM,SAAS;AAAA,gBAC5B;AAAA,cAAA;AAAA,cAEF;AAAA,YAAA;AAAA,YAEF;AAAA,cACEC,aAAAA;AAAAA,cACA;AAAA,gBACE,UAAU;AACR,yBAAO,MAAM,IAAI;AAAA,gBACnB;AAAA,gBACA,UAAU,MAAM,eAAe,MAAM;AAAA,cAAA;AAAA,cAEvC;AAAA,YAAA;AAAA,UACF;AAAA,QACF;AAAA,QAEF,EAAE,GAAG,CAAC,QAAQ,EAAEC,QAAAA,SAAS;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,QACD,EAAE,GAAG,CAAC,QAAQ,EAAEC,KAAAA,OAAO;AAAA,QACvB,EAAE,oBAAoB;AAAA,UACpB,aAAa;AAAA,UACb,UAAU;AAAA,UACV,SAAS,SAAS;AAChB,qBAAS,EAAE,MAAM,sBAAsB,QAAA,CAAS;AAAA,UAClD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,SAAS,CAAC,WACR,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,UAAA,CACV;AAAA,UACH;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;AAEA,SAAS,cAAc,QAAgC;AAErD,SAAO;AAAA,IACL,GAAG;AAAA;AAAA,IAEH,WAAW,OAAO,KAAK;AAAA,IACvB,WAAW,CAAC,OAAO,OAAO;AAAA,IAC1B,UAAU,OAAO,UAAU,IAAI,aAAa,KAAK,CAAA;AAAA,EAAC;AAEtD;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,CAAA;AAAA,EAChB;AAAA,EACA;AACF,GAAG;AAED,QAAM,YAAY,YAAY,OAAO,WAAW;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIf,MAAAA,SAAS,EAAE;AAC/C,QAAM,QAAQ,MAAM,KAAK,YAAY,QAAQ;AAE7C,QAAM,QACJ,eAAe,KACX,MAAM;AAAA,IAAO,CAAC,MACZ,EAAE,KAAK,cAAc,SAAS,WAAW,YAAA,CAAa;AAAA,EAAA,IAExD;AAEN,SAAO,EAAE,4BAA4B;AAAA,IACnC,EAAEgB,SAAAA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,YAAY;AAAA,IAAA,CACvB;AAAA,IACD,EAAEC,QAAAA,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,aAAa,MAAM;AACjB,gBAAQ,KAAK;AACb,iBAAS,IAAI;AAAA,MACf;AAAA,MACA,cAAc,OAAO;AACnB,sBAAc,KAAK;AAAA,MACrB;AAAA,MACA,UAAU;AACR,gBAAQ,KAAK;AAAA,MACf;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AAmBA,SAAS,qBAAqB,OAAO;AACnC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,MAAMC,MAAAA,OAAA;AAEZ,QAAM,aAAaA,MAAAA,OAAO,KAAK;AAE/B,QAAM,QAAQC,MAAAA;AAAAA,IACZ,CAACC,WAAU,EAAEC,MAAM,EAAE,GAAGD,QAAO,gBAAgB,UAAU;AAAA,IACzD,CAAC,gBAAgB,QAAQ;AAAA,EAAA;AAI3BE,QAAAA,UAAU,MAAM;AACd,QAAI,IAAI,WAAW,KAAM;AAEzB,UAAM,YAAY,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,SAAA,CAAU,CAAC;AAChE,UAAM,mBAAmB,IAAI,QAAQ;AACrC,QAAI,eAAe,WAAW,gBAAgB,EAAG;AAEjD,QAAI,QAAQ,aAAa;AAAA,MACvB,KAAK,cAAc,IAAI,CAAC,MAAM,EAAE,UAAU;AAAA,MAC1C,QAAQ;AAAA,MACR,YAAY;AAAA,IAAA,CACb;AAAA,EACH,GAAG,CAAC,aAAa,CAAC;AAGlB,WAAS,cAAc;AACrB,eAAW,UAAU;AAAA,EACvB;AAEA,QAAM,iBAAiBJ,MAAAA,OAAO,KAAK;AAEnCI,QAAAA,UAAU,MAAM;AACd,UAAM,OAAO,CAAC,MAAM;AAClB,UAAI,EAAE,WAAW,EAAE,wBAAwB,UAAU;AAAA,IACvD;AACA,UAAM,KAAK,MAAO,eAAe,UAAU;AAE3C,WAAO,iBAAiB,WAAW,IAAI;AACvC,WAAO,iBAAiB,SAAS,EAAE;AACnC,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,IAAI;AAC1C,aAAO,oBAAoB,SAAS,EAAE;AAAA,IACxC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,eAAeH,MAAAA;AAAAA,IACnB,CAAC,UAAU;AACT,UAAI,CAAC,WAAW,QAAS;AACzB,iBAAW,UAAU;AACrB,YAAM,gBAAgB,eAAe;AAErC,UAAI,MAAM,MAAM,IAAI,CAAC,MAAM,SAAS,EAAE,EAAE,CAAC;AAEzC,UAAI,eAAe;AACjB,iBAAS,EAAE,MAAM,wBAAwB,SAAS,EAAE,IAAA,GAAO;AAAA,MAC7D,OAAO;AACL,YAAI,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG;AACnD,gBAAM,CAAA;AAAA,QACR;AAEA,iBAAS,EAAE,MAAM,eAAe,SAAS,EAAE,IAAA,GAAO;AAAA,MACpD;AAAA,IACF;AAAA,IACA,CAAC,eAAe,QAAQ;AAAA,EAAA;AAG1B,SAAO;AAAA,IACL;AAAA,IACA,EAAE,eAAe,YAAA;AAAA,IACjB,EAAEI,cAAAA,MAAM;AAAA,MACN,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO,EAAE,SAAS,UAAU,OAAAC,UAAS;AACnC,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS;AAAA,YACP,SAAS,QAAQ,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AAAA,YACvC,UAAU,WAAW,SAAS,QAAQ,IAAI;AAAA,YAC1C,OAAAA;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,MACA,SAAS,EAAE,OAAO;AAChB,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,EAAA;AAAA,QAAE,CAC7C;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW,GAAG;AACZ,eAAO,EAAE,GAAG,SAAA;AAAA,MACd;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;;;"}
@@ -1,4 +1,4 @@
1
- import styles from "./feedback.module.sass.js";
1
+ import h$1 from "./feedback.module.sass.js";
2
2
  import hyper from "@macrostrat/hyper";
3
3
  import { Tree } from "react-arborist";
4
4
  import Node from "./node.js";
@@ -14,7 +14,7 @@ import useElementDimensions from "use-element-dimensions";
14
14
  import { GraphView } from "./graph.js";
15
15
  import { Matches } from "./matches.js";
16
16
  import { TypeList } from "./typelist.js";
17
- const h = hyper.styled(styles);
17
+ const h = hyper.styled(h$1);
18
18
  function setsAreTheSame(a, b) {
19
19
  if (a.size !== b.size) return false;
20
20
  for (const item of a) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/feedback/index.ts"],"sourcesContent":["import styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nimport { Tree, TreeApi } from \"react-arborist\";\nimport Node from \"./node\";\nimport { FeedbackText } from \"./text-visualizer\";\nimport type { InternalEntity, TreeData } from \"./types\";\nimport type { Entity } from \"../extractions\";\nimport { getTagStyle, ModelInfo } from \"../extractions\";\nimport {\n TreeDispatchContext,\n treeToGraph,\n useUpdatableTree,\n ViewMode,\n} from \"./edit-state\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n ButtonGroup,\n Card,\n SegmentedControl,\n Divider,\n} from \"@blueprintjs/core\";\nimport { OmniboxSelector } from \"./type-selector\";\nimport {\n CancelButton,\n ErrorBoundary,\n FlexRow,\n SaveButton,\n} from \"@macrostrat/ui-components\";\nimport useElementDimensions from \"use-element-dimensions\";\nimport { GraphView } from \"./graph\";\n\nimport { Matches } from \"./matches\";\nimport { TypeList } from \"./typelist\";\n\nexport type { GraphData } from \"./edit-state\";\nexport { treeToGraph } from \"./edit-state\";\nexport type { TreeData } from \"./types\";\n\nconst h = hyper.styled(styles);\n\nfunction setsAreTheSame<T>(a: Set<T>, b: Set<T>) {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n}\n\nexport function FeedbackComponent({\n entities = [],\n text,\n model,\n entityTypes,\n matchComponent,\n onSave,\n allowOverlap,\n matchLinks,\n view = false,\n autoSelect = [],\n}) {\n const [viewOnly, setViewOnly] = useState(view);\n const [match, setMatchLinks] = useState(matchLinks);\n const matchMode = match !== undefined;\n\n // Get the input arguments\n const [state, dispatch] = useUpdatableTree(\n entities.map(processEntity) as any,\n entityTypes,\n viewOnly,\n matchMode,\n autoSelect,\n );\n\n const {\n selectedNodes,\n tree,\n selectedEntityType,\n isSelectingEntityType,\n entityTypesMap,\n } = state;\n\n const [{ width, height }, ref] = useElementDimensions();\n\n return h(\"div.page-wrapper\", [\n h(\n \"div.feedback-container\",\n h(TreeDispatchContext.Provider, { value: dispatch }, [\n h.if(!view)(SegmentedControl, {\n options: [\n { label: \"View\", value: \"view\" },\n { label: \"Edit\", value: \"edit\" },\n ],\n value: viewOnly ? \"view\" : \"edit\",\n small: true,\n onValueChange() {\n setViewOnly(!viewOnly);\n dispatch({ type: \"toggle-view-only\" });\n },\n role: \"toolbar\",\n }),\n h(\n ErrorBoundary,\n {\n description:\n \"An error occurred while rendering the feedback text component.\",\n },\n h(FeedbackText, {\n text,\n dispatch,\n // @ts-ignore\n nodes: tree,\n selectedNodes,\n allowOverlap,\n matchLinks: match,\n viewOnly,\n }),\n ),\n h(\n FlexRow,\n { alignItems: \"baseline\", justifyContent: \"space-between\" },\n [\n h(ModelInfo, { data: model }),\n h(SegmentedControl, {\n options: [\n { label: \"Tree\", value: \"tree\" },\n { label: \"Graph\", value: \"graph\" },\n ],\n value: state.viewMode,\n small: true,\n onValueChange(value: ViewMode) {\n console.log(\"Setting view mode\", value);\n dispatch({ type: \"set-view-mode\", payload: value });\n },\n }),\n ],\n ),\n h(\n \"div.entity-panel\",\n {\n ref,\n },\n [\n h.if(state.viewMode == \"tree\")(ManagedSelectionTree, {\n selectedNodes,\n dispatch,\n tree,\n width,\n height,\n matchComponent,\n viewOnly,\n }),\n h.if(state.viewMode == \"graph\")(GraphView, {\n tree,\n width,\n height,\n dispatch,\n selectedNodes,\n viewOnly,\n }),\n ],\n ),\n ]),\n ),\n h(Card, { className: \"control-panel\" }, [\n h(\"div.control-content\", [\n h.if(!viewOnly)(\n ButtonGroup,\n {\n vertical: true,\n fill: true,\n minimal: true,\n alignText: \"left\",\n },\n [\n h(\n CancelButton,\n {\n icon: \"trash\",\n disabled: state.initialTree == state.tree,\n onClick() {\n dispatch({ type: \"reset\" });\n },\n },\n \"Reset\",\n ),\n h(\n SaveButton,\n {\n onClick() {\n onSave(state.tree);\n },\n disabled: state.initialTree == state.tree,\n },\n \"Save\",\n ),\n ],\n ),\n h.if(!viewOnly)(Matches, {\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n }),\n h.if(!viewOnly)(Divider),\n h(EntityTypeSelector, {\n entityTypes: entityTypesMap,\n selected: selectedEntityType,\n onChange(payload) {\n dispatch({ type: \"select-entity-type\", payload });\n },\n dispatch,\n tree,\n selectedNodes,\n isOpen: isSelectingEntityType,\n setOpen: (isOpen: boolean) =>\n dispatch({\n type: \"toggle-entity-type-selector\",\n payload: isOpen,\n }),\n viewOnly,\n matchMode,\n }),\n ]),\n ]),\n ]);\n}\n\nfunction processEntity(entity: Entity): InternalEntity {\n // @ts-ignore\n return {\n ...entity,\n // @ts-ignore\n term_type: entity.type.name,\n txt_range: [entity.indices],\n children: entity.children?.map(processEntity) ?? [],\n };\n}\n\nfunction EntityTypeSelector({\n entityTypes,\n selected,\n isOpen,\n setOpen,\n onChange,\n tree,\n dispatch,\n selectedNodes = [],\n viewOnly,\n matchMode,\n}) {\n // Show all entity types when selected is null\n const _selected = selected != null ? selected : undefined;\n const [inputValue, setInputValue] = useState(\"\");\n const types = Array.from(entityTypes.values());\n\n const items =\n inputValue !== \"\"\n ? types.filter((d) =>\n d.name.toLowerCase().includes(inputValue.toLowerCase()),\n )\n : types;\n\n return h(\"div.entity-type-selector\", [\n h(TypeList, {\n types: entityTypes,\n selected: _selected,\n dispatch,\n selectedNodes,\n tree,\n viewOnly: viewOnly || matchMode,\n }),\n h(OmniboxSelector, {\n isOpen,\n items,\n selectedItem: _selected,\n onSelectItem(item) {\n setOpen(false);\n onChange(item);\n },\n onQueryChange(query) {\n setInputValue(query);\n },\n onClose() {\n setOpen(false);\n },\n }),\n ]);\n}\n\nfunction countNodes(tree) {\n if (!tree) return 0;\n let count = 0;\n\n function recurse(nodes) {\n for (const node of nodes) {\n count++;\n if (node.children && Array.isArray(node.children)) {\n recurse(node.children);\n }\n }\n }\n\n recurse(tree);\n return count;\n}\n\nfunction ManagedSelectionTree(props) {\n const {\n selectedNodes,\n dispatch,\n tree,\n height,\n width,\n matchComponent,\n viewOnly,\n } = props;\n\n const ref = useRef<TreeApi<TreeData>>();\n // Use a ref to track clicks (won't cause rerender)\n const clickedRef = useRef(false);\n\n const _Node = useCallback(\n (props) => h(Node, { ...props, matchComponent, viewOnly }),\n [matchComponent, viewOnly],\n );\n\n // Update Tree selection when selectedNodes change\n useEffect(() => {\n if (ref.current == null) return;\n\n const selection = new Set(selectedNodes.map((d) => d.toString()));\n const currentSelection = ref.current.selectedIds;\n if (setsAreTheSame(selection, currentSelection)) return;\n\n ref.current.setSelection({\n ids: selectedNodes.map((d) => d.toString()),\n anchor: null,\n mostRecent: null,\n });\n }, [selectedNodes]);\n\n // Mark clicked when user clicks inside the tree container\n function handleClick() {\n clickedRef.current = true;\n }\n\n const ctrlPressedRef = useRef(false);\n\n useEffect(() => {\n const down = (e) => {\n if (e.ctrlKey || e.metaKey) ctrlPressedRef.current = true;\n };\n const up = () => (ctrlPressedRef.current = false);\n\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n };\n }, []);\n\n const handleSelect = useCallback(\n (nodes) => {\n if (!clickedRef.current) return;\n clickedRef.current = false;\n const isMultiSelect = ctrlPressedRef.current;\n\n let ids = nodes.map((d) => parseInt(d.id));\n\n if (isMultiSelect) {\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n } else {\n if (ids.length === 1 && ids[0] === selectedNodes[0]) {\n ids = [];\n }\n\n dispatch({ type: \"select-node\", payload: { ids } });\n }\n },\n [selectedNodes, dispatch],\n );\n\n return h(\n \"div.selection-tree-wrapper\",\n { onPointerDown: handleClick },\n h(Tree, {\n className: \"selection-tree\",\n height,\n width,\n ref,\n data: tree,\n onMove({ dragIds, parentId, index }) {\n dispatch({\n type: \"move-node\",\n payload: {\n dragIds: dragIds.map((d) => parseInt(d)),\n parentId: parentId ? parseInt(parentId) : null,\n index,\n },\n });\n },\n onDelete({ ids }) {\n dispatch({\n type: \"delete-node\",\n payload: { ids: ids.map((d) => parseInt(d)) },\n });\n },\n onSelect: handleSelect,\n children: _Node,\n idAccessor(d) {\n return d.id.toString();\n },\n }),\n );\n}\n"],"names":["props"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/feedback/index.ts"],"sourcesContent":["import styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nimport { Tree, TreeApi } from \"react-arborist\";\nimport Node from \"./node\";\nimport { FeedbackText } from \"./text-visualizer\";\nimport type { InternalEntity, TreeData } from \"./types\";\nimport type { Entity } from \"../extractions\";\nimport { getTagStyle, ModelInfo } from \"../extractions\";\nimport {\n TreeDispatchContext,\n treeToGraph,\n useUpdatableTree,\n ViewMode,\n} from \"./edit-state\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n ButtonGroup,\n Card,\n SegmentedControl,\n Divider,\n} from \"@blueprintjs/core\";\nimport { OmniboxSelector } from \"./type-selector\";\nimport {\n CancelButton,\n ErrorBoundary,\n FlexRow,\n SaveButton,\n} from \"@macrostrat/ui-components\";\nimport useElementDimensions from \"use-element-dimensions\";\nimport { GraphView } from \"./graph\";\n\nimport { Matches } from \"./matches\";\nimport { TypeList } from \"./typelist\";\n\nexport type { GraphData } from \"./edit-state\";\nexport { treeToGraph } from \"./edit-state\";\nexport type { TreeData } from \"./types\";\n\nconst h = hyper.styled(styles);\n\nfunction setsAreTheSame<T>(a: Set<T>, b: Set<T>) {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n}\n\nexport function FeedbackComponent({\n entities = [],\n text,\n model,\n entityTypes,\n matchComponent,\n onSave,\n allowOverlap,\n matchLinks,\n view = false,\n autoSelect = [],\n}) {\n const [viewOnly, setViewOnly] = useState(view);\n const [match, setMatchLinks] = useState(matchLinks);\n const matchMode = match !== undefined;\n\n // Get the input arguments\n const [state, dispatch] = useUpdatableTree(\n entities.map(processEntity) as any,\n entityTypes,\n viewOnly,\n matchMode,\n autoSelect,\n );\n\n const {\n selectedNodes,\n tree,\n selectedEntityType,\n isSelectingEntityType,\n entityTypesMap,\n } = state;\n\n const [{ width, height }, ref] = useElementDimensions();\n\n return h(\"div.page-wrapper\", [\n h(\n \"div.feedback-container\",\n h(TreeDispatchContext.Provider, { value: dispatch }, [\n h.if(!view)(SegmentedControl, {\n options: [\n { label: \"View\", value: \"view\" },\n { label: \"Edit\", value: \"edit\" },\n ],\n value: viewOnly ? \"view\" : \"edit\",\n small: true,\n onValueChange() {\n setViewOnly(!viewOnly);\n dispatch({ type: \"toggle-view-only\" });\n },\n role: \"toolbar\",\n }),\n h(\n ErrorBoundary,\n {\n description:\n \"An error occurred while rendering the feedback text component.\",\n },\n h(FeedbackText, {\n text,\n dispatch,\n // @ts-ignore\n nodes: tree,\n selectedNodes,\n allowOverlap,\n matchLinks: match,\n viewOnly,\n }),\n ),\n h(\n FlexRow,\n { alignItems: \"baseline\", justifyContent: \"space-between\" },\n [\n h(ModelInfo, { data: model }),\n h(SegmentedControl, {\n options: [\n { label: \"Tree\", value: \"tree\" },\n { label: \"Graph\", value: \"graph\" },\n ],\n value: state.viewMode,\n small: true,\n onValueChange(value: ViewMode) {\n console.log(\"Setting view mode\", value);\n dispatch({ type: \"set-view-mode\", payload: value });\n },\n }),\n ],\n ),\n h(\n \"div.entity-panel\",\n {\n ref,\n },\n [\n h.if(state.viewMode == \"tree\")(ManagedSelectionTree, {\n selectedNodes,\n dispatch,\n tree,\n width,\n height,\n matchComponent,\n viewOnly,\n }),\n h.if(state.viewMode == \"graph\")(GraphView, {\n tree,\n width,\n height,\n dispatch,\n selectedNodes,\n viewOnly,\n }),\n ],\n ),\n ]),\n ),\n h(Card, { className: \"control-panel\" }, [\n h(\"div.control-content\", [\n h.if(!viewOnly)(\n ButtonGroup,\n {\n vertical: true,\n fill: true,\n minimal: true,\n alignText: \"left\",\n },\n [\n h(\n CancelButton,\n {\n icon: \"trash\",\n disabled: state.initialTree == state.tree,\n onClick() {\n dispatch({ type: \"reset\" });\n },\n },\n \"Reset\",\n ),\n h(\n SaveButton,\n {\n onClick() {\n onSave(state.tree);\n },\n disabled: state.initialTree == state.tree,\n },\n \"Save\",\n ),\n ],\n ),\n h.if(!viewOnly)(Matches, {\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n }),\n h.if(!viewOnly)(Divider),\n h(EntityTypeSelector, {\n entityTypes: entityTypesMap,\n selected: selectedEntityType,\n onChange(payload) {\n dispatch({ type: \"select-entity-type\", payload });\n },\n dispatch,\n tree,\n selectedNodes,\n isOpen: isSelectingEntityType,\n setOpen: (isOpen: boolean) =>\n dispatch({\n type: \"toggle-entity-type-selector\",\n payload: isOpen,\n }),\n viewOnly,\n matchMode,\n }),\n ]),\n ]),\n ]);\n}\n\nfunction processEntity(entity: Entity): InternalEntity {\n // @ts-ignore\n return {\n ...entity,\n // @ts-ignore\n term_type: entity.type.name,\n txt_range: [entity.indices],\n children: entity.children?.map(processEntity) ?? [],\n };\n}\n\nfunction EntityTypeSelector({\n entityTypes,\n selected,\n isOpen,\n setOpen,\n onChange,\n tree,\n dispatch,\n selectedNodes = [],\n viewOnly,\n matchMode,\n}) {\n // Show all entity types when selected is null\n const _selected = selected != null ? selected : undefined;\n const [inputValue, setInputValue] = useState(\"\");\n const types = Array.from(entityTypes.values());\n\n const items =\n inputValue !== \"\"\n ? types.filter((d) =>\n d.name.toLowerCase().includes(inputValue.toLowerCase()),\n )\n : types;\n\n return h(\"div.entity-type-selector\", [\n h(TypeList, {\n types: entityTypes,\n selected: _selected,\n dispatch,\n selectedNodes,\n tree,\n viewOnly: viewOnly || matchMode,\n }),\n h(OmniboxSelector, {\n isOpen,\n items,\n selectedItem: _selected,\n onSelectItem(item) {\n setOpen(false);\n onChange(item);\n },\n onQueryChange(query) {\n setInputValue(query);\n },\n onClose() {\n setOpen(false);\n },\n }),\n ]);\n}\n\nfunction countNodes(tree) {\n if (!tree) return 0;\n let count = 0;\n\n function recurse(nodes) {\n for (const node of nodes) {\n count++;\n if (node.children && Array.isArray(node.children)) {\n recurse(node.children);\n }\n }\n }\n\n recurse(tree);\n return count;\n}\n\nfunction ManagedSelectionTree(props) {\n const {\n selectedNodes,\n dispatch,\n tree,\n height,\n width,\n matchComponent,\n viewOnly,\n } = props;\n\n const ref = useRef<TreeApi<TreeData>>();\n // Use a ref to track clicks (won't cause rerender)\n const clickedRef = useRef(false);\n\n const _Node = useCallback(\n (props) => h(Node, { ...props, matchComponent, viewOnly }),\n [matchComponent, viewOnly],\n );\n\n // Update Tree selection when selectedNodes change\n useEffect(() => {\n if (ref.current == null) return;\n\n const selection = new Set(selectedNodes.map((d) => d.toString()));\n const currentSelection = ref.current.selectedIds;\n if (setsAreTheSame(selection, currentSelection)) return;\n\n ref.current.setSelection({\n ids: selectedNodes.map((d) => d.toString()),\n anchor: null,\n mostRecent: null,\n });\n }, [selectedNodes]);\n\n // Mark clicked when user clicks inside the tree container\n function handleClick() {\n clickedRef.current = true;\n }\n\n const ctrlPressedRef = useRef(false);\n\n useEffect(() => {\n const down = (e) => {\n if (e.ctrlKey || e.metaKey) ctrlPressedRef.current = true;\n };\n const up = () => (ctrlPressedRef.current = false);\n\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n };\n }, []);\n\n const handleSelect = useCallback(\n (nodes) => {\n if (!clickedRef.current) return;\n clickedRef.current = false;\n const isMultiSelect = ctrlPressedRef.current;\n\n let ids = nodes.map((d) => parseInt(d.id));\n\n if (isMultiSelect) {\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n } else {\n if (ids.length === 1 && ids[0] === selectedNodes[0]) {\n ids = [];\n }\n\n dispatch({ type: \"select-node\", payload: { ids } });\n }\n },\n [selectedNodes, dispatch],\n );\n\n return h(\n \"div.selection-tree-wrapper\",\n { onPointerDown: handleClick },\n h(Tree, {\n className: \"selection-tree\",\n height,\n width,\n ref,\n data: tree,\n onMove({ dragIds, parentId, index }) {\n dispatch({\n type: \"move-node\",\n payload: {\n dragIds: dragIds.map((d) => parseInt(d)),\n parentId: parentId ? parseInt(parentId) : null,\n index,\n },\n });\n },\n onDelete({ ids }) {\n dispatch({\n type: \"delete-node\",\n payload: { ids: ids.map((d) => parseInt(d)) },\n });\n },\n onSelect: handleSelect,\n children: _Node,\n idAccessor(d) {\n return d.id.toString();\n },\n }),\n );\n}\n"],"names":["styles","props"],"mappings":"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"}
@@ -7,7 +7,9 @@ const hyper = require("@macrostrat/hyper");
7
7
  const react = require("react");
8
8
  const uiComponents = require("@macrostrat/ui-components");
9
9
  const dataComponents = require("@macrostrat/data-components");
10
- const h = hyper.styled(feedback_module.default);
10
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
11
+ const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
12
+ const h = hyper__default.default.styled(feedback_module.default);
11
13
  function Matches({
12
14
  match,
13
15
  setMatchLinks,
@@ -1 +1 @@
1
- {"version":3,"file":"matches.cjs","sources":["../../src/feedback/matches.ts"],"sourcesContent":["import { Switch } from \"@blueprintjs/core\";\nimport { Select } from \"@blueprintjs/select\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useState } from \"react\";\nimport { Icon, Divider, Overlay2 } from \"@blueprintjs/core\";\nimport { JSONView, SaveButton } from \"@macrostrat/ui-components\";\nimport { useAPIResult, DataField } from \"@macrostrat/ui-components\";\nimport { LithologyTag } from \"@macrostrat/data-components\";\n\nconst h = hyper.styled(styles);\n\nexport function Matches({\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n}) {\n const [overlayOpen, setOverlayOpen] = useState(false);\n\n let nodeMatch = null;\n if (selectedNodes.length === 1) {\n nodeMatch = findMatchingNode(tree, selectedNodes[0]);\n }\n\n return h.if(matchLinks)(\"div\", [\n h(Divider),\n h(Switch, {\n label: \"Match mode\",\n checked: match !== undefined,\n onChange: (e) => {\n setMatchLinks(match === undefined ? matchLinks || {} : undefined);\n dispatch({ type: \"toggle-match-mode\" });\n },\n }),\n h.if(nodeMatch && match)(Match, {\n data: nodeMatch?.match,\n matchLinks: matchLinks,\n dispatch,\n nodeId: nodeMatch?.id,\n }),\n h.if(selectedNodes.length == 1 && !nodeMatch?.match && match)(\n \"div.add-match-container\",\n [\n h(\n \"div.add-type\",\n {\n onClick: () => {\n setOverlayOpen(true);\n },\n },\n [h(\"p.add-match-text\", \"Add match\"), h(Icon, { icon: \"plus\" })],\n ),\n h(MatchOverlay, {\n isOpen: overlayOpen,\n setOverlayOpen,\n nodeMatch,\n dispatch,\n }),\n ],\n ),\n ]);\n}\n\nfunction findMatchingNode(tree, nodeId) {\n let match = null;\n\n function traverse(node) {\n if (node.id === nodeId) {\n match = node;\n return true;\n }\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n if (traverse(child)) return true;\n }\n }\n return false;\n }\n\n tree.forEach(traverse);\n return match;\n}\n\nfunction MatchOverlay({ isOpen, setOverlayOpen, nodeMatch, dispatch }) {\n const [inputValue, setInputValue] = useState(nodeMatch?.name || \"\");\n const [selectedItem, setSelectedItem] = useState(h(\"div\", \"Select a match\"));\n const [disabled, setDisabled] = useState(true);\n const [payload, setPayload] = useState({});\n\n const data = useAPIResult(\n \"https://dev.macrostrat.org/api/pg/type_lookup?name=ilike.*\" +\n inputValue +\n \"*\",\n );\n const items = data?.map((data) => h(MatchTag, { data, setPayload }));\n\n return h(\n Overlay2,\n {\n isOpen,\n },\n h(\n \"div.overlay-container\",\n h(\"div.add-type-overlay\", [\n h(\"h2.title\", [\n \"Add match with \" + nodeMatch.name,\n h(Icon, {\n icon: \"cross\",\n className: \"close-icon\",\n onClick: () => {\n setOverlayOpen(false);\n },\n style: { cursor: \"pointer\", color: \"red\" },\n }),\n ]),\n h(\"div.form-group\", [\n h(\n Select,\n {\n items: items || [],\n itemRenderer: (item, { handleClick }) => {\n return h(\"div.match-item\", { onClick: handleClick }, item);\n },\n onItemSelect: (item) => {\n setDisabled(false);\n setSelectedItem(item);\n },\n onQueryChange: (query) => setInputValue(query),\n popoverProps: { minimal: true },\n query: inputValue,\n placeholder: \"Enter match name\",\n },\n selectedItem,\n ),\n ]),\n h(\n SaveButton,\n {\n className: \"save-btn\",\n small: true,\n onClick: () => {\n // Handle save changes\n dispatch({\n type: \"add-match\",\n payload: { id: nodeMatch.id, payload },\n });\n setOverlayOpen(false);\n },\n disabled,\n },\n \"Save changes\",\n ),\n ]),\n ),\n );\n}\n\nfunction Match({ data, matchLinks, dispatch, nodeId }) {\n return h.if(data)(\"div.match-container\", [\n MatchTag({ data, matchLinks }),\n h(Icon, {\n icon: \"cross\",\n color: \"red\",\n className: \"close-btn\",\n onClick: () => {\n dispatch({ type: \"remove-match\", payload: { id: nodeId } });\n },\n }),\n ]);\n}\n\ninterface MatchTagProps {\n data: any;\n matchLinks?: Record<string, string>;\n setPayload?: (payload: Record<string, any>) => void;\n}\n\nexport function MatchTag({ data, matchLinks, setPayload }: MatchTagProps) {\n if (!data || Object.keys(data).length === 0) return;\n\n if (data.lith_id || data?.type === \"lith\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith\"\n ? setPayload({ lith_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.strat_name_id || data?.type === \"strat_name\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"strat_name\"\n ? setPayload({ strat_name_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.lith_att_id || data?.type === \"lith_att\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith_att\"\n ? setPayload({ lith_att_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Lithology attribute\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.lith_att_id },\n onClick: () =>\n window.open(matchLinks.lith_att + \"/\" + data.lith_att_id, \"_blank\"),\n }),\n }),\n );\n }\n\n if (data.int_id || data?.type === \"interval\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"interval\"\n ? setPayload({ int_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n label: \"Interval\",\n className: \"match-item\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id },\n onClick: () =>\n window.open(matchLinks.interval + \"/\" + data.int_id, \"_blank\"),\n }),\n }),\n );\n }\n\n return h(JSONView, { data });\n}\n"],"names":["styles","useState","Divider","Switch","Icon","useAPIResult","data","Overlay2","Select","SaveButton","DataField","LithologyTag","JSONView"],"mappings":"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"}
1
+ {"version":3,"file":"matches.cjs","sources":["../../src/feedback/matches.ts"],"sourcesContent":["import { Switch } from \"@blueprintjs/core\";\nimport { Select } from \"@blueprintjs/select\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useState } from \"react\";\nimport { Icon, Divider, Overlay2 } from \"@blueprintjs/core\";\nimport { JSONView, SaveButton } from \"@macrostrat/ui-components\";\nimport { useAPIResult, DataField } from \"@macrostrat/ui-components\";\nimport { LithologyTag } from \"@macrostrat/data-components\";\n\nconst h = hyper.styled(styles);\n\nexport function Matches({\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n}) {\n const [overlayOpen, setOverlayOpen] = useState(false);\n\n let nodeMatch = null;\n if (selectedNodes.length === 1) {\n nodeMatch = findMatchingNode(tree, selectedNodes[0]);\n }\n\n return h.if(matchLinks)(\"div\", [\n h(Divider),\n h(Switch, {\n label: \"Match mode\",\n checked: match !== undefined,\n onChange: (e) => {\n setMatchLinks(match === undefined ? matchLinks || {} : undefined);\n dispatch({ type: \"toggle-match-mode\" });\n },\n }),\n h.if(nodeMatch && match)(Match, {\n data: nodeMatch?.match,\n matchLinks: matchLinks,\n dispatch,\n nodeId: nodeMatch?.id,\n }),\n h.if(selectedNodes.length == 1 && !nodeMatch?.match && match)(\n \"div.add-match-container\",\n [\n h(\n \"div.add-type\",\n {\n onClick: () => {\n setOverlayOpen(true);\n },\n },\n [h(\"p.add-match-text\", \"Add match\"), h(Icon, { icon: \"plus\" })],\n ),\n h(MatchOverlay, {\n isOpen: overlayOpen,\n setOverlayOpen,\n nodeMatch,\n dispatch,\n }),\n ],\n ),\n ]);\n}\n\nfunction findMatchingNode(tree, nodeId) {\n let match = null;\n\n function traverse(node) {\n if (node.id === nodeId) {\n match = node;\n return true;\n }\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n if (traverse(child)) return true;\n }\n }\n return false;\n }\n\n tree.forEach(traverse);\n return match;\n}\n\nfunction MatchOverlay({ isOpen, setOverlayOpen, nodeMatch, dispatch }) {\n const [inputValue, setInputValue] = useState(nodeMatch?.name || \"\");\n const [selectedItem, setSelectedItem] = useState(h(\"div\", \"Select a match\"));\n const [disabled, setDisabled] = useState(true);\n const [payload, setPayload] = useState({});\n\n const data = useAPIResult(\n \"https://dev.macrostrat.org/api/pg/type_lookup?name=ilike.*\" +\n inputValue +\n \"*\",\n );\n const items = data?.map((data) => h(MatchTag, { data, setPayload }));\n\n return h(\n Overlay2,\n {\n isOpen,\n },\n h(\n \"div.overlay-container\",\n h(\"div.add-type-overlay\", [\n h(\"h2.title\", [\n \"Add match with \" + nodeMatch.name,\n h(Icon, {\n icon: \"cross\",\n className: \"close-icon\",\n onClick: () => {\n setOverlayOpen(false);\n },\n style: { cursor: \"pointer\", color: \"red\" },\n }),\n ]),\n h(\"div.form-group\", [\n h(\n Select,\n {\n items: items || [],\n itemRenderer: (item, { handleClick }) => {\n return h(\"div.match-item\", { onClick: handleClick }, item);\n },\n onItemSelect: (item) => {\n setDisabled(false);\n setSelectedItem(item);\n },\n onQueryChange: (query) => setInputValue(query),\n popoverProps: { minimal: true },\n query: inputValue,\n placeholder: \"Enter match name\",\n },\n selectedItem,\n ),\n ]),\n h(\n SaveButton,\n {\n className: \"save-btn\",\n small: true,\n onClick: () => {\n // Handle save changes\n dispatch({\n type: \"add-match\",\n payload: { id: nodeMatch.id, payload },\n });\n setOverlayOpen(false);\n },\n disabled,\n },\n \"Save changes\",\n ),\n ]),\n ),\n );\n}\n\nfunction Match({ data, matchLinks, dispatch, nodeId }) {\n return h.if(data)(\"div.match-container\", [\n MatchTag({ data, matchLinks }),\n h(Icon, {\n icon: \"cross\",\n color: \"red\",\n className: \"close-btn\",\n onClick: () => {\n dispatch({ type: \"remove-match\", payload: { id: nodeId } });\n },\n }),\n ]);\n}\n\ninterface MatchTagProps {\n data: any;\n matchLinks?: Record<string, string>;\n setPayload?: (payload: Record<string, any>) => void;\n}\n\nexport function MatchTag({ data, matchLinks, setPayload }: MatchTagProps) {\n if (!data || Object.keys(data).length === 0) return;\n\n if (data.lith_id || data?.type === \"lith\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith\"\n ? setPayload({ lith_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.strat_name_id || data?.type === \"strat_name\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"strat_name\"\n ? setPayload({ strat_name_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.lith_att_id || data?.type === \"lith_att\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith_att\"\n ? setPayload({ lith_att_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Lithology attribute\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.lith_att_id },\n onClick: () =>\n window.open(matchLinks.lith_att + \"/\" + data.lith_att_id, \"_blank\"),\n }),\n }),\n );\n }\n\n if (data.int_id || data?.type === \"interval\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"interval\"\n ? setPayload({ int_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n label: \"Interval\",\n className: \"match-item\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id },\n onClick: () =>\n window.open(matchLinks.interval + \"/\" + data.int_id, \"_blank\"),\n }),\n }),\n );\n }\n\n return h(JSONView, { data });\n}\n"],"names":["hyper","styles","useState","Divider","Switch","Icon","useAPIResult","data","Overlay2","Select","SaveButton","DataField","LithologyTag","JSONView"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { Divider, Switch, Icon, Overlay2 } from "@blueprintjs/core";
2
2
  import { Select } from "@blueprintjs/select";
3
- import styles from "./feedback.module.sass.js";
3
+ import h$1 from "./feedback.module.sass.js";
4
4
  import hyper from "@macrostrat/hyper";
5
5
  import { useState } from "react";
6
6
  import { useAPIResult, SaveButton, DataField, JSONView } from "@macrostrat/ui-components";
7
7
  import { LithologyTag } from "@macrostrat/data-components";
8
- const h = hyper.styled(styles);
8
+ const h = hyper.styled(h$1);
9
9
  function Matches({
10
10
  match,
11
11
  setMatchLinks,
@@ -1 +1 @@
1
- {"version":3,"file":"matches.js","sources":["../../src/feedback/matches.ts"],"sourcesContent":["import { Switch } from \"@blueprintjs/core\";\nimport { Select } from \"@blueprintjs/select\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useState } from \"react\";\nimport { Icon, Divider, Overlay2 } from \"@blueprintjs/core\";\nimport { JSONView, SaveButton } from \"@macrostrat/ui-components\";\nimport { useAPIResult, DataField } from \"@macrostrat/ui-components\";\nimport { LithologyTag } from \"@macrostrat/data-components\";\n\nconst h = hyper.styled(styles);\n\nexport function Matches({\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n}) {\n const [overlayOpen, setOverlayOpen] = useState(false);\n\n let nodeMatch = null;\n if (selectedNodes.length === 1) {\n nodeMatch = findMatchingNode(tree, selectedNodes[0]);\n }\n\n return h.if(matchLinks)(\"div\", [\n h(Divider),\n h(Switch, {\n label: \"Match mode\",\n checked: match !== undefined,\n onChange: (e) => {\n setMatchLinks(match === undefined ? matchLinks || {} : undefined);\n dispatch({ type: \"toggle-match-mode\" });\n },\n }),\n h.if(nodeMatch && match)(Match, {\n data: nodeMatch?.match,\n matchLinks: matchLinks,\n dispatch,\n nodeId: nodeMatch?.id,\n }),\n h.if(selectedNodes.length == 1 && !nodeMatch?.match && match)(\n \"div.add-match-container\",\n [\n h(\n \"div.add-type\",\n {\n onClick: () => {\n setOverlayOpen(true);\n },\n },\n [h(\"p.add-match-text\", \"Add match\"), h(Icon, { icon: \"plus\" })],\n ),\n h(MatchOverlay, {\n isOpen: overlayOpen,\n setOverlayOpen,\n nodeMatch,\n dispatch,\n }),\n ],\n ),\n ]);\n}\n\nfunction findMatchingNode(tree, nodeId) {\n let match = null;\n\n function traverse(node) {\n if (node.id === nodeId) {\n match = node;\n return true;\n }\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n if (traverse(child)) return true;\n }\n }\n return false;\n }\n\n tree.forEach(traverse);\n return match;\n}\n\nfunction MatchOverlay({ isOpen, setOverlayOpen, nodeMatch, dispatch }) {\n const [inputValue, setInputValue] = useState(nodeMatch?.name || \"\");\n const [selectedItem, setSelectedItem] = useState(h(\"div\", \"Select a match\"));\n const [disabled, setDisabled] = useState(true);\n const [payload, setPayload] = useState({});\n\n const data = useAPIResult(\n \"https://dev.macrostrat.org/api/pg/type_lookup?name=ilike.*\" +\n inputValue +\n \"*\",\n );\n const items = data?.map((data) => h(MatchTag, { data, setPayload }));\n\n return h(\n Overlay2,\n {\n isOpen,\n },\n h(\n \"div.overlay-container\",\n h(\"div.add-type-overlay\", [\n h(\"h2.title\", [\n \"Add match with \" + nodeMatch.name,\n h(Icon, {\n icon: \"cross\",\n className: \"close-icon\",\n onClick: () => {\n setOverlayOpen(false);\n },\n style: { cursor: \"pointer\", color: \"red\" },\n }),\n ]),\n h(\"div.form-group\", [\n h(\n Select,\n {\n items: items || [],\n itemRenderer: (item, { handleClick }) => {\n return h(\"div.match-item\", { onClick: handleClick }, item);\n },\n onItemSelect: (item) => {\n setDisabled(false);\n setSelectedItem(item);\n },\n onQueryChange: (query) => setInputValue(query),\n popoverProps: { minimal: true },\n query: inputValue,\n placeholder: \"Enter match name\",\n },\n selectedItem,\n ),\n ]),\n h(\n SaveButton,\n {\n className: \"save-btn\",\n small: true,\n onClick: () => {\n // Handle save changes\n dispatch({\n type: \"add-match\",\n payload: { id: nodeMatch.id, payload },\n });\n setOverlayOpen(false);\n },\n disabled,\n },\n \"Save changes\",\n ),\n ]),\n ),\n );\n}\n\nfunction Match({ data, matchLinks, dispatch, nodeId }) {\n return h.if(data)(\"div.match-container\", [\n MatchTag({ data, matchLinks }),\n h(Icon, {\n icon: \"cross\",\n color: \"red\",\n className: \"close-btn\",\n onClick: () => {\n dispatch({ type: \"remove-match\", payload: { id: nodeId } });\n },\n }),\n ]);\n}\n\ninterface MatchTagProps {\n data: any;\n matchLinks?: Record<string, string>;\n setPayload?: (payload: Record<string, any>) => void;\n}\n\nexport function MatchTag({ data, matchLinks, setPayload }: MatchTagProps) {\n if (!data || Object.keys(data).length === 0) return;\n\n if (data.lith_id || data?.type === \"lith\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith\"\n ? setPayload({ lith_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.strat_name_id || data?.type === \"strat_name\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"strat_name\"\n ? setPayload({ strat_name_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.lith_att_id || data?.type === \"lith_att\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith_att\"\n ? setPayload({ lith_att_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Lithology attribute\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.lith_att_id },\n onClick: () =>\n window.open(matchLinks.lith_att + \"/\" + data.lith_att_id, \"_blank\"),\n }),\n }),\n );\n }\n\n if (data.int_id || data?.type === \"interval\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"interval\"\n ? setPayload({ int_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n label: \"Interval\",\n className: \"match-item\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id },\n onClick: () =>\n window.open(matchLinks.interval + \"/\" + data.int_id, \"_blank\"),\n }),\n }),\n );\n }\n\n return h(JSONView, { data });\n}\n"],"names":["data"],"mappings":";;;;;;;AAUA,MAAM,IAAI,MAAM,OAAO,MAAM;AAEtB,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,MAAI,YAAY;AAChB,MAAI,cAAc,WAAW,GAAG;AAC9B,gBAAY,iBAAiB,MAAM,cAAc,CAAC,CAAC;AAAA,EACrD;AAEA,SAAO,EAAE,GAAG,UAAU,EAAE,OAAO;AAAA,IAC7B,EAAE,OAAO;AAAA,IACT,EAAE,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS,UAAU;AAAA,MACnB,UAAU,CAAC,MAAM;AACf,sBAAc,UAAU,SAAY,cAAc,CAAA,IAAK,MAAS;AAChE,iBAAS,EAAE,MAAM,qBAAqB;AAAA,MACxC;AAAA,IAAA,CACD;AAAA,IACD,EAAE,GAAG,aAAa,KAAK,EAAE,OAAO;AAAA,MAC9B,MAAM,WAAW;AAAA,MACjB;AAAA,MACA;AAAA,MACA,QAAQ,WAAW;AAAA,IAAA,CACpB;AAAA,IACD,EAAE,GAAG,cAAc,UAAU,KAAK,CAAC,WAAW,SAAS,KAAK;AAAA,MAC1D;AAAA,MACA;AAAA,QACE;AAAA,UACE;AAAA,UACA;AAAA,YACE,SAAS,MAAM;AACb,6BAAe,IAAI;AAAA,YACrB;AAAA,UAAA;AAAA,UAEF,CAAC,EAAE,oBAAoB,WAAW,GAAG,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,QAAA;AAAA,QAEhE,EAAE,cAAc;AAAA,UACd,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH;AAAA,EACF,CACD;AACH;AAEA,SAAS,iBAAiB,MAAM,QAAQ;AACtC,MAAI,QAAQ;AAEZ,WAAS,SAAS,MAAM;AACtB,QAAI,KAAK,OAAO,QAAQ;AACtB,cAAQ;AACR,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,iBAAW,SAAS,KAAK,UAAU;AACjC,YAAI,SAAS,KAAK,EAAG,QAAO;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,OAAK,QAAQ,QAAQ;AACrB,SAAO;AACT;AAEA,SAAS,aAAa,EAAE,QAAQ,gBAAgB,WAAW,YAAY;AACrE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,WAAW,QAAQ,EAAE;AAClE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE,OAAO,gBAAgB,CAAC;AAC3E,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,IAAI;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAA,CAAE;AAEzC,QAAM,OAAO;AAAA,IACX,+DACE,aACA;AAAA,EAAA;AAEJ,QAAM,QAAQ,MAAM,IAAI,CAACA,UAAS,EAAE,UAAU,EAAE,MAAAA,OAAM,WAAA,CAAY,CAAC;AAEnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,IAAA;AAAA,IAEF;AAAA,MACE;AAAA,MACA,EAAE,wBAAwB;AAAA,QACxB,EAAE,YAAY;AAAA,UACZ,oBAAoB,UAAU;AAAA,UAC9B,EAAE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS,MAAM;AACb,6BAAe,KAAK;AAAA,YACtB;AAAA,YACA,OAAO,EAAE,QAAQ,WAAW,OAAO,MAAA;AAAA,UAAM,CAC1C;AAAA,QAAA,CACF;AAAA,QACD,EAAE,kBAAkB;AAAA,UAClB;AAAA,YACE;AAAA,YACA;AAAA,cACE,OAAO,SAAS,CAAA;AAAA,cAChB,cAAc,CAAC,MAAM,EAAE,kBAAkB;AACvC,uBAAO,EAAE,kBAAkB,EAAE,SAAS,YAAA,GAAe,IAAI;AAAA,cAC3D;AAAA,cACA,cAAc,CAAC,SAAS;AACtB,4BAAY,KAAK;AACjB,gCAAgB,IAAI;AAAA,cACtB;AAAA,cACA,eAAe,CAAC,UAAU,cAAc,KAAK;AAAA,cAC7C,cAAc,EAAE,SAAS,KAAA;AAAA,cACzB,OAAO;AAAA,cACP,aAAa;AAAA,YAAA;AAAA,YAEf;AAAA,UAAA;AAAA,QACF,CACD;AAAA,QACD;AAAA,UACE;AAAA,UACA;AAAA,YACE,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,MAAM;AAEb,uBAAS;AAAA,gBACP,MAAM;AAAA,gBACN,SAAS,EAAE,IAAI,UAAU,IAAI,QAAA;AAAA,cAAQ,CACtC;AACD,6BAAe,KAAK;AAAA,YACtB;AAAA,YACA;AAAA,UAAA;AAAA,UAEF;AAAA,QAAA;AAAA,MACF,CACD;AAAA,IAAA;AAAA,EACH;AAEJ;AAEA,SAAS,MAAM,EAAE,MAAM,YAAY,UAAU,UAAU;AACrD,SAAO,EAAE,GAAG,IAAI,EAAE,uBAAuB;AAAA,IACvC,SAAS,EAAE,MAAM,YAAY;AAAA,IAC7B,EAAE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS,MAAM;AACb,iBAAS,EAAE,MAAM,gBAAgB,SAAS,EAAE,IAAI,OAAA,GAAU;AAAA,MAC5D;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AAQO,SAAS,SAAS,EAAE,MAAM,YAAY,cAA6B;AACxE,MAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,EAAE,WAAW,EAAG;AAE7C,MAAI,KAAK,WAAW,MAAM,SAAS,QAAQ;AACzC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,SAAS,MAAM;AACb,eAAK,SAAS,SACV,WAAW,EAAE,SAAS,KAAK,IAAI,MAAM,KAAK,KAAA,CAAM,IAChD;AAAA,QACN;AAAA,MAAA;AAAA,MAEF,EAAE,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO,EAAE,cAAc;AAAA,UACrB,MAAM,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,MAAA;AAAA,UAClD,SAAS,MACP,OAAO;AAAA,YACL,WAAW,aAAa,MAAM,KAAK;AAAA,YACnC;AAAA,UAAA;AAAA,QACF,CACH;AAAA,MAAA,CACF;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI,KAAK,iBAAiB,MAAM,SAAS,cAAc;AACrD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,SAAS,MAAM;AACb,eAAK,SAAS,eACV,WAAW,EAAE,eAAe,KAAK,IAAI,MAAM,KAAK,KAAA,CAAM,IACtD;AAAA,QACN;AAAA,MAAA;AAAA,MAEF,EAAE,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO,EAAE,cAAc;AAAA,UACrB,MAAM,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,MAAA;AAAA,UAClD,SAAS,MACP,OAAO;AAAA,YACL,WAAW,aAAa,MAAM,KAAK;AAAA,YACnC;AAAA,UAAA;AAAA,QACF,CACH;AAAA,MAAA,CACF;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI,KAAK,eAAe,MAAM,SAAS,YAAY;AACjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,SAAS,MAAM;AACb,eAAK,SAAS,aACV,WAAW,EAAE,aAAa,KAAK,IAAI,MAAM,KAAK,KAAA,CAAM,IACpD;AAAA,QACN;AAAA,MAAA;AAAA,MAEF,EAAE,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO,EAAE,cAAc;AAAA,UACrB,MAAM,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,YAAA;AAAA,UAClC,SAAS,MACP,OAAO,KAAK,WAAW,WAAW,MAAM,KAAK,aAAa,QAAQ;AAAA,QAAA,CACrE;AAAA,MAAA,CACF;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI,KAAK,UAAU,MAAM,SAAS,YAAY;AAC5C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,SAAS,MAAM;AACb,eAAK,SAAS,aACV,WAAW,EAAE,QAAQ,KAAK,IAAI,MAAM,KAAK,KAAA,CAAM,IAC/C;AAAA,QACN;AAAA,MAAA;AAAA,MAEF,EAAE,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,QACX,OAAO,EAAE,cAAc;AAAA,UACrB,MAAM,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,GAAA;AAAA,UAClC,SAAS,MACP,OAAO,KAAK,WAAW,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAAA,QAAA,CAChE;AAAA,MAAA,CACF;AAAA,IAAA;AAAA,EAEL;AAEA,SAAO,EAAE,UAAU,EAAE,MAAM;AAC7B;"}
1
+ {"version":3,"file":"matches.js","sources":["../../src/feedback/matches.ts"],"sourcesContent":["import { Switch } from \"@blueprintjs/core\";\nimport { Select } from \"@blueprintjs/select\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { useState } from \"react\";\nimport { Icon, Divider, Overlay2 } from \"@blueprintjs/core\";\nimport { JSONView, SaveButton } from \"@macrostrat/ui-components\";\nimport { useAPIResult, DataField } from \"@macrostrat/ui-components\";\nimport { LithologyTag } from \"@macrostrat/data-components\";\n\nconst h = hyper.styled(styles);\n\nexport function Matches({\n match,\n setMatchLinks,\n matchLinks,\n selectedNodes,\n tree,\n dispatch,\n}) {\n const [overlayOpen, setOverlayOpen] = useState(false);\n\n let nodeMatch = null;\n if (selectedNodes.length === 1) {\n nodeMatch = findMatchingNode(tree, selectedNodes[0]);\n }\n\n return h.if(matchLinks)(\"div\", [\n h(Divider),\n h(Switch, {\n label: \"Match mode\",\n checked: match !== undefined,\n onChange: (e) => {\n setMatchLinks(match === undefined ? matchLinks || {} : undefined);\n dispatch({ type: \"toggle-match-mode\" });\n },\n }),\n h.if(nodeMatch && match)(Match, {\n data: nodeMatch?.match,\n matchLinks: matchLinks,\n dispatch,\n nodeId: nodeMatch?.id,\n }),\n h.if(selectedNodes.length == 1 && !nodeMatch?.match && match)(\n \"div.add-match-container\",\n [\n h(\n \"div.add-type\",\n {\n onClick: () => {\n setOverlayOpen(true);\n },\n },\n [h(\"p.add-match-text\", \"Add match\"), h(Icon, { icon: \"plus\" })],\n ),\n h(MatchOverlay, {\n isOpen: overlayOpen,\n setOverlayOpen,\n nodeMatch,\n dispatch,\n }),\n ],\n ),\n ]);\n}\n\nfunction findMatchingNode(tree, nodeId) {\n let match = null;\n\n function traverse(node) {\n if (node.id === nodeId) {\n match = node;\n return true;\n }\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n if (traverse(child)) return true;\n }\n }\n return false;\n }\n\n tree.forEach(traverse);\n return match;\n}\n\nfunction MatchOverlay({ isOpen, setOverlayOpen, nodeMatch, dispatch }) {\n const [inputValue, setInputValue] = useState(nodeMatch?.name || \"\");\n const [selectedItem, setSelectedItem] = useState(h(\"div\", \"Select a match\"));\n const [disabled, setDisabled] = useState(true);\n const [payload, setPayload] = useState({});\n\n const data = useAPIResult(\n \"https://dev.macrostrat.org/api/pg/type_lookup?name=ilike.*\" +\n inputValue +\n \"*\",\n );\n const items = data?.map((data) => h(MatchTag, { data, setPayload }));\n\n return h(\n Overlay2,\n {\n isOpen,\n },\n h(\n \"div.overlay-container\",\n h(\"div.add-type-overlay\", [\n h(\"h2.title\", [\n \"Add match with \" + nodeMatch.name,\n h(Icon, {\n icon: \"cross\",\n className: \"close-icon\",\n onClick: () => {\n setOverlayOpen(false);\n },\n style: { cursor: \"pointer\", color: \"red\" },\n }),\n ]),\n h(\"div.form-group\", [\n h(\n Select,\n {\n items: items || [],\n itemRenderer: (item, { handleClick }) => {\n return h(\"div.match-item\", { onClick: handleClick }, item);\n },\n onItemSelect: (item) => {\n setDisabled(false);\n setSelectedItem(item);\n },\n onQueryChange: (query) => setInputValue(query),\n popoverProps: { minimal: true },\n query: inputValue,\n placeholder: \"Enter match name\",\n },\n selectedItem,\n ),\n ]),\n h(\n SaveButton,\n {\n className: \"save-btn\",\n small: true,\n onClick: () => {\n // Handle save changes\n dispatch({\n type: \"add-match\",\n payload: { id: nodeMatch.id, payload },\n });\n setOverlayOpen(false);\n },\n disabled,\n },\n \"Save changes\",\n ),\n ]),\n ),\n );\n}\n\nfunction Match({ data, matchLinks, dispatch, nodeId }) {\n return h.if(data)(\"div.match-container\", [\n MatchTag({ data, matchLinks }),\n h(Icon, {\n icon: \"cross\",\n color: \"red\",\n className: \"close-btn\",\n onClick: () => {\n dispatch({ type: \"remove-match\", payload: { id: nodeId } });\n },\n }),\n ]);\n}\n\ninterface MatchTagProps {\n data: any;\n matchLinks?: Record<string, string>;\n setPayload?: (payload: Record<string, any>) => void;\n}\n\nexport function MatchTag({ data, matchLinks, setPayload }: MatchTagProps) {\n if (!data || Object.keys(data).length === 0) return;\n\n if (data.lith_id || data?.type === \"lith\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith\"\n ? setPayload({ lith_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.strat_name_id || data?.type === \"strat_name\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"strat_name\"\n ? setPayload({ strat_name_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Stratigraphic name\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id, color: data.color },\n onClick: () =>\n window.open(\n matchLinks.strat_name + \"/\" + data.strat_name_id,\n \"_blank\",\n ),\n }),\n }),\n );\n }\n\n if (data.lith_att_id || data?.type === \"lith_att\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"lith_att\"\n ? setPayload({ lith_att_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n className: \"match-item\",\n label: \"Lithology attribute\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.lith_att_id },\n onClick: () =>\n window.open(matchLinks.lith_att + \"/\" + data.lith_att_id, \"_blank\"),\n }),\n }),\n );\n }\n\n if (data.int_id || data?.type === \"interval\") {\n return h(\n \"div\",\n {\n onClick: () => {\n data.type === \"interval\"\n ? setPayload({ int_id: data.id, name: data.name })\n : null;\n },\n },\n h(DataField, {\n label: \"Interval\",\n className: \"match-item\",\n value: h(LithologyTag, {\n data: { name: data.name, id: data.id },\n onClick: () =>\n window.open(matchLinks.interval + \"/\" + data.int_id, \"_blank\"),\n }),\n }),\n );\n }\n\n return h(JSONView, { data });\n}\n"],"names":["styles","data"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
2
  const index = require("../extractions/index.cjs");
4
3
  const editState = require("./edit-state.cjs");
5
4
  const feedback_module = require("./feedback.module.sass.cjs");
6
5
  const hyper = require("@macrostrat/hyper");
7
- const h = hyper.styled(feedback_module.default);
6
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
7
+ const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
8
+ const h = hyper__default.default.styled(feedback_module.default);
8
9
  function isSelected(searchNode, treeNode) {
9
10
  return searchNode.id == treeNode.id;
10
11
  }
@@ -59,5 +60,5 @@ function Node({
59
60
  })
60
61
  );
61
62
  }
62
- exports.default = Node;
63
+ module.exports = Node;
63
64
  //# sourceMappingURL=node.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.cjs","sources":["../../src/feedback/node.ts"],"sourcesContent":["import { NodeApi, TreeApi } from \"react-arborist\";\nimport { TreeData } from \"./types\";\nimport { EntityTag } from \"../extractions\";\nimport { useTreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nconst h = hyper.styled(styles);\n\nfunction isSelected(searchNode: TreeData, treeNode: TreeData) {\n return searchNode.id == treeNode.id;\n // We could also select children of the search node here if we wanted to\n}\n\nfunction isNodeHighlighted(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n // We treat no selection as all nodes being active. We may add some nuance later\n if (tree.selectedNodes.length == 0) {\n return true;\n }\n\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n\n // Check if the parent node is highlighted\n if (node.parent != null && isNodeHighlighted(node.parent, tree)) {\n return true;\n }\n\n return false;\n}\n\nfunction isNodeActive(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n return false;\n}\n\nfunction Node({\n node,\n style,\n dragHandle,\n tree,\n matchComponent,\n viewOnly,\n}: any) {\n let highlighted: boolean = isNodeHighlighted(node, tree);\n let active: boolean = isNodeActive(node, tree);\n\n console.log(\"viewOnly\", viewOnly);\n\n const dispatch = useTreeDispatch();\n\n if (!node.data?.type) {\n node.data.type = { name: \"lith\", color: \"rgb(107, 255, 91)\" };\n }\n\n return h(\n \"div.node\" + (!viewOnly ? \".clickable\" : \"\"),\n { style, ref: dragHandle },\n h(EntityTag, {\n data: node.data,\n active: viewOnly ? false : active,\n highlighted: viewOnly ? true : highlighted,\n matchComponent,\n onClickType() {\n dispatch({ type: \"toggle-entity-type-selector\" });\n },\n }),\n );\n}\n\nexport default Node;\n"],"names":["styles","useTreeDispatch","EntityTag"],"mappings":";;;;;;AAOA,MAAM,IAAI,MAAM,OAAOA,uBAAM;AAE7B,SAAS,WAAW,YAAsB,UAAoB;AAC5D,SAAO,WAAW,MAAM,SAAS;AAEnC;AAEA,SAAS,kBAAkB,MAAyB,MAAyB;AAE3E,MAAI,KAAK,cAAc,UAAU,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,KAAK,UAAU,QAAQ,kBAAkB,KAAK,QAAQ,IAAI,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAyB,MAAyB;AACtE,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAQ;AACN,MAAI,cAAuB,kBAAkB,MAAM,IAAI;AACvD,MAAI,SAAkB,aAAa,MAAM,IAAI;AAE7C,UAAQ,IAAI,YAAY,QAAQ;AAEhC,QAAM,WAAWC,UAAAA,gBAAA;AAEjB,MAAI,CAAC,KAAK,MAAM,MAAM;AACpB,SAAK,KAAK,OAAO,EAAE,MAAM,QAAQ,OAAO,oBAAA;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,cAAc,CAAC,WAAW,eAAe;AAAA,IACzC,EAAE,OAAO,KAAK,WAAA;AAAA,IACd,EAAEC,MAAAA,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ,WAAW,QAAQ;AAAA,MAC3B,aAAa,WAAW,OAAO;AAAA,MAC/B;AAAA,MACA,cAAc;AACZ,iBAAS,EAAE,MAAM,+BAA+B;AAAA,MAClD;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;;"}
1
+ {"version":3,"file":"node.cjs","sources":["../../src/feedback/node.ts"],"sourcesContent":["import { NodeApi, TreeApi } from \"react-arborist\";\nimport { TreeData } from \"./types\";\nimport { EntityTag } from \"../extractions\";\nimport { useTreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nconst h = hyper.styled(styles);\n\nfunction isSelected(searchNode: TreeData, treeNode: TreeData) {\n return searchNode.id == treeNode.id;\n // We could also select children of the search node here if we wanted to\n}\n\nfunction isNodeHighlighted(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n // We treat no selection as all nodes being active. We may add some nuance later\n if (tree.selectedNodes.length == 0) {\n return true;\n }\n\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n\n // Check if the parent node is highlighted\n if (node.parent != null && isNodeHighlighted(node.parent, tree)) {\n return true;\n }\n\n return false;\n}\n\nfunction isNodeActive(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n return false;\n}\n\nfunction Node({\n node,\n style,\n dragHandle,\n tree,\n matchComponent,\n viewOnly,\n}: any) {\n let highlighted: boolean = isNodeHighlighted(node, tree);\n let active: boolean = isNodeActive(node, tree);\n\n console.log(\"viewOnly\", viewOnly);\n\n const dispatch = useTreeDispatch();\n\n if (!node.data?.type) {\n node.data.type = { name: \"lith\", color: \"rgb(107, 255, 91)\" };\n }\n\n return h(\n \"div.node\" + (!viewOnly ? \".clickable\" : \"\"),\n { style, ref: dragHandle },\n h(EntityTag, {\n data: node.data,\n active: viewOnly ? false : active,\n highlighted: viewOnly ? true : highlighted,\n matchComponent,\n onClickType() {\n dispatch({ type: \"toggle-entity-type-selector\" });\n },\n }),\n );\n}\n\nexport default Node;\n"],"names":["hyper","styles","useTreeDispatch","EntityTag"],"mappings":";;;;;;;AAOA,MAAM,IAAIA,eAAAA,QAAM,OAAOC,uBAAM;AAE7B,SAAS,WAAW,YAAsB,UAAoB;AAC5D,SAAO,WAAW,MAAM,SAAS;AAEnC;AAEA,SAAS,kBAAkB,MAAyB,MAAyB;AAE3E,MAAI,KAAK,cAAc,UAAU,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,KAAK,UAAU,QAAQ,kBAAkB,KAAK,QAAQ,IAAI,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAyB,MAAyB;AACtE,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAQ;AACN,MAAI,cAAuB,kBAAkB,MAAM,IAAI;AACvD,MAAI,SAAkB,aAAa,MAAM,IAAI;AAE7C,UAAQ,IAAI,YAAY,QAAQ;AAEhC,QAAM,WAAWC,UAAAA,gBAAA;AAEjB,MAAI,CAAC,KAAK,MAAM,MAAM;AACpB,SAAK,KAAK,OAAO,EAAE,MAAM,QAAQ,OAAO,oBAAA;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,cAAc,CAAC,WAAW,eAAe;AAAA,IACzC,EAAE,OAAO,KAAK,WAAA;AAAA,IACd,EAAEC,MAAAA,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ,WAAW,QAAQ;AAAA,MAC3B,aAAa,WAAW,OAAO;AAAA,MAC/B;AAAA,MACA,cAAc;AACZ,iBAAS,EAAE,MAAM,+BAA+B;AAAA,MAClD;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;;"}
@@ -1,8 +1,8 @@
1
1
  import { EntityTag } from "../extractions/index.js";
2
2
  import { useTreeDispatch } from "./edit-state.js";
3
- import styles from "./feedback.module.sass.js";
3
+ import h$1 from "./feedback.module.sass.js";
4
4
  import hyper from "@macrostrat/hyper";
5
- const h = hyper.styled(styles);
5
+ const h = hyper.styled(h$1);
6
6
  function isSelected(searchNode, treeNode) {
7
7
  return searchNode.id == treeNode.id;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sources":["../../src/feedback/node.ts"],"sourcesContent":["import { NodeApi, TreeApi } from \"react-arborist\";\nimport { TreeData } from \"./types\";\nimport { EntityTag } from \"../extractions\";\nimport { useTreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nconst h = hyper.styled(styles);\n\nfunction isSelected(searchNode: TreeData, treeNode: TreeData) {\n return searchNode.id == treeNode.id;\n // We could also select children of the search node here if we wanted to\n}\n\nfunction isNodeHighlighted(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n // We treat no selection as all nodes being active. We may add some nuance later\n if (tree.selectedNodes.length == 0) {\n return true;\n }\n\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n\n // Check if the parent node is highlighted\n if (node.parent != null && isNodeHighlighted(node.parent, tree)) {\n return true;\n }\n\n return false;\n}\n\nfunction isNodeActive(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n return false;\n}\n\nfunction Node({\n node,\n style,\n dragHandle,\n tree,\n matchComponent,\n viewOnly,\n}: any) {\n let highlighted: boolean = isNodeHighlighted(node, tree);\n let active: boolean = isNodeActive(node, tree);\n\n console.log(\"viewOnly\", viewOnly);\n\n const dispatch = useTreeDispatch();\n\n if (!node.data?.type) {\n node.data.type = { name: \"lith\", color: \"rgb(107, 255, 91)\" };\n }\n\n return h(\n \"div.node\" + (!viewOnly ? \".clickable\" : \"\"),\n { style, ref: dragHandle },\n h(EntityTag, {\n data: node.data,\n active: viewOnly ? false : active,\n highlighted: viewOnly ? true : highlighted,\n matchComponent,\n onClickType() {\n dispatch({ type: \"toggle-entity-type-selector\" });\n },\n }),\n );\n}\n\nexport default Node;\n"],"names":[],"mappings":";;;;AAOA,MAAM,IAAI,MAAM,OAAO,MAAM;AAE7B,SAAS,WAAW,YAAsB,UAAoB;AAC5D,SAAO,WAAW,MAAM,SAAS;AAEnC;AAEA,SAAS,kBAAkB,MAAyB,MAAyB;AAE3E,MAAI,KAAK,cAAc,UAAU,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,KAAK,UAAU,QAAQ,kBAAkB,KAAK,QAAQ,IAAI,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAyB,MAAyB;AACtE,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAQ;AACN,MAAI,cAAuB,kBAAkB,MAAM,IAAI;AACvD,MAAI,SAAkB,aAAa,MAAM,IAAI;AAE7C,UAAQ,IAAI,YAAY,QAAQ;AAEhC,QAAM,WAAW,gBAAA;AAEjB,MAAI,CAAC,KAAK,MAAM,MAAM;AACpB,SAAK,KAAK,OAAO,EAAE,MAAM,QAAQ,OAAO,oBAAA;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,cAAc,CAAC,WAAW,eAAe;AAAA,IACzC,EAAE,OAAO,KAAK,WAAA;AAAA,IACd,EAAE,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ,WAAW,QAAQ;AAAA,MAC3B,aAAa,WAAW,OAAO;AAAA,MAC/B;AAAA,MACA,cAAc;AACZ,iBAAS,EAAE,MAAM,+BAA+B;AAAA,MAClD;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;"}
1
+ {"version":3,"file":"node.js","sources":["../../src/feedback/node.ts"],"sourcesContent":["import { NodeApi, TreeApi } from \"react-arborist\";\nimport { TreeData } from \"./types\";\nimport { EntityTag } from \"../extractions\";\nimport { useTreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nconst h = hyper.styled(styles);\n\nfunction isSelected(searchNode: TreeData, treeNode: TreeData) {\n return searchNode.id == treeNode.id;\n // We could also select children of the search node here if we wanted to\n}\n\nfunction isNodeHighlighted(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n // We treat no selection as all nodes being active. We may add some nuance later\n if (tree.selectedNodes.length == 0) {\n return true;\n }\n\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n\n // Check if the parent node is highlighted\n if (node.parent != null && isNodeHighlighted(node.parent, tree)) {\n return true;\n }\n\n return false;\n}\n\nfunction isNodeActive(node: NodeApi<TreeData>, tree: TreeApi<TreeData>) {\n for (const selectedNode of tree.selectedNodes) {\n if (isSelected(node.data, selectedNode.data)) {\n return true;\n }\n }\n return false;\n}\n\nfunction Node({\n node,\n style,\n dragHandle,\n tree,\n matchComponent,\n viewOnly,\n}: any) {\n let highlighted: boolean = isNodeHighlighted(node, tree);\n let active: boolean = isNodeActive(node, tree);\n\n console.log(\"viewOnly\", viewOnly);\n\n const dispatch = useTreeDispatch();\n\n if (!node.data?.type) {\n node.data.type = { name: \"lith\", color: \"rgb(107, 255, 91)\" };\n }\n\n return h(\n \"div.node\" + (!viewOnly ? \".clickable\" : \"\"),\n { style, ref: dragHandle },\n h(EntityTag, {\n data: node.data,\n active: viewOnly ? false : active,\n highlighted: viewOnly ? true : highlighted,\n matchComponent,\n onClickType() {\n dispatch({ type: \"toggle-entity-type-selector\" });\n },\n }),\n );\n}\n\nexport default Node;\n"],"names":["styles"],"mappings":";;;;AAOA,MAAM,IAAI,MAAM,OAAOA,GAAM;AAE7B,SAAS,WAAW,YAAsB,UAAoB;AAC5D,SAAO,WAAW,MAAM,SAAS;AAEnC;AAEA,SAAS,kBAAkB,MAAyB,MAAyB;AAE3E,MAAI,KAAK,cAAc,UAAU,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,KAAK,UAAU,QAAQ,kBAAkB,KAAK,QAAQ,IAAI,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAyB,MAAyB;AACtE,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,KAAK,MAAM,aAAa,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAQ;AACN,MAAI,cAAuB,kBAAkB,MAAM,IAAI;AACvD,MAAI,SAAkB,aAAa,MAAM,IAAI;AAE7C,UAAQ,IAAI,YAAY,QAAQ;AAEhC,QAAM,WAAW,gBAAA;AAEjB,MAAI,CAAC,KAAK,MAAM,MAAM;AACpB,SAAK,KAAK,OAAO,EAAE,MAAM,QAAQ,OAAO,oBAAA;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,cAAc,CAAC,WAAW,eAAe;AAAA,IACzC,EAAE,OAAO,KAAK,WAAA;AAAA,IACd,EAAE,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ,WAAW,QAAQ;AAAA,MAC3B,aAAa,WAAW,OAAO;AAAA,MAC/B;AAAA,MACA,cAAc;AACZ,iBAAS,EAAE,MAAM,+BAA+B;AAAA,MAClD;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;"}
@@ -6,7 +6,9 @@ const index = require("../extractions/index.cjs");
6
6
  const react = require("react");
7
7
  const core = require("@blueprintjs/core");
8
8
  const matches = require("./matches.cjs");
9
- const h = hyper.styled(feedback_module.default);
9
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
10
+ const hyper__default = /* @__PURE__ */ _interopDefault(hyper);
11
+ const h = hyper__default.default.styled(feedback_module.default);
10
12
  function buildTags(highlights, selectedNodes) {
11
13
  let tags = [];
12
14
  const entities = /* @__PURE__ */ new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"text-visualizer.cjs","sources":["../../src/feedback/text-visualizer.ts"],"sourcesContent":["import { AnnotateBlendTag } from \"react-text-annotate-blend\";\nimport { InternalEntity } from \"./types\";\nimport { TreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { buildHighlights, getTagStyle } from \"../extractions\";\nimport { Highlight } from \"../extractions/types\";\nimport { useEffect, useRef } from \"react\";\nimport { Popover } from \"@blueprintjs/core\";\nimport { MatchTag } from \"./matches\";\n\nconst h = hyper.styled(styles);\n\nexport interface FeedbackTextProps {\n text: string;\n selectedNodes: number[];\n nodes: InternalEntity[];\n updateNodes: (nodes: string[]) => void;\n dispatch: TreeDispatch;\n lineHeight: string;\n allowOverlap?: boolean;\n matchLinks?: {\n lithology: string;\n strat_name: string;\n lith_att: string;\n };\n viewOnly?: boolean;\n}\n\nfunction buildTags(\n highlights: Highlight[],\n selectedNodes: number[],\n): AnnotateBlendTag[] {\n let tags: AnnotateBlendTag[] = [];\n // If entity ID has already been seen, don't add it again\n const entities = new Set<number>();\n\n for (const highlight of highlights) {\n // Don't add multiply-linked entities multiple times\n if (entities.has(highlight.id)) continue;\n\n const highlighted = isHighlighted(highlight, selectedNodes);\n const active = isActive(highlight, selectedNodes);\n const tagStyle = getTagStyle(highlight.backgroundColor, {\n highlighted,\n active,\n });\n\n const tag = {\n color: tagStyle.color,\n tagStyle: {\n display: \"none\",\n },\n markStyle: {\n backgroundColor: tagStyle.backgroundColor,\n },\n ...highlight,\n backgroundColor: tagStyle.backgroundColor,\n };\n\n tags.push(tag);\n\n entities.add(highlight.id);\n }\n\n return tags;\n}\n\nfunction isActive(tag: Highlight, selectedNodes: number[]) {\n return selectedNodes.includes(tag.id);\n}\n\nfunction isHighlighted(tag: Highlight, selectedNodes: number[]) {\n if (selectedNodes.length === 0) return true;\n return (\n (selectedNodes.includes(tag.id) ||\n tag.parents?.some((d) => selectedNodes.includes(d))) ??\n false\n );\n}\n\nexport function FeedbackText(props: FeedbackTextProps) {\n // Convert input to tags\n const {\n text,\n selectedNodes,\n nodes,\n dispatch,\n allowOverlap,\n matchLinks,\n viewOnly,\n } = props;\n const allTags: AnnotateBlendTag[] = buildTags(\n buildHighlights(nodes, null),\n selectedNodes,\n );\n\n return h(\n \"div.feedback-text-wrapper\",\n {\n tabIndex: 0,\n onKeyDown: (e) => {\n if (e.key === \"Backspace\") {\n dispatch({\n type: \"delete-node\",\n payload: { ids: selectedNodes },\n });\n }\n },\n },\n h(HighlightedText, {\n text,\n allTags,\n allowOverlap,\n dispatch,\n selectedNodes,\n viewOnly,\n matchLinks,\n }),\n );\n}\n\nfunction createTagFromSelection({\n container,\n}: {\n container: HTMLElement | null;\n}) {\n const selection = window.getSelection();\n if (\n !selection ||\n selection.isCollapsed ||\n selection.rangeCount === 0 ||\n !container\n )\n return null;\n\n const range = selection.getRangeAt(0);\n\n if (\n !container.contains(range.startContainer) ||\n !container.contains(range.endContainer)\n ) {\n return null;\n }\n\n const preRange = document.createRange();\n preRange.setStart(container, 0);\n preRange.setEnd(range.startContainer, range.startOffset);\n const start = preRange.toString().length;\n\n const selectedText = range.toString();\n const end = start + selectedText.length;\n\n return {\n start,\n end,\n text: selectedText,\n };\n}\n\nfunction addTag({ tag, dispatch, text, allTags, allowOverlap }) {\n let { start, end } = tag;\n // snap to text\n if (text[end - 1] != \" \") {\n // double clicking word overselects by one, shouldn't increase to next word\n while (start > 0 && /\\w/.test(text[start - 1])) {\n start--;\n }\n while (end < text.length && /\\w/.test(text[end])) {\n end++;\n }\n }\n\n let payload = { start, end, text: text.slice(start, end) };\n\n if (payload.text.trim() === \"\") {\n console.log(\"Blank tag found, ignoring\");\n return;\n }\n\n const duplicate = allTags.find(\n (t) =>\n t.start === payload.start &&\n (t.end === payload.end || t.end === payload.end - 1),\n );\n\n if (duplicate) {\n console.log(\"Duplicate tag found, ignoring\");\n return;\n }\n\n if (payload.text.endsWith(\" \")) {\n payload.text = payload.text.slice(0, -1);\n payload.end -= 1;\n }\n\n const inside = allTags.some(\n (t) => t.start <= payload.start && t.end >= payload.end,\n );\n\n const overlap = allTags.some(\n (t) => t.start < payload.end && t.end > payload.start,\n );\n\n if ((inside || overlap) && !allowOverlap) {\n console.log(\"Tag is inside another tag, ignoring\");\n return;\n }\n\n dispatch({ type: \"create-node\", payload });\n}\n\nfunction nestHighlights(text: string, tags: AnnotateBlendTag[]) {\n const events: Array<{\n pos: number;\n type: \"start\" | \"end\";\n tag: AnnotateBlendTag;\n }> = [];\n\n for (const tag of tags) {\n events.push({ pos: tag.start, type: \"start\", tag });\n events.push({ pos: tag.end, type: \"end\", tag });\n }\n\n events.sort((a, b) => {\n if (a.pos !== b.pos) return a.pos - b.pos;\n if (a.type === \"end\" && b.type === \"start\") return -1;\n if (a.type === \"start\" && b.type === \"end\") return 1;\n return 0;\n });\n\n const root = { children: [], textStart: 0 };\n const stack = [root];\n let lastPos = 0;\n\n for (const { pos, type, tag } of events) {\n const parent = stack[stack.length - 1];\n\n if (pos > lastPos) {\n const slice = text.slice(lastPos, pos);\n parent.children.push(slice);\n }\n\n if (type === \"start\") {\n const newNode = { tag, children: [], textStart: pos };\n parent.children.push(newNode);\n stack.push(newNode);\n } else {\n stack.pop();\n }\n\n lastPos = pos;\n }\n\n if (lastPos < text.length) {\n stack[stack.length - 1].children.push(text.slice(lastPos));\n }\n\n return root;\n}\n\nfunction renderNode(\n node: any,\n dispatch: TreeDispatch,\n selectedNodes: number[],\n parentSelected: boolean,\n matchLinks?: {\n lithology: string;\n strat_name: string;\n lith_att: string;\n },\n viewOnly?: boolean,\n): any {\n if (typeof node === \"string\") return node;\n\n const { tag, children } = node;\n const isSelected = selectedNodes?.includes(tag.id);\n const showBorder = selectedNodes.length === 0 || isSelected;\n const match = tag.match;\n\n const style = {\n ...tag,\n zIndex: parentSelected ? -1 : 1,\n border:\n \"1px solid \" +\n (match != undefined && matchLinks\n ? \"orange\"\n : showBorder\n ? tag.color\n : \"transparent\"),\n margin: \"-1px\",\n };\n\n let moveText = [];\n if (isSelected) {\n for (const key in children) {\n if (Object.prototype.hasOwnProperty.call(children, key)) {\n const child = children[key];\n if (child?.tag) {\n moveText.push(child.children[0]);\n } else {\n moveText.push(child);\n }\n }\n }\n }\n\n const tagComponent = h(\n \"span\",\n {\n onMouseEnter: (e: MouseEvent) => {\n e.stopPropagation();\n },\n className: \"highlight\" + (!viewOnly || match ? \" clickable\" : \"\"),\n style,\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === tag.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: [tag.id] },\n });\n } else if (e.shiftKey && selectedNodes.length > 0) {\n // Select range from last selected node to this one\n const lastSelected = selectedNodes[selectedNodes.length - 1];\n\n dispatch({\n type: \"select-range\",\n payload: { ids: [lastSelected, tag.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [tag.id] },\n });\n }\n },\n },\n isSelected\n ? moveText.flat()\n : children.map((child: any, i: number) =>\n renderNode(\n child,\n dispatch,\n selectedNodes,\n isSelected,\n matchLinks,\n viewOnly,\n ),\n ),\n );\n\n if (viewOnly && match) {\n return h(\n Popover,\n {\n content: h(\"div.match-link\", h(MatchTag, { data: match, matchLinks })),\n interactionKind: \"hover\",\n },\n tagComponent,\n );\n }\n\n return tagComponent;\n}\n\nexport function HighlightedText(props: {\n text: string;\n allTags: AnnotateBlendTag[];\n lineHeight: string;\n allowOverlap?: boolean;\n dispatch: TreeDispatch;\n selectedNodes: number[];\n matchLinks?: {\n lithology: string;\n strat_name: string;\n lith_att: string;\n };\n viewOnly?: boolean;\n}) {\n const {\n text,\n allTags = [],\n dispatch,\n selectedNodes,\n allowOverlap,\n matchLinks,\n viewOnly,\n } = props;\n\n const tree = nestHighlights(text, allTags);\n\n const spanRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n const handleMouseUp = () => {\n const tag = createTagFromSelection({ container: spanRef.current });\n if (!tag) return;\n addTag({ tag, dispatch, text, allTags, allowOverlap });\n };\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [text, allTags, dispatch, allowOverlap]);\n\n return h(\n \"span\",\n { ref: spanRef },\n tree.children.map((child: any, i: number) =>\n renderNode(child, dispatch, selectedNodes, false, matchLinks, viewOnly),\n ),\n );\n}\n"],"names":["styles","getTagStyle","buildHighlights","Popover","MatchTag","useRef","useEffect"],"mappings":";;;;;;;;AAWA,MAAM,IAAI,MAAM,OAAOA,uBAAM;AAkB7B,SAAS,UACP,YACA,eACoB;AACpB,MAAI,OAA2B,CAAA;AAE/B,QAAM,+BAAe,IAAA;AAErB,aAAW,aAAa,YAAY;AAElC,QAAI,SAAS,IAAI,UAAU,EAAE,EAAG;AAEhC,UAAM,cAAc,cAAc,WAAW,aAAa;AAC1D,UAAM,SAAS,SAAS,WAAW,aAAa;AAChD,UAAM,WAAWC,MAAAA,YAAY,UAAU,iBAAiB;AAAA,MACtD;AAAA,MACA;AAAA,IAAA,CACD;AAED,UAAM,MAAM;AAAA,MACV,OAAO,SAAS;AAAA,MAChB,UAAU;AAAA,QACR,SAAS;AAAA,MAAA;AAAA,MAEX,WAAW;AAAA,QACT,iBAAiB,SAAS;AAAA,MAAA;AAAA,MAE5B,GAAG;AAAA,MACH,iBAAiB,SAAS;AAAA,IAAA;AAG5B,SAAK,KAAK,GAAG;AAEb,aAAS,IAAI,UAAU,EAAE;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,KAAgB,eAAyB;AACzD,SAAO,cAAc,SAAS,IAAI,EAAE;AACtC;AAEA,SAAS,cAAc,KAAgB,eAAyB;AAC9D,MAAI,cAAc,WAAW,EAAG,QAAO;AACvC,UACG,cAAc,SAAS,IAAI,EAAE,KAC5B,IAAI,SAAS,KAAK,CAAC,MAAM,cAAc,SAAS,CAAC,CAAC,MACpD;AAEJ;AAEO,SAAS,aAAa,OAA0B;AAErD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,UAA8B;AAAA,IAClCC,MAAAA,gBAAgB,OAAO,IAAI;AAAA,IAC3B;AAAA,EAAA;AAGF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,aAAa;AACzB,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,cAAA;AAAA,UAAc,CAC/B;AAAA,QACH;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,EAAE,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AACF,GAEG;AACD,QAAM,YAAY,OAAO,aAAA;AACzB,MACE,CAAC,aACD,UAAU,eACV,UAAU,eAAe,KACzB,CAAC;AAED,WAAO;AAET,QAAM,QAAQ,UAAU,WAAW,CAAC;AAEpC,MACE,CAAC,UAAU,SAAS,MAAM,cAAc,KACxC,CAAC,UAAU,SAAS,MAAM,YAAY,GACtC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,YAAA;AAC1B,WAAS,SAAS,WAAW,CAAC;AAC9B,WAAS,OAAO,MAAM,gBAAgB,MAAM,WAAW;AACvD,QAAM,QAAQ,SAAS,SAAA,EAAW;AAElC,QAAM,eAAe,MAAM,SAAA;AAC3B,QAAM,MAAM,QAAQ,aAAa;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EAAA;AAEV;AAEA,SAAS,OAAO,EAAE,KAAK,UAAU,MAAM,SAAS,gBAAgB;AAC9D,MAAI,EAAE,OAAO,IAAA,IAAQ;AAErB,MAAI,KAAK,MAAM,CAAC,KAAK,KAAK;AAExB,WAAO,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC9C;AAAA,IACF;AACA,WAAO,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,GAAG,CAAC,GAAG;AAChD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,EAAE,OAAO,KAAK,MAAM,KAAK,MAAM,OAAO,GAAG,EAAA;AAEvD,MAAI,QAAQ,KAAK,KAAA,MAAW,IAAI;AAC9B,YAAQ,IAAI,2BAA2B;AACvC;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ;AAAA,IACxB,CAAC,MACC,EAAE,UAAU,QAAQ,UACnB,EAAE,QAAQ,QAAQ,OAAO,EAAE,QAAQ,QAAQ,MAAM;AAAA,EAAA;AAGtD,MAAI,WAAW;AACb,YAAQ,IAAI,+BAA+B;AAC3C;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,SAAS,GAAG,GAAG;AAC9B,YAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE;AACvC,YAAQ,OAAO;AAAA,EACjB;AAEA,QAAM,SAAS,QAAQ;AAAA,IACrB,CAAC,MAAM,EAAE,SAAS,QAAQ,SAAS,EAAE,OAAO,QAAQ;AAAA,EAAA;AAGtD,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,MAAM,EAAE,QAAQ,QAAQ,OAAO,EAAE,MAAM,QAAQ;AAAA,EAAA;AAGlD,OAAK,UAAU,YAAY,CAAC,cAAc;AACxC,YAAQ,IAAI,qCAAqC;AACjD;AAAA,EACF;AAEA,WAAS,EAAE,MAAM,eAAe,QAAA,CAAS;AAC3C;AAEA,SAAS,eAAe,MAAc,MAA0B;AAC9D,QAAM,SAID,CAAA;AAEL,aAAW,OAAO,MAAM;AACtB,WAAO,KAAK,EAAE,KAAK,IAAI,OAAO,MAAM,SAAS,KAAK;AAClD,WAAO,KAAK,EAAE,KAAK,IAAI,KAAK,MAAM,OAAO,KAAK;AAAA,EAChD;AAEA,SAAO,KAAK,CAAC,GAAG,MAAM;AACpB,QAAI,EAAE,QAAQ,EAAE,IAAK,QAAO,EAAE,MAAM,EAAE;AACtC,QAAI,EAAE,SAAS,SAAS,EAAE,SAAS,QAAS,QAAO;AACnD,QAAI,EAAE,SAAS,WAAW,EAAE,SAAS,MAAO,QAAO;AACnD,WAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,EAAE,UAAU,CAAA,GAAI,WAAW,EAAA;AACxC,QAAM,QAAQ,CAAC,IAAI;AACnB,MAAI,UAAU;AAEd,aAAW,EAAE,KAAK,MAAM,IAAA,KAAS,QAAQ;AACvC,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AAErC,QAAI,MAAM,SAAS;AACjB,YAAM,QAAQ,KAAK,MAAM,SAAS,GAAG;AACrC,aAAO,SAAS,KAAK,KAAK;AAAA,IAC5B;AAEA,QAAI,SAAS,SAAS;AACpB,YAAM,UAAU,EAAE,KAAK,UAAU,CAAA,GAAI,WAAW,IAAA;AAChD,aAAO,SAAS,KAAK,OAAO;AAC5B,YAAM,KAAK,OAAO;AAAA,IACpB,OAAO;AACL,YAAM,IAAA;AAAA,IACR;AAEA,cAAU;AAAA,EACZ;AAEA,MAAI,UAAU,KAAK,QAAQ;AACzB,UAAM,MAAM,SAAS,CAAC,EAAE,SAAS,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,SAAS,WACP,MACA,UACA,eACA,gBACA,YAKA,UACK;AACL,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,QAAM,EAAE,KAAK,SAAA,IAAa;AAC1B,QAAM,aAAa,eAAe,SAAS,IAAI,EAAE;AACjD,QAAM,aAAa,cAAc,WAAW,KAAK;AACjD,QAAM,QAAQ,IAAI;AAElB,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,QAAQ,iBAAiB,KAAK;AAAA,IAC9B,QACE,gBACC,SAAS,UAAa,aACnB,WACA,aACE,IAAI,QACJ;AAAA,IACR,QAAQ;AAAA,EAAA;AAGV,MAAI,WAAW,CAAA;AACf,MAAI,YAAY;AACd,eAAW,OAAO,UAAU;AAC1B,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,GAAG,GAAG;AACvD,cAAM,QAAQ,SAAS,GAAG;AAC1B,YAAI,OAAO,KAAK;AACd,mBAAS,KAAK,MAAM,SAAS,CAAC,CAAC;AAAA,QACjC,OAAO;AACL,mBAAS,KAAK,KAAK;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,MACE,cAAc,CAAC,MAAkB;AAC/B,UAAE,gBAAA;AAAA,MACJ;AAAA,MACA,WAAW,eAAe,CAAC,YAAY,QAAQ,eAAe;AAAA,MAC9D;AAAA,MACA,SAAS,CAAC,MAAkB;AAC1B,UAAE,gBAAA;AACF,YACE,EAAE,WACF,EAAE,WACD,cAAc,CAAC,MAAM,IAAI,MAAM,cAAc,WAAW,GACzD;AAEA,YAAE,gBAAA;AACF,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAA;AAAA,UAAE,CAC1B;AAAA,QACH,WAAW,EAAE,YAAY,cAAc,SAAS,GAAG;AAEjD,gBAAM,eAAe,cAAc,cAAc,SAAS,CAAC;AAE3D,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE,EAAA;AAAA,UAAE,CACxC;AAAA,QACH,OAAO;AACL,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAA;AAAA,UAAE,CAC1B;AAAA,QACH;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,aACI,SAAS,KAAA,IACT,SAAS;AAAA,MAAI,CAAC,OAAY,MACxB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAGN,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,MACLC,KAAAA;AAAAA,MACA;AAAA,QACE,SAAS,EAAE,kBAAkB,EAAEC,QAAAA,UAAU,EAAE,MAAM,OAAO,WAAA,CAAY,CAAC;AAAA,QACrE,iBAAiB;AAAA,MAAA;AAAA,MAEnB;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAa7B;AACD,QAAM;AAAA,IACJ;AAAA,IACA,UAAU,CAAA;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,OAAO,eAAe,MAAM,OAAO;AAEzC,QAAM,UAAUC,MAAAA,OAAwB,IAAI;AAE5CC,QAAAA,UAAU,MAAM;AACd,UAAM,gBAAgB,MAAM;AAC1B,YAAM,MAAM,uBAAuB,EAAE,WAAW,QAAQ,SAAS;AACjE,UAAI,CAAC,IAAK;AACV,aAAO,EAAE,KAAK,UAAU,MAAM,SAAS,cAAc;AAAA,IACvD;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,aAAa;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,UAAU,YAAY,CAAC;AAE1C,SAAO;AAAA,IACL;AAAA,IACA,EAAE,KAAK,QAAA;AAAA,IACP,KAAK,SAAS;AAAA,MAAI,CAAC,OAAY,MAC7B,WAAW,OAAO,UAAU,eAAe,OAAO,YAAY,QAAQ;AAAA,IAAA;AAAA,EACxE;AAEJ;;;"}
1
+ {"version":3,"file":"text-visualizer.cjs","sources":["../../src/feedback/text-visualizer.ts"],"sourcesContent":["import { AnnotateBlendTag } from \"react-text-annotate-blend\";\nimport { InternalEntity } from \"./types\";\nimport { TreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { buildHighlights, getTagStyle } from \"../extractions\";\nimport { Highlight } from \"../extractions/types\";\nimport { useEffect, useRef } from \"react\";\nimport { Popover } from \"@blueprintjs/core\";\nimport { MatchTag } from \"./matches\";\n\nconst h = hyper.styled(styles);\n\nexport interface FeedbackTextProps {\n text: string;\n selectedNodes: number[];\n nodes: InternalEntity[];\n updateNodes: (nodes: string[]) => void;\n dispatch: TreeDispatch;\n lineHeight: string;\n allowOverlap?: boolean;\n matchLinks?: {\n lithology: string;\n strat_name: string;\n lith_att: string;\n };\n viewOnly?: boolean;\n}\n\nfunction buildTags(\n highlights: Highlight[],\n selectedNodes: number[],\n): AnnotateBlendTag[] {\n let tags: AnnotateBlendTag[] = [];\n // If entity ID has already been seen, don't add it again\n const entities = new Set<number>();\n\n for (const highlight of highlights) {\n // Don't add multiply-linked entities multiple times\n if (entities.has(highlight.id)) continue;\n\n const highlighted = isHighlighted(highlight, selectedNodes);\n const active = isActive(highlight, selectedNodes);\n const tagStyle = getTagStyle(highlight.backgroundColor, {\n highlighted,\n active,\n });\n\n const tag = {\n color: tagStyle.color,\n tagStyle: {\n display: \"none\",\n },\n markStyle: {\n backgroundColor: tagStyle.backgroundColor,\n },\n ...highlight,\n backgroundColor: tagStyle.backgroundColor,\n };\n\n tags.push(tag);\n\n entities.add(highlight.id);\n }\n\n return tags;\n}\n\nfunction isActive(tag: Highlight, selectedNodes: number[]) {\n return selectedNodes.includes(tag.id);\n}\n\nfunction isHighlighted(tag: Highlight, selectedNodes: number[]) {\n if (selectedNodes.length === 0) return true;\n return (\n (selectedNodes.includes(tag.id) ||\n tag.parents?.some((d) => selectedNodes.includes(d))) ??\n false\n );\n}\n\nexport function FeedbackText(props: FeedbackTextProps) {\n // Convert input to tags\n const {\n text,\n selectedNodes,\n nodes,\n dispatch,\n allowOverlap,\n matchLinks,\n viewOnly,\n } = props;\n const allTags: AnnotateBlendTag[] = buildTags(\n buildHighlights(nodes, null),\n selectedNodes,\n );\n\n return h(\n \"div.feedback-text-wrapper\",\n {\n tabIndex: 0,\n onKeyDown: (e) => {\n if (e.key === \"Backspace\") {\n dispatch({\n type: \"delete-node\",\n payload: { ids: selectedNodes },\n });\n }\n },\n },\n h(HighlightedText, {\n text,\n allTags,\n allowOverlap,\n dispatch,\n selectedNodes,\n viewOnly,\n matchLinks,\n }),\n );\n}\n\nfunction createTagFromSelection({\n container,\n}: {\n container: HTMLElement | null;\n}) {\n const selection = window.getSelection();\n if (\n !selection ||\n selection.isCollapsed ||\n selection.rangeCount === 0 ||\n !container\n )\n return null;\n\n const range = selection.getRangeAt(0);\n\n if (\n !container.contains(range.startContainer) ||\n !container.contains(range.endContainer)\n ) {\n return null;\n }\n\n const preRange = document.createRange();\n preRange.setStart(container, 0);\n preRange.setEnd(range.startContainer, range.startOffset);\n const start = preRange.toString().length;\n\n const selectedText = range.toString();\n const end = start + selectedText.length;\n\n return {\n start,\n end,\n text: selectedText,\n };\n}\n\nfunction addTag({ tag, dispatch, text, allTags, allowOverlap }) {\n let { start, end } = tag;\n // snap to text\n if (text[end - 1] != \" \") {\n // double clicking word overselects by one, shouldn't increase to next word\n while (start > 0 && /\\w/.test(text[start - 1])) {\n start--;\n }\n while (end < text.length && /\\w/.test(text[end])) {\n end++;\n }\n }\n\n let payload = { start, end, text: text.slice(start, end) };\n\n if (payload.text.trim() === \"\") {\n console.log(\"Blank tag found, ignoring\");\n return;\n }\n\n const duplicate = allTags.find(\n (t) =>\n t.start === payload.start &&\n (t.end === payload.end || t.end === payload.end - 1),\n );\n\n if (duplicate) {\n console.log(\"Duplicate tag found, ignoring\");\n return;\n }\n\n if (payload.text.endsWith(\" \")) {\n payload.text = payload.text.slice(0, -1);\n payload.end -= 1;\n }\n\n const inside = allTags.some(\n (t) => t.start <= payload.start && t.end >= payload.end,\n );\n\n const overlap = allTags.some(\n (t) => t.start < payload.end && t.end > payload.start,\n );\n\n if ((inside || overlap) && !allowOverlap) {\n console.log(\"Tag is inside another tag, ignoring\");\n return;\n }\n\n dispatch({ type: \"create-node\", payload });\n}\n\nfunction nestHighlights(text: string, tags: AnnotateBlendTag[]) {\n const events: Array<{\n pos: number;\n type: \"start\" | \"end\";\n tag: AnnotateBlendTag;\n }> = [];\n\n for (const tag of tags) {\n events.push({ pos: tag.start, type: \"start\", tag });\n events.push({ pos: tag.end, type: \"end\", tag });\n }\n\n events.sort((a, b) => {\n if (a.pos !== b.pos) return a.pos - b.pos;\n if (a.type === \"end\" && b.type === \"start\") return -1;\n if (a.type === \"start\" && b.type === \"end\") return 1;\n return 0;\n });\n\n const root = { children: [], textStart: 0 };\n const stack = [root];\n let lastPos = 0;\n\n for (const { pos, type, tag } of events) {\n const parent = stack[stack.length - 1];\n\n if (pos > lastPos) {\n const slice = text.slice(lastPos, pos);\n parent.children.push(slice);\n }\n\n if (type === \"start\") {\n const newNode = { tag, children: [], textStart: pos };\n parent.children.push(newNode);\n stack.push(newNode);\n } else {\n stack.pop();\n }\n\n lastPos = pos;\n }\n\n if (lastPos < text.length) {\n stack[stack.length - 1].children.push(text.slice(lastPos));\n }\n\n return root;\n}\n\nfunction renderNode(\n node: any,\n dispatch: TreeDispatch,\n selectedNodes: number[],\n parentSelected: boolean,\n matchLinks?: {\n lithology: string;\n strat_name: string;\n lith_att: string;\n },\n viewOnly?: boolean,\n): any {\n if (typeof node === \"string\") return node;\n\n const { tag, children } = node;\n const isSelected = selectedNodes?.includes(tag.id);\n const showBorder = selectedNodes.length === 0 || isSelected;\n const match = tag.match;\n\n const style = {\n ...tag,\n zIndex: parentSelected ? -1 : 1,\n border:\n \"1px solid \" +\n (match != undefined && matchLinks\n ? \"orange\"\n : showBorder\n ? tag.color\n : \"transparent\"),\n margin: \"-1px\",\n };\n\n let moveText = [];\n if (isSelected) {\n for (const key in children) {\n if (Object.prototype.hasOwnProperty.call(children, key)) {\n const child = children[key];\n if (child?.tag) {\n moveText.push(child.children[0]);\n } else {\n moveText.push(child);\n }\n }\n }\n }\n\n const tagComponent = h(\n \"span\",\n {\n onMouseEnter: (e: MouseEvent) => {\n e.stopPropagation();\n },\n className: \"highlight\" + (!viewOnly || match ? \" clickable\" : \"\"),\n style,\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === tag.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: [tag.id] },\n });\n } else if (e.shiftKey && selectedNodes.length > 0) {\n // Select range from last selected node to this one\n const lastSelected = selectedNodes[selectedNodes.length - 1];\n\n dispatch({\n type: \"select-range\",\n payload: { ids: [lastSelected, tag.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [tag.id] },\n });\n }\n },\n },\n isSelected\n ? moveText.flat()\n : children.map((child: any, i: number) =>\n renderNode(\n child,\n dispatch,\n selectedNodes,\n isSelected,\n matchLinks,\n viewOnly,\n ),\n ),\n );\n\n if (viewOnly && match) {\n return h(\n Popover,\n {\n content: h(\"div.match-link\", h(MatchTag, { data: match, matchLinks })),\n interactionKind: \"hover\",\n },\n tagComponent,\n );\n }\n\n return tagComponent;\n}\n\nexport function HighlightedText(props: {\n text: string;\n allTags: AnnotateBlendTag[];\n lineHeight: string;\n allowOverlap?: boolean;\n dispatch: TreeDispatch;\n selectedNodes: number[];\n matchLinks?: {\n lithology: string;\n strat_name: string;\n lith_att: string;\n };\n viewOnly?: boolean;\n}) {\n const {\n text,\n allTags = [],\n dispatch,\n selectedNodes,\n allowOverlap,\n matchLinks,\n viewOnly,\n } = props;\n\n const tree = nestHighlights(text, allTags);\n\n const spanRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n const handleMouseUp = () => {\n const tag = createTagFromSelection({ container: spanRef.current });\n if (!tag) return;\n addTag({ tag, dispatch, text, allTags, allowOverlap });\n };\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [text, allTags, dispatch, allowOverlap]);\n\n return h(\n \"span\",\n { ref: spanRef },\n tree.children.map((child: any, i: number) =>\n renderNode(child, dispatch, selectedNodes, false, matchLinks, viewOnly),\n ),\n );\n}\n"],"names":["hyper","styles","getTagStyle","buildHighlights","Popover","MatchTag","useRef","useEffect"],"mappings":";;;;;;;;;;AAWA,MAAM,IAAIA,eAAAA,QAAM,OAAOC,uBAAM;AAkB7B,SAAS,UACP,YACA,eACoB;AACpB,MAAI,OAA2B,CAAA;AAE/B,QAAM,+BAAe,IAAA;AAErB,aAAW,aAAa,YAAY;AAElC,QAAI,SAAS,IAAI,UAAU,EAAE,EAAG;AAEhC,UAAM,cAAc,cAAc,WAAW,aAAa;AAC1D,UAAM,SAAS,SAAS,WAAW,aAAa;AAChD,UAAM,WAAWC,MAAAA,YAAY,UAAU,iBAAiB;AAAA,MACtD;AAAA,MACA;AAAA,IAAA,CACD;AAED,UAAM,MAAM;AAAA,MACV,OAAO,SAAS;AAAA,MAChB,UAAU;AAAA,QACR,SAAS;AAAA,MAAA;AAAA,MAEX,WAAW;AAAA,QACT,iBAAiB,SAAS;AAAA,MAAA;AAAA,MAE5B,GAAG;AAAA,MACH,iBAAiB,SAAS;AAAA,IAAA;AAG5B,SAAK,KAAK,GAAG;AAEb,aAAS,IAAI,UAAU,EAAE;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,KAAgB,eAAyB;AACzD,SAAO,cAAc,SAAS,IAAI,EAAE;AACtC;AAEA,SAAS,cAAc,KAAgB,eAAyB;AAC9D,MAAI,cAAc,WAAW,EAAG,QAAO;AACvC,UACG,cAAc,SAAS,IAAI,EAAE,KAC5B,IAAI,SAAS,KAAK,CAAC,MAAM,cAAc,SAAS,CAAC,CAAC,MACpD;AAEJ;AAEO,SAAS,aAAa,OAA0B;AAErD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,UAA8B;AAAA,IAClCC,MAAAA,gBAAgB,OAAO,IAAI;AAAA,IAC3B;AAAA,EAAA;AAGF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,aAAa;AACzB,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,cAAA;AAAA,UAAc,CAC/B;AAAA,QACH;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,EAAE,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AACF,GAEG;AACD,QAAM,YAAY,OAAO,aAAA;AACzB,MACE,CAAC,aACD,UAAU,eACV,UAAU,eAAe,KACzB,CAAC;AAED,WAAO;AAET,QAAM,QAAQ,UAAU,WAAW,CAAC;AAEpC,MACE,CAAC,UAAU,SAAS,MAAM,cAAc,KACxC,CAAC,UAAU,SAAS,MAAM,YAAY,GACtC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,YAAA;AAC1B,WAAS,SAAS,WAAW,CAAC;AAC9B,WAAS,OAAO,MAAM,gBAAgB,MAAM,WAAW;AACvD,QAAM,QAAQ,SAAS,SAAA,EAAW;AAElC,QAAM,eAAe,MAAM,SAAA;AAC3B,QAAM,MAAM,QAAQ,aAAa;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EAAA;AAEV;AAEA,SAAS,OAAO,EAAE,KAAK,UAAU,MAAM,SAAS,gBAAgB;AAC9D,MAAI,EAAE,OAAO,IAAA,IAAQ;AAErB,MAAI,KAAK,MAAM,CAAC,KAAK,KAAK;AAExB,WAAO,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC9C;AAAA,IACF;AACA,WAAO,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,GAAG,CAAC,GAAG;AAChD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,EAAE,OAAO,KAAK,MAAM,KAAK,MAAM,OAAO,GAAG,EAAA;AAEvD,MAAI,QAAQ,KAAK,KAAA,MAAW,IAAI;AAC9B,YAAQ,IAAI,2BAA2B;AACvC;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ;AAAA,IACxB,CAAC,MACC,EAAE,UAAU,QAAQ,UACnB,EAAE,QAAQ,QAAQ,OAAO,EAAE,QAAQ,QAAQ,MAAM;AAAA,EAAA;AAGtD,MAAI,WAAW;AACb,YAAQ,IAAI,+BAA+B;AAC3C;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,SAAS,GAAG,GAAG;AAC9B,YAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE;AACvC,YAAQ,OAAO;AAAA,EACjB;AAEA,QAAM,SAAS,QAAQ;AAAA,IACrB,CAAC,MAAM,EAAE,SAAS,QAAQ,SAAS,EAAE,OAAO,QAAQ;AAAA,EAAA;AAGtD,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,MAAM,EAAE,QAAQ,QAAQ,OAAO,EAAE,MAAM,QAAQ;AAAA,EAAA;AAGlD,OAAK,UAAU,YAAY,CAAC,cAAc;AACxC,YAAQ,IAAI,qCAAqC;AACjD;AAAA,EACF;AAEA,WAAS,EAAE,MAAM,eAAe,QAAA,CAAS;AAC3C;AAEA,SAAS,eAAe,MAAc,MAA0B;AAC9D,QAAM,SAID,CAAA;AAEL,aAAW,OAAO,MAAM;AACtB,WAAO,KAAK,EAAE,KAAK,IAAI,OAAO,MAAM,SAAS,KAAK;AAClD,WAAO,KAAK,EAAE,KAAK,IAAI,KAAK,MAAM,OAAO,KAAK;AAAA,EAChD;AAEA,SAAO,KAAK,CAAC,GAAG,MAAM;AACpB,QAAI,EAAE,QAAQ,EAAE,IAAK,QAAO,EAAE,MAAM,EAAE;AACtC,QAAI,EAAE,SAAS,SAAS,EAAE,SAAS,QAAS,QAAO;AACnD,QAAI,EAAE,SAAS,WAAW,EAAE,SAAS,MAAO,QAAO;AACnD,WAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,EAAE,UAAU,CAAA,GAAI,WAAW,EAAA;AACxC,QAAM,QAAQ,CAAC,IAAI;AACnB,MAAI,UAAU;AAEd,aAAW,EAAE,KAAK,MAAM,IAAA,KAAS,QAAQ;AACvC,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AAErC,QAAI,MAAM,SAAS;AACjB,YAAM,QAAQ,KAAK,MAAM,SAAS,GAAG;AACrC,aAAO,SAAS,KAAK,KAAK;AAAA,IAC5B;AAEA,QAAI,SAAS,SAAS;AACpB,YAAM,UAAU,EAAE,KAAK,UAAU,CAAA,GAAI,WAAW,IAAA;AAChD,aAAO,SAAS,KAAK,OAAO;AAC5B,YAAM,KAAK,OAAO;AAAA,IACpB,OAAO;AACL,YAAM,IAAA;AAAA,IACR;AAEA,cAAU;AAAA,EACZ;AAEA,MAAI,UAAU,KAAK,QAAQ;AACzB,UAAM,MAAM,SAAS,CAAC,EAAE,SAAS,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,SAAS,WACP,MACA,UACA,eACA,gBACA,YAKA,UACK;AACL,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,QAAM,EAAE,KAAK,SAAA,IAAa;AAC1B,QAAM,aAAa,eAAe,SAAS,IAAI,EAAE;AACjD,QAAM,aAAa,cAAc,WAAW,KAAK;AACjD,QAAM,QAAQ,IAAI;AAElB,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,QAAQ,iBAAiB,KAAK;AAAA,IAC9B,QACE,gBACC,SAAS,UAAa,aACnB,WACA,aACE,IAAI,QACJ;AAAA,IACR,QAAQ;AAAA,EAAA;AAGV,MAAI,WAAW,CAAA;AACf,MAAI,YAAY;AACd,eAAW,OAAO,UAAU;AAC1B,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,GAAG,GAAG;AACvD,cAAM,QAAQ,SAAS,GAAG;AAC1B,YAAI,OAAO,KAAK;AACd,mBAAS,KAAK,MAAM,SAAS,CAAC,CAAC;AAAA,QACjC,OAAO;AACL,mBAAS,KAAK,KAAK;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,MACE,cAAc,CAAC,MAAkB;AAC/B,UAAE,gBAAA;AAAA,MACJ;AAAA,MACA,WAAW,eAAe,CAAC,YAAY,QAAQ,eAAe;AAAA,MAC9D;AAAA,MACA,SAAS,CAAC,MAAkB;AAC1B,UAAE,gBAAA;AACF,YACE,EAAE,WACF,EAAE,WACD,cAAc,CAAC,MAAM,IAAI,MAAM,cAAc,WAAW,GACzD;AAEA,YAAE,gBAAA;AACF,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAA;AAAA,UAAE,CAC1B;AAAA,QACH,WAAW,EAAE,YAAY,cAAc,SAAS,GAAG;AAEjD,gBAAM,eAAe,cAAc,cAAc,SAAS,CAAC;AAE3D,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE,EAAA;AAAA,UAAE,CACxC;AAAA,QACH,OAAO;AACL,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAA;AAAA,UAAE,CAC1B;AAAA,QACH;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,aACI,SAAS,KAAA,IACT,SAAS;AAAA,MAAI,CAAC,OAAY,MACxB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAGN,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,MACLC,KAAAA;AAAAA,MACA;AAAA,QACE,SAAS,EAAE,kBAAkB,EAAEC,QAAAA,UAAU,EAAE,MAAM,OAAO,WAAA,CAAY,CAAC;AAAA,QACrE,iBAAiB;AAAA,MAAA;AAAA,MAEnB;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAa7B;AACD,QAAM;AAAA,IACJ;AAAA,IACA,UAAU,CAAA;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,OAAO,eAAe,MAAM,OAAO;AAEzC,QAAM,UAAUC,MAAAA,OAAwB,IAAI;AAE5CC,QAAAA,UAAU,MAAM;AACd,UAAM,gBAAgB,MAAM;AAC1B,YAAM,MAAM,uBAAuB,EAAE,WAAW,QAAQ,SAAS;AACjE,UAAI,CAAC,IAAK;AACV,aAAO,EAAE,KAAK,UAAU,MAAM,SAAS,cAAc;AAAA,IACvD;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,aAAa;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,UAAU,YAAY,CAAC;AAE1C,SAAO;AAAA,IACL;AAAA,IACA,EAAE,KAAK,QAAA;AAAA,IACP,KAAK,SAAS;AAAA,MAAI,CAAC,OAAY,MAC7B,WAAW,OAAO,UAAU,eAAe,OAAO,YAAY,QAAQ;AAAA,IAAA;AAAA,EACxE;AAEJ;;;"}
@@ -1,10 +1,10 @@
1
- import styles from "./feedback.module.sass.js";
1
+ import h$1 from "./feedback.module.sass.js";
2
2
  import hyper from "@macrostrat/hyper";
3
3
  import { buildHighlights, getTagStyle } from "../extractions/index.js";
4
4
  import { useRef, useEffect } from "react";
5
5
  import { Popover } from "@blueprintjs/core";
6
6
  import { MatchTag } from "./matches.js";
7
- const h = hyper.styled(styles);
7
+ const h = hyper.styled(h$1);
8
8
  function buildTags(highlights, selectedNodes) {
9
9
  let tags = [];
10
10
  const entities = /* @__PURE__ */ new Set();