What
TaskController::open() redirects the calendar VTODO deep link to a route that does not exist, in a form the router no longer reads.
lib/Controller/TaskController.php:169:
return new RedirectResponse(rtrim($base, '/') . '/#/flow-tasks/' . $safeUuid);
Two separate things are wrong with that target:
- The hash form no longer routes.
#3270 moved openregister to createWebHistory, so …/#/flow-tasks/<uuid> lands on the app's default route rather than the task.
- There is no
/flow-tasks route at all. Grepping src/ for flow-tasks returns nothing, and no manifest page declares that route. So even written as a path it would resolve nowhere.
Why it is not caught
tests/e2e/task-projections.spec.ts:164 asserts only the redirect's Location header:
expect(followed.headers().location).toContain(`#/flow-tasks/${task.uuid}`)
It never follows the redirect to a rendered page, so it passes whether or not the target resolves. The test agrees with the code, and both are wrong about the same thing.
Impact
This is the link in the projected VTODO. An assignee who opens the task from their calendar reaches the dashboard, not the task, with no error.
Not fixed in #3306
I found this while fixing that PR's two E2E failures and deliberately left it: choosing the right target is a product decision, not a mechanical one. Someone needs to say whether the task opens on a dedicated /flow-tasks/:uuid route that still has to be built, or on an existing surface such as the task inbox.
Whatever the answer, the e2e assertion should follow the redirect rather than read its header.
Adjacent
lib/Service/TaskService.php:356 builds …/#/calendars/<uri>/tasks/<uri>, which is correct and should not be changed: that one points at the Nextcloud Tasks app (tasks.page.index), which does route on the hash.
What
TaskController::open()redirects the calendar VTODO deep link to a route that does not exist, in a form the router no longer reads.lib/Controller/TaskController.php:169:Two separate things are wrong with that target:
#3270moved openregister tocreateWebHistory, so…/#/flow-tasks/<uuid>lands on the app's default route rather than the task./flow-tasksroute at all. Greppingsrc/forflow-tasksreturns nothing, and no manifest page declares that route. So even written as a path it would resolve nowhere.Why it is not caught
tests/e2e/task-projections.spec.ts:164asserts only the redirect'sLocationheader:It never follows the redirect to a rendered page, so it passes whether or not the target resolves. The test agrees with the code, and both are wrong about the same thing.
Impact
This is the link in the projected VTODO. An assignee who opens the task from their calendar reaches the dashboard, not the task, with no error.
Not fixed in #3306
I found this while fixing that PR's two E2E failures and deliberately left it: choosing the right target is a product decision, not a mechanical one. Someone needs to say whether the task opens on a dedicated
/flow-tasks/:uuidroute that still has to be built, or on an existing surface such as the task inbox.Whatever the answer, the e2e assertion should follow the redirect rather than read its header.
Adjacent
lib/Service/TaskService.php:356builds…/#/calendars/<uri>/tasks/<uri>, which is correct and should not be changed: that one points at the Nextcloud Tasks app (tasks.page.index), which does route on the hash.