Skip to content

Commit ef3ba17

Browse files
committed
WIP Add a suggestion search for filters
1 parent c99d7af commit ef3ba17

File tree

3 files changed

+84
-2
lines changed

3 files changed

+84
-2
lines changed

frontend/src/App.svelte

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,22 @@
77
import Filter from "./lib/Filter.svelte";
88
import ForkMe from "./lib/ForkMe.svelte";
99
import TextFilter from "./lib/TextFilter.svelte";
10+
import CategoryFilter from "./lib/CategoryFilter.svelte";
1011
1112
export let BUILD_DATE: string;
1213
1314
const t_crates = crates as FullCrate[];
1415
let t_indexes = indexes as Indexes;
1516
17+
const filters = Object.fromEntries([
18+
"category",
19+
"dependencies",
20+
"interfaces",
21+
"license",
22+
"package",
23+
"rust_version",
24+
].map((cat) => [cat, Object.keys(t_indexes[cat] as any)]));
25+
1626
let selected_d: number[][] = [];
1727
let selected_l: number[][] = [];
1828
let selected_r: number[][] = [];
@@ -59,6 +69,10 @@
5969
<Filter name="Rust Version" values={t_indexes.rust_version} bind:selected={selected_r}/>
6070
</div>
6171

72+
<br/>
73+
74+
<CategoryFilter indexes={t_indexes}/>
75+
6276
<CrateList crates={t_crates} filter={selected_crates}/>
6377

6478
<div>Page generated at: {BUILD_DATE}</div>
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<script lang="ts">
2+
import type {FullCrate, Indexes} from "../crate-db";
3+
import Fuse, {type FuseResult} from "fuse.js";
4+
5+
export let indexes: Indexes;
6+
7+
let search: string = "";
8+
9+
const {
10+
category,
11+
has_dev_board,
12+
has_kicad,
13+
license,
14+
interfaces,
15+
rust_version,
16+
dependencies,
17+
package: pack,
18+
...rest
19+
} = indexes;
20+
const _is_exhaustive: Required<typeof rest> = {};
21+
22+
const items = [
23+
{"value": "kicad", "filter": "has_kicad"},
24+
{"value": "dev board", "filter": "has_dev_board"},
25+
{"value": "rust version", "filter": "rust_version"}
26+
].concat(
27+
Object.keys(category).map((k) => ({value: k, filter: "category"})),
28+
Object.keys(license).map((k) => ({value: k, filter: "license"})),
29+
Object.keys(interfaces).map((k) => ({value: k, filter: "interfaces"})),
30+
Object.keys(dependencies).map((k) => ({value: k, filter: "dependencies"})),
31+
Object.keys(pack).map((k) => ({value: k, filter: "pack"})),
32+
);
33+
34+
const options = {
35+
keys: ["value", "filter"],
36+
};
37+
const fuse = new Fuse(items, options)
38+
39+
type FuseResultList = FuseResult<{ filter: string, value: string }>[];
40+
41+
function onlyTop(results: FuseResultList, count: number): FuseResultList {
42+
let seen: any = {};
43+
return results.filter((v) => {
44+
if (seen[v.item.filter] == undefined) {
45+
seen[v.item.filter] = 1;
46+
} else {
47+
seen[v.item.filter] += 1;
48+
}
49+
50+
return seen[v.item.filter] <= count;
51+
});
52+
}
53+
54+
$: results = fuse.search(search)
55+
$: top_results = onlyTop(results, 3)
56+
</script>
57+
58+
<label>
59+
Search Category:
60+
<input type="text" bind:value={search}>
61+
</label>
62+
63+
<ul>
64+
{#each top_results as res}
65+
<li>{res.item.filter}: {res.item.value}</li>
66+
{/each}
67+
</ul>

frontend/src/lib/TextFilter.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
$: selected = search === "" ? [] : [results.map((r) => r.refIndex)]
2828
</script>
2929

30-
<div>
30+
<label>
31+
Search text:
3132
<input type="text" bind:value={search}>
32-
</div>
33+
</label>

0 commit comments

Comments
 (0)