Skip to content

Commit 2dc73cf

Browse files
authored
fix: local filter on user & org page are now back to work (#472)
1 parent 192c398 commit 2dc73cf

4 files changed

Lines changed: 43 additions & 30 deletions

File tree

app/components/SearchBox.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,15 @@ const showSearchBar = computed(() => {
2626
// Local input value (updates immediately as user types)
2727
const searchQuery = ref((route.query.q as string) ?? '')
2828
29+
// Pages that have their own local filter using ?q
30+
const pagesWithLocalFilter = new Set(['~username', 'org'])
31+
2932
// Debounced URL update for search query
3033
const updateUrlQuery = debounce((value: string) => {
34+
// Don't navigate away from pages that use ?q for local filtering
35+
if (pagesWithLocalFilter.has(route.name as string)) {
36+
return
37+
}
3138
if (route.name === 'search') {
3239
router.replace({ query: { q: value || undefined } })
3340
return
@@ -53,6 +60,10 @@ watch(searchQuery, value => {
5360
watch(
5461
() => route.query.q,
5562
urlQuery => {
63+
// Don't sync from pages that use ?q for local filtering
64+
if (pagesWithLocalFilter.has(route.name as string)) {
65+
return
66+
}
5667
const value = (urlQuery as string) ?? ''
5768
if (searchQuery.value !== value) {
5869
searchQuery.value = value

app/pages/@[org].vue

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ defineOgImageComponent('Default', {
139139
<main class="container flex-1 py-8 sm:py-12 w-full">
140140
<!-- Header -->
141141
<header class="mb-8 pb-8 border-b border-border">
142-
<div class="flex items-center gap-4 mb-4">
142+
<div class="flex items-end gap-4">
143143
<!-- Org avatar placeholder -->
144144
<div
145145
class="w-16 h-16 rounded-lg bg-bg-muted border border-border flex items-center justify-center"
@@ -155,20 +155,21 @@ defineOgImageComponent('Default', {
155155
{{ $t('org.public_packages', { count: formatNumber(packageCount) }, packageCount) }}
156156
</p>
157157
</div>
158-
</div>
159158

160-
<!-- Link to npmjs.com org page -->
161-
<nav aria-label="External links">
162-
<a
163-
:href="`https://www.npmjs.com/org/${orgName}`"
164-
target="_blank"
165-
rel="noopener noreferrer"
166-
class="link-subtle font-mono text-sm inline-flex items-center gap-1.5"
167-
>
168-
<span class="i-carbon-cube w-4 h-4" />
169-
{{ $t('common.view_on_npm') }}
170-
</a>
171-
</nav>
159+
<!-- Link to npmjs.com org page -->
160+
<nav aria-label="External links" class="ms-auto">
161+
<a
162+
:href="`https://www.npmjs.com/org/${orgName}`"
163+
target="_blank"
164+
rel="noopener noreferrer"
165+
class="link-subtle font-mono text-sm inline-flex items-center gap-1.5"
166+
:title="$t('common.view_on_npm')"
167+
>
168+
<span class="i-carbon:logo-npm w-4 h-4" aria-hidden="true" />
169+
npm
170+
</a>
171+
</nav>
172+
</div>
172173
</header>
173174

174175
<!-- Admin panels (when connected) -->

app/pages/~[username]/index.vue

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ defineOgImageComponent('Default', {
169169
<main class="container flex-1 py-8 sm:py-12 w-full">
170170
<!-- Header -->
171171
<header class="mb-8 pb-8 border-b border-border">
172-
<div class="flex items-center gap-4 mb-4">
172+
<div class="flex items-end gap-4">
173173
<!-- Avatar placeholder -->
174174
<div
175175
class="w-16 h-16 rounded-full bg-bg-muted border border-border flex items-center justify-center"
@@ -185,20 +185,21 @@ defineOgImageComponent('Default', {
185185
{{ $t('org.public_packages', { count: formatNumber(results.total) }, results.total) }}
186186
</p>
187187
</div>
188-
</div>
189188

190-
<!-- Link to npmjs.com profile -->
191-
<nav aria-label="External links">
192-
<a
193-
:href="`https://www.npmjs.com/~${username}`"
194-
target="_blank"
195-
rel="noopener noreferrer"
196-
class="link-subtle font-mono text-sm inline-flex items-center gap-1.5"
197-
>
198-
<span class="i-carbon-cube w-4 h-4" />
199-
{{ $t('common.view_on_npm') }}
200-
</a>
201-
</nav>
189+
<!-- Link to npmjs.com profile -->
190+
<nav aria-label="External links" class="ms-auto">
191+
<a
192+
:href="`https://www.npmjs.com/~${username}`"
193+
target="_blank"
194+
rel="noopener noreferrer"
195+
class="link-subtle font-mono text-sm inline-flex items-center gap-1.5"
196+
:title="$t('common.view_on_npm')"
197+
>
198+
<span class="i-carbon:logo-npm w-4 h-4" aria-hidden="true" />
199+
npm
200+
</a>
201+
</nav>
202+
</div>
202203
</header>
203204

204205
<!-- Loading state -->
@@ -233,7 +234,7 @@ defineOgImageComponent('Default', {
233234
<PackageListControls
234235
v-model:filter="filterText"
235236
v-model:sort="sortOption"
236-
:placeholder="$t('user.page.filter_placeholder', { count: packageCount })"
237+
:placeholder="$t('user.page.filter_placeholder', { count: results.total })"
237238
:total-count="packageCount"
238239
:filtered-count="filteredCount"
239240
/>

tests/interactions.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ test.describe('Search Pages', () => {
4141
const searchInput = page.locator('input[type="search"]')
4242
await searchInput.fill('vue')
4343

44-
await page.waitForLoadState('domcontentloaded')
44+
await page.waitForURL(/\/search/)
4545

4646
await expect(page.locator('text=/found \\d+/i')).toBeVisible()
4747

0 commit comments

Comments
 (0)