Skip to content

Commit 2001dfa

Browse files
committed
improve search performance + save state in url
1 parent 90d7bda commit 2001dfa

3 files changed

Lines changed: 33 additions & 24 deletions

File tree

src/lib/components/script.svelte

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,14 @@
9797
<p>{format(new Date(data.date), 'MMMM d, YYY')}</p>
9898
{/if}
9999
{/if}
100-
<h4>Requirements</h4>
101-
{#if data.requireSelection}
102-
<p>Requires music selection to run</p>
103-
{/if}
104-
{#if data.requireScore}
105-
<p>Requires score view to run</p>
100+
{#if data.requireSelection || data.requireScore}
101+
<h4>Requirements</h4>
102+
{#if data.requireSelection}
103+
<p>Requires music selection to run</p>
104+
{/if}
105+
{#if data.requireScore}
106+
<p>Requires score view to run</p>
107+
{/if}
106108
{/if}
107109
{#if data.copyright}
108110
<h4>Licence</h4>

src/routes/__layout.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@
3030
<Header sticky page="{$page.path}">
3131
<HeaderBrand text="JW Lua Scripts" slot="left" />
3232
<svelte:fragment slot="right">
33-
<HeaderLink href="/docs/getting-started">Docs</HeaderLink>
33+
<HeaderLink href="/docs/getting-started">Develper docs</HeaderLink>
3434
<HeaderLink href="{githubRepoUrl}"><Github title="Github" size="{6}" /></HeaderLink>
3535
</svelte:fragment>
3636
<svelte:fragment slot="mobile">
3737
<HeaderMobileSubgroup items="{libraryPages}" basePath="/docs">
38-
<HeaderMobileLink href="/docs/getting-started" slot="main">Docs</HeaderMobileLink>
38+
<HeaderMobileLink href="/docs/getting-started" slot="main">
39+
Developer docs
40+
</HeaderMobileLink>
3941
</HeaderMobileSubgroup>
4042
<HeaderMobileLink href="{githubRepoUrl}">
4143
<Github title="Github" size="{6}" />

src/routes/index.svelte

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
<script lang="ts">
66
import { Search } from 'js-search'
7+
import { page } from '$app/stores'
78
89
import FileCode from '@nick-mazuk/ui-svelte/src/elements/marketing-icon/file-code.svelte'
910
import EmptyState from '@nick-mazuk/ui-svelte/src/components/empty-state/empty-state.svelte'
@@ -23,30 +24,31 @@
2324
search.addIndex(['author', 'name'])
2425
search.addIndex('categories')
2526
26-
const allNames = new Set<string>()
27+
const allIndexes = new Set<number>()
2728
2829
const normalizeName = (name: string) => name.normalize('NFD').replace(/[\u0300-\u036f]/g, '')
29-
scripts.forEach((script) => {
30+
scripts.forEach((script, index) => {
3031
search.addDocument({
3132
...script,
3233
name: normalizeName(script.name),
34+
index,
3335
})
34-
allNames.add(normalizeName(script.name))
36+
allIndexes.add(index)
3537
})
3638
37-
let searchValue = ''
39+
let searchValue = $page.query.get('search') ?? ''
3840
3941
const handleSearchChange = (event: TextInputChangeEvent) =>
4042
(searchValue = event.detail.parsedValue)
4143
42-
type DisplayedDocuments = { items: Set<string>; first: string; last: string }
44+
type DisplayedDocuments = { items: Set<number>; first: number; last: number }
4345
const searchCache: {
4446
[key: string]: DisplayedDocuments
4547
} = {
4648
'': {
47-
items: allNames,
48-
first: normalizeName(scripts[0].name),
49-
last: normalizeName(scripts[scripts.length - 1].name),
49+
items: allIndexes,
50+
first: 0,
51+
last: scripts.length - 1,
5052
},
5153
}
5254
@@ -58,12 +60,14 @@
5860
const results: ScriptData[] = search.search(searchValue)
5961
const sortedResults = results.sort((a, b) => a.name.localeCompare(b.name))
6062
displayedDocuments = {
61-
items: new Set(results.map((script: ScriptData) => script.name)),
62-
first: normalizeName(sortedResults[0]?.name ?? ''),
63-
last: normalizeName(sortedResults[results.length - 1]?.name ?? ''),
63+
items: new Set(results.map((script: ScriptData) => script.index)),
64+
first: sortedResults[0]?.index ?? -1,
65+
last: sortedResults[sortedResults.length - 1]?.index ?? -1,
6466
}
6567
}
6668
}
69+
$: if (typeof window !== 'undefined')
70+
window.history.replaceState(null, '', searchValue ? `?search=${searchValue}` : '.')
6771
</script>
6872

6973
<main class="wrapper my-6" id="main-content">
@@ -78,19 +82,20 @@
7882
<SearchInput
7983
on:change="{handleSearchChange}"
8084
placeholder="Search…"
85+
defaultValue="{searchValue}"
8186
helpText="Found {formatNumber(displayedDocuments.items.size)} script{displayedDocuments
8287
.items.size === 1
8388
? ''
8489
: 's'}"
8590
/>
8691
<Spacer />
8792
<Container>
88-
{#each scripts as item}
93+
{#each scripts as item, index}
8994
<Script
9095
data="{item}"
91-
show="{displayedDocuments.items.has(normalizeName(item.name))}"
92-
first="{normalizeName(item.name) === displayedDocuments.first}"
93-
last="{normalizeName(item.name) === displayedDocuments.last}"
96+
show="{displayedDocuments.items.has(index)}"
97+
first="{index === displayedDocuments.first}"
98+
last="{index === displayedDocuments.last}"
9499
/>
95100
{/each}
96101
{#if displayedDocuments.items.size === 0}
@@ -99,7 +104,7 @@
99104
description="There are no scripts that match your search"
100105
>
101106
<svelte:fragment slot="image">
102-
<FileCode class="w-40" />
107+
<FileCode class="w-32" />
103108
</svelte:fragment>
104109
</EmptyState>
105110
{/if}

0 commit comments

Comments
 (0)