From 2bf7e2a130c77583a4a0901668571e62ce75991a Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 12 Dec 2021 18:01:51 +0100 Subject: [PATCH 01/20] chore: move to script setup --- src/views/user/settings/Caldav.vue | 42 +++++++++++------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index e6e196af7..1a6beb13b 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -17,39 +17,27 @@

- + {{ $t('user.settings.caldav.more') }}

- -- 2.45.1 From 8c01a384c407f141c36345237cbacc7ba3f1e585 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 12 Dec 2021 18:28:14 +0100 Subject: [PATCH 02/20] feat: manage tokens --- src/i18n/lang/en.json | 12 +++++- src/models/caldavToken.js | 15 +++++++ src/services/caldavToken.js | 23 ++++++++++ src/views/user/settings/Caldav.vue | 68 +++++++++++++++++++++++++++++- 4 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 src/models/caldavToken.js create mode 100644 src/services/caldavToken.js diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 306eb3f56..266213686 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -105,7 +105,12 @@ "caldav": { "title": "Caldav", "howTo": "You can connect Vikunja to caldav clients to view and manage all tasks from different clients. Enter this url into your client:", - "more": "More information about caldav in Vikunja" + "more": "More information about caldav in Vikunja", + "tokens": "Caldav Tokens", + "tokensHowTo": "You can use a caldav token to use instead of a password to log in the above endpoint.", + "createToken": "Create a token", + "tokenCreated": "Here is your token: {token}", + "wontSeeItAgain": "Write it down, you won't be able to see it again." }, "avatar": { "title": "Avatar", @@ -484,7 +489,10 @@ "showMenu": "Show the menu", "hideMenu": "Hide the menu", "forExample": "For example:", - "welcomeBack": "Welcome Back!" + "welcomeBack": "Welcome Back!", + "id": "ID", + "created": "Created at", + "actions": "Actions" }, "input": { "resetColor": "Reset Color", diff --git a/src/models/caldavToken.js b/src/models/caldavToken.js new file mode 100644 index 000000000..2d7a4ebd5 --- /dev/null +++ b/src/models/caldavToken.js @@ -0,0 +1,15 @@ +import AbstractModel from './abstractModel' + +export default class CaldavTokenModel extends AbstractModel { + constructor(data) { + super(data) + this.created = new Date(this.created) + } + + defaults() { + return { + id: 0, + created: null, + } + } +} \ No newline at end of file diff --git a/src/services/caldavToken.js b/src/services/caldavToken.js new file mode 100644 index 000000000..2c124ade6 --- /dev/null +++ b/src/services/caldavToken.js @@ -0,0 +1,23 @@ +import {formatISO} from 'date-fns' +import CaldavTokenModel from '../models/caldavToken' +import AbstractService from './abstractService' + +export default class CaldavTokenService extends AbstractService { + constructor() { + super({ + getAll: '/user/settings/token/caldav', + create: '/user/settings/token/caldav', + delete: '/user/settings/token/caldav/{id}', + }) + } + + processModel(model) { + model.created = formatISO(new Date(model.created)) + return model + } + + modelFactory(data) { + return new CaldavTokenModel(data) + } +} + \ No newline at end of file diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 1a6beb13b..90623017b 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -16,6 +16,41 @@ /> + +

+ {{ $t('user.settings.caldav.tokens') }} +

+ +

+ {{ $t('user.settings.caldav.tokensHowTo') }} +

+ + + + + + + + + + + + +
{{ $t('misc.id') }}{{ $t('misc.created') }}{{ $t('misc.actions') }}
{{ tk.id }}{{ formatDateShort(tk.created) }} + + {{ $t('misc.delete') }} + +
+ + + {{ $t('user.settings.caldav.tokenCreated', {token: newToken.token}) }}
+ {{ $t('user.settings.caldav.wontSeeItAgain') }} +
+ + + {{ $t('user.settings.caldav.createToken') }} + +

{{ $t('user.settings.caldav.more') }} @@ -26,12 +61,15 @@ -- 2.45.1 From 0d3e0d68d0d35f11c939a1623ab72ee3b1573d37 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 12 Dec 2021 18:32:32 +0100 Subject: [PATCH 03/20] chore: put action buttons right --- src/views/user/settings/Caldav.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 90623017b..afbbbe447 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -29,12 +29,12 @@ {{ $t('misc.id') }} {{ $t('misc.created') }} - {{ $t('misc.actions') }} + {{ $t('misc.actions') }} {{ tk.id }} {{ formatDateShort(tk.created) }} - + {{ $t('misc.delete') }} -- 2.45.1 From 8656d14a6db9f8143a1a310a2c7f09132a79d4b4 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 12 Dec 2021 18:39:17 +0100 Subject: [PATCH 04/20] chore: clarify token is required for non-local users --- src/i18n/lang/en.json | 4 +++- src/views/user/settings/Caldav.vue | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 266213686..96af22d89 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -110,7 +110,9 @@ "tokensHowTo": "You can use a caldav token to use instead of a password to log in the above endpoint.", "createToken": "Create a token", "tokenCreated": "Here is your token: {token}", - "wontSeeItAgain": "Write it down, you won't be able to see it again." + "wontSeeItAgain": "Write it down, you won't be able to see it again.", + "mustUseToken": "You need to create a caldav token if you want to use caldav with a third party client. Use the token as the password.", + "usernameIs": "Your username is: {0}" }, "avatar": { "title": "Avatar", diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index afbbbe447..35fdeb5a5 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -22,7 +22,13 @@

- {{ $t('user.settings.caldav.tokensHowTo') }} + {{ isLocalUser ? $t('user.settings.caldav.tokensHowTo') : $t('user.settings.caldav.mustUseToken') }} +

@@ -78,6 +84,8 @@ useTitle(() => `${t('user.settings.caldav.title')} - ${t('user.settings.title')} const caldavUrl = computed(() => `${store.getters['config/apiBase']}/dav/principals/${store.state.auth.info.username}/`) const caldavEnabled = computed(() => store.state.config.caldavEnabled) +const isLocalUser = computed(() => store.state.auth.info?.isLocalUser) +const username = computed(() => store.state.auth.info?.username) const service = new CaldavTokenService() const tokens = ref([]) -- 2.45.1 From 6866fda275303873a9f2a671e886acdcca0a127c Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 14 Dec 2021 21:27:16 +0100 Subject: [PATCH 05/20] chore: use ts for caldav component --- src/views/user/settings/Caldav.vue | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 35fdeb5a5..8a1b30ff3 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -9,10 +9,10 @@
@@ -65,7 +65,7 @@ - -- 2.45.1 From 354775fbb47f6560beaedf64ebddee682b3b5496 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 14 Dec 2021 21:31:25 +0100 Subject: [PATCH 07/20] chore: make server functions async --- src/views/user/settings/Caldav.vue | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index a9618d8fc..6d887a96f 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -96,23 +96,18 @@ service.getAll() }) const newToken = ref(null) -const createToken = () => { - service.create({}) - .then(r => { - tokens.value.push(r) - newToken.value = r - }) +const createToken = async () => { + const r = await service.create({}) + tokens.value.push(r) + newToken.value = r } -const deleteToken = (token: CaldavTokenModel) => { - service.delete(token) - // @ts-ignore - .then(r => { - success(r) - // @ts-ignore - const i = tokens.value.findIndex(v => v.id === token.id) - // @ts-ignore - tokens.value.splice(i, 1) - }) +const deleteToken = async (token: CaldavTokenModel) => { + const r = await service.delete(token) + success(r) + // @ts-ignore + const i = tokens.value.findIndex(v => v.id === token.id) + // @ts-ignore + tokens.value.splice(i, 1) } -- 2.45.1 From 524da627d5de6dca7a77dd5f4176196cedc4f77d Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 14 Dec 2021 21:36:42 +0100 Subject: [PATCH 08/20] chore: extract getting all tokens into a composable --- src/views/user/settings/Caldav.vue | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 6d887a96f..3c7d5a473 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -78,6 +78,16 @@ import Message from '@/components/misc/message.vue' import CaldavTokenService from '@/services/caldavToken' import CaldavTokenModel from '@/models/caldavToken' +const service = new CaldavTokenService() + +async function useToken() { + const tokens = ref([]) + tokens.value = await service.getAll() + return tokens +} + +const tokens = useToken() + const store = useStore() const {t} = useI18n() @@ -88,13 +98,6 @@ const caldavEnabled = computed(() => store.state.config.caldavEnabled) const isLocalUser = computed(() => store.state.auth.info?.isLocalUser) const username = computed(() => store.state.auth.info?.username) -const service = new CaldavTokenService() -const tokens = ref([]) -service.getAll() - .then((r: CaldavTokenModel[]) => { - tokens.value = r - }) - const newToken = ref(null) const createToken = async () => { const r = await service.create({}) -- 2.45.1 From cb121e8bf58d27a4dd56b17274c442a91e8d27c3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 14 Dec 2021 21:39:16 +0100 Subject: [PATCH 09/20] fix: lint --- src/views/user/settings/Caldav.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 3c7d5a473..a8d8a4d90 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -37,7 +37,7 @@
- +
{{ $t('misc.created') }} {{ $t('misc.actions') }}
{{ tk.id }} {{ formatDateShort(tk.created) }} -- 2.45.1 From 2e178c969c0de02752d0ca007293372dbd4e3edd Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 20 Dec 2021 18:32:32 +0100 Subject: [PATCH 10/20] fix: type --- src/views/user/settings/Caldav.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index a8d8a4d90..7f6cf06a5 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -80,7 +80,7 @@ import CaldavTokenModel from '@/models/caldavToken' const service = new CaldavTokenService() -async function useToken() { +async function useToken(): ref { const tokens = ref([]) tokens.value = await service.getAll() return tokens @@ -108,9 +108,7 @@ const createToken = async () => { const deleteToken = async (token: CaldavTokenModel) => { const r = await service.delete(token) success(r) - // @ts-ignore const i = tokens.value.findIndex(v => v.id === token.id) - // @ts-ignore tokens.value.splice(i, 1) } -- 2.45.1 From 6e881fa3bc61999d204b9a0aae7c3c85ff700f89 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 20 Dec 2021 18:32:57 +0100 Subject: [PATCH 11/20] chore: check for no results --- src/views/user/settings/Caldav.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 7f6cf06a5..8f18ca437 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -9,10 +9,10 @@
@@ -109,6 +109,9 @@ const deleteToken = async (token: CaldavTokenModel) => { const r = await service.delete(token) success(r) const i = tokens.value.findIndex(v => v.id === token.id) + if (i === -1) { + return + } tokens.value.splice(i, 1) } -- 2.45.1 From c97fff86dacf67b583c43b57f4f5b5773c2cf064 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 20 Dec 2021 18:39:01 +0100 Subject: [PATCH 12/20] chore: use function statements everywhere --- src/views/user/settings/Caldav.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 8f18ca437..e785436a2 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -99,13 +99,14 @@ const isLocalUser = computed(() => store.state.auth.info?.isLocalUser) const username = computed(() => store.state.auth.info?.username) const newToken = ref(null) -const createToken = async () => { + +async function createToken() { const r = await service.create({}) tokens.value.push(r) newToken.value = r } -const deleteToken = async (token: CaldavTokenModel) => { +async function deleteToken(token: CaldavTokenModel) { const r = await service.delete(token) success(r) const i = tokens.value.findIndex(v => v.id === token.id) -- 2.45.1 From 95598a28ae2162b21b5700c51714b6536eb7ab74 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:30:44 +0100 Subject: [PATCH 13/20] chore: move success message after state changes --- src/views/user/settings/Caldav.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index e785436a2..eb2e69f42 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -108,11 +108,11 @@ async function createToken() { async function deleteToken(token: CaldavTokenModel) { const r = await service.delete(token) - success(r) const i = tokens.value.findIndex(v => v.id === token.id) if (i === -1) { return } tokens.value.splice(i, 1) + success(r) } -- 2.45.1 From d71a21901202d62e5cfe270cbd3f7b2a439ae157 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:32:24 +0100 Subject: [PATCH 14/20] chore: fix CalDAV casing --- src/i18n/lang/en.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 96af22d89..94418bed7 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -103,15 +103,15 @@ "disableSuccess": "Two factor authentication was sucessfully disabled." }, "caldav": { - "title": "Caldav", - "howTo": "You can connect Vikunja to caldav clients to view and manage all tasks from different clients. Enter this url into your client:", - "more": "More information about caldav in Vikunja", - "tokens": "Caldav Tokens", - "tokensHowTo": "You can use a caldav token to use instead of a password to log in the above endpoint.", + "title": "CalDAV", + "howTo": "You can connect Vikunja to CalDAV clients to view and manage all tasks from different clients. Enter this url into your client:", + "more": "More information about CalDAV in Vikunja", + "tokens": "CalDAV Tokens", + "tokensHowTo": "You can use a CalDAV token to use instead of a password to log in the above endpoint.", "createToken": "Create a token", "tokenCreated": "Here is your token: {token}", "wontSeeItAgain": "Write it down, you won't be able to see it again.", - "mustUseToken": "You need to create a caldav token if you want to use caldav with a third party client. Use the token as the password.", + "mustUseToken": "You need to create a CalDAV token if you want to use CalDAV with a third party client. Use the token as the password.", "usernameIs": "Your username is: {0}" }, "avatar": { -- 2.45.1 From 1a8184a01b35995508e4d0a74819c57bb500ba84 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:34:36 +0100 Subject: [PATCH 15/20] chore: return new model instead of modifying the existing --- src/services/caldavToken.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/services/caldavToken.js b/src/services/caldavToken.js index 2c124ade6..6e4397655 100644 --- a/src/services/caldavToken.js +++ b/src/services/caldavToken.js @@ -12,8 +12,10 @@ export default class CaldavTokenService extends AbstractService { } processModel(model) { - model.created = formatISO(new Date(model.created)) - return model + return { + ...model, + created: formatISO(new Date(model.created)), + } } modelFactory(data) { -- 2.45.1 From fc6fbff6e349745e741081485d3fe5f176fc64e1 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:36:54 +0100 Subject: [PATCH 16/20] chore: use h5 --- src/views/user/settings/Caldav.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index eb2e69f42..fd568ca09 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -17,9 +17,9 @@ -

+

{{ $t('user.settings.caldav.tokens') }} -

+

{{ isLocalUser ? $t('user.settings.caldav.tokensHowTo') : $t('user.settings.caldav.mustUseToken') }} -- 2.45.1 From 2c2631faacb1704d92012817b8556f4a71ba371f Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:43:15 +0100 Subject: [PATCH 17/20] chore: rename to useTokens --- src/views/user/settings/Caldav.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index fd568ca09..4e3b0bdb1 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -80,13 +80,13 @@ import CaldavTokenModel from '@/models/caldavToken' const service = new CaldavTokenService() -async function useToken(): ref { +async function useTokens(): ref { const tokens = ref([]) tokens.value = await service.getAll() return tokens } -const tokens = useToken() +const tokens = useTokens() const store = useStore() const {t} = useI18n() -- 2.45.1 From f2005a9826d4a2f454a6d182580d7a8619999c7e Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:54:27 +0100 Subject: [PATCH 18/20] chore: directly use newToken.value --- src/views/user/settings/Caldav.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 4e3b0bdb1..945a03f32 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -101,9 +101,8 @@ const username = computed(() => store.state.auth.info?.username) const newToken = ref(null) async function createToken() { - const r = await service.create({}) - tokens.value.push(r) - newToken.value = r + newToken.value = await service.create({}) + tokens.value.push(newToken.value) } async function deleteToken(token: CaldavTokenModel) { -- 2.45.1 From 0c4253be3aef7431aba153ddbab3ef912d7893b8 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 26 Dec 2021 11:56:59 +0100 Subject: [PATCH 19/20] chore: use .then instead of await --- src/views/user/settings/Caldav.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index 945a03f32..a81761b3d 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -80,9 +80,12 @@ import CaldavTokenModel from '@/models/caldavToken' const service = new CaldavTokenService() -async function useTokens(): ref { +function useTokens(): ref { const tokens = ref([]) - tokens.value = await service.getAll() + service.getAll() + .then((t: CaldavTokenModel[]) => { + tokens.value = t + }) return tokens } -- 2.45.1 From ce479b40769d4a116694b39a4d552e561a84b8d9 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Wed, 5 Jan 2022 00:13:16 +0100 Subject: [PATCH 20/20] chore: use BaseButton --- src/views/user/settings/Caldav.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/user/settings/Caldav.vue b/src/views/user/settings/Caldav.vue index a81761b3d..6c663d8a3 100644 --- a/src/views/user/settings/Caldav.vue +++ b/src/views/user/settings/Caldav.vue @@ -58,9 +58,9 @@

- + {{ $t('user.settings.caldav.more') }} - +

@@ -74,6 +74,7 @@ import {useStore} from 'vuex' import {CALDAV_DOCS} from '@/urls' import {useTitle} from '@/composables/useTitle' import {success} from '@/message' +import BaseButton from '@/components/base/BaseButton.vue' import Message from '@/components/misc/message.vue' import CaldavTokenService from '@/services/caldavToken' import CaldavTokenModel from '@/models/caldavToken' -- 2.45.1