Allow users to switch between oldest-first and newest-first comment
ordering via a toggle button in the comments heading. The preference is
persisted as a frontend setting (commentSortOrder) and passed to the API
as the order_by query parameter so pagination works correctly.
When all comments fit on a single page, toggling reverses them
client-side to avoid an extra API call. New comments are inserted at the
correct position based on the active sort order, and in newest-first
mode the view scrolls to the top after adding a comment.
Link-share users fall back to a local (non-persisted) sort order since
they cannot save user settings.
Use the `ignoreDuplicates` prop from vue3-notification to ignore duplicate notifications, show a count (×N) instead when notifications are merged.
Superseeds and closes https://github.com/go-vikunja/vikunja/pull/971
---------
Co-authored-by: Dominik Pschenitschni <6173598+dpschen@users.noreply.github.com>
This adds the following shortcuts:
- `.` to copy the task identifier
- `..` to copy the task identifier and title
- `...` to copy the task identifier, title, and url
- `Control + .` to copy the task url
I think showing the priority of a task regardless of its value can be useful, the option for the user to choose the minimum priority for visualization is exposed in the settings. The default value is `priority.HIGH`, that corresponds to the current behavior.
Co-authored-by: konrad <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/3075
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Leonardo Cossutta <leonardo.cossutta@gmail.com>
Co-committed-by: Leonardo Cossutta <leonardo.cossutta@gmail.com>
This fixes a bug where the task delete modal was not visible on mobile when the task itself was opened in a modal (for example, when opened via the kanban board). This was caused by both the delete modal and the task modal being teleported outside of the app.
Partially resolves https://github.com/go-vikunja/vikunja/issues/383
I'm still unsure if we should keep this rule in general, in this specific case I think it makes sense to reverse the logic and enable this api config explicitly