@lv-x-software-house/x_view 1.2.6-dev.51 → 1.2.6-dev.53
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 +254 -344
- package/dist/index.mjs +254 -344
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3869,6 +3869,49 @@ function ContextMenu({
|
|
|
3869
3869
|
// src/components/XViewSidebar.jsx
|
|
3870
3870
|
var import_react3 = __toESM(require("react"));
|
|
3871
3871
|
var import_fi2 = require("react-icons/fi");
|
|
3872
|
+
var CustomSelect = ({ value, onChange, options, placeholder }) => {
|
|
3873
|
+
const [isOpen, setIsOpen] = (0, import_react3.useState)(false);
|
|
3874
|
+
const selectRef = (0, import_react3.useRef)(null);
|
|
3875
|
+
(0, import_react3.useEffect)(() => {
|
|
3876
|
+
const handleClickOutside = (e) => {
|
|
3877
|
+
if (selectRef.current && !selectRef.current.contains(e.target)) {
|
|
3878
|
+
setIsOpen(false);
|
|
3879
|
+
}
|
|
3880
|
+
};
|
|
3881
|
+
if (isOpen) {
|
|
3882
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
3883
|
+
}
|
|
3884
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
3885
|
+
}, [isOpen]);
|
|
3886
|
+
const selectedOption = options.find((o) => String(o.value) === String(value));
|
|
3887
|
+
return /* @__PURE__ */ import_react3.default.createElement("div", { ref: selectRef, className: "relative w-full text-slate-200 text-sm" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
3888
|
+
"button",
|
|
3889
|
+
{
|
|
3890
|
+
type: "button",
|
|
3891
|
+
onClick: () => setIsOpen(!isOpen),
|
|
3892
|
+
className: `w-full bg-slate-900/80 px-3 py-2.5 rounded-md border text-left transition-all flex items-center justify-between
|
|
3893
|
+
${isOpen ? "border-indigo-500/50 bg-slate-800" : "border-white/10 hover:bg-slate-800"}`
|
|
3894
|
+
},
|
|
3895
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "truncate" }, selectedOption ? selectedOption.label : placeholder),
|
|
3896
|
+
/* @__PURE__ */ import_react3.default.createElement("svg", { className: `w-4 h-4 text-slate-500 transition-transform flex-shrink-0 ${isOpen ? "rotate-180" : ""}`, 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" }))
|
|
3897
|
+
), isOpen && /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute z-50 w-full mt-2 bg-slate-800 border border-white/10 rounded-lg shadow-2xl max-h-56 overflow-y-auto custom-scrollbar animate-in fade-in zoom-in-95 duration-100 py-1" }, options.map((opt, idx) => {
|
|
3898
|
+
const isSelected = String(value) === String(opt.value);
|
|
3899
|
+
return /* @__PURE__ */ import_react3.default.createElement(
|
|
3900
|
+
"button",
|
|
3901
|
+
{
|
|
3902
|
+
key: idx,
|
|
3903
|
+
type: "button",
|
|
3904
|
+
onClick: () => {
|
|
3905
|
+
onChange(opt.value);
|
|
3906
|
+
setIsOpen(false);
|
|
3907
|
+
},
|
|
3908
|
+
className: `w-full text-left px-3 py-2.5 text-sm transition-colors
|
|
3909
|
+
${isSelected ? "bg-indigo-600/30 text-indigo-200 font-medium" : "text-slate-300 hover:bg-white/10"}`
|
|
3910
|
+
},
|
|
3911
|
+
opt.label
|
|
3912
|
+
);
|
|
3913
|
+
})));
|
|
3914
|
+
};
|
|
3872
3915
|
function XViewSidebar({
|
|
3873
3916
|
dbNodes = [],
|
|
3874
3917
|
isNodeInView = () => false,
|
|
@@ -3908,11 +3951,11 @@ function XViewSidebar({
|
|
|
3908
3951
|
const [isFilterMenuOpen, setIsFilterMenuOpen] = (0, import_react3.useState)(false);
|
|
3909
3952
|
const [filterCategory, setFilterCategory] = (0, import_react3.useState)("Type");
|
|
3910
3953
|
const [filterValue, setFilterValue] = (0, import_react3.useState)("");
|
|
3954
|
+
const [activeSubMenu, setActiveSubMenu] = (0, import_react3.useState)(null);
|
|
3911
3955
|
const [questFilterAssignee, setQuestFilterAssignee] = (0, import_react3.useState)("");
|
|
3912
3956
|
const [questFilterStatus, setQuestFilterStatus] = (0, import_react3.useState)("");
|
|
3913
|
-
const [isQuestLensMenuOpen, setIsQuestLensMenuOpen] = (0, import_react3.useState)(false);
|
|
3914
3957
|
const [questFilterMilestone, setQuestFilterMilestone] = (0, import_react3.useState)("");
|
|
3915
|
-
const [
|
|
3958
|
+
const [isQuestLensLoading, setIsQuestLensLoading] = (0, import_react3.useState)(false);
|
|
3916
3959
|
const [reshapeLayoutType, setReshapeLayoutType] = (0, import_react3.useState)("Star");
|
|
3917
3960
|
const [reshapeColumnCount, setReshapeColumnCount] = (0, import_react3.useState)(4);
|
|
3918
3961
|
const [reshapeCenterNodeId, setReshapeCenterNodeId] = (0, import_react3.useState)("");
|
|
@@ -3922,8 +3965,7 @@ function XViewSidebar({
|
|
|
3922
3965
|
const inputRef = (0, import_react3.useRef)(null);
|
|
3923
3966
|
const filterMenuRef = (0, import_react3.useRef)(null);
|
|
3924
3967
|
const typeDropdownRef = (0, import_react3.useRef)(null);
|
|
3925
|
-
const
|
|
3926
|
-
const reshapeLensRef = (0, import_react3.useRef)(null);
|
|
3968
|
+
const annexedPanelRef = (0, import_react3.useRef)(null);
|
|
3927
3969
|
const ability = (0, import_react3.useMemo)(() => {
|
|
3928
3970
|
return defineAbilityFor(userRole);
|
|
3929
3971
|
}, [userRole]);
|
|
@@ -4029,19 +4071,17 @@ function XViewSidebar({
|
|
|
4029
4071
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
4030
4072
|
}, [isFilterMenuOpen, isTypeDropdownOpen]);
|
|
4031
4073
|
(0, import_react3.useEffect)(() => {
|
|
4032
|
-
const
|
|
4033
|
-
if (
|
|
4034
|
-
|
|
4035
|
-
|
|
4036
|
-
if (reshapeLensRef.current && !reshapeLensRef.current.contains(event.target)) {
|
|
4037
|
-
setIsReshapeLensMenuOpen(false);
|
|
4074
|
+
const handleClickOutsideAnnexed = (event) => {
|
|
4075
|
+
if (annexedPanelRef.current && !annexedPanelRef.current.contains(event.target)) {
|
|
4076
|
+
if (event.target.closest(".lens-button")) return;
|
|
4077
|
+
setActiveSubMenu(null);
|
|
4038
4078
|
}
|
|
4039
4079
|
};
|
|
4040
|
-
if (
|
|
4041
|
-
document.addEventListener("mousedown",
|
|
4080
|
+
if (activeSubMenu) {
|
|
4081
|
+
document.addEventListener("mousedown", handleClickOutsideAnnexed);
|
|
4042
4082
|
}
|
|
4043
|
-
return () => document.removeEventListener("mousedown",
|
|
4044
|
-
}, [
|
|
4083
|
+
return () => document.removeEventListener("mousedown", handleClickOutsideAnnexed);
|
|
4084
|
+
}, [activeSubMenu]);
|
|
4045
4085
|
(0, import_react3.useEffect)(() => {
|
|
4046
4086
|
if (!query) setSelectedNodeId(null);
|
|
4047
4087
|
}, [query]);
|
|
@@ -4139,359 +4179,229 @@ function XViewSidebar({
|
|
|
4139
4179
|
if (!isOpen) return ToggleButton;
|
|
4140
4180
|
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";
|
|
4141
4181
|
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";
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
className: "ui-overlay fixed left-0 top-0 h-[100dvh] w-[min(92vw,320px)] z-40 overflow-hidden",
|
|
4147
|
-
onPointerDown: swallow,
|
|
4148
|
-
onPointerMove: swallow,
|
|
4149
|
-
onPointerUp: swallow,
|
|
4150
|
-
onClick: swallow,
|
|
4151
|
-
onWheel: swallow,
|
|
4152
|
-
onContextMenu: swallow,
|
|
4153
|
-
onDoubleClick: swallow
|
|
4154
|
-
},
|
|
4155
|
-
/* @__PURE__ */ import_react3.default.createElement("div", { className: "h-full flex flex-col overflow-hidden bg-slate-950/80 backdrop-blur-xl border-r border-white/10 shadow-[0_0_40px_rgba(0,0,0,0.45)]" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative px-4 py-3 border-b border-white/10 flex items-center gap-2" }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "inline-flex h-2 w-2 rounded-full bg-indigo-400/80 shadow-[0_0_10px_2px_rgba(99,102,241,0.55)]" }), /* @__PURE__ */ import_react3.default.createElement("h3", { className: "text-sm font-medium text-slate-100" }, "Ferramentas"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4156
|
-
"button",
|
|
4182
|
+
const renderAnnexedPanel = () => {
|
|
4183
|
+
if (!activeSubMenu) return null;
|
|
4184
|
+
return /* @__PURE__ */ import_react3.default.createElement(
|
|
4185
|
+
"div",
|
|
4157
4186
|
{
|
|
4158
|
-
|
|
4159
|
-
|
|
4160
|
-
title: "Fechar"
|
|
4187
|
+
ref: annexedPanelRef,
|
|
4188
|
+
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"
|
|
4161
4189
|
},
|
|
4162
|
-
/* @__PURE__ */ import_react3.default.createElement("
|
|
4163
|
-
"
|
|
4190
|
+
/* @__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(
|
|
4191
|
+
"button",
|
|
4164
4192
|
{
|
|
4165
|
-
|
|
4166
|
-
|
|
4167
|
-
|
|
4193
|
+
onClick: () => setActiveSubMenu(null),
|
|
4194
|
+
className: "p-1.5 -ml-1 rounded-md text-slate-400 hover:text-white hover:bg-white/10 md:hidden transition-colors",
|
|
4195
|
+
title: "Voltar"
|
|
4196
|
+
},
|
|
4197
|
+
/* @__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" }))
|
|
4198
|
+
), /* @__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(
|
|
4199
|
+
"button",
|
|
4200
|
+
{
|
|
4201
|
+
className: "ml-auto p-1.5 rounded-md text-slate-400 hover:text-white hover:bg-white/10 transition-colors hidden md:block",
|
|
4202
|
+
onClick: () => setActiveSubMenu(null),
|
|
4203
|
+
title: "Fechar Sub-menu"
|
|
4204
|
+
},
|
|
4205
|
+
/* @__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" }))
|
|
4206
|
+
)),
|
|
4207
|
+
/* @__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(
|
|
4208
|
+
CustomSelect,
|
|
4209
|
+
{
|
|
4210
|
+
value: questFilterAssignee,
|
|
4211
|
+
onChange: (val) => setQuestFilterAssignee(val),
|
|
4212
|
+
options: [
|
|
4213
|
+
{ value: "", label: "Todos os Respons\xE1veis" },
|
|
4214
|
+
...viewMembers.map((m) => ({ value: m.id, label: m.name || m.email }))
|
|
4215
|
+
],
|
|
4216
|
+
placeholder: "Selecione um Respons\xE1vel"
|
|
4168
4217
|
}
|
|
4169
|
-
))
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4173
|
-
|
|
4174
|
-
|
|
4175
|
-
|
|
4176
|
-
|
|
4218
|
+
)), /* @__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(
|
|
4219
|
+
CustomSelect,
|
|
4220
|
+
{
|
|
4221
|
+
value: questFilterStatus,
|
|
4222
|
+
onChange: (val) => setQuestFilterStatus(val),
|
|
4223
|
+
options: [
|
|
4224
|
+
{ value: "", label: "Todos (Exclui Done)" },
|
|
4225
|
+
{ value: "Backlog", label: "Backlog" },
|
|
4226
|
+
{ value: "In Progress", label: "In Progress" },
|
|
4227
|
+
{ value: "Review", label: "Review" },
|
|
4228
|
+
{ value: "Done", label: "Done" }
|
|
4229
|
+
],
|
|
4230
|
+
placeholder: "Selecione um Status"
|
|
4177
4231
|
}
|
|
4178
|
-
},
|
|
4179
|
-
|
|
4180
|
-
"span",
|
|
4232
|
+
)), /* @__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(
|
|
4233
|
+
CustomSelect,
|
|
4181
4234
|
{
|
|
4182
|
-
|
|
4183
|
-
|
|
4235
|
+
value: questFilterMilestone,
|
|
4236
|
+
onChange: (val) => setQuestFilterMilestone(val),
|
|
4237
|
+
options: [
|
|
4238
|
+
{ value: "", label: "Todos os Milestones" },
|
|
4239
|
+
...milestones.map((ms) => ({
|
|
4240
|
+
value: ms.id,
|
|
4241
|
+
label: `${ms.name} ${ms.status === "inactive" ? "(Inativo)" : ""}`
|
|
4242
|
+
}))
|
|
4243
|
+
],
|
|
4244
|
+
placeholder: "Todos os Milestones"
|
|
4184
4245
|
}
|
|
4185
|
-
), /* @__PURE__ */ import_react3.default.createElement("
|
|
4246
|
+
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4186
4247
|
"button",
|
|
4187
4248
|
{
|
|
4188
|
-
|
|
4189
|
-
|
|
4190
|
-
|
|
4191
|
-
|
|
4249
|
+
onClick: () => {
|
|
4250
|
+
setQuestFilterAssignee("");
|
|
4251
|
+
setQuestFilterStatus("");
|
|
4252
|
+
setQuestFilterMilestone("");
|
|
4192
4253
|
},
|
|
4193
|
-
className: "hover:
|
|
4254
|
+
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"
|
|
4194
4255
|
},
|
|
4195
|
-
|
|
4196
|
-
)
|
|
4197
|
-
|
|
4256
|
+
"Limpar"
|
|
4257
|
+
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4258
|
+
"button",
|
|
4259
|
+
{
|
|
4260
|
+
onClick: () => {
|
|
4261
|
+
onActivateQuestLens({
|
|
4262
|
+
assigneeId: questFilterAssignee,
|
|
4263
|
+
status: questFilterStatus,
|
|
4264
|
+
milestoneId: questFilterMilestone
|
|
4265
|
+
});
|
|
4266
|
+
setActiveSubMenu(null);
|
|
4267
|
+
},
|
|
4268
|
+
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"
|
|
4269
|
+
},
|
|
4270
|
+
"Aplicar Lente"
|
|
4271
|
+
))), 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(
|
|
4272
|
+
CustomSelect,
|
|
4273
|
+
{
|
|
4274
|
+
value: reshapeLayoutType,
|
|
4275
|
+
onChange: (val) => setReshapeLayoutType(val),
|
|
4276
|
+
options: [
|
|
4277
|
+
{ value: "Star", label: "Star" },
|
|
4278
|
+
{ value: "Circle", label: "Circle" },
|
|
4279
|
+
{ value: "Column", label: "Column" }
|
|
4280
|
+
],
|
|
4281
|
+
placeholder: "Selecione um Formato"
|
|
4282
|
+
}
|
|
4283
|
+
)), 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(
|
|
4198
4284
|
"input",
|
|
4199
4285
|
{
|
|
4200
|
-
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
|
|
4204
|
-
|
|
4205
|
-
|
|
4206
|
-
onKeyDown: handleKeyDown,
|
|
4207
|
-
placeholder: activeFilters.length === 0 ? "Digite parte do nome..." : "",
|
|
4208
|
-
className: "bg-transparent border-none outline-none flex-1 min-w-[80px] text-sm text-slate-100 placeholder-slate-500",
|
|
4209
|
-
autoComplete: "off"
|
|
4286
|
+
type: "number",
|
|
4287
|
+
min: "1",
|
|
4288
|
+
max: "12",
|
|
4289
|
+
value: reshapeColumnCount,
|
|
4290
|
+
onChange: (e) => setReshapeColumnCount(parseInt(e.target.value) || 4),
|
|
4291
|
+
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"
|
|
4210
4292
|
}
|
|
4211
|
-
)
|
|
4212
|
-
|
|
4213
|
-
const inView = isNodeInView(n.id);
|
|
4214
|
-
const active = selectedNodeId === n.id;
|
|
4215
|
-
const typeLabel = Array.isArray(n.type) ? n.type.join(", ") : n.type;
|
|
4216
|
-
return /* @__PURE__ */ import_react3.default.createElement(
|
|
4217
|
-
"li",
|
|
4293
|
+
)), 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(
|
|
4294
|
+
CustomSelect,
|
|
4218
4295
|
{
|
|
4219
|
-
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
{
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
{
|
|
4240
|
-
onClick: () => setIsFilterMenuOpen(!isFilterMenuOpen),
|
|
4241
|
-
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"}`,
|
|
4242
|
-
title: "Adicionar filtros"
|
|
4243
|
-
},
|
|
4244
|
-
/* @__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" })),
|
|
4245
|
-
"Filters"
|
|
4246
|
-
), 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(
|
|
4247
|
-
"button",
|
|
4248
|
-
{
|
|
4249
|
-
key: opt,
|
|
4250
|
-
onClick: () => {
|
|
4251
|
-
setFilterCategory(opt);
|
|
4252
|
-
setFilterValue("");
|
|
4296
|
+
value: reshapeCenterNodeId,
|
|
4297
|
+
onChange: (val) => setReshapeCenterNodeId(val),
|
|
4298
|
+
options: [
|
|
4299
|
+
{ value: "", label: "Selecione um n\xF3..." },
|
|
4300
|
+
...(Array.isArray(dbNodes) ? dbNodes.filter((n) => isNodeInView(n.id)) : []).map((n) => ({
|
|
4301
|
+
value: n.id,
|
|
4302
|
+
label: n.name
|
|
4303
|
+
}))
|
|
4304
|
+
],
|
|
4305
|
+
placeholder: "Selecione um n\xF3..."
|
|
4306
|
+
}
|
|
4307
|
+
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4308
|
+
"button",
|
|
4309
|
+
{
|
|
4310
|
+
onClick: () => {
|
|
4311
|
+
setReshapeLayoutType("Star");
|
|
4312
|
+
setReshapeColumnCount(4);
|
|
4313
|
+
setReshapeCenterNodeId("");
|
|
4314
|
+
},
|
|
4315
|
+
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"
|
|
4253
4316
|
},
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4317
|
+
"Resetar"
|
|
4318
|
+
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4319
|
+
"button",
|
|
4320
|
+
{
|
|
4321
|
+
onClick: () => {
|
|
4322
|
+
onActivateReshapeLens({
|
|
4323
|
+
type: reshapeLayoutType,
|
|
4324
|
+
columns: reshapeColumnCount,
|
|
4325
|
+
centerNodeId: reshapeCenterNodeId
|
|
4326
|
+
});
|
|
4327
|
+
setActiveSubMenu(null);
|
|
4328
|
+
},
|
|
4329
|
+
disabled: reshapeLayoutType === "Star" && !reshapeCenterNodeId,
|
|
4330
|
+
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"
|
|
4266
4331
|
},
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
)))) : /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4332
|
+
"Aplicar Lente"
|
|
4333
|
+
)))),
|
|
4334
|
+
/* @__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" }))
|
|
4335
|
+
);
|
|
4336
|
+
};
|
|
4337
|
+
return /* @__PURE__ */ import_react3.default.createElement(
|
|
4338
|
+
"div",
|
|
4339
|
+
{
|
|
4340
|
+
ref: containerRef,
|
|
4341
|
+
className: "ui-overlay fixed left-0 top-0 h-[100dvh] flex items-stretch z-40 pointer-events-none",
|
|
4342
|
+
onPointerDown: swallow,
|
|
4343
|
+
onPointerMove: swallow,
|
|
4344
|
+
onPointerUp: swallow,
|
|
4345
|
+
onClick: swallow,
|
|
4346
|
+
onWheel: swallow,
|
|
4347
|
+
onContextMenu: swallow,
|
|
4348
|
+
onDoubleClick: swallow
|
|
4349
|
+
},
|
|
4350
|
+
/* @__PURE__ */ import_react3.default.createElement(
|
|
4287
4351
|
"div",
|
|
4288
4352
|
{
|
|
4289
|
-
className:
|
|
4290
|
-
|
|
4291
|
-
}
|
|
4292
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4293
|
-
"input",
|
|
4294
|
-
{
|
|
4295
|
-
type: "text",
|
|
4296
|
-
value: filterValue,
|
|
4297
|
-
onChange: (e) => setFilterValue(e.target.value),
|
|
4298
|
-
placeholder: "#RRGGBB",
|
|
4299
|
-
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",
|
|
4300
|
-
autoFocus: true
|
|
4301
|
-
}
|
|
4302
|
-
))), /* @__PURE__ */ import_react3.default.createElement(
|
|
4303
|
-
"button",
|
|
4304
|
-
{
|
|
4305
|
-
onClick: handleAddFilter,
|
|
4306
|
-
disabled: !filterValue.trim(),
|
|
4307
|
-
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"
|
|
4308
|
-
},
|
|
4309
|
-
"Aplicar Filtro"
|
|
4310
|
-
))), 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(
|
|
4311
|
-
"button",
|
|
4312
|
-
{
|
|
4313
|
-
onClick: onOpenImportModal,
|
|
4314
|
-
className: `${buttonBaseClass} mt-2`
|
|
4315
|
-
},
|
|
4316
|
-
/* @__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" })),
|
|
4317
|
-
"Importar arquivo"
|
|
4318
|
-
), /* @__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(
|
|
4319
|
-
"button",
|
|
4320
|
-
{
|
|
4321
|
-
onClick: () => setIsQuestLensMenuOpen(!isQuestLensMenuOpen),
|
|
4322
|
-
className: `${buttonBaseClass} ${isQuestLensMenuOpen || questFilterAssignee || questFilterStatus || questFilterMilestone ? "bg-indigo-500/30 border-indigo-400" : ""}`,
|
|
4323
|
-
title: "Abrir filtros da Lente de Quests"
|
|
4324
|
-
},
|
|
4325
|
-
/* @__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" })),
|
|
4326
|
-
"Quest Lens",
|
|
4327
|
-
(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" }, "!")
|
|
4328
|
-
), 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(
|
|
4329
|
-
"select",
|
|
4330
|
-
{
|
|
4331
|
-
value: questFilterAssignee,
|
|
4332
|
-
onChange: (e) => setQuestFilterAssignee(e.target.value),
|
|
4333
|
-
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"
|
|
4334
|
-
},
|
|
4335
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos os Respons\xE1veis"),
|
|
4336
|
-
viewMembers.map((m) => /* @__PURE__ */ import_react3.default.createElement("option", { key: m.id, value: m.id }, m.name || m.email))
|
|
4337
|
-
)), /* @__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(
|
|
4338
|
-
"select",
|
|
4339
|
-
{
|
|
4340
|
-
value: questFilterStatus,
|
|
4341
|
-
onChange: (e) => setQuestFilterStatus(e.target.value),
|
|
4342
|
-
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"
|
|
4353
|
+
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
|
|
4354
|
+
${activeSubMenu ? "-translate-x-full md:translate-x-0" : "translate-x-0"}`
|
|
4343
4355
|
},
|
|
4344
|
-
/* @__PURE__ */ import_react3.default.createElement("
|
|
4345
|
-
|
|
4346
|
-
|
|
4347
|
-
|
|
4348
|
-
|
|
4349
|
-
|
|
4350
|
-
"select",
|
|
4351
|
-
{
|
|
4352
|
-
value: questFilterMilestone,
|
|
4353
|
-
onChange: (e) => setQuestFilterMilestone(e.target.value),
|
|
4354
|
-
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"
|
|
4355
|
-
},
|
|
4356
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Todos os Milestones"),
|
|
4357
|
-
milestones.map((ms) => /* @__PURE__ */ import_react3.default.createElement("option", { key: ms.id, value: ms.id }, ms.name, " ", ms.status === "inactive" ? "(Inativo)" : ""))
|
|
4358
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-2 pt-1" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4359
|
-
"button",
|
|
4360
|
-
{
|
|
4361
|
-
onClick: () => {
|
|
4362
|
-
setQuestFilterAssignee("");
|
|
4363
|
-
setQuestFilterStatus("");
|
|
4364
|
-
setQuestFilterMilestone("");
|
|
4365
|
-
},
|
|
4366
|
-
className: "flex-1 py-2 bg-white/5 hover:bg-white/10 text-slate-300 text-[11px] font-medium rounded-lg transition-colors border border-white/5"
|
|
4367
|
-
},
|
|
4368
|
-
"Limpar"
|
|
4369
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4370
|
-
"button",
|
|
4371
|
-
{
|
|
4372
|
-
onClick: () => {
|
|
4373
|
-
onActivateQuestLens({
|
|
4374
|
-
assigneeId: questFilterAssignee,
|
|
4375
|
-
status: questFilterStatus,
|
|
4376
|
-
milestoneId: questFilterMilestone
|
|
4377
|
-
});
|
|
4378
|
-
setIsQuestLensMenuOpen(false);
|
|
4379
|
-
onToggle(false);
|
|
4356
|
+
/* @__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(
|
|
4357
|
+
"button",
|
|
4358
|
+
{
|
|
4359
|
+
className: "ml-auto p-2 rounded-full text-slate-500 hover:text-white hover:bg-white/10 transition-all duration-200",
|
|
4360
|
+
onClick: () => onToggle(false),
|
|
4361
|
+
title: "Fechar Painel"
|
|
4380
4362
|
},
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
|
|
4390
|
-
},
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
},
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4404
|
-
"input",
|
|
4405
|
-
{
|
|
4406
|
-
type: "number",
|
|
4407
|
-
min: "1",
|
|
4408
|
-
max: "12",
|
|
4409
|
-
value: reshapeColumnCount,
|
|
4410
|
-
onChange: (e) => setReshapeColumnCount(parseInt(e.target.value) || 4),
|
|
4411
|
-
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"
|
|
4412
|
-
}
|
|
4413
|
-
)), reshapeLayoutType === "Star" && /* @__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" }, "N\xF3 Central"), /* @__PURE__ */ import_react3.default.createElement(
|
|
4414
|
-
"select",
|
|
4415
|
-
{
|
|
4416
|
-
value: reshapeCenterNodeId,
|
|
4417
|
-
onChange: (e) => setReshapeCenterNodeId(e.target.value),
|
|
4418
|
-
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"
|
|
4419
|
-
},
|
|
4420
|
-
/* @__PURE__ */ import_react3.default.createElement("option", { value: "" }, "Selecione..."),
|
|
4421
|
-
(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))
|
|
4422
|
-
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-2 pt-1" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4423
|
-
"button",
|
|
4424
|
-
{
|
|
4425
|
-
onClick: () => {
|
|
4426
|
-
setReshapeLayoutType("Star");
|
|
4427
|
-
setReshapeColumnCount(4);
|
|
4428
|
-
setReshapeCenterNodeId("");
|
|
4363
|
+
/* @__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(
|
|
4364
|
+
"path",
|
|
4365
|
+
{
|
|
4366
|
+
fillRule: "evenodd",
|
|
4367
|
+
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",
|
|
4368
|
+
clipRule: "evenodd"
|
|
4369
|
+
}
|
|
4370
|
+
))
|
|
4371
|
+
), /* @__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" })),
|
|
4372
|
+
/* @__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: () => {
|
|
4373
|
+
var _a;
|
|
4374
|
+
return (_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
4375
|
+
} }, 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) => {
|
|
4376
|
+
e.stopPropagation();
|
|
4377
|
+
handleRemoveFilter(idx);
|
|
4378
|
+
}, 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: () => {
|
|
4379
|
+
setFilterCategory(opt);
|
|
4380
|
+
setFilterValue("");
|
|
4381
|
+
}, 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(
|
|
4382
|
+
"button",
|
|
4383
|
+
{
|
|
4384
|
+
onClick: () => setActiveSubMenu(activeSubMenu === "quest" ? null : "quest"),
|
|
4385
|
+
className: `${buttonBaseClass} lens-button ${activeSubMenu === "quest" || questFilterAssignee || questFilterStatus || questFilterMilestone ? "bg-indigo-500/30 border-indigo-400" : ""}`
|
|
4429
4386
|
},
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
"
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
|
|
4437
|
-
onActivateReshapeLens({
|
|
4438
|
-
type: reshapeLayoutType,
|
|
4439
|
-
columns: reshapeColumnCount,
|
|
4440
|
-
centerNodeId: reshapeCenterNodeId
|
|
4441
|
-
});
|
|
4442
|
-
setIsReshapeLensMenuOpen(false);
|
|
4443
|
-
onToggle(false);
|
|
4387
|
+
/* @__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" })),
|
|
4388
|
+
"Quest Lens"
|
|
4389
|
+
)), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
4390
|
+
"button",
|
|
4391
|
+
{
|
|
4392
|
+
onClick: () => setActiveSubMenu(activeSubMenu === "reshape" ? null : "reshape"),
|
|
4393
|
+
className: `${buttonBaseClass} lens-button ${activeSubMenu === "reshape" ? "bg-indigo-500/30 border-indigo-400" : ""}`
|
|
4444
4394
|
},
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
},
|
|
4448
|
-
"
|
|
4449
|
-
|
|
4450
|
-
"
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
},
|
|
4456
|
-
/* @__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" })),
|
|
4457
|
-
"Timeline"
|
|
4458
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4459
|
-
"button",
|
|
4460
|
-
{
|
|
4461
|
-
onClick: onOpenBoards,
|
|
4462
|
-
className: buttonBaseClass,
|
|
4463
|
-
title: "Abrir painel de Boards"
|
|
4464
|
-
},
|
|
4465
|
-
/* @__PURE__ */ import_react3.default.createElement(import_fi2.FiLayers, { size: 16 }),
|
|
4466
|
-
"Boards"
|
|
4467
|
-
)), /* @__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(
|
|
4468
|
-
"button",
|
|
4469
|
-
{
|
|
4470
|
-
onClick: onOpenMilestoneManager,
|
|
4471
|
-
className: buttonBaseClass,
|
|
4472
|
-
title: "Gerenciar os milestones deste cen\xE1rio"
|
|
4473
|
-
},
|
|
4474
|
-
/* @__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" })),
|
|
4475
|
-
"Gerenciar Milestones"
|
|
4476
|
-
))), /* @__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(
|
|
4477
|
-
"button",
|
|
4478
|
-
{
|
|
4479
|
-
onClick: handleSaveClick,
|
|
4480
|
-
disabled: isSaving,
|
|
4481
|
-
className: isSaving ? buttonDisabledClass : buttonBaseClass,
|
|
4482
|
-
title: "Salvar a visualiza\xE7\xE3o atual como o cen\xE1rio inicial"
|
|
4483
|
-
},
|
|
4484
|
-
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")
|
|
4485
|
-
), /* @__PURE__ */ import_react3.default.createElement(
|
|
4486
|
-
"button",
|
|
4487
|
-
{
|
|
4488
|
-
onClick: onNavigateBack,
|
|
4489
|
-
className: buttonBaseClass,
|
|
4490
|
-
title: "Voltar \xE0 p\xE1gina de cen\xE1rios"
|
|
4491
|
-
},
|
|
4492
|
-
/* @__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" })),
|
|
4493
|
-
"Voltar \xE0 p\xE1gina de cen\xE1rios"
|
|
4494
|
-
))), 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" }))
|
|
4395
|
+
/* @__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" })),
|
|
4396
|
+
"Reshape Lens"
|
|
4397
|
+
)), /* @__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"))),
|
|
4398
|
+
/* @__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"))),
|
|
4399
|
+
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),
|
|
4400
|
+
/* @__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" })
|
|
4401
|
+
),
|
|
4402
|
+
/* @__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
|
|
4403
|
+
${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"}
|
|
4404
|
+
` }, renderAnnexedPanel())
|
|
4495
4405
|
);
|
|
4496
4406
|
}
|
|
4497
4407
|
|