diff --git a/web/components/fuzzy_search.test.ts b/web/components/fuzzy_search.test.ts deleted file mode 100644 index ed5af09d..00000000 --- a/web/components/fuzzy_search.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { FilterOption } from "../types.ts"; -import { assertEquals } from "../../test_deps.ts"; -import { fuzzySearchAndSort } from "./fuzzy_search.ts"; - -Deno.test("testFuzzyFilter", () => { - const array: FilterOption[] = [ - { name: "My Company/Hank", orderId: -5 }, - { name: "My Company/Steve Co", orderId: -5 }, - { name: "Other/Steve", orderId: -7 }, - { name: "Steve", orderId: -3 }, - ]; - - // Prioritize match in last path part - const result = fuzzySearchAndSort(array, "Co"); - assertEquals(result.length, 2); - assertEquals(result[0].name, "My Company/Steve Co"); - - // Support slash matches - const result2 = fuzzySearchAndSort(array, "Co/St"); - assertEquals(result2.length, 1); - assertEquals(result2[0].name, "My Company/Steve Co"); - - // Find "St" in both, but pioritize based on orderId - const result3 = fuzzySearchAndSort(array, "St"); - assertEquals(result3.length, 3); - assertEquals(result3[0].name, "Other/Steve"); - - const result4 = fuzzySearchAndSort(array, "Steve"); - assertEquals(result4[0].name, "Steve"); - - // const result2 = fuzzySearchAndSort(array, ""); - // console.log("Result 2", result2); - // assertEquals(result.length, 3); - // assertEquals(result[0].orderId, 1); - - // assertEquals(result[1].name, "Jack"); - // assertEquals(result[1].orderId, 2); - // assertEquals(result[2].name, "Jill"); - // assertEquals(result[2].orderId, 3); -}); diff --git a/web/components/fuzzy_search.ts b/web/components/fuzzy_search.ts deleted file mode 100644 index 7fe2daf2..00000000 --- a/web/components/fuzzy_search.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { FilterOption } from "../types.ts"; - -export const fuzzySearchAndSort = ( - arr: FilterOption[], - searchPhrase: string, -): FilterOption[] => { - // Prepare regular expression: escape special characters, add '.*' around each character - const safePhrase = searchPhrase.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // escape special characters - const searchRegex = new RegExp(Array.from(safePhrase).join(".*"), "i"); // 'i' makes it case-insensitive - - // Fuzzy matching on name using the regular expression - const filtered = arr.filter((item) => searchRegex.test(item.name)); - - // Sorting by exact match, whether match is in part after '/', then by orderId - filtered.sort((a, b) => { - const aNamePart = a.name.includes("/") - ? a.name.split("/").pop() || "" - : a.name; - const bNamePart = b.name.includes("/") - ? b.name.split("/").pop() || "" - : b.name; - - const aMatchInPart = searchRegex.test(aNamePart); - const bMatchInPart = searchRegex.test(bNamePart); - - // Check for exact match - const aExactMatch = a.name.toLowerCase() === searchPhrase.toLowerCase(); - const bExactMatch = b.name.toLowerCase() === searchPhrase.toLowerCase(); - - if (aExactMatch !== bExactMatch) { - // If one is an exact match and the other is not, prioritize the exact match - return aExactMatch ? -1 : 1; - } else if (aMatchInPart !== bMatchInPart) { - // If one matches in the part after '/' and the other doesn't, prioritize the one that does - return aMatchInPart ? -1 : 1; - } else { - // If both match in the same part of name, prioritize by orderId - const aOrder = a.orderId !== undefined ? a.orderId : Infinity; - const bOrder = b.orderId !== undefined ? b.orderId : Infinity; - return aOrder - bOrder; - } - }); - - return filtered; -};