When expand=subtasks was used, phase 1 decided which tasks are "roots" (top-level rows) by excluding any task whose parent lived in the same project: `parent_tasks.project_id != tasks.project_id`. That comparison was only ever a proxy for the real question - "is the parent actually part of this result set?" - and the proxy keeps being wrong: - #1000 cross-project parent - #2494 deleted parent - #2646 same-project parent that is filtered out In the #2646 case a subtask that matches the filter but whose parent does not was wrongly dropped from the roots, so a filter matching only a subtask returned []. Replace the proxy with the real predicate. A task is excluded from roots only when its parent is genuinely in the matched set, i.e. ALL of: - it has a parenttask relation, AND - the parent task exists, AND - the parent is within the queried project scope, AND - the parent satisfies the active filter. The parent-satisfies-the-filter check rebuilds the parsed filter against the parent_tasks alias (convertFiltersToDBFilterCondWithAlias). It applies the filter and project scope but deliberately NOT the text-search predicate, so ParadeDB's search operators are never composed against the parent_tasks alias. Semantics are unchanged: count = roots. The LIMIT still slices roots in phase 1; subtasks ride along in phase 2 (recursive CTE, deduped via NOT IN) and are not counted toward the per-page limit. totalCount stays the number of roots and uses the same corrected condition. Verified on SQLite and a real ParadeDB instance (no "unsupported query shape"). Fixes #2646 |
||
|---|---|---|
| .claude | ||
| .github | ||
| .vscode | ||
| .zed | ||
| build | ||
| contrib | ||
| desktop | ||
| examples/plugins/example | ||
| frontend | ||
| pkg | ||
| rest | ||
| veans | ||
| .devcontainer.json | ||
| .dockerignore | ||
| .editorconfig | ||
| .envrc | ||
| .gitignore | ||
| .golangci.yml | ||
| .opensourcefinder-verify | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| cliff.toml | ||
| code-header-template.txt | ||
| conductor.json | ||
| config-raw.json | ||
| crowdin.yml | ||
| devenv.lock | ||
| devenv.nix | ||
| devenv.yaml | ||
| go.mod | ||
| go.sum | ||
| magefile.go | ||
| main.go | ||
| mise.toml | ||
| nfpm.yaml | ||
| publiccode.yml | ||
| renovate.json | ||
| tsconfig.json | ||
| vikunja.initd | ||
| vikunja.service | ||
README.md
Vikunja
The Todo-app to organize your life.
If Vikunja is useful to you, please consider buying me a coffee, sponsoring me on GitHub or buying a sticker pack. I'm also offering a hosted version of Vikunja if you want a hassle-free solution for yourself or your team.
Table of contents
Security Reports
If you find any security-related issues you don't want to disclose publicly, please use the contact information on our website.
Features
See the features page on our website for a more exhaustive list or try it on try.vikunja.io!
Docs
All docs can be found on the Vikunja home page.
Roadmap
See the roadmap (hosted on Vikunja!) for more!
Contributing
Please check out the contribution guidelines on the website.
License
Most of this repository is licensed under AGPL‑3.0‑or‑later.
The contents of desktop/ are licensed under
GPL‑3.0‑or‑later.
Unsplash Images
Background images from Unsplash are distributed under the Unsplash License. The license requires giving credit to the photographer and Unsplash. See Unsplash’s terms for more information.