From f7eb1605092301921632d6df6996d5ee35e35661 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 28 Nov 2021 16:04:38 +0100 Subject: [PATCH 001/580] fix: move forgot password link next to password label In some languages, the texts on the "log in" and "register" buttons were so long they wrapped underneath each other. Moving the "forgot password" link next to the password label leaves these two buttons enough space to always stay next to each other. --- src/views/user/Login.vue | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/views/user/Login.vue b/src/views/user/Login.vue index 127e673a2..2a4ae3f47 100644 --- a/src/views/user/Login.vue +++ b/src/views/user/Login.vue @@ -20,11 +20,21 @@ autocomplete="username" v-focus @keyup.enter="submit" + tabindex="1" />
- +
@@ -52,6 +63,7 @@ type="text" v-focus @keyup.enter="submit" + tabindex="3" /> @@ -61,6 +73,7 @@ {{ $t('user.auth.login') }} @@ -68,15 +81,11 @@ :to="{ name: 'user.register' }" v-if="registrationEnabled" type="secondary" + tabindex="5" > {{ $t('user.auth.register') }} -
- - {{ $t('user.auth.forgotPassword') }} - -
@@ -227,6 +236,15 @@ export default { .reset-password-link { display: inline-block; - padding-top: 5px; +} + +.label-with-link { + display: flex; + justify-content: space-between; + margin-bottom: .5rem; + + .label { + margin-bottom: 0; + } } From 05e054f501be1a73d63788468a995f092d279e43 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 28 Nov 2021 16:33:03 +0100 Subject: [PATCH 002/580] feat: improve input validation for register form --- src/helpers/isEmail.ts | 6 +++++ src/i18n/lang/en.json | 6 +++-- src/icons.js | 4 +++ src/views/user/Register.vue | 49 +++++++++++++++++++++++++++++++++---- 4 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/helpers/isEmail.ts diff --git a/src/helpers/isEmail.ts b/src/helpers/isEmail.ts new file mode 100644 index 000000000..08957d0f0 --- /dev/null +++ b/src/helpers/isEmail.ts @@ -0,0 +1,6 @@ +export function isEmail(email: string): Boolean { + const format = /^.+@.+$/ + const match = email.match(format) + + return match === null ? false : match.length > 0 +} diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 56a4bd113..2aeea991e 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -34,7 +34,6 @@ "email": "E-mail address", "emailPlaceholder": "e.g. frederic{'@'}vikunja.io", "password": "Password", - "passwordRepeat": "Retype your password", "passwordPlaceholder": "e.g. •••••••••••", "forgotPassword": "Forgot your password?", "resetPassword": "Reset your password", @@ -50,7 +49,10 @@ "authenticating": "Authenticating…", "openIdStateError": "State does not match, refusing to continue!", "openIdGeneralError": "An error occured while authenticating against the third party.", - "logout": "Logout" + "logout": "Logout", + "emailInvalid": "Please enter a valid email address.", + "usernameRequired": "Please provide a username.", + "passwordRequired": "Please provide a password." }, "settings": { "title": "Settings", diff --git a/src/icons.js b/src/icons.js index 48ef230c6..89e1d1a3e 100644 --- a/src/icons.js +++ b/src/icons.js @@ -16,6 +16,8 @@ import { faCocktail, faCoffee, faCog, + faEye, + faEyeSlash, faEllipsisH, faEllipsisV, faExclamation, @@ -87,6 +89,8 @@ library.add(faCocktail) library.add(faCoffee) library.add(faCog) library.add(faComments) +library.add(faEye) +library.add(faEyeSlash) library.add(faEllipsisH) library.add(faEllipsisV) library.add(faExclamation) diff --git a/src/views/user/Register.vue b/src/views/user/Register.vue index ef9f4a153..a3a74da74 100644 --- a/src/views/user/Register.vue +++ b/src/views/user/Register.vue @@ -18,8 +18,12 @@ v-focus v-model="credentials.username" @keyup.enter="submit" + @focusout="validateUsername" /> +

+ {{ $t('user.auth.usernameRequired') }} +

@@ -33,12 +37,16 @@ type="email" v-model="credentials.email" @keyup.enter="submit" + @focusout="validateEmail" />
+

+ {{ $t('user.auth.emailInvalid') }} +

-
+
+

+ {{ $t('user.auth.passwordRequired') }} +

@@ -76,6 +88,7 @@ id="register-submit" @click="submit" class="mr-2" + :disabled="!everythingValid" > {{ $t('user.auth.register') }} @@ -89,12 +102,14 @@ + + From 1d916e7e03add8f8a4f8e809eed7600080bd3579 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 28 Nov 2021 16:35:59 +0100 Subject: [PATCH 004/580] feat: change wording --- src/i18n/lang/en.json | 6 +++--- src/router/index.ts | 2 +- src/views/user/Login.vue | 2 +- src/views/user/Register.vue | 5 +---- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 2aeea991e..2c1fdf261 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -31,7 +31,7 @@ "username": "Username", "usernameEmail": "Username Or Email Address", "usernamePlaceholder": "e.g. frederick", - "email": "E-mail address", + "email": "Email address", "emailPlaceholder": "e.g. frederic{'@'}vikunja.io", "password": "Password", "passwordPlaceholder": "e.g. •••••••••••", @@ -44,7 +44,7 @@ "totpTitle": "Two Factor Authentication Code", "totpPlaceholder": "e.g. 123456", "login": "Login", - "register": "Register", + "createAccount": "Create account", "loginWith": "Log in with {provider}", "authenticating": "Authenticating…", "openIdStateError": "State does not match, refusing to continue!", @@ -63,7 +63,7 @@ "currentPasswordPlaceholder": "Your current password", "passwordsDontMatch": "The new password and its confirmation don't match.", "passwordUpdateSuccess": "The password was successfully updated.", - "updateEmailTitle": "Update Your E-Mail Address", + "updateEmailTitle": "Update Your Email Address", "updateEmailNew": "New Email Address", "updateEmailSuccess": "Your email address was successfully updated. We've sent you a link to confirm it.", "general": { diff --git a/src/router/index.ts b/src/router/index.ts index 21e4a96a3..cf126b5ab 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -132,7 +132,7 @@ const router = createRouter({ name: 'user.register', component: RegisterComponent, meta: { - title: 'user.auth.register', + title: 'user.auth.createAccount', }, }, { diff --git a/src/views/user/Login.vue b/src/views/user/Login.vue index 2a4ae3f47..b525cf02f 100644 --- a/src/views/user/Login.vue +++ b/src/views/user/Login.vue @@ -83,7 +83,7 @@ type="secondary" tabindex="5" > - {{ $t('user.auth.register') }} + {{ $t('user.auth.createAccount') }}
diff --git a/src/views/user/Register.vue b/src/views/user/Register.vue index dbe5d4827..ea78f24b0 100644 --- a/src/views/user/Register.vue +++ b/src/views/user/Register.vue @@ -77,7 +77,7 @@ class="mr-2" :disabled="!everythingValid" > - {{ $t('user.auth.register') }} + {{ $t('user.auth.createAccount') }} {{ $t('user.auth.login') }} @@ -91,7 +91,6 @@ - - From fda0b81d9c653a1a93803a98582ebe9b10f3f433 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 11 Dec 2021 21:57:54 +0100 Subject: [PATCH 007/580] feat: add tooltip and aria-label --- src/i18n/lang/en.json | 4 +++- src/views/user/Login.vue | 6 +++++- src/views/user/Register.vue | 6 +++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 2c1fdf261..7fecb029d 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -52,7 +52,9 @@ "logout": "Logout", "emailInvalid": "Please enter a valid email address.", "usernameRequired": "Please provide a username.", - "passwordRequired": "Please provide a password." + "passwordRequired": "Please provide a password.", + "showPassword": "Show the password", + "hidePassword": "Hide the password" }, "settings": { "title": "Settings", diff --git a/src/views/user/Login.vue b/src/views/user/Login.vue index 145e2c665..6be2e7839 100644 --- a/src/views/user/Login.vue +++ b/src/views/user/Login.vue @@ -53,7 +53,11 @@ tabindex="2" @focusout="validateField('password')" /> - + diff --git a/src/views/user/Register.vue b/src/views/user/Register.vue index ce9942201..29ebed5bf 100644 --- a/src/views/user/Register.vue +++ b/src/views/user/Register.vue @@ -59,7 +59,11 @@ @keyup.enter="submit" @focusout="validatePassword" /> - + From a1814ea29d74631f7befb5d51d85b2a16d1741a3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 11 Dec 2021 22:08:26 +0100 Subject: [PATCH 008/580] fix: message spacing --- src/views/user/Login.vue | 11 +++++++++-- src/views/user/PasswordReset.vue | 4 ++-- src/views/user/Register.vue | 2 +- src/views/user/RequestPasswordReset.vue | 4 ++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/views/user/Login.vue b/src/views/user/Login.vue index 6be2e7839..a59805f06 100644 --- a/src/views/user/Login.vue +++ b/src/views/user/Login.vue @@ -1,9 +1,9 @@ From 6d62ca1adaf4be5f94dac1a3840834e881b30aa3 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Tue, 7 Dec 2021 19:40:50 +0100 Subject: [PATCH 057/580] fix: check now just once --- src/views/list/ListGantt.vue | 17 +++++++++++------ src/views/tasks/ShowTasks.vue | 16 +++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/views/list/ListGantt.vue b/src/views/list/ListGantt.vue index f5278a344..15b11747f 100644 --- a/src/views/list/ListGantt.vue +++ b/src/views/list/ListGantt.vue @@ -68,21 +68,26 @@ import { ref, computed } from 'vue' import flatPickr from 'vue-flatpickr-component' -import { i18n } from '@/i18n' -import { store } from '@/store' +import { useI18n } from 'vue-i18n' +import { useStore } from 'vuex' import ListWrapper from './ListWrapper' import GanttChart from '@/components/tasks/gantt-component' import Fancycheckbox from '@/components/input/fancycheckbox' +const DEFAULT_DAY_COUNT = 35 + const showTaskswithoutDates = ref(false) -const dayWidth = ref(35) -const dateFrom = ref(new Date((new Date()).setDate((new Date()).getDate() - 15))) -const dateTo = ref(new Date((new Date()).setDate((new Date()).getDate() + 30))) +const dayWidth = ref(DEFAULT_DAY_COUNT) +const now = ref(new Date()) +const dateFrom = ref(new Date((new Date()).setDate(now.value.getDate() - 15))) +const dateTo = ref(new Date((new Date()).setDate(now.value.getDate() + 30))) +const {t} = useI18n() +const {store} = useStore() const flatPickerConfig = computed(() => ({ - altFormat: i18n.global.t('date.altFormatShort'), + altFormat: t('date.altFormatShort'), altInput: true, dateFormat: 'Y-m-d', enableTime: false, diff --git a/src/views/tasks/ShowTasks.vue b/src/views/tasks/ShowTasks.vue index d4f06ba33..9b1399840 100644 --- a/src/views/tasks/ShowTasks.vue +++ b/src/views/tasks/ShowTasks.vue @@ -231,23 +231,25 @@ export default { }, setDatesToNextWeek() { - this.cStartDate = new Date() - this.cEndDate = new Date((new Date()).getTime() + 7 * 24 * 60 * 60 * 1000) + const now = new Date() + this.cStartDate = now + this.cEndDate = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000) this.showOverdue = false this.setDate() }, setDatesToNextMonth() { - this.cStartDate = new Date() - this.cEndDate = new Date((new Date()).setMonth((new Date()).getMonth() + 1)) + const now = new Date() + this.cStartDate = now + this.cEndDate = new Date((new Date()).setMonth(now.getMonth() + 1)) this.showOverdue = false this.setDate() }, showTodaysTasks() { - const d = new Date() - this.cStartDate = new Date() - this.cEndDate = new Date(d.setDate(d.getDate() + 1)) + const now = new Date() + this.cStartDate = now + this.cEndDate = new Date((new Date()).setDate(now.getDate() + 1)) this.showOverdue = true this.setDate() }, From 5916a44724ca237daf13e6ac396f27451bfb5887 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Fri, 10 Dec 2021 15:29:28 +0100 Subject: [PATCH 058/580] feat: provide listId prop via router --- src/components/home/contentAuth.vue | 29 +++- src/composables/taskList.js | 168 ++++++++++++------------ src/router/index.ts | 15 +++ src/views/list/ListGantt.vue | 21 ++- src/views/list/ListKanban.vue | 29 ++-- src/views/list/ListList.vue | 32 +++-- src/views/list/ListTable.vue | 138 +++++++------------ src/views/list/ListWrapper.vue | 39 +++--- src/views/tasks/TaskDetailView.vue | 12 +- src/views/tasks/TaskDetailViewModal.vue | 13 +- 10 files changed, 263 insertions(+), 233 deletions(-) diff --git a/src/components/home/contentAuth.vue b/src/components/home/contentAuth.vue index ba69adacb..48f6a3e84 100644 --- a/src/components/home/contentAuth.vue +++ b/src/components/home/contentAuth.vue @@ -44,7 +44,7 @@ \ No newline at end of file From cc3fcdf1c3557885ae230f0a1d37cce8e292eb78 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 18 Jan 2022 21:33:10 +0100 Subject: [PATCH 075/580] fix: keyboard shortcut message bottom margin --- src/components/misc/keyboard-shortcuts/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/misc/keyboard-shortcuts/index.vue b/src/components/misc/keyboard-shortcuts/index.vue index 3164dade1..a5fae200b 100644 --- a/src/components/misc/keyboard-shortcuts/index.vue +++ b/src/components/misc/keyboard-shortcuts/index.vue @@ -4,7 +4,7 @@ diff --git a/src/components/home/navigation.vue b/src/components/home/navigation.vue index adf0bff95..9780e4f78 100644 --- a/src/components/home/navigation.vue +++ b/src/components/home/navigation.vue @@ -1,6 +1,6 @@ diff --git a/src/components/misc/subscription.vue b/src/components/misc/subscription.vue index a141d44b2..c00d6271c 100644 --- a/src/components/misc/subscription.vue +++ b/src/components/misc/subscription.vue @@ -1,19 +1,19 @@ From 6ff621ada174bdf0ce52272714e08283ef366230 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Sun, 30 Jan 2022 16:58:59 +0100 Subject: [PATCH 172/580] chore: ignore wrong second argument argument for cause see: https://github.com/tc39/proposal-error-cause --- src/helpers/auth.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/helpers/auth.ts b/src/helpers/auth.ts index b073a8caf..81cd55806 100644 --- a/src/helpers/auth.ts +++ b/src/helpers/auth.ts @@ -53,6 +53,7 @@ export async function refreshToken(persist: boolean): Promise { return response } catch(e) { + // @ts-ignore throw new Error('Error renewing token: ', { cause: e }) } } From a325e4b721ddee156ae6c7ca9dca414b36f3fdaa Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Sun, 30 Jan 2022 16:35:03 +0100 Subject: [PATCH 173/580] feat: use es2022 for @typescript-eslint/parser --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5afb88de8..06143399c 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "parser": "vue-eslint-parser", "parserOptions": { "parser": "@typescript-eslint/parser", - "ecmaVersion": 2021 + "ecmaVersion": 2022 }, "ignorePatterns": [ "*.test.*", From 81cf8f2f299f045e24a0810ca23f0c231e6ae2a9 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 30 Jan 2022 16:17:03 +0000 Subject: [PATCH 174/580] feat(tests): replace cypress-file-upload with .selectFile() (#1460) Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/1460 Co-authored-by: konrad Co-committed-by: konrad --- cypress/integration/user/settings.spec.js | 8 +++++--- cypress/support/index.js | 1 - package.json | 3 +-- yarn.lock | 5 ----- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/cypress/integration/user/settings.spec.js b/cypress/integration/user/settings.spec.js index c6a645d59..21bd9c1d9 100644 --- a/cypress/integration/user/settings.spec.js +++ b/cypress/integration/user/settings.spec.js @@ -8,12 +8,14 @@ describe('User Settings', () => { }) it('Changes the user avatar', () => { + cy.intercept(`${Cypress.env('API_URL')}/user/settings/avatar/upload`).as('uploadAvatar') + cy.visit('/user/settings/avatar') cy.get('input[name=avatarProvider][value=upload]') .click() - cy.get('input[type=file]', { timeout: 1000 }) - .attachFile('image.jpg') + cy.get('input[type=file]', {timeout: 1000}) + .selectFile('cypress/fixtures/image.jpg', {force: true}) // The input is not visible, but on purpose cy.get('.vue-handler-wrapper.vue-handler-wrapper--south .vue-simple-handler.vue-simple-handler--south') .trigger('mousedown', {which: 1}) .trigger('mousemove', {clientY: 100}) @@ -22,7 +24,7 @@ describe('User Settings', () => { .contains('Upload Avatar') .click() - cy.wait(3000) // Wait for the request to finish + cy.wait('@uploadAvatar') cy.get('.global-notification') .should('contain', 'Success') }) diff --git a/cypress/support/index.js b/cypress/support/index.js index 0c885c654..7b0c56d18 100644 --- a/cypress/support/index.js +++ b/cypress/support/index.js @@ -1,6 +1,5 @@ import './commands' -import 'cypress-file-upload' import '@4tw/cypress-drag-drop' // see https://github.com/cypress-io/cypress/issues/702#issuecomment-587127275 diff --git a/package.json b/package.json index 5afb88de8..263a324d6 100644 --- a/package.json +++ b/package.json @@ -72,13 +72,12 @@ "browserslist": "4.19.1", "caniuse-lite": "1.0.30001304", "cypress": "9.3.1", - "cypress-file-upload": "5.0.8", "esbuild": "0.14.14", "eslint": "8.8.0", "eslint-plugin-vue": "8.4.0", "express": "4.17.2", - "netlify-cli": "8.13.0", "happy-dom": "2.30.1", + "netlify-cli": "8.13.0", "postcss": "8.4.5", "postcss-preset-env": "7.2.3", "rollup": "2.66.1", diff --git a/yarn.lock b/yarn.lock index 55188f78a..a54c7dcac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5215,11 +5215,6 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -cypress-file-upload@5.0.8: - version "5.0.8" - resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1" - integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g== - cypress@9.3.1: version "9.3.1" resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.3.1.tgz#8116f52d49d6daf90a91e88f3eafd940234d2958" From 0bd235cea37678aba52eb1d74d43d23d1f266dc2 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Sun, 30 Jan 2022 17:24:38 +0100 Subject: [PATCH 175/580] fix: expose configureCompat types see: https://github.com/vuejs/docs/pull/1475 --- src/types/shims-vue.d.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/types/shims-vue.d.ts b/src/types/shims-vue.d.ts index 4f0571df7..c04ff091d 100644 --- a/src/types/shims-vue.d.ts +++ b/src/types/shims-vue.d.ts @@ -1,8 +1,11 @@ declare module 'vue' { import { CompatVue } from '@vue/runtime-dom' const Vue: CompatVue - export default Vue - export * from '@vue/runtime-dom' + export default Vue + export * from '@vue/runtime-dom' + + const { configureCompat } = Vue + export { configureCompat } } // https://next.vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html#typescript-support From ea710e227a4937ff0bc26ee95e76da083239596a Mon Sep 17 00:00:00 2001 From: renovate Date: Sun, 30 Jan 2022 18:13:34 +0000 Subject: [PATCH 176/580] chore(deps): update dependency happy-dom to v2.31.0 (#1461) Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/1461 Co-authored-by: renovate Co-committed-by: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 263a324d6..2063c472a 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "eslint": "8.8.0", "eslint-plugin-vue": "8.4.0", "express": "4.17.2", - "happy-dom": "2.30.1", + "happy-dom": "2.31.0", "netlify-cli": "8.13.0", "postcss": "8.4.5", "postcss-preset-env": "7.2.3", diff --git a/yarn.lock b/yarn.lock index a54c7dcac..486767c86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7380,10 +7380,10 @@ graphql@^16.1.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.2.0.tgz#de3150e80f1fc009590b92a9d16ab1b46e12b656" integrity sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA== -happy-dom@2.30.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-2.30.1.tgz#afc77ed8969ad5d49de266ec1b3e2055a1eabe76" - integrity sha512-Qz3Z/zn/VeUCtVEGoSCDD+zzPcyOEdIYz4p1BvsXvrTSx6vXyGadMDAsxOKf8ZFCRfuyLpLKfqdRHFFPF77qPA== +happy-dom@2.31.0: + version "2.31.0" + resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-2.31.0.tgz#1b858aabd9c33ba431f16f616a642a1461fd4295" + integrity sha512-xWMINbteuSF6hkmetrreuXK+r0vBBdRknqwaqDxrjIV6aQBlUcMBvTX/2dZ+KwP5vjrDrqCeop5dPOgQpebHgw== dependencies: he "^1.1.1" node-fetch "^2.6.1" From 8f04b10e089bd73bc2b98569fe3d353fb43f1851 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 20:15:53 +0100 Subject: [PATCH 177/580] Revert "fix: improve ListModel typing" This reverts commit 98b41a22c6824b069f4b1d7e7609e128ba13d240. --- src/models/list.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/models/list.js b/src/models/list.js index 3f6b08734..b5a08e814 100644 --- a/src/models/list.js +++ b/src/models/list.js @@ -5,22 +5,6 @@ import {getSavedFilterIdFromListId} from '@/helpers/savedFilter' import SubscriptionModel from '@/models/subscription' export default class ListModel extends AbstractModel { - id = 0 - title = '' - description = '' - owner = UserModel - tasks = [] - namespaceId = 0 - isArchived = false - hexColor = '' - identifier = '' - backgroundInformation = null - isFavorite = false - subscription = null - position = 0 - - created = null - updated = null constructor(data) { super(data) From 2a819eccb48cc41bece2d9cadec31b8f56e72399 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 20:18:34 +0100 Subject: [PATCH 178/580] revert: model properties partially reverts de3c47dc69fa0c80f83004eab1f6bd455cb4ea9e --- src/models/attachment.js | 6 ------ src/models/subscription.js | 6 ------ src/models/task.js | 7 ------- 3 files changed, 19 deletions(-) diff --git a/src/models/attachment.js b/src/models/attachment.js index 655ed3a30..e1ee9aa83 100644 --- a/src/models/attachment.js +++ b/src/models/attachment.js @@ -3,12 +3,6 @@ import UserModel from './user' import FileModel from './file' export default class AttachmentModel extends AbstractModel { - id = 0 - taskId = 0 - file = FileModel - createdBy = UserModel - created = null - constructor(data) { super(data) this.createdBy = new UserModel(this.createdBy) diff --git a/src/models/subscription.js b/src/models/subscription.js index e580545e4..68d0be855 100644 --- a/src/models/subscription.js +++ b/src/models/subscription.js @@ -2,12 +2,6 @@ import AbstractModel from '@/models/abstractModel' import UserModel from '@/models/user' export default class SubscriptionModel extends AbstractModel { - id = 0 - entity = '' - entityId = 0 - created = null - user = UserModel - constructor(data) { super(data) this.user = new UserModel(this.user) diff --git a/src/models/task.js b/src/models/task.js index 1f2e4b130..638396898 100644 --- a/src/models/task.js +++ b/src/models/task.js @@ -10,13 +10,6 @@ import {parseDateOrNull} from '@/helpers/parseDateOrNull' const SUPPORTS_TRIGGERED_NOTIFICATION = 'Notification' in window && 'showTrigger' in Notification.prototype export default class TaskModel extends AbstractModel { - index = 0 - done = false - priority = 0 - percentDone = 0 - - defaultColor = '198CFF' - constructor(data) { super(data) From 9995abf64cc5c69496d55308435c143d00356c1e Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 22:11:21 +0100 Subject: [PATCH 180/580] fix: mark broken test as skipped --- cypress/integration/list/list-history.spec.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cypress/integration/list/list-history.spec.js b/cypress/integration/list/list-history.spec.js index ba8d69e06..f6ff5b034 100644 --- a/cypress/integration/list/list-history.spec.js +++ b/cypress/integration/list/list-history.spec.js @@ -2,7 +2,10 @@ import {ListFactory} from '../../factories/list' import '../../support/authenticateUser' -describe('List History', () => { +// Skipped, because there is some kind of race condition which makes this test fail, but only in CI. +// We have tried to debug and fix it but with no luck. Since we have a unit test for this functionality +// anyway, it should be fine to mark this as skipped for now and fix it at some later point. +describe.skip('List History', () => { it('should show a list history on the home page', () => { cy.intercept(Cypress.env('API_URL') + '/namespaces*').as('loadNamespaces') cy.intercept(Cypress.env('API_URL') + '/lists/*').as('loadList') From c21f2362498f6e01c3cf6a37e5e5bedd7871adde Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 30 Jan 2022 21:33:27 +0000 Subject: [PATCH 181/580] feat: add cypress dashboard record (#1462) Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/1462 Co-authored-by: konrad Co-committed-by: konrad --- .drone.yml | 6 ++++-- cypress.json | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 4090e6a8f..a85f44f5d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -116,10 +116,12 @@ steps: YARN_CACHE_FOLDER: .cache/yarn/ CYPRESS_CACHE_FOLDER: .cache/cypress/ CYPRESS_DEFAULT_COMMAND_TIMEOUT: 60000 + CYPRESS_RECORD_KEY: + from_secret: cypress_project_key commands: - sed -i 's/localhost/api/g' dist/index.html - yarn serve:dist & npx wait-on http://localhost:5000 - - yarn test:frontend --browser chrome + - yarn test:frontend --browser chrome --record depends_on: - dependencies - build-prod @@ -665,6 +667,6 @@ steps: from_secret: crowdin_key --- kind: signature -hmac: 188ee90100c5fc5922a445e531e7a47453121edddb2a64a182eb23ed2bf602de +hmac: e8748058b09d57b4d9f53dc40fb163f1719a4177d392439a62b1c198ba1502a0 ... diff --git a/cypress.json b/cypress.json index 27f12495c..28fd022c1 100644 --- a/cypress.json +++ b/cypress.json @@ -7,5 +7,6 @@ "video": false, "retries": { "runMode": 2 - } + }, + "projectId": "181c7x" } From 92864fa5c18f95902668599ecce0dfb6b671e7ca Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 22:35:17 +0100 Subject: [PATCH 182/580] chore(tests): remove test result upload to s3 since we now have cypress dashboard --- .drone.yml | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/.drone.yml b/.drone.yml index a85f44f5d..a75220205 100644 --- a/.drone.yml +++ b/.drone.yml @@ -126,28 +126,6 @@ steps: - dependencies - build-prod - - name: upload-test-results - image: plugins/s3 - pull: true - settings: - bucket: drone-test-results - access_key: - from_secret: test_results_aws_access_key_id - secret_key: - from_secret: test_results_aws_secret_access_key - endpoint: https://s3.fr-par.scw.cloud - region: fr-par - path_style: true - source: cypress/screenshots/**/**/* - strip_prefix: cypress/screenshots/ - target: /${DRONE_REPO}/${DRONE_PULL_REQUEST}_${DRONE_BRANCH}/${DRONE_BUILD_NUMBER}/ - depends_on: - - test-frontend - when: - status: - - failure - - success - - name: deploy-preview image: node:16 pull: true @@ -667,6 +645,6 @@ steps: from_secret: crowdin_key --- kind: signature -hmac: e8748058b09d57b4d9f53dc40fb163f1719a4177d392439a62b1c198ba1502a0 +hmac: 997e1badebe484ac29557c4af356e63db4d3d57f3d32e92d482f117f8cec64da ... From b7c8138ad54382be2a35ba21bf94abfa9425b02b Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 22:47:59 +0100 Subject: [PATCH 183/580] fix(tests): make sure to create all lists before doing anything --- cypress/integration/list/list-view-gantt.spec.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cypress/integration/list/list-view-gantt.spec.js b/cypress/integration/list/list-view-gantt.spec.js index ddfc5de4f..69805a30d 100644 --- a/cypress/integration/list/list-view-gantt.spec.js +++ b/cypress/integration/list/list-view-gantt.spec.js @@ -1,9 +1,12 @@ import {formatISO, format} from 'date-fns' import {TaskFactory} from '../../factories/task' +import {prepareLists} from './prepareLists' import '../../support/authenticateUser' describe('List View Gantt', () => { + prepareLists() + it('Hides tasks with no dates', () => { const tasks = TaskFactory.create(1) cy.visit('/lists/1/gantt') From a5b0a834bc01147a5cd4ed3c04e799c833ef6a62 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 22:51:29 +0100 Subject: [PATCH 184/580] fix(tests): make sure the namespace exists before trying to run the history tests If there's no namespace, there is no lists in state to show in the view. The CI runs all tests from a blank state which isn't the case when running the tests locally. Therefore, if the test doesn't create a new namespace, there won't be any to test for. --- cypress/integration/list/list-history.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cypress/integration/list/list-history.spec.js b/cypress/integration/list/list-history.spec.js index f6ff5b034..b7633cbda 100644 --- a/cypress/integration/list/list-history.spec.js +++ b/cypress/integration/list/list-history.spec.js @@ -1,11 +1,11 @@ import {ListFactory} from '../../factories/list' import '../../support/authenticateUser' +import {prepareLists} from './prepareLists' -// Skipped, because there is some kind of race condition which makes this test fail, but only in CI. -// We have tried to debug and fix it but with no luck. Since we have a unit test for this functionality -// anyway, it should be fine to mark this as skipped for now and fix it at some later point. -describe.skip('List History', () => { +describe('List History', () => { + prepareLists() + it('should show a list history on the home page', () => { cy.intercept(Cypress.env('API_URL') + '/namespaces*').as('loadNamespaces') cy.intercept(Cypress.env('API_URL') + '/lists/*').as('loadList') From 00ffe17eb838981bdca013a7731e9f8e2056f705 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 23:07:31 +0100 Subject: [PATCH 185/580] fix: related task with the same namespace --- src/components/tasks/partials/relatedTasks.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/tasks/partials/relatedTasks.vue b/src/components/tasks/partials/relatedTasks.vue index c22bfc43a..80c04e044 100644 --- a/src/components/tasks/partials/relatedTasks.vue +++ b/src/components/tasks/partials/relatedTasks.vue @@ -274,10 +274,11 @@ export default { return tasks .map(task => { // by doing this here once we can save a lot of duplicate calls in the template + const listAndNamespace = this.$store.getters['namespaces/getListAndNamespaceById'](task.listId, true) const { list, namespace, - } = this.$store.getters['namespaces/getListAndNamespaceById'](task.listId, true) + } = listAndNamespace === null ? {list: null, namespace: null} : listAndNamespace return { ...task, From 20a9ad2c9efea59a1752bae170744f500cba9092 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 23:12:42 +0100 Subject: [PATCH 186/580] fix: related task within the same namespace --- src/components/tasks/partials/relatedTasks.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/tasks/partials/relatedTasks.vue b/src/components/tasks/partials/relatedTasks.vue index 0b2be060b..9f65455b7 100644 --- a/src/components/tasks/partials/relatedTasks.vue +++ b/src/components/tasks/partials/relatedTasks.vue @@ -274,10 +274,11 @@ export default { return tasks .map(task => { // by doing this here once we can save a lot of duplicate calls in the template + const listAndNamespace = this.$store.getters['namespaces/getListAndNamespaceById'](task.listId, true) const { list, namespace, - } = this.$store.getters['namespaces/getListAndNamespaceById'](task.listId, true) + } = listAndNamespace === null ? {list: null, namespace: null} : listAndNamespace return { ...task, From 3e311e07cdd603d970b834fa5de6b8c926c474dd Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 30 Jan 2022 23:18:13 +0100 Subject: [PATCH 187/580] fix: undefined prop subscription --- src/views/tasks/TaskDetailView.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index 96ee95d9f..ed1c0eb28 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -263,7 +263,7 @@ {{ task.done ? $t('task.detail.undone') : $t('task.detail.done') }} Date: Sun, 30 Jan 2022 23:27:22 +0100 Subject: [PATCH 188/580] fix: make isButton prop optional --- src/components/misc/subscription.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/misc/subscription.vue b/src/components/misc/subscription.vue index 8288bd038..dbda373ea 100644 --- a/src/components/misc/subscription.vue +++ b/src/components/misc/subscription.vue @@ -37,7 +37,7 @@ interface Props { entity: string entityId: number subscription: SubscriptionModel - isButton: boolean + isButton?: boolean } const props = withDefaults(defineProps(), { From de626eab31e092ad9364876996575071260e705d Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Wed, 19 Jan 2022 23:58:54 +0100 Subject: [PATCH 189/580] feat: don't open task detail in modal for list and table view --- src/components/home/contentAuth.vue | 34 ++++++++++++------- .../tasks/partials/singleTaskInList.vue | 3 +- src/router/index.ts | 4 +-- src/views/list/ListTable.vue | 6 ++-- src/views/tasks/TaskDetailViewModal.vue | 15 +++----- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/components/home/contentAuth.vue b/src/components/home/contentAuth.vue index 276ddb6f0..d98b0fa97 100644 --- a/src/components/home/contentAuth.vue +++ b/src/components/home/contentAuth.vue @@ -1,8 +1,12 @@ -
+
\ No newline at end of file diff --git a/src/views/tasks/UpcomingTasks.vue b/src/views/tasks/UpcomingTasks.vue new file mode 100644 index 000000000..46b823cbe --- /dev/null +++ b/src/views/tasks/UpcomingTasks.vue @@ -0,0 +1,9 @@ + + + \ No newline at end of file From ecf679d8e191de6a35152b9d8ec0fd6cb31f3cb6 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 5 Feb 2022 21:14:40 +0100 Subject: [PATCH 222/580] chore: completely move logic of ShowTasksInRange component to ShowTasks and remove it --- src/router/index.ts | 4 ++-- src/views/tasks/ShowTasks.vue | 2 +- src/views/tasks/UpcomingTasks.vue | 9 --------- 3 files changed, 3 insertions(+), 12 deletions(-) delete mode 100644 src/views/tasks/UpcomingTasks.vue diff --git a/src/router/index.ts b/src/router/index.ts index 6e4ccce26..ddcb7d2cf 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -13,7 +13,7 @@ import RegisterComponent from '../views/user/Register.vue' import OpenIdAuth from '../views/user/OpenIdAuth.vue' import DataExportDownload from '../views/user/DataExportDownload.vue' // Tasks -import ShowTasksInRangeComponent from '../views/tasks/ShowTasksInRange.vue' +import UpcomingTasksComponent from '../views/tasks/ShowTasks.vue' import LinkShareAuthComponent from '../views/sharing/LinkSharingAuth.vue' import ListNamespaces from '../views/namespaces/ListNamespaces.vue' import TaskDetailView from '../views/tasks/TaskDetailView.vue' @@ -248,7 +248,7 @@ const router = createRouter({ { path: '/tasks/by/upcoming', name: 'tasks.range', - component: ShowTasksInRangeComponent, + component: UpcomingTasksComponent, }, { path: '/lists/new/:namespaceId/', diff --git a/src/views/tasks/ShowTasks.vue b/src/views/tasks/ShowTasks.vue index ee8f9dcd0..d0e2ee6cb 100644 --- a/src/views/tasks/ShowTasks.vue +++ b/src/views/tasks/ShowTasks.vue @@ -1,6 +1,6 @@