@lv-x-software-house/x_view 1.2.8-dev.10 → 1.2.8-dev.12

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 CHANGED
@@ -9005,6 +9005,7 @@ function CreateQuestTreePanel({
9005
9005
  const [isSaving, setIsSaving] = (0, import_react12.useState)(false);
9006
9006
  const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react12.useState)(false);
9007
9007
  const [activeTab, setActiveTab] = (0, import_react12.useState)("tree");
9008
+ const isInitialLoad = (0, import_react12.useRef)(true);
9008
9009
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
9009
9010
  const { width: panelWidth, isResizing, handlePointerDown: handleResize } = useResizablePanel({
9010
9011
  initialWidth: 440,
@@ -9038,10 +9039,11 @@ function CreateQuestTreePanel({
9038
9039
  const indexToRemove = pathToRemove[pathToRemove.length - 1];
9039
9040
  if (currentParent.children && currentParent.children.length > indexToRemove) {
9040
9041
  currentParent.children.splice(indexToRemove, 1);
9041
- setHasUnsavedChanges(true);
9042
+ return { ...prev, [treeKey]: newTree };
9042
9043
  }
9043
- return { ...prev, [treeKey]: newTree };
9044
+ return prev;
9044
9045
  });
9046
+ setHasUnsavedChanges(true);
9045
9047
  }, [setQuestTreeMode, activeTab]);
9046
9048
  const handleMoveNode = (sourceId, targetId) => {
9047
9049
  const isAbstraction = activeTab === "abstraction";
@@ -9118,6 +9120,15 @@ function CreateQuestTreePanel({
9118
9120
  }));
9119
9121
  }
9120
9122
  }, [tree, abstraction_tree, questTreeMode.questNodeId, setQuestTreeMode]);
9123
+ (0, import_react12.useEffect)(() => {
9124
+ if (tree || abstraction_tree) {
9125
+ if (isInitialLoad.current) {
9126
+ isInitialLoad.current = false;
9127
+ return;
9128
+ }
9129
+ setHasUnsavedChanges(true);
9130
+ }
9131
+ }, [tree, abstraction_tree]);
9121
9132
  return /* @__PURE__ */ import_react12.default.createElement(
9122
9133
  "div",
9123
9134
  {
@@ -21187,6 +21198,7 @@ async function get_scene_view_data_logic(db_services, scene_config, owner_id, ty
21187
21198
  legacyResponse.data,
21188
21199
  sceneData.quest_counter
21189
21200
  );
21201
+ legacyResponse.quest_counter = sceneData.quest_counter || 1;
21190
21202
  return legacyResponse;
21191
21203
  }
21192
21204
  return legacyResponse;
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@
2
2
  import React32, {
3
3
  useCallback as useCallback7,
4
4
  useEffect as useEffect25,
5
- useRef as useRef21,
5
+ useRef as useRef22,
6
6
  useState as useState30,
7
7
  useMemo as useMemo14
8
8
  } from "react";
@@ -8886,7 +8886,7 @@ function CreateAncestryPanel({
8886
8886
  }
8887
8887
 
8888
8888
  // src/components/CreateQuestTreePanel.jsx
8889
- import React11, { useState as useState12, useEffect as useEffect11, useCallback as useCallback3, useMemo as useMemo9 } from "react";
8889
+ import React11, { useState as useState12, useEffect as useEffect11, useCallback as useCallback3, useMemo as useMemo9, useRef as useRef9 } from "react";
8890
8890
  import {
8891
8891
  FiFolder as FiFolder3,
8892
8892
  FiLayers as FiLayers6,
@@ -9003,6 +9003,7 @@ function CreateQuestTreePanel({
9003
9003
  const [isSaving, setIsSaving] = useState12(false);
9004
9004
  const [hasUnsavedChanges, setHasUnsavedChanges] = useState12(false);
9005
9005
  const [activeTab, setActiveTab] = useState12("tree");
9006
+ const isInitialLoad = useRef9(true);
9006
9007
  const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
9007
9008
  const { width: panelWidth, isResizing, handlePointerDown: handleResize } = useResizablePanel({
9008
9009
  initialWidth: 440,
@@ -9036,10 +9037,11 @@ function CreateQuestTreePanel({
9036
9037
  const indexToRemove = pathToRemove[pathToRemove.length - 1];
9037
9038
  if (currentParent.children && currentParent.children.length > indexToRemove) {
9038
9039
  currentParent.children.splice(indexToRemove, 1);
9039
- setHasUnsavedChanges(true);
9040
+ return { ...prev, [treeKey]: newTree };
9040
9041
  }
9041
- return { ...prev, [treeKey]: newTree };
9042
+ return prev;
9042
9043
  });
9044
+ setHasUnsavedChanges(true);
9043
9045
  }, [setQuestTreeMode, activeTab]);
9044
9046
  const handleMoveNode = (sourceId, targetId) => {
9045
9047
  const isAbstraction = activeTab === "abstraction";
@@ -9116,6 +9118,15 @@ function CreateQuestTreePanel({
9116
9118
  }));
9117
9119
  }
9118
9120
  }, [tree, abstraction_tree, questTreeMode.questNodeId, setQuestTreeMode]);
9121
+ useEffect11(() => {
9122
+ if (tree || abstraction_tree) {
9123
+ if (isInitialLoad.current) {
9124
+ isInitialLoad.current = false;
9125
+ return;
9126
+ }
9127
+ setHasUnsavedChanges(true);
9128
+ }
9129
+ }, [tree, abstraction_tree]);
9119
9130
  return /* @__PURE__ */ React11.createElement(
9120
9131
  "div",
9121
9132
  {
@@ -9306,11 +9317,11 @@ function ImageViewer({ data, onClose }) {
9306
9317
  }
9307
9318
 
9308
9319
  // src/components/InSceneCreationForm.jsx
9309
- import React15, { useState as useState15, useEffect as useEffect14, useRef as useRef10 } from "react";
9320
+ import React15, { useState as useState15, useEffect as useEffect14, useRef as useRef11 } from "react";
9310
9321
  import { v4 as uuidv45 } from "uuid";
9311
9322
 
9312
9323
  // src/components/ColorPicker.jsx
9313
- import React13, { useState as useState14, useEffect as useEffect13, useRef as useRef9 } from "react";
9324
+ import React13, { useState as useState14, useEffect as useEffect13, useRef as useRef10 } from "react";
9314
9325
  import { HexColorPicker } from "react-colorful";
9315
9326
  import { FiHash, FiCheck as FiCheck6 } from "react-icons/fi";
9316
9327
  var PRESET_COLORS = [
@@ -9332,7 +9343,7 @@ var PRESET_COLORS = [
9332
9343
  ];
9333
9344
  function ColorPicker({ color, onChange, disabled, isCompact = false }) {
9334
9345
  const [isOpen, setIsOpen] = useState14(false);
9335
- const popoverRef = useRef9(null);
9346
+ const popoverRef = useRef10(null);
9336
9347
  useEffect13(() => {
9337
9348
  const handleClickOutside = (event) => {
9338
9349
  if (popoverRef.current && !popoverRef.current.contains(event.target)) {
@@ -9559,7 +9570,7 @@ function InSceneCreationForm({
9559
9570
  const [isDatasetDropdownOpen, setIsDatasetDropdownOpen] = useState15(false);
9560
9571
  const [isLoadingDocs, setIsLoadingDocs] = useState15(false);
9561
9572
  const [docError, setDocError] = useState15(null);
9562
- const datasetDropdownRef = useRef10(null);
9573
+ const datasetDropdownRef = useRef11(null);
9563
9574
  useEffect14(() => {
9564
9575
  if (sourceNodeDatasetId) setTargetDatasetId(sourceNodeDatasetId);
9565
9576
  }, [sourceNodeDatasetId]);
@@ -9576,7 +9587,7 @@ function InSceneCreationForm({
9576
9587
  document.removeEventListener("mousedown", handleClickOutside);
9577
9588
  };
9578
9589
  }, [isDatasetDropdownOpen]);
9579
- const propsEndRef = useRef10(null);
9590
+ const propsEndRef = useRef11(null);
9580
9591
  const hasImages = customProps.some(
9581
9592
  (p) => p.type === "images" && Array.isArray(p.value) && p.value.length > 0 && p.value.some((img) => img.value)
9582
9593
  );
@@ -10079,7 +10090,7 @@ function InSceneCreationForm({
10079
10090
  }
10080
10091
 
10081
10092
  // src/components/InSceneVersionForm.jsx
10082
- import React16, { useState as useState16, useEffect as useEffect15, useRef as useRef11 } from "react";
10093
+ import React16, { useState as useState16, useEffect as useEffect15, useRef as useRef12 } from "react";
10083
10094
  import { v4 as uuidv46 } from "uuid";
10084
10095
  import { FiPlus as FiPlus5, FiMaximize2 as FiMaximize22, FiCheck as FiCheck8, FiEdit2 as FiEdit25 } from "react-icons/fi";
10085
10096
  function InSceneVersionForm({
@@ -10111,7 +10122,7 @@ function InSceneVersionForm({
10111
10122
  }
10112
10123
  ]);
10113
10124
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = useState16(false);
10114
- const propsEndRef = useRef11(null);
10125
+ const propsEndRef = useRef12(null);
10115
10126
  const [useImageAsTexture, setUseImageAsTexture] = useState16(false);
10116
10127
  const [selectedImageUrl, setSelectedImageUrl] = useState16(null);
10117
10128
  const hasImages = customProps.some(
@@ -10395,7 +10406,7 @@ function InSceneVersionForm({
10395
10406
  }
10396
10407
 
10397
10408
  // src/components/InSceneQuestForm.jsx
10398
- import React18, { useState as useState18, useRef as useRef12 } from "react";
10409
+ import React18, { useState as useState18, useRef as useRef13 } from "react";
10399
10410
  import { v4 as uuidv47 } from "uuid";
10400
10411
  import {
10401
10412
  FiPlus as FiPlus7,
@@ -10634,7 +10645,7 @@ function InSceneQuestForm({
10634
10645
  const [docError, setDocError] = useState18(null);
10635
10646
  const [customProps, setCustomProps] = useState18([]);
10636
10647
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = useState18(false);
10637
- const propsEndRef = useRef12(null);
10648
+ const propsEndRef = useRef13(null);
10638
10649
  const [milestoneInput, setMilestoneInput] = useState18("");
10639
10650
  const [showMilestoneSuggestions, setShowMilestoneSuggestions] = useState18(false);
10640
10651
  const activeMilestones = React18.useMemo(
@@ -11429,7 +11440,7 @@ function InSceneQuestForm({
11429
11440
  }
11430
11441
 
11431
11442
  // src/components/NodeDetailsPanel.jsx
11432
- import React19, { useState as useState19, useEffect as useEffect16, useRef as useRef13 } from "react";
11443
+ import React19, { useState as useState19, useEffect as useEffect16, useRef as useRef14 } from "react";
11433
11444
  import { v4 as uuidv48 } from "uuid";
11434
11445
  import { FiPlus as FiPlus8, FiMaximize2 as FiMaximize23, FiX as FiX6, FiCheck as FiCheck10, FiImage as FiImage3, FiEdit2 as FiEdit27, FiLoader as FiLoader2, FiBookOpen as FiBookOpen3, FiSun as FiSun2, FiLink as FiLink5, FiDatabase } from "react-icons/fi";
11435
11446
  import { AiOutlineLoading3Quarters as AiOutlineLoading3Quarters3 } from "react-icons/ai";
@@ -11489,8 +11500,8 @@ function NodeDetailsPanel({
11489
11500
  useEffect16(() => {
11490
11501
  setWidth(isReadMode ? 700 : 440);
11491
11502
  }, [isReadMode, setWidth]);
11492
- const prevNodeIdRef = useRef13(null);
11493
- const propsEndRef = useRef13(null);
11503
+ const prevNodeIdRef = useRef14(null);
11504
+ const propsEndRef = useRef14(null);
11494
11505
  const canEdit = userRole !== "viewer";
11495
11506
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
11496
11507
  const handleImageClickFromText = (url, name2) => {
@@ -12055,7 +12066,7 @@ function NodeDetailsPanel({
12055
12066
  }
12056
12067
 
12057
12068
  // src/components/QuestDetailsPanel.jsx
12058
- import React21, { useState as useState20, useEffect as useEffect17, useRef as useRef14 } from "react";
12069
+ import React21, { useState as useState20, useEffect as useEffect17, useRef as useRef15 } from "react";
12059
12070
  import { v4 as uuidv49 } from "uuid";
12060
12071
  import { FiPlus as FiPlus9, FiX as FiX7, FiCheck as FiCheck11, FiEdit2 as FiEdit28, FiLoader as FiLoader3, FiBookOpen as FiBookOpen4, FiLink as FiLink7, FiTarget as FiTarget3, FiChevronDown as FiChevronDown7, FiUser as FiUser3, FiSearch as FiSearch7, FiRepeat as FiRepeat2, FiCalendar as FiCalendar2, FiImage as FiImage4, FiCopy as FiCopy4, FiGitBranch as FiGitBranch4 } from "react-icons/fi";
12061
12072
 
@@ -12323,8 +12334,8 @@ function QuestDetailsPanel({
12323
12334
  useEffect17(() => {
12324
12335
  setWidth(isReadMode ? 700 : 440);
12325
12336
  }, [isReadMode, setWidth]);
12326
- const prevNodeIdRef = useRef14(null);
12327
- const propsEndRef = useRef14(null);
12337
+ const prevNodeIdRef = useRef15(null);
12338
+ const propsEndRef = useRef15(null);
12328
12339
  const canEdit = userRole !== "viewer";
12329
12340
  const availableImages = customProps.filter((p) => p.type === "images").flatMap((p) => Array.isArray(p.value) ? p.value : []).filter((img) => img.value && img.value.trim() !== "");
12330
12341
  const handleImageClickFromText = (url, name) => {
@@ -13475,7 +13486,7 @@ ${noteText}` : noteText : entry.notes,
13475
13486
  }
13476
13487
 
13477
13488
  // src/components/MultiNodeContextMenu.jsx
13478
- import React22, { useLayoutEffect as useLayoutEffect3, useRef as useRef15, useState as useState21, useEffect as useEffect18 } from "react";
13489
+ import React22, { useLayoutEffect as useLayoutEffect3, useRef as useRef16, useState as useState21, useEffect as useEffect18 } from "react";
13479
13490
  function MultiNodeContextMenu({
13480
13491
  data,
13481
13492
  userRole,
@@ -13484,7 +13495,7 @@ function MultiNodeContextMenu({
13484
13495
  onDismissOtherNodes,
13485
13496
  onDeleteNodes
13486
13497
  }) {
13487
- const menuRef = useRef15(null);
13498
+ const menuRef = useRef16(null);
13488
13499
  const [menuPos, setMenuPos] = useState21({ left: 0, top: 0 });
13489
13500
  const [isConfirmingDelete, setIsConfirmingDelete] = useState21(false);
13490
13501
  const ability = defineAbilityFor(userRole);
@@ -13551,7 +13562,7 @@ function MultiNodeContextMenu({
13551
13562
  }
13552
13563
 
13553
13564
  // src/components/RelationshipDetailsPanel.jsx
13554
- import React23, { useState as useState22, useEffect as useEffect19, useRef as useRef16, useMemo as useMemo10 } from "react";
13565
+ import React23, { useState as useState22, useEffect as useEffect19, useRef as useRef17, useMemo as useMemo10 } from "react";
13555
13566
  import { v4 as uuidv410 } from "uuid";
13556
13567
  import { FiPlus as FiPlus10, FiEdit2 as FiEdit29, FiLoader as FiLoader4, FiBookOpen as FiBookOpen5 } from "react-icons/fi";
13557
13568
  function RelationshipDetailsPanel({
@@ -13582,7 +13593,7 @@ function RelationshipDetailsPanel({
13582
13593
  const [isSaving, setIsSaving] = useState22(false);
13583
13594
  const [isReadMode, setIsReadMode] = useState22(false);
13584
13595
  const [hasUnsavedChanges, setHasUnsavedChanges] = useState22(false);
13585
- const propsEndRef = useRef16(null);
13596
+ const propsEndRef = useRef17(null);
13586
13597
  const canEdit = useMemo10(() => {
13587
13598
  const ability = defineAbilityFor(userRole);
13588
13599
  return ability.can("update", "Connection");
@@ -13903,7 +13914,7 @@ function RelationshipDetailsPanel({
13903
13914
  }
13904
13915
 
13905
13916
  // src/components/RelationshipContextMenu.jsx
13906
- import React24, { useLayoutEffect as useLayoutEffect4, useRef as useRef17, useState as useState23, useEffect as useEffect20, useMemo as useMemo11 } from "react";
13917
+ import React24, { useLayoutEffect as useLayoutEffect4, useRef as useRef18, useState as useState23, useEffect as useEffect20, useMemo as useMemo11 } from "react";
13907
13918
  function RelationshipContextMenu({
13908
13919
  data,
13909
13920
  userRole,
@@ -13913,7 +13924,7 @@ function RelationshipContextMenu({
13913
13924
  onDelete,
13914
13925
  onClose
13915
13926
  }) {
13916
- const menuRef = useRef17(null);
13927
+ const menuRef = useRef18(null);
13917
13928
  const [menuPos, setMenuPos] = useState23({ left: 0, top: 0 });
13918
13929
  const [isConfirmingDelete, setIsConfirmingDelete] = useState23(false);
13919
13930
  const ability = useMemo11(() => defineAbilityFor(userRole), [userRole]);
@@ -14395,7 +14406,7 @@ import React30, {
14395
14406
  useState as useState28,
14396
14407
  useMemo as useMemo13,
14397
14408
  useEffect as useEffect24,
14398
- useRef as useRef20,
14409
+ useRef as useRef21,
14399
14410
  useCallback as useCallback6
14400
14411
  } from "react";
14401
14412
  import {
@@ -14421,10 +14432,10 @@ import {
14421
14432
  import { v4 as uuidv411 } from "uuid";
14422
14433
 
14423
14434
  // src/components/RichGroupEditor.jsx
14424
- import React29, { useEffect as useEffect23, useRef as useRef19, useState as useState27, useCallback as useCallback5 } from "react";
14435
+ import React29, { useEffect as useEffect23, useRef as useRef20, useState as useState27, useCallback as useCallback5 } from "react";
14425
14436
 
14426
14437
  // src/components/MentionPopover.jsx
14427
- import React28, { useEffect as useEffect22, useRef as useRef18, useState as useState26, useMemo as useMemo12 } from "react";
14438
+ import React28, { useEffect as useEffect22, useRef as useRef19, useState as useState26, useMemo as useMemo12 } from "react";
14428
14439
  import { FiLayers as FiLayers7, FiCheckSquare as FiCheckSquare3, FiGitBranch as FiGitBranch5, FiBox } from "react-icons/fi";
14429
14440
  var TYPE_CONFIG = {
14430
14441
  ancestry: { Icon: FiLayers7, color: "text-indigo-400", label: "Ancestralidade" },
@@ -14434,7 +14445,7 @@ var TYPE_CONFIG = {
14434
14445
  };
14435
14446
  function MentionPopover({ query, items, position, onSelect, onClose }) {
14436
14447
  const [activeIndex, setActiveIndex] = useState26(0);
14437
- const listRef = useRef18(null);
14448
+ const listRef = useRef19(null);
14438
14449
  const filtered = useMemo12(() => {
14439
14450
  const term = (query || "").toLowerCase().trim();
14440
14451
  if (!term) return items.slice(0, 8);
@@ -14574,9 +14585,9 @@ var RichGroupEditor = React29.memo(function RichGroupEditor2({
14574
14585
  readOnly,
14575
14586
  placeholder
14576
14587
  }) {
14577
- const editorRef = useRef19(null);
14578
- const isMountedRef = useRef19(false);
14579
- const dismissedTriggerRef = useRef19(null);
14588
+ const editorRef = useRef20(null);
14589
+ const isMountedRef = useRef20(false);
14590
+ const dismissedTriggerRef = useRef20(null);
14580
14591
  const [mentionState, setMentionState] = useState27(null);
14581
14592
  const [isEmpty, setIsEmpty] = useState27(true);
14582
14593
  useEffect23(() => {
@@ -15044,7 +15055,7 @@ function Boards({
15044
15055
  const [isLoaded, setIsLoaded] = useState28(false);
15045
15056
  const [saveStatus, setSaveStatus] = useState28("idle");
15046
15057
  const [navigationStack, setNavigationStack] = useState28([]);
15047
- const lastSavedBoardItemsRef = useRef20(null);
15058
+ const lastSavedBoardItemsRef = useRef21(null);
15048
15059
  const canEdit = useMemo13(() => userRole !== "viewer", [userRole]);
15049
15060
  const findGroupAndParent = (list, targetId, parent = null) => {
15050
15061
  for (let i = 0; i < list.length; i++) {
@@ -15695,10 +15706,10 @@ function XViewScene({
15695
15706
  }
15696
15707
  return null;
15697
15708
  }, [ownerId, sceneConfigId]);
15698
- const sceneDataRef = useRef21(null);
15699
- const parentDataRef = useRef21(null);
15709
+ const sceneDataRef = useRef22(null);
15710
+ const parentDataRef = useRef22(null);
15700
15711
  const graphDataRef = parentDataRef;
15701
- const ancestryDataRef = useRef21(null);
15712
+ const ancestryDataRef = useRef22(null);
15702
15713
  const [isLoading, setIsLoading] = useState30(true);
15703
15714
  const [permissionStatus, setPermissionStatus] = useState30("loading");
15704
15715
  const [userPermissionRole, setUserPermissionRole] = useState30(null);
@@ -15787,10 +15798,10 @@ function XViewScene({
15787
15798
  const [boardItems, setBoardItems] = useState30([]);
15788
15799
  const [isSidebarOpen, setIsSidebarOpen] = useState30(false);
15789
15800
  const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = useState30(false);
15790
- const mountRef = useRef21(null);
15791
- const tooltipRef = useRef21(null);
15792
- const formRef = useRef21(null);
15793
- const stateRef = useRef21({
15801
+ const mountRef = useRef22(null);
15802
+ const tooltipRef = useRef22(null);
15803
+ const formRef = useRef22(null);
15804
+ const stateRef = useRef22({
15794
15805
  readMode: {
15795
15806
  currentMaxIndex: 0,
15796
15807
  progressMap: {}
@@ -21250,6 +21261,7 @@ async function get_scene_view_data_logic(db_services, scene_config, owner_id, ty
21250
21261
  legacyResponse.data,
21251
21262
  sceneData.quest_counter
21252
21263
  );
21264
+ legacyResponse.quest_counter = sceneData.quest_counter || 1;
21253
21265
  return legacyResponse;
21254
21266
  }
21255
21267
  return legacyResponse;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lv-x-software-house/x_view",
3
- "version": "1.2.8-dev.10",
3
+ "version": "1.2.8-dev.12",
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",