@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.
- package/CHANGELOG.md +9 -0
- package/dist/esm/{feedback-components.7e879290.js → feedback-components.03f08dc7.js} +10 -9
- package/dist/esm/feedback-components.03f08dc7.js.map +1 -0
- package/dist/esm/{feedback-components.f6605b83.js → feedback-components.3d7fd2df.js} +83 -46
- package/dist/esm/feedback-components.3d7fd2df.js.map +1 -0
- package/dist/esm/{feedback-components.204f7d2b.js → feedback-components.47b7bf19.js} +49 -21
- package/dist/esm/feedback-components.47b7bf19.js.map +1 -0
- package/dist/esm/{feedback-components.d591ffec.css → feedback-components.5a8f0185.css} +11 -5
- package/dist/esm/feedback-components.5a8f0185.css.map +1 -0
- package/dist/esm/{feedback-components.1c15f37f.js → feedback-components.63a12d32.js} +14 -97
- package/dist/esm/feedback-components.63a12d32.js.map +1 -0
- package/dist/esm/{feedback-components.00434ff7.js → feedback-components.7c2fe400.js} +7 -1
- package/dist/esm/feedback-components.7c2fe400.js.map +1 -0
- package/dist/esm/{feedback-components.fd8ac9ca.js → feedback-components.a451f964.js} +116 -98
- package/dist/esm/feedback-components.a451f964.js.map +1 -0
- package/dist/esm/{feedback-components.d55a1d18.js → feedback-components.e068f453.js} +5 -5
- package/dist/esm/{feedback-components.d55a1d18.js.map → feedback-components.e068f453.js.map} +1 -1
- package/dist/esm/{feedback-components.28ba71be.js → feedback-components.e4935bf3.js} +7 -7
- package/dist/esm/feedback-components.e4935bf3.js.map +1 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/node/feedback-components.2ad7d057.js +2 -0
- package/dist/node/feedback-components.2ad7d057.js.map +1 -0
- package/dist/node/feedback-components.441e2203.js +2 -0
- package/dist/node/feedback-components.441e2203.js.map +1 -0
- package/dist/node/{feedback-components.2f740fc7.js → feedback-components.67e60839.js} +2 -2
- package/dist/node/{feedback-components.2f740fc7.js.map → feedback-components.67e60839.js.map} +1 -1
- package/dist/node/feedback-components.76ed75d8.js +2 -0
- package/dist/node/feedback-components.76ed75d8.js.map +1 -0
- package/dist/node/feedback-components.827f8d80.js +2 -0
- package/dist/node/feedback-components.827f8d80.js.map +1 -0
- package/dist/node/feedback-components.8caef76e.js +2 -0
- package/dist/node/feedback-components.8caef76e.js.map +1 -0
- package/dist/node/feedback-components.c31cf831.js +2 -0
- package/dist/node/feedback-components.c31cf831.js.map +1 -0
- package/dist/node/feedback-components.ce5efb18.js +2 -0
- package/dist/node/feedback-components.ce5efb18.js.map +1 -0
- package/dist/node/feedback-components.db4d0a14.css +2 -0
- package/dist/node/feedback-components.db4d0a14.css.map +1 -0
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/package.json +2 -2
- package/src/feedback/edit-state.ts +101 -49
- package/src/feedback/feedback.module.sass +9 -5
- package/src/feedback/graph.ts +5 -2
- package/src/feedback/index.ts +30 -4
- package/src/feedback/matches.ts +125 -87
- package/src/feedback/text-visualizer.ts +32 -86
- package/src/feedback/typelist.ts +13 -4
- package/dist/esm/feedback-components.00434ff7.js.map +0 -1
- package/dist/esm/feedback-components.1c15f37f.js.map +0 -1
- package/dist/esm/feedback-components.204f7d2b.js.map +0 -1
- package/dist/esm/feedback-components.28ba71be.js.map +0 -1
- package/dist/esm/feedback-components.7e879290.js.map +0 -1
- package/dist/esm/feedback-components.d591ffec.css.map +0 -1
- package/dist/esm/feedback-components.f6605b83.js.map +0 -1
- package/dist/esm/feedback-components.fd8ac9ca.js.map +0 -1
- package/dist/node/feedback-components.0eef8d0c.js +0 -2
- package/dist/node/feedback-components.0eef8d0c.js.map +0 -1
- package/dist/node/feedback-components.41db283a.js +0 -2
- package/dist/node/feedback-components.41db283a.js.map +0 -1
- package/dist/node/feedback-components.69d0ccd0.js +0 -2
- package/dist/node/feedback-components.69d0ccd0.js.map +0 -1
- package/dist/node/feedback-components.a7b43cfa.js +0 -2
- package/dist/node/feedback-components.a7b43cfa.js.map +0 -1
- package/dist/node/feedback-components.b9317f9c.js +0 -2
- package/dist/node/feedback-components.b9317f9c.js.map +0 -1
- package/dist/node/feedback-components.e096504e.css +0 -2
- package/dist/node/feedback-components.e096504e.css.map +0 -1
- package/dist/node/feedback-components.e140ac86.js +0 -2
- package/dist/node/feedback-components.e140ac86.js.map +0 -1
- package/dist/node/feedback-components.f8373b58.js +0 -2
- 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.
|
|
2
|
-
import $7mcWh$
|
|
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$
|
|
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.
|
|
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.
|
|
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.
|
|
2
|
-
import $bvJLP$
|
|
3
|
-
import $b6b9741bf83336eb$export$2e2bcd8739ae039 from "./feedback-components.
|
|
4
|
-
import {FeedbackText as $156a3efbc315814c$export$6e107db9091b8219} from "./feedback-components.
|
|
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.
|
|
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.
|
|
9
|
-
import {Matches as $a878a21b0c10bfdc$export$6479cfcac2b87c0} from "./feedback-components.
|
|
10
|
-
import {TypeList as $18030469a9425911$export$9ebd91d75ddb6a8b} from "./feedback-components.
|
|
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$
|
|
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.
|
|
357
|
+
//# sourceMappingURL=feedback-components.47b7bf19.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,8EAAK;AAE5B,SAAS,qCAAkB,CAAS,EAAE,CAAS;IAC7C,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,OAAO;IAC9B,KAAK,MAAM,QAAQ,EAAG;QACpB,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,OAAO;IAC3B;IACA,OAAO;AACT;AAEO,SAAS,0CAAkB,YAChC,WAAW,EAAE,QACb,IAAI,SACJ,KAAK,eACL,WAAW,kBACX,cAAc,UACd,MAAM,gBACN,YAAY,cACZ,UAAU,QACV,OAAO,OACR;IACC,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAE;IACzC,MAAM,CAAC,OAAO,cAAc,GAAG,CAAA,GAAA,eAAO,EAAE;IACxC,MAAM,YAAY,UAAU;IAE5B,0BAA0B;IAC1B,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,yCAAe,EACvC,SAAS,GAAG,CAAC,sCACb,aACA,UACA;IAGF,MAAM,iBACJ,aAAa,QACb,IAAI,sBACJ,kBAAkB,yBAClB,qBAAqB,kBACrB,cAAc,EACf,GAAG;IAEJ,MAAM,CAAC,SAAE,KAAK,UAAE,MAAM,EAAE,EAAE,IAAI,GAAG,CAAA,GAAA,2BAAmB;IAEpD,OAAO,wBAAE,oBAAoB;QAC3B,wBACE,0BACA,wBAAE,CAAA,GAAA,yCAAkB,EAAE,QAAQ,EAAE;YAAE,OAAO;QAAS,GAAG;YACnD,wBAAE,EAAE,CAAC,CAAC,MAAM,CAAA,GAAA,uBAAe,GAAG;gBAC5B,SAAS;oBACP;wBAAE,OAAO;wBAAQ,OAAO;oBAAO;oBAC/B;wBAAE,OAAO;wBAAQ,OAAO;oBAAO;iBAChC;gBACD,OAAO,WAAW,SAAS;gBAC3B,OAAO;gBACP;oBACE,YAAY,CAAC;oBACb,SAAS;wBAAE,MAAM;oBAAmB;gBACtC;gBACA,MAAM;YACR;YACA,wBACE,CAAA,GAAA,oBAAY,GACZ;gBACE,aACE;YACJ,GACA,wBAAE,CAAA,GAAA,yCAAW,GAAG;sBACd;0BACA;gBACA,aAAa;gBACb,OAAO;+BACP;8BACA;gBACA,YAAY;0BACZ;YACF;YAEF,wBACE,CAAA,GAAA,cAAM,GACN;gBAAE,YAAY;gBAAY,gBAAgB;YAAgB,GAC1D;gBACE,wBAAE,CAAA,GAAA,yCAAQ,GAAG;oBAAE,MAAM;gBAAM;gBAC3B,wBAAE,CAAA,GAAA,uBAAe,GAAG;oBAClB,SAAS;wBACP;4BAAE,OAAO;4BAAQ,OAAO;wBAAO;wBAC/B;4BAAE,OAAO;4BAAS,OAAO;wBAAQ;qBAClC;oBACD,OAAO,MAAM,QAAQ;oBACrB,OAAO;oBACP,eAAc,KAAe;wBAC3B,QAAQ,GAAG,CAAC,qBAAqB;wBACjC,SAAS;4BAAE,MAAM;4BAAiB,SAAS;wBAAM;oBACnD;gBACF;aACD;YAEH,wBACE,oBACA;qBACE;YACF,GACA;gBACE,wBAAE,EAAE,CAAC,MAAM,QAAQ,IAAI,QAAQ,4CAAsB;mCACnD;8BACA;0BACA;2BACA;4BACA;oCACA;gBACF;gBACA,wBAAE,EAAE,CAAC,MAAM,QAAQ,IAAI,SAAS,CAAA,GAAA,yCAAQ,GAAG;0BACzC;2BACA;4BACA;8BACA;mCACA;8BACA;gBACF;aACD;SAEJ;QAEH,wBAAE,CAAA,GAAA,WAAG,GAAG;YAAE,WAAW;QAAgB,GAAG;YACtC,wBAAE,uBAAuB;gBACvB,wBAAE,EAAE,CAAC,CAAC,UACJ,CAAA,GAAA,kBAAU,GACV;oBACE,UAAU;oBACV,MAAM;oBACN,SAAS;oBACT,WAAW;gBACb,GACA;oBACE,wBACE,CAAA,GAAA,mBAAW,GACX;wBACE,MAAM;wBACN,UAAU,MAAM,WAAW,IAAI,MAAM,IAAI;wBACzC;4BACE,SAAS;gCAAE,MAAM;4BAAQ;wBAC3B;oBACF,GACA;oBAEF,wBACE,CAAA,GAAA,iBAAS,GACT;wBACE;4BACE,OAAO,MAAM,IAAI;wBACnB;wBACA,UAAU,MAAM,WAAW,IAAI,MAAM,IAAI;oBAC3C,GACA;iBAEH;gBAEH,wBAAE,EAAE,CAAC,CAAC,UAAU,CAAA,GAAA,wCAAM,GAAG;2BACvB;mCACA;gCACA;mCACA;0BACA;8BACA;gBACF;gBACA,wBAAE,EAAE,CAAC,CAAC,UAAU,CAAA,GAAA,cAAM;gBACtB,wBAAE,0CAAoB;oBACpB,aAAa;oBACb,UAAU;oBACV,UAAS,OAAO;wBACd,SAAS;4BAAE,MAAM;qCAAsB;wBAAQ;oBACjD;8BACA;0BACA;mCACA;oBACA,QAAQ;oBACR,SAAS,CAAC,SACR,SAAS;4BACP,MAAM;4BACN,SAAS;wBACX;8BACF;+BACA;gBACF;aACD;SACF;KACF;AACH;AAEA,SAAS,oCAAc,MAAc;IACnC,aAAa;IACb,OAAO;QACL,GAAG,MAAM;QACT,aAAa;QACb,WAAW,OAAO,IAAI,CAAC,IAAI;QAC3B,WAAW;YAAC,OAAO,OAAO;SAAC;QAC3B,UAAU,OAAO,QAAQ,EAAE,IAAI,wCAAkB,EAAE;IACrD;AACF;AAEA,SAAS,yCAAmB,eAC1B,WAAW,YACX,QAAQ,UACR,MAAM,WACN,OAAO,YACP,QAAQ,QACR,IAAI,YACJ,QAAQ,iBACR,gBAAgB,EAAE,YAClB,QAAQ,aACR,SAAS,EACV;IACC,8CAA8C;IAC9C,MAAM,YAAY,YAAY,OAAO,WAAW;IAChD,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAE;IAC7C,MAAM,QAAQ,MAAM,IAAI,CAAC,YAAY,MAAM;IAE3C,MAAM,QACJ,eAAe,KACX,MAAM,MAAM,CAAC,CAAC,IACZ,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,WAAW,OAEtD;IAEN,OAAO,wBAAE,4BAA4B;QACnC,wBAAE,CAAA,GAAA,yCAAO,GAAG;YACV,OAAO;YACP,UAAU;sBACV;2BACA;kBACA;YACA,UAAU,YAAY;QACxB;QACA,wBAAE,CAAA,GAAA,yCAAc,GAAG;oBACjB;mBACA;YACA,cAAc;YACd,cAAa,IAAI;gBACf,QAAQ;gBACR,SAAS;YACX;YACA,eAAc,KAAK;gBACjB,cAAc;YAChB;YACA;gBACE,QAAQ;YACV;QACF;KACD;AACH;AAEA,SAAS,iCAAW,IAAI;IACtB,IAAI,CAAC,MAAM,OAAO;IAClB,IAAI,QAAQ;IAEZ,SAAS,QAAQ,KAAK;QACpB,KAAK,MAAM,QAAQ,MAAO;YACxB;YACA,IAAI,KAAK,QAAQ,IAAI,MAAM,OAAO,CAAC,KAAK,QAAQ,GAC9C,QAAQ,KAAK,QAAQ;QAEzB;IACF;IAEA,QAAQ;IACR,OAAO;AACT;AAEA,SAAS,2CAAqB,KAAK;IACjC,MAAM,iBAAE,aAAa,YAAE,QAAQ,QAAE,IAAI,UAAE,MAAM,SAAE,KAAK,kBAAE,cAAc,EAAE,GACpE;IAEF,MAAM,MAAM,CAAA,GAAA,aAAK;IACjB,mDAAmD;IACnD,MAAM,aAAa,CAAA,GAAA,aAAK,EAAE;IAE1B,MAAM,QAAQ,CAAA,GAAA,kBAAU,EACtB,CAAC,QAAU,wBAAE,CAAA,GAAA,wCAAG,GAAG;YAAE,GAAG,KAAK;4BAAE;QAAe,IAC9C;QAAC;KAAe;IAGlB,kDAAkD;IAClD,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,IAAI,OAAO,IAAI,MAAM;QAEzB,MAAM,YAAY,IAAI,IAAI,cAAc,GAAG,CAAC,CAAC,IAAM,EAAE,QAAQ;QAC7D,MAAM,mBAAmB,IAAI,OAAO,CAAC,WAAW;QAChD,IAAI,qCAAe,WAAW,mBAAmB;QAEjD,IAAI,OAAO,CAAC,YAAY,CAAC;YACvB,KAAK,cAAc,GAAG,CAAC,CAAC,IAAM,EAAE,QAAQ;YACxC,QAAQ;YACR,YAAY;QACd;IACF,GAAG;QAAC;KAAc;IAElB,0DAA0D;IAC1D,SAAS;QACP,WAAW,OAAO,GAAG;IACvB;IAEA,MAAM,iBAAiB,CAAA,GAAA,aAAK,EAAE;IAE9B,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,OAAO,CAAC;YACZ,IAAI,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,eAAe,OAAO,GAAG;QACvD;QACA,MAAM,KAAK,IAAO,eAAe,OAAO,GAAG;QAE3C,OAAO,gBAAgB,CAAC,WAAW;QACnC,OAAO,gBAAgB,CAAC,SAAS;QACjC,OAAO;YACL,OAAO,mBAAmB,CAAC,WAAW;YACtC,OAAO,mBAAmB,CAAC,SAAS;QACtC;IACF,GAAG,EAAE;IAEL,MAAM,eAAe,CAAA,GAAA,kBAAU,EAC7B,CAAC;QACC,IAAI,CAAC,WAAW,OAAO,EAAE;QACzB,WAAW,OAAO,GAAG;QACrB,MAAM,gBAAgB,eAAe,OAAO;QAE5C,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,IAAM,SAAS,EAAE,EAAE;QAExC,IAAI,eACF,SAAS;YAAE,MAAM;YAAwB,SAAS;qBAAE;YAAI;QAAE;aACrD;YACL,IAAI,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,EACjD,MAAM,EAAE;YAGV,SAAS;gBAAE,MAAM;gBAAe,SAAS;yBAAE;gBAAI;YAAE;QACnD;IACF,GACA;QAAC;QAAe;KAAS;IAG3B,OAAO,wBACL,8BACA;QAAE,eAAe;IAAY,GAC7B,wBAAE,CAAA,GAAA,WAAG,GAAG;QACN,WAAW;gBACX;eACA;aACA;QACA,MAAM;QACN,QAAO,WAAE,OAAO,YAAE,QAAQ,SAAE,KAAK,EAAE;YACjC,SAAS;gBACP,MAAM;gBACN,SAAS;oBACP,SAAS,QAAQ,GAAG,CAAC,CAAC,IAAM,SAAS;oBACrC,UAAU,WAAW,SAAS,YAAY;2BAC1C;gBACF;YACF;QACF;QACA,UAAS,OAAE,GAAG,EAAE;YACd,SAAS;gBACP,MAAM;gBACN,SAAS;oBAAE,KAAK,IAAI,GAAG,CAAC,CAAC,IAAM,SAAS;gBAAI;YAC9C;QACF;QACA,UAAU;QACV,UAAU;QACV,YAAW,CAAC;YACV,OAAO,EAAE,EAAE,CAAC,QAAQ;QACtB;IACF;AAEJ","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(--
|
|
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.
|
|
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"}
|