@lv-x-software-house/x_view 1.2.5-dev.27 → 1.2.5-dev.29
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 +642 -121
- package/dist/index.mjs +670 -124
- 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"))));
|
|
@@ -7831,7 +7831,9 @@ function InSceneCreationForm({
|
|
|
7831
7831
|
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react14.useState)(false);
|
|
7832
7832
|
const [useImageAsTexture, setUseImageAsTexture] = (0, import_react14.useState)(false);
|
|
7833
7833
|
const [selectedImageUrl, setSelectedImageUrl] = (0, import_react14.useState)(null);
|
|
7834
|
-
const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(
|
|
7834
|
+
const [targetDatasetId, setTargetDatasetId] = (0, import_react14.useState)(
|
|
7835
|
+
sourceNodeDatasetId || ""
|
|
7836
|
+
);
|
|
7835
7837
|
const [isDatasetDropdownOpen, setIsDatasetDropdownOpen] = (0, import_react14.useState)(false);
|
|
7836
7838
|
const datasetDropdownRef = (0, import_react14.useRef)(null);
|
|
7837
7839
|
(0, import_react14.useEffect)(() => {
|
|
@@ -7851,7 +7853,9 @@ function InSceneCreationForm({
|
|
|
7851
7853
|
};
|
|
7852
7854
|
}, [isDatasetDropdownOpen]);
|
|
7853
7855
|
const propsEndRef = (0, import_react14.useRef)(null);
|
|
7854
|
-
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
|
+
);
|
|
7855
7859
|
(0, import_react14.useEffect)(() => {
|
|
7856
7860
|
if (!hasImages && useImageAsTexture) {
|
|
7857
7861
|
setUseImageAsTexture(false);
|
|
@@ -7861,7 +7865,9 @@ function InSceneCreationForm({
|
|
|
7861
7865
|
}, [hasImages, useImageAsTexture, onImageChange]);
|
|
7862
7866
|
(0, import_react14.useEffect)(() => {
|
|
7863
7867
|
let result = [];
|
|
7864
|
-
const validExistingTypes = existingTypes.filter(
|
|
7868
|
+
const validExistingTypes = existingTypes.filter(
|
|
7869
|
+
(t) => t && typeof t === "string" && t.trim() !== ""
|
|
7870
|
+
);
|
|
7865
7871
|
if (typeInput.trim() === "") {
|
|
7866
7872
|
result = validExistingTypes.filter((t) => !types.includes(t));
|
|
7867
7873
|
} else {
|
|
@@ -7870,13 +7876,20 @@ function InSceneCreationForm({
|
|
|
7870
7876
|
const lowercasedInput = typeInput.toLowerCase();
|
|
7871
7877
|
result = validExistingTypes.filter((t) => {
|
|
7872
7878
|
if (!t) {
|
|
7873
|
-
console.warn(
|
|
7879
|
+
console.warn(
|
|
7880
|
+
"InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem"
|
|
7881
|
+
);
|
|
7874
7882
|
return false;
|
|
7875
7883
|
}
|
|
7876
7884
|
return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
|
|
7877
7885
|
});
|
|
7878
7886
|
} catch (err) {
|
|
7879
|
-
console.error(
|
|
7887
|
+
console.error(
|
|
7888
|
+
"InSceneCreationForm: Erro ao filtrar tipos:",
|
|
7889
|
+
err,
|
|
7890
|
+
"typeInput:",
|
|
7891
|
+
typeInput
|
|
7892
|
+
);
|
|
7880
7893
|
}
|
|
7881
7894
|
}
|
|
7882
7895
|
if (sourceTypes) {
|
|
@@ -7906,7 +7919,10 @@ function InSceneCreationForm({
|
|
|
7906
7919
|
setCustomProps([...customProps, newProp]);
|
|
7907
7920
|
setTimeout(() => {
|
|
7908
7921
|
var _a2;
|
|
7909
|
-
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
7922
|
+
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
7923
|
+
behavior: "smooth",
|
|
7924
|
+
block: "center"
|
|
7925
|
+
});
|
|
7910
7926
|
}, 100);
|
|
7911
7927
|
};
|
|
7912
7928
|
const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
|
|
@@ -8015,15 +8031,23 @@ function InSceneCreationForm({
|
|
|
8015
8031
|
},
|
|
8016
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" }),
|
|
8017
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")),
|
|
8018
|
-
/* @__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(
|
|
8019
|
-
"
|
|
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",
|
|
8020
8036
|
{
|
|
8021
|
-
|
|
8022
|
-
|
|
8023
|
-
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"
|
|
8024
8039
|
},
|
|
8025
|
-
|
|
8026
|
-
|
|
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(
|
|
8027
8051
|
"input",
|
|
8028
8052
|
{
|
|
8029
8053
|
type: "text",
|
|
@@ -8056,7 +8080,17 @@ function InSceneCreationForm({
|
|
|
8056
8080
|
}
|
|
8057
8081
|
},
|
|
8058
8082
|
suggestedType
|
|
8059
|
-
))))), /* @__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(
|
|
8060
8094
|
"button",
|
|
8061
8095
|
{
|
|
8062
8096
|
type: "button",
|
|
@@ -8064,7 +8098,12 @@ function InSceneCreationForm({
|
|
|
8064
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"
|
|
8065
8099
|
},
|
|
8066
8100
|
/* @__PURE__ */ import_react14.default.createElement("span", { className: "truncate pr-2" }, selectedDatasetName),
|
|
8067
|
-
/* @__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
|
+
)
|
|
8068
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(
|
|
8069
8108
|
"li",
|
|
8070
8109
|
{
|
|
@@ -8076,7 +8115,7 @@ function InSceneCreationForm({
|
|
|
8076
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"}`
|
|
8077
8116
|
},
|
|
8078
8117
|
ds.name
|
|
8079
|
-
)))), /* @__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(
|
|
8080
8119
|
DescriptionDisplay,
|
|
8081
8120
|
{
|
|
8082
8121
|
description,
|
|
@@ -8113,10 +8152,28 @@ function InSceneCreationForm({
|
|
|
8113
8152
|
onClick: () => handleSizeChange(s),
|
|
8114
8153
|
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
8115
8154
|
},
|
|
8116
|
-
/* @__PURE__ */ import_react14.default.createElement(
|
|
8117
|
-
|
|
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
|
+
)
|
|
8118
8169
|
);
|
|
8119
|
-
}))), /* @__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(
|
|
8120
8177
|
"input",
|
|
8121
8178
|
{
|
|
8122
8179
|
type: "checkbox",
|
|
@@ -8124,7 +8181,13 @@ function InSceneCreationForm({
|
|
|
8124
8181
|
onChange: handleToggleImageMode,
|
|
8125
8182
|
className: "hidden"
|
|
8126
8183
|
}
|
|
8127
|
-
), /* @__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(
|
|
8128
8191
|
ColorPicker,
|
|
8129
8192
|
{
|
|
8130
8193
|
color,
|
|
@@ -8143,7 +8206,22 @@ function InSceneCreationForm({
|
|
|
8143
8206
|
className: "w-full h-1.5 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-indigo-500 hover:accent-indigo-400",
|
|
8144
8207
|
title: `Intensidade do brilho: ${intensity}`
|
|
8145
8208
|
}
|
|
8146
|
-
), /* @__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(
|
|
8147
8225
|
CustomPropertyDisplay,
|
|
8148
8226
|
{
|
|
8149
8227
|
key: prop.id,
|
|
@@ -8151,13 +8229,30 @@ function InSceneCreationForm({
|
|
|
8151
8229
|
onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
|
|
8152
8230
|
onRemove: () => handleRemoveProp(index),
|
|
8153
8231
|
onOpenImageViewer,
|
|
8154
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
8232
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
8233
|
+
(t) => t !== prop.type
|
|
8234
|
+
),
|
|
8155
8235
|
isTextureMode: useImageAsTexture,
|
|
8156
8236
|
selectedImageUrl,
|
|
8157
8237
|
onSelectTexture: handleSelectTexture,
|
|
8158
8238
|
onUploadFile
|
|
8159
8239
|
}
|
|
8160
|
-
)), /* @__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
|
+
)))
|
|
8161
8256
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react14.default.createElement(
|
|
8162
8257
|
DescriptionEditModal,
|
|
8163
8258
|
{
|
|
@@ -8197,12 +8292,22 @@ function InSceneVersionForm({
|
|
|
8197
8292
|
const [name, setName] = (0, import_react15.useState)("");
|
|
8198
8293
|
const [size, setSize] = (0, import_react15.useState)("medium");
|
|
8199
8294
|
const [description, setDescription] = (0, import_react15.useState)("");
|
|
8200
|
-
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
|
+
]);
|
|
8201
8304
|
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react15.useState)(false);
|
|
8202
8305
|
const propsEndRef = (0, import_react15.useRef)(null);
|
|
8203
8306
|
const [useImageAsTexture, setUseImageAsTexture] = (0, import_react15.useState)(false);
|
|
8204
8307
|
const [selectedImageUrl, setSelectedImageUrl] = (0, import_react15.useState)(null);
|
|
8205
|
-
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
|
+
);
|
|
8206
8311
|
(0, import_react15.useEffect)(() => {
|
|
8207
8312
|
if (!hasImages && useImageAsTexture) {
|
|
8208
8313
|
setUseImageAsTexture(false);
|
|
@@ -8219,7 +8324,10 @@ function InSceneVersionForm({
|
|
|
8219
8324
|
setCustomProps([...customProps, newProp]);
|
|
8220
8325
|
setTimeout(() => {
|
|
8221
8326
|
var _a;
|
|
8222
|
-
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
8327
|
+
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
8328
|
+
behavior: "smooth",
|
|
8329
|
+
block: "center"
|
|
8330
|
+
});
|
|
8223
8331
|
}, 100);
|
|
8224
8332
|
};
|
|
8225
8333
|
const handleRemoveProp = (index) => {
|
|
@@ -8263,7 +8371,9 @@ function InSceneVersionForm({
|
|
|
8263
8371
|
alert("O campo 'Nome' \xE9 obrigat\xF3rio.");
|
|
8264
8372
|
return;
|
|
8265
8373
|
}
|
|
8266
|
-
const hasDate = customProps.some(
|
|
8374
|
+
const hasDate = customProps.some(
|
|
8375
|
+
(prop) => prop.key === "Date" && !prop.isEditing
|
|
8376
|
+
);
|
|
8267
8377
|
if (!hasDate) {
|
|
8268
8378
|
alert("A propriedade 'Date' \xE9 obrigat\xF3ria.");
|
|
8269
8379
|
return;
|
|
@@ -8314,7 +8424,25 @@ function InSceneVersionForm({
|
|
|
8314
8424
|
},
|
|
8315
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" }),
|
|
8316
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")),
|
|
8317
|
-
/* @__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(
|
|
8318
8446
|
DescriptionDisplay,
|
|
8319
8447
|
{
|
|
8320
8448
|
description,
|
|
@@ -8351,10 +8479,28 @@ function InSceneVersionForm({
|
|
|
8351
8479
|
onClick: () => handleSizeChange(s),
|
|
8352
8480
|
className: "flex items-center gap-2 group cursor-pointer focus:outline-none"
|
|
8353
8481
|
},
|
|
8354
|
-
/* @__PURE__ */ import_react15.default.createElement(
|
|
8355
|
-
|
|
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
|
+
)
|
|
8356
8496
|
);
|
|
8357
|
-
}))), /* @__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(
|
|
8358
8504
|
"input",
|
|
8359
8505
|
{
|
|
8360
8506
|
type: "checkbox",
|
|
@@ -8362,7 +8508,35 @@ function InSceneVersionForm({
|
|
|
8362
8508
|
onChange: handleToggleImageMode,
|
|
8363
8509
|
className: "hidden"
|
|
8364
8510
|
}
|
|
8365
|
-
), /* @__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(
|
|
8366
8540
|
CustomPropertyDisplay,
|
|
8367
8541
|
{
|
|
8368
8542
|
key: prop.id,
|
|
@@ -8370,13 +8544,30 @@ function InSceneVersionForm({
|
|
|
8370
8544
|
onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
|
|
8371
8545
|
onRemove: () => handleRemoveProp(index),
|
|
8372
8546
|
onOpenImageViewer,
|
|
8373
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
8547
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
8548
|
+
(t) => t !== prop.type
|
|
8549
|
+
),
|
|
8374
8550
|
isTextureMode: useImageAsTexture,
|
|
8375
8551
|
selectedImageUrl,
|
|
8376
8552
|
onSelectTexture: handleSelectTexture,
|
|
8377
8553
|
onUploadFile
|
|
8378
8554
|
}
|
|
8379
|
-
)), /* @__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
|
+
)))
|
|
8380
8571
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react15.default.createElement(
|
|
8381
8572
|
DescriptionEditModal,
|
|
8382
8573
|
{
|
|
@@ -8410,7 +8601,10 @@ function QuestReviewStackEditor({
|
|
|
8410
8601
|
const [isAdding, setIsAdding] = (0, import_react16.useState)(false);
|
|
8411
8602
|
const [searchQuery, setSearchQuery] = (0, import_react16.useState)("");
|
|
8412
8603
|
const handleAddReviewer = (userId) => {
|
|
8413
|
-
const newStack = [
|
|
8604
|
+
const newStack = [
|
|
8605
|
+
...reviewStack,
|
|
8606
|
+
{ userId, status: "pending", mandatory: true }
|
|
8607
|
+
];
|
|
8414
8608
|
onChange(newStack);
|
|
8415
8609
|
setIsAdding(false);
|
|
8416
8610
|
setSearchQuery("");
|
|
@@ -8421,21 +8615,27 @@ function QuestReviewStackEditor({
|
|
|
8421
8615
|
};
|
|
8422
8616
|
const handleToggleMandatory = (index) => {
|
|
8423
8617
|
const newStack = [...reviewStack];
|
|
8424
|
-
newStack[index] = {
|
|
8618
|
+
newStack[index] = {
|
|
8619
|
+
...newStack[index],
|
|
8620
|
+
mandatory: !newStack[index].mandatory
|
|
8621
|
+
};
|
|
8425
8622
|
onChange(newStack);
|
|
8426
8623
|
};
|
|
8427
8624
|
const handleMove = (index, direction) => {
|
|
8428
8625
|
const newStack = [...reviewStack];
|
|
8429
8626
|
const targetIndex = index + direction;
|
|
8430
8627
|
if (targetIndex < 0 || targetIndex >= newStack.length) return;
|
|
8431
|
-
[newStack[index], newStack[targetIndex]] = [
|
|
8628
|
+
[newStack[index], newStack[targetIndex]] = [
|
|
8629
|
+
newStack[targetIndex],
|
|
8630
|
+
newStack[index]
|
|
8631
|
+
];
|
|
8432
8632
|
onChange(newStack);
|
|
8433
8633
|
};
|
|
8434
8634
|
const filteredMembers = viewMembers.filter((m) => {
|
|
8435
8635
|
const search = searchQuery.toLowerCase();
|
|
8436
8636
|
return (m.name || "").toLowerCase().includes(search) || (m.email || "").toLowerCase().includes(search);
|
|
8437
8637
|
});
|
|
8438
|
-
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(
|
|
8439
8639
|
"button",
|
|
8440
8640
|
{
|
|
8441
8641
|
type: "button",
|
|
@@ -8444,7 +8644,13 @@ function QuestReviewStackEditor({
|
|
|
8444
8644
|
},
|
|
8445
8645
|
/* @__PURE__ */ import_react16.default.createElement(import_fi14.FiPlus, { size: 10 }),
|
|
8446
8646
|
" Adicionar Camada"
|
|
8447
|
-
)), 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(
|
|
8448
8654
|
"input",
|
|
8449
8655
|
{
|
|
8450
8656
|
autoFocus: true,
|
|
@@ -8454,7 +8660,14 @@ function QuestReviewStackEditor({
|
|
|
8454
8660
|
onChange: (e) => setSearchQuery(e.target.value),
|
|
8455
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"
|
|
8456
8662
|
}
|
|
8457
|
-
), /* @__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(
|
|
8458
8671
|
"li",
|
|
8459
8672
|
{
|
|
8460
8673
|
key: m.id,
|
|
@@ -8472,8 +8685,32 @@ function QuestReviewStackEditor({
|
|
|
8472
8685
|
key: index,
|
|
8473
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`
|
|
8474
8687
|
},
|
|
8475
|
-
/* @__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(
|
|
8476
|
-
|
|
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")),
|
|
8477
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(
|
|
8478
8715
|
"button",
|
|
8479
8716
|
{
|
|
@@ -8506,10 +8743,10 @@ function QuestReviewStackEditor({
|
|
|
8506
8743
|
|
|
8507
8744
|
// src/components/InSceneQuestForm.jsx
|
|
8508
8745
|
var QUEST_STATUS_COLORS2 = {
|
|
8509
|
-
|
|
8746
|
+
Backlog: "#64748b",
|
|
8510
8747
|
"In Progress": "#eab308",
|
|
8511
|
-
|
|
8512
|
-
|
|
8748
|
+
Review: "#a855f7",
|
|
8749
|
+
Done: "#22c55e"
|
|
8513
8750
|
};
|
|
8514
8751
|
function InSceneQuestForm({
|
|
8515
8752
|
onSave,
|
|
@@ -8553,7 +8790,10 @@ function InSceneQuestForm({
|
|
|
8553
8790
|
setCustomProps([...customProps, newProp]);
|
|
8554
8791
|
setTimeout(() => {
|
|
8555
8792
|
var _a2;
|
|
8556
|
-
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
8793
|
+
(_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({
|
|
8794
|
+
behavior: "smooth",
|
|
8795
|
+
block: "center"
|
|
8796
|
+
});
|
|
8557
8797
|
}, 100);
|
|
8558
8798
|
};
|
|
8559
8799
|
const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
|
|
@@ -8592,12 +8832,14 @@ function InSceneQuestForm({
|
|
|
8592
8832
|
customProps.filter((prop) => prop.key.trim() && !prop.isEditing)
|
|
8593
8833
|
);
|
|
8594
8834
|
const processedSections = processDescriptionForSave(description, []);
|
|
8595
|
-
const initialTimeline = [
|
|
8596
|
-
|
|
8597
|
-
|
|
8598
|
-
|
|
8599
|
-
|
|
8600
|
-
|
|
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
|
+
];
|
|
8601
8843
|
if (assigneeId) {
|
|
8602
8844
|
initialTimeline.push({
|
|
8603
8845
|
type: "assignee_changed",
|
|
@@ -8643,7 +8885,15 @@ function InSceneQuestForm({
|
|
|
8643
8885
|
onContextMenu: swallow,
|
|
8644
8886
|
onDoubleClick: swallow
|
|
8645
8887
|
},
|
|
8646
|
-
/* @__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
|
+
),
|
|
8647
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(
|
|
8648
8898
|
"button",
|
|
8649
8899
|
{
|
|
@@ -8668,16 +8918,40 @@ function InSceneQuestForm({
|
|
|
8668
8918
|
},
|
|
8669
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"
|
|
8670
8920
|
}
|
|
8671
|
-
), /* @__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(
|
|
8672
8929
|
"button",
|
|
8673
8930
|
{
|
|
8674
8931
|
type: "button",
|
|
8675
8932
|
onClick: () => setIsStatusDropdownOpen(!isStatusDropdownOpen),
|
|
8676
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"
|
|
8677
8934
|
},
|
|
8678
|
-
/* @__PURE__ */ import_react17.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
8679
|
-
|
|
8680
|
-
|
|
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(
|
|
8681
8955
|
"li",
|
|
8682
8956
|
{
|
|
8683
8957
|
key: s,
|
|
@@ -8688,7 +8962,13 @@ function InSceneQuestForm({
|
|
|
8688
8962
|
},
|
|
8689
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"}`
|
|
8690
8964
|
},
|
|
8691
|
-
/* @__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
|
+
),
|
|
8692
8972
|
s
|
|
8693
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(
|
|
8694
8974
|
"button",
|
|
@@ -8698,11 +8978,22 @@ function InSceneQuestForm({
|
|
|
8698
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"
|
|
8699
8979
|
},
|
|
8700
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")),
|
|
8701
|
-
/* @__PURE__ */ import_react17.default.createElement(
|
|
8702
|
-
|
|
8703
|
-
|
|
8704
|
-
|
|
8705
|
-
|
|
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(
|
|
8706
8997
|
"input",
|
|
8707
8998
|
{
|
|
8708
8999
|
type: "text",
|
|
@@ -8749,20 +9040,7 @@ function InSceneQuestForm({
|
|
|
8749
9040
|
onChange: setReviewStack,
|
|
8750
9041
|
viewMembers
|
|
8751
9042
|
}
|
|
8752
|
-
)), /* @__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" }, "
|
|
8753
|
-
"input",
|
|
8754
|
-
{
|
|
8755
|
-
type: "text",
|
|
8756
|
-
value: typeInput,
|
|
8757
|
-
onChange: (e) => setTypeInput(e.target.value),
|
|
8758
|
-
onKeyDown: handleTypeInputKeyDown,
|
|
8759
|
-
onBlur: () => {
|
|
8760
|
-
if (typeInput.trim()) handleAddType(typeInput);
|
|
8761
|
-
},
|
|
8762
|
-
className: "flex-1 bg-transparent text-sm min-w-[80px] focus:outline-none text-slate-200",
|
|
8763
|
-
autoComplete: "off"
|
|
8764
|
-
}
|
|
8765
|
-
))), /* @__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(
|
|
8766
9044
|
DescriptionDisplay,
|
|
8767
9045
|
{
|
|
8768
9046
|
description,
|
|
@@ -8772,20 +9050,31 @@ function InSceneQuestForm({
|
|
|
8772
9050
|
onMentionClick,
|
|
8773
9051
|
onSaveDescription: (newDesc) => setDescription(newDesc)
|
|
8774
9052
|
}
|
|
8775
|
-
), /* @__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(
|
|
8776
9054
|
"button",
|
|
8777
9055
|
{
|
|
8778
|
-
key: s,
|
|
8779
9056
|
type: "button",
|
|
8780
|
-
onClick: () =>
|
|
8781
|
-
|
|
8782
|
-
|
|
8783
|
-
|
|
8784
|
-
|
|
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"
|
|
8785
9074
|
},
|
|
8786
|
-
/* @__PURE__ */ import_react17.default.createElement(
|
|
8787
|
-
|
|
8788
|
-
))
|
|
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(
|
|
8789
9078
|
CustomPropertyDisplay,
|
|
8790
9079
|
{
|
|
8791
9080
|
key: prop.id,
|
|
@@ -8793,10 +9082,81 @@ function InSceneQuestForm({
|
|
|
8793
9082
|
onUpdate: (updatedProp) => handleUpdateProp(index, updatedProp),
|
|
8794
9083
|
onRemove: () => handleRemoveProp(index),
|
|
8795
9084
|
onOpenImageViewer,
|
|
8796
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
9085
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
9086
|
+
(t) => t !== prop.type
|
|
9087
|
+
),
|
|
8797
9088
|
onUploadFile
|
|
8798
9089
|
}
|
|
8799
|
-
)), /* @__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
|
+
)))
|
|
8800
9160
|
), isDescriptionModalOpen && /* @__PURE__ */ import_react17.default.createElement(
|
|
8801
9161
|
DescriptionEditModal,
|
|
8802
9162
|
{
|
|
@@ -9352,9 +9712,10 @@ function QuestDetailsPanel({
|
|
|
9352
9712
|
onUploadFile,
|
|
9353
9713
|
userRole,
|
|
9354
9714
|
currentDatasetName,
|
|
9355
|
-
viewMembers = []
|
|
9715
|
+
viewMembers = [],
|
|
9716
|
+
currentUser
|
|
9356
9717
|
}) {
|
|
9357
|
-
var _a;
|
|
9718
|
+
var _a, _b;
|
|
9358
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) || "";
|
|
9359
9720
|
const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
|
|
9360
9721
|
const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
|
|
@@ -9370,6 +9731,9 @@ function QuestDetailsPanel({
|
|
|
9370
9731
|
const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react19.useState)(false);
|
|
9371
9732
|
const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react19.useState)(false);
|
|
9372
9733
|
const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react19.useState)("");
|
|
9734
|
+
const [returnAssigneeId, setReturnAssigneeId] = (0, import_react19.useState)("");
|
|
9735
|
+
const [isReturnDropdownOpen, setIsReturnDropdownOpen] = (0, import_react19.useState)(false);
|
|
9736
|
+
const [returnSearchQuery, setReturnSearchQuery] = (0, import_react19.useState)("");
|
|
9373
9737
|
const [customProps, setCustomProps] = (0, import_react19.useState)(() => extractCustomPropsFromNode(node || {}));
|
|
9374
9738
|
const [reviewStack, setReviewStack] = (0, import_react19.useState)((node == null ? void 0 : node.reviewStack) || []);
|
|
9375
9739
|
const [timeline, setTimeline] = (0, import_react19.useState)((node == null ? void 0 : node.timeline) || []);
|
|
@@ -9409,6 +9773,7 @@ function QuestDetailsPanel({
|
|
|
9409
9773
|
setStatus((node == null ? void 0 : node.status) ?? "Backlog");
|
|
9410
9774
|
setSize((node == null ? void 0 : node.size) ?? "medium");
|
|
9411
9775
|
setAssigneeId((node == null ? void 0 : node.assignee_id) || "");
|
|
9776
|
+
setReturnAssigneeId("");
|
|
9412
9777
|
setDescription((node == null ? void 0 : node.description) ?? "");
|
|
9413
9778
|
setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
|
|
9414
9779
|
setExistingSections((node == null ? void 0 : node.description_sections) || []);
|
|
@@ -9452,8 +9817,7 @@ function QuestDetailsPanel({
|
|
|
9452
9817
|
});
|
|
9453
9818
|
};
|
|
9454
9819
|
const swallow = (e) => e.stopPropagation();
|
|
9455
|
-
const handleNameChange = (
|
|
9456
|
-
const val = e.target.value;
|
|
9820
|
+
const handleNameChange = (val) => {
|
|
9457
9821
|
setRawTitle(val);
|
|
9458
9822
|
const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
|
|
9459
9823
|
onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
|
|
@@ -9464,6 +9828,53 @@ function QuestDetailsPanel({
|
|
|
9464
9828
|
onSizeChange == null ? void 0 : onSizeChange(node.id, newSize);
|
|
9465
9829
|
setHasUnsavedChanges(true);
|
|
9466
9830
|
};
|
|
9831
|
+
const handleReturnToOperation = async () => {
|
|
9832
|
+
if (isSaving) return;
|
|
9833
|
+
setIsSaving(true);
|
|
9834
|
+
const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
|
|
9835
|
+
const actorName = (currentUser == null ? void 0 : currentUser.name) || "Revisor";
|
|
9836
|
+
const targetMember = viewMembers.find((m) => String(m.id) === String(returnAssigneeId));
|
|
9837
|
+
const targetName = (targetMember == null ? void 0 : targetMember.name) || "executor";
|
|
9838
|
+
const newEvent = {
|
|
9839
|
+
type: "review_returned",
|
|
9840
|
+
timestamp: Date.now(),
|
|
9841
|
+
actorId,
|
|
9842
|
+
description: `Review finalizada com retorno para opera\xE7\xE3o por ${actorName}. Novo respons\xE1vel: ${targetName}.`
|
|
9843
|
+
};
|
|
9844
|
+
const updatedTimeline = [...timeline, newEvent];
|
|
9845
|
+
const updatedStatus = "In Progress";
|
|
9846
|
+
const updatedColor = "#eab308";
|
|
9847
|
+
const nodeToSave = {
|
|
9848
|
+
...node,
|
|
9849
|
+
name: standardizedName,
|
|
9850
|
+
raw_title: rawTitle,
|
|
9851
|
+
description,
|
|
9852
|
+
status: updatedStatus,
|
|
9853
|
+
color: updatedColor,
|
|
9854
|
+
assignee_id: returnAssigneeId,
|
|
9855
|
+
reviewStack,
|
|
9856
|
+
timeline: updatedTimeline,
|
|
9857
|
+
size,
|
|
9858
|
+
types: types.includes("quest") ? types : [...types, "quest"],
|
|
9859
|
+
intensity: intensity || 0,
|
|
9860
|
+
useImageAsTexture: node.useImageAsTexture || false,
|
|
9861
|
+
textureImageUrl: node.textureImageUrl || null
|
|
9862
|
+
};
|
|
9863
|
+
try {
|
|
9864
|
+
await onSave(nodeToSave, false);
|
|
9865
|
+
setTimeline(updatedTimeline);
|
|
9866
|
+
setStatus(updatedStatus);
|
|
9867
|
+
setAssigneeId(returnAssigneeId);
|
|
9868
|
+
setReturnAssigneeId("");
|
|
9869
|
+
onDataUpdate(nodeToSave);
|
|
9870
|
+
setHasUnsavedChanges(false);
|
|
9871
|
+
} catch (error) {
|
|
9872
|
+
console.error("Erro ao retornar para opera\xE7\xE3o:", error);
|
|
9873
|
+
alert("Erro ao realizar o retorno para opera\xE7\xE3o.");
|
|
9874
|
+
} finally {
|
|
9875
|
+
setIsSaving(false);
|
|
9876
|
+
}
|
|
9877
|
+
};
|
|
9467
9878
|
const handleStatusChange = (newStatus) => {
|
|
9468
9879
|
setStatus(newStatus);
|
|
9469
9880
|
const newColor = QUEST_STATUS_COLORS3[newStatus];
|
|
@@ -9635,7 +10046,7 @@ function QuestDetailsPanel({
|
|
|
9635
10046
|
{
|
|
9636
10047
|
type: "text",
|
|
9637
10048
|
value: rawTitle,
|
|
9638
|
-
onChange: handleNameChange,
|
|
10049
|
+
onChange: (e) => handleNameChange(e.target.value),
|
|
9639
10050
|
readOnly: !canEdit,
|
|
9640
10051
|
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"}`
|
|
9641
10052
|
}
|
|
@@ -9752,7 +10163,65 @@ function QuestDetailsPanel({
|
|
|
9752
10163
|
viewMembers,
|
|
9753
10164
|
readOnly: !canEdit
|
|
9754
10165
|
}
|
|
9755
|
-
)), /* @__PURE__ */ import_react19.default.createElement("div", { className: "
|
|
10166
|
+
)), 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" }, "Selecione o respons\xE1vel abaixo para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-[10px] text-slate-400 font-medium ml-0.5" }, "Retornar para:"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
10167
|
+
"button",
|
|
10168
|
+
{
|
|
10169
|
+
type: "button",
|
|
10170
|
+
onClick: () => setIsReturnDropdownOpen(!isReturnDropdownOpen),
|
|
10171
|
+
className: "w-full bg-slate-800/80 p-2 text-xs rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-1 focus:ring-purple-400/50 transition-colors flex items-center justify-between"
|
|
10172
|
+
},
|
|
10173
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "text-slate-400", size: 12 }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_b = viewMembers.find((m) => String(m.id) === String(returnAssigneeId))) == null ? void 0 : _b.name) || "Selecionar respons\xE1vel...")),
|
|
10174
|
+
/* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isReturnDropdownOpen ? "rotate-180" : ""}`, size: 14 })
|
|
10175
|
+
), isReturnDropdownOpen && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
|
|
10176
|
+
setIsReturnDropdownOpen(false);
|
|
10177
|
+
setReturnSearchQuery("");
|
|
10178
|
+
} }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute bottom-full left-0 mb-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { className: "text-slate-500", size: 12 }), /* @__PURE__ */ import_react19.default.createElement(
|
|
10179
|
+
"input",
|
|
10180
|
+
{
|
|
10181
|
+
type: "text",
|
|
10182
|
+
autoFocus: true,
|
|
10183
|
+
placeholder: "Buscar membro...",
|
|
10184
|
+
value: returnSearchQuery,
|
|
10185
|
+
onChange: (e) => setReturnSearchQuery(e.target.value),
|
|
10186
|
+
className: "bg-transparent border-none outline-none text-[10px] text-white placeholder-slate-500 w-full",
|
|
10187
|
+
onClick: (e) => e.stopPropagation()
|
|
10188
|
+
}
|
|
10189
|
+
)), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
|
|
10190
|
+
const search = returnSearchQuery.toLowerCase();
|
|
10191
|
+
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
10192
|
+
}).map((member) => /* @__PURE__ */ import_react19.default.createElement(
|
|
10193
|
+
"li",
|
|
10194
|
+
{
|
|
10195
|
+
key: member.id,
|
|
10196
|
+
onClick: () => {
|
|
10197
|
+
setReturnAssigneeId(member.id);
|
|
10198
|
+
setIsReturnDropdownOpen(false);
|
|
10199
|
+
setReturnSearchQuery("");
|
|
10200
|
+
},
|
|
10201
|
+
className: `px-3 py-2 text-[11px] cursor-pointer transition-colors flex items-center gap-2 ${returnAssigneeId === member.id ? "bg-purple-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
|
|
10202
|
+
},
|
|
10203
|
+
member.name || member.email
|
|
10204
|
+
)), viewMembers.filter((member) => {
|
|
10205
|
+
const search = returnSearchQuery.toLowerCase();
|
|
10206
|
+
return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
|
|
10207
|
+
}).length === 0 && /* @__PURE__ */ import_react19.default.createElement("li", { className: "px-3 py-4 text-[10px] text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react19.default.createElement(
|
|
10208
|
+
"button",
|
|
10209
|
+
{
|
|
10210
|
+
type: "button",
|
|
10211
|
+
onClick: handleReturnToOperation,
|
|
10212
|
+
disabled: isSaving || !returnAssigneeId,
|
|
10213
|
+
className: `w-full h-10 flex items-center justify-center gap-2 rounded-lg text-xs font-semibold border transition-all active:scale-[0.98] disabled:opacity-40 disabled:grayscale-[0.5] disabled:cursor-not-allowed ${!returnAssigneeId ? "bg-slate-800 text-slate-500 border-white/5" : "bg-slate-800 hover:bg-slate-700 text-purple-300 border-purple-500/20 hover:border-purple-500/40"}`
|
|
10214
|
+
},
|
|
10215
|
+
/* @__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" })),
|
|
10216
|
+
"Retornar para Opera\xE7\xE3o"
|
|
10217
|
+
))), /* @__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) => {
|
|
10218
|
+
const dateObj = new Date(event.timestamp);
|
|
10219
|
+
const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
10220
|
+
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));
|
|
10221
|
+
}))), /* @__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) => {
|
|
10222
|
+
const isSelected = size === s;
|
|
10223
|
+
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));
|
|
10224
|
+
}))), /* @__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(
|
|
9756
10225
|
"input",
|
|
9757
10226
|
{
|
|
9758
10227
|
type: "text",
|
|
@@ -9776,14 +10245,7 @@ function QuestDetailsPanel({
|
|
|
9776
10245
|
), 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) => {
|
|
9777
10246
|
e.preventDefault();
|
|
9778
10247
|
handleAddType(suggestedType);
|
|
9779
|
-
} }, suggestedType))))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "
|
|
9780
|
-
const isSelected = size === s;
|
|
9781
|
-
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));
|
|
9782
|
-
}))), /* @__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) => {
|
|
9783
|
-
const dateObj = new Date(event.timestamp);
|
|
9784
|
-
const dateString = dateObj.toLocaleDateString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
9785
|
-
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));
|
|
9786
|
-
}))), 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")))
|
|
10248
|
+
} }, 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")))
|
|
9787
10249
|
), isDescriptionModalOpen && canEdit && /* @__PURE__ */ import_react19.default.createElement(
|
|
9788
10250
|
DescriptionEditModal,
|
|
9789
10251
|
{
|
|
@@ -9897,8 +10359,12 @@ function RelationshipDetailsPanel({
|
|
|
9897
10359
|
}) {
|
|
9898
10360
|
const [name, setName] = (0, import_react21.useState)((link == null ? void 0 : link.name) ?? "");
|
|
9899
10361
|
const [description, setDescription] = (0, import_react21.useState)((link == null ? void 0 : link.description) ?? "");
|
|
9900
|
-
const [customProps, setCustomProps] = (0, import_react21.useState)(
|
|
9901
|
-
|
|
10362
|
+
const [customProps, setCustomProps] = (0, import_react21.useState)(
|
|
10363
|
+
() => extractCustomPropsFromNode(link || {})
|
|
10364
|
+
);
|
|
10365
|
+
const [existingSections, setExistingSections] = (0, import_react21.useState)(
|
|
10366
|
+
(link == null ? void 0 : link.description_sections) || []
|
|
10367
|
+
);
|
|
9902
10368
|
const [sourceLabel, setSourceLabel] = (0, import_react21.useState)((link == null ? void 0 : link.source_label) ?? "");
|
|
9903
10369
|
const [targetLabel, setTargetLabel] = (0, import_react21.useState)((link == null ? void 0 : link.target_label) ?? "");
|
|
9904
10370
|
const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react21.useState)(false);
|
|
@@ -9927,7 +10393,10 @@ function RelationshipDetailsPanel({
|
|
|
9927
10393
|
setHasUnsavedChanges(true);
|
|
9928
10394
|
setTimeout(() => {
|
|
9929
10395
|
var _a;
|
|
9930
|
-
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
10396
|
+
(_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({
|
|
10397
|
+
behavior: "smooth",
|
|
10398
|
+
block: "center"
|
|
10399
|
+
});
|
|
9931
10400
|
}, 100);
|
|
9932
10401
|
};
|
|
9933
10402
|
const handleSave = async (keepOpen = false, overrides = {}) => {
|
|
@@ -9944,8 +10413,13 @@ function RelationshipDetailsPanel({
|
|
|
9944
10413
|
}
|
|
9945
10414
|
setIsSaving(true);
|
|
9946
10415
|
try {
|
|
9947
|
-
const extrasObj = toObjectFromCustomProps(
|
|
9948
|
-
|
|
10416
|
+
const extrasObj = toObjectFromCustomProps(
|
|
10417
|
+
currentCustomProps.filter((p) => !p.isEditing)
|
|
10418
|
+
);
|
|
10419
|
+
const processedSections = processDescriptionForSave(
|
|
10420
|
+
currentDescription,
|
|
10421
|
+
currentExistingSections
|
|
10422
|
+
);
|
|
9949
10423
|
const dataToSave = {
|
|
9950
10424
|
id: link.id,
|
|
9951
10425
|
source: link.source,
|
|
@@ -9957,8 +10431,10 @@ function RelationshipDetailsPanel({
|
|
|
9957
10431
|
isCurved: link.isCurved,
|
|
9958
10432
|
curveOffset: link.curveOffset
|
|
9959
10433
|
};
|
|
9960
|
-
if (currentSourceLabel.trim())
|
|
9961
|
-
|
|
10434
|
+
if (currentSourceLabel.trim())
|
|
10435
|
+
dataToSave.source_label = currentSourceLabel.trim();
|
|
10436
|
+
if (currentTargetLabel.trim())
|
|
10437
|
+
dataToSave.target_label = currentTargetLabel.trim();
|
|
9962
10438
|
await onSave(dataToSave, keepOpen);
|
|
9963
10439
|
onDataUpdate(dataToSave);
|
|
9964
10440
|
setHasUnsavedChanges(false);
|
|
@@ -10037,7 +10513,16 @@ function RelationshipDetailsPanel({
|
|
|
10037
10513
|
onImageClick: handleImageClickFromText,
|
|
10038
10514
|
onSaveDescription: handleSaveDescriptionInline
|
|
10039
10515
|
}
|
|
10040
|
-
) : /* @__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(
|
|
10516
|
+
) : /* @__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(
|
|
10517
|
+
"button",
|
|
10518
|
+
{
|
|
10519
|
+
onClick: onClose,
|
|
10520
|
+
disabled: isSaving,
|
|
10521
|
+
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",
|
|
10522
|
+
title: "Fechar"
|
|
10523
|
+
},
|
|
10524
|
+
"\xD7"
|
|
10525
|
+
)), /* @__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(
|
|
10041
10526
|
"input",
|
|
10042
10527
|
{
|
|
10043
10528
|
type: "text",
|
|
@@ -10052,7 +10537,23 @@ function RelationshipDetailsPanel({
|
|
|
10052
10537
|
${!canEdit ? "opacity-50 cursor-not-allowed" : ""}
|
|
10053
10538
|
`
|
|
10054
10539
|
}
|
|
10055
|
-
)), /* @__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(
|
|
10540
|
+
)), /* @__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(
|
|
10541
|
+
"svg",
|
|
10542
|
+
{
|
|
10543
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
10544
|
+
width: "13",
|
|
10545
|
+
height: "13",
|
|
10546
|
+
viewBox: "0 0 24 24",
|
|
10547
|
+
fill: "none",
|
|
10548
|
+
stroke: "currentColor",
|
|
10549
|
+
strokeWidth: "2",
|
|
10550
|
+
strokeLinecap: "round",
|
|
10551
|
+
strokeLinejoin: "round",
|
|
10552
|
+
className: "text-violet-400 flex-shrink-0"
|
|
10553
|
+
},
|
|
10554
|
+
/* @__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" }),
|
|
10555
|
+
/* @__PURE__ */ import_react21.default.createElement("line", { x1: "7", y1: "7", x2: "7.01", y2: "7" })
|
|
10556
|
+
), /* @__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(
|
|
10056
10557
|
"input",
|
|
10057
10558
|
{
|
|
10058
10559
|
type: "text",
|
|
@@ -10119,7 +10620,16 @@ function RelationshipDetailsPanel({
|
|
|
10119
10620
|
className: "absolute inset-0 flex items-center justify-center text-xs text-slate-500 cursor-text"
|
|
10120
10621
|
},
|
|
10121
10622
|
"Adicionar descri\xE7\xE3o..."
|
|
10122
|
-
))), /* @__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(
|
|
10623
|
+
))), /* @__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(
|
|
10624
|
+
"button",
|
|
10625
|
+
{
|
|
10626
|
+
type: "button",
|
|
10627
|
+
onClick: handleAddProp,
|
|
10628
|
+
className: "flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-slate-800/70 hover:bg-slate-700/70 border border-white/10 transition-colors"
|
|
10629
|
+
},
|
|
10630
|
+
/* @__PURE__ */ import_react21.default.createElement(import_fi18.FiPlus, { size: 14 }),
|
|
10631
|
+
" Adicionar"
|
|
10632
|
+
)), /* @__PURE__ */ import_react21.default.createElement("div", { className: "flex flex-col gap-3" }, customProps.map((prop, idx) => /* @__PURE__ */ import_react21.default.createElement(
|
|
10123
10633
|
CustomPropertyDisplay,
|
|
10124
10634
|
{
|
|
10125
10635
|
key: prop.id,
|
|
@@ -10127,11 +10637,21 @@ function RelationshipDetailsPanel({
|
|
|
10127
10637
|
onUpdate: (updatedProp) => handleUpdateProp(idx, updatedProp),
|
|
10128
10638
|
onRemove: () => handleRemoveProp(idx),
|
|
10129
10639
|
onOpenImageViewer,
|
|
10130
|
-
unavailableTypes: currentUsedTypes.filter(
|
|
10640
|
+
unavailableTypes: currentUsedTypes.filter(
|
|
10641
|
+
(t) => t !== prop.type
|
|
10642
|
+
),
|
|
10131
10643
|
onUploadFile,
|
|
10132
10644
|
disabled: !canEdit
|
|
10133
10645
|
}
|
|
10134
|
-
)), /* @__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(
|
|
10646
|
+
)), /* @__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(
|
|
10647
|
+
"button",
|
|
10648
|
+
{
|
|
10649
|
+
onClick: onClose,
|
|
10650
|
+
disabled: isSaving,
|
|
10651
|
+
className: "px-4 py-2 rounded-lg border border-white/15 bg-transparent hover:bg-white/5 transition-colors text-sm disabled:opacity-50"
|
|
10652
|
+
},
|
|
10653
|
+
canEdit ? "Cancelar" : "Fechar"
|
|
10654
|
+
), canEdit && /* @__PURE__ */ import_react21.default.createElement(
|
|
10135
10655
|
"button",
|
|
10136
10656
|
{
|
|
10137
10657
|
onClick: () => handleSave(false),
|
|
@@ -15639,7 +16159,8 @@ function XViewScene({
|
|
|
15639
16159
|
onUploadFile: upload_file_action,
|
|
15640
16160
|
userRole: userPermissionRole,
|
|
15641
16161
|
currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
|
|
15642
|
-
viewMembers
|
|
16162
|
+
viewMembers,
|
|
16163
|
+
currentUser: session == null ? void 0 : session.user
|
|
15643
16164
|
}
|
|
15644
16165
|
),
|
|
15645
16166
|
detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react27.default.createElement(
|