@lv-x-software-house/x_view 1.2.6-dev.52 → 1.2.6-dev.54

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.
Files changed (3) hide show
  1. package/dist/index.js +107 -46
  2. package/dist/index.mjs +107 -46
  3. 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,
@@ -4161,37 +4204,46 @@ function XViewSidebar({
4161
4204
  },
4162
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" }))
4163
4206
  )),
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",
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,
4166
4209
  {
4167
4210
  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",
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"
4217
+ }
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,
4175
4220
  {
4176
4221
  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",
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"
4231
+ }
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,
4187
4234
  {
4188
4235
  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(
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"
4245
+ }
4246
+ )), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ import_react3.default.createElement(
4195
4247
  "button",
4196
4248
  {
4197
4249
  onClick: () => {
@@ -4216,17 +4268,19 @@ function XViewSidebar({
4216
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"
4217
4269
  },
4218
4270
  "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",
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,
4221
4273
  {
4222
4274
  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(
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(
4230
4284
  "input",
4231
4285
  {
4232
4286
  type: "number",
@@ -4236,16 +4290,21 @@ function XViewSidebar({
4236
4290
  onChange: (e) => setReshapeColumnCount(parseInt(e.target.value) || 4),
4237
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"
4238
4292
  }
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",
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,
4241
4295
  {
4242
4296
  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(
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(
4249
4308
  "button",
4250
4309
  {
4251
4310
  onClick: () => {
@@ -14369,8 +14428,10 @@ function XViewScene({
14369
14428
  stateRef.current.nodeIdToParentFileMap = map;
14370
14429
  }, [isInitialized, sceneVersion]);
14371
14430
  const handleNavigateBack = (0, import_react31.useCallback)(() => {
14372
- router.push("/dashboard/scenes");
14373
- }, [router]);
14431
+ const type = viewParams == null ? void 0 : viewParams.type;
14432
+ const tab = type === "database" ? "datasets" : "views";
14433
+ router.push(`/dashboard/xview?tab=${tab}`);
14434
+ }, [router, viewParams]);
14374
14435
  const handleConfirmImport = (0, import_react31.useCallback)(
14375
14436
  async (importPayload) => {
14376
14437
  var _a2, _b2;
@@ -18701,7 +18762,7 @@ function XViewScene({
18701
18762
  )), /* @__PURE__ */ import_react31.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react31.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react31.default.createElement(
18702
18763
  "button",
18703
18764
  {
18704
- onClick: () => router.push("/dashboard/scenes"),
18765
+ onClick: handleNavigateBack,
18705
18766
  className: "flex items-center justify-center gap-2 w-full py-3 px-4 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium"
18706
18767
  },
18707
18768
  /* @__PURE__ */ import_react31.default.createElement(
@@ -18723,7 +18784,7 @@ function XViewScene({
18723
18784
  }
18724
18785
  )
18725
18786
  ),
18726
- "Voltar para Scenes"
18787
+ "Voltar para o X.View"
18727
18788
  )));
18728
18789
  }
18729
18790
  return /* @__PURE__ */ import_react31.default.createElement(
package/dist/index.mjs CHANGED
@@ -3830,6 +3830,49 @@ function ContextMenu({
3830
3830
  // src/components/XViewSidebar.jsx
3831
3831
  import React2, { useMemo as useMemo2, useState as useState3, useEffect as useEffect2, useRef as useRef2 } from "react";
3832
3832
  import { FiLayers } from "react-icons/fi";
3833
+ var CustomSelect = ({ value, onChange, options, placeholder }) => {
3834
+ const [isOpen, setIsOpen] = useState3(false);
3835
+ const selectRef = useRef2(null);
3836
+ useEffect2(() => {
3837
+ const handleClickOutside = (e) => {
3838
+ if (selectRef.current && !selectRef.current.contains(e.target)) {
3839
+ setIsOpen(false);
3840
+ }
3841
+ };
3842
+ if (isOpen) {
3843
+ document.addEventListener("mousedown", handleClickOutside);
3844
+ }
3845
+ return () => document.removeEventListener("mousedown", handleClickOutside);
3846
+ }, [isOpen]);
3847
+ const selectedOption = options.find((o) => String(o.value) === String(value));
3848
+ return /* @__PURE__ */ React2.createElement("div", { ref: selectRef, className: "relative w-full text-slate-200 text-sm" }, /* @__PURE__ */ React2.createElement(
3849
+ "button",
3850
+ {
3851
+ type: "button",
3852
+ onClick: () => setIsOpen(!isOpen),
3853
+ className: `w-full bg-slate-900/80 px-3 py-2.5 rounded-md border text-left transition-all flex items-center justify-between
3854
+ ${isOpen ? "border-indigo-500/50 bg-slate-800" : "border-white/10 hover:bg-slate-800"}`
3855
+ },
3856
+ /* @__PURE__ */ React2.createElement("span", { className: "truncate" }, selectedOption ? selectedOption.label : placeholder),
3857
+ /* @__PURE__ */ React2.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__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))
3858
+ ), isOpen && /* @__PURE__ */ React2.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) => {
3859
+ const isSelected = String(value) === String(opt.value);
3860
+ return /* @__PURE__ */ React2.createElement(
3861
+ "button",
3862
+ {
3863
+ key: idx,
3864
+ type: "button",
3865
+ onClick: () => {
3866
+ onChange(opt.value);
3867
+ setIsOpen(false);
3868
+ },
3869
+ className: `w-full text-left px-3 py-2.5 text-sm transition-colors
3870
+ ${isSelected ? "bg-indigo-600/30 text-indigo-200 font-medium" : "text-slate-300 hover:bg-white/10"}`
3871
+ },
3872
+ opt.label
3873
+ );
3874
+ })));
3875
+ };
3833
3876
  function XViewSidebar({
3834
3877
  dbNodes = [],
3835
3878
  isNodeInView = () => false,
@@ -4122,37 +4165,46 @@ function XViewSidebar({
4122
4165
  },
4123
4166
  /* @__PURE__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React2.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" }))
4124
4167
  )),
4125
- /* @__PURE__ */ React2.createElement("div", { className: "flex-1 overflow-y-auto p-4 space-y-6" }, activeSubMenu === "quest" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-6 animate-in fade-in slide-in-from-bottom-2 duration-500" }, /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Respons\xE1vel"), /* @__PURE__ */ React2.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ React2.createElement(
4126
- "select",
4168
+ /* @__PURE__ */ React2.createElement("div", { className: "flex-1 overflow-y-auto p-4 space-y-6" }, activeSubMenu === "quest" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-6 animate-in fade-in slide-in-from-bottom-2 duration-500" }, /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Respons\xE1vel"), /* @__PURE__ */ React2.createElement(
4169
+ CustomSelect,
4127
4170
  {
4128
4171
  value: questFilterAssignee,
4129
- onChange: (e) => setQuestFilterAssignee(e.target.value),
4130
- 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"
4131
- },
4132
- /* @__PURE__ */ React2.createElement("option", { value: "" }, "Todos os Respons\xE1veis"),
4133
- viewMembers.map((m) => /* @__PURE__ */ React2.createElement("option", { key: m.id, value: m.id }, m.name || m.email))
4134
- ), /* @__PURE__ */ React2.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__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Status"), /* @__PURE__ */ React2.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ React2.createElement(
4135
- "select",
4172
+ onChange: (val) => setQuestFilterAssignee(val),
4173
+ options: [
4174
+ { value: "", label: "Todos os Respons\xE1veis" },
4175
+ ...viewMembers.map((m) => ({ value: m.id, label: m.name || m.email }))
4176
+ ],
4177
+ placeholder: "Selecione um Respons\xE1vel"
4178
+ }
4179
+ )), /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Status"), /* @__PURE__ */ React2.createElement(
4180
+ CustomSelect,
4136
4181
  {
4137
4182
  value: questFilterStatus,
4138
- onChange: (e) => setQuestFilterStatus(e.target.value),
4139
- 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"
4140
- },
4141
- /* @__PURE__ */ React2.createElement("option", { value: "" }, "Todos (Exclui Done)"),
4142
- /* @__PURE__ */ React2.createElement("option", { value: "Backlog" }, "Backlog"),
4143
- /* @__PURE__ */ React2.createElement("option", { value: "In Progress" }, "In Progress"),
4144
- /* @__PURE__ */ React2.createElement("option", { value: "Review" }, "Review"),
4145
- /* @__PURE__ */ React2.createElement("option", { value: "Done" }, "Done")
4146
- ), /* @__PURE__ */ React2.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__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Milestone"), /* @__PURE__ */ React2.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ React2.createElement(
4147
- "select",
4183
+ onChange: (val) => setQuestFilterStatus(val),
4184
+ options: [
4185
+ { value: "", label: "Todos (Exclui Done)" },
4186
+ { value: "Backlog", label: "Backlog" },
4187
+ { value: "In Progress", label: "In Progress" },
4188
+ { value: "Review", label: "Review" },
4189
+ { value: "Done", label: "Done" }
4190
+ ],
4191
+ placeholder: "Selecione um Status"
4192
+ }
4193
+ )), /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Milestone"), /* @__PURE__ */ React2.createElement(
4194
+ CustomSelect,
4148
4195
  {
4149
4196
  value: questFilterMilestone,
4150
- onChange: (e) => setQuestFilterMilestone(e.target.value),
4151
- 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"
4152
- },
4153
- /* @__PURE__ */ React2.createElement("option", { value: "" }, "Todos os Milestones"),
4154
- milestones.map((ms) => /* @__PURE__ */ React2.createElement("option", { key: ms.id, value: ms.id }, ms.name, " ", ms.status === "inactive" ? "(Inativo)" : ""))
4155
- ), /* @__PURE__ */ React2.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__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ React2.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ React2.createElement(
4197
+ onChange: (val) => setQuestFilterMilestone(val),
4198
+ options: [
4199
+ { value: "", label: "Todos os Milestones" },
4200
+ ...milestones.map((ms) => ({
4201
+ value: ms.id,
4202
+ label: `${ms.name} ${ms.status === "inactive" ? "(Inativo)" : ""}`
4203
+ }))
4204
+ ],
4205
+ placeholder: "Todos os Milestones"
4206
+ }
4207
+ )), /* @__PURE__ */ React2.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ React2.createElement(
4156
4208
  "button",
4157
4209
  {
4158
4210
  onClick: () => {
@@ -4177,17 +4229,19 @@ function XViewSidebar({
4177
4229
  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"
4178
4230
  },
4179
4231
  "Aplicar Lente"
4180
- ))), activeSubMenu === "reshape" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-6 animate-in fade-in slide-in-from-bottom-2 duration-500" }, /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Layout Type"), /* @__PURE__ */ React2.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ React2.createElement(
4181
- "select",
4232
+ ))), activeSubMenu === "reshape" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-6 animate-in fade-in slide-in-from-bottom-2 duration-500" }, /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Layout Type"), /* @__PURE__ */ React2.createElement(
4233
+ CustomSelect,
4182
4234
  {
4183
4235
  value: reshapeLayoutType,
4184
- onChange: (e) => setReshapeLayoutType(e.target.value),
4185
- 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"
4186
- },
4187
- /* @__PURE__ */ React2.createElement("option", { value: "Star" }, "Star"),
4188
- /* @__PURE__ */ React2.createElement("option", { value: "Circle" }, "Circle"),
4189
- /* @__PURE__ */ React2.createElement("option", { value: "Column" }, "Column")
4190
- ), /* @__PURE__ */ React2.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__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), reshapeLayoutType === "Column" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Colunas"), /* @__PURE__ */ React2.createElement(
4236
+ onChange: (val) => setReshapeLayoutType(val),
4237
+ options: [
4238
+ { value: "Star", label: "Star" },
4239
+ { value: "Circle", label: "Circle" },
4240
+ { value: "Column", label: "Column" }
4241
+ ],
4242
+ placeholder: "Selecione um Formato"
4243
+ }
4244
+ )), reshapeLayoutType === "Column" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "Colunas"), /* @__PURE__ */ React2.createElement(
4191
4245
  "input",
4192
4246
  {
4193
4247
  type: "number",
@@ -4197,16 +4251,21 @@ function XViewSidebar({
4197
4251
  onChange: (e) => setReshapeColumnCount(parseInt(e.target.value) || 4),
4198
4252
  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"
4199
4253
  }
4200
- )), reshapeLayoutType === "Star" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "N\xF3 Central"), /* @__PURE__ */ React2.createElement("div", { className: "relative group/select" }, /* @__PURE__ */ React2.createElement(
4201
- "select",
4254
+ )), reshapeLayoutType === "Star" && /* @__PURE__ */ React2.createElement("div", { className: "space-y-2.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[11px] uppercase text-slate-400 font-semibold tracking-wider ml-1 mb-1 block" }, "N\xF3 Central"), /* @__PURE__ */ React2.createElement(
4255
+ CustomSelect,
4202
4256
  {
4203
4257
  value: reshapeCenterNodeId,
4204
- onChange: (e) => setReshapeCenterNodeId(e.target.value),
4205
- 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"
4206
- },
4207
- /* @__PURE__ */ React2.createElement("option", { value: "" }, "Selecione um n\xF3..."),
4208
- (Array.isArray(dbNodes) ? dbNodes.filter((n) => isNodeInView(n.id)) : []).map((n) => /* @__PURE__ */ React2.createElement("option", { key: n.id, value: n.id }, n.name))
4209
- ), /* @__PURE__ */ React2.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__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))))), /* @__PURE__ */ React2.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ React2.createElement(
4258
+ onChange: (val) => setReshapeCenterNodeId(val),
4259
+ options: [
4260
+ { value: "", label: "Selecione um n\xF3..." },
4261
+ ...(Array.isArray(dbNodes) ? dbNodes.filter((n) => isNodeInView(n.id)) : []).map((n) => ({
4262
+ value: n.id,
4263
+ label: n.name
4264
+ }))
4265
+ ],
4266
+ placeholder: "Selecione um n\xF3..."
4267
+ }
4268
+ )), /* @__PURE__ */ React2.createElement("div", { className: "flex gap-3 pt-4" }, /* @__PURE__ */ React2.createElement(
4210
4269
  "button",
4211
4270
  {
4212
4271
  onClick: () => {
@@ -14425,8 +14484,10 @@ function XViewScene({
14425
14484
  stateRef.current.nodeIdToParentFileMap = map;
14426
14485
  }, [isInitialized, sceneVersion]);
14427
14486
  const handleNavigateBack = useCallback6(() => {
14428
- router.push("/dashboard/scenes");
14429
- }, [router]);
14487
+ const type = viewParams == null ? void 0 : viewParams.type;
14488
+ const tab = type === "database" ? "datasets" : "views";
14489
+ router.push(`/dashboard/xview?tab=${tab}`);
14490
+ }, [router, viewParams]);
14430
14491
  const handleConfirmImport = useCallback6(
14431
14492
  async (importPayload) => {
14432
14493
  var _a2, _b2;
@@ -18757,7 +18818,7 @@ function XViewScene({
18757
18818
  )), /* @__PURE__ */ React30.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ React30.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ React30.createElement(
18758
18819
  "button",
18759
18820
  {
18760
- onClick: () => router.push("/dashboard/scenes"),
18821
+ onClick: handleNavigateBack,
18761
18822
  className: "flex items-center justify-center gap-2 w-full py-3 px-4 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium"
18762
18823
  },
18763
18824
  /* @__PURE__ */ React30.createElement(
@@ -18779,7 +18840,7 @@ function XViewScene({
18779
18840
  }
18780
18841
  )
18781
18842
  ),
18782
- "Voltar para Scenes"
18843
+ "Voltar para o X.View"
18783
18844
  )));
18784
18845
  }
18785
18846
  return /* @__PURE__ */ React30.createElement(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lv-x-software-house/x_view",
3
- "version": "1.2.6-dev.52",
3
+ "version": "1.2.6-dev.54",
4
4
  "description": "Pacote privado contendo os componentes e lógica de renderização 3D do X View.",
5
5
  "author": "iv.x - Engenharia de Software - ivxsoftwarehouse@gmail.com",
6
6
  "license": "UNLICENSED",