Compare commits

...

1421 Commits

Author SHA1 Message Date
kolaente
d7d39b6f1a fix(views): enable search in bucket filters 2024-11-19 16:35:54 +01:00
kolaente
88873aec85 chore: enable debugging workaround in devenv 2024-11-19 12:58:04 +01:00
kolaente
44f9e1fe8d fix: make search in saved filter work 2024-11-19 11:08:32 +01:00
kolaente
b8c4e0a91e fix(openid): log error when config is still using array value 2024-11-18 12:16:38 +01:00
kolaente
feb6b708e3 fix(tasks): prefix created and updated columns when sorting by them
Resolves https://github.com/go-vikunja/vikunja/issues/350
2024-11-18 12:07:29 +01:00
kolaente
bd3eab8c34 fix(filters): validate filter expression when creating or updating filter
Resolves https://github.com/go-vikunja/vikunja/issues/354
2024-11-18 11:02:21 +01:00
kolaente
1db1333d8a chore(config): append .file to config values when reading 2024-11-18 10:35:02 +01:00
kolaente
05349ddb5c feat!: config for auth providers now use a map instead of an array
The config values for openid providers now use a map with the provider as key instead of an array. For example before:

auth:
  openid:
    providers:
      - name: foo
        clientid: ...

now becomes:

auth:
  openid:
    providers:
      foo:
        clientid: ...

This allows us to read values for openid providers from files using the same syntax as everywhere and makes the configuration more predictable. It also allows configuring providers through env variables, though it is still required to set at least one value via the config file because Vikunja won't discover the provider otherwise.
2024-11-18 10:34:30 +01:00
kolaente
3479fa1228 feat(config): only read file sub-keys from files
This removes reading config values from _file and instead only reads from file sub keys. This should make it easier to not accidentally specify the same value twice.
The syntax via env does not change, but via a config file this:

database:
  password_file: foo

becomes

database:
  password:
    file: foo
2024-11-18 08:52:21 +01:00
renovate
fef19c5c1d fix(deps): update dependency @intlify/unplugin-vue-i18n to v6 2024-11-16 15:20:15 +00:00
renovate
8ccb2cceea fix(deps): update dependency vue to v3.5.13 2024-11-15 15:17:37 +00:00
Dominik Pschenitschni
194a3239af feat: remove postcss-easings 2024-11-15 13:36:19 +01:00
renovate
8a91e30e12 chore(deps): update dependency sass-embedded to v1.81.0 2024-11-15 10:06:36 +00:00
renovate
0df69f6998 chore(deps): update pnpm to v9.13.2 2024-11-15 02:27:05 +00:00
renovate
3f1cf817d6 chore(deps): update pnpm to v9.13.1 2024-11-14 19:54:04 +00:00
renovate
d727e1ffb5 fix(deps): update dependency tailwindcss to v3.4.15 2024-11-14 19:18:01 +00:00
renovate
99499ad470 chore(deps): update dev-dependencies 2024-11-14 01:17:13 +00:00
renovate
8c2728f62f chore(deps): update pnpm to v9.13.0 2024-11-13 13:16:36 +00:00
renovate
6357d5eb02 fix(deps): update dependency @sentry/vue to v8.38.0 2024-11-13 09:14:20 +00:00
renovate
436fcc2532 chore(deps): update dev-dependencies 2024-11-13 01:22:06 +00:00
renovate
25173a57e5 chore(deps): update dev-dependencies 2024-11-12 01:25:50 +00:00
renovate
1705d9de8d fix(deps): update dependency dompurify to v3.2.0 2024-11-11 15:18:29 +00:00
renovate
a22033acd3 chore(deps): update dev-dependencies 2024-11-11 10:21:07 +00:00
Dominik Pschenitschni
44c659aa34 feat: move useProjectBackground to composables 2024-11-10 15:17:38 +00:00
kolaente
da0e110ee4 fix(ci): do not build linuxx 368 docker images
Related to 6fe22aba39
2024-11-10 16:13:25 +01:00
renovate
4d79bab8f1 chore(deps): update dependency rollup to v4.25.0 2024-11-10 12:21:42 +00:00
renovate
88eef87a8c fix(deps): update dependency @intlify/unplugin-vue-i18n to v5.3.1 2024-11-10 08:19:46 +00:00
renovate
46c09d3e56 fix(deps): update dependency @intlify/unplugin-vue-i18n to v5.3.0 2024-11-09 14:18:12 +00:00
renovate
525367f2f4 fix(deps): update module golang.org/x/oauth2 to v0.24.0 2024-11-08 16:57:55 +00:00
renovate
bf5672bf36 fix(deps): update module golang.org/x/crypto to v0.29.0 2024-11-08 15:58:57 +00:00
kolaente
9b85f3bd0c fix: add \n between scoped and unscoped commits in git cliff config 2024-11-08 11:19:50 +01:00
renovate
bd64778a6a fix(deps): update module golang.org/x/sys to v0.27.0 2024-11-08 09:30:11 +00:00
renovate
bf6875533b fix(deps): update module golang.org/x/image to v0.22.0 2024-11-08 09:29:24 +00:00
renovate
5550b69144 chore(deps): update dev-dependencies 2024-11-08 07:25:45 +00:00
renovate
5181ba587c fix(deps): update module golang.org/x/sync to v0.9.0 2024-11-07 21:22:07 +00:00
renovate
742774dc6c fix(deps): update module github.com/wneessen/go-mail to v0.5.2 2024-11-07 13:50:17 +00:00
kolaente
6fe22aba39 fix!: disable 368 releases
We can either support arm64 or 368 release binaries - because the arm64 binaries are probably wider used today, we'll prioritize that. It is still possible to compile Vikunja from source on a 368 system, but would take quite a bit of effort in providing pre-built binaries.
Please reach out if you need assistance for 368 binaries.

See https://github.com/techknowlogick/xgo/issues/256#issuecomment-2462135108
2024-11-07 14:41:47 +01:00
renovate
cc82f3043f chore(deps): update dev-dependencies 2024-11-07 07:22:35 +00:00
renovate
c3d2a92835 chore(deps): update dependency go to v1.23.3 2024-11-06 23:19:48 +00:00
renovate
513f773041 fix(deps): update dependency @sentry/vue to v8.37.1 2024-11-06 07:15:19 +00:00
renovate
8f69ce0e6b chore(deps): update dev-dependencies 2024-11-06 01:18:12 +00:00
kolaente
d6194b8f10 fix: upgrade xgo docker image everywhere 2024-11-05 15:03:14 +01:00
kolaente
f826fb9a91 fix: upgrade xgo 2024-11-05 10:07:58 +01:00
renovate
6ba55d4de0 chore(deps): update dev-dependencies 2024-11-05 02:18:20 +00:00
Frederick [Bot]
22812199dd chore(i18n): update translations via Crowdin 2024-11-05 00:04:30 +00:00
kolaente
c7914bc245 feat: load any config value from file
This change allows to read any config value from a file, when the path to that file is specified in the config with the target config value suffixed with _file. This works with environment variables as well.
For example, setting database.password_file=/path/to/password will load the value from /path/to/password and set it as the config value of database.password.

Resolves https://kolaente.dev/vikunja/vikunja/issues/704
Resolves https://kolaente.dev/vikunja/vikunja/pulls/1621
2024-11-04 16:47:39 +01:00
kolaente
4556cfb057 fix(attachments): return error message when attachment upload is not multipart form request
Resolves https://vikunja.sentry.io/issues/6041469388/
2024-11-04 12:26:53 +01:00
renovate
9e987a89d4 chore(deps): update dev-dependencies 2024-11-04 01:29:15 +00:00
renovate
3bfde5a34d fix(deps): update dependency pinia to v2.2.6 2024-11-03 20:31:05 +00:00
Dominik Pschenitschni
64ffba2813 fix: use @tsconfig/node22 2024-11-03 15:00:12 +01:00
kolaente
2693419959 fix: switch to wine electron builder 2024-11-03 12:23:09 +01:00
renovate
24fc7be8c4 chore(deps): update dev-dependencies 2024-11-03 04:17:29 +00:00
Dominik Pschenitschni
452cc66b32 fix: use modern-compiler for sass files as well 2024-11-02 20:08:59 +00:00
Dominik Pschenitschni
cf6836f857 feat: only build sourcemaps for sentry 2024-11-02 20:06:37 +01:00
kolaente
de1eac5d36 fix: pin xgo to 1.22.x
Hopefully resolves build issues like https://drone.kolaente.de/vikunja/vikunja/8996/3/10
2024-11-02 19:00:02 +01:00
kolaente
3f62c013ba fix(typesense): fetch task comments without permission check
Fetching the task comments during indexing would always check the permissions - in the specific case of indexing comments into Typesense, this will always return true, because we're checking with the owner of the project. Because this is a rather expensive operation, it is even more unnecessary.
2024-11-02 18:42:12 +01:00
Dominik Pschenitschni
e8bf5e33f7 feat: use sass-embedded 2024-11-02 17:39:20 +00:00
kolaente
4238a5f6a3 fix: download badge in readme
Resolves https://github.com/go-vikunja/vikunja/issues/345
2024-11-02 18:22:29 +01:00
renovate
c909bfcb8e fix(deps): update module github.com/threedotslabs/watermill to v1.4.1 2024-11-02 16:46:48 +00:00
Dominik Pschenitschni
49fa32aad6 feat: use position sticky for demo bar 2024-11-02 08:20:57 +00:00
renovate
216177d873 chore(deps): update dev-dependencies 2024-11-02 08:19:37 +00:00
Dominik Pschenitschni
f3e77eb1f0 fix: remove defineProps 2024-11-01 17:19:28 +01:00
Frederick [Bot]
78379637d4 chore(i18n): update translations via Crowdin 2024-11-01 00:03:09 +00:00
kolaente
e393cfdfd7 fix(views): delete task buckets and task positions as well when deleting a view 2024-10-31 19:22:51 +01:00
kolaente
1fac81c8de feat(cli): add cli command to delete orphan task positions 2024-10-31 19:19:56 +01:00
kolaente
d03f9c7b73 fix(positions): directly look in the database to fetch tasks when recalculating their position 2024-10-31 19:02:15 +01:00
kolaente
d7eff8e43b feat(positions): add more debug logs 2024-10-31 18:46:09 +01:00
renovate
f1f1f669b3 fix(deps): update dependency @sentry/vue to v8.36.0 2024-10-31 10:24:16 +00:00
renovate
03cda24bcf chore(deps): update dev-dependencies 2024-10-31 06:16:07 +00:00
Frederick [Bot]
004d5709d0 chore(i18n): update translations via Crowdin 2024-10-31 00:04:23 +00:00
renovate
6794547942 fix(deps): update vueuse to v11.2.0 2024-10-30 20:18:45 +00:00
kolaente
32bdef841f fix: lint 2024-10-30 15:45:37 +01:00
kolaente
e766b63d99 feat(kanban): add debug option to show task position on card
This will hopefully help debugging heisenbugs which only happen in production
2024-10-30 15:44:36 +01:00
kolaente
796199827e feat(filters): show when the current view has a filter as well and both will be used
This should make it clear when a filter does not bring the expected results - maybe because it contradicts with the one set in the view.
Related to https://github.com/go-vikunja/vikunja/issues/296
2024-10-30 15:27:33 +01:00
kolaente
7f5f5a4b8d fix(events): do not crash filter event handler when triggered by a link share user
Resolves https://vikunja.sentry.io/issues/6030883119/events/4013802889b64b6b9d868e7c83ba4eb5/
2024-10-30 14:49:33 +01:00
kolaente
8522eb9b0d docs(filters): fix typos with filter query docs 2024-10-30 14:30:10 +01:00
kolaente
3c22b3cf00 feat(kanban): show project on kanban card if it's not the same as the current one
Resolves https://community.vikunja.io/t/feature-requests-regarding-view-ordering-project-reference-in-kanban-and-a-notin-operator/2728
2024-10-30 13:48:21 +01:00
kolaente
d081cf80fc chore(caldav): refactor fetching projects 2024-10-30 08:37:27 +01:00
kolaente
3ce3727a5e chore(ci): sign drone config 2024-10-30 07:34:13 +00:00
renovate
c36397188c chore(deps): update node.js to v22.11.0 2024-10-30 07:34:13 +00:00
konrad
564852ab12 chore(deps): set workbox version to 7.3.0 2024-10-30 06:26:34 +00:00
renovate
7aed582965 chore(deps): update dev-dependencies 2024-10-30 00:15:46 +00:00
renovate
70bd12badc fix(deps): update dependency pinia to v2.2.5 2024-10-29 20:15:44 +00:00
renovate
2c486a30a0 chore(deps): update dependency node to v22 2024-10-29 19:15:07 +00:00
renovate
d1df1a3174 fix(deps): update dependency workbox-precaching to v7.3.0 2024-10-29 19:10:23 +00:00
renovate
de222f290a fix(deps): update module github.com/threedotslabs/watermill to v1.4.0 2024-10-29 19:10:03 +00:00
kolaente
b9366ca9e3 fix(filter): use correct syntax for not in query in typesense
Related to https://github.com/typesense/typesense/issues/2038
2024-10-29 17:23:16 +01:00
kolaente
57c6f2cd10 feat(filters): add "not in" operator for filters
Resolves https://community.vikunja.io/t/feature-requests-regarding-view-ordering-project-reference-in-kanban-and-a-notin-operator/2728
2024-10-29 12:03:16 +01:00
kolaente
aad9d8dffc fix(tests): faker usage 2024-10-29 09:57:53 +00:00
kolaente
2c8e636561 chore(deps): update devenv 2024-10-29 09:57:53 +00:00
kolaente
d4a5d1ecdf chore: remove unused rushstack eslint patch 2024-10-29 09:57:53 +00:00
kolaente
703c641aeb fix: lint issues 2024-10-29 09:57:53 +00:00
kolaente
b601671395 chore: migrate eslint config 2024-10-29 09:57:53 +00:00
renovate
e36578bb89 chore(deps): update dev-dependencies 2024-10-29 09:57:53 +00:00
renovate
cf77969550 fix(deps): update module github.com/swaggo/swag to v1.16.4 2024-10-29 09:15:35 +00:00
renovate
e1718ccb35 chore(deps): update goreleaser/nfpm docker tag to v2.41.0 (#2776)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-10-29 08:35:46 +00:00
kolaente
412a8ef654 chore(projects): only pass users to checks 2024-10-29 09:11:06 +01:00
kolaente
816da6bc50 fix(projects): check with the current user if they have access to the project 2024-10-29 08:40:14 +01:00
renovate
21356ae08e chore(deps): update node.js to v22 (#2783)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-10-29 07:38:12 +00:00
kolaente
dace07efda fix(projects): return 0 if no parent project exists 2024-10-29 08:25:20 +01:00
Kiril Vladimirov
540c5f4225 fix(i18n): capitalize Bulgarian label (#2784)
Also, remove 'език' which means 'language' for the sake of consistency.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2784
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Kiril Vladimirov <kiril@vld.bg>
Co-committed-by: Kiril Vladimirov <kiril@vld.bg>
2024-10-29 07:17:28 +00:00
renovate
58491ef55e chore(deps): update dev-dependencies 2024-10-29 00:16:41 +00:00
renovate
8b0ab4758e fix(deps): update dependency @kyvg/vue3-notification to v3.4.1 2024-10-28 18:15:36 +00:00
kolaente
fa032a889f fix(filters): do not crash when a filter is invalid
Resolves https://vikunja.sentry.io/issues/6025547266/events/a62beaa09caf482ba238b18f363956df
2024-10-28 16:16:48 +01:00
kolaente
e30374a28c fix(projects): only add conditions to query when they are non-empty 2024-10-28 16:09:31 +01:00
kolaente
b013b294e2 fix(projects): remove unnecessary join
The removal of the unnecessary join condition speeds up the query 10x. Before, it would take ~700ms on Vikunja Cloud. With this removal, the otherwise same query now takes ~70ms (which still leaves plenty of room for improvements, but it's already a great step forwards).
2024-10-28 15:58:07 +01:00
kolaente
acdb45a92c fix: lint 2024-10-28 14:04:54 +01:00
kolaente
29107e9865 fix: error message check on mysql 2024-10-28 13:50:12 +01:00
kolaente
a70c472aa3 fix: create missing indexes on postgres 2024-10-28 13:25:38 +01:00
kolaente
e1893ff573 chore: cleanup 2024-10-28 12:44:54 +01:00
kolaente
106a1c7864 fix(events): report async errors via Sentry 2024-10-28 12:44:26 +01:00
kolaente
fcd56cb7cf feat(i18n): add Bulgarian for language selection 2024-10-28 11:27:42 +01:00
kolaente
7055d7341c feat(sharing): add config so that users only find members of their teams
This adds a feature where you can enable users to only find members of teams they're part of. This makes the user search when sharing projects less confusing, because users only see other users they already know.
It is still possible to add users to teams with their email address, if they have that enabled in the user settings.
2024-10-28 11:08:06 +01:00
renovate
6a804e8b2d chore(deps): update pnpm to v9.12.3 2024-10-28 06:16:02 +00:00
renovate
a917676e50 chore(deps): update dev-dependencies 2024-10-28 00:15:53 +00:00
Frederick [Bot]
9c0c5fdd6c chore(i18n): update translations via Crowdin 2024-10-28 00:03:02 +00:00
renovate
d42af853ec chore(deps): update dependency caniuse-lite to v1.0.30001672 2024-10-27 00:16:16 +00:00
renovate
ca1384e3c9 chore(deps): update dev-dependencies (#2754)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-10-26 18:06:51 +00:00
John Doe
28d5cd7b28 feat: allow setting schema for connection in postgres (#2777)
This PR introduce a new config for database, `database.schema`, allowing user to specify a specific schema to use for their postgres database connection. As the default value is set, it will be backward compatible.

Related discussion: https://community.vikunja.io/t/postgres-database-has-error-pq-relation-tasks-does-not-exist/1333

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2777
Co-authored-by: John Doe <hugosum.dev@protonmail.com>
Co-committed-by: John Doe <hugosum.dev@protonmail.com>
2024-10-26 16:06:47 +00:00
kolaente
b5cbe99b0a fix(cmd): report error when the connection to the mail server failed
When running the testmail command, Vikunja would not stop if it wasn't able to connect to the mail server. This was a regression from 950de7c954.
This change fixes that problem.

Resolves https://kolaente.dev/vikunja/vikunja/issues/2767
2024-10-25 19:23:39 +02:00
Sterad
d784e98f8c feat(cmd): Allow to specify custom filename for dump command (#2775)
This simplifies automated postprocessing of the backup file.

Co-authored-by: Maarten <mail@mgrothus.de>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2775
Co-authored-by: Sterad <hgasuser@gmail.com>
Co-committed-by: Sterad <hgasuser@gmail.com>
2024-10-25 12:37:17 +00:00
Sterad
1f76a8bb64 feat: preferably award admin access to project users with write access on user deletion (#2772)
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2772
Co-authored-by: Sterad <hgasuser@gmail.com>
Co-committed-by: Sterad <hgasuser@gmail.com>
2024-10-24 20:42:38 +00:00
renovate
4b464b3216 fix(deps): update tiptap to v2.9.1 2024-10-23 10:16:00 +00:00
renovate
b346a96127 fix(deps): update tiptap to v2.9.0 2024-10-22 14:15:14 +00:00
kolaente
5f5d93dfa0 fix(gantt): reload the gantt chart when switching between projects
Resolves https://github.com/go-vikunja/vikunja/issues/340
2024-10-21 18:32:57 +02:00
Sebastien Danthinne
75dddc9dbe fix(attachments): Add .jpeg to previewable image (#2770)
This is necessary to be able to set .jpeg images as the background for kanban tiles. This extension is equivalent to .jpg, and is the default extension for uploading from iOS.

Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2770
Co-authored-by: Sebastien Danthinne <sebastien@danthinne.com>
Co-committed-by: Sebastien Danthinne <sebastien@danthinne.com>
2024-10-21 15:04:17 +00:00
renovate
6a671a7093 fix(deps): update dependency @sentry/vue to v8.35.0 2024-10-21 12:15:48 +00:00
kolaente
3ad5797307 fix: do not prefix tasks all the time
Fixes a regression from 29b9001078
2024-10-21 10:32:14 +02:00
Frederick [Bot]
1cc3f3c7fe chore(i18n): update translations via Crowdin 2024-10-21 00:05:05 +00:00
Frederick [Bot]
ac91e942a5 chore(i18n): update translations via Crowdin 2024-10-20 14:02:57 +00:00
kolaente
29b9001078 feat(filters): allow filtering by created and updated task fields
Resolves https://kolaente.dev/vikunja/vikunja/issues/2768
2024-10-18 15:15:19 +02:00
renovate
a9f1a3a8c5 fix(deps): update module github.com/redis/go-redis/v9 to v9.7.0 2024-10-17 10:15:08 +00:00
renovate
7d2ef17369 fix(deps): update module github.com/wneessen/go-mail to v0.5.1 2024-10-16 15:53:28 +00:00
renovate
d53164d196 chore(deps): update pnpm to v9.12.2 2024-10-16 15:51:30 +00:00
kolaente
af11a6527f fix: release bucket name 2024-10-16 17:45:57 +02:00
kolaente
0472acac98 feat: use hetzner object storage for releases 2024-10-16 17:18:38 +02:00
renovate
d0c85e844c fix(deps): update module github.com/yuin/goldmark to v1.7.8 2024-10-16 14:15:05 +00:00
renovate
b1f06f8ff6 fix(deps): update module github.com/yuin/goldmark to v1.7.7 2024-10-15 15:11:36 +00:00
renovate
bdc721a93a fix(deps): update module github.com/gabriel-vasile/mimetype to v1.4.6 2024-10-15 12:42:22 +00:00
renovate
685992383d fix(deps): update dependency tailwindcss to v3.4.14 2024-10-15 12:42:05 +00:00
renovate
8b6a84733b fix(deps): update module github.com/prometheus/client_golang to v1.20.5 2024-10-15 12:16:44 +00:00
renovate
0b20754de7 fix(deps): update module github.com/redis/go-redis/v9 to v9.6.2 2024-10-15 11:45:43 +00:00
renovate
aee9126806 fix(deps): update module github.com/getsentry/sentry-go to v0.29.1 2024-10-15 11:45:22 +00:00
Frederick [Bot]
5eebfb3371 [skip ci] Updated swagger docs 2024-10-15 10:42:30 +00:00
kolaente
d50572c544 fix(project): permission query on mysql 2024-10-15 12:16:22 +02:00
kolaente
302424b047 fix: lint 2024-10-15 11:57:49 +02:00
kolaente
cda8155de4 fix(projects): correctly check inherited permissions 2024-10-15 11:56:51 +02:00
kolaente
38964ace04 fix(task): do not allow saving an empty description
Resolves https://github.com/go-vikunja/vikunja/issues/338
2024-10-13 19:38:42 +02:00
kolaente
21af73ff93 fix(caldav): use subpath for caldav url in frontend
Resolves https://github.com/go-vikunja/vikunja/issues/337
2024-10-13 19:32:45 +02:00
kolaente
92b90013ab feat(projects): optionally return max right when querying all projects
This change introduces an expand query parameter which, when provided, allows to return all projects with the max right the current user has on that project. This allows to show and hide appropriate buttons in the frontend.

Resolves https://github.com/go-vikunja/vikunja/issues/334
2024-10-13 19:22:09 +02:00
kolaente
3e9c41cfc6 fix(api): allow api tokens to retrieve the user who created the token
Resolves https://kolaente.dev/vikunja/vikunja/issues/2644
2024-10-13 16:02:53 +02:00
kolaente
a88124cfce feat: make used bcrypt rounds configurable
This allows to configure the used bcrypt rounds and set it to 4 in tests, greatly speeding up the tests. It's not really required to set this to another value but it might be in the future as computers get faster.
2024-10-13 15:38:04 +02:00
renovate
e22fb1e73e fix(deps): update module github.com/yuin/goldmark to v1.7.6 2024-10-12 15:15:27 +00:00
renovate
a015a4f3af fix(deps): update module github.com/yuin/goldmark to v1.7.5 2024-10-12 14:14:50 +00:00
Frederick [Bot]
9cf18a2efa chore(i18n): update translations via Crowdin 2024-10-12 00:31:54 +00:00
renovate
8832b9de29 fix(deps): update dependency vue to v3.5.12 2024-10-11 15:15:34 +00:00
renovate
a4a52f4747 fix(deps): update dependency @sentry/vue to v8.34.0 2024-10-11 07:15:49 +00:00
kolaente
9219f7032e fix: error reporting 2024-10-11 08:54:50 +02:00
kolaente
35a463c984 fix(filters): prevent position and bucket ID overriding position of existing tasks
This fixes a bug where the task position in a task was updated and immediately overridden by the update event handler.

Resolves https://community.vikunja.io/t/not-able-to-move-task-between-buckets-within-a-kanban-view-for-saved-filter/2882
2024-10-10 16:05:31 +02:00
kolaente
8ab387396d fix: do not try to reindex tasks into typesense when it is not set up 2024-10-10 16:01:17 +02:00
renovate
ab03a8bb2c chore(deps): update dependency typescript to v5.6.3 2024-10-09 00:15:24 +00:00
renovate
de09bb779f fix(deps): update dependency express to v4.21.1 2024-10-08 19:14:47 +00:00
renovate
7e69200483 chore(deps): update dependency @types/node to v20.16.11 2024-10-08 09:00:39 +00:00
renovate
e124d09738 fix(deps): update dependency @kyvg/vue3-notification to v3.4.0 2024-10-07 22:15:34 +00:00
renovate
12894c4619 chore(deps): update pnpm to v9.12.1 2024-10-07 14:14:53 +00:00
renovate
841cf10545 chore(deps): update dependency caniuse-lite to v1.0.30001667 2024-10-07 11:57:12 +00:00
renovate
b31e95d439 fix(deps): update module golang.org/x/crypto to v0.28.0 2024-10-06 15:22:25 +00:00
renovate
3efa9577c7 fix(deps): update dependency vue-i18n to v10.0.4 2024-10-06 15:21:55 +00:00
renovate
e21138e1c7 fix(deps): update module golang.org/x/term to v0.25.0 2024-10-06 15:21:09 +00:00
renovate
2b44b5f7cd fix(deps): update dependency @sentry/vue to v8.33.1 2024-10-06 14:15:09 +00:00
renovate
07faa1b1b3 fix(deps): update dependency vue to v3.5.11 2024-10-06 13:40:12 +00:00
renovate
9dcbfb0514 fix(deps): update module golang.org/x/sys to v0.26.0 2024-10-06 13:39:34 +00:00
renovate
2e67a42021 fix(deps): update module golang.org/x/image to v0.21.0 2024-10-06 13:39:03 +00:00
renovate
cb9e84908f fix(deps): update module golang.org/x/text to v0.19.0 2024-10-05 17:43:13 +00:00
renovate
8a003db3af fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.24 2024-10-04 16:15:13 +00:00
Frederick [Bot]
de110b37be chore(i18n): update translations via Crowdin 2024-10-04 00:32:06 +00:00
renovate
f10e8dc30f chore(deps): update dependency rollup to v4.24.0 2024-10-03 06:47:11 +00:00
Frederick [Bot]
3b7f78eaa5 chore(i18n): update translations via Crowdin 2024-10-03 00:31:16 +00:00
renovate
7070c88894 fix(deps): update dependency @sentry/vue to v8.33.0 2024-10-02 15:46:49 +00:00
renovate
d657a853fa chore(deps): update pnpm to v9.12.0 2024-10-02 13:14:55 +00:00
kolaente
d81f2db6ef chore: replace all uses of bucket_id with the const 2024-10-02 10:43:51 +02:00
kolaente
425f6378c6 fix(kanban): make loading tasks for a bucket work
This fixes two closely-related bugs:
1. When loading tasks from a bucket of a saved filter, the saved filter query would override the user-supplied filter, which would cause to only tasks matching the saved filter query to be returned.
2. When a filter query for a bucket was specified, the function would only check if one of the top level filters was a filter for tasks in a specific bucket. That means a filter like "bucket_id = 42 && labels = foo" would return the expected result, while a filter like "labels = foo && (bucket_id = 42 && priority = 1)" would fail with an error 500 because the task_buckets table was not joined to the sql query. The fix from the first bug caused such filter queries.
2024-10-02 10:41:38 +02:00
renovate
b6806acda0 chore(deps): update dependency go to v1.23.2 2024-10-02 07:46:06 +00:00
renovate
fa873f5540 fix(deps): update dependency pinia to v2.2.4 2024-10-02 07:45:50 +00:00
DanielPantle
faff1040dc feat(task): cancel editing task title with escape (#2730)
With this change, it is possible to cancel editing the task title with pressing the escape key.

# Problem

Before it was not possible to cancel editing the task title. Pressing outside the title saves the changes that have already been done (which is intended I think). But when e.g. pasting something with a wrong format, I was not able to revert the change without saving and editing it again

Example: after accidentially pasting something with multiple lines it is not possible to escape, the only way to revert this is to save and edit again manually:
![grafik.png](/attachments/11d3559a-3111-458f-9a9c-4107292054fa)

# Solution

This PR implements a listener for the escape key that sets the title back to its original value and blurs the focus of the title

# Additional notes

- I checked this in the "page" view of the task and the "popup" view and it worked in both. For me, the popup does not close with the escape key (as it often does on other sites), therefore there is no collision with this function. But I think it would be good to check this again to make sure it does not break anything like this
- I don't know anything about testing in this repository, if it is possible/necessary to implement a test for this feature please leave a comment :)

Co-authored-by: Daniel Pantle <daniel.pantle@newtec.de>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2730
Co-authored-by: DanielPantle <danielpantle@noreply.kolaente.dev>
Co-committed-by: DanielPantle <danielpantle@noreply.kolaente.dev>
2024-10-02 07:32:33 +00:00
renovate
4c74a3f859 chore(deps): update dev-dependencies 2024-10-02 05:14:56 +00:00
Frederick [Bot]
b6e22cba7d chore(i18n): update translations via Crowdin 2024-10-01 00:32:32 +00:00
renovate
3271a935c5 fix(deps): update tiptap to v2.8.0 2024-09-30 19:20:55 +00:00
renovate
8be3321efd fix(deps): update dependency pinia to v2.2.3 2024-09-30 18:15:23 +00:00
kolaente
80d22d5060 fix(colors): truncate longer hex color values
Resolves https://vikunja.sentry.io/share/issue/6f1e37d4b8b248188e20650234a45cde/
2024-09-30 20:06:10 +02:00
kolaente
1eaeb8d003 fix(filters): change assertion based on the environment 2024-09-30 19:54:00 +02:00
kolaente
8d05b5cb01 fix(filters): return more details when the provided filter time zone is invalid 2024-09-30 08:42:16 +02:00
kolaente
754d56ca82 fix(filters): increase year value when using mysql and year < 1
Mysql cannot handle year values < 1. That means filtering for a date value like 0000-01-01 won't work with mysql. Additionally, dates like 0001-01-01 could under some circumstances not work either when the date in combination with the time zone would resolve to something like 0000-12-31 - for example when the server is located (and configured) in UTC, but the user running the query is in New York. This could be observed by setting the time zone manually using the filter_timezone query parameter.

Resolves https://vikunja.sentry.io/share/issue/42bce92c15354c109eb1e6488b6a542b/
Resolves https://vikunja.sentry.io/share/issue/ef81451b0c7b43f1bff2d3a86ba393bb/
2024-09-30 08:41:24 +02:00
kolaente
d22bc79d3c chore(tasks): add more details to error message
Trying to debug https://vikunja.sentry.io/share/issue/ef81451b0c7b43f1bff2d3a86ba393bb/
2024-09-29 21:44:28 +02:00
kolaente
3855e179a9 fix(filters): clarify usage of reminders in filters 2024-09-29 21:11:08 +02:00
kolaente
1fe5e9cc55 chore(tasks): add more details to error message
Trying to debug https://vikunja.sentry.io/share/issue/ef81451b0c7b43f1bff2d3a86ba393bb/
2024-09-29 21:05:55 +02:00
kolaente
5478acfc09 fix(files): configure the files path in files init instead of globally
This fixes a regression introduced in daa7ad053c where the root path would be included twice in the file path, leading to retrieval issues.
2024-09-29 19:04:25 +02:00
kolaente
287d4f7de2 fix(filters): make sure year is always at least 1
Resolves https://vikunja.sentry.io/share/issue/ef81451b0c7b43f1bff2d3a86ba393bb/
Resolves https://github.com/go-vikunja/app/issues/94#issuecomment-2351818484
2024-09-29 18:56:46 +02:00
kolaente
14a3156465 fix(mage): actually pass the cli parameter to the function 2024-09-29 18:22:21 +02:00
kolaente
daa7ad053c feat: auto tls
This commit introduces the automatic retrieval of TLS certificates from Let's Encrypt. If the feature is enabled, Vikunja will automagically request a certificate from Let's Encrypt and configure it to server content via TLS.
2024-09-29 18:20:30 +02:00
kolaente
6a94c39ea8 fix(desktop): use pnpm in ci 2024-09-29 16:07:58 +02:00
kolaente
ca048d07f9 chore: 0.24.4 release preperation 2024-09-29 15:46:37 +02:00
kolaente
3ce477e1d1 fix(test): use correct selector for modal header 2024-09-29 14:16:43 +02:00
kolaente
9f9b00144b fix(task): improve task delete modal on mobile 2024-09-29 13:47:35 +02:00
kolaente
308e634c71 fix(task): do not show close button when the task was not opened via modal 2024-09-29 13:36:30 +02:00
kolaente
54994a1671 fix(task): paginate task comments
Resolves https://github.com/go-vikunja/vikunja/issues/329
2024-09-29 13:28:29 +02:00
kolaente
ca967782e8 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
2024-09-29 11:39:44 +02:00
jd
84dbc5fd84 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>
2024-09-28 09:06:32 +00:00
renovate
4d8c957f75 chore(deps): update dev-dependencies 2024-09-28 03:15:11 +00:00
renovate
654f375d39 fix(deps): update dependency vue to v3.5.10 2024-09-27 16:16:35 +00:00
renovate
bdb3df8395 fix(deps): update tiptap to v2.7.4 2024-09-26 13:15:53 +00:00
renovate
df41a96148 fix(deps): update dependency dompurify to v3.1.7 2024-09-26 12:43:48 +00:00
renovate
892b8ad89a fix(deps): update dependency vue to v3.5.9 2024-09-26 12:15:21 +00:00
renovate
b4ac1adacb chore(deps): update dev-dependencies 2024-09-26 04:15:38 +00:00
renovate
0706ca60b5 fix(deps): update tiptap to v2.7.3 2024-09-25 16:15:32 +00:00
kolaente
15d95f16da 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
2024-09-25 14:38:17 +02:00
renovate
f7f1b1638b fix(deps): update dependency @sentry/vue to v8.32.0 2024-09-25 12:03:31 +00:00
renovate
2ece97fc2b chore(deps): update dev-dependencies 2024-09-25 05:15:48 +00:00
renovate
71901a62f2 chore(deps): update dev-dependencies 2024-09-24 00:15:47 +00:00
renovate
cda0848b2a fix(deps): update dependency tailwindcss to v3.4.13 2024-09-23 15:15:27 +00:00
kolaente
261c6e6c9e 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
2024-09-23 14:41:00 +02:00
kolaente
204dccf08b feat: add utm tag to powered by link 2024-09-23 12:07:06 +02:00
renovate
c85cfcce6a fix(deps): update dependency @sentry/vue to v8.31.0 2024-09-23 08:49:46 +00:00
kolaente
c35c70e71f feat: do not load notifications while in the background 2024-09-23 10:31:09 +02:00
kolaente
dea123dbea docs: format config json 2024-09-22 17:18:17 +02:00
kolaente
5643027454 docs: intro for migrators 2024-09-22 17:18:01 +02:00
kolaente
b9cdc9fbe5 docs: clarify migrators 2024-09-22 17:10:36 +02:00
kolaente
003db05b66 docs: clarify enabled providers 2024-09-22 16:32:48 +02:00
kolaente
c5a97ef0a3 docs: correctly document providers in config 2024-09-22 15:58:21 +02:00
kolaente
8776465fa2 fix: generate config in ci 2024-09-22 15:35:03 +02:00
renovate
51bdbba286 fix(deps): update dependency @intlify/unplugin-vue-i18n to v5.2.0 2024-09-22 12:37:53 +00:00
kolaente
3c70bd630d feat: generate yml config from json
This change introduces a more abstract way of managing the config, allowing us to generate it into yaml and markdoc for the website.
It also changes the distributed config to be all commented out so that people using it only comment in the values they need.
2024-09-22 14:37:31 +02:00
renovate
2d5e2f70b9 fix(deps): update dependency vue-i18n to v10.0.3 2024-09-22 11:15:26 +00:00
renovate
2c8ca629de fix(deps): update dependency @intlify/unplugin-vue-i18n to v5.1.0 2024-09-22 10:15:42 +00:00
renovate
a61ac5ac32 fix(deps): update dependency vue to v3.5.8 2024-09-22 07:15:39 +00:00
renovate
8c9d75e9a4 chore(deps): update dev-dependencies 2024-09-22 02:15:43 +00:00
renovate
28f208542f fix(deps): update dependency vue-i18n to v10.0.2 2024-09-21 18:15:59 +00:00
renovate
6a2a78d014 chore(deps): update dev-dependencies 2024-09-21 05:16:14 +00:00
renovate
2c791e6dd2 fix(deps): update dependency vue to v3.5.7 2024-09-20 16:15:48 +00:00
kolaente
4d2021997a chore(deps): update desktop lockfile 2024-09-20 17:42:37 +02:00
kolaente
732902919b chore: 0.24.3 release preperation 2024-09-20 14:48:51 +02:00
renovate
31ae716ab2 chore(deps): update pnpm to v9.11.0 2024-09-20 11:15:25 +00:00
kolaente
207b88a286 fix(typesense): use typesense bulk insert, log all errors 2024-09-20 10:20:18 +02:00
kolaente
50a0674835 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.
2024-09-20 10:13:05 +02:00
kolaente
8181829c9e fix(typesense): index tasks one by one 2024-09-20 09:18:57 +02:00
kolaente
83aeb90376 chore(logging): simplify log template string 2024-09-20 08:42:22 +02:00
kolaente
e4584109df chore(typesense): add more debug logging 2024-09-20 08:42:21 +02:00
renovate
6d7748988a fix(deps): update dependency vuemoji-picker to v0.3.1 2024-09-20 05:55:16 +00:00
renovate
363da6c80f chore(deps): update dev-dependencies 2024-09-20 05:55:04 +00:00
kolaente
3f1d0f390b fix(typesense): use emplace instead of upsert to update documents 2024-09-20 07:54:23 +02:00
kolaente
edf206aba6 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
2024-09-19 15:57:18 +02:00
kolaente
9e39ef9397 fix(typesense): add new tasks to typesense properly
Maybe related to https://github.com/go-vikunja/vikunja/issues/317
2024-09-19 15:30:14 +02:00
kolaente
c54181eeda fix(deps): update module github.com/typesense/typesense-go to v2 2024-09-19 15:30:13 +02:00
kolaente
b3bf92b7ce fix(typesense): only fail silently when a project was not found during indexing 2024-09-19 15:30:13 +02:00
renovate
05dd05216d fix(deps): update tiptap to v2.7.2 2024-09-19 11:57:11 +00:00
kolaente
cd0ab54d57 fix(views): add migration for filtered kanban buckets 2024-09-19 13:23:23 +02:00
kolaente
a7bd9dad24 feat(task): use focus-visible for task focus styles 2024-09-19 13:01:18 +02:00
kolaente
10e245f6d0 fix(a11y): hide unfocusable buttons 2024-09-19 12:50:47 +02:00
kolaente
010dd1ea22 fix(task): open focused task when pressing enter 2024-09-19 12:50:21 +02:00
kolaente
65a2814b2a feat(navigation): use focus-visible for nav items 2024-09-19 12:36:33 +02:00
kolaente
4dd9d5de67 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.
2024-09-19 12:21:19 +02:00
kolaente
ec902b051b fix(task): mark related task as done from the task detail view
Resolves https://github.com/go-vikunja/vikunja/issues/326
2024-09-19 11:31:06 +02:00
kolaente
4b2b8e3b83 chore: rearrange cron registers 2024-09-19 11:24:43 +02:00
kolaente
bc52da4029 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
2024-09-19 11:19:48 +02:00
kolaente
2123da49a3 fix(task): cleanup old task positions and task buckets when adding an updated or created task to filter 2024-09-19 09:30:21 +02:00
kolaente
c53a761396 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
2024-09-19 09:30:20 +02:00
kolaente
c84b50b3ee fix(labels): trigger task updated for bulk label task update 2024-09-19 08:59:34 +02:00
kolaente
c5b82fc591 fix: test selector 2024-09-18 21:28:08 +02:00
renovate
1f00180af6 fix(deps): update dependency vue to v3.5.6 2024-09-18 17:02:42 +00:00
renovate
33e851f543 fix(deps): update dependency tailwindcss to v3.4.12 2024-09-18 17:02:06 +00:00
kolaente
16d7386975 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
2024-09-18 19:00:47 +02:00
kolaente
6d9bda8cc1 fix(projects): description not visible on mobile 2024-09-18 18:47:46 +02:00
kolaente
abf92e29fa 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
2024-09-18 18:00:27 +02:00
kolaente
f4d628550f chore(tasks): move drag options to direct attributes instead of v-bind 2024-09-18 16:34:24 +02:00
kolaente
1d352fcbf3 chore(devenv): do not install cypress on darwin 2024-09-18 14:30:38 +02:00
kolaente
a1105434bf chore: remove console.log 2024-09-18 13:38:30 +02:00
kolaente
acc7c9f8f5 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
2024-09-18 13:36:56 +02:00
kolaente
cc64ca6406 fix(task): align task title on mobile popup 2024-09-18 11:36:06 +02:00
kolaente
89f78cd369 chore: add go and direnv to recommended vscode extensions 2024-09-18 10:43:23 +02:00
renovate
14c3b13823 fix(deps): update tiptap to v2.7.1 2024-09-18 08:33:10 +00:00
renovate
c2a7438814 chore(deps): update dev-dependencies 2024-09-18 01:18:02 +00:00
renovate
8fe37fd900 fix(deps): update tiptap to v2.7.0 2024-09-17 10:11:13 +00:00
renovate
88b4ab1768 fix(deps): update module github.com/prometheus/client_golang to v1.20.4 2024-09-17 09:15:34 +00:00
kolaente
c252c8f0cd fix: reset id before creating 2024-09-17 10:46:14 +02:00
renovate
410ff28b71 fix(deps): update vueuse to v11.1.0 2024-09-17 08:11:36 +00:00
renovate
d98dd7ecbb chore(deps): update dev-dependencies 2024-09-17 08:10:22 +00:00
renovate
fc73085876 fix(deps): update dependency date-fns to v4 2024-09-17 05:16:09 +00:00
renovate
c71f7334b4 chore(deps): update dev-dependencies 2024-09-15 10:15:16 +00:00
kolaente
6a5342bd49 fix(modal): do not prevent scrolling on mobile
Maybe related to https://github.com/go-vikunja/vikunja/issues/325
2024-09-15 11:38:17 +02:00
renovate
b4ea1bb86a fix(deps): update dependency vue-router to v4.4.5 2024-09-14 11:15:19 +00:00
renovate
378d0ae9bb fix(deps): update dependency vue to v3.5.5 2024-09-14 10:17:49 +00:00
kolaente
6f27e1401a fix(user): do not create user with existing id
Resolves https://vikunja.sentry.io/share/issue/6f1e37d4b8b248188e20650234a45cde/
2024-09-14 12:16:05 +02:00
kolaente
bf5cafc03f fix: lint 2024-09-14 12:12:47 +02:00
kolaente
f4a7326b68 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
2024-09-14 12:11:54 +02:00
kolaente
1451f6e46f fix(kanban): correctly paginate filtered kanban buckets
Resolves https://github.com/go-vikunja/vikunja/issues/314
2024-09-14 09:37:21 +02:00
Frederick [Bot]
427eb2a618 chore(i18n): update translations via Crowdin 2024-09-14 00:25:59 +00:00
kolaente
e4b541e653 fix(view): correctly get paginated task results 2024-09-13 22:56:41 +02:00
kolaente
45ff5907e6 fix(view): correctly resolve bucket filter when paginating 2024-09-13 19:45:48 +02:00
kolaente
5a7c3927f3 fix(view): correctly resolve label for filtered views or buckets 2024-09-13 19:14:54 +02:00
kolaente
f425d98b4d 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
2024-09-13 18:42:42 +02:00
kolaente
4c55016c1a fix(task): multiple overlapping defer due date popups
Resolves https://github.com/go-vikunja/vikunja/issues/131
2024-09-13 17:44:26 +02:00
kolaente
1a8f12ac13 fix(kanban): do not mark first bucked as done bucket in filter bucket mode
Resolves https://github.com/go-vikunja/vikunja/issues/313
2024-09-13 11:52:44 +02:00
kolaente
7b873ec31c fix(table): make sorting for two-word properties work
Resolves https://community.vikunja.io/t/various-sorting-filtering-issues/2781/8
2024-09-13 11:03:38 +02:00
kolaente
8b77832af2 fix(test): cypress test selector 2024-09-13 10:28:48 +02:00
Frederick [Bot]
14710d0bba chore(i18n): update translations via Crowdin 2024-09-13 00:25:12 +00:00
kolaente
945f25b818 fix(kanban): make kanban full width on mobile
Related to https://github.com/go-vikunja/vikunja/issues/309
2024-09-12 16:42:12 +02:00
kolaente
f53b93d98a fix(modal): make sure modal and its content scrolls properly on mobile
Related to https://github.com/go-vikunja/vikunja/issues/309
2024-09-12 16:22:18 +02:00
kolaente
97e030a1fc 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
2024-09-12 15:51:08 +02:00
renovate
b708db7025 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>
2024-09-12 13:31:26 +00:00
kolaente
6bfe71b30e fix(filters): immediately propagate changes
Resolves https://community.vikunja.io/t/filtering-startdate-now-is-invalid/2613/6
2024-09-12 15:28:39 +02:00
renovate
db196bdffe fix(deps): update dependency @intlify/unplugin-vue-i18n to v5 2024-09-12 12:42:40 +00:00
renovate
9428acd5e1 fix(deps): update dependency express to v4.21.0 2024-09-12 12:41:45 +00:00
renovate
58a60fb4ae fix(deps): update dependency vue-router to v4.4.4 2024-09-12 12:36:18 +00:00
renovate
f4ca22a6ad fix(deps): update dependency flexsearch to v0.7.43 (#2095)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2024-09-12 12:35:35 +00:00
kolaente
7e38a9f442 fix(kanban): make task creation loading spinner actually visible 2024-09-12 14:33:44 +02:00
renovate
a0a77818b1 fix(deps): update dependency vue-i18n to v10.0.1 2024-09-12 11:39:50 +00:00
kolaente
bdccd633fe fix(labels): remove input interactivity when label edit is disabled 2024-09-12 13:39:03 +02:00
kolaente
1f3eb8f2a3 chore: fix comment 2024-09-12 13:39:03 +02:00
renovate
8891ef347e fix(deps): update dependency tailwindcss to v3.4.11 2024-09-12 10:26:57 +00:00
kolaente
3b8ccbad4f fix(multiselect): make selectPlaceholder optional 2024-09-12 11:29:39 +02:00
kolaente
cc1b4bbd1b 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
2024-09-12 11:02:38 +02:00
Frederick [Bot]
9dd95101f9 [skip ci] Updated swagger docs 2024-09-12 08:42:38 +00:00
kolaente
20724f6fb5 fix(task): cyclomatic complexity 2024-09-12 10:24:16 +02:00
Frederick [Bot]
e1ea84fcd4 chore(i18n): update translations via Crowdin 2024-09-12 00:26:38 +00:00
kolaente
8d730543c3 fix(project): reset id before creating
Resolves https://vikunja.sentry.io/share/issue/6f1e37d4b8b248188e20650234a45cde/
2024-09-11 23:46:13 +02:00
renovate
a3d133bfee fix(deps): update dependency vue-i18n to v10 2024-09-11 18:01:57 +00:00
renovate
7b37ad0594 fix(deps): update dependency @sentry/vue to v8.30.0 2024-09-11 17:36:28 +00:00
kolaente
4aeb228c3a fix(project): show description in title attribute without html
Resolves https://community.vikunja.io/t/feedback-to-vikunja-0-24-0/2557/6
2024-09-11 18:23:43 +02:00
kolaente
b52d6dbf59 fix(projects): do not hide 6th project on project overview 2024-09-11 18:20:57 +02:00
kolaente
76f7797e56 chore: remove console.log 2024-09-11 18:14:10 +02:00
kolaente
55dd7d2981 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
2024-09-11 17:58:42 +02:00
kolaente
44a43b9f86 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/
2024-09-10 18:23:06 +02:00
kolaente
eb95caf757 fix(password): validate password before sending request to api 2024-09-10 17:44:52 +02:00
kolaente
1085a6583b fix(caldav): reject invalid project id with error 400
Resolves https://vikunja.sentry.io/share/issue/6fc18edefa0e4db3b2e10efe36deeaa4/
2024-09-10 17:32:35 +02:00
kolaente
e698ac5a34 fix(label): ignore existing ID during creation 2024-09-10 16:45:40 +02:00
renovate
020fea686d fix(deps): update module github.com/getsentry/sentry-go to v0.29.0 2024-09-10 10:17:45 +00:00
renovate
addf8523f4 fix(deps): update dependency express to v4.20.0 2024-09-10 09:49:23 +00:00
renovate
044aa1c742 fix(deps): update dependency vue to v3.5.4 2024-09-10 09:14:50 +00:00
renovate
552e1ce796 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>
2024-09-10 08:50:42 +00:00
renovate
c1246d73d4 fix(deps): update dependency @sentry/vue to v8.29.0 2024-09-10 07:13:00 +00:00
renovate
85fa397a46 chore(deps): update pnpm to v9.10.0 2024-09-09 14:35:34 +00:00
renovate
af47e43c34 chore(deps): update dev-dependencies 2024-09-09 03:31:05 +00:00
Frederick [Bot]
2539f15dfb [skip ci] Updated swagger docs 2024-09-07 11:48:49 +00:00
kolaente
5c1b2846a1 docs(api): use correct return type for the /user endpoint 2024-09-07 13:27:06 +02:00
renovate
af8100d262 fix(deps): update dependency vue-router to v4.4.3 2024-09-06 18:17:15 +00:00
renovate
63f85c97ae chore(deps): update dependency go to v1.23.1 2024-09-06 18:06:24 +00:00
renovate
2b1e3ffd2a chore(deps): update dev-dependencies 2024-09-06 18:04:14 +00:00
renovate
5f470afd7c fix(deps): update module golang.org/x/image to v0.20.0 2024-09-06 17:17:31 +00:00
renovate
37c6f94ba2 fix(deps): update module github.com/prometheus/client_golang to v1.20.3 2024-09-06 15:56:25 +00:00
renovate
b42cd5786e fix(deps): update dependency vue to v3.5.3 2024-09-06 15:21:22 +00:00
renovate
5072ab3d72 fix(deps): update module dario.cat/mergo to v1.0.1 2024-09-06 15:11:42 +00:00
renovate
4b5ec018f5 fix(deps): update module github.com/redis/go-redis/v9 to v9.6.1 2024-09-06 15:11:34 +00:00
renovate
efe5c7b3cb fix(deps): update module golang.org/x/crypto to v0.27.0 2024-09-06 15:09:51 +00:00
renovate
ba0c32aacf fix(deps): update module golang.org/x/oauth2 to v0.23.0 2024-09-06 15:09:43 +00:00
renovate
b6e142e8d0 fix(deps): update vueuse to v11 2024-09-06 15:08:03 +00:00
renovate
750d565477 fix(deps): update dependency tailwindcss to v3.4.10 2024-09-06 12:15:45 +00:00
Frederick [Bot]
2b8515b91d [skip ci] Updated swagger docs 2024-09-06 11:18:51 +00:00
kolaente
68636f27da fix(files): use absolute path everywhere 2024-09-06 12:59:48 +02:00
kolaente
cf94cc8cab chore(docs): clarify usage of related model creation
Resolves https://github.com/go-vikunja/vikunja/issues/323
2024-09-06 12:06:12 +02:00
renovate
669b7452cd fix(deps): update dependency axios to v1.7.7 2024-09-06 08:34:52 +00:00
renovate
1601c9098d fix(deps): update dependency sortablejs to v1.15.3 2024-09-06 08:34:36 +00:00
renovate
f132b0e718 fix(deps): update module github.com/gabriel-vasile/mimetype to v1.4.5 2024-09-06 08:33:40 +00:00
renovate
5d12986e3f fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.23 2024-09-06 08:33:37 +00:00
renovate
74e0197dc6 fix(deps): update module github.com/threedotslabs/watermill to v1.3.7 2024-09-06 08:32:06 +00:00
renovate
2dd133fb4c fix(deps): update dependency @kyvg/vue3-notification to v3.3.0 2024-09-06 08:31:54 +00:00
kolaente
02c1de55c4 chore(attachments): refactor building image preview 2024-09-06 09:43:59 +02:00
renovate
cbc63c853d fix(deps): update dependency @sentry/vue to v8.28.0 2024-09-06 07:40:44 +00:00
renovate
b5c4a3a80c fix(deps): update dependency pinia to v2.2.2 2024-09-06 07:40:14 +00:00
renovate
a8ea5e11ab fix(deps): update dependency vue-i18n to v9.14.0 2024-09-06 07:39:02 +00:00
renovate
812430b9cf fix(deps): update module golang.org/x/text to v0.18.0 2024-09-06 07:37:53 +00:00
kolaente
9d7b6d3d9a feat(dump): add flag to allow specifying dump path
Resolves https://community.vikunja.io/t/vikunja-0-24-docker-bin-sh/2621/3
2024-09-05 15:14:03 +02:00
kolaente
c2b116de70 chore(files): use absolute file path to retrieve and save files 2024-09-05 15:03:32 +02:00
kolaente
22e594e253 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
2024-09-05 14:51:47 +02:00
kolaente
0d9c03e0f2 chore(magefile): use tx.Sync instead of Sync2 2024-09-05 14:40:22 +02:00
renovate
72bb6609a1 fix(deps): update module golang.org/x/term to v0.24.0 2024-09-05 10:18:27 +00:00
renovate
b259072e6a fix(deps): update module github.com/typesense/typesense-go to v2 2024-09-04 21:16:13 +00:00
kolaente
ffcc48ec87 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
2024-09-04 23:08:29 +02:00
Frederick [Bot]
5aa0b6a0cf [skip ci] Updated swagger docs 2024-09-04 20:43:53 +00:00
kolaente
b60efbd259 chore(subscription): return subscription entity type using json Marshaler 2024-09-04 22:25:03 +02:00
kolaente
34ac29fcce fix(reminders): notify subscribed users as well
Resolves https://community.vikunja.io/t/no-reminder-notification-by-e-mail-from-my-colleague/2779
2024-09-04 22:11:07 +02:00
kolaente
75f3e930cd fix(subscriptions): do not panic when a task does not have a subscription 2024-09-04 21:55:14 +02:00
kolaente
4ff8815fe1 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.
2024-09-04 19:55:17 +02:00
renovate
850ec7efb0 fix(deps): update dependency dayjs to v1.11.13 2024-09-03 20:59:37 +00:00
kolaente
115d1c3618 fix(subscription): always return task subscription when subscribed to task and project 2024-09-03 22:37:53 +02:00
kolaente
6d26497bbb chore(deps): update github.com/wneessen/go-mail to v0.4.4 2024-09-03 22:07:11 +02:00
kolaente
06305eb6b3 fix(subscriptions): correctly inherit subscriptions
Resolves https://community.vikunja.io/t/e-mail-notification-twice/2740/20
2024-09-03 22:04:11 +02:00
Frederick [Bot]
7bd84a845c chore(i18n): update translations via Crowdin 2024-09-03 00:25:53 +00:00
kolaente
165ee9e7f3 fix(service worker): use correct workbox version
Resolves https://github.com/go-vikunja/vikunja/issues/322
2024-09-02 23:40:17 +02:00
kolaente
2c9becec10 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
2024-09-02 23:36:58 +02:00
kolaente
1463bce24c feat(dev): add mailpit to devenv services 2024-09-02 23:18:50 +02:00
kolaente
5c56d07215 chore(web): always set internal error 2024-09-01 19:37:27 +02:00
kolaente
6fb314b326 chore(web): use logger directly 2024-09-01 19:37:27 +02:00
kolaente
9b01666ec6 chore(web): use web auth factory directly 2024-09-01 19:37:27 +02:00
Frederick [Bot]
14c862d284 chore(i18n): update translations via Crowdin 2024-08-30 00:25:55 +00:00
kolaente
bcfd72c645 chore(web): use config directly 2024-08-29 18:41:20 +02:00
kolaente
499f66b7ae chore(web): directly use new db session 2024-08-29 16:31:46 +02:00
kolaente
8e37d5cb76 chore(web): remove redundant use of fmt.Sprintf 2024-08-29 16:28:37 +02:00
kolaente
57ba073874 chore(web): use errors.As instead of type assertion 2024-08-29 16:28:16 +02:00
kolaente
329de3aab3 chore(web): remove unused echo context 2024-08-29 16:20:39 +02:00
kolaente
74a74b7ec7 fix(labels): test error assertion 2024-08-29 16:16:41 +02:00
kolaente
2063da9eec chore(web): move web handler package to Vikunja 2024-08-29 16:15:28 +02:00
kolaente
7a7e97770c chore(errors): always add internal error to echo error 2024-08-29 15:39:34 +02:00
kolaente
bea131cfd9 fix(labels): trigger task.updated event when removing a label from a task 2024-08-29 15:19:06 +02:00
kolaente
5a0d1f1dc6 feat(event): simplify dispatching task updated event from only a task id 2024-08-29 15:18:03 +02:00
kolaente
b5035f9d2b chore(docker): use new env format 2024-08-29 11:19:46 +02:00
kolaente
07bd9de0c6 feat(docker): add opencontainer labels
Resolves https://github.com/go-vikunja/vikunja/issues/308
2024-08-29 11:19:21 +02:00
kolaente
efde364224 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
2024-08-29 10:35:05 +02:00
kolaente
fde1763eef fix(api): return 404 response when using a token and the route does not exist 2024-08-29 10:12:20 +02:00
kolaente
429c7ca2c1 feat(task): always insert new tasks at the top
Resolves https://community.vikunja.io/t/kanban-cards-in-wrong-order/2731
2024-08-28 15:30:40 +02:00
kolaente
bf56311faa fix(task): set done at date when moving a task to the done bucket
Resolves https://github.com/go-vikunja/vikunja/issues/320
2024-08-28 14:21:31 +02:00
Frederick [Bot]
c38aaeb224 chore(i18n): update translations via Crowdin 2024-08-28 00:25:41 +00:00
Frederick [Bot]
1b9139b9b0 chore(i18n): update translations via Crowdin 2024-08-27 00:25:53 +00:00
kolaente
13763e3540 chore(deps): update tiptap to 2.6.6 2024-08-26 22:58:15 +02:00
kolaente
56bab7485f feat(i18n): add Lithuanian translation for selection 2024-08-26 17:05:01 +02:00
kolaente
8bfd0493b2 fix(deps): update golangci 2024-08-25 14:30:46 +00:00
kolaente
435cb2e7f7 fix(view): do not crash when saving a view
Resolves https://github.com/go-vikunja/vikunja/issues/312
2024-08-25 15:53:51 +02:00
Frederick [Bot]
9ed33f5c08 chore(i18n): update translations via Crowdin 2024-08-23 00:25:56 +00:00
Frederick [Bot]
83669fd9e0 chore(i18n): update translations via Crowdin 2024-08-21 00:25:43 +00:00
Frederick [Bot]
35578e0021 chore(i18n): update translations via Crowdin 2024-08-20 00:25:51 +00:00
Frederick [Bot]
e281de30b5 chore(i18n): update translations via Crowdin 2024-08-17 00:15:36 +00:00
Frederick [Bot]
ec2c2e74f0 chore(i18n): update translations via Crowdin 2024-08-15 00:03:11 +00:00
kolaente
b031c9772f chore: 0.24.2 release preperations
(cherry picked from commit 08821ea8a8)
2024-08-12 20:25:31 +02:00
kolaente
f22420d502 fix(kanban): always make cover image full width 2024-08-12 17:22:26 +02:00
kolaente
ebfd5f54d2 fix(migration): ensure project background gets exported and imported 2024-08-12 17:18:07 +02:00
kolaente
28b4eaee31 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
2024-08-12 17:00:16 +02:00
kolaente
b83448b7a6 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
2024-08-12 15:53:51 +02:00
kolaente
eed783e42f 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
2024-08-12 15:35:37 +02:00
kolaente
1d624612ee chore: use nixpkgs unstable for more recent packages 2024-08-12 15:32:12 +02:00
kolaente
9576f72d7c fix(task): set current project after moving a task 2024-08-12 15:22:14 +02:00
kolaente
7efc4d1bc8 fix(task): do not allow moving a task to the project the task already belongs to 2024-08-12 15:18:45 +02:00
kolaente
670e605275 chore(deps): update dependency node to v20.16.0 2024-08-12 12:26:53 +02:00
kolaente
871b3ce071 chore(deps): update go toolchain to 1.22.5 2024-08-12 12:17:53 +02:00
kolaente
ad3c5fcee5 feat: switch from nix flakes to devenv 2024-08-12 12:17:31 +02:00
kolaente
e2a87036e0 feat(editor): support custom protocol for links
Resolves https://github.com/go-vikunja/vikunja/issues/306
2024-08-12 11:42:43 +02:00
kolaente
40bb86bee5 fix(mail): do not fail testmail command when the connection could not be closed.
Resolves https://github.com/go-vikunja/vikunja/issues/300
2024-08-12 11:08:16 +02:00
Frederick [Bot]
4a4ed2cf89 chore(i18n): update translations via Crowdin 2024-08-10 00:03:08 +00:00
kolaente
7751e124a7 chore(deps): update flake 2024-08-08 11:24:26 +02:00
Frederick [Bot]
6137d07138 chore(i18n): update translations via Crowdin 2024-08-08 00:03:17 +00:00
kolaente
66d316f0b5 fix(i18n): change casing of Ukrainian language in selector 2024-08-07 16:51:22 +02:00
kolaente
bf2d56c9d4 docs: clarify Todoist redirect url
Resolves https://github.com/go-vikunja/vikunja/issues/302
2024-08-07 16:27:29 +02:00
Dominik Pschenitschni
413798b321 fix: remove console log 2024-08-07 13:29:56 +00:00
Frederick [Bot]
bf1c8c6119 chore(i18n): update translations via Crowdin 2024-07-31 00:02:59 +00:00
Frederick [Bot]
49fa0a8468 chore(i18n): update translations via Crowdin 2024-07-27 00:03:15 +00:00
Frederick [Bot]
784cd42a7a chore(i18n): update translations via Crowdin 2024-07-24 00:03:08 +00:00
Frederick [Bot]
4f74be0247 chore(i18n): update translations via Crowdin 2024-07-23 00:02:28 +00:00
Dominik Pschenitschni
7ef1e0a3e5 fix: textarea autosize for LanguageTool 2024-07-21 12:40:32 +00:00
Dominik Pschenitschni
bc5fd380e5 chore: improve error message 2024-07-21 11:03:20 +00:00
Dominik Pschenitschni
bcd306b84d chore: remove lodash.debounce 2024-07-21 11:02:25 +00:00
Dominik Pschenitschni
ad2870335d feat: add missing peer dependency 2024-07-21 11:01:38 +00:00
Frederick [Bot]
917748777f chore(i18n): update translations via Crowdin 2024-07-21 00:03:15 +00:00
renovate
324c966dda fix(deps): update module github.com/coreos/go-oidc/v3 to v3.11.0 2024-07-19 10:16:39 +00:00
Frederick [Bot]
0984821b41 [skip ci] Updated swagger docs 2024-07-19 10:01:46 +00:00
Dominik Pschenitschni
e8be657d97 feat: improve ProjectSettingsViews 2024-07-19 09:43:49 +00:00
Elscrux
75ce261f74 feat: downscaled image previews for task attachments (#2541)
As discussed in [https://community.vikunja.io/t/add-scaled-down-images-for-image-previews](https://community.vikunja.io/t/add-scaled-down-images-for-image-previews) this adds a query parameter in the task attachment request which returns a scaled down image for preview purposes to reduce network load and improve responsiveness.

Co-authored-by: Elscrux <nickposer2102@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2541
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Elscrux <elscrux@gmail.com>
Co-committed-by: Elscrux <elscrux@gmail.com>
2024-07-19 09:30:06 +00:00
devadattas
5f9d0fe763 feat: permalinks for task comments (#2442)
Resolves #2441

Co-authored-by: Devadatta Sahoo <webmaster@nettantra.com>
Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2442
Reviewed-by: konrad <k@knt.li>
Co-authored-by: devadattas <devadattas@gmail.com>
Co-committed-by: devadattas <devadattas@gmail.com>
2024-07-19 08:45:50 +00:00
Dominik Pschenitschni
bbfd5270db 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>
2024-07-19 07:33:10 +00:00
Dominik Pschenitschni
1e632397d2 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.
2024-07-19 07:26:50 +00:00
Dominik Pschenitschni
d35454c099 feat: improve priority visibility 2024-07-19 06:53:53 +00:00
Dominik Pschenitschni
2a6ba7e7f0 feat: improve label store 2024-07-19 06:51:24 +00:00
Dominik Pschenitschni
1e523a1a39 feat: improve projects store 2024-07-19 05:49:14 +00:00
Dominik Pschenitschni
fb91e73a3c fix: emit for DatepickerWithValues 2024-07-19 05:28:17 +00:00
Frederick [Bot]
ebd6139c1f chore(i18n): update translations via Crowdin 2024-07-19 00:03:11 +00:00
Dominik Pschenitschni
6990be705c feat: use withDefaults for Reminders 2024-07-18 18:31:33 +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
renovate
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
renovate
34691b8edf fix(deps): update module golang.org/x/crypto to v0.25.0 2024-07-18 10:46:03 +02:00
Frederick [Bot]
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
renovate
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
renovate
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
renovate
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
renovate
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 Pschenitschni
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
renovate
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 Pschenitschni
f1481d702c feat: withDefaults for EditAssignees 2024-07-17 10:33:28 +00:00
renovate
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
renovate
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 Pschenitschni
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 Pschenitschni
aaa2abced4 feat: add withDefaults and emit types to PrioritySelect 2024-07-17 02:33:35 +00:00
Dominik Pschenitschni
ddc18aa177 feat: remove props destructuring from KanbanCard 2024-07-16 23:28:15 +00:00
Dominik Pschenitschni
07130bdc3a feat: remove props destructuring from Attachments 2024-07-16 23:10:57 +00:00
Dominik Pschenitschni
2f92e407cc feat: remove props destructuring from ViewEditForm 2024-07-16 22:59:25 +00:00
Dominik Pschenitschni
6e72606d74 feat: use withDefaults for EditLabels 2024-07-16 22:09:37 +00:00
Dominik Pschenitschni
577f5ae69a feat: use withDefaults for Password 2024-07-16 22:09:30 +00:00
Dominik Pschenitschni
8ad7e7c905 feat: remove PropTypes helper from ProjectInfo 2024-07-16 22:07:27 +00:00
Dominik Pschenitschni
b4e9d9437e feat: use withDefaults for FancyCheckbox 2024-07-16 22:07:18 +00:00
Dominik Pschenitschni
0c70aedeb1 feat: remove props destructuring from ProjectList 2024-07-16 22:06:48 +00:00
Dominik Pschenitschni
99e90c0b02 feat: remove props destructuring from ProjectTable 2024-07-16 22:06:40 +00:00
Dominik Pschenitschni
38744dfd5d feat: remove props destructuring for ProjectWrapper 2024-07-16 22:04:43 +00:00
Dominik Pschenitschni
eb07be1a62 feat: remove props destructuring from ColorPicker 2024-07-16 22:04:26 +00:00
Dominik Pschenitschni
825d1add49 feat: remove props destructuring from FilterDelete 2024-07-16 22:04:21 +00:00
Dominik Pschenitschni
a15831eb33 feat: remove props destructuring from SingleTaskInProject 2024-07-16 22:04:17 +00:00
Dominik Pschenitschni
871e0acd8a feat: use withDefaults for PriorityLabel 2024-07-16 21:58:07 +00:00
Dominik Pschenitschni
5af908b2e5 feat: remove props destructuring from ProjectKanban 2024-07-16 21:57:57 +00:00
Dominik Pschenitschni
449e9a911c feat: remove props destructuring from FilterEdit 2024-07-16 21:53:56 +00:00
Dominik Pschenitschni
098c99fd2e feat: type defineEmits for CreateEdit 2024-07-16 21:53:28 +00:00
Dominik Pschenitschni
c9591fe464 feat: remove props destructuring from NoAuthWrapper 2024-07-16 21:53:21 +00:00
Dominik Pschenitschni
df6a9b67fd feat: use withDefaults for DatepickerInline 2024-07-16 21:53:15 +00:00
Dominik Pschenitschni
d02c349231 feat: remove props destructuring from ShowTasks 2024-07-16 21:50:40 +00:00
Dominik Pschenitschni
fd3f1de861 feat: type defineEmits for Heading 2024-07-16 21:50:32 +00:00
Dominik Pschenitschni
f38a5c9220 feat: type defineEmits for ProjectSearch 2024-07-16 21:50:27 +00:00
Dominik Pschenitschni
9d2e79f725 feat: define prop and emit types for FilterPopup 2024-07-16 21:50:23 +00:00
Dominik Pschenitschni
85889fff56 feat: remove PropTypes helper from ProjectSettingsEdit 2024-07-16 21:49:15 +00:00
Dominik Pschenitschni
8ac0eb4aa4 feat: defineModel and withDefaults for PercentDoneSelect 2024-07-16 21:49:02 +00:00
Dominik Pschenitschni
1966cc3c0e feat: type defineEmits for ApiConfig 2024-07-16 21:46:15 +00:00
Dominik Pschenitschni
20bdb01187 feat: remove props destructuring ProjectSettingsViews 2024-07-16 21:45:29 +00:00
Dominik Pschenitschni
3ff56d7987 feat: remove props destructuring for Filters 2024-07-16 21:44:24 +00:00
Dominik Pschenitschni
46aa2fff0f feat: remove props destructuring for DeferTask 2024-07-16 21:43:36 +00:00
Dominik Pschenitschni
a10f9ca225 feat: remove props destructuring from TaskDetailView 2024-07-16 21:42:21 +00:00
Dominik Pschenitschni
0bc1832050 feat: remove PropTypes helper from FilePreview 2024-07-16 21:39:15 +00:00
Dominik Pschenitschni
78811d916a feat: use withDefaults for Datepicker 2024-07-16 21:38:07 +00:00
Dominik Pschenitschni
f19f19bb75 feat: use withDefaults for Comments 2024-07-16 21:37:52 +00:00
Dominik Pschenitschni
f2fdbad7d4 feat: use withDefaults for UserTeam 2024-07-16 21:37:28 +00:00
Dominik Pschenitschni
4b9b9da122 feat: use withDefaults for ReminderPeriod 2024-07-16 21:35:06 +00:00
Dominik Pschenitschni
10832165c3 feat: use withDefaults for Pagination 2024-07-16 21:34:59 +00:00
Dominik Pschenitschni
d6c3b5a9a1 feat: use withDefaults for Reactions 2024-07-16 21:34:51 +00:00
Dominik Pschenitschni
2f6338484b feat: use withDefaults for ProgressBar 2024-07-16 21:32:13 +00:00
Dominik Pschenitschni
f586e51aad feat: use withDefaults for DateTableCell 2024-07-16 21:32:06 +00:00
Dominik Pschenitschni
fd12c8705e feat: use withDefaults for SelectProject 2024-07-16 21:30:52 +00:00
Dominik Pschenitschni
5545b0e447 feat: add withDefaults, defineEmits and defineSlots types for Dropdown 2024-07-16 21:30:33 +00:00
Dominik Pschenitschni
043a6dd049 feat: type defineEmits for Card 2024-07-16 21:29:39 +00:00
Dominik Pschenitschni
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
renovate
9b232a326a fix(deps): update dependency @sentry/vue to v8.17.0 2024-07-16 08:32:45 +00:00
Frederick [Bot]
68b9d391b0 chore(i18n): update translations via Crowdin 2024-07-16 00:23:00 +00:00
Dominik Pschenitschni
b718aa1fbd chore(popup): trigger close function directly 2024-07-15 19:51:14 +00:00
renovate
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]
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]
dcf88560a7 chore(i18n): update translations via Crowdin 2024-07-14 00:23:03 +00:00
Dominik Pschenitschni
2dc541571c fix: spelling mail 2024-07-13 11:03:43 +00:00
Frederick [Bot]
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]
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]
02a7958865 chore(i18n): update translations via Crowdin 2024-07-11 00:22:47 +00:00
Dominik Pschenitschni
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 Pschenitschni
faa797f461 feat: improve main nav spacing and open speed 2024-07-10 09:19:55 +00:00
Frederick [Bot]
e2eb711ac9 chore(i18n): update translations via Crowdin 2024-07-10 00:22:50 +00:00
renovate
7dcb5fec9a chore(deps): update dev-dependencies 2024-07-09 11:27:08 +00:00
Frederick [Bot]
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 Pschenitschni
0a81855bc1 fix: muliselect optional props
also adds name and id props
2024-07-08 14:04:03 +00:00
renovate
6064d72aa7 chore(deps): update dev-dependencies 2024-07-08 13:55:26 +00:00
Frederick [Bot]
35dea13b22 chore(i18n): update translations via Crowdin 2024-07-08 00:21:34 +00:00
Dominik Pschenitschni
7ef6ddf8f7 fix: gitignore dist path 2024-07-07 15:02:49 +00:00
Dominik Pschenitschni
c37fe49890 feat: improve BaseButtonEmits type 2024-07-07 15:02:41 +00:00
Dominik Pschenitschni
413d1f9ad7 feat: withDefaults for Multiselect 2024-07-07 15:02:30 +00:00
Dominik Pschenitschni
3317280062 fix: dropdown item disabled prop 2024-07-07 15:01:11 +00:00
Balázs Keresztury
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 Pschenitschni
1eb1aa2575 feat: remove unnecessary prop from Card 2024-07-07 14:58:58 +00:00
Dominik Pschenitschni
43e38fae17 feat: rename TheNavigation to AppHeader 2024-07-07 14:57:23 +00:00
Frederick [Bot]
af54ee6c5c chore(i18n): update translations via Crowdin 2024-07-07 00:22:51 +00:00
Frederick [Bot]
161fd1f1b6 chore(i18n): update translations via Crowdin 2024-07-06 00:23:06 +00:00
Dominik Pschenitschni
479b786761 feat: use withDefaults for ProjectCardGrid 2024-07-05 15:50:10 +00:00
Dominik Pschenitschni
daeefeb487 feat: define prop and emit types DatepickerWithRange 2024-07-05 15:35:06 +00:00
Dominik Pschenitschni
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 Pschenitschni
5cf57a520c feat: use withDefaults for Heading 2024-07-05 12:02:39 +00:00
Dominik Pschenitschni
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
renovate
038e4ba386 chore(deps): update dependency vue-tsc to v2.0.26 2024-07-05 06:49:44 +00:00
Frederick [Bot]
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 Pschenitschni
20efacfa59 feat: improve settings label casing 2024-07-04 09:17:58 +00:00
Dominik Pschenitschni
5e84a237fb fix(translation): TOTP casing 2024-07-04 09:10:01 +00:00
Dominik Pschenitschni
f9e0b43707 feat: move powered by to bottom 2024-07-04 09:04:39 +00:00
Dominik Pschenitschni
ed0ef385e9 fix: add missing disabled prop 2024-07-04 09:00:35 +00:00
Frederick [Bot]
f2a0ae108c chore(i18n): update translations via Crowdin 2024-07-04 00:21:54 +00:00
Dominik Pschenitschni
a721d9286b fix: disable button if loading 2024-07-03 16:05:05 +00:00
Dominik Pschenitschni
bc2baa3bbd feat(Multiselect): hide multiselect during loading 2024-07-03 15:34:19 +00:00
Dominik Pschenitschni
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]
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]
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]
62ba1d864a chore(i18n): update translations via Crowdin 2024-07-02 00:22:51 +00:00
Frederick [Bot]
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 Pschenitschni
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 Pschenitschni
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]
e71865ef99 chore(i18n): update translations via Crowdin 2024-06-30 00:23:05 +00:00
renovate
0688175b6f chore(deps): update dev-dependencies 2024-06-29 06:55:59 +00:00
renovate
732d2b8885 fix(deps): update dependency @sentry/vue to v8.13.0 2024-06-29 06:55:25 +00:00
Dominik Pschenitschni
8a2c74a702 feat: remove props destructuring from ProjectCard 2024-06-28 21:20:52 +00:00
Dominik Pschenitschni
516f507ac4 feat: remove props destructuring EditorToolbar 2024-06-28 21:20:44 +00:00
Dominik Pschenitschni
fb449d7b29 feat: improve ProjectSettingsEdit reactivity 2024-06-28 21:20:03 +00:00
Dominik Pschenitschni
914fe092e5 feat: add getter support to useProjectBackground 2024-06-28 21:18:37 +00:00
Dominik Pschenitschni
01a4ad99ab feat: use withDefaults for Done 2024-06-28 21:16:57 +00:00
Dominik Pschenitschni
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 Pschenitschni
c81649c139 feat: use defineProps types in CreatedUpdated 2024-06-28 21:10:55 +00:00
Dominik Pschenitschni
dea051010d feat: use withDefaults for Labels 2024-06-28 21:08:35 +00:00
Dominik Pschenitschni
1dbd8b6c37 feat: use defineProps types for ChecklistSummary 2024-06-28 21:07:31 +00:00
Dominik Pschenitschni
9e266f1e36 feat: use defineProps types for ProjectSettingsDropdown 2024-06-28 21:03:14 +00:00
Dominik Pschenitschni
5b0ce4e01c feat: use withDefaults for Card 2024-06-28 21:02:21 +00:00
Dominik Pschenitschni
7c9f0b8ada feat: remove props destructuring from SingleTaskInlineReadonly 2024-06-28 21:02:01 +00:00
Dominik Pschenitschni
bd32f7aef5 feat: use withDefaults for ProjectSearch 2024-06-28 21:00:15 +00:00
renovate
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]
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]
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 Pschenitschni
79798847b2 fix: move types to dev dependencies 2024-06-25 13:58:17 +00:00
Dominik Pschenitschni
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]
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
renovate
b6080149aa chore(deps): update dev-dependencies 2024-06-23 09:36:45 +00:00
Frederick [Bot]
f2ac9c2cca chore(i18n): update translations via Crowdin 2024-06-23 00:21:58 +00:00
Frederick [Bot]
cd05ceb495 chore(i18n): update translations via Crowdin 2024-06-22 00:22:58 +00:00
renovate
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
renovate
c74f4b00e9 chore(deps): update dev-dependencies 2024-06-21 07:13:15 +00:00
Frederick [Bot]
fda69fc1af chore(i18n): update translations via Crowdin 2024-06-21 00:22:03 +00:00
Dominik Pschenitschni
ff2644d1c5 feat: use defineOptions for Loadings.vue 2024-06-20 19:59:31 +00:00
Dominik Pschenitschni
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 Pschenitschni
94a907b009 feat: use withDefaults for BaseCheckbox 2024-06-20 13:04:55 +00:00
Dominik Pschenitschni
66be016a7f feat: improve gantt filter label 2024-06-20 13:03:45 +00:00
Dominik Pschenitschni
ba5240f6ae feat(XButton): merge script blocks 2024-06-20 13:03:41 +00:00
Dominik Pschenitschni
c90ee0142a fix: reset drag.value 2024-06-20 13:02:43 +00:00
Dominik Pschenitschni
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
renovate
5340e00259 chore(deps): update dependency @types/node to v20.14.6 2024-06-20 08:44:17 +00:00
Frederick [Bot]
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 Pschenitschni
abdec17d36 fix: disable vetur in case it's installed 2024-06-19 14:05:41 +00:00
Dominik Pschenitschni
9b43c13061 feat: set add tsconfigRootDir option 2024-06-19 14:05:41 +00:00
Dominik Pschenitschni
4546bd6986 feat: add root tsconfig 2024-06-19 14:05:41 +00:00
Dominik Pschenitschni
bf28a0c795 fix(ts): align with create-vue setup 2024-06-19 14:05:41 +00:00
Dominik Pschenitschni
f36115871c feat: camelcase global components 2024-06-19 14:02:14 +00:00
Dominik Pschenitschni
1977a7bee0 feat: add default to custom transition 2024-06-19 13:59:24 +00:00
Dominik Pschenitschni
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
renovate
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
renovate
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 Pschenitschni
5e4b9e38a6 feat: use withDefaults in CreateEdit 2024-06-18 11:29:33 +00:00
renovate
a80ac571f2 chore(deps): update goreleaser/nfpm docker tag to v2.37.1 2024-06-18 08:20:51 +00:00
Dominik Pschenitschni
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 Pschenitschni
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 Pschenitschni
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 Pschenitschni
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 Pschenitschni
fe21a2c3da feat: improve user component 2024-06-17 10:56:55 +00:00
renovate
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 Pschenitschni
cebb647e1d feat(components): align component name casing Dropdown 2024-06-17 09:39:41 +00:00
Dominik Pschenitschni
57a4ea4abb feat(components): align component name casing Pagination 2024-06-17 09:37:57 +00:00
Dominik Pschenitschni
92f2e0e214 feat: improve popup 2024-06-17 09:37:52 +00:00
Dominik Pschenitschni
6c113eaca1 feat: improve shortcut types 2024-06-17 09:36:17 +00:00
Dominik Pschenitschni
1665cd57cb feat(components): align component name casing Error 2024-06-17 09:35:24 +00:00
Dominik Pschenitschni
89e9313b03 feat(components): align component name casing color-bubble 2024-06-17 09:35:14 +00:00
Dominik Pschenitschni
d1d85b43f1 feat(components): align component name casing card 2024-06-17 09:35:09 +00:00
Dominik Pschenitschni
f8f05acc2d feat(components): align component name casing password 2024-06-17 09:35:05 +00:00
Dominik Pschenitschni
330f7b8fa2 feat(components): align component name casing CreateEdit 2024-06-17 09:32:06 +00:00
Dominik Pschenitschni
0e8d5b21aa feat(components): align component name casing apiconfig 2024-06-17 09:31:52 +00:00
Dominik Pschenitschni
1ed99d9ebc feat(components): align component name casing multiselect 2024-06-17 09:31:43 +00:00
Dominik Pschenitschni
58baf141d5 feat(components): align component name casing ContentAuth 2024-06-17 09:29:12 +00:00
Dominik Pschenitschni
0061ec03f5 feat: align sort icon color 2024-06-17 09:28:54 +00:00
Dominik Pschenitschni
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
renovate
5f4c5262d4 fix(deps): update module github.com/typesense/typesense-go to v1.1.0 2024-06-17 09:21:01 +00:00
renovate
f0b9a9b4f5 fix(deps): update module golang.org/x/crypto to v0.24.0 2024-06-17 09:18:33 +00:00
Dominik Pschenitschni
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
renovate
7a50171f3e fix(deps): update dependency camel-case to v5 2024-06-14 09:45:22 +00:00
renovate
5b2997c980 fix(deps): update vueuse to v10.11.0 2024-06-14 09:43:51 +00:00
renovate
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 Pschenitschni
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 Pschenitschni
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
renovate
b7115c3757 fix(deps): update dependency snake-case to v4 2024-06-12 18:42:09 +00:00
renovate
2026bda127 fix(deps): update module github.com/getsentry/sentry-go to v0.28.1 2024-06-12 15:34:35 +00:00
renovate
64a5aa880c fix(deps): update dependency @sentry/vue to v8 2024-06-12 14:13:36 +00:00
renovate
2d6981da20 fix(deps): update module golang.org/x/image to v0.17.0 2024-06-12 14:13:08 +00:00
renovate
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
renovate
ffa38e798f fix(deps): update module golang.org/x/sys to v0.21.0 2024-06-12 12:25:27 +00:00
renovate
1eea9d9c81 fix(deps): update module golang.org/x/oauth2 to v0.21.0 2024-06-12 12:16:38 +00:00
renovate
1f8669b72c fix(deps): update module github.com/go-testfixtures/testfixtures/v3 to v3.11.0 2024-06-12 12:15:39 +00:00
renovate
85c5e35a23 fix(deps): update module github.com/hashicorp/go-version to v1.7.0 2024-06-12 12:14:41 +00:00
renovate
751b3c7901 fix(deps): update module github.com/arran4/golang-ical to v0.3.0 2024-06-12 12:14:13 +00:00
renovate
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
renovate
03ad39777d fix(deps): update vueuse to v10.10.1 2024-06-12 10:38:27 +00:00
renovate
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 Pschenitschni
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 Pschenitschni
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
renovate
4b2938392c chore(deps): update pnpm to v9.3.0 2024-06-12 09:25:06 +00:00
Dominik Pschenitschni
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 Pschenitschni
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 Pschenitschni
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 Pschenitschni
fe2c3906ca fix: remove wrong expression 2024-06-11 19:39:40 +00:00
Dominik Pschenitschni
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 Pschenitschni
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 Pschenitschni
abf912f93f fix: use node20 typescript types 2024-06-10 21:41:52 +00:00
renovate
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 Pschenitschni
150d654e37 fix(pnpm): remove obsolete settings 2024-06-10 21:23:28 +00:00
Dominik Pschenitschni
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 Pschenitschni
917cbf9cb6 fix(vue): toValue instead of unref 2024-06-10 13:53:13 +00:00
Dominik Pschenitschni
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 Pschenitschni
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 Pschenitschni
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 Pschenitschni
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 Pschenitschni
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]
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]
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]
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]
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]
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]
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
andreymal
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
Elscrux
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 Baakman
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
Elscrux
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]
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]
a53ee4143f chore(i18n): update translations via Crowdin 2024-05-28 00:27:42 +00:00
Frederick [Bot]
aeadce8631 chore(i18n): update translations via Crowdin 2024-05-27 00:27:50 +00:00
Frederick [Bot]
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]
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]
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]
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
renovate
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
renovate
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
renovate
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
renovate
f8b502f344 chore(deps): update dev-dependencies 2024-05-04 06:56:59 +00:00
Frederick [Bot]
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
renovate
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
renovate
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
renovate
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]
a1892ea10b chore(i18n): update translations via Crowdin 2024-04-23 00:07:19 +00:00
renovate
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
renovate
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
renovate
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
renovate
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
renovate
d4ec0978ee fix(deps): update dependency vue-i18n to v9.13.0 2024-04-18 17:20:39 +00:00
renovate
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
renovate
00c323891a fix(deps): update module golang.org/x/oauth2 to v0.19.0 2024-04-18 15:56:46 +00:00
renovate
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]
d35ff0b380 chore(i18n): update translations via Crowdin 2024-04-18 00:06:32 +00:00
renovate
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
renovate
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
renovate
61455b8795 fix(deps): update sentry-javascript monorepo to v7.110.1 2024-04-17 06:21:21 +00:00
treysullivent
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
Elscrux
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
Elscrux
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
renovate
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
Elscrux
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
renovate
d2317b9531 fix(deps): update dependency vue-i18n to v9.11.0 2024-04-08 10:35:09 +00:00
renovate
552f8580a4 fix(deps): update dependency dompurify to v3.1.0 2024-04-08 10:27:31 +00:00
renovate
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
renovate
61322d2e2e fix(deps): update module github.com/yuin/goldmark to v1.7.1 2024-04-08 09:28:22 +00:00
renovate
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
renovate
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
Raymi306
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
renovate
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
renovate
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
waza-ari
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
renovate
176c41dc40 fix(deps): update dependency express to v4.19.2 2024-03-28 20:57:07 +00:00
waza-ari
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
renovate
30b4ed6b23 fix(deps): update dependency dompurify to v3.0.11 2024-03-28 20:53:00 +00:00
renovate
aed92d1cd2 fix(deps): update sentry-javascript monorepo to v7.108.0 2024-03-28 20:49:17 +00:00
Frederick [Bot]
2239d73797 chore(i18n): update translations via Crowdin 2024-03-27 00:11:11 +00:00
Frederick [Bot]
98b833f61a chore(i18n): update translations via Crowdin 2024-03-25 00:10:35 +00:00
Frederick [Bot]
ecd002dca3 chore(i18n): update translations via Crowdin 2024-03-21 00:05:22 +00:00
renovate
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]
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
renovate
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]
d22ebef0b3 chore(i18n): update translations via Crowdin 2024-03-20 00:06:31 +00:00
Frederick [Bot]
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
renovate
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
renovate
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
renovate
091e03a39d fix(deps): update module xorm.io/xorm to v1.3.9 2024-03-18 09:23:11 +00:00
renovate
55c9403dda chore(deps): update pnpm to v8.15.5 2024-03-18 09:08:09 +00:00
renovate
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
renovate
2cbd20a084 fix(deps): update dependency date-fns to v3.5.0 2024-03-16 10:12:02 +00:00
renovate
15949adc2b fix(deps): update dependency ufo to v1.5.1 2024-03-16 10:11:29 +00:00
renovate
11f2db0e9c chore(deps): update dev-dependencies 2024-03-16 10:11:17 +00:00
Frederick [Bot]
87ebe85972 chore(i18n): update translations via Crowdin 2024-03-16 00:05:25 +00:00
renovate
0cf11228cf fix(deps): update dependency vue-i18n to v9.10.2 2024-03-15 18:16:11 +00:00
renovate
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
waza-ari
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
renovate
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
renovate
273f5ddf59 chore(deps): update dev-dependencies 2024-03-14 07:22:29 +00:00
Frederick [Bot]
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
renovate
17e222edfd chore(deps): update dependency happy-dom to v13.8.2 2024-03-13 07:44:23 +00:00
Frederick [Bot]
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]
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
renovate
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]
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
waza-ari
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
waza-ari
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
Elscrux
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-ari
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
renovate
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
Elscrux
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
renovate
2fa576d9f5 chore(deps): update dependency node to v20.11.1 2024-03-10 12:24:06 +00:00
Frederick [Bot]
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
renovate
b340bb418b chore(deps): update dependency happy-dom to v13.7.1 2024-03-10 11:57:10 +00:00
waza-ari
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 Herrmann
6e52db76dc docs: clarify what to use for authurl 2024-03-10 11:39:23 +00:00
Hangya
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]
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 Ritzer
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
renovate
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
renovate
e8d77e61e4 chore(deps): update dependency @vue/eslint-config-typescript to v13 2024-03-09 08:00:20 +00:00
renovate
7e69c7cbe0 chore(deps): update dev-dependencies 2024-03-09 07:59:59 +00:00
Frederick [Bot]
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
renovate
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
renovate
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
waza-ari
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
627 changed files with 51264 additions and 29000 deletions

View File

@@ -3,6 +3,11 @@ kind: pipeline
type: docker
name: build-and-test
trigger:
event:
exclude:
- cron
workspace:
base: /go
path: src/code.vikunja.io/api
@@ -35,7 +40,6 @@ volumes:
- name: tmp-postgres-migration
temp:
medium: memory
services:
- name: test-mysql-unit
@@ -134,7 +138,7 @@ steps:
event: [ push, tag, pull_request ]
- name: api-lint
image: golangci/golangci-lint:v1.55.2
image: golangci/golangci-lint:v1.61.0
pull: always
environment:
GOPROXY: 'https://goproxy.kolaente.de'
@@ -156,7 +160,7 @@ steps:
- name: test-migration-sqlite
image: vikunja/golang-build:latest
pull: always
depends_on:
depends_on:
- test-migration-prepare
- api-build
environment:
@@ -359,7 +363,7 @@ steps:
- api-build
- name: frontend-dependencies
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -373,7 +377,7 @@ steps:
# - restore-cache
- name: frontend-lint
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -385,7 +389,7 @@ steps:
- frontend-dependencies
- name: frontend-build-prod
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -397,7 +401,7 @@ steps:
- frontend-dependencies
- name: frontend-test-unit
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
commands:
- cd frontend
@@ -408,7 +412,7 @@ steps:
- name: frontend-typecheck
failure: ignore
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -439,7 +443,7 @@ steps:
depends_on:
- frontend-build-prod
- test-api-run
- name: frontend-deploy-preview
image: williamjackson/netlify-cli
pull: always
@@ -456,7 +460,6 @@ steps:
- 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
@@ -495,7 +498,7 @@ steps:
environment:
GOPROXY: 'https://goproxy.kolaente.de'
commands:
- mage do-the-swag
- mage generate:swagger-docs
- name: push
pull: always
@@ -528,6 +531,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
steps:
# Needed to get the versions right as they depend on tags
@@ -537,7 +543,7 @@ steps:
- git fetch --tags
- name: frontend-dependencies
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -549,7 +555,7 @@ steps:
- pnpm install --fetch-timeout 100000
- name: frontend-build
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -572,8 +578,55 @@ steps:
when:
event: [ push, tag, pull_request ]
- name: generate-config-yaml
image: vikunja/golang-build:latest
pull: always
commands:
- ./mage-static generate:config-yaml 1
depends_on: [ mage ]
- name: upload-config-yaml-unstable
image: plugins/s3
pull: always
settings:
bucket: vikunja
access_key:
from_secret: hetzner_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
source: config.yml.sample
target: /vikunja/unstable/
when:
branch:
- main
event:
- push
depends_on: [ generate-config-yaml ]
- name: upload-config-yaml-version
image: plugins/s3
pull: always
settings:
bucket: vikunja
access_key:
from_secret: hetzner_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
source: config.yml.sample
target: /vikunja/${DRONE_TAG##v}/
when:
event:
- tag
depends_on: [ generate-config-yaml ]
- name: before-static-build
image: techknowlogick/xgo:latest
image: ghcr.io/techknowlogick/xgo:go-1.23.x
pull: always
commands:
- export PATH=$PATH:$GOPATH/bin
@@ -582,7 +635,7 @@ steps:
depends_on: [ fetch-tags, mage ]
- name: static-build-windows
image: techknowlogick/xgo:latest
image: ghcr.io/techknowlogick/xgo:go-1.23.x
pull: always
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
@@ -598,7 +651,7 @@ steps:
- frontend-build
- name: static-build-linux
image: techknowlogick/xgo:latest
image: ghcr.io/techknowlogick/xgo:go-1.23.x
pull: always
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
@@ -614,7 +667,7 @@ steps:
- frontend-build
- name: static-build-darwin
image: techknowlogick/xgo:latest
image: ghcr.io/techknowlogick/xgo:go-1.23.x
pull: always
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
@@ -640,12 +693,13 @@ steps:
- ./mage-static release:compress
- name: after-build-static
image: techknowlogick/xgo:latest
image: ghcr.io/techknowlogick/xgo:go-1.23.x
pull: always
depends_on:
- after-build-compress
commands:
- go install github.com/magefile/mage
- ./mage-static generate:config-yaml 1
- ./mage-static release:copy
- ./mage-static release:check
- ./mage-static release:os-package
@@ -669,13 +723,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
strip_prefix: dist/zip/
source: dist/zip/*
@@ -691,13 +745,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
strip_prefix: dist/zip/
source: dist/zip/*
@@ -709,7 +763,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.41.0
pull: always
commands:
- apk add git go
@@ -725,7 +779,7 @@ steps:
depends_on: [ after-build-compress ]
- name: build-os-packages-version
image: goreleaser/nfpm:v2.35.3
image: goreleaser/nfpm:v2.41.0
pull: always
commands:
- apk add git go
@@ -743,13 +797,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
strip_prefix: dist/os-packages/
source: dist/os-packages/*
@@ -765,13 +819,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
strip_prefix: dist/os-packages/
source: dist/os-packages/*
@@ -790,7 +844,7 @@ steps:
base_url: https://kolaente.dev
files: dist/zip/*
prerelease: true
title: ${DRONE_TAG##v}
title: ${DRONE_TAG##v}
when:
event:
- tag
@@ -808,6 +862,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
steps:
- name: fetch-tags
@@ -827,7 +884,6 @@ steps:
repo: vikunja/vikunja
tags: unstable
platforms:
- linux/386
- linux/amd64
- linux/arm/v6
- linux/arm/v7
@@ -859,7 +915,6 @@ steps:
from_secret: docker_password
repo: vikunja/vikunja
platforms:
- linux/386
- linux/amd64
- linux/arm/v6
- linux/arm/v7
@@ -889,9 +944,9 @@ steps:
image: docker:git
commands:
- git fetch --tags
- name: build
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -921,13 +976,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
source: frontend/vikunja-frontend-unstable.zip
target: /
@@ -950,9 +1005,9 @@ steps:
image: docker:git
commands:
- git fetch --tags
- name: build
image: node:20.11.0-alpine
image: node:22.11.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@@ -980,13 +1035,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
source: frontend/vikunja-frontend-${DRONE_TAG##v}.zip
target: /
@@ -1073,33 +1128,33 @@ steps:
image: docker:git
commands:
- git fetch --tags
#
# - name: restore-cache
# image: meltwater/drone-cache:dev
# pull: true
# environment:
# AWS_ACCESS_KEY_ID:
# from_secret: cache_aws_access_key_id
# AWS_SECRET_ACCESS_KEY:
# from_secret: cache_aws_secret_access_key
# settings:
# restore: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
#
# - name: restore-cache
# image: meltwater/drone-cache:dev
# pull: true
# environment:
# AWS_ACCESS_KEY_ID:
# from_secret: cache_aws_access_key_id
# AWS_SECRET_ACCESS_KEY:
# from_secret: cache_aws_secret_access_key
# settings:
# restore: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
- name: build
image: electronuserland/builder:wine-mono
image: electronuserland/builder:wine
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
PNPM_CACHE_FOLDER: .cache/pnpm
depends_on:
- fetch-tags
# - restore-cache
# - restore-cache
commands:
- cd desktop
- export VERSION=${DRONE_TAG##v}
@@ -1109,8 +1164,9 @@ steps:
- unzip vikunja-frontend-$$VERSION.zip -d frontend
- sed -i 's/\\/api\\/v1//g' frontend/index.html
- ./bumpp.sh
- yarn install
- yarn dist --linux --windows
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm install --fetch-timeout 100000
- pnpm dist --linux zip
# - name: rebuild-cache
# image: meltwater/drone-cache:dev
@@ -1123,8 +1179,8 @@ steps:
# settings:
# rebuild: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
@@ -1145,39 +1201,42 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
steps:
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
# - name: restore-cache
# image: meltwater/drone-cache:dev
# pull: true
# environment:
# AWS_ACCESS_KEY_ID:
# from_secret: cache_aws_access_key_id
# AWS_SECRET_ACCESS_KEY:
# from_secret: cache_aws_secret_access_key
# settings:
# restore: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
# - name: restore-cache
# image: meltwater/drone-cache:dev
# pull: true
# environment:
# AWS_ACCESS_KEY_ID:
# from_secret: cache_aws_access_key_id
# AWS_SECRET_ACCESS_KEY:
# from_secret: cache_aws_secret_access_key
# settings:
# restore: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
- name: build
image: electronuserland/builder:wine-mono
image: electronuserland/builder:wine
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
PNPM_CACHE_FOLDER: .cache/pnpm
depends_on:
- fetch-tags
# - restore-cache
# - restore-cache
commands:
- cd desktop
- export VERSION=${DRONE_TAG##v}
@@ -1187,30 +1246,30 @@ steps:
- unzip vikunja-frontend-$$VERSION.zip -d frontend
- sed -i 's/\\/api\\/v1//g' frontend/index.html
- ./bumpp.sh
- yarn install
- cat package.json
- yarn dist --linux --windows
# - name: rebuild-cache
# image: meltwater/drone-cache:dev
# pull: true
# environment:
# AWS_ACCESS_KEY_ID:
# from_secret: cache_aws_access_key_id
# AWS_SECRET_ACCESS_KEY:
# from_secret: cache_aws_secret_access_key
# settings:
# rebuild: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
# depends_on:
# - build
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm install --fetch-timeout 100000
- pnpm dist --linux --windows
# - name: rebuild-cache
# image: meltwater/drone-cache:dev
# pull: true
# environment:
# AWS_ACCESS_KEY_ID:
# from_secret: cache_aws_access_key_id
# AWS_SECRET_ACCESS_KEY:
# from_secret: cache_aws_secret_access_key
# settings:
# rebuild: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
# depends_on:
# - build
- name: rename-unstable
image: bash
pull: true
@@ -1228,13 +1287,13 @@ steps:
image: plugins/s3
pull: true
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
strip_prefix: desktop/dist/
source: desktop/dist/Vikunja-Desktop*
@@ -1250,13 +1309,13 @@ steps:
image: plugins/s3
pull: true
settings:
bucket: vikunja-releases
bucket: vikunja
access_key:
from_secret: aws_access_key_id
from_secret: hetzner_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
path_style: true
strip_prefix: desktop/dist/
source: desktop/dist/*
@@ -1285,9 +1344,9 @@ steps:
# - name: build
# environment:
# ACCESS_KEY:
# from_secret: aws_access_key_id
# from_secret: hetzner_access_key_id
# SECRET_KEY:
# from_secret: aws_secret_access_key
# from_secret: hetzner_secret_access_key
# commands:
# - git fetch --tags
# - export VERSION=${DRONE_TAG##v}
@@ -1300,57 +1359,10 @@ steps:
# - sed -i '' "s/\$${version}/$$VERSION/g" package.json
# - yarn install
# - yarn dist --mac
# - mc config host add scw-fr-par https://s3.fr-par.scw.cloud $ACCESS_KEY $SECRET_KEY --api S3v4
# - mc cp ./dist/*.dmg scw-fr-par/vikunja-releases/desktop/$VERSION/
# - mc cp ./dist/*.dmg.blockmap scw-fr-par/vikunja-releases/desktop/$VERSION/
# - mc config host add scw-fsn1 https://fsn1.your-objectstorage.com $ACCESS_KEY $SECRET_KEY --api S3v4
# - mc cp ./dist/*.dmg scw-fsn1/vikunja/desktop/$VERSION/
# - mc cp ./dist/*.dmg.blockmap scw-fsn1/vikunja/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
@@ -1360,11 +1372,13 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
event:
exclude:
- cron
depends_on:
- build-and-test
- release
- deploy-docs
- docker-release
- desktop-release
@@ -1384,6 +1398,6 @@ steps:
- failure
---
kind: signature
hmac: 008b86263a8d03806da907c128a837a380901f1a2190a658c22d4e06cadc1b64
hmac: 7fc1cb2b0cfdc84d7eda25ce75dd56446fc01060c03af89c91043f095e92a2b3
...

3
.envrc Normal file
View File

@@ -0,0 +1,3 @@
source_url "https://raw.githubusercontent.com/cachix/devenv/95f329d49a8a5289d31e0982652f7058a189bfca/direnvrc" "sha256-d+8cBpDfDBj41inrADaJt+bDWhOktwslgoP5YiGJ1v0="
use devenv

11
.gitignore vendored
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

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

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"
]
}

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,

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,11 @@
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM node:20.11.0-alpine AS frontendbuilder
FROM --platform=$BUILDPLATFORM node:22.11.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/ ./
@@ -12,7 +13,7 @@ RUN corepack enable && \
pnpm install && \
pnpm run build
FROM --platform=$BUILDPLATFORM techknowlogick/xgo:go-1.21.x AS apibuilder
FROM --platform=$BUILDPLATFORM ghcr.io/techknowlogick/xgo:go-1.23.x AS apibuilder
RUN go install github.com/magefile/mage@latest && \
mv /go/bin/mage /usr/local/go/bin
@@ -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}"
@@ -34,7 +35,14 @@ RUN export PATH=$PATH:$GOPATH/bin && \
# The actual image
FROM scratch
LABEL maintainer="maintainers@vikunja.io"
LABEL org.opencontainers.image.authors='maintainers@vikunja.io'
LABEL org.opencontainers.image.url='https://vikunja.io'
LABEL org.opencontainers.image.documentation='https://vikunja.io/docs'
LABEL org.opencontainers.image.source='https://code.vikunja.io/vikunja'
LABEL org.opencontainers.image.licenses='AGPLv3'
LABEL org.opencontainers.image.title='Vikunja'
WORKDIR /app/vikunja
ENTRYPOINT [ "/app/vikunja/vikunja" ]
EXPOSE 3456

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)
@@ -29,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

View File

@@ -17,6 +17,7 @@ body = """
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{%- endfor -%}
{% raw %}\n{% endraw %}\
{%- for commit in commits %}
{%- if commit.scope -%}
{% else -%}
@@ -56,4 +57,3 @@ commit_parsers = [
{ body = ".*security", group = "Security"},
{ message = ".*", group = "Other", default_scope = "other"}, # Everything that's not a conventional commit goes into the "Other" category
]

839
config-raw.json Normal file
View File

@@ -0,0 +1,839 @@
{
"children": [
{
"key": "service",
"children": [
{
"key": "JWTSecret",
"default_value": "\u003cjwt-secret\u003e",
"comment": "This token is used to verify issued JWT tokens.\nDefault is a random token which will be generated at each startup of Vikunja.\n(This means all already issued tokens will be invalid once you restart Vikunja)"
},
{
"key": "jwtttl",
"default_value": "259200",
"comment": "The duration of the issued JWT tokens in seconds.\nThe default is 259200 seconds (3 Days)."
},
{
"key": "jwtttllong",
"default_value": "2592000",
"comment": "The duration of the \"remember me\" time in seconds. When the login request is made with\nthe long param set, the token returned will be valid for this period.\nThe default is 2592000 seconds (30 Days)."
},
{
"key": "interface",
"default_value": ":3456",
"comment": "The interface on which to run the webserver"
},
{
"key": "unixsocket",
"default_value": "",
"comment": "Path to Unix socket. If set, it will be created and used instead of tcp"
},
{
"key": "unixsocketmode",
"default_value": "",
"comment": "Permission bits for the Unix socket. Note that octal values must be prefixed by \"0o\", e.g. 0o660"
},
{
"key": "publicurl",
"default_value": "",
"comment": "The public facing URL where your users can reach Vikunja. Used in emails and for the communication between api and frontend."
},
{
"key": "rootpath",
"default_value": "\u003crootpath\u003e",
"comment": "The base path on the file system where the binary and assets are.\nVikunja will also look in this path for a config file, so you could provide only this variable to point to a folder\nwith a config file which will then be used."
},
{
"key": "maxitemsperpage",
"default_value": "50",
"comment": "The max number of items which can be returned per page"
},
{
"key": "enablecaldav",
"default_value": "true",
"comment": "Enable the caldav endpoint, see the docs for more details"
},
{
"key": "motd",
"default_value": "",
"comment": "Set the motd message, available from the /info endpoint"
},
{
"key": "enablelinksharing",
"default_value": "true",
"comment": "Enable sharing of project via a link"
},
{
"key": "enableregistration",
"default_value": "true",
"comment": "Whether to let new users registering themselves or not"
},
{
"key": "enabletaskattachments",
"default_value": "true",
"comment": "Whether to enable task attachments or not"
},
{
"key": "timezone",
"default_value": "GMT",
"comment": "The time zone all timestamps are in. Please note that time zones have to use [the official tz database names](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). UTC or GMT offsets won't work."
},
{
"key": "enabletaskcomments",
"default_value": "true",
"comment": "Whether task comments should be enabled or not"
},
{
"key": "enabletotp",
"default_value": "true",
"comment": "Whether totp is enabled. In most cases you want to leave that enabled."
},
{
"key": "testingtoken",
"default_value": "",
"comment": "If not empty, this will enable `/test/{table}` endpoints which allow to put any content in the database.\nUsed to reset the db before frontend tests. Because this is quite a dangerous feature allowing for lots of harm,\neach request made to this endpoint needs to provide an `Authorization: \u003ctoken\u003e` header with the token from below. \u003cbr/\u003e\n**You should never use this unless you know exactly what you're doing**"
},
{
"key": "enableemailreminders",
"default_value": "true",
"comment": "If enabled, Vikunja will send an email to everyone who is either assigned to a task or created it when a task reminder\nis due."
},
{
"key": "enableuserdeletion",
"default_value": "true",
"comment": "If true, will allow users to request the complete deletion of their account. When using external authentication methods\nit may be required to coordinate with them in order to delete the account. This setting will not affect the cli commands\nfor user deletion."
},
{
"key": "maxavatarsize",
"default_value": "1024",
"comment": "The maximum size clients will be able to request for user avatars.\nIf clients request a size bigger than this, it will be changed on the fly."
},
{
"key": "demomode",
"default_value": "false",
"comment": "If set to true, the frontend will show a big red warning not to use this instance for real data as it will be cleared out.\nYou probably don't need to set this value, it was created specifically for usage on [try](https://try.vikunja.io)."
},
{
"key": "allowiconchanges",
"default_value": "true",
"comment": "Allow changing the logo and other icons based on various occasions throughout the year."
},
{
"key": "customlogourl",
"default_value": "",
"comment": "Allow using a custom logo via external URL."
},
{
"key": "enablepublicteams",
"default_value": "false",
"comment": "Enables the public team feature. If enabled, it is possible to configure teams to be public, which makes them\ndiscoverable when sharing a project, therefore not only showing teams the user is member of."
},
{
"key": "bcryptrounds",
"default_value": "11",
"comment": "The number of bcrypt rounds to use during registration. Each increment of this number doubles the computational cost. You probably don't need to change this value."
},
{
"key": "enableopenidteamusersearch",
"default_value": "false",
"comment": "If enabled, users will only find other users who are part of an existing team when they are searching for a user by their partial name. The other existing team may be created from openid. It is still possible to add users to teams with their exact email address even when this is enabled."
}
]
},
{
"key": "sentry",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "If set to true, enables anonymous error tracking of api errors via Sentry. This allows us to gather more\ninformation about errors in order to debug and fix it."
},
{
"key": "dsn",
"default_value": "https://440eedc957d545a795c17bbaf477497c@o1047380.ingest.sentry.io/4504254983634944",
"comment": "Configure the Sentry dsn used for api error tracking. Only used when Sentry is enabled for the api."
},
{
"key": "frontendenabled",
"default_value": "false",
"comment": "If set to true, enables anonymous error tracking of frontend errors via Sentry. This allows us to gather more\ninformation about errors in order to debug and fix it."
},
{
"key": "frontenddsn",
"default_value": "https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480",
"comment": "Configure the Sentry dsn used for frontend error tracking. Only used when Sentry is enabled for the frontend."
}
]
},
{
"key": "database",
"children": [
{
"key": "type",
"default_value": "sqlite",
"comment": "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."
},
{
"key": "user",
"default_value": "vikunja",
"comment": "Database user which is used to connect to the database."
},
{
"key": "password",
"default_value": "",
"comment": "Database password"
},
{
"key": "host",
"default_value": "localhost",
"comment": "Database host"
},
{
"key": "database",
"default_value": "vikunja",
"comment": "Database to use"
},
{
"key": "path",
"default_value": "./vikunja.db",
"comment": "When using sqlite, this is the path where to store the data"
},
{
"key": "maxopenconnections",
"default_value": "100",
"comment": "Sets the max open connections to the database. Only used when using mysql and postgres."
},
{
"key": "maxidleconnections",
"default_value": "50",
"comment": "Sets the maximum number of idle connections to the db."
},
{
"key": "maxconnectionlifetime",
"default_value": "10000",
"comment": "The maximum lifetime of a single db connection in milliseconds."
},
{
"key": "sslmode",
"default_value": "disable",
"comment": "Secure connection mode. Only used with postgres.\n(see https://pkg.go.dev/github.com/lib/pq?tab=doc#hdr-Connection_String_Parameters)"
},
{
"key": "sslcert",
"default_value": "",
"comment": "The path to the client cert. Only used with postgres."
},
{
"key": "sslkey",
"default_value": "",
"comment": "The path to the client key. Only used with postgres."
},
{
"key": "sslrootcert",
"default_value": "",
"comment": "The path to the ca cert. Only used with postgres."
},
{
"key": "tls",
"default_value": "false",
"comment": "Enable SSL/TLS for mysql connections. Options: false, true, skip-verify, preferred"
}
]
},
{
"key": "typesense",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "Whether to enable the Typesense integration. If true, all tasks will be synced to the configured Typesense\ninstance and all search and filtering will run through Typesense instead of only through the database.\nTypesense allows fast fulltext search including fuzzy matching support. It may return different results than\nwhat you'd get with a database-only search."
},
{
"key": "url",
"default_value": "",
"comment": "The url to the Typesense instance you want to use. Can be hosted locally or in Typesense Cloud as long\nas Vikunja is able to reach it."
},
{
"key": "apikey",
"default_value": "",
"comment": "The Typesense API key you want to use."
}
]
},
{
"key": "redis",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "Whether to enable redis or not"
},
{
"key": "host",
"default_value": "localhost:6379",
"comment": "The host of the redis server including its port."
},
{
"key": "password",
"default_value": "",
"comment": "The password used to authenticate against the redis server"
},
{
"key": "db",
"default_value": "0",
"comment": "0 means default database"
}
]
},
{
"key": "cors",
"children": [
{
"key": "enable",
"default_value": "false",
"comment": "Whether to enable or disable cors headers.\nNote: If you want to put the frontend and the api on separate domains or ports, you will need to enable this.\nOtherwise the frontend won't be able to make requests to the api through the browser."
},
{
"key": "origins",
"comment": "A list of origins which may access the api. These need to include the protocol (`http://` or `https://`) and port, if any.",
"children": [
{
"default_value": "*"
}
]
},
{
"key": "maxage",
"default_value": "0",
"comment": "How long (in seconds) the results of a preflight request can be cached."
}
]
},
{
"key": "mailer",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "Whether to enable the mailer or not. If it is disabled, all users are enabled right away and password reset is not possible."
},
{
"key": "host",
"default_value": "",
"comment": "SMTP Host"
},
{
"key": "port",
"default_value": "587",
"comment": "SMTP Host port.\n**NOTE:** If you're unable to send mail and the only error you see in the logs is an `EOF`, try setting the port to `25`."
},
{
"key": "authtype",
"default_value": "plain",
"comment": "SMTP Auth Type. Can be either `plain`, `login` or `cram-md5`."
},
{
"key": "username",
"default_value": "user",
"comment": "SMTP username"
},
{
"key": "password",
"default_value": "",
"comment": "SMTP password"
},
{
"key": "skiptlsverify",
"default_value": "false",
"comment": "Whether to skip verification of the tls certificate on the server"
},
{
"key": "fromemail",
"default_value": "mail@vikunja",
"comment": "The default from address when sending emails"
},
{
"key": "queuelength",
"default_value": "100",
"comment": "The length of the mail queue."
},
{
"key": "queuetimeout",
"default_value": "30",
"comment": "The timeout in seconds after which the current open connection to the mailserver will be closed."
},
{
"key": "forcessl",
"default_value": "false",
"comment": "By default, Vikunja will try to connect with starttls, use this option to force it to use ssl."
}
]
},
{
"key": "log",
"children": [
{
"key": "path",
"default_value": "\u003crootpath\u003elogs",
"comment": "A folder where all the logfiles should go."
},
{
"key": "enabled",
"default_value": "true",
"comment": "Whether to show any logging at all or none"
},
{
"key": "standard",
"default_value": "stdout",
"comment": "Where the normal log should go. Possible values are stdout, stderr, file or off to disable standard logging."
},
{
"key": "level",
"default_value": "INFO",
"comment": "Change the log level. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG."
},
{
"key": "database",
"default_value": "off",
"comment": "Whether or not to log database queries. Useful for debugging. Possible values are stdout, stderr, file or off to disable database logging."
},
{
"key": "databaselevel",
"default_value": "WARNING",
"comment": "The log level for database log messages. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG."
},
{
"key": "http",
"default_value": "stdout",
"comment": "Whether to log http requests or not. Possible values are stdout, stderr, file or off to disable http logging."
},
{
"key": "echo",
"default_value": "off",
"comment": "Echo has its own logging which usually is unnecessary, which is why it is disabled by default. Possible values are stdout, stderr, file or off to disable standard logging."
},
{
"key": "events",
"default_value": "off",
"comment": "Whether or not to log events. Useful for debugging. Possible values are stdout, stderr, file or off to disable events logging."
},
{
"key": "eventslevel",
"default_value": "info",
"comment": "The log level for event log messages. Possible values (case-insensitive) are ERROR, INFO, DEBUG."
},
{
"key": "mail",
"default_value": "off",
"comment": "Whether or not to log mail log messages. This will not log mail contents. Possible values are stdout, stderr, file or off to disable mail-related logging."
},
{
"key": "maillevel",
"default_value": "info",
"comment": "The log level for mail log messages. Possible values (case-insensitive) are ERROR, WARNING, INFO, DEBUG."
}
]
},
{
"key": "ratelimit",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "whether or not to enable the rate limit"
},
{
"key": "kind",
"default_value": "user",
"comment": "The kind on which rates are based. Can be either \"user\" for a rate limit per user or \"ip\" for an ip-based rate limit."
},
{
"key": "period",
"default_value": "60",
"comment": "The time period in seconds for the limit"
},
{
"key": "limit",
"default_value": "100",
"comment": "The max number of requests a user is allowed to do in the configured time period"
},
{
"key": "store",
"default_value": "keyvalue",
"comment": "The store where the limit counter for each user is stored.\nPossible values are \"keyvalue\", \"memory\" or \"redis\".\nWhen choosing \"keyvalue\" this setting follows the one configured in the \"keyvalue\" section."
},
{
"key": "noauthlimit",
"default_value": "10",
"comment": "The number of requests a user can make from the same IP to all unauthenticated routes (login, register,\npassword confirmation, email verification, password reset request) per minute. This limit cannot be disabled.\nYou should only change this if you know what you're doing."
}
]
},
{
"key": "files",
"children": [
{
"key": "basepath",
"default_value": "./files",
"comment": "The path where files are stored"
},
{
"key": "maxsize",
"default_value": "20MB",
"comment": "The maximum size of a file, as a human-readable string.\nWarning: The max size is limited 2^64-1 bytes due to the underlying datatype"
}
]
},
{
"key": "migration",
"comment": "To use any of the available migrators, you usually need to configure credentials for the appropriate service and enable it. Find instructions below on how to do this for the provided migrators.",
"children": [
{
"key": "todoist",
"children": [
{
"key": "enable",
"default_value": "false",
"comment": "Wheter to enable the Todoist migrator."
},
{
"key": "clientid",
"default_value": "",
"comment": "The client id, required for making requests to the Todoist api\nYou need to register your Vikunja instance at https://developer.todoist.com/appconsole.html to get this."
},
{
"key": "clientsecret",
"default_value": "",
"comment": "The client secret, also required for making requests to the Todoist api. Obtain it at https://developer.todoist.com/appconsole.html after registering your Vikunja instance."
},
{
"key": "redirecturl",
"default_value": "\u003cservice.publicurl\u003e/migrate/todoist",
"comment": "The url where clients are redirected after they authorized Vikunja to access their Todoist items.\nIn Todoist, this is called `OAuth redirect URL` and it needs to match the url you entered when registering\nyour Vikunja instance at the Todoist developer console.\nWhen using the official Vikunja frontend, set this to `\u003cservice.publicurl\u003e/migrate/todoist` (the default value).\nOtherwise, set this to an url which then makes a request to /api/v1/migration/todoist/migrate\nwith the code obtained from the Todoist api."
}
]
},
{
"key": "trello",
"children": [
{
"key": "enable",
"default_value": "false",
"comment": "Whether to enable the Trello migrator."
},
{
"key": "key",
"default_value": "",
"comment": "The client id, required for making requests to the trello api.\nYou need to register your Vikunja instance at https://trello.com/app-key (log in before you visit that link) to get one. Copy the `Personal Key` and set it as the client id. Add your Vikunja domain to the Allowed Origins list."
},
{
"key": "redirecturl",
"default_value": "\u003cfrontend url\u003e/migrate/trello",
"comment": "The url where clients are redirected after they authorized Vikunja to access their trello cards.\nThis needs to match the url you entered when registering your Vikunja instance at trello.\nWhen using the official Vikunja frontend, set this to `\u003cservice.publicurl\u003e/migrate/trello` (the default value).\nOtherwise, set this to an url which then makes a request to /api/v1/migration/trello/migrate\nwith the code obtained from the Trello api."
}
]
},
{
"key": "microsofttodo",
"children": [
{
"key": "enable",
"default_value": "false",
"comment": "Wheter to enable the Microsoft Todo migrator."
},
{
"key": "clientid",
"default_value": "",
"comment": "The client id, required for making requests to the Microsoft graph api.\nSee https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#register-an-application\nfor information about how to register your Vikunja instance."
},
{
"key": "clientsecret",
"default_value": "",
"comment": "The client secret, also required for making requests to the Microsoft graph api"
},
{
"key": "redirecturl",
"default_value": "\u003cfrontend url\u003e/migrate/microsoft-todo",
"comment": "The url where clients are redirected after they authorized Vikunja to access their Microsoft todo tasks.\nThis needs to match the url you entered when registering your Vikunja instance at Microsoft.\nWhen using the official Vikunja frontend, set this to `\u003cservice.publicurl\u003e/migrate/microsoft-todo` (the default value).\nOtherwise, set this to an url which then makes a request to /api/v1/migration/microsoft-todo/migrate\nwith the code obtained from the Microsoft Todo api."
}
]
}
]
},
{
"key": "avatar",
"children": [
{
"key": "gravatarexpiration",
"default_value": "3600",
"comment": "When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires"
}
]
},
{
"key": "backgrounds",
"children": [
{
"key": "enabled",
"default_value": "true",
"comment": "Whether to enable backgrounds for projects at all."
},
{
"key": "providers",
"children": [
{
"key": "upload",
"children": [
{
"key": "enabled",
"default_value": "true",
"comment": "Whether to enable uploaded project backgrounds"
}
]
},
{
"key": "unsplash",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "Whether to enable setting backgrounds from unsplash as project backgrounds"
},
{
"key": "accesstoken",
"default_value": "",
"comment": "You need to create an application for your installation at https://unsplash.com/oauth/applications/new\nand set the access token below."
},
{
"key": "applicationid",
"default_value": "",
"comment": "The unsplash application id is only used for pingback and required as per their api guidelines.\nYou can find the Application ID in the dashboard for your API application. It should be a numeric ID.\nIt will only show in the UI if your application has been approved for Enterprise usage, therefore if\nyoure in Demo mode, you can also find the ID in the URL at the end: https://unsplash.com/oauth/applications/:application_id"
}
]
}
]
}
]
},
{
"key": "legal",
"comment": "Legal urls\nWill be shown in the frontend if configured here",
"children": [
{
"key": "imprinturl",
"default_value": ""
},
{
"key": "privacyurl",
"default_value": ""
}
]
},
{
"key": "keyvalue",
"comment": "Key Value Storage settings\nThe Key Value Storage is used for different kinds of things like metrics and a few cache systems.",
"children": [
{
"key": "type",
"default_value": "memory",
"comment": "The type of the storage backend. Can be either \"memory\" or \"redis\". If \"redis\" is chosen it needs to be configured separately."
}
]
},
{
"key": "auth",
"children": [
{
"key": "local",
"comment": "Local authentication will let users log in and register (if enabled) through the db.\nThis is the default auth mechanism and does not require any additional configuration.",
"children": [
{
"key": "enabled",
"default_value": "true",
"comment": "Enable or disable local authentication"
}
]
},
{
"key": "openid",
"comment": "OpenID configuration will allow users to authenticate through a third-party OpenID Connect compatible provider.\u003cbr/\u003e\nThe provider needs to support the `openid`, `profile` and `email` scopes.\u003cbr/\u003e\n**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.\nIf the email is not public in those cases, authenticating will fail.\u003cbr/\u003e\n**Note 2:** The frontend expects the third party to redirect the user \u003cfrontend-url\u003e/auth/openid/\u003cauth key\u003e 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.\nThe frontend will automatically provide the API with the redirect url, composed from the current url where it's hosted.\nIf you want to use the desktop client with OpenID, make sure to allow redirects to `127.0.0.1`.",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "Enable or disable OpenID Connect authentication"
},
{
"key": "providers",
"comment": "A list of enabled providers. You can freely choose the `<provider key>`. Note that you must add at least one key to a config file if you want to read values from an environment variable as the provider won't be known to Vikunja otherwise.",
"children": [
{
"key": "<provider key>",
"children": [
{
"key": "name",
"default_value": "",
"comment": "The name of the provider as it will appear in the frontend."
},
{
"key": "authurl",
"default_value": "",
"comment": "The auth url to send users to if they want to authenticate using OpenID Connect."
},
{
"key": "logouturl",
"default_value": "",
"comment": "The oidc logouturl that users will be redirected to on logout.\nLeave empty or delete key, if you do not want to be redirected."
},
{
"key": "clientid",
"default_value": "",
"comment": "The client ID used to authenticate Vikunja at the OpenID Connect provider."
},
{
"key": "clientsecret",
"default_value": "",
"comment": "The client secret used to authenticate Vikunja at the OpenID Connect provider."
},
{
"key": "scope",
"default_value": "openid email profile",
"comment": "The scope necessary to use oidc.\nIf 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/).\ne.g. scope: openid email profile vikunja_scope"
}
]
}
]
}
]
}
]
},
{
"key": "metrics",
"comment": "Prometheus metrics endpoint",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "If set to true, enables a /metrics endpoint for prometheus to collect metrics about Vikunja. You can query it from `/api/v1/metrics`."
},
{
"key": "username",
"default_value": "",
"comment": "If set to a non-empty value the /metrics endpoint will require this as a username via basic auth in combination with the password below."
},
{
"key": "password",
"default_value": "",
"comment": "If set to a non-empty value the /metrics endpoint will require this as a password via basic auth in combination with the username below."
}
]
},
{
"key": "defaultsettings",
"comment": "Provide default settings for new users. When a new user is created, these settings will automatically be set for the user. If you change them in the config file afterwards they will not be changed back for existing users.",
"children": [
{
"key": "avatar_provider",
"default_value": "initials",
"comment": "The avatar source for the user. Can be `gravatar`, `initials`, `upload` or `marble`. If you set this to `upload` you'll also need to specify `defaultsettings.avatar_file_id`."
},
{
"key": "avatar_file_id",
"default_value": "0",
"comment": "The id of the file used as avatar."
},
{
"key": "email_reminders_enabled",
"default_value": "false",
"comment": "If set to true users will get task reminders via email."
},
{
"key": "discoverable_by_name",
"default_value": "false",
"comment": "If set to true will allow other users to find this user when searching for parts of their name."
},
{
"key": "discoverable_by_email",
"default_value": "false",
"comment": "If set to true will allow other users to find this user when searching for their exact email."
},
{
"key": "overdue_tasks_reminders_enabled",
"default_value": "true",
"comment": "If set to true will send an email every day with all overdue tasks at a configured time."
},
{
"key": "overdue_tasks_reminders_time",
"default_value": "9:00",
"comment": "When to send the overdue task reminder email."
},
{
"key": "default_project_id",
"default_value": "0",
"comment": "The id of the default project. Make sure users actually have access to this project when setting this value."
},
{
"key": "week_start",
"default_value": "0",
"comment": "Start of the week for the user. `0` is sunday, `1` is monday and so on."
},
{
"key": "language",
"default_value": "\u003cunset\u003e",
"comment": "The language of the user interface. Must be an ISO 639-1 language code followed by an ISO 3166-1 alpha-2 country code. Check https://kolaente.dev/vikunja/vikunja/frontend/src/branch/main/src/i18n/lang for a list of possible languages. Will default to the browser language the user uses when signing up."
},
{
"key": "timezone",
"default_value": "\u003ctime zone set at service.timezone\u003e",
"comment": "The time zone of each individual user. This will affect when users get reminders and overdue task emails."
}
]
},
{
"key": "webhooks",
"children": [
{
"key": "enabled",
"default_value": "true",
"comment": "Whether to enable support for webhooks"
},
{
"key": "timeoutseconds",
"default_value": "30",
"comment": "The timeout in seconds until a webhook request fails when no response has been received."
},
{
"key": "proxyurl",
"default_value": "",
"comment": "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)."
},
{
"key": "proxypassword",
"default_value": "",
"comment": "The proxy password to use when authenticating against the proxy."
}
]
},
{
"key": "autotls",
"children": [
{
"key": "enabled",
"default_value": "false",
"comment": "If set to true, Vikunja will automatically request a TLS certificate from Let's Encrypt and use it to serve Vikunja over TLS. By enabling this option, you agree to Let's Encrypt's TOS.\nYou must configure a `service.publicurl` with a valid TLD where Vikunja is reachable to make this work. Furthermore, it is reccomened to set `service.interface` to `:443` if you're using this."
},
{
"key": "email",
"default_value": "",
"comment": "A valid email address which will be used to register certificates with Let's Encrypt. You must provide this value in order to use autotls."
},
{
"key": "renewbefore",
"default_value": "30d",
"comment": "A duration when certificates should be renewed before they expire. Valid time units are `ns`, `us` (or `µs`), `ms`, `s`, `m`, `h`."
}
]
}
]
}

View File

@@ -1,373 +0,0 @@
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)
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 long param set, the token returned will be valid for this period.
# The default is 2592000 seconds (30 Days).
jwtttllong: 2592000
# The interface on which to run the webserver
interface: ":3456"
# Path to Unix socket. If set, it will be created and used instead of tcp
unixsocket:
# Permission bits for the Unix socket. Note that octal values must be prefixed by "0o", e.g. 0o660
unixsocketmode:
# The public facing URL where your users can reach Vikunja. Used in emails and for the communication between api and frontend.
publicurl: ""
# The base path on the file system where the binary and assets are.
# Vikunja will also look in this path for a config file, so you could provide only this variable to point to a folder
# with a config file which will then be used.
rootpath: <rootpath>
# The max number of items which can be returned per page
maxitemsperpage: 50
# Enable the caldav endpoint, see the docs for more details
enablecaldav: true
# Set the motd message, available from the /info endpoint
motd: ""
# Enable sharing of project via a link
enablelinksharing: true
# Whether to let new users registering themselves or not
enableregistration: true
# Whether to enable task attachments or not
enabletaskattachments: true
# The time zone all timestamps are in. Please note that time zones have to use [the official tz database names](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). UTC or GMT offsets won't work.
timezone: GMT
# Whether task comments should be enabled or not
enabletaskcomments: true
# Whether totp is enabled. In most cases you want to leave that enabled.
enabletotp: true
# If not empty, this will enable `/test/{table}` endpoints which allow to put any content in the database.
# Used to reset the db before frontend tests. Because this is quite a dangerous feature allowing for lots of harm,
# 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
# is due.
enableemailreminders: true
# 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
# The maximum size clients will be able to request for user avatars.
# If clients request a size bigger than this, it will be changed on the fly.
maxavatarsize: 1024
# If set to true, the frontend will show a big red warning not to use this instance for real data as it will be cleared out.
# You probably don't need to set this value, it was created specifically for usage on [try](https://try.vikunja.io).
demomode: false
# Allow changing the logo and other icons based on various occasions throughout the year.
allowiconchanges: true
# Allow using a custom logo via external URL.
customlogourl: ''
sentry:
# If set to true, enables anonymous error tracking of api errors via Sentry. This allows us to gather more
# information about errors in order to debug and fix it.
enabled: false
# Configure the Sentry dsn used for api error tracking. Only used when Sentry is enabled for the api.
dsn: "https://440eedc957d545a795c17bbaf477497c@o1047380.ingest.sentry.io/4504254983634944"
# If set to true, enables anonymous error tracking of frontend errors via Sentry. This allows us to gather more
# information about errors in order to debug and fix it.
frontendenabled: false
# Configure the Sentry dsn used for frontend error tracking. Only used when Sentry is enabled for the frontend.
frontenddsn: "https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480"
database:
# 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"
# Database password
password: ""
# Database host
host: "localhost"
# Database to use
database: "vikunja"
# When using sqlite, this is the path where to store the data
path: "./vikunja.db"
# Sets the max open connections to the database. Only used when using mysql and postgres.
maxopenconnections: 100
# Sets the maximum number of idle connections to the db.
maxidleconnections: 50
# The maximum lifetime of a single db connection in milliseconds.
maxconnectionlifetime: 10000
# Secure connection mode. Only used with postgres.
# (see https://pkg.go.dev/github.com/lib/pq?tab=doc#hdr-Connection_String_Parameters)
sslmode: disable
# The path to the client cert. Only used with postgres.
sslcert: ""
# The path to the client key. Only used with postgres.
sslkey: ""
# The path to the ca cert. Only used with postgres.
sslrootcert: ""
# Enable SSL/TLS for mysql connections. Options: false, true, skip-verify, preferred
tls: false
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
# 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
# as Vikunja is able to reach it.
url: ''
# The Typesense API key you want to use.
apikey: ''
redis:
# Whether to enable redis or not
enabled: false
# The host of the redis server including its port.
host: 'localhost:6379'
# The password used to authenticate against the redis server
password: ''
# 0 means default database
db: 0
cors:
# Whether to enable or disable cors headers.
# Note: If you want to put the frontend and the api on separate domains or ports, you will need to enable this.
# Otherwise the frontend won't be able to make requests to the api through the browser.
enable: false
# A list of origins which may access the api. These need to include the protocol (`http://` or `https://`) and port, if any.
origins:
- "*"
# How long (in seconds) the results of a preflight request can be cached.
maxage: 0
mailer:
# Whether to enable the mailer or not. If it is disabled, all users are enabled right away and password reset is not possible.
enabled: false
# SMTP Host
host: ""
# SMTP Host port.
# **NOTE:** If you're unable to send mail and the only error you see in the logs is an `EOF`, try setting the port to `25`.
port: 587
# SMTP Auth Type. Can be either `plain`, `login` or `cram-md5`.
authtype: "plain"
# SMTP username
username: "user"
# SMTP password
password: ""
# Wether to skip verification of the tls certificate on the server
skiptlsverify: false
# The default from address when sending emails
fromemail: "mail@vikunja"
# The length of the mail queue.
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.
forcessl: false
log:
# A folder where all the logfiles should go.
path: <rootpath>logs
# Whether to show any logging at all or none
enabled: true
# Where the normal log should go. Possible values are stdout, stderr, file or off to disable standard logging.
standard: "stdout"
# Change the log level. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
level: "INFO"
# Whether or not to log database queries. Useful for debugging. Possible values are stdout, stderr, file or off to disable database logging.
database: "off"
# The log level for database log messages. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
databaselevel: "WARNING"
# Whether to log http requests or not. Possible values are stdout, stderr, file or off to disable http logging.
http: "stdout"
# Echo has its own logging which usually is unnecessary, which is why it is disabled by default. Possible values are stdout, stderr, file or off to disable standard logging.
echo: "off"
# Whether or not to log events. Useful for debugging. Possible values are stdout, stderr, file or off to disable events logging.
events: "off"
# The log level for event log messages. Possible values (case-insensitive) are ERROR, INFO, DEBUG.
eventslevel: "info"
# Whether or not to log mail log messages. This will not log mail contents. Possible values are stdout, stderr, file or off to disable mail-related logging.
mail: "off"
# The log level for mail log messages. Possible values (case-insensitive) are ERROR, WARNING, INFO, DEBUG.
maillevel: "info"
ratelimit:
# whether or not to enable the rate limit
enabled: false
# The kind on which rates are based. Can be either "user" for a rate limit per user or "ip" for an ip-based rate limit.
kind: user
# The time period in seconds for the limit
period: 60
# The max number of requests a user is allowed to do in the configured time period
limit: 100
# The store where the limit counter for each user is stored.
# 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,
# 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
files:
# The path where files are stored
basepath: ./files # relative to the binary
# The maximum size of a file, as a human-readable string.
# Warning: The max size is limited 2^64-1 bytes due to the underlying datatype
maxsize: 20MB
migration:
todoist:
# 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
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
# with the code obtained from the todoist api.
# Note that the vikunja frontend expects this to be /migrate/todoist
redirecturl: <frontend url>/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
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.
redirecturl: <frontend url>/migrate/trello
microsofttodo:
# Wheter to enable the microsoft todo migrator or not
enable: false
# The client id, required for making requests to the microsoft graph api
# See https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#register-an-application
# for information about how to register your Vikunja instance.
clientid:
# The client secret, also required for making requests to the microsoft graph api
clientsecret:
# The url where clients are redirected after they authorized Vikunja to access their microsoft todo tasks.
# 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
redirecturl: <frontend url>/migrate/microsoft-todo
avatar:
# When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires
gravatarexpiration: 3600
backgrounds:
# Whether to enable backgrounds for projects at all.
enabled: true
providers:
upload:
# Whether to enable uploaded project backgrounds
enabled: true
unsplash:
# Whether to enable setting backgrounds from unsplash as project backgrounds
enabled: false
# You need to create an application for your installation at https://unsplash.com/oauth/applications/new
# and set the access token below.
accesstoken:
# The unsplash application id is only used for pingback and required as per their api guidelines.
# You can find the Application ID in the dashboard for your API application. It should be a numeric ID.
# It will only show in the UI if your application has been approved for Enterprise usage, therefore if
# youre in Demo mode, you can also find the ID in the URL at the end: https://unsplash.com/oauth/applications/:application_id
applicationid:
# Legal urls
# Will be shown in the frontend if configured here
legal:
imprinturl:
privacyurl:
# Key Value Storage settings
# The Key Value Storage is used for different kinds of things like metrics and a few cache systems.
keyvalue:
# The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured separately.
type: "memory"
auth:
# Local authentication will let users log in and register (if enabled) through the db.
# This is the default auth mechanism and does not require any additional configuration.
local:
# Enable or disable local authentication
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 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 the third party to rediect 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
enabled: false
# A list of enabled providers
providers:
# The name of the provider as it will appear in the frontend.
- name:
# The auth url to send users to if they want to authenticate using OpenID Connect.
authurl:
# The oidc logouturl that users will be redirected to on logout.
# Leave empty or delete key, if you do not want to be redirected.
logouturl:
# The client ID used to authenticate Vikunja at the OpenID Connect provider.
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:
# If set to true, enables a /metrics endpoint for prometheus to collect metrics about Vikunja. You can query it from `/api/v1/metrics`.
enabled: false
# If set to a non-empty value the /metrics endpoint will require this as a username via basic auth in combination with the password below.
username:
# If set to a non-empty value the /metrics endpoint will require this as a password via basic auth in combination with the username below.
password:
# Provide default settings for new users. When a new user is created, these settings will automatically be set for the user. If you change them in the config file afterwards they will not be changed back for existing users.
defaultsettings:
# The avatar source for the user. Can be `gravatar`, `initials`, `upload` or `marble`. If you set this to `upload` you'll also need to specify `defaultsettings.avatar_file_id`.
avatar_provider: initials
# The id of the file used as avatar.
avatar_file_id: 0
# If set to true users will get task reminders via email.
email_reminders_enabled: false
# If set to true will allow other users to find this user when searching for parts of their name.
discoverable_by_name: false
# If set to true will allow other users to find this user when searching for their exact email.
discoverable_by_email: false
# If set to true will send an email every day with all overdue tasks at a configured time.
overdue_tasks_reminders_enabled: true
# When to send the overdue task reminder email.
overdue_tasks_reminders_time: 9:00
# The id of the default project. Make sure users actually have access to this project when setting this value.
default_project_id: 0
# Start of the week for the user. `0` is sunday, `1` is monday and so on.
week_start: 0
# The language of the user interface. Must be an ISO 639-1 language code followed by an ISO 3166-1 alpha-2 country code. Check https://kolaente.dev/vikunja/vikunja/frontend/src/branch/main/src/i18n/lang for a list of possible languages. Will default to the browser language the user uses when signing up.
language: <unset>
# The time zone of each individual user. This will affect when users get reminders and overdue task emails.
timezone: <time zone set at service.timezone>
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 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.
proxypassword:

View File

@@ -1,9 +0,0 @@
{ pkgs ? import <nixpkgs> {}
}:
pkgs.mkShell {
name="electron-dev";
buildInputs = [
pkgs.electron
];
}

View File

@@ -51,11 +51,11 @@
}
},
"devDependencies": {
"electron": "29.1.0",
"electron-builder": "24.13.3"
"electron": "33.2.0",
"electron-builder": "25.1.8"
},
"dependencies": {
"connect-history-api-fallback": "2.0.0",
"express": "4.18.3"
"express": "4.21.1"
}
}

3458
desktop/pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

132
devenv.lock Normal file
View File

@@ -0,0 +1,132 @@
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1730028891,
"owner": "cachix",
"repo": "devenv",
"rev": "a337f8862efa9bde348c48a48b5b943f710604dd",
"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",
"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",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1716977621,
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "4267e705586473d3e5c8d50299e71503f16a6fb6",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1729973466,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "cd3e8833d70618c4eea8df06f95b364b016d4950",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1729880355,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "18536bf04cd71abd345f9579158841376fdd0c5a",
"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": 1729104314,
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6",
"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
}

38
devenv.nix Normal file
View File

@@ -0,0 +1,38 @@
{ 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;
enableHardeningWorkaround = true;
};
};
services.mailpit = {
enable = true;
package = pkgs-unstable.mailpit;
};
}

17
devenv.yaml Normal file
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

View File

View File

@@ -1,3 +0,0 @@
FROM nginx
ADD public /usr/share/nginx/html/docs
ADD nginx.conf /etc/nginx/conf.d/default.conf

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

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">}}).

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
},
}
```

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.

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).

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.

View File

@@ -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.

View File

@@ -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.

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.",
}
}
```

View File

@@ -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.

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?

View File

@@ -1,174 +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 lint`
* `mage build:build`
## Build
### Build Vikunja
```
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 golangci and swagger documentation check
* `mage lint`: Checks if the code follows the rules as defined in the `.golangci.yml` config file.
* `mage lint:fix`: Fixes all code style issues which are easily fixable.
## 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.

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).

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`.

View File

@@ -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.

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

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.

View File

@@ -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
}
```

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
```

View File

@@ -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

View File

@@ -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.

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.

View File

@@ -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

View File

@@ -1,30 +0,0 @@
---
title: "Desktop Packages"
date: 2024-02-11T15:58:18+01:00
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Desktop Packages
Vikunja is available as an electron-based desktop application for Linux and Windows.
## Installation
1. Download the latest release for your platform from [the download page](https://dl.vikunja.io/desktop/).
* For Windows, choose the file with the `.exe` or `.msi` file ending
* For a Linux-based operating system, choose a file with an ending for your operating system - we have builds for Alpine, AppImage, Arch Linux, Debian-based systems, FreeBSD, Fedora and Snap.
2. Run the downloaded package in the same way you would normally install a package for your OS.
## Flatpack
Vikunja Desktop can be installed via the [Flathub](https://flathub.org/apps/io.vikunja.Vikunja).
To install it, run the following command:
```
flatpak install flathub io.vikunja.Vikunja
```

View File

@@ -1,226 +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: changeme
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:
condition: service_healthy
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: changeme
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_USER --password=$$MYSQL_PASSWORD"]
interval: 2s
start_period: 30s
```
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.
## Ensure adequate file permissions
Vikunja runs as user `1000` and no group by default.
To be able to upload task attachments or change the background of project, Vikunja must be able to write into the `files` directory.
To do this, create the folder and chown it before starting the stack:
```
mkdir $PWD/files
chown 1000 $PWD/files
```
## 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.

View File

@@ -1,354 +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">}}).
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 >}}
## File permissions
Vikunja runs as user `1000` and no group by default.
You can use Docker's [`--user`](https://docs.docker.com/engine/reference/run/#user) flag to change that.
You must ensure Vikunja is able to write into the `files` directory.
To do this, create the folder and chown it before starting the stack:
```
mkdir $PWD/files
chown 1000 $PWD/files
```
You'll need to do this before running any of the examples on this page.
Vikunja will not try to aquire ownership of the files folder, as that would mean it had to run as root.
## 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:16
environment:
POSTGRES_PASSWORD: changeme
POSTGRES_USER: vikunja
volumes:
- ./db:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -U $$POSTGRES_USER"]
interval: 2s
```
You'll also need to change the `VIKUNJA_DATABASE_TYPE` to `postgres` on the api container declaration.
## 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.
To run the container, you need to create the directories first and make sure they have all required permissions:
```
mkdir $PWD/files $PWD/db
chown 1000 $PWD/files $PWD/db
```
<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 public ip or hostname including the port (the docker host you're running this on) is reachable at, prefixed with `http://`.
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 it from the outside.
<div class="notification is-warning">
<b>NOTE:</b> You must ensure Vikunja has write permissions on the `files` directory before starting the stack.
To do this, <a href="#file-permissions">check out the related commands here</a>.
</div>
```yaml
version: '3'
services:
vikunja:
image: vikunja/vikunja
environment:
VIKUNJA_SERVICE_PUBLICURL: http://<the public ip or host where vikunja is reachable>
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: changeme
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:
condition: service_healthy
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: changeme
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_USER --password=$$MYSQL_PASSWORD"]
interval: 2s
start_period: 30s
```
## 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`
<div class="notification is-warning">
<b>NOTE:</b> You must ensure Vikunja has write permissions on the `files` directory before starting the stack.
To do this, <a href="#file-permissions">check out the related commands here</a>.
</div>
```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: changeme
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:
condition: service_healthy
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.docker.network=web"
- "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: changeme
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_USER --password=$$MYSQL_PASSWORD"]
interval: 2s
start_period: 30s
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.
<div class="notification is-warning">
<b>NOTE:</b> You must ensure Vikunja has write permissions on the `files` directory before starting the stack.
To do this, <a href="#file-permissions">check out the related commands here</a>.
</div>
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: changeme
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:
condition: service_healthy
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: changeme
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u $$MYSQL_USER --password=$$MYSQL_PASSWORD"]
interval: 2s
start_period: 30s
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.
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> You must ensure Vikunja has write permissions on the `files` directory before starting the stack.
To do this, <a href="#file-permissions">check out the related commands here</a>.
</div>
## 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
```

View File

@@ -1,315 +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 (manual)](#install-from-binary)
* [Build from source]({{< ref "build-from-source.md">}})
* [Docker](#docker)
* [Debian](#debian-packages)
* [RPM](#rpm)
* [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:
```
mkdir $PWD/files $PWD/db
chown 1000 $PWD/files $PWD/db
docker run -p 3456:3456 -v $PWD/files:/app/vikunja/files -v $PWD/db:/db vikunja/vikunja
```
This will expose vikunja on port `3456` on the host running the container and use sqlite as database backend.
**Note**: The container runs as the user `1000` and no group by default.
You can use Docker's [`--user`](https://docs.docker.com/engine/reference/run/#user) flag to change that.
Make sure the new user has required permissions on the `db` and `files` folder.
You can mount a local configuration like so:
```
mkdir $PWD/files $PWD/db
chown 1000 $PWD/files $PWD/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/db:/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.
### 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 deb package for installation on debian-like systems.
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`.
## RPM
Vikunja is available as rpm package for installation on Fedora, CentOS and others.
To install these, grab a `.rpm` file from [the download page](https://dl.vikunja.io/vikunja) and run
```
rpm -i vikunja.rpm
```
To configure Vikunja, 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.

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)

View File

@@ -1,117 +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 OAuth 2.0 provider using OpenID Connect.
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.
OpenID Discovery is used to find the correct endpoint to use automatically, by 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`.
Typically this URL can be found in the metadata section within your identity provider.

View File

@@ -1,180 +0,0 @@
---
date: "2022-08-09:00:00+02:00"
title: "OpenID"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# OpenID
Vikunja allows for authentication with an external identity source such as Authentik, Keycloak or similar via the
[OpenID Connect](https://openid.net/developers/specs/) standard.
{{< table_of_contents >}}
## OpenID Connect Overview
OpenID Connect is a standardized identity layer built on top of the more generic OAuth 2.0 specification, simplying interaction between the involved parties significantly.
While the [OpenID specification](https://openid.net/specs/openid-connect-core-1_0.html#Overview) is worth a read, we summarize the most important basics here.
The involved parties are:
- **Resource Owner:** typically the end-user
- **Resource Server:** the application server handling requests from the client, the Vikunja API in our case
- **Client:** the application or client accessing the RS on behalf of the RO. Vikunja web frontend or any of the apps
- **Authorization Server:** the server verifying the user identity and issuing tokens. These docs also use the words `OAuth 2.0 provider`, `Identity Provider` interchangeably.
After the user is authenticated, the provider issues a token to the user, containing various claims.
There's different types of tokens (ID token, access token, refresh token), and all of them are created as [JSON Web Token](https://www.rfc-editor.org/info/rfc7519).
Claims in turn are assertions containing information about the token bearer, usually the user.
**Scopes** are requested by the client when redirecting the end-user to the Authorization Server for authentication, and indirectly control which claims are included in the resulting tokens.
There's certain default scopes, but its also possible to define custom scopes, which are used by the feature assigning users to Teams automatically.
## Configuring OIDC Authentication
To achieve authentication via an external provider, it is required to (a) configure a confidential Client on your OAuth 2.0 provider and (b) configure Vikunja to authenticate against this provider.
[Example configurations]({{< ref "openid-examples.md">}}) are provided for various different identity providers, below you can find generic guides though.
OpenID Connect defines various flow types indicating how exactly the interaction between the involved parties work, Vikunja makes use of the standard **Authorization Code Flow**.
### Step 1: Configure your Authorization Server
The first step is to configure the Authorization Server to correctly handle requests coming from Vikunja.
In general, this involves the following steps at a minimum:
- Create a confidential client and obtain the client ID and client secret
- Configure (whitelist) redirect URLs that can be used by Vikunja
- Make sure the required scopes (`openid profile email` are the default scopes used by Vikunja) are supported
- Optional: configure an additional scope for automatic team assignment, see below for details
More detailled instructions for various different identity providers can be [found here]({{< ref "openid-examples.md">}})
### Step 2: Configure Vikunja
Vikunja has to be configured to use the identity provider. Please note that there is currently no option to configure these settings via environment variables, they have to be defined using the configuration file. The configuration schema is as follows:
```yaml
auth:
openid:
enabled: true
redirecturl: https://vikunja.mydomain.com/auth/openid/ <---- slash at the end is important
providers:
- name: <provider-name>
authurl: <auth-url>
clientid: <vikunja client-id>
clientsecret: <vikunja client-secret>
scope: openid profile email
```
The values for `authurl` can be obtained from the Metadata of your provider, while `clientid` and `clientsecret` are obtained when configuring the client.
The scope usually doesn't need to be specified or changed, unless you want to configure the automatic team assignment.
Optionally it is possible to disable local authentication and therefore forcing users to login via OpenID connect:
```yaml
auth:
local:
enabled: false
```
## Automatically assign users to teams
Vikunja is capable of automatically adding users to a team based on OIDC claims added by the identity provider.
If configured, Vikunja will sync teams, automatically create new ones and make sure the members are part of the configured teams.
Teams which exist only because they were created from oidc attributes are not editable in Vikunja.
To distinguish between teams created in Vikunja and teams generated automatically via oidc, generated teams have an `oidcID` assigned internally.
Within the UI, the teams created through OIDC get a `(OIDC)` suffix to make them distinguishable from locally created teams.
On a high level, you need to make sure that the **ID token** issued by your identity provider contains a `vikunja_groups` claim, following the structure defined below.
It depends on the provider being used as well as the preferences of the administrator how this is achieved.
Typically you'd want to request an additional scope (e.g. `vikunja_scope`) which then triggers the identity provider to add the claim.
If the `vikunja_groups` is part of the **ID token**, Vikunja will start the procedure and import teams and team memberships.
The claim structure expexted by Vikunja is as follows:
```json
{
"vikunja_groups": [
{
"name": "team 1",
"oidcID": 33349
},
{
"name": "team 2",
"oidcID": 35933
}
]
}
```
For each team, you need to define a team `name` and an `oidcID`, where the `oidcID` can be any string with a length of less than 250 characters.
The `oidcID` is used to uniquely identify the team, so please make sure to keep this unique.
Below you'll find two example implementations for Authentik and Keycloak.
If you've successfully implemented this with another identity provider, please let us know and submit a PR to improve the docs.
### Setup in Authentik
To configure automatic team management through Authentik, we assume you have already [set up Authentik]({{< ref "openid-examples.md">}}#authentik) as an OIDC provider for authentication with Vikunja.
To use Authentik's group assignment feature, follow these steps:
1. Edit [your config]({{< ref "config.md">}}) to include the following scopes: `openid profile email vikunja_scope`
2. Open `<your authentik url>/if/admin/#/core/property-mappings`
3. Create a new property mapping called `vikunja_scope` as scope mapping. There is a field `expression` to enter python expressions that will be delivered with the oidc token.
4. Write a small script like the following to add group information to `vikunja_scope`:
```python
groupsDict = {"vikunja_groups": []}
for group in request.user.ak_groups.all():
groupsDict["vikunja_groups"].append({"name": group.name, "oidcID": group.num_pk})
return groupsDict
```
5. In Authentik's menu on the left, go to Applications > Providers > Select the Vikunja provider. Then click on "Edit", on the bottom open "Advanced protocol settings", select the newly created property mapping under "Scopes". Save the provider.
Now when you log into Vikunja via Authentik it will show you a list of scopes you are claiming.
You should see the description you entered on the OIDC provider's admin area.
Proceed to vikunja and open the teams page in the sidebar menu.
You should see "(OIDC)" written next to each team you were assigned through OIDC.
### Setup in Keycloak
The kind people from Makerspace Darmstadt e.V. have written [a guide on how to create a mapper for Vikunja here](https://github.com/makerspace-darmstadt/keycloak-vikunja-mapper).
## Use cases
All examples assume one team called "Team 1" to be configured within your provider.
* *Token delivers team.name +team.oidcID and Vikunja team does not exist:* \
New team will be created called "Team 1" with attribute oidcID: "33929"
2. *In Vikunja Team with name "team 1" already exists in vikunja, but has no oidcID set:* \
new team will be created called "team 1" with attribute oidcID: "33929"
3. *In Vikunja Team with name "team 1" already exists in vikunja, but has different oidcID set:* \
new team will be created called "team 1" with attribute oidcID: "33929"
4. *In Vikunja Team with oidcID "33929" already exists in vikunja, but has different name than "team1":* \
new team will be created called "team 1" with attribute oidcID: "33929"
5. *Scope vikunja_scope is not set:* \
nothing happens
6. *oidcID is not set:* \
You'll get error.
Custom Scope malformed
"The custom scope set by the OIDC provider is malformed. Please make sure the openid provider sets the data correctly for your scope. Check especially to have set an oidcID."
7. *In Vikunja I am in "team 3" with oidcID "", but the token does not deliver any data for "team 3":* \
You will stay in team 3 since it was not set by the oidc provider
8. *In Vikunja I am in "team 3" with oidcID "12345", but the token does not deliver any data for "team 3"*:\
You will be signed out of all teams, which have an oidcID set and are not contained in the token.
Especially if you've been the last team member, the team will be deleted.

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
}
}
```

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.

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.

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)
```

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.

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.

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...
```

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
```

View File

@@ -1,165 +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. |
| 1022 | 412 | The custom scope set by the OIDC provider is malformed. Please make sure the openid provider sets the data correctly for your scope. Check especially to have set an oidcID. |
## 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. |
| 6008 | 400 | There are no teams found with that team name. |
| 6009 | 400 | There is no oidc team with that team name and oidcId. |
| 6010 | 400 | There are no oidc teams found for the user. |
## 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. |

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.

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` |

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.

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.

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

View File

@@ -1 +0,0 @@
use flake

View File

@@ -1,60 +0,0 @@
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')
module.exports = {
'root': true,
'env': {
'browser': true,
'es2022': true,
'node': true,
},
'extends': [
'eslint:recommended',
'plugin:vue/vue3-recommended',
'@vue/eslint-config-typescript/recommended',
],
'rules': {
'quotes': ['error', 'single'],
'comma-dangle': ['error', 'always-multiline'],
'semi': ['error', 'never'],
'vue/v-on-event-hyphenation': ['warn', 'never', { 'autofix': true }],
'vue/multi-word-component-names': 'off',
// uncategorized rules:
'vue/component-api-style': ['error', ['script-setup']],
'vue/component-name-in-template-casing': ['warn', 'PascalCase'],
'vue/custom-event-name-casing': ['error', 'camelCase'],
'vue/define-macros-order': 'error',
'vue/match-component-file-name': ['error', {
'extensions': ['.js', '.jsx', '.ts', '.tsx', '.vue'],
'shouldMatchCase': true,
}],
'vue/no-boolean-default': ['warn', 'default-false'],
'vue/match-component-import-name': 'error',
'vue/prefer-separate-static-class': 'warn',
'vue/padding-line-between-blocks': 'error',
'vue/next-tick-style': ['error', 'promise'],
'vue/block-lang': [
'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',
},
'parser': 'vue-eslint-parser',
'parserOptions': {
'parser': '@typescript-eslint/parser',
'ecmaVersion': 'latest',
},
'ignorePatterns': [
'*.test.*',
'cypress/*',
],
}

4
frontend/.gitignore vendored
View File

@@ -10,10 +10,10 @@ stats.html
node_modules
.DS_Store
/dist*
dist
coverage
*.zip
.direnv/
.vite/
# Test files
cypress/screenshots

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

View File

@@ -1 +1 @@
20.11.0
22.11.0

View File

@@ -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)

View File

@@ -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)
})
})

View File

@@ -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()

View File

@@ -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')
})
})
})

View File

@@ -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)
})
})

View File

@@ -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)

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', () => {

View File

@@ -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)

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')

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('/')

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')

View File

@@ -7,6 +7,5 @@
"target": "ES2015",
"lib": ["ESNext", "dom"],
"types": ["cypress"],
"ignoreDeprecations": "5.0"
}
}

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(),

View File

@@ -9,7 +9,7 @@ export class LinkShareFactory extends Factory {
return {
id: '{increment}',
hash: faker.random.word(32),
hash: faker.lorem.word(32),
project_id: 1,
right: 0,
sharing_type: 0,

View File

@@ -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(),
}
}
}

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()
}

View File

@@ -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}',
}
}
}

View File

@@ -10,7 +10,7 @@ export class UserFactory extends Factory {
return {
id: '{increment}',
username: faker.lorem.word(10) + faker.datatype.uuid(),
username: faker.lorem.word(10) + faker.string.uuid(),
password: '$2a$14$dcadBoMBL9jQoOcZK8Fju.cy0Ptx2oZECkKLnaa8ekRoTFe1w7To.', // 1234
status: 0,
issuer: 'local',

10
frontend/env.d.ts vendored
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

88
frontend/eslint.config.js Normal file
View File

@@ -0,0 +1,88 @@
import pluginVue from 'eslint-plugin-vue'
import js from '@eslint/js'
import vueTsEslintConfig from '@vue/eslint-config-typescript'
export default [
js.configs.recommended,
...pluginVue.configs['flat/recommended'],
...vueTsEslintConfig(),
{
ignores: [
'**/*.test.ts',
'./cypress',
],
},
{
rules: {
'quotes': ['error', 'single'],
'comma-dangle': ['error', 'always-multiline'],
'semi': ['error', 'never'],
'vue/v-on-event-hyphenation': ['warn', 'never', {'autofix': true}],
'vue/multi-word-component-names': 'off',
// uncategorized rules:
'vue/component-api-style': ['error', ['script-setup']],
'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', {
'extensions': ['.js', '.jsx', '.ts', '.tsx', '.vue'],
'shouldMatchCase': true,
}],
'vue/no-boolean-default': ['warn', 'default-false'],
'vue/match-component-import-name': 'error',
'vue/prefer-separate-static-class': 'warn',
'vue/padding-line-between-blocks': 'error',
'vue/next-tick-style': ['error', 'promise'],
'vue/block-lang': [
'error',
{'script': {'lang': 'ts'}},
],
'vue/no-duplicate-attr-inheritance': 'error',
'vue/no-empty-component-block': 'error',
'vue/html-indent': ['error', 'tab'],
// vue3
'vue/no-ref-object-reactivity-loss': 'error',
'vue/no-setup-props-reactivity-loss': 'warn', // TODO: switch to error after vite `propsDestructure` is removed
'@typescript-eslint/no-unused-vars': [
'error',
{
// 'args': 'all',
// 'argsIgnorePattern': '^_',
'caughtErrors': 'all',
'caughtErrorsIgnorePattern': '^_',
// 'destructuredArrayIgnorePattern': '^_',
'varsIgnorePattern': '^_',
'ignoreRestSiblings': true,
},
],
},
// files: ['*.vue', '**/*.vue'],
languageOptions: {
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 'latest',
tsconfigRootDir: '.',
},
},
// 'parser': 'vue-eslint-parser',
// 'parserOptions': {
// 'parser': '@typescript-eslint/parser',
// 'ecmaVersion': 'latest',
// 'tsconfigRootDir': __dirname,
// },
// 'ignorePatterns': [
// 'cypress/*',
// ],
},
]

25
frontend/flake.lock generated
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
}

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 ]; };
};
}

View File

@@ -13,7 +13,7 @@
},
"homepage": "https://vikunja.io/",
"funding": "https://opencollective.com/vikunja",
"packageManager": "pnpm@8.15.4",
"packageManager": "pnpm@9.13.2",
"keywords": [
"todo",
"productivity",
@@ -40,7 +40,7 @@
"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",
@@ -50,141 +50,135 @@
"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.2.0",
"@sentry/tracing": "7.105.0",
"@sentry/vue": "7.105.0",
"@tiptap/core": "2.2.4",
"@tiptap/extension-blockquote": "2.2.4",
"@tiptap/extension-bold": "2.2.4",
"@tiptap/extension-bullet-list": "2.2.4",
"@tiptap/extension-code": "2.2.4",
"@tiptap/extension-code-block-lowlight": "2.2.4",
"@tiptap/extension-document": "2.2.4",
"@tiptap/extension-dropcursor": "2.2.4",
"@tiptap/extension-gapcursor": "2.2.4",
"@tiptap/extension-hard-break": "2.2.4",
"@tiptap/extension-heading": "2.2.4",
"@tiptap/extension-history": "2.2.4",
"@tiptap/extension-horizontal-rule": "2.2.4",
"@tiptap/extension-image": "2.2.4",
"@tiptap/extension-italic": "2.2.4",
"@tiptap/extension-link": "2.2.4",
"@tiptap/extension-list-item": "2.2.4",
"@tiptap/extension-ordered-list": "2.2.4",
"@tiptap/extension-paragraph": "2.2.4",
"@tiptap/extension-placeholder": "2.2.4",
"@tiptap/extension-strike": "2.2.4",
"@tiptap/extension-table": "2.2.4",
"@tiptap/extension-table-cell": "2.2.4",
"@tiptap/extension-table-header": "2.2.4",
"@tiptap/extension-table-row": "2.2.4",
"@tiptap/extension-task-item": "2.2.4",
"@tiptap/extension-task-list": "2.2.4",
"@tiptap/extension-text": "2.2.4",
"@tiptap/extension-typography": "2.2.4",
"@tiptap/extension-underline": "2.2.4",
"@tiptap/pm": "2.2.4",
"@tiptap/suggestion": "2.2.4",
"@tiptap/vue-3": "2.2.4",
"@types/is-touch-device": "1.0.2",
"@types/lodash.clonedeep": "4.5.9",
"@vueuse/core": "10.9.0",
"@vueuse/router": "10.9.0",
"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": "6.0.0",
"@kyvg/vue3-notification": "3.4.1",
"@sentry/tracing": "7.114.0",
"@sentry/vue": "8.38.0",
"@tiptap/core": "2.9.1",
"@tiptap/extension-blockquote": "2.9.1",
"@tiptap/extension-bold": "2.9.1",
"@tiptap/extension-bullet-list": "2.9.1",
"@tiptap/extension-code": "2.9.1",
"@tiptap/extension-code-block": "2.9.1",
"@tiptap/extension-code-block-lowlight": "2.9.1",
"@tiptap/extension-document": "2.9.1",
"@tiptap/extension-dropcursor": "2.9.1",
"@tiptap/extension-gapcursor": "2.9.1",
"@tiptap/extension-hard-break": "2.9.1",
"@tiptap/extension-heading": "2.9.1",
"@tiptap/extension-history": "2.9.1",
"@tiptap/extension-horizontal-rule": "2.9.1",
"@tiptap/extension-image": "2.9.1",
"@tiptap/extension-italic": "2.9.1",
"@tiptap/extension-link": "2.9.1",
"@tiptap/extension-list-item": "2.9.1",
"@tiptap/extension-ordered-list": "2.9.1",
"@tiptap/extension-paragraph": "2.9.1",
"@tiptap/extension-placeholder": "2.9.1",
"@tiptap/extension-strike": "2.9.1",
"@tiptap/extension-table": "2.9.1",
"@tiptap/extension-table-cell": "2.9.1",
"@tiptap/extension-table-header": "2.9.1",
"@tiptap/extension-table-row": "2.9.1",
"@tiptap/extension-task-item": "2.9.1",
"@tiptap/extension-task-list": "2.9.1",
"@tiptap/extension-text": "2.9.1",
"@tiptap/extension-typography": "2.9.1",
"@tiptap/extension-underline": "2.9.1",
"@tiptap/pm": "2.9.1",
"@tiptap/suggestion": "2.9.1",
"@tiptap/vue-3": "2.9.1",
"@vueuse/core": "11.2.0",
"@vueuse/router": "11.2.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.9",
"change-case": "5.4.4",
"date-fns": "4.1.0",
"dayjs": "1.11.13",
"dompurify": "3.2.0",
"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.6",
"register-service-worker": "1.7.2",
"snake-case": "3.0.4",
"sortablejs": "1.15.2",
"sortablejs": "1.15.3",
"tailwindcss": "3.4.15",
"tippy.js": "6.3.7",
"ufo": "1.4.0",
"vue": "3.4.21",
"vue-advanced-cropper": "2.8.8",
"ufo": "1.5.4",
"vue": "3.5.13",
"vue-advanced-cropper": "2.8.9",
"vue-flatpickr-component": "11.0.5",
"vue-i18n": "9.10.1",
"vue-router": "4.3.0",
"workbox-precaching": "7.0.0",
"vue-i18n": "10.0.4",
"vue-router": "4.4.5",
"vuemoji-picker": "0.3.1",
"workbox-precaching": "7.3.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.1",
"@histoire/plugin-screenshot": "0.17.8",
"@histoire/plugin-vue": "0.17.12",
"@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": "9.2.0",
"@histoire/plugin-screenshot": "0.17.17",
"@histoire/plugin-vue": "0.17.17",
"@tsconfig/node22": "22.0.0",
"@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.24",
"@types/postcss-preset-env": "7.7.0",
"@types/is-touch-device": "1.0.3",
"@types/lodash.clonedeep": "4.5.9",
"@types/node": "22.9.0",
"@types/sortablejs": "1.15.8",
"@typescript-eslint/eslint-plugin": "7.1.1",
"@typescript-eslint/parser": "7.1.1",
"@vitejs/plugin-legacy": "5.3.1",
"@vitejs/plugin-vue": "5.0.4",
"@vue/eslint-config-typescript": "12.0.0",
"@vue/test-utils": "2.4.4",
"@vue/tsconfig": "0.5.1",
"autoprefixer": "10.4.18",
"browserslist": "4.23.0",
"caniuse-lite": "1.0.30001593",
"css-has-pseudo": "6.0.2",
"@typescript-eslint/eslint-plugin": "8.14.0",
"@typescript-eslint/parser": "8.14.0",
"@vitejs/plugin-legacy": "5.4.3",
"@vitejs/plugin-vue": "5.2.0",
"@vue/eslint-config-typescript": "14.1.3",
"@vue/test-utils": "2.4.6",
"@vue/tsconfig": "0.6.0",
"autoprefixer": "10.4.20",
"browserslist": "4.24.2",
"caniuse-lite": "1.0.30001680",
"csstype": "3.1.3",
"cypress": "13.6.6",
"esbuild": "0.20.1",
"eslint": "8.57.0",
"eslint-plugin-vue": "9.22.0",
"happy-dom": "13.6.2",
"histoire": "0.17.9",
"postcss": "8.4.35",
"cypress": "13.15.2",
"esbuild": "0.24.0",
"eslint": "9.14.0",
"eslint-plugin-vue": "9.31.0",
"happy-dom": "15.11.6",
"histoire": "0.17.17",
"postcss": "8.4.49",
"postcss-easing-gradients": "3.0.1",
"postcss-easings": "4.0.0",
"postcss-focus-within": "8.0.1",
"postcss-preset-env": "9.4.0",
"rollup": "4.12.0",
"postcss-preset-env": "10.1.0",
"rollup": "4.26.0",
"rollup-plugin-visualizer": "5.12.0",
"sass": "1.71.1",
"start-server-and-test": "2.0.3",
"typescript": "5.3.3",
"vite": "5.1.5",
"vite-plugin-inject-preload": "1.3.3",
"vite-plugin-pwa": "0.19.2",
"sass-embedded": "1.81.0",
"start-server-and-test": "2.0.8",
"typescript": "5.6.3",
"unplugin-inject-preload": "3.0.0",
"vite": "5.4.11",
"vite-plugin-pwa": "0.21.0",
"vite-plugin-sentry": "1.4.0",
"vite-svg-loader": "5.1.0",
"vitest": "1.3.1",
"vue-tsc": "2.0.4",
"wait-on": "7.2.0",
"workbox-cli": "7.0.0"
"vitest": "2.1.5",
"vue-tsc": "2.1.10",
"wait-on": "8.0.1",
"workbox-cli": "7.3.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"
}
}
}

View File

@@ -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);

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",

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",

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