@lv-x-software-house/x_view 1.2.5-dev.20 → 1.2.5-dev.22
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 +749 -456
- package/dist/index.mjs +649 -356
- package/package.json +1 -1
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_react27 = __toESM(require("react"));
|
|
48
48
|
var import_navigation = require("next/navigation");
|
|
49
|
-
var
|
|
49
|
+
var import_react28 = 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");
|
|
@@ -145,7 +145,8 @@ function ContextMenu({
|
|
|
145
145
|
onClose,
|
|
146
146
|
viewMembers,
|
|
147
147
|
currentUser,
|
|
148
|
-
onStartQuest
|
|
148
|
+
onStartQuest,
|
|
149
|
+
onFinishQuest
|
|
149
150
|
}) {
|
|
150
151
|
var _a, _b, _c;
|
|
151
152
|
const menuRef = (0, import_react.useRef)(null);
|
|
@@ -346,12 +347,13 @@ function ContextMenu({
|
|
|
346
347
|
});
|
|
347
348
|
};
|
|
348
349
|
const renderMainView = () => {
|
|
349
|
-
var _a2, _b2, _c2;
|
|
350
|
+
var _a2, _b2, _c2, _d;
|
|
350
351
|
const hasVersions = computedVersions.length > 0;
|
|
351
352
|
const canCreateVersion = ability.can("create", "Versioning");
|
|
352
353
|
const canReadVersion = ability.can("read", "Versioning");
|
|
353
354
|
const shouldShowVersioningBtn = canCreateVersion || canReadVersion && hasVersions;
|
|
354
355
|
const canStartQuest = isCurrentNodeQuest && (((_a2 = data.nodeData) == null ? void 0 : _a2.status) !== "In Progress" || ((_b2 = data.nodeData) == null ? void 0 : _b2.assignee_id) !== (currentUser == null ? void 0 : currentUser.id));
|
|
356
|
+
const canFinishQuest = isCurrentNodeQuest && ((_c2 = data.nodeData) == null ? void 0 : _c2.assignee_id) === (currentUser == null ? void 0 : currentUser.id);
|
|
355
357
|
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es R\xE1pidas")), /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col gap-1" }, canStartQuest && /* @__PURE__ */ import_react.default.createElement(
|
|
356
358
|
"button",
|
|
357
359
|
{
|
|
@@ -364,7 +366,19 @@ function ContextMenu({
|
|
|
364
366
|
},
|
|
365
367
|
/* @__PURE__ */ import_react.default.createElement("span", null, "\u{1F680}"),
|
|
366
368
|
/* @__PURE__ */ import_react.default.createElement("span", null, "Iniciar Quest")
|
|
367
|
-
),
|
|
369
|
+
), canFinishQuest && /* @__PURE__ */ import_react.default.createElement(
|
|
370
|
+
"button",
|
|
371
|
+
{
|
|
372
|
+
onClick: () => {
|
|
373
|
+
onFinishQuest == null ? void 0 : onFinishQuest(data.nodeData);
|
|
374
|
+
onClose();
|
|
375
|
+
},
|
|
376
|
+
className: `w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20 hover:text-emerald-300 transition-colors duration-150 truncate font-semibold shadow-inner`,
|
|
377
|
+
title: "Finalizar esta quest"
|
|
378
|
+
},
|
|
379
|
+
/* @__PURE__ */ import_react.default.createElement("span", null, "\u2705"),
|
|
380
|
+
/* @__PURE__ */ import_react.default.createElement("span", null, "Finalizar Quest")
|
|
381
|
+
), ability.can("create", "Connection") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartConnection == null ? void 0 : onStartConnection(data.nodeData), className: baseButtonClass, title: "Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conectar")), ability.can("create", "Node") && !((_d = data.nodeData) == null ? void 0 : _d.is_quest) && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartCreation == null ? void 0 : onStartCreation(data.nodeData), className: baseButtonClass, title: "Criar e Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "16" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "8", y1: "12", x2: "16", y2: "12" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar e Conectar")), ability.can("create", "Ancestry") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartAncestryCreation == null ? void 0 : onStartAncestryCreation(data.nodeData), className: baseButtonClass, title: "Criar Ancestralidade" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 20.5c.5-.5.8-1.2.8-2s-.3-1.5-.8-2c-.5-.5-1.2-.8-2-.8s-1.5.3-2 .8c-.5.5-.8 1.2-.8 2s.3 1.5.8 2c.5.5 1.2-.8 2 .8s1.5-.3 2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 16v-3a2 2 0 0 1 2-2h4" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 3.5c.5.5.8 1.2.8 2s-.3 1.5-.8 2c-.5-.5-1.2-.8-2 .8s1.5.3-2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 8v3a2 2 0 0 0 2 2h4" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar Ancestralidade")), shouldShowVersioningBtn && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("versioning"), className: baseButtonClass, title: hasVersions ? "Versionamento" : "Criar Versionamento" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("line", { x1: "6", y1: "3", x2: "6", y2: "15" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "18", cy: "6", r: "3" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "6", cy: "18", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M18 9a9 9 0 0 1-9 9" })), /* @__PURE__ */ import_react.default.createElement("span", null, hasVersions || !canCreateVersion ? "Versionamento" : "Criar Versionamento")), (connections.length > 0 || availableAncestries.length > 0) && ability.can("read", "Connection") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("connections"), className: baseButtonClass, title: "Conex\xF5es" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M8 12h8" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 8v8" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conex\xF5es (", totalConnectionsCount, ")"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => {
|
|
368
382
|
onFocusNode == null ? void 0 : onFocusNode(data.nodeData);
|
|
369
383
|
onClose();
|
|
370
384
|
}, className: baseButtonClass, title: "Focar na c\xE2mera" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "3" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Focar neste Node")), /* @__PURE__ */ import_react.default.createElement("button", { onClick: (e) => handleCopyLink(e, data.nodeData), className: baseButtonClass, title: "Copiar Link para Compartilhar" }, isLinkCopied ? /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#4ade80", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("polyline", { points: "20 6 9 17 4 12" })) : /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", { className: isLinkCopied ? "text-green-400" : "" }, isLinkCopied ? "Copiado!" : "Copiar Link")), ability.can("dismiss", "Node") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onDismissNode == null ? void 0 : onDismissNode(data.nodeData), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Dismiss")), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onDismissOtherNodes == null ? void 0 : onDismissOtherNodes(data.nodeData), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Dismiss other nodes"))), ability.can("delete", "Node") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("deleteConfirmation"), className: deleteButtonClass, title: "Excluir Node" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Excluir Node"))));
|
|
@@ -2769,7 +2783,15 @@ var userActionHandlers = {
|
|
|
2769
2783
|
var _a;
|
|
2770
2784
|
const { graphDataRef, sceneDataRef, stateRef, setters } = context;
|
|
2771
2785
|
if (!graphDataRef.current || !sceneDataRef.current) return;
|
|
2772
|
-
const {
|
|
2786
|
+
const {
|
|
2787
|
+
_baseEmissiveIntensity,
|
|
2788
|
+
_baseScale,
|
|
2789
|
+
labelObject,
|
|
2790
|
+
labelOffset,
|
|
2791
|
+
timelineIntervalBar,
|
|
2792
|
+
timelineEndLabel,
|
|
2793
|
+
...nodeToSave
|
|
2794
|
+
} = updatedNode;
|
|
2773
2795
|
const parentInfo = getParentFileInfoForNode(graphDataRef.current, sceneDataRef.current, nodeToSave.id, context.sceneConfigId, context.ownerId);
|
|
2774
2796
|
if (!parentInfo || !parentInfo.ownerId) {
|
|
2775
2797
|
console.error("N\xE3o foi poss\xEDvel encontrar as informa\xE7\xF5es do arquivo pai (ou ownerId) para o Node a ser atualizado:", nodeToSave.id);
|
|
@@ -8366,8 +8388,116 @@ function InSceneVersionForm({
|
|
|
8366
8388
|
}
|
|
8367
8389
|
|
|
8368
8390
|
// src/components/InSceneQuestForm.jsx
|
|
8391
|
+
var import_react17 = __toESM(require("react"));
|
|
8392
|
+
var import_fi15 = require("react-icons/fi");
|
|
8393
|
+
|
|
8394
|
+
// src/components/QuestReviewStackEditor.jsx
|
|
8369
8395
|
var import_react16 = __toESM(require("react"));
|
|
8370
8396
|
var import_fi14 = require("react-icons/fi");
|
|
8397
|
+
function QuestReviewStackEditor({
|
|
8398
|
+
reviewStack = [],
|
|
8399
|
+
onChange,
|
|
8400
|
+
viewMembers = [],
|
|
8401
|
+
readOnly = false
|
|
8402
|
+
}) {
|
|
8403
|
+
const [isAdding, setIsAdding] = (0, import_react16.useState)(false);
|
|
8404
|
+
const [searchQuery, setSearchQuery] = (0, import_react16.useState)("");
|
|
8405
|
+
const handleAddReviewer = (userId) => {
|
|
8406
|
+
const newStack = [...reviewStack, { userId, status: "pending", mandatory: false }];
|
|
8407
|
+
onChange(newStack);
|
|
8408
|
+
setIsAdding(false);
|
|
8409
|
+
setSearchQuery("");
|
|
8410
|
+
};
|
|
8411
|
+
const handleRemoveReviewer = (index) => {
|
|
8412
|
+
const newStack = reviewStack.filter((_, i) => i !== index);
|
|
8413
|
+
onChange(newStack);
|
|
8414
|
+
};
|
|
8415
|
+
const handleToggleMandatory = (index) => {
|
|
8416
|
+
const newStack = [...reviewStack];
|
|
8417
|
+
newStack[index] = { ...newStack[index], mandatory: !newStack[index].mandatory };
|
|
8418
|
+
onChange(newStack);
|
|
8419
|
+
};
|
|
8420
|
+
const handleMove = (index, direction) => {
|
|
8421
|
+
const newStack = [...reviewStack];
|
|
8422
|
+
const targetIndex = index + direction;
|
|
8423
|
+
if (targetIndex < 0 || targetIndex >= newStack.length) return;
|
|
8424
|
+
[newStack[index], newStack[targetIndex]] = [newStack[targetIndex], newStack[index]];
|
|
8425
|
+
onChange(newStack);
|
|
8426
|
+
};
|
|
8427
|
+
const filteredMembers = viewMembers.filter((m) => {
|
|
8428
|
+
const search = searchQuery.toLowerCase();
|
|
8429
|
+
return (m.name || "").toLowerCase().includes(search) || (m.email || "").toLowerCase().includes(search);
|
|
8430
|
+
});
|
|
8431
|
+
return /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Review Stack (Sequential)"), !readOnly && !isAdding && /* @__PURE__ */ import_react16.default.createElement(
|
|
8432
|
+
"button",
|
|
8433
|
+
{
|
|
8434
|
+
type: "button",
|
|
8435
|
+
onClick: () => setIsAdding(true),
|
|
8436
|
+
className: "flex items-center gap-1 px-2 py-1 text-[10px] bg-sky-500/20 text-sky-300 border border-sky-500/30 rounded hover:bg-sky-500/30 transition-colors"
|
|
8437
|
+
},
|
|
8438
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 10 }),
|
|
8439
|
+
" Adicionar Camada"
|
|
8440
|
+
)), isAdding && /* @__PURE__ */ import_react16.default.createElement("div", { className: "bg-slate-900/50 border border-sky-500/30 rounded-lg p-2 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiSearch, { className: "absolute left-2 top-1/2 -translate-y-1/2 text-slate-500", size: 12 }), /* @__PURE__ */ import_react16.default.createElement(
|
|
8441
|
+
"input",
|
|
8442
|
+
{
|
|
8443
|
+
autoFocus: true,
|
|
8444
|
+
type: "text",
|
|
8445
|
+
placeholder: "Buscar revisor...",
|
|
8446
|
+
value: searchQuery,
|
|
8447
|
+
onChange: (e) => setSearchQuery(e.target.value),
|
|
8448
|
+
className: "w-full bg-slate-800 border border-white/10 rounded p-1.5 pl-7 text-xs focus:outline-none focus:ring-1 focus:ring-sky-400"
|
|
8449
|
+
}
|
|
8450
|
+
), /* @__PURE__ */ import_react16.default.createElement("button", { onClick: () => setIsAdding(false), className: "absolute right-2 top-1/2 -translate-y-1/2 text-slate-500 hover:text-white" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 14 }))), /* @__PURE__ */ import_react16.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar space-y-1" }, filteredMembers.map((m) => /* @__PURE__ */ import_react16.default.createElement(
|
|
8451
|
+
"li",
|
|
8452
|
+
{
|
|
8453
|
+
key: m.id,
|
|
8454
|
+
onClick: () => handleAddReviewer(m.id),
|
|
8455
|
+
className: "px-2 py-1.5 hover:bg-white/5 rounded cursor-pointer text-xs flex items-center gap-2"
|
|
8456
|
+
},
|
|
8457
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiUser, { size: 12, className: "text-slate-400" }),
|
|
8458
|
+
/* @__PURE__ */ import_react16.default.createElement("span", { className: "truncate" }, m.name || m.email)
|
|
8459
|
+
)), filteredMembers.length === 0 && /* @__PURE__ */ import_react16.default.createElement("li", { className: "text-[10px] text-slate-500 text-center py-2 italic font-light" }, "Nenhum membro encontrado"))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5" }, reviewStack.map((item, index) => {
|
|
8460
|
+
const member = viewMembers.find((m) => m.id === item.userId);
|
|
8461
|
+
const isCompleted = item.status === "completed";
|
|
8462
|
+
return /* @__PURE__ */ import_react16.default.createElement(
|
|
8463
|
+
"div",
|
|
8464
|
+
{
|
|
8465
|
+
key: index,
|
|
8466
|
+
className: `group relative flex items-center gap-3 p-2 rounded-lg border ${isCompleted ? "bg-green-500/5 border-green-500/20" : "bg-white/5 border-white/10"} hover:border-white/20 transition-all`
|
|
8467
|
+
},
|
|
8468
|
+
/* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-col items-center gap-0.5 text-slate-500" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] font-bold opacity-50" }, index + 1), !readOnly && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleMove(index, -1), disabled: index === 0, className: "hover:text-sky-400 disabled:opacity-20" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronUp, { size: 12 })), /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleMove(index, 1), disabled: index === reviewStack.length - 1, className: "hover:text-sky-400 disabled:opacity-20" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { size: 12 })))),
|
|
8469
|
+
/* @__PURE__ */ import_react16.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: `truncate text-sm font-medium ${isCompleted ? "text-green-300" : "text-slate-200"}` }, (member == null ? void 0 : member.name) || (member == null ? void 0 : member.email) || "Unknown User"), item.mandatory && /* @__PURE__ */ import_react16.default.createElement("span", { className: "flex-shrink-0 px-1.5 py-0.5 rounded-full bg-amber-500/20 text-amber-300 text-[8px] font-bold uppercase tracking-tighter border border-amber-500/30" }, "Obrigat\xF3rio")), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[10px] text-slate-500 flex items-center gap-1" }, isCompleted ? "\u2713 Review Conclu\xEDda" : "\u23F3 Pendente")),
|
|
8470
|
+
!readOnly && /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
8471
|
+
"button",
|
|
8472
|
+
{
|
|
8473
|
+
type: "button",
|
|
8474
|
+
onClick: () => handleToggleMandatory(index),
|
|
8475
|
+
title: item.mandatory ? "Remover obrigatoriedade" : "Tornar obrigat\xF3rio",
|
|
8476
|
+
className: `p-1.5 rounded hover:bg-white/10 transition-colors ${item.mandatory ? "text-amber-400" : "text-slate-500"}`
|
|
8477
|
+
},
|
|
8478
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiAlertCircle, { size: 14 })
|
|
8479
|
+
), /* @__PURE__ */ import_react16.default.createElement(
|
|
8480
|
+
"button",
|
|
8481
|
+
{
|
|
8482
|
+
type: "button",
|
|
8483
|
+
onClick: () => handleRemoveReviewer(index),
|
|
8484
|
+
className: "p-1.5 rounded hover:bg-red-500/20 text-slate-500 hover:text-red-400 transition-colors"
|
|
8485
|
+
},
|
|
8486
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 14 })
|
|
8487
|
+
))
|
|
8488
|
+
);
|
|
8489
|
+
}), reviewStack.length === 0 && !isAdding && /* @__PURE__ */ import_react16.default.createElement("div", { className: "py-6 border-2 border-dashed border-white/5 rounded-xl flex flex-col items-center justify-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs text-slate-500 font-light italic" }, "Nenhum revisor definido"), !readOnly && /* @__PURE__ */ import_react16.default.createElement(
|
|
8490
|
+
"button",
|
|
8491
|
+
{
|
|
8492
|
+
type: "button",
|
|
8493
|
+
onClick: () => setIsAdding(true),
|
|
8494
|
+
className: "text-[10px] text-sky-400 hover:underline"
|
|
8495
|
+
},
|
|
8496
|
+
"+ Come\xE7ar a Review Stack"
|
|
8497
|
+
))));
|
|
8498
|
+
}
|
|
8499
|
+
|
|
8500
|
+
// src/components/InSceneQuestForm.jsx
|
|
8371
8501
|
var QUEST_STATUS_COLORS2 = {
|
|
8372
8502
|
"Backlog": "#64748b",
|
|
8373
8503
|
"In Progress": "#eab308",
|
|
@@ -8391,23 +8521,25 @@ function InSceneQuestForm({
|
|
|
8391
8521
|
// NOVA PROP
|
|
8392
8522
|
questCounter = 1,
|
|
8393
8523
|
// NOVA PROP
|
|
8394
|
-
viewMembers = []
|
|
8524
|
+
viewMembers = [],
|
|
8525
|
+
session = null
|
|
8395
8526
|
}) {
|
|
8396
8527
|
var _a, _b;
|
|
8397
|
-
const [name, setName] = (0,
|
|
8398
|
-
const [assigneeId, setAssigneeId] = (0,
|
|
8399
|
-
const [types, setTypes] = (0,
|
|
8400
|
-
const [typeInput, setTypeInput] = (0,
|
|
8401
|
-
const [status, setStatus] = (0,
|
|
8402
|
-
const [size, setSize] = (0,
|
|
8403
|
-
const [intensity, setIntensity] = (0,
|
|
8404
|
-
const [description, setDescription] = (0,
|
|
8405
|
-
const [
|
|
8406
|
-
const [
|
|
8407
|
-
const [
|
|
8408
|
-
const [
|
|
8409
|
-
const [
|
|
8410
|
-
const
|
|
8528
|
+
const [name, setName] = (0, import_react17.useState)("");
|
|
8529
|
+
const [assigneeId, setAssigneeId] = (0, import_react17.useState)("");
|
|
8530
|
+
const [types, setTypes] = (0, import_react17.useState)(["quest"]);
|
|
8531
|
+
const [typeInput, setTypeInput] = (0, import_react17.useState)("");
|
|
8532
|
+
const [status, setStatus] = (0, import_react17.useState)("Backlog");
|
|
8533
|
+
const [size, setSize] = (0, import_react17.useState)("medium");
|
|
8534
|
+
const [intensity, setIntensity] = (0, import_react17.useState)(0);
|
|
8535
|
+
const [description, setDescription] = (0, import_react17.useState)("");
|
|
8536
|
+
const [reviewStack, setReviewStack] = (0, import_react17.useState)([]);
|
|
8537
|
+
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react17.useState)(false);
|
|
8538
|
+
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react17.useState)(false);
|
|
8539
|
+
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react17.useState)("");
|
|
8540
|
+
const [customProps, setCustomProps] = (0, import_react17.useState)([]);
|
|
8541
|
+
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react17.useState)(false);
|
|
8542
|
+
const propsEndRef = (0, import_react17.useRef)(null);
|
|
8411
8543
|
const standardizedName = `${viewName} - ${questCounter} - \xBB ${name || "Nova Quest"}`;
|
|
8412
8544
|
const handleAddProp = () => {
|
|
8413
8545
|
const newProp = createNewCustomProperty(customProps);
|
|
@@ -8443,6 +8575,7 @@ function InSceneQuestForm({
|
|
|
8443
8575
|
}
|
|
8444
8576
|
};
|
|
8445
8577
|
const handleSubmit = (e) => {
|
|
8578
|
+
var _a2, _b2, _c, _d;
|
|
8446
8579
|
e.preventDefault();
|
|
8447
8580
|
if (!name.trim()) {
|
|
8448
8581
|
alert("O campo 'T\xEDtulo' \xE9 obrigat\xF3rio.");
|
|
@@ -8452,6 +8585,22 @@ function InSceneQuestForm({
|
|
|
8452
8585
|
customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
|
|
8453
8586
|
);
|
|
8454
8587
|
const processedSections = processDescriptionForSave(description, []);
|
|
8588
|
+
const initialTimeline = [{
|
|
8589
|
+
type: "quest_created",
|
|
8590
|
+
timestamp: Date.now(),
|
|
8591
|
+
actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
|
|
8592
|
+
description: `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
|
|
8593
|
+
}];
|
|
8594
|
+
if (assigneeId) {
|
|
8595
|
+
initialTimeline.push({
|
|
8596
|
+
type: "assignee_changed",
|
|
8597
|
+
timestamp: Date.now() + 1,
|
|
8598
|
+
// Ensure sequential timestamp
|
|
8599
|
+
actorId: ((_c = session == null ? void 0 : session.user) == null ? void 0 : _c.id) || "unknown",
|
|
8600
|
+
to_assignee_id: assigneeId,
|
|
8601
|
+
description: `Quest atribu\xEDda para ${((_d = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _d.name) || "respons\xE1vel"}.`
|
|
8602
|
+
});
|
|
8603
|
+
}
|
|
8455
8604
|
onSave({
|
|
8456
8605
|
name: standardizedName,
|
|
8457
8606
|
// SALVA O NOME FORMATADO
|
|
@@ -8467,13 +8616,15 @@ function InSceneQuestForm({
|
|
|
8467
8616
|
description_sections: processedSections,
|
|
8468
8617
|
useImageAsTexture: false,
|
|
8469
8618
|
textureImageUrl: null,
|
|
8619
|
+
reviewStack,
|
|
8620
|
+
timeline: initialTimeline,
|
|
8470
8621
|
...additionalData
|
|
8471
8622
|
});
|
|
8472
8623
|
};
|
|
8473
8624
|
const swallow = (e) => e.stopPropagation();
|
|
8474
8625
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
8475
8626
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
8476
|
-
return /* @__PURE__ */
|
|
8627
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
|
|
8477
8628
|
"div",
|
|
8478
8629
|
{
|
|
8479
8630
|
ref: refEl,
|
|
@@ -8485,8 +8636,8 @@ function InSceneQuestForm({
|
|
|
8485
8636
|
onContextMenu: swallow,
|
|
8486
8637
|
onDoubleClick: swallow
|
|
8487
8638
|
},
|
|
8488
|
-
/* @__PURE__ */
|
|
8489
|
-
/* @__PURE__ */
|
|
8639
|
+
/* @__PURE__ */ import_react17.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)` } }),
|
|
8640
|
+
/* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react17.default.createElement("div", null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Nova quest")), /* @__PURE__ */ import_react17.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Criar Quest")), /* @__PURE__ */ import_react17.default.createElement(
|
|
8490
8641
|
"button",
|
|
8491
8642
|
{
|
|
8492
8643
|
type: "button",
|
|
@@ -8496,7 +8647,7 @@ function InSceneQuestForm({
|
|
|
8496
8647
|
},
|
|
8497
8648
|
"\xD7"
|
|
8498
8649
|
)),
|
|
8499
|
-
/* @__PURE__ */
|
|
8650
|
+
/* @__PURE__ */ import_react17.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react17.default.createElement(
|
|
8500
8651
|
"input",
|
|
8501
8652
|
{
|
|
8502
8653
|
required: true,
|
|
@@ -8510,16 +8661,16 @@ function InSceneQuestForm({
|
|
|
8510
8661
|
},
|
|
8511
8662
|
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-2 focus:ring-indigo-400/60"
|
|
8512
8663
|
}
|
|
8513
|
-
), /* @__PURE__ */
|
|
8664
|
+
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react17.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Status da Quest"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8514
8665
|
"button",
|
|
8515
8666
|
{
|
|
8516
8667
|
type: "button",
|
|
8517
8668
|
onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
|
|
8518
8669
|
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
|
|
8519
8670
|
},
|
|
8520
|
-
/* @__PURE__ */
|
|
8521
|
-
/* @__PURE__ */
|
|
8522
|
-
), isStatusDropdownOpen && /* @__PURE__ */
|
|
8671
|
+
/* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS2[status] } }), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
|
|
8672
|
+
/* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
|
|
8673
|
+
), isStatusDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react17.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS2).map((s) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8523
8674
|
"li",
|
|
8524
8675
|
{
|
|
8525
8676
|
key: s,
|
|
@@ -8530,21 +8681,21 @@ function InSceneQuestForm({
|
|
|
8530
8681
|
},
|
|
8531
8682
|
className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${status === s ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
|
|
8532
8683
|
},
|
|
8533
|
-
/* @__PURE__ */
|
|
8684
|
+
/* @__PURE__ */ import_react17.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
|
|
8534
8685
|
s
|
|
8535
|
-
)))))), /* @__PURE__ */
|
|
8686
|
+
)))))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8536
8687
|
"button",
|
|
8537
8688
|
{
|
|
8538
8689
|
type: "button",
|
|
8539
8690
|
onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
|
|
8540
8691
|
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
|
|
8541
8692
|
},
|
|
8542
|
-
/* @__PURE__ */
|
|
8543
|
-
/* @__PURE__ */
|
|
8544
|
-
), isAssigneeDropdownOpen && /* @__PURE__ */
|
|
8693
|
+
/* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_a = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _a.name) || ((_b = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _b.email) || "Nenhum")),
|
|
8694
|
+
/* @__PURE__ */ import_react17.default.createElement(import_fi15.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
|
|
8695
|
+
), isAssigneeDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
|
|
8545
8696
|
setIsAssigneeDropdownOpen(false);
|
|
8546
8697
|
setAssigneeSearchQuery("");
|
|
8547
|
-
} }), /* @__PURE__ */
|
|
8698
|
+
} }), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react17.default.createElement(
|
|
8548
8699
|
"input",
|
|
8549
8700
|
{
|
|
8550
8701
|
type: "text",
|
|
@@ -8555,7 +8706,7 @@ function InSceneQuestForm({
|
|
|
8555
8706
|
className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
|
|
8556
8707
|
onClick: (e) => e.stopPropagation()
|
|
8557
8708
|
}
|
|
8558
|
-
)), /* @__PURE__ */
|
|
8709
|
+
)), /* @__PURE__ */ import_react17.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8559
8710
|
"li",
|
|
8560
8711
|
{
|
|
8561
8712
|
onClick: () => {
|
|
@@ -8569,7 +8720,7 @@ function InSceneQuestForm({
|
|
|
8569
8720
|
), viewMembers.filter((member) => {
|
|
8570
8721
|
const search = assigneeSearchQuery.toLowerCase();
|
|
8571
8722
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
8572
|
-
}).map((member) => /* @__PURE__ */
|
|
8723
|
+
}).map((member) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8573
8724
|
"li",
|
|
8574
8725
|
{
|
|
8575
8726
|
key: member.id,
|
|
@@ -8584,7 +8735,14 @@ function InSceneQuestForm({
|
|
|
8584
8735
|
)), viewMembers.filter((member) => {
|
|
8585
8736
|
const search = assigneeSearchQuery.toLowerCase();
|
|
8586
8737
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
8587
|
-
}).length === 0 && assigneeSearchQuery && /* @__PURE__ */
|
|
8738
|
+
}).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react17.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8739
|
+
QuestReviewStackEditor,
|
|
8740
|
+
{
|
|
8741
|
+
reviewStack,
|
|
8742
|
+
onChange: setReviewStack,
|
|
8743
|
+
viewMembers
|
|
8744
|
+
}
|
|
8745
|
+
)), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Tipos Adicionais"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react17.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiX, { size: 12 })))), /* @__PURE__ */ import_react17.default.createElement(
|
|
8588
8746
|
"input",
|
|
8589
8747
|
{
|
|
8590
8748
|
type: "text",
|
|
@@ -8597,7 +8755,7 @@ function InSceneQuestForm({
|
|
|
8597
8755
|
className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
|
|
8598
8756
|
autoComplete: "off"
|
|
8599
8757
|
}
|
|
8600
|
-
))), /* @__PURE__ */
|
|
8758
|
+
))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Descri\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative group min-h-[80px] bg-slate-800/70 p-2.5 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8601
8759
|
DescriptionDisplay,
|
|
8602
8760
|
{
|
|
8603
8761
|
description,
|
|
@@ -8607,7 +8765,7 @@ function InSceneQuestForm({
|
|
|
8607
8765
|
onMentionClick,
|
|
8608
8766
|
onSaveDescription: (newDesc) => setDescription(newDesc)
|
|
8609
8767
|
}
|
|
8610
|
-
), /* @__PURE__ */
|
|
8768
|
+
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiEdit2, { size: 14 }))), !description && /* @__PURE__ */ import_react17.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8611
8769
|
"button",
|
|
8612
8770
|
{
|
|
8613
8771
|
key: s,
|
|
@@ -8618,9 +8776,9 @@ function InSceneQuestForm({
|
|
|
8618
8776
|
},
|
|
8619
8777
|
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
8620
8778
|
},
|
|
8621
|
-
/* @__PURE__ */
|
|
8622
|
-
/* @__PURE__ */
|
|
8623
|
-
)))), /* @__PURE__ */
|
|
8779
|
+
/* @__PURE__ */ import_react17.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${size === s ? "bg-indigo-500 border-indigo-500" : "border-slate-600 bg-transparent group-hover:border-slate-500"}` }, size === s && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12, className: "text-white" })),
|
|
8780
|
+
/* @__PURE__ */ import_react17.default.createElement("span", { className: `text-sm capitalize transition-colors ${size === s ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}` }, s)
|
|
8781
|
+
)))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react17.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8624
8782
|
CustomPropertyDisplay,
|
|
8625
8783
|
{
|
|
8626
8784
|
key: prop.id,
|
|
@@ -8631,8 +8789,8 @@ function InSceneQuestForm({
|
|
|
8631
8789
|
unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
|
|
8632
8790
|
onUploadFile
|
|
8633
8791
|
}
|
|
8634
|
-
)), /* @__PURE__ */
|
|
8635
|
-
), isDescriptionModalOpen && /* @__PURE__ */
|
|
8792
|
+
)), /* @__PURE__ */ import_react17.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react17.default.createElement("button", { type: "button", onClick: onCancel, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm" }, "Cancelar"), /* @__PURE__ */ import_react17.default.createElement("button", { type: "submit", className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)]" }, "Salvar Quest")))
|
|
8793
|
+
), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
|
|
8636
8794
|
DescriptionEditModal,
|
|
8637
8795
|
{
|
|
8638
8796
|
isOpen: isDescriptionModalOpen,
|
|
@@ -8648,8 +8806,8 @@ function InSceneQuestForm({
|
|
|
8648
8806
|
}
|
|
8649
8807
|
|
|
8650
8808
|
// src/components/NodeDetailsPanel.jsx
|
|
8651
|
-
var
|
|
8652
|
-
var
|
|
8809
|
+
var import_react18 = __toESM(require("react"));
|
|
8810
|
+
var import_fi16 = require("react-icons/fi");
|
|
8653
8811
|
function NodeDetailsPanel({
|
|
8654
8812
|
node,
|
|
8655
8813
|
onClose,
|
|
@@ -8670,39 +8828,39 @@ function NodeDetailsPanel({
|
|
|
8670
8828
|
userRole,
|
|
8671
8829
|
currentDatasetName
|
|
8672
8830
|
}) {
|
|
8673
|
-
const [name, setName] = (0,
|
|
8674
|
-
const [types, setTypes] = (0,
|
|
8675
|
-
const [typeInput, setTypeInput] = (0,
|
|
8676
|
-
const [color, setColor] = (0,
|
|
8677
|
-
const [size, setSize] = (0,
|
|
8678
|
-
const [description, setDescription] = (0,
|
|
8679
|
-
const [intensity, setIntensity] = (0,
|
|
8680
|
-
const [customProps, setCustomProps] = (0,
|
|
8681
|
-
const [showTypeSuggestions, setShowTypeSuggestions] = (0,
|
|
8682
|
-
const [filteredTypes, setFilteredTypes] = (0,
|
|
8683
|
-
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0,
|
|
8684
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
8685
|
-
const [existingSections, setExistingSections] = (0,
|
|
8686
|
-
const [isSaving, setIsSaving] = (0,
|
|
8687
|
-
const [isLinkCopied, setIsLinkCopied] = (0,
|
|
8688
|
-
const [useImageAsTexture, setUseImageAsTexture] = (0,
|
|
8831
|
+
const [name, setName] = (0, import_react18.useState)((node == null ? void 0 : node.name) ?? "");
|
|
8832
|
+
const [types, setTypes] = (0, import_react18.useState)([]);
|
|
8833
|
+
const [typeInput, setTypeInput] = (0, import_react18.useState)("");
|
|
8834
|
+
const [color, setColor] = (0, import_react18.useState)((node == null ? void 0 : node.color) ?? "#8b5cf6");
|
|
8835
|
+
const [size, setSize] = (0, import_react18.useState)((node == null ? void 0 : node.size) ?? "medium");
|
|
8836
|
+
const [description, setDescription] = (0, import_react18.useState)((node == null ? void 0 : node.description) ?? "");
|
|
8837
|
+
const [intensity, setIntensity] = (0, import_react18.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
|
|
8838
|
+
const [customProps, setCustomProps] = (0, import_react18.useState)(() => extractCustomPropsFromNode(node || {}));
|
|
8839
|
+
const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react18.useState)(false);
|
|
8840
|
+
const [filteredTypes, setFilteredTypes] = (0, import_react18.useState)([]);
|
|
8841
|
+
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react18.useState)(false);
|
|
8842
|
+
const [isReadMode, setIsReadMode] = (0, import_react18.useState)(false);
|
|
8843
|
+
const [existingSections, setExistingSections] = (0, import_react18.useState)((node == null ? void 0 : node.description_sections) || []);
|
|
8844
|
+
const [isSaving, setIsSaving] = (0, import_react18.useState)(false);
|
|
8845
|
+
const [isLinkCopied, setIsLinkCopied] = (0, import_react18.useState)(false);
|
|
8846
|
+
const [useImageAsTexture, setUseImageAsTexture] = (0, import_react18.useState)(() => {
|
|
8689
8847
|
if ((node == null ? void 0 : node.useImageAsTexture) === "true") return true;
|
|
8690
8848
|
if ((node == null ? void 0 : node.useImageAsTexture) === "false") return false;
|
|
8691
8849
|
return !!(node == null ? void 0 : node.useImageAsTexture);
|
|
8692
8850
|
});
|
|
8693
|
-
const [selectedImageUrl, setSelectedImageUrl] = (0,
|
|
8694
|
-
const [hasUnsavedChanges, setHasUnsavedChanges] = (0,
|
|
8851
|
+
const [selectedImageUrl, setSelectedImageUrl] = (0, import_react18.useState)((node == null ? void 0 : node.textureImageUrl) ?? null);
|
|
8852
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react18.useState)(false);
|
|
8695
8853
|
const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
|
|
8696
8854
|
const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
|
|
8697
8855
|
initialWidth: isReadMode ? 700 : 440,
|
|
8698
8856
|
minWidth: 320,
|
|
8699
8857
|
maxWidth: maxPanelW
|
|
8700
8858
|
});
|
|
8701
|
-
(0,
|
|
8859
|
+
(0, import_react18.useEffect)(() => {
|
|
8702
8860
|
setWidth(isReadMode ? 700 : 440);
|
|
8703
8861
|
}, [isReadMode, setWidth]);
|
|
8704
|
-
const prevNodeIdRef = (0,
|
|
8705
|
-
const propsEndRef = (0,
|
|
8862
|
+
const prevNodeIdRef = (0, import_react18.useRef)(null);
|
|
8863
|
+
const propsEndRef = (0, import_react18.useRef)(null);
|
|
8706
8864
|
const canEdit = userRole !== "viewer";
|
|
8707
8865
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
8708
8866
|
const handleImageClickFromText = (url, name2) => {
|
|
@@ -8710,7 +8868,7 @@ function NodeDetailsPanel({
|
|
|
8710
8868
|
onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
|
|
8711
8869
|
}
|
|
8712
8870
|
};
|
|
8713
|
-
(0,
|
|
8871
|
+
(0, import_react18.useEffect)(() => {
|
|
8714
8872
|
if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
|
|
8715
8873
|
prevNodeIdRef.current = node == null ? void 0 : node.id;
|
|
8716
8874
|
setName((node == null ? void 0 : node.name) ?? "");
|
|
@@ -8733,13 +8891,13 @@ function NodeDetailsPanel({
|
|
|
8733
8891
|
}
|
|
8734
8892
|
}, [node]);
|
|
8735
8893
|
const hasImages = customProps.some((p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value));
|
|
8736
|
-
(0,
|
|
8894
|
+
(0, import_react18.useEffect)(() => {
|
|
8737
8895
|
if (!hasImages && useImageAsTexture) {
|
|
8738
8896
|
setUseImageAsTexture(false);
|
|
8739
8897
|
setSelectedImageUrl(null);
|
|
8740
8898
|
}
|
|
8741
8899
|
}, [hasImages, useImageAsTexture]);
|
|
8742
|
-
(0,
|
|
8900
|
+
(0, import_react18.useEffect)(() => {
|
|
8743
8901
|
const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
|
|
8744
8902
|
if (typeInput.trim() === "") {
|
|
8745
8903
|
setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
|
|
@@ -8934,7 +9092,7 @@ function NodeDetailsPanel({
|
|
|
8934
9092
|
onClose();
|
|
8935
9093
|
};
|
|
8936
9094
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
8937
|
-
return /* @__PURE__ */
|
|
9095
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
|
|
8938
9096
|
"div",
|
|
8939
9097
|
{
|
|
8940
9098
|
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 ${isResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
|
|
@@ -8947,7 +9105,7 @@ function NodeDetailsPanel({
|
|
|
8947
9105
|
onContextMenu: swallow,
|
|
8948
9106
|
onDoubleClick: swallow
|
|
8949
9107
|
},
|
|
8950
|
-
/* @__PURE__ */
|
|
9108
|
+
/* @__PURE__ */ import_react18.default.createElement(
|
|
8951
9109
|
"div",
|
|
8952
9110
|
{
|
|
8953
9111
|
onPointerDown: (e) => {
|
|
@@ -8958,7 +9116,7 @@ function NodeDetailsPanel({
|
|
|
8958
9116
|
title: "Arraste para redimensionar"
|
|
8959
9117
|
}
|
|
8960
9118
|
),
|
|
8961
|
-
isReadMode ? /* @__PURE__ */
|
|
9119
|
+
isReadMode ? /* @__PURE__ */ import_react18.default.createElement(
|
|
8962
9120
|
DescriptionReadModePanel,
|
|
8963
9121
|
{
|
|
8964
9122
|
title: name || (node == null ? void 0 : node.name),
|
|
@@ -8979,23 +9137,23 @@ function NodeDetailsPanel({
|
|
|
8979
9137
|
onImageClick: handleImageClickFromText,
|
|
8980
9138
|
onSaveDescription: handleSaveDescriptionInline
|
|
8981
9139
|
}
|
|
8982
|
-
) : /* @__PURE__ */
|
|
9140
|
+
) : /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }), /* @__PURE__ */ import_react18.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-indigo-400/80 shadow-[0_0_18px_2px_rgba(99,102,241,0.55)]" }), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes do Node"), /* @__PURE__ */ import_react18.default.createElement(
|
|
8983
9141
|
"button",
|
|
8984
9142
|
{
|
|
8985
9143
|
onClick: handleCopyLink,
|
|
8986
9144
|
className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-indigo-400"}`,
|
|
8987
9145
|
title: isLinkCopied ? "Link Copiado!" : "Copiar link para este Node"
|
|
8988
9146
|
},
|
|
8989
|
-
isLinkCopied ? /* @__PURE__ */
|
|
8990
|
-
)), /* @__PURE__ */
|
|
9147
|
+
isLinkCopied ? /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLink, { size: 12 })
|
|
9148
|
+
)), /* @__PURE__ */ import_react18.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos"), /* @__PURE__ */ import_react18.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react18.default.createElement("span", { key: index, className: "flex items-center gap-1 bg-indigo-500/30 text-indigo-100 px-1.5 py-0.5 rounded-md text-xs font-medium border border-indigo-500/20" }, t, canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
8991
9149
|
"button",
|
|
8992
9150
|
{
|
|
8993
9151
|
type: "button",
|
|
8994
9152
|
onClick: () => handleRemoveType(index),
|
|
8995
9153
|
className: "hover:text-white transition-colors"
|
|
8996
9154
|
},
|
|
8997
|
-
/* @__PURE__ */
|
|
8998
|
-
))), canEdit && /* @__PURE__ */
|
|
9155
|
+
/* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })
|
|
9156
|
+
))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
8999
9157
|
"input",
|
|
9000
9158
|
{
|
|
9001
9159
|
type: "text",
|
|
@@ -9016,7 +9174,7 @@ function NodeDetailsPanel({
|
|
|
9016
9174
|
placeholder: types.length === 0 ? "Ex.: Cliente" : "",
|
|
9017
9175
|
autoComplete: "off"
|
|
9018
9176
|
}
|
|
9019
|
-
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */
|
|
9177
|
+
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react18.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react18.default.createElement(
|
|
9020
9178
|
"li",
|
|
9021
9179
|
{
|
|
9022
9180
|
key: index,
|
|
@@ -9027,7 +9185,7 @@ function NodeDetailsPanel({
|
|
|
9027
9185
|
}
|
|
9028
9186
|
},
|
|
9029
9187
|
suggestedType
|
|
9030
|
-
))))), /* @__PURE__ */
|
|
9188
|
+
))))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome"), /* @__PURE__ */ import_react18.default.createElement(
|
|
9031
9189
|
"input",
|
|
9032
9190
|
{
|
|
9033
9191
|
type: "text",
|
|
@@ -9036,7 +9194,7 @@ function NodeDetailsPanel({
|
|
|
9036
9194
|
readOnly: !canEdit,
|
|
9037
9195
|
className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
|
|
9038
9196
|
}
|
|
9039
|
-
)), /* @__PURE__ */
|
|
9197
|
+
)), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(
|
|
9040
9198
|
DescriptionDisplay,
|
|
9041
9199
|
{
|
|
9042
9200
|
description,
|
|
@@ -9048,7 +9206,7 @@ function NodeDetailsPanel({
|
|
|
9048
9206
|
onImageClick: handleImageClickFromText,
|
|
9049
9207
|
onSaveDescription: handleSaveDescriptionInline
|
|
9050
9208
|
}
|
|
9051
|
-
), /* @__PURE__ */
|
|
9209
|
+
), /* @__PURE__ */ import_react18.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react18.default.createElement(
|
|
9052
9210
|
"button",
|
|
9053
9211
|
{
|
|
9054
9212
|
type: "button",
|
|
@@ -9056,8 +9214,8 @@ function NodeDetailsPanel({
|
|
|
9056
9214
|
className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`,
|
|
9057
9215
|
title: "Modo de Leitura"
|
|
9058
9216
|
},
|
|
9059
|
-
/* @__PURE__ */
|
|
9060
|
-
), canEdit && /* @__PURE__ */
|
|
9217
|
+
/* @__PURE__ */ import_react18.default.createElement(import_fi16.FiBookOpen, { size: 14 })
|
|
9218
|
+
), canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9061
9219
|
"button",
|
|
9062
9220
|
{
|
|
9063
9221
|
type: "button",
|
|
@@ -9065,17 +9223,17 @@ function NodeDetailsPanel({
|
|
|
9065
9223
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
9066
9224
|
title: "Editar descri\xE7\xE3o (Modo de Escrita)"
|
|
9067
9225
|
},
|
|
9068
|
-
/* @__PURE__ */
|
|
9069
|
-
)), canEdit && !description && /* @__PURE__ */
|
|
9226
|
+
/* @__PURE__ */ import_react18.default.createElement(import_fi16.FiEdit2, { size: 14 })
|
|
9227
|
+
)), canEdit && !description && /* @__PURE__ */ import_react18.default.createElement(
|
|
9070
9228
|
"div",
|
|
9071
9229
|
{
|
|
9072
9230
|
onClick: () => setIsDescriptionModalOpen(true),
|
|
9073
9231
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
9074
9232
|
},
|
|
9075
9233
|
"Adicionar descri\xE7\xE3o..."
|
|
9076
|
-
))), /* @__PURE__ */
|
|
9234
|
+
))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Size"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
|
|
9077
9235
|
const isSelected = size === s;
|
|
9078
|
-
return /* @__PURE__ */
|
|
9236
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
9079
9237
|
"button",
|
|
9080
9238
|
{
|
|
9081
9239
|
key: s,
|
|
@@ -9083,10 +9241,10 @@ function NodeDetailsPanel({
|
|
|
9083
9241
|
onClick: () => canEdit && handleSizeChange(s),
|
|
9084
9242
|
className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}`
|
|
9085
9243
|
},
|
|
9086
|
-
/* @__PURE__ */
|
|
9087
|
-
/* @__PURE__ */
|
|
9244
|
+
/* @__PURE__ */ import_react18.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12, className: "text-white" })),
|
|
9245
|
+
/* @__PURE__ */ import_react18.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s)
|
|
9088
9246
|
);
|
|
9089
|
-
}))), /* @__PURE__ */
|
|
9247
|
+
}))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), canEdit && hasImages && /* @__PURE__ */ import_react18.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: `w-4 h-4 rounded border flex items-center justify-center transition-colors ${useImageAsTexture ? "bg-indigo-500 border-indigo-500" : "border-slate-500 bg-transparent"}` }, useImageAsTexture && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react18.default.createElement(
|
|
9090
9248
|
"input",
|
|
9091
9249
|
{
|
|
9092
9250
|
type: "checkbox",
|
|
@@ -9094,14 +9252,14 @@ function NodeDetailsPanel({
|
|
|
9094
9252
|
onChange: handleToggleImageMode,
|
|
9095
9253
|
className: "hidden"
|
|
9096
9254
|
}
|
|
9097
|
-
), /* @__PURE__ */
|
|
9255
|
+
), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}` }, "Usar imagem para representar o node"))), /* @__PURE__ */ import_react18.default.createElement(
|
|
9098
9256
|
ColorPicker,
|
|
9099
9257
|
{
|
|
9100
9258
|
color,
|
|
9101
9259
|
onChange: handleColorChange,
|
|
9102
9260
|
disabled: !canEdit || useImageAsTexture
|
|
9103
9261
|
}
|
|
9104
|
-
), /* @__PURE__ */
|
|
9262
|
+
), /* @__PURE__ */ import_react18.default.createElement("div", { className: "mt-3 flex items-center gap-3" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiSun, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react18.default.createElement(
|
|
9105
9263
|
"input",
|
|
9106
9264
|
{
|
|
9107
9265
|
type: "range",
|
|
@@ -9114,7 +9272,7 @@ function NodeDetailsPanel({
|
|
|
9114
9272
|
className: `w-full h-1.5 bg-slate-700 rounded-lg appearance-none ${canEdit ? "cursor-pointer accent-indigo-500 hover:accent-indigo-400" : "cursor-default accent-slate-500"}`,
|
|
9115
9273
|
title: `Intensidade do brilho: ${intensity}`
|
|
9116
9274
|
}
|
|
9117
|
-
), /* @__PURE__ */
|
|
9275
|
+
), /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}` }, useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Ajuste a cor e a intensidade do brilho.")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react18.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react18.default.createElement(
|
|
9118
9276
|
CustomPropertyDisplay,
|
|
9119
9277
|
{
|
|
9120
9278
|
key: prop.id,
|
|
@@ -9129,7 +9287,7 @@ function NodeDetailsPanel({
|
|
|
9129
9287
|
onUploadFile: canEdit ? onUploadFile : void 0,
|
|
9130
9288
|
readOnly: !canEdit
|
|
9131
9289
|
}
|
|
9132
|
-
)), /* @__PURE__ */
|
|
9290
|
+
)), /* @__PURE__ */ import_react18.default.createElement("div", { ref: propsEndRef }))), currentDatasetName && /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react18.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9133
9291
|
"button",
|
|
9134
9292
|
{
|
|
9135
9293
|
onClick: () => handleSave(false),
|
|
@@ -9138,10 +9296,10 @@ function NodeDetailsPanel({
|
|
|
9138
9296
|
${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}
|
|
9139
9297
|
`
|
|
9140
9298
|
},
|
|
9141
|
-
isSaving && /* @__PURE__ */
|
|
9299
|
+
isSaving && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLoader, { className: "animate-spin" }),
|
|
9142
9300
|
isSaving ? "Salvando..." : "Salvar"
|
|
9143
9301
|
)))
|
|
9144
|
-
), isDescriptionModalOpen && canEdit && /* @__PURE__ */
|
|
9302
|
+
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9145
9303
|
DescriptionEditModal,
|
|
9146
9304
|
{
|
|
9147
9305
|
isOpen: isDescriptionModalOpen,
|
|
@@ -9162,8 +9320,8 @@ function NodeDetailsPanel({
|
|
|
9162
9320
|
}
|
|
9163
9321
|
|
|
9164
9322
|
// src/components/QuestDetailsPanel.jsx
|
|
9165
|
-
var
|
|
9166
|
-
var
|
|
9323
|
+
var import_react19 = __toESM(require("react"));
|
|
9324
|
+
var import_fi17 = require("react-icons/fi");
|
|
9167
9325
|
var QUEST_STATUS_COLORS3 = {
|
|
9168
9326
|
"Backlog": "#64748b",
|
|
9169
9327
|
"In Progress": "#eab308",
|
|
@@ -9191,40 +9349,42 @@ function QuestDetailsPanel({
|
|
|
9191
9349
|
}) {
|
|
9192
9350
|
var _a;
|
|
9193
9351
|
const initialRawTitle = (node == null ? void 0 : node.raw_title) || (((_a = node == null ? void 0 : node.name) == null ? void 0 : _a.includes(" - \xBB ")) ? node.name.split(" - \xBB ")[1] : node == null ? void 0 : node.name) || "";
|
|
9194
|
-
const [rawTitle, setRawTitle] = (0,
|
|
9352
|
+
const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
|
|
9195
9353
|
const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
|
|
9196
9354
|
const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
|
|
9197
9355
|
const standardizedName = questPrefix ? `${questPrefix} - \xBB ${rawTitle || "Sem t\xEDtulo"}` : rawTitle;
|
|
9198
|
-
const [types, setTypes] = (0,
|
|
9199
|
-
const [typeInput, setTypeInput] = (0,
|
|
9200
|
-
const [status, setStatus] = (0,
|
|
9201
|
-
const [size, setSize] = (0,
|
|
9202
|
-
const [assigneeId, setAssigneeId] = (0,
|
|
9203
|
-
const [description, setDescription] = (0,
|
|
9204
|
-
const [intensity, setIntensity] = (0,
|
|
9205
|
-
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0,
|
|
9206
|
-
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0,
|
|
9207
|
-
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0,
|
|
9208
|
-
const [customProps, setCustomProps] = (0,
|
|
9209
|
-
const [
|
|
9210
|
-
const [
|
|
9211
|
-
const [
|
|
9212
|
-
const [
|
|
9213
|
-
const [
|
|
9214
|
-
const [
|
|
9215
|
-
const [
|
|
9216
|
-
const [
|
|
9356
|
+
const [types, setTypes] = (0, import_react19.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
|
|
9357
|
+
const [typeInput, setTypeInput] = (0, import_react19.useState)("");
|
|
9358
|
+
const [status, setStatus] = (0, import_react19.useState)((node == null ? void 0 : node.status) ?? "Backlog");
|
|
9359
|
+
const [size, setSize] = (0, import_react19.useState)((node == null ? void 0 : node.size) ?? "medium");
|
|
9360
|
+
const [assigneeId, setAssigneeId] = (0, import_react19.useState)((node == null ? void 0 : node.assignee_id) || "");
|
|
9361
|
+
const [description, setDescription] = (0, import_react19.useState)((node == null ? void 0 : node.description) ?? "");
|
|
9362
|
+
const [intensity, setIntensity] = (0, import_react19.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
|
|
9363
|
+
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react19.useState)(false);
|
|
9364
|
+
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react19.useState)(false);
|
|
9365
|
+
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react19.useState)("");
|
|
9366
|
+
const [customProps, setCustomProps] = (0, import_react19.useState)(() => extractCustomPropsFromNode(node || {}));
|
|
9367
|
+
const [reviewStack, setReviewStack] = (0, import_react19.useState)((node == null ? void 0 : node.reviewStack) || []);
|
|
9368
|
+
const [timeline, setTimeline] = (0, import_react19.useState)((node == null ? void 0 : node.timeline) || []);
|
|
9369
|
+
const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react19.useState)(false);
|
|
9370
|
+
const [filteredTypes, setFilteredTypes] = (0, import_react19.useState)([]);
|
|
9371
|
+
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react19.useState)(false);
|
|
9372
|
+
const [isReadMode, setIsReadMode] = (0, import_react19.useState)(false);
|
|
9373
|
+
const [existingSections, setExistingSections] = (0, import_react19.useState)((node == null ? void 0 : node.description_sections) || []);
|
|
9374
|
+
const [isSaving, setIsSaving] = (0, import_react19.useState)(false);
|
|
9375
|
+
const [isLinkCopied, setIsLinkCopied] = (0, import_react19.useState)(false);
|
|
9376
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react19.useState)(false);
|
|
9217
9377
|
const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
|
|
9218
9378
|
const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
|
|
9219
9379
|
initialWidth: isReadMode ? 700 : 440,
|
|
9220
9380
|
minWidth: 320,
|
|
9221
9381
|
maxWidth: maxPanelW
|
|
9222
9382
|
});
|
|
9223
|
-
(0,
|
|
9383
|
+
(0, import_react19.useEffect)(() => {
|
|
9224
9384
|
setWidth(isReadMode ? 700 : 440);
|
|
9225
9385
|
}, [isReadMode, setWidth]);
|
|
9226
|
-
const prevNodeIdRef = (0,
|
|
9227
|
-
const propsEndRef = (0,
|
|
9386
|
+
const prevNodeIdRef = (0, import_react19.useRef)(null);
|
|
9387
|
+
const propsEndRef = (0, import_react19.useRef)(null);
|
|
9228
9388
|
const canEdit = userRole !== "viewer";
|
|
9229
9389
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
9230
9390
|
const handleImageClickFromText = (url, name) => {
|
|
@@ -9232,7 +9392,7 @@ function QuestDetailsPanel({
|
|
|
9232
9392
|
onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
|
|
9233
9393
|
}
|
|
9234
9394
|
};
|
|
9235
|
-
(0,
|
|
9395
|
+
(0, import_react19.useEffect)(() => {
|
|
9236
9396
|
var _a2;
|
|
9237
9397
|
if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
|
|
9238
9398
|
prevNodeIdRef.current = node == null ? void 0 : node.id;
|
|
@@ -9246,10 +9406,12 @@ function QuestDetailsPanel({
|
|
|
9246
9406
|
setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
|
|
9247
9407
|
setExistingSections((node == null ? void 0 : node.description_sections) || []);
|
|
9248
9408
|
setCustomProps(extractCustomPropsFromNode(node || {}));
|
|
9409
|
+
setReviewStack((node == null ? void 0 : node.reviewStack) || []);
|
|
9410
|
+
setTimeline((node == null ? void 0 : node.timeline) || []);
|
|
9249
9411
|
setHasUnsavedChanges(false);
|
|
9250
9412
|
}
|
|
9251
9413
|
}, [node]);
|
|
9252
|
-
(0,
|
|
9414
|
+
(0, import_react19.useEffect)(() => {
|
|
9253
9415
|
const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
|
|
9254
9416
|
if (typeInput.trim() === "") {
|
|
9255
9417
|
setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
|
|
@@ -9361,6 +9523,8 @@ function QuestDetailsPanel({
|
|
|
9361
9523
|
const currentAssigneeId = overrides.assigneeId !== void 0 ? overrides.assigneeId : assigneeId;
|
|
9362
9524
|
const currentDescription = overrides.description !== void 0 ? overrides.description : description;
|
|
9363
9525
|
const currentCustomProps = overrides.customProps !== void 0 ? overrides.customProps : customProps;
|
|
9526
|
+
const currentReviewStack = overrides.reviewStack !== void 0 ? overrides.reviewStack : reviewStack;
|
|
9527
|
+
const currentTimeline = overrides.timeline !== void 0 ? overrides.timeline : timeline;
|
|
9364
9528
|
const currentExistingSections = overrides.existingSections !== void 0 ? overrides.existingSections : existingSections;
|
|
9365
9529
|
const currentStatus = overrides.status !== void 0 ? overrides.status : status;
|
|
9366
9530
|
if (!keepOpen && !hasUnsavedChanges) {
|
|
@@ -9392,6 +9556,8 @@ function QuestDetailsPanel({
|
|
|
9392
9556
|
textureImageUrl: null,
|
|
9393
9557
|
intensity,
|
|
9394
9558
|
is_quest: true,
|
|
9559
|
+
reviewStack: currentReviewStack,
|
|
9560
|
+
timeline: currentTimeline,
|
|
9395
9561
|
...extrasObj,
|
|
9396
9562
|
version_node: node.version_node
|
|
9397
9563
|
};
|
|
@@ -9419,7 +9585,7 @@ function QuestDetailsPanel({
|
|
|
9419
9585
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
9420
9586
|
const assigneeMember = viewMembers.find((m) => m.id === assigneeId);
|
|
9421
9587
|
const isAssigneeUndefined = assigneeId && !assigneeMember;
|
|
9422
|
-
return /* @__PURE__ */
|
|
9588
|
+
return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
|
|
9423
9589
|
"div",
|
|
9424
9590
|
{
|
|
9425
9591
|
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 ${isResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
|
|
@@ -9432,11 +9598,11 @@ function QuestDetailsPanel({
|
|
|
9432
9598
|
onContextMenu: swallow,
|
|
9433
9599
|
onDoubleClick: swallow
|
|
9434
9600
|
},
|
|
9435
|
-
/* @__PURE__ */
|
|
9601
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { onPointerDown: (e) => {
|
|
9436
9602
|
e.stopPropagation();
|
|
9437
9603
|
handleResize(e);
|
|
9438
9604
|
}, className: "absolute left-0 top-0 bottom-0 w-2 cursor-col-resize hover:bg-indigo-500/50 z-[2000] transition-colors", title: "Arraste para redimensionar" }),
|
|
9439
|
-
isReadMode ? /* @__PURE__ */
|
|
9605
|
+
isReadMode ? /* @__PURE__ */ import_react19.default.createElement(
|
|
9440
9606
|
DescriptionReadModePanel,
|
|
9441
9607
|
{
|
|
9442
9608
|
title: standardizedName || (node == null ? void 0 : node.name),
|
|
@@ -9457,7 +9623,7 @@ function QuestDetailsPanel({
|
|
|
9457
9623
|
onImageClick: handleImageClickFromText,
|
|
9458
9624
|
onSaveDescription: handleSaveDescriptionInline
|
|
9459
9625
|
}
|
|
9460
|
-
) : /* @__PURE__ */
|
|
9626
|
+
) : /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS3[status]}, transparent)` } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Quest"), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCopyLink, className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-sky-400"}`, title: isLinkCopied ? "Link Copiado!" : "Copiar link para esta Quest" }, isLinkCopied ? /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12 }) : /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLink, { size: 12 }))), /* @__PURE__ */ import_react19.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, standardizedName || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Cancelar" }, "\xD7")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react19.default.createElement(
|
|
9461
9627
|
"input",
|
|
9462
9628
|
{
|
|
9463
9629
|
type: "text",
|
|
@@ -9466,7 +9632,7 @@ function QuestDetailsPanel({
|
|
|
9466
9632
|
readOnly: !canEdit,
|
|
9467
9633
|
className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
|
|
9468
9634
|
}
|
|
9469
|
-
), /* @__PURE__ */
|
|
9635
|
+
), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
9470
9636
|
"button",
|
|
9471
9637
|
{
|
|
9472
9638
|
type: "button",
|
|
@@ -9474,9 +9640,9 @@ function QuestDetailsPanel({
|
|
|
9474
9640
|
disabled: !canEdit,
|
|
9475
9641
|
className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 transition-colors flex items-center justify-between ${canEdit ? "hover:border-white/20 focus:ring-2 focus:ring-indigo-400/60 cursor-pointer" : "cursor-default opacity-80"}`
|
|
9476
9642
|
},
|
|
9477
|
-
/* @__PURE__ */
|
|
9478
|
-
canEdit && /* @__PURE__ */
|
|
9479
|
-
), isStatusDropdownOpen && canEdit && /* @__PURE__ */
|
|
9643
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]", style: { backgroundColor: QUEST_STATUS_COLORS3[status] } }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
|
|
9644
|
+
canEdit && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
|
|
9645
|
+
), isStatusDropdownOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS3).map((s) => /* @__PURE__ */ import_react19.default.createElement(
|
|
9480
9646
|
"li",
|
|
9481
9647
|
{
|
|
9482
9648
|
key: s,
|
|
@@ -9486,21 +9652,21 @@ function QuestDetailsPanel({
|
|
|
9486
9652
|
},
|
|
9487
9653
|
className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${status === s ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
|
|
9488
9654
|
},
|
|
9489
|
-
/* @__PURE__ */
|
|
9655
|
+
/* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
|
|
9490
9656
|
s
|
|
9491
|
-
)))))), /* @__PURE__ */
|
|
9657
|
+
)))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
9492
9658
|
"button",
|
|
9493
9659
|
{
|
|
9494
9660
|
type: "button",
|
|
9495
9661
|
onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
|
|
9496
9662
|
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
|
|
9497
9663
|
},
|
|
9498
|
-
/* @__PURE__ */
|
|
9499
|
-
/* @__PURE__ */
|
|
9500
|
-
), isAssigneeDropdownOpen && /* @__PURE__ */
|
|
9664
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
|
|
9665
|
+
/* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
|
|
9666
|
+
), isAssigneeDropdownOpen && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
|
|
9501
9667
|
setIsAssigneeDropdownOpen(false);
|
|
9502
9668
|
setAssigneeSearchQuery("");
|
|
9503
|
-
} }), /* @__PURE__ */
|
|
9669
|
+
} }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react19.default.createElement(
|
|
9504
9670
|
"input",
|
|
9505
9671
|
{
|
|
9506
9672
|
type: "text",
|
|
@@ -9511,11 +9677,19 @@ function QuestDetailsPanel({
|
|
|
9511
9677
|
className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
|
|
9512
9678
|
onClick: (e) => e.stopPropagation()
|
|
9513
9679
|
}
|
|
9514
|
-
)), /* @__PURE__ */
|
|
9680
|
+
)), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
9515
9681
|
"li",
|
|
9516
9682
|
{
|
|
9517
9683
|
onClick: () => {
|
|
9518
9684
|
setAssigneeId("");
|
|
9685
|
+
const newTimeline = [...timeline, {
|
|
9686
|
+
type: "assignee_changed",
|
|
9687
|
+
timestamp: Date.now(),
|
|
9688
|
+
actorId: "user",
|
|
9689
|
+
to_assignee_id: null,
|
|
9690
|
+
description: `Respons\xE1vel removido.`
|
|
9691
|
+
}];
|
|
9692
|
+
setTimeline(newTimeline);
|
|
9519
9693
|
setHasUnsavedChanges(true);
|
|
9520
9694
|
setIsAssigneeDropdownOpen(false);
|
|
9521
9695
|
setAssigneeSearchQuery("");
|
|
@@ -9523,7 +9697,7 @@ function QuestDetailsPanel({
|
|
|
9523
9697
|
className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
|
|
9524
9698
|
},
|
|
9525
9699
|
"Nenhum"
|
|
9526
|
-
), isAssigneeUndefined && /* @__PURE__ */
|
|
9700
|
+
), isAssigneeUndefined && /* @__PURE__ */ import_react19.default.createElement(
|
|
9527
9701
|
"li",
|
|
9528
9702
|
{
|
|
9529
9703
|
onClick: () => {
|
|
@@ -9536,12 +9710,20 @@ function QuestDetailsPanel({
|
|
|
9536
9710
|
), viewMembers.filter((member) => {
|
|
9537
9711
|
const search = assigneeSearchQuery.toLowerCase();
|
|
9538
9712
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
9539
|
-
}).map((member) => /* @__PURE__ */
|
|
9713
|
+
}).map((member) => /* @__PURE__ */ import_react19.default.createElement(
|
|
9540
9714
|
"li",
|
|
9541
9715
|
{
|
|
9542
9716
|
key: member.id,
|
|
9543
9717
|
onClick: () => {
|
|
9544
9718
|
setAssigneeId(member.id);
|
|
9719
|
+
const newTimeline = [...timeline, {
|
|
9720
|
+
type: "assignee_changed",
|
|
9721
|
+
timestamp: Date.now(),
|
|
9722
|
+
actorId: "user",
|
|
9723
|
+
to_assignee_id: member.id,
|
|
9724
|
+
description: `Quest atribu\xEDda para ${member.name || member.email}.`
|
|
9725
|
+
}];
|
|
9726
|
+
setTimeline(newTimeline);
|
|
9545
9727
|
setHasUnsavedChanges(true);
|
|
9546
9728
|
setIsAssigneeDropdownOpen(false);
|
|
9547
9729
|
setAssigneeSearchQuery("");
|
|
@@ -9552,7 +9734,18 @@ function QuestDetailsPanel({
|
|
|
9552
9734
|
)), viewMembers.filter((member) => {
|
|
9553
9735
|
const search = assigneeSearchQuery.toLowerCase();
|
|
9554
9736
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
9555
|
-
}).length === 0 && assigneeSearchQuery && /* @__PURE__ */
|
|
9737
|
+
}).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react19.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react19.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
9738
|
+
QuestReviewStackEditor,
|
|
9739
|
+
{
|
|
9740
|
+
reviewStack,
|
|
9741
|
+
onChange: (newStack) => {
|
|
9742
|
+
setReviewStack(newStack);
|
|
9743
|
+
setHasUnsavedChanges(true);
|
|
9744
|
+
},
|
|
9745
|
+
viewMembers,
|
|
9746
|
+
readOnly: !canEdit
|
|
9747
|
+
}
|
|
9748
|
+
)), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react19.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react19.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react19.default.createElement(
|
|
9556
9749
|
"input",
|
|
9557
9750
|
{
|
|
9558
9751
|
type: "text",
|
|
@@ -9573,14 +9766,18 @@ function QuestDetailsPanel({
|
|
|
9573
9766
|
placeholder: "",
|
|
9574
9767
|
autoComplete: "off"
|
|
9575
9768
|
}
|
|
9576
|
-
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */
|
|
9769
|
+
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react19.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react19.default.createElement("li", { key: index, className: "px-3 py-2 text-sm text-slate-200 cursor-pointer hover:bg-indigo-600/50", onMouseDown: (e) => {
|
|
9577
9770
|
e.preventDefault();
|
|
9578
9771
|
handleAddType(suggestedType);
|
|
9579
|
-
} }, suggestedType))))), /* @__PURE__ */
|
|
9772
|
+
} }, suggestedType))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(DescriptionDisplay, { description, savedSections: existingSections, availableNodes, availableAncestries, onOpenReference, onMentionClick, onImageClick: handleImageClickFromText, onSaveDescription: handleSaveDescriptionInline }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => setIsReadMode(true), className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`, title: "Modo de Leitura" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiBookOpen, { size: 14 })), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors", title: "Editar descri\xE7\xE3o (Modo de Escrita)" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiEdit2, { size: 14 }))), canEdit && !description && /* @__PURE__ */ import_react19.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
|
|
9580
9773
|
const isSelected = size === s;
|
|
9581
|
-
return /* @__PURE__ */
|
|
9582
|
-
}))), /* @__PURE__ */
|
|
9583
|
-
|
|
9774
|
+
return /* @__PURE__ */ import_react19.default.createElement("button", { key: s, type: "button", onClick: () => canEdit && handleSizeChange(s), className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}` }, /* @__PURE__ */ import_react19.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react19.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
|
|
9775
|
+
}))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react19.default.createElement(CustomPropertyDisplay, { key: prop.id, prop, onUpdate: canEdit ? (updatedProp) => handleUpdateProp(idx, updatedProp) : void 0, onRemove: canEdit ? () => handleRemoveProp(idx) : void 0, onOpenImageViewer, unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type), isTextureMode: false, onUploadFile: canEdit ? onUploadFile : void 0, readOnly: !canEdit })), /* @__PURE__ */ import_react19.default.createElement("div", { ref: propsEndRef }))), timeline && timeline.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-4 pb-2 border-t border-white/10 mt-4" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider mb-3" }, "Timeline & Hist\xF3rico"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative border-l border-white/10 ml-2.5 space-y-4" }, timeline.slice().sort((a, b) => a.timestamp - b.timestamp).map((event, idx) => {
|
|
9776
|
+
const dateObj = new Date(event.timestamp);
|
|
9777
|
+
const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
9778
|
+
return /* @__PURE__ */ import_react19.default.createElement("div", { key: idx, className: "relative pl-4 flex flex-col gap-0.5" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute left-[-4.5px] top-1.5 w-2 h-2 rounded-full bg-slate-400/50 border-[1.5px] border-slate-900" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] text-slate-300" }, event.description), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[9px] text-slate-500 font-mono tracking-tighter" }, dateString));
|
|
9779
|
+
}))), currentDatasetName && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => handleSave(false), disabled: isSaving, className: `px-4 py-2 rounded-lg transition-all font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)] flex items-center gap-2 ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}` }, isSaving && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
|
|
9780
|
+
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
|
|
9584
9781
|
DescriptionEditModal,
|
|
9585
9782
|
{
|
|
9586
9783
|
isOpen: isDescriptionModalOpen,
|
|
@@ -9600,7 +9797,7 @@ function QuestDetailsPanel({
|
|
|
9600
9797
|
}
|
|
9601
9798
|
|
|
9602
9799
|
// src/components/MultiNodeContextMenu.jsx
|
|
9603
|
-
var
|
|
9800
|
+
var import_react20 = __toESM(require("react"));
|
|
9604
9801
|
function MultiNodeContextMenu({
|
|
9605
9802
|
data,
|
|
9606
9803
|
userRole,
|
|
@@ -9609,12 +9806,12 @@ function MultiNodeContextMenu({
|
|
|
9609
9806
|
onDismissOtherNodes,
|
|
9610
9807
|
onDeleteNodes
|
|
9611
9808
|
}) {
|
|
9612
|
-
const menuRef = (0,
|
|
9613
|
-
const [menuPos, setMenuPos] = (0,
|
|
9614
|
-
const [isConfirmingDelete, setIsConfirmingDelete] = (0,
|
|
9809
|
+
const menuRef = (0, import_react20.useRef)(null);
|
|
9810
|
+
const [menuPos, setMenuPos] = (0, import_react20.useState)({ left: 0, top: 0 });
|
|
9811
|
+
const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react20.useState)(false);
|
|
9615
9812
|
const ability = defineAbilityFor(userRole);
|
|
9616
9813
|
const canDelete = ability.can("delete", "Node");
|
|
9617
|
-
(0,
|
|
9814
|
+
(0, import_react20.useLayoutEffect)(() => {
|
|
9618
9815
|
if (!data.visible || !menuRef.current) return;
|
|
9619
9816
|
const el = menuRef.current;
|
|
9620
9817
|
const w = el.clientWidth;
|
|
@@ -9627,7 +9824,7 @@ function MultiNodeContextMenu({
|
|
|
9627
9824
|
if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
|
|
9628
9825
|
setMenuPos({ left, top });
|
|
9629
9826
|
}, [data]);
|
|
9630
|
-
(0,
|
|
9827
|
+
(0, import_react20.useEffect)(() => {
|
|
9631
9828
|
if (data.visible) {
|
|
9632
9829
|
setIsConfirmingDelete(false);
|
|
9633
9830
|
}
|
|
@@ -9642,7 +9839,7 @@ function MultiNodeContextMenu({
|
|
|
9642
9839
|
const baseButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-indigo-500/20 text-slate-200 hover:text-white transition-colors duration-150 truncate";
|
|
9643
9840
|
const deleteButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-red-500/25 text-red-400 hover:text-red-300 transition-colors duration-150 truncate";
|
|
9644
9841
|
const nodeCount = data.nodeIds.size;
|
|
9645
|
-
return /* @__PURE__ */
|
|
9842
|
+
return /* @__PURE__ */ import_react20.default.createElement(
|
|
9646
9843
|
"div",
|
|
9647
9844
|
{
|
|
9648
9845
|
ref: menuRef,
|
|
@@ -9656,28 +9853,28 @@ function MultiNodeContextMenu({
|
|
|
9656
9853
|
onContextMenu: swallow,
|
|
9657
9854
|
onDoubleClick: swallow
|
|
9658
9855
|
},
|
|
9659
|
-
/* @__PURE__ */
|
|
9660
|
-
/* @__PURE__ */
|
|
9856
|
+
/* @__PURE__ */ import_react20.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
|
|
9857
|
+
/* @__PURE__ */ import_react20.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center text-red-400 mb-1" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir ", /* @__PURE__ */ import_react20.default.createElement("strong", null, nodeCount, " Nodes"), "?"), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight" }, "Esta a\xE7\xE3o \xE9 irrevers\xEDvel. Todas as conex\xF5es associadas a eles ser\xE3o apagadas.")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
9661
9858
|
"button",
|
|
9662
9859
|
{
|
|
9663
9860
|
onClick: () => setIsConfirmingDelete(false),
|
|
9664
9861
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
|
|
9665
9862
|
},
|
|
9666
9863
|
"Cancelar"
|
|
9667
|
-
), /* @__PURE__ */
|
|
9864
|
+
), /* @__PURE__ */ import_react20.default.createElement(
|
|
9668
9865
|
"button",
|
|
9669
9866
|
{
|
|
9670
9867
|
onClick: () => onDeleteNodes(data.nodeIds),
|
|
9671
9868
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-red-500 hover:bg-red-600 rounded-md text-white transition-colors"
|
|
9672
9869
|
},
|
|
9673
9870
|
"Excluir"
|
|
9674
|
-
))) : /* @__PURE__ */
|
|
9871
|
+
))) : /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es em Grupo (", nodeCount, " Nodes)")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => onDismissNodes(data.nodeIds), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Dismiss (", nodeCount, ")")), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => onDismissOtherNodes(data.nodeIds), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Dismiss other nodes")), canDelete && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react20.default.createElement("button", { onClick: () => setIsConfirmingDelete(true), className: deleteButtonClass, title: "Excluir Nodes" }, /* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react20.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react20.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react20.default.createElement("span", null, "Excluir Nodes (", nodeCount, ")"))))))
|
|
9675
9872
|
);
|
|
9676
9873
|
}
|
|
9677
9874
|
|
|
9678
9875
|
// src/components/RelationshipDetailsPanel.jsx
|
|
9679
|
-
var
|
|
9680
|
-
var
|
|
9876
|
+
var import_react21 = __toESM(require("react"));
|
|
9877
|
+
var import_fi18 = require("react-icons/fi");
|
|
9681
9878
|
function RelationshipDetailsPanel({
|
|
9682
9879
|
link,
|
|
9683
9880
|
onClose,
|
|
@@ -9691,22 +9888,22 @@ function RelationshipDetailsPanel({
|
|
|
9691
9888
|
onUploadFile,
|
|
9692
9889
|
userRole
|
|
9693
9890
|
}) {
|
|
9694
|
-
const [name, setName] = (0,
|
|
9695
|
-
const [description, setDescription] = (0,
|
|
9696
|
-
const [customProps, setCustomProps] = (0,
|
|
9697
|
-
const [existingSections, setExistingSections] = (0,
|
|
9698
|
-
const [sourceLabel, setSourceLabel] = (0,
|
|
9699
|
-
const [targetLabel, setTargetLabel] = (0,
|
|
9700
|
-
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0,
|
|
9701
|
-
const [isSaving, setIsSaving] = (0,
|
|
9702
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
9703
|
-
const [hasUnsavedChanges, setHasUnsavedChanges] = (0,
|
|
9704
|
-
const propsEndRef = (0,
|
|
9705
|
-
const canEdit = (0,
|
|
9891
|
+
const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
|
|
9892
|
+
const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
|
|
9893
|
+
const [customProps, setCustomProps] = (0, import_react21.useState)(() => extractCustomPropsFromNode(link || {}));
|
|
9894
|
+
const [existingSections, setExistingSections] = (0, import_react21.useState)((link == null ? void 0 : link.description_sections) || []);
|
|
9895
|
+
const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
|
|
9896
|
+
const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
|
|
9897
|
+
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
|
|
9898
|
+
const [isSaving, setIsSaving] = (0, import_react21.useState)(false);
|
|
9899
|
+
const [isReadMode, setIsReadMode] = (0, import_react21.useState)(false);
|
|
9900
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react21.useState)(false);
|
|
9901
|
+
const propsEndRef = (0, import_react21.useRef)(null);
|
|
9902
|
+
const canEdit = (0, import_react21.useMemo)(() => {
|
|
9706
9903
|
const ability = defineAbilityFor(userRole);
|
|
9707
9904
|
return ability.can("update", "Connection");
|
|
9708
9905
|
}, [userRole]);
|
|
9709
|
-
(0,
|
|
9906
|
+
(0, import_react21.useEffect)(() => {
|
|
9710
9907
|
setName((link == null ? void 0 : link.name) ?? "");
|
|
9711
9908
|
setDescription((link == null ? void 0 : link.description) ?? "");
|
|
9712
9909
|
setExistingSections((link == null ? void 0 : link.description_sections) || []);
|
|
@@ -9797,7 +9994,7 @@ function RelationshipDetailsPanel({
|
|
|
9797
9994
|
onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
|
|
9798
9995
|
}
|
|
9799
9996
|
};
|
|
9800
|
-
return /* @__PURE__ */
|
|
9997
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement(
|
|
9801
9998
|
"div",
|
|
9802
9999
|
{
|
|
9803
10000
|
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 transition-all duration-300 ease-out
|
|
@@ -9812,7 +10009,7 @@ function RelationshipDetailsPanel({
|
|
|
9812
10009
|
onContextMenu: swallow,
|
|
9813
10010
|
onDoubleClick: swallow
|
|
9814
10011
|
},
|
|
9815
|
-
isReadMode ? /* @__PURE__ */
|
|
10012
|
+
isReadMode ? /* @__PURE__ */ import_react21.default.createElement(
|
|
9816
10013
|
DescriptionReadModePanel,
|
|
9817
10014
|
{
|
|
9818
10015
|
title: name || "Rela\xE7\xE3o",
|
|
@@ -9833,7 +10030,7 @@ function RelationshipDetailsPanel({
|
|
|
9833
10030
|
onImageClick: handleImageClickFromText,
|
|
9834
10031
|
onSaveDescription: handleSaveDescriptionInline
|
|
9835
10032
|
}
|
|
9836
|
-
) : /* @__PURE__ */
|
|
10033
|
+
) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-teal-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("button", { onClick: onClose, disabled: isSaving, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl disabled:opacity-50", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome da Rela\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react21.default.createElement(
|
|
9837
10034
|
"input",
|
|
9838
10035
|
{
|
|
9839
10036
|
type: "text",
|
|
@@ -9848,7 +10045,7 @@ function RelationshipDetailsPanel({
|
|
|
9848
10045
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
9849
10046
|
`
|
|
9850
10047
|
}
|
|
9851
|
-
)), /* @__PURE__ */
|
|
10048
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react21.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-violet-400 flex-shrink-0" }, /* @__PURE__ */ import_react21.default.createElement("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z" }), /* @__PURE__ */ import_react21.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs font-medium text-violet-300/80 uppercase tracking-wider" }, "Labels de Agrupamento")), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] text-slate-400 leading-relaxed" }, "Labels agrupam conex\xF5es no menu de Conex\xF5es. Cada lado da conex\xE3o pode ter sua pr\xF3pria label."), /* @__PURE__ */ import_react21.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Source"), /* @__PURE__ */ import_react21.default.createElement(
|
|
9852
10049
|
"input",
|
|
9853
10050
|
{
|
|
9854
10051
|
type: "text",
|
|
@@ -9863,7 +10060,7 @@ function RelationshipDetailsPanel({
|
|
|
9863
10060
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
9864
10061
|
`
|
|
9865
10062
|
}
|
|
9866
|
-
)), /* @__PURE__ */
|
|
10063
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Target"), /* @__PURE__ */ import_react21.default.createElement(
|
|
9867
10064
|
"input",
|
|
9868
10065
|
{
|
|
9869
10066
|
type: "text",
|
|
@@ -9878,7 +10075,7 @@ function RelationshipDetailsPanel({
|
|
|
9878
10075
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
9879
10076
|
`
|
|
9880
10077
|
}
|
|
9881
|
-
)))), /* @__PURE__ */
|
|
10078
|
+
)))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react21.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
9882
10079
|
DescriptionDisplay,
|
|
9883
10080
|
{
|
|
9884
10081
|
description,
|
|
@@ -9890,7 +10087,7 @@ function RelationshipDetailsPanel({
|
|
|
9890
10087
|
onImageClick: handleImageClickFromText,
|
|
9891
10088
|
onSaveDescription: handleSaveDescriptionInline
|
|
9892
10089
|
}
|
|
9893
|
-
), /* @__PURE__ */
|
|
10090
|
+
), /* @__PURE__ */ import_react21.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
9894
10091
|
"button",
|
|
9895
10092
|
{
|
|
9896
10093
|
type: "button",
|
|
@@ -9898,8 +10095,8 @@ function RelationshipDetailsPanel({
|
|
|
9898
10095
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors border-r border-white/5",
|
|
9899
10096
|
title: "Modo de Leitura"
|
|
9900
10097
|
},
|
|
9901
|
-
/* @__PURE__ */
|
|
9902
|
-
), canEdit && /* @__PURE__ */
|
|
10098
|
+
/* @__PURE__ */ import_react21.default.createElement(import_fi18.FiBookOpen, { size: 14 })
|
|
10099
|
+
), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
9903
10100
|
"button",
|
|
9904
10101
|
{
|
|
9905
10102
|
type: "button",
|
|
@@ -9907,15 +10104,15 @@ function RelationshipDetailsPanel({
|
|
|
9907
10104
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
9908
10105
|
title: "Editar descri\xE7\xE3o"
|
|
9909
10106
|
},
|
|
9910
|
-
/* @__PURE__ */
|
|
9911
|
-
)), !description && canEdit && /* @__PURE__ */
|
|
10107
|
+
/* @__PURE__ */ import_react21.default.createElement(import_fi18.FiEdit2, { size: 14 })
|
|
10108
|
+
)), !description && canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
9912
10109
|
"div",
|
|
9913
10110
|
{
|
|
9914
10111
|
onClick: () => setIsDescriptionModalOpen(true),
|
|
9915
10112
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
9916
10113
|
},
|
|
9917
10114
|
"Adicionar descri\xE7\xE3o..."
|
|
9918
|
-
))), /* @__PURE__ */
|
|
10115
|
+
))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react21.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react21.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
|
|
9919
10116
|
CustomPropertyDisplay,
|
|
9920
10117
|
{
|
|
9921
10118
|
key: prop.id,
|
|
@@ -9927,7 +10124,7 @@ function RelationshipDetailsPanel({
|
|
|
9927
10124
|
onUploadFile,
|
|
9928
10125
|
disabled: !canEdit
|
|
9929
10126
|
}
|
|
9930
|
-
)), /* @__PURE__ */
|
|
10127
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react21.default.createElement("button", { onClick: onClose, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
9931
10128
|
"button",
|
|
9932
10129
|
{
|
|
9933
10130
|
onClick: () => handleSave(false),
|
|
@@ -9936,10 +10133,10 @@ function RelationshipDetailsPanel({
|
|
|
9936
10133
|
${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-teal-600 to-teal-400 hover:from-teal-500 hover:to-teal-300 text-white"}
|
|
9937
10134
|
`
|
|
9938
10135
|
},
|
|
9939
|
-
isSaving && /* @__PURE__ */
|
|
10136
|
+
isSaving && /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiLoader, { className: "animate-spin" }),
|
|
9940
10137
|
isSaving ? "Salvando..." : "Salvar"
|
|
9941
10138
|
)))
|
|
9942
|
-
), isDescriptionModalOpen && /* @__PURE__ */
|
|
10139
|
+
), isDescriptionModalOpen && /* @__PURE__ */ import_react21.default.createElement(
|
|
9943
10140
|
DescriptionEditModal,
|
|
9944
10141
|
{
|
|
9945
10142
|
isOpen: isDescriptionModalOpen,
|
|
@@ -9961,7 +10158,7 @@ function RelationshipDetailsPanel({
|
|
|
9961
10158
|
}
|
|
9962
10159
|
|
|
9963
10160
|
// src/components/RelationshipContextMenu.jsx
|
|
9964
|
-
var
|
|
10161
|
+
var import_react22 = __toESM(require("react"));
|
|
9965
10162
|
function RelationshipContextMenu({
|
|
9966
10163
|
data,
|
|
9967
10164
|
userRole,
|
|
@@ -9971,25 +10168,25 @@ function RelationshipContextMenu({
|
|
|
9971
10168
|
onDelete,
|
|
9972
10169
|
onClose
|
|
9973
10170
|
}) {
|
|
9974
|
-
const menuRef = (0,
|
|
9975
|
-
const [menuPos, setMenuPos] = (0,
|
|
9976
|
-
const [isConfirmingDelete, setIsConfirmingDelete] = (0,
|
|
9977
|
-
const ability = (0,
|
|
9978
|
-
const sourceName = (0,
|
|
10171
|
+
const menuRef = (0, import_react22.useRef)(null);
|
|
10172
|
+
const [menuPos, setMenuPos] = (0, import_react22.useState)({ left: 0, top: 0 });
|
|
10173
|
+
const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react22.useState)(false);
|
|
10174
|
+
const ability = (0, import_react22.useMemo)(() => defineAbilityFor(userRole), [userRole]);
|
|
10175
|
+
const sourceName = (0, import_react22.useMemo)(
|
|
9979
10176
|
() => {
|
|
9980
10177
|
var _a, _b, _c, _d;
|
|
9981
10178
|
return ((_d = (_c = (_b = (_a = data == null ? void 0 : data.linkObject) == null ? void 0 : _a.userData) == null ? void 0 : _b.sourceNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) ?? "(sem nome)";
|
|
9982
10179
|
},
|
|
9983
10180
|
[data == null ? void 0 : data.linkObject]
|
|
9984
10181
|
);
|
|
9985
|
-
const targetName = (0,
|
|
10182
|
+
const targetName = (0, import_react22.useMemo)(
|
|
9986
10183
|
() => {
|
|
9987
10184
|
var _a, _b, _c, _d;
|
|
9988
10185
|
return ((_d = (_c = (_b = (_a = data == null ? void 0 : data.linkObject) == null ? void 0 : _a.userData) == null ? void 0 : _b.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) ?? "(sem nome)";
|
|
9989
10186
|
},
|
|
9990
10187
|
[data == null ? void 0 : data.linkObject]
|
|
9991
10188
|
);
|
|
9992
|
-
(0,
|
|
10189
|
+
(0, import_react22.useLayoutEffect)(() => {
|
|
9993
10190
|
if (!data.visible || !menuRef.current) return;
|
|
9994
10191
|
const el = menuRef.current;
|
|
9995
10192
|
const w = el.clientWidth;
|
|
@@ -10002,7 +10199,7 @@ function RelationshipContextMenu({
|
|
|
10002
10199
|
if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
|
|
10003
10200
|
setMenuPos({ left, top });
|
|
10004
10201
|
}, [data]);
|
|
10005
|
-
(0,
|
|
10202
|
+
(0, import_react22.useEffect)(() => {
|
|
10006
10203
|
if (data.visible) {
|
|
10007
10204
|
setIsConfirmingDelete(false);
|
|
10008
10205
|
}
|
|
@@ -10018,7 +10215,7 @@ function RelationshipContextMenu({
|
|
|
10018
10215
|
const dangerButtonClass = "w-full flex items-center gap-2.5 px-2 py-1.5 text-left text-sm rounded-md hover:bg-rose-500/20 text-rose-300 hover:text-rose-100 transition-colors duration-150 truncate";
|
|
10019
10216
|
const canUpdate = ability.can("update", "Connection");
|
|
10020
10217
|
const canDelete = ability.can("delete", "Connection");
|
|
10021
|
-
return /* @__PURE__ */
|
|
10218
|
+
return /* @__PURE__ */ import_react22.default.createElement(
|
|
10022
10219
|
"div",
|
|
10023
10220
|
{
|
|
10024
10221
|
ref: menuRef,
|
|
@@ -10032,29 +10229,29 @@ function RelationshipContextMenu({
|
|
|
10032
10229
|
onContextMenu: swallow,
|
|
10033
10230
|
onDoubleClick: swallow
|
|
10034
10231
|
},
|
|
10035
|
-
/* @__PURE__ */
|
|
10036
|
-
/* @__PURE__ */
|
|
10232
|
+
/* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }),
|
|
10233
|
+
/* @__PURE__ */ import_react22.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "w-10 h-10 rounded-full bg-rose-500/20 flex items-center justify-center text-rose-400 mb-1" }, /* @__PURE__ */ import_react22.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react22.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 11v6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11v6" }), /* @__PURE__ */ import_react22.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir rela\xE7\xE3o?"), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight break-words" }, "Desconectar ", /* @__PURE__ */ import_react22.default.createElement("strong", null, sourceName), " de ", /* @__PURE__ */ import_react22.default.createElement("strong", null, targetName), ".")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react22.default.createElement(
|
|
10037
10234
|
"button",
|
|
10038
10235
|
{
|
|
10039
10236
|
onClick: () => setIsConfirmingDelete(false),
|
|
10040
10237
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
|
|
10041
10238
|
},
|
|
10042
10239
|
"Cancelar"
|
|
10043
|
-
), /* @__PURE__ */
|
|
10240
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
10044
10241
|
"button",
|
|
10045
10242
|
{
|
|
10046
10243
|
onClick: () => onDelete == null ? void 0 : onDelete(data.linkObject),
|
|
10047
10244
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-rose-600 hover:bg-rose-500 rounded-md text-white transition-colors"
|
|
10048
10245
|
},
|
|
10049
10246
|
"Excluir"
|
|
10050
|
-
))) : /* @__PURE__ */
|
|
10247
|
+
))) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react22.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-teal-400/80 shadow-[0_0_12px_1px_rgba(45,212,191,0.5)]" }), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-1" }, canUpdate && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(
|
|
10051
10248
|
"button",
|
|
10052
10249
|
{
|
|
10053
10250
|
onClick: () => onRelinkSource == null ? void 0 : onRelinkSource(data.linkObject),
|
|
10054
10251
|
className: baseButtonClass,
|
|
10055
10252
|
title: "Desconectar ponta ligada ao Source"
|
|
10056
10253
|
},
|
|
10057
|
-
/* @__PURE__ */
|
|
10254
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10058
10255
|
"svg",
|
|
10059
10256
|
{
|
|
10060
10257
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10067,18 +10264,18 @@ function RelationshipContextMenu({
|
|
|
10067
10264
|
strokeLinecap: "round",
|
|
10068
10265
|
strokeLinejoin: "round"
|
|
10069
10266
|
},
|
|
10070
|
-
/* @__PURE__ */
|
|
10071
|
-
/* @__PURE__ */
|
|
10267
|
+
/* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }),
|
|
10268
|
+
/* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })
|
|
10072
10269
|
),
|
|
10073
|
-
/* @__PURE__ */
|
|
10074
|
-
), /* @__PURE__ */
|
|
10270
|
+
/* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
|
|
10271
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
10075
10272
|
"button",
|
|
10076
10273
|
{
|
|
10077
10274
|
onClick: () => onRelinkTarget == null ? void 0 : onRelinkTarget(data.linkObject),
|
|
10078
10275
|
className: baseButtonClass,
|
|
10079
10276
|
title: "Desconectar ponta ligada ao Target"
|
|
10080
10277
|
},
|
|
10081
|
-
/* @__PURE__ */
|
|
10278
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10082
10279
|
"svg",
|
|
10083
10280
|
{
|
|
10084
10281
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10091,21 +10288,21 @@ function RelationshipContextMenu({
|
|
|
10091
10288
|
strokeLinecap: "round",
|
|
10092
10289
|
strokeLinejoin: "round"
|
|
10093
10290
|
},
|
|
10094
|
-
/* @__PURE__ */
|
|
10095
|
-
/* @__PURE__ */
|
|
10096
|
-
/* @__PURE__ */
|
|
10097
|
-
/* @__PURE__ */
|
|
10098
|
-
/* @__PURE__ */
|
|
10291
|
+
/* @__PURE__ */ import_react22.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
|
|
10292
|
+
/* @__PURE__ */ import_react22.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
|
|
10293
|
+
/* @__PURE__ */ import_react22.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
|
|
10294
|
+
/* @__PURE__ */ import_react22.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
|
|
10295
|
+
/* @__PURE__ */ import_react22.default.createElement("line", { x1: "4", y1: "4", x2: "9", y2: "9" })
|
|
10099
10296
|
),
|
|
10100
|
-
/* @__PURE__ */
|
|
10101
|
-
), /* @__PURE__ */
|
|
10297
|
+
/* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Target (", targetName, ")")
|
|
10298
|
+
), /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" })), /* @__PURE__ */ import_react22.default.createElement(
|
|
10102
10299
|
"button",
|
|
10103
10300
|
{
|
|
10104
10301
|
onClick: () => onOpenDetails == null ? void 0 : onOpenDetails(data.linkObject),
|
|
10105
10302
|
className: baseButtonClass,
|
|
10106
10303
|
title: "Abrir detalhes da rela\xE7\xE3o"
|
|
10107
10304
|
},
|
|
10108
|
-
/* @__PURE__ */
|
|
10305
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10109
10306
|
"svg",
|
|
10110
10307
|
{
|
|
10111
10308
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10118,19 +10315,19 @@ function RelationshipContextMenu({
|
|
|
10118
10315
|
strokeLinecap: "round",
|
|
10119
10316
|
strokeLinejoin: "round"
|
|
10120
10317
|
},
|
|
10121
|
-
/* @__PURE__ */
|
|
10122
|
-
/* @__PURE__ */
|
|
10123
|
-
/* @__PURE__ */
|
|
10318
|
+
/* @__PURE__ */ import_react22.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
|
|
10319
|
+
/* @__PURE__ */ import_react22.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
|
|
10320
|
+
/* @__PURE__ */ import_react22.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "8" })
|
|
10124
10321
|
),
|
|
10125
|
-
/* @__PURE__ */
|
|
10126
|
-
), canDelete && /* @__PURE__ */
|
|
10322
|
+
/* @__PURE__ */ import_react22.default.createElement("span", null, "Abrir Detalhes")
|
|
10323
|
+
), canDelete && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" }), /* @__PURE__ */ import_react22.default.createElement(
|
|
10127
10324
|
"button",
|
|
10128
10325
|
{
|
|
10129
10326
|
onClick: () => setIsConfirmingDelete(true),
|
|
10130
10327
|
className: dangerButtonClass,
|
|
10131
10328
|
title: "Excluir esta conex\xE3o"
|
|
10132
10329
|
},
|
|
10133
|
-
/* @__PURE__ */
|
|
10330
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10134
10331
|
"svg",
|
|
10135
10332
|
{
|
|
10136
10333
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10143,19 +10340,19 @@ function RelationshipContextMenu({
|
|
|
10143
10340
|
strokeLinecap: "round",
|
|
10144
10341
|
strokeLinejoin: "round"
|
|
10145
10342
|
},
|
|
10146
|
-
/* @__PURE__ */
|
|
10147
|
-
/* @__PURE__ */
|
|
10148
|
-
/* @__PURE__ */
|
|
10149
|
-
/* @__PURE__ */
|
|
10150
|
-
/* @__PURE__ */
|
|
10343
|
+
/* @__PURE__ */ import_react22.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
|
|
10344
|
+
/* @__PURE__ */ import_react22.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
|
|
10345
|
+
/* @__PURE__ */ import_react22.default.createElement("path", { d: "M10 11v6" }),
|
|
10346
|
+
/* @__PURE__ */ import_react22.default.createElement("path", { d: "M14 11v6" }),
|
|
10347
|
+
/* @__PURE__ */ import_react22.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" })
|
|
10151
10348
|
),
|
|
10152
|
-
/* @__PURE__ */
|
|
10349
|
+
/* @__PURE__ */ import_react22.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
|
|
10153
10350
|
)))))
|
|
10154
10351
|
);
|
|
10155
10352
|
}
|
|
10156
10353
|
|
|
10157
10354
|
// src/components/LoadingScreen.jsx
|
|
10158
|
-
var
|
|
10355
|
+
var import_react23 = __toESM(require("react"));
|
|
10159
10356
|
var styles = {
|
|
10160
10357
|
loadingOverlay: {
|
|
10161
10358
|
position: "fixed",
|
|
@@ -10187,11 +10384,11 @@ var styles = {
|
|
|
10187
10384
|
`
|
|
10188
10385
|
};
|
|
10189
10386
|
function LoadingScreen() {
|
|
10190
|
-
return /* @__PURE__ */
|
|
10387
|
+
return /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("style", null, styles.keyframes), /* @__PURE__ */ import_react23.default.createElement("div", { style: styles.loadingOverlay }, /* @__PURE__ */ import_react23.default.createElement("div", { style: styles.spinner })));
|
|
10191
10388
|
}
|
|
10192
10389
|
|
|
10193
10390
|
// src/components/ImportParentFileModal.jsx
|
|
10194
|
-
var
|
|
10391
|
+
var import_react24 = __toESM(require("react"));
|
|
10195
10392
|
function ImportParentFileModal({
|
|
10196
10393
|
isOpen,
|
|
10197
10394
|
onClose,
|
|
@@ -10202,12 +10399,12 @@ function ImportParentFileModal({
|
|
|
10202
10399
|
onFetchAvailableFiles,
|
|
10203
10400
|
currentViewName
|
|
10204
10401
|
}) {
|
|
10205
|
-
const [activeTab, setActiveTab] = (0,
|
|
10206
|
-
const [availableDbs, setAvailableDbs] = (0,
|
|
10207
|
-
const [availableViews, setAvailableViews] = (0,
|
|
10208
|
-
const [selectedItem, setSelectedItem] = (0,
|
|
10209
|
-
const [isLoading, setIsLoading] = (0,
|
|
10210
|
-
(0,
|
|
10402
|
+
const [activeTab, setActiveTab] = (0, import_react24.useState)("databases");
|
|
10403
|
+
const [availableDbs, setAvailableDbs] = (0, import_react24.useState)([]);
|
|
10404
|
+
const [availableViews, setAvailableViews] = (0, import_react24.useState)([]);
|
|
10405
|
+
const [selectedItem, setSelectedItem] = (0, import_react24.useState)(null);
|
|
10406
|
+
const [isLoading, setIsLoading] = (0, import_react24.useState)(false);
|
|
10407
|
+
(0, import_react24.useEffect)(() => {
|
|
10211
10408
|
if (isOpen && session && onFetchAvailableFiles) {
|
|
10212
10409
|
const fetchData = async () => {
|
|
10213
10410
|
setIsLoading(true);
|
|
@@ -10243,7 +10440,7 @@ function ImportParentFileModal({
|
|
|
10243
10440
|
fetchData();
|
|
10244
10441
|
}
|
|
10245
10442
|
}, [isOpen, session, parentDbs, onFetchAvailableFiles, currentViewName]);
|
|
10246
|
-
(0,
|
|
10443
|
+
(0, import_react24.useEffect)(() => {
|
|
10247
10444
|
setSelectedItem(null);
|
|
10248
10445
|
}, [activeTab]);
|
|
10249
10446
|
if (!isOpen) {
|
|
@@ -10272,13 +10469,13 @@ function ImportParentFileModal({
|
|
|
10272
10469
|
const swallow = (e) => e.stopPropagation();
|
|
10273
10470
|
const currentList = activeTab === "databases" ? availableDbs : availableViews;
|
|
10274
10471
|
const emptyMessage = activeTab === "databases" ? "Nenhum novo arquivo parent dispon\xEDvel." : "Nenhuma view dispon\xEDvel para importa\xE7\xE3o.";
|
|
10275
|
-
return /* @__PURE__ */
|
|
10472
|
+
return /* @__PURE__ */ import_react24.default.createElement(
|
|
10276
10473
|
"div",
|
|
10277
10474
|
{
|
|
10278
10475
|
className: "ui-overlay fixed inset-0 z-[1200] flex items-center justify-center bg-black/60 backdrop-blur-sm",
|
|
10279
10476
|
onClick: onClose
|
|
10280
10477
|
},
|
|
10281
|
-
/* @__PURE__ */
|
|
10478
|
+
/* @__PURE__ */ import_react24.default.createElement(
|
|
10282
10479
|
"div",
|
|
10283
10480
|
{
|
|
10284
10481
|
className: "ui-overlay relative rounded-2xl border border-white/10 bg-slate-950/80 shadow-[0_20px_80px_rgba(0,0,0,0.6)] text-white w-[min(92vw,500px)] flex flex-col max-h-[85vh]",
|
|
@@ -10290,14 +10487,14 @@ function ImportParentFileModal({
|
|
|
10290
10487
|
onContextMenu: swallow,
|
|
10291
10488
|
onDoubleClick: swallow
|
|
10292
10489
|
},
|
|
10293
|
-
/* @__PURE__ */
|
|
10490
|
+
/* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/10 flex-shrink-0" }, /* @__PURE__ */ import_react24.default.createElement("h2", { className: "text-lg font-semibold" }, "Importar"), /* @__PURE__ */ import_react24.default.createElement(
|
|
10294
10491
|
"button",
|
|
10295
10492
|
{
|
|
10296
10493
|
onClick: onClose,
|
|
10297
10494
|
className: "p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
10298
10495
|
title: "Fechar"
|
|
10299
10496
|
},
|
|
10300
|
-
/* @__PURE__ */
|
|
10497
|
+
/* @__PURE__ */ import_react24.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react24.default.createElement(
|
|
10301
10498
|
"path",
|
|
10302
10499
|
{
|
|
10303
10500
|
fillRule: "evenodd",
|
|
@@ -10306,14 +10503,14 @@ function ImportParentFileModal({
|
|
|
10306
10503
|
}
|
|
10307
10504
|
))
|
|
10308
10505
|
)),
|
|
10309
|
-
/* @__PURE__ */
|
|
10506
|
+
/* @__PURE__ */ import_react24.default.createElement("div", { className: "flex px-6 border-b border-white/10 bg-white/5 flex-shrink-0" }, /* @__PURE__ */ import_react24.default.createElement(
|
|
10310
10507
|
"button",
|
|
10311
10508
|
{
|
|
10312
10509
|
onClick: () => setActiveTab("databases"),
|
|
10313
10510
|
className: `flex-1 py-3 text-sm font-medium border-b-2 transition-colors ${activeTab === "databases" ? "border-indigo-500 text-white" : "border-transparent text-slate-400 hover:text-slate-200"}`
|
|
10314
10511
|
},
|
|
10315
10512
|
"Arquivos Parent"
|
|
10316
|
-
), /* @__PURE__ */
|
|
10513
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
10317
10514
|
"button",
|
|
10318
10515
|
{
|
|
10319
10516
|
onClick: () => setActiveTab("views"),
|
|
@@ -10321,24 +10518,24 @@ function ImportParentFileModal({
|
|
|
10321
10518
|
},
|
|
10322
10519
|
"Views (Ancestralidades)"
|
|
10323
10520
|
)),
|
|
10324
|
-
/* @__PURE__ */
|
|
10521
|
+
/* @__PURE__ */ import_react24.default.createElement("div", { className: "p-6 overflow-y-auto custom-scrollbar flex-grow min-h-[200px]" }, isLoading ? /* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-center h-40" }, /* @__PURE__ */ import_react24.default.createElement("div", { className: "w-8 h-8 border-4 border-t-indigo-500 border-slate-700 rounded-full animate-spin" })) : /* @__PURE__ */ import_react24.default.createElement("div", { className: "space-y-2" }, currentList.length > 0 ? currentList.map((item) => /* @__PURE__ */ import_react24.default.createElement(
|
|
10325
10522
|
"div",
|
|
10326
10523
|
{
|
|
10327
10524
|
key: item.id,
|
|
10328
10525
|
onClick: () => setSelectedItem(item),
|
|
10329
10526
|
className: `px-4 py-3 rounded-lg border cursor-pointer transition-all duration-150 flex flex-col gap-1 ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "bg-indigo-600 border-indigo-500 shadow-lg" : "bg-slate-800/60 border-white/10 hover:border-white/20 hover:bg-slate-800"}`
|
|
10330
10527
|
},
|
|
10331
|
-
/* @__PURE__ */
|
|
10332
|
-
item.description && /* @__PURE__ */
|
|
10333
|
-
)) : /* @__PURE__ */
|
|
10334
|
-
/* @__PURE__ */
|
|
10528
|
+
/* @__PURE__ */ import_react24.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react24.default.createElement("span", { className: "font-medium text-slate-100" }, item.name), activeTab === "views" && /* @__PURE__ */ import_react24.default.createElement("span", { className: "text-[10px] px-1.5 py-0.5 rounded bg-black/30 text-indigo-300 border border-indigo-500/30" }, "VIEW")),
|
|
10529
|
+
item.description && /* @__PURE__ */ import_react24.default.createElement("p", { className: `text-xs ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "text-indigo-200" : "text-slate-400"}` }, item.description)
|
|
10530
|
+
)) : /* @__PURE__ */ import_react24.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
|
|
10531
|
+
/* @__PURE__ */ import_react24.default.createElement("div", { className: "px-6 py-4 border-t border-white/10 flex justify-end gap-3 flex-shrink-0 bg-slate-900/50" }, /* @__PURE__ */ import_react24.default.createElement(
|
|
10335
10532
|
"button",
|
|
10336
10533
|
{
|
|
10337
10534
|
onClick: onClose,
|
|
10338
10535
|
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm text-slate-300"
|
|
10339
10536
|
},
|
|
10340
10537
|
"Cancelar"
|
|
10341
|
-
), /* @__PURE__ */
|
|
10538
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
10342
10539
|
"button",
|
|
10343
10540
|
{
|
|
10344
10541
|
onClick: handleConfirm,
|
|
@@ -10352,8 +10549,8 @@ function ImportParentFileModal({
|
|
|
10352
10549
|
}
|
|
10353
10550
|
|
|
10354
10551
|
// src/components/AncestryLinkDetailsPanel.jsx
|
|
10355
|
-
var
|
|
10356
|
-
var
|
|
10552
|
+
var import_react25 = __toESM(require("react"));
|
|
10553
|
+
var import_fi19 = require("react-icons/fi");
|
|
10357
10554
|
function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenReference, onMentionClick, onUploadFile }) {
|
|
10358
10555
|
var _a, _b, _c, _d;
|
|
10359
10556
|
const relationshipData = data.relationship || {};
|
|
@@ -10362,21 +10559,21 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10362
10559
|
const customProps = extractCustomPropsFromNode(relationshipData);
|
|
10363
10560
|
const sourceName = ((_b = (_a = data.sourceNode) == null ? void 0 : _a.userData) == null ? void 0 : _b.name) || "Origem";
|
|
10364
10561
|
const targetName = ((_d = (_c = data.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) || "Destino";
|
|
10365
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
10562
|
+
const [isReadMode, setIsReadMode] = (0, import_react25.useState)(false);
|
|
10366
10563
|
const swallow = (e) => e.stopPropagation();
|
|
10367
10564
|
const handleImageClickFromText = (url, name) => {
|
|
10368
10565
|
if (onOpenImageViewer) {
|
|
10369
10566
|
onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
|
|
10370
10567
|
}
|
|
10371
10568
|
};
|
|
10372
|
-
return /* @__PURE__ */
|
|
10569
|
+
return /* @__PURE__ */ import_react25.default.createElement(
|
|
10373
10570
|
"div",
|
|
10374
10571
|
{
|
|
10375
10572
|
className: "ui-overlay fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[1200]",
|
|
10376
10573
|
onClick: onClose,
|
|
10377
10574
|
onPointerDown: swallow
|
|
10378
10575
|
},
|
|
10379
|
-
/* @__PURE__ */
|
|
10576
|
+
/* @__PURE__ */ import_react25.default.createElement(
|
|
10380
10577
|
"div",
|
|
10381
10578
|
{
|
|
10382
10579
|
className: `relative group rounded-2xl border border-white/10 bg-slate-950/80 shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col max-h-[calc(100vh-4rem)] transition-all duration-300 ease-out
|
|
@@ -10384,7 +10581,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10384
10581
|
`,
|
|
10385
10582
|
onClick: swallow
|
|
10386
10583
|
},
|
|
10387
|
-
isReadMode ? /* @__PURE__ */
|
|
10584
|
+
isReadMode ? /* @__PURE__ */ import_react25.default.createElement(
|
|
10388
10585
|
DescriptionReadModePanel,
|
|
10389
10586
|
{
|
|
10390
10587
|
title: `${sourceName} \u2794 ${targetName}`,
|
|
@@ -10396,15 +10593,15 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10396
10593
|
onMentionClick,
|
|
10397
10594
|
onImageClick: handleImageClickFromText
|
|
10398
10595
|
}
|
|
10399
|
-
) : /* @__PURE__ */
|
|
10596
|
+
) : /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-blue-500/0 via-blue-500/70 to-blue-500/0" }), /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-blue-500/80 shadow-[0_0_18px_2px_rgba(59,130,246,0.55)]" }), /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Ancestralidade")), /* @__PURE__ */ import_react25.default.createElement("h2", { className: "text-lg font-semibold tracking-tight flex items-center gap-2" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[150px]" }, sourceName), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-slate-500 text-sm" }, "\u2794"), /* @__PURE__ */ import_react25.default.createElement("span", { className: "truncate max-w-[150px]" }, targetName))), /* @__PURE__ */ import_react25.default.createElement("button", { onClick: onClose, className: "w-9 h-9 flex-shrink-0 grid place-content-center rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-xl", title: "Fechar" }, "\xD7")), /* @__PURE__ */ import_react25.default.createElement("div", { className: "px-6 pb-6 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, description && /* @__PURE__ */ import_react25.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react25.default.createElement("label", { className: "text-xs text-slate-300 font-medium" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react25.default.createElement(
|
|
10400
10597
|
"button",
|
|
10401
10598
|
{
|
|
10402
10599
|
onClick: () => setIsReadMode(true),
|
|
10403
10600
|
className: "p-1 text-slate-400 hover:text-white transition-colors",
|
|
10404
10601
|
title: "Modo de Leitura"
|
|
10405
10602
|
},
|
|
10406
|
-
/* @__PURE__ */
|
|
10407
|
-
)), /* @__PURE__ */
|
|
10603
|
+
/* @__PURE__ */ import_react25.default.createElement(import_fi19.FiBookOpen, { size: 14 })
|
|
10604
|
+
)), /* @__PURE__ */ import_react25.default.createElement("div", { className: "bg-slate-800/40 rounded-lg border border-white/10 p-1 relative group" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
10408
10605
|
DescriptionDisplay,
|
|
10409
10606
|
{
|
|
10410
10607
|
description,
|
|
@@ -10413,7 +10610,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10413
10610
|
onMentionClick,
|
|
10414
10611
|
onImageClick: handleImageClickFromText
|
|
10415
10612
|
}
|
|
10416
|
-
))), customProps.length > 0 && /* @__PURE__ */
|
|
10613
|
+
))), customProps.length > 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react25.default.createElement("label", { className: "text-xs text-slate-300 font-medium mb-2 block" }, "Propriedades"), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop) => /* @__PURE__ */ import_react25.default.createElement(
|
|
10417
10614
|
CustomPropertyDisplay,
|
|
10418
10615
|
{
|
|
10419
10616
|
key: prop.id,
|
|
@@ -10422,14 +10619,14 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10422
10619
|
onOpenImageViewer,
|
|
10423
10620
|
onUploadFile
|
|
10424
10621
|
}
|
|
10425
|
-
)))), !description && customProps.length === 0 && /* @__PURE__ */
|
|
10622
|
+
)))), !description && customProps.length === 0 && /* @__PURE__ */ import_react25.default.createElement("div", { className: "py-8 text-center text-slate-500 text-sm italic border border-dashed border-white/10 rounded-lg" }, "Nenhum detalhe adicional dispon\xEDvel para esta conex\xE3o."), /* @__PURE__ */ import_react25.default.createElement("div", { className: "mt-4 p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg text-xs text-blue-200/80 text-center" }, 'Para editar esta conex\xE3o, utilize o menu "Editar Ancestralidade".')))
|
|
10426
10623
|
)
|
|
10427
10624
|
);
|
|
10428
10625
|
}
|
|
10429
10626
|
|
|
10430
10627
|
// src/components/AncestryBoard.jsx
|
|
10431
|
-
var
|
|
10432
|
-
var
|
|
10628
|
+
var import_react26 = __toESM(require("react"));
|
|
10629
|
+
var import_fi20 = require("react-icons/fi");
|
|
10433
10630
|
var GroupItem = ({
|
|
10434
10631
|
group,
|
|
10435
10632
|
index,
|
|
@@ -10448,7 +10645,7 @@ var GroupItem = ({
|
|
|
10448
10645
|
}) => {
|
|
10449
10646
|
const canIndent = index > 0;
|
|
10450
10647
|
const isPickingForThisGroup = pickingGroupId === group.id;
|
|
10451
|
-
const textareaRef = (0,
|
|
10648
|
+
const textareaRef = (0, import_react26.useRef)(null);
|
|
10452
10649
|
const adjustHeight = () => {
|
|
10453
10650
|
const textarea = textareaRef.current;
|
|
10454
10651
|
if (textarea) {
|
|
@@ -10456,10 +10653,10 @@ var GroupItem = ({
|
|
|
10456
10653
|
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
10457
10654
|
}
|
|
10458
10655
|
};
|
|
10459
|
-
(0,
|
|
10656
|
+
(0, import_react26.useEffect)(() => {
|
|
10460
10657
|
adjustHeight();
|
|
10461
10658
|
}, [group.text]);
|
|
10462
|
-
return /* @__PURE__ */
|
|
10659
|
+
return /* @__PURE__ */ import_react26.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_react26.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react26.default.createElement(
|
|
10463
10660
|
"div",
|
|
10464
10661
|
{
|
|
10465
10662
|
className: `
|
|
@@ -10467,7 +10664,7 @@ var GroupItem = ({
|
|
|
10467
10664
|
${isPickingForThisGroup ? "bg-indigo-500/10 border-l-2 border-indigo-500" : "hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"}
|
|
10468
10665
|
`
|
|
10469
10666
|
},
|
|
10470
|
-
/* @__PURE__ */
|
|
10667
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10471
10668
|
"textarea",
|
|
10472
10669
|
{
|
|
10473
10670
|
ref: textareaRef,
|
|
@@ -10485,9 +10682,9 @@ var GroupItem = ({
|
|
|
10485
10682
|
}
|
|
10486
10683
|
}
|
|
10487
10684
|
),
|
|
10488
|
-
group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */
|
|
10685
|
+
group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
|
|
10489
10686
|
const isValid = availableIds.has(String(anc.ancestry_id));
|
|
10490
|
-
return /* @__PURE__ */
|
|
10687
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
10491
10688
|
"div",
|
|
10492
10689
|
{
|
|
10493
10690
|
key: anc.ancestry_id,
|
|
@@ -10499,40 +10696,40 @@ var GroupItem = ({
|
|
|
10499
10696
|
},
|
|
10500
10697
|
isValid ? (
|
|
10501
10698
|
// [MANTIDO] Botão Play visível para todos
|
|
10502
|
-
/* @__PURE__ */
|
|
10699
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10503
10700
|
"button",
|
|
10504
10701
|
{
|
|
10505
10702
|
onClick: () => onPlayAncestry(anc.ancestry_id),
|
|
10506
10703
|
className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
|
|
10507
10704
|
title: "Renderizar no cen\xE1rio"
|
|
10508
10705
|
},
|
|
10509
|
-
/* @__PURE__ */
|
|
10706
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
|
|
10510
10707
|
)
|
|
10511
|
-
) : /* @__PURE__ */
|
|
10512
|
-
/* @__PURE__ */
|
|
10708
|
+
) : /* @__PURE__ */ import_react26.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiAlertTriangle, { size: 10 })),
|
|
10709
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10513
10710
|
"span",
|
|
10514
10711
|
{
|
|
10515
10712
|
className: `font-medium truncate max-w-[150px] ${!isValid && "line-through decoration-red-500/50"}`
|
|
10516
10713
|
},
|
|
10517
10714
|
anc.name
|
|
10518
10715
|
),
|
|
10519
|
-
canEdit && /* @__PURE__ */
|
|
10716
|
+
canEdit && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
|
|
10520
10717
|
"div",
|
|
10521
10718
|
{
|
|
10522
10719
|
className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
|
|
10523
10720
|
}
|
|
10524
|
-
), /* @__PURE__ */
|
|
10721
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10525
10722
|
"button",
|
|
10526
10723
|
{
|
|
10527
10724
|
onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
|
|
10528
10725
|
className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
|
|
10529
10726
|
title: "Remover men\xE7\xE3o"
|
|
10530
10727
|
},
|
|
10531
|
-
/* @__PURE__ */
|
|
10728
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiX, { size: 12 })
|
|
10532
10729
|
))
|
|
10533
10730
|
);
|
|
10534
10731
|
})),
|
|
10535
|
-
canEdit && /* @__PURE__ */
|
|
10732
|
+
canEdit && /* @__PURE__ */ import_react26.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_react26.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react26.default.createElement(
|
|
10536
10733
|
"button",
|
|
10537
10734
|
{
|
|
10538
10735
|
onClick: () => onRequestPickAncestry(group.id),
|
|
@@ -10542,17 +10739,17 @@ var GroupItem = ({
|
|
|
10542
10739
|
`,
|
|
10543
10740
|
title: "Adicionar Ancestralidade a este grupo"
|
|
10544
10741
|
},
|
|
10545
|
-
isPickingForThisGroup ? /* @__PURE__ */
|
|
10742
|
+
isPickingForThisGroup ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiSearch, { size: 12 }),
|
|
10546
10743
|
isPickingForThisGroup ? "Selecionando..." : "Adicionar"
|
|
10547
|
-
), /* @__PURE__ */
|
|
10744
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10548
10745
|
"button",
|
|
10549
10746
|
{
|
|
10550
10747
|
onClick: () => onAddSubgroup(group.id),
|
|
10551
10748
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
10552
10749
|
title: "Criar Subgrupo"
|
|
10553
10750
|
},
|
|
10554
|
-
/* @__PURE__ */
|
|
10555
|
-
)), /* @__PURE__ */
|
|
10751
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 14 })
|
|
10752
|
+
)), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react26.default.createElement(
|
|
10556
10753
|
"button",
|
|
10557
10754
|
{
|
|
10558
10755
|
onClick: () => onIndent(group.id),
|
|
@@ -10560,25 +10757,25 @@ var GroupItem = ({
|
|
|
10560
10757
|
className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
|
|
10561
10758
|
title: "Aninhar no grupo acima"
|
|
10562
10759
|
},
|
|
10563
|
-
/* @__PURE__ */
|
|
10564
|
-
), /* @__PURE__ */
|
|
10760
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowRight, { size: 14 })
|
|
10761
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10565
10762
|
"button",
|
|
10566
10763
|
{
|
|
10567
10764
|
onClick: () => onOutdent(group.id),
|
|
10568
10765
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
10569
10766
|
title: "Desaninhar"
|
|
10570
10767
|
},
|
|
10571
|
-
/* @__PURE__ */
|
|
10572
|
-
), /* @__PURE__ */
|
|
10768
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowLeft, { size: 14 })
|
|
10769
|
+
), /* @__PURE__ */ import_react26.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react26.default.createElement(
|
|
10573
10770
|
"button",
|
|
10574
10771
|
{
|
|
10575
10772
|
onClick: () => onDelete(group.id),
|
|
10576
10773
|
className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
|
|
10577
10774
|
title: "Remover Grupo"
|
|
10578
10775
|
},
|
|
10579
|
-
/* @__PURE__ */
|
|
10776
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiTrash2, { size: 14 })
|
|
10580
10777
|
)))
|
|
10581
|
-
), group.children && group.children.length > 0 && /* @__PURE__ */
|
|
10778
|
+
), group.children && group.children.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react26.default.createElement(
|
|
10582
10779
|
GroupItem,
|
|
10583
10780
|
{
|
|
10584
10781
|
key: childGroup.id,
|
|
@@ -10610,21 +10807,21 @@ function AncestryBoard({
|
|
|
10610
10807
|
userRole
|
|
10611
10808
|
// [NOVO] Recebe a role do usuário
|
|
10612
10809
|
}) {
|
|
10613
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
10614
|
-
const [groups, setGroups] = (0,
|
|
10615
|
-
const [isLoaded, setIsLoaded] = (0,
|
|
10616
|
-
const [pickingGroupId, setPickingGroupId] = (0,
|
|
10617
|
-
const [saveStatus, setSaveStatus] = (0,
|
|
10618
|
-
const canEdit = (0,
|
|
10810
|
+
const [searchTerm, setSearchTerm] = (0, import_react26.useState)("");
|
|
10811
|
+
const [groups, setGroups] = (0, import_react26.useState)([]);
|
|
10812
|
+
const [isLoaded, setIsLoaded] = (0, import_react26.useState)(false);
|
|
10813
|
+
const [pickingGroupId, setPickingGroupId] = (0, import_react26.useState)(null);
|
|
10814
|
+
const [saveStatus, setSaveStatus] = (0, import_react26.useState)("idle");
|
|
10815
|
+
const canEdit = (0, import_react26.useMemo)(() => {
|
|
10619
10816
|
return userRole !== "viewer";
|
|
10620
10817
|
}, [userRole]);
|
|
10621
|
-
(0,
|
|
10818
|
+
(0, import_react26.useEffect)(() => {
|
|
10622
10819
|
if (initialGroups && !isLoaded) {
|
|
10623
10820
|
setGroups(initialGroups);
|
|
10624
10821
|
setIsLoaded(true);
|
|
10625
10822
|
}
|
|
10626
10823
|
}, [initialGroups, isLoaded]);
|
|
10627
|
-
const nodeNamesMap = (0,
|
|
10824
|
+
const nodeNamesMap = (0, import_react26.useMemo)(() => {
|
|
10628
10825
|
const map = /* @__PURE__ */ new Map();
|
|
10629
10826
|
if (availableNodes && Array.isArray(availableNodes)) {
|
|
10630
10827
|
availableNodes.forEach((node) => {
|
|
@@ -10635,7 +10832,7 @@ function AncestryBoard({
|
|
|
10635
10832
|
}
|
|
10636
10833
|
return map;
|
|
10637
10834
|
}, [availableNodes]);
|
|
10638
|
-
const availableIds = (0,
|
|
10835
|
+
const availableIds = (0, import_react26.useMemo)(() => {
|
|
10639
10836
|
return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
|
|
10640
10837
|
}, [availableAncestries]);
|
|
10641
10838
|
const sanitizeGroups = (groupList) => {
|
|
@@ -10649,7 +10846,7 @@ function AncestryBoard({
|
|
|
10649
10846
|
children: sanitizeGroups(g.children || [])
|
|
10650
10847
|
}));
|
|
10651
10848
|
};
|
|
10652
|
-
(0,
|
|
10849
|
+
(0, import_react26.useEffect)(() => {
|
|
10653
10850
|
if (!isLoaded || !onSave) return;
|
|
10654
10851
|
const timeoutId = setTimeout(async () => {
|
|
10655
10852
|
setSaveStatus("saving");
|
|
@@ -10667,7 +10864,7 @@ function AncestryBoard({
|
|
|
10667
10864
|
}, 3e3);
|
|
10668
10865
|
return () => clearTimeout(timeoutId);
|
|
10669
10866
|
}, [groups, isLoaded, onSave]);
|
|
10670
|
-
(0,
|
|
10867
|
+
(0, import_react26.useEffect)(() => {
|
|
10671
10868
|
if (!isOpen) return;
|
|
10672
10869
|
const handleKeyDown = (e) => {
|
|
10673
10870
|
if (e.key === "Escape") {
|
|
@@ -10683,7 +10880,7 @@ function AncestryBoard({
|
|
|
10683
10880
|
window.addEventListener("keydown", handleKeyDown);
|
|
10684
10881
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
10685
10882
|
}, [isOpen, onClose, pickingGroupId]);
|
|
10686
|
-
const filtered = (0,
|
|
10883
|
+
const filtered = (0, import_react26.useMemo)(() => {
|
|
10687
10884
|
const term = searchTerm.toLowerCase().trim();
|
|
10688
10885
|
return availableAncestries.filter((a) => {
|
|
10689
10886
|
if (!term) return true;
|
|
@@ -10833,33 +11030,33 @@ function AncestryBoard({
|
|
|
10833
11030
|
});
|
|
10834
11031
|
};
|
|
10835
11032
|
if (!isOpen) return null;
|
|
10836
|
-
return /* @__PURE__ */
|
|
11033
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
10837
11034
|
"div",
|
|
10838
11035
|
{
|
|
10839
11036
|
className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
|
|
10840
11037
|
onClick: onClose
|
|
10841
11038
|
},
|
|
10842
|
-
/* @__PURE__ */
|
|
11039
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10843
11040
|
"div",
|
|
10844
11041
|
{
|
|
10845
11042
|
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",
|
|
10846
11043
|
onClick: (e) => e.stopPropagation()
|
|
10847
11044
|
},
|
|
10848
|
-
/* @__PURE__ */
|
|
10849
|
-
|
|
11045
|
+
/* @__PURE__ */ import_react26.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_react26.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react26.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react26.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_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
|
|
11046
|
+
import_fi20.FiLoader,
|
|
10850
11047
|
{
|
|
10851
11048
|
className: "animate-spin text-indigo-400",
|
|
10852
11049
|
size: 12
|
|
10853
11050
|
}
|
|
10854
|
-
), /* @__PURE__ */
|
|
11051
|
+
), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react26.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_react26.default.createElement(
|
|
10855
11052
|
"button",
|
|
10856
11053
|
{
|
|
10857
11054
|
onClick: handleAddRootGroup,
|
|
10858
11055
|
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 "
|
|
10859
11056
|
},
|
|
10860
|
-
/* @__PURE__ */
|
|
10861
|
-
/* @__PURE__ */
|
|
10862
|
-
), /* @__PURE__ */
|
|
11057
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 14, className: "text-indigo-400" }),
|
|
11058
|
+
/* @__PURE__ */ import_react26.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
|
|
11059
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10863
11060
|
"button",
|
|
10864
11061
|
{
|
|
10865
11062
|
onClick: onClose,
|
|
@@ -10867,7 +11064,7 @@ function AncestryBoard({
|
|
|
10867
11064
|
},
|
|
10868
11065
|
"\xD7"
|
|
10869
11066
|
))),
|
|
10870
|
-
/* @__PURE__ */
|
|
11067
|
+
/* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react26.default.createElement(
|
|
10871
11068
|
"div",
|
|
10872
11069
|
{
|
|
10873
11070
|
className: `
|
|
@@ -10876,12 +11073,12 @@ function AncestryBoard({
|
|
|
10876
11073
|
min-w-[280px] max-w-[500px] bg-slate-900
|
|
10877
11074
|
`
|
|
10878
11075
|
},
|
|
10879
|
-
/* @__PURE__ */
|
|
10880
|
-
|
|
11076
|
+
/* @__PURE__ */ import_react26.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react26.default.createElement(
|
|
11077
|
+
import_fi20.FiSearch,
|
|
10881
11078
|
{
|
|
10882
11079
|
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"}`
|
|
10883
11080
|
}
|
|
10884
|
-
), /* @__PURE__ */
|
|
11081
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10885
11082
|
"input",
|
|
10886
11083
|
{
|
|
10887
11084
|
type: "text",
|
|
@@ -10895,10 +11092,10 @@ function AncestryBoard({
|
|
|
10895
11092
|
autoFocus: !pickingGroupId
|
|
10896
11093
|
}
|
|
10897
11094
|
))),
|
|
10898
|
-
/* @__PURE__ */
|
|
11095
|
+
/* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
|
|
10899
11096
|
const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
|
|
10900
11097
|
const isPicking = !!pickingGroupId;
|
|
10901
|
-
return /* @__PURE__ */
|
|
11098
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
10902
11099
|
"div",
|
|
10903
11100
|
{
|
|
10904
11101
|
key: anc.ancestry_id,
|
|
@@ -10910,7 +11107,7 @@ function AncestryBoard({
|
|
|
10910
11107
|
${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"}
|
|
10911
11108
|
`
|
|
10912
11109
|
},
|
|
10913
|
-
/* @__PURE__ */
|
|
11110
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10914
11111
|
"div",
|
|
10915
11112
|
{
|
|
10916
11113
|
className: `
|
|
@@ -10918,10 +11115,10 @@ function AncestryBoard({
|
|
|
10918
11115
|
${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"}
|
|
10919
11116
|
`
|
|
10920
11117
|
},
|
|
10921
|
-
isPicking ? /* @__PURE__ */
|
|
11118
|
+
isPicking ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { size: 14 })
|
|
10922
11119
|
),
|
|
10923
|
-
/* @__PURE__ */
|
|
10924
|
-
!isPicking && /* @__PURE__ */
|
|
11120
|
+
/* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react26.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.name || "Sem Nome"), anc.is_private && /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-[9px] px-1 py-0.5 rounded bg-amber-500/10 text-amber-300 border border-amber-500/20" }, "Priv")), /* @__PURE__ */ import_react26.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_react26.default.createElement(import_fi20.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.description && /* @__PURE__ */ import_react26.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.description)),
|
|
11121
|
+
!isPicking && /* @__PURE__ */ import_react26.default.createElement(
|
|
10925
11122
|
"button",
|
|
10926
11123
|
{
|
|
10927
11124
|
onClick: (e) => {
|
|
@@ -10931,11 +11128,11 @@ function AncestryBoard({
|
|
|
10931
11128
|
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",
|
|
10932
11129
|
title: "Renderizar Ancestralidade"
|
|
10933
11130
|
},
|
|
10934
|
-
/* @__PURE__ */
|
|
11131
|
+
/* @__PURE__ */ import_react26.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_react26.default.createElement(import_fi20.FiPlay, { size: 14, className: "ml-0.5" }))
|
|
10935
11132
|
)
|
|
10936
11133
|
);
|
|
10937
11134
|
}))
|
|
10938
|
-
), /* @__PURE__ */
|
|
11135
|
+
), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react26.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_react26.default.createElement(import_fi20.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react26.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react26.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react26.default.createElement(
|
|
10939
11136
|
GroupItem,
|
|
10940
11137
|
{
|
|
10941
11138
|
key: group.id,
|
|
@@ -10955,7 +11152,7 @@ function AncestryBoard({
|
|
|
10955
11152
|
canEdit
|
|
10956
11153
|
}
|
|
10957
11154
|
))))),
|
|
10958
|
-
/* @__PURE__ */
|
|
11155
|
+
/* @__PURE__ */ import_react26.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_react26.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react26.default.createElement("span", null, groups.length, " grupos raiz"))
|
|
10959
11156
|
)
|
|
10960
11157
|
);
|
|
10961
11158
|
}
|
|
@@ -11039,12 +11236,12 @@ function XViewScene({
|
|
|
11039
11236
|
get_view_members
|
|
11040
11237
|
}) {
|
|
11041
11238
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
11042
|
-
const { data: session, status } = (0,
|
|
11239
|
+
const { data: session, status } = (0, import_react28.useSession)();
|
|
11043
11240
|
const router = (0, import_navigation.useRouter)();
|
|
11044
11241
|
const searchParams = (0, import_navigation.useSearchParams)();
|
|
11045
11242
|
const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
|
|
11046
11243
|
const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
|
|
11047
|
-
const viewParams = (0,
|
|
11244
|
+
const viewParams = (0, import_react27.useMemo)(() => {
|
|
11048
11245
|
if (encryptedConfig) {
|
|
11049
11246
|
const data = decryptData(encryptedConfig);
|
|
11050
11247
|
if (data) {
|
|
@@ -11053,7 +11250,7 @@ function XViewScene({
|
|
|
11053
11250
|
}
|
|
11054
11251
|
return null;
|
|
11055
11252
|
}, [encryptedConfig, session]);
|
|
11056
|
-
(0,
|
|
11253
|
+
(0, import_react27.useEffect)(() => {
|
|
11057
11254
|
async function verifyPermission() {
|
|
11058
11255
|
if (!viewParams || !session || !check_user_permission) return;
|
|
11059
11256
|
const { id, type, owner_id } = viewParams;
|
|
@@ -11090,65 +11287,65 @@ function XViewScene({
|
|
|
11090
11287
|
setIsLoading(false);
|
|
11091
11288
|
}
|
|
11092
11289
|
}, [viewParams, session, status, check_user_permission]);
|
|
11093
|
-
const sceneConfigId = (0,
|
|
11094
|
-
const ownerId = (0,
|
|
11095
|
-
const dbSaveUrl = (0,
|
|
11290
|
+
const sceneConfigId = (0, import_react27.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
|
|
11291
|
+
const ownerId = (0, import_react27.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
|
|
11292
|
+
const dbSaveUrl = (0, import_react27.useMemo)(() => {
|
|
11096
11293
|
if (ownerId && sceneConfigId) {
|
|
11097
11294
|
return `x_view_dbs/${ownerId}/${sceneConfigId}`;
|
|
11098
11295
|
}
|
|
11099
11296
|
return null;
|
|
11100
11297
|
}, [ownerId, sceneConfigId]);
|
|
11101
|
-
const sceneSaveUrl = (0,
|
|
11298
|
+
const sceneSaveUrl = (0, import_react27.useMemo)(() => {
|
|
11102
11299
|
if (ownerId && sceneConfigId) {
|
|
11103
11300
|
return `x_view_scenes/${ownerId}/${sceneConfigId}`;
|
|
11104
11301
|
}
|
|
11105
11302
|
return null;
|
|
11106
11303
|
}, [ownerId, sceneConfigId]);
|
|
11107
|
-
const ancestry_save_url = (0,
|
|
11304
|
+
const ancestry_save_url = (0, import_react27.useMemo)(() => {
|
|
11108
11305
|
if (ownerId && sceneConfigId) {
|
|
11109
11306
|
return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
|
|
11110
11307
|
}
|
|
11111
11308
|
return null;
|
|
11112
11309
|
}, [ownerId, sceneConfigId]);
|
|
11113
|
-
const sceneDataRef = (0,
|
|
11114
|
-
const parentDataRef = (0,
|
|
11115
|
-
const ancestryDataRef = (0,
|
|
11116
|
-
const [isLoading, setIsLoading] = (0,
|
|
11117
|
-
const [permissionStatus, setPermissionStatus] = (0,
|
|
11118
|
-
const [userPermissionRole, setUserPermissionRole] = (0,
|
|
11119
|
-
const [viewMembers, setViewMembers] = (0,
|
|
11120
|
-
const [isInitialized, setIsInitialized] = (0,
|
|
11121
|
-
const [sceneVersion, setSceneVersion] = (0,
|
|
11122
|
-
const [contextMenu, setContextMenu] = (0,
|
|
11310
|
+
const sceneDataRef = (0, import_react27.useRef)(null);
|
|
11311
|
+
const parentDataRef = (0, import_react27.useRef)(null);
|
|
11312
|
+
const ancestryDataRef = (0, import_react27.useRef)(null);
|
|
11313
|
+
const [isLoading, setIsLoading] = (0, import_react27.useState)(true);
|
|
11314
|
+
const [permissionStatus, setPermissionStatus] = (0, import_react27.useState)("loading");
|
|
11315
|
+
const [userPermissionRole, setUserPermissionRole] = (0, import_react27.useState)(null);
|
|
11316
|
+
const [viewMembers, setViewMembers] = (0, import_react27.useState)([]);
|
|
11317
|
+
const [isInitialized, setIsInitialized] = (0, import_react27.useState)(false);
|
|
11318
|
+
const [sceneVersion, setSceneVersion] = (0, import_react27.useState)(0);
|
|
11319
|
+
const [contextMenu, setContextMenu] = (0, import_react27.useState)({
|
|
11123
11320
|
visible: false,
|
|
11124
11321
|
x: 0,
|
|
11125
11322
|
y: 0,
|
|
11126
11323
|
nodeData: null
|
|
11127
11324
|
});
|
|
11128
|
-
const [multiContextMenu, setMultiContextMenu] = (0,
|
|
11325
|
+
const [multiContextMenu, setMultiContextMenu] = (0, import_react27.useState)({
|
|
11129
11326
|
visible: false,
|
|
11130
11327
|
x: 0,
|
|
11131
11328
|
y: 0,
|
|
11132
11329
|
nodeIds: null
|
|
11133
11330
|
});
|
|
11134
|
-
const [relationshipMenu, setRelationshipMenu] = (0,
|
|
11331
|
+
const [relationshipMenu, setRelationshipMenu] = (0, import_react27.useState)({
|
|
11135
11332
|
visible: false,
|
|
11136
11333
|
x: 0,
|
|
11137
11334
|
y: 0,
|
|
11138
11335
|
linkObject: null
|
|
11139
11336
|
});
|
|
11140
|
-
const [creationMode, setCreationMode] = (0,
|
|
11337
|
+
const [creationMode, setCreationMode] = (0, import_react27.useState)({
|
|
11141
11338
|
isActive: false,
|
|
11142
11339
|
sourceNodeData: null
|
|
11143
11340
|
});
|
|
11144
|
-
const [versionMode, setVersionMode] = (0,
|
|
11341
|
+
const [versionMode, setVersionMode] = (0, import_react27.useState)({
|
|
11145
11342
|
isActive: false,
|
|
11146
11343
|
sourceNodeData: null
|
|
11147
11344
|
});
|
|
11148
|
-
const [questMode, setQuestMode] = (0,
|
|
11149
|
-
const [hasFocusedInitial, setHasFocusedInitial] = (0,
|
|
11150
|
-
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0,
|
|
11151
|
-
const [ancestryMode, setAncestryMode] = (0,
|
|
11345
|
+
const [questMode, setQuestMode] = (0, import_react27.useState)({ isActive: false });
|
|
11346
|
+
const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react27.useState)(false);
|
|
11347
|
+
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react27.useState)(false);
|
|
11348
|
+
const [ancestryMode, setAncestryMode] = (0, import_react27.useState)({
|
|
11152
11349
|
isActive: false,
|
|
11153
11350
|
tree: null,
|
|
11154
11351
|
selectedParentId: null,
|
|
@@ -11159,41 +11356,41 @@ function XViewScene({
|
|
|
11159
11356
|
ancestryDescriptionSections: [],
|
|
11160
11357
|
isAddingNodes: false
|
|
11161
11358
|
});
|
|
11162
|
-
const [readingMode, setReadingMode] = (0,
|
|
11359
|
+
const [readingMode, setReadingMode] = (0, import_react27.useState)({
|
|
11163
11360
|
isActive: false,
|
|
11164
11361
|
ancestry: null,
|
|
11165
11362
|
branchStack: [],
|
|
11166
11363
|
autoAbstraction: false
|
|
11167
11364
|
});
|
|
11168
|
-
const [formPosition, setFormPosition] = (0,
|
|
11365
|
+
const [formPosition, setFormPosition] = (0, import_react27.useState)({
|
|
11169
11366
|
left: 16,
|
|
11170
11367
|
top: 16,
|
|
11171
11368
|
opacity: 0
|
|
11172
11369
|
});
|
|
11173
|
-
const [detailsNode, setDetailsNode] = (0,
|
|
11174
|
-
const [detailsLink, setDetailsLink] = (0,
|
|
11175
|
-
const [ancestryLinkDetails, setAncestryLinkDetails] = (0,
|
|
11176
|
-
const [imageViewer, setImageViewer] = (0,
|
|
11370
|
+
const [detailsNode, setDetailsNode] = (0, import_react27.useState)(null);
|
|
11371
|
+
const [detailsLink, setDetailsLink] = (0, import_react27.useState)(null);
|
|
11372
|
+
const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react27.useState)(null);
|
|
11373
|
+
const [imageViewer, setImageViewer] = (0, import_react27.useState)({
|
|
11177
11374
|
visible: false,
|
|
11178
11375
|
images: [],
|
|
11179
11376
|
startIndex: 0
|
|
11180
11377
|
});
|
|
11181
|
-
const [editingAncestryRel, setEditingAncestryRel] = (0,
|
|
11378
|
+
const [editingAncestryRel, setEditingAncestryRel] = (0, import_react27.useState)({
|
|
11182
11379
|
visible: false,
|
|
11183
11380
|
data: null,
|
|
11184
11381
|
path: null
|
|
11185
11382
|
});
|
|
11186
|
-
const [isImportModalOpen, setIsImportModalOpen] = (0,
|
|
11187
|
-
const [importSuccessMessage, setImportSuccessMessage] = (0,
|
|
11188
|
-
const [invalidTargetError, setInvalidTargetError] = (0,
|
|
11189
|
-
const [highlightedNodeId, setHighlightedNodeId] = (0,
|
|
11190
|
-
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0,
|
|
11191
|
-
const [ancestryBoardData, setAncestryBoardData] = (0,
|
|
11192
|
-
const [isSidebarOpen, setIsSidebarOpen] = (0,
|
|
11193
|
-
const mountRef = (0,
|
|
11194
|
-
const tooltipRef = (0,
|
|
11195
|
-
const formRef = (0,
|
|
11196
|
-
const stateRef = (0,
|
|
11383
|
+
const [isImportModalOpen, setIsImportModalOpen] = (0, import_react27.useState)(false);
|
|
11384
|
+
const [importSuccessMessage, setImportSuccessMessage] = (0, import_react27.useState)("");
|
|
11385
|
+
const [invalidTargetError, setInvalidTargetError] = (0, import_react27.useState)(null);
|
|
11386
|
+
const [highlightedNodeId, setHighlightedNodeId] = (0, import_react27.useState)(null);
|
|
11387
|
+
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react27.useState)(false);
|
|
11388
|
+
const [ancestryBoardData, setAncestryBoardData] = (0, import_react27.useState)([]);
|
|
11389
|
+
const [isSidebarOpen, setIsSidebarOpen] = (0, import_react27.useState)(false);
|
|
11390
|
+
const mountRef = (0, import_react27.useRef)(null);
|
|
11391
|
+
const tooltipRef = (0, import_react27.useRef)(null);
|
|
11392
|
+
const formRef = (0, import_react27.useRef)(null);
|
|
11393
|
+
const stateRef = (0, import_react27.useRef)({
|
|
11197
11394
|
readMode: {
|
|
11198
11395
|
currentMaxIndex: 0,
|
|
11199
11396
|
progressMap: {}
|
|
@@ -11257,10 +11454,10 @@ function XViewScene({
|
|
|
11257
11454
|
minWidth: 320,
|
|
11258
11455
|
maxWidth: maxReadPanelW
|
|
11259
11456
|
});
|
|
11260
|
-
(0,
|
|
11457
|
+
(0, import_react27.useEffect)(() => {
|
|
11261
11458
|
stateRef.current.ancestry = ancestryMode;
|
|
11262
11459
|
}, [ancestryMode]);
|
|
11263
|
-
(0,
|
|
11460
|
+
(0, import_react27.useEffect)(() => {
|
|
11264
11461
|
var _a2;
|
|
11265
11462
|
if (!isInitialized) return;
|
|
11266
11463
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -11283,10 +11480,10 @@ function XViewScene({
|
|
|
11283
11480
|
}
|
|
11284
11481
|
stateRef.current.nodeIdToParentFileMap = map;
|
|
11285
11482
|
}, [isInitialized, sceneVersion]);
|
|
11286
|
-
const handleNavigateBack = (0,
|
|
11483
|
+
const handleNavigateBack = (0, import_react27.useCallback)(() => {
|
|
11287
11484
|
router.push("/dashboard/scenes");
|
|
11288
11485
|
}, [router]);
|
|
11289
|
-
const handleConfirmImport = (0,
|
|
11486
|
+
const handleConfirmImport = (0, import_react27.useCallback)(
|
|
11290
11487
|
async (importPayload) => {
|
|
11291
11488
|
var _a2, _b2;
|
|
11292
11489
|
let files = [];
|
|
@@ -11414,7 +11611,7 @@ function XViewScene({
|
|
|
11414
11611
|
const handleOpenImageViewer = (images, startIndex) => {
|
|
11415
11612
|
setImageViewer({ visible: true, images, startIndex });
|
|
11416
11613
|
};
|
|
11417
|
-
const tweenToTarget = (0,
|
|
11614
|
+
const tweenToTarget = (0, import_react27.useCallback)(
|
|
11418
11615
|
(target, zoomFactor = 1, forcedDirection = null) => {
|
|
11419
11616
|
const { camera, controls, tweenGroup } = stateRef.current;
|
|
11420
11617
|
if (!camera || !controls || !tweenGroup) return;
|
|
@@ -11440,7 +11637,7 @@ function XViewScene({
|
|
|
11440
11637
|
if (!t || typeof t.closest !== "function") return false;
|
|
11441
11638
|
return !!t.closest(".ui-overlay");
|
|
11442
11639
|
};
|
|
11443
|
-
const buildFullAncestryTree = (0,
|
|
11640
|
+
const buildFullAncestryTree = (0, import_react27.useCallback)(
|
|
11444
11641
|
(idTree, nodes, ancestries = []) => {
|
|
11445
11642
|
if (!idTree) return null;
|
|
11446
11643
|
const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
|
|
@@ -11525,7 +11722,7 @@ function XViewScene({
|
|
|
11525
11722
|
},
|
|
11526
11723
|
[]
|
|
11527
11724
|
);
|
|
11528
|
-
const handleActivateTimeline = (0,
|
|
11725
|
+
const handleActivateTimeline = (0, import_react27.useCallback)(() => {
|
|
11529
11726
|
const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
11530
11727
|
if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
|
|
11531
11728
|
while (timelineIntervalsGroup.children.length > 0) {
|
|
@@ -11685,7 +11882,7 @@ function XViewScene({
|
|
|
11685
11882
|
}
|
|
11686
11883
|
});
|
|
11687
11884
|
}, []);
|
|
11688
|
-
const handleVersionTimeline = (0,
|
|
11885
|
+
const handleVersionTimeline = (0, import_react27.useCallback)((sourceMesh, versionMeshes) => {
|
|
11689
11886
|
const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
11690
11887
|
if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
|
|
11691
11888
|
return;
|
|
@@ -11822,7 +12019,7 @@ function XViewScene({
|
|
|
11822
12019
|
}
|
|
11823
12020
|
});
|
|
11824
12021
|
}, []);
|
|
11825
|
-
(0,
|
|
12022
|
+
(0, import_react27.useEffect)(() => {
|
|
11826
12023
|
async function fetchAllData(configPath, ownerId2) {
|
|
11827
12024
|
var _a2, _b2;
|
|
11828
12025
|
if (!get_scene_view_data) {
|
|
@@ -11924,12 +12121,12 @@ function XViewScene({
|
|
|
11924
12121
|
focusNodeId,
|
|
11925
12122
|
focusAncestryId
|
|
11926
12123
|
]);
|
|
11927
|
-
const isNodeInView = (0,
|
|
12124
|
+
const isNodeInView = (0, import_react27.useCallback)((id) => {
|
|
11928
12125
|
const key = String(id);
|
|
11929
12126
|
const objs = stateRef.current.nodeObjects || {};
|
|
11930
12127
|
return !!objs[key];
|
|
11931
12128
|
}, []);
|
|
11932
|
-
const addOrUpdateNodeMesh = (0,
|
|
12129
|
+
const addOrUpdateNodeMesh = (0, import_react27.useCallback)(
|
|
11933
12130
|
(nodeData, position, suppressVersionUpdate = false) => {
|
|
11934
12131
|
const {
|
|
11935
12132
|
graphGroup,
|
|
@@ -11969,7 +12166,7 @@ function XViewScene({
|
|
|
11969
12166
|
},
|
|
11970
12167
|
[]
|
|
11971
12168
|
);
|
|
11972
|
-
(0,
|
|
12169
|
+
(0, import_react27.useEffect)(() => {
|
|
11973
12170
|
if (!isInitialized || !sceneDataRef.current) return;
|
|
11974
12171
|
const currentMount = mountRef.current;
|
|
11975
12172
|
if (!currentMount) return;
|
|
@@ -12725,7 +12922,7 @@ function XViewScene({
|
|
|
12725
12922
|
get_scene_view_data,
|
|
12726
12923
|
save_view_data
|
|
12727
12924
|
]);
|
|
12728
|
-
const handleGhostNodeImageChange = (0,
|
|
12925
|
+
const handleGhostNodeImageChange = (0, import_react27.useCallback)((useImage, imageUrl) => {
|
|
12729
12926
|
const {
|
|
12730
12927
|
node: ghostNode,
|
|
12731
12928
|
line: ghostLine,
|
|
@@ -12773,7 +12970,7 @@ function XViewScene({
|
|
|
12773
12970
|
aura: newGhostNode.getObjectByName("aura")
|
|
12774
12971
|
};
|
|
12775
12972
|
}, []);
|
|
12776
|
-
const handleGhostNodeIntensityChange = (0,
|
|
12973
|
+
const handleGhostNodeIntensityChange = (0, import_react27.useCallback)((newIntensity) => {
|
|
12777
12974
|
const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
|
|
12778
12975
|
if (!ghostNode) return;
|
|
12779
12976
|
const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
|
|
@@ -12794,7 +12991,7 @@ function XViewScene({
|
|
|
12794
12991
|
ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
|
|
12795
12992
|
}
|
|
12796
12993
|
}, []);
|
|
12797
|
-
const handleDetailNodeIntensityChange = (0,
|
|
12994
|
+
const handleDetailNodeIntensityChange = (0, import_react27.useCallback)(
|
|
12798
12995
|
(nodeId, newIntensity) => {
|
|
12799
12996
|
const mesh = stateRef.current.nodeObjects[String(nodeId)];
|
|
12800
12997
|
if (!mesh) return;
|
|
@@ -12950,7 +13147,7 @@ function XViewScene({
|
|
|
12950
13147
|
mountRef.current.style.cursor = "default";
|
|
12951
13148
|
}
|
|
12952
13149
|
};
|
|
12953
|
-
const handleAncestryTreeUpdate = (0,
|
|
13150
|
+
const handleAncestryTreeUpdate = (0, import_react27.useCallback)((newTree, extraData = null) => {
|
|
12954
13151
|
setAncestryMode((prev) => {
|
|
12955
13152
|
const prevTreeStr = JSON.stringify(prev.tree);
|
|
12956
13153
|
const newTreeStr = JSON.stringify(newTree);
|
|
@@ -12973,7 +13170,7 @@ function XViewScene({
|
|
|
12973
13170
|
};
|
|
12974
13171
|
});
|
|
12975
13172
|
}, []);
|
|
12976
|
-
const actionHandlerContext = (0,
|
|
13173
|
+
const actionHandlerContext = (0, import_react27.useMemo)(
|
|
12977
13174
|
() => {
|
|
12978
13175
|
var _a2;
|
|
12979
13176
|
return {
|
|
@@ -13034,20 +13231,115 @@ function XViewScene({
|
|
|
13034
13231
|
const handleStartVersioning = (nodeData) => {
|
|
13035
13232
|
userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
|
|
13036
13233
|
};
|
|
13037
|
-
const handleStartQuestQuick = (0,
|
|
13038
|
-
var _a2;
|
|
13234
|
+
const handleStartQuestQuick = (0, import_react27.useCallback)((questNode) => {
|
|
13235
|
+
var _a2, _b2, _c2;
|
|
13039
13236
|
if (!questNode || !actionHandlerContext) return;
|
|
13237
|
+
const {
|
|
13238
|
+
labelObject,
|
|
13239
|
+
labelOffset,
|
|
13240
|
+
aura,
|
|
13241
|
+
borderRing,
|
|
13242
|
+
timelineIntervalBar,
|
|
13243
|
+
timelineEndLabel,
|
|
13244
|
+
...cleanQuestNode
|
|
13245
|
+
} = questNode;
|
|
13246
|
+
const newTimeline = [...cleanQuestNode.timeline || [], {
|
|
13247
|
+
type: "status_changed",
|
|
13248
|
+
timestamp: Date.now(),
|
|
13249
|
+
actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
|
|
13250
|
+
description: `Quest iniciada ("In Progress") por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
|
|
13251
|
+
}];
|
|
13040
13252
|
const updatedNode = {
|
|
13041
|
-
...
|
|
13253
|
+
...cleanQuestNode,
|
|
13042
13254
|
status: "In Progress",
|
|
13043
13255
|
color: "#eab308",
|
|
13044
|
-
assignee_id: (
|
|
13256
|
+
assignee_id: (_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id,
|
|
13257
|
+
timeline: newTimeline
|
|
13045
13258
|
};
|
|
13046
13259
|
if (userActionHandlers.handleSaveNodeDetails) {
|
|
13047
13260
|
userActionHandlers.handleSaveNodeDetails(actionHandlerContext, updatedNode);
|
|
13048
13261
|
}
|
|
13049
13262
|
}, [session, actionHandlerContext]);
|
|
13050
|
-
const
|
|
13263
|
+
const handleFinishQuestQuick = (0, import_react27.useCallback)((questNode) => {
|
|
13264
|
+
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
|
|
13265
|
+
if (!questNode || !actionHandlerContext) return;
|
|
13266
|
+
const {
|
|
13267
|
+
labelObject,
|
|
13268
|
+
labelOffset,
|
|
13269
|
+
aura,
|
|
13270
|
+
borderRing,
|
|
13271
|
+
timelineIntervalBar,
|
|
13272
|
+
timelineEndLabel,
|
|
13273
|
+
...cleanQuestNode
|
|
13274
|
+
} = questNode;
|
|
13275
|
+
let nextAssigneeId = cleanQuestNode.assignee_id;
|
|
13276
|
+
let nextStatus = "Done";
|
|
13277
|
+
let newTimeline = [...cleanQuestNode.timeline || []];
|
|
13278
|
+
const reviewStack = [...cleanQuestNode.reviewStack || []];
|
|
13279
|
+
const currentReviewerIdx = reviewStack.findIndex((r) => r.status !== "completed");
|
|
13280
|
+
let nextIdxToAssign = 0;
|
|
13281
|
+
if (currentReviewerIdx !== -1 && reviewStack[currentReviewerIdx].userId === cleanQuestNode.assignee_id) {
|
|
13282
|
+
reviewStack[currentReviewerIdx].status = "completed";
|
|
13283
|
+
nextIdxToAssign = currentReviewerIdx + 1;
|
|
13284
|
+
newTimeline.push({
|
|
13285
|
+
type: "review_completed",
|
|
13286
|
+
timestamp: Date.now(),
|
|
13287
|
+
actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || cleanQuestNode.assignee_id,
|
|
13288
|
+
description: `Review conclu\xEDda por ${((_b2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _b2.name) || "revisor"}.`
|
|
13289
|
+
});
|
|
13290
|
+
} else {
|
|
13291
|
+
nextIdxToAssign = currentReviewerIdx !== -1 ? currentReviewerIdx : reviewStack.length;
|
|
13292
|
+
newTimeline.push({
|
|
13293
|
+
type: "task_completed",
|
|
13294
|
+
timestamp: Date.now(),
|
|
13295
|
+
actorId: ((_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id) || cleanQuestNode.assignee_id,
|
|
13296
|
+
description: `Tarefa principal entregue por ${((_d2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _d2.name) || ((_e2 = session == null ? void 0 : session.user) == null ? void 0 : _e2.name) || "respons\xE1vel"}.`
|
|
13297
|
+
});
|
|
13298
|
+
}
|
|
13299
|
+
if (nextIdxToAssign < reviewStack.length) {
|
|
13300
|
+
const remainingMandatory = reviewStack.slice(nextIdxToAssign).some((r) => r.mandatory);
|
|
13301
|
+
const hasAnyMandatory = reviewStack.some((r) => r.mandatory);
|
|
13302
|
+
if (!hasAnyMandatory || remainingMandatory) {
|
|
13303
|
+
const nextReviewer = reviewStack[nextIdxToAssign];
|
|
13304
|
+
nextAssigneeId = nextReviewer.userId;
|
|
13305
|
+
nextStatus = "Review";
|
|
13306
|
+
newTimeline.push({
|
|
13307
|
+
type: "assignee_changed",
|
|
13308
|
+
timestamp: Date.now() + 1,
|
|
13309
|
+
actorId: ((_f2 = session == null ? void 0 : session.user) == null ? void 0 : _f2.id) || "system",
|
|
13310
|
+
to_assignee_id: nextAssigneeId,
|
|
13311
|
+
description: `Quest atribu\xEDda para revis\xE3o a ${((_g2 = viewMembers.find((m) => m.id === nextAssigneeId)) == null ? void 0 : _g2.name) || "revisor"}.`
|
|
13312
|
+
});
|
|
13313
|
+
} else {
|
|
13314
|
+
nextStatus = "Done";
|
|
13315
|
+
for (let i = nextIdxToAssign; i < reviewStack.length; i++) {
|
|
13316
|
+
reviewStack[i].status = "skipped";
|
|
13317
|
+
}
|
|
13318
|
+
}
|
|
13319
|
+
} else {
|
|
13320
|
+
nextStatus = "Done";
|
|
13321
|
+
}
|
|
13322
|
+
if (nextStatus === "Done") {
|
|
13323
|
+
newTimeline.push({
|
|
13324
|
+
type: "quest_finished",
|
|
13325
|
+
timestamp: Date.now() + 2,
|
|
13326
|
+
actorId: ((_h2 = session == null ? void 0 : session.user) == null ? void 0 : _h2.id) || "system",
|
|
13327
|
+
description: `Quest finalizada!`
|
|
13328
|
+
});
|
|
13329
|
+
}
|
|
13330
|
+
const updatedNode = {
|
|
13331
|
+
...cleanQuestNode,
|
|
13332
|
+
status: nextStatus,
|
|
13333
|
+
color: nextStatus === "Done" ? "#22c55e" : "#a855f7",
|
|
13334
|
+
assignee_id: nextAssigneeId,
|
|
13335
|
+
reviewStack,
|
|
13336
|
+
timeline: newTimeline
|
|
13337
|
+
};
|
|
13338
|
+
if (userActionHandlers.handleSaveNodeDetails) {
|
|
13339
|
+
userActionHandlers.handleSaveNodeDetails(actionHandlerContext, updatedNode);
|
|
13340
|
+
}
|
|
13341
|
+
}, [session, actionHandlerContext, viewMembers]);
|
|
13342
|
+
const handleCancelQuest = (0, import_react27.useCallback)(() => {
|
|
13051
13343
|
const { graphGroup, ghostElements } = stateRef.current;
|
|
13052
13344
|
if (ghostElements.node && graphGroup) {
|
|
13053
13345
|
if (ghostElements.node.userData.labelObject) {
|
|
@@ -13198,7 +13490,7 @@ function XViewScene({
|
|
|
13198
13490
|
}
|
|
13199
13491
|
userActionHandlers.handleCancelConnection(context);
|
|
13200
13492
|
};
|
|
13201
|
-
const handleClearAncestryVisuals = (0,
|
|
13493
|
+
const handleClearAncestryVisuals = (0, import_react27.useCallback)((ancestryId) => {
|
|
13202
13494
|
const { renderedAncestries, ancestryGroup } = stateRef.current;
|
|
13203
13495
|
const renderIndex = renderedAncestries.findIndex(
|
|
13204
13496
|
(a) => String(a.id) === String(ancestryId)
|
|
@@ -13216,7 +13508,7 @@ function XViewScene({
|
|
|
13216
13508
|
);
|
|
13217
13509
|
}
|
|
13218
13510
|
}, []);
|
|
13219
|
-
const handleRenderAncestry = (0,
|
|
13511
|
+
const handleRenderAncestry = (0, import_react27.useCallback)(
|
|
13220
13512
|
async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
|
|
13221
13513
|
setContextMenu(
|
|
13222
13514
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -13710,7 +14002,7 @@ function XViewScene({
|
|
|
13710
14002
|
ancestryMode.isActive
|
|
13711
14003
|
]
|
|
13712
14004
|
);
|
|
13713
|
-
const handleRenderAbstractionTree = (0,
|
|
14005
|
+
const handleRenderAbstractionTree = (0, import_react27.useCallback)(
|
|
13714
14006
|
(ancestryObject, targetNodeId = null) => {
|
|
13715
14007
|
setContextMenu(
|
|
13716
14008
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -13798,7 +14090,7 @@ function XViewScene({
|
|
|
13798
14090
|
handleClearAncestryVisuals
|
|
13799
14091
|
]
|
|
13800
14092
|
);
|
|
13801
|
-
const handleReadModeBranchNav = (0,
|
|
14093
|
+
const handleReadModeBranchNav = (0, import_react27.useCallback)(
|
|
13802
14094
|
(nodeId, action, direction = "right") => {
|
|
13803
14095
|
const { ancestry, branchStack } = readingMode;
|
|
13804
14096
|
if (!ancestry || !ancestry.tree) return;
|
|
@@ -13976,13 +14268,13 @@ function XViewScene({
|
|
|
13976
14268
|
},
|
|
13977
14269
|
[readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
|
|
13978
14270
|
);
|
|
13979
|
-
const handleReadModeHighlight = (0,
|
|
14271
|
+
const handleReadModeHighlight = (0, import_react27.useCallback)((nodeId) => {
|
|
13980
14272
|
if (stateRef.current.highlightedNodeId !== nodeId) {
|
|
13981
14273
|
stateRef.current.highlightedNodeId = nodeId;
|
|
13982
14274
|
}
|
|
13983
14275
|
setHighlightedNodeId(nodeId);
|
|
13984
14276
|
}, []);
|
|
13985
|
-
const activeNodeBranches = (0,
|
|
14277
|
+
const activeNodeBranches = (0, import_react27.useMemo)(() => {
|
|
13986
14278
|
if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
|
|
13987
14279
|
return null;
|
|
13988
14280
|
const fullTree = buildFullAncestryTree(
|
|
@@ -14026,7 +14318,7 @@ function XViewScene({
|
|
|
14026
14318
|
readingMode.branchStack,
|
|
14027
14319
|
ancestryDataRef.current
|
|
14028
14320
|
]);
|
|
14029
|
-
const backNavigationInfo = (0,
|
|
14321
|
+
const backNavigationInfo = (0, import_react27.useMemo)(() => {
|
|
14030
14322
|
const { branchStack } = readingMode;
|
|
14031
14323
|
if (!branchStack || branchStack.length === 0) return null;
|
|
14032
14324
|
const lastStep = branchStack[branchStack.length - 1];
|
|
@@ -14037,7 +14329,7 @@ function XViewScene({
|
|
|
14037
14329
|
name: "Voltar para anterior"
|
|
14038
14330
|
};
|
|
14039
14331
|
}, [readingMode.branchStack]);
|
|
14040
|
-
const getReadModeDisplayContext = (0,
|
|
14332
|
+
const getReadModeDisplayContext = (0, import_react27.useMemo)(() => {
|
|
14041
14333
|
const { ancestry, branchStack } = readingMode;
|
|
14042
14334
|
if (!ancestry) return null;
|
|
14043
14335
|
if (branchStack.length === 0) {
|
|
@@ -14080,7 +14372,7 @@ function XViewScene({
|
|
|
14080
14372
|
customProperties: branchProps
|
|
14081
14373
|
};
|
|
14082
14374
|
}, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
|
|
14083
|
-
const readModeAbstractionTree = (0,
|
|
14375
|
+
const readModeAbstractionTree = (0, import_react27.useMemo)(() => {
|
|
14084
14376
|
if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
|
|
14085
14377
|
return null;
|
|
14086
14378
|
}
|
|
@@ -14099,7 +14391,7 @@ function XViewScene({
|
|
|
14099
14391
|
buildFullAncestryTree,
|
|
14100
14392
|
sceneVersion
|
|
14101
14393
|
]);
|
|
14102
|
-
const handleStartReadingAncestry = (0,
|
|
14394
|
+
const handleStartReadingAncestry = (0, import_react27.useCallback)(
|
|
14103
14395
|
async (ancestryObject, renderMode = "full") => {
|
|
14104
14396
|
setContextMenu(
|
|
14105
14397
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14142,7 +14434,7 @@ function XViewScene({
|
|
|
14142
14434
|
},
|
|
14143
14435
|
[handleRenderAncestry, handleRenderAbstractionTree]
|
|
14144
14436
|
);
|
|
14145
|
-
const handleReadModeSectionChange = (0,
|
|
14437
|
+
const handleReadModeSectionChange = (0, import_react27.useCallback)(
|
|
14146
14438
|
(activeSectionId) => {
|
|
14147
14439
|
const { ancestry, branchStack } = readingMode;
|
|
14148
14440
|
if (!ancestry || !readingMode.isActive) return;
|
|
@@ -14227,10 +14519,10 @@ function XViewScene({
|
|
|
14227
14519
|
ancestryDataRef.current
|
|
14228
14520
|
]
|
|
14229
14521
|
);
|
|
14230
|
-
const handleCloseReadMode = (0,
|
|
14522
|
+
const handleCloseReadMode = (0, import_react27.useCallback)(() => {
|
|
14231
14523
|
setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
|
|
14232
14524
|
}, []);
|
|
14233
|
-
const handleAncestrySectionChange = (0,
|
|
14525
|
+
const handleAncestrySectionChange = (0, import_react27.useCallback)(
|
|
14234
14526
|
(activeSectionId, ancestryOverride = null, rotation = 0) => {
|
|
14235
14527
|
var _a2, _b2;
|
|
14236
14528
|
const currentMode = stateRef.current.ancestry;
|
|
@@ -14292,7 +14584,7 @@ function XViewScene({
|
|
|
14292
14584
|
},
|
|
14293
14585
|
[handleRenderAncestry]
|
|
14294
14586
|
);
|
|
14295
|
-
const handleEditAncestry = (0,
|
|
14587
|
+
const handleEditAncestry = (0, import_react27.useCallback)(
|
|
14296
14588
|
async (ancestryObject) => {
|
|
14297
14589
|
setContextMenu(
|
|
14298
14590
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14347,7 +14639,7 @@ function XViewScene({
|
|
|
14347
14639
|
const handleSelectAncestryParent = (nodeId) => {
|
|
14348
14640
|
setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
|
|
14349
14641
|
};
|
|
14350
|
-
const handleRemoveFromAncestry = (0,
|
|
14642
|
+
const handleRemoveFromAncestry = (0, import_react27.useCallback)((pathToRemove) => {
|
|
14351
14643
|
if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
|
|
14352
14644
|
console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
|
|
14353
14645
|
return;
|
|
@@ -14372,7 +14664,7 @@ function XViewScene({
|
|
|
14372
14664
|
return { ...prev, tree: newTree };
|
|
14373
14665
|
});
|
|
14374
14666
|
}, []);
|
|
14375
|
-
const handleSaveAncestry = (0,
|
|
14667
|
+
const handleSaveAncestry = (0, import_react27.useCallback)(
|
|
14376
14668
|
async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
|
|
14377
14669
|
const treeToUse = treeOverride || ancestryMode.tree;
|
|
14378
14670
|
const { isEditMode, currentAncestryId } = ancestryMode;
|
|
@@ -14608,7 +14900,7 @@ function XViewScene({
|
|
|
14608
14900
|
});
|
|
14609
14901
|
setEditingAncestryRel({ visible: false, data: null, path: null });
|
|
14610
14902
|
};
|
|
14611
|
-
const handleDeleteAncestry = (0,
|
|
14903
|
+
const handleDeleteAncestry = (0, import_react27.useCallback)(
|
|
14612
14904
|
async (ancestryIdToDelete) => {
|
|
14613
14905
|
if (!ancestryIdToDelete) {
|
|
14614
14906
|
alert("ID da ancestralidade n\xE3o encontrado.");
|
|
@@ -14690,10 +14982,10 @@ function XViewScene({
|
|
|
14690
14982
|
},
|
|
14691
14983
|
[save_view_data, delete_file_action]
|
|
14692
14984
|
);
|
|
14693
|
-
const handleOpenAncestryBoard = (0,
|
|
14985
|
+
const handleOpenAncestryBoard = (0, import_react27.useCallback)(() => {
|
|
14694
14986
|
setIsAncestryBoardOpen(true);
|
|
14695
14987
|
}, []);
|
|
14696
|
-
const handleSelectAncestryFromBoard = (0,
|
|
14988
|
+
const handleSelectAncestryFromBoard = (0, import_react27.useCallback)(
|
|
14697
14989
|
(ancestry) => {
|
|
14698
14990
|
setIsAncestryBoardOpen(false);
|
|
14699
14991
|
setIsSidebarOpen(false);
|
|
@@ -14701,7 +14993,7 @@ function XViewScene({
|
|
|
14701
14993
|
},
|
|
14702
14994
|
[handleStartReadingAncestry]
|
|
14703
14995
|
);
|
|
14704
|
-
const handleSaveAncestryBoard = (0,
|
|
14996
|
+
const handleSaveAncestryBoard = (0, import_react27.useCallback)(
|
|
14705
14997
|
async (groups) => {
|
|
14706
14998
|
if (!sceneConfigId || !viewParams || !session) return;
|
|
14707
14999
|
const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
|
|
@@ -14715,7 +15007,7 @@ function XViewScene({
|
|
|
14715
15007
|
},
|
|
14716
15008
|
[sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
|
|
14717
15009
|
);
|
|
14718
|
-
const existingNodeTypes = (0,
|
|
15010
|
+
const existingNodeTypes = (0, import_react27.useMemo)(() => {
|
|
14719
15011
|
if (!parentDataRef.current) {
|
|
14720
15012
|
return [];
|
|
14721
15013
|
}
|
|
@@ -14727,7 +15019,7 @@ function XViewScene({
|
|
|
14727
15019
|
).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
|
|
14728
15020
|
return [...new Set(allTypes)];
|
|
14729
15021
|
}, [parentDataRef.current, sceneVersion]);
|
|
14730
|
-
const searchableDbNodes = (0,
|
|
15022
|
+
const searchableDbNodes = (0, import_react27.useMemo)(() => {
|
|
14731
15023
|
if (!parentDataRef.current) {
|
|
14732
15024
|
return [];
|
|
14733
15025
|
}
|
|
@@ -14742,7 +15034,7 @@ function XViewScene({
|
|
|
14742
15034
|
return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
|
|
14743
15035
|
});
|
|
14744
15036
|
}, [parentDataRef.current, sceneVersion]);
|
|
14745
|
-
const handleAddExistingNode = (0,
|
|
15037
|
+
const handleAddExistingNode = (0, import_react27.useCallback)(
|
|
14746
15038
|
(nodeId) => {
|
|
14747
15039
|
return userActionHandlers.handleAddExistingNodeById(
|
|
14748
15040
|
actionHandlerContext,
|
|
@@ -14751,7 +15043,7 @@ function XViewScene({
|
|
|
14751
15043
|
},
|
|
14752
15044
|
[actionHandlerContext]
|
|
14753
15045
|
);
|
|
14754
|
-
const handleSaveCurrentView = (0,
|
|
15046
|
+
const handleSaveCurrentView = (0, import_react27.useCallback)(async () => {
|
|
14755
15047
|
var _a2, _b2, _c2;
|
|
14756
15048
|
const { nodeObjects, allLinks } = stateRef.current;
|
|
14757
15049
|
if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
|
|
@@ -14792,16 +15084,16 @@ function XViewScene({
|
|
|
14792
15084
|
console.error("Erro na chamada de save_view_data:", error);
|
|
14793
15085
|
}
|
|
14794
15086
|
}, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
|
|
14795
|
-
const allAvailableNodes = (0,
|
|
15087
|
+
const allAvailableNodes = (0, import_react27.useMemo)(() => {
|
|
14796
15088
|
if (!parentDataRef.current) return [];
|
|
14797
15089
|
return Object.values(parentDataRef.current).flatMap(
|
|
14798
15090
|
(fileData) => fileData.nodes || []
|
|
14799
15091
|
);
|
|
14800
15092
|
}, [sceneVersion, isInitialized]);
|
|
14801
|
-
const allAvailableAncestries = (0,
|
|
15093
|
+
const allAvailableAncestries = (0, import_react27.useMemo)(() => {
|
|
14802
15094
|
return ancestryDataRef.current || [];
|
|
14803
15095
|
}, [sceneVersion, isInitialized]);
|
|
14804
|
-
const handleOpenReference = (0,
|
|
15096
|
+
const handleOpenReference = (0, import_react27.useCallback)(
|
|
14805
15097
|
(referenceData) => {
|
|
14806
15098
|
const { type, id } = referenceData;
|
|
14807
15099
|
if (type === "node") {
|
|
@@ -14840,13 +15132,13 @@ function XViewScene({
|
|
|
14840
15132
|
tweenToTarget
|
|
14841
15133
|
]
|
|
14842
15134
|
);
|
|
14843
|
-
const handleToggleAncestryAddMode = (0,
|
|
15135
|
+
const handleToggleAncestryAddMode = (0, import_react27.useCallback)(() => {
|
|
14844
15136
|
setAncestryMode((prev) => ({
|
|
14845
15137
|
...prev,
|
|
14846
15138
|
isAddingNodes: !prev.isAddingNodes
|
|
14847
15139
|
}));
|
|
14848
15140
|
}, []);
|
|
14849
|
-
const handleFocusNode = (0,
|
|
15141
|
+
const handleFocusNode = (0, import_react27.useCallback)(
|
|
14850
15142
|
(nodeData) => {
|
|
14851
15143
|
if (!nodeData) return;
|
|
14852
15144
|
const nodeMesh = stateRef.current.nodeObjects[String(nodeData.id)];
|
|
@@ -14856,7 +15148,7 @@ function XViewScene({
|
|
|
14856
15148
|
},
|
|
14857
15149
|
[tweenToTarget]
|
|
14858
15150
|
);
|
|
14859
|
-
const availableDatasets = (0,
|
|
15151
|
+
const availableDatasets = (0, import_react27.useMemo)(() => {
|
|
14860
15152
|
if (!sceneDataRef.current || !parentDataRef.current) return [];
|
|
14861
15153
|
return sceneDataRef.current.parent_dbs.map((db) => {
|
|
14862
15154
|
var _a2;
|
|
@@ -14870,7 +15162,7 @@ function XViewScene({
|
|
|
14870
15162
|
String(creationMode.sourceNodeData.id)
|
|
14871
15163
|
)) == null ? void 0 : _b.parentFileId : null;
|
|
14872
15164
|
const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
|
|
14873
|
-
(0,
|
|
15165
|
+
(0, import_react27.useEffect)(() => {
|
|
14874
15166
|
if (isInitialized && focusNodeId && !hasFocusedInitial) {
|
|
14875
15167
|
const nodeObjects = stateRef.current.nodeObjects || {};
|
|
14876
15168
|
const targetMesh = nodeObjects[String(focusNodeId)];
|
|
@@ -14893,7 +15185,7 @@ function XViewScene({
|
|
|
14893
15185
|
hasFocusedInitial,
|
|
14894
15186
|
tweenToTarget
|
|
14895
15187
|
]);
|
|
14896
|
-
(0,
|
|
15188
|
+
(0, import_react27.useEffect)(() => {
|
|
14897
15189
|
if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
|
|
14898
15190
|
const ancestries = ancestryDataRef.current || [];
|
|
14899
15191
|
const targetAncestry = ancestries.find(
|
|
@@ -14918,7 +15210,7 @@ function XViewScene({
|
|
|
14918
15210
|
hasOpenedInitialAncestry,
|
|
14919
15211
|
handleStartReadingAncestry
|
|
14920
15212
|
]);
|
|
14921
|
-
(0,
|
|
15213
|
+
(0, import_react27.useEffect)(() => {
|
|
14922
15214
|
function handleKeyDown(event) {
|
|
14923
15215
|
var _a2, _b2, _c2;
|
|
14924
15216
|
const context = actionHandlerContext;
|
|
@@ -15041,10 +15333,10 @@ function XViewScene({
|
|
|
15041
15333
|
// <-- handleCancelQuest adicionado aqui
|
|
15042
15334
|
]);
|
|
15043
15335
|
if (isLoading || status === "loading" || permissionStatus === "loading") {
|
|
15044
|
-
return /* @__PURE__ */
|
|
15336
|
+
return /* @__PURE__ */ import_react27.default.createElement(LoadingScreen, null);
|
|
15045
15337
|
}
|
|
15046
15338
|
if (permissionStatus === "denied") {
|
|
15047
|
-
return /* @__PURE__ */
|
|
15339
|
+
return /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react27.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_react27.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
15048
15340
|
"svg",
|
|
15049
15341
|
{
|
|
15050
15342
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -15054,7 +15346,7 @@ function XViewScene({
|
|
|
15054
15346
|
stroke: "currentColor",
|
|
15055
15347
|
className: "w-16 h-16 mx-auto"
|
|
15056
15348
|
},
|
|
15057
|
-
/* @__PURE__ */
|
|
15349
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15058
15350
|
"path",
|
|
15059
15351
|
{
|
|
15060
15352
|
strokeLinecap: "round",
|
|
@@ -15062,13 +15354,13 @@ function XViewScene({
|
|
|
15062
15354
|
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"
|
|
15063
15355
|
}
|
|
15064
15356
|
)
|
|
15065
|
-
)), /* @__PURE__ */
|
|
15357
|
+
)), /* @__PURE__ */ import_react27.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react27.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_react27.default.createElement(
|
|
15066
15358
|
"button",
|
|
15067
15359
|
{
|
|
15068
15360
|
onClick: () => router.push("/dashboard/scenes"),
|
|
15069
15361
|
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"
|
|
15070
15362
|
},
|
|
15071
|
-
/* @__PURE__ */
|
|
15363
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15072
15364
|
"svg",
|
|
15073
15365
|
{
|
|
15074
15366
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -15078,7 +15370,7 @@ function XViewScene({
|
|
|
15078
15370
|
stroke: "currentColor",
|
|
15079
15371
|
className: "w-5 h-5"
|
|
15080
15372
|
},
|
|
15081
|
-
/* @__PURE__ */
|
|
15373
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15082
15374
|
"path",
|
|
15083
15375
|
{
|
|
15084
15376
|
strokeLinecap: "round",
|
|
@@ -15090,7 +15382,7 @@ function XViewScene({
|
|
|
15090
15382
|
"Voltar para Scenes"
|
|
15091
15383
|
)));
|
|
15092
15384
|
}
|
|
15093
|
-
return /* @__PURE__ */
|
|
15385
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
15094
15386
|
"div",
|
|
15095
15387
|
{
|
|
15096
15388
|
ref: mountRef,
|
|
@@ -15102,7 +15394,7 @@ function XViewScene({
|
|
|
15102
15394
|
cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
|
|
15103
15395
|
}
|
|
15104
15396
|
},
|
|
15105
|
-
userPermissionRole !== "link_viewer" && /* @__PURE__ */
|
|
15397
|
+
userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react27.default.createElement(
|
|
15106
15398
|
XViewSidebar,
|
|
15107
15399
|
{
|
|
15108
15400
|
dbNodes: searchableDbNodes,
|
|
@@ -15122,7 +15414,7 @@ function XViewScene({
|
|
|
15122
15414
|
userRole: userPermissionRole
|
|
15123
15415
|
}
|
|
15124
15416
|
),
|
|
15125
|
-
creationMode.isActive && /* @__PURE__ */
|
|
15417
|
+
creationMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
|
|
15126
15418
|
InSceneCreationForm,
|
|
15127
15419
|
{
|
|
15128
15420
|
onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
|
|
@@ -15154,7 +15446,7 @@ function XViewScene({
|
|
|
15154
15446
|
availableAncestries: allAvailableAncestries
|
|
15155
15447
|
}
|
|
15156
15448
|
),
|
|
15157
|
-
versionMode.isActive && /* @__PURE__ */
|
|
15449
|
+
versionMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
|
|
15158
15450
|
InSceneVersionForm,
|
|
15159
15451
|
{
|
|
15160
15452
|
onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
|
|
@@ -15180,7 +15472,7 @@ function XViewScene({
|
|
|
15180
15472
|
availableAncestries: allAvailableAncestries
|
|
15181
15473
|
}
|
|
15182
15474
|
),
|
|
15183
|
-
questMode.isActive && /* @__PURE__ */
|
|
15475
|
+
questMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
|
|
15184
15476
|
InSceneQuestForm,
|
|
15185
15477
|
{
|
|
15186
15478
|
onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
|
|
@@ -15206,7 +15498,7 @@ function XViewScene({
|
|
|
15206
15498
|
viewMembers
|
|
15207
15499
|
}
|
|
15208
15500
|
),
|
|
15209
|
-
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */
|
|
15501
|
+
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react27.default.createElement(
|
|
15210
15502
|
"div",
|
|
15211
15503
|
{
|
|
15212
15504
|
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"}`,
|
|
@@ -15219,7 +15511,7 @@ function XViewScene({
|
|
|
15219
15511
|
maxWidth: "92vw"
|
|
15220
15512
|
}
|
|
15221
15513
|
},
|
|
15222
|
-
/* @__PURE__ */
|
|
15514
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15223
15515
|
"div",
|
|
15224
15516
|
{
|
|
15225
15517
|
onPointerDown: (e) => {
|
|
@@ -15230,7 +15522,7 @@ function XViewScene({
|
|
|
15230
15522
|
title: "Arraste para redimensionar"
|
|
15231
15523
|
}
|
|
15232
15524
|
),
|
|
15233
|
-
/* @__PURE__ */
|
|
15525
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15234
15526
|
DescriptionReadModePanel,
|
|
15235
15527
|
{
|
|
15236
15528
|
key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
|
|
@@ -15265,7 +15557,7 @@ function XViewScene({
|
|
|
15265
15557
|
}
|
|
15266
15558
|
)
|
|
15267
15559
|
),
|
|
15268
|
-
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */
|
|
15560
|
+
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react27.default.createElement(
|
|
15269
15561
|
CreateAncestryPanel,
|
|
15270
15562
|
{
|
|
15271
15563
|
ancestryMode,
|
|
@@ -15301,7 +15593,7 @@ function XViewScene({
|
|
|
15301
15593
|
onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
|
|
15302
15594
|
}
|
|
15303
15595
|
),
|
|
15304
|
-
editingAncestryRel.visible && /* @__PURE__ */
|
|
15596
|
+
editingAncestryRel.visible && /* @__PURE__ */ import_react27.default.createElement(
|
|
15305
15597
|
AncestryRelationshipPanel,
|
|
15306
15598
|
{
|
|
15307
15599
|
data: editingAncestryRel.data,
|
|
@@ -15315,7 +15607,7 @@ function XViewScene({
|
|
|
15315
15607
|
onUploadFile: upload_file_action
|
|
15316
15608
|
}
|
|
15317
15609
|
),
|
|
15318
|
-
detailsNode && detailsNode.is_quest && /* @__PURE__ */
|
|
15610
|
+
detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
|
|
15319
15611
|
QuestDetailsPanel,
|
|
15320
15612
|
{
|
|
15321
15613
|
node: detailsNode,
|
|
@@ -15337,7 +15629,7 @@ function XViewScene({
|
|
|
15337
15629
|
viewMembers
|
|
15338
15630
|
}
|
|
15339
15631
|
),
|
|
15340
|
-
detailsNode && !detailsNode.is_quest && /* @__PURE__ */
|
|
15632
|
+
detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
|
|
15341
15633
|
NodeDetailsPanel,
|
|
15342
15634
|
{
|
|
15343
15635
|
node: detailsNode,
|
|
@@ -15369,7 +15661,7 @@ function XViewScene({
|
|
|
15369
15661
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
|
|
15370
15662
|
}
|
|
15371
15663
|
),
|
|
15372
|
-
detailsLink && /* @__PURE__ */
|
|
15664
|
+
detailsLink && /* @__PURE__ */ import_react27.default.createElement(
|
|
15373
15665
|
RelationshipDetailsPanel,
|
|
15374
15666
|
{
|
|
15375
15667
|
link: detailsLink,
|
|
@@ -15383,7 +15675,7 @@ function XViewScene({
|
|
|
15383
15675
|
userRole: userPermissionRole
|
|
15384
15676
|
}
|
|
15385
15677
|
),
|
|
15386
|
-
ancestryLinkDetails && /* @__PURE__ */
|
|
15678
|
+
ancestryLinkDetails && /* @__PURE__ */ import_react27.default.createElement(
|
|
15387
15679
|
AncestryLinkDetailsPanel,
|
|
15388
15680
|
{
|
|
15389
15681
|
data: ancestryLinkDetails,
|
|
@@ -15394,7 +15686,7 @@ function XViewScene({
|
|
|
15394
15686
|
onUploadFile: upload_file_action
|
|
15395
15687
|
}
|
|
15396
15688
|
),
|
|
15397
|
-
/* @__PURE__ */
|
|
15689
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15398
15690
|
"div",
|
|
15399
15691
|
{
|
|
15400
15692
|
ref: tooltipRef,
|
|
@@ -15421,7 +15713,7 @@ function XViewScene({
|
|
|
15421
15713
|
}
|
|
15422
15714
|
}
|
|
15423
15715
|
),
|
|
15424
|
-
/* @__PURE__ */
|
|
15716
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15425
15717
|
ContextMenu,
|
|
15426
15718
|
{
|
|
15427
15719
|
data: contextMenu,
|
|
@@ -15450,10 +15742,11 @@ function XViewScene({
|
|
|
15450
15742
|
onFocusNode: handleFocusNode,
|
|
15451
15743
|
viewMembers,
|
|
15452
15744
|
currentUser: session == null ? void 0 : session.user,
|
|
15453
|
-
onStartQuest: handleStartQuestQuick
|
|
15745
|
+
onStartQuest: handleStartQuestQuick,
|
|
15746
|
+
onFinishQuest: handleFinishQuestQuick
|
|
15454
15747
|
}
|
|
15455
15748
|
),
|
|
15456
|
-
/* @__PURE__ */
|
|
15749
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15457
15750
|
MultiNodeContextMenu,
|
|
15458
15751
|
{
|
|
15459
15752
|
data: multiContextMenu,
|
|
@@ -15473,7 +15766,7 @@ function XViewScene({
|
|
|
15473
15766
|
)
|
|
15474
15767
|
}
|
|
15475
15768
|
),
|
|
15476
|
-
/* @__PURE__ */
|
|
15769
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15477
15770
|
RelationshipContextMenu,
|
|
15478
15771
|
{
|
|
15479
15772
|
data: relationshipMenu,
|
|
@@ -15491,14 +15784,14 @@ function XViewScene({
|
|
|
15491
15784
|
onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
|
|
15492
15785
|
}
|
|
15493
15786
|
),
|
|
15494
|
-
/* @__PURE__ */
|
|
15787
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15495
15788
|
ImageViewer,
|
|
15496
15789
|
{
|
|
15497
15790
|
data: imageViewer,
|
|
15498
15791
|
onClose: () => setImageViewer({ ...imageViewer, visible: false })
|
|
15499
15792
|
}
|
|
15500
15793
|
),
|
|
15501
|
-
/* @__PURE__ */
|
|
15794
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15502
15795
|
AncestryBoard,
|
|
15503
15796
|
{
|
|
15504
15797
|
isOpen: isAncestryBoardOpen,
|
|
@@ -15511,7 +15804,7 @@ function XViewScene({
|
|
|
15511
15804
|
userRole: userPermissionRole
|
|
15512
15805
|
}
|
|
15513
15806
|
),
|
|
15514
|
-
/* @__PURE__ */
|
|
15807
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15515
15808
|
ImportParentFileModal,
|
|
15516
15809
|
{
|
|
15517
15810
|
isOpen: isImportModalOpen,
|
|
@@ -15524,7 +15817,7 @@ function XViewScene({
|
|
|
15524
15817
|
currentAncestries: ancestryDataRef.current || []
|
|
15525
15818
|
}
|
|
15526
15819
|
),
|
|
15527
|
-
invalidTargetError && /* @__PURE__ */
|
|
15820
|
+
invalidTargetError && /* @__PURE__ */ import_react27.default.createElement(
|
|
15528
15821
|
"div",
|
|
15529
15822
|
{
|
|
15530
15823
|
className: "ui-overlay",
|
|
@@ -15549,13 +15842,13 @@ function XViewScene({
|
|
|
15549
15842
|
animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
|
|
15550
15843
|
}
|
|
15551
15844
|
},
|
|
15552
|
-
/* @__PURE__ */
|
|
15845
|
+
/* @__PURE__ */ import_react27.default.createElement("style", null, `
|
|
15553
15846
|
@keyframes fadeInDown {
|
|
15554
15847
|
from { opacity: 0; transform: translate(-50%, -20px); }
|
|
15555
15848
|
to { opacity: 1; transform: translate(-50%, 0); }
|
|
15556
15849
|
}
|
|
15557
15850
|
`),
|
|
15558
|
-
/* @__PURE__ */
|
|
15851
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15559
15852
|
"svg",
|
|
15560
15853
|
{
|
|
15561
15854
|
width: "20",
|
|
@@ -15567,12 +15860,12 @@ function XViewScene({
|
|
|
15567
15860
|
strokeLinecap: "round",
|
|
15568
15861
|
strokeLinejoin: "round"
|
|
15569
15862
|
},
|
|
15570
|
-
/* @__PURE__ */
|
|
15571
|
-
/* @__PURE__ */
|
|
15572
|
-
/* @__PURE__ */
|
|
15863
|
+
/* @__PURE__ */ import_react27.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
|
|
15864
|
+
/* @__PURE__ */ import_react27.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
|
|
15865
|
+
/* @__PURE__ */ import_react27.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
|
|
15573
15866
|
),
|
|
15574
|
-
/* @__PURE__ */
|
|
15575
|
-
/* @__PURE__ */
|
|
15867
|
+
/* @__PURE__ */ import_react27.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
|
|
15868
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15576
15869
|
"button",
|
|
15577
15870
|
{
|
|
15578
15871
|
onClick: () => setInvalidTargetError(null),
|