@lv-x-software-house/x_view 1.2.5-dev.21 → 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 +730 -454
- package/dist/index.mjs +630 -354
- 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"))));
|
|
@@ -8374,8 +8388,116 @@ function InSceneVersionForm({
|
|
|
8374
8388
|
}
|
|
8375
8389
|
|
|
8376
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
|
|
8377
8395
|
var import_react16 = __toESM(require("react"));
|
|
8378
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
|
|
8379
8501
|
var QUEST_STATUS_COLORS2 = {
|
|
8380
8502
|
"Backlog": "#64748b",
|
|
8381
8503
|
"In Progress": "#eab308",
|
|
@@ -8399,23 +8521,25 @@ function InSceneQuestForm({
|
|
|
8399
8521
|
// NOVA PROP
|
|
8400
8522
|
questCounter = 1,
|
|
8401
8523
|
// NOVA PROP
|
|
8402
|
-
viewMembers = []
|
|
8524
|
+
viewMembers = [],
|
|
8525
|
+
session = null
|
|
8403
8526
|
}) {
|
|
8404
8527
|
var _a, _b;
|
|
8405
|
-
const [name, setName] = (0,
|
|
8406
|
-
const [assigneeId, setAssigneeId] = (0,
|
|
8407
|
-
const [types, setTypes] = (0,
|
|
8408
|
-
const [typeInput, setTypeInput] = (0,
|
|
8409
|
-
const [status, setStatus] = (0,
|
|
8410
|
-
const [size, setSize] = (0,
|
|
8411
|
-
const [intensity, setIntensity] = (0,
|
|
8412
|
-
const [description, setDescription] = (0,
|
|
8413
|
-
const [
|
|
8414
|
-
const [
|
|
8415
|
-
const [
|
|
8416
|
-
const [
|
|
8417
|
-
const [
|
|
8418
|
-
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);
|
|
8419
8543
|
const standardizedName = `${viewName} - ${questCounter} - \xBB ${name || "Nova Quest"}`;
|
|
8420
8544
|
const handleAddProp = () => {
|
|
8421
8545
|
const newProp = createNewCustomProperty(customProps);
|
|
@@ -8451,6 +8575,7 @@ function InSceneQuestForm({
|
|
|
8451
8575
|
}
|
|
8452
8576
|
};
|
|
8453
8577
|
const handleSubmit = (e) => {
|
|
8578
|
+
var _a2, _b2, _c, _d;
|
|
8454
8579
|
e.preventDefault();
|
|
8455
8580
|
if (!name.trim()) {
|
|
8456
8581
|
alert("O campo 'T\xEDtulo' \xE9 obrigat\xF3rio.");
|
|
@@ -8460,6 +8585,22 @@ function InSceneQuestForm({
|
|
|
8460
8585
|
customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
|
|
8461
8586
|
);
|
|
8462
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
|
+
}
|
|
8463
8604
|
onSave({
|
|
8464
8605
|
name: standardizedName,
|
|
8465
8606
|
// SALVA O NOME FORMATADO
|
|
@@ -8475,13 +8616,15 @@ function InSceneQuestForm({
|
|
|
8475
8616
|
description_sections: processedSections,
|
|
8476
8617
|
useImageAsTexture: false,
|
|
8477
8618
|
textureImageUrl: null,
|
|
8619
|
+
reviewStack,
|
|
8620
|
+
timeline: initialTimeline,
|
|
8478
8621
|
...additionalData
|
|
8479
8622
|
});
|
|
8480
8623
|
};
|
|
8481
8624
|
const swallow = (e) => e.stopPropagation();
|
|
8482
8625
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
8483
8626
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
8484
|
-
return /* @__PURE__ */
|
|
8627
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
|
|
8485
8628
|
"div",
|
|
8486
8629
|
{
|
|
8487
8630
|
ref: refEl,
|
|
@@ -8493,8 +8636,8 @@ function InSceneQuestForm({
|
|
|
8493
8636
|
onContextMenu: swallow,
|
|
8494
8637
|
onDoubleClick: swallow
|
|
8495
8638
|
},
|
|
8496
|
-
/* @__PURE__ */
|
|
8497
|
-
/* @__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(
|
|
8498
8641
|
"button",
|
|
8499
8642
|
{
|
|
8500
8643
|
type: "button",
|
|
@@ -8504,7 +8647,7 @@ function InSceneQuestForm({
|
|
|
8504
8647
|
},
|
|
8505
8648
|
"\xD7"
|
|
8506
8649
|
)),
|
|
8507
|
-
/* @__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(
|
|
8508
8651
|
"input",
|
|
8509
8652
|
{
|
|
8510
8653
|
required: true,
|
|
@@ -8518,16 +8661,16 @@ function InSceneQuestForm({
|
|
|
8518
8661
|
},
|
|
8519
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"
|
|
8520
8663
|
}
|
|
8521
|
-
), /* @__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(
|
|
8522
8665
|
"button",
|
|
8523
8666
|
{
|
|
8524
8667
|
type: "button",
|
|
8525
8668
|
onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
|
|
8526
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"
|
|
8527
8670
|
},
|
|
8528
|
-
/* @__PURE__ */
|
|
8529
|
-
/* @__PURE__ */
|
|
8530
|
-
), 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(
|
|
8531
8674
|
"li",
|
|
8532
8675
|
{
|
|
8533
8676
|
key: s,
|
|
@@ -8538,21 +8681,21 @@ function InSceneQuestForm({
|
|
|
8538
8681
|
},
|
|
8539
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"}`
|
|
8540
8683
|
},
|
|
8541
|
-
/* @__PURE__ */
|
|
8684
|
+
/* @__PURE__ */ import_react17.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
|
|
8542
8685
|
s
|
|
8543
|
-
)))))), /* @__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(
|
|
8544
8687
|
"button",
|
|
8545
8688
|
{
|
|
8546
8689
|
type: "button",
|
|
8547
8690
|
onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
|
|
8548
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"
|
|
8549
8692
|
},
|
|
8550
|
-
/* @__PURE__ */
|
|
8551
|
-
/* @__PURE__ */
|
|
8552
|
-
), 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: () => {
|
|
8553
8696
|
setIsAssigneeDropdownOpen(false);
|
|
8554
8697
|
setAssigneeSearchQuery("");
|
|
8555
|
-
} }), /* @__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(
|
|
8556
8699
|
"input",
|
|
8557
8700
|
{
|
|
8558
8701
|
type: "text",
|
|
@@ -8563,7 +8706,7 @@ function InSceneQuestForm({
|
|
|
8563
8706
|
className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
|
|
8564
8707
|
onClick: (e) => e.stopPropagation()
|
|
8565
8708
|
}
|
|
8566
|
-
)), /* @__PURE__ */
|
|
8709
|
+
)), /* @__PURE__ */ import_react17.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8567
8710
|
"li",
|
|
8568
8711
|
{
|
|
8569
8712
|
onClick: () => {
|
|
@@ -8577,7 +8720,7 @@ function InSceneQuestForm({
|
|
|
8577
8720
|
), viewMembers.filter((member) => {
|
|
8578
8721
|
const search = assigneeSearchQuery.toLowerCase();
|
|
8579
8722
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
8580
|
-
}).map((member) => /* @__PURE__ */
|
|
8723
|
+
}).map((member) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8581
8724
|
"li",
|
|
8582
8725
|
{
|
|
8583
8726
|
key: member.id,
|
|
@@ -8592,7 +8735,14 @@ function InSceneQuestForm({
|
|
|
8592
8735
|
)), viewMembers.filter((member) => {
|
|
8593
8736
|
const search = assigneeSearchQuery.toLowerCase();
|
|
8594
8737
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
8595
|
-
}).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(
|
|
8596
8746
|
"input",
|
|
8597
8747
|
{
|
|
8598
8748
|
type: "text",
|
|
@@ -8605,7 +8755,7 @@ function InSceneQuestForm({
|
|
|
8605
8755
|
className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
|
|
8606
8756
|
autoComplete: "off"
|
|
8607
8757
|
}
|
|
8608
|
-
))), /* @__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(
|
|
8609
8759
|
DescriptionDisplay,
|
|
8610
8760
|
{
|
|
8611
8761
|
description,
|
|
@@ -8615,7 +8765,7 @@ function InSceneQuestForm({
|
|
|
8615
8765
|
onMentionClick,
|
|
8616
8766
|
onSaveDescription: (newDesc) => setDescription(newDesc)
|
|
8617
8767
|
}
|
|
8618
|
-
), /* @__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(
|
|
8619
8769
|
"button",
|
|
8620
8770
|
{
|
|
8621
8771
|
key: s,
|
|
@@ -8626,9 +8776,9 @@ function InSceneQuestForm({
|
|
|
8626
8776
|
},
|
|
8627
8777
|
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
8628
8778
|
},
|
|
8629
|
-
/* @__PURE__ */
|
|
8630
|
-
/* @__PURE__ */
|
|
8631
|
-
)))), /* @__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(
|
|
8632
8782
|
CustomPropertyDisplay,
|
|
8633
8783
|
{
|
|
8634
8784
|
key: prop.id,
|
|
@@ -8639,8 +8789,8 @@ function InSceneQuestForm({
|
|
|
8639
8789
|
unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type),
|
|
8640
8790
|
onUploadFile
|
|
8641
8791
|
}
|
|
8642
|
-
)), /* @__PURE__ */
|
|
8643
|
-
), 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(
|
|
8644
8794
|
DescriptionEditModal,
|
|
8645
8795
|
{
|
|
8646
8796
|
isOpen: isDescriptionModalOpen,
|
|
@@ -8656,8 +8806,8 @@ function InSceneQuestForm({
|
|
|
8656
8806
|
}
|
|
8657
8807
|
|
|
8658
8808
|
// src/components/NodeDetailsPanel.jsx
|
|
8659
|
-
var
|
|
8660
|
-
var
|
|
8809
|
+
var import_react18 = __toESM(require("react"));
|
|
8810
|
+
var import_fi16 = require("react-icons/fi");
|
|
8661
8811
|
function NodeDetailsPanel({
|
|
8662
8812
|
node,
|
|
8663
8813
|
onClose,
|
|
@@ -8678,39 +8828,39 @@ function NodeDetailsPanel({
|
|
|
8678
8828
|
userRole,
|
|
8679
8829
|
currentDatasetName
|
|
8680
8830
|
}) {
|
|
8681
|
-
const [name, setName] = (0,
|
|
8682
|
-
const [types, setTypes] = (0,
|
|
8683
|
-
const [typeInput, setTypeInput] = (0,
|
|
8684
|
-
const [color, setColor] = (0,
|
|
8685
|
-
const [size, setSize] = (0,
|
|
8686
|
-
const [description, setDescription] = (0,
|
|
8687
|
-
const [intensity, setIntensity] = (0,
|
|
8688
|
-
const [customProps, setCustomProps] = (0,
|
|
8689
|
-
const [showTypeSuggestions, setShowTypeSuggestions] = (0,
|
|
8690
|
-
const [filteredTypes, setFilteredTypes] = (0,
|
|
8691
|
-
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0,
|
|
8692
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
8693
|
-
const [existingSections, setExistingSections] = (0,
|
|
8694
|
-
const [isSaving, setIsSaving] = (0,
|
|
8695
|
-
const [isLinkCopied, setIsLinkCopied] = (0,
|
|
8696
|
-
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)(() => {
|
|
8697
8847
|
if ((node == null ? void 0 : node.useImageAsTexture) === "true") return true;
|
|
8698
8848
|
if ((node == null ? void 0 : node.useImageAsTexture) === "false") return false;
|
|
8699
8849
|
return !!(node == null ? void 0 : node.useImageAsTexture);
|
|
8700
8850
|
});
|
|
8701
|
-
const [selectedImageUrl, setSelectedImageUrl] = (0,
|
|
8702
|
-
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);
|
|
8703
8853
|
const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
|
|
8704
8854
|
const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
|
|
8705
8855
|
initialWidth: isReadMode ? 700 : 440,
|
|
8706
8856
|
minWidth: 320,
|
|
8707
8857
|
maxWidth: maxPanelW
|
|
8708
8858
|
});
|
|
8709
|
-
(0,
|
|
8859
|
+
(0, import_react18.useEffect)(() => {
|
|
8710
8860
|
setWidth(isReadMode ? 700 : 440);
|
|
8711
8861
|
}, [isReadMode, setWidth]);
|
|
8712
|
-
const prevNodeIdRef = (0,
|
|
8713
|
-
const propsEndRef = (0,
|
|
8862
|
+
const prevNodeIdRef = (0, import_react18.useRef)(null);
|
|
8863
|
+
const propsEndRef = (0, import_react18.useRef)(null);
|
|
8714
8864
|
const canEdit = userRole !== "viewer";
|
|
8715
8865
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
8716
8866
|
const handleImageClickFromText = (url, name2) => {
|
|
@@ -8718,7 +8868,7 @@ function NodeDetailsPanel({
|
|
|
8718
8868
|
onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
|
|
8719
8869
|
}
|
|
8720
8870
|
};
|
|
8721
|
-
(0,
|
|
8871
|
+
(0, import_react18.useEffect)(() => {
|
|
8722
8872
|
if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
|
|
8723
8873
|
prevNodeIdRef.current = node == null ? void 0 : node.id;
|
|
8724
8874
|
setName((node == null ? void 0 : node.name) ?? "");
|
|
@@ -8741,13 +8891,13 @@ function NodeDetailsPanel({
|
|
|
8741
8891
|
}
|
|
8742
8892
|
}, [node]);
|
|
8743
8893
|
const hasImages = customProps.some((p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value));
|
|
8744
|
-
(0,
|
|
8894
|
+
(0, import_react18.useEffect)(() => {
|
|
8745
8895
|
if (!hasImages && useImageAsTexture) {
|
|
8746
8896
|
setUseImageAsTexture(false);
|
|
8747
8897
|
setSelectedImageUrl(null);
|
|
8748
8898
|
}
|
|
8749
8899
|
}, [hasImages, useImageAsTexture]);
|
|
8750
|
-
(0,
|
|
8900
|
+
(0, import_react18.useEffect)(() => {
|
|
8751
8901
|
const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
|
|
8752
8902
|
if (typeInput.trim() === "") {
|
|
8753
8903
|
setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
|
|
@@ -8942,7 +9092,7 @@ function NodeDetailsPanel({
|
|
|
8942
9092
|
onClose();
|
|
8943
9093
|
};
|
|
8944
9094
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
8945
|
-
return /* @__PURE__ */
|
|
9095
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
|
|
8946
9096
|
"div",
|
|
8947
9097
|
{
|
|
8948
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"}`,
|
|
@@ -8955,7 +9105,7 @@ function NodeDetailsPanel({
|
|
|
8955
9105
|
onContextMenu: swallow,
|
|
8956
9106
|
onDoubleClick: swallow
|
|
8957
9107
|
},
|
|
8958
|
-
/* @__PURE__ */
|
|
9108
|
+
/* @__PURE__ */ import_react18.default.createElement(
|
|
8959
9109
|
"div",
|
|
8960
9110
|
{
|
|
8961
9111
|
onPointerDown: (e) => {
|
|
@@ -8966,7 +9116,7 @@ function NodeDetailsPanel({
|
|
|
8966
9116
|
title: "Arraste para redimensionar"
|
|
8967
9117
|
}
|
|
8968
9118
|
),
|
|
8969
|
-
isReadMode ? /* @__PURE__ */
|
|
9119
|
+
isReadMode ? /* @__PURE__ */ import_react18.default.createElement(
|
|
8970
9120
|
DescriptionReadModePanel,
|
|
8971
9121
|
{
|
|
8972
9122
|
title: name || (node == null ? void 0 : node.name),
|
|
@@ -8987,23 +9137,23 @@ function NodeDetailsPanel({
|
|
|
8987
9137
|
onImageClick: handleImageClickFromText,
|
|
8988
9138
|
onSaveDescription: handleSaveDescriptionInline
|
|
8989
9139
|
}
|
|
8990
|
-
) : /* @__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(
|
|
8991
9141
|
"button",
|
|
8992
9142
|
{
|
|
8993
9143
|
onClick: handleCopyLink,
|
|
8994
9144
|
className: `ml-1 p-1 transition-colors ${isLinkCopied ? "text-green-400" : "text-slate-400 hover:text-indigo-400"}`,
|
|
8995
9145
|
title: isLinkCopied ? "Link Copiado!" : "Copiar link para este Node"
|
|
8996
9146
|
},
|
|
8997
|
-
isLinkCopied ? /* @__PURE__ */
|
|
8998
|
-
)), /* @__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(
|
|
8999
9149
|
"button",
|
|
9000
9150
|
{
|
|
9001
9151
|
type: "button",
|
|
9002
9152
|
onClick: () => handleRemoveType(index),
|
|
9003
9153
|
className: "hover:text-white transition-colors"
|
|
9004
9154
|
},
|
|
9005
|
-
/* @__PURE__ */
|
|
9006
|
-
))), canEdit && /* @__PURE__ */
|
|
9155
|
+
/* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })
|
|
9156
|
+
))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9007
9157
|
"input",
|
|
9008
9158
|
{
|
|
9009
9159
|
type: "text",
|
|
@@ -9024,7 +9174,7 @@ function NodeDetailsPanel({
|
|
|
9024
9174
|
placeholder: types.length === 0 ? "Ex.: Cliente" : "",
|
|
9025
9175
|
autoComplete: "off"
|
|
9026
9176
|
}
|
|
9027
|
-
), 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(
|
|
9028
9178
|
"li",
|
|
9029
9179
|
{
|
|
9030
9180
|
key: index,
|
|
@@ -9035,7 +9185,7 @@ function NodeDetailsPanel({
|
|
|
9035
9185
|
}
|
|
9036
9186
|
},
|
|
9037
9187
|
suggestedType
|
|
9038
|
-
))))), /* @__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(
|
|
9039
9189
|
"input",
|
|
9040
9190
|
{
|
|
9041
9191
|
type: "text",
|
|
@@ -9044,7 +9194,7 @@ function NodeDetailsPanel({
|
|
|
9044
9194
|
readOnly: !canEdit,
|
|
9045
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"}`
|
|
9046
9196
|
}
|
|
9047
|
-
)), /* @__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(
|
|
9048
9198
|
DescriptionDisplay,
|
|
9049
9199
|
{
|
|
9050
9200
|
description,
|
|
@@ -9056,7 +9206,7 @@ function NodeDetailsPanel({
|
|
|
9056
9206
|
onImageClick: handleImageClickFromText,
|
|
9057
9207
|
onSaveDescription: handleSaveDescriptionInline
|
|
9058
9208
|
}
|
|
9059
|
-
), /* @__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(
|
|
9060
9210
|
"button",
|
|
9061
9211
|
{
|
|
9062
9212
|
type: "button",
|
|
@@ -9064,8 +9214,8 @@ function NodeDetailsPanel({
|
|
|
9064
9214
|
className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`,
|
|
9065
9215
|
title: "Modo de Leitura"
|
|
9066
9216
|
},
|
|
9067
|
-
/* @__PURE__ */
|
|
9068
|
-
), canEdit && /* @__PURE__ */
|
|
9217
|
+
/* @__PURE__ */ import_react18.default.createElement(import_fi16.FiBookOpen, { size: 14 })
|
|
9218
|
+
), canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9069
9219
|
"button",
|
|
9070
9220
|
{
|
|
9071
9221
|
type: "button",
|
|
@@ -9073,17 +9223,17 @@ function NodeDetailsPanel({
|
|
|
9073
9223
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
9074
9224
|
title: "Editar descri\xE7\xE3o (Modo de Escrita)"
|
|
9075
9225
|
},
|
|
9076
|
-
/* @__PURE__ */
|
|
9077
|
-
)), canEdit && !description && /* @__PURE__ */
|
|
9226
|
+
/* @__PURE__ */ import_react18.default.createElement(import_fi16.FiEdit2, { size: 14 })
|
|
9227
|
+
)), canEdit && !description && /* @__PURE__ */ import_react18.default.createElement(
|
|
9078
9228
|
"div",
|
|
9079
9229
|
{
|
|
9080
9230
|
onClick: () => setIsDescriptionModalOpen(true),
|
|
9081
9231
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
9082
9232
|
},
|
|
9083
9233
|
"Adicionar descri\xE7\xE3o..."
|
|
9084
|
-
))), /* @__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) => {
|
|
9085
9235
|
const isSelected = size === s;
|
|
9086
|
-
return /* @__PURE__ */
|
|
9236
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
9087
9237
|
"button",
|
|
9088
9238
|
{
|
|
9089
9239
|
key: s,
|
|
@@ -9091,10 +9241,10 @@ function NodeDetailsPanel({
|
|
|
9091
9241
|
onClick: () => canEdit && handleSizeChange(s),
|
|
9092
9242
|
className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}`
|
|
9093
9243
|
},
|
|
9094
|
-
/* @__PURE__ */
|
|
9095
|
-
/* @__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)
|
|
9096
9246
|
);
|
|
9097
|
-
}))), /* @__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(
|
|
9098
9248
|
"input",
|
|
9099
9249
|
{
|
|
9100
9250
|
type: "checkbox",
|
|
@@ -9102,14 +9252,14 @@ function NodeDetailsPanel({
|
|
|
9102
9252
|
onChange: handleToggleImageMode,
|
|
9103
9253
|
className: "hidden"
|
|
9104
9254
|
}
|
|
9105
|
-
), /* @__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(
|
|
9106
9256
|
ColorPicker,
|
|
9107
9257
|
{
|
|
9108
9258
|
color,
|
|
9109
9259
|
onChange: handleColorChange,
|
|
9110
9260
|
disabled: !canEdit || useImageAsTexture
|
|
9111
9261
|
}
|
|
9112
|
-
), /* @__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(
|
|
9113
9263
|
"input",
|
|
9114
9264
|
{
|
|
9115
9265
|
type: "range",
|
|
@@ -9122,7 +9272,7 @@ function NodeDetailsPanel({
|
|
|
9122
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"}`,
|
|
9123
9273
|
title: `Intensidade do brilho: ${intensity}`
|
|
9124
9274
|
}
|
|
9125
|
-
), /* @__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(
|
|
9126
9276
|
CustomPropertyDisplay,
|
|
9127
9277
|
{
|
|
9128
9278
|
key: prop.id,
|
|
@@ -9137,7 +9287,7 @@ function NodeDetailsPanel({
|
|
|
9137
9287
|
onUploadFile: canEdit ? onUploadFile : void 0,
|
|
9138
9288
|
readOnly: !canEdit
|
|
9139
9289
|
}
|
|
9140
|
-
)), /* @__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(
|
|
9141
9291
|
"button",
|
|
9142
9292
|
{
|
|
9143
9293
|
onClick: () => handleSave(false),
|
|
@@ -9146,10 +9296,10 @@ function NodeDetailsPanel({
|
|
|
9146
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"}
|
|
9147
9297
|
`
|
|
9148
9298
|
},
|
|
9149
|
-
isSaving && /* @__PURE__ */
|
|
9299
|
+
isSaving && /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiLoader, { className: "animate-spin" }),
|
|
9150
9300
|
isSaving ? "Salvando..." : "Salvar"
|
|
9151
9301
|
)))
|
|
9152
|
-
), isDescriptionModalOpen && canEdit && /* @__PURE__ */
|
|
9302
|
+
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9153
9303
|
DescriptionEditModal,
|
|
9154
9304
|
{
|
|
9155
9305
|
isOpen: isDescriptionModalOpen,
|
|
@@ -9170,8 +9320,8 @@ function NodeDetailsPanel({
|
|
|
9170
9320
|
}
|
|
9171
9321
|
|
|
9172
9322
|
// src/components/QuestDetailsPanel.jsx
|
|
9173
|
-
var
|
|
9174
|
-
var
|
|
9323
|
+
var import_react19 = __toESM(require("react"));
|
|
9324
|
+
var import_fi17 = require("react-icons/fi");
|
|
9175
9325
|
var QUEST_STATUS_COLORS3 = {
|
|
9176
9326
|
"Backlog": "#64748b",
|
|
9177
9327
|
"In Progress": "#eab308",
|
|
@@ -9199,40 +9349,42 @@ function QuestDetailsPanel({
|
|
|
9199
9349
|
}) {
|
|
9200
9350
|
var _a;
|
|
9201
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) || "";
|
|
9202
|
-
const [rawTitle, setRawTitle] = (0,
|
|
9352
|
+
const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
|
|
9203
9353
|
const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
|
|
9204
9354
|
const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
|
|
9205
9355
|
const standardizedName = questPrefix ? `${questPrefix} - \xBB ${rawTitle || "Sem t\xEDtulo"}` : rawTitle;
|
|
9206
|
-
const [types, setTypes] = (0,
|
|
9207
|
-
const [typeInput, setTypeInput] = (0,
|
|
9208
|
-
const [status, setStatus] = (0,
|
|
9209
|
-
const [size, setSize] = (0,
|
|
9210
|
-
const [assigneeId, setAssigneeId] = (0,
|
|
9211
|
-
const [description, setDescription] = (0,
|
|
9212
|
-
const [intensity, setIntensity] = (0,
|
|
9213
|
-
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0,
|
|
9214
|
-
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0,
|
|
9215
|
-
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0,
|
|
9216
|
-
const [customProps, setCustomProps] = (0,
|
|
9217
|
-
const [
|
|
9218
|
-
const [
|
|
9219
|
-
const [
|
|
9220
|
-
const [
|
|
9221
|
-
const [
|
|
9222
|
-
const [
|
|
9223
|
-
const [
|
|
9224
|
-
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);
|
|
9225
9377
|
const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
|
|
9226
9378
|
const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
|
|
9227
9379
|
initialWidth: isReadMode ? 700 : 440,
|
|
9228
9380
|
minWidth: 320,
|
|
9229
9381
|
maxWidth: maxPanelW
|
|
9230
9382
|
});
|
|
9231
|
-
(0,
|
|
9383
|
+
(0, import_react19.useEffect)(() => {
|
|
9232
9384
|
setWidth(isReadMode ? 700 : 440);
|
|
9233
9385
|
}, [isReadMode, setWidth]);
|
|
9234
|
-
const prevNodeIdRef = (0,
|
|
9235
|
-
const propsEndRef = (0,
|
|
9386
|
+
const prevNodeIdRef = (0, import_react19.useRef)(null);
|
|
9387
|
+
const propsEndRef = (0, import_react19.useRef)(null);
|
|
9236
9388
|
const canEdit = userRole !== "viewer";
|
|
9237
9389
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
9238
9390
|
const handleImageClickFromText = (url, name) => {
|
|
@@ -9240,7 +9392,7 @@ function QuestDetailsPanel({
|
|
|
9240
9392
|
onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
|
|
9241
9393
|
}
|
|
9242
9394
|
};
|
|
9243
|
-
(0,
|
|
9395
|
+
(0, import_react19.useEffect)(() => {
|
|
9244
9396
|
var _a2;
|
|
9245
9397
|
if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
|
|
9246
9398
|
prevNodeIdRef.current = node == null ? void 0 : node.id;
|
|
@@ -9254,10 +9406,12 @@ function QuestDetailsPanel({
|
|
|
9254
9406
|
setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
|
|
9255
9407
|
setExistingSections((node == null ? void 0 : node.description_sections) || []);
|
|
9256
9408
|
setCustomProps(extractCustomPropsFromNode(node || {}));
|
|
9409
|
+
setReviewStack((node == null ? void 0 : node.reviewStack) || []);
|
|
9410
|
+
setTimeline((node == null ? void 0 : node.timeline) || []);
|
|
9257
9411
|
setHasUnsavedChanges(false);
|
|
9258
9412
|
}
|
|
9259
9413
|
}, [node]);
|
|
9260
|
-
(0,
|
|
9414
|
+
(0, import_react19.useEffect)(() => {
|
|
9261
9415
|
const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
|
|
9262
9416
|
if (typeInput.trim() === "") {
|
|
9263
9417
|
setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
|
|
@@ -9369,6 +9523,8 @@ function QuestDetailsPanel({
|
|
|
9369
9523
|
const currentAssigneeId = overrides.assigneeId !== void 0 ? overrides.assigneeId : assigneeId;
|
|
9370
9524
|
const currentDescription = overrides.description !== void 0 ? overrides.description : description;
|
|
9371
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;
|
|
9372
9528
|
const currentExistingSections = overrides.existingSections !== void 0 ? overrides.existingSections : existingSections;
|
|
9373
9529
|
const currentStatus = overrides.status !== void 0 ? overrides.status : status;
|
|
9374
9530
|
if (!keepOpen && !hasUnsavedChanges) {
|
|
@@ -9400,6 +9556,8 @@ function QuestDetailsPanel({
|
|
|
9400
9556
|
textureImageUrl: null,
|
|
9401
9557
|
intensity,
|
|
9402
9558
|
is_quest: true,
|
|
9559
|
+
reviewStack: currentReviewStack,
|
|
9560
|
+
timeline: currentTimeline,
|
|
9403
9561
|
...extrasObj,
|
|
9404
9562
|
version_node: node.version_node
|
|
9405
9563
|
};
|
|
@@ -9427,7 +9585,7 @@ function QuestDetailsPanel({
|
|
|
9427
9585
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
9428
9586
|
const assigneeMember = viewMembers.find((m) => m.id === assigneeId);
|
|
9429
9587
|
const isAssigneeUndefined = assigneeId && !assigneeMember;
|
|
9430
|
-
return /* @__PURE__ */
|
|
9588
|
+
return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
|
|
9431
9589
|
"div",
|
|
9432
9590
|
{
|
|
9433
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"}`,
|
|
@@ -9440,11 +9598,11 @@ function QuestDetailsPanel({
|
|
|
9440
9598
|
onContextMenu: swallow,
|
|
9441
9599
|
onDoubleClick: swallow
|
|
9442
9600
|
},
|
|
9443
|
-
/* @__PURE__ */
|
|
9601
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { onPointerDown: (e) => {
|
|
9444
9602
|
e.stopPropagation();
|
|
9445
9603
|
handleResize(e);
|
|
9446
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" }),
|
|
9447
|
-
isReadMode ? /* @__PURE__ */
|
|
9605
|
+
isReadMode ? /* @__PURE__ */ import_react19.default.createElement(
|
|
9448
9606
|
DescriptionReadModePanel,
|
|
9449
9607
|
{
|
|
9450
9608
|
title: standardizedName || (node == null ? void 0 : node.name),
|
|
@@ -9465,7 +9623,7 @@ function QuestDetailsPanel({
|
|
|
9465
9623
|
onImageClick: handleImageClickFromText,
|
|
9466
9624
|
onSaveDescription: handleSaveDescriptionInline
|
|
9467
9625
|
}
|
|
9468
|
-
) : /* @__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(
|
|
9469
9627
|
"input",
|
|
9470
9628
|
{
|
|
9471
9629
|
type: "text",
|
|
@@ -9474,7 +9632,7 @@ function QuestDetailsPanel({
|
|
|
9474
9632
|
readOnly: !canEdit,
|
|
9475
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"}`
|
|
9476
9634
|
}
|
|
9477
|
-
), /* @__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(
|
|
9478
9636
|
"button",
|
|
9479
9637
|
{
|
|
9480
9638
|
type: "button",
|
|
@@ -9482,9 +9640,9 @@ function QuestDetailsPanel({
|
|
|
9482
9640
|
disabled: !canEdit,
|
|
9483
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"}`
|
|
9484
9642
|
},
|
|
9485
|
-
/* @__PURE__ */
|
|
9486
|
-
canEdit && /* @__PURE__ */
|
|
9487
|
-
), 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(
|
|
9488
9646
|
"li",
|
|
9489
9647
|
{
|
|
9490
9648
|
key: s,
|
|
@@ -9494,21 +9652,21 @@ function QuestDetailsPanel({
|
|
|
9494
9652
|
},
|
|
9495
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"}`
|
|
9496
9654
|
},
|
|
9497
|
-
/* @__PURE__ */
|
|
9655
|
+
/* @__PURE__ */ import_react19.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
|
|
9498
9656
|
s
|
|
9499
|
-
)))))), /* @__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(
|
|
9500
9658
|
"button",
|
|
9501
9659
|
{
|
|
9502
9660
|
type: "button",
|
|
9503
9661
|
onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
|
|
9504
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"
|
|
9505
9663
|
},
|
|
9506
|
-
/* @__PURE__ */
|
|
9507
|
-
/* @__PURE__ */
|
|
9508
|
-
), 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: () => {
|
|
9509
9667
|
setIsAssigneeDropdownOpen(false);
|
|
9510
9668
|
setAssigneeSearchQuery("");
|
|
9511
|
-
} }), /* @__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(
|
|
9512
9670
|
"input",
|
|
9513
9671
|
{
|
|
9514
9672
|
type: "text",
|
|
@@ -9519,11 +9677,19 @@ function QuestDetailsPanel({
|
|
|
9519
9677
|
className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
|
|
9520
9678
|
onClick: (e) => e.stopPropagation()
|
|
9521
9679
|
}
|
|
9522
|
-
)), /* @__PURE__ */
|
|
9680
|
+
)), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
9523
9681
|
"li",
|
|
9524
9682
|
{
|
|
9525
9683
|
onClick: () => {
|
|
9526
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);
|
|
9527
9693
|
setHasUnsavedChanges(true);
|
|
9528
9694
|
setIsAssigneeDropdownOpen(false);
|
|
9529
9695
|
setAssigneeSearchQuery("");
|
|
@@ -9531,7 +9697,7 @@ function QuestDetailsPanel({
|
|
|
9531
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"}`
|
|
9532
9698
|
},
|
|
9533
9699
|
"Nenhum"
|
|
9534
|
-
), isAssigneeUndefined && /* @__PURE__ */
|
|
9700
|
+
), isAssigneeUndefined && /* @__PURE__ */ import_react19.default.createElement(
|
|
9535
9701
|
"li",
|
|
9536
9702
|
{
|
|
9537
9703
|
onClick: () => {
|
|
@@ -9544,12 +9710,20 @@ function QuestDetailsPanel({
|
|
|
9544
9710
|
), viewMembers.filter((member) => {
|
|
9545
9711
|
const search = assigneeSearchQuery.toLowerCase();
|
|
9546
9712
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
9547
|
-
}).map((member) => /* @__PURE__ */
|
|
9713
|
+
}).map((member) => /* @__PURE__ */ import_react19.default.createElement(
|
|
9548
9714
|
"li",
|
|
9549
9715
|
{
|
|
9550
9716
|
key: member.id,
|
|
9551
9717
|
onClick: () => {
|
|
9552
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);
|
|
9553
9727
|
setHasUnsavedChanges(true);
|
|
9554
9728
|
setIsAssigneeDropdownOpen(false);
|
|
9555
9729
|
setAssigneeSearchQuery("");
|
|
@@ -9560,7 +9734,18 @@ function QuestDetailsPanel({
|
|
|
9560
9734
|
)), viewMembers.filter((member) => {
|
|
9561
9735
|
const search = assigneeSearchQuery.toLowerCase();
|
|
9562
9736
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
9563
|
-
}).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(
|
|
9564
9749
|
"input",
|
|
9565
9750
|
{
|
|
9566
9751
|
type: "text",
|
|
@@ -9581,14 +9766,18 @@ function QuestDetailsPanel({
|
|
|
9581
9766
|
placeholder: "",
|
|
9582
9767
|
autoComplete: "off"
|
|
9583
9768
|
}
|
|
9584
|
-
), 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) => {
|
|
9585
9770
|
e.preventDefault();
|
|
9586
9771
|
handleAddType(suggestedType);
|
|
9587
|
-
} }, 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) => {
|
|
9588
9773
|
const isSelected = size === s;
|
|
9589
|
-
return /* @__PURE__ */
|
|
9590
|
-
}))), /* @__PURE__ */
|
|
9591
|
-
|
|
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(
|
|
9592
9781
|
DescriptionEditModal,
|
|
9593
9782
|
{
|
|
9594
9783
|
isOpen: isDescriptionModalOpen,
|
|
@@ -9608,7 +9797,7 @@ function QuestDetailsPanel({
|
|
|
9608
9797
|
}
|
|
9609
9798
|
|
|
9610
9799
|
// src/components/MultiNodeContextMenu.jsx
|
|
9611
|
-
var
|
|
9800
|
+
var import_react20 = __toESM(require("react"));
|
|
9612
9801
|
function MultiNodeContextMenu({
|
|
9613
9802
|
data,
|
|
9614
9803
|
userRole,
|
|
@@ -9617,12 +9806,12 @@ function MultiNodeContextMenu({
|
|
|
9617
9806
|
onDismissOtherNodes,
|
|
9618
9807
|
onDeleteNodes
|
|
9619
9808
|
}) {
|
|
9620
|
-
const menuRef = (0,
|
|
9621
|
-
const [menuPos, setMenuPos] = (0,
|
|
9622
|
-
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);
|
|
9623
9812
|
const ability = defineAbilityFor(userRole);
|
|
9624
9813
|
const canDelete = ability.can("delete", "Node");
|
|
9625
|
-
(0,
|
|
9814
|
+
(0, import_react20.useLayoutEffect)(() => {
|
|
9626
9815
|
if (!data.visible || !menuRef.current) return;
|
|
9627
9816
|
const el = menuRef.current;
|
|
9628
9817
|
const w = el.clientWidth;
|
|
@@ -9635,7 +9824,7 @@ function MultiNodeContextMenu({
|
|
|
9635
9824
|
if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
|
|
9636
9825
|
setMenuPos({ left, top });
|
|
9637
9826
|
}, [data]);
|
|
9638
|
-
(0,
|
|
9827
|
+
(0, import_react20.useEffect)(() => {
|
|
9639
9828
|
if (data.visible) {
|
|
9640
9829
|
setIsConfirmingDelete(false);
|
|
9641
9830
|
}
|
|
@@ -9650,7 +9839,7 @@ function MultiNodeContextMenu({
|
|
|
9650
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";
|
|
9651
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";
|
|
9652
9841
|
const nodeCount = data.nodeIds.size;
|
|
9653
|
-
return /* @__PURE__ */
|
|
9842
|
+
return /* @__PURE__ */ import_react20.default.createElement(
|
|
9654
9843
|
"div",
|
|
9655
9844
|
{
|
|
9656
9845
|
ref: menuRef,
|
|
@@ -9664,28 +9853,28 @@ function MultiNodeContextMenu({
|
|
|
9664
9853
|
onContextMenu: swallow,
|
|
9665
9854
|
onDoubleClick: swallow
|
|
9666
9855
|
},
|
|
9667
|
-
/* @__PURE__ */
|
|
9668
|
-
/* @__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(
|
|
9669
9858
|
"button",
|
|
9670
9859
|
{
|
|
9671
9860
|
onClick: () => setIsConfirmingDelete(false),
|
|
9672
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"
|
|
9673
9862
|
},
|
|
9674
9863
|
"Cancelar"
|
|
9675
|
-
), /* @__PURE__ */
|
|
9864
|
+
), /* @__PURE__ */ import_react20.default.createElement(
|
|
9676
9865
|
"button",
|
|
9677
9866
|
{
|
|
9678
9867
|
onClick: () => onDeleteNodes(data.nodeIds),
|
|
9679
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"
|
|
9680
9869
|
},
|
|
9681
9870
|
"Excluir"
|
|
9682
|
-
))) : /* @__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, ")"))))))
|
|
9683
9872
|
);
|
|
9684
9873
|
}
|
|
9685
9874
|
|
|
9686
9875
|
// src/components/RelationshipDetailsPanel.jsx
|
|
9687
|
-
var
|
|
9688
|
-
var
|
|
9876
|
+
var import_react21 = __toESM(require("react"));
|
|
9877
|
+
var import_fi18 = require("react-icons/fi");
|
|
9689
9878
|
function RelationshipDetailsPanel({
|
|
9690
9879
|
link,
|
|
9691
9880
|
onClose,
|
|
@@ -9699,22 +9888,22 @@ function RelationshipDetailsPanel({
|
|
|
9699
9888
|
onUploadFile,
|
|
9700
9889
|
userRole
|
|
9701
9890
|
}) {
|
|
9702
|
-
const [name, setName] = (0,
|
|
9703
|
-
const [description, setDescription] = (0,
|
|
9704
|
-
const [customProps, setCustomProps] = (0,
|
|
9705
|
-
const [existingSections, setExistingSections] = (0,
|
|
9706
|
-
const [sourceLabel, setSourceLabel] = (0,
|
|
9707
|
-
const [targetLabel, setTargetLabel] = (0,
|
|
9708
|
-
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0,
|
|
9709
|
-
const [isSaving, setIsSaving] = (0,
|
|
9710
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
9711
|
-
const [hasUnsavedChanges, setHasUnsavedChanges] = (0,
|
|
9712
|
-
const propsEndRef = (0,
|
|
9713
|
-
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)(() => {
|
|
9714
9903
|
const ability = defineAbilityFor(userRole);
|
|
9715
9904
|
return ability.can("update", "Connection");
|
|
9716
9905
|
}, [userRole]);
|
|
9717
|
-
(0,
|
|
9906
|
+
(0, import_react21.useEffect)(() => {
|
|
9718
9907
|
setName((link == null ? void 0 : link.name) ?? "");
|
|
9719
9908
|
setDescription((link == null ? void 0 : link.description) ?? "");
|
|
9720
9909
|
setExistingSections((link == null ? void 0 : link.description_sections) || []);
|
|
@@ -9805,7 +9994,7 @@ function RelationshipDetailsPanel({
|
|
|
9805
9994
|
onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
|
|
9806
9995
|
}
|
|
9807
9996
|
};
|
|
9808
|
-
return /* @__PURE__ */
|
|
9997
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement(
|
|
9809
9998
|
"div",
|
|
9810
9999
|
{
|
|
9811
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
|
|
@@ -9820,7 +10009,7 @@ function RelationshipDetailsPanel({
|
|
|
9820
10009
|
onContextMenu: swallow,
|
|
9821
10010
|
onDoubleClick: swallow
|
|
9822
10011
|
},
|
|
9823
|
-
isReadMode ? /* @__PURE__ */
|
|
10012
|
+
isReadMode ? /* @__PURE__ */ import_react21.default.createElement(
|
|
9824
10013
|
DescriptionReadModePanel,
|
|
9825
10014
|
{
|
|
9826
10015
|
title: name || "Rela\xE7\xE3o",
|
|
@@ -9841,7 +10030,7 @@ function RelationshipDetailsPanel({
|
|
|
9841
10030
|
onImageClick: handleImageClickFromText,
|
|
9842
10031
|
onSaveDescription: handleSaveDescriptionInline
|
|
9843
10032
|
}
|
|
9844
|
-
) : /* @__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(
|
|
9845
10034
|
"input",
|
|
9846
10035
|
{
|
|
9847
10036
|
type: "text",
|
|
@@ -9856,7 +10045,7 @@ function RelationshipDetailsPanel({
|
|
|
9856
10045
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
9857
10046
|
`
|
|
9858
10047
|
}
|
|
9859
|
-
)), /* @__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(
|
|
9860
10049
|
"input",
|
|
9861
10050
|
{
|
|
9862
10051
|
type: "text",
|
|
@@ -9871,7 +10060,7 @@ function RelationshipDetailsPanel({
|
|
|
9871
10060
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
9872
10061
|
`
|
|
9873
10062
|
}
|
|
9874
|
-
)), /* @__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(
|
|
9875
10064
|
"input",
|
|
9876
10065
|
{
|
|
9877
10066
|
type: "text",
|
|
@@ -9886,7 +10075,7 @@ function RelationshipDetailsPanel({
|
|
|
9886
10075
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
9887
10076
|
`
|
|
9888
10077
|
}
|
|
9889
|
-
)))), /* @__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(
|
|
9890
10079
|
DescriptionDisplay,
|
|
9891
10080
|
{
|
|
9892
10081
|
description,
|
|
@@ -9898,7 +10087,7 @@ function RelationshipDetailsPanel({
|
|
|
9898
10087
|
onImageClick: handleImageClickFromText,
|
|
9899
10088
|
onSaveDescription: handleSaveDescriptionInline
|
|
9900
10089
|
}
|
|
9901
|
-
), /* @__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(
|
|
9902
10091
|
"button",
|
|
9903
10092
|
{
|
|
9904
10093
|
type: "button",
|
|
@@ -9906,8 +10095,8 @@ function RelationshipDetailsPanel({
|
|
|
9906
10095
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors border-r border-white/5",
|
|
9907
10096
|
title: "Modo de Leitura"
|
|
9908
10097
|
},
|
|
9909
|
-
/* @__PURE__ */
|
|
9910
|
-
), canEdit && /* @__PURE__ */
|
|
10098
|
+
/* @__PURE__ */ import_react21.default.createElement(import_fi18.FiBookOpen, { size: 14 })
|
|
10099
|
+
), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
9911
10100
|
"button",
|
|
9912
10101
|
{
|
|
9913
10102
|
type: "button",
|
|
@@ -9915,15 +10104,15 @@ function RelationshipDetailsPanel({
|
|
|
9915
10104
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
9916
10105
|
title: "Editar descri\xE7\xE3o"
|
|
9917
10106
|
},
|
|
9918
|
-
/* @__PURE__ */
|
|
9919
|
-
)), !description && canEdit && /* @__PURE__ */
|
|
10107
|
+
/* @__PURE__ */ import_react21.default.createElement(import_fi18.FiEdit2, { size: 14 })
|
|
10108
|
+
)), !description && canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
9920
10109
|
"div",
|
|
9921
10110
|
{
|
|
9922
10111
|
onClick: () => setIsDescriptionModalOpen(true),
|
|
9923
10112
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
9924
10113
|
},
|
|
9925
10114
|
"Adicionar descri\xE7\xE3o..."
|
|
9926
|
-
))), /* @__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(
|
|
9927
10116
|
CustomPropertyDisplay,
|
|
9928
10117
|
{
|
|
9929
10118
|
key: prop.id,
|
|
@@ -9935,7 +10124,7 @@ function RelationshipDetailsPanel({
|
|
|
9935
10124
|
onUploadFile,
|
|
9936
10125
|
disabled: !canEdit
|
|
9937
10126
|
}
|
|
9938
|
-
)), /* @__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(
|
|
9939
10128
|
"button",
|
|
9940
10129
|
{
|
|
9941
10130
|
onClick: () => handleSave(false),
|
|
@@ -9944,10 +10133,10 @@ function RelationshipDetailsPanel({
|
|
|
9944
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"}
|
|
9945
10134
|
`
|
|
9946
10135
|
},
|
|
9947
|
-
isSaving && /* @__PURE__ */
|
|
10136
|
+
isSaving && /* @__PURE__ */ import_react21.default.createElement(import_fi18.FiLoader, { className: "animate-spin" }),
|
|
9948
10137
|
isSaving ? "Salvando..." : "Salvar"
|
|
9949
10138
|
)))
|
|
9950
|
-
), isDescriptionModalOpen && /* @__PURE__ */
|
|
10139
|
+
), isDescriptionModalOpen && /* @__PURE__ */ import_react21.default.createElement(
|
|
9951
10140
|
DescriptionEditModal,
|
|
9952
10141
|
{
|
|
9953
10142
|
isOpen: isDescriptionModalOpen,
|
|
@@ -9969,7 +10158,7 @@ function RelationshipDetailsPanel({
|
|
|
9969
10158
|
}
|
|
9970
10159
|
|
|
9971
10160
|
// src/components/RelationshipContextMenu.jsx
|
|
9972
|
-
var
|
|
10161
|
+
var import_react22 = __toESM(require("react"));
|
|
9973
10162
|
function RelationshipContextMenu({
|
|
9974
10163
|
data,
|
|
9975
10164
|
userRole,
|
|
@@ -9979,25 +10168,25 @@ function RelationshipContextMenu({
|
|
|
9979
10168
|
onDelete,
|
|
9980
10169
|
onClose
|
|
9981
10170
|
}) {
|
|
9982
|
-
const menuRef = (0,
|
|
9983
|
-
const [menuPos, setMenuPos] = (0,
|
|
9984
|
-
const [isConfirmingDelete, setIsConfirmingDelete] = (0,
|
|
9985
|
-
const ability = (0,
|
|
9986
|
-
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)(
|
|
9987
10176
|
() => {
|
|
9988
10177
|
var _a, _b, _c, _d;
|
|
9989
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)";
|
|
9990
10179
|
},
|
|
9991
10180
|
[data == null ? void 0 : data.linkObject]
|
|
9992
10181
|
);
|
|
9993
|
-
const targetName = (0,
|
|
10182
|
+
const targetName = (0, import_react22.useMemo)(
|
|
9994
10183
|
() => {
|
|
9995
10184
|
var _a, _b, _c, _d;
|
|
9996
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)";
|
|
9997
10186
|
},
|
|
9998
10187
|
[data == null ? void 0 : data.linkObject]
|
|
9999
10188
|
);
|
|
10000
|
-
(0,
|
|
10189
|
+
(0, import_react22.useLayoutEffect)(() => {
|
|
10001
10190
|
if (!data.visible || !menuRef.current) return;
|
|
10002
10191
|
const el = menuRef.current;
|
|
10003
10192
|
const w = el.clientWidth;
|
|
@@ -10010,7 +10199,7 @@ function RelationshipContextMenu({
|
|
|
10010
10199
|
if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
|
|
10011
10200
|
setMenuPos({ left, top });
|
|
10012
10201
|
}, [data]);
|
|
10013
|
-
(0,
|
|
10202
|
+
(0, import_react22.useEffect)(() => {
|
|
10014
10203
|
if (data.visible) {
|
|
10015
10204
|
setIsConfirmingDelete(false);
|
|
10016
10205
|
}
|
|
@@ -10026,7 +10215,7 @@ function RelationshipContextMenu({
|
|
|
10026
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";
|
|
10027
10216
|
const canUpdate = ability.can("update", "Connection");
|
|
10028
10217
|
const canDelete = ability.can("delete", "Connection");
|
|
10029
|
-
return /* @__PURE__ */
|
|
10218
|
+
return /* @__PURE__ */ import_react22.default.createElement(
|
|
10030
10219
|
"div",
|
|
10031
10220
|
{
|
|
10032
10221
|
ref: menuRef,
|
|
@@ -10040,29 +10229,29 @@ function RelationshipContextMenu({
|
|
|
10040
10229
|
onContextMenu: swallow,
|
|
10041
10230
|
onDoubleClick: swallow
|
|
10042
10231
|
},
|
|
10043
|
-
/* @__PURE__ */
|
|
10044
|
-
/* @__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(
|
|
10045
10234
|
"button",
|
|
10046
10235
|
{
|
|
10047
10236
|
onClick: () => setIsConfirmingDelete(false),
|
|
10048
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"
|
|
10049
10238
|
},
|
|
10050
10239
|
"Cancelar"
|
|
10051
|
-
), /* @__PURE__ */
|
|
10240
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
10052
10241
|
"button",
|
|
10053
10242
|
{
|
|
10054
10243
|
onClick: () => onDelete == null ? void 0 : onDelete(data.linkObject),
|
|
10055
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"
|
|
10056
10245
|
},
|
|
10057
10246
|
"Excluir"
|
|
10058
|
-
))) : /* @__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(
|
|
10059
10248
|
"button",
|
|
10060
10249
|
{
|
|
10061
10250
|
onClick: () => onRelinkSource == null ? void 0 : onRelinkSource(data.linkObject),
|
|
10062
10251
|
className: baseButtonClass,
|
|
10063
10252
|
title: "Desconectar ponta ligada ao Source"
|
|
10064
10253
|
},
|
|
10065
|
-
/* @__PURE__ */
|
|
10254
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10066
10255
|
"svg",
|
|
10067
10256
|
{
|
|
10068
10257
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10075,18 +10264,18 @@ function RelationshipContextMenu({
|
|
|
10075
10264
|
strokeLinecap: "round",
|
|
10076
10265
|
strokeLinejoin: "round"
|
|
10077
10266
|
},
|
|
10078
|
-
/* @__PURE__ */
|
|
10079
|
-
/* @__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" })
|
|
10080
10269
|
),
|
|
10081
|
-
/* @__PURE__ */
|
|
10082
|
-
), /* @__PURE__ */
|
|
10270
|
+
/* @__PURE__ */ import_react22.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
|
|
10271
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
10083
10272
|
"button",
|
|
10084
10273
|
{
|
|
10085
10274
|
onClick: () => onRelinkTarget == null ? void 0 : onRelinkTarget(data.linkObject),
|
|
10086
10275
|
className: baseButtonClass,
|
|
10087
10276
|
title: "Desconectar ponta ligada ao Target"
|
|
10088
10277
|
},
|
|
10089
|
-
/* @__PURE__ */
|
|
10278
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10090
10279
|
"svg",
|
|
10091
10280
|
{
|
|
10092
10281
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10099,21 +10288,21 @@ function RelationshipContextMenu({
|
|
|
10099
10288
|
strokeLinecap: "round",
|
|
10100
10289
|
strokeLinejoin: "round"
|
|
10101
10290
|
},
|
|
10102
|
-
/* @__PURE__ */
|
|
10103
|
-
/* @__PURE__ */
|
|
10104
|
-
/* @__PURE__ */
|
|
10105
|
-
/* @__PURE__ */
|
|
10106
|
-
/* @__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" })
|
|
10107
10296
|
),
|
|
10108
|
-
/* @__PURE__ */
|
|
10109
|
-
), /* @__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(
|
|
10110
10299
|
"button",
|
|
10111
10300
|
{
|
|
10112
10301
|
onClick: () => onOpenDetails == null ? void 0 : onOpenDetails(data.linkObject),
|
|
10113
10302
|
className: baseButtonClass,
|
|
10114
10303
|
title: "Abrir detalhes da rela\xE7\xE3o"
|
|
10115
10304
|
},
|
|
10116
|
-
/* @__PURE__ */
|
|
10305
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10117
10306
|
"svg",
|
|
10118
10307
|
{
|
|
10119
10308
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10126,19 +10315,19 @@ function RelationshipContextMenu({
|
|
|
10126
10315
|
strokeLinecap: "round",
|
|
10127
10316
|
strokeLinejoin: "round"
|
|
10128
10317
|
},
|
|
10129
|
-
/* @__PURE__ */
|
|
10130
|
-
/* @__PURE__ */
|
|
10131
|
-
/* @__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" })
|
|
10132
10321
|
),
|
|
10133
|
-
/* @__PURE__ */
|
|
10134
|
-
), 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(
|
|
10135
10324
|
"button",
|
|
10136
10325
|
{
|
|
10137
10326
|
onClick: () => setIsConfirmingDelete(true),
|
|
10138
10327
|
className: dangerButtonClass,
|
|
10139
10328
|
title: "Excluir esta conex\xE3o"
|
|
10140
10329
|
},
|
|
10141
|
-
/* @__PURE__ */
|
|
10330
|
+
/* @__PURE__ */ import_react22.default.createElement(
|
|
10142
10331
|
"svg",
|
|
10143
10332
|
{
|
|
10144
10333
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10151,19 +10340,19 @@ function RelationshipContextMenu({
|
|
|
10151
10340
|
strokeLinecap: "round",
|
|
10152
10341
|
strokeLinejoin: "round"
|
|
10153
10342
|
},
|
|
10154
|
-
/* @__PURE__ */
|
|
10155
|
-
/* @__PURE__ */
|
|
10156
|
-
/* @__PURE__ */
|
|
10157
|
-
/* @__PURE__ */
|
|
10158
|
-
/* @__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" })
|
|
10159
10348
|
),
|
|
10160
|
-
/* @__PURE__ */
|
|
10349
|
+
/* @__PURE__ */ import_react22.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
|
|
10161
10350
|
)))))
|
|
10162
10351
|
);
|
|
10163
10352
|
}
|
|
10164
10353
|
|
|
10165
10354
|
// src/components/LoadingScreen.jsx
|
|
10166
|
-
var
|
|
10355
|
+
var import_react23 = __toESM(require("react"));
|
|
10167
10356
|
var styles = {
|
|
10168
10357
|
loadingOverlay: {
|
|
10169
10358
|
position: "fixed",
|
|
@@ -10195,11 +10384,11 @@ var styles = {
|
|
|
10195
10384
|
`
|
|
10196
10385
|
};
|
|
10197
10386
|
function LoadingScreen() {
|
|
10198
|
-
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 })));
|
|
10199
10388
|
}
|
|
10200
10389
|
|
|
10201
10390
|
// src/components/ImportParentFileModal.jsx
|
|
10202
|
-
var
|
|
10391
|
+
var import_react24 = __toESM(require("react"));
|
|
10203
10392
|
function ImportParentFileModal({
|
|
10204
10393
|
isOpen,
|
|
10205
10394
|
onClose,
|
|
@@ -10210,12 +10399,12 @@ function ImportParentFileModal({
|
|
|
10210
10399
|
onFetchAvailableFiles,
|
|
10211
10400
|
currentViewName
|
|
10212
10401
|
}) {
|
|
10213
|
-
const [activeTab, setActiveTab] = (0,
|
|
10214
|
-
const [availableDbs, setAvailableDbs] = (0,
|
|
10215
|
-
const [availableViews, setAvailableViews] = (0,
|
|
10216
|
-
const [selectedItem, setSelectedItem] = (0,
|
|
10217
|
-
const [isLoading, setIsLoading] = (0,
|
|
10218
|
-
(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)(() => {
|
|
10219
10408
|
if (isOpen && session && onFetchAvailableFiles) {
|
|
10220
10409
|
const fetchData = async () => {
|
|
10221
10410
|
setIsLoading(true);
|
|
@@ -10251,7 +10440,7 @@ function ImportParentFileModal({
|
|
|
10251
10440
|
fetchData();
|
|
10252
10441
|
}
|
|
10253
10442
|
}, [isOpen, session, parentDbs, onFetchAvailableFiles, currentViewName]);
|
|
10254
|
-
(0,
|
|
10443
|
+
(0, import_react24.useEffect)(() => {
|
|
10255
10444
|
setSelectedItem(null);
|
|
10256
10445
|
}, [activeTab]);
|
|
10257
10446
|
if (!isOpen) {
|
|
@@ -10280,13 +10469,13 @@ function ImportParentFileModal({
|
|
|
10280
10469
|
const swallow = (e) => e.stopPropagation();
|
|
10281
10470
|
const currentList = activeTab === "databases" ? availableDbs : availableViews;
|
|
10282
10471
|
const emptyMessage = activeTab === "databases" ? "Nenhum novo arquivo parent dispon\xEDvel." : "Nenhuma view dispon\xEDvel para importa\xE7\xE3o.";
|
|
10283
|
-
return /* @__PURE__ */
|
|
10472
|
+
return /* @__PURE__ */ import_react24.default.createElement(
|
|
10284
10473
|
"div",
|
|
10285
10474
|
{
|
|
10286
10475
|
className: "ui-overlay fixed inset-0 z-[1200] flex items-center justify-center bg-black/60 backdrop-blur-sm",
|
|
10287
10476
|
onClick: onClose
|
|
10288
10477
|
},
|
|
10289
|
-
/* @__PURE__ */
|
|
10478
|
+
/* @__PURE__ */ import_react24.default.createElement(
|
|
10290
10479
|
"div",
|
|
10291
10480
|
{
|
|
10292
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]",
|
|
@@ -10298,14 +10487,14 @@ function ImportParentFileModal({
|
|
|
10298
10487
|
onContextMenu: swallow,
|
|
10299
10488
|
onDoubleClick: swallow
|
|
10300
10489
|
},
|
|
10301
|
-
/* @__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(
|
|
10302
10491
|
"button",
|
|
10303
10492
|
{
|
|
10304
10493
|
onClick: onClose,
|
|
10305
10494
|
className: "p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
10306
10495
|
title: "Fechar"
|
|
10307
10496
|
},
|
|
10308
|
-
/* @__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(
|
|
10309
10498
|
"path",
|
|
10310
10499
|
{
|
|
10311
10500
|
fillRule: "evenodd",
|
|
@@ -10314,14 +10503,14 @@ function ImportParentFileModal({
|
|
|
10314
10503
|
}
|
|
10315
10504
|
))
|
|
10316
10505
|
)),
|
|
10317
|
-
/* @__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(
|
|
10318
10507
|
"button",
|
|
10319
10508
|
{
|
|
10320
10509
|
onClick: () => setActiveTab("databases"),
|
|
10321
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"}`
|
|
10322
10511
|
},
|
|
10323
10512
|
"Arquivos Parent"
|
|
10324
|
-
), /* @__PURE__ */
|
|
10513
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
10325
10514
|
"button",
|
|
10326
10515
|
{
|
|
10327
10516
|
onClick: () => setActiveTab("views"),
|
|
@@ -10329,24 +10518,24 @@ function ImportParentFileModal({
|
|
|
10329
10518
|
},
|
|
10330
10519
|
"Views (Ancestralidades)"
|
|
10331
10520
|
)),
|
|
10332
|
-
/* @__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(
|
|
10333
10522
|
"div",
|
|
10334
10523
|
{
|
|
10335
10524
|
key: item.id,
|
|
10336
10525
|
onClick: () => setSelectedItem(item),
|
|
10337
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"}`
|
|
10338
10527
|
},
|
|
10339
|
-
/* @__PURE__ */
|
|
10340
|
-
item.description && /* @__PURE__ */
|
|
10341
|
-
)) : /* @__PURE__ */
|
|
10342
|
-
/* @__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(
|
|
10343
10532
|
"button",
|
|
10344
10533
|
{
|
|
10345
10534
|
onClick: onClose,
|
|
10346
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"
|
|
10347
10536
|
},
|
|
10348
10537
|
"Cancelar"
|
|
10349
|
-
), /* @__PURE__ */
|
|
10538
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
10350
10539
|
"button",
|
|
10351
10540
|
{
|
|
10352
10541
|
onClick: handleConfirm,
|
|
@@ -10360,8 +10549,8 @@ function ImportParentFileModal({
|
|
|
10360
10549
|
}
|
|
10361
10550
|
|
|
10362
10551
|
// src/components/AncestryLinkDetailsPanel.jsx
|
|
10363
|
-
var
|
|
10364
|
-
var
|
|
10552
|
+
var import_react25 = __toESM(require("react"));
|
|
10553
|
+
var import_fi19 = require("react-icons/fi");
|
|
10365
10554
|
function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenReference, onMentionClick, onUploadFile }) {
|
|
10366
10555
|
var _a, _b, _c, _d;
|
|
10367
10556
|
const relationshipData = data.relationship || {};
|
|
@@ -10370,21 +10559,21 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10370
10559
|
const customProps = extractCustomPropsFromNode(relationshipData);
|
|
10371
10560
|
const sourceName = ((_b = (_a = data.sourceNode) == null ? void 0 : _a.userData) == null ? void 0 : _b.name) || "Origem";
|
|
10372
10561
|
const targetName = ((_d = (_c = data.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) || "Destino";
|
|
10373
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
10562
|
+
const [isReadMode, setIsReadMode] = (0, import_react25.useState)(false);
|
|
10374
10563
|
const swallow = (e) => e.stopPropagation();
|
|
10375
10564
|
const handleImageClickFromText = (url, name) => {
|
|
10376
10565
|
if (onOpenImageViewer) {
|
|
10377
10566
|
onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
|
|
10378
10567
|
}
|
|
10379
10568
|
};
|
|
10380
|
-
return /* @__PURE__ */
|
|
10569
|
+
return /* @__PURE__ */ import_react25.default.createElement(
|
|
10381
10570
|
"div",
|
|
10382
10571
|
{
|
|
10383
10572
|
className: "ui-overlay fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[1200]",
|
|
10384
10573
|
onClick: onClose,
|
|
10385
10574
|
onPointerDown: swallow
|
|
10386
10575
|
},
|
|
10387
|
-
/* @__PURE__ */
|
|
10576
|
+
/* @__PURE__ */ import_react25.default.createElement(
|
|
10388
10577
|
"div",
|
|
10389
10578
|
{
|
|
10390
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
|
|
@@ -10392,7 +10581,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10392
10581
|
`,
|
|
10393
10582
|
onClick: swallow
|
|
10394
10583
|
},
|
|
10395
|
-
isReadMode ? /* @__PURE__ */
|
|
10584
|
+
isReadMode ? /* @__PURE__ */ import_react25.default.createElement(
|
|
10396
10585
|
DescriptionReadModePanel,
|
|
10397
10586
|
{
|
|
10398
10587
|
title: `${sourceName} \u2794 ${targetName}`,
|
|
@@ -10404,15 +10593,15 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10404
10593
|
onMentionClick,
|
|
10405
10594
|
onImageClick: handleImageClickFromText
|
|
10406
10595
|
}
|
|
10407
|
-
) : /* @__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(
|
|
10408
10597
|
"button",
|
|
10409
10598
|
{
|
|
10410
10599
|
onClick: () => setIsReadMode(true),
|
|
10411
10600
|
className: "p-1 text-slate-400 hover:text-white transition-colors",
|
|
10412
10601
|
title: "Modo de Leitura"
|
|
10413
10602
|
},
|
|
10414
|
-
/* @__PURE__ */
|
|
10415
|
-
)), /* @__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(
|
|
10416
10605
|
DescriptionDisplay,
|
|
10417
10606
|
{
|
|
10418
10607
|
description,
|
|
@@ -10421,7 +10610,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10421
10610
|
onMentionClick,
|
|
10422
10611
|
onImageClick: handleImageClickFromText
|
|
10423
10612
|
}
|
|
10424
|
-
))), 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(
|
|
10425
10614
|
CustomPropertyDisplay,
|
|
10426
10615
|
{
|
|
10427
10616
|
key: prop.id,
|
|
@@ -10430,14 +10619,14 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
10430
10619
|
onOpenImageViewer,
|
|
10431
10620
|
onUploadFile
|
|
10432
10621
|
}
|
|
10433
|
-
)))), !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".')))
|
|
10434
10623
|
)
|
|
10435
10624
|
);
|
|
10436
10625
|
}
|
|
10437
10626
|
|
|
10438
10627
|
// src/components/AncestryBoard.jsx
|
|
10439
|
-
var
|
|
10440
|
-
var
|
|
10628
|
+
var import_react26 = __toESM(require("react"));
|
|
10629
|
+
var import_fi20 = require("react-icons/fi");
|
|
10441
10630
|
var GroupItem = ({
|
|
10442
10631
|
group,
|
|
10443
10632
|
index,
|
|
@@ -10456,7 +10645,7 @@ var GroupItem = ({
|
|
|
10456
10645
|
}) => {
|
|
10457
10646
|
const canIndent = index > 0;
|
|
10458
10647
|
const isPickingForThisGroup = pickingGroupId === group.id;
|
|
10459
|
-
const textareaRef = (0,
|
|
10648
|
+
const textareaRef = (0, import_react26.useRef)(null);
|
|
10460
10649
|
const adjustHeight = () => {
|
|
10461
10650
|
const textarea = textareaRef.current;
|
|
10462
10651
|
if (textarea) {
|
|
@@ -10464,10 +10653,10 @@ var GroupItem = ({
|
|
|
10464
10653
|
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
10465
10654
|
}
|
|
10466
10655
|
};
|
|
10467
|
-
(0,
|
|
10656
|
+
(0, import_react26.useEffect)(() => {
|
|
10468
10657
|
adjustHeight();
|
|
10469
10658
|
}, [group.text]);
|
|
10470
|
-
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(
|
|
10471
10660
|
"div",
|
|
10472
10661
|
{
|
|
10473
10662
|
className: `
|
|
@@ -10475,7 +10664,7 @@ var GroupItem = ({
|
|
|
10475
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"}
|
|
10476
10665
|
`
|
|
10477
10666
|
},
|
|
10478
|
-
/* @__PURE__ */
|
|
10667
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10479
10668
|
"textarea",
|
|
10480
10669
|
{
|
|
10481
10670
|
ref: textareaRef,
|
|
@@ -10493,9 +10682,9 @@ var GroupItem = ({
|
|
|
10493
10682
|
}
|
|
10494
10683
|
}
|
|
10495
10684
|
),
|
|
10496
|
-
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) => {
|
|
10497
10686
|
const isValid = availableIds.has(String(anc.ancestry_id));
|
|
10498
|
-
return /* @__PURE__ */
|
|
10687
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
10499
10688
|
"div",
|
|
10500
10689
|
{
|
|
10501
10690
|
key: anc.ancestry_id,
|
|
@@ -10507,40 +10696,40 @@ var GroupItem = ({
|
|
|
10507
10696
|
},
|
|
10508
10697
|
isValid ? (
|
|
10509
10698
|
// [MANTIDO] Botão Play visível para todos
|
|
10510
|
-
/* @__PURE__ */
|
|
10699
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10511
10700
|
"button",
|
|
10512
10701
|
{
|
|
10513
10702
|
onClick: () => onPlayAncestry(anc.ancestry_id),
|
|
10514
10703
|
className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
|
|
10515
10704
|
title: "Renderizar no cen\xE1rio"
|
|
10516
10705
|
},
|
|
10517
|
-
/* @__PURE__ */
|
|
10706
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
|
|
10518
10707
|
)
|
|
10519
|
-
) : /* @__PURE__ */
|
|
10520
|
-
/* @__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(
|
|
10521
10710
|
"span",
|
|
10522
10711
|
{
|
|
10523
10712
|
className: `font-medium truncate max-w-[150px] ${!isValid && "line-through decoration-red-500/50"}`
|
|
10524
10713
|
},
|
|
10525
10714
|
anc.name
|
|
10526
10715
|
),
|
|
10527
|
-
canEdit && /* @__PURE__ */
|
|
10716
|
+
canEdit && /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(
|
|
10528
10717
|
"div",
|
|
10529
10718
|
{
|
|
10530
10719
|
className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
|
|
10531
10720
|
}
|
|
10532
|
-
), /* @__PURE__ */
|
|
10721
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10533
10722
|
"button",
|
|
10534
10723
|
{
|
|
10535
10724
|
onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
|
|
10536
10725
|
className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
|
|
10537
10726
|
title: "Remover men\xE7\xE3o"
|
|
10538
10727
|
},
|
|
10539
|
-
/* @__PURE__ */
|
|
10728
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiX, { size: 12 })
|
|
10540
10729
|
))
|
|
10541
10730
|
);
|
|
10542
10731
|
})),
|
|
10543
|
-
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(
|
|
10544
10733
|
"button",
|
|
10545
10734
|
{
|
|
10546
10735
|
onClick: () => onRequestPickAncestry(group.id),
|
|
@@ -10550,17 +10739,17 @@ var GroupItem = ({
|
|
|
10550
10739
|
`,
|
|
10551
10740
|
title: "Adicionar Ancestralidade a este grupo"
|
|
10552
10741
|
},
|
|
10553
|
-
isPickingForThisGroup ? /* @__PURE__ */
|
|
10742
|
+
isPickingForThisGroup ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiSearch, { size: 12 }),
|
|
10554
10743
|
isPickingForThisGroup ? "Selecionando..." : "Adicionar"
|
|
10555
|
-
), /* @__PURE__ */
|
|
10744
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10556
10745
|
"button",
|
|
10557
10746
|
{
|
|
10558
10747
|
onClick: () => onAddSubgroup(group.id),
|
|
10559
10748
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
10560
10749
|
title: "Criar Subgrupo"
|
|
10561
10750
|
},
|
|
10562
|
-
/* @__PURE__ */
|
|
10563
|
-
)), /* @__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(
|
|
10564
10753
|
"button",
|
|
10565
10754
|
{
|
|
10566
10755
|
onClick: () => onIndent(group.id),
|
|
@@ -10568,25 +10757,25 @@ var GroupItem = ({
|
|
|
10568
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"}`,
|
|
10569
10758
|
title: "Aninhar no grupo acima"
|
|
10570
10759
|
},
|
|
10571
|
-
/* @__PURE__ */
|
|
10572
|
-
), /* @__PURE__ */
|
|
10760
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiArrowRight, { size: 14 })
|
|
10761
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10573
10762
|
"button",
|
|
10574
10763
|
{
|
|
10575
10764
|
onClick: () => onOutdent(group.id),
|
|
10576
10765
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
10577
10766
|
title: "Desaninhar"
|
|
10578
10767
|
},
|
|
10579
|
-
/* @__PURE__ */
|
|
10580
|
-
), /* @__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(
|
|
10581
10770
|
"button",
|
|
10582
10771
|
{
|
|
10583
10772
|
onClick: () => onDelete(group.id),
|
|
10584
10773
|
className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
|
|
10585
10774
|
title: "Remover Grupo"
|
|
10586
10775
|
},
|
|
10587
|
-
/* @__PURE__ */
|
|
10776
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi20.FiTrash2, { size: 14 })
|
|
10588
10777
|
)))
|
|
10589
|
-
), 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(
|
|
10590
10779
|
GroupItem,
|
|
10591
10780
|
{
|
|
10592
10781
|
key: childGroup.id,
|
|
@@ -10618,21 +10807,21 @@ function AncestryBoard({
|
|
|
10618
10807
|
userRole
|
|
10619
10808
|
// [NOVO] Recebe a role do usuário
|
|
10620
10809
|
}) {
|
|
10621
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
10622
|
-
const [groups, setGroups] = (0,
|
|
10623
|
-
const [isLoaded, setIsLoaded] = (0,
|
|
10624
|
-
const [pickingGroupId, setPickingGroupId] = (0,
|
|
10625
|
-
const [saveStatus, setSaveStatus] = (0,
|
|
10626
|
-
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)(() => {
|
|
10627
10816
|
return userRole !== "viewer";
|
|
10628
10817
|
}, [userRole]);
|
|
10629
|
-
(0,
|
|
10818
|
+
(0, import_react26.useEffect)(() => {
|
|
10630
10819
|
if (initialGroups && !isLoaded) {
|
|
10631
10820
|
setGroups(initialGroups);
|
|
10632
10821
|
setIsLoaded(true);
|
|
10633
10822
|
}
|
|
10634
10823
|
}, [initialGroups, isLoaded]);
|
|
10635
|
-
const nodeNamesMap = (0,
|
|
10824
|
+
const nodeNamesMap = (0, import_react26.useMemo)(() => {
|
|
10636
10825
|
const map = /* @__PURE__ */ new Map();
|
|
10637
10826
|
if (availableNodes && Array.isArray(availableNodes)) {
|
|
10638
10827
|
availableNodes.forEach((node) => {
|
|
@@ -10643,7 +10832,7 @@ function AncestryBoard({
|
|
|
10643
10832
|
}
|
|
10644
10833
|
return map;
|
|
10645
10834
|
}, [availableNodes]);
|
|
10646
|
-
const availableIds = (0,
|
|
10835
|
+
const availableIds = (0, import_react26.useMemo)(() => {
|
|
10647
10836
|
return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
|
|
10648
10837
|
}, [availableAncestries]);
|
|
10649
10838
|
const sanitizeGroups = (groupList) => {
|
|
@@ -10657,7 +10846,7 @@ function AncestryBoard({
|
|
|
10657
10846
|
children: sanitizeGroups(g.children || [])
|
|
10658
10847
|
}));
|
|
10659
10848
|
};
|
|
10660
|
-
(0,
|
|
10849
|
+
(0, import_react26.useEffect)(() => {
|
|
10661
10850
|
if (!isLoaded || !onSave) return;
|
|
10662
10851
|
const timeoutId = setTimeout(async () => {
|
|
10663
10852
|
setSaveStatus("saving");
|
|
@@ -10675,7 +10864,7 @@ function AncestryBoard({
|
|
|
10675
10864
|
}, 3e3);
|
|
10676
10865
|
return () => clearTimeout(timeoutId);
|
|
10677
10866
|
}, [groups, isLoaded, onSave]);
|
|
10678
|
-
(0,
|
|
10867
|
+
(0, import_react26.useEffect)(() => {
|
|
10679
10868
|
if (!isOpen) return;
|
|
10680
10869
|
const handleKeyDown = (e) => {
|
|
10681
10870
|
if (e.key === "Escape") {
|
|
@@ -10691,7 +10880,7 @@ function AncestryBoard({
|
|
|
10691
10880
|
window.addEventListener("keydown", handleKeyDown);
|
|
10692
10881
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
10693
10882
|
}, [isOpen, onClose, pickingGroupId]);
|
|
10694
|
-
const filtered = (0,
|
|
10883
|
+
const filtered = (0, import_react26.useMemo)(() => {
|
|
10695
10884
|
const term = searchTerm.toLowerCase().trim();
|
|
10696
10885
|
return availableAncestries.filter((a) => {
|
|
10697
10886
|
if (!term) return true;
|
|
@@ -10841,33 +11030,33 @@ function AncestryBoard({
|
|
|
10841
11030
|
});
|
|
10842
11031
|
};
|
|
10843
11032
|
if (!isOpen) return null;
|
|
10844
|
-
return /* @__PURE__ */
|
|
11033
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
10845
11034
|
"div",
|
|
10846
11035
|
{
|
|
10847
11036
|
className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
|
|
10848
11037
|
onClick: onClose
|
|
10849
11038
|
},
|
|
10850
|
-
/* @__PURE__ */
|
|
11039
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10851
11040
|
"div",
|
|
10852
11041
|
{
|
|
10853
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",
|
|
10854
11043
|
onClick: (e) => e.stopPropagation()
|
|
10855
11044
|
},
|
|
10856
|
-
/* @__PURE__ */
|
|
10857
|
-
|
|
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,
|
|
10858
11047
|
{
|
|
10859
11048
|
className: "animate-spin text-indigo-400",
|
|
10860
11049
|
size: 12
|
|
10861
11050
|
}
|
|
10862
|
-
), /* @__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(
|
|
10863
11052
|
"button",
|
|
10864
11053
|
{
|
|
10865
11054
|
onClick: handleAddRootGroup,
|
|
10866
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 "
|
|
10867
11056
|
},
|
|
10868
|
-
/* @__PURE__ */
|
|
10869
|
-
/* @__PURE__ */
|
|
10870
|
-
), /* @__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(
|
|
10871
11060
|
"button",
|
|
10872
11061
|
{
|
|
10873
11062
|
onClick: onClose,
|
|
@@ -10875,7 +11064,7 @@ function AncestryBoard({
|
|
|
10875
11064
|
},
|
|
10876
11065
|
"\xD7"
|
|
10877
11066
|
))),
|
|
10878
|
-
/* @__PURE__ */
|
|
11067
|
+
/* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react26.default.createElement(
|
|
10879
11068
|
"div",
|
|
10880
11069
|
{
|
|
10881
11070
|
className: `
|
|
@@ -10884,12 +11073,12 @@ function AncestryBoard({
|
|
|
10884
11073
|
min-w-[280px] max-w-[500px] bg-slate-900
|
|
10885
11074
|
`
|
|
10886
11075
|
},
|
|
10887
|
-
/* @__PURE__ */
|
|
10888
|
-
|
|
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,
|
|
10889
11078
|
{
|
|
10890
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"}`
|
|
10891
11080
|
}
|
|
10892
|
-
), /* @__PURE__ */
|
|
11081
|
+
), /* @__PURE__ */ import_react26.default.createElement(
|
|
10893
11082
|
"input",
|
|
10894
11083
|
{
|
|
10895
11084
|
type: "text",
|
|
@@ -10903,10 +11092,10 @@ function AncestryBoard({
|
|
|
10903
11092
|
autoFocus: !pickingGroupId
|
|
10904
11093
|
}
|
|
10905
11094
|
))),
|
|
10906
|
-
/* @__PURE__ */
|
|
11095
|
+
/* @__PURE__ */ import_react26.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
|
|
10907
11096
|
const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
|
|
10908
11097
|
const isPicking = !!pickingGroupId;
|
|
10909
|
-
return /* @__PURE__ */
|
|
11098
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
10910
11099
|
"div",
|
|
10911
11100
|
{
|
|
10912
11101
|
key: anc.ancestry_id,
|
|
@@ -10918,7 +11107,7 @@ function AncestryBoard({
|
|
|
10918
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"}
|
|
10919
11108
|
`
|
|
10920
11109
|
},
|
|
10921
|
-
/* @__PURE__ */
|
|
11110
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
10922
11111
|
"div",
|
|
10923
11112
|
{
|
|
10924
11113
|
className: `
|
|
@@ -10926,10 +11115,10 @@ function AncestryBoard({
|
|
|
10926
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"}
|
|
10927
11116
|
`
|
|
10928
11117
|
},
|
|
10929
|
-
isPicking ? /* @__PURE__ */
|
|
11118
|
+
isPicking ? /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react26.default.createElement(import_fi20.FiLayers, { size: 14 })
|
|
10930
11119
|
),
|
|
10931
|
-
/* @__PURE__ */
|
|
10932
|
-
!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(
|
|
10933
11122
|
"button",
|
|
10934
11123
|
{
|
|
10935
11124
|
onClick: (e) => {
|
|
@@ -10939,11 +11128,11 @@ function AncestryBoard({
|
|
|
10939
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",
|
|
10940
11129
|
title: "Renderizar Ancestralidade"
|
|
10941
11130
|
},
|
|
10942
|
-
/* @__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" }))
|
|
10943
11132
|
)
|
|
10944
11133
|
);
|
|
10945
11134
|
}))
|
|
10946
|
-
), /* @__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(
|
|
10947
11136
|
GroupItem,
|
|
10948
11137
|
{
|
|
10949
11138
|
key: group.id,
|
|
@@ -10963,7 +11152,7 @@ function AncestryBoard({
|
|
|
10963
11152
|
canEdit
|
|
10964
11153
|
}
|
|
10965
11154
|
))))),
|
|
10966
|
-
/* @__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"))
|
|
10967
11156
|
)
|
|
10968
11157
|
);
|
|
10969
11158
|
}
|
|
@@ -11047,12 +11236,12 @@ function XViewScene({
|
|
|
11047
11236
|
get_view_members
|
|
11048
11237
|
}) {
|
|
11049
11238
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
11050
|
-
const { data: session, status } = (0,
|
|
11239
|
+
const { data: session, status } = (0, import_react28.useSession)();
|
|
11051
11240
|
const router = (0, import_navigation.useRouter)();
|
|
11052
11241
|
const searchParams = (0, import_navigation.useSearchParams)();
|
|
11053
11242
|
const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
|
|
11054
11243
|
const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
|
|
11055
|
-
const viewParams = (0,
|
|
11244
|
+
const viewParams = (0, import_react27.useMemo)(() => {
|
|
11056
11245
|
if (encryptedConfig) {
|
|
11057
11246
|
const data = decryptData(encryptedConfig);
|
|
11058
11247
|
if (data) {
|
|
@@ -11061,7 +11250,7 @@ function XViewScene({
|
|
|
11061
11250
|
}
|
|
11062
11251
|
return null;
|
|
11063
11252
|
}, [encryptedConfig, session]);
|
|
11064
|
-
(0,
|
|
11253
|
+
(0, import_react27.useEffect)(() => {
|
|
11065
11254
|
async function verifyPermission() {
|
|
11066
11255
|
if (!viewParams || !session || !check_user_permission) return;
|
|
11067
11256
|
const { id, type, owner_id } = viewParams;
|
|
@@ -11098,65 +11287,65 @@ function XViewScene({
|
|
|
11098
11287
|
setIsLoading(false);
|
|
11099
11288
|
}
|
|
11100
11289
|
}, [viewParams, session, status, check_user_permission]);
|
|
11101
|
-
const sceneConfigId = (0,
|
|
11102
|
-
const ownerId = (0,
|
|
11103
|
-
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)(() => {
|
|
11104
11293
|
if (ownerId && sceneConfigId) {
|
|
11105
11294
|
return `x_view_dbs/${ownerId}/${sceneConfigId}`;
|
|
11106
11295
|
}
|
|
11107
11296
|
return null;
|
|
11108
11297
|
}, [ownerId, sceneConfigId]);
|
|
11109
|
-
const sceneSaveUrl = (0,
|
|
11298
|
+
const sceneSaveUrl = (0, import_react27.useMemo)(() => {
|
|
11110
11299
|
if (ownerId && sceneConfigId) {
|
|
11111
11300
|
return `x_view_scenes/${ownerId}/${sceneConfigId}`;
|
|
11112
11301
|
}
|
|
11113
11302
|
return null;
|
|
11114
11303
|
}, [ownerId, sceneConfigId]);
|
|
11115
|
-
const ancestry_save_url = (0,
|
|
11304
|
+
const ancestry_save_url = (0, import_react27.useMemo)(() => {
|
|
11116
11305
|
if (ownerId && sceneConfigId) {
|
|
11117
11306
|
return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
|
|
11118
11307
|
}
|
|
11119
11308
|
return null;
|
|
11120
11309
|
}, [ownerId, sceneConfigId]);
|
|
11121
|
-
const sceneDataRef = (0,
|
|
11122
|
-
const parentDataRef = (0,
|
|
11123
|
-
const ancestryDataRef = (0,
|
|
11124
|
-
const [isLoading, setIsLoading] = (0,
|
|
11125
|
-
const [permissionStatus, setPermissionStatus] = (0,
|
|
11126
|
-
const [userPermissionRole, setUserPermissionRole] = (0,
|
|
11127
|
-
const [viewMembers, setViewMembers] = (0,
|
|
11128
|
-
const [isInitialized, setIsInitialized] = (0,
|
|
11129
|
-
const [sceneVersion, setSceneVersion] = (0,
|
|
11130
|
-
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)({
|
|
11131
11320
|
visible: false,
|
|
11132
11321
|
x: 0,
|
|
11133
11322
|
y: 0,
|
|
11134
11323
|
nodeData: null
|
|
11135
11324
|
});
|
|
11136
|
-
const [multiContextMenu, setMultiContextMenu] = (0,
|
|
11325
|
+
const [multiContextMenu, setMultiContextMenu] = (0, import_react27.useState)({
|
|
11137
11326
|
visible: false,
|
|
11138
11327
|
x: 0,
|
|
11139
11328
|
y: 0,
|
|
11140
11329
|
nodeIds: null
|
|
11141
11330
|
});
|
|
11142
|
-
const [relationshipMenu, setRelationshipMenu] = (0,
|
|
11331
|
+
const [relationshipMenu, setRelationshipMenu] = (0, import_react27.useState)({
|
|
11143
11332
|
visible: false,
|
|
11144
11333
|
x: 0,
|
|
11145
11334
|
y: 0,
|
|
11146
11335
|
linkObject: null
|
|
11147
11336
|
});
|
|
11148
|
-
const [creationMode, setCreationMode] = (0,
|
|
11337
|
+
const [creationMode, setCreationMode] = (0, import_react27.useState)({
|
|
11149
11338
|
isActive: false,
|
|
11150
11339
|
sourceNodeData: null
|
|
11151
11340
|
});
|
|
11152
|
-
const [versionMode, setVersionMode] = (0,
|
|
11341
|
+
const [versionMode, setVersionMode] = (0, import_react27.useState)({
|
|
11153
11342
|
isActive: false,
|
|
11154
11343
|
sourceNodeData: null
|
|
11155
11344
|
});
|
|
11156
|
-
const [questMode, setQuestMode] = (0,
|
|
11157
|
-
const [hasFocusedInitial, setHasFocusedInitial] = (0,
|
|
11158
|
-
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0,
|
|
11159
|
-
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)({
|
|
11160
11349
|
isActive: false,
|
|
11161
11350
|
tree: null,
|
|
11162
11351
|
selectedParentId: null,
|
|
@@ -11167,41 +11356,41 @@ function XViewScene({
|
|
|
11167
11356
|
ancestryDescriptionSections: [],
|
|
11168
11357
|
isAddingNodes: false
|
|
11169
11358
|
});
|
|
11170
|
-
const [readingMode, setReadingMode] = (0,
|
|
11359
|
+
const [readingMode, setReadingMode] = (0, import_react27.useState)({
|
|
11171
11360
|
isActive: false,
|
|
11172
11361
|
ancestry: null,
|
|
11173
11362
|
branchStack: [],
|
|
11174
11363
|
autoAbstraction: false
|
|
11175
11364
|
});
|
|
11176
|
-
const [formPosition, setFormPosition] = (0,
|
|
11365
|
+
const [formPosition, setFormPosition] = (0, import_react27.useState)({
|
|
11177
11366
|
left: 16,
|
|
11178
11367
|
top: 16,
|
|
11179
11368
|
opacity: 0
|
|
11180
11369
|
});
|
|
11181
|
-
const [detailsNode, setDetailsNode] = (0,
|
|
11182
|
-
const [detailsLink, setDetailsLink] = (0,
|
|
11183
|
-
const [ancestryLinkDetails, setAncestryLinkDetails] = (0,
|
|
11184
|
-
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)({
|
|
11185
11374
|
visible: false,
|
|
11186
11375
|
images: [],
|
|
11187
11376
|
startIndex: 0
|
|
11188
11377
|
});
|
|
11189
|
-
const [editingAncestryRel, setEditingAncestryRel] = (0,
|
|
11378
|
+
const [editingAncestryRel, setEditingAncestryRel] = (0, import_react27.useState)({
|
|
11190
11379
|
visible: false,
|
|
11191
11380
|
data: null,
|
|
11192
11381
|
path: null
|
|
11193
11382
|
});
|
|
11194
|
-
const [isImportModalOpen, setIsImportModalOpen] = (0,
|
|
11195
|
-
const [importSuccessMessage, setImportSuccessMessage] = (0,
|
|
11196
|
-
const [invalidTargetError, setInvalidTargetError] = (0,
|
|
11197
|
-
const [highlightedNodeId, setHighlightedNodeId] = (0,
|
|
11198
|
-
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0,
|
|
11199
|
-
const [ancestryBoardData, setAncestryBoardData] = (0,
|
|
11200
|
-
const [isSidebarOpen, setIsSidebarOpen] = (0,
|
|
11201
|
-
const mountRef = (0,
|
|
11202
|
-
const tooltipRef = (0,
|
|
11203
|
-
const formRef = (0,
|
|
11204
|
-
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)({
|
|
11205
11394
|
readMode: {
|
|
11206
11395
|
currentMaxIndex: 0,
|
|
11207
11396
|
progressMap: {}
|
|
@@ -11265,10 +11454,10 @@ function XViewScene({
|
|
|
11265
11454
|
minWidth: 320,
|
|
11266
11455
|
maxWidth: maxReadPanelW
|
|
11267
11456
|
});
|
|
11268
|
-
(0,
|
|
11457
|
+
(0, import_react27.useEffect)(() => {
|
|
11269
11458
|
stateRef.current.ancestry = ancestryMode;
|
|
11270
11459
|
}, [ancestryMode]);
|
|
11271
|
-
(0,
|
|
11460
|
+
(0, import_react27.useEffect)(() => {
|
|
11272
11461
|
var _a2;
|
|
11273
11462
|
if (!isInitialized) return;
|
|
11274
11463
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -11291,10 +11480,10 @@ function XViewScene({
|
|
|
11291
11480
|
}
|
|
11292
11481
|
stateRef.current.nodeIdToParentFileMap = map;
|
|
11293
11482
|
}, [isInitialized, sceneVersion]);
|
|
11294
|
-
const handleNavigateBack = (0,
|
|
11483
|
+
const handleNavigateBack = (0, import_react27.useCallback)(() => {
|
|
11295
11484
|
router.push("/dashboard/scenes");
|
|
11296
11485
|
}, [router]);
|
|
11297
|
-
const handleConfirmImport = (0,
|
|
11486
|
+
const handleConfirmImport = (0, import_react27.useCallback)(
|
|
11298
11487
|
async (importPayload) => {
|
|
11299
11488
|
var _a2, _b2;
|
|
11300
11489
|
let files = [];
|
|
@@ -11422,7 +11611,7 @@ function XViewScene({
|
|
|
11422
11611
|
const handleOpenImageViewer = (images, startIndex) => {
|
|
11423
11612
|
setImageViewer({ visible: true, images, startIndex });
|
|
11424
11613
|
};
|
|
11425
|
-
const tweenToTarget = (0,
|
|
11614
|
+
const tweenToTarget = (0, import_react27.useCallback)(
|
|
11426
11615
|
(target, zoomFactor = 1, forcedDirection = null) => {
|
|
11427
11616
|
const { camera, controls, tweenGroup } = stateRef.current;
|
|
11428
11617
|
if (!camera || !controls || !tweenGroup) return;
|
|
@@ -11448,7 +11637,7 @@ function XViewScene({
|
|
|
11448
11637
|
if (!t || typeof t.closest !== "function") return false;
|
|
11449
11638
|
return !!t.closest(".ui-overlay");
|
|
11450
11639
|
};
|
|
11451
|
-
const buildFullAncestryTree = (0,
|
|
11640
|
+
const buildFullAncestryTree = (0, import_react27.useCallback)(
|
|
11452
11641
|
(idTree, nodes, ancestries = []) => {
|
|
11453
11642
|
if (!idTree) return null;
|
|
11454
11643
|
const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
|
|
@@ -11533,7 +11722,7 @@ function XViewScene({
|
|
|
11533
11722
|
},
|
|
11534
11723
|
[]
|
|
11535
11724
|
);
|
|
11536
|
-
const handleActivateTimeline = (0,
|
|
11725
|
+
const handleActivateTimeline = (0, import_react27.useCallback)(() => {
|
|
11537
11726
|
const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
11538
11727
|
if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
|
|
11539
11728
|
while (timelineIntervalsGroup.children.length > 0) {
|
|
@@ -11693,7 +11882,7 @@ function XViewScene({
|
|
|
11693
11882
|
}
|
|
11694
11883
|
});
|
|
11695
11884
|
}, []);
|
|
11696
|
-
const handleVersionTimeline = (0,
|
|
11885
|
+
const handleVersionTimeline = (0, import_react27.useCallback)((sourceMesh, versionMeshes) => {
|
|
11697
11886
|
const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
11698
11887
|
if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
|
|
11699
11888
|
return;
|
|
@@ -11830,7 +12019,7 @@ function XViewScene({
|
|
|
11830
12019
|
}
|
|
11831
12020
|
});
|
|
11832
12021
|
}, []);
|
|
11833
|
-
(0,
|
|
12022
|
+
(0, import_react27.useEffect)(() => {
|
|
11834
12023
|
async function fetchAllData(configPath, ownerId2) {
|
|
11835
12024
|
var _a2, _b2;
|
|
11836
12025
|
if (!get_scene_view_data) {
|
|
@@ -11932,12 +12121,12 @@ function XViewScene({
|
|
|
11932
12121
|
focusNodeId,
|
|
11933
12122
|
focusAncestryId
|
|
11934
12123
|
]);
|
|
11935
|
-
const isNodeInView = (0,
|
|
12124
|
+
const isNodeInView = (0, import_react27.useCallback)((id) => {
|
|
11936
12125
|
const key = String(id);
|
|
11937
12126
|
const objs = stateRef.current.nodeObjects || {};
|
|
11938
12127
|
return !!objs[key];
|
|
11939
12128
|
}, []);
|
|
11940
|
-
const addOrUpdateNodeMesh = (0,
|
|
12129
|
+
const addOrUpdateNodeMesh = (0, import_react27.useCallback)(
|
|
11941
12130
|
(nodeData, position, suppressVersionUpdate = false) => {
|
|
11942
12131
|
const {
|
|
11943
12132
|
graphGroup,
|
|
@@ -11977,7 +12166,7 @@ function XViewScene({
|
|
|
11977
12166
|
},
|
|
11978
12167
|
[]
|
|
11979
12168
|
);
|
|
11980
|
-
(0,
|
|
12169
|
+
(0, import_react27.useEffect)(() => {
|
|
11981
12170
|
if (!isInitialized || !sceneDataRef.current) return;
|
|
11982
12171
|
const currentMount = mountRef.current;
|
|
11983
12172
|
if (!currentMount) return;
|
|
@@ -12733,7 +12922,7 @@ function XViewScene({
|
|
|
12733
12922
|
get_scene_view_data,
|
|
12734
12923
|
save_view_data
|
|
12735
12924
|
]);
|
|
12736
|
-
const handleGhostNodeImageChange = (0,
|
|
12925
|
+
const handleGhostNodeImageChange = (0, import_react27.useCallback)((useImage, imageUrl) => {
|
|
12737
12926
|
const {
|
|
12738
12927
|
node: ghostNode,
|
|
12739
12928
|
line: ghostLine,
|
|
@@ -12781,7 +12970,7 @@ function XViewScene({
|
|
|
12781
12970
|
aura: newGhostNode.getObjectByName("aura")
|
|
12782
12971
|
};
|
|
12783
12972
|
}, []);
|
|
12784
|
-
const handleGhostNodeIntensityChange = (0,
|
|
12973
|
+
const handleGhostNodeIntensityChange = (0, import_react27.useCallback)((newIntensity) => {
|
|
12785
12974
|
const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
|
|
12786
12975
|
if (!ghostNode) return;
|
|
12787
12976
|
const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
|
|
@@ -12802,7 +12991,7 @@ function XViewScene({
|
|
|
12802
12991
|
ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
|
|
12803
12992
|
}
|
|
12804
12993
|
}, []);
|
|
12805
|
-
const handleDetailNodeIntensityChange = (0,
|
|
12994
|
+
const handleDetailNodeIntensityChange = (0, import_react27.useCallback)(
|
|
12806
12995
|
(nodeId, newIntensity) => {
|
|
12807
12996
|
const mesh = stateRef.current.nodeObjects[String(nodeId)];
|
|
12808
12997
|
if (!mesh) return;
|
|
@@ -12958,7 +13147,7 @@ function XViewScene({
|
|
|
12958
13147
|
mountRef.current.style.cursor = "default";
|
|
12959
13148
|
}
|
|
12960
13149
|
};
|
|
12961
|
-
const handleAncestryTreeUpdate = (0,
|
|
13150
|
+
const handleAncestryTreeUpdate = (0, import_react27.useCallback)((newTree, extraData = null) => {
|
|
12962
13151
|
setAncestryMode((prev) => {
|
|
12963
13152
|
const prevTreeStr = JSON.stringify(prev.tree);
|
|
12964
13153
|
const newTreeStr = JSON.stringify(newTree);
|
|
@@ -12981,7 +13170,7 @@ function XViewScene({
|
|
|
12981
13170
|
};
|
|
12982
13171
|
});
|
|
12983
13172
|
}, []);
|
|
12984
|
-
const actionHandlerContext = (0,
|
|
13173
|
+
const actionHandlerContext = (0, import_react27.useMemo)(
|
|
12985
13174
|
() => {
|
|
12986
13175
|
var _a2;
|
|
12987
13176
|
return {
|
|
@@ -13042,8 +13231,8 @@ function XViewScene({
|
|
|
13042
13231
|
const handleStartVersioning = (nodeData) => {
|
|
13043
13232
|
userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
|
|
13044
13233
|
};
|
|
13045
|
-
const handleStartQuestQuick = (0,
|
|
13046
|
-
var _a2;
|
|
13234
|
+
const handleStartQuestQuick = (0, import_react27.useCallback)((questNode) => {
|
|
13235
|
+
var _a2, _b2, _c2;
|
|
13047
13236
|
if (!questNode || !actionHandlerContext) return;
|
|
13048
13237
|
const {
|
|
13049
13238
|
labelObject,
|
|
@@ -13054,17 +13243,103 @@ function XViewScene({
|
|
|
13054
13243
|
timelineEndLabel,
|
|
13055
13244
|
...cleanQuestNode
|
|
13056
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
|
+
}];
|
|
13057
13252
|
const updatedNode = {
|
|
13058
13253
|
...cleanQuestNode,
|
|
13059
13254
|
status: "In Progress",
|
|
13060
13255
|
color: "#eab308",
|
|
13061
|
-
assignee_id: (
|
|
13256
|
+
assignee_id: (_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id,
|
|
13257
|
+
timeline: newTimeline
|
|
13062
13258
|
};
|
|
13063
13259
|
if (userActionHandlers.handleSaveNodeDetails) {
|
|
13064
13260
|
userActionHandlers.handleSaveNodeDetails(actionHandlerContext, updatedNode);
|
|
13065
13261
|
}
|
|
13066
13262
|
}, [session, actionHandlerContext]);
|
|
13067
|
-
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)(() => {
|
|
13068
13343
|
const { graphGroup, ghostElements } = stateRef.current;
|
|
13069
13344
|
if (ghostElements.node && graphGroup) {
|
|
13070
13345
|
if (ghostElements.node.userData.labelObject) {
|
|
@@ -13215,7 +13490,7 @@ function XViewScene({
|
|
|
13215
13490
|
}
|
|
13216
13491
|
userActionHandlers.handleCancelConnection(context);
|
|
13217
13492
|
};
|
|
13218
|
-
const handleClearAncestryVisuals = (0,
|
|
13493
|
+
const handleClearAncestryVisuals = (0, import_react27.useCallback)((ancestryId) => {
|
|
13219
13494
|
const { renderedAncestries, ancestryGroup } = stateRef.current;
|
|
13220
13495
|
const renderIndex = renderedAncestries.findIndex(
|
|
13221
13496
|
(a) => String(a.id) === String(ancestryId)
|
|
@@ -13233,7 +13508,7 @@ function XViewScene({
|
|
|
13233
13508
|
);
|
|
13234
13509
|
}
|
|
13235
13510
|
}, []);
|
|
13236
|
-
const handleRenderAncestry = (0,
|
|
13511
|
+
const handleRenderAncestry = (0, import_react27.useCallback)(
|
|
13237
13512
|
async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
|
|
13238
13513
|
setContextMenu(
|
|
13239
13514
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -13727,7 +14002,7 @@ function XViewScene({
|
|
|
13727
14002
|
ancestryMode.isActive
|
|
13728
14003
|
]
|
|
13729
14004
|
);
|
|
13730
|
-
const handleRenderAbstractionTree = (0,
|
|
14005
|
+
const handleRenderAbstractionTree = (0, import_react27.useCallback)(
|
|
13731
14006
|
(ancestryObject, targetNodeId = null) => {
|
|
13732
14007
|
setContextMenu(
|
|
13733
14008
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -13815,7 +14090,7 @@ function XViewScene({
|
|
|
13815
14090
|
handleClearAncestryVisuals
|
|
13816
14091
|
]
|
|
13817
14092
|
);
|
|
13818
|
-
const handleReadModeBranchNav = (0,
|
|
14093
|
+
const handleReadModeBranchNav = (0, import_react27.useCallback)(
|
|
13819
14094
|
(nodeId, action, direction = "right") => {
|
|
13820
14095
|
const { ancestry, branchStack } = readingMode;
|
|
13821
14096
|
if (!ancestry || !ancestry.tree) return;
|
|
@@ -13993,13 +14268,13 @@ function XViewScene({
|
|
|
13993
14268
|
},
|
|
13994
14269
|
[readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
|
|
13995
14270
|
);
|
|
13996
|
-
const handleReadModeHighlight = (0,
|
|
14271
|
+
const handleReadModeHighlight = (0, import_react27.useCallback)((nodeId) => {
|
|
13997
14272
|
if (stateRef.current.highlightedNodeId !== nodeId) {
|
|
13998
14273
|
stateRef.current.highlightedNodeId = nodeId;
|
|
13999
14274
|
}
|
|
14000
14275
|
setHighlightedNodeId(nodeId);
|
|
14001
14276
|
}, []);
|
|
14002
|
-
const activeNodeBranches = (0,
|
|
14277
|
+
const activeNodeBranches = (0, import_react27.useMemo)(() => {
|
|
14003
14278
|
if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
|
|
14004
14279
|
return null;
|
|
14005
14280
|
const fullTree = buildFullAncestryTree(
|
|
@@ -14043,7 +14318,7 @@ function XViewScene({
|
|
|
14043
14318
|
readingMode.branchStack,
|
|
14044
14319
|
ancestryDataRef.current
|
|
14045
14320
|
]);
|
|
14046
|
-
const backNavigationInfo = (0,
|
|
14321
|
+
const backNavigationInfo = (0, import_react27.useMemo)(() => {
|
|
14047
14322
|
const { branchStack } = readingMode;
|
|
14048
14323
|
if (!branchStack || branchStack.length === 0) return null;
|
|
14049
14324
|
const lastStep = branchStack[branchStack.length - 1];
|
|
@@ -14054,7 +14329,7 @@ function XViewScene({
|
|
|
14054
14329
|
name: "Voltar para anterior"
|
|
14055
14330
|
};
|
|
14056
14331
|
}, [readingMode.branchStack]);
|
|
14057
|
-
const getReadModeDisplayContext = (0,
|
|
14332
|
+
const getReadModeDisplayContext = (0, import_react27.useMemo)(() => {
|
|
14058
14333
|
const { ancestry, branchStack } = readingMode;
|
|
14059
14334
|
if (!ancestry) return null;
|
|
14060
14335
|
if (branchStack.length === 0) {
|
|
@@ -14097,7 +14372,7 @@ function XViewScene({
|
|
|
14097
14372
|
customProperties: branchProps
|
|
14098
14373
|
};
|
|
14099
14374
|
}, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
|
|
14100
|
-
const readModeAbstractionTree = (0,
|
|
14375
|
+
const readModeAbstractionTree = (0, import_react27.useMemo)(() => {
|
|
14101
14376
|
if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
|
|
14102
14377
|
return null;
|
|
14103
14378
|
}
|
|
@@ -14116,7 +14391,7 @@ function XViewScene({
|
|
|
14116
14391
|
buildFullAncestryTree,
|
|
14117
14392
|
sceneVersion
|
|
14118
14393
|
]);
|
|
14119
|
-
const handleStartReadingAncestry = (0,
|
|
14394
|
+
const handleStartReadingAncestry = (0, import_react27.useCallback)(
|
|
14120
14395
|
async (ancestryObject, renderMode = "full") => {
|
|
14121
14396
|
setContextMenu(
|
|
14122
14397
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14159,7 +14434,7 @@ function XViewScene({
|
|
|
14159
14434
|
},
|
|
14160
14435
|
[handleRenderAncestry, handleRenderAbstractionTree]
|
|
14161
14436
|
);
|
|
14162
|
-
const handleReadModeSectionChange = (0,
|
|
14437
|
+
const handleReadModeSectionChange = (0, import_react27.useCallback)(
|
|
14163
14438
|
(activeSectionId) => {
|
|
14164
14439
|
const { ancestry, branchStack } = readingMode;
|
|
14165
14440
|
if (!ancestry || !readingMode.isActive) return;
|
|
@@ -14244,10 +14519,10 @@ function XViewScene({
|
|
|
14244
14519
|
ancestryDataRef.current
|
|
14245
14520
|
]
|
|
14246
14521
|
);
|
|
14247
|
-
const handleCloseReadMode = (0,
|
|
14522
|
+
const handleCloseReadMode = (0, import_react27.useCallback)(() => {
|
|
14248
14523
|
setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
|
|
14249
14524
|
}, []);
|
|
14250
|
-
const handleAncestrySectionChange = (0,
|
|
14525
|
+
const handleAncestrySectionChange = (0, import_react27.useCallback)(
|
|
14251
14526
|
(activeSectionId, ancestryOverride = null, rotation = 0) => {
|
|
14252
14527
|
var _a2, _b2;
|
|
14253
14528
|
const currentMode = stateRef.current.ancestry;
|
|
@@ -14309,7 +14584,7 @@ function XViewScene({
|
|
|
14309
14584
|
},
|
|
14310
14585
|
[handleRenderAncestry]
|
|
14311
14586
|
);
|
|
14312
|
-
const handleEditAncestry = (0,
|
|
14587
|
+
const handleEditAncestry = (0, import_react27.useCallback)(
|
|
14313
14588
|
async (ancestryObject) => {
|
|
14314
14589
|
setContextMenu(
|
|
14315
14590
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14364,7 +14639,7 @@ function XViewScene({
|
|
|
14364
14639
|
const handleSelectAncestryParent = (nodeId) => {
|
|
14365
14640
|
setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
|
|
14366
14641
|
};
|
|
14367
|
-
const handleRemoveFromAncestry = (0,
|
|
14642
|
+
const handleRemoveFromAncestry = (0, import_react27.useCallback)((pathToRemove) => {
|
|
14368
14643
|
if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
|
|
14369
14644
|
console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
|
|
14370
14645
|
return;
|
|
@@ -14389,7 +14664,7 @@ function XViewScene({
|
|
|
14389
14664
|
return { ...prev, tree: newTree };
|
|
14390
14665
|
});
|
|
14391
14666
|
}, []);
|
|
14392
|
-
const handleSaveAncestry = (0,
|
|
14667
|
+
const handleSaveAncestry = (0, import_react27.useCallback)(
|
|
14393
14668
|
async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
|
|
14394
14669
|
const treeToUse = treeOverride || ancestryMode.tree;
|
|
14395
14670
|
const { isEditMode, currentAncestryId } = ancestryMode;
|
|
@@ -14625,7 +14900,7 @@ function XViewScene({
|
|
|
14625
14900
|
});
|
|
14626
14901
|
setEditingAncestryRel({ visible: false, data: null, path: null });
|
|
14627
14902
|
};
|
|
14628
|
-
const handleDeleteAncestry = (0,
|
|
14903
|
+
const handleDeleteAncestry = (0, import_react27.useCallback)(
|
|
14629
14904
|
async (ancestryIdToDelete) => {
|
|
14630
14905
|
if (!ancestryIdToDelete) {
|
|
14631
14906
|
alert("ID da ancestralidade n\xE3o encontrado.");
|
|
@@ -14707,10 +14982,10 @@ function XViewScene({
|
|
|
14707
14982
|
},
|
|
14708
14983
|
[save_view_data, delete_file_action]
|
|
14709
14984
|
);
|
|
14710
|
-
const handleOpenAncestryBoard = (0,
|
|
14985
|
+
const handleOpenAncestryBoard = (0, import_react27.useCallback)(() => {
|
|
14711
14986
|
setIsAncestryBoardOpen(true);
|
|
14712
14987
|
}, []);
|
|
14713
|
-
const handleSelectAncestryFromBoard = (0,
|
|
14988
|
+
const handleSelectAncestryFromBoard = (0, import_react27.useCallback)(
|
|
14714
14989
|
(ancestry) => {
|
|
14715
14990
|
setIsAncestryBoardOpen(false);
|
|
14716
14991
|
setIsSidebarOpen(false);
|
|
@@ -14718,7 +14993,7 @@ function XViewScene({
|
|
|
14718
14993
|
},
|
|
14719
14994
|
[handleStartReadingAncestry]
|
|
14720
14995
|
);
|
|
14721
|
-
const handleSaveAncestryBoard = (0,
|
|
14996
|
+
const handleSaveAncestryBoard = (0, import_react27.useCallback)(
|
|
14722
14997
|
async (groups) => {
|
|
14723
14998
|
if (!sceneConfigId || !viewParams || !session) return;
|
|
14724
14999
|
const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
|
|
@@ -14732,7 +15007,7 @@ function XViewScene({
|
|
|
14732
15007
|
},
|
|
14733
15008
|
[sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
|
|
14734
15009
|
);
|
|
14735
|
-
const existingNodeTypes = (0,
|
|
15010
|
+
const existingNodeTypes = (0, import_react27.useMemo)(() => {
|
|
14736
15011
|
if (!parentDataRef.current) {
|
|
14737
15012
|
return [];
|
|
14738
15013
|
}
|
|
@@ -14744,7 +15019,7 @@ function XViewScene({
|
|
|
14744
15019
|
).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
|
|
14745
15020
|
return [...new Set(allTypes)];
|
|
14746
15021
|
}, [parentDataRef.current, sceneVersion]);
|
|
14747
|
-
const searchableDbNodes = (0,
|
|
15022
|
+
const searchableDbNodes = (0, import_react27.useMemo)(() => {
|
|
14748
15023
|
if (!parentDataRef.current) {
|
|
14749
15024
|
return [];
|
|
14750
15025
|
}
|
|
@@ -14759,7 +15034,7 @@ function XViewScene({
|
|
|
14759
15034
|
return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
|
|
14760
15035
|
});
|
|
14761
15036
|
}, [parentDataRef.current, sceneVersion]);
|
|
14762
|
-
const handleAddExistingNode = (0,
|
|
15037
|
+
const handleAddExistingNode = (0, import_react27.useCallback)(
|
|
14763
15038
|
(nodeId) => {
|
|
14764
15039
|
return userActionHandlers.handleAddExistingNodeById(
|
|
14765
15040
|
actionHandlerContext,
|
|
@@ -14768,7 +15043,7 @@ function XViewScene({
|
|
|
14768
15043
|
},
|
|
14769
15044
|
[actionHandlerContext]
|
|
14770
15045
|
);
|
|
14771
|
-
const handleSaveCurrentView = (0,
|
|
15046
|
+
const handleSaveCurrentView = (0, import_react27.useCallback)(async () => {
|
|
14772
15047
|
var _a2, _b2, _c2;
|
|
14773
15048
|
const { nodeObjects, allLinks } = stateRef.current;
|
|
14774
15049
|
if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
|
|
@@ -14809,16 +15084,16 @@ function XViewScene({
|
|
|
14809
15084
|
console.error("Erro na chamada de save_view_data:", error);
|
|
14810
15085
|
}
|
|
14811
15086
|
}, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
|
|
14812
|
-
const allAvailableNodes = (0,
|
|
15087
|
+
const allAvailableNodes = (0, import_react27.useMemo)(() => {
|
|
14813
15088
|
if (!parentDataRef.current) return [];
|
|
14814
15089
|
return Object.values(parentDataRef.current).flatMap(
|
|
14815
15090
|
(fileData) => fileData.nodes || []
|
|
14816
15091
|
);
|
|
14817
15092
|
}, [sceneVersion, isInitialized]);
|
|
14818
|
-
const allAvailableAncestries = (0,
|
|
15093
|
+
const allAvailableAncestries = (0, import_react27.useMemo)(() => {
|
|
14819
15094
|
return ancestryDataRef.current || [];
|
|
14820
15095
|
}, [sceneVersion, isInitialized]);
|
|
14821
|
-
const handleOpenReference = (0,
|
|
15096
|
+
const handleOpenReference = (0, import_react27.useCallback)(
|
|
14822
15097
|
(referenceData) => {
|
|
14823
15098
|
const { type, id } = referenceData;
|
|
14824
15099
|
if (type === "node") {
|
|
@@ -14857,13 +15132,13 @@ function XViewScene({
|
|
|
14857
15132
|
tweenToTarget
|
|
14858
15133
|
]
|
|
14859
15134
|
);
|
|
14860
|
-
const handleToggleAncestryAddMode = (0,
|
|
15135
|
+
const handleToggleAncestryAddMode = (0, import_react27.useCallback)(() => {
|
|
14861
15136
|
setAncestryMode((prev) => ({
|
|
14862
15137
|
...prev,
|
|
14863
15138
|
isAddingNodes: !prev.isAddingNodes
|
|
14864
15139
|
}));
|
|
14865
15140
|
}, []);
|
|
14866
|
-
const handleFocusNode = (0,
|
|
15141
|
+
const handleFocusNode = (0, import_react27.useCallback)(
|
|
14867
15142
|
(nodeData) => {
|
|
14868
15143
|
if (!nodeData) return;
|
|
14869
15144
|
const nodeMesh = stateRef.current.nodeObjects[String(nodeData.id)];
|
|
@@ -14873,7 +15148,7 @@ function XViewScene({
|
|
|
14873
15148
|
},
|
|
14874
15149
|
[tweenToTarget]
|
|
14875
15150
|
);
|
|
14876
|
-
const availableDatasets = (0,
|
|
15151
|
+
const availableDatasets = (0, import_react27.useMemo)(() => {
|
|
14877
15152
|
if (!sceneDataRef.current || !parentDataRef.current) return [];
|
|
14878
15153
|
return sceneDataRef.current.parent_dbs.map((db) => {
|
|
14879
15154
|
var _a2;
|
|
@@ -14887,7 +15162,7 @@ function XViewScene({
|
|
|
14887
15162
|
String(creationMode.sourceNodeData.id)
|
|
14888
15163
|
)) == null ? void 0 : _b.parentFileId : null;
|
|
14889
15164
|
const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
|
|
14890
|
-
(0,
|
|
15165
|
+
(0, import_react27.useEffect)(() => {
|
|
14891
15166
|
if (isInitialized && focusNodeId && !hasFocusedInitial) {
|
|
14892
15167
|
const nodeObjects = stateRef.current.nodeObjects || {};
|
|
14893
15168
|
const targetMesh = nodeObjects[String(focusNodeId)];
|
|
@@ -14910,7 +15185,7 @@ function XViewScene({
|
|
|
14910
15185
|
hasFocusedInitial,
|
|
14911
15186
|
tweenToTarget
|
|
14912
15187
|
]);
|
|
14913
|
-
(0,
|
|
15188
|
+
(0, import_react27.useEffect)(() => {
|
|
14914
15189
|
if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
|
|
14915
15190
|
const ancestries = ancestryDataRef.current || [];
|
|
14916
15191
|
const targetAncestry = ancestries.find(
|
|
@@ -14935,7 +15210,7 @@ function XViewScene({
|
|
|
14935
15210
|
hasOpenedInitialAncestry,
|
|
14936
15211
|
handleStartReadingAncestry
|
|
14937
15212
|
]);
|
|
14938
|
-
(0,
|
|
15213
|
+
(0, import_react27.useEffect)(() => {
|
|
14939
15214
|
function handleKeyDown(event) {
|
|
14940
15215
|
var _a2, _b2, _c2;
|
|
14941
15216
|
const context = actionHandlerContext;
|
|
@@ -15058,10 +15333,10 @@ function XViewScene({
|
|
|
15058
15333
|
// <-- handleCancelQuest adicionado aqui
|
|
15059
15334
|
]);
|
|
15060
15335
|
if (isLoading || status === "loading" || permissionStatus === "loading") {
|
|
15061
|
-
return /* @__PURE__ */
|
|
15336
|
+
return /* @__PURE__ */ import_react27.default.createElement(LoadingScreen, null);
|
|
15062
15337
|
}
|
|
15063
15338
|
if (permissionStatus === "denied") {
|
|
15064
|
-
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(
|
|
15065
15340
|
"svg",
|
|
15066
15341
|
{
|
|
15067
15342
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -15071,7 +15346,7 @@ function XViewScene({
|
|
|
15071
15346
|
stroke: "currentColor",
|
|
15072
15347
|
className: "w-16 h-16 mx-auto"
|
|
15073
15348
|
},
|
|
15074
|
-
/* @__PURE__ */
|
|
15349
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15075
15350
|
"path",
|
|
15076
15351
|
{
|
|
15077
15352
|
strokeLinecap: "round",
|
|
@@ -15079,13 +15354,13 @@ function XViewScene({
|
|
|
15079
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"
|
|
15080
15355
|
}
|
|
15081
15356
|
)
|
|
15082
|
-
)), /* @__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(
|
|
15083
15358
|
"button",
|
|
15084
15359
|
{
|
|
15085
15360
|
onClick: () => router.push("/dashboard/scenes"),
|
|
15086
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"
|
|
15087
15362
|
},
|
|
15088
|
-
/* @__PURE__ */
|
|
15363
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15089
15364
|
"svg",
|
|
15090
15365
|
{
|
|
15091
15366
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -15095,7 +15370,7 @@ function XViewScene({
|
|
|
15095
15370
|
stroke: "currentColor",
|
|
15096
15371
|
className: "w-5 h-5"
|
|
15097
15372
|
},
|
|
15098
|
-
/* @__PURE__ */
|
|
15373
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15099
15374
|
"path",
|
|
15100
15375
|
{
|
|
15101
15376
|
strokeLinecap: "round",
|
|
@@ -15107,7 +15382,7 @@ function XViewScene({
|
|
|
15107
15382
|
"Voltar para Scenes"
|
|
15108
15383
|
)));
|
|
15109
15384
|
}
|
|
15110
|
-
return /* @__PURE__ */
|
|
15385
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
15111
15386
|
"div",
|
|
15112
15387
|
{
|
|
15113
15388
|
ref: mountRef,
|
|
@@ -15119,7 +15394,7 @@ function XViewScene({
|
|
|
15119
15394
|
cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
|
|
15120
15395
|
}
|
|
15121
15396
|
},
|
|
15122
|
-
userPermissionRole !== "link_viewer" && /* @__PURE__ */
|
|
15397
|
+
userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react27.default.createElement(
|
|
15123
15398
|
XViewSidebar,
|
|
15124
15399
|
{
|
|
15125
15400
|
dbNodes: searchableDbNodes,
|
|
@@ -15139,7 +15414,7 @@ function XViewScene({
|
|
|
15139
15414
|
userRole: userPermissionRole
|
|
15140
15415
|
}
|
|
15141
15416
|
),
|
|
15142
|
-
creationMode.isActive && /* @__PURE__ */
|
|
15417
|
+
creationMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
|
|
15143
15418
|
InSceneCreationForm,
|
|
15144
15419
|
{
|
|
15145
15420
|
onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
|
|
@@ -15171,7 +15446,7 @@ function XViewScene({
|
|
|
15171
15446
|
availableAncestries: allAvailableAncestries
|
|
15172
15447
|
}
|
|
15173
15448
|
),
|
|
15174
|
-
versionMode.isActive && /* @__PURE__ */
|
|
15449
|
+
versionMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
|
|
15175
15450
|
InSceneVersionForm,
|
|
15176
15451
|
{
|
|
15177
15452
|
onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
|
|
@@ -15197,7 +15472,7 @@ function XViewScene({
|
|
|
15197
15472
|
availableAncestries: allAvailableAncestries
|
|
15198
15473
|
}
|
|
15199
15474
|
),
|
|
15200
|
-
questMode.isActive && /* @__PURE__ */
|
|
15475
|
+
questMode.isActive && /* @__PURE__ */ import_react27.default.createElement(
|
|
15201
15476
|
InSceneQuestForm,
|
|
15202
15477
|
{
|
|
15203
15478
|
onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
|
|
@@ -15223,7 +15498,7 @@ function XViewScene({
|
|
|
15223
15498
|
viewMembers
|
|
15224
15499
|
}
|
|
15225
15500
|
),
|
|
15226
|
-
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */
|
|
15501
|
+
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react27.default.createElement(
|
|
15227
15502
|
"div",
|
|
15228
15503
|
{
|
|
15229
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"}`,
|
|
@@ -15236,7 +15511,7 @@ function XViewScene({
|
|
|
15236
15511
|
maxWidth: "92vw"
|
|
15237
15512
|
}
|
|
15238
15513
|
},
|
|
15239
|
-
/* @__PURE__ */
|
|
15514
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15240
15515
|
"div",
|
|
15241
15516
|
{
|
|
15242
15517
|
onPointerDown: (e) => {
|
|
@@ -15247,7 +15522,7 @@ function XViewScene({
|
|
|
15247
15522
|
title: "Arraste para redimensionar"
|
|
15248
15523
|
}
|
|
15249
15524
|
),
|
|
15250
|
-
/* @__PURE__ */
|
|
15525
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15251
15526
|
DescriptionReadModePanel,
|
|
15252
15527
|
{
|
|
15253
15528
|
key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
|
|
@@ -15282,7 +15557,7 @@ function XViewScene({
|
|
|
15282
15557
|
}
|
|
15283
15558
|
)
|
|
15284
15559
|
),
|
|
15285
|
-
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */
|
|
15560
|
+
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react27.default.createElement(
|
|
15286
15561
|
CreateAncestryPanel,
|
|
15287
15562
|
{
|
|
15288
15563
|
ancestryMode,
|
|
@@ -15318,7 +15593,7 @@ function XViewScene({
|
|
|
15318
15593
|
onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
|
|
15319
15594
|
}
|
|
15320
15595
|
),
|
|
15321
|
-
editingAncestryRel.visible && /* @__PURE__ */
|
|
15596
|
+
editingAncestryRel.visible && /* @__PURE__ */ import_react27.default.createElement(
|
|
15322
15597
|
AncestryRelationshipPanel,
|
|
15323
15598
|
{
|
|
15324
15599
|
data: editingAncestryRel.data,
|
|
@@ -15332,7 +15607,7 @@ function XViewScene({
|
|
|
15332
15607
|
onUploadFile: upload_file_action
|
|
15333
15608
|
}
|
|
15334
15609
|
),
|
|
15335
|
-
detailsNode && detailsNode.is_quest && /* @__PURE__ */
|
|
15610
|
+
detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
|
|
15336
15611
|
QuestDetailsPanel,
|
|
15337
15612
|
{
|
|
15338
15613
|
node: detailsNode,
|
|
@@ -15354,7 +15629,7 @@ function XViewScene({
|
|
|
15354
15629
|
viewMembers
|
|
15355
15630
|
}
|
|
15356
15631
|
),
|
|
15357
|
-
detailsNode && !detailsNode.is_quest && /* @__PURE__ */
|
|
15632
|
+
detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
|
|
15358
15633
|
NodeDetailsPanel,
|
|
15359
15634
|
{
|
|
15360
15635
|
node: detailsNode,
|
|
@@ -15386,7 +15661,7 @@ function XViewScene({
|
|
|
15386
15661
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
|
|
15387
15662
|
}
|
|
15388
15663
|
),
|
|
15389
|
-
detailsLink && /* @__PURE__ */
|
|
15664
|
+
detailsLink && /* @__PURE__ */ import_react27.default.createElement(
|
|
15390
15665
|
RelationshipDetailsPanel,
|
|
15391
15666
|
{
|
|
15392
15667
|
link: detailsLink,
|
|
@@ -15400,7 +15675,7 @@ function XViewScene({
|
|
|
15400
15675
|
userRole: userPermissionRole
|
|
15401
15676
|
}
|
|
15402
15677
|
),
|
|
15403
|
-
ancestryLinkDetails && /* @__PURE__ */
|
|
15678
|
+
ancestryLinkDetails && /* @__PURE__ */ import_react27.default.createElement(
|
|
15404
15679
|
AncestryLinkDetailsPanel,
|
|
15405
15680
|
{
|
|
15406
15681
|
data: ancestryLinkDetails,
|
|
@@ -15411,7 +15686,7 @@ function XViewScene({
|
|
|
15411
15686
|
onUploadFile: upload_file_action
|
|
15412
15687
|
}
|
|
15413
15688
|
),
|
|
15414
|
-
/* @__PURE__ */
|
|
15689
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15415
15690
|
"div",
|
|
15416
15691
|
{
|
|
15417
15692
|
ref: tooltipRef,
|
|
@@ -15438,7 +15713,7 @@ function XViewScene({
|
|
|
15438
15713
|
}
|
|
15439
15714
|
}
|
|
15440
15715
|
),
|
|
15441
|
-
/* @__PURE__ */
|
|
15716
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15442
15717
|
ContextMenu,
|
|
15443
15718
|
{
|
|
15444
15719
|
data: contextMenu,
|
|
@@ -15467,10 +15742,11 @@ function XViewScene({
|
|
|
15467
15742
|
onFocusNode: handleFocusNode,
|
|
15468
15743
|
viewMembers,
|
|
15469
15744
|
currentUser: session == null ? void 0 : session.user,
|
|
15470
|
-
onStartQuest: handleStartQuestQuick
|
|
15745
|
+
onStartQuest: handleStartQuestQuick,
|
|
15746
|
+
onFinishQuest: handleFinishQuestQuick
|
|
15471
15747
|
}
|
|
15472
15748
|
),
|
|
15473
|
-
/* @__PURE__ */
|
|
15749
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15474
15750
|
MultiNodeContextMenu,
|
|
15475
15751
|
{
|
|
15476
15752
|
data: multiContextMenu,
|
|
@@ -15490,7 +15766,7 @@ function XViewScene({
|
|
|
15490
15766
|
)
|
|
15491
15767
|
}
|
|
15492
15768
|
),
|
|
15493
|
-
/* @__PURE__ */
|
|
15769
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15494
15770
|
RelationshipContextMenu,
|
|
15495
15771
|
{
|
|
15496
15772
|
data: relationshipMenu,
|
|
@@ -15508,14 +15784,14 @@ function XViewScene({
|
|
|
15508
15784
|
onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
|
|
15509
15785
|
}
|
|
15510
15786
|
),
|
|
15511
|
-
/* @__PURE__ */
|
|
15787
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15512
15788
|
ImageViewer,
|
|
15513
15789
|
{
|
|
15514
15790
|
data: imageViewer,
|
|
15515
15791
|
onClose: () => setImageViewer({ ...imageViewer, visible: false })
|
|
15516
15792
|
}
|
|
15517
15793
|
),
|
|
15518
|
-
/* @__PURE__ */
|
|
15794
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15519
15795
|
AncestryBoard,
|
|
15520
15796
|
{
|
|
15521
15797
|
isOpen: isAncestryBoardOpen,
|
|
@@ -15528,7 +15804,7 @@ function XViewScene({
|
|
|
15528
15804
|
userRole: userPermissionRole
|
|
15529
15805
|
}
|
|
15530
15806
|
),
|
|
15531
|
-
/* @__PURE__ */
|
|
15807
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15532
15808
|
ImportParentFileModal,
|
|
15533
15809
|
{
|
|
15534
15810
|
isOpen: isImportModalOpen,
|
|
@@ -15541,7 +15817,7 @@ function XViewScene({
|
|
|
15541
15817
|
currentAncestries: ancestryDataRef.current || []
|
|
15542
15818
|
}
|
|
15543
15819
|
),
|
|
15544
|
-
invalidTargetError && /* @__PURE__ */
|
|
15820
|
+
invalidTargetError && /* @__PURE__ */ import_react27.default.createElement(
|
|
15545
15821
|
"div",
|
|
15546
15822
|
{
|
|
15547
15823
|
className: "ui-overlay",
|
|
@@ -15566,13 +15842,13 @@ function XViewScene({
|
|
|
15566
15842
|
animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
|
|
15567
15843
|
}
|
|
15568
15844
|
},
|
|
15569
|
-
/* @__PURE__ */
|
|
15845
|
+
/* @__PURE__ */ import_react27.default.createElement("style", null, `
|
|
15570
15846
|
@keyframes fadeInDown {
|
|
15571
15847
|
from { opacity: 0; transform: translate(-50%, -20px); }
|
|
15572
15848
|
to { opacity: 1; transform: translate(-50%, 0); }
|
|
15573
15849
|
}
|
|
15574
15850
|
`),
|
|
15575
|
-
/* @__PURE__ */
|
|
15851
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15576
15852
|
"svg",
|
|
15577
15853
|
{
|
|
15578
15854
|
width: "20",
|
|
@@ -15584,12 +15860,12 @@ function XViewScene({
|
|
|
15584
15860
|
strokeLinecap: "round",
|
|
15585
15861
|
strokeLinejoin: "round"
|
|
15586
15862
|
},
|
|
15587
|
-
/* @__PURE__ */
|
|
15588
|
-
/* @__PURE__ */
|
|
15589
|
-
/* @__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" })
|
|
15590
15866
|
),
|
|
15591
|
-
/* @__PURE__ */
|
|
15592
|
-
/* @__PURE__ */
|
|
15867
|
+
/* @__PURE__ */ import_react27.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
|
|
15868
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
15593
15869
|
"button",
|
|
15594
15870
|
{
|
|
15595
15871
|
onClick: () => setInvalidTargetError(null),
|