@lv-x-software-house/x_view 1.2.5-dev.29 → 1.2.5-dev.30
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 +581 -450
- package/dist/index.mjs +524 -381
- 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_react28 = __toESM(require("react"));
|
|
48
48
|
var import_navigation = require("next/navigation");
|
|
49
|
-
var
|
|
49
|
+
var import_react29 = 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");
|
|
@@ -3651,11 +3651,32 @@ function useResizablePanel({ initialWidth, minWidth, maxWidth }) {
|
|
|
3651
3651
|
);
|
|
3652
3652
|
return { width, isResizing, handlePointerDown, setWidth };
|
|
3653
3653
|
}
|
|
3654
|
+
function createTimelineEntry(actorId, description, type = "comment", extras = {}) {
|
|
3655
|
+
const { links = [], images = [], metadata = {} } = extras;
|
|
3656
|
+
return {
|
|
3657
|
+
id: v4_default(),
|
|
3658
|
+
type,
|
|
3659
|
+
timestamp: Date.now(),
|
|
3660
|
+
actorId,
|
|
3661
|
+
description,
|
|
3662
|
+
links: links.map((l) => ({
|
|
3663
|
+
id: l.id || v4_default(),
|
|
3664
|
+
name: l.name || "",
|
|
3665
|
+
value: l.value || ""
|
|
3666
|
+
})),
|
|
3667
|
+
images: images.map((img) => ({
|
|
3668
|
+
id: img.id || v4_default(),
|
|
3669
|
+
name: img.name || "",
|
|
3670
|
+
value: img.value || ""
|
|
3671
|
+
})),
|
|
3672
|
+
metadata
|
|
3673
|
+
};
|
|
3674
|
+
}
|
|
3654
3675
|
|
|
3655
3676
|
// src/components/CustomPropertyDisplay.jsx
|
|
3656
3677
|
var import_react4 = __toESM(require("react"));
|
|
3657
3678
|
var import_fi2 = require("react-icons/fi");
|
|
3658
|
-
function
|
|
3679
|
+
function CustomPropertyDisplay2({
|
|
3659
3680
|
prop,
|
|
3660
3681
|
onUpdate,
|
|
3661
3682
|
onRemove,
|
|
@@ -4426,7 +4447,7 @@ var normalizeText = (text) => {
|
|
|
4426
4447
|
if (!text) return "";
|
|
4427
4448
|
return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
|
4428
4449
|
};
|
|
4429
|
-
function
|
|
4450
|
+
function DescriptionEditModal2({
|
|
4430
4451
|
isOpen,
|
|
4431
4452
|
title,
|
|
4432
4453
|
initialValue,
|
|
@@ -5110,7 +5131,7 @@ var formatLineContent2 = (line, availableNodes, onMentionClick, activeMentionInd
|
|
|
5110
5131
|
}
|
|
5111
5132
|
return /* @__PURE__ */ import_react7.default.createElement("span", { className: "break-words" }, processContent(line));
|
|
5112
5133
|
};
|
|
5113
|
-
function
|
|
5134
|
+
function DescriptionDisplay2({
|
|
5114
5135
|
description,
|
|
5115
5136
|
savedSections,
|
|
5116
5137
|
availableNodes = [],
|
|
@@ -5651,7 +5672,7 @@ function DescriptionReadModePanel({
|
|
|
5651
5672
|
targetRenderNodeId
|
|
5652
5673
|
}
|
|
5653
5674
|
))) : showProperties ? /* @__PURE__ */ import_react8.default.createElement("div", { className: "space-y-4 animate-in fade-in slide-in-from-bottom-2 duration-300" }, customProperties.map((prop) => /* @__PURE__ */ import_react8.default.createElement(
|
|
5654
|
-
|
|
5675
|
+
CustomPropertyDisplay2,
|
|
5655
5676
|
{
|
|
5656
5677
|
key: prop.id,
|
|
5657
5678
|
prop,
|
|
@@ -5663,7 +5684,7 @@ function DescriptionReadModePanel({
|
|
|
5663
5684
|
onOpenImageViewer: null
|
|
5664
5685
|
}
|
|
5665
5686
|
))) : /* @__PURE__ */ import_react8.default.createElement(
|
|
5666
|
-
|
|
5687
|
+
DescriptionDisplay2,
|
|
5667
5688
|
{
|
|
5668
5689
|
description,
|
|
5669
5690
|
savedSections,
|
|
@@ -5812,7 +5833,7 @@ function AncestryRelationshipPanel({
|
|
|
5812
5833
|
onSaveDescription: handleSaveDescriptionInline
|
|
5813
5834
|
}
|
|
5814
5835
|
) : /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-cyan-400/0 via-cyan-400/70 to-cyan-400/0" }), /* @__PURE__ */ import_react9.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react9.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-cyan-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react9.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o de Ancestralidade")), /* @__PURE__ */ import_react9.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Editar Rela\xE7\xE3o")), /* @__PURE__ */ import_react9.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_react9.default.createElement("div", { className: "px-6 pb-4 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react9.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o da Rela\xE7\xE3o"), /* @__PURE__ */ import_react9.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_react9.default.createElement(
|
|
5815
|
-
|
|
5836
|
+
DescriptionDisplay2,
|
|
5816
5837
|
{
|
|
5817
5838
|
description,
|
|
5818
5839
|
savedSections: existingSections,
|
|
@@ -5849,7 +5870,7 @@ function AncestryRelationshipPanel({
|
|
|
5849
5870
|
},
|
|
5850
5871
|
"Adicionar descri\xE7\xE3o..."
|
|
5851
5872
|
)), /* @__PURE__ */ import_react9.default.createElement("p", { className: "text-xs text-slate-400 italic" }, "Esta descri\xE7\xE3o aparecer\xE1 ao passar o mouse sobre a linha de conex\xE3o na cena 3D.")), /* @__PURE__ */ import_react9.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react9.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react9.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_react9.default.createElement(import_fi7.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex flex-col gap-3 p-3 rounded-lg bg-black/20 border border-white/5" }, customProps.length === 0 && /* @__PURE__ */ import_react9.default.createElement("p", { className: "text-center text-sm text-slate-400 py-4" }, "Nenhuma propriedade adicional."), customProps.map((prop, idx) => /* @__PURE__ */ import_react9.default.createElement(
|
|
5852
|
-
|
|
5873
|
+
CustomPropertyDisplay2,
|
|
5853
5874
|
{
|
|
5854
5875
|
key: prop.id,
|
|
5855
5876
|
prop,
|
|
@@ -5862,7 +5883,7 @@ function AncestryRelationshipPanel({
|
|
|
5862
5883
|
)), /* @__PURE__ */ import_react9.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react9.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_react9.default.createElement("button", { onClick: onClose, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm" }, "Cancelar"), /* @__PURE__ */ import_react9.default.createElement("button", { onClick: handleSave, className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-cyan-600 to-cyan-400 hover:from-cyan-500 hover:to-cyan-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(45,212,191,0.35)]" }, "Salvar Altera\xE7\xF5es")))
|
|
5863
5884
|
)
|
|
5864
5885
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react9.default.createElement(
|
|
5865
|
-
|
|
5886
|
+
DescriptionEditModal2,
|
|
5866
5887
|
{
|
|
5867
5888
|
isOpen: isDescriptionModalOpen,
|
|
5868
5889
|
title: "Editar Descri\xE7\xE3o da Rela\xE7\xE3o",
|
|
@@ -7335,7 +7356,7 @@ function CreateAncestryPanel({
|
|
|
7335
7356
|
/* @__PURE__ */ import_react11.default.createElement("div", { className: "w-4 h-4 border border-slate-500 rounded flex items-center justify-center" }),
|
|
7336
7357
|
"Usar Ancestralidade Existente como Branch"
|
|
7337
7358
|
))), isContextLinked ? /* @__PURE__ */ import_react11.default.createElement("div", { className: "text-center py-8 text-slate-500 text-sm border-t border-white/5" }, /* @__PURE__ */ import_react11.default.createElement("p", null, "O conte\xFAdo desta ramifica\xE7\xE3o \xE9 provido por outra ancestralidade."), /* @__PURE__ */ import_react11.default.createElement("p", { className: "mt-1 text-xs" }, "Para editar, navegue at\xE9 a ancestralidade original ou desvincule.")) : /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement("div", { className: "mb-4 space-y-1.5 relative" }, /* @__PURE__ */ import_react11.default.createElement("label", { className: "text-xs text-slate-400 font-medium ml-1" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react11.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react11.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 z-10" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
7338
|
-
|
|
7359
|
+
DescriptionDisplay2,
|
|
7339
7360
|
{
|
|
7340
7361
|
key: branchStack.length > 0 ? branchStack[branchStack.length - 1].branchId : currentAncestryId || "root",
|
|
7341
7362
|
description,
|
|
@@ -7414,7 +7435,7 @@ function CreateAncestryPanel({
|
|
|
7414
7435
|
/* @__PURE__ */ import_react11.default.createElement(import_fi9.FiPlus, { size: 14 }),
|
|
7415
7436
|
" Adicionar"
|
|
7416
7437
|
)), /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react11.default.createElement(
|
|
7417
|
-
|
|
7438
|
+
CustomPropertyDisplay2,
|
|
7418
7439
|
{
|
|
7419
7440
|
key: prop.id,
|
|
7420
7441
|
prop,
|
|
@@ -7554,7 +7575,7 @@ function CreateAncestryPanel({
|
|
|
7554
7575
|
availableNodes
|
|
7555
7576
|
}
|
|
7556
7577
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react11.default.createElement(
|
|
7557
|
-
|
|
7578
|
+
DescriptionEditModal2,
|
|
7558
7579
|
{
|
|
7559
7580
|
isOpen: isDescriptionModalOpen,
|
|
7560
7581
|
title: branchStack.length > 0 ? "Editar Descri\xE7\xE3o da Ramifica\xE7\xE3o" : "Editar Descri\xE7\xE3o da Ancestralidade",
|
|
@@ -8116,7 +8137,7 @@ function InSceneCreationForm({
|
|
|
8116
8137
|
},
|
|
8117
8138
|
ds.name
|
|
8118
8139
|
)))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react14.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_react14.default.createElement(
|
|
8119
|
-
|
|
8140
|
+
DescriptionDisplay2,
|
|
8120
8141
|
{
|
|
8121
8142
|
description,
|
|
8122
8143
|
savedSections: [],
|
|
@@ -8222,7 +8243,7 @@ function InSceneCreationForm({
|
|
|
8222
8243
|
/* @__PURE__ */ import_react14.default.createElement(import_fi12.FiPlus, { size: 14 }),
|
|
8223
8244
|
" Adicionar"
|
|
8224
8245
|
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
8225
|
-
|
|
8246
|
+
CustomPropertyDisplay2,
|
|
8226
8247
|
{
|
|
8227
8248
|
key: prop.id,
|
|
8228
8249
|
prop,
|
|
@@ -8254,7 +8275,7 @@ function InSceneCreationForm({
|
|
|
8254
8275
|
"Salvar"
|
|
8255
8276
|
)))
|
|
8256
8277
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react14.default.createElement(
|
|
8257
|
-
|
|
8278
|
+
DescriptionEditModal2,
|
|
8258
8279
|
{
|
|
8259
8280
|
isOpen: isDescriptionModalOpen,
|
|
8260
8281
|
title: "Editar Descri\xE7\xE3o do Node",
|
|
@@ -8443,7 +8464,7 @@ function InSceneVersionForm({
|
|
|
8443
8464
|
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"
|
|
8444
8465
|
}
|
|
8445
8466
|
)), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react15.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_react15.default.createElement(
|
|
8446
|
-
|
|
8467
|
+
DescriptionDisplay2,
|
|
8447
8468
|
{
|
|
8448
8469
|
description,
|
|
8449
8470
|
savedSections: [],
|
|
@@ -8537,7 +8558,7 @@ function InSceneVersionForm({
|
|
|
8537
8558
|
/* @__PURE__ */ import_react15.default.createElement(import_fi13.FiPlus, { size: 14 }),
|
|
8538
8559
|
" Adicionar"
|
|
8539
8560
|
)), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react15.default.createElement(
|
|
8540
|
-
|
|
8561
|
+
CustomPropertyDisplay2,
|
|
8541
8562
|
{
|
|
8542
8563
|
key: prop.id,
|
|
8543
8564
|
prop,
|
|
@@ -8569,7 +8590,7 @@ function InSceneVersionForm({
|
|
|
8569
8590
|
"Salvar"
|
|
8570
8591
|
)))
|
|
8571
8592
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react15.default.createElement(
|
|
8572
|
-
|
|
8593
|
+
DescriptionEditModal2,
|
|
8573
8594
|
{
|
|
8574
8595
|
isOpen: isDescriptionModalOpen,
|
|
8575
8596
|
title: "Editar Descri\xE7\xE3o da Vers\xE3o",
|
|
@@ -8833,22 +8854,19 @@ function InSceneQuestForm({
|
|
|
8833
8854
|
);
|
|
8834
8855
|
const processedSections = processDescriptionForSave(description, []);
|
|
8835
8856
|
const initialTimeline = [
|
|
8836
|
-
|
|
8837
|
-
|
|
8838
|
-
|
|
8839
|
-
|
|
8840
|
-
|
|
8841
|
-
}
|
|
8857
|
+
createTimelineEntry(
|
|
8858
|
+
((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
|
|
8859
|
+
`Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`,
|
|
8860
|
+
"quest_created"
|
|
8861
|
+
)
|
|
8842
8862
|
];
|
|
8843
8863
|
if (assigneeId) {
|
|
8844
|
-
initialTimeline.push(
|
|
8845
|
-
|
|
8846
|
-
|
|
8847
|
-
|
|
8848
|
-
|
|
8849
|
-
|
|
8850
|
-
description: `Quest atribu\xEDda para ${((_d = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _d.name) || "respons\xE1vel"}.`
|
|
8851
|
-
});
|
|
8864
|
+
initialTimeline.push(createTimelineEntry(
|
|
8865
|
+
((_c = session == null ? void 0 : session.user) == null ? void 0 : _c.id) || "unknown",
|
|
8866
|
+
`Quest atribu\xEDda para ${((_d = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _d.name) || "respons\xE1vel"}.`,
|
|
8867
|
+
"assignee_changed",
|
|
8868
|
+
{ metadata: { to_assignee_id: assigneeId } }
|
|
8869
|
+
));
|
|
8852
8870
|
}
|
|
8853
8871
|
onSave({
|
|
8854
8872
|
name: standardizedName,
|
|
@@ -9041,7 +9059,7 @@ function InSceneQuestForm({
|
|
|
9041
9059
|
viewMembers
|
|
9042
9060
|
}
|
|
9043
9061
|
)), /* @__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" }, "Descri\xE7\xE3o"), /* @__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(
|
|
9044
|
-
|
|
9062
|
+
DescriptionDisplay2,
|
|
9045
9063
|
{
|
|
9046
9064
|
description,
|
|
9047
9065
|
savedSections: [],
|
|
@@ -9075,7 +9093,7 @@ function InSceneQuestForm({
|
|
|
9075
9093
|
/* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }),
|
|
9076
9094
|
" Adicionar"
|
|
9077
9095
|
)), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react17.default.createElement(
|
|
9078
|
-
|
|
9096
|
+
CustomPropertyDisplay2,
|
|
9079
9097
|
{
|
|
9080
9098
|
key: prop.id,
|
|
9081
9099
|
prop,
|
|
@@ -9158,7 +9176,7 @@ function InSceneQuestForm({
|
|
|
9158
9176
|
"Salvar Quest"
|
|
9159
9177
|
)))
|
|
9160
9178
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
|
|
9161
|
-
|
|
9179
|
+
DescriptionEditModal2,
|
|
9162
9180
|
{
|
|
9163
9181
|
isOpen: isDescriptionModalOpen,
|
|
9164
9182
|
title: "Editar Descri\xE7\xE3o da Quest",
|
|
@@ -9562,7 +9580,7 @@ function NodeDetailsPanel({
|
|
|
9562
9580
|
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"}`
|
|
9563
9581
|
}
|
|
9564
9582
|
)), /* @__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(
|
|
9565
|
-
|
|
9583
|
+
DescriptionDisplay2,
|
|
9566
9584
|
{
|
|
9567
9585
|
description,
|
|
9568
9586
|
savedSections: existingSections,
|
|
@@ -9640,7 +9658,7 @@ function NodeDetailsPanel({
|
|
|
9640
9658
|
title: `Intensidade do brilho: ${intensity}`
|
|
9641
9659
|
}
|
|
9642
9660
|
), /* @__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(
|
|
9643
|
-
|
|
9661
|
+
CustomPropertyDisplay2,
|
|
9644
9662
|
{
|
|
9645
9663
|
key: prop.id,
|
|
9646
9664
|
prop,
|
|
@@ -9667,7 +9685,7 @@ function NodeDetailsPanel({
|
|
|
9667
9685
|
isSaving ? "Salvando..." : "Salvar"
|
|
9668
9686
|
)))
|
|
9669
9687
|
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react18.default.createElement(
|
|
9670
|
-
|
|
9688
|
+
DescriptionEditModal2,
|
|
9671
9689
|
{
|
|
9672
9690
|
isOpen: isDescriptionModalOpen,
|
|
9673
9691
|
title: "Editar Descri\xE7\xE3o do Node",
|
|
@@ -9687,8 +9705,73 @@ function NodeDetailsPanel({
|
|
|
9687
9705
|
}
|
|
9688
9706
|
|
|
9689
9707
|
// src/components/QuestDetailsPanel.jsx
|
|
9708
|
+
var import_react20 = __toESM(require("react"));
|
|
9709
|
+
|
|
9710
|
+
// src/components/QuestTimeline.jsx
|
|
9690
9711
|
var import_react19 = __toESM(require("react"));
|
|
9691
9712
|
var import_fi17 = require("react-icons/fi");
|
|
9713
|
+
var EVENT_ICONS = {
|
|
9714
|
+
"quest_created": { icon: import_fi17.FiPlusCircle, color: "text-sky-400", bg: "bg-sky-400/10" },
|
|
9715
|
+
"assignee_changed": { icon: import_fi17.FiUserPlus, color: "text-indigo-400", bg: "bg-indigo-400/10" },
|
|
9716
|
+
"status_changed": { icon: import_fi17.FiRotateCcw, color: "text-amber-400", bg: "bg-amber-400/10" },
|
|
9717
|
+
"review_cycle_started": { icon: import_fi17.FiSearch, color: "text-purple-400", bg: "bg-purple-400/10" },
|
|
9718
|
+
"review_completed": { icon: import_fi17.FiCheckSquare, color: "text-emerald-400", bg: "bg-emerald-400/10" },
|
|
9719
|
+
"comment": { icon: import_fi17.FiMessageSquare, color: "text-slate-400", bg: "bg-slate-400/10" },
|
|
9720
|
+
"quest_finished": { icon: import_fi17.FiTarget, color: "text-green-400", bg: "bg-green-400/10" },
|
|
9721
|
+
"default": { icon: import_fi17.FiGitCommit, color: "text-slate-500", bg: "bg-slate-500/10" }
|
|
9722
|
+
};
|
|
9723
|
+
function QuestTimeline({
|
|
9724
|
+
timeline = [],
|
|
9725
|
+
viewMembers = [],
|
|
9726
|
+
onOpenImageViewer
|
|
9727
|
+
}) {
|
|
9728
|
+
const sortedTimeline = [...timeline].sort((a, b) => b.timestamp - a.timestamp);
|
|
9729
|
+
const getMemberName = (userId) => {
|
|
9730
|
+
const member = viewMembers.find((m) => m.id === userId);
|
|
9731
|
+
return (member == null ? void 0 : member.name) || (member == null ? void 0 : member.email) || "Sistema";
|
|
9732
|
+
};
|
|
9733
|
+
const formatDate = (timestamp) => {
|
|
9734
|
+
const date = new Date(timestamp);
|
|
9735
|
+
return new Intl.DateTimeFormat("pt-BR", {
|
|
9736
|
+
day: "2-digit",
|
|
9737
|
+
month: "short",
|
|
9738
|
+
hour: "2-digit",
|
|
9739
|
+
minute: "2-digit"
|
|
9740
|
+
}).format(date);
|
|
9741
|
+
};
|
|
9742
|
+
if (timeline.length === 0) {
|
|
9743
|
+
return /* @__PURE__ */ import_react19.default.createElement("div", { className: "py-6 flex flex-col items-center justify-center gap-2 border border-white/5 bg-white/5 rounded-xl" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiAlertCircle, { className: "text-slate-600", size: 16 }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[10px] text-slate-500 font-light uppercase tracking-widest" }, "Nenhum hist\xF3rico dispon\xEDvel"));
|
|
9744
|
+
}
|
|
9745
|
+
return /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider flex items-center gap-2" }, "Hist\xF3rico (Timeline)"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative pl-6 space-y-6 before:content-[''] before:absolute before:left-[11px] before:top-2 before:bottom-2 before:w-[2px] before:bg-white/5" }, sortedTimeline.map((event, index) => {
|
|
9746
|
+
const config = EVENT_ICONS[event.type] || EVENT_ICONS.default;
|
|
9747
|
+
const Icon = config.icon;
|
|
9748
|
+
const actorName = getMemberName(event.actorId);
|
|
9749
|
+
return /* @__PURE__ */ import_react19.default.createElement("div", { key: index, className: "relative animate-in fade-in slide-in-from-left-2 duration-300", style: { animationDelay: `${index * 50}ms` } }, /* @__PURE__ */ import_react19.default.createElement("div", { className: `absolute -left-[27px] top-0 w-8 h-8 rounded-full ${config.bg} flex items-center justify-center ring-4 ring-slate-950 border border-white/5` }, /* @__PURE__ */ import_react19.default.createElement(Icon, { className: config.iconColor || config.color, size: 14 })), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-xs font-semibold text-slate-200" }, actorName), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] text-slate-500 tabular-nums" }, formatDate(event.timestamp))), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-sm text-slate-400 leading-relaxed" }, event.description), (event.from_status || event.to_status) && /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-1.5 py-1 px-2 rounded-md bg-white/5 border border-white/5 w-fit mt-2" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] text-slate-500" }, event.from_status || "?"), /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiArrowRight, { size: 10, className: "text-slate-600" }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[10px] text-indigo-300 font-bold" }, event.to_status || "?")), event.metadata && Object.keys(event.metadata).length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "mt-2 text-[10px] grid grid-cols-2 gap-2 p-2 bg-slate-900/50 rounded border border-white/5" }, Object.entries(event.metadata).map(([key, value]) => /* @__PURE__ */ import_react19.default.createElement("div", { key, className: "flex flex-col gap-0.5" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-500 capitalize" }, key.replace(/_/g, " ")), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-300 truncate font-mono" }, typeof value === "string" ? value : JSON.stringify(value))))), event.links && event.links.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-wrap gap-2 mt-2" }, event.links.map((link, lIdx) => /* @__PURE__ */ import_react19.default.createElement(
|
|
9750
|
+
"a",
|
|
9751
|
+
{
|
|
9752
|
+
key: lIdx,
|
|
9753
|
+
href: link.value,
|
|
9754
|
+
target: "_blank",
|
|
9755
|
+
rel: "noopener noreferrer",
|
|
9756
|
+
className: "flex items-center gap-1.5 px-2 py-1 rounded bg-white/5 border border-white/5 hover:bg-white/10 transition-colors text-[10px] text-sky-400 font-medium"
|
|
9757
|
+
},
|
|
9758
|
+
/* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLink, { size: 10 }),
|
|
9759
|
+
link.name || "Link"
|
|
9760
|
+
))), event.images && event.images.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-wrap gap-2 mt-2" }, event.images.map((img, iIdx) => /* @__PURE__ */ import_react19.default.createElement(
|
|
9761
|
+
"button",
|
|
9762
|
+
{
|
|
9763
|
+
key: iIdx,
|
|
9764
|
+
type: "button",
|
|
9765
|
+
onClick: () => onOpenImageViewer == null ? void 0 : onOpenImageViewer(event.images, iIdx),
|
|
9766
|
+
className: "relative w-12 h-12 rounded border border-white/10 overflow-hidden hover:border-sky-500/50 transition-colors group"
|
|
9767
|
+
},
|
|
9768
|
+
/* @__PURE__ */ import_react19.default.createElement("img", { src: img.value, alt: img.name, className: "w-full h-full object-cover" }),
|
|
9769
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute inset-0 bg-slate-900/40 opacity-0 group-hover:opacity-100 flex items-center justify-center transition-opacity" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { size: 12, className: "text-white" }))
|
|
9770
|
+
)))));
|
|
9771
|
+
})));
|
|
9772
|
+
}
|
|
9773
|
+
|
|
9774
|
+
// src/components/QuestDetailsPanel.jsx
|
|
9692
9775
|
var QUEST_STATUS_COLORS3 = {
|
|
9693
9776
|
"Backlog": "#64748b",
|
|
9694
9777
|
"In Progress": "#eab308",
|
|
@@ -9717,45 +9800,47 @@ function QuestDetailsPanel({
|
|
|
9717
9800
|
}) {
|
|
9718
9801
|
var _a, _b;
|
|
9719
9802
|
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) || "";
|
|
9720
|
-
const [rawTitle, setRawTitle] = (0,
|
|
9803
|
+
const [rawTitle, setRawTitle] = (0, import_react20.useState)(initialRawTitle);
|
|
9721
9804
|
const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
|
|
9722
9805
|
const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
|
|
9723
9806
|
const standardizedName = questPrefix ? `${questPrefix} - \xBB ${rawTitle || "Sem t\xEDtulo"}` : rawTitle;
|
|
9724
|
-
const [types, setTypes] = (0,
|
|
9725
|
-
const [typeInput, setTypeInput] = (0,
|
|
9726
|
-
const [status, setStatus] = (0,
|
|
9727
|
-
const [size, setSize] = (0,
|
|
9728
|
-
const [assigneeId, setAssigneeId] = (0,
|
|
9729
|
-
const [description, setDescription] = (0,
|
|
9730
|
-
const [intensity, setIntensity] = (0,
|
|
9731
|
-
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0,
|
|
9732
|
-
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0,
|
|
9733
|
-
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0,
|
|
9734
|
-
const [returnAssigneeId, setReturnAssigneeId] = (0,
|
|
9735
|
-
const [isReturnDropdownOpen, setIsReturnDropdownOpen] = (0,
|
|
9736
|
-
const [returnSearchQuery, setReturnSearchQuery] = (0,
|
|
9737
|
-
const [customProps, setCustomProps] = (0,
|
|
9738
|
-
const [reviewStack, setReviewStack] = (0,
|
|
9739
|
-
const [timeline, setTimeline] = (0,
|
|
9740
|
-
const [showTypeSuggestions, setShowTypeSuggestions] = (0,
|
|
9741
|
-
const [filteredTypes, setFilteredTypes] = (0,
|
|
9742
|
-
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0,
|
|
9743
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
9744
|
-
const [existingSections, setExistingSections] = (0,
|
|
9745
|
-
const [isSaving, setIsSaving] = (0,
|
|
9746
|
-
const [isLinkCopied, setIsLinkCopied] = (0,
|
|
9747
|
-
const [hasUnsavedChanges, setHasUnsavedChanges] = (0,
|
|
9807
|
+
const [types, setTypes] = (0, import_react20.useState)((node == null ? void 0 : node.type) ? Array.isArray(node.type) ? node.type : [node.type] : ["quest"]);
|
|
9808
|
+
const [typeInput, setTypeInput] = (0, import_react20.useState)("");
|
|
9809
|
+
const [status, setStatus] = (0, import_react20.useState)((node == null ? void 0 : node.status) ?? "Backlog");
|
|
9810
|
+
const [size, setSize] = (0, import_react20.useState)((node == null ? void 0 : node.size) ?? "medium");
|
|
9811
|
+
const [assigneeId, setAssigneeId] = (0, import_react20.useState)((node == null ? void 0 : node.assignee_id) || "");
|
|
9812
|
+
const [description, setDescription] = (0, import_react20.useState)((node == null ? void 0 : node.description) ?? "");
|
|
9813
|
+
const [intensity, setIntensity] = (0, import_react20.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
|
|
9814
|
+
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react20.useState)(false);
|
|
9815
|
+
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react20.useState)(false);
|
|
9816
|
+
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react20.useState)("");
|
|
9817
|
+
const [returnAssigneeId, setReturnAssigneeId] = (0, import_react20.useState)("");
|
|
9818
|
+
const [isReturnDropdownOpen, setIsReturnDropdownOpen] = (0, import_react20.useState)(false);
|
|
9819
|
+
const [returnSearchQuery, setReturnSearchQuery] = (0, import_react20.useState)("");
|
|
9820
|
+
const [customProps, setCustomProps] = (0, import_react20.useState)(() => extractCustomPropsFromNode(node || {}));
|
|
9821
|
+
const [reviewStack, setReviewStack] = (0, import_react20.useState)((node == null ? void 0 : node.reviewStack) || []);
|
|
9822
|
+
const [timeline, setTimeline] = (0, import_react20.useState)((node == null ? void 0 : node.timeline) || []);
|
|
9823
|
+
const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react20.useState)(false);
|
|
9824
|
+
const [filteredTypes, setFilteredTypes] = (0, import_react20.useState)([]);
|
|
9825
|
+
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react20.useState)(false);
|
|
9826
|
+
const [isReadMode, setIsReadMode] = (0, import_react20.useState)(false);
|
|
9827
|
+
const [existingSections, setExistingSections] = (0, import_react20.useState)((node == null ? void 0 : node.description_sections) || []);
|
|
9828
|
+
const [isSaving, setIsSaving] = (0, import_react20.useState)(false);
|
|
9829
|
+
const [isLinkCopied, setIsLinkCopied] = (0, import_react20.useState)(false);
|
|
9830
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react20.useState)(false);
|
|
9831
|
+
const [noteText, setNoteText] = (0, import_react20.useState)("");
|
|
9832
|
+
const [isNoteFormOpen, setIsNoteFormOpen] = (0, import_react20.useState)(false);
|
|
9748
9833
|
const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
|
|
9749
9834
|
const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
|
|
9750
9835
|
initialWidth: isReadMode ? 700 : 440,
|
|
9751
9836
|
minWidth: 320,
|
|
9752
9837
|
maxWidth: maxPanelW
|
|
9753
9838
|
});
|
|
9754
|
-
(0,
|
|
9839
|
+
(0, import_react20.useEffect)(() => {
|
|
9755
9840
|
setWidth(isReadMode ? 700 : 440);
|
|
9756
9841
|
}, [isReadMode, setWidth]);
|
|
9757
|
-
const prevNodeIdRef = (0,
|
|
9758
|
-
const propsEndRef = (0,
|
|
9842
|
+
const prevNodeIdRef = (0, import_react20.useRef)(null);
|
|
9843
|
+
const propsEndRef = (0, import_react20.useRef)(null);
|
|
9759
9844
|
const canEdit = userRole !== "viewer";
|
|
9760
9845
|
const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
|
|
9761
9846
|
const handleImageClickFromText = (url, name) => {
|
|
@@ -9763,7 +9848,7 @@ function QuestDetailsPanel({
|
|
|
9763
9848
|
onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
|
|
9764
9849
|
}
|
|
9765
9850
|
};
|
|
9766
|
-
(0,
|
|
9851
|
+
(0, import_react20.useEffect)(() => {
|
|
9767
9852
|
var _a2;
|
|
9768
9853
|
if ((node == null ? void 0 : node.id) !== prevNodeIdRef.current) {
|
|
9769
9854
|
prevNodeIdRef.current = node == null ? void 0 : node.id;
|
|
@@ -9783,7 +9868,7 @@ function QuestDetailsPanel({
|
|
|
9783
9868
|
setHasUnsavedChanges(false);
|
|
9784
9869
|
}
|
|
9785
9870
|
}, [node]);
|
|
9786
|
-
(0,
|
|
9871
|
+
(0, import_react20.useEffect)(() => {
|
|
9787
9872
|
const validExistingTypes = existingTypes.filter((t) => t && typeof t === "string" && t.trim() !== "");
|
|
9788
9873
|
if (typeInput.trim() === "") {
|
|
9789
9874
|
setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
|
|
@@ -9875,6 +9960,28 @@ function QuestDetailsPanel({
|
|
|
9875
9960
|
setIsSaving(false);
|
|
9876
9961
|
}
|
|
9877
9962
|
};
|
|
9963
|
+
const handleAddTimelineNote = async () => {
|
|
9964
|
+
if (!noteText.trim() || isSaving) return;
|
|
9965
|
+
setIsSaving(true);
|
|
9966
|
+
const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
|
|
9967
|
+
const newEntry = createTimelineEntry(actorId, noteText, "comment");
|
|
9968
|
+
const updatedTimeline = [...timeline, newEntry];
|
|
9969
|
+
try {
|
|
9970
|
+
const nodeToSave = {
|
|
9971
|
+
...node,
|
|
9972
|
+
timeline: updatedTimeline
|
|
9973
|
+
};
|
|
9974
|
+
await onSave(nodeToSave, true);
|
|
9975
|
+
setTimeline(updatedTimeline);
|
|
9976
|
+
onDataUpdate(nodeToSave);
|
|
9977
|
+
setNoteText("");
|
|
9978
|
+
setIsNoteFormOpen(false);
|
|
9979
|
+
} catch (error) {
|
|
9980
|
+
console.error("Erro ao adicionar nota:", error);
|
|
9981
|
+
} finally {
|
|
9982
|
+
setIsSaving(false);
|
|
9983
|
+
}
|
|
9984
|
+
};
|
|
9878
9985
|
const handleStatusChange = (newStatus) => {
|
|
9879
9986
|
setStatus(newStatus);
|
|
9880
9987
|
const newColor = QUEST_STATUS_COLORS3[newStatus];
|
|
@@ -10003,7 +10110,7 @@ function QuestDetailsPanel({
|
|
|
10003
10110
|
const currentUsedTypes = customProps.map((p) => p.type).filter((t) => UNIQUE_PROP_TYPES.includes(t));
|
|
10004
10111
|
const assigneeMember = viewMembers.find((m) => m.id === assigneeId);
|
|
10005
10112
|
const isAssigneeUndefined = assigneeId && !assigneeMember;
|
|
10006
|
-
return /* @__PURE__ */
|
|
10113
|
+
return /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(
|
|
10007
10114
|
"div",
|
|
10008
10115
|
{
|
|
10009
10116
|
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"}`,
|
|
@@ -10016,11 +10123,11 @@ function QuestDetailsPanel({
|
|
|
10016
10123
|
onContextMenu: swallow,
|
|
10017
10124
|
onDoubleClick: swallow
|
|
10018
10125
|
},
|
|
10019
|
-
/* @__PURE__ */
|
|
10126
|
+
/* @__PURE__ */ import_react20.default.createElement("div", { onPointerDown: (e) => {
|
|
10020
10127
|
e.stopPropagation();
|
|
10021
10128
|
handleResize(e);
|
|
10022
10129
|
}, 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" }),
|
|
10023
|
-
isReadMode ? /* @__PURE__ */
|
|
10130
|
+
isReadMode ? /* @__PURE__ */ import_react20.default.createElement(
|
|
10024
10131
|
DescriptionReadModePanel,
|
|
10025
10132
|
{
|
|
10026
10133
|
title: standardizedName || (node == null ? void 0 : node.name),
|
|
@@ -10041,7 +10148,7 @@ function QuestDetailsPanel({
|
|
|
10041
10148
|
onImageClick: handleImageClickFromText,
|
|
10042
10149
|
onSaveDescription: handleSaveDescriptionInline
|
|
10043
10150
|
}
|
|
10044
|
-
) : /* @__PURE__ */
|
|
10151
|
+
) : /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "h-[2px]", style: { background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS3[status]}, transparent)` } }), /* @__PURE__ */ import_react20.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react20.default.createElement(FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Quest"), /* @__PURE__ */ import_react20.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_react20.default.createElement(FiCheck, { size: 12 }) : /* @__PURE__ */ import_react20.default.createElement(FiLink, { size: 12 }))), /* @__PURE__ */ import_react20.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, standardizedName || (node == null ? void 0 : node.name))), /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "T\xEDtulo da Quest"), /* @__PURE__ */ import_react20.default.createElement(
|
|
10045
10152
|
"input",
|
|
10046
10153
|
{
|
|
10047
10154
|
type: "text",
|
|
@@ -10050,7 +10157,7 @@ function QuestDetailsPanel({
|
|
|
10050
10157
|
readOnly: !canEdit,
|
|
10051
10158
|
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"}`
|
|
10052
10159
|
}
|
|
10053
|
-
), /* @__PURE__ */
|
|
10160
|
+
), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10054
10161
|
"button",
|
|
10055
10162
|
{
|
|
10056
10163
|
type: "button",
|
|
@@ -10058,9 +10165,9 @@ function QuestDetailsPanel({
|
|
|
10058
10165
|
disabled: !canEdit,
|
|
10059
10166
|
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"}`
|
|
10060
10167
|
},
|
|
10061
|
-
/* @__PURE__ */
|
|
10062
|
-
canEdit && /* @__PURE__ */
|
|
10063
|
-
), isStatusDropdownOpen && canEdit && /* @__PURE__ */
|
|
10168
|
+
/* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.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_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
|
|
10169
|
+
canEdit && /* @__PURE__ */ import_react20.default.createElement(FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}` })
|
|
10170
|
+
), isStatusDropdownOpen && canEdit && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsStatusDropdownOpen(false) }), /* @__PURE__ */ import_react20.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_react20.default.createElement(
|
|
10064
10171
|
"li",
|
|
10065
10172
|
{
|
|
10066
10173
|
key: s,
|
|
@@ -10070,21 +10177,21 @@ function QuestDetailsPanel({
|
|
|
10070
10177
|
},
|
|
10071
10178
|
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"}`
|
|
10072
10179
|
},
|
|
10073
|
-
/* @__PURE__ */
|
|
10180
|
+
/* @__PURE__ */ import_react20.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
|
|
10074
10181
|
s
|
|
10075
|
-
)))))), /* @__PURE__ */
|
|
10182
|
+
)))))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10076
10183
|
"button",
|
|
10077
10184
|
{
|
|
10078
10185
|
type: "button",
|
|
10079
10186
|
onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
|
|
10080
10187
|
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"
|
|
10081
10188
|
},
|
|
10082
|
-
/* @__PURE__ */
|
|
10083
|
-
/* @__PURE__ */
|
|
10084
|
-
), isAssigneeDropdownOpen && /* @__PURE__ */
|
|
10189
|
+
/* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
|
|
10190
|
+
/* @__PURE__ */ import_react20.default.createElement(FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
|
|
10191
|
+
), isAssigneeDropdownOpen && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
|
|
10085
10192
|
setIsAssigneeDropdownOpen(false);
|
|
10086
10193
|
setAssigneeSearchQuery("");
|
|
10087
|
-
} }), /* @__PURE__ */
|
|
10194
|
+
} }), /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react20.default.createElement(
|
|
10088
10195
|
"input",
|
|
10089
10196
|
{
|
|
10090
10197
|
type: "text",
|
|
@@ -10095,7 +10202,7 @@ function QuestDetailsPanel({
|
|
|
10095
10202
|
className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
|
|
10096
10203
|
onClick: (e) => e.stopPropagation()
|
|
10097
10204
|
}
|
|
10098
|
-
)), /* @__PURE__ */
|
|
10205
|
+
)), /* @__PURE__ */ import_react20.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10099
10206
|
"li",
|
|
10100
10207
|
{
|
|
10101
10208
|
onClick: () => {
|
|
@@ -10115,7 +10222,7 @@ function QuestDetailsPanel({
|
|
|
10115
10222
|
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"}`
|
|
10116
10223
|
},
|
|
10117
10224
|
"Nenhum"
|
|
10118
|
-
), isAssigneeUndefined && /* @__PURE__ */
|
|
10225
|
+
), isAssigneeUndefined && /* @__PURE__ */ import_react20.default.createElement(
|
|
10119
10226
|
"li",
|
|
10120
10227
|
{
|
|
10121
10228
|
onClick: () => {
|
|
@@ -10128,7 +10235,7 @@ function QuestDetailsPanel({
|
|
|
10128
10235
|
), viewMembers.filter((member) => {
|
|
10129
10236
|
const search = assigneeSearchQuery.toLowerCase();
|
|
10130
10237
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
10131
|
-
}).map((member) => /* @__PURE__ */
|
|
10238
|
+
}).map((member) => /* @__PURE__ */ import_react20.default.createElement(
|
|
10132
10239
|
"li",
|
|
10133
10240
|
{
|
|
10134
10241
|
key: member.id,
|
|
@@ -10152,7 +10259,7 @@ function QuestDetailsPanel({
|
|
|
10152
10259
|
)), viewMembers.filter((member) => {
|
|
10153
10260
|
const search = assigneeSearchQuery.toLowerCase();
|
|
10154
10261
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
10155
|
-
}).length === 0 && assigneeSearchQuery && /* @__PURE__ */
|
|
10262
|
+
}).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react20.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react20.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_react20.default.createElement(FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10156
10263
|
QuestReviewStackEditor,
|
|
10157
10264
|
{
|
|
10158
10265
|
reviewStack,
|
|
@@ -10163,19 +10270,19 @@ function QuestDetailsPanel({
|
|
|
10163
10270
|
viewMembers,
|
|
10164
10271
|
readOnly: !canEdit
|
|
10165
10272
|
}
|
|
10166
|
-
)), status === "Review" && canEdit && /* @__PURE__ */
|
|
10273
|
+
)), status === "Review" && canEdit && /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ import_react20.default.createElement("span", { className: "px-2 py-0.5 rounded-full bg-purple-500/10 text-purple-300 text-[10px] font-medium border border-purple-500/20" }, "Em Revis\xE3o")), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Selecione o respons\xE1vel abaixo para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 flex flex-col" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[10px] text-slate-400 font-medium ml-0.5" }, "Retornar para:"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10167
10274
|
"button",
|
|
10168
10275
|
{
|
|
10169
10276
|
type: "button",
|
|
10170
10277
|
onClick: () => setIsReturnDropdownOpen(!isReturnDropdownOpen),
|
|
10171
10278
|
className: "w-full bg-slate-800/80 p-2 text-xs rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-1 focus:ring-purple-400/50 transition-colors flex items-center justify-between"
|
|
10172
10279
|
},
|
|
10173
|
-
/* @__PURE__ */
|
|
10174
|
-
/* @__PURE__ */
|
|
10175
|
-
), isReturnDropdownOpen && /* @__PURE__ */
|
|
10280
|
+
/* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiUser, { className: "text-slate-400", size: 12 }), /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_b = viewMembers.find((m) => String(m.id) === String(returnAssigneeId))) == null ? void 0 : _b.name) || "Selecionar respons\xE1vel...")),
|
|
10281
|
+
/* @__PURE__ */ import_react20.default.createElement(FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isReturnDropdownOpen ? "rotate-180" : ""}`, size: 14 })
|
|
10282
|
+
), isReturnDropdownOpen && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
|
|
10176
10283
|
setIsReturnDropdownOpen(false);
|
|
10177
10284
|
setReturnSearchQuery("");
|
|
10178
|
-
} }), /* @__PURE__ */
|
|
10285
|
+
} }), /* @__PURE__ */ import_react20.default.createElement("div", { className: "absolute bottom-full left-0 mb-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_react20.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(FiSearch, { className: "text-slate-500", size: 12 }), /* @__PURE__ */ import_react20.default.createElement(
|
|
10179
10286
|
"input",
|
|
10180
10287
|
{
|
|
10181
10288
|
type: "text",
|
|
@@ -10186,10 +10293,10 @@ function QuestDetailsPanel({
|
|
|
10186
10293
|
className: "bg-transparent border-none outline-none text-[10px] text-white placeholder-slate-500 w-full",
|
|
10187
10294
|
onClick: (e) => e.stopPropagation()
|
|
10188
10295
|
}
|
|
10189
|
-
)), /* @__PURE__ */
|
|
10296
|
+
)), /* @__PURE__ */ import_react20.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
|
|
10190
10297
|
const search = returnSearchQuery.toLowerCase();
|
|
10191
10298
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
10192
|
-
}).map((member) => /* @__PURE__ */
|
|
10299
|
+
}).map((member) => /* @__PURE__ */ import_react20.default.createElement(
|
|
10193
10300
|
"li",
|
|
10194
10301
|
{
|
|
10195
10302
|
key: member.id,
|
|
@@ -10204,7 +10311,7 @@ function QuestDetailsPanel({
|
|
|
10204
10311
|
)), viewMembers.filter((member) => {
|
|
10205
10312
|
const search = returnSearchQuery.toLowerCase();
|
|
10206
10313
|
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
10207
|
-
}).length === 0 && /* @__PURE__ */
|
|
10314
|
+
}).length === 0 && /* @__PURE__ */ import_react20.default.createElement("li", { className: "px-3 py-4 text-[10px] text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react20.default.createElement(
|
|
10208
10315
|
"button",
|
|
10209
10316
|
{
|
|
10210
10317
|
type: "button",
|
|
@@ -10212,16 +10319,45 @@ function QuestDetailsPanel({
|
|
|
10212
10319
|
disabled: isSaving || !returnAssigneeId,
|
|
10213
10320
|
className: `w-full h-10 flex items-center justify-center gap-2 rounded-lg text-xs font-semibold border transition-all active:scale-[0.98] disabled:opacity-40 disabled:grayscale-[0.5] disabled:cursor-not-allowed ${!returnAssigneeId ? "bg-slate-800 text-slate-500 border-white/5" : "bg-slate-800 hover:bg-slate-700 text-purple-300 border-purple-500/20 hover:border-purple-500/40"}`
|
|
10214
10321
|
},
|
|
10215
|
-
/* @__PURE__ */
|
|
10322
|
+
/* @__PURE__ */ import_react20.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react20.default.createElement("path", { d: "M12 19V5M5 12l7 7 7-7" })),
|
|
10216
10323
|
"Retornar para Opera\xE7\xE3o"
|
|
10217
|
-
))), /* @__PURE__ */
|
|
10218
|
-
|
|
10219
|
-
|
|
10220
|
-
|
|
10221
|
-
|
|
10324
|
+
))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react20.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_react20.default.createElement(DescriptionDisplay, { description, savedSections: existingSections, availableNodes, availableAncestries, onOpenReference, onMentionClick, onImageClick: handleImageClickFromText, onSaveDescription: handleSaveDescriptionInline }), /* @__PURE__ */ import_react20.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_react20.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_react20.default.createElement(FiBookOpen, { size: 14 })), canEdit && /* @__PURE__ */ import_react20.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_react20.default.createElement(FiEdit2, { size: 14 }))), canEdit && !description && /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react20.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_react20.default.createElement(FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react20.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_react20.default.createElement("div", { ref: propsEndRef }))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-6 border-t border-white/10 mt-6" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between mb-4" }, /* @__PURE__ */ import_react20.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "Hist\xF3rico & Notas"), /* @__PURE__ */ import_react20.default.createElement(
|
|
10325
|
+
"button",
|
|
10326
|
+
{
|
|
10327
|
+
type: "button",
|
|
10328
|
+
onClick: () => setIsNoteFormOpen(!isNoteFormOpen),
|
|
10329
|
+
className: "flex items-center gap-1.5 px-2 py-1 text-[10px] rounded-md bg-white/5 hover:bg-white/10 border border-white/10 transition-colors text-slate-300"
|
|
10330
|
+
},
|
|
10331
|
+
isNoteFormOpen ? /* @__PURE__ */ import_react20.default.createElement(FiX, { size: 12 }) : /* @__PURE__ */ import_react20.default.createElement(FiPlus, { size: 12 }),
|
|
10332
|
+
isNoteFormOpen ? "Cancelar" : "Nova Nota"
|
|
10333
|
+
)), isNoteFormOpen && /* @__PURE__ */ import_react20.default.createElement("div", { className: "mb-6 p-4 rounded-xl bg-white/5 border border-white/5 space-y-3 animate-in fade-in slide-in-from-top-2" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10334
|
+
"textarea",
|
|
10335
|
+
{
|
|
10336
|
+
value: noteText,
|
|
10337
|
+
onChange: (e) => setNoteText(e.target.value),
|
|
10338
|
+
placeholder: "Escreva uma observa\xE7\xE3o no hist\xF3rico...",
|
|
10339
|
+
className: "w-full bg-slate-900/50 p-3 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-1 focus:ring-indigo-500/50 min-h-[80px] resize-none"
|
|
10340
|
+
}
|
|
10341
|
+
), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex justify-end gap-2" }, /* @__PURE__ */ import_react20.default.createElement(
|
|
10342
|
+
"button",
|
|
10343
|
+
{
|
|
10344
|
+
type: "button",
|
|
10345
|
+
onClick: handleAddTimelineNote,
|
|
10346
|
+
disabled: !noteText.trim() || isSaving,
|
|
10347
|
+
className: "px-3 py-1.5 rounded-lg bg-indigo-600 hover:bg-indigo-500 text-white text-xs font-semibold transition-colors disabled:opacity-50"
|
|
10348
|
+
},
|
|
10349
|
+
"Adicionar ao Hist\xF3rico"
|
|
10350
|
+
))), /* @__PURE__ */ import_react20.default.createElement(
|
|
10351
|
+
QuestTimeline,
|
|
10352
|
+
{
|
|
10353
|
+
timeline,
|
|
10354
|
+
viewMembers,
|
|
10355
|
+
onOpenImageViewer
|
|
10356
|
+
}
|
|
10357
|
+
)), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
|
|
10222
10358
|
const isSelected = size === s;
|
|
10223
|
-
return /* @__PURE__ */
|
|
10224
|
-
}))), /* @__PURE__ */
|
|
10359
|
+
return /* @__PURE__ */ import_react20.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_react20.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_react20.default.createElement(FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react20.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
|
|
10360
|
+
}))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react20.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_react20.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_react20.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react20.default.createElement(
|
|
10225
10361
|
"input",
|
|
10226
10362
|
{
|
|
10227
10363
|
type: "text",
|
|
@@ -10242,11 +10378,11 @@ function QuestDetailsPanel({
|
|
|
10242
10378
|
placeholder: "",
|
|
10243
10379
|
autoComplete: "off"
|
|
10244
10380
|
}
|
|
10245
|
-
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */
|
|
10381
|
+
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react20.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_react20.default.createElement("li", { key: index, className: "px-3 py-2 text-sm text-slate-200 cursor-pointer hover:bg-indigo-600/50", onMouseDown: (e) => {
|
|
10246
10382
|
e.preventDefault();
|
|
10247
10383
|
handleAddType(suggestedType);
|
|
10248
|
-
} }, suggestedType))))), currentDatasetName && /* @__PURE__ */
|
|
10249
|
-
), isDescriptionModalOpen && canEdit && /* @__PURE__ */
|
|
10384
|
+
} }, suggestedType))))), currentDatasetName && /* @__PURE__ */ import_react20.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_react20.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react20.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_react20.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_react20.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_react20.default.createElement(FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
|
|
10385
|
+
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react20.default.createElement(
|
|
10250
10386
|
DescriptionEditModal,
|
|
10251
10387
|
{
|
|
10252
10388
|
isOpen: isDescriptionModalOpen,
|
|
@@ -10266,7 +10402,7 @@ function QuestDetailsPanel({
|
|
|
10266
10402
|
}
|
|
10267
10403
|
|
|
10268
10404
|
// src/components/MultiNodeContextMenu.jsx
|
|
10269
|
-
var
|
|
10405
|
+
var import_react21 = __toESM(require("react"));
|
|
10270
10406
|
function MultiNodeContextMenu({
|
|
10271
10407
|
data,
|
|
10272
10408
|
userRole,
|
|
@@ -10275,12 +10411,12 @@ function MultiNodeContextMenu({
|
|
|
10275
10411
|
onDismissOtherNodes,
|
|
10276
10412
|
onDeleteNodes
|
|
10277
10413
|
}) {
|
|
10278
|
-
const menuRef = (0,
|
|
10279
|
-
const [menuPos, setMenuPos] = (0,
|
|
10280
|
-
const [isConfirmingDelete, setIsConfirmingDelete] = (0,
|
|
10414
|
+
const menuRef = (0, import_react21.useRef)(null);
|
|
10415
|
+
const [menuPos, setMenuPos] = (0, import_react21.useState)({ left: 0, top: 0 });
|
|
10416
|
+
const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react21.useState)(false);
|
|
10281
10417
|
const ability = defineAbilityFor(userRole);
|
|
10282
10418
|
const canDelete = ability.can("delete", "Node");
|
|
10283
|
-
(0,
|
|
10419
|
+
(0, import_react21.useLayoutEffect)(() => {
|
|
10284
10420
|
if (!data.visible || !menuRef.current) return;
|
|
10285
10421
|
const el = menuRef.current;
|
|
10286
10422
|
const w = el.clientWidth;
|
|
@@ -10293,7 +10429,7 @@ function MultiNodeContextMenu({
|
|
|
10293
10429
|
if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
|
|
10294
10430
|
setMenuPos({ left, top });
|
|
10295
10431
|
}, [data]);
|
|
10296
|
-
(0,
|
|
10432
|
+
(0, import_react21.useEffect)(() => {
|
|
10297
10433
|
if (data.visible) {
|
|
10298
10434
|
setIsConfirmingDelete(false);
|
|
10299
10435
|
}
|
|
@@ -10308,7 +10444,7 @@ function MultiNodeContextMenu({
|
|
|
10308
10444
|
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";
|
|
10309
10445
|
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";
|
|
10310
10446
|
const nodeCount = data.nodeIds.size;
|
|
10311
|
-
return /* @__PURE__ */
|
|
10447
|
+
return /* @__PURE__ */ import_react21.default.createElement(
|
|
10312
10448
|
"div",
|
|
10313
10449
|
{
|
|
10314
10450
|
ref: menuRef,
|
|
@@ -10322,27 +10458,27 @@ function MultiNodeContextMenu({
|
|
|
10322
10458
|
onContextMenu: swallow,
|
|
10323
10459
|
onDoubleClick: swallow
|
|
10324
10460
|
},
|
|
10325
|
-
/* @__PURE__ */
|
|
10326
|
-
/* @__PURE__ */
|
|
10461
|
+
/* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
|
|
10462
|
+
/* @__PURE__ */ import_react21.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react21.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_react21.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_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react21.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_react21.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir ", /* @__PURE__ */ import_react21.default.createElement("strong", null, nodeCount, " Nodes"), "?"), /* @__PURE__ */ import_react21.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_react21.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
10327
10463
|
"button",
|
|
10328
10464
|
{
|
|
10329
10465
|
onClick: () => setIsConfirmingDelete(false),
|
|
10330
10466
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
|
|
10331
10467
|
},
|
|
10332
10468
|
"Cancelar"
|
|
10333
|
-
), /* @__PURE__ */
|
|
10469
|
+
), /* @__PURE__ */ import_react21.default.createElement(
|
|
10334
10470
|
"button",
|
|
10335
10471
|
{
|
|
10336
10472
|
onClick: () => onDeleteNodes(data.nodeIds),
|
|
10337
10473
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-red-500 hover:bg-red-600 rounded-md text-white transition-colors"
|
|
10338
10474
|
},
|
|
10339
10475
|
"Excluir"
|
|
10340
|
-
))) : /* @__PURE__ */
|
|
10476
|
+
))) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es em Grupo (", nodeCount, " Nodes)")), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react21.default.createElement("button", { onClick: () => onDismissNodes(data.nodeIds), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react21.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_react21.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_react21.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react21.default.createElement("span", null, "Dismiss (", nodeCount, ")")), /* @__PURE__ */ import_react21.default.createElement("button", { onClick: () => onDismissOtherNodes(data.nodeIds), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react21.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react21.default.createElement("span", null, "Dismiss other nodes")), canDelete && /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react21.default.createElement("button", { onClick: () => setIsConfirmingDelete(true), className: deleteButtonClass, title: "Excluir Nodes" }, /* @__PURE__ */ import_react21.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_react21.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react21.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_react21.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react21.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react21.default.createElement("span", null, "Excluir Nodes (", nodeCount, ")"))))))
|
|
10341
10477
|
);
|
|
10342
10478
|
}
|
|
10343
10479
|
|
|
10344
10480
|
// src/components/RelationshipDetailsPanel.jsx
|
|
10345
|
-
var
|
|
10481
|
+
var import_react22 = __toESM(require("react"));
|
|
10346
10482
|
var import_fi18 = require("react-icons/fi");
|
|
10347
10483
|
function RelationshipDetailsPanel({
|
|
10348
10484
|
link,
|
|
@@ -10357,26 +10493,26 @@ function RelationshipDetailsPanel({
|
|
|
10357
10493
|
onUploadFile,
|
|
10358
10494
|
userRole
|
|
10359
10495
|
}) {
|
|
10360
|
-
const [name, setName] = (0,
|
|
10361
|
-
const [description, setDescription] = (0,
|
|
10362
|
-
const [customProps, setCustomProps] = (0,
|
|
10496
|
+
const [name, setName] = (0, import_react22.useState)((link == null ? void 0 : link.name) ?? "");
|
|
10497
|
+
const [description, setDescription] = (0, import_react22.useState)((link == null ? void 0 : link.description) ?? "");
|
|
10498
|
+
const [customProps, setCustomProps] = (0, import_react22.useState)(
|
|
10363
10499
|
() => extractCustomPropsFromNode(link || {})
|
|
10364
10500
|
);
|
|
10365
|
-
const [existingSections, setExistingSections] = (0,
|
|
10501
|
+
const [existingSections, setExistingSections] = (0, import_react22.useState)(
|
|
10366
10502
|
(link == null ? void 0 : link.description_sections) || []
|
|
10367
10503
|
);
|
|
10368
|
-
const [sourceLabel, setSourceLabel] = (0,
|
|
10369
|
-
const [targetLabel, setTargetLabel] = (0,
|
|
10370
|
-
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0,
|
|
10371
|
-
const [isSaving, setIsSaving] = (0,
|
|
10372
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
10373
|
-
const [hasUnsavedChanges, setHasUnsavedChanges] = (0,
|
|
10374
|
-
const propsEndRef = (0,
|
|
10375
|
-
const canEdit = (0,
|
|
10504
|
+
const [sourceLabel, setSourceLabel] = (0, import_react22.useState)((link == null ? void 0 : link.source_label) ?? "");
|
|
10505
|
+
const [targetLabel, setTargetLabel] = (0, import_react22.useState)((link == null ? void 0 : link.target_label) ?? "");
|
|
10506
|
+
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react22.useState)(false);
|
|
10507
|
+
const [isSaving, setIsSaving] = (0, import_react22.useState)(false);
|
|
10508
|
+
const [isReadMode, setIsReadMode] = (0, import_react22.useState)(false);
|
|
10509
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react22.useState)(false);
|
|
10510
|
+
const propsEndRef = (0, import_react22.useRef)(null);
|
|
10511
|
+
const canEdit = (0, import_react22.useMemo)(() => {
|
|
10376
10512
|
const ability = defineAbilityFor(userRole);
|
|
10377
10513
|
return ability.can("update", "Connection");
|
|
10378
10514
|
}, [userRole]);
|
|
10379
|
-
(0,
|
|
10515
|
+
(0, import_react22.useEffect)(() => {
|
|
10380
10516
|
setName((link == null ? void 0 : link.name) ?? "");
|
|
10381
10517
|
setDescription((link == null ? void 0 : link.description) ?? "");
|
|
10382
10518
|
setExistingSections((link == null ? void 0 : link.description_sections) || []);
|
|
@@ -10477,7 +10613,7 @@ function RelationshipDetailsPanel({
|
|
|
10477
10613
|
onOpenImageViewer([{ name: name2 || "Imagem", value: url }], 0);
|
|
10478
10614
|
}
|
|
10479
10615
|
};
|
|
10480
|
-
return /* @__PURE__ */
|
|
10616
|
+
return /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(
|
|
10481
10617
|
"div",
|
|
10482
10618
|
{
|
|
10483
10619
|
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
|
|
@@ -10492,7 +10628,7 @@ function RelationshipDetailsPanel({
|
|
|
10492
10628
|
onContextMenu: swallow,
|
|
10493
10629
|
onDoubleClick: swallow
|
|
10494
10630
|
},
|
|
10495
|
-
isReadMode ? /* @__PURE__ */
|
|
10631
|
+
isReadMode ? /* @__PURE__ */ import_react22.default.createElement(
|
|
10496
10632
|
DescriptionReadModePanel,
|
|
10497
10633
|
{
|
|
10498
10634
|
title: name || "Rela\xE7\xE3o",
|
|
@@ -10513,7 +10649,7 @@ function RelationshipDetailsPanel({
|
|
|
10513
10649
|
onImageClick: handleImageClickFromText,
|
|
10514
10650
|
onSaveDescription: handleSaveDescriptionInline
|
|
10515
10651
|
}
|
|
10516
|
-
) : /* @__PURE__ */
|
|
10652
|
+
) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__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" }), /* @__PURE__ */ import_react22.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react22.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_react22.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react22.default.createElement(
|
|
10517
10653
|
"button",
|
|
10518
10654
|
{
|
|
10519
10655
|
onClick: onClose,
|
|
@@ -10522,7 +10658,7 @@ function RelationshipDetailsPanel({
|
|
|
10522
10658
|
title: "Fechar"
|
|
10523
10659
|
},
|
|
10524
10660
|
"\xD7"
|
|
10525
|
-
)), /* @__PURE__ */
|
|
10661
|
+
)), /* @__PURE__ */ import_react22.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome da Rela\xE7\xE3o"), /* @__PURE__ */ import_react22.default.createElement(
|
|
10526
10662
|
"input",
|
|
10527
10663
|
{
|
|
10528
10664
|
type: "text",
|
|
@@ -10537,7 +10673,7 @@ function RelationshipDetailsPanel({
|
|
|
10537
10673
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
10538
10674
|
`
|
|
10539
10675
|
}
|
|
10540
|
-
)), /* @__PURE__ */
|
|
10676
|
+
)), /* @__PURE__ */ import_react22.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react22.default.createElement(
|
|
10541
10677
|
"svg",
|
|
10542
10678
|
{
|
|
10543
10679
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10551,9 +10687,9 @@ function RelationshipDetailsPanel({
|
|
|
10551
10687
|
strokeLinejoin: "round",
|
|
10552
10688
|
className: "text-violet-400 flex-shrink-0"
|
|
10553
10689
|
},
|
|
10554
|
-
/* @__PURE__ */
|
|
10555
|
-
/* @__PURE__ */
|
|
10556
|
-
), /* @__PURE__ */
|
|
10690
|
+
/* @__PURE__ */ import_react22.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" }),
|
|
10691
|
+
/* @__PURE__ */ import_react22.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })
|
|
10692
|
+
), /* @__PURE__ */ import_react22.default.createElement("p", { className: "text-xs font-medium text-violet-300/80 uppercase tracking-wider" }, "Labels de Agrupamento")), /* @__PURE__ */ import_react22.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_react22.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Source"), /* @__PURE__ */ import_react22.default.createElement(
|
|
10557
10693
|
"input",
|
|
10558
10694
|
{
|
|
10559
10695
|
type: "text",
|
|
@@ -10568,7 +10704,7 @@ function RelationshipDetailsPanel({
|
|
|
10568
10704
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
10569
10705
|
`
|
|
10570
10706
|
}
|
|
10571
|
-
)), /* @__PURE__ */
|
|
10707
|
+
)), /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Target"), /* @__PURE__ */ import_react22.default.createElement(
|
|
10572
10708
|
"input",
|
|
10573
10709
|
{
|
|
10574
10710
|
type: "text",
|
|
@@ -10583,8 +10719,8 @@ function RelationshipDetailsPanel({
|
|
|
10583
10719
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
10584
10720
|
`
|
|
10585
10721
|
}
|
|
10586
|
-
)))), /* @__PURE__ */
|
|
10587
|
-
|
|
10722
|
+
)))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react22.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react22.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_react22.default.createElement(
|
|
10723
|
+
DescriptionDisplay2,
|
|
10588
10724
|
{
|
|
10589
10725
|
description,
|
|
10590
10726
|
savedSections: existingSections,
|
|
@@ -10595,7 +10731,7 @@ function RelationshipDetailsPanel({
|
|
|
10595
10731
|
onImageClick: handleImageClickFromText,
|
|
10596
10732
|
onSaveDescription: handleSaveDescriptionInline
|
|
10597
10733
|
}
|
|
10598
|
-
), /* @__PURE__ */
|
|
10734
|
+
), /* @__PURE__ */ import_react22.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_react22.default.createElement(
|
|
10599
10735
|
"button",
|
|
10600
10736
|
{
|
|
10601
10737
|
type: "button",
|
|
@@ -10603,8 +10739,8 @@ function RelationshipDetailsPanel({
|
|
|
10603
10739
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors border-r border-white/5",
|
|
10604
10740
|
title: "Modo de Leitura"
|
|
10605
10741
|
},
|
|
10606
|
-
/* @__PURE__ */
|
|
10607
|
-
), canEdit && /* @__PURE__ */
|
|
10742
|
+
/* @__PURE__ */ import_react22.default.createElement(import_fi18.FiBookOpen, { size: 14 })
|
|
10743
|
+
), canEdit && /* @__PURE__ */ import_react22.default.createElement(
|
|
10608
10744
|
"button",
|
|
10609
10745
|
{
|
|
10610
10746
|
type: "button",
|
|
@@ -10612,25 +10748,25 @@ function RelationshipDetailsPanel({
|
|
|
10612
10748
|
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
10613
10749
|
title: "Editar descri\xE7\xE3o"
|
|
10614
10750
|
},
|
|
10615
|
-
/* @__PURE__ */
|
|
10616
|
-
)), !description && canEdit && /* @__PURE__ */
|
|
10751
|
+
/* @__PURE__ */ import_react22.default.createElement(import_fi18.FiEdit2, { size: 14 })
|
|
10752
|
+
)), !description && canEdit && /* @__PURE__ */ import_react22.default.createElement(
|
|
10617
10753
|
"div",
|
|
10618
10754
|
{
|
|
10619
10755
|
onClick: () => setIsDescriptionModalOpen(true),
|
|
10620
10756
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
10621
10757
|
},
|
|
10622
10758
|
"Adicionar descri\xE7\xE3o..."
|
|
10623
|
-
))), /* @__PURE__ */
|
|
10759
|
+
))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react22.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react22.default.createElement(
|
|
10624
10760
|
"button",
|
|
10625
10761
|
{
|
|
10626
10762
|
type: "button",
|
|
10627
10763
|
onClick: handleAddProp,
|
|
10628
10764
|
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"
|
|
10629
10765
|
},
|
|
10630
|
-
/* @__PURE__ */
|
|
10766
|
+
/* @__PURE__ */ import_react22.default.createElement(import_fi18.FiPlus, { size: 14 }),
|
|
10631
10767
|
" Adicionar"
|
|
10632
|
-
)), /* @__PURE__ */
|
|
10633
|
-
|
|
10768
|
+
)), /* @__PURE__ */ import_react22.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react22.default.createElement(
|
|
10769
|
+
CustomPropertyDisplay2,
|
|
10634
10770
|
{
|
|
10635
10771
|
key: prop.id,
|
|
10636
10772
|
prop,
|
|
@@ -10643,7 +10779,7 @@ function RelationshipDetailsPanel({
|
|
|
10643
10779
|
onUploadFile,
|
|
10644
10780
|
disabled: !canEdit
|
|
10645
10781
|
}
|
|
10646
|
-
)), /* @__PURE__ */
|
|
10782
|
+
)), /* @__PURE__ */ import_react22.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react22.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_react22.default.createElement(
|
|
10647
10783
|
"button",
|
|
10648
10784
|
{
|
|
10649
10785
|
onClick: onClose,
|
|
@@ -10651,7 +10787,7 @@ function RelationshipDetailsPanel({
|
|
|
10651
10787
|
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50"
|
|
10652
10788
|
},
|
|
10653
10789
|
canEdit ? "Cancelar" : "Fechar"
|
|
10654
|
-
), canEdit && /* @__PURE__ */
|
|
10790
|
+
), canEdit && /* @__PURE__ */ import_react22.default.createElement(
|
|
10655
10791
|
"button",
|
|
10656
10792
|
{
|
|
10657
10793
|
onClick: () => handleSave(false),
|
|
@@ -10660,11 +10796,11 @@ function RelationshipDetailsPanel({
|
|
|
10660
10796
|
${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"}
|
|
10661
10797
|
`
|
|
10662
10798
|
},
|
|
10663
|
-
isSaving && /* @__PURE__ */
|
|
10799
|
+
isSaving && /* @__PURE__ */ import_react22.default.createElement(import_fi18.FiLoader, { className: "animate-spin" }),
|
|
10664
10800
|
isSaving ? "Salvando..." : "Salvar"
|
|
10665
10801
|
)))
|
|
10666
|
-
), isDescriptionModalOpen && /* @__PURE__ */
|
|
10667
|
-
|
|
10802
|
+
), isDescriptionModalOpen && /* @__PURE__ */ import_react22.default.createElement(
|
|
10803
|
+
DescriptionEditModal2,
|
|
10668
10804
|
{
|
|
10669
10805
|
isOpen: isDescriptionModalOpen,
|
|
10670
10806
|
title: "Editar Descri\xE7\xE3o da Rela\xE7\xE3o",
|
|
@@ -10685,7 +10821,7 @@ function RelationshipDetailsPanel({
|
|
|
10685
10821
|
}
|
|
10686
10822
|
|
|
10687
10823
|
// src/components/RelationshipContextMenu.jsx
|
|
10688
|
-
var
|
|
10824
|
+
var import_react23 = __toESM(require("react"));
|
|
10689
10825
|
function RelationshipContextMenu({
|
|
10690
10826
|
data,
|
|
10691
10827
|
userRole,
|
|
@@ -10695,25 +10831,25 @@ function RelationshipContextMenu({
|
|
|
10695
10831
|
onDelete,
|
|
10696
10832
|
onClose
|
|
10697
10833
|
}) {
|
|
10698
|
-
const menuRef = (0,
|
|
10699
|
-
const [menuPos, setMenuPos] = (0,
|
|
10700
|
-
const [isConfirmingDelete, setIsConfirmingDelete] = (0,
|
|
10701
|
-
const ability = (0,
|
|
10702
|
-
const sourceName = (0,
|
|
10834
|
+
const menuRef = (0, import_react23.useRef)(null);
|
|
10835
|
+
const [menuPos, setMenuPos] = (0, import_react23.useState)({ left: 0, top: 0 });
|
|
10836
|
+
const [isConfirmingDelete, setIsConfirmingDelete] = (0, import_react23.useState)(false);
|
|
10837
|
+
const ability = (0, import_react23.useMemo)(() => defineAbilityFor(userRole), [userRole]);
|
|
10838
|
+
const sourceName = (0, import_react23.useMemo)(
|
|
10703
10839
|
() => {
|
|
10704
10840
|
var _a, _b, _c, _d;
|
|
10705
10841
|
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)";
|
|
10706
10842
|
},
|
|
10707
10843
|
[data == null ? void 0 : data.linkObject]
|
|
10708
10844
|
);
|
|
10709
|
-
const targetName = (0,
|
|
10845
|
+
const targetName = (0, import_react23.useMemo)(
|
|
10710
10846
|
() => {
|
|
10711
10847
|
var _a, _b, _c, _d;
|
|
10712
10848
|
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)";
|
|
10713
10849
|
},
|
|
10714
10850
|
[data == null ? void 0 : data.linkObject]
|
|
10715
10851
|
);
|
|
10716
|
-
(0,
|
|
10852
|
+
(0, import_react23.useLayoutEffect)(() => {
|
|
10717
10853
|
if (!data.visible || !menuRef.current) return;
|
|
10718
10854
|
const el = menuRef.current;
|
|
10719
10855
|
const w = el.clientWidth;
|
|
@@ -10726,7 +10862,7 @@ function RelationshipContextMenu({
|
|
|
10726
10862
|
if (top + h + 8 > vh) top = Math.max(8, vh - h - 8);
|
|
10727
10863
|
setMenuPos({ left, top });
|
|
10728
10864
|
}, [data]);
|
|
10729
|
-
(0,
|
|
10865
|
+
(0, import_react23.useEffect)(() => {
|
|
10730
10866
|
if (data.visible) {
|
|
10731
10867
|
setIsConfirmingDelete(false);
|
|
10732
10868
|
}
|
|
@@ -10742,7 +10878,7 @@ function RelationshipContextMenu({
|
|
|
10742
10878
|
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";
|
|
10743
10879
|
const canUpdate = ability.can("update", "Connection");
|
|
10744
10880
|
const canDelete = ability.can("delete", "Connection");
|
|
10745
|
-
return /* @__PURE__ */
|
|
10881
|
+
return /* @__PURE__ */ import_react23.default.createElement(
|
|
10746
10882
|
"div",
|
|
10747
10883
|
{
|
|
10748
10884
|
ref: menuRef,
|
|
@@ -10756,29 +10892,29 @@ function RelationshipContextMenu({
|
|
|
10756
10892
|
onContextMenu: swallow,
|
|
10757
10893
|
onDoubleClick: swallow
|
|
10758
10894
|
},
|
|
10759
|
-
/* @__PURE__ */
|
|
10760
|
-
/* @__PURE__ */
|
|
10895
|
+
/* @__PURE__ */ import_react23.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }),
|
|
10896
|
+
/* @__PURE__ */ import_react23.default.createElement("div", { className: "p-1.5" }, isConfirmingDelete ? /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex flex-col gap-3 p-2" }, /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex flex-col items-center text-center gap-2" }, /* @__PURE__ */ import_react23.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_react23.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_react23.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M10 11v6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M14 11v6" }), /* @__PURE__ */ import_react23.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" }))), /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-sm text-slate-200" }, "Excluir rela\xE7\xE3o?"), /* @__PURE__ */ import_react23.default.createElement("p", { className: "text-[11px] text-slate-400 leading-tight break-words" }, "Desconectar ", /* @__PURE__ */ import_react23.default.createElement("strong", null, sourceName), " de ", /* @__PURE__ */ import_react23.default.createElement("strong", null, targetName), ".")), /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex gap-2 mt-1" }, /* @__PURE__ */ import_react23.default.createElement(
|
|
10761
10897
|
"button",
|
|
10762
10898
|
{
|
|
10763
10899
|
onClick: () => setIsConfirmingDelete(false),
|
|
10764
10900
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-white/10 hover:bg-white/20 rounded-md text-white transition-colors"
|
|
10765
10901
|
},
|
|
10766
10902
|
"Cancelar"
|
|
10767
|
-
), /* @__PURE__ */
|
|
10903
|
+
), /* @__PURE__ */ import_react23.default.createElement(
|
|
10768
10904
|
"button",
|
|
10769
10905
|
{
|
|
10770
10906
|
onClick: () => onDelete == null ? void 0 : onDelete(data.linkObject),
|
|
10771
10907
|
className: "flex-1 px-2 py-2 text-xs font-medium bg-rose-600 hover:bg-rose-500 rounded-md text-white transition-colors"
|
|
10772
10908
|
},
|
|
10773
10909
|
"Excluir"
|
|
10774
|
-
))) : /* @__PURE__ */
|
|
10910
|
+
))) : /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react23.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_react23.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Rela\xE7\xE3o")), /* @__PURE__ */ import_react23.default.createElement("div", { className: "flex flex-col gap-1" }, canUpdate && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement(
|
|
10775
10911
|
"button",
|
|
10776
10912
|
{
|
|
10777
10913
|
onClick: () => onRelinkSource == null ? void 0 : onRelinkSource(data.linkObject),
|
|
10778
10914
|
className: baseButtonClass,
|
|
10779
10915
|
title: "Desconectar ponta ligada ao Source"
|
|
10780
10916
|
},
|
|
10781
|
-
/* @__PURE__ */
|
|
10917
|
+
/* @__PURE__ */ import_react23.default.createElement(
|
|
10782
10918
|
"svg",
|
|
10783
10919
|
{
|
|
10784
10920
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10791,18 +10927,18 @@ function RelationshipContextMenu({
|
|
|
10791
10927
|
strokeLinecap: "round",
|
|
10792
10928
|
strokeLinejoin: "round"
|
|
10793
10929
|
},
|
|
10794
|
-
/* @__PURE__ */
|
|
10795
|
-
/* @__PURE__ */
|
|
10930
|
+
/* @__PURE__ */ import_react23.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" }),
|
|
10931
|
+
/* @__PURE__ */ import_react23.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" })
|
|
10796
10932
|
),
|
|
10797
|
-
/* @__PURE__ */
|
|
10798
|
-
), /* @__PURE__ */
|
|
10933
|
+
/* @__PURE__ */ import_react23.default.createElement("span", null, "Desconectar Source (", sourceName, ")")
|
|
10934
|
+
), /* @__PURE__ */ import_react23.default.createElement(
|
|
10799
10935
|
"button",
|
|
10800
10936
|
{
|
|
10801
10937
|
onClick: () => onRelinkTarget == null ? void 0 : onRelinkTarget(data.linkObject),
|
|
10802
10938
|
className: baseButtonClass,
|
|
10803
10939
|
title: "Desconectar ponta ligada ao Target"
|
|
10804
10940
|
},
|
|
10805
|
-
/* @__PURE__ */
|
|
10941
|
+
/* @__PURE__ */ import_react23.default.createElement(
|
|
10806
10942
|
"svg",
|
|
10807
10943
|
{
|
|
10808
10944
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10815,21 +10951,21 @@ function RelationshipContextMenu({
|
|
|
10815
10951
|
strokeLinecap: "round",
|
|
10816
10952
|
strokeLinejoin: "round"
|
|
10817
10953
|
},
|
|
10818
|
-
/* @__PURE__ */
|
|
10819
|
-
/* @__PURE__ */
|
|
10820
|
-
/* @__PURE__ */
|
|
10821
|
-
/* @__PURE__ */
|
|
10822
|
-
/* @__PURE__ */
|
|
10954
|
+
/* @__PURE__ */ import_react23.default.createElement("polyline", { points: "16 3 21 3 21 8" }),
|
|
10955
|
+
/* @__PURE__ */ import_react23.default.createElement("line", { x1: "4", y1: "20", x2: "21", y2: "3" }),
|
|
10956
|
+
/* @__PURE__ */ import_react23.default.createElement("polyline", { points: "21 16 21 21 16 21" }),
|
|
10957
|
+
/* @__PURE__ */ import_react23.default.createElement("line", { x1: "15", y1: "15", x2: "21", y2: "21" }),
|
|
10958
|
+
/* @__PURE__ */ import_react23.default.createElement("line", { x1: "4", y1: "4", x2: "9", y2: "9" })
|
|
10823
10959
|
),
|
|
10824
|
-
/* @__PURE__ */
|
|
10825
|
-
), /* @__PURE__ */
|
|
10960
|
+
/* @__PURE__ */ import_react23.default.createElement("span", null, "Desconectar Target (", targetName, ")")
|
|
10961
|
+
), /* @__PURE__ */ import_react23.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" })), /* @__PURE__ */ import_react23.default.createElement(
|
|
10826
10962
|
"button",
|
|
10827
10963
|
{
|
|
10828
10964
|
onClick: () => onOpenDetails == null ? void 0 : onOpenDetails(data.linkObject),
|
|
10829
10965
|
className: baseButtonClass,
|
|
10830
10966
|
title: "Abrir detalhes da rela\xE7\xE3o"
|
|
10831
10967
|
},
|
|
10832
|
-
/* @__PURE__ */
|
|
10968
|
+
/* @__PURE__ */ import_react23.default.createElement(
|
|
10833
10969
|
"svg",
|
|
10834
10970
|
{
|
|
10835
10971
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10842,19 +10978,19 @@ function RelationshipContextMenu({
|
|
|
10842
10978
|
strokeLinecap: "round",
|
|
10843
10979
|
strokeLinejoin: "round"
|
|
10844
10980
|
},
|
|
10845
|
-
/* @__PURE__ */
|
|
10846
|
-
/* @__PURE__ */
|
|
10847
|
-
/* @__PURE__ */
|
|
10981
|
+
/* @__PURE__ */ import_react23.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
|
|
10982
|
+
/* @__PURE__ */ import_react23.default.createElement("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
|
|
10983
|
+
/* @__PURE__ */ import_react23.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "8" })
|
|
10848
10984
|
),
|
|
10849
|
-
/* @__PURE__ */
|
|
10850
|
-
), canDelete && /* @__PURE__ */
|
|
10985
|
+
/* @__PURE__ */ import_react23.default.createElement("span", null, "Abrir Detalhes")
|
|
10986
|
+
), canDelete && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("div", { className: "h-[1px] my-1 mx-1 bg-white/10" }), /* @__PURE__ */ import_react23.default.createElement(
|
|
10851
10987
|
"button",
|
|
10852
10988
|
{
|
|
10853
10989
|
onClick: () => setIsConfirmingDelete(true),
|
|
10854
10990
|
className: dangerButtonClass,
|
|
10855
10991
|
title: "Excluir esta conex\xE3o"
|
|
10856
10992
|
},
|
|
10857
|
-
/* @__PURE__ */
|
|
10993
|
+
/* @__PURE__ */ import_react23.default.createElement(
|
|
10858
10994
|
"svg",
|
|
10859
10995
|
{
|
|
10860
10996
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -10867,19 +11003,19 @@ function RelationshipContextMenu({
|
|
|
10867
11003
|
strokeLinecap: "round",
|
|
10868
11004
|
strokeLinejoin: "round"
|
|
10869
11005
|
},
|
|
10870
|
-
/* @__PURE__ */
|
|
10871
|
-
/* @__PURE__ */
|
|
10872
|
-
/* @__PURE__ */
|
|
10873
|
-
/* @__PURE__ */
|
|
10874
|
-
/* @__PURE__ */
|
|
11006
|
+
/* @__PURE__ */ import_react23.default.createElement("polyline", { points: "3 6 5 6 21 6" }),
|
|
11007
|
+
/* @__PURE__ */ import_react23.default.createElement("path", { d: "M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }),
|
|
11008
|
+
/* @__PURE__ */ import_react23.default.createElement("path", { d: "M10 11v6" }),
|
|
11009
|
+
/* @__PURE__ */ import_react23.default.createElement("path", { d: "M14 11v6" }),
|
|
11010
|
+
/* @__PURE__ */ import_react23.default.createElement("path", { d: "M9 6V4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2" })
|
|
10875
11011
|
),
|
|
10876
|
-
/* @__PURE__ */
|
|
11012
|
+
/* @__PURE__ */ import_react23.default.createElement("span", null, "Excluir conex\xE3o (", sourceName, " \u2192 ", targetName, ")")
|
|
10877
11013
|
)))))
|
|
10878
11014
|
);
|
|
10879
11015
|
}
|
|
10880
11016
|
|
|
10881
11017
|
// src/components/LoadingScreen.jsx
|
|
10882
|
-
var
|
|
11018
|
+
var import_react24 = __toESM(require("react"));
|
|
10883
11019
|
var styles = {
|
|
10884
11020
|
loadingOverlay: {
|
|
10885
11021
|
position: "fixed",
|
|
@@ -10911,11 +11047,11 @@ var styles = {
|
|
|
10911
11047
|
`
|
|
10912
11048
|
};
|
|
10913
11049
|
function LoadingScreen() {
|
|
10914
|
-
return /* @__PURE__ */
|
|
11050
|
+
return /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, null, /* @__PURE__ */ import_react24.default.createElement("style", null, styles.keyframes), /* @__PURE__ */ import_react24.default.createElement("div", { style: styles.loadingOverlay }, /* @__PURE__ */ import_react24.default.createElement("div", { style: styles.spinner })));
|
|
10915
11051
|
}
|
|
10916
11052
|
|
|
10917
11053
|
// src/components/ImportParentFileModal.jsx
|
|
10918
|
-
var
|
|
11054
|
+
var import_react25 = __toESM(require("react"));
|
|
10919
11055
|
function ImportParentFileModal({
|
|
10920
11056
|
isOpen,
|
|
10921
11057
|
onClose,
|
|
@@ -10926,12 +11062,12 @@ function ImportParentFileModal({
|
|
|
10926
11062
|
onFetchAvailableFiles,
|
|
10927
11063
|
currentViewName
|
|
10928
11064
|
}) {
|
|
10929
|
-
const [activeTab, setActiveTab] = (0,
|
|
10930
|
-
const [availableDbs, setAvailableDbs] = (0,
|
|
10931
|
-
const [availableViews, setAvailableViews] = (0,
|
|
10932
|
-
const [selectedItem, setSelectedItem] = (0,
|
|
10933
|
-
const [isLoading, setIsLoading] = (0,
|
|
10934
|
-
(0,
|
|
11065
|
+
const [activeTab, setActiveTab] = (0, import_react25.useState)("databases");
|
|
11066
|
+
const [availableDbs, setAvailableDbs] = (0, import_react25.useState)([]);
|
|
11067
|
+
const [availableViews, setAvailableViews] = (0, import_react25.useState)([]);
|
|
11068
|
+
const [selectedItem, setSelectedItem] = (0, import_react25.useState)(null);
|
|
11069
|
+
const [isLoading, setIsLoading] = (0, import_react25.useState)(false);
|
|
11070
|
+
(0, import_react25.useEffect)(() => {
|
|
10935
11071
|
if (isOpen && session && onFetchAvailableFiles) {
|
|
10936
11072
|
const fetchData = async () => {
|
|
10937
11073
|
setIsLoading(true);
|
|
@@ -10967,7 +11103,7 @@ function ImportParentFileModal({
|
|
|
10967
11103
|
fetchData();
|
|
10968
11104
|
}
|
|
10969
11105
|
}, [isOpen, session, parentDbs, onFetchAvailableFiles, currentViewName]);
|
|
10970
|
-
(0,
|
|
11106
|
+
(0, import_react25.useEffect)(() => {
|
|
10971
11107
|
setSelectedItem(null);
|
|
10972
11108
|
}, [activeTab]);
|
|
10973
11109
|
if (!isOpen) {
|
|
@@ -10996,13 +11132,13 @@ function ImportParentFileModal({
|
|
|
10996
11132
|
const swallow = (e) => e.stopPropagation();
|
|
10997
11133
|
const currentList = activeTab === "databases" ? availableDbs : availableViews;
|
|
10998
11134
|
const emptyMessage = activeTab === "databases" ? "Nenhum novo arquivo parent dispon\xEDvel." : "Nenhuma view dispon\xEDvel para importa\xE7\xE3o.";
|
|
10999
|
-
return /* @__PURE__ */
|
|
11135
|
+
return /* @__PURE__ */ import_react25.default.createElement(
|
|
11000
11136
|
"div",
|
|
11001
11137
|
{
|
|
11002
11138
|
className: "ui-overlay fixed inset-0 z-[1200] flex items-center justify-center bg-black/60 backdrop-blur-sm",
|
|
11003
11139
|
onClick: onClose
|
|
11004
11140
|
},
|
|
11005
|
-
/* @__PURE__ */
|
|
11141
|
+
/* @__PURE__ */ import_react25.default.createElement(
|
|
11006
11142
|
"div",
|
|
11007
11143
|
{
|
|
11008
11144
|
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]",
|
|
@@ -11014,14 +11150,14 @@ function ImportParentFileModal({
|
|
|
11014
11150
|
onContextMenu: swallow,
|
|
11015
11151
|
onDoubleClick: swallow
|
|
11016
11152
|
},
|
|
11017
|
-
/* @__PURE__ */
|
|
11153
|
+
/* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/10 flex-shrink-0" }, /* @__PURE__ */ import_react25.default.createElement("h2", { className: "text-lg font-semibold" }, "Importar"), /* @__PURE__ */ import_react25.default.createElement(
|
|
11018
11154
|
"button",
|
|
11019
11155
|
{
|
|
11020
11156
|
onClick: onClose,
|
|
11021
11157
|
className: "p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
11022
11158
|
title: "Fechar"
|
|
11023
11159
|
},
|
|
11024
|
-
/* @__PURE__ */
|
|
11160
|
+
/* @__PURE__ */ import_react25.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
11025
11161
|
"path",
|
|
11026
11162
|
{
|
|
11027
11163
|
fillRule: "evenodd",
|
|
@@ -11030,14 +11166,14 @@ function ImportParentFileModal({
|
|
|
11030
11166
|
}
|
|
11031
11167
|
))
|
|
11032
11168
|
)),
|
|
11033
|
-
/* @__PURE__ */
|
|
11169
|
+
/* @__PURE__ */ import_react25.default.createElement("div", { className: "flex px-6 border-b border-white/10 bg-white/5 flex-shrink-0" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
11034
11170
|
"button",
|
|
11035
11171
|
{
|
|
11036
11172
|
onClick: () => setActiveTab("databases"),
|
|
11037
11173
|
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"}`
|
|
11038
11174
|
},
|
|
11039
11175
|
"Arquivos Parent"
|
|
11040
|
-
), /* @__PURE__ */
|
|
11176
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
11041
11177
|
"button",
|
|
11042
11178
|
{
|
|
11043
11179
|
onClick: () => setActiveTab("views"),
|
|
@@ -11045,24 +11181,24 @@ function ImportParentFileModal({
|
|
|
11045
11181
|
},
|
|
11046
11182
|
"Views (Ancestralidades)"
|
|
11047
11183
|
)),
|
|
11048
|
-
/* @__PURE__ */
|
|
11184
|
+
/* @__PURE__ */ import_react25.default.createElement("div", { className: "p-6 overflow-y-auto custom-scrollbar flex-grow min-h-[200px]" }, isLoading ? /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-center h-40" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "w-8 h-8 border-4 border-t-indigo-500 border-slate-700 rounded-full animate-spin" })) : /* @__PURE__ */ import_react25.default.createElement("div", { className: "space-y-2" }, currentList.length > 0 ? currentList.map((item) => /* @__PURE__ */ import_react25.default.createElement(
|
|
11049
11185
|
"div",
|
|
11050
11186
|
{
|
|
11051
11187
|
key: item.id,
|
|
11052
11188
|
onClick: () => setSelectedItem(item),
|
|
11053
11189
|
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"}`
|
|
11054
11190
|
},
|
|
11055
|
-
/* @__PURE__ */
|
|
11056
|
-
item.description && /* @__PURE__ */
|
|
11057
|
-
)) : /* @__PURE__ */
|
|
11058
|
-
/* @__PURE__ */
|
|
11191
|
+
/* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "font-medium text-slate-100" }, item.name), activeTab === "views" && /* @__PURE__ */ import_react25.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")),
|
|
11192
|
+
item.description && /* @__PURE__ */ import_react25.default.createElement("p", { className: `text-xs ${(selectedItem == null ? void 0 : selectedItem.id) === item.id ? "text-indigo-200" : "text-slate-400"}` }, item.description)
|
|
11193
|
+
)) : /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-slate-400 text-center py-10" }, emptyMessage))),
|
|
11194
|
+
/* @__PURE__ */ import_react25.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_react25.default.createElement(
|
|
11059
11195
|
"button",
|
|
11060
11196
|
{
|
|
11061
11197
|
onClick: onClose,
|
|
11062
11198
|
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm text-slate-300"
|
|
11063
11199
|
},
|
|
11064
11200
|
"Cancelar"
|
|
11065
|
-
), /* @__PURE__ */
|
|
11201
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
11066
11202
|
"button",
|
|
11067
11203
|
{
|
|
11068
11204
|
onClick: handleConfirm,
|
|
@@ -11076,7 +11212,7 @@ function ImportParentFileModal({
|
|
|
11076
11212
|
}
|
|
11077
11213
|
|
|
11078
11214
|
// src/components/AncestryLinkDetailsPanel.jsx
|
|
11079
|
-
var
|
|
11215
|
+
var import_react26 = __toESM(require("react"));
|
|
11080
11216
|
var import_fi19 = require("react-icons/fi");
|
|
11081
11217
|
function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenReference, onMentionClick, onUploadFile }) {
|
|
11082
11218
|
var _a, _b, _c, _d;
|
|
@@ -11086,21 +11222,21 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
11086
11222
|
const customProps = extractCustomPropsFromNode(relationshipData);
|
|
11087
11223
|
const sourceName = ((_b = (_a = data.sourceNode) == null ? void 0 : _a.userData) == null ? void 0 : _b.name) || "Origem";
|
|
11088
11224
|
const targetName = ((_d = (_c = data.targetNode) == null ? void 0 : _c.userData) == null ? void 0 : _d.name) || "Destino";
|
|
11089
|
-
const [isReadMode, setIsReadMode] = (0,
|
|
11225
|
+
const [isReadMode, setIsReadMode] = (0, import_react26.useState)(false);
|
|
11090
11226
|
const swallow = (e) => e.stopPropagation();
|
|
11091
11227
|
const handleImageClickFromText = (url, name) => {
|
|
11092
11228
|
if (onOpenImageViewer) {
|
|
11093
11229
|
onOpenImageViewer([{ name: name || "Imagem", value: url }], 0);
|
|
11094
11230
|
}
|
|
11095
11231
|
};
|
|
11096
|
-
return /* @__PURE__ */
|
|
11232
|
+
return /* @__PURE__ */ import_react26.default.createElement(
|
|
11097
11233
|
"div",
|
|
11098
11234
|
{
|
|
11099
11235
|
className: "ui-overlay fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[1200]",
|
|
11100
11236
|
onClick: onClose,
|
|
11101
11237
|
onPointerDown: swallow
|
|
11102
11238
|
},
|
|
11103
|
-
/* @__PURE__ */
|
|
11239
|
+
/* @__PURE__ */ import_react26.default.createElement(
|
|
11104
11240
|
"div",
|
|
11105
11241
|
{
|
|
11106
11242
|
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
|
|
@@ -11108,7 +11244,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
11108
11244
|
`,
|
|
11109
11245
|
onClick: swallow
|
|
11110
11246
|
},
|
|
11111
|
-
isReadMode ? /* @__PURE__ */
|
|
11247
|
+
isReadMode ? /* @__PURE__ */ import_react26.default.createElement(
|
|
11112
11248
|
DescriptionReadModePanel,
|
|
11113
11249
|
{
|
|
11114
11250
|
title: `${sourceName} \u2794 ${targetName}`,
|
|
@@ -11120,16 +11256,16 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
11120
11256
|
onMentionClick,
|
|
11121
11257
|
onImageClick: handleImageClickFromText
|
|
11122
11258
|
}
|
|
11123
|
-
) : /* @__PURE__ */
|
|
11259
|
+
) : /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-blue-500/0 via-blue-500/70 to-blue-500/0" }), /* @__PURE__ */ import_react26.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react26.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_react26.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Ancestralidade")), /* @__PURE__ */ import_react26.default.createElement("h2", { className: "text-lg font-semibold tracking-tight flex items-center gap-2" }, /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[150px]" }, sourceName), /* @__PURE__ */ import_react26.default.createElement("span", { className: "text-slate-500 text-sm" }, "\u2794"), /* @__PURE__ */ import_react26.default.createElement("span", { className: "truncate max-w-[150px]" }, targetName))), /* @__PURE__ */ import_react26.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_react26.default.createElement("div", { className: "px-6 pb-6 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, description && /* @__PURE__ */ import_react26.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react26.default.createElement("label", { className: "text-xs text-slate-300 font-medium" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react26.default.createElement(
|
|
11124
11260
|
"button",
|
|
11125
11261
|
{
|
|
11126
11262
|
onClick: () => setIsReadMode(true),
|
|
11127
11263
|
className: "p-1 text-slate-400 hover:text-white transition-colors",
|
|
11128
11264
|
title: "Modo de Leitura"
|
|
11129
11265
|
},
|
|
11130
|
-
/* @__PURE__ */
|
|
11131
|
-
)), /* @__PURE__ */
|
|
11132
|
-
|
|
11266
|
+
/* @__PURE__ */ import_react26.default.createElement(import_fi19.FiBookOpen, { size: 14 })
|
|
11267
|
+
)), /* @__PURE__ */ import_react26.default.createElement("div", { className: "bg-slate-800/40 rounded-lg border border-white/10 p-1 relative group" }, /* @__PURE__ */ import_react26.default.createElement(
|
|
11268
|
+
DescriptionDisplay2,
|
|
11133
11269
|
{
|
|
11134
11270
|
description,
|
|
11135
11271
|
savedSections,
|
|
@@ -11137,8 +11273,8 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
11137
11273
|
onMentionClick,
|
|
11138
11274
|
onImageClick: handleImageClickFromText
|
|
11139
11275
|
}
|
|
11140
|
-
))), customProps.length > 0 && /* @__PURE__ */
|
|
11141
|
-
|
|
11276
|
+
))), customProps.length > 0 && /* @__PURE__ */ import_react26.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react26.default.createElement("label", { className: "text-xs text-slate-300 font-medium mb-2 block" }, "Propriedades"), /* @__PURE__ */ import_react26.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop) => /* @__PURE__ */ import_react26.default.createElement(
|
|
11277
|
+
CustomPropertyDisplay2,
|
|
11142
11278
|
{
|
|
11143
11279
|
key: prop.id,
|
|
11144
11280
|
prop,
|
|
@@ -11146,13 +11282,13 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
|
|
|
11146
11282
|
onOpenImageViewer,
|
|
11147
11283
|
onUploadFile
|
|
11148
11284
|
}
|
|
11149
|
-
)))), !description && customProps.length === 0 && /* @__PURE__ */
|
|
11285
|
+
)))), !description && customProps.length === 0 && /* @__PURE__ */ import_react26.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_react26.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".')))
|
|
11150
11286
|
)
|
|
11151
11287
|
);
|
|
11152
11288
|
}
|
|
11153
11289
|
|
|
11154
11290
|
// src/components/AncestryBoard.jsx
|
|
11155
|
-
var
|
|
11291
|
+
var import_react27 = __toESM(require("react"));
|
|
11156
11292
|
var import_fi20 = require("react-icons/fi");
|
|
11157
11293
|
var GroupItem = ({
|
|
11158
11294
|
group,
|
|
@@ -11172,7 +11308,7 @@ var GroupItem = ({
|
|
|
11172
11308
|
}) => {
|
|
11173
11309
|
const canIndent = index > 0;
|
|
11174
11310
|
const isPickingForThisGroup = pickingGroupId === group.id;
|
|
11175
|
-
const textareaRef = (0,
|
|
11311
|
+
const textareaRef = (0, import_react27.useRef)(null);
|
|
11176
11312
|
const adjustHeight = () => {
|
|
11177
11313
|
const textarea = textareaRef.current;
|
|
11178
11314
|
if (textarea) {
|
|
@@ -11180,10 +11316,10 @@ var GroupItem = ({
|
|
|
11180
11316
|
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
11181
11317
|
}
|
|
11182
11318
|
};
|
|
11183
|
-
(0,
|
|
11319
|
+
(0, import_react27.useEffect)(() => {
|
|
11184
11320
|
adjustHeight();
|
|
11185
11321
|
}, [group.text]);
|
|
11186
|
-
return /* @__PURE__ */
|
|
11322
|
+
return /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react27.default.createElement(
|
|
11187
11323
|
"div",
|
|
11188
11324
|
{
|
|
11189
11325
|
className: `
|
|
@@ -11191,7 +11327,7 @@ var GroupItem = ({
|
|
|
11191
11327
|
${isPickingForThisGroup ? "bg-indigo-500/10 border-l-2 border-indigo-500" : "hover:bg-white/5 border-l-2 border-transparent hover:border-white/20"}
|
|
11192
11328
|
`
|
|
11193
11329
|
},
|
|
11194
|
-
/* @__PURE__ */
|
|
11330
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
11195
11331
|
"textarea",
|
|
11196
11332
|
{
|
|
11197
11333
|
ref: textareaRef,
|
|
@@ -11209,9 +11345,9 @@ var GroupItem = ({
|
|
|
11209
11345
|
}
|
|
11210
11346
|
}
|
|
11211
11347
|
),
|
|
11212
|
-
group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */
|
|
11348
|
+
group.ancestries && group.ancestries.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-wrap gap-2 mt-1" }, group.ancestries.map((anc) => {
|
|
11213
11349
|
const isValid = availableIds.has(String(anc.ancestry_id));
|
|
11214
|
-
return /* @__PURE__ */
|
|
11350
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
11215
11351
|
"div",
|
|
11216
11352
|
{
|
|
11217
11353
|
key: anc.ancestry_id,
|
|
@@ -11223,40 +11359,40 @@ var GroupItem = ({
|
|
|
11223
11359
|
},
|
|
11224
11360
|
isValid ? (
|
|
11225
11361
|
// [MANTIDO] Botão Play visível para todos
|
|
11226
|
-
/* @__PURE__ */
|
|
11362
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
11227
11363
|
"button",
|
|
11228
11364
|
{
|
|
11229
11365
|
onClick: () => onPlayAncestry(anc.ancestry_id),
|
|
11230
11366
|
className: "text-indigo-400 hover:text-white hover:bg-indigo-500 p-1 rounded-full transition-colors",
|
|
11231
11367
|
title: "Renderizar no cen\xE1rio"
|
|
11232
11368
|
},
|
|
11233
|
-
/* @__PURE__ */
|
|
11369
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlay, { size: 10, className: "ml-0.5 fill-current" })
|
|
11234
11370
|
)
|
|
11235
|
-
) : /* @__PURE__ */
|
|
11236
|
-
/* @__PURE__ */
|
|
11371
|
+
) : /* @__PURE__ */ import_react27.default.createElement("div", { className: "p-1 text-red-500 cursor-not-allowed" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiAlertTriangle, { size: 10 })),
|
|
11372
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
11237
11373
|
"span",
|
|
11238
11374
|
{
|
|
11239
11375
|
className: `font-medium truncate max-w-[150px] ${!isValid && "line-through decoration-red-500/50"}`
|
|
11240
11376
|
},
|
|
11241
11377
|
anc.name
|
|
11242
11378
|
),
|
|
11243
|
-
canEdit && /* @__PURE__ */
|
|
11379
|
+
canEdit && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
|
|
11244
11380
|
"div",
|
|
11245
11381
|
{
|
|
11246
11382
|
className: `w-px h-3 mx-0.5 ${isValid ? "bg-white/10" : "bg-red-500/20"}`
|
|
11247
11383
|
}
|
|
11248
|
-
), /* @__PURE__ */
|
|
11384
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
11249
11385
|
"button",
|
|
11250
11386
|
{
|
|
11251
11387
|
onClick: () => onRemoveAncestry(group.id, anc.ancestry_id),
|
|
11252
11388
|
className: `${isValid ? "text-slate-500 hover:text-red-400" : "text-red-400 hover:text-red-200"} p-0.5 rounded transition-colors`,
|
|
11253
11389
|
title: "Remover men\xE7\xE3o"
|
|
11254
11390
|
},
|
|
11255
|
-
/* @__PURE__ */
|
|
11391
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiX, { size: 12 })
|
|
11256
11392
|
))
|
|
11257
11393
|
);
|
|
11258
11394
|
})),
|
|
11259
|
-
canEdit && /* @__PURE__ */
|
|
11395
|
+
canEdit && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
11260
11396
|
"button",
|
|
11261
11397
|
{
|
|
11262
11398
|
onClick: () => onRequestPickAncestry(group.id),
|
|
@@ -11266,17 +11402,17 @@ var GroupItem = ({
|
|
|
11266
11402
|
`,
|
|
11267
11403
|
title: "Adicionar Ancestralidade a este grupo"
|
|
11268
11404
|
},
|
|
11269
|
-
isPickingForThisGroup ? /* @__PURE__ */
|
|
11405
|
+
isPickingForThisGroup ? /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiCheckCircle, { size: 12 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiSearch, { size: 12 }),
|
|
11270
11406
|
isPickingForThisGroup ? "Selecionando..." : "Adicionar"
|
|
11271
|
-
), /* @__PURE__ */
|
|
11407
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
11272
11408
|
"button",
|
|
11273
11409
|
{
|
|
11274
11410
|
onClick: () => onAddSubgroup(group.id),
|
|
11275
11411
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
11276
11412
|
title: "Criar Subgrupo"
|
|
11277
11413
|
},
|
|
11278
|
-
/* @__PURE__ */
|
|
11279
|
-
)), /* @__PURE__ */
|
|
11414
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlus, { size: 14 })
|
|
11415
|
+
)), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
11280
11416
|
"button",
|
|
11281
11417
|
{
|
|
11282
11418
|
onClick: () => onIndent(group.id),
|
|
@@ -11284,25 +11420,25 @@ var GroupItem = ({
|
|
|
11284
11420
|
className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
|
|
11285
11421
|
title: "Aninhar no grupo acima"
|
|
11286
11422
|
},
|
|
11287
|
-
/* @__PURE__ */
|
|
11288
|
-
), /* @__PURE__ */
|
|
11423
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiArrowRight, { size: 14 })
|
|
11424
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
11289
11425
|
"button",
|
|
11290
11426
|
{
|
|
11291
11427
|
onClick: () => onOutdent(group.id),
|
|
11292
11428
|
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
11293
11429
|
title: "Desaninhar"
|
|
11294
11430
|
},
|
|
11295
|
-
/* @__PURE__ */
|
|
11296
|
-
), /* @__PURE__ */
|
|
11431
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiArrowLeft, { size: 14 })
|
|
11432
|
+
), /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement(
|
|
11297
11433
|
"button",
|
|
11298
11434
|
{
|
|
11299
11435
|
onClick: () => onDelete(group.id),
|
|
11300
11436
|
className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
|
|
11301
11437
|
title: "Remover Grupo"
|
|
11302
11438
|
},
|
|
11303
|
-
/* @__PURE__ */
|
|
11439
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiTrash2, { size: 14 })
|
|
11304
11440
|
)))
|
|
11305
|
-
), group.children && group.children.length > 0 && /* @__PURE__ */
|
|
11441
|
+
), group.children && group.children.length > 0 && /* @__PURE__ */ import_react27.default.createElement("div", { className: "ml-2" }, group.children.map((childGroup, idx) => /* @__PURE__ */ import_react27.default.createElement(
|
|
11306
11442
|
GroupItem,
|
|
11307
11443
|
{
|
|
11308
11444
|
key: childGroup.id,
|
|
@@ -11334,21 +11470,21 @@ function AncestryBoard({
|
|
|
11334
11470
|
userRole
|
|
11335
11471
|
// [NOVO] Recebe a role do usuário
|
|
11336
11472
|
}) {
|
|
11337
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
11338
|
-
const [groups, setGroups] = (0,
|
|
11339
|
-
const [isLoaded, setIsLoaded] = (0,
|
|
11340
|
-
const [pickingGroupId, setPickingGroupId] = (0,
|
|
11341
|
-
const [saveStatus, setSaveStatus] = (0,
|
|
11342
|
-
const canEdit = (0,
|
|
11473
|
+
const [searchTerm, setSearchTerm] = (0, import_react27.useState)("");
|
|
11474
|
+
const [groups, setGroups] = (0, import_react27.useState)([]);
|
|
11475
|
+
const [isLoaded, setIsLoaded] = (0, import_react27.useState)(false);
|
|
11476
|
+
const [pickingGroupId, setPickingGroupId] = (0, import_react27.useState)(null);
|
|
11477
|
+
const [saveStatus, setSaveStatus] = (0, import_react27.useState)("idle");
|
|
11478
|
+
const canEdit = (0, import_react27.useMemo)(() => {
|
|
11343
11479
|
return userRole !== "viewer";
|
|
11344
11480
|
}, [userRole]);
|
|
11345
|
-
(0,
|
|
11481
|
+
(0, import_react27.useEffect)(() => {
|
|
11346
11482
|
if (initialGroups && !isLoaded) {
|
|
11347
11483
|
setGroups(initialGroups);
|
|
11348
11484
|
setIsLoaded(true);
|
|
11349
11485
|
}
|
|
11350
11486
|
}, [initialGroups, isLoaded]);
|
|
11351
|
-
const nodeNamesMap = (0,
|
|
11487
|
+
const nodeNamesMap = (0, import_react27.useMemo)(() => {
|
|
11352
11488
|
const map = /* @__PURE__ */ new Map();
|
|
11353
11489
|
if (availableNodes && Array.isArray(availableNodes)) {
|
|
11354
11490
|
availableNodes.forEach((node) => {
|
|
@@ -11359,7 +11495,7 @@ function AncestryBoard({
|
|
|
11359
11495
|
}
|
|
11360
11496
|
return map;
|
|
11361
11497
|
}, [availableNodes]);
|
|
11362
|
-
const availableIds = (0,
|
|
11498
|
+
const availableIds = (0, import_react27.useMemo)(() => {
|
|
11363
11499
|
return new Set(availableAncestries.map((a) => String(a.ancestry_id)));
|
|
11364
11500
|
}, [availableAncestries]);
|
|
11365
11501
|
const sanitizeGroups = (groupList) => {
|
|
@@ -11373,7 +11509,7 @@ function AncestryBoard({
|
|
|
11373
11509
|
children: sanitizeGroups(g.children || [])
|
|
11374
11510
|
}));
|
|
11375
11511
|
};
|
|
11376
|
-
(0,
|
|
11512
|
+
(0, import_react27.useEffect)(() => {
|
|
11377
11513
|
if (!isLoaded || !onSave) return;
|
|
11378
11514
|
const timeoutId = setTimeout(async () => {
|
|
11379
11515
|
setSaveStatus("saving");
|
|
@@ -11391,7 +11527,7 @@ function AncestryBoard({
|
|
|
11391
11527
|
}, 3e3);
|
|
11392
11528
|
return () => clearTimeout(timeoutId);
|
|
11393
11529
|
}, [groups, isLoaded, onSave]);
|
|
11394
|
-
(0,
|
|
11530
|
+
(0, import_react27.useEffect)(() => {
|
|
11395
11531
|
if (!isOpen) return;
|
|
11396
11532
|
const handleKeyDown = (e) => {
|
|
11397
11533
|
if (e.key === "Escape") {
|
|
@@ -11407,7 +11543,7 @@ function AncestryBoard({
|
|
|
11407
11543
|
window.addEventListener("keydown", handleKeyDown);
|
|
11408
11544
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
11409
11545
|
}, [isOpen, onClose, pickingGroupId]);
|
|
11410
|
-
const filtered = (0,
|
|
11546
|
+
const filtered = (0, import_react27.useMemo)(() => {
|
|
11411
11547
|
const term = searchTerm.toLowerCase().trim();
|
|
11412
11548
|
return availableAncestries.filter((a) => {
|
|
11413
11549
|
if (!term) return true;
|
|
@@ -11557,33 +11693,33 @@ function AncestryBoard({
|
|
|
11557
11693
|
});
|
|
11558
11694
|
};
|
|
11559
11695
|
if (!isOpen) return null;
|
|
11560
|
-
return /* @__PURE__ */
|
|
11696
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
11561
11697
|
"div",
|
|
11562
11698
|
{
|
|
11563
11699
|
className: "fixed inset-0 z-[2200] bg-black/80 backdrop-blur-sm flex items-center justify-center p-2",
|
|
11564
11700
|
onClick: onClose
|
|
11565
11701
|
},
|
|
11566
|
-
/* @__PURE__ */
|
|
11702
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
11567
11703
|
"div",
|
|
11568
11704
|
{
|
|
11569
11705
|
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",
|
|
11570
11706
|
onClick: (e) => e.stopPropagation()
|
|
11571
11707
|
},
|
|
11572
|
-
/* @__PURE__ */
|
|
11708
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "h-14 px-4 border-b border-white/10 bg-slate-900/90 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react27.default.createElement("h3", { className: "text-base font-semibold text-white flex items-center gap-2 whitespace-nowrap" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiLayers, { className: "text-indigo-400" }), "Ancestry Board"), saveStatus !== "idle" && /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-px h-4 bg-white/10 mx-1" }), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-slate-900/50 border border-white/5" }, saveStatus === "saving" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(
|
|
11573
11709
|
import_fi20.FiLoader,
|
|
11574
11710
|
{
|
|
11575
11711
|
className: "animate-spin text-indigo-400",
|
|
11576
11712
|
size: 12
|
|
11577
11713
|
}
|
|
11578
|
-
), /* @__PURE__ */
|
|
11714
|
+
), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-indigo-300" }, "Salvando")), saveStatus === "saved" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiCheckCircle, { className: "text-emerald-400", size: 12 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-slate-400" }, "Salvo")), saveStatus === "error" && /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement("span", { className: "w-2 h-2 rounded-full bg-red-500" }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[10px] uppercase tracking-wide font-medium text-red-400" }, "Erro"))))), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center gap-3" }, pickingGroupId && /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-xs text-indigo-300 font-medium animate-pulse hidden sm:inline-block mr-2" }, "Selecione na lateral..."), canEdit && /* @__PURE__ */ import_react27.default.createElement(
|
|
11579
11715
|
"button",
|
|
11580
11716
|
{
|
|
11581
11717
|
onClick: handleAddRootGroup,
|
|
11582
11718
|
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 "
|
|
11583
11719
|
},
|
|
11584
|
-
/* @__PURE__ */
|
|
11585
|
-
/* @__PURE__ */
|
|
11586
|
-
), /* @__PURE__ */
|
|
11720
|
+
/* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlus, { size: 14, className: "text-indigo-400" }),
|
|
11721
|
+
/* @__PURE__ */ import_react27.default.createElement("span", { className: "hidden sm:inline" }, "Novo Grupo")
|
|
11722
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
11587
11723
|
"button",
|
|
11588
11724
|
{
|
|
11589
11725
|
onClick: onClose,
|
|
@@ -11591,7 +11727,7 @@ function AncestryBoard({
|
|
|
11591
11727
|
},
|
|
11592
11728
|
"\xD7"
|
|
11593
11729
|
))),
|
|
11594
|
-
/* @__PURE__ */
|
|
11730
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
11595
11731
|
"div",
|
|
11596
11732
|
{
|
|
11597
11733
|
className: `
|
|
@@ -11600,12 +11736,12 @@ function AncestryBoard({
|
|
|
11600
11736
|
min-w-[280px] max-w-[500px] bg-slate-900
|
|
11601
11737
|
`
|
|
11602
11738
|
},
|
|
11603
|
-
/* @__PURE__ */
|
|
11739
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "relative group" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
11604
11740
|
import_fi20.FiSearch,
|
|
11605
11741
|
{
|
|
11606
11742
|
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"}`
|
|
11607
11743
|
}
|
|
11608
|
-
), /* @__PURE__ */
|
|
11744
|
+
), /* @__PURE__ */ import_react27.default.createElement(
|
|
11609
11745
|
"input",
|
|
11610
11746
|
{
|
|
11611
11747
|
type: "text",
|
|
@@ -11619,10 +11755,10 @@ function AncestryBoard({
|
|
|
11619
11755
|
autoFocus: !pickingGroupId
|
|
11620
11756
|
}
|
|
11621
11757
|
))),
|
|
11622
|
-
/* @__PURE__ */
|
|
11758
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
|
|
11623
11759
|
const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
|
|
11624
11760
|
const isPicking = !!pickingGroupId;
|
|
11625
|
-
return /* @__PURE__ */
|
|
11761
|
+
return /* @__PURE__ */ import_react27.default.createElement(
|
|
11626
11762
|
"div",
|
|
11627
11763
|
{
|
|
11628
11764
|
key: anc.ancestry_id,
|
|
@@ -11634,7 +11770,7 @@ function AncestryBoard({
|
|
|
11634
11770
|
${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"}
|
|
11635
11771
|
`
|
|
11636
11772
|
},
|
|
11637
|
-
/* @__PURE__ */
|
|
11773
|
+
/* @__PURE__ */ import_react27.default.createElement(
|
|
11638
11774
|
"div",
|
|
11639
11775
|
{
|
|
11640
11776
|
className: `
|
|
@@ -11642,10 +11778,10 @@ function AncestryBoard({
|
|
|
11642
11778
|
${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"}
|
|
11643
11779
|
`
|
|
11644
11780
|
},
|
|
11645
|
-
isPicking ? /* @__PURE__ */
|
|
11781
|
+
isPicking ? /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlus, { size: 16 }) : /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiLayers, { size: 14 })
|
|
11646
11782
|
),
|
|
11647
|
-
/* @__PURE__ */
|
|
11648
|
-
!isPicking && /* @__PURE__ */
|
|
11783
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react27.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.name || "Sem Nome"), anc.is_private && /* @__PURE__ */ import_react27.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_react27.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react27.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.description && /* @__PURE__ */ import_react27.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.description)),
|
|
11784
|
+
!isPicking && /* @__PURE__ */ import_react27.default.createElement(
|
|
11649
11785
|
"button",
|
|
11650
11786
|
{
|
|
11651
11787
|
onClick: (e) => {
|
|
@@ -11655,11 +11791,11 @@ function AncestryBoard({
|
|
|
11655
11791
|
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",
|
|
11656
11792
|
title: "Renderizar Ancestralidade"
|
|
11657
11793
|
},
|
|
11658
|
-
/* @__PURE__ */
|
|
11794
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiPlay, { size: 14, className: "ml-0.5" }))
|
|
11659
11795
|
)
|
|
11660
11796
|
);
|
|
11661
11797
|
}))
|
|
11662
|
-
), /* @__PURE__ */
|
|
11798
|
+
), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react27.default.createElement(import_fi20.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react27.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react27.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react27.default.createElement(
|
|
11663
11799
|
GroupItem,
|
|
11664
11800
|
{
|
|
11665
11801
|
key: group.id,
|
|
@@ -11679,7 +11815,7 @@ function AncestryBoard({
|
|
|
11679
11815
|
canEdit
|
|
11680
11816
|
}
|
|
11681
11817
|
))))),
|
|
11682
|
-
/* @__PURE__ */
|
|
11818
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-between flex-shrink-0" }, /* @__PURE__ */ import_react27.default.createElement("span", null, filtered.length, " itens encontrados"), /* @__PURE__ */ import_react27.default.createElement("span", null, groups.length, " grupos raiz"))
|
|
11683
11819
|
)
|
|
11684
11820
|
);
|
|
11685
11821
|
}
|
|
@@ -11763,12 +11899,12 @@ function XViewScene({
|
|
|
11763
11899
|
get_view_members
|
|
11764
11900
|
}) {
|
|
11765
11901
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
11766
|
-
const { data: session, status } = (0,
|
|
11902
|
+
const { data: session, status } = (0, import_react29.useSession)();
|
|
11767
11903
|
const router = (0, import_navigation.useRouter)();
|
|
11768
11904
|
const searchParams = (0, import_navigation.useSearchParams)();
|
|
11769
11905
|
const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
|
|
11770
11906
|
const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
|
|
11771
|
-
const viewParams = (0,
|
|
11907
|
+
const viewParams = (0, import_react28.useMemo)(() => {
|
|
11772
11908
|
if (encryptedConfig) {
|
|
11773
11909
|
const data = decryptData(encryptedConfig);
|
|
11774
11910
|
if (data) {
|
|
@@ -11777,7 +11913,7 @@ function XViewScene({
|
|
|
11777
11913
|
}
|
|
11778
11914
|
return null;
|
|
11779
11915
|
}, [encryptedConfig, session]);
|
|
11780
|
-
(0,
|
|
11916
|
+
(0, import_react28.useEffect)(() => {
|
|
11781
11917
|
async function verifyPermission() {
|
|
11782
11918
|
if (!viewParams || !session || !check_user_permission) return;
|
|
11783
11919
|
const { id, type, owner_id } = viewParams;
|
|
@@ -11814,65 +11950,65 @@ function XViewScene({
|
|
|
11814
11950
|
setIsLoading(false);
|
|
11815
11951
|
}
|
|
11816
11952
|
}, [viewParams, session, status, check_user_permission]);
|
|
11817
|
-
const sceneConfigId = (0,
|
|
11818
|
-
const ownerId = (0,
|
|
11819
|
-
const dbSaveUrl = (0,
|
|
11953
|
+
const sceneConfigId = (0, import_react28.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
|
|
11954
|
+
const ownerId = (0, import_react28.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
|
|
11955
|
+
const dbSaveUrl = (0, import_react28.useMemo)(() => {
|
|
11820
11956
|
if (ownerId && sceneConfigId) {
|
|
11821
11957
|
return `x_view_dbs/${ownerId}/${sceneConfigId}`;
|
|
11822
11958
|
}
|
|
11823
11959
|
return null;
|
|
11824
11960
|
}, [ownerId, sceneConfigId]);
|
|
11825
|
-
const sceneSaveUrl = (0,
|
|
11961
|
+
const sceneSaveUrl = (0, import_react28.useMemo)(() => {
|
|
11826
11962
|
if (ownerId && sceneConfigId) {
|
|
11827
11963
|
return `x_view_scenes/${ownerId}/${sceneConfigId}`;
|
|
11828
11964
|
}
|
|
11829
11965
|
return null;
|
|
11830
11966
|
}, [ownerId, sceneConfigId]);
|
|
11831
|
-
const ancestry_save_url = (0,
|
|
11967
|
+
const ancestry_save_url = (0, import_react28.useMemo)(() => {
|
|
11832
11968
|
if (ownerId && sceneConfigId) {
|
|
11833
11969
|
return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
|
|
11834
11970
|
}
|
|
11835
11971
|
return null;
|
|
11836
11972
|
}, [ownerId, sceneConfigId]);
|
|
11837
|
-
const sceneDataRef = (0,
|
|
11838
|
-
const parentDataRef = (0,
|
|
11839
|
-
const ancestryDataRef = (0,
|
|
11840
|
-
const [isLoading, setIsLoading] = (0,
|
|
11841
|
-
const [permissionStatus, setPermissionStatus] = (0,
|
|
11842
|
-
const [userPermissionRole, setUserPermissionRole] = (0,
|
|
11843
|
-
const [viewMembers, setViewMembers] = (0,
|
|
11844
|
-
const [isInitialized, setIsInitialized] = (0,
|
|
11845
|
-
const [sceneVersion, setSceneVersion] = (0,
|
|
11846
|
-
const [contextMenu, setContextMenu] = (0,
|
|
11973
|
+
const sceneDataRef = (0, import_react28.useRef)(null);
|
|
11974
|
+
const parentDataRef = (0, import_react28.useRef)(null);
|
|
11975
|
+
const ancestryDataRef = (0, import_react28.useRef)(null);
|
|
11976
|
+
const [isLoading, setIsLoading] = (0, import_react28.useState)(true);
|
|
11977
|
+
const [permissionStatus, setPermissionStatus] = (0, import_react28.useState)("loading");
|
|
11978
|
+
const [userPermissionRole, setUserPermissionRole] = (0, import_react28.useState)(null);
|
|
11979
|
+
const [viewMembers, setViewMembers] = (0, import_react28.useState)([]);
|
|
11980
|
+
const [isInitialized, setIsInitialized] = (0, import_react28.useState)(false);
|
|
11981
|
+
const [sceneVersion, setSceneVersion] = (0, import_react28.useState)(0);
|
|
11982
|
+
const [contextMenu, setContextMenu] = (0, import_react28.useState)({
|
|
11847
11983
|
visible: false,
|
|
11848
11984
|
x: 0,
|
|
11849
11985
|
y: 0,
|
|
11850
11986
|
nodeData: null
|
|
11851
11987
|
});
|
|
11852
|
-
const [multiContextMenu, setMultiContextMenu] = (0,
|
|
11988
|
+
const [multiContextMenu, setMultiContextMenu] = (0, import_react28.useState)({
|
|
11853
11989
|
visible: false,
|
|
11854
11990
|
x: 0,
|
|
11855
11991
|
y: 0,
|
|
11856
11992
|
nodeIds: null
|
|
11857
11993
|
});
|
|
11858
|
-
const [relationshipMenu, setRelationshipMenu] = (0,
|
|
11994
|
+
const [relationshipMenu, setRelationshipMenu] = (0, import_react28.useState)({
|
|
11859
11995
|
visible: false,
|
|
11860
11996
|
x: 0,
|
|
11861
11997
|
y: 0,
|
|
11862
11998
|
linkObject: null
|
|
11863
11999
|
});
|
|
11864
|
-
const [creationMode, setCreationMode] = (0,
|
|
12000
|
+
const [creationMode, setCreationMode] = (0, import_react28.useState)({
|
|
11865
12001
|
isActive: false,
|
|
11866
12002
|
sourceNodeData: null
|
|
11867
12003
|
});
|
|
11868
|
-
const [versionMode, setVersionMode] = (0,
|
|
12004
|
+
const [versionMode, setVersionMode] = (0, import_react28.useState)({
|
|
11869
12005
|
isActive: false,
|
|
11870
12006
|
sourceNodeData: null
|
|
11871
12007
|
});
|
|
11872
|
-
const [questMode, setQuestMode] = (0,
|
|
11873
|
-
const [hasFocusedInitial, setHasFocusedInitial] = (0,
|
|
11874
|
-
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0,
|
|
11875
|
-
const [ancestryMode, setAncestryMode] = (0,
|
|
12008
|
+
const [questMode, setQuestMode] = (0, import_react28.useState)({ isActive: false });
|
|
12009
|
+
const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react28.useState)(false);
|
|
12010
|
+
const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react28.useState)(false);
|
|
12011
|
+
const [ancestryMode, setAncestryMode] = (0, import_react28.useState)({
|
|
11876
12012
|
isActive: false,
|
|
11877
12013
|
tree: null,
|
|
11878
12014
|
selectedParentId: null,
|
|
@@ -11883,41 +12019,41 @@ function XViewScene({
|
|
|
11883
12019
|
ancestryDescriptionSections: [],
|
|
11884
12020
|
isAddingNodes: false
|
|
11885
12021
|
});
|
|
11886
|
-
const [readingMode, setReadingMode] = (0,
|
|
12022
|
+
const [readingMode, setReadingMode] = (0, import_react28.useState)({
|
|
11887
12023
|
isActive: false,
|
|
11888
12024
|
ancestry: null,
|
|
11889
12025
|
branchStack: [],
|
|
11890
12026
|
autoAbstraction: false
|
|
11891
12027
|
});
|
|
11892
|
-
const [formPosition, setFormPosition] = (0,
|
|
12028
|
+
const [formPosition, setFormPosition] = (0, import_react28.useState)({
|
|
11893
12029
|
left: 16,
|
|
11894
12030
|
top: 16,
|
|
11895
12031
|
opacity: 0
|
|
11896
12032
|
});
|
|
11897
|
-
const [detailsNode, setDetailsNode] = (0,
|
|
11898
|
-
const [detailsLink, setDetailsLink] = (0,
|
|
11899
|
-
const [ancestryLinkDetails, setAncestryLinkDetails] = (0,
|
|
11900
|
-
const [imageViewer, setImageViewer] = (0,
|
|
12033
|
+
const [detailsNode, setDetailsNode] = (0, import_react28.useState)(null);
|
|
12034
|
+
const [detailsLink, setDetailsLink] = (0, import_react28.useState)(null);
|
|
12035
|
+
const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react28.useState)(null);
|
|
12036
|
+
const [imageViewer, setImageViewer] = (0, import_react28.useState)({
|
|
11901
12037
|
visible: false,
|
|
11902
12038
|
images: [],
|
|
11903
12039
|
startIndex: 0
|
|
11904
12040
|
});
|
|
11905
|
-
const [editingAncestryRel, setEditingAncestryRel] = (0,
|
|
12041
|
+
const [editingAncestryRel, setEditingAncestryRel] = (0, import_react28.useState)({
|
|
11906
12042
|
visible: false,
|
|
11907
12043
|
data: null,
|
|
11908
12044
|
path: null
|
|
11909
12045
|
});
|
|
11910
|
-
const [isImportModalOpen, setIsImportModalOpen] = (0,
|
|
11911
|
-
const [importSuccessMessage, setImportSuccessMessage] = (0,
|
|
11912
|
-
const [invalidTargetError, setInvalidTargetError] = (0,
|
|
11913
|
-
const [highlightedNodeId, setHighlightedNodeId] = (0,
|
|
11914
|
-
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0,
|
|
11915
|
-
const [ancestryBoardData, setAncestryBoardData] = (0,
|
|
11916
|
-
const [isSidebarOpen, setIsSidebarOpen] = (0,
|
|
11917
|
-
const mountRef = (0,
|
|
11918
|
-
const tooltipRef = (0,
|
|
11919
|
-
const formRef = (0,
|
|
11920
|
-
const stateRef = (0,
|
|
12046
|
+
const [isImportModalOpen, setIsImportModalOpen] = (0, import_react28.useState)(false);
|
|
12047
|
+
const [importSuccessMessage, setImportSuccessMessage] = (0, import_react28.useState)("");
|
|
12048
|
+
const [invalidTargetError, setInvalidTargetError] = (0, import_react28.useState)(null);
|
|
12049
|
+
const [highlightedNodeId, setHighlightedNodeId] = (0, import_react28.useState)(null);
|
|
12050
|
+
const [isAncestryBoardOpen, setIsAncestryBoardOpen] = (0, import_react28.useState)(false);
|
|
12051
|
+
const [ancestryBoardData, setAncestryBoardData] = (0, import_react28.useState)([]);
|
|
12052
|
+
const [isSidebarOpen, setIsSidebarOpen] = (0, import_react28.useState)(false);
|
|
12053
|
+
const mountRef = (0, import_react28.useRef)(null);
|
|
12054
|
+
const tooltipRef = (0, import_react28.useRef)(null);
|
|
12055
|
+
const formRef = (0, import_react28.useRef)(null);
|
|
12056
|
+
const stateRef = (0, import_react28.useRef)({
|
|
11921
12057
|
readMode: {
|
|
11922
12058
|
currentMaxIndex: 0,
|
|
11923
12059
|
progressMap: {}
|
|
@@ -11981,10 +12117,10 @@ function XViewScene({
|
|
|
11981
12117
|
minWidth: 320,
|
|
11982
12118
|
maxWidth: maxReadPanelW
|
|
11983
12119
|
});
|
|
11984
|
-
(0,
|
|
12120
|
+
(0, import_react28.useEffect)(() => {
|
|
11985
12121
|
stateRef.current.ancestry = ancestryMode;
|
|
11986
12122
|
}, [ancestryMode]);
|
|
11987
|
-
(0,
|
|
12123
|
+
(0, import_react28.useEffect)(() => {
|
|
11988
12124
|
var _a2;
|
|
11989
12125
|
if (!isInitialized) return;
|
|
11990
12126
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -12007,10 +12143,10 @@ function XViewScene({
|
|
|
12007
12143
|
}
|
|
12008
12144
|
stateRef.current.nodeIdToParentFileMap = map;
|
|
12009
12145
|
}, [isInitialized, sceneVersion]);
|
|
12010
|
-
const handleNavigateBack = (0,
|
|
12146
|
+
const handleNavigateBack = (0, import_react28.useCallback)(() => {
|
|
12011
12147
|
router.push("/dashboard/scenes");
|
|
12012
12148
|
}, [router]);
|
|
12013
|
-
const handleConfirmImport = (0,
|
|
12149
|
+
const handleConfirmImport = (0, import_react28.useCallback)(
|
|
12014
12150
|
async (importPayload) => {
|
|
12015
12151
|
var _a2, _b2;
|
|
12016
12152
|
let files = [];
|
|
@@ -12138,7 +12274,7 @@ function XViewScene({
|
|
|
12138
12274
|
const handleOpenImageViewer = (images, startIndex) => {
|
|
12139
12275
|
setImageViewer({ visible: true, images, startIndex });
|
|
12140
12276
|
};
|
|
12141
|
-
const tweenToTarget = (0,
|
|
12277
|
+
const tweenToTarget = (0, import_react28.useCallback)(
|
|
12142
12278
|
(target, zoomFactor = 1, forcedDirection = null) => {
|
|
12143
12279
|
const { camera, controls, tweenGroup } = stateRef.current;
|
|
12144
12280
|
if (!camera || !controls || !tweenGroup) return;
|
|
@@ -12164,7 +12300,7 @@ function XViewScene({
|
|
|
12164
12300
|
if (!t || typeof t.closest !== "function") return false;
|
|
12165
12301
|
return !!t.closest(".ui-overlay");
|
|
12166
12302
|
};
|
|
12167
|
-
const buildFullAncestryTree = (0,
|
|
12303
|
+
const buildFullAncestryTree = (0, import_react28.useCallback)(
|
|
12168
12304
|
(idTree, nodes, ancestries = []) => {
|
|
12169
12305
|
if (!idTree) return null;
|
|
12170
12306
|
const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
|
|
@@ -12249,7 +12385,7 @@ function XViewScene({
|
|
|
12249
12385
|
},
|
|
12250
12386
|
[]
|
|
12251
12387
|
);
|
|
12252
|
-
const handleActivateTimeline = (0,
|
|
12388
|
+
const handleActivateTimeline = (0, import_react28.useCallback)(() => {
|
|
12253
12389
|
const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
12254
12390
|
if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
|
|
12255
12391
|
while (timelineIntervalsGroup.children.length > 0) {
|
|
@@ -12409,7 +12545,7 @@ function XViewScene({
|
|
|
12409
12545
|
}
|
|
12410
12546
|
});
|
|
12411
12547
|
}, []);
|
|
12412
|
-
const handleVersionTimeline = (0,
|
|
12548
|
+
const handleVersionTimeline = (0, import_react28.useCallback)((sourceMesh, versionMeshes) => {
|
|
12413
12549
|
const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
|
|
12414
12550
|
if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
|
|
12415
12551
|
return;
|
|
@@ -12546,7 +12682,7 @@ function XViewScene({
|
|
|
12546
12682
|
}
|
|
12547
12683
|
});
|
|
12548
12684
|
}, []);
|
|
12549
|
-
(0,
|
|
12685
|
+
(0, import_react28.useEffect)(() => {
|
|
12550
12686
|
async function fetchAllData(configPath, ownerId2) {
|
|
12551
12687
|
var _a2, _b2;
|
|
12552
12688
|
if (!get_scene_view_data) {
|
|
@@ -12648,12 +12784,12 @@ function XViewScene({
|
|
|
12648
12784
|
focusNodeId,
|
|
12649
12785
|
focusAncestryId
|
|
12650
12786
|
]);
|
|
12651
|
-
const isNodeInView = (0,
|
|
12787
|
+
const isNodeInView = (0, import_react28.useCallback)((id) => {
|
|
12652
12788
|
const key = String(id);
|
|
12653
12789
|
const objs = stateRef.current.nodeObjects || {};
|
|
12654
12790
|
return !!objs[key];
|
|
12655
12791
|
}, []);
|
|
12656
|
-
const addOrUpdateNodeMesh = (0,
|
|
12792
|
+
const addOrUpdateNodeMesh = (0, import_react28.useCallback)(
|
|
12657
12793
|
(nodeData, position, suppressVersionUpdate = false) => {
|
|
12658
12794
|
const {
|
|
12659
12795
|
graphGroup,
|
|
@@ -12693,7 +12829,7 @@ function XViewScene({
|
|
|
12693
12829
|
},
|
|
12694
12830
|
[]
|
|
12695
12831
|
);
|
|
12696
|
-
(0,
|
|
12832
|
+
(0, import_react28.useEffect)(() => {
|
|
12697
12833
|
if (!isInitialized || !sceneDataRef.current) return;
|
|
12698
12834
|
const currentMount = mountRef.current;
|
|
12699
12835
|
if (!currentMount) return;
|
|
@@ -13449,7 +13585,7 @@ function XViewScene({
|
|
|
13449
13585
|
get_scene_view_data,
|
|
13450
13586
|
save_view_data
|
|
13451
13587
|
]);
|
|
13452
|
-
const handleGhostNodeImageChange = (0,
|
|
13588
|
+
const handleGhostNodeImageChange = (0, import_react28.useCallback)((useImage, imageUrl) => {
|
|
13453
13589
|
const {
|
|
13454
13590
|
node: ghostNode,
|
|
13455
13591
|
line: ghostLine,
|
|
@@ -13497,7 +13633,7 @@ function XViewScene({
|
|
|
13497
13633
|
aura: newGhostNode.getObjectByName("aura")
|
|
13498
13634
|
};
|
|
13499
13635
|
}, []);
|
|
13500
|
-
const handleGhostNodeIntensityChange = (0,
|
|
13636
|
+
const handleGhostNodeIntensityChange = (0, import_react28.useCallback)((newIntensity) => {
|
|
13501
13637
|
const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
|
|
13502
13638
|
if (!ghostNode) return;
|
|
13503
13639
|
const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
|
|
@@ -13518,7 +13654,7 @@ function XViewScene({
|
|
|
13518
13654
|
ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
|
|
13519
13655
|
}
|
|
13520
13656
|
}, []);
|
|
13521
|
-
const handleDetailNodeIntensityChange = (0,
|
|
13657
|
+
const handleDetailNodeIntensityChange = (0, import_react28.useCallback)(
|
|
13522
13658
|
(nodeId, newIntensity) => {
|
|
13523
13659
|
const mesh = stateRef.current.nodeObjects[String(nodeId)];
|
|
13524
13660
|
if (!mesh) return;
|
|
@@ -13674,7 +13810,7 @@ function XViewScene({
|
|
|
13674
13810
|
mountRef.current.style.cursor = "default";
|
|
13675
13811
|
}
|
|
13676
13812
|
};
|
|
13677
|
-
const handleAncestryTreeUpdate = (0,
|
|
13813
|
+
const handleAncestryTreeUpdate = (0, import_react28.useCallback)((newTree, extraData = null) => {
|
|
13678
13814
|
setAncestryMode((prev) => {
|
|
13679
13815
|
const prevTreeStr = JSON.stringify(prev.tree);
|
|
13680
13816
|
const newTreeStr = JSON.stringify(newTree);
|
|
@@ -13697,7 +13833,7 @@ function XViewScene({
|
|
|
13697
13833
|
};
|
|
13698
13834
|
});
|
|
13699
13835
|
}, []);
|
|
13700
|
-
const actionHandlerContext = (0,
|
|
13836
|
+
const actionHandlerContext = (0, import_react28.useMemo)(
|
|
13701
13837
|
() => {
|
|
13702
13838
|
var _a2;
|
|
13703
13839
|
return {
|
|
@@ -13758,7 +13894,7 @@ function XViewScene({
|
|
|
13758
13894
|
const handleStartVersioning = (nodeData) => {
|
|
13759
13895
|
userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
|
|
13760
13896
|
};
|
|
13761
|
-
const handleStartQuestQuick = (0,
|
|
13897
|
+
const handleStartQuestQuick = (0, import_react28.useCallback)((questNode) => {
|
|
13762
13898
|
var _a2, _b2, _c2;
|
|
13763
13899
|
if (!questNode || !actionHandlerContext) return;
|
|
13764
13900
|
const {
|
|
@@ -13770,12 +13906,11 @@ function XViewScene({
|
|
|
13770
13906
|
timelineEndLabel,
|
|
13771
13907
|
...cleanQuestNode
|
|
13772
13908
|
} = questNode;
|
|
13773
|
-
const newTimeline = [...cleanQuestNode.timeline || [],
|
|
13774
|
-
|
|
13775
|
-
|
|
13776
|
-
|
|
13777
|
-
|
|
13778
|
-
}];
|
|
13909
|
+
const newTimeline = [...cleanQuestNode.timeline || [], createTimelineEntry(
|
|
13910
|
+
((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
|
|
13911
|
+
`Quest iniciada ("In Progress") por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`,
|
|
13912
|
+
"status_changed"
|
|
13913
|
+
)];
|
|
13779
13914
|
const updatedNode = {
|
|
13780
13915
|
...cleanQuestNode,
|
|
13781
13916
|
status: "In Progress",
|
|
@@ -13788,8 +13923,8 @@ function XViewScene({
|
|
|
13788
13923
|
}
|
|
13789
13924
|
setDetailsNode(updatedNode);
|
|
13790
13925
|
}, [session, actionHandlerContext]);
|
|
13791
|
-
const handleFinishQuestQuick = (0,
|
|
13792
|
-
var _a2, _b2, _c2, _d2, _e2, _f2
|
|
13926
|
+
const handleFinishQuestQuick = (0, import_react28.useCallback)((questNode) => {
|
|
13927
|
+
var _a2, _b2, _c2, _d2, _e2, _f2;
|
|
13793
13928
|
if (!questNode || !actionHandlerContext) return;
|
|
13794
13929
|
const {
|
|
13795
13930
|
labelObject,
|
|
@@ -13809,20 +13944,18 @@ function XViewScene({
|
|
|
13809
13944
|
if (currentReviewerIdx !== -1 && reviewStack[currentReviewerIdx].userId === cleanQuestNode.assignee_id) {
|
|
13810
13945
|
reviewStack[currentReviewerIdx].status = "completed";
|
|
13811
13946
|
nextIdxToAssign = currentReviewerIdx + 1;
|
|
13812
|
-
newTimeline.push(
|
|
13813
|
-
|
|
13814
|
-
|
|
13815
|
-
|
|
13816
|
-
|
|
13817
|
-
});
|
|
13947
|
+
newTimeline.push(createTimelineEntry(
|
|
13948
|
+
((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || cleanQuestNode.assignee_id,
|
|
13949
|
+
`Review conclu\xEDda por ${((_b2 = viewMembers.find((m) => m.id === cleanQuestNode.assignee_id)) == null ? void 0 : _b2.name) || "revisor"}.`,
|
|
13950
|
+
"review_completed"
|
|
13951
|
+
));
|
|
13818
13952
|
} else {
|
|
13819
13953
|
nextIdxToAssign = currentReviewerIdx !== -1 ? currentReviewerIdx : reviewStack.length;
|
|
13820
|
-
newTimeline.push(
|
|
13821
|
-
|
|
13822
|
-
|
|
13823
|
-
|
|
13824
|
-
|
|
13825
|
-
});
|
|
13954
|
+
newTimeline.push(createTimelineEntry(
|
|
13955
|
+
((_c2 = session == null ? void 0 : session.user) == null ? void 0 : _c2.id) || cleanQuestNode.assignee_id,
|
|
13956
|
+
`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"}.`,
|
|
13957
|
+
"task_completed"
|
|
13958
|
+
));
|
|
13826
13959
|
}
|
|
13827
13960
|
if (nextIdxToAssign < reviewStack.length) {
|
|
13828
13961
|
const remainingMandatory = reviewStack.slice(nextIdxToAssign).some((r) => r.mandatory);
|
|
@@ -13831,13 +13964,12 @@ function XViewScene({
|
|
|
13831
13964
|
const nextReviewer = reviewStack[nextIdxToAssign];
|
|
13832
13965
|
nextAssigneeId = nextReviewer.userId;
|
|
13833
13966
|
nextStatus = "Review";
|
|
13834
|
-
newTimeline.push(
|
|
13835
|
-
|
|
13836
|
-
|
|
13837
|
-
|
|
13838
|
-
to_assignee_id: nextAssigneeId
|
|
13839
|
-
|
|
13840
|
-
});
|
|
13967
|
+
newTimeline.push(createTimelineEntry(
|
|
13968
|
+
"system",
|
|
13969
|
+
`Quest atribu\xEDda para revis\xE3o a ${((_f2 = viewMembers.find((m) => m.id === nextAssigneeId)) == null ? void 0 : _f2.name) || "revisor"}.`,
|
|
13970
|
+
"assignee_changed",
|
|
13971
|
+
{ metadata: { to_assignee_id: nextAssigneeId } }
|
|
13972
|
+
));
|
|
13841
13973
|
} else {
|
|
13842
13974
|
nextStatus = "Done";
|
|
13843
13975
|
for (let i = nextIdxToAssign; i < reviewStack.length; i++) {
|
|
@@ -13848,12 +13980,11 @@ function XViewScene({
|
|
|
13848
13980
|
nextStatus = "Done";
|
|
13849
13981
|
}
|
|
13850
13982
|
if (nextStatus === "Done") {
|
|
13851
|
-
newTimeline.push(
|
|
13852
|
-
|
|
13853
|
-
|
|
13854
|
-
|
|
13855
|
-
|
|
13856
|
-
});
|
|
13983
|
+
newTimeline.push(createTimelineEntry(
|
|
13984
|
+
"system",
|
|
13985
|
+
`Quest finalizada!`,
|
|
13986
|
+
"quest_finished"
|
|
13987
|
+
));
|
|
13857
13988
|
}
|
|
13858
13989
|
const updatedNode = {
|
|
13859
13990
|
...cleanQuestNode,
|
|
@@ -13870,7 +14001,7 @@ function XViewScene({
|
|
|
13870
14001
|
setDetailsNode(null);
|
|
13871
14002
|
}
|
|
13872
14003
|
}, [session, actionHandlerContext, viewMembers, detailsNode]);
|
|
13873
|
-
const handleCancelQuest = (0,
|
|
14004
|
+
const handleCancelQuest = (0, import_react28.useCallback)(() => {
|
|
13874
14005
|
const { graphGroup, ghostElements } = stateRef.current;
|
|
13875
14006
|
if (ghostElements.node && graphGroup) {
|
|
13876
14007
|
if (ghostElements.node.userData.labelObject) {
|
|
@@ -14022,7 +14153,7 @@ function XViewScene({
|
|
|
14022
14153
|
}
|
|
14023
14154
|
userActionHandlers.handleCancelConnection(context);
|
|
14024
14155
|
};
|
|
14025
|
-
const handleClearAncestryVisuals = (0,
|
|
14156
|
+
const handleClearAncestryVisuals = (0, import_react28.useCallback)((ancestryId) => {
|
|
14026
14157
|
const { renderedAncestries, ancestryGroup } = stateRef.current;
|
|
14027
14158
|
const renderIndex = renderedAncestries.findIndex(
|
|
14028
14159
|
(a) => String(a.id) === String(ancestryId)
|
|
@@ -14040,7 +14171,7 @@ function XViewScene({
|
|
|
14040
14171
|
);
|
|
14041
14172
|
}
|
|
14042
14173
|
}, []);
|
|
14043
|
-
const handleRenderAncestry = (0,
|
|
14174
|
+
const handleRenderAncestry = (0, import_react28.useCallback)(
|
|
14044
14175
|
async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
|
|
14045
14176
|
setContextMenu(
|
|
14046
14177
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14534,7 +14665,7 @@ function XViewScene({
|
|
|
14534
14665
|
ancestryMode.isActive
|
|
14535
14666
|
]
|
|
14536
14667
|
);
|
|
14537
|
-
const handleRenderAbstractionTree = (0,
|
|
14668
|
+
const handleRenderAbstractionTree = (0, import_react28.useCallback)(
|
|
14538
14669
|
(ancestryObject, targetNodeId = null) => {
|
|
14539
14670
|
setContextMenu(
|
|
14540
14671
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14622,7 +14753,7 @@ function XViewScene({
|
|
|
14622
14753
|
handleClearAncestryVisuals
|
|
14623
14754
|
]
|
|
14624
14755
|
);
|
|
14625
|
-
const handleReadModeBranchNav = (0,
|
|
14756
|
+
const handleReadModeBranchNav = (0, import_react28.useCallback)(
|
|
14626
14757
|
(nodeId, action, direction = "right") => {
|
|
14627
14758
|
const { ancestry, branchStack } = readingMode;
|
|
14628
14759
|
if (!ancestry || !ancestry.tree) return;
|
|
@@ -14800,13 +14931,13 @@ function XViewScene({
|
|
|
14800
14931
|
},
|
|
14801
14932
|
[readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
|
|
14802
14933
|
);
|
|
14803
|
-
const handleReadModeHighlight = (0,
|
|
14934
|
+
const handleReadModeHighlight = (0, import_react28.useCallback)((nodeId) => {
|
|
14804
14935
|
if (stateRef.current.highlightedNodeId !== nodeId) {
|
|
14805
14936
|
stateRef.current.highlightedNodeId = nodeId;
|
|
14806
14937
|
}
|
|
14807
14938
|
setHighlightedNodeId(nodeId);
|
|
14808
14939
|
}, []);
|
|
14809
|
-
const activeNodeBranches = (0,
|
|
14940
|
+
const activeNodeBranches = (0, import_react28.useMemo)(() => {
|
|
14810
14941
|
if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
|
|
14811
14942
|
return null;
|
|
14812
14943
|
const fullTree = buildFullAncestryTree(
|
|
@@ -14850,7 +14981,7 @@ function XViewScene({
|
|
|
14850
14981
|
readingMode.branchStack,
|
|
14851
14982
|
ancestryDataRef.current
|
|
14852
14983
|
]);
|
|
14853
|
-
const backNavigationInfo = (0,
|
|
14984
|
+
const backNavigationInfo = (0, import_react28.useMemo)(() => {
|
|
14854
14985
|
const { branchStack } = readingMode;
|
|
14855
14986
|
if (!branchStack || branchStack.length === 0) return null;
|
|
14856
14987
|
const lastStep = branchStack[branchStack.length - 1];
|
|
@@ -14861,7 +14992,7 @@ function XViewScene({
|
|
|
14861
14992
|
name: "Voltar para anterior"
|
|
14862
14993
|
};
|
|
14863
14994
|
}, [readingMode.branchStack]);
|
|
14864
|
-
const getReadModeDisplayContext = (0,
|
|
14995
|
+
const getReadModeDisplayContext = (0, import_react28.useMemo)(() => {
|
|
14865
14996
|
const { ancestry, branchStack } = readingMode;
|
|
14866
14997
|
if (!ancestry) return null;
|
|
14867
14998
|
if (branchStack.length === 0) {
|
|
@@ -14904,7 +15035,7 @@ function XViewScene({
|
|
|
14904
15035
|
customProperties: branchProps
|
|
14905
15036
|
};
|
|
14906
15037
|
}, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
|
|
14907
|
-
const readModeAbstractionTree = (0,
|
|
15038
|
+
const readModeAbstractionTree = (0, import_react28.useMemo)(() => {
|
|
14908
15039
|
if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
|
|
14909
15040
|
return null;
|
|
14910
15041
|
}
|
|
@@ -14923,7 +15054,7 @@ function XViewScene({
|
|
|
14923
15054
|
buildFullAncestryTree,
|
|
14924
15055
|
sceneVersion
|
|
14925
15056
|
]);
|
|
14926
|
-
const handleStartReadingAncestry = (0,
|
|
15057
|
+
const handleStartReadingAncestry = (0, import_react28.useCallback)(
|
|
14927
15058
|
async (ancestryObject, renderMode = "full") => {
|
|
14928
15059
|
setContextMenu(
|
|
14929
15060
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -14966,7 +15097,7 @@ function XViewScene({
|
|
|
14966
15097
|
},
|
|
14967
15098
|
[handleRenderAncestry, handleRenderAbstractionTree]
|
|
14968
15099
|
);
|
|
14969
|
-
const handleReadModeSectionChange = (0,
|
|
15100
|
+
const handleReadModeSectionChange = (0, import_react28.useCallback)(
|
|
14970
15101
|
(activeSectionId) => {
|
|
14971
15102
|
const { ancestry, branchStack } = readingMode;
|
|
14972
15103
|
if (!ancestry || !readingMode.isActive) return;
|
|
@@ -15051,10 +15182,10 @@ function XViewScene({
|
|
|
15051
15182
|
ancestryDataRef.current
|
|
15052
15183
|
]
|
|
15053
15184
|
);
|
|
15054
|
-
const handleCloseReadMode = (0,
|
|
15185
|
+
const handleCloseReadMode = (0, import_react28.useCallback)(() => {
|
|
15055
15186
|
setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
|
|
15056
15187
|
}, []);
|
|
15057
|
-
const handleAncestrySectionChange = (0,
|
|
15188
|
+
const handleAncestrySectionChange = (0, import_react28.useCallback)(
|
|
15058
15189
|
(activeSectionId, ancestryOverride = null, rotation = 0) => {
|
|
15059
15190
|
var _a2, _b2;
|
|
15060
15191
|
const currentMode = stateRef.current.ancestry;
|
|
@@ -15116,7 +15247,7 @@ function XViewScene({
|
|
|
15116
15247
|
},
|
|
15117
15248
|
[handleRenderAncestry]
|
|
15118
15249
|
);
|
|
15119
|
-
const handleEditAncestry = (0,
|
|
15250
|
+
const handleEditAncestry = (0, import_react28.useCallback)(
|
|
15120
15251
|
async (ancestryObject) => {
|
|
15121
15252
|
setContextMenu(
|
|
15122
15253
|
(prev) => prev.visible ? { ...prev, visible: false } : prev
|
|
@@ -15171,7 +15302,7 @@ function XViewScene({
|
|
|
15171
15302
|
const handleSelectAncestryParent = (nodeId) => {
|
|
15172
15303
|
setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
|
|
15173
15304
|
};
|
|
15174
|
-
const handleRemoveFromAncestry = (0,
|
|
15305
|
+
const handleRemoveFromAncestry = (0, import_react28.useCallback)((pathToRemove) => {
|
|
15175
15306
|
if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
|
|
15176
15307
|
console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
|
|
15177
15308
|
return;
|
|
@@ -15196,7 +15327,7 @@ function XViewScene({
|
|
|
15196
15327
|
return { ...prev, tree: newTree };
|
|
15197
15328
|
});
|
|
15198
15329
|
}, []);
|
|
15199
|
-
const handleSaveAncestry = (0,
|
|
15330
|
+
const handleSaveAncestry = (0, import_react28.useCallback)(
|
|
15200
15331
|
async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
|
|
15201
15332
|
const treeToUse = treeOverride || ancestryMode.tree;
|
|
15202
15333
|
const { isEditMode, currentAncestryId } = ancestryMode;
|
|
@@ -15432,7 +15563,7 @@ function XViewScene({
|
|
|
15432
15563
|
});
|
|
15433
15564
|
setEditingAncestryRel({ visible: false, data: null, path: null });
|
|
15434
15565
|
};
|
|
15435
|
-
const handleDeleteAncestry = (0,
|
|
15566
|
+
const handleDeleteAncestry = (0, import_react28.useCallback)(
|
|
15436
15567
|
async (ancestryIdToDelete) => {
|
|
15437
15568
|
if (!ancestryIdToDelete) {
|
|
15438
15569
|
alert("ID da ancestralidade n\xE3o encontrado.");
|
|
@@ -15514,10 +15645,10 @@ function XViewScene({
|
|
|
15514
15645
|
},
|
|
15515
15646
|
[save_view_data, delete_file_action]
|
|
15516
15647
|
);
|
|
15517
|
-
const handleOpenAncestryBoard = (0,
|
|
15648
|
+
const handleOpenAncestryBoard = (0, import_react28.useCallback)(() => {
|
|
15518
15649
|
setIsAncestryBoardOpen(true);
|
|
15519
15650
|
}, []);
|
|
15520
|
-
const handleSelectAncestryFromBoard = (0,
|
|
15651
|
+
const handleSelectAncestryFromBoard = (0, import_react28.useCallback)(
|
|
15521
15652
|
(ancestry) => {
|
|
15522
15653
|
setIsAncestryBoardOpen(false);
|
|
15523
15654
|
setIsSidebarOpen(false);
|
|
@@ -15525,7 +15656,7 @@ function XViewScene({
|
|
|
15525
15656
|
},
|
|
15526
15657
|
[handleStartReadingAncestry]
|
|
15527
15658
|
);
|
|
15528
|
-
const handleSaveAncestryBoard = (0,
|
|
15659
|
+
const handleSaveAncestryBoard = (0, import_react28.useCallback)(
|
|
15529
15660
|
async (groups) => {
|
|
15530
15661
|
if (!sceneConfigId || !viewParams || !session) return;
|
|
15531
15662
|
const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
|
|
@@ -15539,7 +15670,7 @@ function XViewScene({
|
|
|
15539
15670
|
},
|
|
15540
15671
|
[sceneConfigId, viewParams, session, save_ancestry_board_action, ownerId]
|
|
15541
15672
|
);
|
|
15542
|
-
const existingNodeTypes = (0,
|
|
15673
|
+
const existingNodeTypes = (0, import_react28.useMemo)(() => {
|
|
15543
15674
|
if (!parentDataRef.current) {
|
|
15544
15675
|
return [];
|
|
15545
15676
|
}
|
|
@@ -15551,7 +15682,7 @@ function XViewScene({
|
|
|
15551
15682
|
).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
|
|
15552
15683
|
return [...new Set(allTypes)];
|
|
15553
15684
|
}, [parentDataRef.current, sceneVersion]);
|
|
15554
|
-
const searchableDbNodes = (0,
|
|
15685
|
+
const searchableDbNodes = (0, import_react28.useMemo)(() => {
|
|
15555
15686
|
if (!parentDataRef.current) {
|
|
15556
15687
|
return [];
|
|
15557
15688
|
}
|
|
@@ -15566,7 +15697,7 @@ function XViewScene({
|
|
|
15566
15697
|
return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
|
|
15567
15698
|
});
|
|
15568
15699
|
}, [parentDataRef.current, sceneVersion]);
|
|
15569
|
-
const handleAddExistingNode = (0,
|
|
15700
|
+
const handleAddExistingNode = (0, import_react28.useCallback)(
|
|
15570
15701
|
(nodeId) => {
|
|
15571
15702
|
return userActionHandlers.handleAddExistingNodeById(
|
|
15572
15703
|
actionHandlerContext,
|
|
@@ -15575,7 +15706,7 @@ function XViewScene({
|
|
|
15575
15706
|
},
|
|
15576
15707
|
[actionHandlerContext]
|
|
15577
15708
|
);
|
|
15578
|
-
const handleSaveCurrentView = (0,
|
|
15709
|
+
const handleSaveCurrentView = (0, import_react28.useCallback)(async () => {
|
|
15579
15710
|
var _a2, _b2, _c2;
|
|
15580
15711
|
const { nodeObjects, allLinks } = stateRef.current;
|
|
15581
15712
|
if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
|
|
@@ -15617,16 +15748,16 @@ function XViewScene({
|
|
|
15617
15748
|
console.error("Erro na chamada de save_view_data:", error);
|
|
15618
15749
|
}
|
|
15619
15750
|
}, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
|
|
15620
|
-
const allAvailableNodes = (0,
|
|
15751
|
+
const allAvailableNodes = (0, import_react28.useMemo)(() => {
|
|
15621
15752
|
if (!parentDataRef.current) return [];
|
|
15622
15753
|
return Object.values(parentDataRef.current).flatMap(
|
|
15623
15754
|
(fileData) => fileData.nodes || []
|
|
15624
15755
|
);
|
|
15625
15756
|
}, [sceneVersion, isInitialized]);
|
|
15626
|
-
const allAvailableAncestries = (0,
|
|
15757
|
+
const allAvailableAncestries = (0, import_react28.useMemo)(() => {
|
|
15627
15758
|
return ancestryDataRef.current || [];
|
|
15628
15759
|
}, [sceneVersion, isInitialized]);
|
|
15629
|
-
const handleOpenReference = (0,
|
|
15760
|
+
const handleOpenReference = (0, import_react28.useCallback)(
|
|
15630
15761
|
(referenceData) => {
|
|
15631
15762
|
const { type, id } = referenceData;
|
|
15632
15763
|
if (type === "node") {
|
|
@@ -15665,13 +15796,13 @@ function XViewScene({
|
|
|
15665
15796
|
tweenToTarget
|
|
15666
15797
|
]
|
|
15667
15798
|
);
|
|
15668
|
-
const handleToggleAncestryAddMode = (0,
|
|
15799
|
+
const handleToggleAncestryAddMode = (0, import_react28.useCallback)(() => {
|
|
15669
15800
|
setAncestryMode((prev) => ({
|
|
15670
15801
|
...prev,
|
|
15671
15802
|
isAddingNodes: !prev.isAddingNodes
|
|
15672
15803
|
}));
|
|
15673
15804
|
}, []);
|
|
15674
|
-
const handleFocusNode = (0,
|
|
15805
|
+
const handleFocusNode = (0, import_react28.useCallback)(
|
|
15675
15806
|
(nodeData) => {
|
|
15676
15807
|
if (!nodeData) return;
|
|
15677
15808
|
const nodeMesh = stateRef.current.nodeObjects[String(nodeData.id)];
|
|
@@ -15681,7 +15812,7 @@ function XViewScene({
|
|
|
15681
15812
|
},
|
|
15682
15813
|
[tweenToTarget]
|
|
15683
15814
|
);
|
|
15684
|
-
const availableDatasets = (0,
|
|
15815
|
+
const availableDatasets = (0, import_react28.useMemo)(() => {
|
|
15685
15816
|
if (!sceneDataRef.current || !parentDataRef.current) return [];
|
|
15686
15817
|
return sceneDataRef.current.parent_dbs.map((db) => {
|
|
15687
15818
|
var _a2;
|
|
@@ -15695,7 +15826,7 @@ function XViewScene({
|
|
|
15695
15826
|
String(creationMode.sourceNodeData.id)
|
|
15696
15827
|
)) == null ? void 0 : _b.parentFileId : null;
|
|
15697
15828
|
const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
|
|
15698
|
-
(0,
|
|
15829
|
+
(0, import_react28.useEffect)(() => {
|
|
15699
15830
|
if (isInitialized && focusNodeId && !hasFocusedInitial) {
|
|
15700
15831
|
const nodeObjects = stateRef.current.nodeObjects || {};
|
|
15701
15832
|
const targetMesh = nodeObjects[String(focusNodeId)];
|
|
@@ -15718,7 +15849,7 @@ function XViewScene({
|
|
|
15718
15849
|
hasFocusedInitial,
|
|
15719
15850
|
tweenToTarget
|
|
15720
15851
|
]);
|
|
15721
|
-
(0,
|
|
15852
|
+
(0, import_react28.useEffect)(() => {
|
|
15722
15853
|
if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
|
|
15723
15854
|
const ancestries = ancestryDataRef.current || [];
|
|
15724
15855
|
const targetAncestry = ancestries.find(
|
|
@@ -15743,7 +15874,7 @@ function XViewScene({
|
|
|
15743
15874
|
hasOpenedInitialAncestry,
|
|
15744
15875
|
handleStartReadingAncestry
|
|
15745
15876
|
]);
|
|
15746
|
-
(0,
|
|
15877
|
+
(0, import_react28.useEffect)(() => {
|
|
15747
15878
|
function handleKeyDown(event) {
|
|
15748
15879
|
var _a2, _b2, _c2;
|
|
15749
15880
|
const context = actionHandlerContext;
|
|
@@ -15866,10 +15997,10 @@ function XViewScene({
|
|
|
15866
15997
|
// <-- handleCancelQuest adicionado aqui
|
|
15867
15998
|
]);
|
|
15868
15999
|
if (isLoading || status === "loading" || permissionStatus === "loading") {
|
|
15869
|
-
return /* @__PURE__ */
|
|
16000
|
+
return /* @__PURE__ */ import_react28.default.createElement(LoadingScreen, null);
|
|
15870
16001
|
}
|
|
15871
16002
|
if (permissionStatus === "denied") {
|
|
15872
|
-
return /* @__PURE__ */
|
|
16003
|
+
return /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react28.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_react28.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react28.default.createElement(
|
|
15873
16004
|
"svg",
|
|
15874
16005
|
{
|
|
15875
16006
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -15879,7 +16010,7 @@ function XViewScene({
|
|
|
15879
16010
|
stroke: "currentColor",
|
|
15880
16011
|
className: "w-16 h-16 mx-auto"
|
|
15881
16012
|
},
|
|
15882
|
-
/* @__PURE__ */
|
|
16013
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
15883
16014
|
"path",
|
|
15884
16015
|
{
|
|
15885
16016
|
strokeLinecap: "round",
|
|
@@ -15887,13 +16018,13 @@ function XViewScene({
|
|
|
15887
16018
|
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"
|
|
15888
16019
|
}
|
|
15889
16020
|
)
|
|
15890
|
-
)), /* @__PURE__ */
|
|
16021
|
+
)), /* @__PURE__ */ import_react28.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react28.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_react28.default.createElement(
|
|
15891
16022
|
"button",
|
|
15892
16023
|
{
|
|
15893
16024
|
onClick: () => router.push("/dashboard/scenes"),
|
|
15894
16025
|
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"
|
|
15895
16026
|
},
|
|
15896
|
-
/* @__PURE__ */
|
|
16027
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
15897
16028
|
"svg",
|
|
15898
16029
|
{
|
|
15899
16030
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -15903,7 +16034,7 @@ function XViewScene({
|
|
|
15903
16034
|
stroke: "currentColor",
|
|
15904
16035
|
className: "w-5 h-5"
|
|
15905
16036
|
},
|
|
15906
|
-
/* @__PURE__ */
|
|
16037
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
15907
16038
|
"path",
|
|
15908
16039
|
{
|
|
15909
16040
|
strokeLinecap: "round",
|
|
@@ -15915,7 +16046,7 @@ function XViewScene({
|
|
|
15915
16046
|
"Voltar para Scenes"
|
|
15916
16047
|
)));
|
|
15917
16048
|
}
|
|
15918
|
-
return /* @__PURE__ */
|
|
16049
|
+
return /* @__PURE__ */ import_react28.default.createElement(
|
|
15919
16050
|
"div",
|
|
15920
16051
|
{
|
|
15921
16052
|
ref: mountRef,
|
|
@@ -15927,7 +16058,7 @@ function XViewScene({
|
|
|
15927
16058
|
cursor: stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
|
|
15928
16059
|
}
|
|
15929
16060
|
},
|
|
15930
|
-
userPermissionRole !== "link_viewer" && /* @__PURE__ */
|
|
16061
|
+
userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react28.default.createElement(
|
|
15931
16062
|
XViewSidebar,
|
|
15932
16063
|
{
|
|
15933
16064
|
dbNodes: searchableDbNodes,
|
|
@@ -15947,7 +16078,7 @@ function XViewScene({
|
|
|
15947
16078
|
userRole: userPermissionRole
|
|
15948
16079
|
}
|
|
15949
16080
|
),
|
|
15950
|
-
creationMode.isActive && /* @__PURE__ */
|
|
16081
|
+
creationMode.isActive && /* @__PURE__ */ import_react28.default.createElement(
|
|
15951
16082
|
InSceneCreationForm,
|
|
15952
16083
|
{
|
|
15953
16084
|
onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
|
|
@@ -15979,7 +16110,7 @@ function XViewScene({
|
|
|
15979
16110
|
availableAncestries: allAvailableAncestries
|
|
15980
16111
|
}
|
|
15981
16112
|
),
|
|
15982
|
-
versionMode.isActive && /* @__PURE__ */
|
|
16113
|
+
versionMode.isActive && /* @__PURE__ */ import_react28.default.createElement(
|
|
15983
16114
|
InSceneVersionForm,
|
|
15984
16115
|
{
|
|
15985
16116
|
onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
|
|
@@ -16005,7 +16136,7 @@ function XViewScene({
|
|
|
16005
16136
|
availableAncestries: allAvailableAncestries
|
|
16006
16137
|
}
|
|
16007
16138
|
),
|
|
16008
|
-
questMode.isActive && /* @__PURE__ */
|
|
16139
|
+
questMode.isActive && /* @__PURE__ */ import_react28.default.createElement(
|
|
16009
16140
|
InSceneQuestForm,
|
|
16010
16141
|
{
|
|
16011
16142
|
onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
|
|
@@ -16031,7 +16162,7 @@ function XViewScene({
|
|
|
16031
16162
|
viewMembers
|
|
16032
16163
|
}
|
|
16033
16164
|
),
|
|
16034
|
-
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */
|
|
16165
|
+
readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react28.default.createElement(
|
|
16035
16166
|
"div",
|
|
16036
16167
|
{
|
|
16037
16168
|
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"}`,
|
|
@@ -16044,7 +16175,7 @@ function XViewScene({
|
|
|
16044
16175
|
maxWidth: "92vw"
|
|
16045
16176
|
}
|
|
16046
16177
|
},
|
|
16047
|
-
/* @__PURE__ */
|
|
16178
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16048
16179
|
"div",
|
|
16049
16180
|
{
|
|
16050
16181
|
onPointerDown: (e) => {
|
|
@@ -16055,7 +16186,7 @@ function XViewScene({
|
|
|
16055
16186
|
title: "Arraste para redimensionar"
|
|
16056
16187
|
}
|
|
16057
16188
|
),
|
|
16058
|
-
/* @__PURE__ */
|
|
16189
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16059
16190
|
DescriptionReadModePanel,
|
|
16060
16191
|
{
|
|
16061
16192
|
key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
|
|
@@ -16090,7 +16221,7 @@ function XViewScene({
|
|
|
16090
16221
|
}
|
|
16091
16222
|
)
|
|
16092
16223
|
),
|
|
16093
|
-
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */
|
|
16224
|
+
ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react28.default.createElement(
|
|
16094
16225
|
CreateAncestryPanel,
|
|
16095
16226
|
{
|
|
16096
16227
|
ancestryMode,
|
|
@@ -16126,7 +16257,7 @@ function XViewScene({
|
|
|
16126
16257
|
onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
|
|
16127
16258
|
}
|
|
16128
16259
|
),
|
|
16129
|
-
editingAncestryRel.visible && /* @__PURE__ */
|
|
16260
|
+
editingAncestryRel.visible && /* @__PURE__ */ import_react28.default.createElement(
|
|
16130
16261
|
AncestryRelationshipPanel,
|
|
16131
16262
|
{
|
|
16132
16263
|
data: editingAncestryRel.data,
|
|
@@ -16140,7 +16271,7 @@ function XViewScene({
|
|
|
16140
16271
|
onUploadFile: upload_file_action
|
|
16141
16272
|
}
|
|
16142
16273
|
),
|
|
16143
|
-
detailsNode && detailsNode.is_quest && /* @__PURE__ */
|
|
16274
|
+
detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react28.default.createElement(
|
|
16144
16275
|
QuestDetailsPanel,
|
|
16145
16276
|
{
|
|
16146
16277
|
node: detailsNode,
|
|
@@ -16163,7 +16294,7 @@ function XViewScene({
|
|
|
16163
16294
|
currentUser: session == null ? void 0 : session.user
|
|
16164
16295
|
}
|
|
16165
16296
|
),
|
|
16166
|
-
detailsNode && !detailsNode.is_quest && /* @__PURE__ */
|
|
16297
|
+
detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react28.default.createElement(
|
|
16167
16298
|
NodeDetailsPanel,
|
|
16168
16299
|
{
|
|
16169
16300
|
node: detailsNode,
|
|
@@ -16195,7 +16326,7 @@ function XViewScene({
|
|
|
16195
16326
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName
|
|
16196
16327
|
}
|
|
16197
16328
|
),
|
|
16198
|
-
detailsLink && /* @__PURE__ */
|
|
16329
|
+
detailsLink && /* @__PURE__ */ import_react28.default.createElement(
|
|
16199
16330
|
RelationshipDetailsPanel,
|
|
16200
16331
|
{
|
|
16201
16332
|
link: detailsLink,
|
|
@@ -16209,7 +16340,7 @@ function XViewScene({
|
|
|
16209
16340
|
userRole: userPermissionRole
|
|
16210
16341
|
}
|
|
16211
16342
|
),
|
|
16212
|
-
ancestryLinkDetails && /* @__PURE__ */
|
|
16343
|
+
ancestryLinkDetails && /* @__PURE__ */ import_react28.default.createElement(
|
|
16213
16344
|
AncestryLinkDetailsPanel,
|
|
16214
16345
|
{
|
|
16215
16346
|
data: ancestryLinkDetails,
|
|
@@ -16220,7 +16351,7 @@ function XViewScene({
|
|
|
16220
16351
|
onUploadFile: upload_file_action
|
|
16221
16352
|
}
|
|
16222
16353
|
),
|
|
16223
|
-
/* @__PURE__ */
|
|
16354
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16224
16355
|
"div",
|
|
16225
16356
|
{
|
|
16226
16357
|
ref: tooltipRef,
|
|
@@ -16247,7 +16378,7 @@ function XViewScene({
|
|
|
16247
16378
|
}
|
|
16248
16379
|
}
|
|
16249
16380
|
),
|
|
16250
|
-
/* @__PURE__ */
|
|
16381
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16251
16382
|
ContextMenu,
|
|
16252
16383
|
{
|
|
16253
16384
|
data: contextMenu,
|
|
@@ -16280,7 +16411,7 @@ function XViewScene({
|
|
|
16280
16411
|
onFinishQuest: handleFinishQuestQuick
|
|
16281
16412
|
}
|
|
16282
16413
|
),
|
|
16283
|
-
/* @__PURE__ */
|
|
16414
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16284
16415
|
MultiNodeContextMenu,
|
|
16285
16416
|
{
|
|
16286
16417
|
data: multiContextMenu,
|
|
@@ -16300,7 +16431,7 @@ function XViewScene({
|
|
|
16300
16431
|
)
|
|
16301
16432
|
}
|
|
16302
16433
|
),
|
|
16303
|
-
/* @__PURE__ */
|
|
16434
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16304
16435
|
RelationshipContextMenu,
|
|
16305
16436
|
{
|
|
16306
16437
|
data: relationshipMenu,
|
|
@@ -16318,14 +16449,14 @@ function XViewScene({
|
|
|
16318
16449
|
onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
|
|
16319
16450
|
}
|
|
16320
16451
|
),
|
|
16321
|
-
/* @__PURE__ */
|
|
16452
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16322
16453
|
ImageViewer,
|
|
16323
16454
|
{
|
|
16324
16455
|
data: imageViewer,
|
|
16325
16456
|
onClose: () => setImageViewer({ ...imageViewer, visible: false })
|
|
16326
16457
|
}
|
|
16327
16458
|
),
|
|
16328
|
-
/* @__PURE__ */
|
|
16459
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16329
16460
|
AncestryBoard,
|
|
16330
16461
|
{
|
|
16331
16462
|
isOpen: isAncestryBoardOpen,
|
|
@@ -16338,7 +16469,7 @@ function XViewScene({
|
|
|
16338
16469
|
userRole: userPermissionRole
|
|
16339
16470
|
}
|
|
16340
16471
|
),
|
|
16341
|
-
/* @__PURE__ */
|
|
16472
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16342
16473
|
ImportParentFileModal,
|
|
16343
16474
|
{
|
|
16344
16475
|
isOpen: isImportModalOpen,
|
|
@@ -16351,7 +16482,7 @@ function XViewScene({
|
|
|
16351
16482
|
currentAncestries: ancestryDataRef.current || []
|
|
16352
16483
|
}
|
|
16353
16484
|
),
|
|
16354
|
-
invalidTargetError && /* @__PURE__ */
|
|
16485
|
+
invalidTargetError && /* @__PURE__ */ import_react28.default.createElement(
|
|
16355
16486
|
"div",
|
|
16356
16487
|
{
|
|
16357
16488
|
className: "ui-overlay",
|
|
@@ -16376,13 +16507,13 @@ function XViewScene({
|
|
|
16376
16507
|
animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
|
|
16377
16508
|
}
|
|
16378
16509
|
},
|
|
16379
|
-
/* @__PURE__ */
|
|
16510
|
+
/* @__PURE__ */ import_react28.default.createElement("style", null, `
|
|
16380
16511
|
@keyframes fadeInDown {
|
|
16381
16512
|
from { opacity: 0; transform: translate(-50%, -20px); }
|
|
16382
16513
|
to { opacity: 1; transform: translate(-50%, 0); }
|
|
16383
16514
|
}
|
|
16384
16515
|
`),
|
|
16385
|
-
/* @__PURE__ */
|
|
16516
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16386
16517
|
"svg",
|
|
16387
16518
|
{
|
|
16388
16519
|
width: "20",
|
|
@@ -16394,12 +16525,12 @@ function XViewScene({
|
|
|
16394
16525
|
strokeLinecap: "round",
|
|
16395
16526
|
strokeLinejoin: "round"
|
|
16396
16527
|
},
|
|
16397
|
-
/* @__PURE__ */
|
|
16398
|
-
/* @__PURE__ */
|
|
16399
|
-
/* @__PURE__ */
|
|
16528
|
+
/* @__PURE__ */ import_react28.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
|
|
16529
|
+
/* @__PURE__ */ import_react28.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
|
|
16530
|
+
/* @__PURE__ */ import_react28.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
|
|
16400
16531
|
),
|
|
16401
|
-
/* @__PURE__ */
|
|
16402
|
-
/* @__PURE__ */
|
|
16532
|
+
/* @__PURE__ */ import_react28.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
|
|
16533
|
+
/* @__PURE__ */ import_react28.default.createElement(
|
|
16403
16534
|
"button",
|
|
16404
16535
|
{
|
|
16405
16536
|
onClick: () => setInvalidTargetError(null),
|