@lv-x-software-house/x_view 1.2.4-dev.26 → 1.2.4-dev.28

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
@@ -1011,7 +1011,8 @@ var createNodeMesh = (nodeData, position, glowTexture) => {
1011
1011
  const size = nodeData.size || "medium";
1012
1012
  const scale = NODE_SCALE_FACTORS[size] || 1;
1013
1013
  mesh.scale.set(scale, scale, scale);
1014
- const label = createTextSprite(nodeData.name);
1014
+ const labelText = nodeData.is_quest && nodeData.raw_title ? nodeData.raw_title : nodeData.name;
1015
+ const label = createTextSprite(labelText);
1015
1016
  label.name = "label";
1016
1017
  mesh.userData.labelObject = label;
1017
1018
  mesh.userData.labelOffset = new THREE.Vector3(0, 3.8, 0);
@@ -1116,13 +1117,15 @@ var updateExistingNodeVisuals = (state, updatedNode) => {
1116
1117
  const size = updatedNode.size || "medium";
1117
1118
  const scale = NODE_SCALE_FACTORS[size] || 1;
1118
1119
  existingMesh.scale.set(scale, scale, scale);
1119
- if (existingMesh.userData.name !== updatedNode.name) {
1120
+ const oldText = existingMesh.userData.is_quest && existingMesh.userData.raw_title ? existingMesh.userData.raw_title : existingMesh.userData.name;
1121
+ const newText = updatedNode.is_quest && updatedNode.raw_title ? updatedNode.raw_title : updatedNode.name;
1122
+ if (oldText !== newText) {
1120
1123
  const oldLabelToDispose = existingMesh.userData.labelObject;
1121
1124
  if (oldLabelToDispose && state.graphGroup) {
1122
1125
  state.graphGroup.remove(oldLabelToDispose);
1123
1126
  if (oldLabelToDispose.material) oldLabelToDispose.material.dispose();
1124
1127
  }
1125
- const newLabel = createTextSprite(updatedNode.name || "");
1128
+ const newLabel = createTextSprite(newText || "");
1126
1129
  newLabel.name = "label";
1127
1130
  existingMesh.userData.labelObject = newLabel;
1128
1131
  if (state.graphGroup) {
@@ -2556,6 +2559,13 @@ var userActionHandlers = {
2556
2559
  try {
2557
2560
  const isView = ((_a = context.viewType) == null ? void 0 : _a.toLowerCase()) === "view";
2558
2561
  if (isView && parentFileId === context.sceneConfigId) {
2562
+ const visualNodeIndex = sceneDataRef.current.nodes.findIndex((n) => String(n.id) === String(nodeToSave.id));
2563
+ if (visualNodeIndex > -1) {
2564
+ sceneDataRef.current.nodes[visualNodeIndex] = {
2565
+ ...sceneDataRef.current.nodes[visualNodeIndex],
2566
+ ...nodeToSave
2567
+ };
2568
+ }
2559
2569
  const viewFilePayload = {
2560
2570
  parent_dbs: sceneDataRef.current.parent_dbs,
2561
2571
  nodes: sceneDataRef.current.nodes,
@@ -2899,7 +2909,8 @@ var IGNORED_KEYS = [
2899
2909
  "selectedAbstractionParentId",
2900
2910
  "isAddingAbstractionNodes",
2901
2911
  "status",
2902
- "is_quest"
2912
+ "is_quest",
2913
+ "raw_title"
2903
2914
  ];
2904
2915
  function extractCustomPropsFromNode(node) {
2905
2916
  const customPropTypes = node._customPropTypes || {};
@@ -8091,11 +8102,11 @@ function InSceneQuestForm({
8091
8102
  onChange: (e) => {
8092
8103
  const val = e.target.value;
8093
8104
  setName(val);
8094
- onNameChange == null ? void 0 : onNameChange(`${viewName} - ${questCounter} - \xBB ${val || "Nova Quest"}`);
8105
+ onNameChange == null ? void 0 : onNameChange(val || "Nova Quest");
8095
8106
  },
8096
8107
  className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-2 focus:ring-indigo-400/60"
8097
8108
  }
8098
- ), /* @__PURE__ */ import_react16.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }, "Preview:"), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
8109
+ ), /* @__PURE__ */ import_react16.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
8099
8110
  "button",
8100
8111
  {
8101
8112
  type: "button",
@@ -8777,7 +8788,7 @@ function QuestDetailsPanel({
8777
8788
  const val = e.target.value;
8778
8789
  setRawTitle(val);
8779
8790
  const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
8780
- onNameChange == null ? void 0 : onNameChange(node.id, newStandardName);
8791
+ onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
8781
8792
  };
8782
8793
  const handleSizeChange = (newSize) => {
8783
8794
  setSize(newSize);
@@ -8938,7 +8949,7 @@ function QuestDetailsPanel({
8938
8949
  readOnly: !canEdit,
8939
8950
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
8940
8951
  }
8941
- ), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }, "Preview:"), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react18.default.createElement(
8952
+ ), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react18.default.createElement(
8942
8953
  "button",
8943
8954
  {
8944
8955
  type: "button",
@@ -11834,7 +11845,7 @@ function XViewScene({
11834
11845
  graphGroup.add(newLabel);
11835
11846
  ghostNode.userData.labelObject = newLabel;
11836
11847
  };
11837
- const handleDetailNodeNameChange = (nodeId, newName) => {
11848
+ const handleDetailNodeNameChange = (nodeId, newName, newRawTitle) => {
11838
11849
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
11839
11850
  const { graphGroup } = stateRef.current;
11840
11851
  if (!mesh || !graphGroup) return;
@@ -11844,10 +11855,15 @@ function XViewScene({
11844
11855
  if (oldLabel.material.map) oldLabel.material.map.dispose();
11845
11856
  oldLabel.material.dispose();
11846
11857
  }
11847
- const newLabel = createTextSprite(newName || "");
11858
+ const isQuest = mesh.userData.is_quest;
11859
+ const displayText = isQuest && newRawTitle !== void 0 ? newRawTitle : newName;
11860
+ const newLabel = createTextSprite(displayText || "");
11848
11861
  graphGroup.add(newLabel);
11849
11862
  mesh.userData.labelObject = newLabel;
11850
11863
  mesh.userData.name = newName;
11864
+ if (newRawTitle !== void 0) {
11865
+ mesh.userData.raw_title = newRawTitle;
11866
+ }
11851
11867
  };
11852
11868
  const handleDetailNodeColorChange = (nodeId, newColor) => {
11853
11869
  var _a2;
@@ -12025,11 +12041,11 @@ function XViewScene({
12025
12041
  const sceneFileData = {
12026
12042
  parent_dbs: sceneDataRef2.current.parent_dbs,
12027
12043
  nodes: sceneDataRef2.current.nodes,
12044
+ // Permanece intacto, como estava no último save de cena inicial
12028
12045
  links: sceneDataRef2.current.links,
12029
12046
  quest_nodes: graphDataRef.current[sceneConfigId2].nodes,
12030
12047
  quest_links: graphDataRef.current[sceneConfigId2].links,
12031
12048
  quest_counter: currentCounter + 1
12032
- // NOVO: Incrementa o contador nos metadados
12033
12049
  };
12034
12050
  try {
12035
12051
  await actions.save_view_data(sceneSaveUrl2, sceneFileData);
@@ -14038,8 +14054,13 @@ async function get_scene_view_data_logic(db_services, scene_config, owner_id, ty
14038
14054
  const parentNodeMap = new Map(allNodes.map((node) => [String(node.id), node]));
14039
14055
  const parentLinkMap = new Map(allLinks.map((link) => [`${link.source}-${link.target}`, link]));
14040
14056
  const validatedNodes = (sceneData.nodes || []).map((sceneNode) => {
14057
+ var _a2, _b2;
14041
14058
  const nodeTypes = Array.isArray(sceneNode.type) ? sceneNode.type : [sceneNode.type];
14042
14059
  if (nodeTypes.includes("quest")) {
14060
+ const dbQuestNode = (_b2 = (_a2 = parentData[scene_config]) == null ? void 0 : _a2.nodes) == null ? void 0 : _b2.find((qn) => String(qn.id) === String(sceneNode.id));
14061
+ if (dbQuestNode) {
14062
+ return { ...sceneNode, ...dbQuestNode };
14063
+ }
14043
14064
  return sceneNode;
14044
14065
  }
14045
14066
  const dbNode = parentNodeMap.get(String(sceneNode.id));
package/dist/index.mjs CHANGED
@@ -967,7 +967,8 @@ var createNodeMesh = (nodeData, position, glowTexture) => {
967
967
  const size = nodeData.size || "medium";
968
968
  const scale = NODE_SCALE_FACTORS[size] || 1;
969
969
  mesh.scale.set(scale, scale, scale);
970
- const label = createTextSprite(nodeData.name);
970
+ const labelText = nodeData.is_quest && nodeData.raw_title ? nodeData.raw_title : nodeData.name;
971
+ const label = createTextSprite(labelText);
971
972
  label.name = "label";
972
973
  mesh.userData.labelObject = label;
973
974
  mesh.userData.labelOffset = new THREE.Vector3(0, 3.8, 0);
@@ -1072,13 +1073,15 @@ var updateExistingNodeVisuals = (state, updatedNode) => {
1072
1073
  const size = updatedNode.size || "medium";
1073
1074
  const scale = NODE_SCALE_FACTORS[size] || 1;
1074
1075
  existingMesh.scale.set(scale, scale, scale);
1075
- if (existingMesh.userData.name !== updatedNode.name) {
1076
+ const oldText = existingMesh.userData.is_quest && existingMesh.userData.raw_title ? existingMesh.userData.raw_title : existingMesh.userData.name;
1077
+ const newText = updatedNode.is_quest && updatedNode.raw_title ? updatedNode.raw_title : updatedNode.name;
1078
+ if (oldText !== newText) {
1076
1079
  const oldLabelToDispose = existingMesh.userData.labelObject;
1077
1080
  if (oldLabelToDispose && state.graphGroup) {
1078
1081
  state.graphGroup.remove(oldLabelToDispose);
1079
1082
  if (oldLabelToDispose.material) oldLabelToDispose.material.dispose();
1080
1083
  }
1081
- const newLabel = createTextSprite(updatedNode.name || "");
1084
+ const newLabel = createTextSprite(newText || "");
1082
1085
  newLabel.name = "label";
1083
1086
  existingMesh.userData.labelObject = newLabel;
1084
1087
  if (state.graphGroup) {
@@ -2512,6 +2515,13 @@ var userActionHandlers = {
2512
2515
  try {
2513
2516
  const isView = ((_a = context.viewType) == null ? void 0 : _a.toLowerCase()) === "view";
2514
2517
  if (isView && parentFileId === context.sceneConfigId) {
2518
+ const visualNodeIndex = sceneDataRef.current.nodes.findIndex((n) => String(n.id) === String(nodeToSave.id));
2519
+ if (visualNodeIndex > -1) {
2520
+ sceneDataRef.current.nodes[visualNodeIndex] = {
2521
+ ...sceneDataRef.current.nodes[visualNodeIndex],
2522
+ ...nodeToSave
2523
+ };
2524
+ }
2515
2525
  const viewFilePayload = {
2516
2526
  parent_dbs: sceneDataRef.current.parent_dbs,
2517
2527
  nodes: sceneDataRef.current.nodes,
@@ -2855,7 +2865,8 @@ var IGNORED_KEYS = [
2855
2865
  "selectedAbstractionParentId",
2856
2866
  "isAddingAbstractionNodes",
2857
2867
  "status",
2858
- "is_quest"
2868
+ "is_quest",
2869
+ "raw_title"
2859
2870
  ];
2860
2871
  function extractCustomPropsFromNode(node) {
2861
2872
  const customPropTypes = node._customPropTypes || {};
@@ -8078,11 +8089,11 @@ function InSceneQuestForm({
8078
8089
  onChange: (e) => {
8079
8090
  const val = e.target.value;
8080
8091
  setName(val);
8081
- onNameChange == null ? void 0 : onNameChange(`${viewName} - ${questCounter} - \xBB ${val || "Nova Quest"}`);
8092
+ onNameChange == null ? void 0 : onNameChange(val || "Nova Quest");
8082
8093
  },
8083
8094
  className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-2 focus:ring-indigo-400/60"
8084
8095
  }
8085
- ), /* @__PURE__ */ React15.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React15.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }, "Preview:"), /* @__PURE__ */ React15.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React15.createElement("div", { className: "relative" }, /* @__PURE__ */ React15.createElement(
8096
+ ), /* @__PURE__ */ React15.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React15.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ React15.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React15.createElement("div", { className: "relative" }, /* @__PURE__ */ React15.createElement(
8086
8097
  "button",
8087
8098
  {
8088
8099
  type: "button",
@@ -8764,7 +8775,7 @@ function QuestDetailsPanel({
8764
8775
  const val = e.target.value;
8765
8776
  setRawTitle(val);
8766
8777
  const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
8767
- onNameChange == null ? void 0 : onNameChange(node.id, newStandardName);
8778
+ onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
8768
8779
  };
8769
8780
  const handleSizeChange = (newSize) => {
8770
8781
  setSize(newSize);
@@ -8925,7 +8936,7 @@ function QuestDetailsPanel({
8925
8936
  readOnly: !canEdit,
8926
8937
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
8927
8938
  }
8928
- ), /* @__PURE__ */ React17.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React17.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }, "Preview:"), /* @__PURE__ */ React17.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React17.createElement("div", { className: "relative" }, /* @__PURE__ */ React17.createElement(
8939
+ ), /* @__PURE__ */ React17.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React17.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ React17.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React17.createElement("div", { className: "relative" }, /* @__PURE__ */ React17.createElement(
8929
8940
  "button",
8930
8941
  {
8931
8942
  type: "button",
@@ -11834,7 +11845,7 @@ function XViewScene({
11834
11845
  graphGroup.add(newLabel);
11835
11846
  ghostNode.userData.labelObject = newLabel;
11836
11847
  };
11837
- const handleDetailNodeNameChange = (nodeId, newName) => {
11848
+ const handleDetailNodeNameChange = (nodeId, newName, newRawTitle) => {
11838
11849
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
11839
11850
  const { graphGroup } = stateRef.current;
11840
11851
  if (!mesh || !graphGroup) return;
@@ -11844,10 +11855,15 @@ function XViewScene({
11844
11855
  if (oldLabel.material.map) oldLabel.material.map.dispose();
11845
11856
  oldLabel.material.dispose();
11846
11857
  }
11847
- const newLabel = createTextSprite(newName || "");
11858
+ const isQuest = mesh.userData.is_quest;
11859
+ const displayText = isQuest && newRawTitle !== void 0 ? newRawTitle : newName;
11860
+ const newLabel = createTextSprite(displayText || "");
11848
11861
  graphGroup.add(newLabel);
11849
11862
  mesh.userData.labelObject = newLabel;
11850
11863
  mesh.userData.name = newName;
11864
+ if (newRawTitle !== void 0) {
11865
+ mesh.userData.raw_title = newRawTitle;
11866
+ }
11851
11867
  };
11852
11868
  const handleDetailNodeColorChange = (nodeId, newColor) => {
11853
11869
  var _a2;
@@ -12025,11 +12041,11 @@ function XViewScene({
12025
12041
  const sceneFileData = {
12026
12042
  parent_dbs: sceneDataRef2.current.parent_dbs,
12027
12043
  nodes: sceneDataRef2.current.nodes,
12044
+ // Permanece intacto, como estava no último save de cena inicial
12028
12045
  links: sceneDataRef2.current.links,
12029
12046
  quest_nodes: graphDataRef.current[sceneConfigId2].nodes,
12030
12047
  quest_links: graphDataRef.current[sceneConfigId2].links,
12031
12048
  quest_counter: currentCounter + 1
12032
- // NOVO: Incrementa o contador nos metadados
12033
12049
  };
12034
12050
  try {
12035
12051
  await actions.save_view_data(sceneSaveUrl2, sceneFileData);
@@ -14038,8 +14054,13 @@ async function get_scene_view_data_logic(db_services, scene_config, owner_id, ty
14038
14054
  const parentNodeMap = new Map(allNodes.map((node) => [String(node.id), node]));
14039
14055
  const parentLinkMap = new Map(allLinks.map((link) => [`${link.source}-${link.target}`, link]));
14040
14056
  const validatedNodes = (sceneData.nodes || []).map((sceneNode) => {
14057
+ var _a2, _b2;
14041
14058
  const nodeTypes = Array.isArray(sceneNode.type) ? sceneNode.type : [sceneNode.type];
14042
14059
  if (nodeTypes.includes("quest")) {
14060
+ const dbQuestNode = (_b2 = (_a2 = parentData[scene_config]) == null ? void 0 : _a2.nodes) == null ? void 0 : _b2.find((qn) => String(qn.id) === String(sceneNode.id));
14061
+ if (dbQuestNode) {
14062
+ return { ...sceneNode, ...dbQuestNode };
14063
+ }
14043
14064
  return sceneNode;
14044
14065
  }
14045
14066
  const dbNode = parentNodeMap.get(String(sceneNode.id));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lv-x-software-house/x_view",
3
- "version": "1.2.4-dev.26",
3
+ "version": "1.2.4-dev.28",
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",