@lv-x-software-house/x_view 1.2.5-dev.26 → 1.2.5-dev.28
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 +609 -128
- package/dist/index.mjs +637 -131
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -347,13 +347,13 @@ function ContextMenu({
|
|
|
347
347
|
});
|
|
348
348
|
};
|
|
349
349
|
const renderMainView = () => {
|
|
350
|
-
var _a2, _b2, _c2, _d, _e;
|
|
350
|
+
var _a2, _b2, _c2, _d, _e, _f;
|
|
351
351
|
const hasVersions = computedVersions.length > 0;
|
|
352
352
|
const canCreateVersion = ability.can("create", "Versioning");
|
|
353
353
|
const canReadVersion = ability.can("read", "Versioning");
|
|
354
354
|
const shouldShowVersioningBtn = canCreateVersion || canReadVersion && hasVersions;
|
|
355
355
|
const canStartQuest = isCurrentNodeQuest && (((_a2 = data.nodeData) == null ? void 0 : _a2.status) === "Backlog" || !((_b2 = data.nodeData) == null ? void 0 : _b2.status));
|
|
356
|
-
const canFinishQuest = isCurrentNodeQuest && ((_c2 = data.nodeData) == null ? void 0 : _c2.assignee_id) === (currentUser == null ? void 0 : currentUser.id) && ((_d = data.nodeData) == null ? void 0 : _d.status) !== "Backlog";
|
|
356
|
+
const canFinishQuest = isCurrentNodeQuest && ((_c2 = data.nodeData) == null ? void 0 : _c2.assignee_id) === (currentUser == null ? void 0 : currentUser.id) && ((_d = data.nodeData) == null ? void 0 : _d.status) !== "Backlog" && ((_e = data.nodeData) == null ? void 0 : _e.status) !== "Done";
|
|
357
357
|
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-2 px-2 pt-1 pb-2" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_12px_1px_rgba(99,102,241,0.5)]" }), /* @__PURE__ */ import_react.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "A\xE7\xF5es R\xE1pidas")), /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col gap-1" }, canStartQuest && /* @__PURE__ */ import_react.default.createElement(
|
|
358
358
|
"button",
|
|
359
359
|
{
|
|
@@ -374,11 +374,11 @@ function ContextMenu({
|
|
|
374
374
|
onClose();
|
|
375
375
|
},
|
|
376
376
|
className: baseButtonClass,
|
|
377
|
-
title: "Finalizar esta
|
|
377
|
+
title: "Finalizar esta etapa e avan\xE7ar"
|
|
378
378
|
},
|
|
379
379
|
/* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }), /* @__PURE__ */ import_react.default.createElement("polyline", { points: "22 4 12 14.01 9 11.01" })),
|
|
380
|
-
/* @__PURE__ */ import_react.default.createElement("span", null, "Finalizar
|
|
381
|
-
), (canStartQuest || canFinishQuest) && /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), ability.can("create", "Connection") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartConnection == null ? void 0 : onStartConnection(data.nodeData), className: baseButtonClass, title: "Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conectar")), ability.can("create", "Node") && !((
|
|
380
|
+
/* @__PURE__ */ import_react.default.createElement("span", null, "Finalizar Etapa")
|
|
381
|
+
), (canStartQuest || canFinishQuest) && /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), ability.can("create", "Connection") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartConnection == null ? void 0 : onStartConnection(data.nodeData), className: baseButtonClass, title: "Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conectar")), ability.can("create", "Node") && !((_f = data.nodeData) == null ? void 0 : _f.is_quest) && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartCreation == null ? void 0 : onStartCreation(data.nodeData), className: baseButtonClass, title: "Criar e Conectar" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "16" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "8", y1: "12", x2: "16", y2: "12" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar e Conectar")), ability.can("create", "Ancestry") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onStartAncestryCreation == null ? void 0 : onStartAncestryCreation(data.nodeData), className: baseButtonClass, title: "Criar Ancestralidade" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 20.5c.5-.5.8-1.2.8-2s-.3-1.5-.8-2c-.5-.5-1.2-.8-2-.8s-1.5.3-2 .8c-.5.5-.8 1.2-.8 2s.3 1.5.8 2c.5.5 1.2-.8 2 .8s1.5-.3 2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 16v-3a2 2 0 0 1 2-2h4" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 3.5c.5.5.8 1.2.8 2s-.3 1.5-.8 2c-.5-.5-1.2-.8-2 .8s1.5.3-2-.8c-.5-.5-.8-1.2-.8-2s.3-1.5.8-2c.5.5 1.2-.8 2 .8s1.5.3 2 .8Z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 8v3a2 2 0 0 0 2 2h4" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Criar Ancestralidade")), shouldShowVersioningBtn && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("versioning"), className: baseButtonClass, title: hasVersions ? "Versionamento" : "Criar Versionamento" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("line", { x1: "6", y1: "3", x2: "6", y2: "15" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "18", cy: "6", r: "3" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "6", cy: "18", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M18 9a9 9 0 0 1-9 9" })), /* @__PURE__ */ import_react.default.createElement("span", null, hasVersions || !canCreateVersion ? "Versionamento" : "Criar Versionamento")), (connections.length > 0 || availableAncestries.length > 0) && ability.can("read", "Connection") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("connections"), className: baseButtonClass, title: "Conex\xF5es" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M8 12h8" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 8v8" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Conex\xF5es (", totalConnectionsCount, ")"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full bg-white/10" }), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => {
|
|
382
382
|
onFocusNode == null ? void 0 : onFocusNode(data.nodeData);
|
|
383
383
|
onClose();
|
|
384
384
|
}, className: baseButtonClass, title: "Focar na c\xE2mera" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "3" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Focar neste Node")), /* @__PURE__ */ import_react.default.createElement("button", { onClick: (e) => handleCopyLink(e, data.nodeData), className: baseButtonClass, title: "Copiar Link para Compartilhar" }, isLinkCopied ? /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#4ade80", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("polyline", { points: "20 6 9 17 4 12" })) : /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72" })), /* @__PURE__ */ import_react.default.createElement("span", { className: isLinkCopied ? "text-green-400" : "" }, isLinkCopied ? "Copiado!" : "Copiar Link")), ability.can("dismiss", "Node") && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onDismissNode == null ? void 0 : onDismissNode(data.nodeData), className: baseButtonClass, title: "Remover da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "2", y1: "2", x2: "22", y2: "22" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Dismiss")), /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => onDismissOtherNodes == null ? void 0 : onDismissOtherNodes(data.nodeData), className: baseButtonClass, title: "Remover outros da visualiza\xE7\xE3o" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Dismiss other nodes"))), ability.can("delete", "Node") && /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => setMenuView("deleteConfirmation"), className: deleteButtonClass, title: "Excluir Node" }, /* @__PURE__ */ import_react.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react.default.createElement("polyline", { points: "3 6 5 6 21 6" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "10", y1: "11", x2: "10", y2: "17" }), /* @__PURE__ */ import_react.default.createElement("line", { x1: "14", y1: "11", x2: "14", y2: "17" })), /* @__PURE__ */ import_react.default.createElement("span", null, "Excluir Node"))));
|
|
@@ -2500,7 +2500,8 @@ var userActionHandlers = {
|
|
|
2500
2500
|
nodes: sceneDataRef.current.nodes,
|
|
2501
2501
|
links: sceneDataRef.current.links,
|
|
2502
2502
|
quest_nodes: specificParentData.nodes,
|
|
2503
|
-
quest_links: specificParentData.links
|
|
2503
|
+
quest_links: specificParentData.links,
|
|
2504
|
+
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
2504
2505
|
};
|
|
2505
2506
|
} else {
|
|
2506
2507
|
filenameToSave = `x_view_dbs/${ownerId}/${parentFileId}`;
|
|
@@ -2697,7 +2698,8 @@ var userActionHandlers = {
|
|
|
2697
2698
|
nodes: sceneDataRef.current.nodes,
|
|
2698
2699
|
links: sceneDataRef.current.links,
|
|
2699
2700
|
quest_nodes: originalData.nodes,
|
|
2700
|
-
quest_links: originalData.links
|
|
2701
|
+
quest_links: originalData.links,
|
|
2702
|
+
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
2701
2703
|
};
|
|
2702
2704
|
} else {
|
|
2703
2705
|
filenameToSave = `x_view_dbs/${ownerId}/${parentFileId}`;
|
|
@@ -2762,7 +2764,8 @@ var userActionHandlers = {
|
|
|
2762
2764
|
nodes: newVisualNodes,
|
|
2763
2765
|
links: newVisualLinks,
|
|
2764
2766
|
quest_nodes: specificParentData.nodes,
|
|
2765
|
-
quest_links: specificParentData.links
|
|
2767
|
+
quest_links: specificParentData.links,
|
|
2768
|
+
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
2766
2769
|
};
|
|
2767
2770
|
} else {
|
|
2768
2771
|
filenameToSave = `x_view_dbs/${ownerId}/${parentFileId}`;
|
|
@@ -2823,7 +2826,8 @@ var userActionHandlers = {
|
|
|
2823
2826
|
nodes: sceneDataRef.current.nodes,
|
|
2824
2827
|
links: sceneDataRef.current.links,
|
|
2825
2828
|
quest_nodes: specificParentData.nodes,
|
|
2826
|
-
quest_links: specificParentData.links
|
|
2829
|
+
quest_links: specificParentData.links,
|
|
2830
|
+
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
2827
2831
|
};
|
|
2828
2832
|
await context.actions.save_view_data(context.sceneSaveUrl, viewFilePayload);
|
|
2829
2833
|
} else {
|
|
@@ -2870,7 +2874,8 @@ var userActionHandlers = {
|
|
|
2870
2874
|
nodes: sceneDataRef.current.nodes,
|
|
2871
2875
|
links: sceneDataRef.current.links,
|
|
2872
2876
|
quest_nodes: specificParentData.nodes,
|
|
2873
|
-
quest_links: specificParentData.links
|
|
2877
|
+
quest_links: specificParentData.links,
|
|
2878
|
+
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
2874
2879
|
};
|
|
2875
2880
|
await context.actions.save_view_data(context.sceneSaveUrl, viewFilePayload);
|
|
2876
2881
|
} else {
|
|
@@ -7826,7 +7831,9 @@ function InSceneCreationForm({
|
|
|
7826
7831
|
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react14.useState)(false);
|
|
7827
7832
|
const [useImageAsTexture, setUseImageAsTexture] = (0, import_react14.useState)(false);
|
|
7828
7833
|
const [selectedImageUrl, setSelectedImageUrl] = (0, import_react14.useState)(null);
|
|
7829
|
-
const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(
|
|
7834
|
+
const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(
|
|
7835
|
+
sourceNodeDatasetId || ""
|
|
7836
|
+
);
|
|
7830
7837
|
const [isDatasetDropdownOpen, setIsDatasetDropdownOpen] = (0, import_react14.useState)(false);
|
|
7831
7838
|
const datasetDropdownRef = (0, import_react14.useRef)(null);
|
|
7832
7839
|
(0, import_react14.useEffect)(() => {
|
|
@@ -7846,7 +7853,9 @@ function InSceneCreationForm({
|
|
|
7846
7853
|
};
|
|
7847
7854
|
}, [isDatasetDropdownOpen]);
|
|
7848
7855
|
const propsEndRef = (0, import_react14.useRef)(null);
|
|
7849
|
-
const hasImages = customProps.some(
|
|
7856
|
+
const hasImages = customProps.some(
|
|
7857
|
+
(p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value)
|
|
7858
|
+
);
|
|
7850
7859
|
(0, import_react14.useEffect)(() => {
|
|
7851
7860
|
if (!hasImages && useImageAsTexture) {
|
|
7852
7861
|
setUseImageAsTexture(false);
|
|
@@ -7856,7 +7865,9 @@ function InSceneCreationForm({
|
|
|
7856
7865
|
}, [hasImages, useImageAsTexture, onImageChange]);
|
|
7857
7866
|
(0, import_react14.useEffect)(() => {
|
|
7858
7867
|
let result = [];
|
|
7859
|
-
const validExistingTypes = existingTypes.filter(
|
|
7868
|
+
const validExistingTypes = existingTypes.filter(
|
|
7869
|
+
(t) => t && typeof t === "string" && t.trim() !== ""
|
|
7870
|
+
);
|
|
7860
7871
|
if (typeInput.trim() === "") {
|
|
7861
7872
|
result = validExistingTypes.filter((t) => !types.includes(t));
|
|
7862
7873
|
} else {
|
|
@@ -7865,13 +7876,20 @@ function InSceneCreationForm({
|
|
|
7865
7876
|
const lowercasedInput = typeInput.toLowerCase();
|
|
7866
7877
|
result = validExistingTypes.filter((t) => {
|
|
7867
7878
|
if (!t) {
|
|
7868
|
-
console.warn(
|
|
7879
|
+
console.warn(
|
|
7880
|
+
"InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem"
|
|
7881
|
+
);
|
|
7869
7882
|
return false;
|
|
7870
7883
|
}
|
|
7871
7884
|
return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
|
|
7872
7885
|
});
|
|
7873
7886
|
} catch (err) {
|
|
7874
|
-
console.error(
|
|
7887
|
+
console.error(
|
|
7888
|
+
"InSceneCreationForm: Erro ao filtrar tipos:",
|
|
7889
|
+
err,
|
|
7890
|
+
"typeInput:",
|
|
7891
|
+
typeInput
|
|
7892
|
+
);
|
|
7875
7893
|
}
|
|
7876
7894
|
}
|
|
7877
7895
|
if (sourceTypes) {
|
|
@@ -7901,7 +7919,10 @@ function InSceneCreationForm({
|
|
|
7901
7919
|
setCustomProps([...customProps, newProp]);
|
|
7902
7920
|
setTimeout(() => {
|
|
7903
7921
|
var _a2;
|
|
7904
|
-
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
7922
|
+
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
7923
|
+
behavior: "smooth",
|
|
7924
|
+
block: "center"
|
|
7925
|
+
});
|
|
7905
7926
|
}, 100);
|
|
7906
7927
|
};
|
|
7907
7928
|
const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
|
|
@@ -8010,15 +8031,23 @@ function InSceneCreationForm({
|
|
|
8010
8031
|
},
|
|
8011
8032
|
/* @__PURE__ */ import_react14.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
|
|
8012
8033
|
/* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pt-5 pb-3" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react14.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-indigo-400/80 shadow-[0_0_18px_2px_rgba(99,102,241,0.55)]" }), /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Criar & Conectar")), /* @__PURE__ */ import_react14.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Novo Node")),
|
|
8013
|
-
/* @__PURE__ */ import_react14.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo(s) do Node"), /* @__PURE__ */ import_react14.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
8014
|
-
"
|
|
8034
|
+
/* @__PURE__ */ import_react14.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo(s) do Node"), /* @__PURE__ */ import_react14.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
8035
|
+
"span",
|
|
8015
8036
|
{
|
|
8016
|
-
|
|
8017
|
-
|
|
8018
|
-
className: "hover:text-white transition-colors"
|
|
8037
|
+
key: index,
|
|
8038
|
+
className: "flex items-center gap-1 bg-indigo-500/30 text-indigo-100 px-1.5 py-0.5 rounded-md text-xs font-medium border border-indigo-500/20"
|
|
8019
8039
|
},
|
|
8020
|
-
|
|
8021
|
-
|
|
8040
|
+
t,
|
|
8041
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
8042
|
+
"button",
|
|
8043
|
+
{
|
|
8044
|
+
type: "button",
|
|
8045
|
+
onClick: () => handleRemoveType(index),
|
|
8046
|
+
className: "hover:text-white transition-colors"
|
|
8047
|
+
},
|
|
8048
|
+
/* @__PURE__ */ import_react14.default.createElement(import_fi12.FiX, { size: 12 })
|
|
8049
|
+
)
|
|
8050
|
+
)), /* @__PURE__ */ import_react14.default.createElement(
|
|
8022
8051
|
"input",
|
|
8023
8052
|
{
|
|
8024
8053
|
type: "text",
|
|
@@ -8051,7 +8080,17 @@ function InSceneCreationForm({
|
|
|
8051
8080
|
}
|
|
8052
8081
|
},
|
|
8053
8082
|
suggestedType
|
|
8054
|
-
))))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react14.default.createElement(
|
|
8083
|
+
))))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react14.default.createElement(
|
|
8084
|
+
"input",
|
|
8085
|
+
{
|
|
8086
|
+
required: true,
|
|
8087
|
+
type: "text",
|
|
8088
|
+
placeholder: "Ex.: Cliente XPTO",
|
|
8089
|
+
value: name,
|
|
8090
|
+
onChange: handleNameInputChange,
|
|
8091
|
+
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"
|
|
8092
|
+
}
|
|
8093
|
+
)), viewType === "view" && availableDatasets.length > 0 && /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5 relative", ref: datasetDropdownRef }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Criar Node no Dataset:"), /* @__PURE__ */ import_react14.default.createElement(
|
|
8055
8094
|
"button",
|
|
8056
8095
|
{
|
|
8057
8096
|
type: "button",
|
|
@@ -8059,7 +8098,12 @@ function InSceneCreationForm({
|
|
|
8059
8098
|
className: "w-full flex items-center justify-between 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 hover:bg-slate-700/70 transition-colors text-slate-200 text-left"
|
|
8060
8099
|
},
|
|
8061
8100
|
/* @__PURE__ */ import_react14.default.createElement("span", { className: "truncate pr-2" }, selectedDatasetName),
|
|
8062
|
-
/* @__PURE__ */ import_react14.default.createElement(
|
|
8101
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
8102
|
+
import_fi12.FiChevronDown,
|
|
8103
|
+
{
|
|
8104
|
+
className: `flex-shrink-0 text-slate-400 transition-transform ${isDatasetDropdownOpen ? "rotate-180" : ""}`
|
|
8105
|
+
}
|
|
8106
|
+
)
|
|
8063
8107
|
), isDatasetDropdownOpen && /* @__PURE__ */ import_react14.default.createElement("ul", { className: "custom-scrollbar absolute top-[66px] left-0 z-20 w-full max-h-48 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-xl py-1" }, availableDatasets.map((ds) => /* @__PURE__ */ import_react14.default.createElement(
|
|
8064
8108
|
"li",
|
|
8065
8109
|
{
|
|
@@ -8071,7 +8115,7 @@ function InSceneCreationForm({
|
|
|
8071
8115
|
className: `px-3 py-2 text-sm cursor-pointer transition-colors ${targetDatasetId === ds.id ? "bg-indigo-600/40 text-indigo-200 font-medium" : "text-slate-300 hover:bg-white/5"}`
|
|
8072
8116
|
},
|
|
8073
8117
|
ds.name
|
|
8074
|
-
)))), /* @__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
|
|
8118
|
+
)))), /* @__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(
|
|
8075
8119
|
DescriptionDisplay,
|
|
8076
8120
|
{
|
|
8077
8121
|
description,
|
|
@@ -8108,10 +8152,28 @@ function InSceneCreationForm({
|
|
|
8108
8152
|
onClick: () => handleSizeChange(s),
|
|
8109
8153
|
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
8110
8154
|
},
|
|
8111
|
-
/* @__PURE__ */ import_react14.default.createElement(
|
|
8112
|
-
|
|
8155
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
8156
|
+
"div",
|
|
8157
|
+
{
|
|
8158
|
+
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 group-hover:border-slate-500"}`
|
|
8159
|
+
},
|
|
8160
|
+
isSelected && /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiCheck, { size: 12, className: "text-white" })
|
|
8161
|
+
),
|
|
8162
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
8163
|
+
"span",
|
|
8164
|
+
{
|
|
8165
|
+
className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}`
|
|
8166
|
+
},
|
|
8167
|
+
s
|
|
8168
|
+
)
|
|
8113
8169
|
);
|
|
8114
|
-
}))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), hasImages && /* @__PURE__ */ import_react14.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
8170
|
+
}))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor e Brilho"), hasImages && /* @__PURE__ */ import_react14.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
8171
|
+
"div",
|
|
8172
|
+
{
|
|
8173
|
+
className: `w-4 h-4 rounded border flex items-center justify-center transition-colors ${useImageAsTexture ? "bg-indigo-500 border-indigo-500" : "border-slate-500 bg-transparent"}`
|
|
8174
|
+
},
|
|
8175
|
+
useImageAsTexture && /* @__PURE__ */ import_react14.default.createElement(import_fi12.FiCheck, { size: 12, className: "text-white" })
|
|
8176
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
8115
8177
|
"input",
|
|
8116
8178
|
{
|
|
8117
8179
|
type: "checkbox",
|
|
@@ -8119,7 +8181,13 @@ function InSceneCreationForm({
|
|
|
8119
8181
|
onChange: handleToggleImageMode,
|
|
8120
8182
|
className: "hidden"
|
|
8121
8183
|
}
|
|
8122
|
-
), /* @__PURE__ */ import_react14.default.createElement(
|
|
8184
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
8185
|
+
"span",
|
|
8186
|
+
{
|
|
8187
|
+
className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}`
|
|
8188
|
+
},
|
|
8189
|
+
"Usar imagem para representar o node"
|
|
8190
|
+
))), /* @__PURE__ */ import_react14.default.createElement(
|
|
8123
8191
|
ColorPicker,
|
|
8124
8192
|
{
|
|
8125
8193
|
color,
|
|
@@ -8138,7 +8206,22 @@ function InSceneCreationForm({
|
|
|
8138
8206
|
className: "w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-indigo-500 hover:accent-indigo-400",
|
|
8139
8207
|
title: `Intensidade do brilho: ${intensity}`
|
|
8140
8208
|
}
|
|
8141
|
-
), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react14.default.createElement(
|
|
8209
|
+
), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs text-slate-400 w-6 text-right" }, intensity)), /* @__PURE__ */ import_react14.default.createElement(
|
|
8210
|
+
"span",
|
|
8211
|
+
{
|
|
8212
|
+
className: `text-xs block mt-1 transition-opacity ${useImageAsTexture ? "opacity-40" : "text-slate-400"}`
|
|
8213
|
+
},
|
|
8214
|
+
useImageAsTexture ? "Cor da borda (definida pela imagem)" : "Selecione a cor e ajuste o brilho."
|
|
8215
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react14.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react14.default.createElement(
|
|
8216
|
+
"button",
|
|
8217
|
+
{
|
|
8218
|
+
type: "button",
|
|
8219
|
+
onClick: handleAddProp,
|
|
8220
|
+
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"
|
|
8221
|
+
},
|
|
8222
|
+
/* @__PURE__ */ import_react14.default.createElement(import_fi12.FiPlus, { size: 14 }),
|
|
8223
|
+
" Adicionar"
|
|
8224
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
8142
8225
|
CustomPropertyDisplay,
|
|
8143
8226
|
{
|
|
8144
8227
|
key: prop.id,
|
|
@@ -8146,13 +8229,30 @@ function InSceneCreationForm({
|
|
|
8146
8229
|
onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
|
|
8147
8230
|
onRemove: () => handleRemoveProp(index),
|
|
8148
8231
|
onOpenImageViewer,
|
|
8149
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
8232
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
8233
|
+
(t) => t !== prop.type
|
|
8234
|
+
),
|
|
8150
8235
|
isTextureMode: useImageAsTexture,
|
|
8151
8236
|
selectedImageUrl,
|
|
8152
8237
|
onSelectTexture: handleSelectTexture,
|
|
8153
8238
|
onUploadFile
|
|
8154
8239
|
}
|
|
8155
|
-
)), /* @__PURE__ */ import_react14.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react14.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_react14.default.createElement(
|
|
8240
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react14.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_react14.default.createElement(
|
|
8241
|
+
"button",
|
|
8242
|
+
{
|
|
8243
|
+
type: "button",
|
|
8244
|
+
onClick: onCancel,
|
|
8245
|
+
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm"
|
|
8246
|
+
},
|
|
8247
|
+
"Cancelar"
|
|
8248
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
8249
|
+
"button",
|
|
8250
|
+
{
|
|
8251
|
+
type: "submit",
|
|
8252
|
+
className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)]"
|
|
8253
|
+
},
|
|
8254
|
+
"Salvar"
|
|
8255
|
+
)))
|
|
8156
8256
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react14.default.createElement(
|
|
8157
8257
|
DescriptionEditModal,
|
|
8158
8258
|
{
|
|
@@ -8192,12 +8292,22 @@ function InSceneVersionForm({
|
|
|
8192
8292
|
const [name, setName] = (0, import_react15.useState)("");
|
|
8193
8293
|
const [size, setSize] = (0, import_react15.useState)("medium");
|
|
8194
8294
|
const [description, setDescription] = (0, import_react15.useState)("");
|
|
8195
|
-
const [customProps, setCustomProps] = (0, import_react15.useState)([
|
|
8295
|
+
const [customProps, setCustomProps] = (0, import_react15.useState)([
|
|
8296
|
+
{
|
|
8297
|
+
id: v4_default(),
|
|
8298
|
+
key: "Date",
|
|
8299
|
+
type: "date",
|
|
8300
|
+
value: { type: "Data", value: "" },
|
|
8301
|
+
isEditing: true
|
|
8302
|
+
}
|
|
8303
|
+
]);
|
|
8196
8304
|
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react15.useState)(false);
|
|
8197
8305
|
const propsEndRef = (0, import_react15.useRef)(null);
|
|
8198
8306
|
const [useImageAsTexture, setUseImageAsTexture] = (0, import_react15.useState)(false);
|
|
8199
8307
|
const [selectedImageUrl, setSelectedImageUrl] = (0, import_react15.useState)(null);
|
|
8200
|
-
const hasImages = customProps.some(
|
|
8308
|
+
const hasImages = customProps.some(
|
|
8309
|
+
(p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value)
|
|
8310
|
+
);
|
|
8201
8311
|
(0, import_react15.useEffect)(() => {
|
|
8202
8312
|
if (!hasImages && useImageAsTexture) {
|
|
8203
8313
|
setUseImageAsTexture(false);
|
|
@@ -8214,7 +8324,10 @@ function InSceneVersionForm({
|
|
|
8214
8324
|
setCustomProps([...customProps, newProp]);
|
|
8215
8325
|
setTimeout(() => {
|
|
8216
8326
|
var _a;
|
|
8217
|
-
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
8327
|
+
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
8328
|
+
behavior: "smooth",
|
|
8329
|
+
block: "center"
|
|
8330
|
+
});
|
|
8218
8331
|
}, 100);
|
|
8219
8332
|
};
|
|
8220
8333
|
const handleRemoveProp = (index) => {
|
|
@@ -8258,7 +8371,9 @@ function InSceneVersionForm({
|
|
|
8258
8371
|
alert("O campo 'Nome' \xE9 obrigat\xF3rio.");
|
|
8259
8372
|
return;
|
|
8260
8373
|
}
|
|
8261
|
-
const hasDate = customProps.some(
|
|
8374
|
+
const hasDate = customProps.some(
|
|
8375
|
+
(prop) => prop.key === "Date" && !prop.isEditing
|
|
8376
|
+
);
|
|
8262
8377
|
if (!hasDate) {
|
|
8263
8378
|
alert("A propriedade 'Date' \xE9 obrigat\xF3ria.");
|
|
8264
8379
|
return;
|
|
@@ -8309,7 +8424,25 @@ function InSceneVersionForm({
|
|
|
8309
8424
|
},
|
|
8310
8425
|
/* @__PURE__ */ import_react15.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }),
|
|
8311
8426
|
/* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 pt-5 pb-3" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react15.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-indigo-400/80 shadow-[0_0_18px_2px_rgba(99,102,241,0.55)]" }), /* @__PURE__ */ import_react15.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Criar Versionamento")), /* @__PURE__ */ import_react15.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Nova Vers\xE3o")),
|
|
8312
|
-
/* @__PURE__ */ import_react15.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo do Node (Fixo)"), /* @__PURE__ */ import_react15.default.createElement(
|
|
8427
|
+
/* @__PURE__ */ import_react15.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col max-h-[68vh]" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 custom-scrollbar" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipo do Node (Fixo)"), /* @__PURE__ */ import_react15.default.createElement(
|
|
8428
|
+
"input",
|
|
8429
|
+
{
|
|
8430
|
+
type: "text",
|
|
8431
|
+
value: displayType,
|
|
8432
|
+
disabled: true,
|
|
8433
|
+
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 cursor-not-allowed"
|
|
8434
|
+
}
|
|
8435
|
+
)), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome do Node"), /* @__PURE__ */ import_react15.default.createElement(
|
|
8436
|
+
"input",
|
|
8437
|
+
{
|
|
8438
|
+
required: true,
|
|
8439
|
+
type: "text",
|
|
8440
|
+
placeholder: "Ex.: Vers\xE3o 2.0",
|
|
8441
|
+
value: name,
|
|
8442
|
+
onChange: handleNameInputChange,
|
|
8443
|
+
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
|
+
}
|
|
8445
|
+
)), /* @__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(
|
|
8313
8446
|
DescriptionDisplay,
|
|
8314
8447
|
{
|
|
8315
8448
|
description,
|
|
@@ -8346,10 +8479,28 @@ function InSceneVersionForm({
|
|
|
8346
8479
|
onClick: () => handleSizeChange(s),
|
|
8347
8480
|
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
8348
8481
|
},
|
|
8349
|
-
/* @__PURE__ */ import_react15.default.createElement(
|
|
8350
|
-
|
|
8482
|
+
/* @__PURE__ */ import_react15.default.createElement(
|
|
8483
|
+
"div",
|
|
8484
|
+
{
|
|
8485
|
+
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 group-hover:border-slate-500"}`
|
|
8486
|
+
},
|
|
8487
|
+
isSelected && /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiCheck, { size: 12, className: "text-white" })
|
|
8488
|
+
),
|
|
8489
|
+
/* @__PURE__ */ import_react15.default.createElement(
|
|
8490
|
+
"span",
|
|
8491
|
+
{
|
|
8492
|
+
className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}`
|
|
8493
|
+
},
|
|
8494
|
+
s
|
|
8495
|
+
)
|
|
8351
8496
|
);
|
|
8352
|
-
}))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor do Node (Fixa)"), hasImages && /* @__PURE__ */ import_react15.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react15.default.createElement(
|
|
8497
|
+
}))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react15.default.createElement("label", { className: "text-xs text-slate-300" }, "Cor do Node (Fixa)"), hasImages && /* @__PURE__ */ import_react15.default.createElement("label", { className: "flex items-center gap-2 cursor-pointer group" }, /* @__PURE__ */ import_react15.default.createElement(
|
|
8498
|
+
"div",
|
|
8499
|
+
{
|
|
8500
|
+
className: `w-4 h-4 rounded border flex items-center justify-center transition-colors ${useImageAsTexture ? "bg-indigo-500 border-indigo-500" : "border-slate-500 bg-transparent"}`
|
|
8501
|
+
},
|
|
8502
|
+
useImageAsTexture && /* @__PURE__ */ import_react15.default.createElement(import_fi13.FiCheck, { size: 12, className: "text-white" })
|
|
8503
|
+
), /* @__PURE__ */ import_react15.default.createElement(
|
|
8353
8504
|
"input",
|
|
8354
8505
|
{
|
|
8355
8506
|
type: "checkbox",
|
|
@@ -8357,7 +8508,35 @@ function InSceneVersionForm({
|
|
|
8357
8508
|
onChange: handleToggleImageMode,
|
|
8358
8509
|
className: "hidden"
|
|
8359
8510
|
}
|
|
8360
|
-
), /* @__PURE__ */ import_react15.default.createElement(
|
|
8511
|
+
), /* @__PURE__ */ import_react15.default.createElement(
|
|
8512
|
+
"span",
|
|
8513
|
+
{
|
|
8514
|
+
className: `text-xs ${useImageAsTexture ? "text-indigo-300" : "text-slate-400 group-hover:text-slate-300"}`
|
|
8515
|
+
},
|
|
8516
|
+
"Usar imagem"
|
|
8517
|
+
))), /* @__PURE__ */ import_react15.default.createElement(
|
|
8518
|
+
"div",
|
|
8519
|
+
{
|
|
8520
|
+
className: `flex items-center gap-3 bg-slate-900/60 p-2.5 rounded-lg border border-white/10 transition-opacity duration-200 ${useImageAsTexture ? "opacity-40 pointer-events-none grayscale" : "opacity-100"}`
|
|
8521
|
+
},
|
|
8522
|
+
/* @__PURE__ */ import_react15.default.createElement(
|
|
8523
|
+
"div",
|
|
8524
|
+
{
|
|
8525
|
+
className: "h-8 w-12 rounded-md border border-white/10",
|
|
8526
|
+
style: { backgroundColor: fixedColor }
|
|
8527
|
+
}
|
|
8528
|
+
),
|
|
8529
|
+
/* @__PURE__ */ import_react15.default.createElement("span", { className: "text-xs text-slate-300" }, useImageAsTexture ? "Cor definida pela imagem." : "Cor herdada do node original.")
|
|
8530
|
+
)), /* @__PURE__ */ import_react15.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react15.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais (*Date obrigat\xF3rio)"), /* @__PURE__ */ import_react15.default.createElement(
|
|
8531
|
+
"button",
|
|
8532
|
+
{
|
|
8533
|
+
type: "button",
|
|
8534
|
+
onClick: handleAddProp,
|
|
8535
|
+
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"
|
|
8536
|
+
},
|
|
8537
|
+
/* @__PURE__ */ import_react15.default.createElement(import_fi13.FiPlus, { size: 14 }),
|
|
8538
|
+
" Adicionar"
|
|
8539
|
+
)), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react15.default.createElement(
|
|
8361
8540
|
CustomPropertyDisplay,
|
|
8362
8541
|
{
|
|
8363
8542
|
key: prop.id,
|
|
@@ -8365,13 +8544,30 @@ function InSceneVersionForm({
|
|
|
8365
8544
|
onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
|
|
8366
8545
|
onRemove: () => handleRemoveProp(index),
|
|
8367
8546
|
onOpenImageViewer,
|
|
8368
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
8547
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
8548
|
+
(t) => t !== prop.type
|
|
8549
|
+
),
|
|
8369
8550
|
isTextureMode: useImageAsTexture,
|
|
8370
8551
|
selectedImageUrl,
|
|
8371
8552
|
onSelectTexture: handleSelectTexture,
|
|
8372
8553
|
onUploadFile
|
|
8373
8554
|
}
|
|
8374
|
-
)), /* @__PURE__ */ import_react15.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react15.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_react15.default.createElement(
|
|
8555
|
+
)), /* @__PURE__ */ import_react15.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react15.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_react15.default.createElement(
|
|
8556
|
+
"button",
|
|
8557
|
+
{
|
|
8558
|
+
type: "button",
|
|
8559
|
+
onClick: onCancel,
|
|
8560
|
+
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm"
|
|
8561
|
+
},
|
|
8562
|
+
"Cancelar"
|
|
8563
|
+
), /* @__PURE__ */ import_react15.default.createElement(
|
|
8564
|
+
"button",
|
|
8565
|
+
{
|
|
8566
|
+
type: "submit",
|
|
8567
|
+
className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)]"
|
|
8568
|
+
},
|
|
8569
|
+
"Salvar"
|
|
8570
|
+
)))
|
|
8375
8571
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react15.default.createElement(
|
|
8376
8572
|
DescriptionEditModal,
|
|
8377
8573
|
{
|
|
@@ -8405,7 +8601,10 @@ function QuestReviewStackEditor({
|
|
|
8405
8601
|
const [isAdding, setIsAdding] = (0, import_react16.useState)(false);
|
|
8406
8602
|
const [searchQuery, setSearchQuery] = (0, import_react16.useState)("");
|
|
8407
8603
|
const handleAddReviewer = (userId) => {
|
|
8408
|
-
const newStack = [
|
|
8604
|
+
const newStack = [
|
|
8605
|
+
...reviewStack,
|
|
8606
|
+
{ userId, status: "pending", mandatory: true }
|
|
8607
|
+
];
|
|
8409
8608
|
onChange(newStack);
|
|
8410
8609
|
setIsAdding(false);
|
|
8411
8610
|
setSearchQuery("");
|
|
@@ -8416,21 +8615,27 @@ function QuestReviewStackEditor({
|
|
|
8416
8615
|
};
|
|
8417
8616
|
const handleToggleMandatory = (index) => {
|
|
8418
8617
|
const newStack = [...reviewStack];
|
|
8419
|
-
newStack[index] = {
|
|
8618
|
+
newStack[index] = {
|
|
8619
|
+
...newStack[index],
|
|
8620
|
+
mandatory: !newStack[index].mandatory
|
|
8621
|
+
};
|
|
8420
8622
|
onChange(newStack);
|
|
8421
8623
|
};
|
|
8422
8624
|
const handleMove = (index, direction) => {
|
|
8423
8625
|
const newStack = [...reviewStack];
|
|
8424
8626
|
const targetIndex = index + direction;
|
|
8425
8627
|
if (targetIndex < 0 || targetIndex >= newStack.length) return;
|
|
8426
|
-
[newStack[index], newStack[targetIndex]] = [
|
|
8628
|
+
[newStack[index], newStack[targetIndex]] = [
|
|
8629
|
+
newStack[targetIndex],
|
|
8630
|
+
newStack[index]
|
|
8631
|
+
];
|
|
8427
8632
|
onChange(newStack);
|
|
8428
8633
|
};
|
|
8429
8634
|
const filteredMembers = viewMembers.filter((m) => {
|
|
8430
8635
|
const search = searchQuery.toLowerCase();
|
|
8431
8636
|
return (m.name || "").toLowerCase().includes(search) || (m.email || "").toLowerCase().includes(search);
|
|
8432
8637
|
});
|
|
8433
|
-
return /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Review Stack
|
|
8638
|
+
return /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Review Stack"), !readOnly && !isAdding && /* @__PURE__ */ import_react16.default.createElement(
|
|
8434
8639
|
"button",
|
|
8435
8640
|
{
|
|
8436
8641
|
type: "button",
|
|
@@ -8439,7 +8644,13 @@ function QuestReviewStackEditor({
|
|
|
8439
8644
|
},
|
|
8440
8645
|
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 10 }),
|
|
8441
8646
|
" Adicionar Camada"
|
|
8442
|
-
)), isAdding && /* @__PURE__ */ import_react16.default.createElement("div", { className: "bg-slate-900/50 border border-sky-500/30 rounded-lg p-2 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
8647
|
+
)), isAdding && /* @__PURE__ */ import_react16.default.createElement("div", { className: "bg-slate-900/50 border border-sky-500/30 rounded-lg p-2 space-y-2 animate-in fade-in slide-in-from-top-1 duration-200" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
8648
|
+
import_fi14.FiSearch,
|
|
8649
|
+
{
|
|
8650
|
+
className: "absolute left-2 top-1/2 -translate-y-1/2 text-slate-500",
|
|
8651
|
+
size: 12
|
|
8652
|
+
}
|
|
8653
|
+
), /* @__PURE__ */ import_react16.default.createElement(
|
|
8443
8654
|
"input",
|
|
8444
8655
|
{
|
|
8445
8656
|
autoFocus: true,
|
|
@@ -8449,7 +8660,14 @@ function QuestReviewStackEditor({
|
|
|
8449
8660
|
onChange: (e) => setSearchQuery(e.target.value),
|
|
8450
8661
|
className: "w-full bg-slate-800 border border-white/10 rounded p-1.5 pl-7 text-xs focus:outline-none focus:ring-1 focus:ring-sky-400"
|
|
8451
8662
|
}
|
|
8452
|
-
), /* @__PURE__ */ import_react16.default.createElement(
|
|
8663
|
+
), /* @__PURE__ */ import_react16.default.createElement(
|
|
8664
|
+
"button",
|
|
8665
|
+
{
|
|
8666
|
+
onClick: () => setIsAdding(false),
|
|
8667
|
+
className: "absolute right-2 top-1/2 -translate-y-1/2 text-slate-500 hover:text-white"
|
|
8668
|
+
},
|
|
8669
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 14 })
|
|
8670
|
+
)), /* @__PURE__ */ import_react16.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar space-y-1" }, filteredMembers.map((m) => /* @__PURE__ */ import_react16.default.createElement(
|
|
8453
8671
|
"li",
|
|
8454
8672
|
{
|
|
8455
8673
|
key: m.id,
|
|
@@ -8467,8 +8685,32 @@ function QuestReviewStackEditor({
|
|
|
8467
8685
|
key: index,
|
|
8468
8686
|
className: `group relative flex items-center gap-3 p-2 rounded-lg border ${isCompleted ? "bg-green-500/5 border-green-500/20" : "bg-white/5 border-white/10"} hover:border-white/20 transition-all`
|
|
8469
8687
|
},
|
|
8470
|
-
/* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-col items-center gap-0.5 text-slate-500" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] font-bold opacity-50" }, index + 1), !readOnly && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(
|
|
8471
|
-
|
|
8688
|
+
/* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-col items-center gap-0.5 text-slate-500" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] font-bold opacity-50" }, index + 1), !readOnly && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(
|
|
8689
|
+
"button",
|
|
8690
|
+
{
|
|
8691
|
+
type: "button",
|
|
8692
|
+
onClick: () => handleMove(index, -1),
|
|
8693
|
+
disabled: index === 0,
|
|
8694
|
+
className: "hover:text-sky-400 disabled:opacity-20"
|
|
8695
|
+
},
|
|
8696
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronUp, { size: 12 })
|
|
8697
|
+
), /* @__PURE__ */ import_react16.default.createElement(
|
|
8698
|
+
"button",
|
|
8699
|
+
{
|
|
8700
|
+
type: "button",
|
|
8701
|
+
onClick: () => handleMove(index, 1),
|
|
8702
|
+
disabled: index === reviewStack.length - 1,
|
|
8703
|
+
className: "hover:text-sky-400 disabled:opacity-20"
|
|
8704
|
+
},
|
|
8705
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { size: 12 })
|
|
8706
|
+
))),
|
|
8707
|
+
/* @__PURE__ */ import_react16.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
8708
|
+
"span",
|
|
8709
|
+
{
|
|
8710
|
+
className: `truncate text-sm font-medium ${isCompleted ? "text-green-300" : "text-slate-200"}`
|
|
8711
|
+
},
|
|
8712
|
+
(member == null ? void 0 : member.name) || (member == null ? void 0 : member.email) || "Unknown User"
|
|
8713
|
+
), item.mandatory && /* @__PURE__ */ import_react16.default.createElement("span", { className: "flex-shrink-0 px-1.5 py-0.5 rounded-full bg-amber-500/20 text-amber-300 text-[8px] font-bold uppercase tracking-tighter border border-amber-500/30" }, "Obrigat\xF3rio")), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[10px] text-slate-500 flex items-center gap-1" }, isCompleted ? "\u2713 Review Conclu\xEDda" : "\u23F3 Pendente")),
|
|
8472
8714
|
!readOnly && /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
8473
8715
|
"button",
|
|
8474
8716
|
{
|
|
@@ -8477,7 +8719,7 @@ function QuestReviewStackEditor({
|
|
|
8477
8719
|
title: item.mandatory ? "Remover obrigatoriedade" : "Tornar obrigat\xF3rio",
|
|
8478
8720
|
className: `p-1.5 rounded hover:bg-white/10 transition-colors ${item.mandatory ? "text-amber-400" : "text-slate-500"}`
|
|
8479
8721
|
},
|
|
8480
|
-
/* @__PURE__ */ import_react16.default.createElement(import_fi14.
|
|
8722
|
+
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiStar, { size: 14 })
|
|
8481
8723
|
), /* @__PURE__ */ import_react16.default.createElement(
|
|
8482
8724
|
"button",
|
|
8483
8725
|
{
|
|
@@ -8501,10 +8743,10 @@ function QuestReviewStackEditor({
|
|
|
8501
8743
|
|
|
8502
8744
|
// src/components/InSceneQuestForm.jsx
|
|
8503
8745
|
var QUEST_STATUS_COLORS2 = {
|
|
8504
|
-
|
|
8746
|
+
Backlog: "#64748b",
|
|
8505
8747
|
"In Progress": "#eab308",
|
|
8506
|
-
|
|
8507
|
-
|
|
8748
|
+
Review: "#a855f7",
|
|
8749
|
+
Done: "#22c55e"
|
|
8508
8750
|
};
|
|
8509
8751
|
function InSceneQuestForm({
|
|
8510
8752
|
onSave,
|
|
@@ -8548,7 +8790,10 @@ function InSceneQuestForm({
|
|
|
8548
8790
|
setCustomProps([...customProps, newProp]);
|
|
8549
8791
|
setTimeout(() => {
|
|
8550
8792
|
var _a2;
|
|
8551
|
-
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
8793
|
+
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
8794
|
+
behavior: "smooth",
|
|
8795
|
+
block: "center"
|
|
8796
|
+
});
|
|
8552
8797
|
}, 100);
|
|
8553
8798
|
};
|
|
8554
8799
|
const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
|
|
@@ -8587,12 +8832,14 @@ function InSceneQuestForm({
|
|
|
8587
8832
|
customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
|
|
8588
8833
|
);
|
|
8589
8834
|
const processedSections = processDescriptionForSave(description, []);
|
|
8590
|
-
const initialTimeline = [
|
|
8591
|
-
|
|
8592
|
-
|
|
8593
|
-
|
|
8594
|
-
|
|
8595
|
-
|
|
8835
|
+
const initialTimeline = [
|
|
8836
|
+
{
|
|
8837
|
+
type: "quest_created",
|
|
8838
|
+
timestamp: Date.now(),
|
|
8839
|
+
actorId: ((_a2 = session == null ? void 0 : session.user) == null ? void 0 : _a2.id) || "unknown",
|
|
8840
|
+
description: `Quest criada por ${((_b2 = session == null ? void 0 : session.user) == null ? void 0 : _b2.name) || "usu\xE1rio"}.`
|
|
8841
|
+
}
|
|
8842
|
+
];
|
|
8596
8843
|
if (assigneeId) {
|
|
8597
8844
|
initialTimeline.push({
|
|
8598
8845
|
type: "assignee_changed",
|
|
@@ -8638,7 +8885,15 @@ function InSceneQuestForm({
|
|
|
8638
8885
|
onContextMenu: swallow,
|
|
8639
8886
|
onDoubleClick: swallow
|
|
8640
8887
|
},
|
|
8641
|
-
/* @__PURE__ */ import_react17.default.createElement(
|
|
8888
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
8889
|
+
"div",
|
|
8890
|
+
{
|
|
8891
|
+
className: "h-[2px]",
|
|
8892
|
+
style: {
|
|
8893
|
+
background: `linear-gradient(to right, transparent, ${QUEST_STATUS_COLORS2[status]}, transparent)`
|
|
8894
|
+
}
|
|
8895
|
+
}
|
|
8896
|
+
),
|
|
8642
8897
|
/* @__PURE__ */ import_react17.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react17.default.createElement("div", null, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiTarget, { className: "text-sky-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Nova quest")), /* @__PURE__ */ import_react17.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, "Criar Quest")), /* @__PURE__ */ import_react17.default.createElement(
|
|
8643
8898
|
"button",
|
|
8644
8899
|
{
|
|
@@ -8663,16 +8918,40 @@ function InSceneQuestForm({
|
|
|
8663
8918
|
},
|
|
8664
8919
|
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"
|
|
8665
8920
|
}
|
|
8666
|
-
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react17.default.createElement(
|
|
8921
|
+
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react17.default.createElement(
|
|
8922
|
+
"p",
|
|
8923
|
+
{
|
|
8924
|
+
className: "text-xs text-indigo-300 font-medium truncate",
|
|
8925
|
+
title: standardizedName
|
|
8926
|
+
},
|
|
8927
|
+
standardizedName
|
|
8928
|
+
))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Status da Quest"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8667
8929
|
"button",
|
|
8668
8930
|
{
|
|
8669
8931
|
type: "button",
|
|
8670
8932
|
onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
|
|
8671
8933
|
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"
|
|
8672
8934
|
},
|
|
8673
|
-
/* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8674
|
-
|
|
8675
|
-
|
|
8935
|
+
/* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8936
|
+
"span",
|
|
8937
|
+
{
|
|
8938
|
+
className: "w-3 h-3 rounded-full shadow-[0_0_8px_rgba(0,0,0,0.5)]",
|
|
8939
|
+
style: { backgroundColor: QUEST_STATUS_COLORS2[status] }
|
|
8940
|
+
}
|
|
8941
|
+
), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, status)),
|
|
8942
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
8943
|
+
import_fi15.FiChevronDown,
|
|
8944
|
+
{
|
|
8945
|
+
className: `text-slate-400 transition-transform duration-200 ${isStatusDropdownOpen ? "rotate-180" : ""}`
|
|
8946
|
+
}
|
|
8947
|
+
)
|
|
8948
|
+
), isStatusDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
|
|
8949
|
+
"div",
|
|
8950
|
+
{
|
|
8951
|
+
className: "fixed inset-0 z-40",
|
|
8952
|
+
onClick: () => setIsStatusDropdownOpen(false)
|
|
8953
|
+
}
|
|
8954
|
+
), /* @__PURE__ */ import_react17.default.createElement("ul", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-800 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden" }, Object.keys(QUEST_STATUS_COLORS2).map((s) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8676
8955
|
"li",
|
|
8677
8956
|
{
|
|
8678
8957
|
key: s,
|
|
@@ -8683,7 +8962,13 @@ function InSceneQuestForm({
|
|
|
8683
8962
|
},
|
|
8684
8963
|
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"}`
|
|
8685
8964
|
},
|
|
8686
|
-
/* @__PURE__ */ import_react17.default.createElement(
|
|
8965
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
8966
|
+
"span",
|
|
8967
|
+
{
|
|
8968
|
+
className: "w-3 h-3 rounded-full",
|
|
8969
|
+
style: { backgroundColor: QUEST_STATUS_COLORS2[s] }
|
|
8970
|
+
}
|
|
8971
|
+
),
|
|
8687
8972
|
s
|
|
8688
8973
|
)))))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8689
8974
|
"button",
|
|
@@ -8693,11 +8978,22 @@ function InSceneQuestForm({
|
|
|
8693
8978
|
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"
|
|
8694
8979
|
},
|
|
8695
8980
|
/* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react17.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_a = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _a.name) || ((_b = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _b.email) || "Nenhum")),
|
|
8696
|
-
/* @__PURE__ */ import_react17.default.createElement(
|
|
8697
|
-
|
|
8698
|
-
|
|
8699
|
-
|
|
8700
|
-
|
|
8981
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
8982
|
+
import_fi15.FiChevronDown,
|
|
8983
|
+
{
|
|
8984
|
+
className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}`
|
|
8985
|
+
}
|
|
8986
|
+
)
|
|
8987
|
+
), isAssigneeDropdownOpen && /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
|
|
8988
|
+
"div",
|
|
8989
|
+
{
|
|
8990
|
+
className: "fixed inset-0 z-40",
|
|
8991
|
+
onClick: () => {
|
|
8992
|
+
setIsAssigneeDropdownOpen(false);
|
|
8993
|
+
setAssigneeSearchQuery("");
|
|
8994
|
+
}
|
|
8995
|
+
}
|
|
8996
|
+
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react17.default.createElement(
|
|
8701
8997
|
"input",
|
|
8702
8998
|
{
|
|
8703
8999
|
type: "text",
|
|
@@ -8744,20 +9040,7 @@ function InSceneQuestForm({
|
|
|
8744
9040
|
onChange: setReviewStack,
|
|
8745
9041
|
viewMembers
|
|
8746
9042
|
}
|
|
8747
|
-
)), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "
|
|
8748
|
-
"input",
|
|
8749
|
-
{
|
|
8750
|
-
type: "text",
|
|
8751
|
-
value: typeInput,
|
|
8752
|
-
onChange: (e) => setTypeInput(e.target.value),
|
|
8753
|
-
onKeyDown: handleTypeInputKeyDown,
|
|
8754
|
-
onBlur: () => {
|
|
8755
|
-
if (typeInput.trim()) handleAddType(typeInput);
|
|
8756
|
-
},
|
|
8757
|
-
className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
|
|
8758
|
-
autoComplete: "off"
|
|
8759
|
-
}
|
|
8760
|
-
))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Descri\xE7\xE3o (Opcional)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative group min-h-[80px] bg-slate-800/70 p-2.5 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
9043
|
+
)), /* @__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(
|
|
8761
9044
|
DescriptionDisplay,
|
|
8762
9045
|
{
|
|
8763
9046
|
description,
|
|
@@ -8767,20 +9050,31 @@ function InSceneQuestForm({
|
|
|
8767
9050
|
onMentionClick,
|
|
8768
9051
|
onSaveDescription: (newDesc) => setDescription(newDesc)
|
|
8769
9052
|
}
|
|
8770
|
-
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
9053
|
+
), /* @__PURE__ */ import_react17.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8771
9054
|
"button",
|
|
8772
9055
|
{
|
|
8773
|
-
key: s,
|
|
8774
9056
|
type: "button",
|
|
8775
|
-
onClick: () =>
|
|
8776
|
-
|
|
8777
|
-
|
|
8778
|
-
|
|
8779
|
-
|
|
9057
|
+
onClick: () => setIsDescriptionModalOpen(true),
|
|
9058
|
+
className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors"
|
|
9059
|
+
},
|
|
9060
|
+
/* @__PURE__ */ import_react17.default.createElement(import_fi15.FiEdit2, { size: 14 })
|
|
9061
|
+
)), !description && /* @__PURE__ */ import_react17.default.createElement(
|
|
9062
|
+
"div",
|
|
9063
|
+
{
|
|
9064
|
+
onClick: () => setIsDescriptionModalOpen(true),
|
|
9065
|
+
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
9066
|
+
},
|
|
9067
|
+
"Adicionar descri\xE7\xE3o..."
|
|
9068
|
+
))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react17.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider" }, "Propriedades Adicionais"), /* @__PURE__ */ import_react17.default.createElement(
|
|
9069
|
+
"button",
|
|
9070
|
+
{
|
|
9071
|
+
type: "button",
|
|
9072
|
+
onClick: handleAddProp,
|
|
9073
|
+
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"
|
|
8780
9074
|
},
|
|
8781
|
-
/* @__PURE__ */ import_react17.default.createElement(
|
|
8782
|
-
|
|
8783
|
-
))
|
|
9075
|
+
/* @__PURE__ */ import_react17.default.createElement(import_fi15.FiPlus, { size: 14 }),
|
|
9076
|
+
" Adicionar"
|
|
9077
|
+
)), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, index) => /* @__PURE__ */ import_react17.default.createElement(
|
|
8784
9078
|
CustomPropertyDisplay,
|
|
8785
9079
|
{
|
|
8786
9080
|
key: prop.id,
|
|
@@ -8788,10 +9082,81 @@ function InSceneQuestForm({
|
|
|
8788
9082
|
onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
|
|
8789
9083
|
onRemove: () => handleRemoveProp(index),
|
|
8790
9084
|
onOpenImageViewer,
|
|
8791
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
9085
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
9086
|
+
(t) => t !== prop.type
|
|
9087
|
+
),
|
|
8792
9088
|
onUploadFile
|
|
8793
9089
|
}
|
|
8794
|
-
)), /* @__PURE__ */ import_react17.default.createElement("div", { ref: propsEndRef })))
|
|
9090
|
+
)), /* @__PURE__ */ import_react17.default.createElement("div", { ref: propsEndRef }))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => /* @__PURE__ */ import_react17.default.createElement(
|
|
9091
|
+
"button",
|
|
9092
|
+
{
|
|
9093
|
+
key: s,
|
|
9094
|
+
type: "button",
|
|
9095
|
+
onClick: () => {
|
|
9096
|
+
setSize(s);
|
|
9097
|
+
onSizeChange == null ? void 0 : onSizeChange(s);
|
|
9098
|
+
},
|
|
9099
|
+
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
9100
|
+
},
|
|
9101
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
9102
|
+
"div",
|
|
9103
|
+
{
|
|
9104
|
+
className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${size === s ? "bg-indigo-500 border-indigo-500" : "border-slate-600 bg-transparent group-hover:border-slate-500"}`
|
|
9105
|
+
},
|
|
9106
|
+
size === s && /* @__PURE__ */ import_react17.default.createElement(import_fi15.FiCheck, { size: 12, className: "text-white" })
|
|
9107
|
+
),
|
|
9108
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
9109
|
+
"span",
|
|
9110
|
+
{
|
|
9111
|
+
className: `text-sm capitalize transition-colors ${size === s ? "text-white font-medium" : "text-slate-400 group-hover:text-slate-300"}`
|
|
9112
|
+
},
|
|
9113
|
+
s
|
|
9114
|
+
)
|
|
9115
|
+
)))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react17.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Tipos Adicionais"), /* @__PURE__ */ import_react17.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react17.default.createElement(
|
|
9116
|
+
"span",
|
|
9117
|
+
{
|
|
9118
|
+
key: index,
|
|
9119
|
+
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"}`
|
|
9120
|
+
},
|
|
9121
|
+
t,
|
|
9122
|
+
t !== "quest" && /* @__PURE__ */ import_react17.default.createElement(
|
|
9123
|
+
"button",
|
|
9124
|
+
{
|
|
9125
|
+
type: "button",
|
|
9126
|
+
onClick: () => handleRemoveType(index),
|
|
9127
|
+
className: "hover:text-white transition-colors"
|
|
9128
|
+
},
|
|
9129
|
+
/* @__PURE__ */ import_react17.default.createElement(import_fi15.FiX, { size: 12 })
|
|
9130
|
+
)
|
|
9131
|
+
)), /* @__PURE__ */ import_react17.default.createElement(
|
|
9132
|
+
"input",
|
|
9133
|
+
{
|
|
9134
|
+
type: "text",
|
|
9135
|
+
value: typeInput,
|
|
9136
|
+
onChange: (e) => setTypeInput(e.target.value),
|
|
9137
|
+
onKeyDown: handleTypeInputKeyDown,
|
|
9138
|
+
onBlur: () => {
|
|
9139
|
+
if (typeInput.trim()) handleAddType(typeInput);
|
|
9140
|
+
},
|
|
9141
|
+
className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
|
|
9142
|
+
autoComplete: "off"
|
|
9143
|
+
}
|
|
9144
|
+
)))), /* @__PURE__ */ import_react17.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
9145
|
+
"button",
|
|
9146
|
+
{
|
|
9147
|
+
type: "button",
|
|
9148
|
+
onClick: onCancel,
|
|
9149
|
+
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm"
|
|
9150
|
+
},
|
|
9151
|
+
"Cancelar"
|
|
9152
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
9153
|
+
"button",
|
|
9154
|
+
{
|
|
9155
|
+
type: "submit",
|
|
9156
|
+
className: "px-4 py-2 rounded-lg bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 transition-colors font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)]"
|
|
9157
|
+
},
|
|
9158
|
+
"Salvar Quest"
|
|
9159
|
+
)))
|
|
8795
9160
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
|
|
8796
9161
|
DescriptionEditModal,
|
|
8797
9162
|
{
|
|
@@ -9347,7 +9712,8 @@ function QuestDetailsPanel({
|
|
|
9347
9712
|
onUploadFile,
|
|
9348
9713
|
userRole,
|
|
9349
9714
|
currentDatasetName,
|
|
9350
|
-
viewMembers = []
|
|
9715
|
+
viewMembers = [],
|
|
9716
|
+
currentUser
|
|
9351
9717
|
}) {
|
|
9352
9718
|
var _a;
|
|
9353
9719
|
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) || "";
|
|
@@ -9447,8 +9813,7 @@ function QuestDetailsPanel({
|
|
|
9447
9813
|
});
|
|
9448
9814
|
};
|
|
9449
9815
|
const swallow = (e) => e.stopPropagation();
|
|
9450
|
-
const handleNameChange = (
|
|
9451
|
-
const val = e.target.value;
|
|
9816
|
+
const handleNameChange = (val) => {
|
|
9452
9817
|
setRawTitle(val);
|
|
9453
9818
|
const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
|
|
9454
9819
|
onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
|
|
@@ -9459,6 +9824,51 @@ function QuestDetailsPanel({
|
|
|
9459
9824
|
onSizeChange == null ? void 0 : onSizeChange(node.id, newSize);
|
|
9460
9825
|
setHasUnsavedChanges(true);
|
|
9461
9826
|
};
|
|
9827
|
+
const handleReturnToOperation = async () => {
|
|
9828
|
+
if (isSaving) return;
|
|
9829
|
+
setIsSaving(true);
|
|
9830
|
+
const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
|
|
9831
|
+
const actorName = (currentUser == null ? void 0 : currentUser.name) || "Revisor";
|
|
9832
|
+
const targetMember = viewMembers.find((m) => String(m.id) === String(assigneeId));
|
|
9833
|
+
const targetName = (targetMember == null ? void 0 : targetMember.name) || "executor";
|
|
9834
|
+
const newEvent = {
|
|
9835
|
+
type: "review_returned",
|
|
9836
|
+
timestamp: Date.now(),
|
|
9837
|
+
actorId,
|
|
9838
|
+
description: `Review finalizada com retorno para opera\xE7\xE3o por ${actorName}. Novo respons\xE1vel: ${targetName}.`
|
|
9839
|
+
};
|
|
9840
|
+
const updatedTimeline = [...timeline, newEvent];
|
|
9841
|
+
const updatedStatus = "In Progress";
|
|
9842
|
+
const updatedColor = "#eab308";
|
|
9843
|
+
const nodeToSave = {
|
|
9844
|
+
...node,
|
|
9845
|
+
name: standardizedName,
|
|
9846
|
+
raw_title: rawTitle,
|
|
9847
|
+
description,
|
|
9848
|
+
status: updatedStatus,
|
|
9849
|
+
color: updatedColor,
|
|
9850
|
+
assignee_id: assigneeId,
|
|
9851
|
+
reviewStack,
|
|
9852
|
+
timeline: updatedTimeline,
|
|
9853
|
+
size,
|
|
9854
|
+
types: types.includes("quest") ? types : [...types, "quest"],
|
|
9855
|
+
intensity: intensity || 0,
|
|
9856
|
+
useImageAsTexture: node.useImageAsTexture || false,
|
|
9857
|
+
textureImageUrl: node.textureImageUrl || null
|
|
9858
|
+
};
|
|
9859
|
+
try {
|
|
9860
|
+
await onSave(nodeToSave, false);
|
|
9861
|
+
setTimeline(updatedTimeline);
|
|
9862
|
+
setStatus(updatedStatus);
|
|
9863
|
+
onDataUpdate(nodeToSave);
|
|
9864
|
+
setHasUnsavedChanges(false);
|
|
9865
|
+
} catch (error) {
|
|
9866
|
+
console.error("Erro ao retornar para opera\xE7\xE3o:", error);
|
|
9867
|
+
alert("Erro ao realizar o retorno para opera\xE7\xE3o.");
|
|
9868
|
+
} finally {
|
|
9869
|
+
setIsSaving(false);
|
|
9870
|
+
}
|
|
9871
|
+
};
|
|
9462
9872
|
const handleStatusChange = (newStatus) => {
|
|
9463
9873
|
setStatus(newStatus);
|
|
9464
9874
|
const newColor = QUEST_STATUS_COLORS3[newStatus];
|
|
@@ -9630,7 +10040,7 @@ function QuestDetailsPanel({
|
|
|
9630
10040
|
{
|
|
9631
10041
|
type: "text",
|
|
9632
10042
|
value: rawTitle,
|
|
9633
|
-
onChange: handleNameChange,
|
|
10043
|
+
onChange: (e) => handleNameChange(e.target.value),
|
|
9634
10044
|
readOnly: !canEdit,
|
|
9635
10045
|
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"}`
|
|
9636
10046
|
}
|
|
@@ -9747,7 +10157,24 @@ function QuestDetailsPanel({
|
|
|
9747
10157
|
viewMembers,
|
|
9748
10158
|
readOnly: !canEdit
|
|
9749
10159
|
}
|
|
9750
|
-
)), /* @__PURE__ */ import_react19.default.createElement("div", { className: "
|
|
10160
|
+
)), status === "Review" && canEdit && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ import_react19.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_react19.default.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Se algo precisar de ajuste, selecione o respons\xE1vel acima e clique para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react19.default.createElement(
|
|
10161
|
+
"button",
|
|
10162
|
+
{
|
|
10163
|
+
type: "button",
|
|
10164
|
+
onClick: handleReturnToOperation,
|
|
10165
|
+
disabled: isSaving,
|
|
10166
|
+
className: "w-full h-10 flex items-center justify-center gap-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-200 text-xs font-semibold border border-white/10 transition-all hover:border-white/20 active:scale-[0.98] disabled:opacity-50 disabled:cursor-wait"
|
|
10167
|
+
},
|
|
10168
|
+
/* @__PURE__ */ import_react19.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_react19.default.createElement("path", { d: "M12 19V5M5 12l7 7 7-7" })),
|
|
10169
|
+
"Retornar para Opera\xE7\xE3o"
|
|
10170
|
+
))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Descri\xE7\xE3o"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative group min-h-[60px] bg-slate-800/40 rounded-lg border border-white/10 hover:border-white/20 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(DescriptionDisplay, { description, savedSections: existingSections, availableNodes, availableAncestries, onOpenReference, onMentionClick, onImageClick: handleImageClickFromText, onSaveDescription: handleSaveDescriptionInline }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute top-0 right-0 flex bg-slate-900/50 rounded-bl-lg backdrop-blur-sm opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity overflow-hidden border-b border-l border-white/5" }, /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => setIsReadMode(true), className: `p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors ${canEdit ? "border-r border-white/5" : ""}`, title: "Modo de Leitura" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiBookOpen, { size: 14 })), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => setIsDescriptionModalOpen(true), className: "p-2 text-slate-400 hover:text-white hover:bg-white/10 transition-colors", title: "Editar descri\xE7\xE3o (Modo de Escrita)" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiEdit2, { size: 14 }))), canEdit && !description && /* @__PURE__ */ import_react19.default.createElement("div", { onClick: () => setIsDescriptionModalOpen(true), className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text" }, "Adicionar descri\xE7\xE3o..."))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react19.default.createElement(CustomPropertyDisplay, { key: prop.id, prop, onUpdate: canEdit ? (updatedProp) => handleUpdateProp(idx, updatedProp) : void 0, onRemove: canEdit ? () => handleRemoveProp(idx) : void 0, onOpenImageViewer, unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type), isTextureMode: false, onUploadFile: canEdit ? onUploadFile : void 0, readOnly: !canEdit })), /* @__PURE__ */ import_react19.default.createElement("div", { ref: propsEndRef }))), timeline && timeline.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-4 pb-2 border-t border-white/10 mt-4" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider mb-3" }, "Timeline & Hist\xF3rico"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative border-l border-white/10 ml-2.5 space-y-4" }, timeline.slice().sort((a, b) => a.timestamp - b.timestamp).map((event, idx) => {
|
|
10171
|
+
const dateObj = new Date(event.timestamp);
|
|
10172
|
+
const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
10173
|
+
return /* @__PURE__ */ import_react19.default.createElement("div", { key: idx, className: "relative pl-4 flex flex-col gap-0.5" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute left-[-4.5px] top-1.5 w-2 h-2 rounded-full bg-slate-400/50 border-[1.5px] border-slate-900" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] text-slate-300" }, event.description), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[9px] text-slate-500 font-mono tracking-tighter" }, dateString));
|
|
10174
|
+
}))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Tamanho no Node (Size)"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-5" }, ["small", "medium", "large"].map((s) => {
|
|
10175
|
+
const isSelected = size === s;
|
|
10176
|
+
return /* @__PURE__ */ import_react19.default.createElement("button", { key: s, type: "button", onClick: () => canEdit && handleSizeChange(s), className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}` }, /* @__PURE__ */ import_react19.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react19.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
|
|
10177
|
+
}))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react19.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react19.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react19.default.createElement(
|
|
9751
10178
|
"input",
|
|
9752
10179
|
{
|
|
9753
10180
|
type: "text",
|
|
@@ -9771,14 +10198,7 @@ function QuestDetailsPanel({
|
|
|
9771
10198
|
), canEdit && showTypeSuggestions && filteredTypes.length > 0 && /* @__PURE__ */ import_react19.default.createElement("ul", { className: "custom-scrollbar absolute top-full left-0 z-10 w-full mt-1 max-h-40 overflow-y-auto rounded-lg bg-slate-800 border border-white/10 shadow-lg" }, filteredTypes.map((suggestedType, index) => /* @__PURE__ */ import_react19.default.createElement("li", { key: index, className: "px-3 py-2 text-sm text-slate-200 cursor-pointer hover:bg-indigo-600/50", onMouseDown: (e) => {
|
|
9772
10199
|
e.preventDefault();
|
|
9773
10200
|
handleAddType(suggestedType);
|
|
9774
|
-
} }, suggestedType))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "
|
|
9775
|
-
const isSelected = size === s;
|
|
9776
|
-
return /* @__PURE__ */ import_react19.default.createElement("button", { key: s, type: "button", onClick: () => canEdit && handleSizeChange(s), className: `flex items-center gap-2 group focus:outline-none ${canEdit ? "cursor-pointer" : "cursor-default opacity-80"}` }, /* @__PURE__ */ import_react19.default.createElement("div", { className: `w-4 h-4 rounded-[4px] border flex items-center justify-center transition-all duration-200 ${isSelected ? "bg-indigo-500 border-indigo-500 shadow-[0_0_10px_rgba(99,102,241,0.4)]" : "border-slate-600 bg-transparent " + (canEdit ? "group-hover:border-slate-500" : "")}` }, isSelected && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiCheck, { size: 12, className: "text-white" })), /* @__PURE__ */ import_react19.default.createElement("span", { className: `text-sm capitalize transition-colors ${isSelected ? "text-white font-medium" : "text-slate-400 " + (canEdit ? "group-hover:text-slate-300" : "")}` }, s));
|
|
9777
|
-
}))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { type: "button", onClick: handleAddProp, className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiPlus, { size: 14 }), " Adicionar")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react19.default.createElement(CustomPropertyDisplay, { key: prop.id, prop, onUpdate: canEdit ? (updatedProp) => handleUpdateProp(idx, updatedProp) : void 0, onRemove: canEdit ? () => handleRemoveProp(idx) : void 0, onOpenImageViewer, unavailableTypes: currentUsedTypes.filter((t) => t !== prop.type), isTextureMode: false, onUploadFile: canEdit ? onUploadFile : void 0, readOnly: !canEdit })), /* @__PURE__ */ import_react19.default.createElement("div", { ref: propsEndRef }))), timeline && timeline.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-4 pb-2 border-t border-white/10 mt-4" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-xs text-slate-400 font-medium uppercase tracking-wider mb-3" }, "Timeline & Hist\xF3rico"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative border-l border-white/10 ml-2.5 space-y-4" }, timeline.slice().sort((a, b) => a.timestamp - b.timestamp).map((event, idx) => {
|
|
9778
|
-
const dateObj = new Date(event.timestamp);
|
|
9779
|
-
const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
9780
|
-
return /* @__PURE__ */ import_react19.default.createElement("div", { key: idx, className: "relative pl-4 flex flex-col gap-0.5" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute left-[-4.5px] top-1.5 w-2 h-2 rounded-full bg-slate-400/50 border-[1.5px] border-slate-900" }), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] text-slate-300" }, event.description), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[9px] text-slate-500 font-mono tracking-tighter" }, dateString));
|
|
9781
|
-
}))), currentDatasetName && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => handleSave(false), disabled: isSaving, className: `px-4 py-2 rounded-lg transition-all font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)] flex items-center gap-2 ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}` }, isSaving && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
|
|
10201
|
+
} }, suggestedType))))), currentDatasetName && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-3 mt-4 border-t border-white/10 flex items-center justify-end gap-2 text-xs text-slate-400" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "truncate text-right" }, /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, currentDatasetName)))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react19.default.createElement("button", { onClick: handleCancel, disabled: isSaving, className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50" }, canEdit ? "Cancelar" : "Fechar"), canEdit && /* @__PURE__ */ import_react19.default.createElement("button", { onClick: () => handleSave(false), disabled: isSaving, className: `px-4 py-2 rounded-lg transition-all font-semibold text-sm shadow-[0_8px_24px_rgba(99,102,241,0.35)] flex items-center gap-2 ${isSaving ? "bg-slate-700 text-slate-300 cursor-wait" : "bg-gradient-to-tr from-indigo-600 to-indigo-400 hover:from-indigo-500 hover:to-indigo-300 text-white"}` }, isSaving && /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiLoader, { className: "animate-spin" }), isSaving ? "Salvando..." : "Salvar Quest")))
|
|
9782
10202
|
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
|
|
9783
10203
|
DescriptionEditModal,
|
|
9784
10204
|
{
|
|
@@ -9892,8 +10312,12 @@ function RelationshipDetailsPanel({
|
|
|
9892
10312
|
}) {
|
|
9893
10313
|
const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
|
|
9894
10314
|
const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
|
|
9895
|
-
const [customProps, setCustomProps] = (0, import_react21.useState)(
|
|
9896
|
-
|
|
10315
|
+
const [customProps, setCustomProps] = (0, import_react21.useState)(
|
|
10316
|
+
() => extractCustomPropsFromNode(link || {})
|
|
10317
|
+
);
|
|
10318
|
+
const [existingSections, setExistingSections] = (0, import_react21.useState)(
|
|
10319
|
+
(link == null ? void 0 : link.description_sections) || []
|
|
10320
|
+
);
|
|
9897
10321
|
const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
|
|
9898
10322
|
const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
|
|
9899
10323
|
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
|
|
@@ -9922,7 +10346,10 @@ function RelationshipDetailsPanel({
|
|
|
9922
10346
|
setHasUnsavedChanges(true);
|
|
9923
10347
|
setTimeout(() => {
|
|
9924
10348
|
var _a;
|
|
9925
|
-
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
10349
|
+
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
10350
|
+
behavior: "smooth",
|
|
10351
|
+
block: "center"
|
|
10352
|
+
});
|
|
9926
10353
|
}, 100);
|
|
9927
10354
|
};
|
|
9928
10355
|
const handleSave = async (keepOpen = false, overrides = {}) => {
|
|
@@ -9939,8 +10366,13 @@ function RelationshipDetailsPanel({
|
|
|
9939
10366
|
}
|
|
9940
10367
|
setIsSaving(true);
|
|
9941
10368
|
try {
|
|
9942
|
-
const extrasObj = toObjectFromCustomProps(
|
|
9943
|
-
|
|
10369
|
+
const extrasObj = toObjectFromCustomProps(
|
|
10370
|
+
currentCustomProps.filter((p) => !p.isEditing)
|
|
10371
|
+
);
|
|
10372
|
+
const processedSections = processDescriptionForSave(
|
|
10373
|
+
currentDescription,
|
|
10374
|
+
currentExistingSections
|
|
10375
|
+
);
|
|
9944
10376
|
const dataToSave = {
|
|
9945
10377
|
id: link.id,
|
|
9946
10378
|
source: link.source,
|
|
@@ -9952,8 +10384,10 @@ function RelationshipDetailsPanel({
|
|
|
9952
10384
|
isCurved: link.isCurved,
|
|
9953
10385
|
curveOffset: link.curveOffset
|
|
9954
10386
|
};
|
|
9955
|
-
if (currentSourceLabel.trim())
|
|
9956
|
-
|
|
10387
|
+
if (currentSourceLabel.trim())
|
|
10388
|
+
dataToSave.source_label = currentSourceLabel.trim();
|
|
10389
|
+
if (currentTargetLabel.trim())
|
|
10390
|
+
dataToSave.target_label = currentTargetLabel.trim();
|
|
9957
10391
|
await onSave(dataToSave, keepOpen);
|
|
9958
10392
|
onDataUpdate(dataToSave);
|
|
9959
10393
|
setHasUnsavedChanges(false);
|
|
@@ -10032,7 +10466,16 @@ function RelationshipDetailsPanel({
|
|
|
10032
10466
|
onImageClick: handleImageClickFromText,
|
|
10033
10467
|
onSaveDescription: handleSaveDescriptionInline
|
|
10034
10468
|
}
|
|
10035
|
-
) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-teal-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement(
|
|
10469
|
+
) : /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, /* @__PURE__ */ import_react21.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-teal-400/0 via-teal-400/70 to-teal-400/0" }), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pt-5 pb-3 flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2 mb-1" }, /* @__PURE__ */ import_react21.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-teal-400/80 shadow-[0_0_18px_2px_rgba(45,212,191,0.55)]" }), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs/relaxed text-slate-300" }, "Detalhes da Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement("h2", { className: "text-xl sm:text-2xl font-semibold tracking-tight" }, name || "Rela\xE7\xE3o")), /* @__PURE__ */ import_react21.default.createElement(
|
|
10470
|
+
"button",
|
|
10471
|
+
{
|
|
10472
|
+
onClick: onClose,
|
|
10473
|
+
disabled: isSaving,
|
|
10474
|
+
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",
|
|
10475
|
+
title: "Fechar"
|
|
10476
|
+
},
|
|
10477
|
+
"\xD7"
|
|
10478
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "px-6 pb-28 overflow-y-auto overscroll-contain space-y-4 max-h-[68vh] custom-scrollbar" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-xs text-slate-300" }, "Nome da Rela\xE7\xE3o"), /* @__PURE__ */ import_react21.default.createElement(
|
|
10036
10479
|
"input",
|
|
10037
10480
|
{
|
|
10038
10481
|
type: "text",
|
|
@@ -10047,7 +10490,23 @@ function RelationshipDetailsPanel({
|
|
|
10047
10490
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
10048
10491
|
`
|
|
10049
10492
|
}
|
|
10050
|
-
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
10493
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "rounded-xl border border-white/8 bg-slate-800/30 p-3 space-y-3" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
10494
|
+
"svg",
|
|
10495
|
+
{
|
|
10496
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
10497
|
+
width: "13",
|
|
10498
|
+
height: "13",
|
|
10499
|
+
viewBox: "0 0 24 24",
|
|
10500
|
+
fill: "none",
|
|
10501
|
+
stroke: "currentColor",
|
|
10502
|
+
strokeWidth: "2",
|
|
10503
|
+
strokeLinecap: "round",
|
|
10504
|
+
strokeLinejoin: "round",
|
|
10505
|
+
className: "text-violet-400 flex-shrink-0"
|
|
10506
|
+
},
|
|
10507
|
+
/* @__PURE__ */ import_react21.default.createElement("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z" }),
|
|
10508
|
+
/* @__PURE__ */ import_react21.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })
|
|
10509
|
+
), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-xs font-medium text-violet-300/80 uppercase tracking-wider" }, "Labels de Agrupamento")), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[11px] text-slate-400 leading-relaxed" }, "Labels agrupam conex\xF5es no menu de Conex\xF5es. Cada lado da conex\xE3o pode ter sua pr\xF3pria label."), /* @__PURE__ */ import_react21.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react21.default.createElement("label", { className: "text-[11px] text-slate-400" }, "Label do Source"), /* @__PURE__ */ import_react21.default.createElement(
|
|
10051
10510
|
"input",
|
|
10052
10511
|
{
|
|
10053
10512
|
type: "text",
|
|
@@ -10114,7 +10573,16 @@ function RelationshipDetailsPanel({
|
|
|
10114
10573
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
10115
10574
|
},
|
|
10116
10575
|
"Adicionar descri\xE7\xE3o..."
|
|
10117
|
-
))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react21.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
10576
|
+
))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex items-center justify-between mb-2" }, /* @__PURE__ */ import_react21.default.createElement("h3", { className: "text-sm font-medium" }, "Propriedades Adicionais"), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
10577
|
+
"button",
|
|
10578
|
+
{
|
|
10579
|
+
type: "button",
|
|
10580
|
+
onClick: handleAddProp,
|
|
10581
|
+
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"
|
|
10582
|
+
},
|
|
10583
|
+
/* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }),
|
|
10584
|
+
" Adicionar"
|
|
10585
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
|
|
10118
10586
|
CustomPropertyDisplay,
|
|
10119
10587
|
{
|
|
10120
10588
|
key: prop.id,
|
|
@@ -10122,11 +10590,21 @@ function RelationshipDetailsPanel({
|
|
|
10122
10590
|
onUpdate: (updatedProp) => handleUpdateProp(idx, updatedProp),
|
|
10123
10591
|
onRemove: () => handleRemoveProp(idx),
|
|
10124
10592
|
onOpenImageViewer,
|
|
10125
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
10593
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
10594
|
+
(t) => t !== prop.type
|
|
10595
|
+
),
|
|
10126
10596
|
onUploadFile,
|
|
10127
10597
|
disabled: !canEdit
|
|
10128
10598
|
}
|
|
10129
|
-
)), /* @__PURE__ */ import_react21.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
10599
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { ref: propsEndRef })))), /* @__PURE__ */ import_react21.default.createElement("div", { className: "sticky bottom-0 z-10 bg-gradient-to-t from-slate-950/80 via-slate-950/50 to-transparent px-6 py-4 border-t border-white/10 flex justify-end gap-3" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
10600
|
+
"button",
|
|
10601
|
+
{
|
|
10602
|
+
onClick: onClose,
|
|
10603
|
+
disabled: isSaving,
|
|
10604
|
+
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50"
|
|
10605
|
+
},
|
|
10606
|
+
canEdit ? "Cancelar" : "Fechar"
|
|
10607
|
+
), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
10130
10608
|
"button",
|
|
10131
10609
|
{
|
|
10132
10610
|
onClick: () => handleSave(false),
|
|
@@ -13474,7 +13952,8 @@ function XViewScene({
|
|
|
13474
13952
|
nodes: sceneDataRef2.current.nodes,
|
|
13475
13953
|
links: sceneDataRef2.current.links,
|
|
13476
13954
|
quest_nodes: specificParentData.nodes,
|
|
13477
|
-
quest_links: specificParentData.links
|
|
13955
|
+
quest_links: specificParentData.links,
|
|
13956
|
+
quest_counter: sceneDataRef2.current.quest_counter || 1
|
|
13478
13957
|
};
|
|
13479
13958
|
await context.actions.save_view_data(sceneSaveUrl2, viewFilePayload);
|
|
13480
13959
|
} else {
|
|
@@ -15082,7 +15561,8 @@ function XViewScene({
|
|
|
15082
15561
|
nodes: currentNodes,
|
|
15083
15562
|
links: currentLinks,
|
|
15084
15563
|
quest_nodes: isView ? ((_b2 = parentDataRef.current[sceneConfigId]) == null ? void 0 : _b2.nodes) || [] : sceneDataRef.current.quest_nodes || [],
|
|
15085
|
-
quest_links: isView ? ((_c2 = parentDataRef.current[sceneConfigId]) == null ? void 0 : _c2.links) || [] : sceneDataRef.current.quest_links || []
|
|
15564
|
+
quest_links: isView ? ((_c2 = parentDataRef.current[sceneConfigId]) == null ? void 0 : _c2.links) || [] : sceneDataRef.current.quest_links || [],
|
|
15565
|
+
quest_counter: sceneDataRef.current.quest_counter || 1
|
|
15086
15566
|
};
|
|
15087
15567
|
try {
|
|
15088
15568
|
await save_view_data(sceneSaveUrl, sceneFileData);
|
|
@@ -15632,7 +16112,8 @@ function XViewScene({
|
|
|
15632
16112
|
onUploadFile: upload_file_action,
|
|
15633
16113
|
userRole: userPermissionRole,
|
|
15634
16114
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
|
|
15635
|
-
viewMembers
|
|
16115
|
+
viewMembers,
|
|
16116
|
+
currentUser: session == null ? void 0 : session.user
|
|
15636
16117
|
}
|
|
15637
16118
|
),
|
|
15638
16119
|
detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
|