Compare commits

..
1334 Commits
Author SHA1 Message Date
kolaente 4d454de228 chore: 0.24.4 release preperation 2024-09-29 15:45:46 +02:00
kolaente fcb70b884c fix(test): use correct selector for modal header
(cherry picked from commit 3ce477e1d1)
2024-09-29 15:38:45 +02:00
kolaente 33c9ea802a fix(task): improve task delete modal on mobile
(cherry picked from commit 9f9b00144b)
2024-09-29 15:38:45 +02:00
kolaente ab29ac7a5c fix(task): do not show close button when the task was not opened via modal
(cherry picked from commit 308e634c71)
2024-09-29 15:38:44 +02:00
kolaente 7a1519da43 fix(task): paginate task comments
Resolves https://github.com/go-vikunja/vikunja/issues/329

(cherry picked from commit 54994a1671)
2024-09-29 15:38:43 +02:00
kolaente 7a839925ea fix(filters): explicitly search in json when using postgres
Resolves https://github.com/go-vikunja/vikunja/issues/330
Resolves https://community.vikunja.io/t/add-task-to-filter-view-cron-error-fetching-filters-pq-operator-does-not-exist-json-unknown/2831

(cherry picked from commit ca967782e8)
2024-09-29 15:38:10 +02:00
jdandkolaente 60fa211334 fix: partial fix to allow list tasks in ios reminders app (#2717)
This PR introduces a partial fix for the CalDAV task listing bug (#753) when handling PROPFIND requests with `Depth: 1`, improving task visibility in the iOS Reminders app.

Notes:
* This might make Thunderbird somewhat usable when interacting with tasks using the `/dav/projects/{id} url`.
* This does not fully resolve the issue where the Reminders app will only display the last project after some time when adding the URL.

This is my first time working with Golang and CalDAV, so I’d really appreciate any feedback or suggestions on the code structure, style, or any improvements I could make.

Co-authored-by: JD <43763092+jdw1023@users.noreply.github.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2717
Reviewed-by: konrad <k@knt.li>
Co-authored-by: jd <jd@noreply.kolaente.dev>
Co-committed-by: jd <jd@noreply.kolaente.dev>
(cherry picked from commit 84dbc5fd84)
2024-09-29 15:38:09 +02:00
renovateandkolaente e318e604b5 chore(deps): update dev-dependencies
(cherry picked from commit 4d8c957f75)
2024-09-29 15:38:07 +02:00
renovateandkolaente 6ea482a10b fix(deps): update dependency vue to v3.5.10
(cherry picked from commit 654f375d39)
2024-09-29 15:38:05 +02:00
renovateandkolaente a9b37db504 fix(deps): update tiptap to v2.7.4
(cherry picked from commit bdb3df8395)
2024-09-29 15:38:03 +02:00
renovateandkolaente 7f3c074958 fix(deps): update dependency dompurify to v3.1.7
(cherry picked from commit df41a96148)
2024-09-29 15:38:02 +02:00
renovateandkolaente 2e4de2919f fix(deps): update dependency vue to v3.5.9
(cherry picked from commit 892b8ad89a)
2024-09-29 15:38:00 +02:00
renovateandkolaente addcb9c1f6 chore(deps): update dev-dependencies
(cherry picked from commit b4ac1adacb)
2024-09-29 15:37:59 +02:00
renovateandkolaente 6b3e7f0d25 fix(deps): update tiptap to v2.7.3
(cherry picked from commit 0706ca60b5)
2024-09-29 15:37:57 +02:00
kolaente 6dbfbc43da fix(checkbox): use sibling css selector instead of has
This makes the checkbox work as intended on older browsers which do not support the :has selector.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2713

(cherry picked from commit 15d95f16da)
2024-09-29 15:37:56 +02:00
renovateandkolaente 3e3efa85ea fix(deps): update dependency @sentry/vue to v8.32.0
(cherry picked from commit f7f1b1638b)
2024-09-29 15:37:55 +02:00
renovateandkolaente 5dc94bfa64 chore(deps): update dev-dependencies
(cherry picked from commit 2ece97fc2b)
2024-09-29 15:37:53 +02:00
renovateandkolaente 04c6b6ba36 chore(deps): update dev-dependencies
(cherry picked from commit 71901a62f2)
2024-09-29 15:37:52 +02:00
renovateandkolaente 85d0c8b1b9 fix(deps): update dependency tailwindcss to v3.4.13
(cherry picked from commit cda0848b2a)
2024-09-29 15:37:51 +02:00
kolaente f32472eb24 fix(files): only use service rootpath for files when the files path is not absolute
Resolves https://community.vikunja.io/t/images-failing-to-load-500-internal-server-error/2835

(cherry picked from commit 261c6e6c9e)
2024-09-29 15:37:49 +02:00
renovateandkolaente 99bed5c616 fix(deps): update dependency @sentry/vue to v8.31.0
(cherry picked from commit c85cfcce6a)
2024-09-29 15:37:48 +02:00
renovateandkolaente 166d9cf860 fix(deps): update dependency @intlify/unplugin-vue-i18n to v5.2.0
(cherry picked from commit 51bdbba286)
2024-09-29 15:37:47 +02:00
renovateandkolaente 16994c5d36 fix(deps): update dependency vue-i18n to v10.0.3
(cherry picked from commit 2d5e2f70b9)
2024-09-29 15:37:45 +02:00
renovateandkolaente 8d849b3d30 fix(deps): update dependency @intlify/unplugin-vue-i18n to v5.1.0
(cherry picked from commit 2c8ca629de)
2024-09-29 15:37:44 +02:00
renovateandkolaente 884eef5407 fix(deps): update dependency vue to v3.5.8
(cherry picked from commit a61ac5ac32)
2024-09-29 15:37:43 +02:00
renovateandkolaente 96d8de06da chore(deps): update dev-dependencies
(cherry picked from commit 8c9d75e9a4)
2024-09-29 15:37:41 +02:00
renovateandkolaente d6bab95376 fix(deps): update dependency vue-i18n to v10.0.2
(cherry picked from commit 28f208542f)
2024-09-29 15:37:40 +02:00
renovateandkolaente a983142ad6 chore(deps): update dev-dependencies
(cherry picked from commit 6a2a78d014)
2024-09-29 15:37:39 +02:00
renovateandkolaente 98c878b201 fix(deps): update dependency vue to v3.5.7
(cherry picked from commit 2c791e6dd2)
2024-09-29 15:37:39 +02:00
kolaente b2e983fde6 chore(deps): update desktop lockfile
(cherry picked from commit 4d2021997a)
2024-09-29 15:37:30 +02:00
kolaente 724ec5751f fix(attachment): do not use image previews
Image previews were partially backported from main which caused error messages because some parts are missing.

Resolved https://community.vikunja.io/t/preview-size-is-not-defined/2843
2024-09-29 11:59:18 +02:00
kolaente 17618301bc Revert "chore(attachments): refactor building image preview"
This reverts commit e70f5bcce3.
2024-09-29 11:54:20 +02:00
kolaente 83b27d813a chore: 0.24.3 release preperation 2024-09-20 14:46:33 +02:00
kolaente a0ad6e7d28 fix(typesense): use typesense bulk insert, log all errors
(cherry picked from commit 207b88a286)
2024-09-20 14:28:02 +02:00
kolaente 940d149e2a fix(typesense): force position to always be float instead of auto-inferring
This fixes an issue where it would be impossible to update a task in Typesense when the position for a view of it was previously saved as int64. This happened because the field is created per view on demand and its type is automatically inferred from the data saved. Now, when the first value for a particular position field is a float which could as well be an int (for example, 42.0), that field gets created as an int64 instead of float. Subsequent tries to save a float into that field will then fail.

Additionally, errors about this are silently discarded when using bulk insert. That's why the problem was not really debuggable at first.

(cherry picked from commit 50a0674835)
2024-09-20 14:28:00 +02:00
kolaente 802f661f0d fix(typesense): index tasks one by one
(cherry picked from commit 8181829c9e)
2024-09-20 14:27:59 +02:00
kolaente f9829a6338 chore(logging): simplify log template string
(cherry picked from commit 83aeb90376)
2024-09-20 14:27:58 +02:00
kolaente a87419fa07 chore(typesense): add more debug logging
(cherry picked from commit e4584109df)
2024-09-20 14:27:55 +02:00
renovateandkolaente b321ad5fc0 fix(deps): update dependency vuemoji-picker to v0.3.1
(cherry picked from commit 6d7748988a)
2024-09-20 14:27:54 +02:00
renovateandkolaente edfe41ef87 chore(deps): update dev-dependencies
(cherry picked from commit 363da6c80f)
2024-09-20 14:27:52 +02:00
kolaente 4cbed7c2ed fix(typesense): use emplace instead of upsert to update documents
(cherry picked from commit 3f1d0f390b)
2024-09-20 14:27:50 +02:00
kolaente 25c8476883 fix(typesense): make sure task positions are recreated properly when updating them
Related https://community.vikunja.io/t/version-0-24-0-internal-server-error-breaking-change/2558
Related https://github.com/go-vikunja/vikunja/issues/317

(cherry picked from commit edf206aba6)
2024-09-20 14:27:49 +02:00
kolaente 15cde08db6 fix(typesense): add new tasks to typesense properly
Maybe related to https://github.com/go-vikunja/vikunja/issues/317

(cherry picked from commit 9e39ef9397)
2024-09-20 14:27:46 +02:00
kolaente 96835f6a28 fix(deps): update module github.com/typesense/typesense-go to v2
(cherry picked from commit c54181eeda)
2024-09-20 14:27:44 +02:00
kolaente b1c4f0c216 fix(typesense): only fail silently when a project was not found during indexing
(cherry picked from commit b3bf92b7ce)
2024-09-20 14:27:42 +02:00
renovateandkolaente d2fbd468e6 fix(deps): update tiptap to v2.7.2
(cherry picked from commit 05dd05216d)
2024-09-20 14:27:40 +02:00
kolaente a751178c8b fix(views): add migration for filtered kanban buckets
(cherry picked from commit cd0ab54d57)
2024-09-20 14:27:38 +02:00
kolaente 2b9b9216dc feat(task): use focus-visible for task focus styles
(cherry picked from commit a7bd9dad24)
2024-09-20 14:27:37 +02:00
kolaente f732082708 fix(a11y): hide unfocusable buttons
(cherry picked from commit 10e245f6d0)
2024-09-20 14:27:35 +02:00
kolaente f56df8aa34 fix(task): open focused task when pressing enter
(cherry picked from commit 010dd1ea22)
2024-09-20 14:27:34 +02:00
kolaente e290d79c15 feat(navigation): use focus-visible for nav items
(cherry picked from commit 65a2814b2a)
2024-09-20 14:27:32 +02:00
kolaente 51f26d14b9 fix(filters): correctly transform and populate saved filter when creating and editing
This fixes a bug where the checkbox "include nulls" during creation was not checked but would be saved as such.

(cherry picked from commit 4dd9d5de67)
2024-09-20 14:27:30 +02:00
kolaente 320fc75c27 fix(task): mark related task as done from the task detail view
Resolves https://github.com/go-vikunja/vikunja/issues/326

(cherry picked from commit ec902b051b)
2024-09-20 14:27:28 +02:00
kolaente 4857bfbbdb chore: rearrange cron registers
(cherry picked from commit 4b2b8e3b83)
2024-09-20 14:27:28 +02:00
kolaente 62c238e4bc fix(filter): make sure tasks are in a correct bucket and position when they are part of a date filter
Whenever a task is part of a date filter, it might fall in or out of a filter bucket without anything changing, other than the current time. For example, a filter condition like due_date > now may include different tasks depending on the current time.
For these kinds of tasks to properly show up in the kanban view of a filter, there has to be an entry in the task_buckets table. These entries only got updated when either a task was updated or the filter itself was updated. To account for th changing of time, we also need to check periodically if tasks are now part or not anymore part of that filter.
This change adds a cron task to do precisely that.
We'll have to see if this works resource-wise, but the cron is not the only one doing a bunch of sql queries so it might be fine after all.

Resolves https://community.vikunja.io/t/tasks-in-saved-filter-appear-in-list-view-but-are-not-visible-in-kanban-view/2800

(cherry picked from commit bc52da4029)
2024-09-20 14:27:26 +02:00
kolaente d27b62db6e fix(task): cleanup old task positions and task buckets when adding an updated or created task to filter
(cherry picked from commit 2123da49a3)
2024-09-20 14:27:23 +02:00
kolaente a21036340e fix(task): add task to filter view after it was updated
Maybe resolves https://community.vikunja.io/t/tasks-in-saved-filter-appear-in-list-view-but-are-not-visible-in-kanban-view/2800

(cherry picked from commit c53a761396)
2024-09-20 14:27:21 +02:00
kolaente 3398dee481 fix(labels): trigger task updated for bulk label task update
(cherry picked from commit c84b50b3ee)
2024-09-20 14:27:19 +02:00
kolaente 063aa7afec fix: test selector
(cherry picked from commit c5b82fc591)
2024-09-20 14:27:17 +02:00
renovateandkolaente df3f5e73ed fix(deps): update dependency vue to v3.5.6
(cherry picked from commit 1f00180af6)
2024-09-20 14:27:16 +02:00
renovateandkolaente c57636182a fix(deps): update dependency tailwindcss to v3.4.12
(cherry picked from commit 33e851f543)
2024-09-20 14:27:14 +02:00
kolaente 4d2a567c46 fix(modal): make scrolling on iOS Safari work
This fixes a bug where the full-screen modal would not work on iOS Safari (and only there). It's unclear why this is happening due to a single overflow: visible statement though.

Resolves https://github.com/go-vikunja/vikunja/issues/325

(cherry picked from commit 16d7386975)
2024-09-20 14:27:12 +02:00
kolaente 21cc3722a1 fix(projects): description not visible on mobile
(cherry picked from commit 6d9bda8cc1)
2024-09-20 14:27:11 +02:00
kolaente 6a68736ca5 fix(task): dragging and dropping on mobile
This change fixes a regression introduced in 1cbb93ea9b.
In that change, the whole task area was made clickable using mouse events directly. Unfortunately, this also prevented the parent component of the task component to recieve them, essentially never getting notified about the mouse movement and thus never dragging the task. I don't know why this is only a problem on Safari, but it might be related to https://github.com/SortableJS/Sortable/issues/1571#issuecomment-535684451

Resolves https://community.vikunja.io/t/task-re-ordering-is-not-working-in-safari/1916
Resolves https://kolaente.dev/vikunja/vikunja/issues/2092
Resolves https://github.com/go-vikunja/vikunja/issues/304

(cherry picked from commit abf92e29fa)
2024-09-20 14:27:09 +02:00
kolaente 9e5d6bad8d chore(tasks): move drag options to direct attributes instead of v-bind
(cherry picked from commit f4d628550f)
2024-09-20 14:27:08 +02:00
kolaente 2b0fbe2575 chore(devenv): do not install cypress on darwin
(cherry picked from commit 1d352fcbf3)
2024-09-20 14:27:06 +02:00
kolaente 1e7d9c982d chore: remove console.log
(cherry picked from commit a1105434bf)
2024-09-20 14:27:03 +02:00
kolaente 20c52a8325 fix(editor): restore the current value, not the one from a previous task
Resolves https://community.vikunja.io/t/task-description-is-overwritten-when-pressing-esc-key/2813

(cherry picked from commit acc7c9f8f5)
2024-09-20 14:27:02 +02:00
kolaente a46009dfc9 fix(task): align task title on mobile popup
(cherry picked from commit cc64ca6406)
2024-09-20 14:27:00 +02:00
kolaente 6ab12b9dd1 chore: add go and direnv to recommended vscode extensions
(cherry picked from commit 89f78cd369)
2024-09-20 14:26:59 +02:00
renovateandkolaente aeb404f313 fix(deps): update tiptap to v2.7.1
(cherry picked from commit 14c3b13823)
2024-09-20 14:26:57 +02:00
renovateandkolaente 9c5df7d389 chore(deps): update dev-dependencies
(cherry picked from commit c2a7438814)
2024-09-20 14:26:56 +02:00
renovateandkolaente ffd36261cb fix(deps): update tiptap to v2.7.0
(cherry picked from commit 8fe37fd900)
2024-09-20 14:26:54 +02:00
renovateandkolaente 8812af2d77 fix(deps): update module github.com/prometheus/client_golang to v1.20.4
(cherry picked from commit 88b4ab1768)
2024-09-20 14:26:52 +02:00
kolaente 93f7dd611a fix: reset id before creating
(cherry picked from commit c252c8f0cd)
2024-09-20 14:26:51 +02:00
renovateandkolaente 0e683ae7bf fix(deps): update vueuse to v11.1.0
(cherry picked from commit 410ff28b71)
2024-09-20 14:26:49 +02:00
renovateandkolaente deef8da370 chore(deps): update dev-dependencies
(cherry picked from commit d98dd7ecbb)
2024-09-20 14:26:47 +02:00
renovateandkolaente a0988daeaf fix(deps): update dependency date-fns to v4
(cherry picked from commit fc73085876)
2024-09-20 14:26:46 +02:00
renovateandkolaente 6225b24da8 chore(deps): update dev-dependencies
(cherry picked from commit c71f7334b4)
2024-09-20 14:26:44 +02:00
kolaente 983c02964c fix(modal): do not prevent scrolling on mobile
Maybe related to https://github.com/go-vikunja/vikunja/issues/325

(cherry picked from commit 6a5342bd49)
2024-09-20 14:26:44 +02:00
renovateandkolaente 7bc93757c7 fix(deps): update dependency vue-router to v4.4.5
(cherry picked from commit b4ea1bb86a)
2024-09-20 14:26:42 +02:00
renovateandkolaente b4c5df1ef8 fix(deps): update dependency vue to v3.5.5
(cherry picked from commit 378d0ae9bb)
2024-09-20 14:26:41 +02:00
kolaente fd7d83bdaf fix(user): do not create user with existing id
Resolves https://vikunja.sentry.io/share/issue/6f1e37d4b8b248188e20650234a45cde/

(cherry picked from commit 6f27e1401a)
2024-09-20 14:26:40 +02:00
kolaente 53d62d35f4 fix: lint
(cherry picked from commit bf5cafc03f)
2024-09-20 14:26:40 +02:00
kolaente a266fbf2b9 fix(filter): do not replace labels keyword when the value is 'label'
Resolves https://community.vikunja.io/t/filtering-by-label-ux-issues/2393/16

(cherry picked from commit f4a7326b68)
2024-09-20 14:26:39 +02:00
kolaente 971f328256 fix(kanban): correctly paginate filtered kanban buckets
Resolves https://github.com/go-vikunja/vikunja/issues/314

(cherry picked from commit 1451f6e46f)
2024-09-20 14:26:39 +02:00
Frederick [Bot]andkolaente 89d643b9cf chore(i18n): update translations via Crowdin
(cherry picked from commit 427eb2a618)
2024-09-20 14:26:38 +02:00
kolaente a1c4fbf936 fix(view): correctly get paginated task results
(cherry picked from commit e4b541e653)
2024-09-20 14:26:36 +02:00
kolaente 1049b27d37 fix(view): correctly resolve bucket filter when paginating
(cherry picked from commit 45ff5907e6)
2024-09-20 14:26:34 +02:00
kolaente 6b850c56f7 fix(view): correctly resolve label for filtered views or buckets
(cherry picked from commit 5a7c3927f3)
2024-09-20 14:26:33 +02:00
kolaente 614f70db36 fix(filters): do not replace filter or project values when the id value resolves to undefined
This change fixes a bug where the label title in the query string would be replaced to undefined, resulting in an invalid filter. The underlying problem was the resolved filter query string got re-parsed and the id value of the labels were resolved to undefined (and rendered as that string) in the process.

Resolves https://community.vikunja.io/t/filtering-by-label-ux-issues/2393/14

(cherry picked from commit f425d98b4d)
2024-09-20 14:26:32 +02:00
kolaente b297cb5398 fix(task): multiple overlapping defer due date popups
Resolves https://github.com/go-vikunja/vikunja/issues/131

(cherry picked from commit 4c55016c1a)
2024-09-20 14:26:31 +02:00
kolaente 8e32d099c4 fix(kanban): do not mark first bucked as done bucket in filter bucket mode
Resolves https://github.com/go-vikunja/vikunja/issues/313

(cherry picked from commit 1a8f12ac13)
2024-09-20 14:26:31 +02:00
kolaente 19a1dc9daf fix(table): make sorting for two-word properties work
Resolves https://community.vikunja.io/t/various-sorting-filtering-issues/2781/8

(cherry picked from commit 7b873ec31c)
2024-09-20 14:26:29 +02:00
kolaente 7f28a514ea fix(test): cypress test selector
(cherry picked from commit 8b77832af2)
2024-09-20 14:26:28 +02:00
Frederick [Bot]andkolaente 44f5e42c0b chore(i18n): update translations via Crowdin
(cherry picked from commit 14710d0bba)
2024-09-20 14:26:27 +02:00
kolaente 2fc9504285 fix(kanban): make kanban full width on mobile
Related to https://github.com/go-vikunja/vikunja/issues/309

(cherry picked from commit 945f25b818)
2024-09-20 14:26:26 +02:00
kolaente 2b15bb5154 fix(modal): make sure modal and its content scrolls properly on mobile
Related to https://github.com/go-vikunja/vikunja/issues/309

(cherry picked from commit f53b93d98a)
2024-09-20 14:26:26 +02:00
kolaente f1451abebe fix(home): explicitly use filter for tasks on home page when one is set
Resolves https://github.com/go-vikunja/vikunja/issues/289
Resolves https://community.vikunja.io/t/various-sorting-filtering-issues/2781/5

(cherry picked from commit 97e030a1fc)
2024-09-20 14:26:24 +02:00
renovateandkolaente c9f47797cf chore(deps): update golangci/golangci-lint docker tag to v1.61.0 (#2678)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>

(cherry picked from commit b708db7025)
2024-09-20 14:26:23 +02:00
kolaente 42b33d6553 fix(filters): immediately propagate changes
Resolves https://community.vikunja.io/t/filtering-startdate-now-is-invalid/2613/6

(cherry picked from commit 6bfe71b30e)
2024-09-20 14:26:21 +02:00
renovateandkolaente b4b2136869 fix(deps): update dependency @intlify/unplugin-vue-i18n to v5
(cherry picked from commit db196bdffe)
2024-09-20 14:26:19 +02:00
renovateandkolaente 3d9a719424 fix(deps): update dependency express to v4.21.0
(cherry picked from commit 9428acd5e1)
2024-09-20 14:26:18 +02:00
renovateandkolaente 5c5f42d4ca fix(deps): update dependency vue-router to v4.4.4
(cherry picked from commit 58a60fb4ae)
2024-09-20 14:26:17 +02:00
renovateandkolaente fc1208029e fix(deps): update dependency flexsearch to v0.7.43 (#2095)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>

(cherry picked from commit f4ca22a6ad)
2024-09-20 14:26:14 +02:00
kolaente 4a40bdfe89 fix(kanban): make task creation loading spinner actually visible
(cherry picked from commit 7e38a9f442)
2024-09-20 14:26:13 +02:00
renovateandkolaente b01e531fb7 fix(deps): update dependency vue-i18n to v10.0.1
(cherry picked from commit a0a77818b1)
2024-09-20 14:26:11 +02:00
kolaente 02ab944020 fix(labels): remove input interactivity when label edit is disabled
(cherry picked from commit bdccd633fe)
2024-09-20 14:26:10 +02:00
kolaente 1df4a4ea2e chore: fix comment
(cherry picked from commit 1f3eb8f2a3)
2024-09-20 14:26:08 +02:00
renovateandkolaente 61cb072ba3 fix(deps): update dependency tailwindcss to v3.4.11
(cherry picked from commit 8891ef347e)
2024-09-20 14:26:07 +02:00
kolaente 02b8ea40af fix(multiselect): make selectPlaceholder optional
(cherry picked from commit 3b8ccbad4f)
2024-09-20 14:26:05 +02:00
kolaente b5eaa51560 fix(task): make print styles work when printing task detail view from kanban
Resolves https://community.vikunja.io/t/feature-request-export-a-task-as-pdf/2735/6

(cherry picked from commit cc1b4bbd1b)
2024-09-20 14:26:03 +02:00
Frederick [Bot]andkolaente eb6663e1f5 [skip ci] Updated swagger docs
(cherry picked from commit 9dd95101f9)
2024-09-20 14:26:01 +02:00
kolaente b94802169c fix(task): cyclomatic complexity
(cherry picked from commit 20724f6fb5)
2024-09-20 14:26:00 +02:00
Frederick [Bot]andkolaente dfda2e5500 chore(i18n): update translations via Crowdin
(cherry picked from commit e1ea84fcd4)
2024-09-20 14:25:58 +02:00
kolaente d23484c8f3 fix(project): reset id before creating
Resolves https://vikunja.sentry.io/share/issue/6f1e37d4b8b248188e20650234a45cde/

(cherry picked from commit 8d730543c3)
2024-09-20 14:25:57 +02:00
renovateandkolaente 78b8ea6211 fix(deps): update dependency vue-i18n to v10
(cherry picked from commit a3d133bfee)
2024-09-20 14:25:55 +02:00
renovateandkolaente 93cc2e1cb0 fix(deps): update dependency @sentry/vue to v8.30.0
(cherry picked from commit 7b37ad0594)
2024-09-20 14:25:54 +02:00
kolaente 52fb43a6f7 fix(project): show description in title attribute without html
Resolves https://community.vikunja.io/t/feedback-to-vikunja-0-24-0/2557/6

(cherry picked from commit 4aeb228c3a)
2024-09-20 14:25:53 +02:00
kolaente 8f5273600a fix(projects): do not hide 6th project on project overview
(cherry picked from commit b52d6dbf59)
2024-09-20 14:25:51 +02:00
kolaente 40105ee4ce chore: remove console.log
(cherry picked from commit 76f7797e56)
2024-09-20 14:25:50 +02:00
kolaente 5bfd99dd77 fix(task): specify task index when creating multiple tasks at once
This change allows to specify the task index when creating a task, which will then be checked to avoid duplicates and used. This allows us to calculate the indexes for all tasks beforehand when creating them at once using quick add magic.
The method is not bulletproof, but already fixes a problem where multiple tasks would have the same index when created that way.

Resolves https://community.vikunja.io/t/add-multiple-tasks-at-once/333/16

(cherry picked from commit 55dd7d2981)
2024-09-20 14:25:48 +02:00
kolaente ac87035742 fix(auth): restrict max password length to 72 bytes
Bcrypt allows a maximum of 72 bytes. This is part of the algorithm and not something we could change in Vikunja. The solution here was to restrict the password during registration to a max length of 72 bytes. In the future, this should be changed to hash passwords with sha512 or similar before hashing them with bcrypt. Because they should also be salted in that case and the added complexity during the migration phase, this was not implemented yet.
The change in this commit only improves the error handling to return an input error instead of a server error when the user enters a password > 72 bytes.

Resolves https://vikunja.sentry.io/share/issue/e8e0b64612d84504942feee002ac498a/

(cherry picked from commit 44a43b9f86)
2024-09-20 14:25:46 +02:00
kolaente 10edeafa46 fix(password): validate password before sending request to api
(cherry picked from commit eb95caf757)
2024-09-20 14:25:42 +02:00
kolaente 01a7a62541 fix(caldav): reject invalid project id with error 400
Resolves https://vikunja.sentry.io/share/issue/6fc18edefa0e4db3b2e10efe36deeaa4/

(cherry picked from commit 1085a6583b)
2024-09-20 14:25:41 +02:00
kolaente c5f043c346 fix(label): ignore existing ID during creation
(cherry picked from commit e698ac5a34)
2024-09-20 14:25:39 +02:00
renovateandkolaente 1b55be6a15 fix(deps): update module github.com/getsentry/sentry-go to v0.29.0
(cherry picked from commit 020fea686d)
2024-09-20 14:25:37 +02:00
renovateandkolaente 99e401cc67 fix(deps): update dependency express to v4.20.0
(cherry picked from commit addf8523f4)
2024-09-20 14:25:36 +02:00
renovateandkolaente 9deda69baf fix(deps): update dependency vue to v3.5.4
(cherry picked from commit 044aa1c742)
2024-09-20 14:25:35 +02:00
renovateandkolaente 34fe37bfb7 chore(deps): update goreleaser/nfpm docker tag to v2.40.0 (#2647)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>

(cherry picked from commit 552e1ce796)
2024-09-20 14:25:33 +02:00
renovateandkolaente a88939ff9a fix(deps): update dependency @sentry/vue to v8.29.0
(cherry picked from commit c1246d73d4)
2024-09-20 14:25:31 +02:00
renovateandkolaente 89e4c3722a chore(deps): update pnpm to v9.10.0
(cherry picked from commit 85fa397a46)
2024-09-20 14:25:30 +02:00
renovateandkolaente 4e27d7da70 chore(deps): update dev-dependencies
(cherry picked from commit af47e43c34)
2024-09-20 14:25:28 +02:00
Frederick [Bot]andkolaente be5822712e [skip ci] Updated swagger docs
(cherry picked from commit 2539f15dfb)
2024-09-20 14:25:27 +02:00
kolaente a5a54a40f6 docs(api): use correct return type for the /user endpoint
(cherry picked from commit 5c1b2846a1)
2024-09-20 14:25:25 +02:00
renovateandkolaente ac977f02df fix(deps): update dependency vue-router to v4.4.3
(cherry picked from commit af8100d262)
2024-09-20 14:25:23 +02:00
renovateandkolaente 3d43603b23 chore(deps): update dependency go to v1.23.1
(cherry picked from commit 63f85c97ae)
2024-09-20 14:25:22 +02:00
renovateandkolaente 9d3f8635d6 chore(deps): update dev-dependencies
(cherry picked from commit 2b1e3ffd2a)
2024-09-20 14:25:20 +02:00
renovateandkolaente dab0c39b70 fix(deps): update module golang.org/x/image to v0.20.0
(cherry picked from commit 5f470afd7c)
2024-09-20 14:25:19 +02:00
renovateandkolaente f71cc9e77b fix(deps): update module github.com/prometheus/client_golang to v1.20.3
(cherry picked from commit 37c6f94ba2)
2024-09-20 14:25:17 +02:00
renovateandkolaente 5aa6b230cf fix(deps): update dependency vue to v3.5.3
(cherry picked from commit b42cd5786e)
2024-09-20 14:25:15 +02:00
renovateandkolaente 785ee36921 fix(deps): update module dario.cat/mergo to v1.0.1
(cherry picked from commit 5072ab3d72)
2024-09-20 14:25:14 +02:00
renovateandkolaente 476cadbbed fix(deps): update module github.com/redis/go-redis/v9 to v9.6.1
(cherry picked from commit 4b5ec018f5)
2024-09-20 14:25:12 +02:00
renovateandkolaente 69c609478f fix(deps): update module golang.org/x/crypto to v0.27.0
(cherry picked from commit efe5c7b3cb)
2024-09-20 14:25:10 +02:00
renovateandkolaente 77ac70c47a fix(deps): update module golang.org/x/oauth2 to v0.23.0
(cherry picked from commit ba0c32aacf)
2024-09-20 14:25:08 +02:00
renovateandkolaente 1371692bb6 fix(deps): update vueuse to v11
(cherry picked from commit b6e142e8d0)
2024-09-20 14:25:07 +02:00
renovateandkolaente bd1b1ca23c fix(deps): update dependency tailwindcss to v3.4.10
(cherry picked from commit 750d565477)
2024-09-20 14:25:04 +02:00
Frederick [Bot]andkolaente 85445ea032 [skip ci] Updated swagger docs
(cherry picked from commit 2b8515b91d)
2024-09-20 14:25:03 +02:00
kolaente 0b9f3070fd fix(files): use absolute path everywhere
(cherry picked from commit 68636f27da)
2024-09-20 14:25:02 +02:00
kolaente cca02a3f2e chore(docs): clarify usage of related model creation
Resolves https://github.com/go-vikunja/vikunja/issues/323

(cherry picked from commit cf94cc8cab)
2024-09-20 14:25:00 +02:00
renovateandkolaente 5c82333977 fix(deps): update dependency axios to v1.7.7
(cherry picked from commit 669b7452cd)
2024-09-20 14:24:58 +02:00
renovateandkolaente 239cabd34a fix(deps): update dependency sortablejs to v1.15.3
(cherry picked from commit 1601c9098d)
2024-09-20 14:24:57 +02:00
renovateandkolaente 4701c91c1a fix(deps): update module github.com/gabriel-vasile/mimetype to v1.4.5
(cherry picked from commit f132b0e718)
2024-09-20 14:24:56 +02:00
renovateandkolaente 5775c51be5 fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.23
(cherry picked from commit 5d12986e3f)
2024-09-20 14:24:56 +02:00
renovateandkolaente 1cdf8f4271 fix(deps): update module github.com/threedotslabs/watermill to v1.3.7
(cherry picked from commit 74e0197dc6)
2024-09-20 14:24:55 +02:00
renovateandkolaente 442009a47b fix(deps): update dependency @kyvg/vue3-notification to v3.3.0
(cherry picked from commit 2dd133fb4c)
2024-09-20 14:24:54 +02:00
kolaente e70f5bcce3 chore(attachments): refactor building image preview
(cherry picked from commit 02c1de55c4)
2024-09-20 14:24:53 +02:00
renovateandkolaente a355d9798e fix(deps): update dependency @sentry/vue to v8.28.0
(cherry picked from commit cbc63c853d)
2024-09-20 14:23:51 +02:00
renovateandkolaente 7fa171c3d3 fix(deps): update dependency pinia to v2.2.2
(cherry picked from commit b5c4a3a80c)
2024-09-20 14:23:50 +02:00
renovateandkolaente 672fc5d9c7 fix(deps): update dependency vue-i18n to v9.14.0
(cherry picked from commit a8ea5e11ab)
2024-09-20 14:23:50 +02:00
renovateandkolaente 586132ce8c fix(deps): update module golang.org/x/text to v0.18.0
(cherry picked from commit 812430b9cf)
2024-09-20 14:23:49 +02:00
kolaente bf08dc2585 chore(files): use absolute file path to retrieve and save files
(cherry picked from commit c2b116de70)
2024-09-20 14:23:48 +02:00
kolaente 761d278b9a fix(kanban): save updated position to store
This fixes a bug where the position of a task would not be calculated correctly when the task was moved next to another recently moved task. The problem was caused by the calculation of the new position referring to the old value of the position attribute, because it was not updated in the local store.

Resolves https://community.vikunja.io/t/kanban-cards-in-wrong-order/2731/6

(cherry picked from commit 22e594e253)
2024-09-20 14:22:54 +02:00
kolaente 6da9bc964e chore(magefile): use tx.Sync instead of Sync2
(cherry picked from commit 0d9c03e0f2)
2024-09-20 14:22:52 +02:00
renovateandkolaente d508fe3fb8 fix(deps): update module golang.org/x/term to v0.24.0
(cherry picked from commit 72bb6609a1)
2024-09-20 14:22:50 +02:00
renovateandkolaente e7075762ab fix(deps): update module github.com/typesense/typesense-go to v2
(cherry picked from commit b259072e6a)
2024-09-20 14:22:49 +02:00
kolaente eb89f68f73 fix(caldav): make sure colors are correctly saved and returned
Resolves https://community.vikunja.io/t/caldav-sync-tasks-org-strips-colour-and-end-date-values/2753/2

(cherry picked from commit ffcc48ec87)
2024-09-20 14:22:47 +02:00
Frederick [Bot]andkolaente 08b4bcaff9 [skip ci] Updated swagger docs
(cherry picked from commit 5aa0b6a0cf)
2024-09-20 14:22:45 +02:00
kolaente 0a29a88a26 chore(subscription): return subscription entity type using json Marshaler
(cherry picked from commit b60efbd259)
2024-09-20 14:22:43 +02:00
kolaente 313b99e296 fix(reminders): notify subscribed users as well
Resolves https://community.vikunja.io/t/no-reminder-notification-by-e-mail-from-my-colleague/2779

(cherry picked from commit 34ac29fcce)
2024-09-20 14:22:41 +02:00
kolaente 95ef4e1045 fix(subscriptions): do not panic when a task does not have a subscription
(cherry picked from commit 75f3e930cd)
2024-09-20 14:22:39 +02:00
kolaente 8b8ec19bb3 fix(subscriptions): cleanup and simplify fetching subscribers for tasks and projects logic
Vikunja now uses one recursive CTE and a few optimizations to fetch all subscribers for a task or project. This makes the relevant code easier to maintain and more performant.

(cherry picked from commit 4ff8815fe1)
2024-09-20 14:22:37 +02:00
renovateandkolaente 7646c7f0c9 fix(deps): update dependency dayjs to v1.11.13
(cherry picked from commit 850ec7efb0)
2024-09-20 14:22:36 +02:00
kolaente c8f7a57566 fix(subscription): always return task subscription when subscribed to task and project
(cherry picked from commit 115d1c3618)
2024-09-20 14:22:34 +02:00
kolaente 1c64b75f86 chore(deps): update github.com/wneessen/go-mail to v0.4.4
(cherry picked from commit 6d26497bbb)
2024-09-20 14:22:33 +02:00
kolaente fc8252e751 fix(subscriptions): correctly inherit subscriptions
Resolves https://community.vikunja.io/t/e-mail-notification-twice/2740/20

(cherry picked from commit 06305eb6b3)
2024-09-20 14:22:33 +02:00
Frederick [Bot]andkolaente 1c9590075a chore(i18n): update translations via Crowdin
(cherry picked from commit 7bd84a845c)
2024-09-20 14:22:31 +02:00
kolaente 800f4545c1 fix(service worker): use correct workbox version
Resolves https://github.com/go-vikunja/vikunja/issues/322

(cherry picked from commit 165ee9e7f3)
2024-09-20 14:22:29 +02:00
kolaente a462697b30 fix(notifications): only add project subscription as task subscription when the user is not already subscribed to the task
Before this fix, a project subscription object was added twice to the list of subscriptions for a task when the user did not subscribe to the task directly. This caused the user to receive a comment notification twice for a given task.
This was probably a regression from efde364224.

Resolves https://community.vikunja.io/t/e-mail-notification-twice/2740/18

(cherry picked from commit 2c9becec10)
2024-09-20 14:22:29 +02:00
kolaente 5049cbf236 chore(web): always set internal error
(cherry picked from commit 5c56d07215)
2024-09-20 14:22:28 +02:00
kolaente a2ef74cade chore(web): use logger directly
(cherry picked from commit 6fb314b326)
2024-09-20 14:22:25 +02:00
kolaente fe44b7d473 chore(web): use web auth factory directly
(cherry picked from commit 9b01666ec6)
2024-09-20 14:22:23 +02:00
Frederick [Bot]andkolaente 01c4f1fc0e chore(i18n): update translations via Crowdin
(cherry picked from commit 14c862d284)
2024-09-20 14:22:21 +02:00
kolaente 5fba4ed6ef chore(web): use config directly
(cherry picked from commit bcfd72c645)
2024-09-20 14:22:19 +02:00
kolaente d885b43328 chore(web): directly use new db session
(cherry picked from commit 499f66b7ae)
2024-09-20 14:22:16 +02:00
kolaente 459c8daed6 chore(web): remove redundant use of fmt.Sprintf
(cherry picked from commit 8e37d5cb76)
2024-09-20 14:22:16 +02:00
kolaente 5768648760 chore(web): use errors.As instead of type assertion
(cherry picked from commit 57ba073874)
2024-09-20 14:22:11 +02:00
kolaente 198b2e3b70 chore(web): remove unused echo context
(cherry picked from commit 329de3aab3)
2024-09-20 14:22:11 +02:00
kolaente be8ecb6d36 fix(labels): test error assertion
(cherry picked from commit 74a74b7ec7)
2024-09-20 14:22:09 +02:00
kolaente 4c73c74587 chore(web): move web handler package to Vikunja
(cherry picked from commit 2063da9eec)
2024-09-20 14:22:08 +02:00
kolaente cfa58ae599 chore(errors): always add internal error to echo error
(cherry picked from commit 7a7e97770c)
2024-09-20 14:21:18 +02:00
kolaente 39d0409f57 fix(labels): trigger task.updated event when removing a label from a task
(cherry picked from commit bea131cfd9)
2024-09-20 14:21:16 +02:00
kolaente 7b804efbe2 feat(event): simplify dispatching task updated event from only a task id
(cherry picked from commit 5a0d1f1dc6)
2024-09-20 14:21:14 +02:00
kolaente f812a67269 chore(docker): use new env format
(cherry picked from commit b5035f9d2b)
2024-09-20 14:21:13 +02:00
kolaente 1a131d79f9 fix(subscriptions): ignore task subscription when the user is subscribed to the project
Resolves https://community.vikunja.io/t/e-mail-notification-twice/2740/12
Resolves https://github.com/go-vikunja/vikunja/issues/316

(cherry picked from commit efde364224)
2024-09-20 14:21:11 +02:00
kolaente a253f76060 fix(api): return 404 response when using a token and the route does not exist
(cherry picked from commit fde1763eef)
2024-09-20 14:21:09 +02:00
kolaente c85da01294 fix(task): set done at date when moving a task to the done bucket
Resolves https://github.com/go-vikunja/vikunja/issues/320

(cherry picked from commit bf56311faa)
2024-09-20 14:21:06 +02:00
Frederick [Bot]andkolaente 499f3f000c chore(i18n): update translations via Crowdin
(cherry picked from commit c38aaeb224)
2024-09-20 14:21:02 +02:00
Frederick [Bot]andkolaente 1059b00298 chore(i18n): update translations via Crowdin
(cherry picked from commit 1b9139b9b0)
2024-09-20 14:21:00 +02:00
kolaente 37324aeaf2 chore(deps): update tiptap to 2.6.6
(cherry picked from commit 13763e3540)
2024-09-20 14:20:58 +02:00
kolaente 7b275794dc fix(deps): update golangci
(cherry picked from commit 8bfd0493b2)
2024-09-20 14:20:56 +02:00
kolaente 72db97203a fix(view): do not crash when saving a view
Resolves https://github.com/go-vikunja/vikunja/issues/312

(cherry picked from commit 435cb2e7f7)
2024-09-20 14:20:54 +02:00
Frederick [Bot]andkolaente 27c14b6903 chore(i18n): update translations via Crowdin
(cherry picked from commit 9ed33f5c08)
2024-09-20 14:20:53 +02:00
Frederick [Bot]andkolaente ec94cf6813 chore(i18n): update translations via Crowdin
(cherry picked from commit 83669fd9e0)
2024-09-20 14:20:52 +02:00
Frederick [Bot]andkolaente 6a9b5cb7d0 chore(i18n): update translations via Crowdin
(cherry picked from commit 35578e0021)
2024-09-20 14:20:51 +02:00
Frederick [Bot]andkolaente 8248049530 chore(i18n): update translations via Crowdin
(cherry picked from commit e281de30b5)
2024-09-20 14:20:51 +02:00
Frederick [Bot]andkolaente d1678fe420 chore(i18n): update translations via Crowdin
(cherry picked from commit ec2c2e74f0)
2024-09-20 14:20:46 +02:00
kolaente 08821ea8a8 chore: 0.24.2 release preperations 2024-08-12 20:22:07 +02:00
kolaente e9a466fa31 fix(kanban): always make cover image full width
(cherry picked from commit f22420d502)
2024-08-12 20:17:10 +02:00
kolaente de9f686480 fix(migration): ensure project background gets exported and imported
(cherry picked from commit ebfd5f54d2)
2024-08-12 20:17:10 +02:00
kolaente d08e9650ba fix(migration): make sure tasks are associated to the correct view and bucket for data imported from Vikunja dump
This change fixes a bug where imported projects would contain the default views additionally to the ones included in the export. This also caused the tasks to not show up in the views and buckets where they should show up, the newly imported ones.

Resolves https://community.vikunja.io/t/migration-from-vikunja-export-duplicated-boards-local-to-oidc/2690

(cherry picked from commit 28b4eaee31)
2024-08-12 20:17:09 +02:00
kolaente 0434a96c3a fix(views): do not create task bucket and task position entries when duplicating a project
Resolves https://github.com/go-vikunja/vikunja/issues/297
Resolves https://community.vikunja.io/t/duplicating-a-board-puts-the-buckets-in-the-original-board/2579

(cherry picked from commit b83448b7a6)
2024-08-12 20:17:07 +02:00
kolaente 2b9b77bef2 fix(task): move task into new kanban bucket when moving between projects
Resolves https://github.com/go-vikunja/vikunja/issues/290
Resolves https://community.vikunja.io/t/tasks-moved-from-one-project-to-another-do-not-show-up-in-kanban/2689

(cherry picked from commit eed783e42f)
2024-08-12 20:17:05 +02:00
kolaente f5040ad2f4 chore: use nixpkgs unstable for more recent packages
(cherry picked from commit 1d624612ee)
2024-08-12 20:17:04 +02:00
kolaente 7bc77ae8c0 fix(task): set current project after moving a task
(cherry picked from commit 9576f72d7c)
2024-08-12 20:17:02 +02:00
kolaente 715269a5d0 fix(task): do not allow moving a task to the project the task already belongs to
(cherry picked from commit 7efc4d1bc8)
2024-08-12 20:17:01 +02:00
kolaente 53605c24f0 chore(deps): update dependency node to v20.16.0
(cherry picked from commit 670e605275)
2024-08-12 20:17:00 +02:00
kolaente da0b741b69 chore(deps): update go toolchain to 1.22.5
(cherry picked from commit 871b3ce071)
2024-08-12 20:16:59 +02:00
kolaente 73f923bc47 feat: switch from nix flakes to devenv
(cherry picked from commit ad3c5fcee5)
2024-08-12 20:16:56 +02:00
kolaente 25a8c7ea80 feat(editor): support custom protocol for links
Resolves https://github.com/go-vikunja/vikunja/issues/306

(cherry picked from commit e2a87036e0)
2024-08-12 20:16:55 +02:00
kolaente 950de7c954 fix(mail): do not fail testmail command when the connection could not be closed.
Resolves https://github.com/go-vikunja/vikunja/issues/300

(cherry picked from commit 40bb86bee5)
2024-08-12 20:16:54 +02:00
Frederick [Bot]andkolaente 42ba9240b0 chore(i18n): update translations via Crowdin
(cherry picked from commit 4a4ed2cf89)
2024-08-12 20:16:52 +02:00
kolaente 3da6299021 chore(deps): update flake
(cherry picked from commit 7751e124a7)
2024-08-12 20:16:50 +02:00
Frederick [Bot]andkolaente 1ac0f412b9 chore(i18n): update translations via Crowdin
(cherry picked from commit 6137d07138)
2024-08-12 20:16:48 +02:00
kolaente e7fbdc2727 fix(i18n): change casing of Ukrainian language in selector
(cherry picked from commit 66d316f0b5)
2024-08-12 20:16:46 +02:00
kolaente 7117303d57 docs: clarify Todoist redirect url
Resolves https://github.com/go-vikunja/vikunja/issues/302

(cherry picked from commit bf2d56c9d4)
2024-08-12 20:16:45 +02:00
Dominik Pschenitschniandkolaente 0ca43dc147 fix: remove console log
(cherry picked from commit 413798b321)
2024-08-12 20:16:43 +02:00
Frederick [Bot]andkolaente c47ea2716c chore(i18n): update translations via Crowdin
(cherry picked from commit bf1c8c6119)
2024-08-12 20:16:42 +02:00
Frederick [Bot]andkolaente cbdcc61414 chore(i18n): update translations via Crowdin
(cherry picked from commit 49fa0a8468)
2024-08-12 20:16:41 +02:00
Frederick [Bot]andkolaente 194a7d4cf8 chore(i18n): update translations via Crowdin
(cherry picked from commit 784cd42a7a)
2024-08-12 20:16:37 +02:00
Frederick [Bot]andkolaente 9695785a0c chore(i18n): update translations via Crowdin
(cherry picked from commit 4f74be0247)
2024-08-12 20:16:35 +02:00
Dominik Pschenitschniandkolaente d9f555554e fix: textarea autosize for LanguageTool
(cherry picked from commit 7ef1e0a3e5)
2024-08-12 20:16:32 +02:00
Dominik Pschenitschniandkolaente 6e38bcf349 chore: improve error message
(cherry picked from commit bc5fd380e5)
2024-08-12 20:16:30 +02:00
Dominik Pschenitschniandkolaente fc780a90ae chore: remove lodash.debounce
(cherry picked from commit bcd306b84d)
2024-08-12 20:16:28 +02:00
Dominik Pschenitschniandkolaente d586f691b7 feat: add missing peer dependency
(cherry picked from commit ad2870335d)
2024-08-12 20:16:26 +02:00
Frederick [Bot]andkolaente 9e8e43bd12 chore(i18n): update translations via Crowdin
(cherry picked from commit 917748777f)
2024-08-12 20:16:24 +02:00
renovateandkolaente c554a96b4b fix(deps): update module github.com/coreos/go-oidc/v3 to v3.11.0
(cherry picked from commit 324c966dda)
2024-08-12 20:16:23 +02:00
Frederick [Bot]andkolaente 3ecc81094f [skip ci] Updated swagger docs
(cherry picked from commit 0984821b41)
2024-08-12 20:16:21 +02:00
Dominik Pschenitschniandkolaente 811ccc1baa feat: improve ProjectSettingsViews
(cherry picked from commit e8be657d97)
2024-08-12 20:16:17 +02:00
Dominik Pschenitschniandkolaente d7c5451729 feat: add tailwind with prefix (#2513)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2513
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
(cherry picked from commit bbfd5270db)
2024-08-12 20:16:16 +02:00
Dominik Pschenitschniandkolaente 96884372b4 fix(projects): trigger only single mutation
Previously these store methods created multiple edits on deep objects in the store or edited a deep nested object directly.

This is bad because:
- multiple edits lead to multiple triggers of all the watchers on the project.
- in theory we should listen deep to a project if we use some deep reactive value of a project, if we want deep updates. Because this is easy to forget, it's better to update the project directly. For this the method `setProject` already existed in the store. This is no real overhead because Vue is smart enough to only trigger listeners that use data of the modified state.

By modifying only a copy of the view and submitting the modified result __once__ we can save us a lot of headache.

PS: I'm not sure if there were any visible problems, because Vue is really fast and the reactivity system works quite well. Regardless of this we should try not to modify state unnecessarily.
(cherry picked from commit 1e632397d2)
2024-08-12 20:16:15 +02:00
Dominik Pschenitschniandkolaente dddba4d64a feat: improve priority visibility
(cherry picked from commit d35454c099)
2024-08-12 20:16:13 +02:00
Dominik Pschenitschniandkolaente a0e3efe2d1 feat: improve label store
(cherry picked from commit 2a6ba7e7f0)
2024-08-12 20:16:12 +02:00
Dominik Pschenitschniandkolaente d707e1576a feat: improve projects store
(cherry picked from commit 1e523a1a39)
2024-08-12 20:16:11 +02:00
Dominik Pschenitschniandkolaente 3aaf363413 fix: emit for DatepickerWithValues
(cherry picked from commit fb91e73a3c)
2024-08-12 20:16:08 +02:00
Frederick [Bot]andkolaente 28fff10fec chore(i18n): update translations via Crowdin
(cherry picked from commit ebd6139c1f)
2024-08-12 20:16:07 +02:00
Dominik Pschenitschniandkolaente 8729c24e1d feat: use withDefaults for Reminders
(cherry picked from commit 6990be705c)
2024-08-12 20:16:01 +02:00
kolaente eee895105a chore: 0.24.1 release preparations 2024-07-18 16:56:04 +02:00
kolaente ef0bf3156e fix(project): do not use project id of nil project in error 2024-07-18 16:39:30 +02:00
kolaente a25834b089 fix(filters): immediately emit filter query when editing saved filter
Resolves https://community.vikunja.io/t/filtering-unexpected-character-relative-dates/2544/12
2024-07-18 16:32:09 +02:00
kolaente 526bd1f170 fix(filters): reload tasks silently when marking one done in the list
This fixes a UI issue where if a user had a filter set and marked the task done, it would not disappear, even though the filter does not match the done task anymore.
2024-07-18 15:51:03 +02:00
kolaente bea81f83f7 fix(filters): only insert task buckets and positions when there are any 2024-07-18 15:38:29 +02:00
kolaente 03381f47bf fix(filters): show actual error message from api when the filter query is invalid 2024-07-18 15:35:33 +02:00
renovateandkonrad ec8f962615 fix(deps): update dependency dayjs to v1.11.12 2024-07-18 13:32:45 +00:00
kolaente dd8be14fdb fix(filters): make sure filters are replaced case-insensitively before filtering on the server
Resolves https://community.vikunja.io/t/filtering-startdate-now-is-invalid/2613
2024-07-18 15:21:37 +02:00
kolaente 12474e5be6 fix(kanban): make sure tasks which changed their done status are moved around in buckets
This fixes a bug where tasks which had their done status changed were not moved in the correct bucket. This affected both frontend and api. The move of the task between buckets is now correctly done in the api and frontend - with a bit of duplicated logic between the two. This could be optimized further in the future.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2610
2024-07-18 12:39:29 +02:00
renovateandkolaente 34691b8edf fix(deps): update module golang.org/x/crypto to v0.25.0 2024-07-18 10:46:03 +02:00
Frederick [Bot]anddrone f98a336920 chore(i18n): update translations via Crowdin 2024-07-18 00:03:00 +00:00
renovate 918a05cfda fix(deps): update tiptap to v2.5.4 2024-07-17 22:15:14 +00:00
renovateandkonrad 84e8478e94 chore(deps): update pnpm to v9.5.0 2024-07-17 22:10:27 +00:00
Dominik Pschenitschni fd6692ea1a feat: remove props destructuring from FilterInput 2024-07-17 23:00:47 +02:00
renovateandkonrad ddc8b416c0 fix(deps): update module github.com/microcosm-cc/bluemonday to v1.0.27 2024-07-17 15:06:04 +00:00
renovate a4e98a33c5 fix(deps): update font awesome to v6.6.0 2024-07-17 14:11:53 +00:00
renovateandkolaente ee99ee4d02 fix(deps): update module golang.org/x/term to v0.22.0 2024-07-17 14:49:48 +02:00
kolaente acf9f836a7 fix(settings): overflow of select on mobile 2024-07-17 14:46:17 +02:00
kolaente 7c54d1accf fix(api tokens): show error message when the user tries to create an api token without at least one permission selected 2024-07-17 14:42:47 +02:00
renovateandkonrad 891db0216b fix(deps): update dependency vue to v3.4.32 2024-07-17 12:19:59 +00:00
kolaente f1d9e4f25c fix(quick add magic): create the task even when it only contains quick add magic keywords
Resolves https://github.com/go-vikunja/vikunja/issues/282
2024-07-17 14:16:21 +02:00
kolaente 82ee9f18eb fix(kanban): do not allow to create new tasks in saved filter 2024-07-17 14:00:47 +02:00
kolaente ed5feee33a fix(kanban): move task to done bucket when it was marked done from the task detail view 2024-07-17 13:56:43 +02:00
kolaente 3566b889be fix(task): use backdropView prop 2024-07-17 13:45:31 +02:00
kolaente db81701d38 fix: scss deprecation warning 2024-07-17 13:25:18 +02:00
Dominik Pschenitschniandkonrad cb706416c6 feat: use withDefaults for DatepickerWithValues 2024-07-17 11:06:57 +00:00
kolaente f8fb9d7407 fix(filters): add tasks to filter buckets when updating the filter 2024-07-17 12:57:52 +02:00
kolaente 5cc420b289 fix(filters): add task to buckets of saved filters when creating the task 2024-07-17 12:57:51 +02:00
renovateandkonrad 327905bb90 fix(deps): update module github.com/arran4/golang-ical to v0.3.1 (#2606)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2606
Reviewed-by: konrad <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-07-17 10:51:53 +00:00
Dominik Pschenitschniandkonrad f1481d702c feat: withDefaults for EditAssignees 2024-07-17 10:33:28 +00:00
renovateandkonrad c97dbd3cff chore(deps): update goreleaser/nfpm docker tag to v2.38.0 2024-07-17 10:30:30 +00:00
kolaente d2602a7629 chore: update golangci lint config 2024-07-17 11:43:38 +02:00
kolaente 744b40e7f7 fix: missing error handling 2024-07-17 11:43:38 +02:00
kolaente 1e42e54db1 fix(projects): do not create buckets in the original project when duplicating a project 2024-07-17 10:24:47 +02:00
kolaente 8a6689f4fa fix(projects): do not create backlog bucket when duplicating views 2024-07-17 10:24:03 +02:00
kolaente 092a65b025 feat(project): add " - duplicate" suffix to duplicated projects title 2024-07-17 10:23:33 +02:00
kolaente 5e04abaa06 chore(project): rename receiver 2024-07-17 10:23:01 +02:00
kolaente fe8e0ef78b fix(kanban): use correct text color for deletion button 2024-07-17 10:09:36 +02:00
kolaente ecdb03aca8 fix(migration): correctly set bucket for related tasks
When creating a related task during the import, migrating would fail because the migration would try to add the task to a bucket before the task was created. This fix changes the order in which that happens to prevent the error.
2024-07-17 10:05:59 +02:00
kolaente 58e492872a fix(kanban): put task into correct bucket when creating via kanban board 2024-07-17 09:36:33 +02:00
renovateandkonrad ee20e6175a fix(deps): update dependency ufo to v1.5.4 2024-07-17 07:29:33 +00:00
kolaente 24ae38713b chore(deps): update flake 2024-07-17 09:24:49 +02:00
Dominik Pschenitschniandkonrad c8585d1a69 feat: use withDefaults for RepeatAfter 2024-07-17 06:46:47 +00:00
renovate 3be685ad08 chore(deps): update dev-dependencies 2024-07-17 06:15:23 +00:00
Dominik Pschenitschniandkonrad aaa2abced4 feat: add withDefaults and emit types to PrioritySelect 2024-07-17 02:33:35 +00:00
Dominik Pschenitschniandkonrad ddc18aa177 feat: remove props destructuring from KanbanCard 2024-07-16 23:28:15 +00:00
Dominik Pschenitschniandkonrad 07130bdc3a feat: remove props destructuring from Attachments 2024-07-16 23:10:57 +00:00
Dominik Pschenitschniandkonrad 2f92e407cc feat: remove props destructuring from ViewEditForm 2024-07-16 22:59:25 +00:00
Dominik Pschenitschniandkonrad 6e72606d74 feat: use withDefaults for EditLabels 2024-07-16 22:09:37 +00:00
Dominik Pschenitschniandkonrad 577f5ae69a feat: use withDefaults for Password 2024-07-16 22:09:30 +00:00
Dominik Pschenitschniandkonrad 8ad7e7c905 feat: remove PropTypes helper from ProjectInfo 2024-07-16 22:07:27 +00:00
Dominik Pschenitschniandkonrad b4e9d9437e feat: use withDefaults for FancyCheckbox 2024-07-16 22:07:18 +00:00
Dominik Pschenitschniandkonrad 0c70aedeb1 feat: remove props destructuring from ProjectList 2024-07-16 22:06:48 +00:00
Dominik Pschenitschniandkonrad 99e90c0b02 feat: remove props destructuring from ProjectTable 2024-07-16 22:06:40 +00:00
Dominik Pschenitschniandkonrad 38744dfd5d feat: remove props destructuring for ProjectWrapper 2024-07-16 22:04:43 +00:00
Dominik Pschenitschniandkonrad eb07be1a62 feat: remove props destructuring from ColorPicker 2024-07-16 22:04:26 +00:00
Dominik Pschenitschniandkonrad 825d1add49 feat: remove props destructuring from FilterDelete 2024-07-16 22:04:21 +00:00
Dominik Pschenitschniandkonrad a15831eb33 feat: remove props destructuring from SingleTaskInProject 2024-07-16 22:04:17 +00:00
Dominik Pschenitschniandkonrad 871e0acd8a feat: use withDefaults for PriorityLabel 2024-07-16 21:58:07 +00:00
Dominik Pschenitschniandkonrad 5af908b2e5 feat: remove props destructuring from ProjectKanban 2024-07-16 21:57:57 +00:00
Dominik Pschenitschniandkonrad 449e9a911c feat: remove props destructuring from FilterEdit 2024-07-16 21:53:56 +00:00
Dominik Pschenitschniandkonrad 098c99fd2e feat: type defineEmits for CreateEdit 2024-07-16 21:53:28 +00:00
Dominik Pschenitschniandkonrad c9591fe464 feat: remove props destructuring from NoAuthWrapper 2024-07-16 21:53:21 +00:00
Dominik Pschenitschniandkonrad df6a9b67fd feat: use withDefaults for DatepickerInline 2024-07-16 21:53:15 +00:00
Dominik Pschenitschniandkonrad d02c349231 feat: remove props destructuring from ShowTasks 2024-07-16 21:50:40 +00:00
Dominik Pschenitschniandkonrad fd3f1de861 feat: type defineEmits for Heading 2024-07-16 21:50:32 +00:00
Dominik Pschenitschniandkonrad f38a5c9220 feat: type defineEmits for ProjectSearch 2024-07-16 21:50:27 +00:00
Dominik Pschenitschniandkonrad 9d2e79f725 feat: define prop and emit types for FilterPopup 2024-07-16 21:50:23 +00:00
Dominik Pschenitschniandkonrad 85889fff56 feat: remove PropTypes helper from ProjectSettingsEdit 2024-07-16 21:49:15 +00:00
Dominik Pschenitschniandkonrad 8ac0eb4aa4 feat: defineModel and withDefaults for PercentDoneSelect 2024-07-16 21:49:02 +00:00
Dominik Pschenitschniandkonrad 1966cc3c0e feat: type defineEmits for ApiConfig 2024-07-16 21:46:15 +00:00
Dominik Pschenitschniandkonrad 20bdb01187 feat: remove props destructuring ProjectSettingsViews 2024-07-16 21:45:29 +00:00
Dominik Pschenitschniandkonrad 3ff56d7987 feat: remove props destructuring for Filters 2024-07-16 21:44:24 +00:00
Dominik Pschenitschniandkonrad 46aa2fff0f feat: remove props destructuring for DeferTask 2024-07-16 21:43:36 +00:00
Dominik Pschenitschniandkonrad a10f9ca225 feat: remove props destructuring from TaskDetailView 2024-07-16 21:42:21 +00:00
Dominik Pschenitschniandkonrad 0bc1832050 feat: remove PropTypes helper from FilePreview 2024-07-16 21:39:15 +00:00
Dominik Pschenitschniandkonrad 78811d916a feat: use withDefaults for Datepicker 2024-07-16 21:38:07 +00:00
Dominik Pschenitschniandkonrad f19f19bb75 feat: use withDefaults for Comments 2024-07-16 21:37:52 +00:00
Dominik Pschenitschniandkonrad f2fdbad7d4 feat: use withDefaults for UserTeam 2024-07-16 21:37:28 +00:00
Dominik Pschenitschniandkonrad 4b9b9da122 feat: use withDefaults for ReminderPeriod 2024-07-16 21:35:06 +00:00
Dominik Pschenitschniandkonrad 10832165c3 feat: use withDefaults for Pagination 2024-07-16 21:34:59 +00:00
Dominik Pschenitschniandkonrad d6c3b5a9a1 feat: use withDefaults for Reactions 2024-07-16 21:34:51 +00:00
Dominik Pschenitschniandkonrad 2f6338484b feat: use withDefaults for ProgressBar 2024-07-16 21:32:13 +00:00
Dominik Pschenitschniandkonrad f586e51aad feat: use withDefaults for DateTableCell 2024-07-16 21:32:06 +00:00
Dominik Pschenitschniandkonrad fd12c8705e feat: use withDefaults for SelectProject 2024-07-16 21:30:52 +00:00
Dominik Pschenitschniandkonrad 5545b0e447 feat: add withDefaults, defineEmits and defineSlots types for Dropdown 2024-07-16 21:30:33 +00:00
Dominik Pschenitschniandkonrad 043a6dd049 feat: type defineEmits for Card 2024-07-16 21:29:39 +00:00
Dominik Pschenitschniandkonrad 30769fb6ea feat: use withDefaults for Subscription 2024-07-16 21:29:33 +00:00
Dominik Pschenitschni 553a97f03d feat: remove props destructuring for ProjectView 2024-07-16 19:27:24 +02:00
renovate 8c9623dd0e fix(deps): update dependency @sentry/vue to v8.18.0 2024-07-16 15:12:44 +00:00
renovateandkonrad 9b232a326a fix(deps): update dependency @sentry/vue to v8.17.0 2024-07-16 08:32:45 +00:00
Frederick [Bot]andDominik Pschenitschni 68b9d391b0 chore(i18n): update translations via Crowdin 2024-07-16 00:23:00 +00:00
Dominik Pschenitschniandkonrad b718aa1fbd chore(popup): trigger close function directly 2024-07-15 19:51:14 +00:00
renovateandkonrad a114b9c8d3 fix(deps): update dependency @github/hotkey to v3.1.1 (#2329)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2329
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-07-15 19:50:46 +00:00
Dominik Pschenitschni 48e045b4a3 fix(vscode): i18n-ally locales path 2024-07-15 18:21:00 +02:00
kolaente 8439c9cc1e fix(migration): failed migration typo 2024-07-15 12:10:29 +02:00
Frederick [Bot]anddrone 4bd02a1181 chore(i18n): update translations via Crowdin 2024-07-15 00:21:19 +00:00
kolaente f2d90f31bc fix(migration): revert to old path for migration routing
This change fixes a bug where the migration redirect handler changed the url which lead to the redirect with the auth code from external services to a 404 page, ultimately breaking the migration.

Resolves https://community.vikunja.io/t/geting-404-when-attempting-todoist-import/2588
2024-07-14 22:49:30 +02:00
Frederick [Bot]andDominik Pschenitschni dcf88560a7 chore(i18n): update translations via Crowdin 2024-07-14 00:23:03 +00:00
Dominik Pschenitschniandkonrad 2dc541571c fix: spelling mail 2024-07-13 11:03:43 +00:00
Frederick [Bot]anddrone 08c2cd6b63 chore(i18n): update translations via Crowdin 2024-07-13 00:22:53 +00:00
kolaente bb25a3397b fix(kanban): use correct assertion in the test 2024-07-12 14:21:46 +02:00
kolaente 918c2224d8 fix(kanban): move task to done bucket in all views when moved to done bucket in one view 2024-07-12 13:59:59 +02:00
kolaente 323ecdaab6 fix(kanban): move repeating task back to old bucket when moved to the done bucket 2024-07-12 13:44:45 +02:00
kolaente 51040cf1af fix(kanban): dispatch task updated event when task position is updated
This fixes a bug where a task would not be indexed in Typesense when its position changed.
2024-07-12 13:31:27 +02:00
kolaente e5e0db1f6a fix(kanban): dispatch task updated event when task is moved between buckets
This fixes a bug where a task would not be indexed in Typesense when its bucket changed.
2024-07-12 13:29:15 +02:00
kolaente 62412ce29b fix(kanban): do not move repeating task into a different bucket 2024-07-12 13:19:50 +02:00
kolaente 7c42fb5d75 fix: lint 2024-07-12 11:49:03 +02:00
Frederick [Bot]anddrone 42c2d0884b chore(i18n): update translations via Crowdin 2024-07-12 00:22:53 +00:00
kolaente ec0c05fd47 fix(kanban): update task done status after moving it into done bucket
Resolves https://kolaente.dev/vikunja/vikunja/issues/2518
2024-07-11 13:17:33 +02:00
kolaente 8711f7a935 fix(typesense): do not use modified opts for db fallback search 2024-07-11 12:52:09 +02:00
kolaente 7f27cee6a3 fix(tasks): do not use typesense modified options to search with database 2024-07-11 12:41:40 +02:00
kolaente 5644130f01 fix(filters): do not create a default filter for list view when creating a saved filter
Because a default filter in a filter is highly unexpected, it can lead to these filters cancelling each other out, resulting in confusing behaviour. See https://kolaente.dev/vikunja/vikunja/issues/2547#issuecomment-65180
2024-07-11 12:29:09 +02:00
kolaente 38c30d1eee fix(filters): trim spaces when parsing filter values
This fixes a bug where values would not be trimmed before parsing them. That resulted in a value like " 2" being invalid, even though it's a perfectly fine number.
Because the frontend sends the filters for projects and other values with comma-separated spaces like "1, 2, 3", this essentially broke filtering by these values.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2547
2024-07-11 12:20:32 +02:00
kolaente 471d0fcd4a fix(typesense): reindex tasks when their position changed 2024-07-11 12:07:48 +02:00
kolaente 0b424fe95e fix(typesense): do not crash after creating a project when tasks are not yet indexed
Before this fix, creating a project with Typesense enabled would fail with an error because the tasks it fetches as part of that process do not have the task position property in their index. We now fall back to using the db for searching in that case.

In the long run, we should use typesense joins for the task position to make this more efficient.
2024-07-11 12:07:22 +02:00
kolaente 70615d6843 fix(filter): make sure filter values are properly escaped before executing them
Resolves https://community.vikunja.io/t/filtering-unexpected-character-relative-dates/2544
Resolves https://github.com/go-vikunja/vikunja/issues/286
2024-07-11 11:27:19 +02:00
kolaente 2982acc0ec fix(tasks): limit to max 250 entries when using typesense
Resolves https://community.vikunja.io/t/typesense-250-hits-limit/2536/8
2024-07-11 10:06:39 +02:00
kolaente 2c6bc7742f fix(tasks): explicitly add task position to select statement when looking up tasks with Typesense
Resolves https://kolaente.dev/vikunja/vikunja/issues/2546
Resolves https://community.vikunja.io/t/version-0-24-0-internal-server-error-breaking-change/2558/5
2024-07-11 09:28:22 +02:00
Frederick [Bot]andDominik Pschenitschni 02a7958865 chore(i18n): update translations via Crowdin 2024-07-11 00:22:47 +00:00
Dominik Pschenitschniandkonrad af639a180c fix: wrapped button
This somehow weirdly fixes the test. I have no clue why. Regardless it should be better than before, because a button  (DropdownItem) should never contain another interactive element (the setBucketLimit input and save button).

The test failed because I replaced a v-if with v-show. I do not know _why_ this made the test fail. When I reproduced the test step by step it worked for me…
2024-07-10 09:19:55 +00:00
Dominik Pschenitschniandkonrad faa797f461 feat: improve main nav spacing and open speed 2024-07-10 09:19:55 +00:00
Frederick [Bot]anddrone e2eb711ac9 chore(i18n): update translations via Crowdin 2024-07-10 00:22:50 +00:00
renovateandkonrad 7dcb5fec9a chore(deps): update dev-dependencies 2024-07-09 11:27:08 +00:00
Frederick [Bot]anddrone f507a46324 chore(i18n): update translations via Crowdin 2024-07-09 00:22:12 +00:00
renovate a863b5d375 fix(deps): update dependency dompurify to v3.1.6 2024-07-08 15:11:51 +00:00
Dominik Pschenitschniandkonrad 0a81855bc1 fix: muliselect optional props
also adds name and id props
2024-07-08 14:04:03 +00:00
renovateandkonrad 6064d72aa7 chore(deps): update dev-dependencies 2024-07-08 13:55:26 +00:00
Frederick [Bot]andDominik Pschenitschni 35dea13b22 chore(i18n): update translations via Crowdin 2024-07-08 00:21:34 +00:00
Dominik Pschenitschniandkonrad 7ef6ddf8f7 fix: gitignore dist path 2024-07-07 15:02:49 +00:00
Dominik Pschenitschniandkonrad c37fe49890 feat: improve BaseButtonEmits type 2024-07-07 15:02:41 +00:00
Dominik Pschenitschniandkonrad 413d1f9ad7 feat: withDefaults for Multiselect 2024-07-07 15:02:30 +00:00
Dominik Pschenitschniandkonrad 3317280062 fix: dropdown item disabled prop 2024-07-07 15:01:11 +00:00
Balázs Kereszturyandkonrad 136ef58820 fix: reorder mail options (#2533)
This PR fixes a bug where setting the SMTP port didn't have any effect, since it is overridden when `NewClient()` executes the `WithTLSPortPolicy()` option.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2533
Resolves https://kolaente.dev/vikunja/vikunja/issues/2534
Co-authored-by: Balázs Keresztury <b@belidzs.hu>
Co-committed-by: Balázs Keresztury <b@belidzs.hu>
2024-07-07 15:00:19 +00:00
Dominik Pschenitschniandkonrad 1eb1aa2575 feat: remove unnecessary prop from Card 2024-07-07 14:58:58 +00:00
Dominik Pschenitschniandkonrad 43e38fae17 feat: rename TheNavigation to AppHeader 2024-07-07 14:57:23 +00:00
Frederick [Bot]anddrone af54ee6c5c chore(i18n): update translations via Crowdin 2024-07-07 00:22:51 +00:00
Frederick [Bot]andDominik Pschenitschni 161fd1f1b6 chore(i18n): update translations via Crowdin 2024-07-06 00:23:06 +00:00
Dominik Pschenitschniandkonrad 479b786761 feat: use withDefaults for ProjectCardGrid 2024-07-05 15:50:10 +00:00
Dominik Pschenitschniandkonrad daeefeb487 feat: define prop and emit types DatepickerWithRange 2024-07-05 15:35:06 +00:00
Dominik Pschenitschniandkonrad a56331d39d feat: use withDefaults in ReminderDetail 2024-07-05 15:34:12 +00:00
Dominik Pschenitschni 42c458a736 feat: simplify playPopSound setting check 2024-07-05 14:24:53 +02:00
Dominik Pschenitschniandkonrad 5cf57a520c feat: use withDefaults for Heading 2024-07-05 12:02:39 +00:00
Dominik Pschenitschniandkonrad b500981434 feat: use withDefaults for SelectUser 2024-07-05 12:01:53 +00:00
renovate b0c41ca436 fix(deps): update dependency @sentry/vue to v8.15.0 2024-07-05 10:15:52 +00:00
Dominik Pschenitschni df1f805294 feat: remove eslint rule vue/no-required-prop-with-default
This rule is not part of the recommended rule set. I added it before, because I thought it might make sense.
2024-07-05 11:49:29 +02:00
kolaente e640149a23 chore: go mod tidy 2024-07-05 10:40:56 +02:00
kolaente 5e36bf797e fix: add info log message when starting to run migrations 2024-07-05 10:26:26 +02:00
renovateandkonrad 038e4ba386 chore(deps): update dependency vue-tsc to v2.0.26 2024-07-05 06:49:44 +00:00
Frederick [Bot]anddrone 0231d79b5a chore(i18n): update translations via Crowdin 2024-07-05 00:21:53 +00:00
renovate fe0e22a5cd fix(deps): update dependency @sentry/vue to v8.14.0 2024-07-04 10:11:29 +00:00
Dominik Pschenitschniandkonrad 20efacfa59 feat: improve settings label casing 2024-07-04 09:17:58 +00:00
Dominik Pschenitschniandkonrad 5e84a237fb fix(translation): TOTP casing 2024-07-04 09:10:01 +00:00
Dominik Pschenitschniandkonrad f9e0b43707 feat: move powered by to bottom 2024-07-04 09:04:39 +00:00
Dominik Pschenitschniandkonrad ed0ef385e9 fix: add missing disabled prop 2024-07-04 09:00:35 +00:00
Frederick [Bot]andDominik Pschenitschni f2a0ae108c chore(i18n): update translations via Crowdin 2024-07-04 00:21:54 +00:00
Dominik Pschenitschniandkonrad a721d9286b fix: disable button if loading 2024-07-03 16:05:05 +00:00
Dominik Pschenitschniandkonrad bc2baa3bbd feat(Multiselect): hide multiselect during loading 2024-07-03 15:34:19 +00:00
Dominik Pschenitschniandkonrad 51660f7677 fix: app bottom padding
display: flow-root creates a new block-formatting context and thus prevents overflowing margin issues created by a last child element that has a margin bottom
2024-07-03 15:33:49 +00:00
Dominik Pschenitschni f08039b23c fix: ProjectSearch default value 2024-07-03 10:02:31 +02:00
renovate 9d0dcda60f chore(deps): update dev-dependencies 2024-07-03 05:11:06 +00:00
Frederick [Bot]anddrone c42fbd6e0e chore(i18n): update translations via Crowdin 2024-07-03 00:22:03 +00:00
kolaente 0b14c311b4 chore: 0.24.0 release preparations 2024-07-02 17:48:12 +02:00
Frederick [Bot]andkolaente 31d427546b [skip ci] Updated swagger docs 2024-07-02 14:52:12 +00:00
kolaente 359b07dabb fix(views): move bucket update to extra endpoint
BREAKING CHANGE: The bucket id of the task model is now only used internally and will not trigger a change in buckets when updating the task.

This resolves a problem where the task update routine needs to know the view context it is in. Because that's not really what it should be used for, the extra endpoint takes all required parameters and handles the complexity of actually updating the bucket.
This fixes a bug where it was impossible to move a task around between buckets of a saved filter view. In that case, the view of the bucket and the project the task was in would be different, hence the update failed.
2024-07-02 16:34:53 +02:00
kolaente e6ce1251f7 fix(filters): allow managing views for saved filters 2024-07-02 12:36:08 +02:00
kolaente 10bad95440 fix(auth): log user out when the current account does not exist 2024-07-02 12:27:19 +02:00
kolaente 7a290116e8 docs: remove docs files
Docs are now included in https://kolaente.dev/vikunja/website
2024-07-02 11:48:51 +02:00
renovate 96e8e2354f chore(deps): update dev-dependencies 2024-07-02 04:11:10 +00:00
Frederick [Bot]anddrone 62ba1d864a chore(i18n): update translations via Crowdin 2024-07-02 00:22:51 +00:00
Frederick [Bot]anddrone 5a05cd3f8e chore(i18n): update translations via Crowdin 2024-07-01 00:21:24 +00:00
kolaente f6c041db5b feat(i18n): add Ukrainian for language selection in UI 2024-06-30 22:05:21 +02:00
Dominik Pschenitschniandkonrad 6d79eb0088 fix: align spelling in config.yml.sample (#2499)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2499
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-30 14:16:43 +00:00
Dominik Pschenitschniandkonrad 7db9e64053 feat: use withDefaults for AddTask 2024-06-30 14:16:01 +00:00
renovate 553fdeee6a chore(deps): update dev-dependencies 2024-06-30 08:13:23 +00:00
Frederick [Bot]anddrone e71865ef99 chore(i18n): update translations via Crowdin 2024-06-30 00:23:05 +00:00
renovateandkonrad 0688175b6f chore(deps): update dev-dependencies 2024-06-29 06:55:59 +00:00
renovateandkonrad 732d2b8885 fix(deps): update dependency @sentry/vue to v8.13.0 2024-06-29 06:55:25 +00:00
Dominik Pschenitschniandkonrad 8a2c74a702 feat: remove props destructuring from ProjectCard 2024-06-28 21:20:52 +00:00
Dominik Pschenitschniandkonrad 516f507ac4 feat: remove props destructuring EditorToolbar 2024-06-28 21:20:44 +00:00
Dominik Pschenitschniandkonrad fb449d7b29 feat: improve ProjectSettingsEdit reactivity 2024-06-28 21:20:03 +00:00
Dominik Pschenitschniandkonrad 914fe092e5 feat: add getter support to useProjectBackground 2024-06-28 21:18:37 +00:00
Dominik Pschenitschniandkonrad 01a4ad99ab feat: use withDefaults for Done 2024-06-28 21:16:57 +00:00
Dominik Pschenitschniandkonrad 142443c0a7 fix: typecheck
When using tsBuildInfoFile composite must be enabled. Because of that we need to change the typecheck command. The command is now the same as the one used by create-vue.
2024-06-28 21:11:24 +00:00
Dominik Pschenitschniandkonrad c81649c139 feat: use defineProps types in CreatedUpdated 2024-06-28 21:10:55 +00:00
Dominik Pschenitschniandkonrad dea051010d feat: use withDefaults for Labels 2024-06-28 21:08:35 +00:00
Dominik Pschenitschniandkonrad 1dbd8b6c37 feat: use defineProps types for ChecklistSummary 2024-06-28 21:07:31 +00:00
Dominik Pschenitschniandkonrad 9e266f1e36 feat: use defineProps types for ProjectSettingsDropdown 2024-06-28 21:03:14 +00:00
Dominik Pschenitschniandkonrad 5b0ce4e01c feat: use withDefaults for Card 2024-06-28 21:02:21 +00:00
Dominik Pschenitschniandkonrad 7c9f0b8ada feat: remove props destructuring from SingleTaskInlineReadonly 2024-06-28 21:02:01 +00:00
Dominik Pschenitschniandkonrad bd32f7aef5 feat: use withDefaults for ProjectSearch 2024-06-28 21:00:15 +00:00
renovateandkonrad 6b6ffd1616 fix(deps): update dependency vue to v3.4.31 2024-06-28 20:57:49 +00:00
renovate 34a095a325 fix(deps): update module github.com/wneessen/go-mail to v0.4.2 2024-06-28 13:13:10 +00:00
Frederick [Bot]anddrone 5daad1b29f chore(i18n): update translations via Crowdin 2024-06-28 00:22:08 +00:00
renovate c5000ab29b chore(deps): update dependency caniuse-lite to v1.0.30001638 2024-06-27 03:11:51 +00:00
renovate 8b10b329a6 chore(deps): update dev-dependencies 2024-06-26 05:11:03 +00:00
Frederick [Bot]anddrone 1b7a1292c5 chore(i18n): update translations via Crowdin 2024-06-26 00:21:56 +00:00
renovate 1e102267eb fix(deps): update module golang.org/x/image to v0.18.0 2024-06-25 20:10:27 +00:00
renovate 5ddd54adb5 fix(deps): update module github.com/yuin/goldmark to v1.7.4 2024-06-25 15:11:00 +00:00
Dominik Pschenitschniandkonrad 79798847b2 fix: move types to dev dependencies 2024-06-25 13:58:17 +00:00
Dominik Pschenitschniandkonrad b224b331f5 fix: remove props prefix from template 2024-06-25 13:57:52 +00:00
Dominik Pschenitschni 9f375ecd7d fix: import type in EditorToolbar 2024-06-25 15:18:27 +02:00
renovate 5b2b42e4df fix(deps): update dependency @sentry/vue to v8.12.0 2024-06-25 11:12:16 +00:00
renovate f6157fbbda chore(deps): update dev-dependencies to v7.14.1 2024-06-25 00:11:15 +00:00
Frederick [Bot]anddrone 6c4d467aec chore(i18n): update translations via Crowdin 2024-06-24 00:21:12 +00:00
renovate ea9741c46d fix(deps): update module github.com/yuin/goldmark to v1.7.3 2024-06-23 13:10:13 +00:00
renovate ed622ddc83 fix(deps): update dependency vue to v3.4.30 2024-06-23 10:10:28 +00:00
renovateandkonrad b6080149aa chore(deps): update dev-dependencies 2024-06-23 09:36:45 +00:00
Frederick [Bot]anddrone f2ac9c2cca chore(i18n): update translations via Crowdin 2024-06-23 00:21:58 +00:00
Frederick [Bot]anddrone cd05ceb495 chore(i18n): update translations via Crowdin 2024-06-22 00:22:58 +00:00
renovateandkonrad 2362d1fa85 fix(deps): update dependency @sentry/vue to v8.11.0 2024-06-21 18:53:02 +00:00
renovate 22db245681 fix(deps): update dependency vue-router to v4.4.0 2024-06-21 14:10:12 +00:00
renovateandkonrad c74f4b00e9 chore(deps): update dev-dependencies 2024-06-21 07:13:15 +00:00
Frederick [Bot]andDominik Pschenitschni fda69fc1af chore(i18n): update translations via Crowdin 2024-06-21 00:22:03 +00:00
Dominik Pschenitschniandkonrad ff2644d1c5 feat: use defineOptions for Loadings.vue 2024-06-20 19:59:31 +00:00
Dominik Pschenitschniandkonrad 4bd9c79912 feat: remove props destructuring ProjectsNavigationItem 2024-06-20 19:35:37 +00:00
renovate 439e9ef275 chore(deps): update dependency node to v20.15.0 2024-06-20 16:10:47 +00:00
Dominik Pschenitschniandkonrad 94a907b009 feat: use withDefaults for BaseCheckbox 2024-06-20 13:04:55 +00:00
Dominik Pschenitschniandkonrad 66be016a7f feat: improve gantt filter label 2024-06-20 13:03:45 +00:00
Dominik Pschenitschniandkonrad ba5240f6ae feat(XButton): merge script blocks 2024-06-20 13:03:41 +00:00
Dominik Pschenitschniandkonrad c90ee0142a fix: reset drag.value 2024-06-20 13:02:43 +00:00
Dominik Pschenitschniandkonrad 4c5bb3f114 feat: improve message types 2024-06-20 13:02:02 +00:00
Dominik Pschenitschni baaf612239 fix: import PeriodUnit as type 2024-06-20 12:16:09 +02:00
renovateandkonrad 5340e00259 chore(deps): update dependency @types/node to v20.14.6 2024-06-20 08:44:17 +00:00
Frederick [Bot]anddrone 673edafd87 chore(i18n): update translations via Crowdin 2024-06-20 00:21:58 +00:00
kolaente da66eb7314 fix(filters): do not match partial labels
This change fixes a bug where an input query like "labels in test || labels in l" would be replaced with something like "undefinedabels in test || labels in l" or "3abels in test || labels in l" when there was a label starting with "l" - when it should not have touched that.
The matching was changed so that only exact label matches are taken into account when searching for labels.

Now, the above string would be replaced by "labels in 1 || labels in l" (when the label "test" has the id 1).

Maybe resolves https://community.vikunja.io/t/filtering-by-label-ux-issues/2393/8
2024-06-19 17:28:16 +02:00
kolaente 2690c99438 fix(filters): explicitly use tasks.id as task id filter column
This fixes an error where filtering for labels or other related entities would fail with an error "ambiguous column name id"
2024-06-19 16:58:04 +02:00
kolaente 9101f26101 fix(comments): do not use whitespace as gap 2024-06-19 16:48:21 +02:00
Dominik Pschenitschniandkonrad abdec17d36 fix: disable vetur in case it's installed 2024-06-19 14:05:41 +00:00
Dominik Pschenitschniandkonrad 9b43c13061 feat: set add tsconfigRootDir option 2024-06-19 14:05:41 +00:00
Dominik Pschenitschniandkonrad 4546bd6986 feat: add root tsconfig 2024-06-19 14:05:41 +00:00
Dominik Pschenitschniandkonrad bf28a0c795 fix(ts): align with create-vue setup 2024-06-19 14:05:41 +00:00
Dominik Pschenitschniandkonrad f36115871c feat: camelcase global components 2024-06-19 14:02:14 +00:00
Dominik Pschenitschniandkonrad 1977a7bee0 feat: add default to custom transition 2024-06-19 13:59:24 +00:00
Dominik Pschenitschniandkonrad ff5ee515f9 fix: remove uppercase transformation from username (#2445)
Because usernames might have lowercase letters. Transforming the casing can be confusing and even change meaning.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2445
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-19 13:58:25 +00:00
renovateandkonrad 572f00f78b chore(deps): update dev-dependencies 2024-06-19 13:56:27 +00:00
renovate 6d913fcb67 fix(deps): update dependency @sentry/vue to v8.10.0 2024-06-19 13:11:55 +00:00
Dominik Pschenitschni 18e23bf371 fix: use button icon prop 2024-06-18 17:32:24 +02:00
kolaente 78eb28b054 feat(views): add filter syntax docs to filter input in views 2024-06-18 17:13:50 +02:00
kolaente 72fa0ea25c fix(i18n): remove duplicate key 2024-06-18 16:40:44 +02:00
kolaente d12deee977 feat(views): allow reordering views
Resolves https://community.vikunja.io/t/reordering-views/2394
2024-06-18 16:39:52 +02:00
kolaente 9f604eca79 fix(tasks): clarify usage of repeating modes available in quick add magic.
Originally, it was possible to specify repeating intervals for months or years. This was actually misleading because the interval would be converted to seconds under the hood, causing all kinds of problems with leap years and months with 30 vs 31 days. Because of that, the options for month and year were removed in 7746d39161 to make it clear what these actually meant.
Now, since we do have a repeating mode "Monthly", this commit changes the behaviour to repeat a task monthly when it was specified as "every month", but only that. All other cases were removed from the docs since they are not actually supported.

https://github.com/go-vikunja/vikunja/issues/271
2024-06-18 15:41:30 +02:00
kolaente eafd134be5 fix(migration): put "Import from other services" in settings
Resolves https://kolaente.dev/vikunja/vikunja/issues/2347
2024-06-18 15:19:56 +02:00
kolaente f222ecfa19 chore(mail): update logger to new interface 2024-06-18 12:42:43 +00:00
renovateandkonrad 0799ed4691 fix(deps): update module github.com/wneessen/go-mail to v0.4.1 2024-06-18 12:42:43 +00:00
kolaente 98c9cd0898 chore(deps): update golangci-lint to 1.59.1 2024-06-18 14:35:20 +02:00
kolaente 8b028dbc4b feat(api): add bulk endpoints to api tokens
Previously, the bulk api endpoint were explicitly filtered out. This meant that you couldn't use them with api tokens.
This change adds them to their "parent" token types as another option, allowing users to select and use them when creating api tokens.

Resolves https://community.vikunja.io/t/help-with-bulk-api-complete/2461
2024-06-18 14:33:57 +02:00
kolaente 6626727d92 fix(tasks): tests 2024-06-18 13:48:09 +02:00
kolaente fa6546b6b2 feat(tasks): add tests for moving a task out of the done bucket 2024-06-18 13:40:41 +02:00
Dominik Pschenitschniandkonrad 5e4b9e38a6 feat: use withDefaults in CreateEdit 2024-06-18 11:29:33 +00:00
renovateandkonrad a80ac571f2 chore(deps): update goreleaser/nfpm docker tag to v2.37.1 2024-06-18 08:20:51 +00:00
Dominik Pschenitschniandkonrad 1268145f71 feat: switch to change-case lib
camel-case and snake-case are deprecated
2024-06-18 06:30:39 +00:00
renovate 4f1ae248e8 chore(deps): update dev-dependencies 2024-06-18 00:10:29 +00:00
Dominik Pschenitschniandkonrad 23707fc493 feat: eslint enforce vue/component-name-in-template-casing 2024-06-17 21:01:36 +00:00
renovate 8f094c140a chore(deps): update pnpm to v9.4.0 2024-06-17 17:10:25 +00:00
Dominik Pschenitschniandkonrad 2d358a57cc chore: useDefineOptions for inheritAttrs in Error.vue 2024-06-17 14:38:51 +00:00
kolaente 657e9a5413 fix(task): do not move task dates when undoing a repeated task
Resolves https://community.vikunja.io/t/undo-on-repeated-task-moves-dates-forward/970
2024-06-17 15:49:28 +02:00
kolaente 06c3a64594 fix(task): show correct success message when marking a repeating task as done 2024-06-17 15:41:18 +02:00
kolaente 47143af9d1 fix: missing required prop BackgroundColor 2024-06-17 15:34:33 +02:00
Dominik Pschenitschniandkonrad 341b8d2045 feat: improve subscription 2024-06-17 13:28:11 +00:00
Dominik Pschenitschni b1a8bbe760 feat: use withDefaults and defineOptions in Modal 2024-06-17 14:41:03 +02:00
Dominik Pschenitschni 20701ce07a feat(components): align component name casing ProjectSettings 2024-06-17 13:50:16 +02:00
Dominik Pschenitschni 4260a504a9 feat(components): align component name casing AddTask 2024-06-17 13:50:16 +02:00
Dominik Pschenitschni 3b38a3faa6 feat(components): align component name casing SingleTaskInProject 2024-06-17 13:50:15 +02:00
Dominik Pschenitschni a3c3e39e93 feat(components): align component name casing SingleTaskInlineReadonly 2024-06-17 13:50:15 +02:00
Dominik Pschenitschni 1918ffdcff feat(components): align component name casing RepeatAfter 2024-06-17 13:50:15 +02:00
Dominik Pschenitschni 304779a7de feat(components): align component name casing Reminders 2024-06-17 13:50:14 +02:00
Dominik Pschenitschni cb8b685d08 feat(components): align component name casing ReminderPeriod 2024-06-17 13:50:14 +02:00
Dominik Pschenitschni 674e37d7b3 feat(components): align component name casing ReminderDetail 2024-06-17 13:50:13 +02:00
Dominik Pschenitschni ede60950b4 feat(components): align component name casing RelatedTasks 2024-06-17 13:41:40 +02:00
Dominik Pschenitschni 0d86fced92 feat(components): align component name casing QuickAddMagic 2024-06-17 13:41:40 +02:00
Dominik Pschenitschni 8c9e2b571c feat(components): align component name casing ProjectSearch 2024-06-17 13:41:40 +02:00
Dominik Pschenitschni 05ebffd5bd feat(components): align component name casing PrioritySelect 2024-06-17 13:41:40 +02:00
Dominik Pschenitschni 13ffacd267 feat(components): align component name casing PriorityLabel 2024-06-17 13:41:40 +02:00
Dominik Pschenitschni 43590835c7 feat(components): align component name casing PercentDoneSelect 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni 54d4fafad3 feat(components): align component name casing Labels 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni 57f1be3e7e feat(components): align component name casing Label 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni baaf8d8f0e feat(components): align component name casing KanbanCard 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni 3c80783bf2 feat(components): align component name casing Heading 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni 82991bada2 feat(components): align component name casing FilePreview 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni 394b2d444f feat(components): align component name casing EditLabels 2024-06-17 13:41:39 +02:00
Dominik Pschenitschni 510f1dd109 feat(components): align component name casing EditAssignees 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni 51b41afb3e feat(components): align component name casing Description 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni 1b4abb7d75 feat(components): align component name casing DeferTask 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni c5724ecd5a feat(components): align component name casing DateTableCell 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni 08bdb82dd3 feat(components): align component name casing CreatedUpdated 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni 99361925ec feat(components): align component name casing Comments 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni e76fdf379e feat(components): align component name casing ChecklistSummary 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni 8138824e26 feat(components): align component name casing Attachments 2024-06-17 13:41:38 +02:00
Dominik Pschenitschni 398ed2032e feat(components): align component name casing AssigneeList 2024-06-17 13:41:37 +02:00
Dominik Pschenitschni 920f8f0c5a feat(components): align component name casing UserTeam 2024-06-17 13:41:37 +02:00
Dominik Pschenitschni d7fe8c2fab feat(components): align component name casing LinkSharing 2024-06-17 13:41:37 +02:00
Dominik Pschenitschni 21980a4383 feat(components): align component name casing QuickActions 2024-06-17 13:41:37 +02:00
Dominik Pschenitschni f3daac2c31 feat(components): align component name casing ProjectSettingsDropdown 2024-06-17 13:41:37 +02:00
Dominik Pschenitschni 7a220964f7 feat(components): align component name casing ViewEditForm 2024-06-17 13:41:37 +02:00
Dominik Pschenitschni 2ae8ef2d7c feat(components): align component name casing Filter 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni c9e3ff8fcf feat(components): align component name casing FilterPopup 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni 523e8dab2b feat(components): align component name casing Notifications 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni fdd780f645 feat(components): align component name casing User 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni 09701eeb7b feat(components): align component name casing Subscription 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni a6bb805c03 feat(components): align component name casing Shortcut 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni f07d291bc7 feat(components): align component name casing Ready 2024-06-17 13:41:36 +02:00
Dominik Pschenitschni f9bdc48224 feat(components): align component name casing Popup 2024-06-17 13:41:35 +02:00
Dominik Pschenitschni ec2e1ab982 feat(components): align component name casing Notification 2024-06-17 13:41:35 +02:00
Dominik Pschenitschni b6f4af30e6 feat(components): align component name casing Modal 2024-06-17 13:41:35 +02:00
Dominik Pschenitschni b98280c954 feat(components): align component name casing Button 2024-06-17 13:41:35 +02:00
Dominik Pschenitschni f939328531 feat(components): align component name casing Nothing 2024-06-17 13:41:35 +02:00
Dominik Pschenitschni 8e8846454c feat(components): align component name casing NoAuthWrapper 2024-06-17 13:41:35 +02:00
Dominik Pschenitschni d1b39ee953 feat(components): align component name casing Message 2024-06-17 13:41:33 +02:00
Dominik Pschenitschni ff7e381645 feat(components): align component name casing Loading 2024-06-17 13:09:34 +02:00
Dominik Pschenitschni 852f1f57aa feat(components): align component name casing Legal 2024-06-17 13:09:34 +02:00
Dominik Pschenitschni 541f608d3c feat(components): align component name casing fancycheckbox 2024-06-17 13:09:34 +02:00
Dominik Pschenitschni 5d2c731c59 feat(components): align component name casing Navigation 2024-06-17 13:09:32 +02:00
Dominik Pschenitschni 2bd80aa505 feat(components): align component name casing ContentLinkShare 2024-06-17 13:08:00 +02:00
Dominik Pschenitschniandkonrad fe21a2c3da feat: improve user component 2024-06-17 10:56:55 +00:00
renovateandkonrad 46e0b06a61 fix(deps): update module github.com/spf13/cobra to v1.8.1 2024-06-17 10:44:03 +00:00
renovate 1698a9dbaa fix(deps): update module github.com/yuin/goldmark to v1.7.2 2024-06-17 10:13:45 +00:00
Dominik Pschenitschniandkonrad cebb647e1d feat(components): align component name casing Dropdown 2024-06-17 09:39:41 +00:00
Dominik Pschenitschniandkonrad 57a4ea4abb feat(components): align component name casing Pagination 2024-06-17 09:37:57 +00:00
Dominik Pschenitschniandkonrad 92f2e0e214 feat: improve popup 2024-06-17 09:37:52 +00:00
Dominik Pschenitschniandkonrad 6c113eaca1 feat: improve shortcut types 2024-06-17 09:36:17 +00:00
Dominik Pschenitschniandkonrad 1665cd57cb feat(components): align component name casing Error 2024-06-17 09:35:24 +00:00
Dominik Pschenitschniandkonrad 89e9313b03 feat(components): align component name casing color-bubble 2024-06-17 09:35:14 +00:00
Dominik Pschenitschniandkonrad d1d85b43f1 feat(components): align component name casing card 2024-06-17 09:35:09 +00:00
Dominik Pschenitschniandkonrad f8f05acc2d feat(components): align component name casing password 2024-06-17 09:35:05 +00:00
Dominik Pschenitschniandkonrad 330f7b8fa2 feat(components): align component name casing CreateEdit 2024-06-17 09:32:06 +00:00
Dominik Pschenitschniandkonrad 0e8d5b21aa feat(components): align component name casing apiconfig 2024-06-17 09:31:52 +00:00
Dominik Pschenitschniandkonrad 1ed99d9ebc feat(components): align component name casing multiselect 2024-06-17 09:31:43 +00:00
Dominik Pschenitschniandkonrad 58baf141d5 feat(components): align component name casing ContentAuth 2024-06-17 09:29:12 +00:00
Dominik Pschenitschniandkonrad 0061ec03f5 feat: align sort icon color 2024-06-17 09:28:54 +00:00
Dominik Pschenitschniandkonrad e59beb3732 feat(components): align component name casing datemath (#2405)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2405
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-17 09:27:02 +00:00
renovateandkonrad 5f4c5262d4 fix(deps): update module github.com/typesense/typesense-go to v1.1.0 2024-06-17 09:21:01 +00:00
renovateandkonrad f0b9a9b4f5 fix(deps): update module golang.org/x/crypto to v0.24.0 2024-06-17 09:18:33 +00:00
Dominik Pschenitschniandkonrad 2004d129c3 feat: reduce eslint warnings (#2396)
Also added `Destructuring the 'props' will cause the value to lose reactivity` as a warning to prepare for the removal of the propsDestructure option in vite.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2396
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-17 09:18:02 +00:00
renovate c6e934bd6b fix(deps): update dependency vue to v3.4.29 2024-06-14 16:10:22 +00:00
renovateandkonrad 7a50171f3e fix(deps): update dependency camel-case to v5 2024-06-14 09:45:22 +00:00
renovateandkonrad 5b2997c980 fix(deps): update vueuse to v10.11.0 2024-06-14 09:43:51 +00:00
renovateandkonrad e025a639c8 fix(deps): update module golang.org/x/term to v0.21.0 2024-06-14 09:42:37 +00:00
renovate f1cc0b0482 chore(deps): update dev-dependencies 2024-06-14 09:11:39 +00:00
kolaente e4b369009a fix(views): do not allow moving tasks or editing board when bucket mode is filter 2024-06-13 17:01:04 +02:00
kolaente d3f397b036 fix(tasks): do not crash when order by id and position 2024-06-13 16:36:02 +02:00
Dominik Pschenitschniandkonrad eb0f1a977b fix(semver): fix produced version number (#2378)
The "+" is not compatible and leads to problems with semver version parsers.
Unsure if breaking?

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2378
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-13 14:22:12 +00:00
Dominik Pschenitschniandkonrad 7093f71372 feat(FilterInput): use expandable 2024-06-13 14:20:01 +00:00
kolaente a6c2c817cd chore(deps): update flake 2024-06-13 14:41:09 +02:00
renovateandDominik Pschenitschni b7115c3757 fix(deps): update dependency snake-case to v4 2024-06-12 18:42:09 +00:00
renovateandkonrad 2026bda127 fix(deps): update module github.com/getsentry/sentry-go to v0.28.1 2024-06-12 15:34:35 +00:00
renovateandkonrad 64a5aa880c fix(deps): update dependency @sentry/vue to v8 2024-06-12 14:13:36 +00:00
renovateandkonrad 2d6981da20 fix(deps): update module golang.org/x/image to v0.17.0 2024-06-12 14:13:08 +00:00
renovateandkonrad 7070f1c4bb fix(deps): update module golang.org/x/text to v0.16.0 2024-06-12 14:12:24 +00:00
renovate 62c725d0ff fix(deps): update module github.com/spf13/viper to v1.19.0 2024-06-12 13:12:31 +00:00
renovateandkonrad ffa38e798f fix(deps): update module golang.org/x/sys to v0.21.0 2024-06-12 12:25:27 +00:00
renovateandkonrad 1eea9d9c81 fix(deps): update module golang.org/x/oauth2 to v0.21.0 2024-06-12 12:16:38 +00:00
renovateandkonrad 1f8669b72c fix(deps): update module github.com/go-testfixtures/testfixtures/v3 to v3.11.0 2024-06-12 12:15:39 +00:00
renovateandkonrad 85c5e35a23 fix(deps): update module github.com/hashicorp/go-version to v1.7.0 2024-06-12 12:14:41 +00:00
renovateandkonrad 751b3c7901 fix(deps): update module github.com/arran4/golang-ical to v0.3.0 2024-06-12 12:14:13 +00:00
renovateandkonrad ec5b5402f0 fix(deps): update dependency axios to v1.7.2 2024-06-12 12:13:19 +00:00
renovate 4040a61cd9 fix(deps): update dependency @sentry/vue to v7.117.0 2024-06-12 11:11:53 +00:00
renovateandkonrad 03ad39777d fix(deps): update vueuse to v10.10.1 2024-06-12 10:38:27 +00:00
renovateandkonrad 32dc37df8a fix(deps): update tiptap to v2.4.0 2024-06-12 10:31:39 +00:00
renovate f01abd0a2a chore(deps): update dev-dependencies 2024-06-12 10:13:37 +00:00
Dominik Pschenitschniandkonrad bc897a4503 feat: improve types (#2368)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2368
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-12 10:04:26 +00:00
Dominik Pschenitschniandkonrad 50d698794b feat: migrate to unplugin-inject-preload (#2357)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2357
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-12 09:59:06 +00:00
renovateandkonrad 4b2938392c chore(deps): update pnpm to v9.3.0 2024-06-12 09:25:06 +00:00
Dominik Pschenitschniandkonrad 3718d09f35 fix: remove obsolete vite reactivityTransform option (#2349)
Was [dropped in vue 3.4](https://github.com/vuejs/rfcs/discussions/369#discussioncomment-5059028)

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2349
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-12 09:19:49 +00:00
renovate f81ab34e78 fix(deps): update module github.com/redis/go-redis/v9 to v9.5.3 2024-06-12 08:10:12 +00:00
renovate b8abc58145 fix(deps): update module github.com/prometheus/client_golang to v1.19.1 2024-06-11 22:10:59 +00:00
renovate 344f148bf5 fix(deps): update module github.com/ganigeorgiev/fexpr to v0.4.1 2024-06-11 21:12:25 +00:00
Dominik Pschenitschniandkonrad 9fd17aca18 fix: useTitle types (#2369)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2369
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-11 20:36:47 +00:00
Dominik Pschenitschniandkonrad 97a11d2e12 fix: remove obsolete types 2024-06-11 20:35:58 +00:00
renovate 02665c4f4a fix(deps): update module github.com/gabriel-vasile/mimetype to v1.4.4 2024-06-11 20:08:30 +00:00
Dominik Pschenitschniandkonrad fe2c3906ca fix: remove wrong expression 2024-06-11 19:39:40 +00:00
Dominik Pschenitschniandkonrad 0523350f39 feat: update packages (#2367)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2367
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-11 19:39:07 +00:00
Dominik Pschenitschniandkonrad 9fa8c5429b fix: remove jsxTemplates
this is not necessary any more in vite 5
2024-06-11 19:38:07 +00:00
renovate c1d74e89b9 fix(deps): update dependency vue-router to v4.3.3 2024-06-11 10:13:27 +00:00
renovate bdf24f0abd fix(deps): update dependency vue-advanced-cropper to v2.8.9 2024-06-11 09:12:50 +00:00
renovate 545134ea3c fix(deps): update dependency dompurify to v3.1.5 2024-06-11 08:11:54 +00:00
renovate 51bd68369c fix(deps): update dependency @fortawesome/vue-fontawesome to v3.0.8 2024-06-11 07:11:09 +00:00
renovate f85557f0f3 chore(deps): update dependency go to v1.22.4 2024-06-10 22:10:34 +00:00
Dominik Pschenitschniandkonrad abf912f93f fix: use node20 typescript types 2024-06-10 21:41:52 +00:00
renovateandkonrad 4fb48e7ab3 chore(deps): update dependency node to v20.14.0 (#2334)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2334
Reviewed-by: konrad <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-06-10 21:41:11 +00:00
Dominik Pschenitschniandkonrad 150d654e37 fix(pnpm): remove obsolete settings 2024-06-10 21:23:28 +00:00
Dominik Pschenitschniandkonrad 19a760506c feat: remove polyfills
features are now supported by baseline browsers
2024-06-10 21:22:39 +00:00
Dominik Pschenitschni 81bb49f83a fix: throw in warnHandler 2024-06-10 20:36:23 +02:00
Dominik Pschenitschniandkonrad 917cbf9cb6 fix(vue): toValue instead of unref 2024-06-10 13:53:13 +00:00
Dominik Pschenitschniandkonrad 8e3e03c75e fix(extensions): remove typescript-vue-plugin from recommendations (#2353)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2353
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-10 13:46:52 +00:00
Dominik Pschenitschniandkonrad 666eef248b fix: remove obsolete vscode plugin settings (#2354)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2354
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-10 13:46:21 +00:00
Dominik Pschenitschniandkonrad 50cf952b01 feat: update pnpm (#2355)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2355
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-10 13:45:46 +00:00
Dominik Pschenitschniandkonrad d3d5df5f62 fix: recommended vitest extension (#2351)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2351
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-10 10:44:53 +00:00
Dominik Pschenitschniandkonrad ac559d5e6b fix(BaseButton): comment spelling (#2348)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2348
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-committed-by: Dominik Pschenitschni <mail@celement.de>
2024-06-10 09:18:54 +00:00
Frederick [Bot]anddrone 165d046307 chore(i18n): update translations via Crowdin 2024-06-08 00:29:28 +00:00
kolaente 01b7ae8091 fix(datepicker): make the date format in the picker consistent with the input field
Resolves https://kolaente.dev/vikunja/vikunja/issues/2340
2024-06-06 22:31:07 +02:00
kolaente 6f4895b8cf chore(auth): show registration disabled message when registration is disabled
The route still exists when the registration is disabled, even though all links to the page are removed.
2024-06-06 22:09:19 +02:00
kolaente b5a88d8657 fix(favorites): allow marking favorite tasks as done from favorites pseudo project
Resolves https://www.reddit.com/r/Vikunja/comments/1bkrek7/tasks_listed_under_favourite_list_view_mode/
2024-06-06 21:58:30 +02:00
kolaente acf4e3aa18 fix(tasks): ambiguous column name error when fetching favorite tasks 2024-06-06 21:50:30 +02:00
kolaente 92cdf5fe9c fix(quick add magic): assume today when no date was specified with time 2024-06-06 21:44:29 +02:00
kolaente 5af8b54618 fix(logo): add width and height to pride logo svg 2024-06-06 16:26:56 +02:00
kolaente 0c411fd1e9 fix(kanban): remove leftovers of kanban_position property
This might fix a bug where the kanban position would not be saved correctly.
2024-06-06 16:22:51 +02:00
kolaente e7041f02d0 fix(caldav): do not crash for wrong parameters 2024-06-06 11:05:32 +02:00
kolaente dd58d37db3 feat(typesense): move partial reindex to a flag instead of a separate command 2024-06-05 10:49:37 +02:00
kolaente f131289d32 fix(typesense): correctly index assignee changes on tasks
This change fixes a bug where adding or removing an assignee to a task would not update the index in Typesense, causing filter queries for that assignee to return incorrect data. This was caused by the events being dispatched by the task update process not containing all the data.

Resolves https://github.com/go-vikunja/vikunja/issues/255
2024-06-05 10:36:25 +02:00
kolaente e56b2232bb fix(typesense): do not try to sort by position when searching in a saved filter
This change fixes a bug where Typesense would try to sort by the project view of a saved filter. The view position is not indexed in Typesense, hence filtering fails. Because sorting by position is not a feature in saved filters, I've removed the logic for sorting saved filters with Typesense.
2024-06-05 10:24:28 +02:00
kolaente 506ce66434 fix(typesense): correctly join task position table when sorting by it
This change fixes a bug where the project view to use for joining was empty, since Typesense only supports 3 sorting parameters. When using more than that, the logic to fetch the view ID parameter would not return the correct parameter, but the logic building the order by statement would. That led to inconsistencies where the task position was included in the order by statement, but the table would not be joined, failing the query.
2024-06-05 09:54:55 +02:00
Frederick [Bot]anddrone d32a2526ba chore(i18n): update translations via Crowdin 2024-06-05 00:28:50 +00:00
kolaente b386dfae87 fix(typesense): only return distinct tasks once 2024-06-04 18:22:05 +02:00
kolaente 5fc4ec48b7 fix(typesense): correctly incorporate existing filter when it is empty 2024-06-04 18:22:05 +02:00
Frederick [Bot]andkolaente 37c89ea826 [skip ci] Updated swagger docs 2024-06-04 16:17:19 +00:00
kolaente 1843f1d0d8 fix(docs): correctly document filter query usage 2024-06-04 18:02:31 +02:00
kolaente 0bb4a5a2b2 chore(desktop): only build zip in ci to speed up smoke test builds 2024-06-04 15:02:21 +02:00
Frederick [Bot]andkolaente b4b17ed966 [skip ci] Updated swagger docs 2024-06-04 10:40:08 +00:00
kolaente 48676050d7 feat(tasks): expand subtasks (#2345)
This change adds a parameter to expand subtasks - if provided, Vikunja will ensure all subtasks are present in the results list.

Resolves https://community.vikunja.io/t/subtasks-show-on-different-pages/2292
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2345
Co-authored-by: kolaente <k@knt.li>
Co-committed-by: kolaente <k@knt.li>
2024-06-04 10:27:23 +00:00
kolaente a38e768895 fix(db migration): do not try to create a unique index
Related to https://kolaente.dev/vikunja/vikunja/issues/2243
2024-06-04 08:45:39 +02:00
kolaente c17e4564e7 fix(migration): ensure tasks are put into the correct bucket when migrating from todoist
Resolves https://github.com/go-vikunja/vikunja/issues/254
2024-06-04 08:33:11 +02:00
Frederick [Bot]anddrone dbf5e61fc9 chore(i18n): update translations via Crowdin 2024-06-04 00:28:55 +00:00
kolaente 68d233684f fix(views): edit views with filters
This change fixes a bug where filter values of views would be transformed in the wrong order, not transformed at all or at the wrong time. Transforming the filters now happens transparently in the background without anything funky happening visible to the user.
2024-06-03 22:21:09 +02:00
Frederick [Bot]andkolaente 244ca262df [skip ci] Updated swagger docs 2024-06-03 19:51:44 +00:00
kolaente 99a67e09b1 feat(api): all usable routes behind authentication now have permissions
Previously, only routes which were coming from crudable entities could be used with an api token because there was no way to assign permissions to them. This change implements a more flexible structure for api permissions under the hood, allowing to add permissions for these routes and making them usable with an api token.

Resolves https://github.com/go-vikunja/vikunja/issues/266
2024-06-03 21:35:09 +02:00
kolaente 5ef140fba2 fix(tasklist): migrate old tasklist format
Resolves https://community.vikunja.io/t/task-list-from-0-21-0-0-23-0/2340
Resolves https://community.vikunja.io/t/general-feedback-after-trying-out-vikunja/1943/6
2024-06-03 17:39:35 +02:00
kolaente 755e53af70 fix(views): transform bucket configurations
This fixes a bug where filter buckets would not be editable because the bucket configuration was a read-only entry from the watcher.
2024-06-03 17:04:09 +02:00
kolaente c47d8c6dbe fix(task): do not try to set bucket for filtered bucket configuration 2024-06-03 17:02:50 +02:00
kolaente 43244156b4 fix(filter): do not add enter in input field 2024-06-03 16:30:17 +02:00
kolaente 4ce761eba7 fix(filter): trim search term before searching 2024-06-03 16:28:04 +02:00
kolaente 6c8299772a fix(task): do not require admin permission to move tasks between buckets
Resolves https://community.vikunja.io/t/moving-between-buckets-requires-admin-permissions-now/2390
2024-06-03 16:26:07 +02:00
kolaente a6fccfb908 fix(webhook): log errors in webhook response 2024-06-03 13:11:44 +02:00
andreymalandkonrad 73780e4b50 feat: add pluralization rules for Russian (#2344)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2344
Reviewed-by: konrad <k@knt.li>
Co-authored-by: andreymal <andriyano-31@mail.ru>
Co-committed-by: andreymal <andriyano-31@mail.ru>
2024-06-03 08:51:11 +00:00
81bdad4beb fix: ignore casing to check if file extensions can be previewed (#2341)
Now .PNG is supported as well as .PnG and so on

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2341
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-06-02 19:23:52 +00:00
David Baakmanandkonrad 8bc23b3a54 docs: remove superfluous yaml code block (#2342)
Fixes the ```yaml shown in the documentation.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2342
Reviewed-by: konrad <k@knt.li>
Co-authored-by: David Baakman <kolaente@davidbaakman.nl>
Co-committed-by: David Baakman <kolaente@davidbaakman.nl>
2024-06-02 19:20:09 +00:00
aac01c7a35 feat: default view setting (#2306)
This PR adds configuration of default project view in settings, which is used when the user has not visited the project and thus last view hasn't yet been saved in projects. Updates old settings and adds "First View" option with fallback.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2153

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2306
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-06-02 08:15:53 +00:00
Frederick [Bot]anddrone a175214aa0 chore(i18n): update translations via Crowdin 2024-06-02 00:28:49 +00:00
kolaente 8b2c3075c3 fix(logo): use correct month for pride logo change 2024-06-01 23:20:02 +02:00
Frederick [Bot]anddrone a53ee4143f chore(i18n): update translations via Crowdin 2024-05-28 00:27:42 +00:00
Frederick [Bot]anddrone aeadce8631 chore(i18n): update translations via Crowdin 2024-05-27 00:27:50 +00:00
Frederick [Bot]anddrone e618becdf4 chore(i18n): update translations via Crowdin 2024-05-26 00:28:14 +00:00
konrad 34d69fa588 feat(task): show attachment preview for image attachments (#2266)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2266
Reviewed-by: konrad <k@knt.li>
2024-05-25 12:11:03 +00:00
Elscrux aba045ff24 Set attachment width to 100% 2024-05-25 13:45:26 +02:00
Elscrux 4eb0df256c Improve preview spacing 2024-05-25 12:06:23 +02:00
Elscrux 8b066bf0e9 Add cover tooltips 2024-05-25 12:05:37 +02:00
Elscrux c2fc444bc0 Use file fallback icon 2024-05-25 12:05:37 +02:00
Elscrux 680cb72f29 Make fallback icon grey 2024-05-25 12:05:37 +02:00
konrad fd66e6875c feat(editor): add hotkeys to quickly edit and discard (#2265)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2265
Reviewed-by: konrad <k@knt.li>
2024-05-25 08:13:10 +00:00
kolaente fb1f461e51 feat(i18n): add Croatian to selectable languages 2024-05-25 10:03:08 +02:00
Frederick [Bot]anddrone 3925536a7c chore(i18n): update translations via Crowdin 2024-05-25 00:27:52 +00:00
Elscrux 00bfa2c552 Rename discardShortcutEnabled to enableDiscardShortcut 2024-05-24 15:23:15 +02:00
Elscrux ebb093797c Rename discardShortcutEnabled to enableDiscardShortcut 2024-05-24 15:23:15 +02:00
Elscrux c13a991c16 Merge import 2024-05-24 15:23:15 +02:00
Elscrux ecd44059e4 Use if to conditionally add escape hotkey 2024-05-24 15:23:15 +02:00
Elscrux 308a98c876 Add discardShortcutEnabled setting to opt into this feature
Only editing the task description and comments have this feature enabled
2024-05-24 15:23:15 +02:00
Elscrux 6ad8ce8f44 Cancel current edits and exit edit mode with escape 2024-05-24 15:23:15 +02:00
Elscrux 9de48aa6b2 Enter edit mode when double clicking 2024-05-24 15:23:15 +02:00
kolaente 2e298ffc11 fix(i18n): adjust tests from 34780daab0 2024-05-24 15:05:09 +02:00
kolaente 536047c4c4 fix(i18n): typo 2024-05-24 13:17:53 +02:00
Elscrux 6543795755 Only allow cover if a preview is available 2024-05-24 12:47:15 +02:00
Elscrux 56d9223fc4 Replace cover text links with icons 2024-05-24 12:46:46 +02:00
Elscrux ef8bb5aca9 Add file image as fallback preview 2024-05-24 12:45:30 +02:00
Elscrux 658936a070 File name and cover label styling improvement 2024-05-24 12:45:06 +02:00
kolaente 34780daab0 chore(i18n): remove "new" from creation strings
You can't create an "old" thing, therefore the "new" is redundant in that context. This change clarifies usage of this in all places.
2024-05-24 09:11:27 +02:00
Elscrux c80d77ca69 Add width: 100% 2024-05-23 10:26:42 +02:00
Elscrux eafd4da038 Fix test again 2024-05-23 10:26:15 +02:00
kolaente 76b3ac39b6 fix(filter): clarify in filter syntax 2024-05-22 22:17:50 +02:00
Elscrux 7664534618 Change attachment div to button 2024-05-16 19:29:40 +02:00
Elscrux 230fef3559 Attempt to fix attachment verification 2024-05-16 14:36:41 +02:00
Elscrux 4b4c7840e2 Rename grid-item class to attachment 2024-05-16 14:32:29 +02:00
Elscrux 2d3bf4c210 Move object-fit to styles 2024-05-16 14:32:15 +02:00
Elscrux 6fa15d30ad Replace px with rem 2024-05-15 23:58:28 +02:00
Elscrux 9c7187b4aa Adjust file preview style 2024-05-15 23:58:28 +02:00
Elscrux 2ab6894542 Replace table with grid 2024-05-15 23:58:28 +02:00
Elscrux e47d6d1605 Extract img to FilePreview component
Now images will also be displayed when they are uploaded initially
2024-05-15 23:58:28 +02:00
Elscrux c2dfa9be83 Proof of concept for image preview 2024-05-15 23:58:28 +02:00
Frederick [Bot]anddrone 86b460d09c chore(i18n): update translations via Crowdin 2024-05-11 00:06:24 +00:00
renovate b93e237899 chore(deps): update dev-dependencies 2024-05-09 06:06:20 +00:00
Frederick [Bot]anddrone 9706ebb2fc chore(i18n): update translations via Crowdin 2024-05-09 00:06:59 +00:00
renovate 1d2ee77e8a fix(deps): update tiptap to v2.3.2 2024-05-08 21:05:52 +00:00
renovate 5098363e56 fix(deps): update sentry-javascript monorepo to v7.114.0 2024-05-08 09:05:57 +00:00
renovate 4c1dc6930d chore(deps): update dev-dependencies 2024-05-08 05:05:55 +00:00
renovate db6d88fff5 chore(deps): update dependency go to v1.22.3 2024-05-07 17:06:20 +00:00
renovateandkonrad b021dd7237 chore(deps): update dependency node to v20.13.0 2024-05-07 16:40:39 +00:00
kolaente e1dcf2e859 feat: do not save language on the server when in demo mode
When the demo mode is enabled, people set the language to their own language - which is understandable. However, this is really confusing for other people when they log in and the language is something unexpected.
This change overrides the configured language when saving it while Vikunja is in demo mode.
2024-05-07 18:39:50 +02:00
kolaente 6e759b3bee fix(i18n): clarify from current date string
Resolves https://community.vikunja.io/t/suggestion-rename-from-current-date-to-after-completed/2344
2024-05-07 18:28:22 +02:00
kolaente d3a7d79eb9 fix: use correct project title in project card 2024-05-07 18:18:19 +02:00
kolaente e0ce3e50bd fix(attachment): correct spacing around creation date 2024-05-07 18:11:40 +02:00
kolaente 272f643955 fix(project): show "remove background" button only when the project has a background set 2024-05-07 17:17:06 +02:00
kolaente cf46c76811 fix(i18n): use correct title for background settings menu 2024-05-07 17:14:04 +02:00
kolaente 31e502d711 fix(project): do not remove project from navigation after removing background image 2024-05-07 17:13:22 +02:00
kolaente fa628edc0c fix(project): make sure gantt and kanban views shared with link share are full width
Resolves https://github.com/go-vikunja/vikunja/issues/258
2024-05-07 16:53:21 +02:00
kolaente 053c4d5842 fix(project): bottom spacing in list view 2024-05-07 16:27:13 +02:00
kolaente 8d1fc08de6 docs: clarify where to file issues
Resolves https://github.com/go-vikunja/vikunja/issues/262
2024-05-07 16:13:25 +02:00
kolaente eee7b060b6 fix(docs): typos
Apply patch from https://github.com/go-vikunja/vikunja/issues/263
2024-05-07 16:06:17 +02:00
renovate 794fc4c1bb fix(deps): update dependency vue to v3.4.27 2024-05-07 09:05:51 +00:00
renovate e58d10bc72 chore(deps): update dev-dependencies 2024-05-07 03:05:41 +00:00
kolaente 7837bcfaae fix(task): only count unique tasks in a bucket when checking bucket limit
This fixes a bug where the current number of tasks in a bucket was computed wrong when moving tasks into a bucket with a limit. Sometimes the bug would prevent adding a task to a bucket which seemed to have space left but ultimately failed when moving the task.
2024-05-06 20:07:06 +02:00
renovate 615d40f4cd fix(deps): update module golang.org/x/crypto to v0.23.0 2024-05-06 15:05:56 +00:00
renovate fbf7037974 chore(deps): update pnpm to v9.1.0 2024-05-06 11:05:37 +00:00
renovateandkonrad 212c5506af fix(deps): update module golang.org/x/image to v0.16.0 2024-05-05 14:57:30 +00:00
renovate c861970f41 fix(deps): update module golang.org/x/term to v0.20.0 2024-05-05 14:06:28 +00:00
kolaente 37d3715eeb fix(task): show repeating indicator in task list for monthly repeating tasks
Resolves https://kolaente.dev/vikunja/vikunja/issues/2319
2024-05-05 15:03:43 +02:00
kolaente b0db3ce34c fix(quick add magic): parse full month name as month, do not replace only the abbreviation
Resolves https://kolaente.dev/vikunja/vikunja/issues/2320
2024-05-05 14:14:30 +02:00
renovate 358e11c404 chore(deps): update dev-dependencies 2024-05-05 00:06:06 +00:00
renovate 0fd7fc1452 fix(deps): update module golang.org/x/text to v0.15.0 2024-05-04 21:05:53 +00:00
renovateandkonrad a7db576aad fix(deps): update module golang.org/x/sys to v0.20.0 2024-05-04 20:13:44 +00:00
renovate 59281c39cf fix(deps): update module golang.org/x/oauth2 to v0.20.0 2024-05-04 16:05:40 +00:00
renovateandkonrad f8b502f344 chore(deps): update dev-dependencies 2024-05-04 06:56:59 +00:00
Frederick [Bot]anddrone ddf8db3b1f chore(i18n): update translations via Crowdin 2024-05-04 00:07:32 +00:00
renovate 9260b3f1d3 chore(deps): update dependency vite to v5.2.11 2024-05-03 00:06:00 +00:00
renovate ab74b08314 fix(deps): update sentry-javascript monorepo to v7.113.0 2024-05-02 12:05:42 +00:00
renovate 9637db5a6b chore(deps): update dev-dependencies 2024-05-02 05:05:36 +00:00
renovateandkonrad 08645d38a0 fix(deps): update dependency dompurify to v3.1.2 2024-05-01 18:47:25 +00:00
renovate f155d6bb60 fix(deps): update tiptap to v2.3.1 2024-04-30 16:05:36 +00:00
renovate 9a3d63a713 fix(deps): update dependency vue to v3.4.26 2024-04-29 13:05:49 +00:00
renovate 050f4313c8 chore(deps): update dev-dependencies 2024-04-29 05:05:40 +00:00
renovate e917323d91 fix(deps): update dependency dayjs to v1.11.11 2024-04-28 12:05:38 +00:00
renovate 8ad7d00559 chore(deps): update dev-dependencies 2024-04-28 00:06:00 +00:00
renovate fd126fa234 fix(deps): update dependency dompurify to v3.1.1 2024-04-26 12:06:39 +00:00
renovate 0c39a3dd38 chore(deps): update dependency vitest to v1.5.2 2024-04-26 00:12:26 +00:00
kolaente 66e96322ea fix: do not remove empty openid teams when none are present
Maybe resolves https://community.vikunja.io/t/empty-openid-team-cleanup-cron-error-removing-empty-openid-team-database-is-locked-error-when-exporting-data/2306/3
2024-04-25 14:21:31 +02:00
kolaente 00a96663ba fix(caldav): check if vtodo contains any components
Resolves https://vikunja.sentry.io/share/issue/1ae2fd1601aa40dea4aee41927cfcf78/
2024-04-25 13:40:23 +02:00
kolaente 741370b613 fix(caldav): return more than 1000 tasks
Resolves https://kolaente.dev/vikunja/vikunja/issues/2302
2024-04-25 13:37:04 +02:00
renovateandkonrad 70183dd7c6 chore(deps): update pnpm to v9.0.6 2024-04-25 06:59:45 +00:00
renovate 760bec5e76 chore(deps): update dependency vitest to v1.5.1 2024-04-25 01:10:55 +00:00
renovate 78f03373b8 fix(deps): update dependency vue to v3.4.25 2024-04-24 13:09:36 +00:00
renovate 09c6d095df fix(deps): update sentry-javascript monorepo to v7.112.2 2024-04-24 12:06:21 +00:00
renovate b102fe8188 chore(deps): update dev-dependencies 2024-04-24 00:11:24 +00:00
renovate f7c367b5bb fix(deps): update dependency workbox-precaching to v7.1.0 2024-04-23 21:08:15 +00:00
renovate b94053e42e fix(deps): update sentry-javascript monorepo to v7.112.1 2024-04-23 14:06:37 +00:00
renovateandkonrad 6e98a6d7ff fix(deps): update sentry-javascript monorepo to v7.112.0 2024-04-23 10:18:38 +00:00
renovate 42bfe107ae chore(deps): update dev-dependencies 2024-04-23 06:10:30 +00:00
Frederick [Bot]anddrone a1892ea10b chore(i18n): update translations via Crowdin 2024-04-23 00:07:19 +00:00
renovateandkonrad 899f8f9bc1 fix(deps): update github.com/dustinkirkland/golang-petname digest to 76c06c4 2024-04-22 22:11:33 +00:00
renovate 40f0ca6670 fix(deps): update dependency vue-i18n to v9.13.1 2024-04-22 17:06:27 +00:00
renovateandkonrad f8d35396dc fix(deps): update dependency vue to v3.4.24 2024-04-22 16:36:18 +00:00
kolaente 409822442b fix(backgrounds): return full project after uploading image 2024-04-22 18:33:43 +02:00
kolaente aec60f3591 feat(backgrounds): resize images to a maximum of 4K
Resolves https://kolaente.dev/vikunja/vikunja/issues/1373#issuecomment-43491
2024-04-22 18:29:58 +02:00
renovate 9b5ae38784 chore(deps): update dev-dependencies 2024-04-22 02:08:31 +00:00
renovate 3e40a43d56 chore(deps): update pnpm to v9.0.5 2024-04-21 22:07:37 +00:00
kolaente 15e0c716ad fix(reminders): do not show relative reminders as minutes when they round to hours
Regression from fd520dab0a
2024-04-22 00:05:12 +02:00
kolaente 26ada628a2 fix(editor): use colors from color scheme to render table cells
Resolves https://github.com/go-vikunja/vikunja/issues/253
2024-04-21 23:57:07 +02:00
kolaente d86fdcb756 fix(table view): do not sort table column fields when the field in question is hidden
Resolves https://kolaente.dev/vikunja/vikunja/issues/2272
2024-04-21 23:48:40 +02:00
kolaente 84197dd9c1 fix: correctly return error and bubble up when the api could not be reached 2024-04-21 23:33:50 +02:00
kolaente 324df991ce chore(desktop): switch from yarn to pnpm 2024-04-21 21:04:07 +02:00
kolaente 1f6a1f8ad4 fix(kanban): fetch project and view when checking permissions 2024-04-21 19:44:47 +02:00
kolaente ea7527a3cf fix(test): cast result before comparing 2024-04-21 19:43:57 +02:00
kolaente 574c7f218e fix(labels): allow link shares to add existing labels to a task
Resolves https://github.com/go-vikunja/vikunja/issues/252
2024-04-21 15:12:27 +02:00
kolaente 1074a8d916 fix(views): only allow project admins to manage views
Resolves https://community.vikunja.io/t/manage-views-only-for-project-admins/2279
2024-04-21 14:36:09 +02:00
kolaente e88f95e501 fix(migration): remove buckets table name when dropping index
Related to https://kolaente.dev/vikunja/vikunja/issues/2243
2024-04-21 13:50:03 +02:00
kolaente 0962aa4262 fix(restore): transform json fields during restore
Resolves https://community.vikunja.io/t/unable-to-restore-after-dump-and-export-also-not-working/2263/5
2024-04-21 13:45:49 +02:00
renovate a48ad6c9e1 chore(deps): update dev-dependencies 2024-04-21 05:09:05 +00:00
renovateandkonrad bc8fe05e9e chore(deps): update pnpm to v9.0.4 2024-04-19 06:59:31 +00:00
renovate b4c12273af chore(deps): update dev-dependencies 2024-04-19 00:07:11 +00:00
renovateandkonrad be004793aa chore(deps): update dependency node to v20.12.2 (#2238)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2238
Reviewed-by: konrad <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-04-18 20:46:48 +00:00
renovate a080400d3e chore(deps): update pnpm to v9 2024-04-18 19:05:45 +00:00
renovateandkonrad d4ec0978ee fix(deps): update dependency vue-i18n to v9.13.0 2024-04-18 17:20:39 +00:00
renovateandkonrad c37e08635a fix(deps): update module github.com/labstack/echo/v4 to v4.12.0 2024-04-18 17:20:18 +00:00
renovate 31f448e50f fix(deps): update sentry-javascript monorepo to v7.111.0 2024-04-18 17:06:02 +00:00
renovateandkonrad 00c323891a fix(deps): update module golang.org/x/oauth2 to v0.19.0 2024-04-18 15:56:46 +00:00
renovateandkonrad ff06bb202b fix(deps): update module github.com/tkuchiki/go-timezone to v0.2.3 2024-04-18 15:56:02 +00:00
renovate e806cbaf22 fix(deps): update dependency vue-router to v4.3.2 2024-04-18 10:09:09 +00:00
Frederick [Bot]anddrone d35ff0b380 chore(i18n): update translations via Crowdin 2024-04-18 00:06:32 +00:00
renovateandkonrad 982884ee05 fix(deps): update module golang.org/x/sync to v0.7.0 (#2258)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2258
Reviewed-by: konrad <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-04-17 20:37:47 +00:00
renovateandkonrad e43d9e9bbd fix(deps): update dependency @intlify/unplugin-vue-i18n to v4 2024-04-17 20:06:11 +00:00
renovate da8cee0ba5 fix(deps): update dependency vue to v3.4.23 2024-04-17 10:07:15 +00:00
renovate 352381f377 chore(deps): update pnpm to v8.15.7 2024-04-17 07:06:42 +00:00
renovateandkonrad 61455b8795 fix(deps): update sentry-javascript monorepo to v7.110.1 2024-04-17 06:21:21 +00:00
treysulliventandkonrad aceaccbf11 docs: fix typo in README.md (#2271)
Fixed "exausted" to "exhausted"

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2271
Reviewed-by: konrad <k@knt.li>
Co-authored-by: treysullivent <trey.sullivent@gmail.com>
Co-committed-by: treysullivent <trey.sullivent@gmail.com>
2024-04-17 06:20:44 +00:00
kolaente 392ce66edb chore(deps): update github.com/adlio/trello to v1.12.0 2024-04-16 23:14:51 +02:00
kolaente ecbefdb921 fix(buckets): return correct task count for tasks in buckets 2024-04-14 17:21:53 +02:00
kolaente d8ca1a2de1 fix(favorites): make favorites work with configurable views 2024-04-14 17:12:16 +02:00
kolaente 2d084c091e feat: new login image 2024-04-14 12:43:22 +02:00
kolaente 5a84d37fca fix(kanban): do not focus on task list in bucket when clicking on a task 2024-04-14 11:21:59 +02:00
kolaente fd520dab0a fix(reminders): do not fall back to hours when the reminder interval is minutes
Resolves https://github.com/go-vikunja/vikunja/issues/225
2024-04-14 11:20:20 +02:00
kolaente 144a6e4140 fix(kanban): do not add bottom spacing to view 2024-04-14 11:15:53 +02:00
kolaente a7aa74227a fix(kanban): do not focus kanban board 2024-04-14 11:12:26 +02:00
kolaente d2adbc53c6 fix(test): add task to bucket in test 2024-04-14 11:00:41 +02:00
kolaente 422e4371f8 fix(project): add more spacing between filter button and view switcher on mobile 2024-04-14 00:06:26 +02:00
kolaente 6e5b31f1e0 fix(filters): always persist filter or search in query path and load it correctly into filter query input when loading the page
Previously, when using the filter query as a search input, it would load the search as requested but the filter query parameter in the url would be empty, which meant the search would not be loaded correctly when reloading (or otherwise newly accessing) the page. We're now persisting the filter and search in the task loading logic, to make sure they are always populated correctly.
2024-04-13 23:34:25 +02:00
kolaente 5756da412b fix(project): return full project after duplicating it 2024-04-13 22:39:40 +02:00
kolaente 4e05b8e97c fix(project): do not crash when duplicating a project with no tasks 2024-04-13 22:36:41 +02:00
kolaente 5177f516c4 fix(views): make sure view changes are reflected in switcher 2024-04-13 22:24:12 +02:00
kolaente 637c8f6ba5 fix(views): make sure the view is saved properly in localStorage 2024-04-13 22:15:41 +02:00
kolaente 1460d212ee fix: do not push nil errors to sentry 2024-04-13 21:46:07 +02:00
kolaente e9de7d8a24 fix(project): delete all related entities when deleting a project 2024-04-13 21:43:44 +02:00
kolaente ce1d7778c7 fix(export): make export work with project views and new task positions 2024-04-13 21:07:06 +02:00
kolaente 9a16f6f817 fix: license in cmd help text 2024-04-13 20:13:24 +02:00
kolaente 7d755fcb89 fix: lint 2024-04-13 17:58:53 +02:00
kolaente 77e95642a9 fix(tasks): make fetching tasks in buckets via typesense work 2024-04-13 17:52:47 +02:00
kolaente a5d02380a3 fix(typesense): make fetching task positions per view more efficient 2024-04-13 17:26:38 +02:00
kolaente 3519b8b2fe fix(tasks): index and order by task position when using typesense 2024-04-13 17:19:27 +02:00
kolaente cb648e5ad8 fix(typesense): fix reindexing views and positions in typesense 2024-04-13 16:38:45 +02:00
kolaente 75f830457b fix(comments): order comments by created timestamp instead of id
Partially resolves https://community.vikunja.io/t/trello-import-comments-and-assignments/2174/14
2024-04-13 14:45:12 +02:00
kolaente 6e2b540394 fix(migration): import task comments with original timestamps
Partially resolves https://community.vikunja.io/t/trello-import-comments-and-assignments/2174/14
2024-04-13 14:44:55 +02:00
kolaente bf3c8ac9da fix(views): check if bucket index already exists before creating new index
Resolves https://kolaente.dev/vikunja/vikunja/issues/2243
2024-04-13 14:20:27 +02:00
kolaente 3e7225ebee fix(editor): do not prevent shift+enter to add a line break in text
Resolves https://github.com/go-vikunja/vikunja/issues/250
2024-04-13 14:08:27 +02:00
kolaente 9eb19e0362 fix(project): do not crash when views were not loaded yet
The project view crashed when accessing a task from /projects because the currentProject in store was not set, hence the views weren't set either. This change adds a fallback to it.

Related to https://kolaente.dev/vikunja/vikunja/issues/2246
Related to https://community.vikunja.io/t/vikunja-freezes/2246/5
2024-04-13 13:18:14 +02:00
kolaente 73bf119409 docs: clarify version checkout when building from source
Related to https://kolaente.dev/vikunja/vikunja/issues/2270#issuecomment-62038
2024-04-12 23:39:27 +02:00
kolaente 500b761fe6 fix(projects): do not return parent project id when authenticating as link share
Related to https://community.vikunja.io/t/vikunja-freezes/2246
Related to https://github.com/go-vikunja/vikunja/issues/233
2024-04-12 18:02:39 +02:00
kolaente 0bc9a670d7 fix(task): do not crash when loading a task if parent projects are not loaded
Related to https://community.vikunja.io/t/vikunja-freezes/2246
Related to https://github.com/go-vikunja/vikunja/issues/233
2024-04-12 17:56:19 +02:00
renovate a3e5e98c64 fix(deps): update module github.com/arran4/golang-ical to v0.2.8 2024-04-11 16:07:49 +00:00
a3a4d05e89 feat(editor): checklist visual improvements (#2264)
This makes task lists (especially big ones) easier to read. I've set a margin so there is a distance between task items which makes them easier to stand out.
I've also changed the visuals of the checked elements (strike through + grey font color) so the unchecked ones stand out more. Note that this currently seems to be a big bugged outside of edit mode as `data-checked` doesn't seem to be updating correctly in this state which seems to be an issue that is already noted for the TipTap editor.

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2264
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-04-11 15:46:10 +00:00
renovate 72c3e1a03f chore(deps): update dev-dependencies 2024-04-11 00:09:10 +00:00
61ee0bd5e2 feat(migration): include non upload attachments from Trello (#2261)
This makes the Trello migrator include attachments that are not file uploads. To include them in Vikunja without missing data, their text (usually links) will be appended to the Vikunja description.

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2261
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-04-10 22:12:06 +00:00
kolaente 423558f58a fix(migration): invalid field in organization struct 2024-04-10 23:52:10 +02:00
kolaente 75fd17c750 docs: clarify vikunja cli usage in docker 2024-04-10 23:05:45 +02:00
kolaente 4e49ec9e16 docs: clarify automatic openid team creation 2024-04-10 23:05:45 +02:00
renovateandkonrad 58e0ec3d35 fix(deps): update tiptap to v2.3.0 2024-04-10 20:59:51 +00:00
kolaente ed4be389ab fix(navigation): scrolling when many projects are present
Regression from ee3d20e1d2
Resolves https://github.com/go-vikunja/vikunja/issues/249
2024-04-10 22:54:36 +02:00
renovate cb2c2eeae8 fix(deps): update dependency vue-i18n to v9.11.1 2024-04-10 17:06:05 +00:00
renovate e19ac57130 chore(deps): update dev-dependencies 2024-04-10 15:06:07 +00:00
kolaente 0557d4b5bb docs: clarify transitioning from unstable to release 2024-04-09 22:43:27 +02:00
kolaente bc19a2fb78 fix(migration): import card comments from Trello when migrating
Related: https://community.vikunja.io/t/trello-import-comments-and-assignments/2174/3
2024-04-09 13:56:17 +02:00
kolaente 994aaeb920 fix(migration): trello: only fetch attachments when the card actually has attachments 2024-04-09 13:25:03 +02:00
kolaente ee3d20e1d2 fix(navigation): do not hide shadows of dropdown menu 2024-04-09 13:07:01 +02:00
8458e77341 feat(migration): Trello organization based migration (#2211)
Migrate Trello organization after organization to limit total memory allocation.
Related discussion: https://community.vikunja.io/t/trello-import-issues/2110

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Co-authored-by: konrad <k@knt.li>
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2211
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-04-09 10:54:38 +00:00
kolaente af3b0bbea1 fix: lint 2024-04-08 13:23:15 +02:00
renovateandkonrad d2317b9531 fix(deps): update dependency vue-i18n to v9.11.0 2024-04-08 10:35:09 +00:00
renovateandkonrad 552f8580a4 fix(deps): update dependency dompurify to v3.1.0 2024-04-08 10:27:31 +00:00
renovateandkonrad c842cb27b2 fix(deps): update tiptap to v2.2.6 2024-04-08 10:19:11 +00:00
kolaente e10cd368bf feat(migration): notify the user when a migration failed
This change introduces notifications via mail when a migration fails. It will contain the error message and a hint to post it in the forum when Sentry is disabled, otherwise the error message will be sent directly to sentry and the notification will inform accordingly.
I've tried to balance "this thing failed, go figure it out" with "here is what we know and how you can get help", we'll see how well that approach works.
2024-04-08 12:15:24 +02:00
renovateandkonrad 61322d2e2e fix(deps): update module github.com/yuin/goldmark to v1.7.1 2024-04-08 09:28:22 +00:00
renovateandkonrad a41e248e5f fix(deps): update font awesome to v6.5.2 2024-04-08 09:10:31 +00:00
kolaente 6e37934b61 chore(deps): update goreleaser/nfpm docker tag to v2.36.1 2024-04-08 11:09:39 +02:00
renovateandkonrad d64322bb7a fix(deps): update dependency @infectoone/vue-ganttastic to v2.3.2 2024-04-08 08:58:21 +00:00
renovate fa3b657e7e chore(deps): update pnpm to v8.15.6 2024-04-08 08:06:35 +00:00
Raymi306andkonrad 1adaa73141 docs: fix build-from-sources docs mistake (#2251)
While attempting to build on OpenBSD without having built the frontend, I ran into the following error:

`frontend/embed.go:21:12: pattern dist: no matching files found`

I saw in the docs to create a directory and touch a file, this resulted in a second error:

`frontend/embed.go:21:12: pattern dist: cannot embed directory dist: contains no embeddable files`

Creating the index.html file inside the new directory allowed me to build Vikunja

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2251
Co-authored-by: Raymi306 <raymi306@gmail.com>
Co-committed-by: Raymi306 <raymi306@gmail.com>
2024-04-08 07:48:12 +00:00
renovate 3e77e3043e chore(deps): update dev-dependencies 2024-04-08 07:09:20 +00:00
kolaente d082c0399d fix(test): visit one more project in project history test 2024-04-07 22:36:09 +02:00
kolaente 0b9ef27d04 fix(migration): show correct message after starting a migration
Related to https://github.com/go-vikunja/vikunja/issues/238
2024-04-07 15:11:59 +02:00
kolaente 7acd1a7e51 fix(project): remove child projects from state when deleting a project 2024-04-07 15:03:18 +02:00
kolaente 8bee5aa806 fix(project): return the full project when setting a background
Related to https://kolaente.dev/vikunja/vikunja/issues/2246
2024-04-07 14:53:57 +02:00
kolaente 6641cbebc2 fix(project): save the last 6 projects in history, show only 5 on desktop
The project grid on the home page with the recently visited projects now contains an even number of projects which makes for a much nicer grid (because it's now uniform).
2024-04-07 14:34:18 +02:00
kolaente 5892622676 fix(notifications): rendering of plaintext mails 2024-04-07 14:12:44 +02:00
kolaente 191a476823 fix(notifications): only sanitze html content in notifications, do not convert it to markdown
Resolves https://community.vikunja.io/t/trello-import-html-mails/2197
2024-04-07 13:34:53 +02:00
renovateandkonrad c146b72d64 chore(deps): update golangci/golangci-lint docker tag to v1.57.2 (#2225)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2225
Reviewed-by: konrad <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-04-07 11:09:14 +00:00
kolaente ca33c0b2bc fix: drop bucket index before recreating it
Resolves https://kolaente.dev/vikunja/vikunja/issues/2243
2024-04-07 12:50:42 +02:00
kolaente 4d78ae7fa8 chore(dev): move nix flake to top level, add api tooling 2024-04-07 12:16:13 +02:00
kolaente c1d06c5e5a fix(projects): do not return parent project id of parents where the user does not have access
This caused the frontend to not show such projects, throwing errors in the process and sometimes made it hang.
2024-04-07 12:10:20 +02:00
kolaente f1c3ce5eeb fix(projects): allow arbitrary nesting of new projects 2024-04-07 12:00:39 +02:00
kolaente 2f6b395334 feat(kanban): set task position to 0 (top) when it is moved into the done bucket automatically after marking it done 2024-04-06 14:35:05 +02:00
kolaente 1cd5dd2b2f fix: lint 2024-04-06 14:12:08 +02:00
kolaente 521300613f fix: update task in typesense when adding a label or assignee to them
Resolves https://community.vikunja.io/t/typesense-only-works-if-i-re-index/2212
2024-04-06 14:04:04 +02:00
kolaente 037022e857 fix: do not try to fetch nonexistant bucket 2024-04-06 13:55:11 +02:00
kolaente ec1ff80791 fix(kanban): save done and default bucket on the view and not on the project
The frontend was still trying to update the two in the project which won't work since they are now saved at the view level, not the project.
2024-04-06 13:32:54 +02:00
kolaente 7b8fab33a5 fix(kanban): Make sure all saved taskBucket positions are saved with their project view id
When the tasks were migrated from belonging directly to a bucket to only belonging to a view, I forgot to add the view in that migration, resulting in task buckets where the view was 0. These entries were not deleted when a task was moved between buckets, but the new task bucket relation nevertheless inserted. This resulted in tasks showing up multiple times on the kanban board.

This change adds a new migration which adds the correct project view id (as derived from the bucket) and fixes the old migration as well.

Resolves https://community.vikunja.io/t/no-longer-able-to-properly-move-tasks-between-kanban-columns/2175
2024-04-06 13:04:36 +02:00
kolaente e0417c8bda docs: add Korganizer to supported caldav clients 2024-04-06 12:15:08 +02:00
kolaente 6fbd24d5f6 fix(filter): move spaces out of button to after the matched filter value to prevent removal of spaces 2024-04-06 12:08:58 +02:00
kolaente e534a6a5bf fix(modal): do not set p in modal card as flex
This fixes a bug where the description of a project or filter would be aligned right.
2024-04-06 12:08:58 +02:00
kolaente bf85cb0505 fix(filters): always show filter values in a readable color 2024-04-06 12:08:57 +02:00
kolaente 20e2314128 fix(filters): enclose values with a slash in them as strings so that date math values work
Previously, in a filter like "due_date = now/d", the / was parsed as the beginning of a comment, but as it did not contain the full value, this is an invalid comment, resulting in an error message.

Resolves https://community.vikunja.io/t/filter-setting-s/1791/12
2024-04-06 12:08:57 +02:00
kolaente 1ebb551864 fix(filters): make sure the same filter attribute is transformed in all instances
Resolves https://community.vikunja.io/t/filter-setting-s/1791/13
2024-04-06 12:08:57 +02:00
renovate 30c1a46ed4 fix(deps): update src.techknowlogick.com/xgo digest to e01c4fb 2024-04-06 09:07:13 +00:00
kolaente 1910f69392 fix(test): correctly mock localstorage in unit tests 2024-04-06 10:34:41 +02:00
renovate fe4a093825 chore(deps): update dev-dependencies 2024-04-06 00:07:33 +00:00
renovateandkonrad 90055d063c chore(deps): update dev-dependencies (#2229)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2229
Reviewed-by: konrad <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-04-05 20:41:15 +00:00
f0d695e789 fix(views): remove default filter from frontend, apply by default to new list views instead (#2240)
Fixes #2234

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2240
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-04-02 13:49:38 +00:00
kolaente 95276ceebe fix(reactions): do not enable reaction picker when the current user does not have write access 2024-04-02 14:48:13 +02:00
kolaente 1558921f42 fix(test): use correct selector in Cypress test 2024-04-02 14:31:15 +02:00
kolaente bf5088e546 fix(sharing): show user display name and avatar when displaying search results
Resolves https://community.vikunja.io/t/autogenerated-username-using-google-openid/2183/12
2024-04-02 14:29:22 +02:00
kolaente 6f366d4907 feat(views): lint 2024-04-02 14:04:17 +02:00
kolaente d7554d9e70 feat(views): hide view switcher when there is only one view 2024-04-02 14:02:59 +02:00
kolaente 8a72fe26f8 fix(views): refactor filter button slot in wrapper
Before this change, the filter button on the top right was positioned using absolute positioning and plenty of tricks, which were brittle and not really maintainable. Now, the buttons are positioned using flexbox, which should make this a lot more maintainable.
2024-04-02 14:02:31 +02:00
kolaente 13cab62d14 fix(views): transform view filter before and after loading it from the api
Previously, the actual filter was kept as-is when sending it to the api, essentially creating an invalid filter. This change fixes this, transforming the filter before saving and after loading.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2233
2024-04-02 13:20:17 +02:00
kolaente 81de986d8d fix(gantt): correctly show day in chart 2024-04-02 12:53:14 +02:00
kolaente 915f677c2a fix(views): correctly pass view id to wrapper when gantt view is active 2024-04-02 12:50:10 +02:00
kolaente 8a6e3d5bd7 fix(views): use correct assertion in test 2024-04-02 12:42:07 +02:00
kolaente 81fe8391e4 fix(project): load full project after creating a project
When a new project was created, it contained all details already. This led to duplicated views and overridden attributes in the response.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2242
2024-03-29 19:28:17 +01:00
kolaente 89e37b88d9 fix(views): update all fields when updating a view
Resolves https://kolaente.dev/vikunja/vikunja/issues/2241
2024-03-29 18:19:16 +01:00
kolaente cc6801c5b1 fix(filter): make sure highlight works for doneAt attribute 2024-03-29 18:09:02 +01:00
kolaente 767b058915 fix(filter): add white background to filter input 2024-03-29 18:07:37 +01:00
kolaente 2c0d3f2885 fix(views): add bottom spacing 2024-03-29 18:05:30 +01:00
renovate fa170b9397 fix(deps): update sentry-javascript monorepo to v7.109.0 2024-03-28 22:06:03 +00:00
kolaente a5fd6f834a chore(deps): sign drone config 2024-03-28 23:00:24 +01:00
renovate 8984e0e9f0 fix(deps): update module github.com/go-sql-driver/mysql to v1.8.1 2024-03-28 21:06:31 +00:00
renovateandkonrad 176c41dc40 fix(deps): update dependency express to v4.19.2 2024-03-28 20:57:07 +00:00
c4d3d99cd4 fix: pick first available view if currently configured view got deleted (#2235)
Resolves #2232

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2235
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-28 20:55:52 +00:00
renovateandkonrad 30b4ed6b23 fix(deps): update dependency dompurify to v3.0.11 2024-03-28 20:53:00 +00:00
renovateandkonrad aed92d1cd2 fix(deps): update sentry-javascript monorepo to v7.108.0 2024-03-28 20:49:17 +00:00
Frederick [Bot]anddrone 2239d73797 chore(i18n): update translations via Crowdin 2024-03-27 00:11:11 +00:00
Frederick [Bot]anddrone 98b833f61a chore(i18n): update translations via Crowdin 2024-03-25 00:10:35 +00:00
Frederick [Bot]anddrone ecd002dca3 chore(i18n): update translations via Crowdin 2024-03-21 00:05:22 +00:00
renovateandkonrad 5e3616bda3 fix(deps): update dependency ufo to v1.5.3 2024-03-20 16:32:22 +00:00
renovate 3e5ff77b91 fix(deps): update dependency express to v4.19.0 2024-03-20 16:05:36 +00:00
kolaente 403db6adbf fix(reminder): do not close the popup directly after changing the value
Fixes https://github.com/go-vikunja/vikunja/issues/225
2024-03-20 11:58:29 +01:00
kolaente fd4312382e fix(kanban): remove unused function 2024-03-20 11:46:36 +01:00
kolaente 2dcf6c6861 fix(kanban): do not use the bucket id saved on the task 2024-03-20 11:36:54 +01:00
kolaente 8f85af07ca fix(task): clear timeout for description save when closing the task detail 2024-03-20 11:26:54 +01:00
kolaente 9f89fbe5a6 fix(tests): do not try to create tasks with bucket_id 2024-03-20 10:54:37 +01:00
kolaente 6ad83c0685 chore: do not import message dynamically
Since it was not done consistently, it would not get imported dynamically anyway. This fixes the compile warnings.
2024-03-20 10:52:59 +01:00
kolaente 97b7592e7c fix(views): do not map bucket id from xorm 2024-03-20 10:41:58 +01:00
kolaente 19c9cd9bc2 fix(docker): don't install cypress in docker image 2024-03-20 09:38:28 +01:00
Frederick [Bot]andkolaente e53fcd3367 [skip ci] Updated swagger docs 2024-03-20 08:35:16 +00:00
kolaente d635fd2dd3 fix(projects): remove done bucket id field from projects struct 2024-03-20 09:21:40 +01:00
renovateandkonrad b8584301a3 fix(deps): update dependency @infectoone/vue-ganttastic to v2.3.1 2024-03-20 08:01:25 +00:00
renovate 2bb4c31f20 chore(deps): update dev-dependencies 2024-03-20 03:07:47 +00:00
Frederick [Bot]anddrone d22ebef0b3 chore(i18n): update translations via Crowdin 2024-03-20 00:06:31 +00:00
Frederick [Bot]andkonrad 68d8ed5a7a [skip ci] Updated swagger docs 2024-03-19 19:28:04 +00:00
konrad 7230db1603 feat: decouple views from projects (#2217)
This PR decouples views from projects. On the surface, everything stays the same - by default, there are the same views as right now in main - List, Gantt, Table, Kanban. With this feature, it is possible to modify these or create new ones. That means you can remove views you never need or create multiple ones if you need different configurations.

Each view can have an optional filter to change what you see in the frontend on that view. For kanban, you can either set it to "manual" mode, where you can create buckets and move tasks around, or "filter" mode, where each bucket is the result of a filter (and you cannot move them around).

All positions and buckets are now tied to the view, not the project. This means you can (finally!) have views for saved filters.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2217
2024-03-19 19:16:11 +00:00
kolaente 32e8a15f1f fix(views): create default bucket 2024-03-19 19:53:46 +01:00
renovate f80ffcd541 fix(deps): update module github.com/coreos/go-oidc/v3 to v3.10.0 2024-03-19 18:05:40 +00:00
kolaente 89ed71777e fix(views): create bucket in test 2024-03-19 17:57:00 +01:00
kolaente 5b01710943 fix(views): intercept request 2024-03-19 17:42:59 +01:00
kolaente d7b40f393e fix(views): redirect to project after authenticating with a link share 2024-03-19 17:38:33 +01:00
kolaente fee75e55a3 fix(views): stable assertion for bucket in tests 2024-03-19 17:27:03 +01:00
kolaente fa137b1ffc fix(views): include order by fields in distinct clause when sorting by task position 2024-03-19 17:05:12 +01:00
kolaente e7d6ee2392 fix(views): update done status of recurring tasks 2024-03-19 17:04:39 +01:00
kolaente 62ff05695f fix(views): kanban test assertions 2024-03-19 16:59:46 +01:00
kolaente 6f51b56589 fix: lint 2024-03-19 16:49:39 +01:00
kolaente 5e9edef3b3 fix: lint 2024-03-19 16:33:23 +01:00
kolaente f18fcc5569 fix(views): make task cypress tests work again 2024-03-19 15:27:31 +01:00
kolaente bc8b5da61d fix(views): make overview cypress tests work again 2024-03-19 15:23:36 +01:00
kolaente b3a96ea251 fix(views): make link share cypress tests work again 2024-03-19 15:09:38 +01:00
kolaente b0ad087a36 fix(views): correctly save and retrieve last accessed project views 2024-03-19 14:57:16 +01:00
kolaente b65d05ec3d fix(views): make table view cypress tests work again 2024-03-19 14:43:52 +01:00
kolaente 974c9cdd21 fix(views): always redirect to the first view when none was specified 2024-03-19 14:39:10 +01:00
kolaente 8206cc8767 fix(views): make list cypress tests work again 2024-03-19 14:38:52 +01:00
kolaente 53e57d524a fix(views): make kanban cypress tests work again 2024-03-19 14:21:32 +01:00
kolaente 165d291cd5 fix(views): reset bucket when moving tasks between projects 2024-03-19 14:16:05 +01:00
kolaente e940db6d32 fix(views): return only tasks when the bucket id was already specified 2024-03-19 13:55:28 +01:00
kolaente 7c30b00668 fix(views): correctly pass project id when loading more tasks in kanban views 2024-03-19 13:55:05 +01:00
renovate 0ee8150e24 fix(deps): update dependency dompurify to v3.0.10 2024-03-19 12:06:01 +00:00
kolaente cf9b2fa203 fix(views): tests for kanban and gantt views 2024-03-19 12:11:27 +01:00
renovateandkonrad a9622fe03a chore(deps): update dev-dependencies 2024-03-19 10:08:57 +00:00
renovate c67f0ae3cc fix(deps): update dependency @kyvg/vue3-notification to v3.2.1 2024-03-19 09:07:58 +00:00
renovateandkonrad 8e7828f71d fix(deps): update dependency ufo to v1.5.2 2024-03-19 08:44:45 +00:00
renovate 5e60edd9ae chore(deps): update dependency happy-dom to v14 2024-03-19 01:06:24 +00:00
kolaente 511c9aa824 fix(views): make tests for project history kind of work again 2024-03-19 00:47:52 +01:00
kolaente 4b903c4f48 fix(views): lint 2024-03-19 00:47:52 +01:00
kolaente 30b41bd143 fix(views): lint 2024-03-19 00:47:51 +01:00
kolaente f3cdd7d15f fix(views): import 2024-03-19 00:47:51 +01:00
kolaente 8b90eb4a15 fix(views): integration tests 2024-03-19 00:47:51 +01:00
kolaente 803f58f402 fix(views): return correct error 2024-03-19 00:47:51 +01:00
kolaente b7b3169169 fix(views): count task buckets 2024-03-19 00:47:51 +01:00
kolaente 409f9a0cc6 fix(views): test assertions 2024-03-19 00:47:51 +01:00
kolaente 9075a45cb8 fix(views): update test fixtures for new structure 2024-03-19 00:47:51 +01:00
kolaente d4bdd2d4e8 fix(views): duplicate all views and related entities when duplicating a project 2024-03-19 00:47:51 +01:00
kolaente 9cc273d9bd fix(views): move all tasks to the default bucket when deleting a bucket 2024-03-19 00:47:51 +01:00
kolaente 0f60a92873 fix(views): make kanban tests work again 2024-03-19 00:47:51 +01:00
kolaente bec9e3eb7d fix(views): set current project after modifying views 2024-03-19 00:47:51 +01:00
kolaente 3f8c5a5feb fix(views): set correct default view 2024-03-19 00:47:51 +01:00
kolaente 24fa3b206f fix(views): create view 2024-03-19 00:47:50 +01:00
kolaente 434b1ea0e8 feat(views): crud in frontend 2024-03-19 00:47:50 +01:00
kolaente 433584813a fix(views): view deletion 2024-03-19 00:47:50 +01:00
kolaente 3ec3bb76af fix(views): make parsing work 2024-03-19 00:47:50 +01:00
kolaente 6e53bf4ebe feat(filter): add unique id to filter input 2024-03-19 00:47:50 +01:00
kolaente b8ff7910b0 feat(filter): make filter input label configurable 2024-03-19 00:47:50 +01:00
kolaente f6485be9e2 chore(views): move actual project views into their own folder 2024-03-19 00:47:50 +01:00
kolaente 004f1e06bb fix(views): do not return kanban tasks multiple times 2024-03-19 00:47:50 +01:00
kolaente 27cb6e3372 fix(views): make bucket edit work 2024-03-19 00:47:50 +01:00
kolaente 445f1c06fa fix(views): make bucket creation work again 2024-03-19 00:47:50 +01:00
kolaente 4c1a53beed chore(views): use view id instead of passing whole view object 2024-03-19 00:47:50 +01:00
kolaente 7368a51f18 fix(views): make setting task position in saved filters work 2024-03-19 00:47:49 +01:00
kolaente e1774cc49a feat(views): show tasks on kanban board in saved filter 2024-03-19 00:47:49 +01:00
kolaente 61e27ae3eb feat(views): create task bucket relation when creating a new bucket 2024-03-19 00:47:49 +01:00
kolaente 7f1788eba9 fix(views): get tasks in saved filter 2024-03-19 00:47:49 +01:00
kolaente 39c9928421 fix(views): do not load views async 2024-03-19 00:47:49 +01:00
kolaente 59ced554cd chore(views): remove old view routes 2024-03-19 00:47:49 +01:00
kolaente bc34a33922 fix(views): move to new project view when moving tasks 2024-03-19 00:47:49 +01:00
kolaente 2dfb3a6379 fix(views): make no initial view work in the frontend 2024-03-19 00:47:49 +01:00
kolaente 337d289a39 chore: remove old saved views migration 2024-03-19 00:47:49 +01:00
kolaente 5451ddf58d fix(views): return tasks directly or in buckets, no matter if accessing via user or link share 2024-03-19 00:47:49 +01:00
kolaente a3714c74fd feat(views): load views when navigating with link share 2024-03-19 00:47:49 +01:00
kolaente 4170f5468f feat(views): save task position in list view 2024-03-19 00:47:49 +01:00
kolaente f364f3bec8 feat(views): return position when retriving tasks 2024-03-19 00:47:48 +01:00
kolaente 786e67f692 feat(views): save task position 2024-03-19 00:47:48 +01:00
kolaente c36fdb9f5d chore(views): add fixme 2024-03-19 00:47:48 +01:00
kolaente dee78be579 fix(views): return buckets when fetching tasks via kanban view 2024-03-19 00:47:48 +01:00
kolaente 398c9f1056 fix(views): return tasks in their buckets 2024-03-19 00:47:48 +01:00
kolaente ca0550acea fix(views): fetch buckets through view 2024-03-19 00:47:48 +01:00
kolaente cb111df2b7 fix(views): make fetching tasks in kanban buckets through view actually work 2024-03-19 00:47:48 +01:00
kolaente df415f97a9 fix(views): make table view load tasks again 2024-03-19 00:47:48 +01:00
kolaente 86039b1dd2 fix(views): make gantt view load tasks again 2024-03-19 00:47:48 +01:00
kolaente 73e5483e87 fix(views): do not break filters when combining them with view filters 2024-03-19 00:47:48 +01:00
kolaente 6913334b17 fix(views): correctly fetch project when fetching tasks 2024-03-19 00:47:48 +01:00
kolaente 7866543198 feat(views): generate swagger docs 2024-03-19 00:47:48 +01:00
kolaente cf15cc6f12 feat(views): fetch tasks via view context when accessing them through views 2024-03-19 00:47:47 +01:00
kolaente ee6ea03506 feat(views): sort by position 2024-03-19 00:47:47 +01:00
kolaente 43f24661d7 feat(views): save view and position in Typesense 2024-03-19 00:47:47 +01:00
kolaente 5641da27f7 feat(views): save position in Typesense 2024-03-19 00:47:47 +01:00
kolaente 14353b24d7 feat(views): set default position 2024-03-19 00:47:47 +01:00
kolaente ca4e3e01c5 feat(views): recalculate all positions when updating 2024-03-19 00:47:47 +01:00
kolaente 8ce476491e feat(views): only update the bucket when necessary 2024-03-19 00:47:47 +01:00
kolaente f2a0d69670 feat(views)!: make updating a bucket work again 2024-03-19 00:47:47 +01:00
kolaente a13276e28e feat(views)!: decouple bucket <-> task relationship 2024-03-19 00:47:47 +01:00
kolaente 9cf84646a1 feat(views)!: move done and default bucket setting to view 2024-03-19 00:47:47 +01:00
kolaente 006f932dc4 feat(views)!: decouple bucket CRUD from projects 2024-03-19 00:47:47 +01:00
kolaente 0a3f45ab11 feat(views): decouple buckets from projects 2024-03-19 00:47:47 +01:00
kolaente d1d07f462c feat(views): sort tasks by their position relative to the view they're in 2024-03-19 00:47:46 +01:00
kolaente 2502776460 feat(views)!: move task position handling to its own crud entity
BREAKING CHANGE: the position of tasks now can't be updated anymore via the task update endpoint. Instead, there is a new endpoint which takes the project view into account as well.
2024-03-19 00:47:46 +01:00
kolaente 238baf86f7 feat(views)!: return tasks in buckets by view
BREAKING CHANGE: tasks in their bucket are now only retrievable via their view. The /project/:id/buckets endpoint now only returns the buckets for that project, which is more in line with the other endpoints
2024-03-19 00:47:46 +01:00
kolaente 652bf4b4ed feat(views): (un)marshal custom project view mode types 2024-03-19 00:47:46 +01:00
kolaente a9020e976d feat(views): add bucket configuration mode 2024-03-19 00:47:46 +01:00
kolaente 38457aaca5 feat(views): use project id when fetching views 2024-03-19 00:47:46 +01:00
kolaente 98b7cc9254 feat(views): do not override filters in view 2024-03-19 00:47:46 +01:00
kolaente 4149ebed3a feat(views): create default views when creating a filter 2024-03-19 00:47:46 +01:00
kolaente 2096fc5274 feat(views): return tasks in a view 2024-03-19 00:47:46 +01:00
kolaente e4b1a5d2db feat(views): create default 4 default view for projects 2024-03-19 00:47:46 +01:00
kolaente 2fa3e2c2f5 feat(views): return views with their projects 2024-03-19 00:47:46 +01:00
kolaente ee228106fc feat(views): add new default views for filters 2024-03-19 00:47:45 +01:00
kolaente b39c5580c2 feat(views): add crud handlers and routes for views 2024-03-19 00:47:45 +01:00
kolaente 6bdb33fb46 feat(views): add new model and migration 2024-03-19 00:47:45 +01:00
renovateandkonrad 091e03a39d fix(deps): update module xorm.io/xorm to v1.3.9 2024-03-18 09:23:11 +00:00
renovateandkonrad 55c9403dda chore(deps): update pnpm to v8.15.5 2024-03-18 09:08:09 +00:00
renovateandkonrad 3f33f903b5 chore(deps): update dev-dependencies 2024-03-18 09:05:33 +00:00
renovate 650c6cb339 fix(deps): update dependency date-fns to v3.6.0 2024-03-18 02:07:06 +00:00
kolaente 2fff9f1c59 fix(deps): update module github.com/adlio/trello to v1.11.0 2024-03-17 21:44:20 +01:00
renovateandkonrad 2cbd20a084 fix(deps): update dependency date-fns to v3.5.0 2024-03-16 10:12:02 +00:00
renovateandkonrad 15949adc2b fix(deps): update dependency ufo to v1.5.1 2024-03-16 10:11:29 +00:00
renovateandkonrad 11f2db0e9c chore(deps): update dev-dependencies 2024-03-16 10:11:17 +00:00
Frederick [Bot]anddrone 87ebe85972 chore(i18n): update translations via Crowdin 2024-03-16 00:05:25 +00:00
renovateandkonrad 0cf11228cf fix(deps): update dependency vue-i18n to v9.10.2 2024-03-15 18:16:11 +00:00
renovateandkonrad 9d01b9105a fix(deps): update dependency ufo to v1.5.0 2024-03-15 18:15:56 +00:00
renovate d6bc09b0cf fix(deps): update dependency axios to v1.6.8 2024-03-15 17:07:21 +00:00
be54a361fd docs: add details about supported and required OIDC claims (#2201)
Again based on a [community question](https://community.vikunja.io/t/oidc-how-can-i-prevent-username-from-being-set-randomly-how-can-users-find-each-other/2138/2), it might make sense to add a few more details about the OIDC behaviour to the docs.

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2201
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-15 13:50:46 +00:00
renovateandkonrad 725a04b93c fix(deps): update sentry-javascript monorepo to v7.107.0 2024-03-15 07:50:09 +00:00
renovate 2add517d6e chore(deps): update dev-dependencies 2024-03-15 00:06:35 +00:00
kolaente 96186250f4 fix(filters): clear autocomplete results when starting the next character 2024-03-14 09:05:07 +01:00
kolaente 6cf3a578c0 fix(filters): correctly replace values when clicking on an autocomplete result
Related https://kolaente.dev/vikunja/vikunja/issues/2194
2024-03-14 09:02:57 +01:00
kolaente c8b35d49ca fix(filters): correctly return project from filter
Related https://kolaente.dev/vikunja/vikunja/issues/2194
2024-03-14 08:49:02 +01:00
kolaente 161bb1b192 fix(filters): do not watch debounced 2024-03-14 08:40:03 +01:00
kolaente 3ab22d8e06 chore(deps): update google.golang.org/protobuf from 1.32.0 to 1.33.0 2024-03-14 08:33:13 +01:00
renovateandkonrad 273f5ddf59 chore(deps): update dev-dependencies 2024-03-14 07:22:29 +00:00
Frederick [Bot]anddrone 88fdfb50b7 chore(i18n): update translations via Crowdin 2024-03-14 00:06:47 +00:00
kolaente 07e84f2abf fix(reminders): make debounce logic actually work 2024-03-13 20:11:00 +01:00
kolaente d4605905d3 fix(filters): do not fire filter change immediately
Related to https://kolaente.dev/vikunja/vikunja/issues/2194#issuecomment-61081
2024-03-13 19:58:24 +01:00
kolaente 8c826c44d2 fix(webhooks): fire webhooks set on parent projects as well 2024-03-13 19:41:34 +01:00
kolaente 117079bbda fix(sentry): do not send api errors to sentry 2024-03-13 19:31:43 +01:00
kolaente f34577f293 fix(editor): do not use Tiptap to open links when clicking on them, use the browser native attributes instead
It looks like links are opened twice, when the openOnClick option is enabled. That means they will get opened twice when clicking on them. Disabling that option will not fire the click handler and only rely on browser functionality to open links.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2155
2024-03-13 19:23:02 +01:00
kolaente 8ff59d4649 fix(task): navigate back to project when the project was the last page in the history the user visited 2024-03-13 19:11:49 +01:00
kolaente 7bf2664e55 fix(filters): persist filters in url
This allows us to keep the filters when navigating back from a task or other url.
2024-03-13 19:03:23 +01:00
kolaente ccb708a56f fix(reminders): emit reminder changes at the correct time (and make sure they are actually emitted)
Resolves https://github.com/go-vikunja/vikunja/issues/225
2024-03-13 18:42:55 +01:00
kolaente 1de39b1cd1 fix(quick actions): do not allow creating a task when the current project is a saved filter
Resolves https://community.vikunja.io/t/creating-task-on-saved-filter-page-doesnt-save/2127
2024-03-13 18:16:18 +01:00
kolaente b3caece256 fix(datepicker): emit date value changes as soon as they happen
Flatpickr only returns a change event when the value in the input it's referring to changes. That means it will usually only trigger when the focus is moved out of the input field. This is fine most of the time. However, since we're displaying flatpickr in a popup, the whole html dom instance might get destroyed, before the change event had a chance to fire. In that case, it would not update the date value. To fix this, we're now listening on every change and bubble them up as soon as they happen.

Resolves https://community.vikunja.io/t/due-date-confirm-button-not-working/2104
2024-03-13 18:03:49 +01:00
kolaente a6edf1d325 feat(filters): make clear filters button less obvious 2024-03-13 17:33:34 +01:00
kolaente fc4eed6eb4 fix(filters): lint 2024-03-13 17:21:20 +01:00
kolaente 15215b30a0 fix(filters): rework filter popup button 2024-03-13 17:19:15 +01:00
kolaente 79577c14b7 fix(filters): set default filter value to only undone tasks 2024-03-13 17:07:10 +01:00
kolaente 99c5524115 fix(editor): don't allow image upload when it's not possible to do it 2024-03-13 16:59:57 +01:00
renovateandkonrad 17e222edfd chore(deps): update dependency happy-dom to v13.8.2 2024-03-13 07:44:23 +00:00
Frederick [Bot]anddrone fb5b2542a5 chore(i18n): update translations via Crowdin 2024-03-13 00:05:52 +00:00
kolaente 5b2b7f7bdc fix(kanban): reset done and default bucket when the bucket itself is deleted
Resolves https://github.com/go-vikunja/vikunja/issues/234
2024-03-12 22:23:35 +01:00
kolaente e1c972d64d fix(filters): replace project titles at the match position, not anywhere in the filter string
This fixes a bug where the project title would not be replaced correctly in cases where the project title contained parts of the word "project".

Resolves https://kolaente.dev/vikunja/vikunja/issues/2194
2024-03-12 22:05:26 +01:00
kolaente cf6b476b7d chore: cleanup leftover console.log 2024-03-12 21:33:24 +01:00
kolaente eb4f880c64 fix(filter): do not show filter footer when creating a filter 2024-03-12 21:30:59 +01:00
kolaente e44897e0d4 fix(filter): do not match join operator
Partial fix for https://kolaente.dev/vikunja/vikunja/issues/2194
2024-03-12 21:30:59 +01:00
renovate 0e2ad5dde6 fix(deps): pin dependency vuemoji-picker to 0.2.1 2024-03-12 20:07:21 +00:00
Frederick [Bot]andkolaente 792bf88dcf [skip ci] Updated swagger docs 2024-03-12 19:47:16 +00:00
kolaente a5c51d4b1e feat: emoji reactions for tasks and comments (#2196)
This PR adds reactions for tasks and comments, similar to what you can do on Gitea, GitHub, Slack and plenty of other tools.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2196
Co-authored-by: kolaente <k@knt.li>
Co-committed-by: kolaente <k@knt.li>
2024-03-12 19:25:58 +00:00
renovate b9c513f681 fix(deps): update sentry-javascript monorepo to v7.106.1 2024-03-12 09:07:14 +00:00
renovateandkonrad 40bdecfe0d fix(deps): update dependency date-fns to v3.4.0 2024-03-12 08:56:15 +00:00
renovate da53c8e7ef chore(deps): update dev-dependencies 2024-03-12 06:07:20 +00:00
kolaente 85fb8e3443 fix(filters): invalid filter range when converting dates to strings
Resolves https://community.vikunja.io/t/my-vikunja-instance-creates-tasks-with-due-date-time-of-9am-for-tasks-with-the-word-today-word-in-it/2105/10
2024-03-11 23:28:35 +01:00
Frederick [Bot]andkolaente 3f380e0d61 [skip ci] Updated swagger docs 2024-03-11 16:41:16 +00:00
kolaente 659de54db1 feat(kanban): do not remove focus from the input after creating a new bucket 2024-03-11 17:29:28 +01:00
kolaente 49ab90fc19 fix: lint 2024-03-11 17:24:40 +01:00
kolaente 0910d5d2f2 chore(auth): refactor removing empty openid teams to cron job 2024-03-11 17:20:05 +01:00
kolaente 09d5128050 fix(filters): don't escape valid escaped in queries 2024-03-11 17:02:04 +01:00
kolaente e097721817 fix(tasks): use correct filter query when filtering 2024-03-11 16:39:27 +01:00
kolaente a66e26678e feat(filters): pass timezone down when filtering with relative date math
Resolves https://community.vikunja.io/t/my-vikunja-instance-creates-tasks-with-due-date-time-of-9am-for-tasks-with-the-word-today-word-in-it/2105/8
2024-03-11 16:28:25 +01:00
kolaente 6fc3d1e98f fix: lint 2024-03-11 15:42:09 +01:00
kolaente dbfe162cd2 fix(filters): label highlighting and autocomplete fields now work with in operator
Previously, when creating a filter query with the 'in' operator and multiple values, autocompletion and highlighting was not available. This change now implements a split for each value, seperated by a comma.
2024-03-11 15:41:06 +01:00
kolaente 0529f30e77 fix(filters): parse labels and projects correctly when using in filter operator 2024-03-11 15:16:39 +01:00
kolaente 3896c680d3 fix(filters): do not require string for in comparator 2024-03-11 14:36:59 +01:00
kolaente 3b77fff4c9 fix(project): correctly show the number of tasks and projects when deleting a project 2024-03-11 14:21:42 +01:00
renovate 12fbde8e84 chore(deps): update dev-dependencies 2024-03-11 05:06:04 +00:00
6c98052176 fix(teams): fix duplicate teams being shown when new public team visibility feature is enabled (#2187)
Due to the `INNER JOIN` on the `team_members` table and the new `OR` conditions allowing teams with the `isPublic` flag set to `true`, teams are returned multiple times. As we're only after the teams, a simple distinct query should fix the issue.

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2187
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-10 21:42:34 +00:00
kolaente 0057ac5836 fix(migration): only download uploaded attachments 2024-03-10 18:41:37 +01:00
kolaente 22dcedcd7d fix(filter): correctly replace project title in filter query
Resolves https://community.vikunja.io/t/filter-option-to-exclude-a-tag-project-etc/1523/6
2024-03-10 18:32:15 +01:00
kolaente ca0de680ad fix(migration): import card covers when migrating from Trello 2024-03-10 16:30:06 +01:00
4bb1d5edfc fix(docs): openid docs whitespace formatting (#2186)
Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2186
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-10 14:43:04 +00:00
4b4a7f3c0a docs: fix broken link in migration docs (#2185)
Seems like one link was broken, this attempts to fix that.

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2185
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-03-10 14:12:00 +00:00
waza-ariandkonrad ffa82556e0 feat(teams): add public flags to teams to allow easier sharing with other teams (#2179)
Resolves #2173
Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2179
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-10 14:04:32 +00:00
renovateandkonrad d7fdefcead chore(deps): update golangci/golangci-lint docker tag to v1.56.2 (#2099)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2099
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-03-10 13:47:19 +00:00
1d5517b53a docs: add migrations setup doc (#2183)
This should hopefully make the migration process for obvious, as discussed here https://community.vikunja.io/t/trello-import-issues/2110/7

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2183
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-03-10 13:32:27 +00:00
kolaente 25742385ba chore(deps): sign drone config 2024-03-10 12:24:06 +00:00
renovateandkonrad 2fa576d9f5 chore(deps): update dependency node to v20.11.1 2024-03-10 12:24:06 +00:00
Frederick [Bot]andkonrad 116b909d31 [skip ci] Updated swagger docs 2024-03-10 12:18:34 +00:00
konrad e95159a33c feat(filters): query-based filter logic (#2177)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2177
2024-03-10 12:01:47 +00:00
renovateandkonrad b340bb418b chore(deps): update dependency happy-dom to v13.7.1 2024-03-10 11:57:10 +00:00
01fb80d7a1 fix(teams): do not show leave button for OIDC teams (#2181)
Hide leave team button if team is created through OIDC.

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2181
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-10 11:42:24 +00:00
Daniel Herrmannandkonrad 6e52db76dc docs: clarify what to use for authurl 2024-03-10 11:39:23 +00:00
Hangyaandkonrad c5e8ff66fb fix(migration): updated Trello color map to import all labels (#2178)
Trello has [added 20 color variants](https://www.atlassian.com/blog/trello/20-new-trello-label-colors) that were not imported, added them. Also added a fallback to save labels even if the color is not mapped yet.

Resolves https://community.vikunja.io/t/get-info-about-importation-trello/1968/16
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2178
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Hangya <ronkayj@gmail.com>
Co-committed-by: Hangya <ronkayj@gmail.com>
2024-03-10 11:23:38 +00:00
kolaente 009e9b5455 fix(filters): correctly use date filters in gantt chart 2024-03-10 12:16:21 +01:00
Frederick [Bot]anddrone d963667a29 chore(i18n): update translations via Crowdin 2024-03-10 00:07:19 +00:00
kolaente 654e95d99f fix(filters): test fixture 2024-03-09 20:21:05 +01:00
kolaente d628471d0e fix(filters): close filter popup when clicking on show results 2024-03-09 20:08:18 +01:00
kolaente 4e6e0608c7 fix(filters): lint 2024-03-09 20:08:17 +01:00
kolaente 6fea5640e8 chore(deps): go mod tidy 2024-03-09 19:07:54 +01:00
kolaente b874b02412 feat(filters): highlight label colors in filter 2024-03-09 19:07:32 +01:00
kolaente 084a62e835 fix(filters): layout problems with assignee user avatar 2024-03-09 19:07:31 +01:00
kolaente f3e2b1b89b fix(filters): remove footer when editing a saved filter 2024-03-09 19:07:31 +01:00
kolaente 4e26fa0b85 fix(filters): correctly use filter in saved filter 2024-03-09 19:07:31 +01:00
kolaente 32e1a2018a chore: generate swagger docs 2024-03-09 19:07:31 +01:00
kolaente 05d3bb4fb6 fix(filters): swagger docs for kanban buckets 2024-03-09 19:07:31 +01:00
kolaente 38985a8318 fix(filters): pass correct filter query to kanban and gantt loading 2024-03-09 19:07:31 +01:00
kolaente d0b762d761 docs(filter): add filter query explanation 2024-03-09 19:07:31 +01:00
kolaente e0a7f46e5d feat(filter): fall back to simple search when filter query does not contain any filter inputs 2024-03-09 19:07:31 +01:00
kolaente be253333c2 fix(filter): don't transform anything when input is empty 2024-03-09 19:07:31 +01:00
kolaente 533e778b93 fix(filter): bubble filter query changes up on blur only 2024-03-09 19:07:31 +01:00
kolaente 1d2f3ca546 feat(filter): resolve label and project ids back to titles when loading a filter 2024-03-09 19:07:31 +01:00
kolaente 55b806d311 feat(filter): resolve labels and projects to ids before filtering 2024-03-09 19:07:30 +01:00
kolaente 0c947790e8 feat(filter): add button to show filter results 2024-03-09 19:07:30 +01:00
kolaente b35eb4adbf fix(filter): correctly pass down options 2024-03-09 19:07:30 +01:00
kolaente a22652b737 feat(filter): remove now unused code 2024-03-09 19:07:30 +01:00
kolaente 4dcd3abe9e feat(filter): emit filter query 2024-03-09 19:07:30 +01:00
kolaente 5a13c2b423 fix(filter): add role=search to filter card 2024-03-09 19:07:30 +01:00
kolaente 9eac746984 feat(filter): autocomplete for projects 2024-03-09 19:07:30 +01:00
kolaente b1d9dc6fc3 feat(filter): autocomplete for assignees 2024-03-09 19:07:30 +01:00
kolaente 8fa2f6686a feat(filter): add actual label search when autocompleting 2024-03-09 19:07:30 +01:00
kolaente 9ade917ac4 feat(filter): make the autocomplete look pretty 2024-03-09 19:07:30 +01:00
kolaente 7fc1f27ef5 feat(filter): add autocompletion poc for labels 2024-03-09 19:07:30 +01:00
kolaente 356399f853 chore: format 2024-03-09 19:07:29 +01:00
kolaente 9ed93b181d fix(filters): make sure spaces before and after are not removed 2024-03-09 19:07:29 +01:00
kolaente 981f2d0e70 fix(filters): color 2024-03-09 19:07:29 +01:00
kolaente 2990c01d0a fix(filters): make the button look less like a button to avoid spacing problems 2024-03-09 19:07:29 +01:00
kolaente 2daecbc2bc feat(filters): add basic autocomplete component 2024-03-09 19:07:29 +01:00
kolaente 35487093c6 chore: update lockfile 2024-03-09 19:07:26 +01:00
kolaente 571bcf8996 feat(filters): show user name and avatar for assignee filters 2024-03-09 19:06:52 +01:00
kolaente 388a3a68ba fix(filters): date filter value not populated 2024-03-09 19:06:52 +01:00
kolaente 992d108bfa feat(filters): add date values 2024-03-09 19:06:52 +01:00
kolaente c22daab28c feat(filters): make date values in filter query editable 2024-03-09 19:06:52 +01:00
kolaente 3bd639a110 chore(filters): copy datepicker 2024-03-09 19:06:52 +01:00
kolaente 0d12d72b73 chore(filters): add histoire story file 2024-03-09 19:06:52 +01:00
kolaente 1827102a0a feat(filters): parse date properties to enable datepicker button 2024-03-09 19:06:52 +01:00
kolaente 4586e525ce fix(filters): use readable colors for dark and light mode 2024-03-09 19:06:52 +01:00
kolaente c162a5a457 feat(filter): add auto resize for filter query input 2024-03-09 19:06:52 +01:00
kolaente b978d344ca feat(filter): add basic highlighting filter query component 2024-03-09 19:06:51 +01:00
kolaente 28fa2c517a feat(filters): make new filter syntax work with Typesense 2024-03-09 19:06:48 +01:00
kolaente bc6d812eb0 fix(filters): lint 2024-03-09 19:06:35 +01:00
kolaente 87c027aafd chore(filters): cleanup old variables 2024-03-09 19:06:35 +01:00
kolaente 65e1357705 fix(tests): make filter tests work again 2024-03-09 19:06:35 +01:00
kolaente eebfee73d3 fix(filter): correctly filter for buckets 2024-03-09 19:06:35 +01:00
kolaente ef1cc9720c feat(filter): add in keyword 2024-03-09 19:06:35 +01:00
kolaente c6b682507a feat(filter): add better error message when passing an invalid filter expression 2024-03-09 19:06:35 +01:00
kolaente 9d3fb6f81d chore(filter): cleanup 2024-03-09 19:06:35 +01:00
kolaente 3ea81db836 feat(filter): migrate existing saved filters 2024-03-09 19:06:35 +01:00
kolaente 76ed2cff5f feat(filter): nesting 2024-03-09 19:06:35 +01:00
kolaente e43349618b feat(filter): more tests 2024-03-09 19:06:35 +01:00
kolaente 9624cc9e97 fix(filter): translate all tests 2024-03-09 19:06:35 +01:00
kolaente 764bc15d49 fix(filter): allow filtering for "project" 2024-03-09 19:06:34 +01:00
kolaente 3fc4aaa2a1 fix(filter): allow filtering on "in" condition 2024-03-09 19:06:34 +01:00
kolaente 9f73e2c5f9 fix(filter): don't crash on empty filter 2024-03-09 19:06:34 +01:00
kolaente c1e137d8ee fix(filter): make sure single filter condition works 2024-03-09 19:06:34 +01:00
kolaente de320aac72 feat(filters): basic text filter works now 2024-03-09 19:06:34 +01:00
kolaente 307ffe11c4 feat(filters): very basic filter parsing 2024-03-09 19:06:31 +01:00
Christoph Ritzerandkonrad 86983f50d4 fix(migration): Trello checklists (#2140)
Trello checklists are now properly converted to html checklists and put into the description.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2140
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Christoph Ritzer <chris@cloumail.at>
Co-committed-by: Christoph Ritzer <chris@cloumail.at>
2024-03-09 09:01:02 +00:00
kolaente e65c3ffe6b fix(migration): convert trello card descriptions from markdown to html 2024-03-09 09:31:57 +01:00
renovateandkonrad 9ad7bc5932 fix(deps): update module github.com/go-sql-driver/mysql to v1.8.0 2024-03-09 08:24:14 +00:00
kolaente 2101f37aa2 fix(ci): exclude tasks from cron runs 2024-03-09 09:10:49 +01:00
renovateandkonrad e8d77e61e4 chore(deps): update dependency @vue/eslint-config-typescript to v13 2024-03-09 08:00:20 +00:00
renovateandkonrad 7e69c7cbe0 chore(deps): update dev-dependencies 2024-03-09 07:59:59 +00:00
Frederick [Bot]anddrone f6204c307e chore(i18n): update translations via Crowdin 2024-03-09 00:06:36 +00:00
kolaente 28d72d4d47 feat(i18n): add pt-br as selectable language in the frontend 2024-03-08 20:06:48 +01:00
renovateandkonrad 2c5f8126c5 fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.2.1 2024-03-08 13:38:47 +00:00
renovate 9aea5830f3 fix(deps): update sentry-javascript monorepo to v7.106.0 2024-03-08 12:07:55 +00:00
kolaente 14452428a2 chore(deps): update github.com/go-jose/go-jose to 3.0.3 2024-03-08 09:59:55 +01:00
renovateandkonrad b5682ecc18 chore(deps): update dependency electron to v29.1.1 2024-03-08 07:59:34 +00:00
renovate 0bec7ee1ab fix(deps): update dependency @intlify/unplugin-vue-i18n to v3.0.1 2024-03-08 02:07:52 +00:00
renovate d1a3eb9701 fix(deps): update dependency @intlify/unplugin-vue-i18n to v3 2024-03-07 12:06:52 +00:00
renovate cba09c8eb1 chore(deps): update dev-dependencies 2024-03-07 07:06:40 +00:00
kolaente dc291a51f5 fix(migration): do not expire trello token 2024-03-06 15:13:54 +01:00
renovate e5e66d73f5 chore(deps): update dev-dependencies 2024-03-06 00:06:22 +00:00
d69fc28125 fix(openid): OIDC teams should not have admins (#2161)
This PR fixes an issue discussed in #2152. Before this PR, the user who triggered team creation automatically got the admin flag set for this group, which makes perfect sense for the normal UI workflow. OIDC managed teams cannot be edited in Vikunja, and they're created automatically by the first user logging in having this team assigned. This PR therefore makes sure that OIDC managed team members do not receive the admin flag.

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2161
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-05 22:08:39 +00:00
renovate 4793282baf fix(deps): update src.techknowlogick.com/xgo digest to 770b8ea 2024-03-05 19:06:41 +00:00
renovateandkonrad 43b0689c1a chore(deps): update dev-dependencies 2024-03-05 07:21:24 +00:00
renovateandkonrad 48d1937bd4 fix(deps): update module golang.org/x/oauth2 to v0.18.0 2024-03-05 07:21:02 +00:00
renovate 3e5d55d9e8 fix(deps): update dependency vue-flatpickr-component to v11.0.5 2024-03-05 05:06:23 +00:00
a3154e805c fix(auth): use (issuer, name) to check for uniqueness of oidc teams (#2152)
The change introduced in #2150 introduces a bug where a Team would be re-created every time a user logs in, as the check if a team already exists was based on both the unique `oidcID` and the `name`. This PR proposes to only base the check on the ID, as this should be unique.

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2152
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-04 20:26:45 +00:00
renovate 2414b580c1 fix(deps): update module golang.org/x/crypto to v0.21.0 2024-03-04 19:06:31 +00:00
renovate 87ac9e261f fix(deps): update module golang.org/x/term to v0.18.0 2024-03-04 18:06:30 +00:00
renovateandkonrad 63e9f8f682 fix(deps): update module github.com/arran4/golang-ical to v0.2.7 2024-03-04 16:37:53 +00:00
renovate 5a9de579cc fix(deps): update module golang.org/x/sys to v0.18.0 2024-03-04 16:05:48 +00:00
renovateandkonrad 42e660c3d6 fix(deps): update dependency vue-i18n to v9.10.1 2024-03-04 11:27:12 +00:00
renovateandkonrad 6533e75496 fix(deps): update module github.com/stretchr/testify to v1.9.0 2024-03-04 11:27:09 +00:00
renovateandkonrad f8c5e314df fix(deps): update sentry-javascript monorepo to v7.105.0 2024-03-04 10:14:01 +00:00
renovate 429b140cad chore(deps): update dependency vue-tsc to v2 2024-03-04 05:07:03 +00:00
renovateandkonrad dc7ee851ec chore(deps): update dev-dependencies 2024-03-03 22:31:33 +00:00
92d9c31101 docs: improve OpenID documentation (#2151)
This PR stems from issue #2150, in turn following up on PR #1393

It adds additional details around the OIDC authentication feature, as well as details about how the team assignment works.

Co-authored-by: Daniel Herrmann <daniel.herrmann1@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2151
Reviewed-by: konrad <k@knt.li>
Co-authored-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
Co-committed-by: waza-ari <daniel.herrmann@makerspace-darmstadt.de>
2024-03-03 22:19:16 +00:00
kolaente ac8751e1be fix(task): move done tasks to the done bucket when they are moved between projects and the new project has a done bucket 2024-03-03 18:13:47 +01:00
kolaente f5b90517c4 fix(sentry): send unwrapped error to sentry instead of http error 2024-03-03 17:36:57 +01:00
kolaente fe27dd59ad feat(subscription): use a recursive cte to fetch subscriptions of parent projects
Testing this locally resulted in improved response times from ~50ms to ~20ms when creating a project. It looks like even though the code running these sql queries uses different go routines, they affect each other (caused by IO or context switching?)
2024-03-03 15:34:18 +01:00
kolaente 22933dac4a fix(project): typo in table name 2024-03-03 12:47:00 +01:00
kolaente fe02f4da2c fix(project): check for project nesting cycles with a single recursive cte instead of a loop 2024-03-03 11:40:43 +01:00
Frederick [Bot]andkolaente 4bb09b69be [skip ci] Updated swagger docs 2024-03-02 14:50:56 +00:00
kolaente 379b0b24b3 fix(auth): test assertion 2024-03-02 15:38:01 +01:00
kolaente 6db8728420 docs: add missing front matter 2024-03-02 15:34:59 +01:00
kolaente a34ca20c1a fix(teams): use the same color for border between teams in list 2024-03-02 15:31:54 +01:00
kolaente a4a0ea973a feat(auth): update team name in Vikunja when it was changed in the openid provider 2024-03-02 15:27:15 +01:00
kolaente fc4303a778 chore(auth): add oidc suffix to openid team name in db
Related to https://kolaente.dev/vikunja/vikunja/issues/2150
2024-03-02 15:23:19 +01:00
kolaente 4f1f96f1e9 chore(auth): refactor openid team creation 2024-03-02 15:22:37 +01:00
kolaente 10ff864e0c fix(projects): load projects only one when fetching subscriptions for a bunch of projects at once
This change ensures already loaded projects are passed down when fetching their subscription  instead of re-loading each project with a single sql statement. When loading all projects, this meant all projects were loaded twice, which was highly inefficient. This roughly added 25ms to each request, assuming the per page limit was maxed out at 50 projects.

Empirical testing shows this change reduces load times by ~20ms. Because the request is already pretty fast, this is ~30% of the overall request time, making the loading of projects now even faster
2024-03-02 14:27:11 +01:00
kolaente 89b01e86bc fix(projects): load all projects when first opening Vikunja 2024-03-02 13:43:04 +01:00
kolaente a3932a0a19 fix(projects): return correct project pagination count 2024-03-02 13:30:34 +01:00
kolaente e42a605597 fix: add root ca to final docker image
Since Vikunja's docker image is now based on the scratch image, the root ca certificates are not included by default anymore. This meant Vikunja could not check if the certificate presented by a remote host was valid, thus failing the connection. This meant it was impossible to use features communicating with external hosts such as webhooks, openid auth or gravatar.
2024-03-02 11:48:14 +01:00
kolaente 67f55510bf feat: nest api token permissions under their parents
This change removes the "select all" first checkbox of api token permissions and replaces it with the title instead.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2148
2024-03-02 11:28:46 +01:00
kolaente 178cd8c392 fix: open external migration service in current tab 2024-03-02 11:22:03 +01:00
viehliebandkonrad ed4da96ab1 feat: assign users to teams via OIDC claims (#1393)
This change adds the ability to sync teams via a custom openid claim. Vikunja will automatically create and delete teams as necessary, it will also add and remove users when they log in. These teams are fully managed by Vikunja and cannot be updated by a user.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/1393
Resolves https://kolaente.dev/vikunja/vikunja/issues/1279
Resolves https://github.com/go-vikunja/vikunja/issues/42
Resolves https://kolaente.dev/vikunja/vikunja/issues/950
Co-authored-by: viehlieb <pf@pragma-shift.net>
Co-committed-by: viehlieb <pf@pragma-shift.net>
2024-03-02 08:47:10 +00:00
kolaente f18cde269b chore: remove unused docker entrypoint script 2024-03-01 11:47:29 +01:00
kolaente 09d446765d docs: update config docs 2024-03-01 11:47:29 +01:00
renovate a99e7f9aa3 fix(deps): update dependency express to v4.18.3 2024-02-29 12:05:06 +00:00
renovate e93e48c4c2 fix(deps): update vueuse to v10.9.0 2024-02-29 10:05:25 +00:00
renovate 06688fa8d4 fix(deps): update sentry-javascript monorepo to v7.103.0 2024-02-29 09:05:28 +00:00
renovateandkonrad 1a15c865e2 fix(deps): update module golang.org/x/crypto to v0.20.0 2024-02-29 08:18:30 +00:00
renovateandkonrad 7b9a72ebe1 fix(deps): update module github.com/prometheus/client_golang to v1.19.0 2024-02-29 08:15:51 +00:00
renovate a0f4bdbdad fix(deps): update dependency vue to v3.4.21 2024-02-28 22:06:03 +00:00
renovate eea356e570 chore(deps): update dev-dependencies 2024-02-28 18:05:31 +00:00
kolaente 5b70609ba7 fix: usage of limit and order by usage in recursive cte 2024-02-28 14:35:09 +01:00
kolaente 6b1e67485b feat: fetch all projects with a recursive cte instead of recursive query
This change modifies the fetching of all projects to use a recursive common table expression instead of recursively calling the method.
2024-02-28 13:42:45 +01:00
kolaente 5d127c2897 feat: run frontend tests with api build from the same branch (#2137)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2137
Co-authored-by: kolaente <k@knt.li>
Co-committed-by: kolaente <k@knt.li>
2024-02-27 18:06:34 +00:00
kolaente 1275dfc260 fix: lint 2024-02-27 16:38:20 +01:00
kolaente 997fb6bc54 fix(migration): show correct help message when a migration was started 2024-02-27 16:36:18 +01:00
kolaente b2e5de88ff fix(labels): make sure labels are aligned in the middle 2024-02-27 16:29:27 +01:00
kolaente baa5d14ca6 fix(assignees): spacing of users 2024-02-27 16:15:35 +01:00
kolaente 2d5c496397 fix(kanban): pass active filters down to task lazy loading
Before this change, applying a filter and then scrolling a bucket would not use that filter when lazy loading the tasks in that bucket. That resulted in all tasks being loaded, regardless if the filter applied to them.
2024-02-27 16:10:19 +01:00
kolaente b8533d2bfc fix(gantt): use color variables for gantt header so that it works in dark mode 2024-02-27 15:55:07 +01:00
kolaente 8a82093233 fix(project): don't allow archival or deletion of default projects in UI 2024-02-27 15:37:30 +01:00
kolaente 3d39fc3960 fix(ci): sign drone config 2024-02-26 10:56:21 +01:00
kolaente 43e13d9cdd fix(ci): run test db in memory 2024-02-26 10:54:53 +01:00
kolaente a0e812395f feat(docker)!: use scratch as base image
This change modifies the docker image so that it uses the scratch image instead of alpine. This is possible because the Vikunja binary is now entirely statically compiled, wich no dependencies on any system c libraries.

This also changes the default path for the sqlite file in the docker image (breaking). When using sqlite in docker, the VIKUNJA_DATABASE_PATH config variable or the file mount must be changed to prevent data loss.
2024-02-25 22:49:04 +01:00
kolaente 2e5c19352e docs: update publiccode.yml [skip ci] 2024-02-25 14:06:23 +01:00
kolaente 1ffb93b63c fix: clarify preview deployment text and fix typo 2024-02-25 13:51:43 +01:00
renovateandkonrad 1bf8659423 fix(deps): update sentry-javascript monorepo to v7.102.1 2024-02-24 14:43:38 +00:00
renovate 7629c8426e chore(deps): update pnpm to v8.15.4 2024-02-24 14:05:08 +00:00
renovate a83acc0300 fix(deps): update tiptap to v2.2.4 2024-02-23 13:06:11 +00:00
kolaente 837360f122 chore: add publiccode.yml 2024-02-22 10:04:50 +01:00
renovate 34c31e2f03 fix(deps): update dependency vue-router to v4.3.0 2024-02-21 18:06:09 +00:00
renovateandkonrad 829f504d3b fix(deps): update dependency dompurify to v3.0.9 2024-02-21 10:04:30 +00:00
renovate 899bc67853 chore(deps): update dependency electron to v29 2024-02-21 00:06:09 +00:00
renovate b419df3156 fix(deps): update module github.com/redis/go-redis/v9 to v9.5.1 2024-02-20 16:06:59 +00:00
renovateandkonrad 52d0930034 fix(deps): update sentry-javascript monorepo to v7.102.0 2024-02-20 14:41:55 +00:00
renovate 318f00d252 fix(deps): update vueuse to v10.8.0 2024-02-20 12:06:28 +00:00
kolaente 4d11dd0383 docs: mention how to support the project in readme 2024-02-19 23:16:22 +01:00
kolaente e40a0043d4 fix(migration): do not halt the whole migration when copying a background file failed 2024-02-19 19:21:06 +01:00
kolaente e532979101 docs: clarify public url usage in installation 2024-02-19 19:04:16 +01:00
renovate 503036abff fix(deps): update module github.com/redis/go-redis/v9 to v9.5.0 2024-02-18 18:05:57 +00:00
renovateandkonrad 70265e176a fix(deps): update tiptap to v2.2.3 2024-02-18 11:16:39 +00:00
renovateandkonrad 68873e1d0d fix(deps): update module github.com/go-testfixtures/testfixtures/v3 to v3.10.0 2024-02-18 11:16:11 +00:00
renovate be66ec8608 fix(deps): update dependency @kyvg/vue3-notification to v3.2.0 2024-02-18 09:06:16 +00:00
renovateandkonrad 814c142b71 fix(deps): update sentry-javascript monorepo to v7.101.1 2024-02-18 08:28:03 +00:00
renovate ea75657d45 fix(deps): update dependency vue-flatpickr-component to v11.0.4 2024-02-18 08:06:08 +00:00
kolaente ff1730e323 fix: lint 2024-02-17 23:25:09 +01:00
kolaente f120d72211 fix(editor): revert task list dependence on ids
This partially reverts 3969f6ae66. Adding ids to task list items is not as simple and actually made it worse in some cases. Hence we stick to comparing the content of nodes for now, until this is properly fixed in tiptap.

Related https://kolaente.dev/vikunja/vikunja/issues/2091#issuecomment-60063
2024-02-17 23:13:51 +01:00
renovateandkonrad a2951570a7 fix(deps): update module github.com/arran4/golang-ical to v0.2.6 2024-02-17 20:08:08 +00:00
kolaente f4efdaa5de fix(password): don't validate password min length on login page
This would cause the login to fail when the actual password was shorter than 8 characters.
2024-02-17 21:07:35 +01:00
kolaente 32edef2d38 fix(editor): set default id of tasklist items
This fixes a bug where all tasklist items would have the same id which would check all of them when checking one of them.
2024-02-17 11:38:20 +01:00
renovate 44c1f0d281 chore(deps): update pnpm to v8.15.3 2024-02-15 11:07:31 +00:00
kolaente 2dab2ccedd feat: allow using sqlite in memory database
This allows running vikunja for testing purposes. You almost never want to run this in production.
2024-02-15 10:48:48 +01:00
kolaente 827c43fe12 chore(magefile): add aliases for lint 2024-02-14 15:05:11 +01:00
kolaente 415c6380a5 feat(api tokens): add task attachment to api scopes
This explicitly adds download and upload of task attachments. Because these are not handled with the usual CRUDables, they were not picked up automatically.

Resolves https://github.com/go-vikunja/vikunja/issues/112
2024-02-14 15:00:16 +01:00
renovateandkonrad ebe25ee2d7 fix(deps): update module github.com/arran4/golang-ical to v0.2.5 2024-02-14 13:35:06 +00:00
kolaente cc5f48eb74 fix: lint 2024-02-14 14:13:17 +01:00
kolaente 3969f6ae66 fix(editor): ensure task list clicks are only fired once
Before this fix, clicking on a task list item with the same name as another one, both would get marked as done. This was due to the mechanism which walks the dom tree to look for the node to update used its content for comparison. To prevent this, this fix first added unique ids to all task list items and then compared the nodes based on their id instead of the content.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2091
2024-02-14 14:13:03 +01:00
kolaente 5ab720d709 docs: remove outdated information 2024-02-14 10:21:51 +01:00
kolaente 7ae38c5ac1 docs: fix postgres example healthcheck 2024-02-14 10:21:27 +01:00
kolaente 162741e940 fix: lint 2024-02-13 22:24:46 +01:00
kolaente 205f330f8a fix(migration): make sure to correctly check if a migration was already running
This change fixes a bug where Vikunja would not correctly check if a migration was already running. That meant it was not possible for users who had never before migrated anything to start a migration, because Vikunja assumed they already had a migration running for them.
This state was neither properly reflected in the frontend, which is now fixed as well.
2024-02-13 22:21:59 +01:00
kolaente a12c169ce8 fix: do not send etag when serving the frontend index file
Without this change, the browser may serve an outdated index.html file which usually does not work, showing the user only a blank page.
2024-02-13 21:32:41 +01:00
kolaente 2facbae0d7 fix(dump): only allow imports from the same version they were dumped on
Previously, Vikunja would allow imports from any version which then caused problems since the table structure might have changed between releases. This change now checks if the current version is the same as the one the dump was created on.
2024-02-13 21:25:31 +01:00
kolaente 77a779acea fix(dump): do not export files which do not exist in storage 2024-02-13 21:14:31 +01:00
kolaente 89e349f2fd docs: fix database healthcheck command 2024-02-13 20:38:53 +01:00
renovate 77feae47d6 fix(deps): update sentry-javascript monorepo to v7.101.0 2024-02-13 15:05:51 +00:00
renovate 2fb263a109 fix(deps): update dependency vue to v3.4.19 2024-02-13 11:06:25 +00:00
kolaente 641fec1215 fix: never return frontend on routes starting with /api
This fixes a problem where Vikunja would sometimes return the html for the frontend when accessing an api route for a nonexistent ressource, because the static handler was the next best.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2110
2024-02-13 10:05:15 +01:00
kolaente 18374c2e52 docs: fix healthcheck and mariadb password 2024-02-13 09:55:12 +01:00
renovateandkonrad 9921551f96 chore(deps): update pnpm to v8.15.2 2024-02-13 08:24:39 +00:00
renovate b26c359ce6 chore(deps): update dev-dependencies to v7 2024-02-13 00:06:22 +00:00
kolaente d7d3ffeebd feat(navigation): persist project open state in navigation
With this change, the project's collapsed open/closed state in the navigation survives a browser reload. Previously, all state would be lost after reloading.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2067
2024-02-12 22:22:55 +01:00
kolaente 0b61885e89 fix(tasks): correctly show different project in related tasks 2024-02-12 22:05:33 +01:00
kolaente 8d5cb335bd fix(tasks): sort done tasks last in relations
When adding a new task relation, the task search input would previously show all tasks in a seemingly random order, including done tasks. Usually, you don't care about these done tasks when adding relations. This change modifies the sort order so that done tasks show up last in the search results.
2024-02-12 22:00:33 +01:00
kolaente 71e62541a1 fix(ci): escape bash script for drone variable substitution 2024-02-12 21:56:25 +01:00
kolaente ee065d9238 feat(tasks): make done at column available for selection in table view
This change adds the done at column of tasks to the table view. It also ensures it is possible to sort the tasks by that column.

https://community.vikunja.io/t/is-it-possible-to-list-done-tasks-with-their-completion-date/1922
2024-02-12 17:56:24 +01:00
kolaente 28ed754c66 fix(ci): correctly set shell for rename command
It looks like Drone executes all commands with sh, even if the default shell of the container is something else. Because sh does not have support for whitespaces in string extrapolation, the rename command would fail. This change always specifies bash as the shell.
2024-02-12 17:37:20 +01:00
kolaente 390f71b0c6 feat(registration): improve username and password validation
Username and password are validated in the api for length and whitespaces. Previously, the api would tell the user "hey you got it wrong" but the error was not reflected properly in the UI. This change implements a client-side validation which mirrors the one from the api, allowing instant validation and better error UX.
2024-02-12 17:32:24 +01:00
kolaente 8c6d98bb02 feat(kanban): debounce bucket limit setting 2024-02-12 17:05:48 +01:00
kolaente ef30868514 fix(ci): use correct docker image for desktop rename 2024-02-12 16:39:05 +01:00
kolaente 75eb878e33 fix(ci): use correct docker image 2024-02-12 14:24:51 +01:00
kolaente 1ab6fef70a fix(metrics): typo 2024-02-12 14:23:16 +01:00
kolaente 6defc4cba2 fix(ci): use correct docker image for frontend testing 2024-02-11 18:46:46 +01:00
kolaente 3abdf2ccdd feat(ci): automatically create a gitea release when tagging 2024-02-11 18:45:15 +01:00
kolaente 001268a33e docs: add healthcheck to docker compose examples 2024-02-11 18:39:53 +01:00
kolaente 3129051a9c fix(ci): enable cors for api testing 2024-02-11 18:19:57 +01:00
kolaente 45c97a456d feat(ci): rename unstable desktop packages 2024-02-11 17:02:37 +01:00
kolaente 1255bdc4ab docs: add desktop packages 2024-02-11 16:54:53 +01:00
kolaente 99856b2031 docs: add missing traefik label 2024-02-11 15:57:22 +01:00
kolaente eec53e8a54 docs: mention installation of rpm packages 2024-02-11 15:56:34 +01:00
kolaente d4a389279c chore: don't send http errors with a status < 500 to sentry 2024-02-11 15:29:27 +01:00
renovateandkonrad 3a65324a7d fix(deps): update tiptap to v2.2.2 2024-02-11 09:37:38 +00:00
renovateandkonrad bec11d42fc fix(deps): update module golang.org/x/oauth2 to v0.17.0 2024-02-11 09:36:08 +00:00
renovate d2eeac2dbe fix(deps): pin dependencies 2024-02-11 09:05:38 +00:00
renovateandkonrad 05e7468135 fix(deps): update module xorm.io/xorm to v1.3.8 2024-02-11 08:34:26 +00:00
renovateandkonrad 4babe72f24 fix(deps): update module github.com/getsentry/sentry-go to v0.27.0 2024-02-11 08:34:04 +00:00
renovateandkonrad e9fe927644 fix(deps): update module golang.org/x/sys to v0.17.0 2024-02-11 08:33:24 +00:00
renovate 7cefb86a78 fix(deps): update dependency vue to v3.4.18 2024-02-11 08:05:32 +00:00
603 changed files with 46504 additions and 27343 deletions
+1
View File
@@ -1,6 +1,7 @@
files/
dist/
logs/
docs/
Dockerfile
docker-manifest.tmpl
+113 -121
View File
@@ -1,7 +1,12 @@
---
kind: pipeline
type: docker
name: build-and-test-api
name: build-and-test
trigger:
event:
exclude:
- cron
workspace:
base: /go
@@ -122,7 +127,7 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: build
- name: api-build
image: vikunja/golang-build:latest
pull: always
environment:
@@ -133,8 +138,8 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: lint
image: golangci/golangci-lint:v1.55.2
- name: api-lint
image: golangci/golangci-lint:v1.61.0
pull: always
environment:
GOPROXY: 'https://goproxy.kolaente.de'
@@ -156,7 +161,9 @@ steps:
- name: test-migration-sqlite
image: vikunja/golang-build:latest
pull: always
depends_on: [ test-migration-prepare, build ]
depends_on:
- test-migration-prepare
- api-build
environment:
VIKUNJA_DATABASE_TYPE: sqlite
VIKUNJA_DATABASE_PATH: /db/vikunja-migration-test.db
@@ -175,7 +182,9 @@ steps:
- name: test-migration-mysql
image: vikunja/golang-build:latest
pull: always
depends_on: [ test-migration-prepare, build ]
depends_on:
- test-migration-prepare
- api-build
environment:
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_HOST: test-mysql-migration
@@ -194,7 +203,9 @@ steps:
- name: test-migration-psql
image: vikunja/golang-build:latest
pull: always
depends_on: [ test-migration-prepare, build ]
depends_on:
- test-migration-prepare
- api-build
environment:
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: test-postgres-migration
@@ -211,7 +222,7 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: test
- name: api-test-unit
image: vikunja/golang-build:latest
pull: always
environment:
@@ -222,7 +233,7 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: test-sqlite
- name: api-test-unit-sqlite
image: vikunja/golang-build:latest
pull: always
environment:
@@ -239,7 +250,7 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: test-mysql
- name: api-test-unit-mysql
image: vikunja/golang-build:latest
pull: always
environment:
@@ -256,7 +267,7 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: test-postgres
- name: api-test-unit-postgres
image: vikunja/golang-build:latest
pull: always
environment:
@@ -337,31 +348,23 @@ steps:
when:
event: [ push, tag, pull_request ]
---
kind: pipeline
type: docker
name: build-and-test-frontend
trigger:
branch:
include:
- main
event:
include:
- push
- pull_request
services:
- name: api
image: vikunja/api:unstable
- name: test-api-run
image: vikunja/golang-build:latest
pull: always
environment:
VIKUNJA_SERVICE_TESTINGTOKEN: averyLongSecretToSe33dtheDB
VIKUNJA_LOG_LEVEL: DEBUG
VIKUNJA_CORS_ENABLE: 1
VIKUNJA_DATABASE_PATH: memory
VIKUNJA_DATABASE_TYPE: sqlite
commands:
- ./vikunja
detach: true
depends_on:
- api-build
steps:
- name: dependencies
image: node:20.11.0-alpine
- name: frontend-dependencies
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -374,8 +377,8 @@ steps:
# depends_on:
# - restore-cache
- name: lint
image: node:20.11.0-alpine
- name: frontend-lint
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -384,33 +387,33 @@ steps:
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm run lint
depends_on:
- dependencies
- frontend-dependencies
- name: build-prod
image: node:20.11.0-alpine
- name: frontend-build-prod
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
commands:
- cd frontend
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm run build
- pnpm run build:test
depends_on:
- dependencies
- frontend-dependencies
- name: test-unit
image: node:20.11.0-alpine
- name: frontend-test-unit
image: node:20.16.0-alpine
pull: always
commands:
- cd frontend
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm run test:unit
depends_on:
- dependencies
- frontend-dependencies
- name: typecheck
- name: frontend-typecheck
failure: ignore
image: node:20.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -419,13 +422,13 @@ steps:
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm run typecheck
depends_on:
- dependencies
- frontend-dependencies
- name: test-frontend
- name: frontend-test
image: cypress/browsers:node18.12.0-chrome107
pull: always
environment:
CYPRESS_API_URL: http://api:3456/api/v1
CYPRESS_API_URL: http://test-api-run:3456/api/v1
CYPRESS_TEST_SECRET: averyLongSecretToSe33dtheDB
PNPM_CACHE_FOLDER: .cache/pnpm
CYPRESS_CACHE_FOLDER: .cache/cypress
@@ -434,14 +437,15 @@ steps:
from_secret: cypress_project_key
commands:
- cd frontend
- sed -i 's/localhost/api/g' dist/index.html
- sed -i 's/localhost/test-api-run/g' dist-test/index.html
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm cypress install
- pnpm run test:e2e-record
- pnpm run test:e2e-record-test
depends_on:
- build-prod
- frontend-build-prod
- test-api-run
- name: deploy-preview
- name: frontend-deploy-preview
image: williamjackson/netlify-cli
pull: always
user: root # The rest runs as root and thus the permissions wouldn't work
@@ -454,16 +458,15 @@ steps:
from_secret: gitea_token
commands:
- cd frontend
- cp -r dist dist-preview
- cp -r dist-test dist-preview
# Override the default api url used for preview
- sed -i 's|http://localhost:3456|https://try.vikunja.io|g' dist-preview/index.html
- apk add --no-cache perl-utils
# create via:
# `shasum -a 384 ./scripts/deploy-preview-netlify.mjs > ./scripts/deploy-preview-netlify.mjs.sha384`
- shasum -a 384 -c ./scripts/deploy-preview-netlify.mjs.sha384
- node ./scripts/deploy-preview-netlify.mjs
depends_on:
- build-prod
- frontend-build-prod
when:
event:
include:
@@ -475,7 +478,7 @@ type: docker
name: generate-swagger-docs
depends_on:
- build-and-test-api
- build-and-test
workspace:
base: /go
@@ -519,8 +522,7 @@ type: docker
name: release
depends_on:
- build-and-test-api
- build-and-test-frontend
- build-and-test
workspace:
base: /source
@@ -530,6 +532,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
steps:
# Needed to get the versions right as they depend on tags
@@ -539,7 +544,7 @@ steps:
- git fetch --tags
- name: frontend-dependencies
image: node:20.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -551,7 +556,7 @@ steps:
- pnpm install --fetch-timeout 100000
- name: frontend-build
image: node:20.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -711,7 +716,7 @@ steps:
# Build os packages and push it to our bucket
- name: build-os-packages-unstable
image: goreleaser/nfpm:v2.35.3
image: goreleaser/nfpm:v2.40.0
pull: always
commands:
- apk add git go
@@ -727,7 +732,7 @@ steps:
depends_on: [ after-build-compress ]
- name: build-os-packages-version
image: goreleaser/nfpm:v2.35.3
image: goreleaser/nfpm:v2.40.0
pull: always
commands:
- apk add git go
@@ -783,6 +788,20 @@ steps:
- tag
depends_on: [ build-os-packages-version ]
- name: gitea-release
image: plugins/gitea-release
pull: true
settings:
api_key:
from_secret: gitea_token
base_url: https://kolaente.dev
files: dist/zip/*
prerelease: true
title: ${DRONE_TAG##v}
when:
event:
- tag
depends_on: [ sign-release ]
---
kind: pipeline
@@ -790,13 +809,15 @@ type: docker
name: docker-release
depends_on:
- build-and-test-api
- build-and-test-frontend
- build-and-test
trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
steps:
- name: fetch-tags
@@ -865,7 +886,7 @@ type: docker
name: frontend-release-unstable
depends_on:
- build-and-test-frontend
- build-and-test
trigger:
branch:
@@ -880,7 +901,7 @@ steps:
- git fetch --tags
- name: build
image: node:20.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -928,7 +949,7 @@ type: docker
name: frontend-release-version
depends_on:
- build-and-test-frontend
- build-and-test
trigger:
event:
@@ -941,7 +962,7 @@ steps:
- git fetch --tags
- name: build
image: node:20.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -1099,7 +1120,7 @@ steps:
- sed -i 's/\\/api\\/v1//g' frontend/index.html
- ./bumpp.sh
- yarn install
- yarn dist --linux --windows
- yarn dist --linux zip
# - name: rebuild-cache
# image: meltwater/drone-cache:dev
@@ -1134,6 +1155,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
steps:
- name: fetch-tags
@@ -1199,8 +1223,21 @@ steps:
# - '.cache'
# depends_on:
# - build
- name: rename-unstable
image: bash
pull: true
commands:
- cd desktop/dist
- bash -c 'for file in Vikunja*; do suffix=".$${file##*.}"; if [[ ! -d $file ]]; then mv "$file" "Vikunja-Desktop-unstable$${suffix}"; fi; done'
depends_on:
- build
when:
event:
exclude:
- tag
- name: release-latest
- name: release-unstable
image: plugins/s3
pull: true
settings:
@@ -1213,13 +1250,14 @@ steps:
region: fr-par
path_style: true
strip_prefix: desktop/dist/
source: desktop/dist/*
source: desktop/dist/Vikunja-Desktop*
target: /desktop/unstable/
when:
event:
exclude:
- tag
depends_on: [ build ]
depends_on:
- rename-unstable
- name: release-version
image: plugins/s3
@@ -1279,53 +1317,6 @@ steps:
# - mc cp ./dist/*.dmg scw-fr-par/vikunja-releases/desktop/$VERSION/
# - mc cp ./dist/*.dmg.blockmap scw-fr-par/vikunja-releases/desktop/$VERSION/
---
kind: pipeline
type: docker
name: deploy-docs
workspace:
base: /go
path: src/code.vikunja.io/api
clone:
depth: 50
trigger:
event:
- push
branch:
- main
steps:
- name: theme
image: kolaente/toolbox
pull: always
commands:
- mkdir docs/themes/vikunja -p
- cd docs/themes/vikunja
- wget https://dl.vikunja.io/theme/vikunja-theme.tar.gz
- tar -xzf vikunja-theme.tar.gz
- name: build
image: klakegg/hugo:0.111.3
pull: always
commands:
- cd docs
- hugo
- mv public/docs/* public # Hugo seems to be not capable of setting a different theme for a home page, so we do this ugly hack to fix it.
- name: docker
image: plugins/docker
pull: always
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: vikunja/docs
context: docs/
dockerfile: docs/Dockerfile
---
kind: pipeline
type: docker
@@ -1335,12 +1326,13 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
depends_on:
- build-and-test-api
- build-and-test-frontend
- build-and-test
- release
- deploy-docs
- docker-release
- desktop-release
@@ -1360,6 +1352,6 @@ steps:
- failure
---
kind: signature
hmac: 128214182f90834702da16ed7b0f1dec09dc61bbbe7f293aea7cb6c46e7edae2
hmac: eff6e40dc763fa1395078daaabcbef2aaa74fe0a36818a87e89015dbc4e9dae4
...
+3
View File
@@ -0,0 +1,3 @@
source_url "https://raw.githubusercontent.com/cachix/devenv/95f329d49a8a5289d31e0982652f7058a189bfca/direnvrc" "sha256-d+8cBpDfDBj41inrADaJt+bDWhOktwslgoP5YiGJ1v0="
use devenv
+11
View File
@@ -28,3 +28,14 @@ vendor/
os-packages/
mage_output_file.go
mage-static
.DS_Store
# Devenv
.devenv*
devenv.local.nix
# direnv
.direnv
# pre-commit
.pre-commit-config.yaml
+27 -7
View File
@@ -4,20 +4,22 @@ run:
linters:
enable:
- megacheck
- gosimple
- staticcheck
- unused
- govet
- gocritic
- gocyclo
- goerr113
- err113
- goheader
- gofmt
- goimports
- revive
- misspell
disable:
- scopelint # Obsolete, using exportloopref instead
- durationcheck
- goconst
- musttag
presets:
- bugs
- unused
@@ -54,7 +56,7 @@ issues:
- path: pkg/migration/*
linters:
- exhaustive
- goerr113
- err113
- path: pkg/models/task_collection_filter\.go
linters:
- exhaustive
@@ -64,11 +66,11 @@ issues:
- gosec
- path: pkg/modules/dump/*
linters:
- goerr113
- err113
- path: pkg/
text: "err113: do not define dynamic errors, use wrapped static errors instead:"
text: "do not define dynamic errors, use wrapped static errors instead:"
linters:
- goerr113
- err113
- text: "commentFormatting: put a space between `//` and comment text"
linters:
- gocritic
@@ -99,3 +101,21 @@ issues:
- path: pkg/modules/migration/ticktick/ticktick_test.go
linters:
- testifylint
- path: pkg/migration/*
text: "parameter 'tx' seems to be unused, consider removing or renaming it as"
linters:
- revive
- path: pkg/models/typesense.go
text: 'structtag: struct field Position repeats json tag "position" also at'
linters:
- govet
- path: pkg/cmd/user.go
text: 'G115: integer overflow conversion uintptr -> int'
linters:
- gosec
- text: 'G115: integer overflow conversion int64 -> uint64'
linters:
- gosec
- text: 'G115: integer overflow conversion int -> uint64'
linters:
- gosec
+13 -12
View File
@@ -1,14 +1,15 @@
{
"recommendations": [
"codezombiech.gitignore",
"dbaeumer.vscode-eslint",
"editorconfig.editorconfig",
"vue.volar",
"vue.vscode-typescript-vue-plugin",
"lokalise.i18n-ally",
"mgmcdermott.vscode-language-babel",
"mikestead.dotenv",
"Syler.sass-indented",
"zixuanchen.vitest-explorer"
]
"recommendations": [
"codezombiech.gitignore",
"dbaeumer.vscode-eslint",
"editorconfig.editorconfig",
"vue.volar",
"lokalise.i18n-ally",
"mgmcdermott.vscode-language-babel",
"mikestead.dotenv",
"Syler.sass-indented",
"vitest.explorer",
"mkhl.direnv",
"golang.Go"
]
}
+3 -6
View File
@@ -2,10 +2,9 @@
"go.testEnvVars": {
"VIKUNJA_SERVICE_ROOTPATH": "${workspaceRoot}"
},
"eslint.packageManager": "pnpm",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll": true
"source.fixAll": "explicit"
},
"eslint.format.enable": true,
"[javascript]": {
@@ -22,14 +21,12 @@
"vue"
],
"volar.completion.preferredTagNameCase": "pascal",
// disable vetur in case it is installed
// disable vetur in case it's installed
"vetur.validation.template": false,
// i18n ally
"i18n-ally.localesPaths": [
"src/i18n/lang"
"frontend/src/i18n/lang"
],
"i18n-ally.sortKeys": true,
"i18n-ally.keepFulfilled": true,
+1380 -1
View File
File diff suppressed because it is too large Load Diff
+10 -16
View File
@@ -1,10 +1,11 @@
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM node:20.11.0-alpine AS frontendbuilder
FROM --platform=$BUILDPLATFORM node:20.16.0-alpine AS frontendbuilder
WORKDIR /build
ENV PNPM_CACHE_FOLDER .cache/pnpm/
ENV PUPPETEER_SKIP_DOWNLOAD true
ENV PNPM_CACHE_FOLDER=.cache/pnpm/
ENV PUPPETEER_SKIP_DOWNLOAD=true
ENV CYPRESS_INSTALL_BINARY=0
COPY frontend/ ./
@@ -23,7 +24,7 @@ COPY --from=frontendbuilder /build/dist ./frontend/dist
ARG TARGETOS TARGETARCH TARGETVARIANT
ENV GOPROXY https://goproxy.kolaente.de
ENV GOPROXY=https://goproxy.kolaente.de
RUN export PATH=$PATH:$GOPATH/bin && \
mage build:clean && \
mage release:xgo "${TARGETOS}/${TARGETARCH}/${TARGETVARIANT}"
@@ -33,22 +34,15 @@ RUN export PATH=$PATH:$GOPATH/bin && \
# ┘└┘┘─┘┘└┘┘└┘┴─┘┘└┘
# The actual image
# Note: I wanted to use the scratch image here, but unfortunatly the go-sqlite bindings require cgo and
# because of this, the container would not start when I compiled the image without cgo.
FROM alpine:3.19 AS runner
FROM scratch
LABEL maintainer="maintainers@vikunja.io"
WORKDIR /app/vikunja
ENTRYPOINT [ "/sbin/tini", "-g", "--", "/entrypoint.sh" ]
ENTRYPOINT [ "/app/vikunja/vikunja" ]
EXPOSE 3456
USER 1000
ENV VIKUNJA_SERVICE_ROOTPATH=/app/vikunja/
ENV PUID 1000
ENV PGID 1000
RUN apk --update --no-cache add tzdata tini shadow && \
addgroup vikunja && \
adduser -s /bin/sh -D -G vikunja vikunja -h /app/vikunja -H
COPY docker/entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh && mkdir files
ENV VIKUNJA_DATABASE_PATH=/db/vikunja.db
COPY --from=apibuilder /build/vikunja-* vikunja
COPY --from=apibuilder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
+5 -2
View File
@@ -2,7 +2,7 @@
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/vikunjaa/status.svg)](https://drone.kolaente.de/vikunja/vikunja)
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
[![Download](https://img.shields.io/badge/download-v0.23.0-brightgreen.svg)](https://dl.vikunja.io)
[![Install](https://img.shields.io/badge/download-v0.24.4,brightgreen.svg)](https://vikunja.io/docs/installing)
[![Docker Pulls](https://img.shields.io/docker/pulls/vikunja/vikunja.svg)](https://hub.docker.com/r/vikunja/vikunja/)
[![Swagger Docs](https://img.shields.io/badge/swagger-docs-brightgreen.svg)](https://try.vikunja.io/api/v1/docs)
[![Go Report Card](https://goreportcard.com/badge/kolaente.dev/vikunja/vikunja)](https://goreportcard.com/report/kolaente.dev/vikunja/vikunja)
@@ -11,6 +11,9 @@
> The Todo-app to organize your life.
If Vikunja is useful to you, please consider [buying me a coffee](https://www.buymeacoffee.com/kolaente), [sponsoring me on GitHub](https://github.com/sponsors/kolaente) or buying [a sticker pack](https://vikunja.cloud/stickers).
I'm also offering [a hosted version of Vikunja](https://vikunja.cloud/) if you want a hassle-free solution for yourself or your team.
# Table of contents
* [Security Reports](#security-reports)
@@ -26,7 +29,7 @@ If you find any security-related issues you don't want to disclose publicly, ple
## Features
See [the features page](https://vikunja.io/features/) on our website for a more exaustive list or
See [the features page](https://vikunja.io/features/) on our website for a more exhaustive list or
try it on [try.vikunja.io](https://try.vikunja.io)!
## Docs
+33 -27
View File
@@ -1,12 +1,12 @@
service:
# This token is used to verify issued JWT tokens.
# Default is a random token which will be generated at each startup of vikunja.
# (This means all already issued tokens will be invalid once you restart vikunja)
# Default is a random token which will be generated at each startup of Vikunja.
# (This means all already issued tokens will be invalid once you restart Vikunja)
JWTSecret: "<jwt-secret>"
# The duration of the issued JWT tokens in seconds.
# The default is 259200 seconds (3 Days).
jwtttl: 259200
# The duration of the "remember me" time in seconds. When the login request is made with
# The duration of the "remember me" time in seconds. When the login request is made with
# the long param set, the token returned will be valid for this period.
# The default is 2592000 seconds (30 Days).
jwtttllong: 2592000
@@ -45,10 +45,10 @@ service:
# each request made to this endpoint needs to provide an `Authorization: <token>` header with the token from below. <br/>
# **You should never use this unless you know exactly what you're doing**
testingtoken: ''
# If enabled, vikunja will send an email to everyone who is either assigned to a task or created it when a task reminder
# If enabled, Vikunja will send an email to everyone who is either assigned to a task or created it when a task reminder
# is due.
enableemailreminders: true
# If true, will allow users to request the complete deletion of their account. When using external authentication methods
# If true, will allow users to request the complete deletion of their account. When using external authentication methods
# it may be required to coordinate with them in order to delete the account. This setting will not affect the cli commands
# for user deletion.
enableuserdeletion: true
@@ -62,6 +62,9 @@ service:
allowiconchanges: true
# Allow using a custom logo via external URL.
customlogourl: ''
# Enables the public team feature. If enabled, it is possible to configure teams to be public, which makes them
# discoverable when sharing a project, therefore not only showing teams the user is member of.
enablepublicteams: false
sentry:
# If set to true, enables anonymous error tracking of api errors via Sentry. This allows us to gather more
@@ -76,7 +79,7 @@ sentry:
frontenddsn: "https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480"
database:
# Database type to use. Supported types are mysql, postgres and sqlite.
# Database type to use. Supported values are mysql, postgres and sqlite. Vikunja is able to run with MySQL 8.0+, Mariadb 10.2+, PostgreSQL 12+, and sqlite.
type: "sqlite"
# Database user which is used to connect to the database.
user: "vikunja"
@@ -109,7 +112,7 @@ database:
typesense:
# Whether to enable the Typesense integration. If true, all tasks will be synced to the configured Typesense
# instance and all search and filtering will run through Typesense instead of only through the database.
# Typesense allows fast fulltext search including fuzzy matching support. It may return different results than
# Typesense allows fast fulltext search including fuzzy matching support. It may return different results than
# what you'd get with a database-only search.
enabled: false
# The url to the Typesense instance you want to use. Can be hosted locally or in Typesense Cloud as long
@@ -153,7 +156,7 @@ mailer:
username: "user"
# SMTP password
password: ""
# Wether to skip verification of the tls certificate on the server
# Whether to skip verification of the tls certificate on the server
skiptlsverify: false
# The default from address when sending emails
fromemail: "mail@vikunja"
@@ -161,7 +164,7 @@ mailer:
queuelength: 100
# The timeout in seconds after which the current open connection to the mailserver will be closed.
queuetimeout: 30
# By default, vikunja will try to connect with starttls, use this option to force it to use ssl.
# By default, Vikunja will try to connect with starttls, use this option to force it to use ssl.
forcessl: false
log:
@@ -203,7 +206,7 @@ ratelimit:
# Possible values are "keyvalue", "memory" or "redis".
# When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section.
store: keyvalue
# The number of requests a user can make from the same IP to all unauthenticated routes (login, register,
# The number of requests a user can make from the same IP to all unauthenticated routes (login, register,
# password confirmation, email verification, password reset request) per minute. This limit cannot be disabled.
# You should only change this if you know what you're doing.
noauthlimit: 10
@@ -220,27 +223,28 @@ migration:
# Wheter to enable the todoist migrator or not
enable: false
# The client id, required for making requests to the todoist api
# You need to register your vikunja instance at https://developer.todoist.com/appconsole.html to get this
# You need to register your Vikunja instance at https://developer.todoist.com/appconsole.html to get this
clientid:
# The client secret, also required for making requests to the todoist api
clientsecret:
# The url where clients are redirected after they authorized Vikunja to access their todoist items.
# This needs to match the url you entered when registering your Vikunja instance at todoist.
# This is usually the frontend url where the frontend then makes a request to /migration/todoist/migrate
# The url where clients are redirected after they authorized Vikunja to access their Todoist items.
# In Todoist, this is called `OAuth redirect URL` and it needs to match the url you entered when registering
# your Vikunja instance at the Todoist developer console.
# When using the official Vikunja frontend, set this to <service.publicurl>/migrate/todoist.
# Otherwise, set this to an url which then makes a request to /api/v1/migration/todoist/migrate
# with the code obtained from the todoist api.
# Note that the vikunja frontend expects this to be /migrate/todoist
redirecturl: <frontend url>/migrate/todoist
redirecturl: <service.publicurl>/migrate/todoist
trello:
# Whether to enable the trello migrator or not
enable: false
# The client id, required for making requests to the trello api
# You need to register your vikunja instance at https://trello.com/app-key (log in before you visit that link) to get this
# You need to register your Vikunja instance at https://trello.com/app-key (log in before you visit that link) to get this
key:
# The url where clients are redirected after they authorized Vikunja to access their trello cards.
# This needs to match the url you entered when registering your Vikunja instance at trello.
# This is usually the frontend url where the frontend then makes a request to /migration/trello/migrate
# with the code obtained from the trello api.
# Note that the vikunja frontend expects this to end on /migrate/trello.
# Note that the Vikunja frontend expects this to end on /migrate/trello.
redirecturl: <frontend url>/migrate/trello
microsofttodo:
# Wheter to enable the microsoft todo migrator or not
@@ -255,7 +259,7 @@ migration:
# This needs to match the url you entered when registering your Vikunja instance at microsoft.
# This is usually the frontend url where the frontend then makes a request to /migration/microsoft-todo/migrate
# with the code obtained from the microsoft graph api.
# Note that the vikunja frontend expects this to be /migrate/microsoft-todo
# Note that the Vikunja frontend expects this to be /migrate/microsoft-todo
redirecturl: <frontend url>/migrate/microsoft-todo
avatar:
@@ -301,13 +305,11 @@ auth:
enabled: true
# OpenID configuration will allow users to authenticate through a third-party OpenID Connect compatible provider.<br/>
# The provider needs to support the `openid`, `profile` and `email` scopes.<br/>
# **Note:** Some openid providers (like gitlab) only make the email of the user available through openid claims if they have set it to be publicly visible.
# **Note:** Some openid providers (like Gitlab) only make the email of the user available through OpenID if they have set it to be publicly visible.
# If the email is not public in those cases, authenticating will fail.
# **Note 2:** The frontend expects to be redirected after authentication by the third party
# to <frontend-url>/auth/openid/<auth key>. Please make sure to configure the redirect url in your third party
# auth service accordingly if you're using the default vikunja frontend.
# The frontend will automatically provide the api with the redirect url, composed from the current url where it's hosted.
# If you want to use the desktop client with openid, make sure to allow redirects to `127.0.0.1`.
# +**Note 2:** The frontend expects the third party to redirect the user <frontend-url>/auth/openid/<auth key> after authentication. Please make sure to configure the redirect url in your third party auth service accordingly if you're using the default Vikunja frontend.
# The frontend will automatically provide the API with the redirect url, composed from the current url where it's hosted.
# If you want to use the desktop client with OpenID, make sure to allow redirects to `127.0.0.1`.
# Take a look at the [default config file](https://kolaente.dev/vikunja/vikunja/src/branch/main/config.yml.sample) for more information about how to configure openid authentication.
openid:
# Enable or disable OpenID Connect authentication
@@ -325,6 +327,10 @@ auth:
clientid:
# The client secret used to authenticate Vikunja at the OpenID Connect provider.
clientsecret:
# The scope necessary to use oidc.
# If you want to use the Feature to create and assign to Vikunja teams via oidc, you have to add the custom "vikunja_scope" and check [openid.md](https://vikunja.io/docs/openid/).
# e.g. scope: openid email profile vikunja_scope
scope: openid email profile
# Prometheus metrics endpoint
metrics:
@@ -363,8 +369,8 @@ defaultsettings:
webhooks:
# Whether to enable support for webhooks
enabled: true
# The timout in seconds until a webhook request fails when no response has been received.
timoutseconds: 30
# The timeout in seconds until a webhook request fails when no response has been received.
timeoutseconds: 30
# The URL of [a mole instance](https://github.com/frain-dev/mole) to use to proxy outgoing webhook requests. You should use this and configure appropriately if you're not the only one using your Vikunja instance. More info about why: https://webhooks.fyi/best-practices/webhook-providers#implement-security-on-egress-communication. Must be used in combination with `webhooks.password` (see below).
proxyurl:
# The proxy password to use when authenticating against the proxy.
-9
View File
@@ -1,9 +0,0 @@
{ pkgs ? import <nixpkgs> {}
}:
pkgs.mkShell {
name="electron-dev";
buildInputs = [
pkgs.electron
];
}
+4 -4
View File
@@ -51,11 +51,11 @@
}
},
"devDependencies": {
"electron": "28.2.2",
"electron-builder": "24.9.1"
"electron": "29.4.6",
"electron-builder": "24.13.3"
},
"dependencies": {
"connect-history-api-fallback": "^2.0.0",
"express": "^4.17.1"
"connect-history-api-fallback": "2.0.0",
"express": "4.21.0"
}
}
+2629
View File
File diff suppressed because it is too large Load Diff
-2022
View File
File diff suppressed because it is too large Load Diff
+139
View File
@@ -0,0 +1,139 @@
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1726063457,
"owner": "cachix",
"repo": "devenv",
"rev": "39bf6ce569103c9390d37322daa59468c31b3ce7",
"treeHash": "839747a1cb35ba6d5b36cce9a739ab2ba5e4a5d4",
"type": "github"
},
"original": {
"dir": "src/modules",
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"treeHash": "2addb7b71a20a25ea74feeaf5c2f6a6b30898ecb",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"pre-commit-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"treeHash": "ca14199cabdfe1a06a7b1654c76ed49100a689f9",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1716977621,
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "4267e705586473d3e5c8d50299e71503f16a6fb6",
"treeHash": "6d9f1f7ca0faf1bc2eeb397c78a49623260d3412",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1725930920,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "44a71ff39c182edaf25a7ace5c9454e7cba2c658",
"treeHash": "56e93544112b7bb7aa0c3093d537295683ef9148",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1725983898,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1355a0cbfeac61d785b7183c0caaec1f97361b43",
"treeHash": "d8ce0c1af7690da6161f0991484661331f5bc999",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1725513492,
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "7570de7b9b504cfe92025dd1be797bf546f66528",
"treeHash": "4b46d77870afecd8f642541cb4f4927326343b59",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"nixpkgs": "nixpkgs",
"nixpkgs-unstable": "nixpkgs-unstable",
"pre-commit-hooks": "pre-commit-hooks"
}
}
},
"root": "root",
"version": 7
}
+32
View File
@@ -0,0 +1,32 @@
{ pkgs, lib, config, inputs, ... }:
let
pkgs-unstable = import inputs.nixpkgs-unstable { system = pkgs.stdenv.system; };
in {
packages = with pkgs-unstable; [
# General tools
git-cliff
# API tools
golangci-lint mage
# Desktop
electron
] ++ lib.optionals (!pkgs.stdenv.isDarwin) [
# Frontend tools (exclude on Darwin)
cypress
];
languages = {
javascript = {
enable = true;
package = pkgs-unstable.nodejs-slim;
pnpm = {
enable = true;
package = pkgs-unstable.pnpm;
};
};
go = {
enable = true;
};
};
}
+17
View File
@@ -0,0 +1,17 @@
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling
nixpkgs-unstable:
url: github:NixOS/nixpkgs/nixos-unstable
# If you're using non-OSS software, you can set allowUnfree to true.
allowUnfree: true
# If you're willing to use a package that's vulnerable
# permittedInsecurePackages:
# - "openssl-1.1.1w"
# If you have more than one devenv you can merge them
#imports:
# - ./backend
-15
View File
@@ -1,15 +0,0 @@
#!/usr/bin/env sh
set -e
if [ -n "$PUID" ] && [ "$PUID" -ne 0 ] && \
[ -n "$PGID" ] && [ "$PGID" -ne 0 ] ; then
echo "info: creating the new user vikunja with $PUID:$PGID"
groupmod -g "$PGID" -o vikunja
usermod -u "$PUID" -o vikunja
chown -R vikunja:vikunja ./files/
chown vikunja:vikunja .
exec su vikunja -c /app/vikunja/vikunja "$@"
else
echo "info: creation of non-root user is skipped"
exec /app/vikunja/vikunja "$@"
fi
View File
-3
View File
@@ -1,3 +0,0 @@
FROM nginx
ADD public /usr/share/nginx/html/docs
ADD nginx.conf /etc/nginx/conf.d/default.conf
-63
View File
@@ -1,63 +0,0 @@
baseurl: https://vikunja.io/docs/
title: Vikunja
theme: vikunja
enableRobotsTXT: true
canonifyURLs: false
pygmentsUseClasses: true
permalinks:
post: /:year/:month/:title/
doc: /:slug/
page: /:slug/
default: /:slug/
params:
description: The to-do app to organize your life
author: The Vikunja Authors
website: https://vikunja.io
plausibleEnabled: true
plausibleDomain: vikunja.io
plausibleURL: https://analytics.kolaente.de
markup:
goldmark:
renderer:
unsafe: true
menu:
page:
- name: Home
url: https://vikunja.io/
weight: 10
- name: Features
url: https://vikunja.io/features
weight: 20
- name: Download
url: https://vikunja.io/download
weight: 30
- name: Blog
url: https://vikunja.io/blog/
weight: 35
- name: Docs
url: https://vikunja.io/docs
weight: 40
- name: Code
url: https://code.vikunja.io/
weight: 50
- name: Community
url: https://community.vikunja.io/
weight: 60
- name: Stickers
url: https://vikunja.cloud/stickers?utm_source=io&utm_medium=io&utm_campaign=menu
weight: 65
- name: Get it Hosted
url: https://vikunja.cloud/?utm_source=io&utm_medium=io&utm_campaign=menu
weight: 70
sidebar:
- name: setup
weight: 10
- name: usage
weight: 20
- name: development
weight: 30
-25
View File
@@ -1,25 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Docs"
draft: false
url: "/docs"
type: "doc"
weight: 10
---
# Documentation
This is the documentation for Vikunja.
You can find available articles in the menu on the left.
## About
To learn more about the what, why and how, take a look at [the features page](https://vikunja.io/en/features).
## Start
A good starting point if you want to install and host Vikunja on your server are [the install documentation]({{< ref "./setup/install.md">}})
and [available configuration options]({{< ref "./setup/config.md">}}).
## Developing
If you want to start contributing to Vikunja, take a look at [the development docs]({{< ref "./development/development.md">}}).
-34
View File
@@ -1,34 +0,0 @@
---
date: "2019-03-31:00:00+01:00"
title: "Cli Commands"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Adding new cli commands
All cli-related functions are located in `pkg/cmd`.
Each cli command usually calls a function in another package.
For example, the `vikunja migrate` command calls `migration.Migrate()`.
Vikunja uses the amazing [cobra](https://github.com/spf13/cobra) library for its cli.
Please refer to its documentation for information about how to use flags etc.
To add a new cli command, add something like the following:
```go
func init() {
rootCmd.AddCommand(myCmd)
}
var myCmd = &cobra.Command{
Use: "My-command",
Short: "A short description about your command.",
Run: func(cmd *cobra.Command, args []string) {
// Call other functions
},
}
```
-41
View File
@@ -1,41 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Configuration Options"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Configuration options
All configuration variables are declared in the `config` package.
It uses [viper](https://github.com/spf13/viper) under the hood to handle setting defaults and parsing config files.
Viper handles parsing all different configuration sources.
## Adding new config options
To make handling configuration parameters a bit easier, we introduced a `Key` string type in the `config` package which
you can call directly to get a config value.
To add a new config option, you should add a new key const to `pkg/config/config.go` and possibly a default value.
Default values should always enable the feature to work or turn it off completely if it always needs
additional configuration.
Make sure to also add the new config option to the default config file (`config.yml.sample` at the root of the repository)
with an explanatory comment to make sure it is well documented.
Then run `mage generate-docs` to generate the configuration docs from the sample file.
## Getting Configuration Values
To retrieve a configured value call the key with a getter for the type you need.
For example:
```go
if config.CacheEnabled.GetBool() {
// Do something with enabled caches
}
```
Take a look at the methods declared on the type to see what's available.
-33
View File
@@ -1,33 +0,0 @@
---
title: "Cron Tasks"
date: 2021-07-13T23:21:52+02:00
draft: false
menu:
sidebar:
parent: "development"
---
# How to add a cron job task
Cron jobs are tasks which run on a predefined schedule.
Vikunja uses these through a light wrapper package around the excellent [github.com/robfig/cron](https://github.com/robfig/cron) package.
The package exposes a `cron.Schedule` method with two arguments: The first one to define the schedule when the cron task should run, and the second one with the actual function to run at the schedule. You would then create a new function to register your the actual cron task in your package.
A basic function to register a cron task looks like this:
```go
func RegisterSomeCronTask() {
err := cron.Schedule("0 * * * *", func() {
// Do something every hour
}
}
```
Call the register method in the `FullInit()` method of the `init` package to actually register it.
## Schedule Syntax
The cron syntax uses the same on you may know from unix systems.
It is described in detail [here](https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format).
-38
View File
@@ -1,38 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Database"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Database
Vikunja uses [xorm](https://xorm.io/) as an abstraction layer to handle the database connection.
Please refer to [their](https://xorm.io/docs/) documentation on how to exactly use it.
{{< table_of_contents >}}
## Using the database
When using the common web handlers, you get an `xorm.Session` to do database manipulations.
In other packages, use the `db.NewSession()` method to get a new database session.
## Adding new database tables
To add a new table to the database, create the struct and [add a migration for it]({{< ref "db-migrations.md" >}}).
To learn more about how to configure your struct to create "good" tables, refer to [the xorm documentaion](https://xorm.io/docs/).
In most cases you will also need to implement the `TableName() string` method on the new struct to make sure the table name matches the rest of the tables - plural.
## Adding data to test fixtures
Adding data for test fixtures can be done via `yaml` files in `pkg/models/fixtures`.
The name of the yaml file should match the table name in the database.
Adding values to it is done via array definition inside it.
**Note**: Table and column names need to be in snake_case as that's what is used internally in the database and for mapping values from the database to xorm so your structs can use it.
@@ -1,78 +0,0 @@
---
date: "2019-03-29:00:00+02:00"
title: "Database Migrations"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Database Migrations
Vikunja runs all database migrations automatically on each start if needed.
Additionally, they can also be run directly by using the `migrate` command.
We use [xormigrate](https://github.com/techknowlogick/xormigrate) to handle migrations,
which is based on gormigrate.
{{< table_of_contents >}}
## Add a new migration
All migrations are stored in `pkg/migrations` and files should have the same name as their id.
Each migration should have a function to apply and roll it back, as well as a numeric id (the datetime)
and a more in-depth description of what the migration actually does.
To easily get a new id, run the following on any unix system:
```
date +%Y%m%d%H%M%S
```
New migrations should be added via the `init()` function to the `migrations` variable.
All migrations are sorted before being executed, since `init()` does not guarantee the order.
When you're adding a new struct, you also need to add it to the `models.GetTables()` function
to ensure it will be created on new installations.
### Generating a new migration stub
You can easily generate a pre-filled migration stub by running `mage dev:make-migration`.
It will ask you for a table name and generate an empty migration similar to the example shown below.
### Example
```go
package migration
import (
"github.com/go-xorm/xorm"
"src.techknowlogick.com/xormigrate"
)
// Used for rollback
type teamMembersMigration20190328074430 struct {
Updated int64 `xorm:"updated"`
}
func (teamMembersMigration20190328074430) TableName() string {
return "team_members"
}
func init() {
migrations = append(migrations, &xormigrate.Migration{
ID: "20190328074430",
Description: "Remove updated from team_members",
Migrate: func(tx *xorm.Engine) error {
return dropTableColum(tx, "team_members", "updated")
},
Rollback: func(tx *xorm.Engine) error {
return tx.Sync2(teamMembersMigration20190328074430{})
},
})
}
```
You should always copy the changed parts of the struct you're changing when adding migrations.
@@ -1,97 +0,0 @@
---
date: "2022-09-21:00:00+02:00"
title: "Development"
toc: true
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
name: "Development"
---
# Development
{{< table_of_contents >}}
## General
To contribute to Vikunja, fork the project and work on the main branch.
Once you feel like your changes are ready, open a PR in the respective repo [on our Gitea instance](https://kolaente.dev/vikunja).
We cannot accept PRs on mirror sites.
A maintainer will take a look and give you feedback. Once everyone is happy, the PR gets merged and released.
If you plan to do a bigger change, it is better to open an issue for discussion first.
The main repo is [`vikunja/vikunja`](https://kolaente.dev/vikunja/vikunja), it contains all code for the api, frontend and desktop applications.
## API
You'll need at least Go 1.21 to build Vikunja's api.
A lot of developing tasks are automated using a Magefile, so make sure to [take a look at it]({{< ref "mage.md">}}).
Make sure to check the other doc articles for specific development tasks like [testing]({{< ref "test.md">}}),
[database migrations]({{< ref "db-migrations.md" >}}) and the [project structure]({{< ref "structure.md" >}}).
## Frontend requirements
The code for the frontend is located in the `frontend` sub folder of the main repo.
More instructions can be found in the repo's README.
You need to have [pnpm](https://pnpm.io/) and Node.JS in version 20 or higher installed.
## Pull Requests
All Pull Requests must be made [on our Gitea instance](https://kolaente.dev/vikunja).
We cannot accept PRs on mirror sites.
Please try to make your pull request easy to review.
For that, please read the [*Best Practices for Faster Reviews*](https://github.com/kubernetes/community/blob/261cb0fd089b64002c91e8eddceebf032462ccd6/contributors/guide/pull-requests.md#best-practices-for-faster-reviews) guide.
It has lots of useful tips for any project you may want to contribute to.
Some of the key points:
- Make small pull requests.
The smaller, the faster to review and the more likely it will be merged soon.
- Don't make changes unrelated to your PR.
Maybe there are typos on some comments, maybe refactoring would be welcome on a function…
but if that is not related to your PR, please make *another* PR for that.
- Split big pull requests into multiple small ones.
An incremental change will be faster to review than a huge PR.
- Allow edits by maintainers. This way, the maintainers will take care of merging the PR later on instead of you.
### PR title and summary
In the PR title, describe the problem you are fixing, not how you are fixing it.
Use the first comment as a summary of your PR.
In the PR summary, you can describe exactly how you are fixing this problem.
Keep this summary up-to-date as the PR evolves.
If your PR changes the UI, you must add **after** screenshots in the PR summary.
If your PR closes an issue, you must note that in a way that both GitHub and Gitea understand, i.e. by appending a paragraph like
```text
Fixes/Closes/Resolves #<ISSUE_NR_X>.
Fixes/Closes/Resolves #<ISSUE_NR_Y>.
```
to your summary.
Each issue that will be closed must stand on a separate line.
If your PR is related to a discussion in the forum, you must add a link to the forum discussion.
### Git flow
The `main` branch is the latest and bleeding edge branch with all changes. Unstable releases are automatically created from this branch.
New Pull-Requests should be made against the `main` branch.
A release gets tagged from the main branch with the version name as tag name.
Backports and point-releases should go to a `release/version` branch, based on the tag they are building on top of.
## Conventional Commits
We're using [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) because they simplify generating release notes a lot.
It is not required to use them when creating a PR, but appreciated.
-72
View File
@@ -1,72 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Custom Errors"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Custom Errors
All custom errors are defined in `pkg/models/errors.go`.
You should add new ones in this file.
Custom errors usually have fields for the http return code, a [Vikunja-specific error code]({{< ref "../usage/errors.md">}})
and a human-readable error message about what went wrong.
An error consists of multiple functions and definitions:
```go
// This struct holds any information about this specific error.
// In this case, it contains the user ID of a nonexistent user.
// This type should always be a struct, even if it has no values in it.
// ErrUserDoesNotExist represents a "UserDoesNotExist" kind of error.
type ErrUserDoesNotExist struct {
UserID int64
}
// This function is mostly used in unit tests to check if a returned error is of that type.
// Every error type should have one of these.
// The name should always start with IsErr... followed by the name of the error.
// IsErrUserDoesNotExist checks if an error is a ErrUserDoesNotExist.
func IsErrUserDoesNotExist(err error) bool {
_, ok := err.(ErrUserDoesNotExist)
return ok
}
// This is the definition of the actual error type.
// Your error type is _required_ to implement this in order to be able to be returned as an "error" from functions.
func (err ErrUserDoesNotExist) Error() string {
return fmt.Sprintf("User does not exist [user id: %d]", err.UserID)
}
// This const holds the Vikunja error code used to be able to identify this error without having to
// rely on an error string.
// This needs to be unique, so you should check whether the error code exists or not.
// The general convention for error codes is as follows:
// * Every "group" errors lives in a thousend something. For example all user issues are 1000-something, all
// project errors are 3000-something and so on.
// * New error codes should be the current max error code + 1. Don't take free numbers to prevent old errors
// which are deprecated and removed from being "new ones". For example, if there are error codes 1001, 1002, 1004,
// a new error should be 1005 and not 1003.
// ErrCodeUserDoesNotExist holds the unique world-error code of this error
const ErrCodeUserDoesNotExist = 1005
// This is the implementation which returns an http error which is then passed to the client.
// Here you define the http status code with which one the error will be returned, the Vikunja error code and
// a human-readable error message.
// HTTPError holds the http error description
func (err ErrUserDoesNotExist) HTTPError() web.HTTPError {
return web.HTTPError{
HTTPCode: http.StatusNotFound,
Code: ErrCodeUserDoesNotExist,
Message: "The user does not exist.",
}
}
```
@@ -1,211 +0,0 @@
---
date: 2018-10-13T19:26:34+02:00
title: "Events and Listeners"
draft: false
menu:
sidebar:
parent: "development"
---
# Events and Listeners
Vikunja provides a simple observer pattern mechanism through events and listeners.
The basic principle of events is always the same: Something happens (=An event is fired) and something reacts to it (=A listener is called).
Vikunja supports this principle through the `events` package.
It is built upon the excellent [watermill](https://watermill.io) library.
Currently, it only supports dispatching events through Go Channels which makes it configuration-less.
More methods of dispatching events (like kafka or rabbitmq) are available in watermill and could be enabled with a PR.
This document explains how events and listeners work in Vikunja, how to use them and how to create new ones.
{{< table_of_contents >}}
## Events
### Definition
Each event has to implement this interface:
```go
type Event interface {
Name() string
}
```
An event can contain whatever data you need.
When an event is dispatched, all of the data it contains will be marshaled into json for dispatching.
You then get the event with all its data back in the listener, see below.
#### Naming Convention
Event names should roughly have the entity they're dealing with on the left and the action on the right of the name, separated by `.`.
There's no limit to how "deep" or specific an event name can be.
The name should have the most general concept it's describing at the left, getting more specific on the right of it.
#### Location
All events for a package should be declared in the `events.go` file of that package.
### Creating a New Event
The easiest way to create a new event is to generate it with mage:
```
mage dev:make-event <event-name> <package>
```
The function takes the name of the event as the first argument and the package where the event should be created as the second argument.
Events will be appended to the `pkg/<module>/events.go` file.
Both parameters are mandatory.
The event type name is automatically camel-cased and gets the `Event` suffix if the provided name does not already have one.
The event name is derived from the type name and stripped of the `.event` suffix.
The generated event will look something like the example below.
### Dispatching events
To dispatch an event, simply call the `events.Dispatch` method and pass in the event as parameter.
### Example
The `TaskCreatedEvent` is declared in the `pkg/models/events.go` file as follows:
```go
// TaskCreatedEvent represents an event where a task has been created
type TaskCreatedEvent struct {
Task *Task
Doer web.Auth
}
// Name defines the name for TaskCreatedEvent
func (t *TaskCreatedEvent) Name() string {
return "task.created"
}
```
It is dispatched in the `createTask` function of the `models` package:
```go
func createTask(s *xorm.Session, t *Task, a web.Auth, updateAssignees bool) (err error) {
// ...
err = events.Dispatch(&TaskCreatedEvent{
Task: t,
Doer: a,
})
// ...
}
```
As you can see, the current task and doer are injected into it.
### Special Events
#### `BootedEvent`
Once Vikunja is fully initialized, right before the api web server is started, this event is fired.
## Listeners
A listener is a piece of code that gets executed asynchronously when an event is dispatched.
A single event can have multiple listeners who are independent of each other.
### Definition
All listeners must implement this interface:
```go
// Listener represents something that listens to events
type Listener interface {
Handle(msg *message.Message) error
Name() string
}
```
The `Handle` method is executed when the event this listener listens on is dispatched.
* As the single parameter, it gets the payload of the event, which is the event struct when it was dispatched decoded as json object and passed as a slice of bytes.
To use it you'll need to unmarshal it. Unfortunately there's no way to pass an already populated event object to the function because we would not know what type it has when parsing it.
* If the handler returns an error, the listener is retried 5 times, with an exponential back-off period in between retries.
If it still fails after the fifth retry, the event is nack'd and it's up to the event dispatcher to resend it.
You can learn more about this mechanism in the [watermill documentation](https://watermill.io/docs/middlewares/#retry).
The `Name` method needs to return a unique listener name for this listener.
It should follow the same convention as event names, see above.
### Creating a New Listener
The easiest way to create a new listener for an event is with mage:
```
mage dev:make-listener <listener-name> <event-name> <package>
```
This will create a new listener type in the `pkg/<package>/listeners.go` file and implement the `Handle` and `Name` methods.
It will also pre-generate some boilerplate code to unmarshal the event from the payload.
Furthermore, it will register the listener for its event in the `RegisterListeners()` method of the same file.
This function is called at startup and has to contain all events you want to listen for.
### Listening for Events
To listen for an event, you need to register the listener for the event it should be called for.
This usually happens in the `RegisterListeners()` method in `pkg/<package>/listeners.go` which is called at start up.
The listener will never be executed if it hasn't been registered.
See the example below.
### Example
```go
// RegisterListeners registers all event listeners
func RegisterListeners() {
events.RegisterListener((&ListCreatedEvent{}).Name(), &IncreaseListCounter{})
}
// IncreaseTaskCounter represents a listener
type IncreaseTaskCounter struct {}
// Name defines the name for the IncreaseTaskCounter listener
func (s *IncreaseTaskCounter) Name() string {
return "task.counter.increase"
}
// Handle is executed when the event IncreaseTaskCounter listens on is fired
func (s *IncreaseTaskCounter) Handle(payload message.Payload) (err error) {
return keyvalue.IncrBy(metrics.TaskCountKey, 1)
}
```
## Testing
When testing, you should call the `events.Fake()` method in the `TestMain` function of the package you want to test.
This prevents any events from being fired and lets you assert an event has been dispatched like so:
```go
events.AssertDispatched(t, &TaskCreatedEvent{})
```
### Testing a listener
You can call an event listener manually with the `events.TestListener` method like so:
```go
ev := &TaskCommentCreatedEvent{
Task: &task,
Doer: u,
Comment: tc,
}
events.TestListener(t, ev, &SendTaskCommentNotification{})
```
This will call the listener's `Handle` method and assert it did not return an error when calling.
-33
View File
@@ -1,33 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "New API Endpoints"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Add a new api endpoint/feature
Most of the api endpoints/features of Vikunja are using the [common web handler](https://code.vikunja.io/web).
This is a library created by Vikunja in an effort to facilitate the creation of REST endpoints.
This works by abstracting the handling of CRUD-Requests, including rights check.
You can learn more about the web handler on [the project's repo](https://code.vikunja.io/web).
### Helper for pagination
Pagination limits can be calculated with a helper function, `getLimitFromPageIndex(pageIndex)`
(only available in the `models` package) from any page number.
It returns the `limit` (max-length) and `offset` parameters needed for SQL-Queries.
You can feed this function directly into xorm's `Limit`-Function like so:
```go
projects := []*Project{}
err := x.Limit(getLimitFromPageIndex(pageIndex, itemsPerPage)).Find(&projects)
```
// TODO: Add a full example from start to finish, like a tutorial on how to create a new endpoint?
-192
View File
@@ -1,192 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Magefile"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Mage
Vikunja uses [Mage](https://magefile.org/) to script common development tasks and even releasing.
Mage is a pure go solution which allows for greater flexibility and things like better parallelization.
This document explains what tasks are available and what they do.
{{< table_of_contents >}}
## Installation
To use mage, you'll need to install the mage cli.
To install it, run the following command:
```
go install github.com/magefile/mage
```
## Categories
There are multiple categories of subcommands in the magefile:
* `build`: Contains commands to build a single binary
* `check`: Contains commands to statically check the source code
* `release`: Contains commands to release Vikunja with everything that's required
* `test`: Contains commands to run all kinds of tests
* `dev`: Contains commands to run development tasks
* `misc`: Commands which do not belong in either of the other categories
## CI
These tasks are automatically run in our CI every time someone pushes to main or you update a pull request:
* `mage check:lint`
* `mage check:fmt`
* `mage check:ineffassign`
* `mage check:misspell`
* `mage check:goconst`
* `mage build:generate`
* `mage build:build`
## Build
### Build Vikunja
```
mage build:build
```
or
```
mage build
```
Builds a `vikunja`-binary in the root directory of the repo for the platform it is run on.
### clean
```
mage build:clean
```
Cleans all build and executable files
## Check
All check sub-commands exit with a status code of 1 if the check fails.
Various code-checks are available:
* `mage check:all`: Runs fmt-check, lint, got-swag, misspell-check, ineffasign-check, gocyclo-check, static-check, gosec-check, goconst-check all in parallel
* `mage check:fmt`: Checks if the code is properly formatted with go fmt
* `mage check:go-sec`: Checks the source code for potential security issues by scanning the Go AST using the [gosec tool](https://github.com/securego/gosec)
* `mage check:goconst`: Checks for repeated strings that could be replaced by a constant using [goconst](https://github.com/jgautheron/goconst/)
* `mage check:gocyclo`: Checks for the cyclomatic complexity of the source code using [gocyclo](https://github.com/fzipp/gocyclo)
* `mage check:got-swag`: Checks if the swagger docs need to be re-generated from the code annotations
* `mage check:ineffassign`: Checks the source code for ineffectual assigns using [ineffassign](https://github.com/gordonklaus/ineffassign)
* `mage check:lint`: Runs golint on all packages
* `mage check:misspell`: Checks the source code for misspellings
* `mage check:static`: Statically analyzes the source code about a range of different problems using [staticcheck](https://staticcheck.io/docs/)
## Release
### Build Releases
```
mage release
```
Builds binaries for all platforms and zips them with a copy of the `templates/` folder.
All built zip files are stored into `dist/zips/`. Binaries are stored in `dist/binaries/`,
binaries bundled with `templates` are stored in `dist/releases/`.
All cross-platform binaries built using this series of commands are built with the help of
[xgo](https://github.com/techknowlogick/xgo). The mage command will automatically install the
binary to be able to use it.
`mage release:release` is a shortcut to execute `mage release:dirs release:windows release:linux release:darwin release:copy release:check release:os-package release:zip`.
* `mage release:dirs` creates all directories needed
* `mage release:windows`/`release:linux`/`release:darwin` execute xgo to build for their respective platforms
* `mage release:copy` bundles binaries with a copy of the `LICENSE` and sample config files to then be zipped
* `mage release:check` creates sha256 checksums for each binary which will be included in the zip file
* `mage release:os-package` bundles a binary with the `sha256` checksum file, a sample `config.yml` and a copy of the license in a folder for each architecture
* `mage release:compress` compresses all build binaries with `upx` to save space
* `mage release:zip` packages a zip file for the files created by `release:os-package`
### Build os packages
```
mage release:packages
```
Will build `.deb`, `.rpm` and `.apk` packages to `dist/os-packages`.
### Make a debian repo
```
mage release:reprepro
```
Takes an already built debian package and creates a debian repo structure around it.
Used to be run inside a [docker container](https://git.kolaente.de/konrad/reprepro-docker) in the CI process when releasing.
## Test
### unit
```
mage test:unit
```
Runs all tests except integration tests.
### coverage
```
mage test:coverage
```
Runs all tests except integration tests and generates a `coverage.html` file to inspect the code coverage.
### integration
```
mage test:integration
```
Runs all integration tests.
## Dev
### Create a new migration
```
mage dev:create-migration
```
Creates a new migration with the current date.
Will ask for the name of the struct you want to create a migration for.
See also [migration docs]({{< ref "mage.md" >}}).
## Misc
### Format the code
```
mage fmt
```
Formats all source code using `go fmt`.
### Generate swagger definitions from code comments
```
mage do-the-swag
```
Generates swagger definitions from the comment annotations in the code.
-47
View File
@@ -1,47 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Metrics"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Metrics
Metrics work by exposing a `/metrics` endpoint which can then be accessed by prometheus.
To keep the load on the database minimal, metrics are stored and updated in redis.
The `metrics` package provides several functions to create and update metrics.
{{< table_of_contents >}}
## Exposing New Metrics
First, define a `const` with the metric key in redis. This is done in `pkg/metrics/metrics.go`.
To expose a new metric, you need to register it in the `init` function inside of the `metrics` package like so:
```go
// Register total user count metric
promauto.NewGaugeFunc(prometheus.GaugeOpts{
Name: "vikunja_team_count", // The key of the metric. Must be unique.
Help: "The total number of teams on this instance", // A description about the metric itself.
}, func() float64 {
count, _ := GetCount(TeamCountKey) // TeamCountKey is the const we defined earlier.
return float64(count)
})
```
Then you'll need to set the metrics initial value on every startup of Vikunja.
This is done in `pkg/routes/routes.go` to avoid cyclic imports.
If metrics are enabled, it checks if a redis connection is available and then sets the initial values.
A convenience function is available if the metric is based on a database struct.
Because metrics are stored in redis, you are responsible to increase or decrease these based on criteria you define.
To do this, use `metrics.UpdateCount(value, key)` where `value` is the amount you want to change it (you can pass negative values to decrease it) and `key` it the redis key used to define the metric.
## Using it
A Prometheus config with a Grafana template is available at [our git repo](https://git.kolaente.de/vikunja/monitoring).
-131
View File
@@ -1,131 +0,0 @@
---
date: "2020-01-19:16:00+02:00"
title: "Migrations"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Writing a migrator for Vikunja
It is possible to migrate data from other to-do services to Vikunja.
To make this easier, we have put together a few helpers which are documented on this page.
In general, each migrator implements a migrator interface which is then called from a client.
The interface makes it possible to use helper methods which handle http and focus only on the implementation of the migrator itself.
There are two ways of migrating data from another service:
1. Through the auth-based flow where the user gives you access to their data at the third-party service through an oauth flow. You can then call the service's api on behalf of your user to get all the data. The Todoist, Trello and Microsoft To-Do Migrators use this pattern.
2. A file migration where the user uploads a file obtained from some third-party service. In your migrator, you need to parse the file and create the projects, tasks etc. The Vikunja File Import uses this pattern.
To differentiate the two, there are two different interfaces you must implement.
{{< table_of_contents >}}
## Structure
All migrator implementations live in their own package in `pkg/modules/migration/<name-of-the-service>`.
When creating a new migrator, you should place all related code inside that module.
## Migrator Interface
The migrator interface is defined as follows:
```go
// Migrator is the basic migrator interface which is shared among all migrators
type Migrator interface {
// Name holds the name of the migration.
// This is used to show the name to users and to keep track of users who already migrated.
Name() string
// Migrate is the interface used to migrate a user's tasks from another platform to Vikunja.
// The user object is the user who's tasks will be migrated.
Migrate(user *models.User) error
// AuthURL returns a url for clients to authenticate against.
// The use case for this are Oauth flows, where the server token should remain hidden and not
// known to the frontend.
AuthURL() string
}
```
## File Migrator Interface
```go
// FileMigrator handles importing Vikunja data from a file. The implementation of it determines the format.
type FileMigrator interface {
// Name holds the name of the migration.
// This is used to show the name to users and to keep track of users who already migrated.
Name() string
// Migrate is the interface used to migrate a user's tasks, projects and other things from a file to Vikunja.
// The user object is the user who's tasks will be migrated.
Migrate(user *user.User, file io.ReaderAt, size int64) error
}
```
## Defining http routes
Once your migrator implements the migration interface, it becomes possible to use the helper http handlers.
Their usage is very similar to the [general web handler](https://kolaente.dev/vikunja/web#user-content-defining-routes-using-the-standard-web-handler):
The `RegisterRoutes(m)` method registers all routes with the scheme `/[MigratorName]/(auth|migrate|status)` for the
authUrl, Status and Migrate methods.
```go
// This is an example for the Wunderlist migrator
if config.MigrationWunderlistEnable.GetBool() {
wunderlistMigrationHandler := &migrationHandler.MigrationWeb{
MigrationStruct: func() migration.Migrator {
return &wunderlist.Migration{}
},
}
wunderlistMigrationHandler.RegisterRoutes(m)
}
```
And for the file migrator:
```go
vikunjaFileMigrationHandler := &migrationHandler.FileMigratorWeb{
MigrationStruct: func() migration.FileMigrator {
return &vikunja_file.FileMigrator{}
},
}
vikunjaFileMigrationHandler.RegisterRoutes(m)
```
You should also document the routes with [swagger annotations]({{< ref "swagger-docs.md" >}}).
## Insertion helper method
There is a method available in the `migration` package which takes a fully nested Vikunja structure and creates it with all relations.
This means you start by adding a project, then add projects inside that project, then tasks in the lists and so on.
In general, it is reccommended to have one root project with all projects of the other service as child projects.
The root structure must be present as `[]*models.ProjectWithTasksAndBuckets`. It allows to represent all of Vikunja's hierarchy as a single data structure.
Then call the method like so:
```go
fullVikunjaHierarchy, err := convertWunderlistToVikunja(wContent)
if err != nil {
return
}
err = migration.InsertFromStructure(fullVikunjaHierarchy, user)
```
## Configuration
If your migrator is an oauth-based one, you should add at least an option to enable or disable it.
Chances are, you'll need some more options for things like client ID and secret (if the other service uses oAuth as an authentication flow).
The easiest way to implement an on/off switch is to check whether your migration service is enabled or not when registering the routes, and then simply don't registering the routes in case it is disabled.
File based migrators can always be enabled.
### Making the migrator public in `/info`
You should make your migrator available in the `/info` endpoint so that frontends can display options to enable them or not.
To do this, add an entry to the `AvailableMigrators` field in `pkg/routes/api/v1/info.go`.
@@ -1,119 +0,0 @@
---
date: 2021-02-07T19:26:34+02:00
title: "Notifications"
toc: true
draft: false
menu:
sidebar:
parent: "development"
---
# Notifications
Vikunja provides a simple abstraction to send notifications per mail and in the database.
{{< table_of_contents >}}
## Definition
Each notification has to implement this interface:
```go
type Notification interface {
ToMail() *Mail
ToDB() interface{}
Name() string
}
```
Both functions return the formatted messages for mail and database.
A notification will only be sent or recorded for those of the two methods which don't return `nil`.
For example, if your notification should not be recorded in the database but only sent out per mail, it is enough to let the `ToDB` function return `nil`.
### Mail notifications
A list of chainable functions is available to compose a mail:
```go
mail := NewMail().
// The optional sender of the mail message.
From("test@example.com").
// The optional recipient of the mail message. Uses the mail address of the notifiable if omitted.
To("test@otherdomain.com").
// The subject of the mail to send.
Subject("Testmail").
// The greeting, or "intro" line of the mail.
Greeting("Hi there,").
// A line of text
Line("This is a line of text").
// An action can contain a title and a url. It gets rendered as a big button in the mail.
// Note that you can have only one action per mail.
// All lines added before an action will appear in the mail before the button, all lines
// added afterwards will appear after it.
Action("The Action", "https://example.com").
// Another line of text.
Line("This should be an outro line").
```
If not provided, the `from` field of the mail contains the value configured in [`mailer.fromemail`](https://vikunja.io/docs/config-options/#fromemail).
### Database notifications
All data returned from the `ToDB()` method is serialized to json and saved into the database, along with the id of the notifiable, the name of the notification and a time stamp.
If you don't use the database notification, the `Name()` function can return an empty string.
## Creating a new notification
The easiest way to generate a mail is by using the `mage dev:make-notification` command.
It takes the name of the notification and the package where the notification will be created.
## Notifiables
Notifiables can receive a notification.
A notifiable is defined with this interface:
```go
type Notifiable interface {
// Should return the email address this notifiable has.
RouteForMail() string
// Should return the id of the notifiable entity
RouteForDB() int64
}
```
The `User` type from the `user` package implements this interface.
## Sending a notification
Sending a notification is done with the `Notify` method from the `notifications` package.
It takes a notifiable and a notification as input.
For example, the email confirm notification when a new user registers is sent like this:
```go
n := &EmailConfirmNotification{
User: update.User,
IsNew: false,
}
err = notifications.Notify(update.User, n)
return
```
## Testing
The `mail` package provides a `Fake()` method which you should call in the `MainTest` functions of your package.
If it was called, no mails are being sent and you can instead assert they have been sent with the `AssertSent` method.
When testing, you should call the `notifications.Fake()` method in the `TestMain` function of the package you want to test.
This prevents any notifications from being sent and lets you assert a notifications has been sent like this:
```go
notifications.AssertSent(t, &ReminderDueNotification{})
```
## Example
Take a look at the [pkg/user/notifications.go](https://code.vikunja.io/api/src/branch/main/pkg/user/notifications.go) file for a good example.
-33
View File
@@ -1,33 +0,0 @@
---
title: "Releasing a new Vikunja version"
date: 2022-10-28T13:06:05+02:00
draft: false
menu:
sidebar:
parent: "development"
---
# Releasing a new Vikunja version
This checklist is a collection of all steps usually involved when releasing a new version of Vikunja.
Not all steps are necessary for every release.
* Website update
* New Features: If there are new features worth mentioning the feature page should be updated.
* New Screenshots: If an overhaul of an existing feature happened so that it now looks different from the existing screenshot, a new one is required.
* Generate changelogs (with git-cliff)
* Tag a new version: Include the changelog for that version as the tag message
* Once built: Prune the cloudflare cache so that the new versions show up at [dl.vikunja.io](https://dl.vikunja.io/)
* Update the [Flathub desktop package](https://github.com/flathub/io.vikunja.Vikunja)
* Release Highlights Blogpost
* Include a section about Vikunja in general (totally fine to copy one from the earlier blog posts)
* New Features & Improvements: Mention bigger features, potentially with screenshots. Things like refactoring are sometimes also worth mentioning.
* Publish
* Reddit
* Twitter
* Mastodon
* Chat
* Newsletter
* Forum
* If features in the release were sponsored, send an email to relevant stakeholders
* Update Vikunja Cloud version and other instances
-170
View File
@@ -1,170 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Project Structure"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Project structure
This document explains what each package does.
{{< table_of_contents >}}
## Root level
The root directory is where [the config file]({{< ref "../setup/config.md">}}), [Magefile]({{< ref "mage.md">}}), license, drone config,
application entry point (`main.go`) and so on are located.
## pkg
This is where most of the magic happens. Most packages with actual code are located in this folder.
### caldav
This folder holds a simple caldav implementation which is responsible for the caldav feature.
### cmd
This package contains all cli-related files and functions.
To learn more about how to add a new command, see [the cli docs]({{< ref "cli.md">}}).
To learn more about how to use this cli, see [the cli usage docs]({{< ref "../usage/cli.md">}}).
### config
This package configures handling of Vikunja's runtime configuration.
It sets default values and sets up viper and tells it where to look for config files, how to interpret which env variables
for config etc.
See also the [docs about adding a new configuration parameter]({{< ref "config.md" >}}).
### cron
See [how to add a cron task]({{< ref "cron.md" >}}).
### db
This package contains the db connection handling and db fixtures for testing.
Each other package gets its db connection object from this package.
### files
This package is responsible for all file-related things.
This means it handles saving and retrieving files from the db and the underlying file system.
### integration
All integration tests live here.
See [integration tests]({{< ref "test.md" >}}#integration-tests) for more details.
### log
Similar to `config`, this will set up the logging, based on different logging backends.
This init is called in `main.go` after the config init is done.
### mail
This package handles all mail sending. To learn how to send a mail, see [notifications]({{< ref "notifications.md" >}}).
### metrics
This package handles all metrics which are exposed to the prometheus endpoint.
To learn how it works and how to add new metrics, take a look at [how metrics work]({{< ref "metrics.md">}}).
### migration
This package handles all migrations.
All migrations are stored and executed in this package.
To learn more, take a look at the [migrations docs]({{< ref "../development/db-migrations.md">}}).
### models
This is where most of the magic happens.
When adding new features or upgrading existing ones, that most likely happens here.
Because this package is pretty huge, there are several documents and how-to's about it:
* [Adding a feature]({{< ref "feature.md">}})
* [Making calls to the database]({{< ref "database.md">}})
### modules
Everything that can have multiple implementations (like a task migrator from a third-party task provider) lives in a
respective sub package in this package.
#### auth
Contains openid related authentication.
#### avatar
Contains all possible avatar providers a user can choose to set their avatar.
#### background
All project background providers are in sub-packages of this package.
#### dump
Handles everything related to the `dump` and `restore` commands of Vikunja.
#### keyvalue
A simple key-value store with an implementation for memory and redis.
Can be used to cache values.
#### migration
See [writing a migrator]({{< ref "migration.md" >}}).
### red (redis)
This package initializes a connection to a redis server.
This initialization is automatically done at the startup of Vikunja.
It also has a function (`GetRedis()`) which returns a redis client object you can then use in your package
to talk to redis.
It uses the [go-redis](https://github.com/go-redis/redis) library, please see their configuration on how to use it.
**Note**: Only use this package directly if you have to use a direct redis connection.
In most cases, using the `keyvalue` package is a better fit.
### routes
This package defines all routes which are available for Vikunja clients to use.
To add a new route, see [adding a new route]({{< ref "feature.md">}}).
#### api/v1
This is where all http-handler functions for the api are stored.
Every handler function which does not use the standard web handler should live here.
### swagger
This is where the [generated]({{< ref "mage.md#generate-swagger-definitions-from-code-comments">}}) [api docs]({{< ref "../usage/api.md">}}) live.
You usually don't need to touch this package.
### user
All user-related things like registration etc. live in this package.
### utils
A small package, containing some helper functions:
* `MakeRandomString`: Generates a random string of a given length.
* `Sha256`: Calculates a sha256 hash from a given string.
See their function definitions for instructions on how to use them.
### version
The single purpose of this package is to hold the current Vikunja version which gets overridden through build flags each time `mage release` or `mage build` is run.
It is a separate package to avoid import cycles with other packages.
@@ -1,96 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Modifying Swagger API Docs"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Modifying swagger api docs
The api documentation is generated using [swaggo](https://github.com/swaggo/swag) from comments.
{{< table_of_contents >}}
## Documenting structs
You should always comment every field which will be exposed as a json in the api.
These comments will show up in the documentation, it'll make it easier for developers using the api.
As an example, this is the definition of a project with all comments:
```go
type Project struct {
// The unique, numeric id of this project.
ID int64 `xorm:"bigint autoincr not null unique pk" json:"id" param:"project"`
// The title of the project. You'll see this in the overview.
Title string `xorm:"varchar(250) not null" json:"title" valid:"required,runelength(1|250)" minLength:"1" maxLength:"250"`
// The description of the project.
Description string `xorm:"longtext null" json:"description"`
// The unique project short identifier. Used to build task identifiers.
Identifier string `xorm:"varchar(10) null" json:"identifier" valid:"runelength(0|10)" minLength:"0" maxLength:"10"`
// The hex color of this project
HexColor string `xorm:"varchar(6) null" json:"hex_color" valid:"runelength(0|6)" maxLength:"6"`
OwnerID int64 `xorm:"bigint INDEX not null" json:"-"`
ParentProjectID int64 `xorm:"bigint INDEX null" json:"parent_project_id"`
ParentProject *Project `xorm:"-" json:"-"`
// The user who created this project.
Owner *user.User `xorm:"-" json:"owner" valid:"-"`
// Whether a project is archived.
IsArchived bool `xorm:"not null default false" json:"is_archived" query:"is_archived"`
// The id of the file this project has set as background
BackgroundFileID int64 `xorm:"null" json:"-"`
// Holds extra information about the background set since some background providers require attribution or similar. If not null, the background can be accessed at /projects/{projectID}/background
BackgroundInformation interface{} `xorm:"-" json:"background_information"`
// Contains a very small version of the project background to use as a blurry preview until the actual background is loaded. Check out https://blurha.sh/ to learn how it works.
BackgroundBlurHash string `xorm:"varchar(50) null" json:"background_blur_hash"`
// True if a project is a favorite. Favorite projects show up in a separate parent project. This value depends on the user making the call to the api.
IsFavorite bool `xorm:"-" json:"is_favorite"`
// The subscription status for the user reading this project. You can only read this property, use the subscription endpoints to modify it.
// Will only returned when retrieving one project.
Subscription *Subscription `xorm:"-" json:"subscription,omitempty"`
// The position this project has when querying all projects. See the tasks.position property on how to use this.
Position float64 `xorm:"double null" json:"position"`
// A timestamp when this project was created. You cannot change this value.
Created time.Time `xorm:"created not null" json:"created"`
// A timestamp when this project was last updated. You cannot change this value.
Updated time.Time `xorm:"updated not null" json:"updated"`
web.CRUDable `xorm:"-" json:"-"`
web.Rights `xorm:"-" json:"-"`
}
```
## Documenting api Endpoints
All api routes should be documented with a comment above the handler function.
When generating the api docs with mage, the swagger cli will pick these up and put them in a neat document.
A comment looks like this:
```go
// @Summary Login
// @Description Logs a user in. Returns a JWT-Token to authenticate further requests.
// @tags user
// @Accept json
// @Produce json
// @Param credentials body user.Login true "The login credentials"
// @Success 200 {object} auth.Token
// @Failure 400 {object} models.Message "Invalid user password model."
// @Failure 412 {object} models.Message "Invalid totp passcode."
// @Failure 403 {object} models.Message "Invalid username or password."
// @Router /login [post]
func Login(c echo.Context) error {
// Handler logic
}
```
-109
View File
@@ -1,109 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Testing"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Testing
{{< table_of_contents >}}
## API Tests
The following parts are about the kinds of tests in the API package and how to run them.
### Prerequesites
To run any kind of test, you need to specify Vikunja's [root path](https://vikunja.io/docs/config-options/#rootpath).
This is required to make sure all test fixtures are correctly loaded.
The easies way to do that is to set the environment variable `VIKUNJA_SERVICE_ROOTPATH` to the path where you cloned the working directory.
### Unit tests
To run unit tests with [mage]({{< ref "mage.md">}}), execute
```
mage test:unit
```
In Vikunja, everything that is not an integration test counts as unit test - even if it accesses the db.
This definition is a bit blurry, but we haven't found a better one yet.
### Integration tests
All integration tests live in `pkg/integrations`.
You can run them by executing `mage test:integration`.
The integration tests use the same config and fixtures as the unit tests and therefor have the same options available,
see at the beginning of this document.
To run integration tests, use `mage test:integration`.
### Running tests with config
You can run tests with all available config variables if you want, enabling you to run tests for a lot of scenarios.
We use this in CI to run all tests with different databases.
To use the normal config set the environment variable `VIKUNJA_TESTS_USE_CONFIG=1`.
### Showing sql queries
When the environment variable `UNIT_TESTS_VERBOSE=1` is set, all sql queries will be shown during the test run.
### Fixtures
All tests are run against a set of db fixtures.
These fixtures are defined in `pkg/models/fixtures` in YAML-Files which represent the database structure.
When you add a new test case which requires new database entries to test against, update these files.
#### Initializing db fixtures when writing tests
All db fixtures for all tests live in the `pkg/db/fixtures/` folder as yaml files.
Each file has the same name as the table the fixtures are for.
You should put new fixtures in this folder.
When initializing db fixtures, you are responsible for defining which tables your package needs in your test init function.
Usually, this is done as follows (this code snippet is taken from the `user` package):
```go
err = db.InitTestFixtures("users")
if err != nil {
log.Fatal(err)
}
```
In your actual tests, you then load the fixtures into the in-memory db like so:
```go
db.LoadAndAssertFixtures(t)
```
This will load all fixtures you defined in your test init method.
You should always use this method to load fixtures, the only exception is when your package tests require extra test
fixtures other than db fixtures (like files).
## Frontend tests
The frontend has end to end tests with Cypress that use a Vikunja instance and drive a browser against it.
Check out the docs [in the frontend repo](https://kolaente.dev/vikunja/vikunja/src/branch/main/frontend/cypress/README.md) about how they work and how to get them running.
### Unit Tests
To run the frontend unit tests, run
```
pnpm run test:unit
```
The frontend also has a watcher available that re-runs all unit tests every time you change something.
To use it, simply run
```
pnpm run test:unit-watch
```
@@ -1,75 +0,0 @@
---
title: "German Translation Instructions"
date: 2021-06-23T23:47:34+02:00
draft: false
---
# German Translation Instructions
<div class="notification is-warning">
<b>NOTE:</b> This document contains translation instructions specific to the german translation of Vikunja.
For instructions applicable to all languages, check out the <a href="{{< ref "./translations.md">}}">general translation instructions</a>.
</div>
{{< table_of_contents >}}
## Allgemein
Anrede: Wenig förmlich:
* “Du”-Form
* Keine “Amtsdeusch“-Umschreibungen, einfach so als ob man den Nutzer direkt persönlich ansprechen würde
Genauer definiert:
* “falsch” anstatt “nicht korrekt/inkorrekt”
* “Wende dich an …” anstatt “kontaktiere …”
* In derselben Zeit übersetzen (sonst wird aus dem englischen “is“ das deutsche “war”)
* Richtige Anführungszeichen verwenden. Also `„“` statt `''` oder `'` oder ` oder ´
* `„` für beginnende Anführungszeichen, `“` für schließende Anführungszeichen
Es gelten Artikel und Worttrennungen aus dem [Duden](https://duden.de).
## Formulierungen
* `Account` statt `Konto`.
* `TOTP` immer als ein Wort und Groß.
* `CalDAV` immer so.
* `löschen` oder `entfernen` je nach Kontext. Wenn etwas *gelöscht* wird, existiert das gelöschte Objekt und danach
nicht mehr und hat evtl. andere Objekte mitgelöscht (z.B. eine Aufgabe). Wird etwas *entfernt*, bezieht sich das
meistens auf die Beziehung zu einem anderen Objekt. Das entfernte Objekt existiert danach immernoch, z.B. beim
Entfernen eine:r Nutzer:in aus einem Team.
* Analog zu `löschen` oder `entfernen` gilt ähnliches für `hinzufügen` oder `erstellen`. Eine Aufgabe wird *erstellt*,
aber ein:e Nutzer:in nur zu einem Team *hinzugefügt*.
* `Anmeldename` anstatt `Benutzer:innenname`
## Formulierungen in Modals und Buttons
Es sollten die gleichen Formulierungen auf Buttons und Modals verwendet werden.
Beispiel: Wenn der Button mit `löschen` beschriftet ist, sollte im Modal die Frage
lauten `Willst du das wirklich löschen?` und nicht `Willst du das wirklich entfernen?`. Gleiches gilt für
Erfolgs/Fehlermeldungen nach der Aktion.
## Gendern
Wo möglich, sollte eine geschlechtsneutrale Anrede verwendet werden. Falls diese sehr umständlich würden (siehe oben
„Amtsdeutsch-Umschreibungen“), soll mit *Doppelpunkt* gegendert werden.
Beispiel: „Benutzer:in“
## Trennungen
* E-Mail-Adresse (siehe Duden)
## Wörter und Ausdrücke
| Englisches Original | Verwendung in deutscher Übersetzung |
| ------------------- | -------------------- |
| Bucket | Spalte |
| Link Share | Linkfreigabe |
| Username | Anmeldename |
## Weiterführende Links
* https://docs.translatehouse.org/projects/localization-guide/en/latest/guide/translation_guidelines_german.html
@@ -1,54 +0,0 @@
---
title: "Translations"
date: 2021-06-23T22:52:06+02:00
draft: false
menu:
sidebar:
parent: "development"
---
# Translations
This document provides documentation about how to translate Vikunja.
{{< table_of_contents >}}
## Where to translate
Translation happens at [crowdin](https://crowdin.com/project/vikunja).
Currently, only the frontend (and by extension, the desktop app) is translatable.
## Translation Instructions
> These are the instructions for translating Vikunja in another language.
> For information about how to add new translation strings, see below.
For all languages these translation guidelines should be applied when translating:
* Use a less-formal style, as if you were talking to a friend.
* If the source string contains characters like `&` or `…`, the translated string should contain them as well.
More specific instructions for some languages can be found below.
### Wrong translation strings
If you encounter a wrong original translation string while translating, please don't correct it in the translation.
Instead, translate it to reflect the original meaning in the translated string but add a comment under the source string to discuss potential changes.
### Language-specific instructions
* [German]({{< ref "./translation-instructions-german.md">}})
## How to add new translation strings
All translation strings are stored in `src/i18n/lang/`.
New strings should be added only in the `en.json` file.
Strings in other languages will be synced through [crowdin](https://crowdin.com/project/vikunja) and should not be added directly as a PR/commit in the frontend repo.
## Requesting a new language
If you want to start translating Vikunja in a language not yet available in Vikunja, please request the language through the crowdin interface.
If you have issues with this or need a discussion before doing so, please [contact us](https://vikunja.io/contact/) or [start a discussion in the forum](https://community.vikunja.io).
Once at least 50% of all translation strings are translated and approved, they will be added and distributed with the Vikunja frontend for users to select and use Vikunja with them.
-59
View File
@@ -1,59 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "What to backup"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# What to backup
There are two parts you need to back up: The database and attachment files.
{{< table_of_contents >}}
## Files
To back up attachments and other files, it is enough to copy them [from the attachments folder]({{< ref "config.md" >}}#basepath) to some other place.
## Database
### MySQL
To create a backup from mysql use the `mysqldump` command:
```
mysqldump -u <user> -p -h <db-host> <database> > vkunja-backup.sql
```
You will be prompted for the password of the mysql user.
To restore it, simply pipe it back into the `mysql` command:
```
mysql -u <user> -p -h <db-host> <database> < vkunja-backup.sql
```
### PostgreSQL
To create a backup from PostgreSQL use the `pg_dump` command:
```
pg_dump -U <user> -h <db-host> <database> > vikunja-backup.sql
```
You might be prompted for the password of the database user.
To restore it, simply pipe it back into the `psql` command:
```
psql -U <user> -h <db-host> <database> < vikunja-backup.sql
```
For more information, please visit the [relevant PostgreSQL documentation](https://www.postgresql.org/docs/12/backup-dump.html).
### SQLite
To back up sqllite databases, it is enough to copy the [database file]({{< ref "config.md" >}}#path) to somewhere else.
@@ -1,45 +0,0 @@
---
date: "2022-09-21:00:00+02:00"
title: "Build from sources"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Build Vikunja from source
To fully build Vikunja from source files, you need to build the api and frontend.
{{< table_of_contents >}}
## General Preparations
1. Make sure you have git installed
2. Clone the repo with `git clone https://code.vikunja.io/vikunja` and switch into the directory.
## Frontend
The code for the frontend is located in the `frontend/` sub folder of the main repo.
1. Make sure you have [pnpm](https://pnpm.io/installation) properly installed on your system.
2. Install all dependencies with `pnpm install`
3. Build the frontend with `pnpm run build`. This will result in a static js bundle in the `dist/` folder.
4. You can either deploy that static js bundle directly, or read on to learn how to bundle it all up in a static binary with the api.
## API
The Vikunja API has no other dependencies than go itself.
That means compiling it boils down to these steps:
1. Make sure [Go](https://golang.org/doc/install) is properly installed on your system. You'll need at least Go `1.21`.
2. Make sure [Mage](https://magefile.org) is properly installed on your system.
3. If you did not build the frontend in the steps before, you need to either do that or create a dummy index file with `mkdir -p frontend/dist && touch index.html`.
4. Run `mage build` in the source of the main repo. This will build a binary in the root of the repo which will be able to run on your system.
### Build for different architectures
To build for other platforms and architectures than the one you're currently on, simply run `mage release` or `mage release:{linux|windows|darwin}`.
More options are available, please refer to the [magefile docs]({{< ref "../development/mage.md">}}) for more details.
File diff suppressed because it is too large Load Diff
@@ -1,210 +0,0 @@
---
date: "2020-05-24:00:00+02:00"
title: "Docker Walkthrough"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Setup with docker from start to finish
This tutorial assumes basic knowledge of docker.
It is aimed at beginners and should get you up and running quickly.
We'll use [docker compose](https://docs.docker.com/compose/) to make handling the bunch of containers easier.
> If you have any issues setting up vikunja, please don't hesitate to reach out to us via [matrix](https://riot.im/app/#/room/!dCRiCiLaCCFVNlDnYs:matrix.org?via=matrix.org), the [community forum](https://community.vikunja.io/) or even [email](mailto:hello@vikunja.io).
{{< table_of_contents >}}
## Preparations (optional)
Create a directory for the project where all data and the compose file will live in.
## Create all necessary files
Create a `docker-compose.yml` file with the following contents in your directory:
```yaml
version: '3'
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: http://<the public url where vikunja is reachable>
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: secret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
VIKUNJA_SERVICE_JWTSECRET: <a super secure random secret>
ports:
- 3456:3456
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersupersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
```
This defines two services, each with their own container:
* A Vikunja service which runs the vikunja api and hosts its frontend.
* A database container which will store all projects, tasks, etc. We're using mariadb here, but you're free to use mysql or postgres if you want.
If you already have a proxy on your host, you may want to check out the [reverse proxy examples]({{< ref "reverse-proxies.md" >}}) to use that.
By default, Vikunja will be exposed on port 3456 on the host.
To change to something different, you'll need to change the `ports` section in the service definition.
The number before the colon is the host port - This is where you can reach vikunja from the outside once all is up and running.
You'll need to change the value of the `VIKUNJA_SERVICE_PUBLICURL` environment variable to the public port or hostname where Vikunja is reachable.
## Run it
Run `sudo docker-compose up` in your directory and take a look at the output you get.
When first started, Vikunja will set up the database and run all migrations etc.
Once it is ready, you should see a message like this one in your console:
```
vikunja_1 | 2024-02-09T14:44:06.990677157+01:00: INFO ▶ cmd/func29 05d Vikunja version 0.23.0
vikunja_1 | ⇨ http server started on [::]:3456
```
This indicates all setup has been successful.
If you get any errors, see below:
### Troubleshooting
Vikunja might not run on the first try.
There are a few potential issues that could be causing this.
#### No connection to the database
Indicated by an error message like this one from the api container:
```
2020/05/23 15:37:59 Config File "config" Not Found in "[/app/vikunja /etc/vikunja /app/vikunja/.config/vikunja]"
2020/05/23 15:37:59 Using default config.
2020-05-23T15:37:59.974435725Z: CRITICAL ▶ migration/Migrate 002 Migration failed: dial tcp 172.19.0.2:3306: connect: connection refused
```
Especially when using mysql, this can happen on first start, because the mysql database container will take a few seconds to start.
Vikunja does not know the container is not ready, therefore it will just try to connect to the db, fail since it is not ready and exit.
If you're using the docker compose example from above, you may notice the `restart: unless-stopped` option at the api service.
This tells docker to restart the api container if it exits, unless you explicitly stop it.
Therefore, it should "magically fix itself" by automatically restarting the container.
After a few seconds (or minutes) you should see a log message like this one from the mariadb container:
```
2020-05-24 11:42:15 0 [Note] mysqld: ready for connections.
Version: '10.4.12-MariaDB-1:10.4.12+maria~bionic' socket: '/var/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
```
The next restart of Vikunja should be successful.
If not, there might be a different error or a bug with Vikunja, please reach out to us in that case.
(If you have an idea about how we could improve this, we'd like to hear it!)
#### Migration failed: commands out of sync
If you get an error like this one:
```
2020/05/23 15:53:38 Config File "config" Not Found in "[/app/vikunja /etc/vikunja /app/vikunja/.config/vikunja]"
2020/05/23 15:53:38 Using default config.
2020-05-23T15:53:38.762747276Z: CRITICAL ▶ migration/Migrate 002 Migration failed: commands out of sync. Did you run multiple statements at once?
```
This is a mysql issue.
Currently, we don't have a better solution than to completely wipe the database files and start over.
To do this, first stop everything by running `sudo docker-compose down`, then remove the `db/` folder in your current folder with `sudo rm -rf db` and start the whole stack again with `sudo docker-compose up -d`.
## Try it
Head over to `http://<host-ip or url>/api/v1/info` in a browser.
You should see something like this:
```json
{
"version": "v0.23.0",
"frontend_url": "https://try.vikunja.io/",
"motd": "",
"link_sharing_enabled": true,
"max_file_size": "20MB",
"registration_enabled": true,
"available_migrators": [
"vikunja-file",
"ticktick",
"todoist"
],
"task_attachments_enabled": true,
"enabled_background_providers": [
"upload",
"unsplash"
],
"totp_enabled": false,
"legal": {
"imprint_url": "",
"privacy_policy_url": ""
},
"caldav_enabled": true,
"auth": {
"local": {
"enabled": true
},
"openid_connect": {
"enabled": false,
"providers": null
}
},
"email_reminders_enabled": true,
"user_deletion_enabled": true,
"task_comments_enabled": true,
"demo_mode_enabled": true,
"webhooks_enabled": true
}
```
This shows you can reach the api through the api proxy.
Now head over to `http://<host-ip or url>/` which should show the login mask.
## Make it persistent
Currently, Vikunja runs in foreground in your terminal.
For a real-world scenario this is not the best way.
Back in your terminal, stop the stack by pressing `CTRL-C` on your keyboard.
Then run `sudo docker-compose up -d` in your again.
The `-d` flag at the end of the command will tell docker to run the containers in the background.
If you need to check the logs after that, you can run `sudo docker-compose logs`.
Vikunja does not have any default users, you'll need to register and account.
After that, you can use it.
## Tear it all down
If you want to completely stop all containers run `sudo docker-compose down` in your terminal.
## Improve this guide
We'll happily accept suggestions and improvements for this guide.
Please [reach out to us](https://vikunja.io/contact/) if you have any.
@@ -1,299 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Full docker example"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Full docker example
This docker compose configuration will run Vikunja with a mariadb database.
It uses a proxy configuration to make it available under a domain.
For all available configuration options, see [configuration]({{< ref "config.md">}}).
Once deployed, you might want to change the [`PUID` and `GUID` settings]({{< ref "install.md">}}#setting-user-and-group-id-of-the-user-running-vikunja) or [set the time zone]({{< ref "config.md">}}#timezone).
After registering all your users, you might also want to [disable the user registration]({{<ref "config.md">}}#enableregistration).
<div class="notification is-warning">
<b>NOTE:</b> If you intend to run Vikunja with mysql and/or to use non-latin characters
<a href="{{< ref "utf-8.md">}}">make sure your db is utf-8 compatible</a>.<br/>
All examples on this page already reflect this and do not require additional work.
</div>
{{< table_of_contents >}}
## PostgreSQL
Vikunja supports postgres, mysql and sqlite as a database backend. The examples on this page use mysql with a mariadb container.
To use postgres as a database backend, change the `db` section of the examples to this:
```yaml
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
POSTGRES_USER: vikunja
volumes:
- ./db:/var/lib/postgresql/data
restart: unless-stopped
```
You'll also need to change the `VIKUNJA_DATABASE_TYPE` to `postgres` on the api container declaration.
<div class="notification is-warning">
<b>NOTE:</b> The mariadb container can sometimes take a while to initialize, especially on the first run. During this time, the api container will fail to start at all. It will automatically restart every few seconds.
</div>
## Sqlite
Vikunja supports postgres, mysql and sqlite as a database backend. The examples on this page use mysql with a mariadb container.
To use sqlite as a database backend, change the `api` section of the examples to this:
```yaml
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_JWTSECRET: <a super secure random secret>
VIKUNJA_SERVICE_PUBLICURL: http://<your public frontend url with slash>/
# Note the default path is /app/vikunja/vikunja.db.
# This config variable moves it to a different folder so you can use a volume and
# store the database file outside the container so state is persisted even if the container is destroyed.
VIKUNJA_DATABASE_PATH: /db/vikunja.db
ports:
- 3456:3456
volumes:
- ./files:/app/vikunja/files
- ./db:/db
restart: unless-stopped
```
The default path Vikunja uses for sqlite is relative to the binary, which in the docker container would be `/app/vikunja/vikunja.db`.
The `VIKUNJA_DATABASE_PATH` environment variable moves changes it so that the database file is stored in a volume at `/db`, to persist state across restarts.
You'll also need to remove or change the `VIKUNJA_DATABASE_TYPE` to `sqlite` on the container declaration.
You can also remove the db section.
<div class="notification is-warning">
<b>NOTE:</b> If you'll use your instance with more than a handful of users, we recommend using mysql or postgres.
</div>
## Example without any proxy
This example lets you host Vikunja without any reverse proxy in front of it.
This is the absolute minimum configuration you need to get something up and running.
If you want to make Vikunja available on a domain or need tls termination, check out one of the other examples.
Note that you need to change the [`VIKUNJA_SERVICE_PUBLICURL`]({{< ref "config.md" >}}#publicurl) environment variable to the ip (the docker host you're running this on) is reachable at.
Because the browser you'll use to access the Vikunja frontend uses that url to make the requests, it has to be able to reach that ip + port from the outside.
```yaml
version: '3'
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: http://<the public url where vikunja is reachable>
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: secret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
VIKUNJA_SERVICE_JWTSECRET: <a super secure random secret>
ports:
- 3456:3456
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersupersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
```
## Example with Traefik 2
This example assumes [traefik](https://traefik.io) version 2 installed and configured to [use docker as a configuration provider](https://docs.traefik.io/providers/docker/).
We also make a few assumptions here which you'll most likely need to adjust for your traefik setup:
* Your domain is `vikunja.example.com`
* The entrypoint you want to make vikunja available from is called `https`
* The tls cert resolver is called `acme`
```yaml
version: '3'
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: http://<the public url where vikunja is reachable>
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
VIKUNJA_SERVICE_JWTSECRET: <a super secure random secret>
volumes:
- ./files:/app/vikunja/files
networks:
- web
- default
depends_on:
- db
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.vikunja.rule=Host(`vikunja.example.com`)"
- "traefik.http.routers.vikunja.entrypoints=https"
- "traefik.http.routers.vikunja.tls.certResolver=acme"
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersupersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
networks:
web:
external: true
```
## Example with Caddy v2 as proxy
You will need the following `Caddyfile` on your host (or elsewhere, but then you'd need to adjust the proxy mount at the bottom of the compose file):
```conf
vikunja.example.com {
reverse_proxy api:3456
}
```
Note that you need to change the [`VIKUNJA_SERVICE_PUBLICURL`]({{< ref "config.md" >}}#publicurl) environment variable to the ip (the docker host you're running this on) is reachable at.
Because the browser you'll use to access the Vikunja frontend uses that url to make the requests, it has to be able to reach that ip + port from the outside.
Docker Compose config:
```yaml
version: '3'
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: http://<the public url where vikunja is reachable>
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: secret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
VIKUNJA_SERVICE_JWTSECRET: <a super secure random secret>
ports:
- 3456:3456
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersupersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
caddy:
image: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
depends_on:
- api
- frontend
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
```
## Setup on a Synology NAS
There is a proxy preinstalled in DSM, so if you want to access Vikunja from outside,
you need to prepare a proxy rule the Vikunja Service.
![Synology Proxy Settings](/docs/synology-proxy-1.png)
You should also add 2 empty folders for mariadb and vikunja inside Synology's
docker main folders:
* Docker
* vikunja
* mariadb
Synology has its own GUI for managing Docker containers, but it's easier via docker compose.
To do that, you can
* Either activate SSH and paste the adapted compose file in a terminal (using Putty or similar)
* Without activating SSH as a "custom script" (go to Control Panel / Task Scheduler / Create / Scheduled Task / User-defined script)
* Without activating SSH, by using Portainer (you have to install first, check out [this tutorial](https://www.portainer.io/blog/how-to-install-portainer-on-a-synology-nas) for exmple):
1. Go to **Dashboard / Stacks** click the button **"Add Stack"**
2. Give it the name Vikunja and paste the adapted docker compose file
3. Deploy the Stack with the "Deploy Stack" button:
![Portainer Stack deploy](/docs/synology-proxy-2.png)
The docker-compose file we're going to use is exactly the same from the [example without any proxy](#example-without-any-proxy) above.
You may want to change the volumes to match the rest of your setup.
Once deployed, you might want to change the [`PUID` and `GUID` settings]({{< ref "install.md">}}#setting-user-and-group-id-of-the-user-running-vikunja) or [set the time zone]({{< ref "config.md">}}#timezone).
After registering all your users, you might also want to [disable the user registration]({{<ref "config.md">}}#enableregistration).
## Redis
While Vikunja has support to use redis as a caching backend, you'll probably not need it unless you're using Vikunja with more than a handful of users.
To use redis, you'll need to add this to the config examples below:
```yaml
version: '3'
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_REDIS_ENABLED: 1
VIKUNJA_REDIS_HOST: 'redis:6379'
VIKUNJA_CACHE_ENABLED: 1
VIKUNJA_CACHE_TYPE: redis
volumes:
- ./files:/app/vikunja/files
redis:
image: redis
```
-303
View File
@@ -1,303 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Installing"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
weight: 10
---
# Installing
Architecturally, Vikunja is made up of two parts: [API](https://code.vikunja.io/api) and [frontend](https://code.vikunja.io/api/frontend).
Both are bundled into one single deployable binary (or docker container).
That means you only need to install one thing to be able to use Vikunja.
You can also:
* Use the desktop app, which is essentially the web frontend packaged for easy installation on desktop devices
* Use the mobile app only, but as of right now it only supports the very basic features of Vikunja
<div class="notification is-warning">
<b>NOTE:</b> If you intend to run Vikunja with mysql and/or to use non-latin characters
<a href="{{< ref "utf-8.md">}}">make sure your db is utf-8 compatible</a>.
</div>
Vikunja can be installed in various ways.
This document provides an overview and instructions for the different methods:
* [Installing from binary](#install-from-binary)
* [Build from source]({{< ref "build-from-source.md">}})
* [Docker](#docker)
* [Debian packages](#debian-packages)
* [FreeBSD](#freebsd--freenas)
* [Kubernetes]({{< ref "k8s.md" >}})
And after you installed Vikunja, you may want to check out these other ressources:
* [Configuration]({{< ref "config.md">}})
* [UTF-8 Settings]({{< ref "utf-8.md">}})
* [Reverse proxies]({{< ref "reverse-proxies.md">}})
* [Full docker example]({{< ref "full-docker-example.md">}})
* [Backups]({{< ref "backups.md">}})
## Install from binary
Download a copy of Vikunja from the [download page](https://dl.vikunja.io/vikunja) for your architecture.
```
wget <download-url>
```
### Verify the GPG signature
All releases are signed using GPG.
To validate the downloaded zip file use the signiture file `.asc` and the key `FF054DACD908493A`:
```
gpg --keyserver keyserver.ubuntu.com --recv FF054DACD908493A
gpg --verify vikunja-<vikunja version>-linux-amd64-full.zip.asc vikunja-<vikunja version>-linux-amd64-full.zip
```
### Set it up
Once you've verified the signature, you need to unzip and make it executable.
You'll also need to create a symlink to the binary, so that you can execute Vikunja by typing `vikunja` on your system.
We'll install vikunja to `/opt/vikunja`, change the path where needed if you want to install it elsewhere.
Run these commands to install it:
```
mkdir -p /opt/vikunja
unzip <vikunja-zip-file> -d /opt/vikunja
chmod +x /opt/vikunja
sudo ln -s /opt/vikunja/vikunja /usr/bin/vikunja
```
### Systemd service
To automatically start Vikunja when your system boots and to ensure all dependent services are met, you want to use an init system like systemd.
Save the following service file to `/etc/systemd/system/vikunja.service` and adapt it to your needs:
```unit file (systemd)
[Unit]
Description=Vikunja
After=syslog.target
After=network.target
# Depending on how you configured Vikunja, you may want to uncomment these:
#Requires=mysql.service
#Requires=mariadb.service
#Requires=postgresql.service
#Requires=redis.service
[Service]
RestartSec=2s
Type=simple
WorkingDirectory=/opt/vikunja
ExecStart=/usr/bin/vikunja
Restart=always
# If you want to bind Vikunja to a port below 1024 uncomment
# the two values below
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
```
If you've installed Vikunja to a directory other than `/opt/vikunja`, you need to adapt `WorkingDirectory` accordingly.
After you made all necessary modifications, it's time to start the service:
```
sudo systemctl enable vikunja
sudo systemctl start vikunja
```
### Build from source
To build vikunja from source, see [building from source]({{< ref "build-from-source.md">}}).
### Updating
[Make a backup first]({{< ref "backups.md" >}}).
Simply replace the binary with the new version, then restart Vikunja.
It will automatically run all necessary database migrations.
**Make sure to take a look at the changelog for the new version to not miss any manual steps the update may involve!**
## Docker
(Note: this assumes some familiarity with docker)
To get up and running quickly, use this command:
```
touch vikunja.db
docker run -p 3456:3456 -v $PWD/files:/app/vikunja/files -v $PWD/vikunja.db:/app/vikunja/vikunja.db vikunja/vikunja
```
This will expose vikunja on port `3456` on the host running the container and use sqlite as database backend.
You can mount a local configuration like so:
```
touch vikunja.db
docker run -p 3456:3456 -v /path/to/config/on/host.yml:/app/vikunja/config.yml:ro -v $PWD/files:/app/vikunja/files -v $PWD/vikunja.db:/app/vikunja/vikunja.db vikunja/vikunja
```
Though it is recommended to use environment variables or `.env` files to configure Vikunja in docker.
See [config]({{< ref "config.md">}}) for a list of available configuration options.
Check out the [docker examples]({{<ref "full-docker-example.md">}}) for more advanced configuration using mysql / postgres and a reverse proxy.
### Files volume
By default, the container stores all files uploaded and used through vikunja inside of `/app/vikunja/files` which is created as a docker volume.
You should mount the volume somewhere to the host to permanently store the files and don't lose them if the container restarts.
### Setting user and group id of the user running vikunja
You can set the user and group id of the user running vikunja with the `PUID` and `PGID` environment variables.
This follows the pattern used by [the linuxserver.io](https://docs.linuxserver.io/general/understanding-puid-and-pgid) docker images.
This is useful to solve general permission problems when host-mounting volumes such as the volume used for task attachments.
### Docker compose
Check out the [docker examples]({{<ref "full-docker-example.md">}}) for more advanced configuration using docker compose.
## Debian packages
Vikunja is available as debian packages.
To install these, grab a `.deb` file from [the download page](https://dl.vikunja.io/vikunja) and run
```
dpkg -i vikunja.deb
```
This will install Vikunja to `/opt/vikunja`.
To configure it, use the config file in `/etc/vikunja/config.yml`.
## FreeBSD / FreeNAS
Unfortunately, we currently can't provide pre-built binaries for FreeBSD.
As a workaround, it is possible to compile vikunja for FreeBSD directly on a FreeBSD machine, a guide is available below:
*Thanks to HungrySkeleton who originally created this guide [in the forum](https://community.vikunja.io/t/freebsd-support/69/11).*
### Jail Setup
1. Create a jail named `vikunja`
2. Set jail properties to 'auto start'
3. Mount storage (`/mnt` to `jailData/vikunja`)
4. Start jail & SSH into it
### Installing packages
```
pkg update && pkg upgrade -y
pkg install nano git go gmake
go install github.com/magefile/mage
```
### Clone vikunja repo
```
mkdir /mnt/GO/code.vikunja.io
cd /mnt/GO/code.vikunja.io
git clone https://code.vikunja.io/api
cd /mnt/GO/code.vikunja.io/api
```
### Compile binaries
```
cd frontend
pnpm install
pnpm run build
cd ..
mage build
```
### Create folder to install Vikunja into
```
mkdir /mnt/vikunja
cp /mnt/GO/code.vikunja.io/api/vikunja /mnt/vikunja
cd /mnt/vikunja
chmod +x /mnt/vikunja
```
### Set vikunja to boot on startup
```
nano /etc/rc.d/vikunja
```
Then paste into the file:
```
#!/bin/sh
. /etc/rc.subr
name=vikunja
rcvar=vikunja_enable
command="/mnt/vikunja/${name}"
load_rc_config $name
run_rc_command "$1"
```
Save and exit. Then execute:
```
chmod +x /etc/rc.d/vikunja
nano /etc/rc.conf
```
Then add line to bottom of file:
```
vikunja_enable="YES"
```
Test vikunja now works with
```
service vikunja start
```
Vikunja is now available through IP:
```
192.168.1.XXX:3456
```
## Other installation resources
* [Docker Compose is MUCH Easier Than you Think - Let's Install Vikunja](https://www.youtube.com/watch?v=fGlz2PkXjuo) (Youtube)
* [Setup Vikunja using Docker Compose - Homelab Wiki](https://thehomelab.wiki/books/docker/page/setup-vikunja-using-docker-compose)
* [A Closer look at Vikunja - Email Notifications - Enable or Disable Registrations - Allow Attachments](https://www.youtube.com/watch?v=47wj9pRT6Gw) (Youtube)
* [Install Vikunja in Docker for self-hosted Task Tracking](https://smarthomepursuits.com/install-vikunja-in-docker-for-self-hosted-task-tracking/)
* [Self-Hosted To-Do List with Vikunja in Docker](https://www.youtube.com/watch?v=DqyqDWpEvKI) (Youtube)
* [Vikunja self-hosted (step by step)](https://nguyenminhhung.com/vikunja-self-hosted-step-by-step/)
* [How to Install Vikunja on Your Synology NAS](https://mariushosting.com/how-to-install-vikunja-on-your-synology-nas/)
## Configuration
See [available configuration options]({{< ref "config.md">}}).
## Default Password
After successfully installing Vikunja, there is no default user or password.
You only need to register a new account and set all the details when creating it.
-22
View File
@@ -1,22 +0,0 @@
---
title: "Hosting Vikunja with k8s"
date: 2022-08-12T13:41:48+02:00
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Hosting Vikunja with k8s
We have an official Helm Chart for Vikunja.
Check out [the repo](https://kolaente.dev/vikunja/helm-chart/) for more information about how to use it.
## Third-party Helm Charts
There are two third-party Helm-Charts which can be used to host Vikunja with k8s:
* [Truecharts](https://truecharts.org/charts/stable/vikunja/)
* [k8s at Home](https://github.com/k8s-at-home/charts)
-114
View File
@@ -1,114 +0,0 @@
---
date: "2022-08-09:00:00+02:00"
title: "OpenID example configurations"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# OpenID example configurations
On this page you will find examples about how to set up Vikunja with a third-party OpenID provider.
To add another example, please [edit this document](https://kolaente.dev/vikunja/vikunja/src/branch/main/docs/content/doc/setup/openid-examples.md) and send a PR.
{{< table_of_contents >}}
## Authelia
Vikunja Config:
```yaml
openid:
enabled: true
redirecturl: https://vikunja.mydomain.com/auth/openid/ <---- slash at the end is important
providers:
- name: Authelia
authurl: https://login.mydomain.com
clientid: <vikunja-id>
clientsecret: <vikunja secret>
```
Authelia config:
```yaml
- id: <vikunja-id>
description: Vikunja
secret: <vikunja secret>
redirect_uris:
- https://vikunja.mydomain.com/auth/openid/authelia
scopes:
- openid
- email
- profile
```
## Google / Google Workspace
Vikunja Config:
```yaml
openid:
enabled: true
redirecturl: https://vikunja.mydomain.com/auth/openid/ <---- slash at the end is important
providers:
- name: Google
authurl: https://accounts.google.com
clientid: <google-oauth-client-id>
clientsecret: <google-oauth-client-secret>
```
Google config:
- Navigate to `https://console.cloud.google.com/apis/credentials` in the target project
- Create a new OAuth client ID
- Configure an authorized redirect URI of `https://vikunja.mydomain.com/auth/openid/google`
Note that there currently seems to be no way to stop creation of new users, even when `enableregistration` is `false` in the configuration. This means that this approach works well only with an "Internal Organization" app for Google Workspace, which limits the allowed users to organizational accounts only. External / public applications will potentially allow every Google user to register.
## Keycloak
Vikunja Config:
```yaml
openid:
enabled: true
redirecturl: https://vikunja.mydomain.com/auth/openid/ <---- slash at the end is important
providers:
- name: Keycloak
authurl: https://keycloak.mydomain.com/realms/<relam-name>
logouturl: https://keycloak.mydomain.com/realms/<relam-name>/protocol/openid-connect/logout
clientid: <vikunja-id>
clientsecret: <vikunja secret>
```
Keycloak Config:
- Navigate to the keycloak instance
- Create a new client with the type `OpenID Connect` and a unique ID.
- Set `Client authentication` to On
- Set `Root Url` to `https://vikunja.mydomain.com`
- Set `Valid redirect URIs` to `/auth/openid/keycloak`
- Create the client the navigate to the credentials tab and copy the `Client secret`
## Authentik
Authentik Config:
- Create a new Provider called "Vikunja" in Authentik
- Set the `Redirect URIs/Origins (RegEx)` to `https://vikunja.mydomain.com/auth/openid/authentik`
- Copy the Client ID and Client Secret
Vikunja Config:
```yaml
auth:
openid:
enabled: true
redirecturl: "https://vikunja.mydomain.com/auth/openid/"
providers:
- name: authentik
authurl: "https://authentik.mydomain.com/application/o/vikunja"
logouturl: "https://authentik.mydomain.com/application/o/vikunja/end-session/"
clientid: "" # copy from Authetik
clientsecret: "" # copy from Authentik
```
**Note:** The `authurl` that Vikunja requires is not the `Authorize URL` that you can see in the Provider. Vikunja uses Open ID Discovery to find the correct endpoint to use. Vikunja does this by automatically accessing the `OpenID Configuration URL` (usually `https://authentik.mydomain.com/application/o/vikunja/.well-known/openid-configuration`). Use this URL without the `.well-known/openid-configuration` as the `authurl`.
-152
View File
@@ -1,152 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Reverse Proxy"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Setup behind a reverse proxy
These examples assume you have an instance of Vikunja running on your server listening on port `3456`.
If you've changed this setting, you need to update the server configurations accordingly.
{{< table_of_contents >}}
## NGINX
You may need to adjust `server_name` and `root` accordingly.
```conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:3456;
client_max_body_size 20M;
}
}
```
<div class="notification is-warning">
<b>NOTE:</b> If you change the max upload size in Vikunja's settings, you'll need to also change the <code>client_max_body_size</code> in the nginx proxy config.
</div>
## NGINX Proxy Manager (NPM)
Following the [Docker Walkthrough]({{< ref "docker-start-to-finish.md" >}}) guide, you should be able to get Vikunja to work via HTTP connection to your server IP.
From there, all you have to do is adjust the following things:
### In `docker-compose.yml`
1. Change `VIKUNJA_SERVICE_PUBLICURL:` to your desired domain with `https://` and `/`.
2. Expose your desired port on host under `ports:`.
example:
```yaml
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: https://vikunja.your-domain.com/ # change vikunja.your-domain.com to your desired domain/subdomain.
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: secret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
VIKUNJA_SERVICE_JWTSECRET: <your-random-secret>
ports:
- 3456:3456 # Change 3456 on the left to the port of your choice.
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
```
### In your DNS provider
Add an `A` records that points to your server IP.
You are of course free to change them to whatever domain/subdomain you desire and modify the `docker-compose.yml` accordingly.
(Tested on Cloudflare DNS. Settings are different for different DNS provider, in this case the end result should be `vikunja.your-domain.com`)
### In Nginx Proxy Manager
Add a Proxy Host as you normally would, and you don't have to add anything extra in Advanced.
Under `Details`:
```
Domain Names:
vikunja.your-domain.com
Scheme:
http
Forward Hostname/IP:
your-server-ip
Forward Port:
3456
Cached Assets:
Optional.
Block Common Exploits:
Toggled.
Websockets Support:
Toggled.
```
Under `SSL`:
```
SSL Certificate:
However you prefer.
Force SSL:
Toggled.
HTTP/2 Support:
Toggled.
HSTS Enabled:
Toggled.
HSTS Subdomains:
Toggled.
Use a DNS Challenge:
Not toggled.
Email Address for Let's Encrypt:
your-email@email.com
```
Your Vikunja service should now work and your HTTPS frontend should be able to reach the API after `docker-compose`.
## Apache
Put the following config in `cat /etc/apache2/sites-available/vikunja.conf`:
```aconf
<VirtualHost *:80>
ServerName localhost
<Proxy *>
Order Deny,Allow
Allow from all
</Proxy>
ProxyPass / http://localhost:3456/
ProxyPassReverse / http://localhost:3456/
</VirtualHost>
```
**Note:** The apache modules `proxy`, `proxy_http` and `rewrite` must be enabled for this.
## Caddy
Use the following Caddyfile to get Vikunja up and running:
```conf
vikunja.domainname.tld {
handle /* {
reverse_proxy 127.0.0.1:3456
}
}
```
-49
View File
@@ -1,49 +0,0 @@
---
title: "Running Vikunja in a subdirectory"
date: 2022-09-23T12:15:04+02:00
draft: false
menu:
sidebar:
parent: "setup"
---
# Running Vikunja in a subdirectory
Running Vikunja in a subdirectory is not supported out of the box.
However, you can still run it in a subdirectory but need to build the frontend yourself.
## Frontend
First, make sure you're able to build the frontend from source.
Check [the guide about building from source]({{< ref "build-from-source.md">}}#frontend) about that.
### Dynamicly set with build command
Run the build with the `VIKUNJA_FRONTEND_BASE` variable specified.
```
VIKUNJA_FRONTEND_BASE=/SUBPATH/ pnpm run build
```
Where `SUBPATH` is the subdirectory you want to run Vikunja on.
### Set via .env.local
* Copy `.env.local.example` to `.env.local`
* Uncomment `VIKUNJA_FRONTEND_BASE` and set `/subpath/` to the desired path.
After saving, build Vikunja as normal.
```
pnpm run build
```
Once you have the frontend built, you can proceed to build the binary as outlined in [building from source]({{< ref "build-from-source.md">}}#api).
## API
If you're not using a reverse proxy you're good to go.
Simply configure the api url in the frontend as you normally would.
If you're using a reverse proxy you'll need to adjust the paths so that the api is available at `/SUBPATH/api/v1`.
You can check if everything is working correctly by opening `/SUBPATH/api/v1/info` in a browser.
-23
View File
@@ -1,23 +0,0 @@
---
title: "Typesense"
date: 2023-09-29T12:23:55+02:00
draft: false
menu:
sidebar:
parent: "setup"
---
# Use Typesense for enhanced search capabilities
Vikunja supports using [Typesense](https://typesense.org/) for a better search experience.
Typesense allows fast fulltext search including fuzzy matching support.
It may return different results than what you'd get with a database-only search, but generally, the results are more relevant to what you're looking for.
This document explains how to set up and use Typesense with Vikunja.
## Setup
1. First, install Typesense on your system. Refer to [their documentation](https://typesense.org/docs/guide/install-typesense.html) for specific instructions.
2. Once Typesense is available on your system and reachable by Vikunja, add the relevant configuration keys to your Vikunja config. [Check out the docs article about this]({{< ref "config.md#typesense">}}).
3. Index all tasks currently in Vikunja. To do that, run the `vikunja index` command with the api binary. This may take a while, depending on the size of your instance.
4. Restart the api. From now on, all task changes will be automatically indexed in Typesense.
-105
View File
@@ -1,105 +0,0 @@
---
date: "2020-07-06:00:00+02:00"
title: "UTF-8 Settings"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# UTF-8 Settings
Vikunja itself is always fully capable of handling utf-8 characters.
However, your database might be not. Vikunja itself will work just fine until you want to use non-latin characters in your tasks/projects/etc.
On this page, you will find information about how to fully ensure non-latin characters like *aüäß* or emojis work with your installation.
{{< table_of_contents >}}
## Postgresql & SQLite
Postgresql and SQLite should handle utf-8 just fine - If you discover any issues nonetheless, please
[drop us a message](https://vikunja.io/contact/).
## MySQL
MySQL is not able to handle utf-8 by default.
To fix this, follow the steps below.
To find out if your db supports utf-8, run the following in a shell or similar, assuming the database
you're using for vikunja is called `vikunja`:
```sql
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = 'vikunja';
```
This will get you a result like the following:
```
+----------------------------+
| default_character_set_name |
+----------------------------+
| latin1 |
+----------------------------+
1 row in set (0.001 sec)
```
The charset `latin1` means the db is encoded in the `latin1` encoding which does not support utf-8 characters.
(The following guide is based on [this thread from stackoverflow](https://dba.stackexchange.com/a/104866))
### 0. Backup your database
Before attempting any conversion, please [back up your database]({{< ref "backups.md">}}).
### 1. Create a pre-conversion script
Copy the following sql statements in a file called `preAlterTables.sql` and replace all occurrences of `vikunja` with the name of your database:
```sql
use information_schema;
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like 'vikunja' and TABLE_TYPE='BASE TABLE' group by table_schema;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like 'vikunja' and TABLE_TYPE='BASE TABLE' group by table_schema, table_name;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like 'vikunja' and data_type in ('varchar','char');
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like 'vikunja' and data_type in ('text','tinytext','mediumtext','longtext');
```
### 2. Run the pre-conversion script
Running this will create the actual migration script for your particular database structure and save it in a file called `alterTables.sql`:
```
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
```
### 3. Convert the database
At this point converting is just a matter of executing the previously generated sql script:
```
mysql -uroot < alterTables.sql
```
### 4. Verify it was successfully converted
If everything worked as intended, your db collation should now look like this:
```sql
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = 'vikunja';
```
Should get you:
```
+----------------------------+
| default_character_set_name |
+----------------------------+
| utf8mb4 |
+----------------------------+
1 row in set (0.001 sec)
```
-45
View File
@@ -1,45 +0,0 @@
---
date: "2022-07-07:00:00+02:00"
title: "Versions"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Vikunja Versions
The Vikunja api and frontend are available in two different release flavors.
{{< table_of_contents >}}
## Stable
Stable releases have a fixed version number like `0.18.2` and are published at irregular intervals whenever a new version is ready.
They receive few bugfixes and security patches.
We use [Semantic Versioning](https://semver.org) for these releases.
## Unstable
Unstable versions are build every time a PR is merged or a commit to the main development branch is made.
As such, they contain the current development code and are more likely to have bugs.
There might be multiple new such builds a day.
Versions contain the last stable version, the number of commits since then and the commit the currently running binary was built from.
They look like this: `v0.18.1+269-5cc4927b9e`
The demo instance at [try.vikunja.io](https://try.vikunja.io) automatically updates and always runs the last unstable build.
## Switching between versions
First you should create a backup of your current setup!
Switching between versions is the same process as [upgrading]({{< ref install.md >}}#updating).
Simply replace the stable binary with an unstable one or vice-versa.
For installations using docker, it is as simple as using the `unstable` or `latest` tag to switch between versions.
**Note:** While switching from stable to unstable should work without any problem, switching back might work but is not recommended and might break your instance.
To switch from unstable back to stable the best way is to wait for the next stable release after the used unstable build and then upgrade to that.
-19
View File
@@ -1,19 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "API Documentation"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# API Documentation
You can find the api docs under `http://vikunja.tld/api/v1/docs` of your instance.<br />
A public instance is available on [try.vikunja.io](https://try.vikunja.io/api/v1/docs).
These docs are autogenerated from annotations in the code with swagger.
The specification is hosted at `http://vikunja.tld/api/v1/docs.json`.
You can use this to embed it into other OpenAPI compatible applications if you want.
-144
View File
@@ -1,144 +0,0 @@
---
date: "2019-05-12:00:00+01:00"
title: "CalDAV"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# CalDAV
> **Warning:** The CalDAV integration is in an early alpha stage and has bugs.
> It works well with some clients while having issues with others.
> If you encounter issues, please [report them](https://code.vikunja.io/api/issues/new?body=[caldav])
Vikunja supports managing tasks via the [caldav VTODO](https://tools.ietf.org/html/rfc5545#section-3.6.2) extension.
{{< table_of_contents >}}
## URLs
All urls are located under the `/dav` subspace.
Urls are:
* `/principals/<username>/`: Returns urls for project discovery. *Use this url to initially make connections to new clients.*
* `/projects/`: Used to manage projects
* `/projects/<Project ID>/`: Used to manage a single project
* `/projects/<Project ID>/<Task UID>`: Used to manage a task on a project
## Supported properties
Vikunja currently supports the following properties:
* `UID`
* `SUMMARY`
* `DESCRIPTION`
* `PRIORITY`
* `CATEGORIES`
* `COMPLETED`
* `CREATED` (only Vikunja → Client)
* `DUE`
* `DURATION`
* `DTSTAMP`
* `DTSTART`
* `LAST-MODIFIED` (only Vikunja → Client)
* `RRULE` (Recurrence) (only Vikunja → Client)
* `VALARM` (Reminders)
Vikunja **currently does not** support these properties:
* `ATTACH`
* `CLASS`
* `COMMENT`
* `CONTACT`
* `GEO`
* `LOCATION`
* `ORGANIZER` (disabled)
* `PERCENT-COMPLETE`
* `RECURRENCE-ID`
* `RELATED-TO`
* `RESOURCES`
* `SEQUENCE`
* `STATUS`
* `URL`
## Tested Clients
### Working
* [Evolution](https://wiki.gnome.org/Apps/Evolution/)
* [OpenTasks](https://opentasks.app/) & [DAVx⁵](https://www.davx5.com/)
* [Tasks (Android)](https://tasks.org/)
### Not working
* [Thunderbird (68)](https://www.thunderbird.net/)
* iOS CalDAV Sync (See [#753](https://kolaente.dev/vikunja/vikunja/issues/753))
## Dev logs
The whole thing is not optimized at all and probably pretty inefficient.
Request body and headers are logged if the debug output is enabled.
```
Creating a new task:
PUT /dav/lists/1/cd4dd0e1b3c19cc9d787829b6e08be536e3df3a4.ics
Body:
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VTODO
UID:cd4dd0e1b3c19cc9d787829b6e08be536e3df3a4
DTSTAMP:20190508T134538Z
SUMMARY:test2000
PRIORITY:0
CLASS:PUBLIC
CREATED:20190508T134710Z
LAST-MODIFIED:20190508T134710Z
END:VTODO
END:VCALENDAR
Marking a task as done:
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VTODO
UID:3ada92f28b4ceda38562ebf047c6ff05400d4c572352a
DTSTAMP:20190511T183631
DTSTART:19700101T000000
DTEND:19700101T000000
SUMMARY:sdgs
ORGANIZER;CN=:user
CREATED:20190511T183631
PRIORITY:0
LAST-MODIFIED:20190512T193428Z
COMPLETED:20190512T193428Z
PERCENT-COMPLETE:100
STATUS:COMPLETED
END:VTODO
END:VCALENDAR
Requests from the app:::
[CALDAV] Request Body: <?xml version="1.0" encoding="UTF-8" ?><propfind xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav"><prop><current-user-principal /></prop></propfind>
[CALDAV] GetResources: rpath: /dav/
2019-05-18T23:25:49.971140654+02:00: WEB ▶ 192.168.1.134 PROPFIND 207 /dav/ 1.021705664s - okhttp/3.12.2
[CALDAV] Request Body: <?xml version="1.0" encoding="UTF-8" ?><propfind xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav"><prop><CAL:calendar-home-set /></prop></propfind>
[CALDAV] GetResources: rpath: /dav/
2019-05-18T23:25:52.166996113+02:00: WEB ▶ 192.168.1.134 PROPFIND 207 /dav/ 1.042834467s - okhttp/3.12.2
And then it just stops.
... and complains about not being able to find the home set
... without even requesting it...
```
-207
View File
@@ -1,207 +0,0 @@
---
date: "2019-03-31:00:00+01:00"
title: "CLI"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Command line interface
You can interact with Vikunja using its `cli` interface.<br />
The following commands are available:
* [dump](#dump)
* [help](#help)
* [migrate](#migrate)
* [restore](#restore)
* [testmail](#testmail)
* [user](#user)
* [version](#version)
* [web](#web)
If you don't specify a command, the [`web`](#web) command will be executed.
All commands use the same standard [config file]({{< ref "../setup/config.md">}}).
## Using the cli in docker
When running Vikunja in docker, you'll need to execute all commands in the `api` container.
Instead of running the `vikunja` binary directly, run it like this:
```sh
docker exec <name of the vikunja api container> /app/vikunja/vikunja <subcommand>
```
### `dump`
Creates a zip file with all vikunja-related files.
This includes config, version, all files and the full database.
Usage:
```
$ vikunja dump
```
### `help`
Shows more detailed help about any command.
Usage:
```
$ vikunja help [command]
```
### `migrate`
Run all database migrations which didn't already run.
Usage:
```
$ vikunja migrate [flags]
$ vikunja migrate [command]
```
#### `migrate list`
Shows a list with all database migrations.
Usage:
```
$ vikunja migrate list
```
#### `migrate rollback`
Roll migrations back until a certain point.
Usage:
```
$ vikunja migrate rollback [flags]
```
Flags:
* `-n`, `--name` string: The id of the migration you want to roll back until.
### `restore`
Restores a previously created dump from a zip file, see `dump`.
Usage:
```
$ vikunja restore <path to dump zip file>
```
### `testmail`
Sends a test mail using the configured smtp connection.
Usage:
```
$ vikunja testmail <email to send the test mail to>
```
### `user`
Bundles a few commands to manage users.
#### `user change-status`
Enable or disable a user. Will toggle the current status if no flag (`--enable` or `--disable`) is provided.
Usage:
```
$ vikunja user change-status <user id> <flags>
```
Flags:
* `-d`, `--disable`: Disable the user.
* `-e`, `--enable`: Enable the user.
#### `user create`
Create a new user.
Usage:
```
$ vikunja user create <flags>
```
Flags:
* `-a`, `--avatar-provider`: The avatar provider of the new user. Optional.
* `-e`, `--email`: The email address of the new user.
* `-p`, `--password`: The password of the new user. You will be asked to enter it if not provided through the flag.
* `-u`, `--username`: The username of the new user.
#### `user delete`
Start the user deletion process.
If called without the `--now` flag, this command will only trigger an email to the user in order for them to confirm and start the deletion process (this is the same behavoir as if the user requested their deletion via the web interface).
With the flag the user is deleted **immediately**.
**USE WITH CAUTION.**
```
$ vikunja user delete <id> <flags>
```
Flags:
* `-n`, `--now` If provided, deletes the user immediately instead of emailing them first.
#### `user list`
Shows a list of all users.
Usage:
```
$ vikunja user list
```
#### `user reset-password`
Reset a users password, either through mailing them a reset link or directly.
Usage:
```
$ vikunja user reset-password <flags>
```
Flags:
* `-d`, `--direct`: If provided, reset the password directly instead of sending the user a reset mail.
* `-p`, `--password`: The new password of the user. Only used in combination with --direct. You will be asked to enter it if not provided through the flag.
#### `user update`
Update an existing user.
Usage:
```
$ vikunja user update <user id>
```
Flags:
* `-a`, `--avatar-provider`: The new avatar provider of the new user.
* `-e`, `--email`: The new email address of the user.
* `-u`, `--username`: The new username of the user.
### `version`
Prints the version of Vikunja.
This is either the semantic version (something like `0.7`) or version + git commit hash.
Usage:
```
$ vikunja version
```
### `web`
Starts Vikunja's REST api server.
Usage:
```
$ vikunja web
```
-161
View File
@@ -1,161 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Errors"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Errors
This document describes the different errors Vikunja can return.
{{< table_of_contents >}}
## Generic
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 0001 | 403 | Generic forbidden error. |
## User
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 1001 | 400 | A user with this username already exists. |
| 1002 | 400 | A user with this email address already exists. |
| 1004 | 400 | No username and password specified. |
| 1005 | 404 | The user does not exist. |
| 1006 | 400 | Could not get the user id. |
| 1008 | 412 | No password reset token provided. |
| 1009 | 412 | Invalid password reset token. |
| 1010 | 412 | Invalid email confirm token. |
| 1011 | 412 | Wrong username or password. |
| 1012 | 412 | Email address of the user not confirmed. |
| 1013 | 412 | New password is empty. |
| 1014 | 412 | Old password is empty. |
| 1015 | 412 | Totp is already enabled for this user. |
| 1016 | 412 | Totp is not enabled for this user. |
| 1017 | 412 | The provided Totp passcode is invalid. |
| 1018 | 412 | The provided user avatar provider type setting is invalid. |
| 1019 | 412 | No openid email address was provided. |
| 1020 | 412 | This user account is disabled. |
| 1021 | 412 | This account is managed by a third-party authentication provider. |
| 1021 | 412 | The username must not contain spaces. |
## Validation
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 2001 | 400 | ID cannot be empty or 0. |
| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. |
## Project
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------------------------------------------------------------------------------------------------------------------------------|
| 3001 | 404 | The project does not exist. |
| 3004 | 403 | The user needs to have read permissions on that project to perform that action. |
| 3005 | 400 | The project title cannot be empty. |
| 3006 | 404 | The project share does not exist. |
| 3007 | 400 | A project with this identifier already exists. |
| 3008 | 412 | The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project. |
| 3009 | 412 | The project cannot belong to a dynamically generated parent project like "Favorites". |
| 3010 | 412 | This project cannot be a child of itself. |
| 3011 | 412 | This project cannot have a cyclic relationship to a parent project. |
| 3012 | 412 | This project cannot be deleted because a user has set it as their default project. |
| 3013 | 412 | This project cannot be archived because a user has set it as their default project. |
## Task
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|----------------------------------------------------------------------------|
| 4001 | 400 | The project task text cannot be empty. |
| 4002 | 404 | The project task does not exist. |
| 4003 | 403 | All bulk editing tasks must belong to the same project. |
| 4004 | 403 | Need at least one task when bulk editing tasks. |
| 4005 | 403 | The user does not have the right to see the task. |
| 4006 | 403 | The user tried to set a parent task as the task itself. |
| 4007 | 400 | The user tried to create a task relation with an invalid kind of relation. |
| 4008 | 409 | The user tried to create a task relation which already exists. |
| 4009 | 404 | The task relation does not exist. |
| 4010 | 400 | Cannot relate a task with itself. |
| 4011 | 404 | The task attachment does not exist. |
| 4012 | 400 | The task attachment is too large. |
| 4013 | 400 | The task sort param is invalid. |
| 4014 | 400 | The task sort order is invalid. |
| 4015 | 404 | The task comment does not exist. |
| 4016 | 400 | Invalid task field. |
| 4017 | 400 | Invalid task filter comparator. |
| 4018 | 400 | Invalid task filter concatinator. |
| 4019 | 400 | Invalid task filter value. |
| 4020 | 400 | The provided attachment does not belong to that task. |
| 4021 | 400 | This user is already assigned to that task. |
| 4022 | 400 | The task has a relative reminder which does not specify relative to what. |
| 4023 | 409 | Tried to create a task relation which would create a cycle. |
## Team
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|----------------------------------------------------------------------|
| 6001 | 400 | The team name cannot be empty. |
| 6002 | 404 | The team does not exist. |
| 6004 | 409 | The team already has access to that project. |
| 6005 | 409 | The user is already a member of that team. |
| 6006 | 400 | Cannot delete the last team member. |
| 6007 | 403 | The team does not have access to the project to perform that action. |
## User Project Access
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 7002 | 409 | The user already has access to that project. |
| 7003 | 403 | The user does not have access to that project. |
## Label
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 8001 | 403 | This label already exists on that task. |
| 8002 | 404 | The label does not exist. |
| 8003 | 403 | The user does not have access to this label. |
## Right
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 9001 | 403 | The right is invalid. |
## Kanban
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 10001 | 404 | The bucket does not exist. |
| 10002 | 400 | The bucket does not belong to that project. |
| 10003 | 412 | You cannot remove the last bucket on a project. |
| 10004 | 412 | You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold. |
| 10005 | 412 | There can be only one done bucket per project. |
## Saved Filters
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 11001 | 404 | The saved filter does not exist. |
| 11002 | 412 | Saved filters are not available for link shares. |
## Subscriptions
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 12001 | 412 | The subscription entity type is invalid. |
| 12002 | 412 | The user is already subscribed to the entity itself or a parent entity. |
## Link Shares
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|--------------------------------------------------------------------------------|
| 13001 | 412 | This link share requires a password for authentication, but none was provided. |
| 13002 | 403 | The provided link share password is invalid. |
| 13003 | 400 | The provided link share token is invalid. |
-43
View File
@@ -1,43 +0,0 @@
---
title: "n8n"
date: 2023-10-24T19:31:35+02:00
draft: false
menu:
sidebar:
parent: "usage"
---
# Using Vikunja with n8n
Vikunja maintains a [community node](https://github.com/go-vikunja/n8n-vikunja-nodes) for [n8n](https://n8n.io),
allowing you to easily integrate Vikunja with all kinds of other tools and services.
{{< table_of_contents >}}
## Installation
To install the node in your n8n installation:
1. In your n8n instance, go to **Settings > Community Nodes**.
2. Select Install.
3. Enter `n8n-nodes-vikunja` as the npm Package Name
4. Agree to the risks of using community nodes: select I understand the risks of installing unverified code from a
public source.
5. Select Install. n8n installs the node, and returns to the Community Nodes list in Settings.
6. Vikunja actions and triggers are now available in n8n.
[Official n8n docs about the installation](https://docs.n8n.io/integrations/community-nodes/installation/)
## Authentication
To authenticate your automation against Vikunja:
1. In Vikunja, go to **Settings > API Tokens** and create a new token. Use all scopes for the kind of task you want to
do. \
*Note:* If you want to use the webhook trigger node, the api token should have permissions to create, read and delete
webhooks.
2. Now in n8n, go to **Credentials** and then click on **Add Credential**.
3. Search for `Vikunja API` and click *Continue*
4. Enter the API key you created in step 1.
5. Enter the API URL of your Vikunja instance, with `/api/v1` suffix.
6. When you now create a Vikunja node, select the created credentials.
-25
View File
@@ -1,25 +0,0 @@
---
date: "2019-09-25:00:00+02:00"
title: "Task Relation kinds"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Available task relation kinds
| Code | Description | Opposite of |
|------|-------------|-------------|
| `subtask` | Task is a subtask of the other task. | `parenttask` |
| `parenttask` | Task is a parent task of the other task. | `subtask` |
| `related` | Both tasks are related to each other.<br /> How is not more specified. | ⸺ |
| `duplicateof` | Task is a duplicate of the other task. | `duplicates` |
| `duplicates` | Task duplicates the other task. | `duplicateof` |
| `blocking` | Task is blocking the other task. | `blocked` |
| `blocked` | Task is blocked by the other task. | `blocking` |
| `precedes` | Task precedes the other task. | `follows` |
| `follows` | Task follows the other task. | `precedes` |
| `copiedfrom` | Task is copied from the other task. | `copiedto` |
| `copiedto` | Task is copied to the other task. | `copiedfrom` |
-29
View File
@@ -1,29 +0,0 @@
---
date: "2019-02-12:00:00+02:00"
title: "Rights"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Project rights for teams and users
Whenever you share a project with a user or team, you can specify a `rights` parameter.
This parameter controls the rights that team or user is going to have (or has, if you request the current sharing status).
Rights are being specified using integers.
The following values are possible:
| Right (int) | Meaning |
|-------------|-------------------------------------------------------------------------------------------------|
| 0 (Default) | Read only. Anything which is shared with this right cannot be edited. |
| 1 | Read and write. Projects shared with this right can be read and written to by the team or user. |
| 2 | Admin. Can do anything like read and write, but can additionally manage sharing options. |
## Team admins
When adding or querying a team, every member has an additional boolean value stating if it is admin or not.
A team admin can also add and remove team members and also change whether a user in the team is admin or not.
-58
View File
@@ -1,58 +0,0 @@
---
title: "Webhooks"
date: 2023-10-17T19:51:32+02:00
draft: false
type: doc
menu:
sidebar:
parent: "usage"
---
# Webhooks
Starting with version 0.22.0, Vikunja allows you to define webhooks to notify other services of events happening within Vikunja.
{{< table_of_contents >}}
## How to create webhooks
To create a webhook, in the project options select "Webhooks". The form will allow you to create and modify webhooks.
Check out [the api docs](https://try.vikunja.io/api/v1/docs#tag/webhooks) for information about how to create webhooks programatically.
## Available events and their payload
All events registered as webhook events in [the event listeners definition](https://kolaente.dev/vikunja/vikunja/src/branch/main/pkg/models/listeners.go#L69) can be used as webhook target.
A webhook payload will look similar to this:
```json
{
"event_name": "task.created",
"time": "2023-10-17T19:39:32.924194436+02:00",
"data": {}
}
```
The `data` property will contain the raw event data as it was registered in the `listeners.go` file.
The `time` property holds the time when the webhook payload data was sent.
It always uses the ISO 8601 format with date, time and time zone offset.
## Security considerations
### Signing
Vikunja allows you to provide a secret when creating the webhook.
If you set a secret, all outgoing webhook requests will contain an `X-Vikunja-Signature` header with an HMAC signature over the webhook json payload.
Check out [webhooks.fyi](https://webhooks.fyi/security/hmac) for more information about how to validate the HMAC signature.
### Hosting webhook infrastructure
Vikunja has support to use [mole](https://github.com/frain-dev/mole) as a proxy for outgoing webhook requests.
This allows you to prevent SSRF attacts on your own infrastructure.
You should use this and [configure it appropriately]({{< ref "../setup/config.md">}}#webhooks) if you're not the only one using your Vikunja instance.
Check out [webhooks.fyi](https://webhooks.fyi/best-practices/webhook-providers#implement-security-on-egress-communication) for more information about the attack vector and reasoning to prevent this.
-33
View File
@@ -1,33 +0,0 @@
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /docs/404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /docs/contact {
return 301 $scheme://vikunja.io/en/contact;
}
location /docs/docs {
return 301 $scheme://vikunja.io/docs;
}
location /docs/install-backend {
return 301 $scheme://vikunja.io/docs/installing;
}
location /docs/install-frontend {
return 301 $scheme://vikunja.io/docs/installing;
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 KiB

-1
View File
@@ -1 +0,0 @@
use flake
+6 -3
View File
@@ -23,7 +23,9 @@ module.exports = {
// uncategorized rules:
'vue/component-api-style': ['error', ['script-setup']],
'vue/component-name-in-template-casing': ['warn', 'PascalCase'],
'vue/component-name-in-template-casing': ['error', 'PascalCase', {
'globals': ['RouterView', 'RouterLink', 'Icon', 'Notifications', 'Modal', 'Card'],
}],
'vue/custom-event-name-casing': ['error', 'camelCase'],
'vue/define-macros-order': 'error',
'vue/match-component-file-name': ['error', {
@@ -40,18 +42,19 @@ module.exports = {
'error',
{ 'script': { 'lang': 'ts' } },
],
'vue/no-required-prop-with-default': ['error', { 'autofix': true }],
'vue/no-duplicate-attr-inheritance': 'error',
'vue/no-empty-component-block': 'error',
'vue/html-indent': ['error', 'tab'],
// vue3
'vue/no-ref-object-destructure': 'error',
'vue/no-ref-object-reactivity-loss': 'error',
'vue/no-setup-props-reactivity-loss': 'warn', // TODO: switch to error after vite `propsDestructure` is removed
},
'parser': 'vue-eslint-parser',
'parserOptions': {
'parser': '@typescript-eslint/parser',
'ecmaVersion': 'latest',
'tsconfigRootDir': __dirname,
},
'ignorePatterns': [
'*.test.*',
+2 -2
View File
@@ -10,10 +10,10 @@ stats.html
node_modules
.DS_Store
/dist*
dist
coverage
*.zip
.direnv/
.vite/
# Test files
cypress/screenshots
-14
View File
@@ -1,14 +0,0 @@
fetch-timeout=100000
# pnpm settings
# The following settings prepare for the new default value of pnpm 8
# they can be removed directly after having moved to pnpm 8
auto-install-peers=true
dedupe-peer-dependents=true
resolve-peers-from-workspace-root=true
save-workspace-protocol=rolling
resolution-mode=lowest-direct
publishConfig.linkDirectory=true
# remove some time after having moved to pnpm 8
use-lockfile-v6=true
+1 -1
View File
@@ -1 +1 @@
20.11.0
20.16.0
@@ -1,15 +1,50 @@
import {ProjectFactory} from '../../factories/project'
import {TaskFactory} from '../../factories/task'
import {ProjectViewFactory} from "../../factories/project_view";
export function createDefaultViews(projectId) {
ProjectViewFactory.truncate()
const list = ProjectViewFactory.create(1, {
id: 1,
project_id: projectId,
view_kind: 0,
}, false)
const gantt = ProjectViewFactory.create(1, {
id: 2,
project_id: projectId,
view_kind: 1,
}, false)
const table = ProjectViewFactory.create(1, {
id: 3,
project_id: projectId,
view_kind: 2,
}, false)
const kanban = ProjectViewFactory.create(1, {
id: 4,
project_id: projectId,
view_kind: 3,
bucket_configuration_mode: 1,
}, false)
return [
list[0],
gantt[0],
table[0],
kanban[0],
]
}
export function createProjects() {
const projects = ProjectFactory.create(1, {
title: 'First Project'
})
TaskFactory.truncate()
projects.views = createDefaultViews(projects[0].id)
return projects
}
export function prepareProjects(setProjects = (...args: any[]) => {}) {
export function prepareProjects(setProjects = (...args: any[]) => {
}) {
beforeEach(() => {
const projects = createProjects()
setProjects(projects)
@@ -2,6 +2,7 @@ import {createFakeUserAndLogin} from '../../support/authenticateUser'
import {ProjectFactory} from '../../factories/project'
import {prepareProjects} from './prepareProjects'
import {ProjectViewFactory} from '../../factories/project_view'
describe('Project History', () => {
createFakeUserAndLogin()
@@ -11,24 +12,31 @@ describe('Project History', () => {
cy.intercept(Cypress.env('API_URL') + '/projects*').as('loadProjectArray')
cy.intercept(Cypress.env('API_URL') + '/projects/*').as('loadProject')
const projects = ProjectFactory.create(6)
const projects = ProjectFactory.create(7)
ProjectViewFactory.truncate()
projects.forEach(p => ProjectViewFactory.create(1, {
id: p.id,
project_id: p.id,
}, false))
cy.visit('/')
cy.wait('@loadProjectArray')
cy.get('body')
.should('not.contain', 'Last viewed')
cy.visit(`/projects/${projects[0].id}`)
cy.visit(`/projects/${projects[0].id}/${projects[0].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[1].id}`)
cy.visit(`/projects/${projects[1].id}/${projects[1].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[2].id}`)
cy.visit(`/projects/${projects[2].id}/${projects[2].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[3].id}`)
cy.visit(`/projects/${projects[3].id}/${projects[3].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[4].id}`)
cy.visit(`/projects/${projects[4].id}/${projects[4].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[5].id}`)
cy.visit(`/projects/${projects[5].id}/${projects[5].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[6].id}/${projects[6].id}`)
cy.wait('@loadProject')
// cy.visit('/')
@@ -46,5 +54,6 @@ describe('Project History', () => {
.should('contain', projects[3].title)
.should('contain', projects[4].title)
.should('contain', projects[5].title)
.should('contain', projects[6].title)
})
})
@@ -11,7 +11,7 @@ describe('Project View Gantt', () => {
it('Hides tasks with no dates', () => {
const tasks = TaskFactory.create(1)
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.g-gantt-rows-container')
.should('not.contain', tasks[0].title)
@@ -25,7 +25,7 @@ describe('Project View Gantt', () => {
nextMonth.setDate(1)
nextMonth.setMonth(9)
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.g-timeunits-container')
.should('contain', format(now, 'MMMM'))
@@ -38,7 +38,7 @@ describe('Project View Gantt', () => {
start_date: now.toISOString(),
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
})
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.g-gantt-rows-container')
.should('not.be.empty')
@@ -50,10 +50,10 @@ describe('Project View Gantt', () => {
start_date: null,
end_date: null,
})
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.gantt-options .fancycheckbox')
.contains('Show tasks which don\'t have dates set')
cy.get('.gantt-options .fancy-checkbox')
.contains('Show tasks without dates')
.click()
cy.get('.g-gantt-rows-container')
@@ -69,7 +69,7 @@ describe('Project View Gantt', () => {
start_date: now.toISOString(),
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
})
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.g-gantt-rows-container .g-gantt-row .g-gantt-row-bars-container div .g-gantt-bar')
.first()
@@ -83,7 +83,7 @@ describe('Project View Gantt', () => {
const now = Date.UTC(2022, 10, 9)
cy.clock(now, ['Date'])
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.project-gantt .gantt-options .field .control input.input.form-control')
.click()
@@ -99,7 +99,7 @@ describe('Project View Gantt', () => {
})
it('Should change the date range based on date query parameters', () => {
cy.visit('/projects/1/gantt?dateFrom=2022-09-25&dateTo=2022-11-05')
cy.visit('/projects/1/2?dateFrom=2022-09-25&dateTo=2022-11-05')
cy.get('.g-timeunits-container')
.should('contain', 'September 2022')
@@ -115,7 +115,7 @@ describe('Project View Gantt', () => {
start_date: formatISO(now),
end_date: formatISO(now.setDate(now.getDate() + 4)),
})
cy.visit('/projects/1/gantt')
cy.visit('/projects/1/2')
cy.get('.gantt-container .g-gantt-chart .g-gantt-row-bars-container .g-gantt-bar')
.dblclick()
@@ -4,35 +4,64 @@ import {BucketFactory} from '../../factories/bucket'
import {ProjectFactory} from '../../factories/project'
import {TaskFactory} from '../../factories/task'
import {prepareProjects} from './prepareProjects'
import {ProjectViewFactory} from "../../factories/project_view";
import {TaskBucketFactory} from "../../factories/task_buckets";
function createSingleTaskInBucket(count = 1, attrs = {}) {
const projects = ProjectFactory.create(1)
const buckets = BucketFactory.create(2, {
const views = ProjectViewFactory.create(1, {
id: 1,
project_id: projects[0].id,
view_kind: 3,
bucket_configuration_mode: 1,
})
const buckets = BucketFactory.create(2, {
project_view_id: views[0].id,
})
const tasks = TaskFactory.create(count, {
project_id: projects[0].id,
bucket_id: buckets[0].id,
...attrs,
})
return tasks[0]
TaskBucketFactory.create(1, {
task_id: tasks[0].id,
bucket_id: buckets[0].id,
project_view_id: views[0].id,
})
return {
task: tasks[0],
view: views[0],
project: projects[0],
}
}
function createTaskWithBuckets(buckets, count = 1) {
const data = TaskFactory.create(10, {
project_id: 1,
})
TaskBucketFactory.truncate()
data.forEach(t => TaskBucketFactory.create(count, {
task_id: t.id,
bucket_id: buckets[0].id,
project_view_id: buckets[0].project_view_id,
}, false))
return data
}
describe('Project View Kanban', () => {
createFakeUserAndLogin()
prepareProjects()
let buckets
beforeEach(() => {
buckets = BucketFactory.create(2)
buckets = BucketFactory.create(2, {
project_view_id: 4,
})
})
it('Shows all buckets with their tasks', () => {
const data = TaskFactory.create(10, {
project_id: 1,
bucket_id: 1,
})
cy.visit('/projects/1/kanban')
const data = createTaskWithBuckets(buckets, 10)
cy.visit('/projects/1/4')
cy.get('.kanban .bucket .title')
.contains(buckets[0].title)
@@ -46,11 +75,8 @@ describe('Project View Kanban', () => {
})
it('Can add a new task to a bucket', () => {
TaskFactory.create(2, {
project_id: 1,
bucket_id: 1,
})
cy.visit('/projects/1/kanban')
createTaskWithBuckets(buckets, 2)
cy.visit('/projects/1/4')
cy.get('.kanban .bucket')
.contains(buckets[0].title)
@@ -68,7 +94,7 @@ describe('Project View Kanban', () => {
})
it('Can create a new bucket', () => {
cy.visit('/projects/1/kanban')
cy.visit('/projects/1/4')
cy.get('.kanban .bucket.new-bucket .button')
.click()
@@ -82,7 +108,7 @@ describe('Project View Kanban', () => {
})
it('Can set a bucket limit', () => {
cy.visit('/projects/1/kanban')
cy.visit('/projects/1/4')
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
.first()
@@ -90,9 +116,9 @@ describe('Project View Kanban', () => {
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .dropdown-item')
.contains('Limit: Not Set')
.click()
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .dropdown-item .field input.input')
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .field input.input')
.first()
.type(3)
.type('3')
cy.get('[data-cy="setBucketLimit"]')
.first()
.click()
@@ -103,7 +129,7 @@ describe('Project View Kanban', () => {
})
it('Can rename a bucket', () => {
cy.visit('/projects/1/kanban')
cy.visit('/projects/1/4')
cy.get('.kanban .bucket .bucket-header .title')
.first()
@@ -114,7 +140,7 @@ describe('Project View Kanban', () => {
})
it('Can delete a bucket', () => {
cy.visit('/projects/1/kanban')
cy.visit('/projects/1/4')
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
.first()
@@ -122,7 +148,7 @@ describe('Project View Kanban', () => {
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .dropdown-item')
.contains('Delete')
.click()
cy.get('.modal-mask .modal-container .modal-content .header')
cy.get('.modal-mask .modal-container .modal-content .modal-header')
.should('contain', 'Delete the bucket')
cy.get('.modal-mask .modal-container .modal-content .actions .button')
.contains('Do it!')
@@ -137,17 +163,14 @@ describe('Project View Kanban', () => {
})
it('Can drag tasks around', () => {
const tasks = TaskFactory.create(2, {
project_id: 1,
bucket_id: 1,
})
cy.visit('/projects/1/kanban')
const tasks = createTaskWithBuckets(buckets, 2)
cy.visit('/projects/1/4')
cy.get('.kanban .bucket .tasks .task')
.contains(tasks[0].title)
.first()
.drag('.kanban .bucket:nth-child(2) .tasks')
cy.get('.kanban .bucket:nth-child(2) .tasks')
.should('contain', tasks[0].title)
cy.get('.kanban .bucket:nth-child(1) .tasks')
@@ -155,12 +178,8 @@ describe('Project View Kanban', () => {
})
it('Should navigate to the task when the task card is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
project_id: 1,
bucket_id: 1,
})
cy.visit('/projects/1/kanban')
const tasks = createTaskWithBuckets(buckets, 5)
cy.visit('/projects/1/4')
cy.get('.kanban .bucket .tasks .task')
.contains(tasks[0].title)
@@ -168,28 +187,33 @@ describe('Project View Kanban', () => {
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`, { timeout: 1000 })
.should('contain', `/tasks/${tasks[0].id}`, {timeout: 1000})
})
it('Should remove a task from the kanban board when moving it to another project', () => {
const projects = ProjectFactory.create(2)
BucketFactory.create(2, {
const views = ProjectViewFactory.create(2, {
project_id: '{increment}',
view_kind: 3,
bucket_configuration_mode: 1,
})
BucketFactory.create(2)
const tasks = TaskFactory.create(5, {
id: '{increment}',
project_id: 1,
bucket_id: 1,
})
TaskBucketFactory.create(5, {
project_view_id: 1,
})
const task = tasks[0]
cy.visit('/projects/1/kanban')
cy.visit('/projects/1/'+views[0].id)
cy.get('.kanban .bucket .tasks .task')
.contains(task.title)
.should('be.visible')
.click()
cy.get('.task-view .action-buttons .button', { timeout: 3000 })
cy.get('.task-view .action-buttons .button', {timeout: 3000})
.contains('Move')
.click()
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
@@ -201,27 +225,23 @@ describe('Project View Kanban', () => {
.first()
.click()
cy.get('.global-notification', { timeout: 1000 })
cy.get('.global-notification', {timeout: 1000})
.should('contain', 'Success')
cy.go('back')
cy.get('.kanban .bucket')
.should('not.contain', task.title)
})
it('Shows a button to filter the kanban board', () => {
const data = TaskFactory.create(10, {
project_id: 1,
bucket_id: 1,
})
cy.visit('/projects/1/kanban')
cy.visit('/projects/1/4')
cy.get('.project-kanban .filter-container .base-button')
.should('exist')
})
it('Should remove a task from the board when deleting it', () => {
const task = createSingleTaskInBucket(5)
cy.visit('/projects/1/kanban')
const {task, view} = createSingleTaskInBucket(5)
cy.visit(`/projects/1/${view.id}`)
cy.get('.kanban .bucket .tasks .task')
.contains(task.title)
@@ -231,7 +251,7 @@ describe('Project View Kanban', () => {
.should('be.visible')
.contains('Delete')
.click()
cy.get('.modal-mask .modal-container .modal-content .header')
cy.get('.modal-mask .modal-container .modal-content .modal-header')
.should('contain', 'Delete this task')
cy.get('.modal-mask .modal-container .modal-content .actions .button')
.contains('Do it!')
@@ -239,18 +259,18 @@ describe('Project View Kanban', () => {
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.kanban .bucket .tasks')
.should('not.contain', task.title)
})
it('Should show a task description icon if the task has a description', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/1/buckets**').as('loadTasks')
const task = createSingleTaskInBucket(1, {
cy.intercept(Cypress.env('API_URL') + '/projects/1/views/*/tasks**').as('loadTasks')
const {task, view} = createSingleTaskInBucket(1, {
description: 'Lorem Ipsum',
})
cy.visit(`/projects/${task.project_id}/kanban`)
cy.visit(`/projects/${task.project_id}/${view.id}`)
cy.wait('@loadTasks')
cy.get('.bucket .tasks .task .footer .icon svg')
@@ -258,12 +278,12 @@ describe('Project View Kanban', () => {
})
it('Should not show a task description icon if the task has an empty description', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/1/buckets**').as('loadTasks')
const task = createSingleTaskInBucket(1, {
cy.intercept(Cypress.env('API_URL') + '/projects/1/views/*/tasks**').as('loadTasks')
const {task, view} = createSingleTaskInBucket(1, {
description: '',
})
cy.visit(`/projects/${task.project_id}/kanban`)
cy.visit(`/projects/${task.project_id}/${view.id}`)
cy.wait('@loadTasks')
cy.get('.bucket .tasks .task .footer .icon svg')
@@ -271,15 +291,15 @@ describe('Project View Kanban', () => {
})
it('Should not show a task description icon if the task has a description containing only an empty p tag', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/1/buckets**').as('loadTasks')
const task = createSingleTaskInBucket(1, {
cy.intercept(Cypress.env('API_URL') + '/projects/1/views/*/tasks**').as('loadTasks')
const {task, view} = createSingleTaskInBucket(1, {
description: '<p></p>',
})
cy.visit(`/projects/${task.project_id}/kanban`)
cy.visit(`/projects/${task.project_id}/${view.id}`)
cy.wait('@loadTasks')
cy.get('.bucket .tasks .task .footer .icon svg')
.should('not.exist')
})
})
})
@@ -5,15 +5,16 @@ import {TaskFactory} from '../../factories/task'
import {UserFactory} from '../../factories/user'
import {ProjectFactory} from '../../factories/project'
import {prepareProjects} from './prepareProjects'
import {BucketFactory} from '../../factories/bucket'
describe('Project View Project', () => {
describe('Project View List', () => {
createFakeUserAndLogin()
prepareProjects()
it('Should be an empty project', () => {
cy.visit('/projects/1')
cy.url()
.should('contain', '/projects/1/list')
.should('contain', '/projects/1/1')
cy.get('.project-title')
.should('contain', 'First Project')
cy.get('.project-title-dropdown')
@@ -24,6 +25,10 @@ describe('Project View Project', () => {
})
it('Should create a new task', () => {
BucketFactory.create(2, {
project_view_id: 4,
})
const newTaskTitle = 'New task'
cy.visit('/projects/1')
@@ -38,7 +43,7 @@ describe('Project View Project', () => {
id: '{increment}',
project_id: 1,
})
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.get('.tasks .task .tasktext')
.contains(tasks[0].title)
@@ -63,7 +68,7 @@ describe('Project View Project', () => {
cy.get('.project-title-wrapper .icon')
.should('not.exist')
cy.get('input.input[placeholder="Add a new task..."')
cy.get('input.input[placeholder="Add a task..."')
.should('not.exist')
})
@@ -88,10 +93,10 @@ describe('Project View Project', () => {
title: i => `task${i}`,
project_id: 1,
})
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.get('.tasks')
.should('contain', tasks[1].title)
.should('contain', tasks[20].title)
cy.get('.tasks')
.should('not.contain', tasks[99].title)
@@ -104,6 +109,6 @@ describe('Project View Project', () => {
cy.get('.tasks')
.should('contain', tasks[99].title)
cy.get('.tasks')
.should('not.contain', tasks[1].title)
.should('not.contain', tasks[20].title)
})
})
@@ -1,13 +1,15 @@
import {createFakeUserAndLogin} from '../../support/authenticateUser'
import {TaskFactory} from '../../factories/task'
import {prepareProjects} from './prepareProjects'
describe('Project View Table', () => {
createFakeUserAndLogin()
prepareProjects()
it('Should show a table with tasks', () => {
const tasks = TaskFactory.create(1)
cy.visit('/projects/1/table')
cy.visit('/projects/1/3')
cy.get('.project-table table.table')
.should('exist')
@@ -17,15 +19,15 @@ describe('Project View Table', () => {
it('Should have working column switches', () => {
TaskFactory.create(1)
cy.visit('/projects/1/table')
cy.visit('/projects/1/3')
cy.get('.project-table .filter-container .items .button')
cy.get('.project-table .filter-container .button')
.contains('Columns')
.click()
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox')
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancy-checkbox')
.contains('Priority')
.click()
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox')
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancy-checkbox')
.contains('Done')
.click()
@@ -42,7 +44,7 @@ describe('Project View Table', () => {
id: '{increment}',
project_id: 1,
})
cy.visit('/projects/1/table')
cy.visit('/projects/1/3')
cy.get('.project-table table.table')
.contains(tasks[0].title)
+4 -4
View File
@@ -33,14 +33,14 @@ describe('Projects', () => {
})
it('Should redirect to a specific project view after visited', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/*/buckets*').as('loadBuckets')
cy.visit('/projects/1/kanban')
cy.intercept(Cypress.env('API_URL') + '/projects/*/views/*/tasks**').as('loadBuckets')
cy.visit('/projects/1/4')
cy.url()
.should('contain', '/projects/1/kanban')
.should('contain', '/projects/1/4')
cy.wait('@loadBuckets')
cy.visit('/projects/1')
cy.url()
.should('contain', '/projects/1/kanban')
.should('contain', '/projects/1/4')
})
it('Should rename the project in all places', () => {
@@ -1,9 +1,9 @@
import {LinkShareFactory} from '../../factories/link_sharing'
import {ProjectFactory} from '../../factories/project'
import {TaskFactory} from '../../factories/task'
import {createProjects} from '../project/prepareProjects'
function prepareLinkShare() {
const projects = ProjectFactory.create(1)
const projects = createProjects()
const tasks = TaskFactory.create(10, {
project_id: projects[0].id
})
@@ -27,22 +27,22 @@ describe('Link shares', () => {
cy.get('h1.title')
.should('contain', project.title)
cy.get('input.input[placeholder="Add a new task..."')
cy.get('input.input[placeholder="Add a task..."')
.should('not.exist')
cy.get('.tasks')
.should('contain', tasks[0].title)
cy.url().should('contain', `/projects/${project.id}/list#share-auth-token=${share.hash}`)
cy.url().should('contain', `/projects/${project.id}/1#share-auth-token=${share.hash}`)
})
it('Should work when directly viewing a project with share hash present', () => {
const {share, project, tasks} = prepareLinkShare()
cy.visit(`/projects/${project.id}/list#share-auth-token=${share.hash}`)
cy.visit(`/projects/${project.id}/1#share-auth-token=${share.hash}`)
cy.get('h1.title')
.should('contain', project.title)
cy.get('input.input[placeholder="Add a new task..."')
cy.get('input.input[placeholder="Add a task..."')
.should('not.exist')
cy.get('.tasks')
.should('contain', tasks[0].title)
+2 -2
View File
@@ -14,12 +14,12 @@ describe('Team', () => {
const newTeamName = 'New Team'
cy.get('a.button')
.contains('Create a new team')
.contains('Create a team')
.click()
cy.url()
.should('contain', '/teams/new')
cy.get('.card-header-title')
.contains('Create a new team')
.contains('Create a team')
cy.get('input.input')
.type(newTeamName)
cy.get('.button')
+6 -5
View File
@@ -5,11 +5,13 @@ import {seed} from '../../support/seed'
import {TaskFactory} from '../../factories/task'
import {BucketFactory} from '../../factories/bucket'
import {updateUserSettings} from '../../support/updateUserSettings'
import {createDefaultViews} from "../project/prepareProjects";
function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
const project = ProjectFactory.create()[0]
const views = createDefaultViews(project.id)
BucketFactory.create(1, {
project_id: project.id,
project_view_id: views[3].id,
})
const tasks = []
let dueDate = startDueDate
@@ -60,7 +62,7 @@ describe('Home Page Task Overview', () => {
})
it('Should show a new task with a very soon due date at the top', () => {
const {tasks} = seedTasks()
const {tasks} = seedTasks(49)
const newTaskTitle = 'New Task'
cy.visit('/')
@@ -71,9 +73,8 @@ describe('Home Page Task Overview', () => {
due_date: new Date().toISOString(),
}, false)
cy.visit(`/projects/${tasks[0].project_id}/list`)
cy.visit(`/projects/${tasks[0].project_id}/1`)
cy.get('.tasks .task')
.first()
.should('contain.text', newTaskTitle)
cy.visit('/')
cy.get('[data-cy="showTasks"] .card .task')
@@ -88,7 +89,7 @@ describe('Home Page Task Overview', () => {
cy.visit('/')
cy.visit(`/projects/${tasks[0].project_id}/list`)
cy.visit(`/projects/${tasks[0].project_id}/1`)
cy.get('.task-add textarea')
.type(newTaskTitle+'{enter}')
cy.visit('/')
+35 -29
View File
@@ -12,6 +12,8 @@ import {BucketFactory} from '../../factories/bucket'
import {TaskAttachmentFactory} from '../../factories/task_attachments'
import {TaskReminderFactory} from '../../factories/task_reminders'
import {createDefaultViews} from "../project/prepareProjects";
import { TaskBucketFactory } from '../../factories/task_buckets'
function addLabelToTaskAndVerify(labelTitle: string) {
cy.get('.task-view .action-buttons .button')
@@ -40,29 +42,30 @@ function uploadAttachmentAndVerify(taskId: number) {
.selectFile('cypress/fixtures/image.jpg', {force: true}) // The input is not visible, but on purpose
cy.wait('@uploadAttachment')
cy.get('.attachments .attachments .files a.attachment')
cy.get('.attachments .attachments .files button.attachment')
.should('exist')
}
describe('Task', () => {
createFakeUserAndLogin()
let projects
let projects: {}[]
let buckets
beforeEach(() => {
// UserFactory.create(1)
projects = ProjectFactory.create(1)
const views = createDefaultViews(projects[0].id)
buckets = BucketFactory.create(1, {
project_id: projects[0].id,
project_view_id: views[3].id,
})
TaskFactory.truncate()
UserProjectFactory.truncate()
})
it('Should be created new', () => {
cy.visit('/projects/1/list')
cy.get('.input[placeholder="Add a new task…"')
cy.visit('/projects/1/1')
cy.get('.input[placeholder="Add a task…"')
.type('New Task')
cy.get('.button')
.contains('Add')
@@ -75,10 +78,10 @@ describe('Task', () => {
it('Inserts new tasks at the top of the project', () => {
TaskFactory.create(1)
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.get('.project-is-empty-notice')
.should('not.exist')
cy.get('.input[placeholder="Add a new task…"')
cy.get('.input[placeholder="Add a task…"')
.type('New Task')
cy.get('.button')
.contains('Add')
@@ -93,8 +96,8 @@ describe('Task', () => {
it('Marks a task as done', () => {
TaskFactory.create(1)
cy.visit('/projects/1/list')
cy.get('.tasks .task .fancycheckbox')
cy.visit('/projects/1/1')
cy.get('.tasks .task .fancy-checkbox')
.first()
.click()
cy.get('.global-notification')
@@ -104,7 +107,7 @@ describe('Task', () => {
it('Can add a task to favorites', () => {
TaskFactory.create(1)
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.get('.tasks .task .favorite')
.first()
.click()
@@ -113,12 +116,12 @@ describe('Task', () => {
})
it('Should show a task description icon if the task has a description', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/1/tasks**').as('loadTasks')
cy.intercept(Cypress.env('API_URL') + '/projects/1/views/*/tasks**').as('loadTasks')
TaskFactory.create(1, {
description: 'Lorem Ipsum',
})
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.wait('@loadTasks')
cy.get('.tasks .task .project-task-icon')
@@ -126,12 +129,12 @@ describe('Task', () => {
})
it('Should not show a task description icon if the task has an empty description', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/1/tasks**').as('loadTasks')
cy.intercept(Cypress.env('API_URL') + '/projects/1/views/*/tasks**').as('loadTasks')
TaskFactory.create(1, {
description: '',
})
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.wait('@loadTasks')
cy.get('.tasks .task .project-task-icon')
@@ -139,12 +142,12 @@ describe('Task', () => {
})
it('Should not show a task description icon if the task has a description containing only an empty p tag', () => {
cy.intercept(Cypress.env('API_URL') + '/projects/1/tasks**').as('loadTasks')
cy.intercept(Cypress.env('API_URL') + '/projects/1/views/*/tasks**').as('loadTasks')
TaskFactory.create(1, {
description: '<p></p>',
})
cy.visit('/projects/1/list')
cy.visit('/projects/1/1')
cy.wait('@loadTasks')
cy.get('.tasks .task .project-task-icon')
@@ -314,8 +317,9 @@ describe('Task', () => {
it('Can move a task to another project', () => {
const projects = ProjectFactory.create(2)
const views = createDefaultViews(projects[0].id)
BucketFactory.create(2, {
project_id: '{increment}',
project_view_id: views[3].id,
})
const tasks = TaskFactory.create(1, {
id: 1,
@@ -352,7 +356,7 @@ describe('Task', () => {
.should('be.visible')
.contains('Delete')
.click()
cy.get('.modal-mask .modal-container .modal-content .header')
cy.get('.modal-mask .modal-container .modal-content .modal-header')
.should('contain', 'Delete this task')
cy.get('.modal-mask .modal-container .modal-content .actions .button')
.contains('Do it!')
@@ -464,12 +468,15 @@ describe('Task', () => {
const tasks = TaskFactory.create(1, {
id: 1,
project_id: projects[0].id,
bucket_id: buckets[0].id,
})
const labels = LabelFactory.create(1)
LabelTaskFactory.truncate()
TaskBucketFactory.create(1, {
task_id: tasks[0].id,
bucket_id: buckets[0].id,
})
cy.visit(`/projects/${projects[0].id}/kanban`)
cy.visit(`/projects/${projects[0].id}/4`)
cy.get('.bucket .task')
.contains(tasks[0].title)
@@ -477,7 +484,7 @@ describe('Task', () => {
addLabelToTaskAndVerify(labels[0].title)
cy.get('.modal-content .close')
cy.get('.modal-container > .close')
.click()
cy.get('.bucket .task')
@@ -633,7 +640,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a new reminder')
.contains('Add a reminder')
.click()
cy.get('.datepicker__quick-select-date')
.contains('Tomorrow')
@@ -658,7 +665,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a new reminder')
.contains('Add a reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@@ -687,7 +694,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a new reminder')
.contains('Add a reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@@ -716,7 +723,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a new reminder')
.contains('Add a reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@@ -752,7 +759,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a new reminder')
.contains('Add a reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@@ -831,12 +838,11 @@ describe('Task', () => {
const tasks = TaskFactory.create(1, {
id: 1,
project_id: projects[0].id,
bucket_id: buckets[0].id,
})
const labels = LabelFactory.create(1)
LabelTaskFactory.truncate()
cy.visit(`/projects/${projects[0].id}/kanban`)
cy.visit(`/projects/${projects[0].id}/4`)
cy.get('.bucket .task')
.contains(tasks[0].title)
@@ -844,7 +850,7 @@ describe('Task', () => {
uploadAttachmentAndVerify(tasks[0].id)
cy.get('.modal-content .close')
cy.get('.modal-container > .close')
.click()
cy.get('.bucket .task .footer .icon svg.fa-paperclip')
-1
View File
@@ -7,6 +7,5 @@
"target": "ES2015",
"lib": ["ESNext", "dom"],
"types": ["cypress"],
"ignoreDeprecations": "5.0"
}
}
+1 -1
View File
@@ -10,7 +10,7 @@ export class BucketFactory extends Factory {
return {
id: '{increment}',
title: faker.lorem.words(3),
project_id: 1,
project_view_id: '{increment}',
created_by_id: 1,
created: now.toISOString(),
updated: now.toISOString(),
@@ -0,0 +1,19 @@
import {Factory} from '../support/factory'
import {faker} from '@faker-js/faker'
export class ProjectViewFactory extends Factory {
static table = 'project_views'
static factory() {
const now = new Date()
return {
id: '{increment}',
title: faker.lorem.words(3),
project_id: '{increment}',
view_kind: 0,
created: now.toISOString(),
updated: now.toISOString(),
}
}
}
-1
View File
@@ -14,7 +14,6 @@ export class TaskFactory extends Factory {
project_id: 1,
created_by_id: 1,
index: '{increment}',
position: '{increment}',
created: now.toISOString(),
updated: now.toISOString()
}
@@ -0,0 +1,13 @@
import {Factory} from '../support/factory'
export class TaskBucketFactory extends Factory {
static table = 'task_buckets'
static factory() {
return {
task_id: '{increment}',
bucket_id: '{increment}',
project_view_id: '{increment}',
}
}
}
-10
View File
@@ -3,16 +3,6 @@
/// <reference types="cypress" />
/// <reference types="@histoire/plugin-vue/components" />
declare module 'postcss-focus-within/browser' {
import focusWithinInit from 'postcss-focus-within/browser'
export default focusWithinInit
}
declare module 'css-has-pseudo/browser' {
import cssHasPseudo from 'css-has-pseudo/browser'
export default cssHasPseudo
}
interface ImportMetaEnv {
readonly VIKUNJA_API_URL?: string
readonly VIKUNJA_HTTP_PORT?: number
-25
View File
@@ -1,25 +0,0 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1701336116,
"narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f5c27c6136db4d76c30e533c20517df6864c46ee",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
-10
View File
@@ -1,10 +0,0 @@
{
description = "Vikunja frontend dev environment";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
defaultPackage.x86_64-linux =
pkgs.mkShell { buildInputs = [ pkgs.nodePackages.pnpm pkgs.cypress pkgs.git-cliff ]; };
};
}
+109 -111
View File
@@ -13,7 +13,7 @@
},
"homepage": "https://vikunja.io/",
"funding": "https://opencollective.com/vikunja",
"packageManager": "pnpm@8.15.1",
"packageManager": "pnpm@9.10.0",
"keywords": [
"todo",
"productivity",
@@ -28,17 +28,19 @@
"serve": "pnpm run dev",
"preview": "vite preview --port 4173",
"preview:dev": "vite preview --outDir dist-dev --mode development --port 4173",
"preview:test": "vite preview --port 4173 --outDir dist-test",
"build": "vite build && workbox copyLibraries dist/",
"build:test": "vite build --outDir dist-test && workbox copyLibraries dist-dev/",
"build:modern-only": "BUILD_MODERN_ONLY=true vite build && workbox copyLibraries dist/",
"build:dev": "vite build --mode development --outDir dist-dev/",
"lint": "eslint 'src/**/*.{js,ts,vue}'",
"lint:fix": "pnpm run lint --fix",
"test:e2e": "start-server-and-test preview http://127.0.0.1:4173 'cypress run --e2e --browser chrome'",
"test:e2e-record": "start-server-and-test preview http://127.0.0.1:4173 'cypress run --e2e --browser chrome --record'",
"test:e2e-record-test": "start-server-and-test preview:test http://127.0.0.1:4173 'cypress run --e2e --browser chrome --record'",
"test:e2e-dev-dev": "start-server-and-test preview:dev http://127.0.0.1:4173 'cypress open --e2e'",
"test:e2e-dev": "start-server-and-test preview http://127.0.0.1:4173 'cypress open --e2e'",
"test:unit": "vitest --dir ./src",
"typecheck": "vue-tsc --noEmit && vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
"typecheck": "vue-tsc --build --force",
"browserslist:update": "pnpm dlx browserslist@latest --update-db",
"fonts:update": "pnpm fonts:download && pnpm fonts:subset",
"fonts:download": "./scripts/fonts-download.sh",
@@ -48,141 +50,137 @@
"story:preview": "histoire preview"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "6.5.1",
"@fortawesome/free-regular-svg-icons": "6.5.1",
"@fortawesome/free-solid-svg-icons": "6.5.1",
"@fortawesome/vue-fontawesome": "3.0.6",
"@github/hotkey": "3.1.0",
"@infectoone/vue-ganttastic": "2.2.0",
"@intlify/unplugin-vue-i18n": "2.0.0",
"@kyvg/vue3-notification": "3.1.4",
"@sentry/tracing": "7.100.1",
"@sentry/vue": "7.100.1",
"@tiptap/core": "2.2.1",
"@tiptap/extension-blockquote": "2.2.1",
"@tiptap/extension-bold": "2.2.1",
"@tiptap/extension-bullet-list": "2.2.1",
"@tiptap/extension-code": "2.2.1",
"@tiptap/extension-code-block-lowlight": "2.2.1",
"@tiptap/extension-document": "2.2.1",
"@tiptap/extension-dropcursor": "2.2.1",
"@tiptap/extension-gapcursor": "2.2.1",
"@tiptap/extension-hard-break": "2.2.1",
"@tiptap/extension-heading": "2.2.1",
"@tiptap/extension-history": "2.2.1",
"@tiptap/extension-horizontal-rule": "2.2.1",
"@tiptap/extension-image": "2.2.1",
"@tiptap/extension-italic": "2.2.1",
"@tiptap/extension-link": "2.2.1",
"@tiptap/extension-list-item": "2.2.1",
"@tiptap/extension-ordered-list": "2.2.1",
"@tiptap/extension-paragraph": "2.2.1",
"@tiptap/extension-placeholder": "2.2.1",
"@tiptap/extension-strike": "2.2.1",
"@tiptap/extension-table": "2.2.1",
"@tiptap/extension-table-cell": "2.2.1",
"@tiptap/extension-table-header": "2.2.1",
"@tiptap/extension-table-row": "2.2.1",
"@tiptap/extension-task-item": "2.2.1",
"@tiptap/extension-task-list": "2.2.1",
"@tiptap/extension-text": "2.2.1",
"@tiptap/extension-typography": "2.2.1",
"@tiptap/extension-underline": "2.2.1",
"@tiptap/pm": "2.2.1",
"@tiptap/suggestion": "2.2.1",
"@tiptap/vue-3": "2.2.1",
"@types/is-touch-device": "1.0.2",
"@types/lodash.clonedeep": "4.5.9",
"@vueuse/core": "10.7.2",
"@vueuse/router": "10.7.2",
"axios": "1.6.7",
"@fortawesome/fontawesome-svg-core": "6.6.0",
"@fortawesome/free-regular-svg-icons": "6.6.0",
"@fortawesome/free-solid-svg-icons": "6.6.0",
"@fortawesome/vue-fontawesome": "3.0.8",
"@github/hotkey": "3.1.1",
"@infectoone/vue-ganttastic": "2.3.2",
"@intlify/unplugin-vue-i18n": "5.2.0",
"@kyvg/vue3-notification": "3.3.0",
"@sentry/tracing": "7.114.0",
"@sentry/vue": "8.32.0",
"@tiptap/core": "2.7.4",
"@tiptap/extension-blockquote": "2.7.4",
"@tiptap/extension-bold": "2.7.4",
"@tiptap/extension-bullet-list": "2.7.4",
"@tiptap/extension-code": "2.7.4",
"@tiptap/extension-code-block": "2.7.4",
"@tiptap/extension-code-block-lowlight": "2.7.4",
"@tiptap/extension-document": "2.7.4",
"@tiptap/extension-dropcursor": "2.7.4",
"@tiptap/extension-gapcursor": "2.7.4",
"@tiptap/extension-hard-break": "2.7.4",
"@tiptap/extension-heading": "2.7.4",
"@tiptap/extension-history": "2.7.4",
"@tiptap/extension-horizontal-rule": "2.7.4",
"@tiptap/extension-image": "2.7.4",
"@tiptap/extension-italic": "2.7.4",
"@tiptap/extension-link": "2.7.4",
"@tiptap/extension-list-item": "2.7.4",
"@tiptap/extension-ordered-list": "2.7.4",
"@tiptap/extension-paragraph": "2.7.4",
"@tiptap/extension-placeholder": "2.7.4",
"@tiptap/extension-strike": "2.7.4",
"@tiptap/extension-table": "2.7.4",
"@tiptap/extension-table-cell": "2.7.4",
"@tiptap/extension-table-header": "2.7.4",
"@tiptap/extension-table-row": "2.7.4",
"@tiptap/extension-task-item": "2.7.4",
"@tiptap/extension-task-list": "2.7.4",
"@tiptap/extension-text": "2.7.4",
"@tiptap/extension-typography": "2.7.4",
"@tiptap/extension-underline": "2.7.4",
"@tiptap/pm": "2.7.4",
"@tiptap/suggestion": "2.7.4",
"@tiptap/vue-3": "2.7.4",
"@vueuse/core": "11.1.0",
"@vueuse/router": "11.1.0",
"axios": "1.7.7",
"blurhash": "2.0.5",
"bulma-css-variables": "0.9.33",
"camel-case": "4.1.2",
"date-fns": "3.3.1",
"dayjs": "1.11.10",
"dompurify": "3.0.8",
"change-case": "5.4.4",
"date-fns": "4.1.0",
"dayjs": "1.11.13",
"dompurify": "3.1.7",
"fast-deep-equal": "3.1.3",
"flatpickr": "4.6.13",
"flexsearch": "0.7.31",
"flexsearch": "0.7.43",
"floating-vue": "5.2.2",
"is-touch-device": "1.0.1",
"klona": "2.0.6",
"lodash.debounce": "4.0.8",
"lowlight": "2.9.0",
"pinia": "2.1.7",
"pinia": "2.2.2",
"register-service-worker": "1.7.2",
"snake-case": "3.0.4",
"sortablejs": "1.15.2",
"sortablejs": "1.15.3",
"tailwindcss": "3.4.13",
"tippy.js": "6.3.7",
"ufo": "1.4.0",
"vue": "3.4.15",
"vue-advanced-cropper": "2.8.8",
"vue-flatpickr-component": "11.0.3",
"vue-i18n": "9.9.1",
"vue-router": "4.2.5",
"workbox-precaching": "7.0.0",
"ufo": "1.5.4",
"vue": "3.5.10",
"vue-advanced-cropper": "2.8.9",
"vue-flatpickr-component": "11.0.5",
"vue-i18n": "10.0.3",
"vue-router": "4.4.5",
"vuemoji-picker": "0.3.1",
"workbox-precaching": "7.1.0",
"zhyswan-vuedraggable": "4.1.3"
},
"devDependencies": {
"@4tw/cypress-drag-drop": "2.2.5",
"@cypress/vite-dev-server": "5.0.7",
"@cypress/vue": "6.0.0",
"@faker-js/faker": "8.4.0",
"@histoire/plugin-screenshot": "0.17.8",
"@histoire/plugin-vue": "0.17.9",
"@rushstack/eslint-patch": "1.7.2",
"@tsconfig/node18": "18.2.2",
"@cypress/vite-dev-server": "5.2.0",
"@cypress/vue": "6.0.1",
"@faker-js/faker": "8.4.1",
"@histoire/plugin-screenshot": "0.17.17",
"@histoire/plugin-vue": "0.17.17",
"@rushstack/eslint-patch": "1.10.4",
"@tsconfig/node20": "20.1.4",
"@types/codemirror": "5.60.15",
"@types/dompurify": "3.0.5",
"@types/flexsearch": "0.7.6",
"@types/is-touch-device": "1.0.2",
"@types/lodash.debounce": "4.0.9",
"@types/marked": "5.0.2",
"@types/node": "20.11.10",
"@types/postcss-preset-env": "7.7.0",
"@types/sortablejs": "1.15.7",
"@typescript-eslint/eslint-plugin": "6.20.0",
"@typescript-eslint/parser": "6.20.0",
"@vitejs/plugin-legacy": "5.3.0",
"@vitejs/plugin-vue": "5.0.3",
"@vue/eslint-config-typescript": "12.0.0",
"@vue/test-utils": "2.4.4",
"@types/is-touch-device": "1.0.3",
"@types/lodash.clonedeep": "4.5.9",
"@types/node": "20.16.10",
"@types/sortablejs": "1.15.8",
"@typescript-eslint/eslint-plugin": "7.18.0",
"@typescript-eslint/parser": "7.18.0",
"@vitejs/plugin-legacy": "5.4.2",
"@vitejs/plugin-vue": "5.1.4",
"@vue/eslint-config-typescript": "13.0.0",
"@vue/test-utils": "2.4.6",
"@vue/tsconfig": "0.5.1",
"autoprefixer": "10.4.17",
"browserslist": "4.22.3",
"caniuse-lite": "1.0.30001581",
"css-has-pseudo": "6.0.1",
"autoprefixer": "10.4.20",
"browserslist": "4.24.0",
"caniuse-lite": "1.0.30001664",
"csstype": "3.1.3",
"cypress": "13.6.3",
"esbuild": "0.20.0",
"eslint": "8.56.0",
"eslint-plugin-vue": "9.20.1",
"happy-dom": "13.3.5",
"histoire": "0.17.9",
"postcss": "8.4.33",
"cypress": "13.15.0",
"esbuild": "0.24.0",
"eslint": "8.57.1",
"eslint-plugin-vue": "9.28.0",
"happy-dom": "14.12.3",
"histoire": "0.17.17",
"postcss": "8.4.47",
"postcss-easing-gradients": "3.0.1",
"postcss-easings": "4.0.0",
"postcss-focus-within": "8.0.1",
"postcss-preset-env": "9.3.0",
"rollup": "4.9.6",
"postcss-preset-env": "9.6.0",
"rollup": "4.22.5",
"rollup-plugin-visualizer": "5.12.0",
"sass": "1.70.0",
"start-server-and-test": "2.0.3",
"typescript": "5.3.3",
"vite": "5.0.12",
"vite-plugin-inject-preload": "1.3.3",
"vite-plugin-pwa": "0.17.5",
"vite-plugin-sentry": "1.3.0",
"sass": "1.79.4",
"start-server-and-test": "2.0.8",
"typescript": "5.6.2",
"unplugin-inject-preload": "2.0.5",
"vite": "5.4.8",
"vite-plugin-pwa": "0.20.5",
"vite-plugin-sentry": "1.4.0",
"vite-svg-loader": "5.1.0",
"vitest": "1.2.2",
"vue-tsc": "1.8.27",
"vitest": "1.6.0",
"vue-tsc": "2.1.6",
"wait-on": "7.2.0",
"workbox-cli": "7.0.0"
"workbox-cli": "7.1.0"
},
"pnpm": {
"patchedDependencies": {
"flexsearch@0.7.31": "patches/flexsearch@0.7.31.patch"
"@github/hotkey@3.1.1": "patches/@github__hotkey@3.1.1.patch",
"flexsearch@0.7.43": "patches/flexsearch@0.7.43.patch"
}
}
}
@@ -0,0 +1,28 @@
diff --git a/dist/index.js b/dist/index.js
index b6e6e0a6864cb00bc085b8d4503a705cb3bc8404..0466ef46406b0df41c8d0bb9a5bac9eabf4a50de 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -368,10 +368,12 @@ const sequenceTracker = new SequenceTracker({
function keyDownHandler(event) {
if (event.defaultPrevented)
return;
- if (!(event.target instanceof Node))
+ const target = event.explicitOriginalTarget || event.target;
+ if (target.shadowRoot)
return;
- if (isFormField(event.target)) {
- const target = event.target;
+ if (!(target instanceof Node))
+ return;
+ if (isFormField(target)) {
if (!target.id)
return;
if (!target.ownerDocument.querySelector(`[data-hotkey-scope="${target.id}"]`))
@@ -385,7 +387,6 @@ function keyDownHandler(event) {
sequenceTracker.registerKeypress(event);
currentTriePosition = newTriePosition;
if (newTriePosition instanceof Leaf) {
- const target = event.target;
let shouldFire = false;
let elementToFire;
const formField = isFormField(target);
-16
View File
@@ -1,16 +0,0 @@
diff --git a/index.d.ts b/index.d.ts
deleted file mode 100644
index 9f39f41073864b83968bdaa242ac4e3c3149685a..0000000000000000000000000000000000000000
diff --git a/package.json b/package.json
index 8968f5bf8010ff194240591c8b83299f7328e79d..6d84b6f590a841b129ed8b3860cb786df5a185c0 100644
--- a/package.json
+++ b/package.json
@@ -22,8 +22,6 @@
},
"main": "dist/flexsearch.bundle.js",
"browser": "dist/flexsearch.bundle.js",
- "module": "dist/module/index.js",
- "types": "./index.d.ts",
"preferGlobal": false,
"repository": {
"type": "git",
+18
View File
@@ -0,0 +1,18 @@
diff --git a/package.json b/package.json
index c154e54029c94be444916fb2249941e7182d80ed..54a65c42a42c4627506e016132becc43b47a517c 100644
--- a/package.json
+++ b/package.json
@@ -28,13 +28,11 @@
"email": "info@nextapps.de"
},
"main": "dist/flexsearch.bundle.min.js",
- "module": "dist/flexsearch.bundle.module.min.js",
"browser": {
"dist/flexsearch.bundle.min.js": "./dist/flexsearch.bundle.min.js",
"dist/flexsearch.bundle.module.min.js": "./dist/flexsearch.bundle.module.min.js",
"worker_threads": false
},
- "types": "./index.d.ts",
"scripts": {
"build": "npm run copy && npm run build:bundle",
"build:bundle": "node task/build RELEASE=bundle DEBUG=false SUPPORT_WORKER=true SUPPORT_ENCODER=true SUPPORT_CACHE=true SUPPORT_ASYNC=true SUPPORT_STORE=true SUPPORT_TAGS=true SUPPORT_SUGGESTION=true SUPPORT_SERIALIZE=true SUPPORT_DOCUMENT=true POLYFILL=false",
+9688 -8475
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+4 -2
View File
@@ -51,10 +51,12 @@ Hi ${process.env.DRONE_COMMIT_AUTHOR}!
Thank you for creating a PR!
I've deployed the changes of this PR on a preview environment under this URL: ${fullPreviewUrl}
I've deployed the frontend changes of this PR on a preview environment under this URL: ${fullPreviewUrl}
You can use this url to view the changes live and test them out.
You will need to manually connect this to an api running somehwere. The easiest to use is https://try.vikunja.io/.
You will need to manually connect this to an api running somewhere. The easiest to use is https://try.vikunja.io/.
This preview does not contain any changes made to the api, only the frontend.
Have a nice day!
@@ -1 +1 @@
d58cd9ebc135407aa29d093b046d84b72ec7073b3f08cedfdbb936318a0ad3e272fab921d3ff91a82c1a7059fcdecd7b ./scripts/deploy-preview-netlify.mjs
2ba5ae4c831fd749296d92f92c5f89339030e22b80be62b1253dc26982e8fd0082e354f884a3ba15293e0b96317ec758 ./scripts/deploy-preview-netlify.mjs
+9 -11
View File
@@ -1,12 +1,12 @@
<template>
<Ready>
<template v-if="authUser">
<TheNavigation />
<AppHeader />
<ContentAuth />
</template>
<ContentLinkShare v-else-if="authLinkShare" />
<NoAuthWrapper v-else>
<router-view />
<RouterView />
</NoAuthWrapper>
<KeyboardShortcuts v-if="keyboardShortcutsActive" />
@@ -26,15 +26,15 @@ import {useRoute, useRouter} from 'vue-router'
import {useI18n} from 'vue-i18n'
import isTouchDevice from 'is-touch-device'
import Notification from '@/components/misc/notification.vue'
import Notification from '@/components/misc/Notification.vue'
import UpdateNotification from '@/components/home/UpdateNotification.vue'
import KeyboardShortcuts from '@/components/misc/keyboard-shortcuts/index.vue'
import TheNavigation from '@/components/home/TheNavigation.vue'
import ContentAuth from '@/components/home/contentAuth.vue'
import ContentLinkShare from '@/components/home/contentLinkShare.vue'
import NoAuthWrapper from '@/components/misc/no-auth-wrapper.vue'
import Ready from '@/components/misc/ready.vue'
import AppHeader from '@/components/home/AppHeader.vue'
import ContentAuth from '@/components/home/ContentAuth.vue'
import ContentLinkShare from '@/components/home/ContentLinkShare.vue'
import NoAuthWrapper from '@/components/misc/NoAuthWrapper.vue'
import Ready from '@/components/misc/Ready.vue'
import {setLanguage} from '@/i18n'
@@ -47,7 +47,7 @@ import AddToHomeScreen from '@/components/home/AddToHomeScreen.vue'
import DemoMode from '@/components/home/DemoMode.vue'
const importAccountDeleteService = () => import('@/services/accountDelete')
const importMessage = () => import('@/message')
import {success} from '@/message'
const baseStore = useBaseStore()
const authStore = useAuthStore()
@@ -69,11 +69,9 @@ watch(accountDeletionConfirm, async (accountDeletionConfirm) => {
return
}
const messageP = importMessage()
const AccountDeleteService = (await importAccountDeleteService()).default
const accountDeletionService = new AccountDeleteService()
await accountDeletionService.confirm(accountDeletionConfirm)
const {success} = await messageP
success({message: t('user.deletion.confirmSuccess')})
authStore.refreshUserInfo()
}, { immediate: true })

Some files were not shown because too many files have changed in this diff Show More