@macrostrat/feedback-components 1.1.4 → 1.1.6

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 (74) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/esm/{feedback-components.7e879290.js → feedback-components.03f08dc7.js} +10 -9
  3. package/dist/esm/feedback-components.03f08dc7.js.map +1 -0
  4. package/dist/esm/{feedback-components.f6605b83.js → feedback-components.3d7fd2df.js} +83 -46
  5. package/dist/esm/feedback-components.3d7fd2df.js.map +1 -0
  6. package/dist/esm/{feedback-components.204f7d2b.js → feedback-components.47b7bf19.js} +49 -21
  7. package/dist/esm/feedback-components.47b7bf19.js.map +1 -0
  8. package/dist/esm/{feedback-components.d591ffec.css → feedback-components.5a8f0185.css} +11 -5
  9. package/dist/esm/feedback-components.5a8f0185.css.map +1 -0
  10. package/dist/esm/{feedback-components.1c15f37f.js → feedback-components.63a12d32.js} +14 -97
  11. package/dist/esm/feedback-components.63a12d32.js.map +1 -0
  12. package/dist/esm/{feedback-components.00434ff7.js → feedback-components.7c2fe400.js} +7 -1
  13. package/dist/esm/feedback-components.7c2fe400.js.map +1 -0
  14. package/dist/esm/{feedback-components.fd8ac9ca.js → feedback-components.a451f964.js} +116 -98
  15. package/dist/esm/feedback-components.a451f964.js.map +1 -0
  16. package/dist/esm/{feedback-components.d55a1d18.js → feedback-components.e068f453.js} +5 -5
  17. package/dist/esm/{feedback-components.d55a1d18.js.map → feedback-components.e068f453.js.map} +1 -1
  18. package/dist/esm/{feedback-components.28ba71be.js → feedback-components.e4935bf3.js} +7 -7
  19. package/dist/esm/feedback-components.e4935bf3.js.map +1 -0
  20. package/dist/esm/index.d.ts +2 -1
  21. package/dist/esm/index.d.ts.map +1 -1
  22. package/dist/esm/index.js +1 -1
  23. package/dist/node/feedback-components.2ad7d057.js +2 -0
  24. package/dist/node/feedback-components.2ad7d057.js.map +1 -0
  25. package/dist/node/feedback-components.441e2203.js +2 -0
  26. package/dist/node/feedback-components.441e2203.js.map +1 -0
  27. package/dist/node/{feedback-components.2f740fc7.js → feedback-components.67e60839.js} +2 -2
  28. package/dist/node/{feedback-components.2f740fc7.js.map → feedback-components.67e60839.js.map} +1 -1
  29. package/dist/node/feedback-components.76ed75d8.js +2 -0
  30. package/dist/node/feedback-components.76ed75d8.js.map +1 -0
  31. package/dist/node/feedback-components.827f8d80.js +2 -0
  32. package/dist/node/feedback-components.827f8d80.js.map +1 -0
  33. package/dist/node/feedback-components.8caef76e.js +2 -0
  34. package/dist/node/feedback-components.8caef76e.js.map +1 -0
  35. package/dist/node/feedback-components.c31cf831.js +2 -0
  36. package/dist/node/feedback-components.c31cf831.js.map +1 -0
  37. package/dist/node/feedback-components.ce5efb18.js +2 -0
  38. package/dist/node/feedback-components.ce5efb18.js.map +1 -0
  39. package/dist/node/feedback-components.db4d0a14.css +2 -0
  40. package/dist/node/feedback-components.db4d0a14.css.map +1 -0
  41. package/dist/node/index.js +1 -1
  42. package/dist/node/index.js.map +1 -1
  43. package/package.json +2 -2
  44. package/src/feedback/edit-state.ts +101 -49
  45. package/src/feedback/feedback.module.sass +9 -5
  46. package/src/feedback/graph.ts +5 -2
  47. package/src/feedback/index.ts +30 -4
  48. package/src/feedback/matches.ts +125 -87
  49. package/src/feedback/text-visualizer.ts +32 -86
  50. package/src/feedback/typelist.ts +13 -4
  51. package/dist/esm/feedback-components.00434ff7.js.map +0 -1
  52. package/dist/esm/feedback-components.1c15f37f.js.map +0 -1
  53. package/dist/esm/feedback-components.204f7d2b.js.map +0 -1
  54. package/dist/esm/feedback-components.28ba71be.js.map +0 -1
  55. package/dist/esm/feedback-components.7e879290.js.map +0 -1
  56. package/dist/esm/feedback-components.d591ffec.css.map +0 -1
  57. package/dist/esm/feedback-components.f6605b83.js.map +0 -1
  58. package/dist/esm/feedback-components.fd8ac9ca.js.map +0 -1
  59. package/dist/node/feedback-components.0eef8d0c.js +0 -2
  60. package/dist/node/feedback-components.0eef8d0c.js.map +0 -1
  61. package/dist/node/feedback-components.41db283a.js +0 -2
  62. package/dist/node/feedback-components.41db283a.js.map +0 -1
  63. package/dist/node/feedback-components.69d0ccd0.js +0 -2
  64. package/dist/node/feedback-components.69d0ccd0.js.map +0 -1
  65. package/dist/node/feedback-components.a7b43cfa.js +0 -2
  66. package/dist/node/feedback-components.a7b43cfa.js.map +0 -1
  67. package/dist/node/feedback-components.b9317f9c.js +0 -2
  68. package/dist/node/feedback-components.b9317f9c.js.map +0 -1
  69. package/dist/node/feedback-components.e096504e.css +0 -2
  70. package/dist/node/feedback-components.e096504e.css.map +0 -1
  71. package/dist/node/feedback-components.e140ac86.js +0 -2
  72. package/dist/node/feedback-components.e140ac86.js.map +0 -1
  73. package/dist/node/feedback-components.f8373b58.js +0 -2
  74. package/dist/node/feedback-components.f8373b58.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. The format
4
4
  is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
5
5
  project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [1.1.6] - 2025-07-24
8
+
9
+ - Fix view and match glitches
10
+
11
+ ## [1.1.5] - 2025-07-24
12
+
13
+ - Simplified match logic
14
+ - Added view only mode
15
+
7
16
  ## [1.1.4] - 2025-07-16
8
17
 
9
18
  - Add and remove match feature added
@@ -1,5 +1,5 @@
1
- import "./feedback-components.d591ffec.css";
2
- import $7mcWh$feedbackcomponents00434ff7js from "./feedback-components.00434ff7.js";
1
+ import "./feedback-components.5a8f0185.css";
2
+ import $7mcWh$feedbackcomponents7c2fe400js from "./feedback-components.7c2fe400.js";
3
3
  import {getTagStyle as $03d8811e9c9b360d$export$35baa338324d8550} from "./feedback-components.707e3490.js";
4
4
  import $7mcWh$macrostrathyper from "@macrostrat/hyper";
5
5
  import {useState as $7mcWh$useState} from "react";
@@ -18,8 +18,8 @@ function $parcel$interopDefault(a) {
18
18
 
19
19
 
20
20
 
21
- const $18030469a9425911$var$h = (0, $7mcWh$macrostrathyper).styled((0, ($parcel$interopDefault($7mcWh$feedbackcomponents00434ff7js))));
22
- function $18030469a9425911$export$9ebd91d75ddb6a8b({ types: types, selected: selected, dispatch: dispatch, selectedNodes: selectedNodes, tree: tree }) {
21
+ const $18030469a9425911$var$h = (0, $7mcWh$macrostrathyper).styled((0, ($parcel$interopDefault($7mcWh$feedbackcomponents7c2fe400js))));
22
+ function $18030469a9425911$export$9ebd91d75ddb6a8b({ types: types, selected: selected, dispatch: dispatch, selectedNodes: selectedNodes, tree: tree, viewOnly: viewOnly }) {
23
23
  const [selectedType, setSelectedType] = (0, $7mcWh$useState)(null);
24
24
  const isSelectedNodes = selectedNodes.length > 0;
25
25
  const darkMode = (0, $7mcWh$useInDarkMode)();
@@ -32,12 +32,13 @@ function $18030469a9425911$export$9ebd91d75ddb6a8b({ types: types, selected: sel
32
32
  selectedType: selectedType,
33
33
  setSelectedType: setSelectedType,
34
34
  dispatch: dispatch,
35
+ viewOnly: viewOnly,
35
36
  tree: tree,
36
37
  selectedNodes: selectedNodes,
37
38
  selected: selected,
38
39
  isSelectedNodes: isSelectedNodes
39
40
  }))),
40
- $18030469a9425911$var$h($18030469a9425911$var$AddType, {
41
+ $18030469a9425911$var$h.if(!viewOnly)($18030469a9425911$var$AddType, {
41
42
  dispatch: dispatch
42
43
  })
43
44
  ]);
@@ -170,7 +171,7 @@ function $18030469a9425911$var$TypeOverlay({ setOverlayOpen: setOverlayOpen, ove
170
171
  }, "Save changes")
171
172
  ])));
172
173
  }
173
- function $18030469a9425911$var$TypeTag({ type: type, luminance: luminance, selectedType: selectedType, setSelectedType: setSelectedType, dispatch: dispatch, tree: tree, selectedNodes: selectedNodes, selected: selected, isSelectedNodes: isSelectedNodes }) {
174
+ function $18030469a9425911$var$TypeTag({ type: type, luminance: luminance, selectedType: selectedType, setSelectedType: setSelectedType, dispatch: dispatch, tree: tree, selectedNodes: selectedNodes, selected: selected, isSelectedNodes: isSelectedNodes, viewOnly: viewOnly }) {
174
175
  const { color: color, name: name, id: id, description: description } = type;
175
176
  const darkMode = (0, $7mcWh$useInDarkMode)();
176
177
  const isSelected = id === selected?.id && selectedNodes.length > 0;
@@ -248,14 +249,14 @@ function $18030469a9425911$var$TypeTag({ type: type, luminance: luminance, selec
248
249
  }, $18030469a9425911$var$h("div.type-tag", {
249
250
  onClick: handleTagClick,
250
251
  style: {
251
- cursor: ids.length > 0 || isSelectedNodes && !selectedType ? "pointer" : "",
252
+ cursor: (ids.length > 0 || isSelectedNodes && !selectedType) && !viewOnly ? "pointer" : "",
252
253
  color: "black",
253
254
  backgroundColor: style.backgroundColor,
254
255
  border: isSelected ? `1px solid var(--text-emphasized-color)` : `1px solid var(--background-color)`
255
256
  }
256
257
  }, $18030469a9425911$var$h("div.type-container", [
257
258
  $18030469a9425911$var$h("div.type-name", name),
258
- $18030469a9425911$var$h("div.icons", [
259
+ $18030469a9425911$var$h.if(!viewOnly)("div.icons", [
259
260
  $18030469a9425911$var$h($18030469a9425911$var$EditType, {
260
261
  dispatch: dispatch,
261
262
  type: type
@@ -283,4 +284,4 @@ function $18030469a9425911$var$TypeTag({ type: type, luminance: luminance, selec
283
284
 
284
285
 
285
286
  export {$18030469a9425911$export$9ebd91d75ddb6a8b as TypeList};
286
- //# sourceMappingURL=feedback-components.7e879290.js.map
287
+ //# sourceMappingURL=feedback-components.03f08dc7.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/feedback-components/src/feedback/typelist.ts"],"sourcesContent":["import styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\n\nimport { getTagStyle } from \"../extractions\";\nimport { useState } from \"react\";\nimport { Icon, Popover, Overlay2 } from \"@blueprintjs/core\";\nimport { SaveButton } from \"@macrostrat/ui-components\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { ColorPicker } from \"@macrostrat/data-sheet\";\n\nconst h = hyper.styled(styles);\n\nexport function TypeList({\n types,\n selected,\n dispatch,\n selectedNodes,\n tree,\n viewOnly,\n}) {\n const [selectedType, setSelectedType] = useState(null);\n const isSelectedNodes = selectedNodes.length > 0;\n const darkMode = useInDarkMode();\n const luminance = darkMode ? 0.9 : 0.4;\n\n return h(\"div.type-list-container\", [\n h(\n \"div.type-list-header\",\n isSelectedNodes && !selectedType\n ? \"Change selected nodes to:\"\n : \"Entity Types\",\n ),\n h(\n \"div.type-list\",\n Array.from(types.values()).map((type) =>\n h(TypeTag, {\n type,\n luminance,\n selectedType,\n setSelectedType,\n dispatch,\n viewOnly,\n tree,\n selectedNodes,\n selected,\n isSelectedNodes,\n }),\n ),\n ),\n h.if(!viewOnly)(AddType, { dispatch }),\n ]);\n}\n\nfunction collectMatchingIds(tree, id) {\n const ids = [];\n\n function traverse(node) {\n if (node.type.id === id) {\n ids.push(node.id);\n }\n if (Array.isArray(node.children)) {\n node.children.forEach(traverse);\n }\n }\n\n tree.forEach(traverse);\n return ids;\n}\n\nfunction AddType({ dispatch }) {\n const [overlayOpen, setOverlayOpen] = useState(false);\n\n const saveHandler = (payload) => {\n dispatch({\n type: \"add-entity-type\",\n payload,\n });\n setOverlayOpen(false);\n };\n\n return h(\"div.add-type-container\", [\n h(\"div.add-type\", { onClick: () => setOverlayOpen(true) }, [\n h(\"p.add-type-text\", \"Add new type\"),\n h(Icon, { icon: \"plus\" }),\n ]),\n h(TypeOverlay, {\n setOverlayOpen,\n overlayOpen,\n title: \"Add New Type\",\n saveHandler,\n }),\n ]);\n}\n\nfunction EditType({ dispatch, type }) {\n const [editorOpen, setEditorOpen] = useState(false);\n\n const saveHandler = (payload) => {\n dispatch({\n type: \"update-entity-type\",\n payload,\n });\n setEditorOpen(false);\n };\n\n return h(\"div.edit-type\", [\n h(Icon, {\n icon: \"edit\",\n className: \"edit-icon\",\n onClick: (e) => {\n e.stopPropagation();\n setEditorOpen(true);\n },\n }),\n h(TypeOverlay, {\n setOverlayOpen: setEditorOpen,\n overlayOpen: editorOpen,\n originalType: type,\n title: \"Edit Type\",\n saveHandler,\n }),\n ]);\n}\n\nfunction TypeOverlay({\n setOverlayOpen,\n overlayOpen,\n originalType,\n title,\n saveHandler,\n}) {\n const { name, description, color, id } = originalType || {};\n\n const [nameInput, setNameInput] = useState(name || \"\");\n const [descriptionInput, setDescriptionInput] = useState(description || \"\");\n const [colorInput, setColorInput] = useState(color || \"#fff\");\n\n return h(\n Overlay2,\n {\n isOpen: overlayOpen,\n },\n h(\n \"div.overlay-container\",\n h(\"div.add-type-overlay\", [\n h(\"h2.title\", [\n title,\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(\"div.text-inputs\", [\n h(\"div.form-field.name\", [\n h(\"p.label\", \"Name\"),\n h(\"input\", {\n type: \"text\",\n placeholder: \"Enter type name\",\n onChange: (e) => setNameInput(e.target.value),\n value: nameInput,\n }),\n ]),\n h(\"div.form-field.form-description\", [\n h(\"p.label\", \"Description\"),\n h(\"input\", {\n type: \"text\",\n placeholder: \"Enter type description\",\n onChange: (e) => setDescriptionInput(e.target.value),\n value: descriptionInput,\n }),\n ]),\n ]),\n h(\"div.form-field.color\", [\n h(\"p.label\", \"Color\"),\n h(ColorPicker, {\n value: colorInput,\n onChange: (color) => setColorInput(color),\n style: { width: \"100%\" },\n }),\n ]),\n ]),\n h(\n SaveButton,\n {\n className: \"save-btn\",\n small: true,\n onClick: () =>\n saveHandler({\n name: nameInput,\n description: descriptionInput,\n color: colorInput,\n id,\n }),\n },\n \"Save changes\",\n ),\n ]),\n ),\n );\n}\n\nfunction TypeTag({\n type,\n luminance,\n selectedType,\n setSelectedType,\n dispatch,\n tree,\n selectedNodes,\n selected,\n isSelectedNodes,\n viewOnly,\n}) {\n const { color, name, id, description } = type;\n const darkMode = useInDarkMode();\n const isSelected = id === selected?.id && selectedNodes.length > 0;\n\n const style = getTagStyle(color, {\n active: isSelected,\n highlighted: selectedNodes.length === 0,\n });\n\n const payload = {\n id,\n name,\n color,\n description,\n };\n\n const ids = collectMatchingIds(tree, id);\n\n const handleTagClick = () => {\n if (!isSelectedNodes && selectedType === null) {\n if (ids.length > 0) {\n setSelectedType(type);\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n }\n } else if (isSelectedNodes && selectedType === null) {\n if (id === selected?.id && selectedNodes.length > 0) {\n dispatch({\n type: \"toggle-node-selected\",\n payload: { ids: selectedNodes },\n });\n } else {\n dispatch({ type: \"select-entity-type\", payload });\n }\n } else if (isSelectedNodes && selectedType.id === id) {\n setSelectedType(null);\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n } else if (isSelectedNodes && selectedType.id !== id) {\n if (ids.length > 0) {\n setSelectedType(type);\n const oldIds = collectMatchingIds(tree, selectedType.id);\n\n dispatch({ type: \"toggle-node-selected\", payload: { ids: oldIds } });\n dispatch({ type: \"toggle-node-selected\", payload: { ids } });\n }\n } else {\n console.warn(\"Unexpected state in TypeTag click handler\", {\n isSelectedNodes,\n selectedType,\n selectedNodes,\n ids,\n id,\n selected,\n });\n }\n };\n\n return h(\n Popover,\n {\n autoFocus: false,\n content: h(\"div.description\", description || \"No description available\"),\n interactionKind: \"hover\",\n },\n h(\n \"div.type-tag\",\n {\n onClick: handleTagClick,\n style: {\n cursor:\n (ids.length > 0 || (isSelectedNodes && !selectedType)) && !viewOnly\n ? \"pointer\"\n : \"\",\n color: \"black\",\n backgroundColor: style.backgroundColor,\n border: isSelected\n ? `1px solid var(--text-emphasized-color)`\n : `1px solid var(--background-color)`,\n },\n },\n h(\"div.type-container\", [\n h(\"div.type-name\", name),\n h.if(!viewOnly)(\"div.icons\", [\n h(EditType, {\n dispatch,\n type,\n }),\n h(Icon, {\n icon: \"cross\",\n className: \"delete-type-icon\",\n style: { color: \"red\", cursor: \"pointer\" },\n onClick: (e) => {\n e.stopPropagation();\n dispatch({\n type: \"delete-entity-type\",\n payload: { id },\n });\n },\n }),\n ]),\n ]),\n ),\n );\n}\n"],"names":[],"version":3,"file":"feedback-components.03f08dc7.js.map"}
@@ -8,7 +8,7 @@ var $b79bf29960412ca7$export$53ec42062883b2d4 = /*#__PURE__*/ function(ViewMode)
8
8
  ViewMode["Graph"] = "graph";
9
9
  return ViewMode;
10
10
  }({});
11
- function $b79bf29960412ca7$export$911bb4b9c8065d3d(initialTree, entityTypes) {
11
+ function $b79bf29960412ca7$export$911bb4b9c8065d3d(initialTree, entityTypes, viewOnly, matchMode) {
12
12
  // Get the first entity type
13
13
  // issue: grabs second entity instead of selected one
14
14
  const type = entityTypes.values().next().value;
@@ -20,7 +20,9 @@ function $b79bf29960412ca7$export$911bb4b9c8065d3d(initialTree, entityTypes) {
20
20
  selectedEntityType: type,
21
21
  lastInternalId: 0,
22
22
  isSelectingEntityType: false,
23
- viewMode: "tree"
23
+ viewMode: "tree",
24
+ viewOnly: viewOnly,
25
+ matchMode: matchMode
24
26
  });
25
27
  }
26
28
  const $b79bf29960412ca7$export$e5ce04c5b3f58533 = (0, $abOVY$createContext)(null);
@@ -30,6 +32,16 @@ function $b79bf29960412ca7$export$e1068f2d1c68f87e() {
30
32
  return dispatch;
31
33
  }
32
34
  function $b79bf29960412ca7$var$treeReducer(state, action) {
35
+ if (action.type === "toggle-match-mode") return {
36
+ ...state,
37
+ matchMode: !state.matchMode
38
+ };
39
+ if (action.type === "toggle-view-only") return {
40
+ ...state,
41
+ viewOnly: !state.viewOnly
42
+ };
43
+ if (state.viewOnly) return $b79bf29960412ca7$var$viewMode(state, action);
44
+ if (state.matchMode) return $b79bf29960412ca7$var$matchMode(state, action);
33
45
  switch(action.type){
34
46
  case "add-entity-type":
35
47
  {
@@ -191,49 +203,6 @@ function $b79bf29960412ca7$var$treeReducer(state, action) {
191
203
  selectedNodes: []
192
204
  };
193
205
  }
194
- case "add-match":
195
- {
196
- const { id: id } = action.payload;
197
- // Find the node path
198
- const keyPath = $b79bf29960412ca7$var$findNode(state.tree, id);
199
- if (!keyPath) {
200
- console.warn(`Node with id ${id} not found`);
201
- return state;
202
- }
203
- // Build update spec to set the `match` property
204
- const matchUpdateSpec = $b79bf29960412ca7$var$buildNestedSpec(keyPath, {
205
- match: {
206
- $set: action.payload.payload
207
- }
208
- });
209
- const updatedTree = (0, $abOVY$immutabilityhelper)(state.tree, matchUpdateSpec);
210
- return {
211
- ...state,
212
- tree: updatedTree
213
- };
214
- }
215
- case "remove-match":
216
- {
217
- const { id: id } = action.payload;
218
- console.log("Removing match for node with id:", id);
219
- // Find the node path
220
- const keyPath = $b79bf29960412ca7$var$findNode(state.tree, id);
221
- if (!keyPath) {
222
- console.warn(`Node with id ${id} not found`);
223
- return state;
224
- }
225
- // Build update spec to unset the `match` property
226
- const matchUpdateSpec = $b79bf29960412ca7$var$buildNestedSpec(keyPath, {
227
- match: {
228
- $set: null
229
- }
230
- });
231
- const updatedTree = (0, $abOVY$immutabilityhelper)(state.tree, matchUpdateSpec);
232
- return {
233
- ...state,
234
- tree: updatedTree
235
- };
236
- }
237
206
  /** Entity type selection */ case "toggle-entity-type-selector":
238
207
  return {
239
208
  ...state,
@@ -405,7 +374,75 @@ function $b79bf29960412ca7$var$flattenAndSort(nodes) {
405
374
  // sort by start
406
375
  return result.sort((a, b)=>a.indices[0] - b.indices[0]);
407
376
  }
377
+ function $b79bf29960412ca7$var$matchMode(state, action) {
378
+ if (action.type === "select-node" || action.type === "toggle-node-selected") {
379
+ const { ids: ids } = action.payload;
380
+ if (ids.length != 1) return state;
381
+ if (state.selectedNodes.length === 1) {
382
+ if (ids[0] === state.selectedNodes[0]) // If the selected node is the same as the current selection, deselect it
383
+ return {
384
+ ...state,
385
+ selectedNodes: []
386
+ };
387
+ }
388
+ const type = action.payload.ids.length > 0 ? $b79bf29960412ca7$export$e64eb58334357825(state.tree, ids[0])?.type : null;
389
+ return {
390
+ ...state,
391
+ selectedNodes: ids,
392
+ selectedEntityType: type
393
+ };
394
+ }
395
+ if (action.type === "add-match") {
396
+ const { id: id } = action.payload;
397
+ // Find the node path
398
+ const keyPath = $b79bf29960412ca7$var$findNode(state.tree, id);
399
+ if (!keyPath) {
400
+ console.warn(`Node with id ${id} not found`);
401
+ return state;
402
+ }
403
+ // Build update spec to set the `match` property
404
+ const matchUpdateSpec = $b79bf29960412ca7$var$buildNestedSpec(keyPath, {
405
+ match: {
406
+ $set: action.payload.payload
407
+ }
408
+ });
409
+ const updatedTree = (0, $abOVY$immutabilityhelper)(state.tree, matchUpdateSpec);
410
+ return {
411
+ ...state,
412
+ tree: updatedTree
413
+ };
414
+ }
415
+ if (action.type === "remove-match") {
416
+ const { id: id } = action.payload;
417
+ console.log("Removing match for node with id:", id);
418
+ // Find the node path
419
+ const keyPath = $b79bf29960412ca7$var$findNode(state.tree, id);
420
+ if (!keyPath) {
421
+ console.warn(`Node with id ${id} not found`);
422
+ return state;
423
+ }
424
+ // Build update spec to unset the `match` property
425
+ const matchUpdateSpec = $b79bf29960412ca7$var$buildNestedSpec(keyPath, {
426
+ match: {
427
+ $set: null
428
+ }
429
+ });
430
+ const updatedTree = (0, $abOVY$immutabilityhelper)(state.tree, matchUpdateSpec);
431
+ return {
432
+ ...state,
433
+ tree: updatedTree
434
+ };
435
+ }
436
+ return state;
437
+ }
438
+ function $b79bf29960412ca7$var$viewMode(state, action) {
439
+ if (action.type === "set-view-mode") return {
440
+ ...state,
441
+ viewMode: action.payload
442
+ };
443
+ return state;
444
+ }
408
445
 
409
446
 
410
447
  export {$b79bf29960412ca7$export$53ec42062883b2d4 as ViewMode, $b79bf29960412ca7$export$911bb4b9c8065d3d as useUpdatableTree, $b79bf29960412ca7$export$e5ce04c5b3f58533 as TreeDispatchContext, $b79bf29960412ca7$export$e1068f2d1c68f87e as useTreeDispatch, $b79bf29960412ca7$export$e64eb58334357825 as findNodeById, $b79bf29960412ca7$export$8d9dbb7a64bf2a5e as treeToGraph};
411
- //# sourceMappingURL=feedback-components.f6605b83.js.map
448
+ //# sourceMappingURL=feedback-components.3d7fd2df.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/feedback-components/src/feedback/edit-state.ts"],"sourcesContent":["import { TreeData } from \"./types\";\nimport { createContext, Dispatch, useContext, useReducer } from \"react\";\nimport update, { Spec } from \"immutability-helper\";\nimport { EntityType } from \"../extractions/types\";\n\nexport enum ViewMode {\n Tree = \"tree\",\n Graph = \"graph\",\n}\n\ninterface TreeState {\n initialTree: TreeData[];\n tree: TreeData[];\n selectedNodes: number[];\n entityTypesMap: Map<number, EntityType>;\n selectedEntityType: EntityType;\n lastInternalId: number;\n isSelectingEntityType: boolean;\n viewMode: ViewMode;\n viewOnly: boolean;\n matchMode: boolean;\n}\n\ntype TextRange = {\n start: number;\n end: number;\n text: string;\n};\n\ntype TreeAction =\n | {\n type: \"move-node\";\n payload: { dragIds: number[]; parentId: number; index: number };\n }\n | { type: \"delete-node\"; payload: { ids: number[] } }\n | { type: \"select-node\"; payload: { ids: number[] } }\n | { type: \"toggle-node-selected\"; payload: { ids: number[] } }\n | { type: \"set-view-mode\"; payload: ViewMode }\n | { type: \"create-node\"; payload: TextRange }\n | { type: \"select-entity-type\"; payload: EntityType }\n | { type: \"toggle-entity-type-selector\"; payload?: boolean | null }\n | { type: \"deselect\" }\n | { type: \"reset\" }\n | { type: \"delete-entity-type\"; payload: { id: number } }\n | {\n type: \"add-entity-type\";\n payload: { name: string; description: string; color: string };\n }\n | {\n type: \"update-entity-type\";\n payload: { id: number; name: string; description: string; color: string };\n }\n | { type: \"select-range\"; payload: { ids: number[] } }\n | { type: \"add-match\"; payload: { id: number; payload: any } }\n | { type: \"remove-match\"; payload: { id: number } }\n | { type: \"toggle-match-mode\" }\n | { type: \"toggle-view-only\" };\n\nexport type TreeDispatch = Dispatch<TreeAction>;\n\nexport function useUpdatableTree(\n initialTree: TreeData[],\n entityTypes: Map<number, EntityType>,\n viewOnly: boolean,\n matchMode: boolean,\n): [TreeState, TreeDispatch] {\n // Get the first entity type\n // issue: grabs second entity instead of selected one\n const type = entityTypes.values().next().value;\n\n return useReducer(treeReducer, {\n initialTree,\n tree: initialTree,\n selectedNodes: [],\n entityTypesMap: entityTypes,\n selectedEntityType: type,\n lastInternalId: 0,\n isSelectingEntityType: false,\n viewMode: ViewMode.Tree,\n viewOnly,\n matchMode,\n });\n}\n\nexport const TreeDispatchContext = createContext<TreeDispatch | null>(null);\n\nexport function useTreeDispatch() {\n const dispatch = useContext(TreeDispatchContext);\n if (dispatch == null) {\n throw new Error(\"No dispatch context available\");\n }\n return dispatch;\n}\n\nfunction treeReducer(state: TreeState, action: TreeAction) {\n if (action.type === \"toggle-match-mode\") {\n return { ...state, matchMode: !state.matchMode };\n }\n\n if (action.type === \"toggle-view-only\") {\n return { ...state, viewOnly: !state.viewOnly };\n }\n\n if (state.viewOnly) return viewMode(state, action);\n\n if (state.matchMode) return matchMode(state, action);\n\n switch (action.type) {\n case \"add-entity-type\": {\n // Add a new entity type to the map\n const { name, description, color } = action.payload;\n const newId = state.lastInternalId - 1;\n const newType: EntityType = {\n id: newId,\n name,\n description: description === \"\" ? null : description,\n color,\n };\n\n const newEntityTypesMap = new Map(state.entityTypesMap);\n newEntityTypesMap.set(newId, newType);\n\n return {\n ...state,\n entityTypesMap: newEntityTypesMap,\n selectedEntityType: newType,\n lastInternalId: newId,\n };\n }\n case \"update-entity-type\": {\n // Update an existing entity type in the map\n const { id, name, description, color } = action.payload;\n const newEntityTypesMap = new Map(state.entityTypesMap);\n const oldType = newEntityTypesMap.get(id);\n\n if (!oldType) {\n console.warn(`Entity type with id ${id} not found`);\n return state;\n }\n\n const updatedType: EntityType = {\n ...oldType,\n name,\n description: description === \"\" ? null : description,\n color,\n };\n\n newEntityTypesMap.set(id, updatedType);\n\n // Update the tree to reflect the new type\n const newTree = updateTreeTypes(state.tree, oldType, updatedType);\n\n return {\n ...state,\n tree: newTree,\n entityTypesMap: newEntityTypesMap,\n selectedEntityType: updatedType,\n };\n }\n case \"select-range\":\n // Select a range of nodes by their IDs\n const payloadIds = action.payload.ids;\n const node1 = payloadIds[0];\n const node2 = payloadIds[1];\n\n // make list of nodes in order\n const allNodes = flattenAndSort(state.tree);\n\n // select all nodes between node1 and node2\n const startIndex = allNodes.findIndex((node) => node.id === node1);\n const endIndex = allNodes.findIndex((node) => node.id === node2);\n\n const selectedNodes = allNodes.slice(startIndex, endIndex + 1);\n\n console.log(\"Selecting range:\", selectedNodes);\n return {\n ...state,\n selectedNodes: selectedNodes.map((node) => node.id),\n };\n\n case \"move-node\":\n // For each node in the tree, if the node is in the dragIds, remove it from the tree and collect it\n const [newTree, removedNodes] = removeNodes(\n state.tree,\n action.payload.dragIds,\n );\n\n let keyPath: (number | \"children\")[] = [];\n if (action.payload.parentId) {\n keyPath = findNode(newTree, action.payload.parentId);\n keyPath.push(\"children\");\n }\n\n // Add removed nodes to the new tree at the correct location\n let updateSpec = buildNestedSpec(keyPath, {\n $splice: [[action.payload.index, 0, ...removedNodes]],\n });\n\n return { ...state, tree: update(newTree, updateSpec) };\n case \"delete-node\":\n // For each node in the tree, if the node is in the ids, remove it from the tree\n const [newTree2, _removedNodes] = removeNodes(\n state.tree,\n action.payload.ids,\n );\n // Get children of the removed nodes\n // If children are not present elsewhere in the tree, insert them\n\n const children = _removedNodes\n .flatMap((node) => node.children ?? [])\n .filter((child) => !nodeIsInTree(newTree2, child.id));\n\n // Reset the selection\n\n return {\n ...state,\n tree: [...newTree2, ...children],\n selectedNodes: state.selectedNodes.filter(\n (id) => !action.payload.ids.includes(id),\n ),\n };\n case \"select-node\":\n const { ids } = action.payload;\n\n const type =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, ids[0])?.type\n : null;\n\n return { ...state, selectedNodes: ids, selectedEntityType: type };\n // otherwise fall through to toggle-node-selected for a single ID\n case \"toggle-node-selected\":\n const nodesToAdd = action.payload.ids.filter(\n (id) => !state.selectedNodes.includes(id),\n );\n const nodesToKeep = state.selectedNodes.filter(\n (id) => !action.payload.ids.includes(id),\n );\n\n const newType =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, action.payload.ids[0])?.type\n : null;\n\n return {\n ...state,\n selectedNodes: [...nodesToKeep, ...nodesToAdd],\n selectedEntityType: newType,\n };\n\n case \"create-node\":\n const newId = state.lastInternalId - 1;\n const { text, start, end } = action.payload;\n const node: TreeData = {\n id: newId,\n name: text,\n children: [],\n indices: [start, end],\n type: state.selectedEntityType,\n };\n\n return {\n ...state,\n tree: [...state.tree, node],\n selectedNodes: [newId],\n lastInternalId: newId,\n };\n\n case \"delete-entity-type\": {\n // Remove the entity type from the map\n const { id } = action.payload;\n const newEntityTypesMap = new Map(state.entityTypesMap);\n const oldType = newEntityTypesMap.get(id);\n newEntityTypesMap.delete(id);\n\n const defaultType = newEntityTypesMap.values().next().value;\n const newTree = updateTreeTypes(state.tree, oldType, defaultType);\n\n return {\n ...state,\n tree: newTree,\n entityTypesMap: newEntityTypesMap,\n selectedNodes: [],\n };\n }\n\n /** Entity type selection */\n case \"toggle-entity-type-selector\":\n return {\n ...state,\n isSelectingEntityType: action.payload ?? !state.isSelectingEntityType,\n };\n case \"select-entity-type\": {\n // For each selected node, update the type\n let newTree2 = state.tree;\n for (let id of state.selectedNodes) {\n const keyPath = findNode(state.tree, id);\n const nestedSpec = buildNestedSpec(keyPath, {\n type: { $set: action.payload },\n });\n newTree2 = update(newTree2, nestedSpec);\n }\n\n return {\n ...state,\n tree: newTree2,\n selectedEntityType: action.payload,\n };\n }\n case \"deselect\":\n return { ...state, selectedNodes: [] };\n case \"reset\":\n return {\n ...state,\n tree: state.initialTree,\n selectedNodes: [],\n };\n case \"set-view-mode\":\n return { ...state, viewMode: action.payload };\n }\n}\n\nfunction nodeIsInTree(tree: TreeData[], id: number): boolean {\n for (let node of tree) {\n if (node.id == id) {\n return true;\n } else if (node.children) {\n if (nodeIsInTree(node.children, id)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction buildNestedSpec(\n keyPath: (number | \"children\")[],\n innerSpec: Spec<any>,\n): Spec<TreeData[]> {\n // Build a nested object from a key path\n\n let spec = innerSpec;\n for (let i = keyPath.length - 1; i >= 0; i--) {\n spec = { [keyPath[i]]: spec };\n }\n return spec as any;\n // Since we don't have a \"children\" key at the root, we make the top-level spec an array\n}\n\nfunction findNode(\n tree: TreeData[],\n id: number,\n): (number | \"children\")[] | null {\n // Find the index of the node with the given id in the tree, returning the key path\n for (let i = 0; i < tree.length; i++) {\n if (tree[i].id == id) {\n return [i];\n } else if (tree[i].children) {\n let path = findNode(tree[i].children, id);\n if (path != null) {\n return [i, \"children\", ...path];\n }\n }\n }\n return null;\n}\n\nfunction removeNodes(\n tree: TreeData[],\n ids: number[],\n): [TreeData[], TreeData[]] {\n /** Remove nodes with the given ids from the tree and return the new tree and the removed nodes */\n let newTree: TreeData[] = [];\n let removedNodes: TreeData[] = [];\n\n for (let node of tree) {\n if (ids.includes(node.id)) {\n removedNodes.push(node);\n } else {\n // Recurse into children\n if (node.children) {\n let [newChildren, removedChildren] = removeNodes(node.children, ids);\n node = { ...node, children: newChildren };\n removedNodes.push(...removedChildren);\n }\n newTree.push(node);\n }\n }\n\n return [newTree, removedNodes];\n}\n\nexport interface EntityOutput {\n id: number;\n type: number | null;\n txt_range: number[][];\n name: string;\n match: any | null;\n reasoning: string | null;\n color: string | null;\n children: any[] | null;\n}\n\nexport interface GraphData {\n nodes: EntityOutput[];\n edges: { source: number; dest: number }[];\n}\n\nexport function treeToGraph(tree: TreeData[]): GraphData {\n // Convert the tree to a graph\n let nodes: EntityOutput[] = [];\n let edges: { source: number; dest: number }[] = [];\n const nodeMap = new Map<number, TreeData>();\n\n for (let node of tree) {\n // If we've already found an instance of this node, we don't need to record\n // it again\n if (nodeMap.has(node.id)) {\n continue;\n }\n\n const { indices, id, name, type, children } = node;\n\n const nodeData: EntityOutput = {\n id,\n type: type.id,\n color: type.color,\n name,\n txt_range: [indices],\n reasoning: null,\n match: node.match,\n children,\n };\n\n nodeMap.set(node.id, node);\n nodes.push(nodeData);\n\n if (node.children) {\n for (let child of node.children) {\n edges.push({ source: node.id, dest: child.id });\n }\n\n // Now process the children\n const { nodes: childNodes, edges: childEdges } = treeToGraph(\n node.children,\n );\n nodes.push(...childNodes);\n edges.push(...childEdges);\n }\n }\n\n return { nodes, edges };\n}\n\nexport function findNodeById(tree, id) {\n for (const node of tree) {\n if (node.id === id) {\n return node;\n }\n if (node.children) {\n const found = findNodeById(node.children, id);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction updateTreeTypes(tree, oldType, defaultType) {\n return tree.map((node) => updateNodeType(node, oldType, defaultType));\n}\n\nfunction updateNodeType(node, oldType, defaultType) {\n const type = node.type.id === oldType.id ? defaultType : node.type;\n\n return {\n ...node,\n type,\n children: node.children\n ? updateTreeTypes(node.children, oldType, defaultType)\n : [],\n };\n}\n\nfunction flattenAndSort(nodes) {\n const result = [];\n\n function traverse(nodeList) {\n for (const node of nodeList) {\n result.push(node);\n if (Array.isArray(node.children) && node.children.length > 0) {\n traverse(node.children);\n }\n }\n }\n\n traverse(nodes);\n\n // sort by start\n return result.sort((a, b) => a.indices[0] - b.indices[0]);\n}\n\nfunction matchMode(state, action) {\n if (action.type === \"select-node\" || action.type === \"toggle-node-selected\") {\n const { ids } = action.payload;\n\n if (ids.length != 1) return state;\n\n if (state.selectedNodes.length === 1) {\n if (ids[0] === state.selectedNodes[0]) {\n // If the selected node is the same as the current selection, deselect it\n return { ...state, selectedNodes: [] };\n }\n }\n\n const type =\n action.payload.ids.length > 0\n ? findNodeById(state.tree, ids[0])?.type\n : null;\n\n return { ...state, selectedNodes: ids, selectedEntityType: type };\n }\n\n if (action.type === \"add-match\") {\n const { id } = action.payload;\n\n // Find the node path\n const keyPath = findNode(state.tree, id);\n if (!keyPath) {\n console.warn(`Node with id ${id} not found`);\n return state;\n }\n\n // Build update spec to set the `match` property\n const matchUpdateSpec = buildNestedSpec(keyPath, {\n match: { $set: action.payload.payload },\n });\n\n const updatedTree = update(state.tree, matchUpdateSpec);\n\n return {\n ...state,\n tree: updatedTree,\n };\n }\n\n if (action.type === \"remove-match\") {\n const { id } = action.payload;\n\n console.log(\"Removing match for node with id:\", id);\n\n // Find the node path\n const keyPath = findNode(state.tree, id);\n if (!keyPath) {\n console.warn(`Node with id ${id} not found`);\n return state;\n }\n\n // Build update spec to unset the `match` property\n const matchUpdateSpec = buildNestedSpec(keyPath, {\n match: { $set: null },\n });\n\n const updatedTree = update(state.tree, matchUpdateSpec);\n\n return {\n ...state,\n tree: updatedTree,\n };\n }\n\n return state;\n}\n\nfunction viewMode(state, action) {\n if (action.type === \"set-view-mode\") {\n return { ...state, viewMode: action.payload };\n }\n\n return state;\n}\n"],"names":[],"version":3,"file":"feedback-components.3d7fd2df.js.map"}
@@ -1,13 +1,13 @@
1
- import "./feedback-components.d591ffec.css";
2
- import $bvJLP$feedbackcomponents00434ff7js from "./feedback-components.00434ff7.js";
3
- import $b6b9741bf83336eb$export$2e2bcd8739ae039 from "./feedback-components.d55a1d18.js";
4
- import {FeedbackText as $156a3efbc315814c$export$6e107db9091b8219} from "./feedback-components.1c15f37f.js";
1
+ import "./feedback-components.5a8f0185.css";
2
+ import $bvJLP$feedbackcomponents7c2fe400js from "./feedback-components.7c2fe400.js";
3
+ import $b6b9741bf83336eb$export$2e2bcd8739ae039 from "./feedback-components.e068f453.js";
4
+ import {FeedbackText as $156a3efbc315814c$export$6e107db9091b8219} from "./feedback-components.63a12d32.js";
5
5
  import {ModelInfo as $03d8811e9c9b360d$export$4eb2a0ce903ce967} from "./feedback-components.707e3490.js";
6
- import {TreeDispatchContext as $b79bf29960412ca7$export$e5ce04c5b3f58533, treeToGraph as $b79bf29960412ca7$export$8d9dbb7a64bf2a5e, useUpdatableTree as $b79bf29960412ca7$export$911bb4b9c8065d3d} from "./feedback-components.f6605b83.js";
6
+ import {TreeDispatchContext as $b79bf29960412ca7$export$e5ce04c5b3f58533, treeToGraph as $b79bf29960412ca7$export$8d9dbb7a64bf2a5e, useUpdatableTree as $b79bf29960412ca7$export$911bb4b9c8065d3d} from "./feedback-components.3d7fd2df.js";
7
7
  import {OmniboxSelector as $fda9ef5406c1cfb4$export$d8660660a589068c} from "./feedback-components.ad9f284e.js";
8
- import {GraphView as $ff8c3e7f2bc22925$export$6a7fe3ef90e8d566} from "./feedback-components.28ba71be.js";
9
- import {Matches as $a878a21b0c10bfdc$export$6479cfcac2b87c0} from "./feedback-components.fd8ac9ca.js";
10
- import {TypeList as $18030469a9425911$export$9ebd91d75ddb6a8b} from "./feedback-components.7e879290.js";
8
+ import {GraphView as $ff8c3e7f2bc22925$export$6a7fe3ef90e8d566} from "./feedback-components.e4935bf3.js";
9
+ import {Matches as $a878a21b0c10bfdc$export$6479cfcac2b87c0} from "./feedback-components.a451f964.js";
10
+ import {TypeList as $18030469a9425911$export$9ebd91d75ddb6a8b} from "./feedback-components.03f08dc7.js";
11
11
  import $bvJLP$macrostrathyper from "@macrostrat/hyper";
12
12
  import {Tree as $bvJLP$Tree} from "react-arborist";
13
13
  import {useState as $bvJLP$useState, useRef as $bvJLP$useRef, useCallback as $bvJLP$useCallback, useEffect as $bvJLP$useEffect} from "react";
@@ -34,7 +34,7 @@ function $parcel$interopDefault(a) {
34
34
 
35
35
 
36
36
 
37
- const $71d20dff35996763$var$h = (0, $bvJLP$macrostrathyper).styled((0, ($parcel$interopDefault($bvJLP$feedbackcomponents00434ff7js))));
37
+ const $71d20dff35996763$var$h = (0, $bvJLP$macrostrathyper).styled((0, ($parcel$interopDefault($bvJLP$feedbackcomponents7c2fe400js))));
38
38
  function $71d20dff35996763$var$setsAreTheSame(a, b) {
39
39
  if (a.size !== b.size) return false;
40
40
  for (const item of a){
@@ -42,16 +42,39 @@ function $71d20dff35996763$var$setsAreTheSame(a, b) {
42
42
  }
43
43
  return true;
44
44
  }
45
- function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], text: text, model: model, entityTypes: entityTypes, matchComponent: matchComponent, onSave: onSave, allowOverlap: allowOverlap, matchLinks: matchLinks }) {
45
+ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], text: text, model: model, entityTypes: entityTypes, matchComponent: matchComponent, onSave: onSave, allowOverlap: allowOverlap, matchLinks: matchLinks, view: view = false }) {
46
+ const [viewOnly, setViewOnly] = (0, $bvJLP$useState)(view);
47
+ const [match, setMatchLinks] = (0, $bvJLP$useState)(matchLinks);
48
+ const matchMode = match !== undefined;
46
49
  // Get the input arguments
47
- const [state, dispatch] = (0, $b79bf29960412ca7$export$911bb4b9c8065d3d)(entities.map($71d20dff35996763$var$processEntity), entityTypes);
48
- const [match, setMatchLinks] = (0, $bvJLP$useState)(matchLinks || {});
50
+ const [state, dispatch] = (0, $b79bf29960412ca7$export$911bb4b9c8065d3d)(entities.map($71d20dff35996763$var$processEntity), entityTypes, viewOnly, matchMode);
49
51
  const { selectedNodes: selectedNodes, tree: tree, selectedEntityType: selectedEntityType, isSelectingEntityType: isSelectingEntityType, entityTypesMap: entityTypesMap } = state;
50
52
  const [{ width: width, height: height }, ref] = (0, $bvJLP$useelementdimensions)();
51
53
  return $71d20dff35996763$var$h("div.page-wrapper", [
52
54
  $71d20dff35996763$var$h("div.feedback-container", $71d20dff35996763$var$h((0, $b79bf29960412ca7$export$e5ce04c5b3f58533).Provider, {
53
55
  value: dispatch
54
56
  }, [
57
+ $71d20dff35996763$var$h.if(!view)((0, $bvJLP$SegmentedControl), {
58
+ options: [
59
+ {
60
+ label: "View",
61
+ value: "view"
62
+ },
63
+ {
64
+ label: "Edit",
65
+ value: "edit"
66
+ }
67
+ ],
68
+ value: viewOnly ? "view" : "edit",
69
+ small: true,
70
+ onValueChange () {
71
+ setViewOnly(!viewOnly);
72
+ dispatch({
73
+ type: "toggle-view-only"
74
+ });
75
+ },
76
+ role: "toolbar"
77
+ }),
55
78
  $71d20dff35996763$var$h((0, $bvJLP$ErrorBoundary), {
56
79
  description: "An error occurred while rendering the feedback text component."
57
80
  }, $71d20dff35996763$var$h((0, $156a3efbc315814c$export$6e107db9091b8219), {
@@ -61,7 +84,8 @@ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], te
61
84
  nodes: tree,
62
85
  selectedNodes: selectedNodes,
63
86
  allowOverlap: allowOverlap,
64
- matchLinks: match
87
+ matchLinks: match,
88
+ viewOnly: viewOnly
65
89
  })),
66
90
  $71d20dff35996763$var$h((0, $bvJLP$FlexRow), {
67
91
  alignItems: "baseline",
@@ -108,7 +132,8 @@ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], te
108
132
  width: width,
109
133
  height: height,
110
134
  dispatch: dispatch,
111
- selectedNodes: selectedNodes
135
+ selectedNodes: selectedNodes,
136
+ viewOnly: viewOnly
112
137
  })
113
138
  ])
114
139
  ])),
@@ -116,7 +141,7 @@ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], te
116
141
  className: "control-panel"
117
142
  }, [
118
143
  $71d20dff35996763$var$h("div.control-content", [
119
- $71d20dff35996763$var$h((0, $bvJLP$ButtonGroup), {
144
+ $71d20dff35996763$var$h.if(!viewOnly)((0, $bvJLP$ButtonGroup), {
120
145
  vertical: true,
121
146
  fill: true,
122
147
  minimal: true,
@@ -138,7 +163,7 @@ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], te
138
163
  disabled: state.initialTree == state.tree
139
164
  }, "Save")
140
165
  ]),
141
- $71d20dff35996763$var$h((0, $a878a21b0c10bfdc$export$6479cfcac2b87c0), {
166
+ $71d20dff35996763$var$h.if(!viewOnly)((0, $a878a21b0c10bfdc$export$6479cfcac2b87c0), {
142
167
  match: match,
143
168
  setMatchLinks: setMatchLinks,
144
169
  matchLinks: matchLinks,
@@ -146,7 +171,7 @@ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], te
146
171
  tree: tree,
147
172
  dispatch: dispatch
148
173
  }),
149
- $71d20dff35996763$var$h((0, $bvJLP$Divider)),
174
+ $71d20dff35996763$var$h.if(!viewOnly)((0, $bvJLP$Divider)),
150
175
  $71d20dff35996763$var$h($71d20dff35996763$var$EntityTypeSelector, {
151
176
  entityTypes: entityTypesMap,
152
177
  selected: selectedEntityType,
@@ -163,7 +188,9 @@ function $71d20dff35996763$export$a90600c9da52b40c({ entities: entities = [], te
163
188
  setOpen: (isOpen)=>dispatch({
164
189
  type: "toggle-entity-type-selector",
165
190
  payload: isOpen
166
- })
191
+ }),
192
+ viewOnly: viewOnly,
193
+ matchMode: matchMode
167
194
  })
168
195
  ])
169
196
  ])
@@ -181,7 +208,7 @@ function $71d20dff35996763$var$processEntity(entity) {
181
208
  children: entity.children?.map($71d20dff35996763$var$processEntity) ?? []
182
209
  };
183
210
  }
184
- function $71d20dff35996763$var$EntityTypeSelector({ entityTypes: entityTypes, selected: selected, isOpen: isOpen, setOpen: setOpen, onChange: onChange, tree: tree, dispatch: dispatch, selectedNodes: selectedNodes = [] }) {
211
+ function $71d20dff35996763$var$EntityTypeSelector({ entityTypes: entityTypes, selected: selected, isOpen: isOpen, setOpen: setOpen, onChange: onChange, tree: tree, dispatch: dispatch, selectedNodes: selectedNodes = [], viewOnly: viewOnly, matchMode: matchMode }) {
185
212
  // Show all entity types when selected is null
186
213
  const _selected = selected != null ? selected : undefined;
187
214
  const [inputValue, setInputValue] = (0, $bvJLP$useState)("");
@@ -193,7 +220,8 @@ function $71d20dff35996763$var$EntityTypeSelector({ entityTypes: entityTypes, se
193
220
  selected: _selected,
194
221
  dispatch: dispatch,
195
222
  selectedNodes: selectedNodes,
196
- tree: tree
223
+ tree: tree,
224
+ viewOnly: viewOnly || matchMode
197
225
  }),
198
226
  $71d20dff35996763$var$h((0, $fda9ef5406c1cfb4$export$d8660660a589068c), {
199
227
  isOpen: isOpen,
@@ -326,4 +354,4 @@ function $71d20dff35996763$var$ManagedSelectionTree(props) {
326
354
 
327
355
 
328
356
  export {$71d20dff35996763$export$a90600c9da52b40c as FeedbackComponent, $b79bf29960412ca7$export$8d9dbb7a64bf2a5e as treeToGraph};
329
- //# sourceMappingURL=feedback-components.204f7d2b.js.map
357
+ //# sourceMappingURL=feedback-components.47b7bf19.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/feedback-components/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}) {\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 );\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 }),\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 { selectedNodes, dispatch, tree, height, width, matchComponent } =\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 }),\n [matchComponent],\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":[],"version":3,"file":"feedback-components.47b7bf19.js.map"}
@@ -39,7 +39,6 @@
39
39
  }
40
40
 
41
41
  circle {
42
- cursor: pointer;
43
42
  border: 1px solid #000;
44
43
  }
45
44
 
@@ -96,13 +95,16 @@ mark {
96
95
  }
97
96
 
98
97
  .QoX8-W_highlight {
99
- cursor: pointer;
100
98
  zIndex: 10;
101
99
  border-radius: .2em;
102
100
  padding: .2em 0;
103
101
  position: relative;
104
102
  }
105
103
 
104
+ .QoX8-W_clickable {
105
+ cursor: pointer;
106
+ }
107
+
106
108
  .QoX8-W_feedback-text-wrapper {
107
109
  z-index: 0;
108
110
  line-height: var(--text-line-height);
@@ -138,7 +140,7 @@ mark {
138
140
  }
139
141
 
140
142
  .QoX8-W_overlay-container .QoX8-W_add-type-overlay {
141
- background-color: var(--secondary-color);
143
+ background-color: var(--tertiary-background);
142
144
  border-radius: .2em;
143
145
  flex-direction: column;
144
146
  gap: 1em;
@@ -179,7 +181,6 @@ mark {
179
181
  }
180
182
 
181
183
  .QoX8-W_match-item {
182
- background-color: var(--background-color);
183
184
  color: var(--text-emphasized-color);
184
185
  cursor: pointer;
185
186
  border-radius: .2em;
@@ -187,6 +188,11 @@ mark {
187
188
  padding: .1em .2em;
188
189
  }
189
190
 
191
+ .QoX8-W_match-item .QoX8-W_match-label {
192
+ color: var(--text-color);
193
+ margin: 0;
194
+ }
195
+
190
196
  .QoX8-W_match-container {
191
197
  justify-content: space-between;
192
198
  align-items: center;
@@ -196,4 +202,4 @@ mark {
196
202
  .QoX8-W_match-container .QoX8-W_close-btn {
197
203
  cursor: pointer;
198
204
  }
199
- /*# sourceMappingURL=feedback-components.d591ffec.css.map */
205
+ /*# sourceMappingURL=feedback-components.5a8f0185.css.map */
@@ -0,0 +1 @@
1
+ {"mappings":"AAAA;;;;;AAIA;;;;;;;;AAOA;;;;AAGA;;;;;AAIA;;;;;AAIA;;;;;AAIE;;;;AAGF;;;;AAGA;;;;AAGA;;;;AAGA;;;;AAGA;;;;;;;;;;;;AAYA;;;;;AAIA;;;;;;;AAME;;;;;AAIF;;;;;AAIA;;;;;;AAKA;;;;AAGA;;;;;;;AAMA;;;;AAGA;;;;;;;AAMA;;;;;;;AAMA;;;;;;;;AAOE;;;;AAGF;;;;;;;;AAOE;;;;;;;;;AAQE;;;;;;AAKA;;;;AAGA;;;;;AAIE;;;;;;AAKN;;;;;AAIA;;;;;;AAKA;;;;;;;;AAOE;;;;;AAIF;;;;;;AAKE","sources":["packages/feedback-components/src/feedback/feedback.module.sass"],"sourcesContent":[":root\n --text-line-height: 3em\n --main-extra-width: 200px\n\n.page-wrapper\n display: flex\n flex-direction: row\n position: relative\n gap: 2em\n align-items: flex-start // makes control-content lose stick\n\n.feedback-container\n flex: 4\n\n.control-panel\n flex: 1\n height: auto\n\n.control-content\n position: sticky\n top: 0\n\n.feedback-component\n position: relative\n width: 800px\n\n & > svg\n width: 800px\n\n.node\n cursor: pointer\n\ncircle\n border: 1px solid black\n\n.selected\n border: 1px solid white\n \n.feedback-text\n margin-bottom: 2em\n\n.entity-panel\n position: relative\n max-height: 600px\n width: calc(100% - 2em)\n flex: 1\n min-height: 100px\n padding: 1em\n background: var(--panel-secondary-background-color)\n border-radius: 4px\n // Inset box shadow\n box-shadow: 0 0 0 1px var(--panel-border-color) inset\n\n.selection-tree\n margin: -1em 0\n padding: 1em 0\n \n.type-list\n display: grid\n grid-auto-flow: column\n grid-template-rows: repeat(10, auto)\n gap: 0.2em\n\n .type-tag\n padding: .2em .5em\n border-radius: .2em\n\n.description\n max-width: 300px\n padding: .5em\n\nmark\n border-radius: .2em\n cursor: pointer\n color: black !important\n\n[role=\"treeitem\"]\n width: auto !important\n\n.highlight\n padding: .2em 0\n border-radius: .2em\n position: relative\n zIndex: 10\n\n.clickable\n cursor: pointer\n\n.feedback-text-wrapper \n position: relative\n z-index: 0\n overflow: visible\n line-height: var(--text-line-height)\n\n.type-container\n display: flex\n justify-content: space-between\n align-items: center\n column-gap: 1em\n\n.add-type\n cursor: pointer\n display: flex\n justify-content: space-between\n padding: 0 .5em\n align-items: center\n\n p\n margin: 0\n\n.overlay-container\n height: 80vh\n width: 100vw\n display: flex\n justify-content: center\n align-items: center\n\n .add-type-overlay\n background-color: var(--tertiary-background)\n padding: .5em 1em\n display: flex\n flex-direction: column\n gap: 1em\n border-radius: .2em\n\n .title\n display: flex\n justify-content: space-between\n align-items: center\n\n h2\n margin: 0\n\n .form-group\n display: flex\n gap: 3em\n\n .text-inputs\n display: flex\n flex-direction: column\n gap: 1em\n\n.icons\n display: flex\n gap: .25em\n\n.node-label\n fill: var(--text-emphasized-color)\n fontSize: 10px\n pointerEvents: none\n\n.match-item\n color: var(--text-emphasized-color)\n padding: .1em .2em\n border-radius: .2em\n margin-bottom: 4px\n cursor: pointer\n \n .match-label\n margin: 0\n color: var(--text-color)\n\n.match-container\n display: flex\n justify-content: space-between\n align-items: center\n\n .close-btn\n cursor: pointer\n"],"names":[],"version":3,"file":"feedback-components.5a8f0185.css.map"}