Repository navigation
feat(projects): filter the overview by audience and platform - #519
Merged
Merged
Conversation
The projects overview gets an audience filter (all, public, internal) and a multi-select platform filter built from the platforms the projects name, with counts. The state lives in the query string (?audience=&platform=, written with router.replace), and filtering keeps the grouped sections. The server renders every project; the browser applies the URL after mount, because the edge-cached HTML must not depend on the request. Claude-Session: https://claude.ai/code/session_019zws4ceJu2jctk3XT48fMX
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
launchpad | ff55114 | Commit Preview URL Branch Preview URL |
Oct 11 2026, 03:45 PM |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The projects overview (
/[locale]/projects) can now be filtered by audience (all, public, internal) and by platform. Platform is a multi-select over the platforms the projects actually name, with a count per platform. The filter state lives in the query string, so a filtered view can be shared and survives a reload.?audience=internal&platform=Minestom,Paper, written withrouter.replace, so filter changes do not add history entries.Design decisions
/en/**and/de/**are edge-cached, andtests/architecture/request-independent-render.spec.tsbansroute.query, cookies and request headers in every render. So the server renders all projects and the browser applies the URL after mount. Consequence: on a reload of a filtered URL the full list paints for a moment before the filter applies. Changing this means revisiting the edge-cache design, not this page, and was deliberately not done here.layers/projects/utils/projectFilter.tsholdsfilterProjects,platformFacets,togglePlatform,parseProjectFilterandserializeProjectFilter. Invalid audiences and platforms that no project names are dropped on parse. The componentProjectFilters.vueis controlled: it renders from props and emits the next filter. The page owns the URL.enlocale so the server and the browser order the chips identically and hydration does not disagree.SEO
usePageSeostrips the query, so/de/projects?audience=internalcanonicalises to/de/projects. Verified against the preview build: the filtered URL serves a canonical ofhttps://onelitefeather.net/de/projects.Tests
tests/projects/project-filter.spec.ts: pure logic (filtering, facets, parse, serialize, toggle, active state), Node environment.tests/projects/project-filters.spec.ts: component test in the Nuxt environment. Chip toggling,aria-pressed, counts, the live count and the reset action.tests/projects/pages.spec.ts: overview-only checks. ItemList built from all projects,router.replaceand neverrouter.push, URL read only after mount.Local results: full
pnpm test187 files / 1708 tests passing;pnpm qualityat baseline (186 ESLint errors, 17 warnings, 3 TypeScript errors, no regression);pnpm buildsucceeds.Browser check against the preview build at 360 px:
scrollWidthequalsclientWidth(no horizontal scroll). Chip clicks update the URL in the same document. Reset clears the query. A combination with no matches shows the empty state with the count "0 von 17 Projekten".Platform facets (current content)
https://claude.ai/code/session_019zws4ceJu2jctk3XT48fMX