@lv-x-software-house/x_view 1.2.6-dev.66 → 1.2.6-dev.68

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 +101 -35
  2. package/dist/index.mjs +101 -35
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3968,6 +3968,8 @@ function XViewSidebar({
3968
3968
  onActivateReshapeLens = () => {
3969
3969
  },
3970
3970
  view_google_folder_id,
3971
+ view_google_folder_name,
3972
+ open_google_picker_action,
3971
3973
  onSaveConfig = () => {
3972
3974
  }
3973
3975
  }) {
@@ -3990,11 +3992,16 @@ function XViewSidebar({
3990
3992
  const [isTypeDropdownOpen, setIsTypeDropdownOpen] = (0, import_react3.useState)(false);
3991
3993
  const [highlightedTypeIndex, setHighlightedTypeIndex] = (0, import_react3.useState)(-1);
3992
3994
  const [folderId, setFolderId] = (0, import_react3.useState)(view_google_folder_id || "");
3995
+ const [folderName, setFolderName] = (0, import_react3.useState)(view_google_folder_name || "");
3996
+ const [isPickingGoogleFolder, setIsPickingGoogleFolder] = (0, import_react3.useState)(false);
3993
3997
  (0, import_react3.useEffect)(() => {
3994
3998
  if (view_google_folder_id !== void 0) {
3995
3999
  setFolderId(view_google_folder_id || "");
3996
4000
  }
3997
- }, [view_google_folder_id]);
4001
+ if (view_google_folder_name !== void 0) {
4002
+ setFolderName(view_google_folder_name || "");
4003
+ }
4004
+ }, [view_google_folder_id, view_google_folder_name]);
3998
4005
  const containerRef = (0, import_react3.useRef)(null);
3999
4006
  const inputRef = (0, import_react3.useRef)(null);
4000
4007
  const filterMenuRef = (0, import_react3.useRef)(null);
@@ -4700,20 +4707,45 @@ function XViewSidebar({
4700
4707
  className: buttonBaseClass
4701
4708
  },
4702
4709
  "Gerenciar Milestones"
4703
- )), userRole === "owner" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__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" }, "Google Drive"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react3.default.createElement("label", { className: "text-[10px] uppercase text-slate-500 font-bold tracking-tight" }, "Folder ID da View"), /* @__PURE__ */ import_react3.default.createElement(
4704
- "input",
4710
+ )), userRole === "owner" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__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" }, "Google Drive"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex items-center justify-between bg-slate-900/50 p-2 rounded-md border border-white/5" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex flex-col truncate" }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase font-bold" }, "Pasta Atual"), /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-xs text-indigo-200 truncate", title: folderId ? folderId : "Padr\xE3o do Criador" }, folderName ? folderName : folderId ? folderId : "Padr\xE3o do Criador")), folderId && /* @__PURE__ */ import_react3.default.createElement(
4711
+ "button",
4705
4712
  {
4706
- type: "text",
4707
- value: folderId,
4708
- onChange: (e) => setFolderId(e.target.value),
4709
- onBlur: () => {
4710
- if (folderId !== view_google_folder_id) {
4711
- onSaveConfig({ view_google_folder_id: folderId });
4713
+ title: "Remover v\xEDnculo da pasta",
4714
+ onClick: () => {
4715
+ setFolderId("");
4716
+ setFolderName("");
4717
+ onSaveConfig({ view_google_folder_id: "", view_google_folder_name: "" });
4718
+ },
4719
+ className: "p-1 hover:bg-red-500/20 text-slate-400 hover:text-red-400 rounded transition-colors"
4720
+ },
4721
+ /* @__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" }))
4722
+ )), /* @__PURE__ */ import_react3.default.createElement(
4723
+ "button",
4724
+ {
4725
+ onClick: async () => {
4726
+ if (!open_google_picker_action) return;
4727
+ setIsPickingGoogleFolder(true);
4728
+ try {
4729
+ const result = await open_google_picker_action();
4730
+ if (result && result.folderId) {
4731
+ setFolderId(result.folderId);
4732
+ setFolderName(result.folderName || "");
4733
+ onSaveConfig({
4734
+ view_google_folder_id: result.folderId,
4735
+ view_google_folder_name: result.folderName || ""
4736
+ });
4737
+ }
4738
+ } catch (e) {
4739
+ console.error("Erro ao selecionar pasta Google Drive", e);
4740
+ alert("Erro ao abrir Picker. Verifique o console.");
4741
+ } finally {
4742
+ setIsPickingGoogleFolder(false);
4712
4743
  }
4713
4744
  },
4714
- placeholder: "ID da pasta no Drive",
4715
- className: "w-full bg-slate-900/80 px-3 py-2 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"
4716
- }
4745
+ disabled: isPickingGoogleFolder,
4746
+ className: "w-full px-3 py-2 rounded-md bg-indigo-600/20 hover:bg-indigo-600/40 border border-indigo-500/50 text-xs text-indigo-100 transition-colors flex items-center justify-center gap-2 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed"
4747
+ },
4748
+ isPickingGoogleFolder ? /* @__PURE__ */ import_react3.default.createElement("svg", { className: "animate-spin h-4 w-4 text-white", 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" })) : "Selecionar Pasta no Drive"
4717
4749
  ), /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-[9px] text-slate-500 italic" }, "Documentos criados nesta View ser\xE3o salvos nesta pasta."))))),
4718
4750
  /* @__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(
4719
4751
  "button",
@@ -14896,6 +14928,18 @@ function MilestoneManager({
14896
14928
  // src/XViewScene.jsx
14897
14929
  var import_short_uuid2 = __toESM(require("short-uuid"));
14898
14930
  var secretKey = process.env.NEXT_PUBLIC_CRYPTO_KEY;
14931
+ var encryptData = (data) => {
14932
+ try {
14933
+ const encrypted = import_crypto_js.default.AES.encrypt(
14934
+ JSON.stringify(data),
14935
+ secretKey
14936
+ ).toString().replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
14937
+ return encrypted;
14938
+ } catch (error) {
14939
+ console.error("Falha ao encriptar os dados:", error);
14940
+ return null;
14941
+ }
14942
+ };
14899
14943
  var decryptData = (encryptedText) => {
14900
14944
  try {
14901
14945
  let base64Text = encryptedText.replace(/-/g, "+").replace(/_/g, "/");
@@ -14973,9 +15017,10 @@ function XViewScene({
14973
15017
  delete_file_action,
14974
15018
  check_user_permission,
14975
15019
  get_view_members,
14976
- create_google_doc_action
15020
+ create_google_doc_action,
15021
+ open_google_picker_action
14977
15022
  }) {
14978
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
15023
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
14979
15024
  const { data: session, status } = (0, import_react33.useSession)();
14980
15025
  const router = (0, import_navigation.useRouter)();
14981
15026
  const searchParams = (0, import_navigation.useSearchParams)();
@@ -15225,7 +15270,14 @@ function XViewScene({
15225
15270
  const handleNavigateBack = (0, import_react32.useCallback)(() => {
15226
15271
  const type = viewParams == null ? void 0 : viewParams.type;
15227
15272
  const tab = type === "database" ? "datasets" : "views";
15228
- router.push(`/dashboard/xview?tab=${tab}`);
15273
+ const targetUrl = `/dashboard/xview?tab=${tab}`;
15274
+ console.log("X-View: Navegando para o Dashboard", { type, tab, targetUrl });
15275
+ try {
15276
+ router.push(targetUrl);
15277
+ } catch (e) {
15278
+ console.warn("X-View: router.push falhou, tentando window.location", e);
15279
+ window.location.href = targetUrl;
15280
+ }
15229
15281
  }, [router, viewParams]);
15230
15282
  const handleConfirmImport = (0, import_react32.useCallback)(
15231
15283
  async (importPayload) => {
@@ -15362,12 +15414,25 @@ function XViewScene({
15362
15414
  sceneDataRef.current = updatedData;
15363
15415
  try {
15364
15416
  await save_view_data(sceneSaveUrl, updatedData);
15417
+ if (viewParams) {
15418
+ const newDataToEncrypt = {
15419
+ ...viewParams,
15420
+ ...newConfig
15421
+ };
15422
+ const newEncrypted = encryptData(newDataToEncrypt);
15423
+ if (newEncrypted) {
15424
+ const currentUrl = window.location.pathname;
15425
+ const newUrl = currentUrl.replace(encryptedConfig, newEncrypted);
15426
+ window.history.replaceState(null, "", newUrl);
15427
+ console.log("X-View Config: URL atualizada para persist\xEAncia.");
15428
+ }
15429
+ }
15365
15430
  setSceneVersion((v) => v + 1);
15366
15431
  } catch (error) {
15367
15432
  console.error("Erro ao salvar configura\xE7\xE3o da View:", error);
15368
15433
  }
15369
15434
  },
15370
- [save_view_data, sceneSaveUrl]
15435
+ [save_view_data, sceneSaveUrl, viewParams, encryptedConfig]
15371
15436
  );
15372
15437
  const handleOpenImageViewer = (images, startIndex) => {
15373
15438
  setImageViewer({ visible: true, images, startIndex });
@@ -19672,15 +19737,16 @@ function XViewScene({
19672
19737
  onOpenBoards: handleOpenBoards,
19673
19738
  viewType: viewParams == null ? void 0 : viewParams.type,
19674
19739
  viewName: viewParams == null ? void 0 : viewParams.name,
19675
- onNavigateBack: handleNavigateBack,
19740
+ milestones: (viewParams == null ? void 0 : viewParams.milestones) || [],
19741
+ onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true),
19742
+ view_google_folder_id: viewParams == null ? void 0 : viewParams.view_google_folder_id,
19743
+ view_google_folder_name: viewParams == null ? void 0 : viewParams.view_google_folder_name,
19744
+ open_google_picker_action,
19745
+ onSaveConfig: handleSaveConfig,
19676
19746
  isOpen: isSidebarOpen,
19677
19747
  onToggle: setIsSidebarOpen,
19678
19748
  userRole: userPermissionRole,
19679
- viewMembers,
19680
- milestones: ((_c = sceneDataRef.current) == null ? void 0 : _c.milestones) || [],
19681
- onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true),
19682
- view_google_folder_id: (_d = sceneDataRef.current) == null ? void 0 : _d.view_google_folder_id,
19683
- onSaveConfig: handleSaveConfig
19749
+ viewMembers
19684
19750
  }
19685
19751
  ),
19686
19752
  creationMode.isActive && /* @__PURE__ */ import_react32.default.createElement(
@@ -19704,8 +19770,8 @@ function XViewScene({
19704
19770
  },
19705
19771
  refEl: formRef,
19706
19772
  existingTypes: existingNodeTypes,
19707
- initialColor: (_e = creationMode.sourceNodeData) == null ? void 0 : _e.color,
19708
- sourceTypes: (_f = creationMode.sourceNodeData) == null ? void 0 : _f.type,
19773
+ initialColor: (_c = creationMode.sourceNodeData) == null ? void 0 : _c.color,
19774
+ sourceTypes: (_d = creationMode.sourceNodeData) == null ? void 0 : _d.type,
19709
19775
  onIntensityChange: handleGhostNodeIntensityChange,
19710
19776
  onUploadFile: upload_file_action,
19711
19777
  availableDatasets,
@@ -19714,7 +19780,7 @@ function XViewScene({
19714
19780
  availableNodes: allAvailableNodes,
19715
19781
  availableAncestries: allAvailableAncestries,
19716
19782
  create_google_doc_action,
19717
- view_google_folder_id: (_g = sceneDataRef.current) == null ? void 0 : _g.view_google_folder_id
19783
+ view_google_folder_id: (_e = sceneDataRef.current) == null ? void 0 : _e.view_google_folder_id
19718
19784
  }
19719
19785
  ),
19720
19786
  versionMode.isActive && /* @__PURE__ */ import_react32.default.createElement(
@@ -19736,8 +19802,8 @@ function XViewScene({
19736
19802
  transition: "opacity 200ms ease-out"
19737
19803
  },
19738
19804
  refEl: formRef,
19739
- fixedType: (_h = versionMode.sourceNodeData) == null ? void 0 : _h.type,
19740
- fixedColor: (_i = versionMode.sourceNodeData) == null ? void 0 : _i.color,
19805
+ fixedType: (_f = versionMode.sourceNodeData) == null ? void 0 : _f.type,
19806
+ fixedColor: (_g = versionMode.sourceNodeData) == null ? void 0 : _g.color,
19741
19807
  onUploadFile: upload_file_action,
19742
19808
  availableNodes: allAvailableNodes,
19743
19809
  availableAncestries: allAvailableAncestries
@@ -19765,12 +19831,12 @@ function XViewScene({
19765
19831
  availableNodes: allAvailableNodes,
19766
19832
  availableAncestries: allAvailableAncestries,
19767
19833
  viewName: viewParams == null ? void 0 : viewParams.name,
19768
- questCounter: ((_j = sceneDataRef.current) == null ? void 0 : _j.quest_counter) || 1,
19834
+ questCounter: ((_h = sceneDataRef.current) == null ? void 0 : _h.quest_counter) || 1,
19769
19835
  viewMembers,
19770
- milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
19836
+ milestones: ((_i = sceneDataRef.current) == null ? void 0 : _i.milestones) || [],
19771
19837
  onUpdateMilestones: handleUpdateMilestones,
19772
19838
  create_google_doc_action,
19773
- view_google_folder_id: (_l = sceneDataRef.current) == null ? void 0 : _l.view_google_folder_id
19839
+ view_google_folder_id: (_j = sceneDataRef.current) == null ? void 0 : _j.view_google_folder_id
19774
19840
  }
19775
19841
  ),
19776
19842
  readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react32.default.createElement(
@@ -19904,10 +19970,10 @@ function XViewScene({
19904
19970
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
19905
19971
  viewMembers,
19906
19972
  currentUser: session == null ? void 0 : session.user,
19907
- milestones: ((_m = sceneDataRef.current) == null ? void 0 : _m.milestones) || [],
19973
+ milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
19908
19974
  onUpdateMilestones: handleUpdateMilestones,
19909
19975
  create_google_doc_action,
19910
- view_google_folder_id: (_n = sceneDataRef.current) == null ? void 0 : _n.view_google_folder_id
19976
+ view_google_folder_id: (_l = sceneDataRef.current) == null ? void 0 : _l.view_google_folder_id
19911
19977
  }
19912
19978
  ),
19913
19979
  detailsNode && !detailsNode.is_quest && /* @__PURE__ */ import_react32.default.createElement(
@@ -19941,7 +20007,7 @@ function XViewScene({
19941
20007
  userRole: userPermissionRole,
19942
20008
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
19943
20009
  create_google_doc_action,
19944
- view_google_folder_id: (_o = sceneDataRef.current) == null ? void 0 : _o.view_google_folder_id
20010
+ view_google_folder_id: (_m = sceneDataRef.current) == null ? void 0 : _m.view_google_folder_id
19945
20011
  }
19946
20012
  ),
19947
20013
  detailsLink && /* @__PURE__ */ import_react32.default.createElement(
@@ -20099,7 +20165,7 @@ function XViewScene({
20099
20165
  {
20100
20166
  isOpen: isMilestoneManagerOpen,
20101
20167
  onClose: () => setIsMilestoneManagerOpen(false),
20102
- milestones: ((_p = sceneDataRef.current) == null ? void 0 : _p.milestones) || [],
20168
+ milestones: ((_n = sceneDataRef.current) == null ? void 0 : _n.milestones) || [],
20103
20169
  onUpdateMilestones: handleUpdateMilestones
20104
20170
  }
20105
20171
  ),
@@ -20110,7 +20176,7 @@ function XViewScene({
20110
20176
  onClose: () => setIsImportModalOpen(false),
20111
20177
  onConfirm: handleConfirmImport,
20112
20178
  session,
20113
- parentDbs: ((_q = sceneDataRef.current) == null ? void 0 : _q.parent_dbs) || [],
20179
+ parentDbs: ((_o = sceneDataRef.current) == null ? void 0 : _o.parent_dbs) || [],
20114
20180
  onFetchAvailableFiles: import_parent_file_modal_get,
20115
20181
  currentViewName: viewParams == null ? void 0 : viewParams.name,
20116
20182
  currentAncestries: ancestryDataRef.current || []
package/dist/index.mjs CHANGED
@@ -3929,6 +3929,8 @@ function XViewSidebar({
3929
3929
  onActivateReshapeLens = () => {
3930
3930
  },
3931
3931
  view_google_folder_id,
3932
+ view_google_folder_name,
3933
+ open_google_picker_action,
3932
3934
  onSaveConfig = () => {
3933
3935
  }
3934
3936
  }) {
@@ -3951,11 +3953,16 @@ function XViewSidebar({
3951
3953
  const [isTypeDropdownOpen, setIsTypeDropdownOpen] = useState3(false);
3952
3954
  const [highlightedTypeIndex, setHighlightedTypeIndex] = useState3(-1);
3953
3955
  const [folderId, setFolderId] = useState3(view_google_folder_id || "");
3956
+ const [folderName, setFolderName] = useState3(view_google_folder_name || "");
3957
+ const [isPickingGoogleFolder, setIsPickingGoogleFolder] = useState3(false);
3954
3958
  useEffect2(() => {
3955
3959
  if (view_google_folder_id !== void 0) {
3956
3960
  setFolderId(view_google_folder_id || "");
3957
3961
  }
3958
- }, [view_google_folder_id]);
3962
+ if (view_google_folder_name !== void 0) {
3963
+ setFolderName(view_google_folder_name || "");
3964
+ }
3965
+ }, [view_google_folder_id, view_google_folder_name]);
3959
3966
  const containerRef = useRef2(null);
3960
3967
  const inputRef = useRef2(null);
3961
3968
  const filterMenuRef = useRef2(null);
@@ -4661,20 +4668,45 @@ function XViewSidebar({
4661
4668
  className: buttonBaseClass
4662
4669
  },
4663
4670
  "Gerenciar Milestones"
4664
- )), userRole === "owner" && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ React2.createElement("section", { className: "space-y-3" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Google Drive"), /* @__PURE__ */ React2.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[10px] uppercase text-slate-500 font-bold tracking-tight" }, "Folder ID da View"), /* @__PURE__ */ React2.createElement(
4665
- "input",
4671
+ )), userRole === "owner" && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("div", { className: "h-px bg-white/10" }), /* @__PURE__ */ React2.createElement("section", { className: "space-y-3" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Google Drive"), /* @__PURE__ */ React2.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React2.createElement("div", { className: "flex items-center justify-between bg-slate-900/50 p-2 rounded-md border border-white/5" }, /* @__PURE__ */ React2.createElement("div", { className: "flex flex-col truncate" }, /* @__PURE__ */ React2.createElement("span", { className: "text-[10px] text-slate-500 uppercase font-bold" }, "Pasta Atual"), /* @__PURE__ */ React2.createElement("span", { className: "text-xs text-indigo-200 truncate", title: folderId ? folderId : "Padr\xE3o do Criador" }, folderName ? folderName : folderId ? folderId : "Padr\xE3o do Criador")), folderId && /* @__PURE__ */ React2.createElement(
4672
+ "button",
4666
4673
  {
4667
- type: "text",
4668
- value: folderId,
4669
- onChange: (e) => setFolderId(e.target.value),
4670
- onBlur: () => {
4671
- if (folderId !== view_google_folder_id) {
4672
- onSaveConfig({ view_google_folder_id: folderId });
4674
+ title: "Remover v\xEDnculo da pasta",
4675
+ onClick: () => {
4676
+ setFolderId("");
4677
+ setFolderName("");
4678
+ onSaveConfig({ view_google_folder_id: "", view_google_folder_name: "" });
4679
+ },
4680
+ className: "p-1 hover:bg-red-500/20 text-slate-400 hover:text-red-400 rounded transition-colors"
4681
+ },
4682
+ /* @__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" }))
4683
+ )), /* @__PURE__ */ React2.createElement(
4684
+ "button",
4685
+ {
4686
+ onClick: async () => {
4687
+ if (!open_google_picker_action) return;
4688
+ setIsPickingGoogleFolder(true);
4689
+ try {
4690
+ const result = await open_google_picker_action();
4691
+ if (result && result.folderId) {
4692
+ setFolderId(result.folderId);
4693
+ setFolderName(result.folderName || "");
4694
+ onSaveConfig({
4695
+ view_google_folder_id: result.folderId,
4696
+ view_google_folder_name: result.folderName || ""
4697
+ });
4698
+ }
4699
+ } catch (e) {
4700
+ console.error("Erro ao selecionar pasta Google Drive", e);
4701
+ alert("Erro ao abrir Picker. Verifique o console.");
4702
+ } finally {
4703
+ setIsPickingGoogleFolder(false);
4673
4704
  }
4674
4705
  },
4675
- placeholder: "ID da pasta no Drive",
4676
- className: "w-full bg-slate-900/80 px-3 py-2 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"
4677
- }
4706
+ disabled: isPickingGoogleFolder,
4707
+ className: "w-full px-3 py-2 rounded-md bg-indigo-600/20 hover:bg-indigo-600/40 border border-indigo-500/50 text-xs text-indigo-100 transition-colors flex items-center justify-center gap-2 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed"
4708
+ },
4709
+ isPickingGoogleFolder ? /* @__PURE__ */ React2.createElement("svg", { className: "animate-spin h-4 w-4 text-white", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ React2.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ React2.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" })) : "Selecionar Pasta no Drive"
4678
4710
  ), /* @__PURE__ */ React2.createElement("p", { className: "text-[9px] text-slate-500 italic" }, "Documentos criados nesta View ser\xE3o salvos nesta pasta."))))),
4679
4711
  /* @__PURE__ */ React2.createElement("div", { className: "px-4 py-3 border-t border-white/10 bg-slate-900/30" }, /* @__PURE__ */ React2.createElement("section", { className: "space-y-2" }, /* @__PURE__ */ React2.createElement("p", { className: "text-[11px] uppercase tracking-wider text-slate-400" }, "Navega\xE7\xE3o"), ability.can("update", "Scene") && /* @__PURE__ */ React2.createElement(
4680
4712
  "button",
@@ -14953,6 +14985,18 @@ function MilestoneManager({
14953
14985
  // src/XViewScene.jsx
14954
14986
  import short2 from "short-uuid";
14955
14987
  var secretKey = process.env.NEXT_PUBLIC_CRYPTO_KEY;
14988
+ var encryptData = (data) => {
14989
+ try {
14990
+ const encrypted = CryptoJS.AES.encrypt(
14991
+ JSON.stringify(data),
14992
+ secretKey
14993
+ ).toString().replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
14994
+ return encrypted;
14995
+ } catch (error) {
14996
+ console.error("Falha ao encriptar os dados:", error);
14997
+ return null;
14998
+ }
14999
+ };
14956
15000
  var decryptData = (encryptedText) => {
14957
15001
  try {
14958
15002
  let base64Text = encryptedText.replace(/-/g, "+").replace(/_/g, "/");
@@ -15030,9 +15074,10 @@ function XViewScene({
15030
15074
  delete_file_action,
15031
15075
  check_user_permission,
15032
15076
  get_view_members,
15033
- create_google_doc_action
15077
+ create_google_doc_action,
15078
+ open_google_picker_action
15034
15079
  }) {
15035
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
15080
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
15036
15081
  const { data: session, status } = useSession();
15037
15082
  const router = useRouter();
15038
15083
  const searchParams = useSearchParams();
@@ -15282,7 +15327,14 @@ function XViewScene({
15282
15327
  const handleNavigateBack = useCallback6(() => {
15283
15328
  const type = viewParams == null ? void 0 : viewParams.type;
15284
15329
  const tab = type === "database" ? "datasets" : "views";
15285
- router.push(`/dashboard/xview?tab=${tab}`);
15330
+ const targetUrl = `/dashboard/xview?tab=${tab}`;
15331
+ console.log("X-View: Navegando para o Dashboard", { type, tab, targetUrl });
15332
+ try {
15333
+ router.push(targetUrl);
15334
+ } catch (e) {
15335
+ console.warn("X-View: router.push falhou, tentando window.location", e);
15336
+ window.location.href = targetUrl;
15337
+ }
15286
15338
  }, [router, viewParams]);
15287
15339
  const handleConfirmImport = useCallback6(
15288
15340
  async (importPayload) => {
@@ -15419,12 +15471,25 @@ function XViewScene({
15419
15471
  sceneDataRef.current = updatedData;
15420
15472
  try {
15421
15473
  await save_view_data(sceneSaveUrl, updatedData);
15474
+ if (viewParams) {
15475
+ const newDataToEncrypt = {
15476
+ ...viewParams,
15477
+ ...newConfig
15478
+ };
15479
+ const newEncrypted = encryptData(newDataToEncrypt);
15480
+ if (newEncrypted) {
15481
+ const currentUrl = window.location.pathname;
15482
+ const newUrl = currentUrl.replace(encryptedConfig, newEncrypted);
15483
+ window.history.replaceState(null, "", newUrl);
15484
+ console.log("X-View Config: URL atualizada para persist\xEAncia.");
15485
+ }
15486
+ }
15422
15487
  setSceneVersion((v) => v + 1);
15423
15488
  } catch (error) {
15424
15489
  console.error("Erro ao salvar configura\xE7\xE3o da View:", error);
15425
15490
  }
15426
15491
  },
15427
- [save_view_data, sceneSaveUrl]
15492
+ [save_view_data, sceneSaveUrl, viewParams, encryptedConfig]
15428
15493
  );
15429
15494
  const handleOpenImageViewer = (images, startIndex) => {
15430
15495
  setImageViewer({ visible: true, images, startIndex });
@@ -19729,15 +19794,16 @@ function XViewScene({
19729
19794
  onOpenBoards: handleOpenBoards,
19730
19795
  viewType: viewParams == null ? void 0 : viewParams.type,
19731
19796
  viewName: viewParams == null ? void 0 : viewParams.name,
19732
- onNavigateBack: handleNavigateBack,
19797
+ milestones: (viewParams == null ? void 0 : viewParams.milestones) || [],
19798
+ onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true),
19799
+ view_google_folder_id: viewParams == null ? void 0 : viewParams.view_google_folder_id,
19800
+ view_google_folder_name: viewParams == null ? void 0 : viewParams.view_google_folder_name,
19801
+ open_google_picker_action,
19802
+ onSaveConfig: handleSaveConfig,
19733
19803
  isOpen: isSidebarOpen,
19734
19804
  onToggle: setIsSidebarOpen,
19735
19805
  userRole: userPermissionRole,
19736
- viewMembers,
19737
- milestones: ((_c = sceneDataRef.current) == null ? void 0 : _c.milestones) || [],
19738
- onOpenMilestoneManager: () => setIsMilestoneManagerOpen(true),
19739
- view_google_folder_id: (_d = sceneDataRef.current) == null ? void 0 : _d.view_google_folder_id,
19740
- onSaveConfig: handleSaveConfig
19806
+ viewMembers
19741
19807
  }
19742
19808
  ),
19743
19809
  creationMode.isActive && /* @__PURE__ */ React31.createElement(
@@ -19761,8 +19827,8 @@ function XViewScene({
19761
19827
  },
19762
19828
  refEl: formRef,
19763
19829
  existingTypes: existingNodeTypes,
19764
- initialColor: (_e = creationMode.sourceNodeData) == null ? void 0 : _e.color,
19765
- sourceTypes: (_f = creationMode.sourceNodeData) == null ? void 0 : _f.type,
19830
+ initialColor: (_c = creationMode.sourceNodeData) == null ? void 0 : _c.color,
19831
+ sourceTypes: (_d = creationMode.sourceNodeData) == null ? void 0 : _d.type,
19766
19832
  onIntensityChange: handleGhostNodeIntensityChange,
19767
19833
  onUploadFile: upload_file_action,
19768
19834
  availableDatasets,
@@ -19771,7 +19837,7 @@ function XViewScene({
19771
19837
  availableNodes: allAvailableNodes,
19772
19838
  availableAncestries: allAvailableAncestries,
19773
19839
  create_google_doc_action,
19774
- view_google_folder_id: (_g = sceneDataRef.current) == null ? void 0 : _g.view_google_folder_id
19840
+ view_google_folder_id: (_e = sceneDataRef.current) == null ? void 0 : _e.view_google_folder_id
19775
19841
  }
19776
19842
  ),
19777
19843
  versionMode.isActive && /* @__PURE__ */ React31.createElement(
@@ -19793,8 +19859,8 @@ function XViewScene({
19793
19859
  transition: "opacity 200ms ease-out"
19794
19860
  },
19795
19861
  refEl: formRef,
19796
- fixedType: (_h = versionMode.sourceNodeData) == null ? void 0 : _h.type,
19797
- fixedColor: (_i = versionMode.sourceNodeData) == null ? void 0 : _i.color,
19862
+ fixedType: (_f = versionMode.sourceNodeData) == null ? void 0 : _f.type,
19863
+ fixedColor: (_g = versionMode.sourceNodeData) == null ? void 0 : _g.color,
19798
19864
  onUploadFile: upload_file_action,
19799
19865
  availableNodes: allAvailableNodes,
19800
19866
  availableAncestries: allAvailableAncestries
@@ -19822,12 +19888,12 @@ function XViewScene({
19822
19888
  availableNodes: allAvailableNodes,
19823
19889
  availableAncestries: allAvailableAncestries,
19824
19890
  viewName: viewParams == null ? void 0 : viewParams.name,
19825
- questCounter: ((_j = sceneDataRef.current) == null ? void 0 : _j.quest_counter) || 1,
19891
+ questCounter: ((_h = sceneDataRef.current) == null ? void 0 : _h.quest_counter) || 1,
19826
19892
  viewMembers,
19827
- milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
19893
+ milestones: ((_i = sceneDataRef.current) == null ? void 0 : _i.milestones) || [],
19828
19894
  onUpdateMilestones: handleUpdateMilestones,
19829
19895
  create_google_doc_action,
19830
- view_google_folder_id: (_l = sceneDataRef.current) == null ? void 0 : _l.view_google_folder_id
19896
+ view_google_folder_id: (_j = sceneDataRef.current) == null ? void 0 : _j.view_google_folder_id
19831
19897
  }
19832
19898
  ),
19833
19899
  readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React31.createElement(
@@ -19961,10 +20027,10 @@ function XViewScene({
19961
20027
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
19962
20028
  viewMembers,
19963
20029
  currentUser: session == null ? void 0 : session.user,
19964
- milestones: ((_m = sceneDataRef.current) == null ? void 0 : _m.milestones) || [],
20030
+ milestones: ((_k = sceneDataRef.current) == null ? void 0 : _k.milestones) || [],
19965
20031
  onUpdateMilestones: handleUpdateMilestones,
19966
20032
  create_google_doc_action,
19967
- view_google_folder_id: (_n = sceneDataRef.current) == null ? void 0 : _n.view_google_folder_id
20033
+ view_google_folder_id: (_l = sceneDataRef.current) == null ? void 0 : _l.view_google_folder_id
19968
20034
  }
19969
20035
  ),
19970
20036
  detailsNode && !detailsNode.is_quest && /* @__PURE__ */ React31.createElement(
@@ -19998,7 +20064,7 @@ function XViewScene({
19998
20064
  userRole: userPermissionRole,
19999
20065
  currentDatasetName: detailsNodeDatasetInfo == null ? void 0 : detailsNodeDatasetInfo.datasetName,
20000
20066
  create_google_doc_action,
20001
- view_google_folder_id: (_o = sceneDataRef.current) == null ? void 0 : _o.view_google_folder_id
20067
+ view_google_folder_id: (_m = sceneDataRef.current) == null ? void 0 : _m.view_google_folder_id
20002
20068
  }
20003
20069
  ),
20004
20070
  detailsLink && /* @__PURE__ */ React31.createElement(
@@ -20156,7 +20222,7 @@ function XViewScene({
20156
20222
  {
20157
20223
  isOpen: isMilestoneManagerOpen,
20158
20224
  onClose: () => setIsMilestoneManagerOpen(false),
20159
- milestones: ((_p = sceneDataRef.current) == null ? void 0 : _p.milestones) || [],
20225
+ milestones: ((_n = sceneDataRef.current) == null ? void 0 : _n.milestones) || [],
20160
20226
  onUpdateMilestones: handleUpdateMilestones
20161
20227
  }
20162
20228
  ),
@@ -20167,7 +20233,7 @@ function XViewScene({
20167
20233
  onClose: () => setIsImportModalOpen(false),
20168
20234
  onConfirm: handleConfirmImport,
20169
20235
  session,
20170
- parentDbs: ((_q = sceneDataRef.current) == null ? void 0 : _q.parent_dbs) || [],
20236
+ parentDbs: ((_o = sceneDataRef.current) == null ? void 0 : _o.parent_dbs) || [],
20171
20237
  onFetchAvailableFiles: import_parent_file_modal_get,
20172
20238
  currentViewName: viewParams == null ? void 0 : viewParams.name,
20173
20239
  currentAncestries: ancestryDataRef.current || []
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.66",
3
+ "version": "1.2.6-dev.68",
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",