diff --git a/CHANGELOG.md b/CHANGELOG.md index 529701361..0a45d2998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Added filtering panel for filtering results by repository and by language. ([#48](https://github.com/sourcebot-dev/sourcebot/pull/48)) + ## [2.1.1] - 2024-10-25 ### Fixed diff --git a/packages/web/package.json b/packages/web/package.json index ae7cb054f..cc523f8ee 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -45,6 +45,7 @@ "embla-carousel-auto-scroll": "^8.3.0", "embla-carousel-react": "^8.3.0", "escape-string-regexp": "^5.0.0", + "fuse.js": "^7.0.0", "http-status-codes": "^2.3.0", "lucide-react": "^0.435.0", "next": "14.2.10", diff --git a/packages/web/public/languages/file_type_assembly.svg b/packages/web/public/languages/file_type_assembly.svg new file mode 100644 index 000000000..4c4584b5a --- /dev/null +++ b/packages/web/public/languages/file_type_assembly.svg @@ -0,0 +1 @@ +file_type_assembly \ No newline at end of file diff --git a/packages/web/public/languages/file_type_c3.svg b/packages/web/public/languages/file_type_c3.svg new file mode 100644 index 000000000..2d8ac3942 --- /dev/null +++ b/packages/web/public/languages/file_type_c3.svg @@ -0,0 +1 @@ +file_type_c3 \ No newline at end of file diff --git a/packages/web/public/languages/file_type_cpp3.svg b/packages/web/public/languages/file_type_cpp3.svg new file mode 100644 index 000000000..b999f2eab --- /dev/null +++ b/packages/web/public/languages/file_type_cpp3.svg @@ -0,0 +1 @@ +file_type_cpp3 \ No newline at end of file diff --git a/packages/web/public/languages/file_type_csharp2.svg b/packages/web/public/languages/file_type_csharp2.svg new file mode 100644 index 000000000..882bf4a30 --- /dev/null +++ b/packages/web/public/languages/file_type_csharp2.svg @@ -0,0 +1 @@ +file_type_csharp2 \ No newline at end of file diff --git a/packages/web/public/languages/file_type_css.svg b/packages/web/public/languages/file_type_css.svg new file mode 100644 index 000000000..3d8959a04 --- /dev/null +++ b/packages/web/public/languages/file_type_css.svg @@ -0,0 +1 @@ +file_type_css \ No newline at end of file diff --git a/packages/web/public/languages/file_type_dartlang.svg b/packages/web/public/languages/file_type_dartlang.svg new file mode 100644 index 000000000..0b258097a --- /dev/null +++ b/packages/web/public/languages/file_type_dartlang.svg @@ -0,0 +1 @@ +file_type_dartlang \ No newline at end of file diff --git a/packages/web/public/languages/file_type_go.svg b/packages/web/public/languages/file_type_go.svg new file mode 100644 index 000000000..05a1baa1b --- /dev/null +++ b/packages/web/public/languages/file_type_go.svg @@ -0,0 +1 @@ +file_type_go \ No newline at end of file diff --git a/packages/web/public/languages/file_type_haskell.svg b/packages/web/public/languages/file_type_haskell.svg new file mode 100644 index 000000000..f818dac43 --- /dev/null +++ b/packages/web/public/languages/file_type_haskell.svg @@ -0,0 +1 @@ +file_type_haskell \ No newline at end of file diff --git a/packages/web/public/languages/file_type_html.svg b/packages/web/public/languages/file_type_html.svg new file mode 100644 index 000000000..a0152d868 --- /dev/null +++ b/packages/web/public/languages/file_type_html.svg @@ -0,0 +1 @@ +file_type_html \ No newline at end of file diff --git a/packages/web/public/languages/file_type_java.svg b/packages/web/public/languages/file_type_java.svg new file mode 100644 index 000000000..14121c58f --- /dev/null +++ b/packages/web/public/languages/file_type_java.svg @@ -0,0 +1 @@ +file_type_java \ No newline at end of file diff --git a/packages/web/public/languages/file_type_js_official.svg b/packages/web/public/languages/file_type_js_official.svg new file mode 100644 index 000000000..bcfade410 --- /dev/null +++ b/packages/web/public/languages/file_type_js_official.svg @@ -0,0 +1 @@ +file_type_js_official \ No newline at end of file diff --git a/packages/web/public/languages/file_type_json.svg b/packages/web/public/languages/file_type_json.svg new file mode 100644 index 000000000..26c39ba7c --- /dev/null +++ b/packages/web/public/languages/file_type_json.svg @@ -0,0 +1 @@ +file_type_json \ No newline at end of file diff --git a/packages/web/public/languages/file_type_julia.svg b/packages/web/public/languages/file_type_julia.svg new file mode 100644 index 000000000..49343a27e --- /dev/null +++ b/packages/web/public/languages/file_type_julia.svg @@ -0,0 +1 @@ +file_type_julia \ No newline at end of file diff --git a/packages/web/public/languages/file_type_kotlin.svg b/packages/web/public/languages/file_type_kotlin.svg new file mode 100644 index 000000000..4b0961cb5 --- /dev/null +++ b/packages/web/public/languages/file_type_kotlin.svg @@ -0,0 +1 @@ +file_type_kotlin \ No newline at end of file diff --git a/packages/web/public/languages/file_type_lua.svg b/packages/web/public/languages/file_type_lua.svg new file mode 100644 index 000000000..44f3fa086 --- /dev/null +++ b/packages/web/public/languages/file_type_lua.svg @@ -0,0 +1 @@ +file_type_lua \ No newline at end of file diff --git a/packages/web/public/languages/file_type_markdown.svg b/packages/web/public/languages/file_type_markdown.svg new file mode 100644 index 000000000..c5b32a6f7 --- /dev/null +++ b/packages/web/public/languages/file_type_markdown.svg @@ -0,0 +1 @@ +file_type_markdown \ No newline at end of file diff --git a/packages/web/public/languages/file_type_matlab.svg b/packages/web/public/languages/file_type_matlab.svg new file mode 100644 index 000000000..0b5e37553 --- /dev/null +++ b/packages/web/public/languages/file_type_matlab.svg @@ -0,0 +1 @@ +file_type_matlab \ No newline at end of file diff --git a/packages/web/public/languages/file_type_objectivec.svg b/packages/web/public/languages/file_type_objectivec.svg new file mode 100644 index 000000000..fe0a61be7 --- /dev/null +++ b/packages/web/public/languages/file_type_objectivec.svg @@ -0,0 +1 @@ +file_type_objectivec \ No newline at end of file diff --git a/packages/web/public/languages/file_type_ocaml.svg b/packages/web/public/languages/file_type_ocaml.svg new file mode 100644 index 000000000..8e5d8e9a1 --- /dev/null +++ b/packages/web/public/languages/file_type_ocaml.svg @@ -0,0 +1 @@ +file_type_ocaml \ No newline at end of file diff --git a/packages/web/public/languages/file_type_perl.svg b/packages/web/public/languages/file_type_perl.svg new file mode 100644 index 000000000..8b8be680d --- /dev/null +++ b/packages/web/public/languages/file_type_perl.svg @@ -0,0 +1 @@ +file_type_perl \ No newline at end of file diff --git a/packages/web/public/languages/file_type_php3.svg b/packages/web/public/languages/file_type_php3.svg new file mode 100644 index 000000000..aaed635ec --- /dev/null +++ b/packages/web/public/languages/file_type_php3.svg @@ -0,0 +1 @@ +file_type_php3 \ No newline at end of file diff --git a/packages/web/public/languages/file_type_powershell.svg b/packages/web/public/languages/file_type_powershell.svg new file mode 100644 index 000000000..05c95b314 --- /dev/null +++ b/packages/web/public/languages/file_type_powershell.svg @@ -0,0 +1 @@ +file_type_powershell \ No newline at end of file diff --git a/packages/web/public/languages/file_type_python.svg b/packages/web/public/languages/file_type_python.svg new file mode 100644 index 000000000..677f2165f --- /dev/null +++ b/packages/web/public/languages/file_type_python.svg @@ -0,0 +1 @@ +file_type_python \ No newline at end of file diff --git a/packages/web/public/languages/file_type_r.svg b/packages/web/public/languages/file_type_r.svg new file mode 100644 index 000000000..28f49c5eb --- /dev/null +++ b/packages/web/public/languages/file_type_r.svg @@ -0,0 +1 @@ +file_type_r \ No newline at end of file diff --git a/packages/web/public/languages/file_type_ruby.svg b/packages/web/public/languages/file_type_ruby.svg new file mode 100644 index 000000000..9443db1f7 --- /dev/null +++ b/packages/web/public/languages/file_type_ruby.svg @@ -0,0 +1 @@ +file_type_ruby \ No newline at end of file diff --git a/packages/web/public/languages/file_type_rust.svg b/packages/web/public/languages/file_type_rust.svg new file mode 100644 index 000000000..327fd2993 --- /dev/null +++ b/packages/web/public/languages/file_type_rust.svg @@ -0,0 +1 @@ +file_type_rust \ No newline at end of file diff --git a/packages/web/public/languages/file_type_shell.svg b/packages/web/public/languages/file_type_shell.svg new file mode 100644 index 000000000..17d382130 --- /dev/null +++ b/packages/web/public/languages/file_type_shell.svg @@ -0,0 +1 @@ +file_type_shell \ No newline at end of file diff --git a/packages/web/public/languages/file_type_swift.svg b/packages/web/public/languages/file_type_swift.svg new file mode 100644 index 000000000..c232d1f78 --- /dev/null +++ b/packages/web/public/languages/file_type_swift.svg @@ -0,0 +1 @@ +file_type_swift \ No newline at end of file diff --git a/packages/web/public/languages/file_type_tex.svg b/packages/web/public/languages/file_type_tex.svg new file mode 100644 index 000000000..952a2decc --- /dev/null +++ b/packages/web/public/languages/file_type_tex.svg @@ -0,0 +1 @@ +file_type_tex \ No newline at end of file diff --git a/packages/web/public/languages/file_type_text.svg b/packages/web/public/languages/file_type_text.svg new file mode 100644 index 000000000..a5562edd6 --- /dev/null +++ b/packages/web/public/languages/file_type_text.svg @@ -0,0 +1 @@ +file_type_text \ No newline at end of file diff --git a/packages/web/public/languages/file_type_typescript_official.svg b/packages/web/public/languages/file_type_typescript_official.svg new file mode 100644 index 000000000..bac7e33c5 --- /dev/null +++ b/packages/web/public/languages/file_type_typescript_official.svg @@ -0,0 +1 @@ +file_type_typescript_official \ No newline at end of file diff --git a/packages/web/public/languages/file_type_yaml.svg b/packages/web/public/languages/file_type_yaml.svg new file mode 100644 index 000000000..601979d57 --- /dev/null +++ b/packages/web/public/languages/file_type_yaml.svg @@ -0,0 +1 @@ +file_type_yaml \ No newline at end of file diff --git a/packages/web/public/languages/file_type_zig.svg b/packages/web/public/languages/file_type_zig.svg new file mode 100644 index 000000000..7e9546528 --- /dev/null +++ b/packages/web/public/languages/file_type_zig.svg @@ -0,0 +1 @@ +file_type_zig \ No newline at end of file diff --git a/packages/web/src/app/globals.css b/packages/web/src/app/globals.css index 7153c1ee7..d1ff0cbb8 100644 --- a/packages/web/src/app/globals.css +++ b/packages/web/src/app/globals.css @@ -85,4 +85,12 @@ .cm-editor .cm-searchMatch-selected { border: solid; +} + +.truncate-start { + direction: rtl; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } \ No newline at end of file diff --git a/packages/web/src/app/repositoryCarousel.tsx b/packages/web/src/app/repositoryCarousel.tsx index f67aea0f4..0969ff81d 100644 --- a/packages/web/src/app/repositoryCarousel.tsx +++ b/packages/web/src/app/repositoryCarousel.tsx @@ -64,7 +64,7 @@ const RepositoryBadge = ({ repoIcon: {info.costHostName}, repoName: info.repoName, repoLink: info.repoLink, diff --git a/packages/web/src/app/search/components/codePreviewPanel/codePreview.tsx b/packages/web/src/app/search/components/codePreviewPanel/codePreview.tsx index 35f764dae..3aa6fb343 100644 --- a/packages/web/src/app/search/components/codePreviewPanel/codePreview.tsx +++ b/packages/web/src/app/search/components/codePreviewPanel/codePreview.tsx @@ -43,8 +43,8 @@ export const CodePreview = ({ }: CodePreviewProps) => { const editorRef = useRef(null); - const [ keymapType ] = useKeymapType(); - const { theme } = useThemeNormalized(); + const [keymapType] = useKeymapType(); + const { theme } = useThemeNormalized(); const [gutterWidth, setGutterWidth] = useState(0); const keymapExtension = useExtensionWithDependency( @@ -109,7 +109,9 @@ export const CodePreview = ({ return (
-
+
+ + {/* Gutter icon */}
+
+ + {/* File path */} +
{ if (file?.link) { window.open(file.link, "_blank"); } }} + title={file?.filepath} > {file?.filepath}
-
+ +
+ {/* Match selector */} {file && file.matches.length > 0 && ( <>

{`${selectedMatchIndex + 1} of ${ranges.length}`}

@@ -154,6 +163,8 @@ export const CodePreview = ({ )} + + {/* Close button */}
); } + +interface PanelGroupProps { + fileMatches: SearchResultFile[]; + isMoreResultsButtonVisible?: boolean; + onLoadMoreResults: () => void; +} + +const PanelGroup = ({ + fileMatches, + isMoreResultsButtonVisible, + onLoadMoreResults, +}: PanelGroupProps) => { + const [selectedMatchIndex, setSelectedMatchIndex] = useState(0); + const [selectedFile, setSelectedFile] = useState(undefined); + const [filteredFileMatches, setFilteredFileMatches] = useState(fileMatches); + + const codePreviewPanelRef = useRef(null); + useEffect(() => { + if (selectedFile) { + codePreviewPanelRef.current?.expand(); + } else { + codePreviewPanelRef.current?.collapse(); + } + }, [selectedFile]); + + return ( + + {/* ~~ Filter panel ~~ */} + + { + setFilteredFileMatches(filteredFileMatches) + }} + /> + + + + {/* ~~ Search results ~~ */} + + {filteredFileMatches.length > 0 ? ( + + { + setSelectedFile(fileMatch); + }} + onMatchIndexChanged={(matchIndex) => { + setSelectedMatchIndex(matchIndex); + }} + /> + {isMoreResultsButtonVisible && ( +
+ + Load more results + +
+ )} + +
+ ) : ( +
+

No results found

+
+ )} +
+ + + {/* ~~ Code preview ~~ */} + + setSelectedFile(undefined)} + selectedMatchIndex={selectedMatchIndex} + onSelectedMatchIndexChange={setSelectedMatchIndex} + /> + +
+ ) +} \ No newline at end of file diff --git a/packages/web/src/lib/utils.ts b/packages/web/src/lib/utils.ts index c04def13b..38846d5f2 100644 --- a/packages/web/src/lib/utils.ts +++ b/packages/web/src/lib/utils.ts @@ -35,7 +35,7 @@ type CodeHostInfo = { costHostName: string; repoLink: string; icon: string; - iconClassname?: string; + iconClassName?: string; } export const getRepoCodeHostInfo = (repoName: string): CodeHostInfo | undefined => { @@ -46,7 +46,7 @@ export const getRepoCodeHostInfo = (repoName: string): CodeHostInfo | undefined costHostName: "GitHub", repoLink: `https://${repoName}`, icon: githubLogo, - iconClassname: "dark:invert", + iconClassName: "dark:invert", } } diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 7b2858930..6b2f2e65a 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -18,7 +18,8 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@/public/*": ["./public/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/yarn.lock b/yarn.lock index df394cffc..6ffb2bc52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2739,6 +2739,11 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +fuse.js@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" + integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"