@lv-x-software-house/x_view 1.2.5-dev.16 → 1.2.5-dev.18

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 +112 -25
  2. package/dist/index.mjs +112 -25
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -619,15 +619,18 @@ function XViewSidebar({
619
619
  const [isFilterMenuOpen, setIsFilterMenuOpen] = (0, import_react2.useState)(false);
620
620
  const [filterCategory, setFilterCategory] = (0, import_react2.useState)("Type");
621
621
  const [filterValue, setFilterValue] = (0, import_react2.useState)("");
622
+ const [isTypeDropdownOpen, setIsTypeDropdownOpen] = (0, import_react2.useState)(false);
623
+ const [highlightedTypeIndex, setHighlightedTypeIndex] = (0, import_react2.useState)(-1);
622
624
  const containerRef = (0, import_react2.useRef)(null);
623
625
  const inputRef = (0, import_react2.useRef)(null);
624
626
  const filterMenuRef = (0, import_react2.useRef)(null);
627
+ const typeDropdownRef = (0, import_react2.useRef)(null);
625
628
  const ability = (0, import_react2.useMemo)(() => {
626
629
  return defineAbilityFor(userRole);
627
630
  }, [userRole]);
628
631
  const contextLabel = (0, import_react2.useMemo)(() => {
629
632
  if (!viewType || !viewName) return null;
630
- const typeLower = viewType.toLowerCase();
633
+ const typeLower = String(viewType).toLowerCase();
631
634
  if (typeLower === "database") {
632
635
  return `Dataset: ${viewName}`;
633
636
  } else if (typeLower === "view") {
@@ -637,7 +640,12 @@ function XViewSidebar({
637
640
  }
638
641
  return `${viewType}: ${viewName}`;
639
642
  }, [viewType, viewName]);
640
- const normalize = (str = "") => String(str).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[._\-–—:,;!?'"()\[\]{}/\\]/g, " ").replace(/\s+/g, " ").trim();
643
+ const normalize = (str = "") => {
644
+ if (str === void 0 || str === null) {
645
+ console.warn("XViewSidebar: normalize recebeu valor nulo/indefinido:", str);
646
+ }
647
+ return String(str).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[._\-–—:,;!?'"()\[\]{}/\\]/g, " ").replace(/\s+/g, " ").trim();
648
+ };
641
649
  const collator = (0, import_react2.useMemo)(
642
650
  () => new Intl.Collator("pt-BR", { sensitivity: "base", numeric: true }),
643
651
  []
@@ -655,6 +663,11 @@ function XViewSidebar({
655
663
  });
656
664
  return Array.from(typesSet).sort();
657
665
  }, [dbNodes]);
666
+ const filteredTypes = (0, import_react2.useMemo)(() => {
667
+ if (!filterValue.trim()) return availableTypes;
668
+ const search = filterValue.toLowerCase().trim();
669
+ return availableTypes.filter((t) => t.toLowerCase().includes(search));
670
+ }, [availableTypes, filterValue]);
658
671
  const filteredAndSorted = (0, import_react2.useMemo)(() => {
659
672
  const base = Array.isArray(dbNodes) ? dbNodes : [];
660
673
  let pool = base;
@@ -695,12 +708,15 @@ function XViewSidebar({
695
708
  if (filterMenuRef.current && !filterMenuRef.current.contains(event.target)) {
696
709
  setIsFilterMenuOpen(false);
697
710
  }
711
+ if (typeDropdownRef.current && !typeDropdownRef.current.contains(event.target)) {
712
+ setIsTypeDropdownOpen(false);
713
+ }
698
714
  };
699
- if (isFilterMenuOpen) {
715
+ if (isFilterMenuOpen || isTypeDropdownOpen) {
700
716
  document.addEventListener("mousedown", handleClickOutside);
701
717
  }
702
718
  return () => document.removeEventListener("mousedown", handleClickOutside);
703
- }, [isFilterMenuOpen]);
719
+ }, [isFilterMenuOpen, isTypeDropdownOpen]);
704
720
  (0, import_react2.useEffect)(() => {
705
721
  if (!query) setSelectedNodeId(null);
706
722
  }, [query]);
@@ -754,6 +770,35 @@ function XViewSidebar({
754
770
  const handleRemoveFilter = (index) => {
755
771
  setActiveFilters((prev) => prev.filter((_, i) => i !== index));
756
772
  };
773
+ const handleTypeKeyDown = (e) => {
774
+ if (!isTypeDropdownOpen) {
775
+ setIsTypeDropdownOpen(true);
776
+ }
777
+ if (e.key === "ArrowDown") {
778
+ e.preventDefault();
779
+ setHighlightedTypeIndex(
780
+ (prev) => prev < filteredTypes.length - 1 ? prev + 1 : prev
781
+ );
782
+ } else if (e.key === "ArrowUp") {
783
+ e.preventDefault();
784
+ setHighlightedTypeIndex((prev) => prev > 0 ? prev - 1 : 0);
785
+ } else if (e.key === "Enter") {
786
+ e.preventDefault();
787
+ if (highlightedTypeIndex >= 0 && filteredTypes[highlightedTypeIndex]) {
788
+ setFilterValue(filteredTypes[highlightedTypeIndex]);
789
+ setIsTypeDropdownOpen(false);
790
+ setHighlightedTypeIndex(-1);
791
+ } else {
792
+ handleAddFilter();
793
+ }
794
+ } else if (e.key === "Escape") {
795
+ e.preventDefault();
796
+ setIsTypeDropdownOpen(false);
797
+ setHighlightedTypeIndex(-1);
798
+ } else if (e.key === "Tab") {
799
+ setIsTypeDropdownOpen(false);
800
+ }
801
+ };
757
802
  const ToggleButton = /* @__PURE__ */ import_react2.default.createElement(
758
803
  "button",
759
804
  {
@@ -884,18 +929,36 @@ function XViewSidebar({
884
929
  className: `flex-1 text-xs py-1 rounded transition-colors ${filterCategory === opt ? "bg-indigo-600 text-white shadow-sm" : "text-slate-400 hover:text-slate-200"}`
885
930
  },
886
931
  opt
887
- )))), /* @__PURE__ */ import_react2.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react2.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Valor"), filterCategory === "Type" ? /* @__PURE__ */ import_react2.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react2.default.createElement(
932
+ )))), /* @__PURE__ */ import_react2.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react2.default.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Valor"), filterCategory === "Type" ? /* @__PURE__ */ import_react2.default.createElement("div", { className: "relative", ref: typeDropdownRef }, /* @__PURE__ */ import_react2.default.createElement(
888
933
  "input",
889
934
  {
890
- list: "typeOptions",
891
935
  type: "text",
892
936
  value: filterValue,
893
- onChange: (e) => setFilterValue(e.target.value),
937
+ onChange: (e) => {
938
+ setFilterValue(e.target.value);
939
+ if (!isTypeDropdownOpen) setIsTypeDropdownOpen(true);
940
+ setHighlightedTypeIndex(-1);
941
+ },
942
+ onFocus: () => setIsTypeDropdownOpen(true),
943
+ onKeyDown: handleTypeKeyDown,
894
944
  placeholder: "Ex: Concept",
895
945
  className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white",
896
946
  autoFocus: true
897
947
  }
898
- ), /* @__PURE__ */ import_react2.default.createElement("datalist", { id: "typeOptions" }, availableTypes.map((t) => /* @__PURE__ */ import_react2.default.createElement("option", { key: t, value: t })))) : /* @__PURE__ */ import_react2.default.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ import_react2.default.createElement(
948
+ ), isTypeDropdownOpen && filteredTypes.length > 0 && /* @__PURE__ */ import_react2.default.createElement("div", { className: "absolute z-[60] left-0 right-0 mt-1 max-h-48 overflow-y-auto bg-slate-900/95 backdrop-blur-xl border border-white/10 rounded-md shadow-2xl custom-scrollbar" }, filteredTypes.map((t, idx) => /* @__PURE__ */ import_react2.default.createElement(
949
+ "div",
950
+ {
951
+ key: t,
952
+ className: `px-3 py-2 text-xs cursor-pointer transition-colors ${idx === highlightedTypeIndex ? "bg-indigo-600 text-white" : "text-slate-300 hover:bg-white/10"}`,
953
+ onMouseDown: (e) => {
954
+ e.preventDefault();
955
+ setFilterValue(t);
956
+ setIsTypeDropdownOpen(false);
957
+ setHighlightedTypeIndex(-1);
958
+ }
959
+ },
960
+ t
961
+ )))) : /* @__PURE__ */ import_react2.default.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ import_react2.default.createElement(
899
962
  "div",
900
963
  {
901
964
  className: "absolute left-2 w-3 h-3 rounded-full border border-white/20 shadow-sm",
@@ -7665,7 +7728,7 @@ function ColorPicker({ color, onChange, disabled }) {
7665
7728
  style: { backgroundColor: preset },
7666
7729
  title: preset
7667
7730
  },
7668
- color.toLowerCase() === preset.toLowerCase() && /* @__PURE__ */ import_react13.default.createElement(import_fi11.FiCheck, { className: `drop-shadow-md ${["#ffffff", "#4df5cb", "#84cc16", "#f59e0b"].includes(preset) ? "text-black" : "text-white"}`, size: 12 })
7731
+ (color || "").toLowerCase() === (preset || "").toLowerCase() && /* @__PURE__ */ import_react13.default.createElement(import_fi11.FiCheck, { className: `drop-shadow-md ${["#ffffff", "#4df5cb", "#84cc16", "#f59e0b"].includes(preset) ? "text-black" : "text-white"}`, size: 12 })
7669
7732
  )))), /* @__PURE__ */ import_react13.default.createElement("style", null, `
7670
7733
  .custom-react-colorful .react-colorful {
7671
7734
  width: 100%;
@@ -7761,10 +7824,19 @@ function InSceneCreationForm({
7761
7824
  if (typeInput.trim() === "") {
7762
7825
  result = validExistingTypes.filter((t) => !types.includes(t));
7763
7826
  } else {
7764
- const lowercasedInput = typeInput.toLowerCase();
7765
- result = validExistingTypes.filter(
7766
- (t) => t.toLowerCase().includes(lowercasedInput) && !types.includes(t)
7767
- );
7827
+ console.log("InSceneCreationForm: Filtrando tipos com input:", typeInput);
7828
+ try {
7829
+ const lowercasedInput = typeInput.toLowerCase();
7830
+ result = validExistingTypes.filter((t) => {
7831
+ if (!t) {
7832
+ console.warn("InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem");
7833
+ return false;
7834
+ }
7835
+ return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
7836
+ });
7837
+ } catch (err) {
7838
+ console.error("InSceneCreationForm: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
7839
+ }
7768
7840
  }
7769
7841
  if (sourceTypes) {
7770
7842
  const priorityTypes = Array.isArray(sourceTypes) ? sourceTypes : [sourceTypes];
@@ -8614,12 +8686,18 @@ function NodeDetailsPanel({
8614
8686
  if (typeInput.trim() === "") {
8615
8687
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
8616
8688
  } else {
8617
- const lowercasedInput = typeInput.toLowerCase();
8618
- setFilteredTypes(
8619
- validExistingTypes.filter(
8620
- (t) => t.toLowerCase().includes(lowercasedInput) && !types.includes(t)
8621
- )
8622
- );
8689
+ console.log("NodeDetailsPanel: Filtrando tipos com input:", typeInput);
8690
+ try {
8691
+ const lowercasedInput = typeInput.toLowerCase();
8692
+ setFilteredTypes(
8693
+ validExistingTypes.filter((t) => {
8694
+ if (!t) return false;
8695
+ return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
8696
+ })
8697
+ );
8698
+ } catch (err) {
8699
+ console.error("NodeDetailsPanel: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
8700
+ }
8623
8701
  }
8624
8702
  }, [typeInput, existingTypes, types]);
8625
8703
  const handleIntensityChangeLocal = (e) => {
@@ -9116,12 +9194,21 @@ function QuestDetailsPanel({
9116
9194
  if (typeInput.trim() === "") {
9117
9195
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
9118
9196
  } else {
9119
- const lowercasedInput = typeInput.toLowerCase();
9120
- setFilteredTypes(
9121
- validExistingTypes.filter(
9122
- (t) => t.toLowerCase().includes(lowercasedInput) && !types.includes(t)
9123
- )
9124
- );
9197
+ console.log("QuestDetailsPanel: Filtrando tipos com input:", typeInput);
9198
+ try {
9199
+ const lowercasedInput = typeInput.toLowerCase();
9200
+ setFilteredTypes(
9201
+ validExistingTypes.filter((t) => {
9202
+ if (!t) {
9203
+ console.warn("QuestDetailsPanel: Tipo encontrado como undefined/null durante filtragem");
9204
+ return false;
9205
+ }
9206
+ return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
9207
+ })
9208
+ );
9209
+ } catch (err) {
9210
+ console.error("QuestDetailsPanel: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
9211
+ }
9125
9212
  }
9126
9213
  }, [typeInput, existingTypes, types]);
9127
9214
  const handleCopyLink = () => {
package/dist/index.mjs CHANGED
@@ -580,15 +580,18 @@ function XViewSidebar({
580
580
  const [isFilterMenuOpen, setIsFilterMenuOpen] = useState2(false);
581
581
  const [filterCategory, setFilterCategory] = useState2("Type");
582
582
  const [filterValue, setFilterValue] = useState2("");
583
+ const [isTypeDropdownOpen, setIsTypeDropdownOpen] = useState2(false);
584
+ const [highlightedTypeIndex, setHighlightedTypeIndex] = useState2(-1);
583
585
  const containerRef = useRef2(null);
584
586
  const inputRef = useRef2(null);
585
587
  const filterMenuRef = useRef2(null);
588
+ const typeDropdownRef = useRef2(null);
586
589
  const ability = useMemo2(() => {
587
590
  return defineAbilityFor(userRole);
588
591
  }, [userRole]);
589
592
  const contextLabel = useMemo2(() => {
590
593
  if (!viewType || !viewName) return null;
591
- const typeLower = viewType.toLowerCase();
594
+ const typeLower = String(viewType).toLowerCase();
592
595
  if (typeLower === "database") {
593
596
  return `Dataset: ${viewName}`;
594
597
  } else if (typeLower === "view") {
@@ -598,7 +601,12 @@ function XViewSidebar({
598
601
  }
599
602
  return `${viewType}: ${viewName}`;
600
603
  }, [viewType, viewName]);
601
- const normalize = (str = "") => String(str).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[._\-–—:,;!?'"()\[\]{}/\\]/g, " ").replace(/\s+/g, " ").trim();
604
+ const normalize = (str = "") => {
605
+ if (str === void 0 || str === null) {
606
+ console.warn("XViewSidebar: normalize recebeu valor nulo/indefinido:", str);
607
+ }
608
+ return String(str).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[._\-–—:,;!?'"()\[\]{}/\\]/g, " ").replace(/\s+/g, " ").trim();
609
+ };
602
610
  const collator = useMemo2(
603
611
  () => new Intl.Collator("pt-BR", { sensitivity: "base", numeric: true }),
604
612
  []
@@ -616,6 +624,11 @@ function XViewSidebar({
616
624
  });
617
625
  return Array.from(typesSet).sort();
618
626
  }, [dbNodes]);
627
+ const filteredTypes = useMemo2(() => {
628
+ if (!filterValue.trim()) return availableTypes;
629
+ const search = filterValue.toLowerCase().trim();
630
+ return availableTypes.filter((t) => t.toLowerCase().includes(search));
631
+ }, [availableTypes, filterValue]);
619
632
  const filteredAndSorted = useMemo2(() => {
620
633
  const base = Array.isArray(dbNodes) ? dbNodes : [];
621
634
  let pool = base;
@@ -656,12 +669,15 @@ function XViewSidebar({
656
669
  if (filterMenuRef.current && !filterMenuRef.current.contains(event.target)) {
657
670
  setIsFilterMenuOpen(false);
658
671
  }
672
+ if (typeDropdownRef.current && !typeDropdownRef.current.contains(event.target)) {
673
+ setIsTypeDropdownOpen(false);
674
+ }
659
675
  };
660
- if (isFilterMenuOpen) {
676
+ if (isFilterMenuOpen || isTypeDropdownOpen) {
661
677
  document.addEventListener("mousedown", handleClickOutside);
662
678
  }
663
679
  return () => document.removeEventListener("mousedown", handleClickOutside);
664
- }, [isFilterMenuOpen]);
680
+ }, [isFilterMenuOpen, isTypeDropdownOpen]);
665
681
  useEffect2(() => {
666
682
  if (!query) setSelectedNodeId(null);
667
683
  }, [query]);
@@ -715,6 +731,35 @@ function XViewSidebar({
715
731
  const handleRemoveFilter = (index) => {
716
732
  setActiveFilters((prev) => prev.filter((_, i) => i !== index));
717
733
  };
734
+ const handleTypeKeyDown = (e) => {
735
+ if (!isTypeDropdownOpen) {
736
+ setIsTypeDropdownOpen(true);
737
+ }
738
+ if (e.key === "ArrowDown") {
739
+ e.preventDefault();
740
+ setHighlightedTypeIndex(
741
+ (prev) => prev < filteredTypes.length - 1 ? prev + 1 : prev
742
+ );
743
+ } else if (e.key === "ArrowUp") {
744
+ e.preventDefault();
745
+ setHighlightedTypeIndex((prev) => prev > 0 ? prev - 1 : 0);
746
+ } else if (e.key === "Enter") {
747
+ e.preventDefault();
748
+ if (highlightedTypeIndex >= 0 && filteredTypes[highlightedTypeIndex]) {
749
+ setFilterValue(filteredTypes[highlightedTypeIndex]);
750
+ setIsTypeDropdownOpen(false);
751
+ setHighlightedTypeIndex(-1);
752
+ } else {
753
+ handleAddFilter();
754
+ }
755
+ } else if (e.key === "Escape") {
756
+ e.preventDefault();
757
+ setIsTypeDropdownOpen(false);
758
+ setHighlightedTypeIndex(-1);
759
+ } else if (e.key === "Tab") {
760
+ setIsTypeDropdownOpen(false);
761
+ }
762
+ };
718
763
  const ToggleButton = /* @__PURE__ */ React2.createElement(
719
764
  "button",
720
765
  {
@@ -845,18 +890,36 @@ function XViewSidebar({
845
890
  className: `flex-1 text-xs py-1 rounded transition-colors ${filterCategory === opt ? "bg-indigo-600 text-white shadow-sm" : "text-slate-400 hover:text-slate-200"}`
846
891
  },
847
892
  opt
848
- )))), /* @__PURE__ */ React2.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Valor"), filterCategory === "Type" ? /* @__PURE__ */ React2.createElement("div", { className: "relative" }, /* @__PURE__ */ React2.createElement(
893
+ )))), /* @__PURE__ */ React2.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React2.createElement("label", { className: "text-[10px] uppercase text-slate-400 font-semibold tracking-wider" }, "Valor"), filterCategory === "Type" ? /* @__PURE__ */ React2.createElement("div", { className: "relative", ref: typeDropdownRef }, /* @__PURE__ */ React2.createElement(
849
894
  "input",
850
895
  {
851
- list: "typeOptions",
852
896
  type: "text",
853
897
  value: filterValue,
854
- onChange: (e) => setFilterValue(e.target.value),
898
+ onChange: (e) => {
899
+ setFilterValue(e.target.value);
900
+ if (!isTypeDropdownOpen) setIsTypeDropdownOpen(true);
901
+ setHighlightedTypeIndex(-1);
902
+ },
903
+ onFocus: () => setIsTypeDropdownOpen(true),
904
+ onKeyDown: handleTypeKeyDown,
855
905
  placeholder: "Ex: Concept",
856
906
  className: "w-full bg-slate-800 p-2 text-xs rounded border border-white/10 focus:outline-none focus:border-indigo-500/50 text-white",
857
907
  autoFocus: true
858
908
  }
859
- ), /* @__PURE__ */ React2.createElement("datalist", { id: "typeOptions" }, availableTypes.map((t) => /* @__PURE__ */ React2.createElement("option", { key: t, value: t })))) : /* @__PURE__ */ React2.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React2.createElement(
909
+ ), isTypeDropdownOpen && filteredTypes.length > 0 && /* @__PURE__ */ React2.createElement("div", { className: "absolute z-[60] left-0 right-0 mt-1 max-h-48 overflow-y-auto bg-slate-900/95 backdrop-blur-xl border border-white/10 rounded-md shadow-2xl custom-scrollbar" }, filteredTypes.map((t, idx) => /* @__PURE__ */ React2.createElement(
910
+ "div",
911
+ {
912
+ key: t,
913
+ className: `px-3 py-2 text-xs cursor-pointer transition-colors ${idx === highlightedTypeIndex ? "bg-indigo-600 text-white" : "text-slate-300 hover:bg-white/10"}`,
914
+ onMouseDown: (e) => {
915
+ e.preventDefault();
916
+ setFilterValue(t);
917
+ setIsTypeDropdownOpen(false);
918
+ setHighlightedTypeIndex(-1);
919
+ }
920
+ },
921
+ t
922
+ )))) : /* @__PURE__ */ React2.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React2.createElement(
860
923
  "div",
861
924
  {
862
925
  className: "absolute left-2 w-3 h-3 rounded-full border border-white/20 shadow-sm",
@@ -7657,7 +7720,7 @@ function ColorPicker({ color, onChange, disabled }) {
7657
7720
  style: { backgroundColor: preset },
7658
7721
  title: preset
7659
7722
  },
7660
- color.toLowerCase() === preset.toLowerCase() && /* @__PURE__ */ React12.createElement(FiCheck6, { className: `drop-shadow-md ${["#ffffff", "#4df5cb", "#84cc16", "#f59e0b"].includes(preset) ? "text-black" : "text-white"}`, size: 12 })
7723
+ (color || "").toLowerCase() === (preset || "").toLowerCase() && /* @__PURE__ */ React12.createElement(FiCheck6, { className: `drop-shadow-md ${["#ffffff", "#4df5cb", "#84cc16", "#f59e0b"].includes(preset) ? "text-black" : "text-white"}`, size: 12 })
7661
7724
  )))), /* @__PURE__ */ React12.createElement("style", null, `
7662
7725
  .custom-react-colorful .react-colorful {
7663
7726
  width: 100%;
@@ -7753,10 +7816,19 @@ function InSceneCreationForm({
7753
7816
  if (typeInput.trim() === "") {
7754
7817
  result = validExistingTypes.filter((t) => !types.includes(t));
7755
7818
  } else {
7756
- const lowercasedInput = typeInput.toLowerCase();
7757
- result = validExistingTypes.filter(
7758
- (t) => t.toLowerCase().includes(lowercasedInput) && !types.includes(t)
7759
- );
7819
+ console.log("InSceneCreationForm: Filtrando tipos com input:", typeInput);
7820
+ try {
7821
+ const lowercasedInput = typeInput.toLowerCase();
7822
+ result = validExistingTypes.filter((t) => {
7823
+ if (!t) {
7824
+ console.warn("InSceneCreationForm: Tipo encontrado como undefined/null durante filtragem");
7825
+ return false;
7826
+ }
7827
+ return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
7828
+ });
7829
+ } catch (err) {
7830
+ console.error("InSceneCreationForm: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
7831
+ }
7760
7832
  }
7761
7833
  if (sourceTypes) {
7762
7834
  const priorityTypes = Array.isArray(sourceTypes) ? sourceTypes : [sourceTypes];
@@ -8606,12 +8678,18 @@ function NodeDetailsPanel({
8606
8678
  if (typeInput.trim() === "") {
8607
8679
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
8608
8680
  } else {
8609
- const lowercasedInput = typeInput.toLowerCase();
8610
- setFilteredTypes(
8611
- validExistingTypes.filter(
8612
- (t) => t.toLowerCase().includes(lowercasedInput) && !types.includes(t)
8613
- )
8614
- );
8681
+ console.log("NodeDetailsPanel: Filtrando tipos com input:", typeInput);
8682
+ try {
8683
+ const lowercasedInput = typeInput.toLowerCase();
8684
+ setFilteredTypes(
8685
+ validExistingTypes.filter((t) => {
8686
+ if (!t) return false;
8687
+ return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
8688
+ })
8689
+ );
8690
+ } catch (err) {
8691
+ console.error("NodeDetailsPanel: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
8692
+ }
8615
8693
  }
8616
8694
  }, [typeInput, existingTypes, types]);
8617
8695
  const handleIntensityChangeLocal = (e) => {
@@ -9108,12 +9186,21 @@ function QuestDetailsPanel({
9108
9186
  if (typeInput.trim() === "") {
9109
9187
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
9110
9188
  } else {
9111
- const lowercasedInput = typeInput.toLowerCase();
9112
- setFilteredTypes(
9113
- validExistingTypes.filter(
9114
- (t) => t.toLowerCase().includes(lowercasedInput) && !types.includes(t)
9115
- )
9116
- );
9189
+ console.log("QuestDetailsPanel: Filtrando tipos com input:", typeInput);
9190
+ try {
9191
+ const lowercasedInput = typeInput.toLowerCase();
9192
+ setFilteredTypes(
9193
+ validExistingTypes.filter((t) => {
9194
+ if (!t) {
9195
+ console.warn("QuestDetailsPanel: Tipo encontrado como undefined/null durante filtragem");
9196
+ return false;
9197
+ }
9198
+ return t.toLowerCase().includes(lowercasedInput) && !types.includes(t);
9199
+ })
9200
+ );
9201
+ } catch (err) {
9202
+ console.error("QuestDetailsPanel: Erro ao filtrar tipos:", err, "typeInput:", typeInput);
9203
+ }
9117
9204
  }
9118
9205
  }, [typeInput, existingTypes, types]);
9119
9206
  const handleCopyLink = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lv-x-software-house/x_view",
3
- "version": "1.2.5-dev.16",
3
+ "version": "1.2.5-dev.18",
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",