The previous attempt updated the oauth-authorize e2e assertion to expect /login#redirect= but never ran the test, and the implementation did not actually produce it. Root cause: the guard wrote the redirect hash as encodeURIComponent(to.fullPath), but vue-router runs its own encodeURI over the hash field, turning the embedded %xx into %25xx (double-encoding). On the follow-up navigation to /login the address-bar hash (to.fullPath) was then double-encoded while to.hash was single-decoded, so the pre-existing `!to.fullPath.endsWith(to.hash)` fallback never matched and kept re-appending the hash — an infinite redirect loop that left the URL stuck on /oauth/authorize. Fix: - Pass to.fullPath to the hash raw and read it back without an extra decodeURIComponent. vue-router's encode/decode round-trips it cleanly, so the address bar carries a single-encoded, copyable destination and the guard recovers the exact original fullPath for saveLastVisited. - Skip the endsWith hash re-attach when the hash is the redirect hash, which vue-router keeps url-encoded in fullPath, breaking the loop. Verified locally: tests/e2e/user/oauth-authorize.spec.ts now passes (redirect to /login#redirect=, decoded hash contains /oauth/authorize, and the post-login PKCE code exchange completes); logout.spec.ts still passes. openid-login.spec.ts requires the Dex service container that only CI provides, so it cannot run locally; it does not touch the changed paths. |
||
|---|---|---|
| .. | ||
| docs | ||
| originalMedia | ||
| public | ||
| scripts | ||
| src | ||
| tests | ||
| .editorconfig | ||
| .env.local.example | ||
| .gitignore | ||
| .npmrc | ||
| .nvmrc | ||
| .stylelintrc.json | ||
| CHANGELOG.md | ||
| LICENSE | ||
| README.md | ||
| cliff.toml | ||
| embed.go | ||
| env.config.d.ts | ||
| env.d.ts | ||
| eslint.config.js | ||
| histoire.config.ts | ||
| index.html | ||
| netlify.toml | ||
| package.json | ||
| playwright.config.ts | ||
| pnpm-lock.yaml | ||
| tsconfig.app.json | ||
| tsconfig.config.json | ||
| tsconfig.json | ||
| tsconfig.vitest.json | ||
| vite.config.ts | ||
README.md
Web frontend for Vikunja
The todo app to organize your life.
This is the web frontend for Vikunja, written in Vue.js.
Take a look at our roadmap (hosted on Vikunja!) for a list of things we're currently working on!
For general information about the project, refer to the top-level readme of this repo.
Project setup
pnpm install
Development
Define backend server
You can develop the web front end against any accessible backend, including the demo at https://try.vikunja.io
In order to do so, you need to set the DEV_PROXY env variable. The recommended way to do so is to:
- Copy
.env.local.exampleas.env.local - Uncomment the
DEV_PROXYline - Set the backend url you want to use
In the end, it should look like DEV_PROXY=https://try.vikunja.io if you work against the online demo backend.
Start dev server (compiles and hot-reloads)
pnpm run dev
Compiles and minifies for production
pnpm run build
Lints and fixes files
pnpm run lint
License
This project is licensed under the AGPL-3.0-or-later license. See the LICENSE file for details.