This is an automated email from the ASF dual-hosted git repository.

tiagobento pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools.git


The following commit(s) were added to refs/heads/main by this push:
     new 082fda209c4 kie-issues#1142: DMN Editor: Data Type searching mechanism 
should not be startsWith only (#3033)
082fda209c4 is described below

commit 082fda209c4bc3b1117bc21892dbca96583cb752
Author: Kusuma04-dev <[email protected]>
AuthorDate: Thu May 8 18:25:35 2025 +0530

    kie-issues#1142: DMN Editor: Data Type searching mechanism should not be 
startsWith only (#3033)
    
    Co-authored-by: chinnamatli kusumalatha 
<[email protected]>
---
 packages/dmn-editor/src/dataTypes/DataTypes.tsx    |   5 +-
 .../dmn-editor/src/dataTypes/TypeRefSelector.tsx   | 125 +++++++++++++++------
 2 files changed, 89 insertions(+), 41 deletions(-)

diff --git a/packages/dmn-editor/src/dataTypes/DataTypes.tsx 
b/packages/dmn-editor/src/dataTypes/DataTypes.tsx
index 3af7e718c4c..0ffa364bc70 100644
--- a/packages/dmn-editor/src/dataTypes/DataTypes.tsx
+++ b/packages/dmn-editor/src/dataTypes/DataTypes.tsx
@@ -123,10 +123,7 @@ export function DataTypes() {
   }, [activeItemDefinitionId, allDataTypesById]);
 
   const filteredTree = useMemo(
-    () =>
-      dataTypesTree.filter(({ itemDefinition: dataType }) =>
-        dataType["@_name"].toLowerCase().includes(filter.toLowerCase())
-      ),
+    () => dataTypesTree.filter(({ feelName: dataType }) => 
dataType.toLowerCase().includes(filter.toLowerCase())),
     [filter, dataTypesTree]
   );
 
diff --git a/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx 
b/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
index 86f593b169f..6a42236008d 100644
--- a/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
+++ b/packages/dmn-editor/src/dataTypes/TypeRefSelector.tsx
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-import { DmnBuiltInDataType, generateUuid } from 
"@kie-tools/boxed-expression-component/dist/api";
+import { DmnBuiltInDataType, DmnDataType, generateUuid } from 
"@kie-tools/boxed-expression-component/dist/api";
 import { Select, SelectGroup, SelectOption, SelectVariant } from 
"@patternfly/react-core/deprecated";
 import * as React from "react";
-import { useCallback, useRef, useState } from "react";
+import { useCallback, useRef, useState, useMemo } from "react";
 import { TypeRefLabel } from "./TypeRefLabel";
 import { ArrowUpIcon } from 
"@patternfly/react-icons/dist/js/icons/arrow-up-icon";
 import { DmnEditorTab } from "../store/Store";
@@ -106,6 +106,90 @@ export function TypeRefSelector({
 
   const { maxHeight, direction } = useInViewSelect(heightRef ?? { current: 
document.body }, toggleRef, zoom ?? 1);
 
+  const buildSelectGroups = useMemo(
+    () =>
+      (
+        builtInFeelTypes: DmnDataType[],
+        customDataTypes: DataType[],
+        externalDataTypes: DataType[],
+        searchText = ""
+      ): React.ReactElement[] => {
+        const filteredBuiltInFeelTypes = builtInFeelTypes.filter(
+          (dt) => !searchText || (dt.name || 
"").toLowerCase().includes(searchText.toLowerCase())
+        );
+        const filteredCustomDataTypes = customDataTypes.filter(
+          (dt) => !searchText || (dt.feelName || 
"").toLowerCase().includes(searchText.toLowerCase())
+        );
+        const filteredExternalDataTypes = externalDataTypes.filter(
+          (dt) => !searchText || (dt.feelName || 
"").toLowerCase().includes(searchText.toLowerCase())
+        );
+
+        const selectGroups = [];
+        if (filteredBuiltInFeelTypes.length > 0 || !searchText) {
+          selectGroups.push(
+            <SelectGroup label="Built-in" key="builtin" style={{ minWidth: 
"300px" }}>
+              {filteredBuiltInFeelTypes.map((dt) => (
+                <SelectOption key={dt.name} value={dt.name}>
+                  {dt.name}
+                </SelectOption>
+              ))}
+            </SelectGroup>
+          );
+        }
+        if (filteredCustomDataTypes.length > 0 || !searchText) {
+          selectGroups.push(
+            <SelectGroup label="Custom" key="custom" style={{ minWidth: 
"300px" }}>
+              {filteredCustomDataTypes.length > 0 ? (
+                filteredCustomDataTypes.map((dt) => (
+                  <SelectOption key={dt.feelName} value={dt.feelName}>
+                    {dt.feelName}
+                    &nbsp;
+                    <TypeRefLabel
+                      typeRef={dt.itemDefinition.typeRef?.__$$text}
+                      relativeToNamespace={dt.namespace}
+                      isCollection={dt.itemDefinition?.["@_isCollection"]}
+                    />
+                  </SelectOption>
+                ))
+              ) : (
+                <SelectOption key={"None"} value={"None"} isDisabled={true} />
+              )}
+            </SelectGroup>
+          );
+        }
+        if (filteredExternalDataTypes.length > 0 || !searchText) {
+          selectGroups.push(
+            <SelectGroup label="External" key="external" style={{ minWidth: 
"300px" }}>
+              {filteredExternalDataTypes.length > 0 ? (
+                filteredExternalDataTypes.map((dt) => (
+                  <SelectOption key={dt.feelName} value={dt.feelName}>
+                    {dt.feelName}
+                    &nbsp;
+                    <TypeRefLabel
+                      typeRef={dt.itemDefinition.typeRef?.__$$text}
+                      relativeToNamespace={dt.namespace}
+                      isCollection={dt.itemDefinition?.["@_isCollection"]}
+                    />
+                  </SelectOption>
+                ))
+              ) : (
+                <SelectOption key={"None"} value={"None"} isDisabled={true} />
+              )}
+            </SelectGroup>
+          );
+        }
+        return selectGroups;
+      },
+    []
+  );
+
+  const onFilter = useCallback(
+    (_event: React.ChangeEvent<HTMLInputElement> | null, textInput: string) => 
{
+      return buildSelectGroups(builtInFeelTypes, customDataTypes, 
externalDataTypes, textInput);
+    },
+    [buildSelectGroups, customDataTypes, externalDataTypes]
+  );
+
   return (
     <Flex
       id={id}
@@ -135,6 +219,7 @@ export function TypeRefSelector({
         variant={SelectVariant.typeahead}
         typeAheadAriaLabel={DmnBuiltInDataType.Undefined}
         onToggle={(_event, val) => _onToggle(val)}
+        onFilter={onFilter}
         onSelect={(e, v) => {
           _onToggle(false);
           onChange(v === DmnBuiltInDataType.Undefined ? undefined : (v as 
string));
@@ -152,41 +237,7 @@ export function TypeRefSelector({
         direction={direction}
         onWheelCapture={(e) => e.stopPropagation()} // Necessary so that 
Reactflow doesn't mess with this event.
       >
-        <SelectGroup label="Built-in" key="builtin" style={{ minWidth: "300px" 
}}>
-          {builtInFeelTypes.map((dt) => (
-            <SelectOption key={dt.name} value={dt.name}>
-              {dt.name}
-            </SelectOption>
-          ))}
-        </SelectGroup>
-        <SelectGroup label="Custom" key="custom" style={{ minWidth: "300px" }}>
-          {(customDataTypes.length > 0 &&
-            customDataTypes.map((dt) => (
-              <SelectOption key={dt.feelName} value={dt.feelName}>
-                {dt.feelName}
-                &nbsp;
-                <TypeRefLabel
-                  typeRef={dt.itemDefinition.typeRef?.__$$text}
-                  relativeToNamespace={dt.namespace}
-                  isCollection={dt.itemDefinition?.["@_isCollection"]}
-                />
-              </SelectOption>
-            ))) || <SelectOption key={"None"} value={"None"} isDisabled={true} 
/>}
-        </SelectGroup>
-        <SelectGroup label="External" key="external" style={{ minWidth: 
"300px" }}>
-          {(externalDataTypes.length > 0 &&
-            externalDataTypes.map((dt) => (
-              <SelectOption key={dt.feelName} value={dt.feelName}>
-                {dt.feelName}
-                &nbsp;
-                <TypeRefLabel
-                  typeRef={dt.itemDefinition.typeRef?.__$$text}
-                  relativeToNamespace={dt.namespace}
-                  isCollection={dt.itemDefinition?.["@_isCollection"]}
-                />
-              </SelectOption>
-            ))) || <SelectOption key={"None"} value={"None"} isDisabled={true} 
/>}
-        </SelectGroup>
+        {buildSelectGroups(builtInFeelTypes, customDataTypes, 
externalDataTypes)}
       </Select>
     </Flex>
   );


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to