@lv-x-software-house/x_view 1.2.6-dev.50 → 1.2.6-dev.52
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 +324 -276
- package/dist/index.mjs +324 -276
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3896,6 +3896,8 @@ function XViewSidebar({
|
|
|
3896
3896
|
},
|
|
3897
3897
|
milestones = [],
|
|
3898
3898
|
onOpenMilestoneManager = () => {
|
|
3899
|
+
},
|
|
3900
|
+
onActivateReshapeLens = () => {
|
|
3899
3901
|
}
|
|
3900
3902
|
}) {
|
|
3901
3903
|
const [query, setQuery] = (0, import_react3.useState)("");
|
|
@@ -3906,17 +3908,21 @@ function XViewSidebar({
|
|
|
3906
3908
|
const [isFilterMenuOpen, setIsFilterMenuOpen] = (0, import_react3.useState)(false);
|
|
3907
3909
|
const [filterCategory, setFilterCategory] = (0, import_react3.useState)("Type");
|
|
3908
3910
|
const [filterValue, setFilterValue] = (0, import_react3.useState)("");
|
|
3911
|
+
const [activeSubMenu, setActiveSubMenu] = (0, import_react3.useState)(null);
|
|
3909
3912
|
const [questFilterAssignee, setQuestFilterAssignee] = (0, import_react3.useState)("");
|
|
3910
3913
|
const [questFilterStatus, setQuestFilterStatus] = (0, import_react3.useState)("");
|
|
3911
|
-
const [isQuestLensMenuOpen, setIsQuestLensMenuOpen] = (0, import_react3.useState)(false);
|
|
3912
3914
|
const [questFilterMilestone, setQuestFilterMilestone] = (0, import_react3.useState)("");
|
|
3915
|
+
const [isQuestLensLoading, setIsQuestLensLoading] = (0, import_react3.useState)(false);
|
|
3916
|
+
const [reshapeLayoutType, setReshapeLayoutType] = (0, import_react3.useState)("Star");
|
|
3917
|
+
const [reshapeColumnCount, setReshapeColumnCount] = (0, import_react3.useState)(4);
|
|
3918
|
+
const [reshapeCenterNodeId, setReshapeCenterNodeId] = (0, import_react3.useState)("");
|
|
3913
3919
|
const [isTypeDropdownOpen, setIsTypeDropdownOpen] = (0, import_react3.useState)(false);
|
|
3914
3920
|
const [highlightedTypeIndex, setHighlightedTypeIndex] = (0, import_react3.useState)(-1);
|
|
3915
3921
|
const containerRef = (0, import_react3.useRef)(null);
|
|
3916
3922
|
const inputRef = (0, import_react3.useRef)(null);
|
|
3917
3923
|
const filterMenuRef = (0, import_react3.useRef)(null);
|
|
3918
3924
|
const typeDropdownRef = (0, import_react3.useRef)(null);
|
|
3919
|
-
const
|
|
3925
|
+
const annexedPanelRef = (0, import_react3.useRef)(null);
|
|
3920
3926
|
const ability = (0, import_react3.useMemo)(() => {
|
|
3921
3927
|
return defineAbilityFor(userRole);
|
|
3922
3928
|
}, [userRole]);
|
|
@@ -4022,16 +4028,17 @@ function XViewSidebar({
|
|
|
4022
4028
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
4023
4029
|
}, [isFilterMenuOpen, isTypeDropdownOpen]);
|
|
4024
4030
|
(0, import_react3.useEffect)(() => {
|
|
4025
|
-
const
|
|
4026
|
-
if (
|
|
4027
|
-
|
|
4031
|
+
const handleClickOutsideAnnexed = (event) => {
|
|
4032
|
+
if (annexedPanelRef.current && !annexedPanelRef.current.contains(event.target)) {
|
|
4033
|
+
if (event.target.closest(".lens-button")) return;
|
|
4034
|
+
setActiveSubMenu(null);
|
|
4028
4035
|
}
|
|
4029
4036
|
};
|
|
4030
|
-
if (
|
|
4031
|
-
document.addEventListener("mousedown",
|
|
4037
|
+
if (activeSubMenu) {
|
|
4038
|
+
document.addEventListener("mousedown", handleClickOutsideAnnexed);
|
|
4032
4039
|
}
|
|
4033
|
-
return () => document.removeEventListener("mousedown",
|
|
4034
|
-
}, [
|
|
4040
|
+
return () => document.removeEventListener("mousedown", handleClickOutsideAnnexed);
|
|
4041
|
+
}, [activeSubMenu]);
|
|
4035
4042
|
(0, import_react3.useEffect)(() => {
|
|
4036
4043
|
if (!query) setSelectedNodeId(null);
|
|
4037
4044
|
}, [query]);
|
|
@@ -4129,11 +4136,150 @@ function XViewSidebar({
|
|
|
4129
4136
|
if (!isOpen) return ToggleButton;
|
|
4130
4137
|
const buttonBaseClass = "w-full px-3 py-2 rounded-md bg-indigo-500/10 hover:bg-indigo-500/20 border border-indigo-500/30 text-sm text-indigo-200 transition-colors flex items-center justify-center gap-2";
|
|
4131
4138
|
const buttonDisabledClass = "w-full px-3 py-2 rounded-md bg-slate-800/50 border border-white/5 text-sm text-slate-500 cursor-not-allowed flex items-center justify-center gap-2";
|
|
4139
|
+
const renderAnnexedPanel = () => {
|
|
4140
|
+
if (!activeSubMenu) return null;
|
|
4141
|
+
return /* @__PURE__ */ import_react3.default.createElement(
|
|
4142
|
+
"div",
|
|
4143
|
+
{
|
|
4144
|
+
ref: annexedPanelRef,
|
|
4145
|
+
className: "flex flex-col h-full w-[100vw] md:w-[280px] min-w-[100vw] md:min-w-[280px] bg-slate-950/95 md:bg-slate-950/80 backdrop-blur-2xl border-r border-white/10 shadow-2xl"
|
|
4146
|
+
},
|
|
4147
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "px-4 py-3 border-b border-white/10 flex items-center gap-2 bg-white/5" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4148
|
+
"button",
|
|
4149
|
+
{
|
|
4150
|
+
onClick: () => setActiveSubMenu(null),
|
|
4151
|
+
className: "p-1.5 -ml-1 rounded-md text-slate-400 hover:text-white hover:bg-white/10 md:hidden transition-colors",
|
|
4152
|
+
title: "Voltar"
|
|
4153
|
+
},
|
|
4154
|
+
/* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { fillRule: "evenodd", d: "M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z", clipRule: "evenodd" }))
|
|
4155
|
+
), /* @__PURE__ */ import_react3.default.createElement("h3", { className: "text-sm font-semibold text-indigo-100 uppercase tracking-wider" }, activeSubMenu === "quest" ? "Quest Lens" : "Reshape Lens"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4156
|
+
"button",
|
|
4157
|
+
{
|
|
4158
|
+
className: "ml-auto p-1.5 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors hidden md:block",
|
|
4159
|
+
onClick: () => setActiveSubMenu(null),
|
|
4160
|
+
title: "Fechar Sub-menu"
|
|
4161
|
+
},
|
|
4162
|
+
/* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { fillRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z", clipRule: "evenodd" }))
|
|
4163
|
+
)),
|
|
4164
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "flex-1 overflow-y-auto p-4 space-y-6" }, activeSubMenu === "quest" && /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-6 animate-in fade-in slide-in-from-bottom-2 duration-500" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Respons\xE1vel"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4165
|
+
"select",
|
|
4166
|
+
{
|
|
4167
|
+
value: questFilterAssignee,
|
|
4168
|
+
onChange: (e) => setQuestFilterAssignee(e.target.value),
|
|
4169
|
+
className: "w-full bg-slate-900/80 px-3 py-2.5 text-sm rounded-md border border-white/10 focus:outline-none focus:border-indigo-500/50 text-slate-200 appearance-none cursor-pointer hover:bg-slate-800/50 transition-all"
|
|
4170
|
+
},
|
|
4171
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos os Respons\xE1veis"),
|
|
4172
|
+
viewMembers.map((m) => /* @__PURE__ */ import_react3.default.createElement("option", { key: m.id, value: m.id }, m.name || m.email))
|
|
4173
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-slate-500 group-hover/select:text-indigo-400 transition-colors" }, /* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Status"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4174
|
+
"select",
|
|
4175
|
+
{
|
|
4176
|
+
value: questFilterStatus,
|
|
4177
|
+
onChange: (e) => setQuestFilterStatus(e.target.value),
|
|
4178
|
+
className: "w-full bg-slate-900/80 px-3 py-2.5 text-sm rounded-md border border-white/10 focus:outline-none focus:border-indigo-500/50 text-slate-200 appearance-none cursor-pointer hover:bg-slate-800/50 transition-all"
|
|
4179
|
+
},
|
|
4180
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos (Exclui Done)"),
|
|
4181
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Backlog" }, "Backlog"),
|
|
4182
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "In Progress" }, "In Progress"),
|
|
4183
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Review" }, "Review"),
|
|
4184
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Done" }, "Done")
|
|
4185
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-slate-500 group-hover/select:text-indigo-400 transition-colors" }, /* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Milestone"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4186
|
+
"select",
|
|
4187
|
+
{
|
|
4188
|
+
value: questFilterMilestone,
|
|
4189
|
+
onChange: (e) => setQuestFilterMilestone(e.target.value),
|
|
4190
|
+
className: "w-full bg-slate-900/80 px-3 py-2.5 text-sm rounded-md border border-white/10 focus:outline-none focus:border-indigo-500/50 text-slate-200 appearance-none cursor-pointer hover:bg-slate-800/50 transition-all"
|
|
4191
|
+
},
|
|
4192
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos os Milestones"),
|
|
4193
|
+
milestones.map((ms) => /* @__PURE__ */ import_react3.default.createElement("option", { key: ms.id, value: ms.id }, ms.name, " ", ms.status === "inactive" ? "(Inativo)" : ""))
|
|
4194
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-slate-500 group-hover/select:text-indigo-400 transition-colors" }, /* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4195
|
+
"button",
|
|
4196
|
+
{
|
|
4197
|
+
onClick: () => {
|
|
4198
|
+
setQuestFilterAssignee("");
|
|
4199
|
+
setQuestFilterStatus("");
|
|
4200
|
+
setQuestFilterMilestone("");
|
|
4201
|
+
},
|
|
4202
|
+
className: "flex-1 py-3 bg-white/[0.03] hover:bg-white/[0.08] text-slate-400 hover:text-slate-200 text-[10px] font-black uppercase tracking-widest rounded-xl transition-all border border-white/5 active:scale-95"
|
|
4203
|
+
},
|
|
4204
|
+
"Limpar"
|
|
4205
|
+
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4206
|
+
"button",
|
|
4207
|
+
{
|
|
4208
|
+
onClick: () => {
|
|
4209
|
+
onActivateQuestLens({
|
|
4210
|
+
assigneeId: questFilterAssignee,
|
|
4211
|
+
status: questFilterStatus,
|
|
4212
|
+
milestoneId: questFilterMilestone
|
|
4213
|
+
});
|
|
4214
|
+
setActiveSubMenu(null);
|
|
4215
|
+
},
|
|
4216
|
+
className: "flex-[2] py-3 bg-indigo-600 hover:bg-indigo-500 text-white text-[10px] font-black uppercase tracking-widest rounded-xl shadow-lg shadow-indigo-500/20 transition-all hover:scale-[1.02] active:scale-95"
|
|
4217
|
+
},
|
|
4218
|
+
"Aplicar Lente"
|
|
4219
|
+
))), activeSubMenu === "reshape" && /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-6 animate-in fade-in slide-in-from-bottom-2 duration-500" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Layout Type"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4220
|
+
"select",
|
|
4221
|
+
{
|
|
4222
|
+
value: reshapeLayoutType,
|
|
4223
|
+
onChange: (e) => setReshapeLayoutType(e.target.value),
|
|
4224
|
+
className: "w-full bg-slate-900/80 px-3 py-2.5 text-sm rounded-md border border-white/10 focus:outline-none focus:border-indigo-500/50 text-slate-200 appearance-none cursor-pointer hover:bg-slate-800/50 transition-all"
|
|
4225
|
+
},
|
|
4226
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Star" }, "Star"),
|
|
4227
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Circle" }, "Circle"),
|
|
4228
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Column" }, "Column")
|
|
4229
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-slate-500 group-hover/select:text-indigo-400 transition-colors" }, /* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), reshapeLayoutType === "Column" && /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Colunas"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4230
|
+
"input",
|
|
4231
|
+
{
|
|
4232
|
+
type: "number",
|
|
4233
|
+
min: "1",
|
|
4234
|
+
max: "12",
|
|
4235
|
+
value: reshapeColumnCount,
|
|
4236
|
+
onChange: (e) => setReshapeColumnCount(parseInt(e.target.value) || 4),
|
|
4237
|
+
className: "w-full bg-slate-900/80 px-3 py-2.5 text-sm rounded-md border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white hover:bg-slate-800/50 transition-all"
|
|
4238
|
+
}
|
|
4239
|
+
)), reshapeLayoutType === "Star" && /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "N\xF3 Central"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4240
|
+
"select",
|
|
4241
|
+
{
|
|
4242
|
+
value: reshapeCenterNodeId,
|
|
4243
|
+
onChange: (e) => setReshapeCenterNodeId(e.target.value),
|
|
4244
|
+
className: "w-full bg-slate-900/80 px-3 py-2.5 text-sm rounded-md border border-white/10 focus:outline-none focus:border-indigo-500/50 text-slate-200 appearance-none cursor-pointer hover:bg-slate-800/50 transition-all"
|
|
4245
|
+
},
|
|
4246
|
+
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Selecione um n\xF3..."),
|
|
4247
|
+
(Array.isArray(dbNodes) ? dbNodes.filter((n) => isNodeInView(n.id)) : []).map((n) => /* @__PURE__ */ import_react3.default.createElement("option", { key: n.id, value: n.id }, n.name))
|
|
4248
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-slate-500 group-hover/select:text-indigo-400 transition-colors" }, /* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4249
|
+
"button",
|
|
4250
|
+
{
|
|
4251
|
+
onClick: () => {
|
|
4252
|
+
setReshapeLayoutType("Star");
|
|
4253
|
+
setReshapeColumnCount(4);
|
|
4254
|
+
setReshapeCenterNodeId("");
|
|
4255
|
+
},
|
|
4256
|
+
className: "flex-1 py-3 bg-white/[0.03] hover:bg-white/[0.08] text-slate-400 hover:text-slate-200 text-[10px] font-black uppercase tracking-widest rounded-xl transition-all border border-white/5 active:scale-95"
|
|
4257
|
+
},
|
|
4258
|
+
"Resetar"
|
|
4259
|
+
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4260
|
+
"button",
|
|
4261
|
+
{
|
|
4262
|
+
onClick: () => {
|
|
4263
|
+
onActivateReshapeLens({
|
|
4264
|
+
type: reshapeLayoutType,
|
|
4265
|
+
columns: reshapeColumnCount,
|
|
4266
|
+
centerNodeId: reshapeCenterNodeId
|
|
4267
|
+
});
|
|
4268
|
+
setActiveSubMenu(null);
|
|
4269
|
+
},
|
|
4270
|
+
disabled: reshapeLayoutType === "Star" && !reshapeCenterNodeId,
|
|
4271
|
+
className: "flex-[2] py-3 bg-indigo-600 hover:bg-indigo-500 text-white text-[10px] font-black uppercase tracking-widest rounded-xl shadow-lg shadow-indigo-500/20 transition-all hover:scale-[1.02] active:scale-95 disabled:opacity-30 disabled:grayscale disabled:cursor-not-allowed"
|
|
4272
|
+
},
|
|
4273
|
+
"Aplicar Lente"
|
|
4274
|
+
)))),
|
|
4275
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "p-5 border-t border-white/5 bg-white/[0.02] flex items-center justify-center gap-2" }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "h-1 w-1 rounded-full bg-slate-700" }), /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[9px] text-slate-600 uppercase font-bold tracking-[0.2em]" }, "X-View Environment"), /* @__PURE__ */ import_react3.default.createElement("span", { className: "h-1 w-1 rounded-full bg-slate-700" }))
|
|
4276
|
+
);
|
|
4277
|
+
};
|
|
4132
4278
|
return /* @__PURE__ */ import_react3.default.createElement(
|
|
4133
4279
|
"div",
|
|
4134
4280
|
{
|
|
4135
4281
|
ref: containerRef,
|
|
4136
|
-
className: "ui-overlay fixed left-0 top-0 h-[100dvh]
|
|
4282
|
+
className: "ui-overlay fixed left-0 top-0 h-[100dvh] flex items-stretch z-40 pointer-events-none",
|
|
4137
4283
|
onPointerDown: swallow,
|
|
4138
4284
|
onPointerMove: swallow,
|
|
4139
4285
|
onPointerUp: swallow,
|
|
@@ -4142,281 +4288,61 @@ function XViewSidebar({
|
|
|
4142
4288
|
onContextMenu: swallow,
|
|
4143
4289
|
onDoubleClick: swallow
|
|
4144
4290
|
},
|
|
4145
|
-
/* @__PURE__ */ import_react3.default.createElement(
|
|
4146
|
-
"button",
|
|
4147
|
-
{
|
|
4148
|
-
className: "ml-auto p-2 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors",
|
|
4149
|
-
onClick: () => onToggle(false),
|
|
4150
|
-
title: "Fechar"
|
|
4151
|
-
},
|
|
4152
|
-
/* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4153
|
-
"path",
|
|
4154
|
-
{
|
|
4155
|
-
fillRule: "evenodd",
|
|
4156
|
-
d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",
|
|
4157
|
-
clipRule: "evenodd"
|
|
4158
|
-
}
|
|
4159
|
-
))
|
|
4160
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-6" }, /* @__PURE__ */ import_react3.default.createElement("section", null, /* @__PURE__ */ import_react3.default.createElement("div", { className: "mb-2" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Pesquisar Node")), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4291
|
+
/* @__PURE__ */ import_react3.default.createElement(
|
|
4161
4292
|
"div",
|
|
4162
4293
|
{
|
|
4163
|
-
className:
|
|
4164
|
-
|
|
4165
|
-
var _a;
|
|
4166
|
-
return (_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
4167
|
-
}
|
|
4294
|
+
className: `h-full w-[300px] flex-shrink-0 flex flex-col overflow-hidden bg-slate-950/80 backdrop-blur-2xl border-r border-white/10 shadow-[20px_0_40px_rgba(0,0,0,0.4)] pointer-events-auto transition-transform duration-500 ease-in-out absolute md:relative z-20 md:z-auto
|
|
4295
|
+
${activeSubMenu ? "-translate-x-full md:translate-x-0" : "translate-x-0"}`
|
|
4168
4296
|
},
|
|
4169
|
-
|
|
4170
|
-
"span",
|
|
4171
|
-
{
|
|
4172
|
-
className: "inline-block w-2.5 h-2.5 rounded-full border border-white/20",
|
|
4173
|
-
style: { backgroundColor: filter.value }
|
|
4174
|
-
}
|
|
4175
|
-
), /* @__PURE__ */ import_react3.default.createElement("span", { className: "truncate max-w-[120px]" }, filter.type, ": ", filter.value), /* @__PURE__ */ import_react3.default.createElement(
|
|
4297
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "relative px-5 py-5 border-b border-white/5 flex items-center gap-3 bg-white/[0.02]" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "inline-flex h-2.5 w-2.5 rounded-full bg-indigo-500 shadow-[0_0_12px_rgba(99,102,241,0.8)]" }), /* @__PURE__ */ import_react3.default.createElement("span", { className: "absolute inset-0 h-2.5 w-2.5 rounded-full bg-indigo-400 animate-ping opacity-40" })), /* @__PURE__ */ import_react3.default.createElement("h3", { className: "text-xs font-black text-slate-200 uppercase tracking-[0.2em]" }, "Ferramentas"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4176
4298
|
"button",
|
|
4177
4299
|
{
|
|
4178
|
-
|
|
4179
|
-
onClick: (
|
|
4180
|
-
|
|
4181
|
-
handleRemoveFilter(idx);
|
|
4182
|
-
},
|
|
4183
|
-
className: "hover:text-white transition-colors"
|
|
4300
|
+
className: "ml-auto p-2 rounded-full text-slate-500 hover:text-white hover:bg-white/10 transition-all duration-200",
|
|
4301
|
+
onClick: () => onToggle(false),
|
|
4302
|
+
title: "Fechar Painel"
|
|
4184
4303
|
},
|
|
4185
|
-
/* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg",
|
|
4186
|
-
|
|
4187
|
-
|
|
4188
|
-
|
|
4189
|
-
|
|
4190
|
-
|
|
4191
|
-
|
|
4192
|
-
|
|
4193
|
-
|
|
4194
|
-
|
|
4195
|
-
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4200
|
-
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
|
|
4204
|
-
|
|
4205
|
-
const typeLabel = Array.isArray(n.type) ? n.type.join(", ") : n.type;
|
|
4206
|
-
return /* @__PURE__ */ import_react3.default.createElement(
|
|
4207
|
-
"li",
|
|
4304
|
+
/* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4305
|
+
"path",
|
|
4306
|
+
{
|
|
4307
|
+
fillRule: "evenodd",
|
|
4308
|
+
d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",
|
|
4309
|
+
clipRule: "evenodd"
|
|
4310
|
+
}
|
|
4311
|
+
))
|
|
4312
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute top-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-indigo-500/20 to-transparent" })),
|
|
4313
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "flex-1 overflow-y-auto px-5 py-6 space-y-8 custom-scrollbar relative" }, /* @__PURE__ */ import_react3.default.createElement("section", null, /* @__PURE__ */ import_react3.default.createElement("div", { className: "mb-2" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Pesquisar Node")), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "w-full bg-slate-800/70 p-1.5 flex flex-wrap items-center gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all cursor-text min-h-[42px]", onClick: () => {
|
|
4314
|
+
var _a;
|
|
4315
|
+
return (_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
4316
|
+
} }, activeFilters.map((filter, idx) => /* @__PURE__ */ import_react3.default.createElement("span", { key: idx, className: "flex items-center gap-1.5 bg-indigo-500/20 text-indigo-200 border border-indigo-500/30 px-2 py-0.5 rounded text-xs font-medium max-w-full" }, filter.type === "Color" && /* @__PURE__ */ import_react3.default.createElement("span", { className: "inline-block w-2.5 h-2.5 rounded-full border border-white/20", style: { backgroundColor: filter.value } }), /* @__PURE__ */ import_react3.default.createElement("span", { className: "truncate max-w-[120px]" }, filter.type, ": ", filter.value), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", onClick: (e) => {
|
|
4317
|
+
e.stopPropagation();
|
|
4318
|
+
handleRemoveFilter(idx);
|
|
4319
|
+
}, className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react3.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react3.default.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), /* @__PURE__ */ import_react3.default.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" }))))), /* @__PURE__ */ import_react3.default.createElement("input", { ref: inputRef, type: "text", value: query, onChange: (e) => setQuery(e.target.value), onFocus: () => setShowList(true), onBlur: () => setTimeout(() => setShowList(false), 120), onKeyDown: handleKeyDown, placeholder: activeFilters.length === 0 ? "Digite parte do nome..." : "", className: "bg-transparent border-none outline-none flex-1 min-w-[80px] text-sm text-slate-100 placeholder-slate-500", autoComplete: "off" })), showList && /* @__PURE__ */ import_react3.default.createElement("ul", { className: "custom-scrollbar absolute mt-1 z-10 w-full max-h-[min(448px,50dvh)] overflow-y-auto rounded-lg bg-slate-900/95 border border-white/10 shadow-xl" }, filteredAndSorted.length > 0 ? filteredAndSorted.map((n) => /* @__PURE__ */ import_react3.default.createElement("li", { key: n.id, onMouseDown: () => handlePick(n), className: `px-3 py-2 text-sm flex items-center gap-2 cursor-pointer ${selectedNodeId === n.id ? "bg-indigo-600/60 text-white" : "text-slate-200 hover:bg-indigo-500/30"}`, title: n.name }, /* @__PURE__ */ import_react3.default.createElement("span", { className: `inline-block h-2 w-2 rounded-full flex-shrink-0 ${isNodeInView(n.id) ? "bg-emerald-400" : "bg-slate-500"}` }), /* @__PURE__ */ import_react3.default.createElement("span", { className: "truncate flex-1" }, n.name))) : /* @__PURE__ */ import_react3.default.createElement("li", { className: "px-3 py-2 text-sm text-slate-400" }, "Nenhum resultado"))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "mt-3 flex items-center gap-2" }, /* @__PURE__ */ import_react3.default.createElement("button", { onClick: handleConfirm, disabled: !selectedNodeId, className: `flex-1 ${selectedNodeId ? buttonBaseClass : buttonDisabledClass}` }, /* @__PURE__ */ import_react3.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_react3.default.createElement("polygon", { points: "5 3 19 12 5 21 5 3" })), "Renderizar"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative", ref: filterMenuRef }, /* @__PURE__ */ import_react3.default.createElement("button", { onClick: () => setIsFilterMenuOpen(!isFilterMenuOpen), className: `px-3 py-2 rounded-md text-sm font-medium border transition-colors flex items-center gap-2 ${isFilterMenuOpen || activeFilters.length > 0 ? "bg-indigo-500/30 text-indigo-200 border-indigo-500/40" : "bg-indigo-500/10 text-indigo-200 border-indigo-500/30 hover:bg-indigo-500/20"}` }, /* @__PURE__ */ import_react3.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_react3.default.createElement("polygon", { points: "22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3" })), "Filters"), isFilterMenuOpen && /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-0 top-full mt-2 w-56 p-3 rounded-lg bg-slate-900 border border-white/10 shadow-xl z-50 flex flex-col gap-3 animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Filtro"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex bg-slate-800/50 p-1 rounded-md" }, ["Type", "Color", "Dataset"].map((opt) => /* @__PURE__ */ import_react3.default.createElement("button", { key: opt, onClick: () => {
|
|
4320
|
+
setFilterCategory(opt);
|
|
4321
|
+
setFilterValue("");
|
|
4322
|
+
}, className: `flex-1 text-xs py-1 rounded transition-colors ${filterCategory === opt ? "bg-indigo-600 text-white" : "text-slate-400 hover:text-slate-200"}` }, opt)))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Valor"), /* @__PURE__ */ import_react3.default.createElement("input", { type: "text", value: filterValue, onChange: (e) => setFilterValue(e.target.value), className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white" })), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: handleAddFilter, disabled: !filterValue.trim(), className: "w-full py-1.5 bg-indigo-600 hover:bg-indigo-500 disabled:opacity-50 text-white text-xs font-medium rounded transition-colors" }, "Aplicar Filtro"))))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ import_react3.default.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Lentes"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4323
|
+
"button",
|
|
4208
4324
|
{
|
|
4209
|
-
|
|
4210
|
-
|
|
4211
|
-
className: `px-3 py-2 text-sm flex items-center gap-2 cursor-pointer ${active ? "bg-indigo-600/60 text-white" : "text-slate-200 hover:bg-indigo-500/30"}`,
|
|
4212
|
-
title: n.name
|
|
4213
|
-
},
|
|
4214
|
-
/* @__PURE__ */ import_react3.default.createElement("span", { className: `inline-block h-2 w-2 rounded-full flex-shrink-0 ${inView ? "bg-emerald-400" : "bg-slate-500"}` }),
|
|
4215
|
-
/* @__PURE__ */ import_react3.default.createElement("span", { className: "truncate flex-1" }, n.name),
|
|
4216
|
-
typeLabel && /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-[10px] px-1.5 py-0.5 rounded bg-white/10 border border-white/10 truncate max-w-[100px]" }, typeLabel)
|
|
4217
|
-
);
|
|
4218
|
-
}) : /* @__PURE__ */ import_react3.default.createElement("li", { className: "px-3 py-2 text-sm text-slate-400" }, "Nenhum resultado"))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "mt-3 flex items-center gap-2" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4219
|
-
"button",
|
|
4220
|
-
{
|
|
4221
|
-
onClick: handleConfirm,
|
|
4222
|
-
disabled: !selectedNodeId,
|
|
4223
|
-
className: `flex-1 ${selectedNodeId ? buttonBaseClass : buttonDisabledClass}`
|
|
4224
|
-
},
|
|
4225
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("polygon", { points: "5 3 19 12 5 21 5 3" })),
|
|
4226
|
-
"Renderizar"
|
|
4227
|
-
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative", ref: filterMenuRef }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4228
|
-
"button",
|
|
4229
|
-
{
|
|
4230
|
-
onClick: () => setIsFilterMenuOpen(!isFilterMenuOpen),
|
|
4231
|
-
className: `px-3 py-2 rounded-md text-sm font-medium border transition-colors flex items-center gap-2 ${isFilterMenuOpen || activeFilters.length > 0 ? "bg-indigo-500/30 text-indigo-200 border-indigo-500/40" : "bg-indigo-500/10 text-indigo-200 border-indigo-500/30 hover:bg-indigo-500/20"}`,
|
|
4232
|
-
title: "Adicionar filtros"
|
|
4233
|
-
},
|
|
4234
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("polygon", { points: "22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3" })),
|
|
4235
|
-
"Filters"
|
|
4236
|
-
), isFilterMenuOpen && /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute right-0 top-full mt-2 w-56 p-3 rounded-lg bg-slate-900 border border-white/10 shadow-xl z-50 flex flex-col gap-3 animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Filtro"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex bg-slate-800/50 p-1 rounded-md" }, ["Type", "Color", "Dataset"].map((opt) => /* @__PURE__ */ import_react3.default.createElement(
|
|
4237
|
-
"button",
|
|
4238
|
-
{
|
|
4239
|
-
key: opt,
|
|
4240
|
-
onClick: () => {
|
|
4241
|
-
setFilterCategory(opt);
|
|
4242
|
-
setFilterValue("");
|
|
4243
|
-
},
|
|
4244
|
-
className: `flex-1 text-xs py-1 rounded transition-colors ${filterCategory === opt ? "bg-indigo-600 text-white shadow-sm" : "text-slate-400 hover:text-slate-200"}`
|
|
4245
|
-
},
|
|
4246
|
-
opt
|
|
4247
|
-
)))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Valor"), filterCategory === "Type" || filterCategory === "Dataset" ? /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative", ref: typeDropdownRef }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4248
|
-
"input",
|
|
4249
|
-
{
|
|
4250
|
-
type: "text",
|
|
4251
|
-
value: filterValue,
|
|
4252
|
-
onChange: (e) => {
|
|
4253
|
-
setFilterValue(e.target.value);
|
|
4254
|
-
if (!isTypeDropdownOpen) setIsTypeDropdownOpen(true);
|
|
4255
|
-
setHighlightedTypeIndex(-1);
|
|
4256
|
-
},
|
|
4257
|
-
onFocus: () => setIsTypeDropdownOpen(true),
|
|
4258
|
-
onKeyDown: handleTypeKeyDown,
|
|
4259
|
-
placeholder: filterCategory === "Type" ? "Ex: Concept" : "Ex: Dataset 1",
|
|
4260
|
-
className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white",
|
|
4261
|
-
autoFocus: true
|
|
4262
|
-
}
|
|
4263
|
-
), isTypeDropdownOpen && filteredAutocompleteOptions.length > 0 && /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute z-[60] left-0 right-0 mt-1 max-h-48 overflow-y-auto bg-slate-900/95 backdrop-blur-xl border border-white/10 rounded-md shadow-2xl custom-scrollbar" }, filteredAutocompleteOptions.map((t, idx) => /* @__PURE__ */ import_react3.default.createElement(
|
|
4264
|
-
"div",
|
|
4265
|
-
{
|
|
4266
|
-
key: t,
|
|
4267
|
-
className: `px-3 py-2 text-xs cursor-pointer transition-colors ${idx === highlightedTypeIndex ? "bg-indigo-600 text-white" : "text-slate-300 hover:bg-white/10"}`,
|
|
4268
|
-
onMouseDown: (e) => {
|
|
4269
|
-
e.preventDefault();
|
|
4270
|
-
setFilterValue(t);
|
|
4271
|
-
setIsTypeDropdownOpen(false);
|
|
4272
|
-
setHighlightedTypeIndex(-1);
|
|
4273
|
-
}
|
|
4274
|
-
},
|
|
4275
|
-
t
|
|
4276
|
-
)))) : /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4277
|
-
"div",
|
|
4278
|
-
{
|
|
4279
|
-
className: "absolute left-2 w-3 h-3 rounded-full border border-white/20 shadow-sm",
|
|
4280
|
-
style: { backgroundColor: /^#[0-9A-F]{6}$/i.test(filterValue) ? filterValue : "transparent" }
|
|
4281
|
-
}
|
|
4282
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4283
|
-
"input",
|
|
4284
|
-
{
|
|
4285
|
-
type: "text",
|
|
4286
|
-
value: filterValue,
|
|
4287
|
-
onChange: (e) => setFilterValue(e.target.value),
|
|
4288
|
-
placeholder: "#RRGGBB",
|
|
4289
|
-
className: "w-full bg-slate-800 pl-7 pr-2 py-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white font-mono",
|
|
4290
|
-
autoFocus: true
|
|
4291
|
-
}
|
|
4292
|
-
))), /* @__PURE__ */ import_react3.default.createElement(
|
|
4293
|
-
"button",
|
|
4294
|
-
{
|
|
4295
|
-
onClick: handleAddFilter,
|
|
4296
|
-
disabled: !filterValue.trim(),
|
|
4297
|
-
className: "w-full py-1.5 bg-indigo-600 hover:bg-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed text-white text-xs font-medium rounded transition-colors"
|
|
4298
|
-
},
|
|
4299
|
-
"Aplicar Filtro"
|
|
4300
|
-
))), selectedNodeId && isNodeInView(selectedNodeId) && /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-xs text-emerald-400 absolute bottom-[-18px] left-0" }, "J\xE1 vis\xEDvel")), viewType === "view" && ability.can("import", "File") && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(
|
|
4301
|
-
"button",
|
|
4302
|
-
{
|
|
4303
|
-
onClick: onOpenImportModal,
|
|
4304
|
-
className: `${buttonBaseClass} mt-2`
|
|
4305
|
-
},
|
|
4306
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "17 8 12 3 7 8" }), /* @__PURE__ */ import_react3.default.createElement("line", { x1: "12", y1: "3", x2: "12", y2: "15" })),
|
|
4307
|
-
"Importar arquivo"
|
|
4308
|
-
), /* @__PURE__ */ import_react3.default.createElement("p", { className: "mt-1.5 text-xs text-slate-400 text-center px-1 leading-tight" }, "Importar datasets ou ancestralidades das views."), /* @__PURE__ */ import_react3.default.createElement("div", { className: "h-9 mt-1 flex items-center justify-center" }, importSuccessMessage && /* @__PURE__ */ import_react3.default.createElement("p", { className: "w-full text-center text-xs font-medium text-indigo-300 bg-indigo-500/10 border border-indigo-500/20 rounded-md py-1.5 px-2" }, importSuccessMessage)))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ import_react3.default.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Lentes"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative", ref: questLensRef }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4309
|
-
"button",
|
|
4310
|
-
{
|
|
4311
|
-
onClick: () => setIsQuestLensMenuOpen(!isQuestLensMenuOpen),
|
|
4312
|
-
className: `${buttonBaseClass} ${isQuestLensMenuOpen || questFilterAssignee || questFilterStatus || questFilterMilestone ? "bg-indigo-500/30 border-indigo-400" : ""}`,
|
|
4313
|
-
title: "Abrir filtros da Lente de Quests"
|
|
4314
|
-
},
|
|
4315
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" }), /* @__PURE__ */ import_react3.default.createElement("path", { d: "M9 12l2 2 4-4" })),
|
|
4316
|
-
"Quest Lens",
|
|
4317
|
-
(questFilterAssignee || questFilterStatus || questFilterMilestone) && /* @__PURE__ */ import_react3.default.createElement("span", { className: "ml-1 px-1.5 py-0.5 rounded-full bg-indigo-500 text-[9px] font-bold" }, "!")
|
|
4318
|
-
), isQuestLensMenuOpen && /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute left-0 bottom-full mb-2 w-full p-4 rounded-xl bg-slate-900 border border-white/10 shadow-2xl z-50 flex flex-col gap-4 animate-in fade-in slide-in-from-bottom-2 duration-200" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-bold tracking-widest" }, "Respons\xE1vel"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4319
|
-
"select",
|
|
4320
|
-
{
|
|
4321
|
-
value: questFilterAssignee,
|
|
4322
|
-
onChange: (e) => setQuestFilterAssignee(e.target.value),
|
|
4323
|
-
className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white appearance-none cursor-pointer"
|
|
4324
|
-
},
|
|
4325
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos os Respons\xE1veis"),
|
|
4326
|
-
viewMembers.map((m) => /* @__PURE__ */ import_react3.default.createElement("option", { key: m.id, value: m.id }, m.name || m.email))
|
|
4327
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-bold tracking-widest" }, "Status"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4328
|
-
"select",
|
|
4329
|
-
{
|
|
4330
|
-
value: questFilterStatus,
|
|
4331
|
-
onChange: (e) => setQuestFilterStatus(e.target.value),
|
|
4332
|
-
className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white appearance-none cursor-pointer"
|
|
4333
|
-
},
|
|
4334
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos (Exclui Done)"),
|
|
4335
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Backlog" }, "Backlog"),
|
|
4336
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "In Progress" }, "In Progress"),
|
|
4337
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Review" }, "Review"),
|
|
4338
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "Done" }, "Done")
|
|
4339
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-bold tracking-widest" }, "Milestone"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4340
|
-
"select",
|
|
4341
|
-
{
|
|
4342
|
-
value: questFilterMilestone,
|
|
4343
|
-
onChange: (e) => setQuestFilterMilestone(e.target.value),
|
|
4344
|
-
className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white appearance-none cursor-pointer"
|
|
4345
|
-
},
|
|
4346
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos os Milestones"),
|
|
4347
|
-
milestones.map((ms) => /* @__PURE__ */ import_react3.default.createElement("option", { key: ms.id, value: ms.id }, ms.name, " ", ms.status === "inactive" ? "(Inativo)" : ""))
|
|
4348
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-2 pt-1" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4349
|
-
"button",
|
|
4350
|
-
{
|
|
4351
|
-
onClick: () => {
|
|
4352
|
-
setQuestFilterAssignee("");
|
|
4353
|
-
setQuestFilterStatus("");
|
|
4354
|
-
setQuestFilterMilestone("");
|
|
4325
|
+
onClick: () => setActiveSubMenu(activeSubMenu === "quest" ? null : "quest"),
|
|
4326
|
+
className: `${buttonBaseClass} lens-button ${activeSubMenu === "quest" || questFilterAssignee || questFilterStatus || questFilterMilestone ? "bg-indigo-500/30 border-indigo-400" : ""}`
|
|
4355
4327
|
},
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
"
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
onActivateQuestLens({
|
|
4364
|
-
assigneeId: questFilterAssignee,
|
|
4365
|
-
status: questFilterStatus,
|
|
4366
|
-
milestoneId: questFilterMilestone
|
|
4367
|
-
});
|
|
4368
|
-
setIsQuestLensMenuOpen(false);
|
|
4369
|
-
onToggle(false);
|
|
4328
|
+
/* @__PURE__ */ import_react3.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_react3.default.createElement("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" }), /* @__PURE__ */ import_react3.default.createElement("path", { d: "M9 12l2 2 4-4" })),
|
|
4329
|
+
"Quest Lens"
|
|
4330
|
+
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4331
|
+
"button",
|
|
4332
|
+
{
|
|
4333
|
+
onClick: () => setActiveSubMenu(activeSubMenu === "reshape" ? null : "reshape"),
|
|
4334
|
+
className: `${buttonBaseClass} lens-button ${activeSubMenu === "reshape" ? "bg-indigo-500/30 border-indigo-400" : ""}`
|
|
4370
4335
|
},
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
"
|
|
4374
|
-
|
|
4375
|
-
"
|
|
4376
|
-
{
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "12 6 12 12 16 14" })),
|
|
4382
|
-
"Timeline"
|
|
4383
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4384
|
-
"button",
|
|
4385
|
-
{
|
|
4386
|
-
onClick: onOpenBoards,
|
|
4387
|
-
className: buttonBaseClass,
|
|
4388
|
-
title: "Abrir painel de Boards"
|
|
4389
|
-
},
|
|
4390
|
-
/* @__PURE__ */ import_react3.default.createElement(import_fi2.FiLayers, { size: 16 }),
|
|
4391
|
-
"Boards"
|
|
4392
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ import_react3.default.createElement("section", { className: "space-y-3" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Milestones"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4393
|
-
"button",
|
|
4394
|
-
{
|
|
4395
|
-
onClick: onOpenMilestoneManager,
|
|
4396
|
-
className: buttonBaseClass,
|
|
4397
|
-
title: "Gerenciar os milestones deste cen\xE1rio"
|
|
4398
|
-
},
|
|
4399
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react3.default.createElement("circle", { cx: "12", cy: "12", r: "6" }), /* @__PURE__ */ import_react3.default.createElement("circle", { cx: "12", cy: "12", r: "2" })),
|
|
4400
|
-
"Gerenciar Milestones"
|
|
4401
|
-
))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/30" }, /* @__PURE__ */ import_react3.default.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Navega\xE7\xE3o")), ability.can("update", "Scene") && /* @__PURE__ */ import_react3.default.createElement(
|
|
4402
|
-
"button",
|
|
4403
|
-
{
|
|
4404
|
-
onClick: handleSaveClick,
|
|
4405
|
-
disabled: isSaving,
|
|
4406
|
-
className: isSaving ? buttonDisabledClass : buttonBaseClass,
|
|
4407
|
-
title: "Salvar a visualiza\xE7\xE3o atual como o cen\xE1rio inicial"
|
|
4408
|
-
},
|
|
4409
|
-
isSaving ? /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("svg", { className: "animate-spin h-4 w-4 text-slate-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react3.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react3.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })), "Salvando...") : /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.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_react3.default.createElement("path", { d: "M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "17 21 17 13 7 13 7 21" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "7 3 7 8 15 8" })), "Atualizar cen\xE1rio inicial")
|
|
4410
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4411
|
-
"button",
|
|
4412
|
-
{
|
|
4413
|
-
onClick: onNavigateBack,
|
|
4414
|
-
className: buttonBaseClass,
|
|
4415
|
-
title: "Voltar \xE0 p\xE1gina de cen\xE1rios"
|
|
4416
|
-
},
|
|
4417
|
-
/* @__PURE__ */ import_react3.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_react3.default.createElement("line", { x1: "19", y1: "12", x2: "5", y2: "12" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "12 19 5 12 12 5" })),
|
|
4418
|
-
"Voltar \xE0 p\xE1gina de cen\xE1rios"
|
|
4419
|
-
))), contextLabel && /* @__PURE__ */ import_react3.default.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/50" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex items-center gap-2", title: contextLabel }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-sm font-medium text-slate-200 truncate" }, contextLabel))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" }))
|
|
4336
|
+
/* @__PURE__ */ import_react3.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_react3.default.createElement("polygon", { points: "12 2 2 7 12 12 22 7 12 2" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "2 17 12 22 22 17" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "2 12 12 17 22 12" })),
|
|
4337
|
+
"Reshape Lens"
|
|
4338
|
+
)), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: onActivateTimeline, className: buttonBaseClass }, /* @__PURE__ */ import_react3.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_react3.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react3.default.createElement("polyline", { points: "12 6 12 12 16 14" })), "Timeline"), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: onOpenBoards, className: buttonBaseClass }, /* @__PURE__ */ import_react3.default.createElement(import_fi2.FiLayers, { size: 16 }), "Boards")), /* @__PURE__ */ import_react3.default.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ import_react3.default.createElement("section", { className: "space-y-3" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Milestones"), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: onOpenMilestoneManager, className: buttonBaseClass }, "Gerenciar Milestones"))),
|
|
4339
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/30" }, /* @__PURE__ */ import_react3.default.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Navega\xE7\xE3o"), ability.can("update", "Scene") && /* @__PURE__ */ import_react3.default.createElement("button", { onClick: handleSaveClick, disabled: isSaving, className: isSaving ? buttonDisabledClass : buttonBaseClass }, isSaving ? "Salvando..." : "Atualizar cen\xE1rio inicial"), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: onNavigateBack, className: buttonBaseClass }, "Voltar \xE0 p\xE1gina de cen\xE1rios"))),
|
|
4340
|
+
contextLabel && /* @__PURE__ */ import_react3.default.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/50 truncate text-sm font-medium text-slate-200" }, contextLabel),
|
|
4341
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "h-[2px] bg-gradient-to-r from-indigo-400/0 via-indigo-400/70 to-indigo-400/0" })
|
|
4342
|
+
),
|
|
4343
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: `h-full pointer-events-auto transition-all duration-500 ease-out absolute md:relative left-0 top-0 z-30 md:z-10 flex-shrink-0 overflow-hidden
|
|
4344
|
+
${activeSubMenu ? "translate-x-0 md:translate-x-0 w-[100vw] md:w-[280px] opacity-100" : "-translate-x-full md:translate-x-0 w-[100vw] md:w-0 opacity-0 md:opacity-100"}
|
|
4345
|
+
` }, renderAnnexedPanel())
|
|
4420
4346
|
);
|
|
4421
4347
|
}
|
|
4422
4348
|
|
|
@@ -15132,6 +15058,127 @@ function XViewScene({
|
|
|
15132
15058
|
},
|
|
15133
15059
|
[]
|
|
15134
15060
|
);
|
|
15061
|
+
const handleActivateReshapeLens = (0, import_react31.useCallback)(({ type, columns, centerNodeId }) => {
|
|
15062
|
+
const { nodeObjects, tweenGroup, camera, controls } = stateRef.current;
|
|
15063
|
+
if (!nodeObjects || !tweenGroup || !camera || !controls) return;
|
|
15064
|
+
const activeNodeIds = Object.keys(nodeObjects);
|
|
15065
|
+
if (activeNodeIds.length === 0) return;
|
|
15066
|
+
let sumX = 0;
|
|
15067
|
+
let sumY = 0;
|
|
15068
|
+
let nodeCount = 0;
|
|
15069
|
+
activeNodeIds.forEach((id) => {
|
|
15070
|
+
const mesh = nodeObjects[id];
|
|
15071
|
+
if (mesh && mesh.material) {
|
|
15072
|
+
const opacityTween = new import_tween2.Tween(mesh.material).to({ opacity: 1 }, 1200).easing(import_tween2.Easing.Cubic.Out);
|
|
15073
|
+
tweenGroup.add(opacityTween);
|
|
15074
|
+
opacityTween.start();
|
|
15075
|
+
}
|
|
15076
|
+
if (mesh && mesh.userData && mesh.userData.labelObject) {
|
|
15077
|
+
mesh.userData.labelObject.visible = true;
|
|
15078
|
+
}
|
|
15079
|
+
});
|
|
15080
|
+
if (type === "Column") {
|
|
15081
|
+
const colSpacing = 80;
|
|
15082
|
+
const rowSpacing = 80;
|
|
15083
|
+
const numCols = columns || 4;
|
|
15084
|
+
activeNodeIds.forEach((id, index) => {
|
|
15085
|
+
const mesh = nodeObjects[id];
|
|
15086
|
+
const col = index % numCols;
|
|
15087
|
+
const row = Math.floor(index / numCols);
|
|
15088
|
+
const targetX = (col - (numCols - 1) / 2) * colSpacing;
|
|
15089
|
+
const targetY = -(row * rowSpacing) + 50;
|
|
15090
|
+
const posTween = new import_tween2.Tween(mesh.position).to({ x: targetX, y: targetY, z: 0 }, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15091
|
+
tweenGroup.add(posTween);
|
|
15092
|
+
posTween.start();
|
|
15093
|
+
if (mesh.userData.labelObject) {
|
|
15094
|
+
const labelTarget = new THREE3.Vector3(targetX, targetY, 0).add(mesh.userData.labelOffset || new THREE3.Vector3(0, 3.8, 0));
|
|
15095
|
+
const lblTween = new import_tween2.Tween(mesh.userData.labelObject.position).to(labelTarget, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15096
|
+
tweenGroup.add(lblTween);
|
|
15097
|
+
lblTween.start();
|
|
15098
|
+
}
|
|
15099
|
+
sumX += targetX;
|
|
15100
|
+
sumY += targetY;
|
|
15101
|
+
nodeCount++;
|
|
15102
|
+
});
|
|
15103
|
+
} else if (type === "Circle") {
|
|
15104
|
+
const total = activeNodeIds.length;
|
|
15105
|
+
const radius = Math.max(80, total * 8);
|
|
15106
|
+
activeNodeIds.forEach((id, index) => {
|
|
15107
|
+
const mesh = nodeObjects[id];
|
|
15108
|
+
const angle = index / total * Math.PI * 2;
|
|
15109
|
+
const targetX = Math.cos(angle) * radius;
|
|
15110
|
+
const targetY = Math.sin(angle) * radius;
|
|
15111
|
+
const posTween = new import_tween2.Tween(mesh.position).to({ x: targetX, y: targetY, z: 0 }, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15112
|
+
tweenGroup.add(posTween);
|
|
15113
|
+
posTween.start();
|
|
15114
|
+
if (mesh.userData.labelObject) {
|
|
15115
|
+
const labelTarget = new THREE3.Vector3(targetX, targetY, 0).add(mesh.userData.labelOffset || new THREE3.Vector3(0, 3.8, 0));
|
|
15116
|
+
const lblTween = new import_tween2.Tween(mesh.userData.labelObject.position).to(labelTarget, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15117
|
+
tweenGroup.add(lblTween);
|
|
15118
|
+
lblTween.start();
|
|
15119
|
+
}
|
|
15120
|
+
sumX += targetX;
|
|
15121
|
+
sumY += targetY;
|
|
15122
|
+
nodeCount++;
|
|
15123
|
+
});
|
|
15124
|
+
} else if (type === "Star") {
|
|
15125
|
+
const centerMesh = centerNodeId ? nodeObjects[String(centerNodeId)] : null;
|
|
15126
|
+
const orbitingNodeIds = activeNodeIds.filter((id) => id !== String(centerNodeId));
|
|
15127
|
+
const totalOrbiting = orbitingNodeIds.length;
|
|
15128
|
+
const radius = Math.max(80, totalOrbiting * 10);
|
|
15129
|
+
if (centerMesh) {
|
|
15130
|
+
const posTween = new import_tween2.Tween(centerMesh.position).to({ x: 0, y: 0, z: 0 }, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15131
|
+
tweenGroup.add(posTween);
|
|
15132
|
+
posTween.start();
|
|
15133
|
+
if (centerMesh.userData.labelObject) {
|
|
15134
|
+
const labelTarget = new THREE3.Vector3(0, 0, 0).add(centerMesh.userData.labelOffset || new THREE3.Vector3(0, 3.8, 0));
|
|
15135
|
+
const lblTween = new import_tween2.Tween(centerMesh.userData.labelObject.position).to(labelTarget, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15136
|
+
tweenGroup.add(lblTween);
|
|
15137
|
+
lblTween.start();
|
|
15138
|
+
}
|
|
15139
|
+
sumX += 0;
|
|
15140
|
+
sumY += 0;
|
|
15141
|
+
nodeCount++;
|
|
15142
|
+
}
|
|
15143
|
+
orbitingNodeIds.forEach((id, index) => {
|
|
15144
|
+
const mesh = nodeObjects[id];
|
|
15145
|
+
const angle = totalOrbiting > 0 ? index / totalOrbiting * Math.PI * 2 : 0;
|
|
15146
|
+
const targetX = Math.cos(angle) * radius;
|
|
15147
|
+
const targetY = Math.sin(angle) * radius;
|
|
15148
|
+
const posTween = new import_tween2.Tween(mesh.position).to({ x: targetX, y: targetY, z: 0 }, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15149
|
+
tweenGroup.add(posTween);
|
|
15150
|
+
posTween.start();
|
|
15151
|
+
if (mesh.userData.labelObject) {
|
|
15152
|
+
const labelTarget = new THREE3.Vector3(targetX, targetY, 0).add(mesh.userData.labelOffset || new THREE3.Vector3(0, 3.8, 0));
|
|
15153
|
+
const lblTween = new import_tween2.Tween(mesh.userData.labelObject.position).to(labelTarget, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15154
|
+
tweenGroup.add(lblTween);
|
|
15155
|
+
lblTween.start();
|
|
15156
|
+
}
|
|
15157
|
+
sumX += targetX;
|
|
15158
|
+
sumY += targetY;
|
|
15159
|
+
nodeCount++;
|
|
15160
|
+
});
|
|
15161
|
+
}
|
|
15162
|
+
if (nodeCount > 0) {
|
|
15163
|
+
const centerX = sumX / nodeCount;
|
|
15164
|
+
const centerY = sumY / nodeCount;
|
|
15165
|
+
const targetFocus = new THREE3.Vector3(centerX, centerY, 0);
|
|
15166
|
+
const targetTween = new import_tween2.Tween(controls.target).to({ x: targetFocus.x, y: targetFocus.y, z: targetFocus.z }, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15167
|
+
tweenGroup.add(targetTween);
|
|
15168
|
+
targetTween.start();
|
|
15169
|
+
let zoomZ = 140;
|
|
15170
|
+
if (type === "Column") {
|
|
15171
|
+
const numRows = Math.ceil(nodeCount / (columns || 4));
|
|
15172
|
+
zoomZ = Math.max(140, numRows * 50);
|
|
15173
|
+
} else if (type === "Circle" || type === "Star") {
|
|
15174
|
+
const radius = Math.max(80, nodeCount * 8);
|
|
15175
|
+
zoomZ = radius * 2.5;
|
|
15176
|
+
}
|
|
15177
|
+
const camTween = new import_tween2.Tween(camera.position).to({ x: targetFocus.x, y: targetFocus.y, z: zoomZ }, 1500).easing(import_tween2.Easing.Cubic.InOut);
|
|
15178
|
+
tweenGroup.add(camTween);
|
|
15179
|
+
camTween.start();
|
|
15180
|
+
}
|
|
15181
|
+
}, []);
|
|
15135
15182
|
const handleActivateQuestLens = (0, import_react31.useCallback)(({ assigneeId, status: status2, milestoneId }) => {
|
|
15136
15183
|
var _a2;
|
|
15137
15184
|
const { nodeObjects, tweenGroup, graphGroup } = stateRef.current;
|
|
@@ -18703,6 +18750,7 @@ function XViewScene({
|
|
|
18703
18750
|
importSuccessMessage,
|
|
18704
18751
|
onActivateTimeline: handleActivateTimeline,
|
|
18705
18752
|
onActivateQuestLens: handleActivateQuestLens,
|
|
18753
|
+
onActivateReshapeLens: handleActivateReshapeLens,
|
|
18706
18754
|
onOpenBoards: handleOpenBoards,
|
|
18707
18755
|
viewType: viewParams == null ? void 0 : viewParams.type,
|
|
18708
18756
|
viewName: viewParams == null ? void 0 : viewParams.name,
|