@lv-x-software-house/x_view 1.2.6-dev.2 → 1.2.6-dev.7
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/dist/index.js +504 -540
- package/dist/index.mjs +463 -510
- package/dist/server.js +480 -0
- package/dist/server.mjs +445 -0
- package/package.json +2 -10
package/dist/index.js
CHANGED
|
@@ -44,9 +44,9 @@ __export(index_exports, {
|
|
|
44
44
|
module.exports = __toCommonJS(index_exports);
|
|
45
45
|
|
|
46
46
|
// src/XViewScene.jsx
|
|
47
|
-
var
|
|
47
|
+
var import_react29 = __toESM(require("react"));
|
|
48
48
|
var import_navigation = require("next/navigation");
|
|
49
|
-
var
|
|
49
|
+
var import_react30 = require("next-auth/react");
|
|
50
50
|
var import_crypto_js = __toESM(require("crypto-js"));
|
|
51
51
|
var THREE3 = __toESM(require("three"));
|
|
52
52
|
var import_OrbitControls = require("three/examples/jsm/controls/OrbitControls.js");
|
|
@@ -1092,6 +1092,8 @@ var userActionHandlers = {
|
|
|
1092
1092
|
if (isCrossDataset) {
|
|
1093
1093
|
graphDataRef.current[finalTargetDatasetId] = targetDataToUpdate;
|
|
1094
1094
|
}
|
|
1095
|
+
if (sceneDataRef.current.parent_dbs.some((db) => String(db.db_id) === String(sourceParentInfo.parentFileId))) {
|
|
1096
|
+
}
|
|
1095
1097
|
const finalPosition = stateRef.current.ghostElements.node.position.clone();
|
|
1096
1098
|
addNewNodeToScene(stateRef.current, newNode, newLink, finalPosition);
|
|
1097
1099
|
stateRef.current.nodeIdToParentFileMap.set(String(newNode.id), {
|
|
@@ -1290,6 +1292,9 @@ var userActionHandlers = {
|
|
|
1290
1292
|
);
|
|
1291
1293
|
}
|
|
1292
1294
|
graphDataRef.current[parentFileId] = specificParentData;
|
|
1295
|
+
if (isView && parentFileId === context.sceneConfigId) {
|
|
1296
|
+
sceneDataRef.current.quest_nodes = [...specificParentData.nodes];
|
|
1297
|
+
}
|
|
1293
1298
|
const finalPosition = stateRef.current.ghostElements.node.position.clone();
|
|
1294
1299
|
addNewNodeToScene(stateRef.current, newNode, newLink, finalPosition);
|
|
1295
1300
|
setters.setSceneVersion((v) => v + 1);
|
|
@@ -2309,8 +2314,6 @@ var userActionHandlers = {
|
|
|
2309
2314
|
milestones: sceneDataRef.current.milestones || [],
|
|
2310
2315
|
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
2311
2316
|
};
|
|
2312
|
-
sceneDataRef.current.quest_nodes = specificParentData.nodes;
|
|
2313
|
-
sceneDataRef.current.quest_links = specificParentData.links;
|
|
2314
2317
|
await context.actions.save_view_data(
|
|
2315
2318
|
context.sceneSaveUrl,
|
|
2316
2319
|
viewFilePayload
|
|
@@ -2323,6 +2326,10 @@ var userActionHandlers = {
|
|
|
2323
2326
|
);
|
|
2324
2327
|
}
|
|
2325
2328
|
graphDataRef.current[parentFileId] = specificParentData;
|
|
2329
|
+
if (isView && parentFileId === context.sceneConfigId) {
|
|
2330
|
+
sceneDataRef.current.quest_nodes = [...specificParentData.nodes];
|
|
2331
|
+
sceneDataRef.current.quest_counter = specificParentData.quest_counter || sceneDataRef.current.quest_counter;
|
|
2332
|
+
}
|
|
2326
2333
|
updateExistingNodeVisuals(stateRef.current, nodeToSave);
|
|
2327
2334
|
setters.setSceneVersion((v) => v + 1);
|
|
2328
2335
|
if (!keepOpen) {
|
|
@@ -12912,309 +12919,130 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
12912
12919
|
}
|
|
12913
12920
|
|
|
12914
12921
|
// src/components/AncestryBoard.jsx
|
|
12915
|
-
var import_react30 = __toESM(require("react"));
|
|
12916
|
-
var import_fi23 = require("react-icons/fi");
|
|
12917
|
-
var import_uuid11 = require("uuid");
|
|
12918
|
-
|
|
12919
|
-
// src/components/MentionEditor.jsx
|
|
12920
|
-
var import_react28 = __toESM(require("react"));
|
|
12921
|
-
var import_react29 = require("@tiptap/react");
|
|
12922
|
-
var import_starter_kit = __toESM(require("@tiptap/starter-kit"));
|
|
12923
|
-
var import_extension_mention = __toESM(require("@tiptap/extension-mention"));
|
|
12924
|
-
var import_tippy = __toESM(require("tippy.js"));
|
|
12925
|
-
|
|
12926
|
-
// src/components/MentionList.jsx
|
|
12927
12922
|
var import_react27 = __toESM(require("react"));
|
|
12928
12923
|
var import_fi22 = require("react-icons/fi");
|
|
12929
|
-
var
|
|
12930
|
-
const [selectedIndex, setSelectedIndex] = (0, import_react27.useState)(0);
|
|
12931
|
-
const selectItem = (index) => {
|
|
12932
|
-
const item = props.items[index];
|
|
12933
|
-
if (item) {
|
|
12934
|
-
props.command({ id: item.id, label: item.name, type: item.type });
|
|
12935
|
-
}
|
|
12936
|
-
};
|
|
12937
|
-
const upHandler = () => {
|
|
12938
|
-
setSelectedIndex(
|
|
12939
|
-
(selectedIndex + props.items.length - 1) % props.items.length
|
|
12940
|
-
);
|
|
12941
|
-
};
|
|
12942
|
-
const downHandler = () => {
|
|
12943
|
-
setSelectedIndex((selectedIndex + 1) % props.items.length);
|
|
12944
|
-
};
|
|
12945
|
-
const enterHandler = () => {
|
|
12946
|
-
selectItem(selectedIndex);
|
|
12947
|
-
};
|
|
12948
|
-
(0, import_react27.useEffect)(() => setSelectedIndex(0), [props.items]);
|
|
12949
|
-
(0, import_react27.useImperativeHandle)(ref, () => ({
|
|
12950
|
-
onKeyDown: ({ event }) => {
|
|
12951
|
-
if (event.key === "ArrowUp") {
|
|
12952
|
-
upHandler();
|
|
12953
|
-
return true;
|
|
12954
|
-
}
|
|
12955
|
-
if (event.key === "ArrowDown") {
|
|
12956
|
-
downHandler();
|
|
12957
|
-
return true;
|
|
12958
|
-
}
|
|
12959
|
-
if (event.key === "Enter") {
|
|
12960
|
-
enterHandler();
|
|
12961
|
-
return true;
|
|
12962
|
-
}
|
|
12963
|
-
return false;
|
|
12964
|
-
}
|
|
12965
|
-
}));
|
|
12966
|
-
return /* @__PURE__ */ import_react27.default.createElement("div", { className: "z-[3000] bg-slate-900 border border-white/10 rounded-lg shadow-2xl overflow-hidden min-w-[280px] max-w-[400px] animate-in fade-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-2 border-b border-white/5 bg-slate-950/50 flex items-center gap-2" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiSearch, { className: "text-indigo-400", size: 14 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wider font-bold text-slate-500" }, "Mencionar Recurso")), /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-1 max-h-[300px] overflow-y-auto custom-scrollbar" }, props.items.length ? props.items.map((item, index) => {
|
|
12967
|
-
const isQuest = item.type === "quest";
|
|
12968
|
-
const isVersion = item.type === "version";
|
|
12969
|
-
const isNode = item.type === "node";
|
|
12970
|
-
let Icon = import_fi22.FiLayers;
|
|
12971
|
-
let colorClass = "text-indigo-400";
|
|
12972
|
-
let badgeText = "Ancestralidade";
|
|
12973
|
-
if (isQuest) {
|
|
12974
|
-
Icon = import_fi22.FiCheckSquare;
|
|
12975
|
-
colorClass = "text-amber-400";
|
|
12976
|
-
badgeText = "Quest";
|
|
12977
|
-
} else if (isVersion) {
|
|
12978
|
-
Icon = import_fi22.FiGitBranch;
|
|
12979
|
-
colorClass = "text-purple-400";
|
|
12980
|
-
badgeText = "Vers\xE3o";
|
|
12981
|
-
} else if (isNode) {
|
|
12982
|
-
Icon = import_fi22.FiBox;
|
|
12983
|
-
colorClass = "text-emerald-400";
|
|
12984
|
-
badgeText = "Node";
|
|
12985
|
-
}
|
|
12986
|
-
return /* @__PURE__ */ import_react27.default.createElement(
|
|
12987
|
-
"button",
|
|
12988
|
-
{
|
|
12989
|
-
className: `
|
|
12990
|
-
w-full flex items-center gap-3 px-3 py-2 text-left rounded-md transition-all
|
|
12991
|
-
${index === selectedIndex ? "bg-indigo-500/20 border border-indigo-500/30 text-white" : "text-slate-400 hover:bg-white/5 border border-transparent"}
|
|
12992
|
-
`,
|
|
12993
|
-
key: item.id,
|
|
12994
|
-
onClick: () => selectItem(index)
|
|
12995
|
-
},
|
|
12996
|
-
/* @__PURE__ */ import_react27.default.createElement("div", { className: `shrink-0 w-8 h-8 rounded border border-white/5 flex items-center justify-center bg-slate-800/50 ${colorClass}` }, /* @__PURE__ */ import_react27.default.createElement(Icon, { size: 14 })),
|
|
12997
|
-
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-sm font-medium truncate" }, item.name), /* @__PURE__ */ import_react27.default.createElement("span", { className: `text-[9px] px-1 py-0.5 rounded border border-current opacity-60 ${colorClass}` }, badgeText)))
|
|
12998
|
-
);
|
|
12999
|
-
}) : /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-4 text-center text-slate-500 text-sm italic" }, "Nenhum resultado encontrado...")));
|
|
13000
|
-
});
|
|
13001
|
-
MentionList.displayName = "MentionList";
|
|
13002
|
-
var MentionList_default = MentionList;
|
|
13003
|
-
|
|
13004
|
-
// src/components/MentionEditor.jsx
|
|
13005
|
-
var CustomMention = import_extension_mention.default.extend({
|
|
13006
|
-
addAttributes() {
|
|
13007
|
-
var _a;
|
|
13008
|
-
return {
|
|
13009
|
-
...(_a = this.parent) == null ? void 0 : _a.call(this),
|
|
13010
|
-
type: {
|
|
13011
|
-
default: null,
|
|
13012
|
-
parseHTML: (element) => element.getAttribute("data-mention-type"),
|
|
13013
|
-
renderHTML: (attributes) => {
|
|
13014
|
-
if (!attributes.type) {
|
|
13015
|
-
return {};
|
|
13016
|
-
}
|
|
13017
|
-
return {
|
|
13018
|
-
"data-mention-type": attributes.type
|
|
13019
|
-
};
|
|
13020
|
-
}
|
|
13021
|
-
}
|
|
13022
|
-
};
|
|
13023
|
-
}
|
|
13024
|
-
});
|
|
13025
|
-
var MentionEditor = ({
|
|
13026
|
-
initialValue = "",
|
|
13027
|
-
onChange,
|
|
13028
|
-
onPlay,
|
|
13029
|
-
// Mantido para futura expansão se quisermos badges clicáveis reais no editor
|
|
13030
|
-
availableItems = [],
|
|
13031
|
-
canEdit = true,
|
|
13032
|
-
placeholder = "Escreva algo... use @ para mencionar"
|
|
13033
|
-
}) => {
|
|
13034
|
-
const parseInitialContent = (text) => {
|
|
13035
|
-
if (!text) return "<p></p>";
|
|
13036
|
-
const parts = text.split(/(\[\[MENTION:[^\]]+\]\])/g);
|
|
13037
|
-
return parts.map((part) => {
|
|
13038
|
-
const match = part.match(/\[\[MENTION:([^:]+):([^:]+):([^\]]+)\]\]/);
|
|
13039
|
-
if (match) {
|
|
13040
|
-
const [, type, id, label] = match;
|
|
13041
|
-
return `<span data-type="mention" data-id="${id}" data-mention-type="${type}" data-label="${label}">@${label}</span>`;
|
|
13042
|
-
}
|
|
13043
|
-
return part;
|
|
13044
|
-
}).join("");
|
|
13045
|
-
};
|
|
13046
|
-
const content = (0, import_react28.useMemo)(() => parseInitialContent(initialValue), [initialValue]);
|
|
13047
|
-
const editor = (0, import_react29.useEditor)({
|
|
13048
|
-
extensions: [
|
|
13049
|
-
import_starter_kit.default.configure({
|
|
13050
|
-
heading: false,
|
|
13051
|
-
bulletList: false,
|
|
13052
|
-
orderedList: false,
|
|
13053
|
-
codeBlock: false,
|
|
13054
|
-
blockquote: false
|
|
13055
|
-
}),
|
|
13056
|
-
CustomMention.configure({
|
|
13057
|
-
HTMLAttributes: {
|
|
13058
|
-
class: "mention"
|
|
13059
|
-
},
|
|
13060
|
-
suggestion: {
|
|
13061
|
-
items: ({ query }) => {
|
|
13062
|
-
return availableItems.filter(
|
|
13063
|
-
(item) => item.name.toLowerCase().includes(query.toLowerCase())
|
|
13064
|
-
).slice(0, 10);
|
|
13065
|
-
},
|
|
13066
|
-
render: () => {
|
|
13067
|
-
let component;
|
|
13068
|
-
let popup;
|
|
13069
|
-
return {
|
|
13070
|
-
onStart: (props) => {
|
|
13071
|
-
component = new import_react29.ReactRenderer(MentionList_default, {
|
|
13072
|
-
props,
|
|
13073
|
-
editor: props.editor
|
|
13074
|
-
});
|
|
13075
|
-
if (!props.clientRect) {
|
|
13076
|
-
return;
|
|
13077
|
-
}
|
|
13078
|
-
popup = (0, import_tippy.default)("body", {
|
|
13079
|
-
getReferenceClientRect: props.clientRect,
|
|
13080
|
-
appendTo: () => document.body,
|
|
13081
|
-
content: component.element,
|
|
13082
|
-
showOnCreate: true,
|
|
13083
|
-
interactive: true,
|
|
13084
|
-
trigger: "manual",
|
|
13085
|
-
placement: "bottom-start"
|
|
13086
|
-
});
|
|
13087
|
-
},
|
|
13088
|
-
onUpdate(props) {
|
|
13089
|
-
component.updateProps(props);
|
|
13090
|
-
if (!props.clientRect) {
|
|
13091
|
-
return;
|
|
13092
|
-
}
|
|
13093
|
-
popup[0].setProps({
|
|
13094
|
-
getReferenceClientRect: props.clientRect
|
|
13095
|
-
});
|
|
13096
|
-
},
|
|
13097
|
-
onKeyDown(props) {
|
|
13098
|
-
var _a;
|
|
13099
|
-
if (props.event.key === "Escape") {
|
|
13100
|
-
popup[0].hide();
|
|
13101
|
-
return true;
|
|
13102
|
-
}
|
|
13103
|
-
return (_a = component == null ? void 0 : component.ref) == null ? void 0 : _a.onKeyDown(props);
|
|
13104
|
-
},
|
|
13105
|
-
onExit() {
|
|
13106
|
-
if (popup && popup[0]) popup[0].destroy();
|
|
13107
|
-
if (component) component.destroy();
|
|
13108
|
-
}
|
|
13109
|
-
};
|
|
13110
|
-
}
|
|
13111
|
-
}
|
|
13112
|
-
})
|
|
13113
|
-
],
|
|
13114
|
-
content,
|
|
13115
|
-
editable: canEdit,
|
|
13116
|
-
onUpdate: ({ editor: editor2 }) => {
|
|
13117
|
-
const serialize = (json) => {
|
|
13118
|
-
if (!json.content) return "";
|
|
13119
|
-
return json.content.map((block) => {
|
|
13120
|
-
if (block.type === "paragraph") {
|
|
13121
|
-
const inner = block.content ? block.content.map((node) => {
|
|
13122
|
-
if (node.type === "text") return node.text;
|
|
13123
|
-
if (node.type === "mention") {
|
|
13124
|
-
return `[[MENTION:${node.attrs.type}:${node.attrs.id}:${node.attrs.label}]]`;
|
|
13125
|
-
}
|
|
13126
|
-
return "";
|
|
13127
|
-
}).join("") : "";
|
|
13128
|
-
return inner;
|
|
13129
|
-
}
|
|
13130
|
-
return "";
|
|
13131
|
-
}).join("\n").trim();
|
|
13132
|
-
};
|
|
13133
|
-
const serialized = serialize(editor2.getJSON());
|
|
13134
|
-
onChange(serialized);
|
|
13135
|
-
}
|
|
13136
|
-
});
|
|
13137
|
-
if (!editor) {
|
|
13138
|
-
return null;
|
|
13139
|
-
}
|
|
13140
|
-
return /* @__PURE__ */ import_react28.default.createElement("div", { className: "relative group/editor min-h-[1.5rem] w-full" }, /* @__PURE__ */ import_react28.default.createElement(
|
|
13141
|
-
import_react29.EditorContent,
|
|
13142
|
-
{
|
|
13143
|
-
editor,
|
|
13144
|
-
className: "text-sm text-slate-200 placeholder-slate-600 focus:outline-none"
|
|
13145
|
-
}
|
|
13146
|
-
), /* @__PURE__ */ import_react28.default.createElement("style", null, `
|
|
13147
|
-
.tiptap p {
|
|
13148
|
-
margin: 0;
|
|
13149
|
-
min-height: 1.2em;
|
|
13150
|
-
}
|
|
13151
|
-
.tiptap .mention {
|
|
13152
|
-
display: inline-flex;
|
|
13153
|
-
align-items: center;
|
|
13154
|
-
background-color: rgba(99, 102, 241, 0.15);
|
|
13155
|
-
border: 1px solid rgba(99, 102, 241, 0.3);
|
|
13156
|
-
border-radius: 4px;
|
|
13157
|
-
padding: 0 4px;
|
|
13158
|
-
color: #a5b4fc;
|
|
13159
|
-
font-weight: 500;
|
|
13160
|
-
cursor: pointer;
|
|
13161
|
-
margin: 0 2px;
|
|
13162
|
-
transition: all 0.2s;
|
|
13163
|
-
}
|
|
13164
|
-
.tiptap .mention:hover {
|
|
13165
|
-
background-color: rgba(99, 102, 241, 0.25);
|
|
13166
|
-
border-color: rgba(99, 102, 241, 0.5);
|
|
13167
|
-
color: white;
|
|
13168
|
-
}
|
|
13169
|
-
.tiptap:focus {
|
|
13170
|
-
outline: none;
|
|
13171
|
-
}
|
|
13172
|
-
`));
|
|
13173
|
-
};
|
|
13174
|
-
var MentionEditor_default = MentionEditor;
|
|
13175
|
-
|
|
13176
|
-
// src/components/AncestryBoard.jsx
|
|
12924
|
+
var import_uuid11 = require("uuid");
|
|
13177
12925
|
var GroupItem = ({
|
|
13178
12926
|
group,
|
|
13179
12927
|
index,
|
|
12928
|
+
siblings,
|
|
13180
12929
|
onUpdate,
|
|
13181
12930
|
onDelete,
|
|
13182
12931
|
onAddSubgroup,
|
|
13183
12932
|
onIndent,
|
|
13184
12933
|
onOutdent,
|
|
12934
|
+
onRemoveAncestry,
|
|
12935
|
+
onRequestPickAncestry,
|
|
12936
|
+
pickingGroupId,
|
|
13185
12937
|
onPlayAncestry,
|
|
13186
|
-
|
|
12938
|
+
availableIds,
|
|
13187
12939
|
canEdit
|
|
13188
12940
|
}) => {
|
|
13189
12941
|
const canIndent = index > 0;
|
|
13190
|
-
|
|
12942
|
+
const isPickingForThisGroup = pickingGroupId === group.id;
|
|
12943
|
+
const textareaRef = (0, import_react27.useRef)(null);
|
|
12944
|
+
const adjustHeight = () => {
|
|
12945
|
+
const textarea = textareaRef.current;
|
|
12946
|
+
if (textarea) {
|
|
12947
|
+
textarea.style.height = "auto";
|
|
12948
|
+
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
12949
|
+
}
|
|
12950
|
+
};
|
|
12951
|
+
(0, import_react27.useEffect)(() => {
|
|
12952
|
+
adjustHeight();
|
|
12953
|
+
}, [group.text]);
|
|
12954
|
+
return /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react27.default.createElement(
|
|
13191
12955
|
"div",
|
|
13192
12956
|
{
|
|
13193
|
-
className:
|
|
12957
|
+
className: `
|
|
12958
|
+
flex flex-col gap-2 py-2 px-3 transition-all duration-200
|
|
12959
|
+
${isPickingForThisGroup ? "bg-indigo-500/10 border-l-2 border-indigo-500" : "hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"}
|
|
12960
|
+
`
|
|
13194
12961
|
},
|
|
13195
|
-
/* @__PURE__ */
|
|
13196
|
-
|
|
12962
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
12963
|
+
"textarea",
|
|
13197
12964
|
{
|
|
13198
|
-
|
|
13199
|
-
|
|
13200
|
-
|
|
12965
|
+
ref: textareaRef,
|
|
12966
|
+
className: `w-full bg-transparent text-sm text-slate-200 placeholder-slate-600 resize-none focus:outline-none focus:placeholder-slate-500 overflow-y-auto ${!canEdit ? "cursor-default" : ""}`,
|
|
12967
|
+
rows: 1,
|
|
12968
|
+
style: {
|
|
12969
|
+
minHeight: "1.5rem",
|
|
12970
|
+
maxHeight: "250px"
|
|
13201
12971
|
},
|
|
13202
|
-
|
|
13203
|
-
|
|
13204
|
-
canEdit,
|
|
13205
|
-
|
|
12972
|
+
placeholder: canEdit ? "Escreva sobre este grupo..." : "",
|
|
12973
|
+
value: group.text,
|
|
12974
|
+
readOnly: !canEdit,
|
|
12975
|
+
onChange: (e) => {
|
|
12976
|
+
if (canEdit) onUpdate(group.id, { ...group, text: e.target.value });
|
|
12977
|
+
}
|
|
13206
12978
|
}
|
|
13207
12979
|
),
|
|
13208
|
-
|
|
12980
|
+
group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
|
|
12981
|
+
const isValid = availableIds.has(String(anc.ancestry_id));
|
|
12982
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
12983
|
+
"div",
|
|
12984
|
+
{
|
|
12985
|
+
key: anc.ancestry_id,
|
|
12986
|
+
className: `
|
|
12987
|
+
flex items-center gap-2 rounded-md px-3 py-1.5 text-xs transition-all group/card border
|
|
12988
|
+
${isValid ? "bg-slate-800/60 border-white/10 hover:border-indigo-500/30 text-slate-200" : "bg-red-900/10 border-red-500/30 text-red-300/70 hover:bg-red-900/20"}
|
|
12989
|
+
`,
|
|
12990
|
+
title: isValid ? "" : "Esta ancestralidade foi removida ou n\xE3o existe mais."
|
|
12991
|
+
},
|
|
12992
|
+
isValid ? /* @__PURE__ */ import_react27.default.createElement(
|
|
12993
|
+
"button",
|
|
12994
|
+
{
|
|
12995
|
+
onClick: () => onPlayAncestry(anc),
|
|
12996
|
+
className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
|
|
12997
|
+
title: "Focar no cen\xE1rio"
|
|
12998
|
+
},
|
|
12999
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
|
|
13000
|
+
) : /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiAlertTriangle, { size: 10 })),
|
|
13001
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
13002
|
+
"div",
|
|
13003
|
+
{
|
|
13004
|
+
className: `flex items-center gap-1.5 font-medium truncate max-w-[180px] ${!isValid && "line-through decoration-red-500/50"}`
|
|
13005
|
+
},
|
|
13006
|
+
!isValid ? null : anc.type === "node" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiBox, { size: 10, className: "text-slate-400" }) : anc.type === "quest" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckSquare, { size: 10, className: "text-emerald-400" }) : anc.type === "version" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiGitBranch, { size: 10, className: "text-amber-400" }) : /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiLayers, { size: 10, className: "text-indigo-400" }),
|
|
13007
|
+
anc.name
|
|
13008
|
+
),
|
|
13009
|
+
canEdit && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
|
|
13010
|
+
"div",
|
|
13011
|
+
{
|
|
13012
|
+
className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
|
|
13013
|
+
}
|
|
13014
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
13015
|
+
"button",
|
|
13016
|
+
{
|
|
13017
|
+
onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
|
|
13018
|
+
className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
|
|
13019
|
+
title: "Remover men\xE7\xE3o"
|
|
13020
|
+
},
|
|
13021
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiX, { size: 12 })
|
|
13022
|
+
))
|
|
13023
|
+
);
|
|
13024
|
+
})),
|
|
13025
|
+
canEdit && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
13026
|
+
"button",
|
|
13027
|
+
{
|
|
13028
|
+
onClick: () => onRequestPickAncestry(group.id),
|
|
13029
|
+
className: `
|
|
13030
|
+
flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium transition-colors
|
|
13031
|
+
${isPickingForThisGroup ? "text-indigo-300 animate-pulse" : "text-slate-500 hover:text-indigo-300 hover:bg-indigo-500/10"}
|
|
13032
|
+
`,
|
|
13033
|
+
title: "Adicionar Ancestralidade a este grupo"
|
|
13034
|
+
},
|
|
13035
|
+
isPickingForThisGroup ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiSearch, { size: 12 }),
|
|
13036
|
+
isPickingForThisGroup ? "Selecionando..." : "Adicionar"
|
|
13037
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
13209
13038
|
"button",
|
|
13210
13039
|
{
|
|
13211
13040
|
onClick: () => onAddSubgroup(group.id),
|
|
13212
|
-
className: "
|
|
13041
|
+
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
13213
13042
|
title: "Criar Subgrupo"
|
|
13214
13043
|
},
|
|
13215
|
-
/* @__PURE__ */
|
|
13216
|
-
|
|
13217
|
-
)), /* @__PURE__ */ import_react30.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react30.default.createElement(
|
|
13044
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlus, { size: 14 })
|
|
13045
|
+
)), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
13218
13046
|
"button",
|
|
13219
13047
|
{
|
|
13220
13048
|
onClick: () => onIndent(group.id),
|
|
@@ -13222,25 +13050,25 @@ var GroupItem = ({
|
|
|
13222
13050
|
className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
|
|
13223
13051
|
title: "Aninhar no grupo acima"
|
|
13224
13052
|
},
|
|
13225
|
-
/* @__PURE__ */
|
|
13226
|
-
), /* @__PURE__ */
|
|
13053
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiArrowRight, { size: 14 })
|
|
13054
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
13227
13055
|
"button",
|
|
13228
13056
|
{
|
|
13229
13057
|
onClick: () => onOutdent(group.id),
|
|
13230
13058
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
13231
13059
|
title: "Desaninhar"
|
|
13232
13060
|
},
|
|
13233
|
-
/* @__PURE__ */
|
|
13234
|
-
), /* @__PURE__ */
|
|
13061
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiArrowLeft, { size: 14 })
|
|
13062
|
+
), /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement(
|
|
13235
13063
|
"button",
|
|
13236
13064
|
{
|
|
13237
13065
|
onClick: () => onDelete(group.id),
|
|
13238
13066
|
className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
|
|
13239
13067
|
title: "Remover Grupo"
|
|
13240
13068
|
},
|
|
13241
|
-
/* @__PURE__ */
|
|
13069
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiTrash2, { size: 14 })
|
|
13242
13070
|
)))
|
|
13243
|
-
), group.children && group.children.length > 0 && /* @__PURE__ */
|
|
13071
|
+
), group.children && group.children.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react27.default.createElement(
|
|
13244
13072
|
GroupItem,
|
|
13245
13073
|
{
|
|
13246
13074
|
key: childGroup.id,
|
|
@@ -13252,8 +13080,11 @@ var GroupItem = ({
|
|
|
13252
13080
|
onAddSubgroup,
|
|
13253
13081
|
onIndent,
|
|
13254
13082
|
onOutdent,
|
|
13083
|
+
onRemoveAncestry,
|
|
13084
|
+
onRequestPickAncestry,
|
|
13085
|
+
pickingGroupId,
|
|
13255
13086
|
onPlayAncestry,
|
|
13256
|
-
|
|
13087
|
+
availableIds,
|
|
13257
13088
|
canEdit
|
|
13258
13089
|
}
|
|
13259
13090
|
))));
|
|
@@ -13267,20 +13098,23 @@ function AncestryBoard({
|
|
|
13267
13098
|
initialGroups = [],
|
|
13268
13099
|
onSave,
|
|
13269
13100
|
userRole
|
|
13101
|
+
// [NOVO] Recebe a role do usuário
|
|
13270
13102
|
}) {
|
|
13271
|
-
const [
|
|
13272
|
-
const [
|
|
13273
|
-
const [
|
|
13274
|
-
const
|
|
13103
|
+
const [searchTerm, setSearchTerm] = (0, import_react27.useState)("");
|
|
13104
|
+
const [groups, setGroups] = (0, import_react27.useState)([]);
|
|
13105
|
+
const [isLoaded, setIsLoaded] = (0, import_react27.useState)(false);
|
|
13106
|
+
const [pickingGroupId, setPickingGroupId] = (0, import_react27.useState)(null);
|
|
13107
|
+
const [saveStatus, setSaveStatus] = (0, import_react27.useState)("idle");
|
|
13108
|
+
const canEdit = (0, import_react27.useMemo)(() => {
|
|
13275
13109
|
return userRole !== "viewer";
|
|
13276
13110
|
}, [userRole]);
|
|
13277
|
-
(0,
|
|
13111
|
+
(0, import_react27.useEffect)(() => {
|
|
13278
13112
|
if (initialGroups && !isLoaded) {
|
|
13279
13113
|
setGroups(initialGroups);
|
|
13280
13114
|
setIsLoaded(true);
|
|
13281
13115
|
}
|
|
13282
13116
|
}, [initialGroups, isLoaded]);
|
|
13283
|
-
const nodeNamesMap = (0,
|
|
13117
|
+
const nodeNamesMap = (0, import_react27.useMemo)(() => {
|
|
13284
13118
|
const map = /* @__PURE__ */ new Map();
|
|
13285
13119
|
if (availableNodes && Array.isArray(availableNodes)) {
|
|
13286
13120
|
availableNodes.forEach((node) => {
|
|
@@ -13291,41 +13125,52 @@ function AncestryBoard({
|
|
|
13291
13125
|
}
|
|
13292
13126
|
return map;
|
|
13293
13127
|
}, [availableNodes]);
|
|
13294
|
-
const availableIds = (0,
|
|
13295
|
-
|
|
13296
|
-
|
|
13297
|
-
|
|
13298
|
-
|
|
13299
|
-
|
|
13300
|
-
|
|
13301
|
-
|
|
13302
|
-
|
|
13303
|
-
|
|
13304
|
-
|
|
13305
|
-
|
|
13306
|
-
|
|
13307
|
-
|
|
13128
|
+
const availableIds = (0, import_react27.useMemo)(() => {
|
|
13129
|
+
const ids = /* @__PURE__ */ new Set();
|
|
13130
|
+
availableAncestries.forEach((a) => ids.add(String(a.ancestry_id)));
|
|
13131
|
+
availableNodes.forEach((n) => ids.add(String(n.id)));
|
|
13132
|
+
return ids;
|
|
13133
|
+
}, [availableAncestries, availableNodes]);
|
|
13134
|
+
const allSearchableItems = (0, import_react27.useMemo)(() => {
|
|
13135
|
+
const items = [];
|
|
13136
|
+
availableAncestries.forEach((anc) => {
|
|
13137
|
+
items.push({
|
|
13138
|
+
...anc,
|
|
13139
|
+
id: String(anc.ancestry_id),
|
|
13140
|
+
type: "ancestry",
|
|
13141
|
+
searchLabel: anc.name || "",
|
|
13142
|
+
searchDesc: anc.description || ""
|
|
13143
|
+
});
|
|
13144
|
+
});
|
|
13145
|
+
availableNodes.forEach((node) => {
|
|
13146
|
+
var _a;
|
|
13308
13147
|
let type = "node";
|
|
13309
|
-
if (
|
|
13310
|
-
else if (
|
|
13311
|
-
|
|
13312
|
-
|
|
13313
|
-
|
|
13314
|
-
description: n.description,
|
|
13148
|
+
if (node.is_quest) type = "quest";
|
|
13149
|
+
else if ((_a = node.version_node) == null ? void 0 : _a.is_version) type = "version";
|
|
13150
|
+
items.push({
|
|
13151
|
+
...node,
|
|
13152
|
+
id: String(node.id),
|
|
13315
13153
|
type,
|
|
13316
|
-
|
|
13317
|
-
|
|
13154
|
+
searchLabel: node.name || node.raw_title || "",
|
|
13155
|
+
searchDesc: node.description || ""
|
|
13156
|
+
});
|
|
13318
13157
|
});
|
|
13319
|
-
return
|
|
13158
|
+
return items;
|
|
13320
13159
|
}, [availableAncestries, availableNodes]);
|
|
13321
13160
|
const sanitizeGroups = (groupList) => {
|
|
13322
13161
|
return groupList.map((g) => ({
|
|
13323
13162
|
id: g.id,
|
|
13324
13163
|
text: g.text || "",
|
|
13164
|
+
ancestries: (g.ancestries || []).map((a) => ({
|
|
13165
|
+
id: a.id || a.ancestry_id,
|
|
13166
|
+
ancestry_id: a.ancestry_id || a.id,
|
|
13167
|
+
name: a.name,
|
|
13168
|
+
type: a.type || "ancestry"
|
|
13169
|
+
})),
|
|
13325
13170
|
children: sanitizeGroups(g.children || [])
|
|
13326
13171
|
}));
|
|
13327
13172
|
};
|
|
13328
|
-
(0,
|
|
13173
|
+
(0, import_react27.useEffect)(() => {
|
|
13329
13174
|
if (!isLoaded || !onSave) return;
|
|
13330
13175
|
const timeoutId = setTimeout(async () => {
|
|
13331
13176
|
setSaveStatus("saving");
|
|
@@ -13343,22 +13188,42 @@ function AncestryBoard({
|
|
|
13343
13188
|
}, 3e3);
|
|
13344
13189
|
return () => clearTimeout(timeoutId);
|
|
13345
13190
|
}, [groups, isLoaded, onSave]);
|
|
13346
|
-
(0,
|
|
13191
|
+
(0, import_react27.useEffect)(() => {
|
|
13347
13192
|
if (!isOpen) return;
|
|
13348
13193
|
const handleKeyDown = (e) => {
|
|
13349
13194
|
if (e.key === "Escape") {
|
|
13350
|
-
|
|
13195
|
+
if (pickingGroupId) {
|
|
13196
|
+
setPickingGroupId(null);
|
|
13197
|
+
} else {
|
|
13198
|
+
onClose();
|
|
13199
|
+
}
|
|
13351
13200
|
e.preventDefault();
|
|
13352
13201
|
e.stopPropagation();
|
|
13353
13202
|
}
|
|
13354
13203
|
};
|
|
13355
13204
|
window.addEventListener("keydown", handleKeyDown);
|
|
13356
13205
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
13357
|
-
}, [isOpen, onClose]);
|
|
13206
|
+
}, [isOpen, onClose, pickingGroupId]);
|
|
13207
|
+
const filtered = (0, import_react27.useMemo)(() => {
|
|
13208
|
+
const term = searchTerm.toLowerCase().trim();
|
|
13209
|
+
return allSearchableItems.filter((item) => {
|
|
13210
|
+
var _a, _b;
|
|
13211
|
+
if (!term) return true;
|
|
13212
|
+
const labelMatch = (_a = item.searchLabel) == null ? void 0 : _a.toLowerCase().includes(term);
|
|
13213
|
+
const descMatch = (_b = item.searchDesc) == null ? void 0 : _b.toLowerCase().includes(term);
|
|
13214
|
+
let parentMatch = false;
|
|
13215
|
+
if (item.type === "ancestry") {
|
|
13216
|
+
const parentName = nodeNamesMap.get(String(item.ancestral_node)) || "";
|
|
13217
|
+
parentMatch = parentName.toLowerCase().includes(term);
|
|
13218
|
+
}
|
|
13219
|
+
return labelMatch || descMatch || parentMatch;
|
|
13220
|
+
});
|
|
13221
|
+
}, [allSearchableItems, searchTerm, nodeNamesMap]);
|
|
13358
13222
|
const handleAddRootGroup = () => {
|
|
13359
13223
|
const newGroup = {
|
|
13360
13224
|
id: (0, import_uuid11.v4)(),
|
|
13361
13225
|
text: "",
|
|
13226
|
+
ancestries: [],
|
|
13362
13227
|
children: []
|
|
13363
13228
|
};
|
|
13364
13229
|
setGroups((prev) => [newGroup, ...prev]);
|
|
@@ -13367,6 +13232,7 @@ function AncestryBoard({
|
|
|
13367
13232
|
const newGroup = {
|
|
13368
13233
|
id: (0, import_uuid11.v4)(),
|
|
13369
13234
|
text: "",
|
|
13235
|
+
ancestries: [],
|
|
13370
13236
|
children: []
|
|
13371
13237
|
};
|
|
13372
13238
|
const addRecursive = (list) => {
|
|
@@ -13437,49 +13303,91 @@ function AncestryBoard({
|
|
|
13437
13303
|
return newList;
|
|
13438
13304
|
});
|
|
13439
13305
|
};
|
|
13440
|
-
const
|
|
13441
|
-
|
|
13442
|
-
|
|
13443
|
-
|
|
13444
|
-
|
|
13445
|
-
)
|
|
13446
|
-
|
|
13447
|
-
|
|
13448
|
-
|
|
13449
|
-
|
|
13306
|
+
const handleRequestPick = (groupId) => {
|
|
13307
|
+
setPickingGroupId((prev) => prev === groupId ? null : groupId);
|
|
13308
|
+
};
|
|
13309
|
+
const handleSelectAncestry = (ancestry) => {
|
|
13310
|
+
if (pickingGroupId) {
|
|
13311
|
+
setGroups((prev) => {
|
|
13312
|
+
const addRecursive = (list) => {
|
|
13313
|
+
return list.map((g) => {
|
|
13314
|
+
if (g.id === pickingGroupId) {
|
|
13315
|
+
const exists = g.ancestries.some(
|
|
13316
|
+
(a) => String(a.id || a.ancestry_id) === String(ancestry.id)
|
|
13317
|
+
);
|
|
13318
|
+
if (exists) return g;
|
|
13319
|
+
return {
|
|
13320
|
+
...g,
|
|
13321
|
+
ancestries: [
|
|
13322
|
+
...g.ancestries,
|
|
13323
|
+
{
|
|
13324
|
+
id: ancestry.id,
|
|
13325
|
+
ancestry_id: ancestry.id,
|
|
13326
|
+
name: ancestry.searchLabel,
|
|
13327
|
+
type: ancestry.type
|
|
13328
|
+
}
|
|
13329
|
+
]
|
|
13330
|
+
};
|
|
13331
|
+
}
|
|
13332
|
+
return { ...g, children: addRecursive(g.children) };
|
|
13333
|
+
});
|
|
13334
|
+
};
|
|
13335
|
+
return addRecursive(prev);
|
|
13336
|
+
});
|
|
13337
|
+
onSelect(ancestry);
|
|
13450
13338
|
}
|
|
13451
|
-
|
|
13452
|
-
|
|
13339
|
+
};
|
|
13340
|
+
const handlePlayFromGroup = (ancestry) => {
|
|
13341
|
+
if (ancestry && onSelect) {
|
|
13342
|
+
onSelect(ancestry);
|
|
13453
13343
|
}
|
|
13454
13344
|
};
|
|
13345
|
+
const handleRemoveAncestryFromGroup = (groupId, ancestryId) => {
|
|
13346
|
+
setGroups((prev) => {
|
|
13347
|
+
const removeRecursive = (list) => {
|
|
13348
|
+
return list.map((g) => {
|
|
13349
|
+
if (g.id === groupId) {
|
|
13350
|
+
return {
|
|
13351
|
+
...g,
|
|
13352
|
+
ancestries: g.ancestries.filter(
|
|
13353
|
+
(a) => String(a.id || a.ancestry_id) !== String(ancestryId)
|
|
13354
|
+
)
|
|
13355
|
+
};
|
|
13356
|
+
}
|
|
13357
|
+
return { ...g, children: removeRecursive(g.children) };
|
|
13358
|
+
});
|
|
13359
|
+
};
|
|
13360
|
+
return removeRecursive(prev);
|
|
13361
|
+
});
|
|
13362
|
+
};
|
|
13455
13363
|
if (!isOpen) return null;
|
|
13456
|
-
return /* @__PURE__ */
|
|
13364
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
13457
13365
|
"div",
|
|
13458
13366
|
{
|
|
13459
13367
|
className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
|
|
13460
13368
|
onClick: onClose
|
|
13461
13369
|
},
|
|
13462
|
-
/* @__PURE__ */
|
|
13370
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
13463
13371
|
"div",
|
|
13464
13372
|
{
|
|
13465
|
-
className: "bg-slate-950 border border-white/10 rounded-xl w-[
|
|
13373
|
+
className: "bg-slate-950 border border-white/10 rounded-xl w-[98vw] h-[97vh] flex flex-col shadow-2xl overflow-hidden animate-in fade-in zoom-in-95 duration-200",
|
|
13466
13374
|
onClick: (e) => e.stopPropagation()
|
|
13467
13375
|
},
|
|
13468
|
-
/* @__PURE__ */
|
|
13469
|
-
|
|
13376
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "h-14 px-4 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react27.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-slate-900/50 border border-white/5" }, saveStatus === "saving" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
|
|
13377
|
+
import_fi22.FiLoader,
|
|
13470
13378
|
{
|
|
13471
13379
|
className: "animate-spin text-indigo-400",
|
|
13472
13380
|
size: 12
|
|
13473
13381
|
}
|
|
13474
|
-
), /* @__PURE__ */
|
|
13382
|
+
), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-xs text-indigo-300 font-medium animate-pulse hidden sm:inline-block mr-2" }, "Selecione na lateral..."), canEdit && /* @__PURE__ */ import_react27.default.createElement(
|
|
13475
13383
|
"button",
|
|
13476
13384
|
{
|
|
13477
13385
|
onClick: handleAddRootGroup,
|
|
13478
13386
|
className: "\n flex items-center gap-2 px-3 py-1.5 \n bg-white/5 hover:bg-white/10 \n border border-white/10 hover:border-white/20\n backdrop-blur-sm\n text-slate-200 hover:text-white\n rounded-md transition-all duration-200\n text-xs font-medium shadow-sm\n "
|
|
13479
13387
|
},
|
|
13480
|
-
/* @__PURE__ */
|
|
13481
|
-
/* @__PURE__ */
|
|
13482
|
-
), /* @__PURE__ */
|
|
13388
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlus, { size: 14, className: "text-indigo-400" }),
|
|
13389
|
+
/* @__PURE__ */ import_react27.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
|
|
13390
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
13483
13391
|
"button",
|
|
13484
13392
|
{
|
|
13485
13393
|
onClick: onClose,
|
|
@@ -13487,37 +13395,103 @@ function AncestryBoard({
|
|
|
13487
13395
|
},
|
|
13488
13396
|
"\xD7"
|
|
13489
13397
|
))),
|
|
13490
|
-
/* @__PURE__ */
|
|
13491
|
-
"
|
|
13398
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
13399
|
+
"div",
|
|
13492
13400
|
{
|
|
13493
|
-
|
|
13494
|
-
|
|
13401
|
+
className: `
|
|
13402
|
+
flex flex-col border-r border-white/10 transition-all duration-300 flex-none
|
|
13403
|
+
${pickingGroupId ? "w-[25%] border-indigo-500/30" : "w-[20%]"}
|
|
13404
|
+
min-w-[280px] max-w-[500px] bg-slate-900
|
|
13405
|
+
`
|
|
13495
13406
|
},
|
|
13496
|
-
"
|
|
13497
|
-
|
|
13407
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
13408
|
+
import_fi22.FiSearch,
|
|
13409
|
+
{
|
|
13410
|
+
className: `absolute left-3 top-1/2 -translate-y-1/2 transition-colors ${pickingGroupId ? "text-indigo-400" : "text-slate-500 group-focus-within:text-indigo-400"}`
|
|
13411
|
+
}
|
|
13412
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
13413
|
+
"input",
|
|
13414
|
+
{
|
|
13415
|
+
type: "text",
|
|
13416
|
+
placeholder: pickingGroupId ? "Pesquise nodes ou ancestralidades..." : "Pesquisar no board...",
|
|
13417
|
+
className: `
|
|
13418
|
+
w-full rounded-md pl-9 pr-4 py-2 text-sm transition-all focus:outline-none focus:ring-1 focus:ring-indigo-500 border
|
|
13419
|
+
${pickingGroupId ? "bg-indigo-950/30 border-indigo-500/30 text-white placeholder-indigo-300/50" : "bg-slate-950 border-white/10 text-slate-200 placeholder-slate-600"}
|
|
13420
|
+
`,
|
|
13421
|
+
value: searchTerm,
|
|
13422
|
+
onChange: (e) => setSearchTerm(e.target.value),
|
|
13423
|
+
autoFocus: !pickingGroupId
|
|
13424
|
+
}
|
|
13425
|
+
))),
|
|
13426
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
|
|
13427
|
+
const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
|
|
13428
|
+
const isPicking = !!pickingGroupId;
|
|
13429
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
13430
|
+
"div",
|
|
13431
|
+
{
|
|
13432
|
+
key: anc.id,
|
|
13433
|
+
onClick: () => {
|
|
13434
|
+
if (isPicking) handleSelectAncestry(anc);
|
|
13435
|
+
},
|
|
13436
|
+
className: `
|
|
13437
|
+
group relative flex items-start gap-3 p-3 text-left rounded-lg border transition-all duration-200
|
|
13438
|
+
${isPicking ? "border-indigo-500/30 bg-indigo-500/5 hover:bg-indigo-500/20 hover:border-indigo-400 cursor-pointer" : "border-white/5 bg-slate-800/40 hover:bg-indigo-600/10 hover:border-indigo-500/30 cursor-default"}
|
|
13439
|
+
`
|
|
13440
|
+
},
|
|
13441
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
13442
|
+
"div",
|
|
13443
|
+
{
|
|
13444
|
+
className: `
|
|
13445
|
+
mt-0.5 w-8 h-8 rounded-md grid place-content-center shrink-0 border transition-all shadow-lg
|
|
13446
|
+
${isPicking ? "bg-indigo-500 text-white border-indigo-400" : "bg-slate-800 text-indigo-400 border-white/5 group-hover:bg-indigo-500 group-hover:text-white"}
|
|
13447
|
+
${anc.type === "quest" ? "text-emerald-400" : anc.type === "version" ? "text-amber-400" : anc.type === "node" ? "text-slate-400" : "text-indigo-400"}
|
|
13448
|
+
`
|
|
13449
|
+
},
|
|
13450
|
+
isPicking ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlus, { size: 16 }) : anc.type === "quest" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCheckSquare, { size: 14 }) : anc.type === "version" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiGitBranch, { size: 14 }) : anc.type === "node" ? /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiBox, { size: 14 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiLayers, { size: 14 })
|
|
13451
|
+
),
|
|
13452
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react27.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.searchLabel || "Sem Nome"), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[9px] px-1.5 py-0.5 rounded-full bg-white/5 text-slate-500 border border-white/5 uppercase tracking-tighter" }, anc.type)), anc.type === "ancestry" && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.searchDesc && /* @__PURE__ */ import_react27.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.searchDesc)),
|
|
13453
|
+
!isPicking && /* @__PURE__ */ import_react27.default.createElement(
|
|
13454
|
+
"button",
|
|
13455
|
+
{
|
|
13456
|
+
onClick: (e) => {
|
|
13457
|
+
e.stopPropagation();
|
|
13458
|
+
handleSelectAncestry(anc);
|
|
13459
|
+
},
|
|
13460
|
+
className: "absolute right-2 bottom-2 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0 z-10",
|
|
13461
|
+
title: "Focar no cen\xE1rio"
|
|
13462
|
+
},
|
|
13463
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiPlay, { size: 14, className: "ml-0.5" }))
|
|
13464
|
+
)
|
|
13465
|
+
);
|
|
13466
|
+
}))
|
|
13467
|
+
), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react27.default.createElement(import_fi22.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react27.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react27.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react27.default.createElement(
|
|
13498
13468
|
GroupItem,
|
|
13499
13469
|
{
|
|
13500
13470
|
key: group.id,
|
|
13501
13471
|
index,
|
|
13502
13472
|
group,
|
|
13473
|
+
siblings: groups,
|
|
13503
13474
|
onUpdate: handleUpdateGroup,
|
|
13504
13475
|
onDelete: handleDeleteGroup,
|
|
13505
13476
|
onAddSubgroup: handleAddSubgroup,
|
|
13506
13477
|
onIndent: handleIndent,
|
|
13507
13478
|
onOutdent: handleOutdent,
|
|
13479
|
+
onRemoveAncestry: handleRemoveAncestryFromGroup,
|
|
13480
|
+
onRequestPickAncestry: handleRequestPick,
|
|
13481
|
+
pickingGroupId,
|
|
13508
13482
|
onPlayAncestry: handlePlayFromGroup,
|
|
13509
|
-
|
|
13483
|
+
availableIds,
|
|
13510
13484
|
canEdit
|
|
13511
13485
|
}
|
|
13512
13486
|
))))),
|
|
13513
|
-
/* @__PURE__ */
|
|
13487
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-between flex-shrink-0" }, /* @__PURE__ */ import_react27.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react27.default.createElement("span", null, groups.length, " grupos raiz"))
|
|
13514
13488
|
)
|
|
13515
13489
|
);
|
|
13516
13490
|
}
|
|
13517
13491
|
|
|
13518
13492
|
// src/components/MilestoneManager.jsx
|
|
13519
|
-
var
|
|
13520
|
-
var
|
|
13493
|
+
var import_react28 = __toESM(require("react"));
|
|
13494
|
+
var import_fi23 = require("react-icons/fi");
|
|
13521
13495
|
function MilestoneManager({
|
|
13522
13496
|
isOpen,
|
|
13523
13497
|
onClose,
|
|
@@ -13525,7 +13499,7 @@ function MilestoneManager({
|
|
|
13525
13499
|
onUpdateMilestones = () => {
|
|
13526
13500
|
}
|
|
13527
13501
|
}) {
|
|
13528
|
-
const [newMilestoneName, setNewMilestoneName] = (0,
|
|
13502
|
+
const [newMilestoneName, setNewMilestoneName] = (0, import_react28.useState)("");
|
|
13529
13503
|
const handleAddMilestone = () => {
|
|
13530
13504
|
if (!newMilestoneName.trim()) return;
|
|
13531
13505
|
const newMilestone = {
|
|
@@ -13550,27 +13524,27 @@ function MilestoneManager({
|
|
|
13550
13524
|
};
|
|
13551
13525
|
if (!isOpen) return null;
|
|
13552
13526
|
const swallow = (e) => e.stopPropagation();
|
|
13553
|
-
return /* @__PURE__ */
|
|
13527
|
+
return /* @__PURE__ */ import_react28.default.createElement(
|
|
13554
13528
|
"div",
|
|
13555
13529
|
{
|
|
13556
13530
|
className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-slate-950/40 backdrop-blur-sm animate-in fade-in duration-300",
|
|
13557
13531
|
onClick: onClose
|
|
13558
13532
|
},
|
|
13559
|
-
/* @__PURE__ */
|
|
13533
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
13560
13534
|
"div",
|
|
13561
13535
|
{
|
|
13562
13536
|
className: "w-full max-w-lg bg-slate-900/90 backdrop-blur-xl border border-white/10 rounded-2xl shadow-2xl flex flex-col max-h-[85vh] animate-in zoom-in-95 duration-300",
|
|
13563
13537
|
onClick: swallow
|
|
13564
13538
|
},
|
|
13565
|
-
/* @__PURE__ */
|
|
13539
|
+
/* @__PURE__ */ import_react28.default.createElement("div", { className: "px-6 py-4 border-b border-white/10 flex items-center justify-between" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "p-2 rounded-lg bg-indigo-500/20 text-indigo-400" }, /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiTarget, { size: 20 })), /* @__PURE__ */ import_react28.default.createElement("div", null, /* @__PURE__ */ import_react28.default.createElement("h2", { className: "text-lg font-semibold text-slate-100" }, "Milestones"), /* @__PURE__ */ import_react28.default.createElement("p", { className: "text-xs text-slate-400" }, "Gerencie os marcos do seu cen\xE1rio"))), /* @__PURE__ */ import_react28.default.createElement(
|
|
13566
13540
|
"button",
|
|
13567
13541
|
{
|
|
13568
13542
|
onClick: onClose,
|
|
13569
13543
|
className: "p-2 rounded-full hover:bg-white/10 text-slate-400 hover:text-white transition-colors"
|
|
13570
13544
|
},
|
|
13571
|
-
/* @__PURE__ */
|
|
13545
|
+
/* @__PURE__ */ import_react28.default.createElement(import_fi23.FiX, { size: 20 })
|
|
13572
13546
|
)),
|
|
13573
|
-
/* @__PURE__ */
|
|
13547
|
+
/* @__PURE__ */ import_react28.default.createElement("div", { className: "px-6 py-5 bg-white/5 border-b border-white/5" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ import_react28.default.createElement(
|
|
13574
13548
|
"input",
|
|
13575
13549
|
{
|
|
13576
13550
|
type: "text",
|
|
@@ -13580,47 +13554,47 @@ function MilestoneManager({
|
|
|
13580
13554
|
placeholder: "Adicionar novo milestone...",
|
|
13581
13555
|
className: "flex-1 bg-slate-800/50 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-slate-100 placeholder:text-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 focus:border-indigo-500/50 transition-all shadow-inner"
|
|
13582
13556
|
}
|
|
13583
|
-
), /* @__PURE__ */
|
|
13557
|
+
), /* @__PURE__ */ import_react28.default.createElement(
|
|
13584
13558
|
"button",
|
|
13585
13559
|
{
|
|
13586
13560
|
onClick: handleAddMilestone,
|
|
13587
13561
|
disabled: !newMilestoneName.trim(),
|
|
13588
13562
|
className: "px-4 py-2.5 rounded-xl bg-indigo-600 hover:bg-indigo-500 disabled:opacity-30 disabled:cursor-not-allowed text-white text-sm font-medium transition-all flex items-center gap-2 shadow-lg shadow-indigo-500/20 active:scale-95"
|
|
13589
13563
|
},
|
|
13590
|
-
/* @__PURE__ */
|
|
13564
|
+
/* @__PURE__ */ import_react28.default.createElement(import_fi23.FiPlus, { size: 18 }),
|
|
13591
13565
|
"Adicionar"
|
|
13592
13566
|
))),
|
|
13593
|
-
/* @__PURE__ */
|
|
13567
|
+
/* @__PURE__ */ import_react28.default.createElement("div", { className: "flex-1 overflow-y-auto px-6 py-4 custom-scrollbar" }, milestones.length > 0 ? /* @__PURE__ */ import_react28.default.createElement("div", { className: "space-y-3" }, milestones.map((ms) => /* @__PURE__ */ import_react28.default.createElement(
|
|
13594
13568
|
"div",
|
|
13595
13569
|
{
|
|
13596
13570
|
key: ms.id,
|
|
13597
13571
|
className: `group flex items-center justify-between p-4 rounded-xl border transition-all duration-200 ${ms.status === "active" ? "bg-slate-800/40 border-indigo-500/20 hover:border-indigo-500/40" : "bg-slate-900/40 border-white/5 opacity-60 grayscale-[0.3]"}`
|
|
13598
13572
|
},
|
|
13599
|
-
/* @__PURE__ */
|
|
13573
|
+
/* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react28.default.createElement(
|
|
13600
13574
|
"div",
|
|
13601
13575
|
{
|
|
13602
13576
|
className: `w-2 h-2 rounded-full shrink-0 ${ms.status === "active" ? "bg-indigo-400 shadow-[0_0_8px_rgba(129,140,248,0.6)]" : "bg-slate-600"}`
|
|
13603
13577
|
}
|
|
13604
|
-
), /* @__PURE__ */
|
|
13605
|
-
/* @__PURE__ */
|
|
13578
|
+
), /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: `text-sm font-medium truncate ${ms.status === "active" ? "text-slate-100" : "text-slate-400 line-through"}` }, ms.name), /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-wider" }, ms.status === "active" ? "Ativo" : "Inativo"))),
|
|
13579
|
+
/* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react28.default.createElement(
|
|
13606
13580
|
"button",
|
|
13607
13581
|
{
|
|
13608
13582
|
onClick: () => handleToggleMilestoneStatus(ms.id),
|
|
13609
13583
|
className: `p-2 rounded-lg transition-all ${ms.status === "active" ? "hover:bg-slate-700 text-slate-400" : "hover:bg-indigo-500/20 text-indigo-400"}`,
|
|
13610
13584
|
title: ms.status === "active" ? "Inativar" : "Ativar"
|
|
13611
13585
|
},
|
|
13612
|
-
ms.status === "active" ? /* @__PURE__ */
|
|
13613
|
-
), /* @__PURE__ */
|
|
13586
|
+
ms.status === "active" ? /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiPauseCircle, { size: 18 }) : /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiPlayCircle, { size: 18 })
|
|
13587
|
+
), /* @__PURE__ */ import_react28.default.createElement(
|
|
13614
13588
|
"button",
|
|
13615
13589
|
{
|
|
13616
13590
|
onClick: () => handleRemoveMilestone(ms.id),
|
|
13617
13591
|
className: "p-2 rounded-lg hover:bg-red-500/20 text-slate-500 hover:text-red-400 transition-all",
|
|
13618
13592
|
title: "Remover"
|
|
13619
13593
|
},
|
|
13620
|
-
/* @__PURE__ */
|
|
13594
|
+
/* @__PURE__ */ import_react28.default.createElement(import_fi23.FiTrash2, { size: 18 })
|
|
13621
13595
|
))
|
|
13622
|
-
))) : /* @__PURE__ */
|
|
13623
|
-
/* @__PURE__ */
|
|
13596
|
+
))) : /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col items-center justify-center py-12 text-center" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "p-4 rounded-full bg-slate-800/30 text-slate-600 mb-4" }, /* @__PURE__ */ import_react28.default.createElement(import_fi23.FiTarget, { size: 40 })), /* @__PURE__ */ import_react28.default.createElement("h3", { className: "text-slate-400 font-medium" }, "Nenhum milestone definido"), /* @__PURE__ */ import_react28.default.createElement("p", { className: "text-xs text-slate-600 max-w-[200px] mt-1 italic" }, "Defina marcos importantes para orientar o progresso do projeto."))),
|
|
13597
|
+
/* @__PURE__ */ import_react28.default.createElement("div", { className: "px-6 py-4 border-t border-white/5 bg-slate-900/50 flex items-center justify-between rounded-b-2xl" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Total:"), /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-xs font-bold text-slate-300" }, milestones.length)), /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex items-center gap-1.5" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-widest" }, "Ativos:"), /* @__PURE__ */ import_react28.default.createElement("span", { className: "text-xs font-bold text-indigo-400" }, milestones.filter((m) => m.status === "active").length))))
|
|
13624
13598
|
)
|
|
13625
13599
|
);
|
|
13626
13600
|
}
|
|
@@ -13706,13 +13680,13 @@ function XViewScene({
|
|
|
13706
13680
|
check_user_permission,
|
|
13707
13681
|
get_view_members
|
|
13708
13682
|
}) {
|
|
13709
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l
|
|
13710
|
-
const { data: session, status } = (0,
|
|
13683
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
|
|
13684
|
+
const { data: session, status } = (0, import_react30.useSession)();
|
|
13711
13685
|
const router = (0, import_navigation.useRouter)();
|
|
13712
13686
|
const searchParams = (0, import_navigation.useSearchParams)();
|
|
13713
13687
|
const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
|
|
13714
13688
|
const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
|
|
13715
|
-
const viewParams = (0,
|
|
13689
|
+
const viewParams = (0, import_react29.useMemo)(() => {
|
|
13716
13690
|
if (encryptedConfig) {
|
|
13717
13691
|
const data = decryptData(encryptedConfig);
|
|
13718
13692
|
if (data) {
|
|
@@ -13721,7 +13695,7 @@ function XViewScene({
|
|
|
13721
13695
|
}
|
|
13722
13696
|
return null;
|
|
13723
13697
|
}, [encryptedConfig, session]);
|
|
13724
|
-
(0,
|
|
13698
|
+
(0, import_react29.useEffect)(() => {
|
|
13725
13699
|
async function verifyPermission() {
|
|
13726
13700
|
if (!viewParams || !session || !check_user_permission) return;
|
|
13727
13701
|
const { id, type, owner_id } = viewParams;
|
|
@@ -13758,65 +13732,65 @@ function XViewScene({
|
|
|
13758
13732
|
setIsLoading(false);
|
|
13759
13733
|
}
|
|
13760
13734
|
}, [viewParams, session, status, check_user_permission]);
|
|
13761
|
-
const sceneConfigId = (0,
|
|
13762
|
-
const ownerId = (0,
|
|
13763
|
-
const dbSaveUrl = (0,
|
|
13735
|
+
const sceneConfigId = (0, import_react29.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
|
|
13736
|
+
const ownerId = (0, import_react29.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
|
|
13737
|
+
const dbSaveUrl = (0, import_react29.useMemo)(() => {
|
|
13764
13738
|
if (ownerId && sceneConfigId) {
|
|
13765
13739
|
return `x_view_dbs/${ownerId}/${sceneConfigId}`;
|
|
13766
13740
|
}
|
|
13767
13741
|
return null;
|
|
13768
13742
|
}, [ownerId, sceneConfigId]);
|
|
13769
|
-
const sceneSaveUrl = (0,
|
|
13743
|
+
const sceneSaveUrl = (0, import_react29.useMemo)(() => {
|
|
13770
13744
|
if (ownerId && sceneConfigId) {
|
|
13771
13745
|
return `x_view_scenes/${ownerId}/${sceneConfigId}`;
|
|
13772
13746
|
}
|
|
13773
13747
|
return null;
|
|
13774
13748
|
}, [ownerId, sceneConfigId]);
|
|
13775
|
-
const ancestry_save_url = (0,
|
|
13749
|
+
const ancestry_save_url = (0, import_react29.useMemo)(() => {
|
|
13776
13750
|
if (ownerId && sceneConfigId) {
|
|
13777
13751
|
return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
|
|
13778
13752
|
}
|
|
13779
13753
|
return null;
|
|
13780
13754
|
}, [ownerId, sceneConfigId]);
|
|
13781
|
-
const sceneDataRef = (0,
|
|
13782
|
-
const parentDataRef = (0,
|
|
13783
|
-
const ancestryDataRef = (0,
|
|
13784
|
-
const [isLoading, setIsLoading] = (0,
|
|
13785
|
-
const [permissionStatus, setPermissionStatus] = (0,
|
|
13786
|
-
const [userPermissionRole, setUserPermissionRole] = (0,
|
|
13787
|
-
const [viewMembers, setViewMembers] = (0,
|
|
13788
|
-
const [isInitialized, setIsInitialized] = (0,
|
|
13789
|
-
const [sceneVersion, setSceneVersion] = (0,
|
|
13790
|
-
const [contextMenu, setContextMenu] = (0,
|
|
13755
|
+
const sceneDataRef = (0, import_react29.useRef)(null);
|
|
13756
|
+
const parentDataRef = (0, import_react29.useRef)(null);
|
|
13757
|
+
const ancestryDataRef = (0, import_react29.useRef)(null);
|
|
13758
|
+
const [isLoading, setIsLoading] = (0, import_react29.useState)(true);
|
|
13759
|
+
const [permissionStatus, setPermissionStatus] = (0, import_react29.useState)("loading");
|
|
13760
|
+
const [userPermissionRole, setUserPermissionRole] = (0, import_react29.useState)(null);
|
|
13761
|
+
const [viewMembers, setViewMembers] = (0, import_react29.useState)([]);
|
|
13762
|
+
const [isInitialized, setIsInitialized] = (0, import_react29.useState)(false);
|
|
13763
|
+
const [sceneVersion, setSceneVersion] = (0, import_react29.useState)(0);
|
|
13764
|
+
const [contextMenu, setContextMenu] = (0, import_react29.useState)({
|
|
13791
13765
|
visible: false,
|
|
13792
13766
|
x: 0,
|
|
13793
13767
|
y: 0,
|
|
13794
13768
|
nodeData: null
|
|
13795
13769
|
});
|
|
13796
|
-
const [multiContextMenu, setMultiContextMenu] = (0,
|
|
13770
|
+
const [multiContextMenu, setMultiContextMenu] = (0, import_react29.useState)({
|
|
13797
13771
|
visible: false,
|
|
13798
13772
|
x: 0,
|
|
13799
13773
|
y: 0,
|
|
13800
13774
|
nodeIds: null
|
|
13801
13775
|
});
|
|
13802
|
-
const [relationshipMenu, setRelationshipMenu] = (0,
|
|
13776
|
+
const [relationshipMenu, setRelationshipMenu] = (0, import_react29.useState)({
|
|
13803
13777
|
visible: false,
|
|
13804
13778
|
x: 0,
|
|
13805
13779
|
y: 0,
|
|
13806
13780
|
linkObject: null
|
|
13807
13781
|
});
|
|
13808
|
-
const [creationMode, setCreationMode] = (0,
|
|
13782
|
+
const [creationMode, setCreationMode] = (0, import_react29.useState)({
|
|
13809
13783
|
isActive: false,
|
|
13810
13784
|
sourceNodeData: null
|
|
13811
13785
|
});
|
|
13812
|
-
const [versionMode, setVersionMode] = (0,
|
|
13786
|
+
const [versionMode, setVersionMode] = (0, import_react29.useState)({
|
|
13813
13787
|
isActive: false,
|
|
13814
13788
|
sourceNodeData: null
|
|
13815
13789
|
});
|
|
13816
|
-
const [questMode, setQuestMode] = (0,
|
|
13817
|
-
const [hasFocusedInitial, setHasFocusedInitial] = (0,
|
|
13818
|
-
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0,
|
|
13819
|
-
const [ancestryMode, setAncestryMode] = (0,
|
|
13790
|
+
const [questMode, setQuestMode] = (0, import_react29.useState)({ isActive: false });
|
|
13791
|
+
const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react29.useState)(false);
|
|
13792
|
+
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react29.useState)(false);
|
|
13793
|
+
const [ancestryMode, setAncestryMode] = (0, import_react29.useState)({
|
|
13820
13794
|
isActive: false,
|
|
13821
13795
|
tree: null,
|
|
13822
13796
|
selectedParentId: null,
|
|
@@ -13827,42 +13801,42 @@ function XViewScene({
|
|
|
13827
13801
|
ancestryDescriptionSections: [],
|
|
13828
13802
|
isAddingNodes: false
|
|
13829
13803
|
});
|
|
13830
|
-
const [readingMode, setReadingMode] = (0,
|
|
13804
|
+
const [readingMode, setReadingMode] = (0, import_react29.useState)({
|
|
13831
13805
|
isActive: false,
|
|
13832
13806
|
ancestry: null,
|
|
13833
13807
|
branchStack: [],
|
|
13834
13808
|
autoAbstraction: false
|
|
13835
13809
|
});
|
|
13836
|
-
const [formPosition, setFormPosition] = (0,
|
|
13810
|
+
const [formPosition, setFormPosition] = (0, import_react29.useState)({
|
|
13837
13811
|
left: 16,
|
|
13838
13812
|
top: 16,
|
|
13839
13813
|
opacity: 0
|
|
13840
13814
|
});
|
|
13841
|
-
const [detailsNode, setDetailsNode] = (0,
|
|
13842
|
-
const [detailsLink, setDetailsLink] = (0,
|
|
13843
|
-
const [ancestryLinkDetails, setAncestryLinkDetails] = (0,
|
|
13844
|
-
const [imageViewer, setImageViewer] = (0,
|
|
13815
|
+
const [detailsNode, setDetailsNode] = (0, import_react29.useState)(null);
|
|
13816
|
+
const [detailsLink, setDetailsLink] = (0, import_react29.useState)(null);
|
|
13817
|
+
const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react29.useState)(null);
|
|
13818
|
+
const [imageViewer, setImageViewer] = (0, import_react29.useState)({
|
|
13845
13819
|
visible: false,
|
|
13846
13820
|
images: [],
|
|
13847
13821
|
startIndex: 0
|
|
13848
13822
|
});
|
|
13849
|
-
const [editingAncestryRel, setEditingAncestryRel] = (0,
|
|
13823
|
+
const [editingAncestryRel, setEditingAncestryRel] = (0, import_react29.useState)({
|
|
13850
13824
|
visible: false,
|
|
13851
13825
|
data: null,
|
|
13852
13826
|
path: null
|
|
13853
13827
|
});
|
|
13854
|
-
const [isImportModalOpen, setIsImportModalOpen] = (0,
|
|
13855
|
-
const [importSuccessMessage, setImportSuccessMessage] = (0,
|
|
13856
|
-
const [invalidTargetError, setInvalidTargetError] = (0,
|
|
13857
|
-
const [highlightedNodeId, setHighlightedNodeId] = (0,
|
|
13858
|
-
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0,
|
|
13859
|
-
const [ancestryBoardData, setAncestryBoardData] = (0,
|
|
13860
|
-
const [isSidebarOpen, setIsSidebarOpen] = (0,
|
|
13861
|
-
const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0,
|
|
13862
|
-
const mountRef = (0,
|
|
13863
|
-
const tooltipRef = (0,
|
|
13864
|
-
const formRef = (0,
|
|
13865
|
-
const stateRef = (0,
|
|
13828
|
+
const [isImportModalOpen, setIsImportModalOpen] = (0, import_react29.useState)(false);
|
|
13829
|
+
const [importSuccessMessage, setImportSuccessMessage] = (0, import_react29.useState)("");
|
|
13830
|
+
const [invalidTargetError, setInvalidTargetError] = (0, import_react29.useState)(null);
|
|
13831
|
+
const [highlightedNodeId, setHighlightedNodeId] = (0, import_react29.useState)(null);
|
|
13832
|
+
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react29.useState)(false);
|
|
13833
|
+
const [ancestryBoardData, setAncestryBoardData] = (0, import_react29.useState)([]);
|
|
13834
|
+
const [isSidebarOpen, setIsSidebarOpen] = (0, import_react29.useState)(false);
|
|
13835
|
+
const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react29.useState)(false);
|
|
13836
|
+
const mountRef = (0, import_react29.useRef)(null);
|
|
13837
|
+
const tooltipRef = (0, import_react29.useRef)(null);
|
|
13838
|
+
const formRef = (0, import_react29.useRef)(null);
|
|
13839
|
+
const stateRef = (0, import_react29.useRef)({
|
|
13866
13840
|
readMode: {
|
|
13867
13841
|
currentMaxIndex: 0,
|
|
13868
13842
|
progressMap: {}
|
|
@@ -13926,10 +13900,10 @@ function XViewScene({
|
|
|
13926
13900
|
minWidth: 320,
|
|
13927
13901
|
maxWidth: maxReadPanelW
|
|
13928
13902
|
});
|
|
13929
|
-
(0,
|
|
13903
|
+
(0, import_react29.useEffect)(() => {
|
|
13930
13904
|
stateRef.current.ancestry = ancestryMode;
|
|
13931
13905
|
}, [ancestryMode]);
|
|
13932
|
-
(0,
|
|
13906
|
+
(0, import_react29.useEffect)(() => {
|
|
13933
13907
|
var _a2;
|
|
13934
13908
|
if (!isInitialized) return;
|
|
13935
13909
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -13952,10 +13926,10 @@ function XViewScene({
|
|
|
13952
13926
|
}
|
|
13953
13927
|
stateRef.current.nodeIdToParentFileMap = map;
|
|
13954
13928
|
}, [isInitialized, sceneVersion]);
|
|
13955
|
-
const handleNavigateBack = (0,
|
|
13929
|
+
const handleNavigateBack = (0, import_react29.useCallback)(() => {
|
|
13956
13930
|
router.push("/dashboard/scenes");
|
|
13957
13931
|
}, [router]);
|
|
13958
|
-
const handleConfirmImport = (0,
|
|
13932
|
+
const handleConfirmImport = (0, import_react29.useCallback)(
|
|
13959
13933
|
async (importPayload) => {
|
|
13960
13934
|
var _a2, _b2;
|
|
13961
13935
|
let files = [];
|
|
@@ -14083,7 +14057,7 @@ function XViewScene({
|
|
|
14083
14057
|
const handleOpenImageViewer = (images, startIndex) => {
|
|
14084
14058
|
setImageViewer({ visible: true, images, startIndex });
|
|
14085
14059
|
};
|
|
14086
|
-
const tweenToTarget = (0,
|
|
14060
|
+
const tweenToTarget = (0, import_react29.useCallback)(
|
|
14087
14061
|
(target, zoomFactor = 1, forcedDirection = null) => {
|
|
14088
14062
|
const { camera, controls, tweenGroup } = stateRef.current;
|
|
14089
14063
|
if (!camera || !controls || !tweenGroup) return;
|
|
@@ -14109,7 +14083,7 @@ function XViewScene({
|
|
|
14109
14083
|
if (!t || typeof t.closest !== "function") return false;
|
|
14110
14084
|
return !!t.closest(".ui-overlay");
|
|
14111
14085
|
};
|
|
14112
|
-
const buildFullAncestryTree = (0,
|
|
14086
|
+
const buildFullAncestryTree = (0, import_react29.useCallback)(
|
|
14113
14087
|
(idTree, nodes, ancestries = []) => {
|
|
14114
14088
|
if (!idTree) return null;
|
|
14115
14089
|
const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
|
|
@@ -14194,7 +14168,7 @@ function XViewScene({
|
|
|
14194
14168
|
},
|
|
14195
14169
|
[]
|
|
14196
14170
|
);
|
|
14197
|
-
const handleActivateTimeline = (0,
|
|
14171
|
+
const handleActivateTimeline = (0, import_react29.useCallback)(() => {
|
|
14198
14172
|
const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
14199
14173
|
if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
|
|
14200
14174
|
while (timelineIntervalsGroup.children.length > 0) {
|
|
@@ -14354,7 +14328,7 @@ function XViewScene({
|
|
|
14354
14328
|
}
|
|
14355
14329
|
});
|
|
14356
14330
|
}, []);
|
|
14357
|
-
const handleVersionTimeline = (0,
|
|
14331
|
+
const handleVersionTimeline = (0, import_react29.useCallback)((sourceMesh, versionMeshes) => {
|
|
14358
14332
|
const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
14359
14333
|
if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
|
|
14360
14334
|
return;
|
|
@@ -14491,7 +14465,7 @@ function XViewScene({
|
|
|
14491
14465
|
}
|
|
14492
14466
|
});
|
|
14493
14467
|
}, []);
|
|
14494
|
-
(0,
|
|
14468
|
+
(0, import_react29.useEffect)(() => {
|
|
14495
14469
|
async function fetchAllData(configPath, ownerId2) {
|
|
14496
14470
|
var _a2, _b2;
|
|
14497
14471
|
if (!get_scene_view_data) {
|
|
@@ -14596,12 +14570,12 @@ function XViewScene({
|
|
|
14596
14570
|
focusNodeId,
|
|
14597
14571
|
focusAncestryId
|
|
14598
14572
|
]);
|
|
14599
|
-
const isNodeInView = (0,
|
|
14573
|
+
const isNodeInView = (0, import_react29.useCallback)((id) => {
|
|
14600
14574
|
const key = String(id);
|
|
14601
14575
|
const objs = stateRef.current.nodeObjects || {};
|
|
14602
14576
|
return !!objs[key];
|
|
14603
14577
|
}, []);
|
|
14604
|
-
const addOrUpdateNodeMesh = (0,
|
|
14578
|
+
const addOrUpdateNodeMesh = (0, import_react29.useCallback)(
|
|
14605
14579
|
(nodeData, position, suppressVersionUpdate = false, forceShowQuestDate = false) => {
|
|
14606
14580
|
const {
|
|
14607
14581
|
graphGroup,
|
|
@@ -14642,7 +14616,7 @@ function XViewScene({
|
|
|
14642
14616
|
},
|
|
14643
14617
|
[]
|
|
14644
14618
|
);
|
|
14645
|
-
const handleActivateQuestLens = (0,
|
|
14619
|
+
const handleActivateQuestLens = (0, import_react29.useCallback)(({ assigneeId, status: status2, milestoneId }) => {
|
|
14646
14620
|
var _a2;
|
|
14647
14621
|
const { nodeObjects, tweenGroup, graphGroup } = stateRef.current;
|
|
14648
14622
|
if (!nodeObjects || !tweenGroup || !graphGroup) return;
|
|
@@ -14856,7 +14830,7 @@ function XViewScene({
|
|
|
14856
14830
|
camTween.start();
|
|
14857
14831
|
}
|
|
14858
14832
|
}, [addOrUpdateNodeMesh]);
|
|
14859
|
-
(0,
|
|
14833
|
+
(0, import_react29.useEffect)(() => {
|
|
14860
14834
|
if (!isInitialized || !sceneDataRef.current) return;
|
|
14861
14835
|
const currentMount = mountRef.current;
|
|
14862
14836
|
if (!currentMount) return;
|
|
@@ -15612,7 +15586,7 @@ function XViewScene({
|
|
|
15612
15586
|
get_scene_view_data,
|
|
15613
15587
|
save_view_data
|
|
15614
15588
|
]);
|
|
15615
|
-
const handleGhostNodeImageChange = (0,
|
|
15589
|
+
const handleGhostNodeImageChange = (0, import_react29.useCallback)((useImage, imageUrl) => {
|
|
15616
15590
|
const {
|
|
15617
15591
|
node: ghostNode,
|
|
15618
15592
|
line: ghostLine,
|
|
@@ -15660,7 +15634,7 @@ function XViewScene({
|
|
|
15660
15634
|
aura: newGhostNode.getObjectByName("aura")
|
|
15661
15635
|
};
|
|
15662
15636
|
}, []);
|
|
15663
|
-
const handleGhostNodeIntensityChange = (0,
|
|
15637
|
+
const handleGhostNodeIntensityChange = (0, import_react29.useCallback)((newIntensity) => {
|
|
15664
15638
|
const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
|
|
15665
15639
|
if (!ghostNode) return;
|
|
15666
15640
|
const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
|
|
@@ -15681,7 +15655,7 @@ function XViewScene({
|
|
|
15681
15655
|
ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
|
|
15682
15656
|
}
|
|
15683
15657
|
}, []);
|
|
15684
|
-
const handleDetailNodeIntensityChange = (0,
|
|
15658
|
+
const handleDetailNodeIntensityChange = (0, import_react29.useCallback)(
|
|
15685
15659
|
(nodeId, newIntensity) => {
|
|
15686
15660
|
const mesh = stateRef.current.nodeObjects[String(nodeId)];
|
|
15687
15661
|
if (!mesh) return;
|
|
@@ -15837,7 +15811,7 @@ function XViewScene({
|
|
|
15837
15811
|
mountRef.current.style.cursor = "default";
|
|
15838
15812
|
}
|
|
15839
15813
|
};
|
|
15840
|
-
const handleAncestryTreeUpdate = (0,
|
|
15814
|
+
const handleAncestryTreeUpdate = (0, import_react29.useCallback)((newTree, extraData = null) => {
|
|
15841
15815
|
setAncestryMode((prev) => {
|
|
15842
15816
|
const prevTreeStr = JSON.stringify(prev.tree);
|
|
15843
15817
|
const newTreeStr = JSON.stringify(newTree);
|
|
@@ -15860,7 +15834,7 @@ function XViewScene({
|
|
|
15860
15834
|
};
|
|
15861
15835
|
});
|
|
15862
15836
|
}, []);
|
|
15863
|
-
const actionHandlerContext = (0,
|
|
15837
|
+
const actionHandlerContext = (0, import_react29.useMemo)(
|
|
15864
15838
|
() => {
|
|
15865
15839
|
var _a2;
|
|
15866
15840
|
return {
|
|
@@ -15921,7 +15895,7 @@ function XViewScene({
|
|
|
15921
15895
|
const handleStartVersioning = (nodeData) => {
|
|
15922
15896
|
userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
|
|
15923
15897
|
};
|
|
15924
|
-
const handleStartQuestQuick = (0,
|
|
15898
|
+
const handleStartQuestQuick = (0, import_react29.useCallback)((questNode) => {
|
|
15925
15899
|
var _a2, _b2, _c2;
|
|
15926
15900
|
if (!questNode || !actionHandlerContext) return;
|
|
15927
15901
|
const allParentNodes = Object.values(parentDataRef.current).flatMap((fileData) => fileData.nodes || []);
|
|
@@ -15956,7 +15930,7 @@ function XViewScene({
|
|
|
15956
15930
|
}
|
|
15957
15931
|
setDetailsNode(updatedNode);
|
|
15958
15932
|
}, [session, actionHandlerContext]);
|
|
15959
|
-
const handleFinishQuestQuick = (0,
|
|
15933
|
+
const handleFinishQuestQuick = (0, import_react29.useCallback)((questNode) => {
|
|
15960
15934
|
var _a2, _b2, _c2, _d2;
|
|
15961
15935
|
if (!questNode || !actionHandlerContext) return;
|
|
15962
15936
|
const {
|
|
@@ -16030,7 +16004,7 @@ function XViewScene({
|
|
|
16030
16004
|
setDetailsNode(null);
|
|
16031
16005
|
}
|
|
16032
16006
|
}, [session, actionHandlerContext, viewMembers, detailsNode]);
|
|
16033
|
-
const handleCancelQuest = (0,
|
|
16007
|
+
const handleCancelQuest = (0, import_react29.useCallback)(() => {
|
|
16034
16008
|
const { graphGroup, ghostElements } = stateRef.current;
|
|
16035
16009
|
if (ghostElements.node && graphGroup) {
|
|
16036
16010
|
if (ghostElements.node.userData.labelObject) {
|
|
@@ -16089,13 +16063,15 @@ function XViewScene({
|
|
|
16089
16063
|
try {
|
|
16090
16064
|
await actions.save_view_data(sceneSaveUrl2, sceneFileData);
|
|
16091
16065
|
sceneDataRef2.current.quest_counter = currentCounter + 1;
|
|
16092
|
-
sceneDataRef2.current.quest_nodes = sceneFileData.quest_nodes;
|
|
16093
|
-
sceneDataRef2.current.quest_links = sceneFileData.quest_links;
|
|
16094
16066
|
stateRef2.current.nodeIdToParentFileMap.set(String(newNode.id), {
|
|
16095
16067
|
parentFileId: sceneConfigId2,
|
|
16096
16068
|
ownerId: ownerId2,
|
|
16097
16069
|
datasetName: "Quests Internas (View)"
|
|
16098
16070
|
});
|
|
16071
|
+
sceneDataRef2.current.quest_nodes = [...graphDataRef.current[sceneConfigId2].nodes];
|
|
16072
|
+
if (parentDataRef.current[sceneConfigId2]) {
|
|
16073
|
+
parentDataRef.current[sceneConfigId2].nodes = [...graphDataRef.current[sceneConfigId2].nodes];
|
|
16074
|
+
}
|
|
16099
16075
|
const finalPosition = stateRef2.current.ghostElements.node ? stateRef2.current.ghostElements.node.position.clone() : stateRef2.current.controls.target.clone();
|
|
16100
16076
|
const { graphGroup, ghostElements } = stateRef2.current;
|
|
16101
16077
|
if (ghostElements.node && graphGroup) {
|
|
@@ -16185,7 +16161,7 @@ function XViewScene({
|
|
|
16185
16161
|
}
|
|
16186
16162
|
userActionHandlers.handleCancelConnection(context);
|
|
16187
16163
|
};
|
|
16188
|
-
const handleClearAncestryVisuals = (0,
|
|
16164
|
+
const handleClearAncestryVisuals = (0, import_react29.useCallback)((ancestryId) => {
|
|
16189
16165
|
const { renderedAncestries, ancestryGroup } = stateRef.current;
|
|
16190
16166
|
const renderIndex = renderedAncestries.findIndex(
|
|
16191
16167
|
(a) => String(a.id) === String(ancestryId)
|
|
@@ -16203,7 +16179,7 @@ function XViewScene({
|
|
|
16203
16179
|
);
|
|
16204
16180
|
}
|
|
16205
16181
|
}, []);
|
|
16206
|
-
const handleRenderAncestry = (0,
|
|
16182
|
+
const handleRenderAncestry = (0, import_react29.useCallback)(
|
|
16207
16183
|
async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
|
|
16208
16184
|
setContextMenu(
|
|
16209
16185
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -16697,7 +16673,7 @@ function XViewScene({
|
|
|
16697
16673
|
ancestryMode.isActive
|
|
16698
16674
|
]
|
|
16699
16675
|
);
|
|
16700
|
-
const handleRenderAbstractionTree = (0,
|
|
16676
|
+
const handleRenderAbstractionTree = (0, import_react29.useCallback)(
|
|
16701
16677
|
(ancestryObject, targetNodeId = null) => {
|
|
16702
16678
|
setContextMenu(
|
|
16703
16679
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -16785,7 +16761,7 @@ function XViewScene({
|
|
|
16785
16761
|
handleClearAncestryVisuals
|
|
16786
16762
|
]
|
|
16787
16763
|
);
|
|
16788
|
-
const handleReadModeBranchNav = (0,
|
|
16764
|
+
const handleReadModeBranchNav = (0, import_react29.useCallback)(
|
|
16789
16765
|
(nodeId, action, direction = "right") => {
|
|
16790
16766
|
const { ancestry, branchStack } = readingMode;
|
|
16791
16767
|
if (!ancestry || !ancestry.tree) return;
|
|
@@ -16963,13 +16939,13 @@ function XViewScene({
|
|
|
16963
16939
|
},
|
|
16964
16940
|
[readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
|
|
16965
16941
|
);
|
|
16966
|
-
const handleReadModeHighlight = (0,
|
|
16942
|
+
const handleReadModeHighlight = (0, import_react29.useCallback)((nodeId) => {
|
|
16967
16943
|
if (stateRef.current.highlightedNodeId !== nodeId) {
|
|
16968
16944
|
stateRef.current.highlightedNodeId = nodeId;
|
|
16969
16945
|
}
|
|
16970
16946
|
setHighlightedNodeId(nodeId);
|
|
16971
16947
|
}, []);
|
|
16972
|
-
const activeNodeBranches = (0,
|
|
16948
|
+
const activeNodeBranches = (0, import_react29.useMemo)(() => {
|
|
16973
16949
|
if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
|
|
16974
16950
|
return null;
|
|
16975
16951
|
const fullTree = buildFullAncestryTree(
|
|
@@ -17013,7 +16989,7 @@ function XViewScene({
|
|
|
17013
16989
|
readingMode.branchStack,
|
|
17014
16990
|
ancestryDataRef.current
|
|
17015
16991
|
]);
|
|
17016
|
-
const backNavigationInfo = (0,
|
|
16992
|
+
const backNavigationInfo = (0, import_react29.useMemo)(() => {
|
|
17017
16993
|
const { branchStack } = readingMode;
|
|
17018
16994
|
if (!branchStack || branchStack.length === 0) return null;
|
|
17019
16995
|
const lastStep = branchStack[branchStack.length - 1];
|
|
@@ -17024,7 +17000,7 @@ function XViewScene({
|
|
|
17024
17000
|
name: "Voltar para anterior"
|
|
17025
17001
|
};
|
|
17026
17002
|
}, [readingMode.branchStack]);
|
|
17027
|
-
const getReadModeDisplayContext = (0,
|
|
17003
|
+
const getReadModeDisplayContext = (0, import_react29.useMemo)(() => {
|
|
17028
17004
|
const { ancestry, branchStack } = readingMode;
|
|
17029
17005
|
if (!ancestry) return null;
|
|
17030
17006
|
if (branchStack.length === 0) {
|
|
@@ -17067,7 +17043,7 @@ function XViewScene({
|
|
|
17067
17043
|
customProperties: branchProps
|
|
17068
17044
|
};
|
|
17069
17045
|
}, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
|
|
17070
|
-
const readModeAbstractionTree = (0,
|
|
17046
|
+
const readModeAbstractionTree = (0, import_react29.useMemo)(() => {
|
|
17071
17047
|
if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
|
|
17072
17048
|
return null;
|
|
17073
17049
|
}
|
|
@@ -17086,7 +17062,7 @@ function XViewScene({
|
|
|
17086
17062
|
buildFullAncestryTree,
|
|
17087
17063
|
sceneVersion
|
|
17088
17064
|
]);
|
|
17089
|
-
const handleStartReadingAncestry = (0,
|
|
17065
|
+
const handleStartReadingAncestry = (0, import_react29.useCallback)(
|
|
17090
17066
|
async (ancestryObject, renderMode = "full") => {
|
|
17091
17067
|
setContextMenu(
|
|
17092
17068
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -17129,7 +17105,7 @@ function XViewScene({
|
|
|
17129
17105
|
},
|
|
17130
17106
|
[handleRenderAncestry, handleRenderAbstractionTree]
|
|
17131
17107
|
);
|
|
17132
|
-
const handleReadModeSectionChange = (0,
|
|
17108
|
+
const handleReadModeSectionChange = (0, import_react29.useCallback)(
|
|
17133
17109
|
(activeSectionId) => {
|
|
17134
17110
|
const { ancestry, branchStack } = readingMode;
|
|
17135
17111
|
if (!ancestry || !readingMode.isActive) return;
|
|
@@ -17214,10 +17190,10 @@ function XViewScene({
|
|
|
17214
17190
|
ancestryDataRef.current
|
|
17215
17191
|
]
|
|
17216
17192
|
);
|
|
17217
|
-
const handleCloseReadMode = (0,
|
|
17193
|
+
const handleCloseReadMode = (0, import_react29.useCallback)(() => {
|
|
17218
17194
|
setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
|
|
17219
17195
|
}, []);
|
|
17220
|
-
const handleAncestrySectionChange = (0,
|
|
17196
|
+
const handleAncestrySectionChange = (0, import_react29.useCallback)(
|
|
17221
17197
|
(activeSectionId, ancestryOverride = null, rotation = 0) => {
|
|
17222
17198
|
var _a2, _b2;
|
|
17223
17199
|
const currentMode = stateRef.current.ancestry;
|
|
@@ -17279,7 +17255,7 @@ function XViewScene({
|
|
|
17279
17255
|
},
|
|
17280
17256
|
[handleRenderAncestry]
|
|
17281
17257
|
);
|
|
17282
|
-
const handleEditAncestry = (0,
|
|
17258
|
+
const handleEditAncestry = (0, import_react29.useCallback)(
|
|
17283
17259
|
async (ancestryObject) => {
|
|
17284
17260
|
setContextMenu(
|
|
17285
17261
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -17334,7 +17310,7 @@ function XViewScene({
|
|
|
17334
17310
|
const handleSelectAncestryParent = (nodeId) => {
|
|
17335
17311
|
setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
|
|
17336
17312
|
};
|
|
17337
|
-
const handleRemoveFromAncestry = (0,
|
|
17313
|
+
const handleRemoveFromAncestry = (0, import_react29.useCallback)((pathToRemove) => {
|
|
17338
17314
|
if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
|
|
17339
17315
|
console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
|
|
17340
17316
|
return;
|
|
@@ -17359,7 +17335,7 @@ function XViewScene({
|
|
|
17359
17335
|
return { ...prev, tree: newTree };
|
|
17360
17336
|
});
|
|
17361
17337
|
}, []);
|
|
17362
|
-
const handleSaveAncestry = (0,
|
|
17338
|
+
const handleSaveAncestry = (0, import_react29.useCallback)(
|
|
17363
17339
|
async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
|
|
17364
17340
|
const treeToUse = treeOverride || ancestryMode.tree;
|
|
17365
17341
|
const { isEditMode, currentAncestryId } = ancestryMode;
|
|
@@ -17595,7 +17571,7 @@ function XViewScene({
|
|
|
17595
17571
|
});
|
|
17596
17572
|
setEditingAncestryRel({ visible: false, data: null, path: null });
|
|
17597
17573
|
};
|
|
17598
|
-
const handleDeleteAncestry = (0,
|
|
17574
|
+
const handleDeleteAncestry = (0, import_react29.useCallback)(
|
|
17599
17575
|
async (ancestryIdToDelete) => {
|
|
17600
17576
|
if (!ancestryIdToDelete) {
|
|
17601
17577
|
alert("ID da ancestralidade n\xE3o encontrado.");
|
|
@@ -17677,28 +17653,22 @@ function XViewScene({
|
|
|
17677
17653
|
},
|
|
17678
17654
|
[save_view_data, delete_file_action]
|
|
17679
17655
|
);
|
|
17680
|
-
const handleOpenAncestryBoard = (0,
|
|
17656
|
+
const handleOpenAncestryBoard = (0, import_react29.useCallback)(() => {
|
|
17681
17657
|
setIsAncestryBoardOpen(true);
|
|
17682
17658
|
}, []);
|
|
17683
|
-
const handleSelectAncestryFromBoard = (0,
|
|
17659
|
+
const handleSelectAncestryFromBoard = (0, import_react29.useCallback)(
|
|
17684
17660
|
(item) => {
|
|
17685
17661
|
setIsAncestryBoardOpen(false);
|
|
17686
17662
|
setIsSidebarOpen(false);
|
|
17687
|
-
if (item.type === "ancestry"
|
|
17663
|
+
if (item.type === "ancestry") {
|
|
17688
17664
|
handleStartReadingAncestry(item);
|
|
17689
17665
|
} else {
|
|
17690
|
-
|
|
17691
|
-
const sceneMesh = stateRef.current.nodeObjects[nodeId];
|
|
17692
|
-
if (sceneMesh) {
|
|
17693
|
-
tweenToTarget(sceneMesh);
|
|
17694
|
-
} else {
|
|
17695
|
-
console.warn("Objeto n\xE3o encontrado na cena para foco:", nodeId);
|
|
17696
|
-
}
|
|
17666
|
+
handleOpenReference({ type: "node", id: item.id });
|
|
17697
17667
|
}
|
|
17698
17668
|
},
|
|
17699
|
-
[handleStartReadingAncestry,
|
|
17669
|
+
[handleStartReadingAncestry, handleOpenReference]
|
|
17700
17670
|
);
|
|
17701
|
-
const handleSaveAncestryBoard = (0,
|
|
17671
|
+
const handleSaveAncestryBoard = (0, import_react29.useCallback)(
|
|
17702
17672
|
async (groups) => {
|
|
17703
17673
|
if (!sceneConfigId || !viewParams || !session) return;
|
|
17704
17674
|
const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
|
|
@@ -17712,7 +17682,7 @@ function XViewScene({
|
|
|
17712
17682
|
},
|
|
17713
17683
|
[sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
|
|
17714
17684
|
);
|
|
17715
|
-
const existingNodeTypes = (0,
|
|
17685
|
+
const existingNodeTypes = (0, import_react29.useMemo)(() => {
|
|
17716
17686
|
if (!parentDataRef.current) {
|
|
17717
17687
|
return [];
|
|
17718
17688
|
}
|
|
@@ -17724,28 +17694,22 @@ function XViewScene({
|
|
|
17724
17694
|
).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
|
|
17725
17695
|
return [...new Set(allTypes)];
|
|
17726
17696
|
}, [parentDataRef.current, sceneVersion]);
|
|
17727
|
-
const searchableDbNodes = (0,
|
|
17728
|
-
var _a2;
|
|
17697
|
+
const searchableDbNodes = (0, import_react29.useMemo)(() => {
|
|
17729
17698
|
if (!parentDataRef.current) {
|
|
17730
17699
|
return [];
|
|
17731
17700
|
}
|
|
17732
|
-
|
|
17701
|
+
return Object.entries(parentDataRef.current).flatMap(([dbId, fileData]) => {
|
|
17733
17702
|
const datasetName = fileData.dataset_name || `Dataset #${dbId.substring(0, 6)}`;
|
|
17734
17703
|
return (fileData.nodes || []).map((node) => ({
|
|
17735
17704
|
...node,
|
|
17736
17705
|
dataset_name: datasetName
|
|
17737
17706
|
}));
|
|
17707
|
+
}).filter((node) => {
|
|
17708
|
+
var _a2;
|
|
17709
|
+
return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
|
|
17738
17710
|
});
|
|
17739
|
-
|
|
17740
|
-
|
|
17741
|
-
dataset_name: "Quests Internas (View)"
|
|
17742
|
-
}));
|
|
17743
|
-
return [...datasetsPool, ...questsPool].filter((node) => {
|
|
17744
|
-
var _a3;
|
|
17745
|
-
return !((_a3 = node.version_node) == null ? void 0 : _a3.is_version);
|
|
17746
|
-
});
|
|
17747
|
-
}, [parentDataRef.current, (_b = sceneDataRef.current) == null ? void 0 : _b.quest_nodes, sceneVersion]);
|
|
17748
|
-
const handleAddExistingNode = (0, import_react32.useCallback)(
|
|
17711
|
+
}, [parentDataRef.current, sceneVersion]);
|
|
17712
|
+
const handleAddExistingNode = (0, import_react29.useCallback)(
|
|
17749
17713
|
(nodeId) => {
|
|
17750
17714
|
return userActionHandlers.handleAddExistingNodeById(
|
|
17751
17715
|
actionHandlerContext,
|
|
@@ -17754,7 +17718,7 @@ function XViewScene({
|
|
|
17754
17718
|
},
|
|
17755
17719
|
[actionHandlerContext]
|
|
17756
17720
|
);
|
|
17757
|
-
const handleUpdateMilestones = (0,
|
|
17721
|
+
const handleUpdateMilestones = (0, import_react29.useCallback)(
|
|
17758
17722
|
async (newMilestones) => {
|
|
17759
17723
|
var _a2, _b2, _c2;
|
|
17760
17724
|
if (!sceneDataRef.current) return;
|
|
@@ -17800,7 +17764,7 @@ function XViewScene({
|
|
|
17800
17764
|
viewParams == null ? void 0 : viewParams.type
|
|
17801
17765
|
]
|
|
17802
17766
|
);
|
|
17803
|
-
const handleSaveCurrentView = (0,
|
|
17767
|
+
const handleSaveCurrentView = (0, import_react29.useCallback)(async () => {
|
|
17804
17768
|
var _a2, _b2, _c2;
|
|
17805
17769
|
const { nodeObjects, allLinks } = stateRef.current;
|
|
17806
17770
|
if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
|
|
@@ -17843,16 +17807,16 @@ function XViewScene({
|
|
|
17843
17807
|
console.error("Erro na chamada de save_view_data:", error);
|
|
17844
17808
|
}
|
|
17845
17809
|
}, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
|
|
17846
|
-
const allAvailableNodes = (0,
|
|
17810
|
+
const allAvailableNodes = (0, import_react29.useMemo)(() => {
|
|
17847
17811
|
if (!parentDataRef.current) return [];
|
|
17848
17812
|
return Object.values(parentDataRef.current).flatMap(
|
|
17849
17813
|
(fileData) => fileData.nodes || []
|
|
17850
17814
|
);
|
|
17851
17815
|
}, [sceneVersion, isInitialized]);
|
|
17852
|
-
const allAvailableAncestries = (0,
|
|
17816
|
+
const allAvailableAncestries = (0, import_react29.useMemo)(() => {
|
|
17853
17817
|
return ancestryDataRef.current || [];
|
|
17854
17818
|
}, [sceneVersion, isInitialized]);
|
|
17855
|
-
const handleOpenReference = (0,
|
|
17819
|
+
const handleOpenReference = (0, import_react29.useCallback)(
|
|
17856
17820
|
(referenceData) => {
|
|
17857
17821
|
const { type, id } = referenceData;
|
|
17858
17822
|
if (type === "node") {
|
|
@@ -17891,13 +17855,13 @@ function XViewScene({
|
|
|
17891
17855
|
tweenToTarget
|
|
17892
17856
|
]
|
|
17893
17857
|
);
|
|
17894
|
-
const handleToggleAncestryAddMode = (0,
|
|
17858
|
+
const handleToggleAncestryAddMode = (0, import_react29.useCallback)(() => {
|
|
17895
17859
|
setAncestryMode((prev) => ({
|
|
17896
17860
|
...prev,
|
|
17897
17861
|
isAddingNodes: !prev.isAddingNodes
|
|
17898
17862
|
}));
|
|
17899
17863
|
}, []);
|
|
17900
|
-
const handleFocusNode = (0,
|
|
17864
|
+
const handleFocusNode = (0, import_react29.useCallback)(
|
|
17901
17865
|
(nodeData) => {
|
|
17902
17866
|
var _a2;
|
|
17903
17867
|
if (!nodeData) return;
|
|
@@ -17913,7 +17877,7 @@ function XViewScene({
|
|
|
17913
17877
|
},
|
|
17914
17878
|
[tweenToTarget]
|
|
17915
17879
|
);
|
|
17916
|
-
const availableDatasets = (0,
|
|
17880
|
+
const availableDatasets = (0, import_react29.useMemo)(() => {
|
|
17917
17881
|
if (!sceneDataRef.current || !parentDataRef.current) return [];
|
|
17918
17882
|
return sceneDataRef.current.parent_dbs.map((db) => {
|
|
17919
17883
|
var _a2;
|
|
@@ -17923,11 +17887,11 @@ function XViewScene({
|
|
|
17923
17887
|
};
|
|
17924
17888
|
});
|
|
17925
17889
|
}, [sceneVersion, isInitialized]);
|
|
17926
|
-
const sourceNodeDatasetId = creationMode.sourceNodeData ? (
|
|
17890
|
+
const sourceNodeDatasetId = creationMode.sourceNodeData ? (_b = stateRef.current.nodeIdToParentFileMap.get(
|
|
17927
17891
|
String(creationMode.sourceNodeData.id)
|
|
17928
|
-
)) == null ? void 0 :
|
|
17892
|
+
)) == null ? void 0 : _b.parentFileId : null;
|
|
17929
17893
|
const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
|
|
17930
|
-
(0,
|
|
17894
|
+
(0, import_react29.useEffect)(() => {
|
|
17931
17895
|
if (isInitialized && focusNodeId && !hasFocusedInitial) {
|
|
17932
17896
|
const nodeObjects = stateRef.current.nodeObjects || {};
|
|
17933
17897
|
const targetMesh = nodeObjects[String(focusNodeId)];
|
|
@@ -17950,7 +17914,7 @@ function XViewScene({
|
|
|
17950
17914
|
hasFocusedInitial,
|
|
17951
17915
|
tweenToTarget
|
|
17952
17916
|
]);
|
|
17953
|
-
(0,
|
|
17917
|
+
(0, import_react29.useEffect)(() => {
|
|
17954
17918
|
if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
|
|
17955
17919
|
const ancestries = ancestryDataRef.current || [];
|
|
17956
17920
|
const targetAncestry = ancestries.find(
|
|
@@ -17975,7 +17939,7 @@ function XViewScene({
|
|
|
17975
17939
|
hasOpenedInitialAncestry,
|
|
17976
17940
|
handleStartReadingAncestry
|
|
17977
17941
|
]);
|
|
17978
|
-
(0,
|
|
17942
|
+
(0, import_react29.useEffect)(() => {
|
|
17979
17943
|
function handleKeyDown(event) {
|
|
17980
17944
|
var _a2, _b2, _c2;
|
|
17981
17945
|
const context = actionHandlerContext;
|
|
@@ -18098,10 +18062,10 @@ function XViewScene({
|
|
|
18098
18062
|
// <-- handleCancelQuest adicionado aqui
|
|
18099
18063
|
]);
|
|
18100
18064
|
if (isLoading || status === "loading" || permissionStatus === "loading") {
|
|
18101
|
-
return /* @__PURE__ */
|
|
18065
|
+
return /* @__PURE__ */ import_react29.default.createElement(LoadingScreen, null);
|
|
18102
18066
|
}
|
|
18103
18067
|
if (permissionStatus === "denied") {
|
|
18104
|
-
return /* @__PURE__ */
|
|
18068
|
+
return /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
18105
18069
|
"svg",
|
|
18106
18070
|
{
|
|
18107
18071
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -18111,7 +18075,7 @@ function XViewScene({
|
|
|
18111
18075
|
stroke: "currentColor",
|
|
18112
18076
|
className: "w-16 h-16 mx-auto"
|
|
18113
18077
|
},
|
|
18114
|
-
/* @__PURE__ */
|
|
18078
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18115
18079
|
"path",
|
|
18116
18080
|
{
|
|
18117
18081
|
strokeLinecap: "round",
|
|
@@ -18119,13 +18083,13 @@ function XViewScene({
|
|
|
18119
18083
|
d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
|
|
18120
18084
|
}
|
|
18121
18085
|
)
|
|
18122
|
-
)), /* @__PURE__ */
|
|
18086
|
+
)), /* @__PURE__ */ import_react29.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react29.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react29.default.createElement(
|
|
18123
18087
|
"button",
|
|
18124
18088
|
{
|
|
18125
18089
|
onClick: () => router.push("/dashboard/scenes"),
|
|
18126
18090
|
className: "flex items-center justify-center gap-2 w-full py-3 px-4 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium"
|
|
18127
18091
|
},
|
|
18128
|
-
/* @__PURE__ */
|
|
18092
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18129
18093
|
"svg",
|
|
18130
18094
|
{
|
|
18131
18095
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -18135,7 +18099,7 @@ function XViewScene({
|
|
|
18135
18099
|
stroke: "currentColor",
|
|
18136
18100
|
className: "w-5 h-5"
|
|
18137
18101
|
},
|
|
18138
|
-
/* @__PURE__ */
|
|
18102
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18139
18103
|
"path",
|
|
18140
18104
|
{
|
|
18141
18105
|
strokeLinecap: "round",
|
|
@@ -18147,7 +18111,7 @@ function XViewScene({
|
|
|
18147
18111
|
"Voltar para Scenes"
|
|
18148
18112
|
)));
|
|
18149
18113
|
}
|
|
18150
|
-
return /* @__PURE__ */
|
|
18114
|
+
return /* @__PURE__ */ import_react29.default.createElement(
|
|
18151
18115
|
"div",
|
|
18152
18116
|
{
|
|
18153
18117
|
ref: mountRef,
|
|
@@ -18159,7 +18123,7 @@ function XViewScene({
|
|
|
18159
18123
|
cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
|
|
18160
18124
|
}
|
|
18161
18125
|
},
|
|
18162
|
-
userPermissionRole !== "link_viewer" && /* @__PURE__ */
|
|
18126
|
+
userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react29.default.createElement(
|
|
18163
18127
|
XViewSidebar,
|
|
18164
18128
|
{
|
|
18165
18129
|
dbNodes: searchableDbNodes,
|
|
@@ -18179,11 +18143,11 @@ function XViewScene({
|
|
|
18179
18143
|
onToggle: setIsSidebarOpen,
|
|
18180
18144
|
userRole: userPermissionRole,
|
|
18181
18145
|
viewMembers,
|
|
18182
|
-
milestones: ((
|
|
18146
|
+
milestones: ((_c = sceneDataRef.current) == null ? void 0 : _c.milestones) || [],
|
|
18183
18147
|
onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true)
|
|
18184
18148
|
}
|
|
18185
18149
|
),
|
|
18186
|
-
creationMode.isActive && /* @__PURE__ */
|
|
18150
|
+
creationMode.isActive && /* @__PURE__ */ import_react29.default.createElement(
|
|
18187
18151
|
InSceneCreationForm,
|
|
18188
18152
|
{
|
|
18189
18153
|
onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
|
|
@@ -18204,8 +18168,8 @@ function XViewScene({
|
|
|
18204
18168
|
},
|
|
18205
18169
|
refEl: formRef,
|
|
18206
18170
|
existingTypes: existingNodeTypes,
|
|
18207
|
-
initialColor: (
|
|
18208
|
-
sourceTypes: (
|
|
18171
|
+
initialColor: (_d = creationMode.sourceNodeData) == null ? void 0 : _d.color,
|
|
18172
|
+
sourceTypes: (_e = creationMode.sourceNodeData) == null ? void 0 : _e.type,
|
|
18209
18173
|
onIntensityChange: handleGhostNodeIntensityChange,
|
|
18210
18174
|
onUploadFile: upload_file_action,
|
|
18211
18175
|
availableDatasets,
|
|
@@ -18215,7 +18179,7 @@ function XViewScene({
|
|
|
18215
18179
|
availableAncestries: allAvailableAncestries
|
|
18216
18180
|
}
|
|
18217
18181
|
),
|
|
18218
|
-
versionMode.isActive && /* @__PURE__ */
|
|
18182
|
+
versionMode.isActive && /* @__PURE__ */ import_react29.default.createElement(
|
|
18219
18183
|
InSceneVersionForm,
|
|
18220
18184
|
{
|
|
18221
18185
|
onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
|
|
@@ -18234,14 +18198,14 @@ function XViewScene({
|
|
|
18234
18198
|
transition: "opacity 200ms ease-out"
|
|
18235
18199
|
},
|
|
18236
18200
|
refEl: formRef,
|
|
18237
|
-
fixedType: (
|
|
18238
|
-
fixedColor: (
|
|
18201
|
+
fixedType: (_f = versionMode.sourceNodeData) == null ? void 0 : _f.type,
|
|
18202
|
+
fixedColor: (_g = versionMode.sourceNodeData) == null ? void 0 : _g.color,
|
|
18239
18203
|
onUploadFile: upload_file_action,
|
|
18240
18204
|
availableNodes: allAvailableNodes,
|
|
18241
18205
|
availableAncestries: allAvailableAncestries
|
|
18242
18206
|
}
|
|
18243
18207
|
),
|
|
18244
|
-
questMode.isActive && /* @__PURE__ */
|
|
18208
|
+
questMode.isActive && /* @__PURE__ */ import_react29.default.createElement(
|
|
18245
18209
|
InSceneQuestForm,
|
|
18246
18210
|
{
|
|
18247
18211
|
onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
|
|
@@ -18263,13 +18227,13 @@ function XViewScene({
|
|
|
18263
18227
|
availableNodes: allAvailableNodes,
|
|
18264
18228
|
availableAncestries: allAvailableAncestries,
|
|
18265
18229
|
viewName: viewParams == null ? void 0 : viewParams.name,
|
|
18266
|
-
questCounter: ((
|
|
18230
|
+
questCounter: ((_h = sceneDataRef.current) == null ? void 0 : _h.quest_counter) || 1,
|
|
18267
18231
|
viewMembers,
|
|
18268
|
-
milestones: ((
|
|
18232
|
+
milestones: ((_i = sceneDataRef.current) == null ? void 0 : _i.milestones) || [],
|
|
18269
18233
|
onUpdateMilestones: handleUpdateMilestones
|
|
18270
18234
|
}
|
|
18271
18235
|
),
|
|
18272
|
-
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */
|
|
18236
|
+
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react29.default.createElement(
|
|
18273
18237
|
"div",
|
|
18274
18238
|
{
|
|
18275
18239
|
className: `ui-overlay absolute group rounded-2xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col ${isReadModeResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
|
|
@@ -18282,7 +18246,7 @@ function XViewScene({
|
|
|
18282
18246
|
maxWidth: "92vw"
|
|
18283
18247
|
}
|
|
18284
18248
|
},
|
|
18285
|
-
/* @__PURE__ */
|
|
18249
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18286
18250
|
"div",
|
|
18287
18251
|
{
|
|
18288
18252
|
onPointerDown: (e) => {
|
|
@@ -18293,7 +18257,7 @@ function XViewScene({
|
|
|
18293
18257
|
title: "Arraste para redimensionar"
|
|
18294
18258
|
}
|
|
18295
18259
|
),
|
|
18296
|
-
/* @__PURE__ */
|
|
18260
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18297
18261
|
DescriptionReadModePanel,
|
|
18298
18262
|
{
|
|
18299
18263
|
key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
|
|
@@ -18328,7 +18292,7 @@ function XViewScene({
|
|
|
18328
18292
|
}
|
|
18329
18293
|
)
|
|
18330
18294
|
),
|
|
18331
|
-
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */
|
|
18295
|
+
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react29.default.createElement(
|
|
18332
18296
|
CreateAncestryPanel,
|
|
18333
18297
|
{
|
|
18334
18298
|
ancestryMode,
|
|
@@ -18364,7 +18328,7 @@ function XViewScene({
|
|
|
18364
18328
|
onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
|
|
18365
18329
|
}
|
|
18366
18330
|
),
|
|
18367
|
-
editingAncestryRel.visible && /* @__PURE__ */
|
|
18331
|
+
editingAncestryRel.visible && /* @__PURE__ */ import_react29.default.createElement(
|
|
18368
18332
|
AncestryRelationshipPanel,
|
|
18369
18333
|
{
|
|
18370
18334
|
data: editingAncestryRel.data,
|
|
@@ -18378,7 +18342,7 @@ function XViewScene({
|
|
|
18378
18342
|
onUploadFile: upload_file_action
|
|
18379
18343
|
}
|
|
18380
18344
|
),
|
|
18381
|
-
detailsNode && detailsNode.is_quest && /* @__PURE__ */
|
|
18345
|
+
detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react29.default.createElement(
|
|
18382
18346
|
QuestDetailsPanel,
|
|
18383
18347
|
{
|
|
18384
18348
|
node: detailsNode,
|
|
@@ -18400,11 +18364,11 @@ function XViewScene({
|
|
|
18400
18364
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
|
|
18401
18365
|
viewMembers,
|
|
18402
18366
|
currentUser: session == null ? void 0 : session.user,
|
|
18403
|
-
milestones: ((
|
|
18367
|
+
milestones: ((_j = sceneDataRef.current) == null ? void 0 : _j.milestones) || [],
|
|
18404
18368
|
onUpdateMilestones: handleUpdateMilestones
|
|
18405
18369
|
}
|
|
18406
18370
|
),
|
|
18407
|
-
detailsNode && !detailsNode.is_quest && /* @__PURE__ */
|
|
18371
|
+
detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react29.default.createElement(
|
|
18408
18372
|
NodeDetailsPanel,
|
|
18409
18373
|
{
|
|
18410
18374
|
node: detailsNode,
|
|
@@ -18436,7 +18400,7 @@ function XViewScene({
|
|
|
18436
18400
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
|
|
18437
18401
|
}
|
|
18438
18402
|
),
|
|
18439
|
-
detailsLink && /* @__PURE__ */
|
|
18403
|
+
detailsLink && /* @__PURE__ */ import_react29.default.createElement(
|
|
18440
18404
|
RelationshipDetailsPanel,
|
|
18441
18405
|
{
|
|
18442
18406
|
link: detailsLink,
|
|
@@ -18450,7 +18414,7 @@ function XViewScene({
|
|
|
18450
18414
|
userRole: userPermissionRole
|
|
18451
18415
|
}
|
|
18452
18416
|
),
|
|
18453
|
-
ancestryLinkDetails && /* @__PURE__ */
|
|
18417
|
+
ancestryLinkDetails && /* @__PURE__ */ import_react29.default.createElement(
|
|
18454
18418
|
AncestryLinkDetailsPanel,
|
|
18455
18419
|
{
|
|
18456
18420
|
data: ancestryLinkDetails,
|
|
@@ -18461,7 +18425,7 @@ function XViewScene({
|
|
|
18461
18425
|
onUploadFile: upload_file_action
|
|
18462
18426
|
}
|
|
18463
18427
|
),
|
|
18464
|
-
/* @__PURE__ */
|
|
18428
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18465
18429
|
"div",
|
|
18466
18430
|
{
|
|
18467
18431
|
ref: tooltipRef,
|
|
@@ -18488,7 +18452,7 @@ function XViewScene({
|
|
|
18488
18452
|
}
|
|
18489
18453
|
}
|
|
18490
18454
|
),
|
|
18491
|
-
/* @__PURE__ */
|
|
18455
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18492
18456
|
ContextMenu,
|
|
18493
18457
|
{
|
|
18494
18458
|
data: contextMenu,
|
|
@@ -18521,7 +18485,7 @@ function XViewScene({
|
|
|
18521
18485
|
onFinishQuest: handleFinishQuestQuick
|
|
18522
18486
|
}
|
|
18523
18487
|
),
|
|
18524
|
-
/* @__PURE__ */
|
|
18488
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18525
18489
|
MultiNodeContextMenu,
|
|
18526
18490
|
{
|
|
18527
18491
|
data: multiContextMenu,
|
|
@@ -18541,7 +18505,7 @@ function XViewScene({
|
|
|
18541
18505
|
)
|
|
18542
18506
|
}
|
|
18543
18507
|
),
|
|
18544
|
-
/* @__PURE__ */
|
|
18508
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18545
18509
|
RelationshipContextMenu,
|
|
18546
18510
|
{
|
|
18547
18511
|
data: relationshipMenu,
|
|
@@ -18559,14 +18523,14 @@ function XViewScene({
|
|
|
18559
18523
|
onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
|
|
18560
18524
|
}
|
|
18561
18525
|
),
|
|
18562
|
-
/* @__PURE__ */
|
|
18526
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18563
18527
|
ImageViewer,
|
|
18564
18528
|
{
|
|
18565
18529
|
data: imageViewer,
|
|
18566
18530
|
onClose: () => setImageViewer({ ...imageViewer, visible: false })
|
|
18567
18531
|
}
|
|
18568
18532
|
),
|
|
18569
|
-
/* @__PURE__ */
|
|
18533
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18570
18534
|
AncestryBoard,
|
|
18571
18535
|
{
|
|
18572
18536
|
isOpen: isAncestryBoardOpen,
|
|
@@ -18579,29 +18543,29 @@ function XViewScene({
|
|
|
18579
18543
|
userRole: userPermissionRole
|
|
18580
18544
|
}
|
|
18581
18545
|
),
|
|
18582
|
-
/* @__PURE__ */
|
|
18546
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18583
18547
|
MilestoneManager,
|
|
18584
18548
|
{
|
|
18585
18549
|
isOpen: isMilestoneManagerOpen,
|
|
18586
18550
|
onClose: () => setIsMilestoneManagerOpen(false),
|
|
18587
|
-
milestones: ((
|
|
18551
|
+
milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
|
|
18588
18552
|
onUpdateMilestones: handleUpdateMilestones
|
|
18589
18553
|
}
|
|
18590
18554
|
),
|
|
18591
|
-
/* @__PURE__ */
|
|
18555
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18592
18556
|
ImportParentFileModal,
|
|
18593
18557
|
{
|
|
18594
18558
|
isOpen: isImportModalOpen,
|
|
18595
18559
|
onClose: () => setIsImportModalOpen(false),
|
|
18596
18560
|
onConfirm: handleConfirmImport,
|
|
18597
18561
|
session,
|
|
18598
|
-
parentDbs: ((
|
|
18562
|
+
parentDbs: ((_l = sceneDataRef.current) == null ? void 0 : _l.parent_dbs) || [],
|
|
18599
18563
|
onFetchAvailableFiles: import_parent_file_modal_get,
|
|
18600
18564
|
currentViewName: viewParams == null ? void 0 : viewParams.name,
|
|
18601
18565
|
currentAncestries: ancestryDataRef.current || []
|
|
18602
18566
|
}
|
|
18603
18567
|
),
|
|
18604
|
-
invalidTargetError && /* @__PURE__ */
|
|
18568
|
+
invalidTargetError && /* @__PURE__ */ import_react29.default.createElement(
|
|
18605
18569
|
"div",
|
|
18606
18570
|
{
|
|
18607
18571
|
className: "ui-overlay",
|
|
@@ -18626,13 +18590,13 @@ function XViewScene({
|
|
|
18626
18590
|
animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
|
|
18627
18591
|
}
|
|
18628
18592
|
},
|
|
18629
|
-
/* @__PURE__ */
|
|
18593
|
+
/* @__PURE__ */ import_react29.default.createElement("style", null, `
|
|
18630
18594
|
@keyframes fadeInDown {
|
|
18631
18595
|
from { opacity: 0; transform: translate(-50%, -20px); }
|
|
18632
18596
|
to { opacity: 1; transform: translate(-50%, 0); }
|
|
18633
18597
|
}
|
|
18634
18598
|
`),
|
|
18635
|
-
/* @__PURE__ */
|
|
18599
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18636
18600
|
"svg",
|
|
18637
18601
|
{
|
|
18638
18602
|
width: "20",
|
|
@@ -18644,12 +18608,12 @@ function XViewScene({
|
|
|
18644
18608
|
strokeLinecap: "round",
|
|
18645
18609
|
strokeLinejoin: "round"
|
|
18646
18610
|
},
|
|
18647
|
-
/* @__PURE__ */
|
|
18648
|
-
/* @__PURE__ */
|
|
18649
|
-
/* @__PURE__ */
|
|
18611
|
+
/* @__PURE__ */ import_react29.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
|
|
18612
|
+
/* @__PURE__ */ import_react29.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
|
|
18613
|
+
/* @__PURE__ */ import_react29.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
|
|
18650
18614
|
),
|
|
18651
|
-
/* @__PURE__ */
|
|
18652
|
-
/* @__PURE__ */
|
|
18615
|
+
/* @__PURE__ */ import_react29.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
|
|
18616
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
18653
18617
|
"button",
|
|
18654
18618
|
{
|
|
18655
18619
|
onClick: () => setInvalidTargetError(null),
|