diff --git a/package.json b/package.json index c04c7c9cf..eea76a0b9 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,8 @@ "react-color": "^2.14.0", "react-dom": "npm:@hot-loader/react-dom", "react-easy-emoji": "^1.2.0", + "react-fuzzy-highlighter": "^0.3.1", "react-helmet": "6.0.0-beta", - "react-highlight-words": "^0.11.0", "react-i18next": "^11.0.0", "react-loading-skeleton": "^1.1.2", "react-markdown": "^4.1.0", diff --git a/source/components/SearchBar.tsx b/source/components/SearchBar.tsx index 91b7eda91..fac84ea9e 100644 --- a/source/components/SearchBar.tsx +++ b/source/components/SearchBar.tsx @@ -2,7 +2,7 @@ import { SitePathsContext } from 'Components/utils/withSitePaths' import { parentName } from 'Engine/rules.js' import { pick, sortBy, take } from 'ramda' import React, { useContext, useEffect, useState } from 'react' -import Highlighter from 'react-highlight-words' +import FuzzyHighlighter, { Highlighter } from 'react-fuzzy-highlighter' import { useTranslation } from 'react-i18next' import { Link, Redirect, useHistory } from 'react-router-dom' import { Rule } from 'Types/rule' @@ -59,6 +59,12 @@ export default function SearchBar({ let renderOption = (option: Option) => { let { title, dottedName, name } = option + let espace = parentName(dottedName) + ? parentName(dottedName) + .split(' . ') + .map(capitalise0) + .join(' - ') + : '' return (
  • - + + {({ results, formattedResults, timing }) => { + return ( + <> + {formattedResults.length === 0 && {espace}} + {formattedResults.map((formattedResult, resultIndex) => { + if (formattedResult.formatted.title === undefined) { + return null + } + + return ( + + + + ) + })} + + ) + }} + - - - + + + {({ results, formattedResults, timing }) => { + return ( + <> + {formattedResults.length === 0 && ( + + {title || capitalise0(name) || ''} + + )} + {formattedResults.map((formattedResult, resultIndex) => { + if (formattedResult.formatted.title === undefined) { + return null + } + + return ( + + + + ) + })} + + ) + }} +
  • ) } diff --git a/source/components/SearchButton.tsx b/source/components/SearchButton.tsx index aac0fbc4c..475272b76 100644 --- a/source/components/SearchButton.tsx +++ b/source/components/SearchButton.tsx @@ -22,7 +22,6 @@ export default function SearchButton({ invisibleButton }: SearchButtonProps) { return false } window.addEventListener('keydown', handleKeyDown) - return () => { window.removeEventListener('keydown', handleKeyDown) } diff --git a/yarn.lock b/yarn.lock index 0976ae81d..810e264ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4835,7 +4835,7 @@ functions-have-names@^1.2.0: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== -fuse.js@^3.4.2: +fuse.js@^3.4.2, fuse.js@^3.4.5: version "3.4.6" resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.6.tgz#545c3411fed88bf2e27c457cab6e73e7af697a45" integrity sha512-H6aJY4UpLFwxj1+5nAvufom5b2BT2v45P1MkPvdGIK8fWjQx/7o6tTT1+ALV0yawQvbmvCF0ufl2et8eJ7v7Cg== @@ -5190,11 +5190,6 @@ he@1.2.x, he@^1.1.0, he@^1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -highlight-words-core@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/highlight-words-core/-/highlight-words-core-1.2.2.tgz#1eff6d7d9f0a22f155042a00791237791b1eeaaa" - integrity sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg== - highlight.js@~9.13.0: version "9.13.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" @@ -8867,6 +8862,15 @@ react-fast-compare@^2.0.2: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fuzzy-highlighter@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/react-fuzzy-highlighter/-/react-fuzzy-highlighter-0.3.1.tgz#8359e0298e12203a39ecd954ffce3679b7a67190" + integrity sha512-s+HSr8/tZdDXprkxEBi80O0dFFPkO/d4RUFKaiw9FE4oV6hfnj/pFvFuyqGhnUS0AeTMj36WUCKdMlsq/jtyyQ== + dependencies: + fuse.js "^3.4.5" + set-value "^3.0.1" + strind "^0.3.0" + react-helmet@6.0.0-beta: version "6.0.0-beta" resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.0.0-beta.tgz#1f2ac04521951486e4fce3296d0c88aae8cabd5c" @@ -8877,14 +8881,6 @@ react-helmet@6.0.0-beta: react-fast-compare "^2.0.2" react-side-effect "^1.1.0" -react-highlight-words@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/react-highlight-words/-/react-highlight-words-0.11.0.tgz#4f3c2039a8fd275f3ab795e59946b0324d8e6bee" - integrity sha512-b+fgdQXNjX6RwHfiBYn6qH2D2mJEDNLuxdsqRseIiQffoCAoj7naMQ5EktUkmo9Bh1mXq/aMpJbdx7Lf2PytcQ== - dependencies: - highlight-words-core "^1.2.0" - prop-types "^15.5.8" - react-hot-loader@^4.12.15: version "4.12.18" resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.18.tgz#a9029e34af2690d76208f9a35189d73c2dfea6a7" @@ -9825,6 +9821,13 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" +set-value@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-3.0.1.tgz#52c82af7653ba69eb1db92e81f5cdb32739b9e95" + integrity sha512-w6n3GUPYAWQj4ZyHWzD7K2FnFXHx9OTwJYbWg+6nXjG8sCLfs9DGv+KlqglKIIJx+ks7MlFuwFW2RBPb+8V+xg== + dependencies: + is-plain-object "^2.0.4" + setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -10145,6 +10148,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +strind@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/strind/-/strind-0.3.1.tgz#1971292da9c45caeac1a4d86324da20f4a417cda" + integrity sha512-GDpPHZTkWMZcYesCF5MoUR38mQa6n0oo6V8ZBoIeU5pCJevbxmHISFRWy1qheVPZhNm3syOG2m0Hn9QMuIugHg== + string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"