Compare commits

...

1074 Commits

Author SHA1 Message Date
Elix 0cc55420ea Merge pull request 'main' (#1) from vikunja/frontend:main into main
Reviewed-on: #1
2022-06-11 15:29:06 +00:00
kolaente 9bbc1bf939
fix: show a proper error message when no list or default list was specified 2022-06-11 13:59:19 +02:00
renovate 5f27aa984d chore(deps): update dependency vite to v2.9.12 (#2040)
Reviewed-on: vikunja/frontend#2040
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-11 11:38:07 +00:00
renovate 01e8891306 chore(deps): update dependency cypress to v10.1.0 (#2042)
Reviewed-on: vikunja/frontend#2042
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-11 11:37:21 +00:00
renovate 75f06ed99a chore(deps): update dependency eslint-plugin-vue to v9.1.1 (#2043)
Reviewed-on: vikunja/frontend#2043
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-11 11:36:15 +00:00
renovate 074ba08192 chore(deps): update dependency sass to v1.52.3 (#2038)
Reviewed-on: vikunja/frontend#2038
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-11 11:35:37 +00:00
renovate c3e7d19e88 chore(deps): update dependency vitest to v0.14.2 (#2041)
Reviewed-on: vikunja/frontend#2041
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-11 11:33:46 +00:00
renovate c5fafecde0 fix(deps): update dependency vue-router to v4.0.16 (#2039)
Reviewed-on: vikunja/frontend#2039
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-09 22:35:30 +00:00
renovate 8c0cadd6f5 chore(deps): update dependency happy-dom to v5.2.0 (#2037)
Reviewed-on: vikunja/frontend#2037
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 21:32:09 +00:00
kolaente d1f22c5b43
fix: use grey-100 instead of light so that it is properly set in dark mode 2022-06-08 23:00:03 +02:00
kolaente 9716517ffa
fix: pride logo rounded corners on mobile 2022-06-08 22:55:00 +02:00
kolaente a2c0696753
fix: top header still in foreground when menu is open 2022-06-08 22:21:02 +02:00
renovate dcb4e57768 fix(deps): update sentry-javascript monorepo to v7.1.1 (#2034)
Reviewed-on: vikunja/frontend#2034
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 18:45:36 +00:00
k2s d308d665bd fix: sed replacement of SENTRY_DSN (#2036)
In log: `vikunja-frontend-1  | sed: -e expression #1, char 46: unknown option to `s'`

We need to escape the VIKUNJA_SENTRY_DSN content or change sed separator to character that will not be used in sentry DNS string which I did in this commit.

Signed-off-by: k2s <martin.minka@gmail.com>

Co-authored-by: k2s <martin.minka@gmail.com>
Reviewed-on: vikunja/frontend#2036
Reviewed-by: konrad <k@knt.li>
Co-authored-by: k2s <k2s@noreply.kolaente.de>
Co-committed-by: k2s <k2s@noreply.kolaente.de>
2022-06-08 18:44:46 +00:00
renovate 831693d895 fix(deps): update dependency codemirror to v6 (#2035)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#2035
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 18:44:09 +00:00
renovate 0f4e6fa3f2 chore(deps): update dependency cypress to v10 (#2015)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#2015
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 18:18:34 +00:00
renovate 505587ad44 chore(deps): update dependency @fortawesome/vue-fontawesome to v3.0.0 (#2031)
Reviewed-on: vikunja/frontend#2031
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 05:10:23 +00:00
renovate 73772a39d8 chore(deps): update yarn to v1.22.19 (#2032)
Reviewed-on: vikunja/frontend#2032
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 05:08:59 +00:00
renovate b7ca56d2b7 chore(deps): update dependency esbuild to v0.14.43 (#2033)
Reviewed-on: vikunja/frontend#2033
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-08 05:08:22 +00:00
renovate 338addd3f7 chore(deps): update dependency typescript to v4.7.3 (#2019)
Reviewed-on: vikunja/frontend#2019
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 19:35:27 +00:00
renovate 20711c3bae chore(deps): update dependency vue-tsc to v0.37.3 (#2021)
Reviewed-on: vikunja/frontend#2021
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 19:34:59 +00:00
renovate eed3a74ba9 chore(deps): update dependency rollup to v2.75.6 (#2030)
Reviewed-on: vikunja/frontend#2030
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 19:33:24 +00:00
kolaente c7fb8fc7f2
chore: update browserslist at most weekly and group it 2022-06-07 20:16:14 +02:00
renovate a843536862 fix(deps): update sentry-javascript monorepo to v7 (major) (#2013)
Reviewed-on: vikunja/frontend#2013
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:16:06 +00:00
renovate 6c43ee9da7 chore(deps): update dependency vite to v2.9.10 (#2027)
Reviewed-on: vikunja/frontend#2027
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:12:01 +00:00
renovate 0e1def72fa chore(deps): update typescript-eslint monorepo to v5.27.1 (#2028)
Reviewed-on: vikunja/frontend#2028
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:11:39 +00:00
renovate fcae53e821 fix(deps): update dependency vue to v3.2.37 (#2026)
Reviewed-on: vikunja/frontend#2026
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:11:13 +00:00
renovate f99d8cd56c chore(deps): update dependency vitest to v0.14.1 (#2022)
Reviewed-on: vikunja/frontend#2022
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:10:33 +00:00
renovate 3ddbf7e23e fix(deps): update dependency vue-i18n to v9.2.0-beta.36 (#2025)
Reviewed-on: vikunja/frontend#2025
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:10:09 +00:00
renovate 8a9f2a3fbd chore(deps): update dependency browserslist to v4.20.4 (#2029)
Reviewed-on: vikunja/frontend#2029
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:09:25 +00:00
renovate 084039d891 chore(deps): update dependency eslint to v8.17.0 (#2020)
Reviewed-on: vikunja/frontend#2020
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:08:53 +00:00
renovate 54dd0419b2 chore(deps): update dependency postcss-preset-env to v7.7.1 (#2018)
Reviewed-on: vikunja/frontend#2018
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-07 18:06:35 +00:00
renovate 25da6966cd chore(deps): update dependency sass to v1.52.2 (#2017)
Reviewed-on: vikunja/frontend#2017
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-03 06:45:59 +00:00
renovate 236bc3404a chore(deps): update dependency vue-tsc to v0.36.0 (#2016)
Reviewed-on: vikunja/frontend#2016
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-03 06:45:36 +00:00
kolaente 6fc87e1515
feat: add print styles 2022-06-02 23:00:21 +02:00
renovate 1deb0a58bd fix(deps): update dependency codemirror to v5.65.5 2022-06-02 10:35:19 +00:00
renovate c10103ce68 chore(deps): update dependency rollup to v2.75.5 (#2006)
Reviewed-on: vikunja/frontend#2006
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-02 05:15:02 +00:00
renovate a3f1996369 chore(deps): update dependency eslint to v8.16.0 (#2003)
Reviewed-on: vikunja/frontend#2003
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-02 05:14:26 +00:00
renovate 5dde73fec5 chore(deps): update dependency happy-dom to v5 (#2012)
Reviewed-on: vikunja/frontend#2012
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-02 05:13:49 +00:00
renovate 8aaa17cdbf chore(deps): update dependency vitest to v0.13.1 (#1914)
Reviewed-on: vikunja/frontend#1914
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-02 05:13:04 +00:00
renovate 836a064c0a chore(deps): update typescript-eslint monorepo to v5.27.0 (#2009)
Reviewed-on: vikunja/frontend#2009
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:04:49 +00:00
renovate cc31526324 chore(deps): update dependency vue-tsc to v0.35.2 (#2008)
Reviewed-on: vikunja/frontend#2008
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:04:10 +00:00
renovate 92dc1bd8da chore(deps): update dependency typescript to v4.7.2 (#2007)
Reviewed-on: vikunja/frontend#2007
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:03:33 +00:00
renovate 8f3a671fde fix(deps): update vueuse to v8.6.0 (#2010)
Reviewed-on: vikunja/frontend#2010
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:02:55 +00:00
renovate 3d62909536 chore(deps): update dependency postcss-preset-env to v7.7.0 (#2005)
Reviewed-on: vikunja/frontend#2005
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:02:21 +00:00
renovate 982d05886b chore(deps): update dependency happy-dom to v4.1.0 (#2004)
Reviewed-on: vikunja/frontend#2004
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:01:46 +00:00
renovate e297033a29 chore(deps): update dependency eslint-plugin-vue to v9.1.0 (#2014)
Reviewed-on: vikunja/frontend#2014
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-06-01 17:00:49 +00:00
konrad efed128f03 fix: rely on api to properly sort tasks on home page (#1997)
This PR changes the behaviour of how tasks are sorted. Before, the frontend would sort tasks but this resulted in some cases where tasks were not sorted properly. Most of this is test code to reliably reproduce the problem and make fixing it easier.
The actual bug was in Vikunja's api, therefore I've removed all sorting of tasks in the frontend and ensured the api properly sorts tasks.

Fixes https://github.com/go-vikunja/frontend/issues/54

Depends on vikunja/api#1177

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1997
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-06-01 16:59:59 +00:00
renovate 402b0b2acf fix(deps): update dependency vue to v3.2.36 (#2001)
Reviewed-on: vikunja/frontend#2001
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-31 19:44:59 +00:00
renovate fab115096f chore(deps): update dependency sass to v1.52.1 (#1999)
Reviewed-on: vikunja/frontend#1999
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-31 19:20:55 +00:00
renovate 6940e6cc7f chore(deps): update dependency esbuild to v0.14.42 (#1998)
Reviewed-on: vikunja/frontend#1998
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-31 19:20:34 +00:00
Dominik Pschenitschni 1cc2632fd8 [skip ci] Updated translations via Crowdin 2022-05-30 00:21:12 +00:00
Dominik Pschenitschni d996e39a86 feat: OpenIdAuth script setup 2022-05-27 17:41:35 +00:00
drone 5ab0a4755c [skip ci] Updated translations via Crowdin 2022-05-25 00:21:01 +00:00
kolaente 72c123f3f9
feat: add alt+r shortcut to bring up reminder input on task detail view 2022-05-23 22:58:54 +02:00
kolaente 745d4660d8
fix: properly reference task input textarea from parent component
Resolves #1993
2022-05-23 22:33:43 +02:00
kolaente cadcaa966f
fix: new label text color in dark mode 2022-05-23 22:27:26 +02:00
Dominik Pschenitschni 5ef939a230 feature/fix-vue-i18n-9.2.31 (#1994)
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1994
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-23 05:23:59 +00:00
Dominik Pschenitschni 1569042471
fix: replace vue.draggable.next with zhyswan-draggable
Reason: Author doesn't maintain vue port anymore.
See: https://github.com/SortableJS/vue.draggable.next/issues/140#issuecomment-1123622724=
2022-05-22 23:44:16 +02:00
Dominik Pschenitschni 53dc7d12f7
feat: remove vue3 compat mode 2022-05-22 23:44:16 +02:00
kolaente e1e410b50b
fix: quick actions not properly styled 2022-05-22 23:15:01 +02:00
Dominik Pschenitschni ae4c73b6eb feat: linkSharing script setup (#1977)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1977
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 20:52:13 +00:00
Dominik Pschenitschni 1d869a0497 feat: defer-task script setup (#1929)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1929
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 20:50:03 +00:00
Dominik Pschenitschni e6af4772fb feat: vue-easymde script setup (#1983)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1983
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 20:44:22 +00:00
Dominik Pschenitschni c7f8ae256b feat: description script setup (#1927)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1927
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 20:42:24 +00:00
Dominik Pschenitschni b4aa65018c fix: watcher in listSearch (#1992)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1992
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 20:35:02 +00:00
Dominik Pschenitschni f91424f693 fix: button prop type (#1966)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1966
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 15:49:37 +00:00
Dominik Pschenitschni 297d283090 feat: improve colorIsDark helper
(also improve contrast of white label text)
2022-05-22 15:44:45 +00:00
Dominik Pschenitschni 72925fb938 fix: repeatAfter initial modelValue 2022-05-22 15:44:27 +00:00
Dominik Pschenitschni 17b77c25c1 feat: ListTeams script setup 2022-05-22 15:44:05 +00:00
Dominik Pschenitschni cdf359da00 feat: edit-task script setup 2022-05-22 15:43:46 +00:00
Dominik Pschenitschni 93b2482d4c feat: archive list script setup 2022-05-22 15:32:52 +00:00
Dominik Pschenitschni 27f7541b25 feat: Migrate script setup 2022-05-22 15:32:34 +00:00
Dominik Pschenitschni c1e4eba7f5 feat: TOTP script setup 2022-05-22 15:32:10 +00:00
Dominik Pschenitschni 829eed0b9f fix: problem with newTaskInput ref (#1986)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1986
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 15:13:12 +00:00
Dominik Pschenitschni c6ee8a04e2 feat: remove bulma styles 2022-05-22 15:11:47 +00:00
Dominik Pschenitschni 5291fc1192 feat: NewList script setup (#1989)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1989
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 15:10:44 +00:00
Dominik Pschenitschni 96fce73192 fix: disabled attribute fallback (#1984)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1984
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 15:08:37 +00:00
Dominik Pschenitschni 235967844a fix: throw error messages in dev mode (#1968)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1968
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 15:06:50 +00:00
Dominik Pschenitschni 6bab1088c7 feat: make user settings links config driven (#1990)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1990
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 15:03:09 +00:00
Dominik Pschenitschni 0e41b78712 feat: userTeam script setup (#1976)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1976
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-22 14:59:43 +00:00
Dominik Pschenitschni 2c270d063e feat: user General script setup (#1938)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1938
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-20 05:36:08 +00:00
renovate acaaa8e188 chore(deps): update dependency sass to v1.52.0 (#1965)
Reviewed-on: vikunja/frontend#1965
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-20 05:29:58 +00:00
Dominik Pschenitschni d11fae1c38 feat: user DataExport script setup 2022-05-19 20:44:43 +00:00
renovate 470a4a9270 chore(deps): update dependency rollup to v2.74.1 2022-05-19 19:03:12 +00:00
renovate fd0554d644 chore(deps): update dependency postcss-preset-env to v7.6.0 2022-05-19 18:35:06 +00:00
renovate f621ac280d chore(deps): update dependency happy-dom to v4 2022-05-19 16:03:08 +00:00
renovate 4afdcadc89 fix(deps): update dependency vue to v3.2.34 (#1960)
Reviewed-on: vikunja/frontend#1960
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-19 05:31:05 +00:00
renovate d749ec85dc chore(deps): update dependency eslint-plugin-vue to v9 (#1958)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1958
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-18 20:17:48 +00:00
renovate c96df86d7e fix(deps): update dependency marked to v4.0.16 (#1956)
Reviewed-on: vikunja/frontend#1956
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-18 17:53:35 +00:00
renovate d578fac206 chore(deps): update typescript-eslint monorepo to v5.25.0 (#1957)
Reviewed-on: vikunja/frontend#1957
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-18 17:53:08 +00:00
renovate 35d555da45 chore(deps): update dependency postcss to v8.4.14 (#1959)
Reviewed-on: vikunja/frontend#1959
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-18 17:52:38 +00:00
drone 0a0818ae69 [skip ci] Updated translations via Crowdin 2022-05-17 00:25:06 +00:00
renovate 57a1f6df25 chore(deps): update typescript-eslint monorepo to v5.24.0 (#1955)
Reviewed-on: vikunja/frontend#1955
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-16 20:58:46 +00:00
renovate a8e6983773 chore(deps): update dependency happy-dom to v3.2.2 (#1954)
Reviewed-on: vikunja/frontend#1954
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-16 16:30:18 +00:00
renovate d8081378f0 chore(deps): update dependency netlify-cli to v10.3.1 (#1952)
Reviewed-on: vikunja/frontend#1952
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-16 07:17:26 +00:00
renovate 0c2e9183c1 chore(deps): update dependency caniuse-lite to v1.0.30001341 (#1951)
Reviewed-on: vikunja/frontend#1951
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-16 05:52:12 +00:00
renovate c39bf996c8 fix(deps): update vueuse to v8.5.0 (#1953)
Reviewed-on: vikunja/frontend#1953
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-16 05:51:48 +00:00
renovate 1f83b23458 chore(deps): update dependency happy-dom to v3.2.1 (#1949)
Reviewed-on: vikunja/frontend#1949
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-16 05:51:13 +00:00
drone 1a141acde9 [skip ci] Updated translations via Crowdin 2022-05-16 00:23:27 +00:00
kolaente 9936d3683e
fix: very long words overflowing in descriptions and comments 2022-05-15 22:51:43 +02:00
kolaente 246d6794d8
feat: add success message after deleting a comment 2022-05-15 22:43:31 +02:00
kolaente fee2fe76ce
fix: navbar user dropdown spacing on mobile 2022-05-15 22:38:51 +02:00
kolaente e3373d2e4e
fix: update banner spacing 2022-05-15 22:33:19 +02:00
kolaente 90bb800346
fix: user menu not properly positioned on mobile
The user menu was behind the actual content of the page on mobile devices. That made it unusable.
2022-05-15 22:32:57 +02:00
kolaente 44dc8983c8
fix: direct state mutation when adding another reminder to a task 2022-05-15 22:19:29 +02:00
kolaente 138b06752f
fix: allow clicking on confirm for a date without requiring to click on another input field 2022-05-15 22:17:26 +02:00
renovate c5c980e1b1 chore(deps): update dependency vue-tsc to v0.34.15 (#1948)
Reviewed-on: vikunja/frontend#1948
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-15 19:42:11 +00:00
Dominik Pschenitschni 8d785cbf29 feat: percentDoneSelect script setup (#1922)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1922
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 15:07:04 +00:00
Dominik Pschenitschni 4b6015da99 fix: import in PasswordReset (#1923)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1923
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 15:05:49 +00:00
Dominik Pschenitschni 49a73a154b feat: checklist-summary script setup (#1924)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1924
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 15:05:12 +00:00
Dominik Pschenitschni 99d1c40cfd feat: prioritySelect script setup (#1925)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1925
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 15:04:04 +00:00
Dominik Pschenitschni 1bf378608e feat quick-add-magic script setup (#1926)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1926
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 15:02:41 +00:00
Dominik Pschenitschni 6737bb37b4 feat: repeatAfter script setup (#1928)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1928
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:58:21 +00:00
Dominik Pschenitschni 9a42713b04 feat: comments script setup (#1930)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1930
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:55:17 +00:00
Dominik Pschenitschni 72e43b7bbf feat: editAssignees script setup (#1931)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1931
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:52:29 +00:00
Dominik Pschenitschni 6538a3591e feat: EmailUpdate script setup (#1932)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1932
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:51:33 +00:00
Dominik Pschenitschni 3ecd1d8db6 feat: user PasswordUpdate script setup (#1933)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1933
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:50:52 +00:00
Dominik Pschenitschni 0a89e8dc6b feat: task reminders script setup (#1934)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1934
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:49:53 +00:00
Dominik Pschenitschni fe698a6f84 feat: user Avatar script setup (#1935)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1935
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:48:29 +00:00
Dominik Pschenitschni 76826855e4 feat: user deletion script setup (#1936)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1936
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:45:45 +00:00
Dominik Pschenitschni 9a4e0117b2 feat: editLabels script setup (#1940)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1940
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-05-14 14:36:08 +00:00
renovate 2b521b4c68 chore(deps): update dependency @vitejs/plugin-vue to v2.3.3 (#1941)
Reviewed-on: vikunja/frontend#1941
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-14 14:33:59 +00:00
renovate d34e685b99 chore(deps): update dependency vite to v2.9.9 (#1942)
Reviewed-on: vikunja/frontend#1942
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-14 14:33:16 +00:00
renovate c5b7b0de78 fix(deps): update dependency dompurify to v2.3.8 (#1943)
Reviewed-on: vikunja/frontend#1943
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-14 14:32:57 +00:00
renovate da809cbd7e chore(deps): update dependency esbuild to v0.14.39 (#1944)
Reviewed-on: vikunja/frontend#1944
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-14 14:32:25 +00:00
renovate abffef75e3 chore(deps): update dependency vue-tsc to v0.34.13 (#1945)
Reviewed-on: vikunja/frontend#1945
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-14 14:32:10 +00:00
renovate 51c0918566 chore(deps): update dependency rollup to v2.73.0 (#1946)
Reviewed-on: vikunja/frontend#1946
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-14 14:31:21 +00:00
renovate 6357498751 chore(deps): update dependency happy-dom to v3.2.0 (#1921)
Reviewed-on: vikunja/frontend#1921
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-10 20:26:10 +00:00
renovate c98c4ac7f3 chore(deps): update dependency vue-tsc to v0.34.12 (#1920)
Reviewed-on: vikunja/frontend#1920
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-10 09:30:46 +00:00
renovate 4b738f7ff8 chore(deps): update dependency cypress to v9.6.1 (#1917)
Reviewed-on: vikunja/frontend#1917
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-09 18:18:00 +00:00
renovate c8484b0ae1 chore(deps): update typescript-eslint monorepo to v5.23.0 (#1918)
Reviewed-on: vikunja/frontend#1918
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-09 18:17:27 +00:00
renovate 29db688f2c chore(deps): update dependency netlify-cli to v10.3.0 (#1916)
Reviewed-on: vikunja/frontend#1916
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-09 07:48:27 +00:00
kolaente 1d9665fb84
fix: lint 2022-05-09 08:15:53 +02:00
renovate ce94f76b78 fix(deps): update dependency @types/sortablejs to v1.13.0 (#1915)
Reviewed-on: vikunja/frontend#1915
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-08 22:16:16 +00:00
kolaente f1c9887243
fix: active color for editor buttons 2022-05-08 23:31:38 +02:00
kolaente 4b0d491359
fix: remove workarounds to properly overlay the top menu bar over everything else 2022-05-08 23:26:07 +02:00
kolaente 0007c30672
feat: move filter popup to a modal 2022-05-08 22:39:23 +02:00
kolaente b2c2118c58
chore: convert update available component to ts and script setup 2022-05-08 22:06:48 +02:00
kolaente 315da424ec
chore: refactor notifications component to use ts and setup 2022-05-08 12:17:02 +02:00
kolaente 3e7f598ee8
fix: use a new notification service on every poll to make sure it uses a non-expired token 2022-05-08 12:04:48 +02:00
kolaente a38bd7e971
fix: list title not set as page title after closing a task popup 2022-05-08 11:58:37 +02:00
kolaente 21a8298a96
fix: list views not switchable on link share mobile 2022-05-08 11:15:36 +02:00
kolaente c2694dc089
fix: filter button alignments and backgrounds for link shares 2022-05-08 11:13:19 +02:00
renovate 7e4f58214a chore(deps): update dependency rollup to v2.72.1 (#1913)
Reviewed-on: vikunja/frontend#1913
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-08 07:16:25 +00:00
renovate 46bebb961a chore(deps): update dependency eslint to v8.15.0 (#1912)
Reviewed-on: vikunja/frontend#1912
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-07 05:12:11 +00:00
kolaente 1a98305969
fix: tooltip color in dark mode 2022-05-06 22:18:30 +02:00
kolaente 2dba9e6e57
fix: list hover background in dark mode 2022-05-06 22:16:54 +02:00
kolaente ce3f285224
fix: spacing between username and notification 2022-05-06 22:14:38 +02:00
kolaente 24aca5cfa6
fix: favorite task list spacing in menu 2022-05-06 22:07:31 +02:00
kolaente 8846b2f862
fix: list dropdown menu item hover background color 2022-05-06 22:05:03 +02:00
renovate 04273439ce fix(deps): update dependency ufo to v0.8.4 (#1911)
Reviewed-on: vikunja/frontend#1911
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-06 16:35:08 +00:00
renovate af0b6139dc chore(deps): update dependency vitest to v0.10.5 (#1910)
Reviewed-on: vikunja/frontend#1910
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-06 12:19:47 +00:00
konrad ae93bbd781 chore: change dependency update frequencies 2022-05-06 06:27:40 +00:00
renovate 9b77d04d87 chore(deps): update dependency caniuse-lite to v1.0.30001338 (#1909)
Reviewed-on: vikunja/frontend#1909
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-06 06:21:35 +00:00
renovate 460c28ee98 chore(deps): update dependency caniuse-lite to v1.0.30001337 (#1908)
Reviewed-on: vikunja/frontend#1908
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-06 05:12:52 +00:00
renovate be1782fbe8 fix(deps): update dependency @vueuse/core to v8.4.2 (#1905)
Reviewed-on: vikunja/frontend#1905
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-05 21:04:19 +00:00
renovate 11c540f4fb chore(deps): update dependency happy-dom to v3.1.1 (#1904)
Reviewed-on: vikunja/frontend#1904
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-05 18:52:12 +00:00
renovate bf3ed75667 chore(deps): update dependency vitest to v0.10.4 (#1906)
Reviewed-on: vikunja/frontend#1906
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-05 18:51:36 +00:00
renovate 2988327001 fix(deps): update dependency @vueuse/router to v8.4.2 (#1907)
Reviewed-on: vikunja/frontend#1907
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-05 18:51:09 +00:00
renovate 09872b68dc chore(deps): update dependency caniuse-lite to v1.0.30001336 (#1903)
Reviewed-on: vikunja/frontend#1903
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-05 09:25:25 +00:00
renovate 7c9dbd2d94 chore(deps): update dependency rollup to v2.72.0 (#1902)
Reviewed-on: vikunja/frontend#1902
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-05 05:18:45 +00:00
renovate 46ae8ad3fb chore(deps): update dependency vite to v2.9.8 (#1901)
Reviewed-on: vikunja/frontend#1901
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-04 21:32:34 +00:00
renovate 484938ab18 chore(deps): update dependency @vitejs/plugin-vue to v2.3.2 (#1900)
Reviewed-on: vikunja/frontend#1900
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-04 21:31:51 +00:00
renovate c7ea7ee698 fix(deps): update dependency @vueuse/router to v8.4.1 (#1899)
Reviewed-on: vikunja/frontend#1899
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-04 12:46:26 +00:00
renovate f9452b97e6 fix(deps): update dependency @vueuse/core to v8.4.1 (#1898)
Reviewed-on: vikunja/frontend#1898
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-04 11:16:10 +00:00
renovate 92b7adfbaa fix(deps): update dependency vue-router to v4.0.15 (#1897)
Reviewed-on: vikunja/frontend#1897
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-04 10:27:36 +00:00
renovate 02a71575cf fix(deps): update dependency @vueuse/router to v8.4.0 (#1896)
Reviewed-on: vikunja/frontend#1896
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-03 19:22:36 +00:00
renovate ddf48f86fc fix(deps): update dependency @vueuse/core to v8.4.0 (#1895)
Reviewed-on: vikunja/frontend#1895
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-03 18:16:08 +00:00
renovate cf6b9bd373 chore(deps): update dependency vitest to v0.10.2 (#1893)
Reviewed-on: vikunja/frontend#1893
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-03 17:22:52 +00:00
renovate 2c4245b7cb chore(deps): update dependency postcss-preset-env to v7.5.0 (#1892)
Reviewed-on: vikunja/frontend#1892
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 20:42:33 +00:00
renovate 8e20c38d33 chore(deps): update dependency @faker-js/faker to v6.3.1 (#1891)
Reviewed-on: vikunja/frontend#1891
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 20:11:43 +00:00
renovate 90f558eb19 chore(deps): update typescript-eslint monorepo to v5.22.0 (#1890)
Reviewed-on: vikunja/frontend#1890
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 18:55:55 +00:00
renovate 26bb60cd14 chore(deps): update dependency vitest to v0.10.1 (#1889)
Reviewed-on: vikunja/frontend#1889
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 18:55:22 +00:00
renovate 1ccef6a164 chore(deps): update dependency autoprefixer to v10.4.7 (#1888)
Reviewed-on: vikunja/frontend#1888
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 16:38:47 +00:00
renovate b9a2390099 chore(deps): update dependency @faker-js/faker to v6.3.0 (#1887)
Reviewed-on: vikunja/frontend#1887
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 15:55:27 +00:00
renovate bf37992dd4 chore(deps): update dependency vite to v2.9.7 (#1886)
Reviewed-on: vikunja/frontend#1886
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 15:55:02 +00:00
renovate c5204503ea chore(deps): update dependency @vitejs/plugin-legacy to v1.8.2 (#1885)
Reviewed-on: vikunja/frontend#1885
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 15:54:36 +00:00
renovate c8f9a9a723 fix(deps): update dependency marked to v4.0.15 (#1884)
Reviewed-on: vikunja/frontend#1884
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 11:44:49 +00:00
renovate 2b946e1999 chore(deps): update dependency caniuse-lite to v1.0.30001335 (#1883)
Reviewed-on: vikunja/frontend#1883
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 11:44:13 +00:00
renovate 044f61a8d8 chore(deps): update dependency postcss to v8.4.13 (#1879)
Reviewed-on: vikunja/frontend#1879
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 11:43:36 +00:00
renovate 31aac5f18e chore(deps): update dependency rollup to v2.71.1 (#1880)
Reviewed-on: vikunja/frontend#1880
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 05:26:49 +00:00
renovate 02d88d6be3 chore(deps): update dependency autoprefixer to v10.4.6 (#1881)
Reviewed-on: vikunja/frontend#1881
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 05:26:27 +00:00
renovate bb4b4b4b6c chore(deps): update dependency netlify-cli to v10.1.0 (#1882)
Reviewed-on: vikunja/frontend#1882
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 05:25:41 +00:00
renovate e12c08f1e1 chore(deps): update dependency express to v4.18.1 (#1878)
Reviewed-on: vikunja/frontend#1878
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-05-02 05:25:12 +00:00
kolaente ed85557cf3
fix: dark mode for user and team settings 2022-05-01 22:25:15 +02:00
kolaente cbecea62ae
chore: convert edit team to script setup 2022-05-01 22:19:20 +02:00
kolaente 86efe9fd23
fix: remove user from team 2022-05-01 21:47:07 +02:00
renovate 07c07ff702 chore(deps): update dependency vue-tsc to v0.34.11 (#1877)
Reviewed-on: vikunja/frontend#1877
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-29 07:23:23 +00:00
renovate 45d8a7a2e2 chore(deps): update dependency typescript to v4.6.4 (#1876)
Reviewed-on: vikunja/frontend#1876
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-29 05:43:18 +00:00
renovate 9a3a80aa71 chore(deps): update dependency caniuse-lite to v1.0.30001334 (#1875)
vikunja/frontend#1875
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-28 08:45:43 +00:00
dependabot[bot] 400482d041
chore(deps): bump ejs from 3.1.6 to 3.1.7 (#49)
Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7.
- [Release notes](https://github.com/mde/ejs/releases)
- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-27 18:48:33 +02:00
renovate 2d4dbf2712 chore(deps): update dependency axios to v0.27.2 (#1865)
Reviewed-on: vikunja/frontend#1865
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-27 15:24:33 +00:00
drone 82785ab349 [skip ci] Updated translations via Crowdin 2022-04-27 00:25:07 +00:00
renovate cbaca19c2a chore(deps): update dependency happy-dom to v3.1.0 (#1874)
Reviewed-on: vikunja/frontend#1874
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 17:43:58 +00:00
renovate 889b8a8aaa chore(deps): update dependency vite to v2.9.6 (#1873)
Reviewed-on: vikunja/frontend#1873
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 16:48:48 +00:00
renovate 3d9aabfd6c chore(deps): update dependency postcss-preset-env to v7.4.4 (#1872)
Reviewed-on: vikunja/frontend#1872
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 16:48:04 +00:00
renovate 3282adddc8 fix(deps): update sentry-javascript monorepo to v6.19.7 (#1871)
Reviewed-on: vikunja/frontend#1871
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 15:14:07 +00:00
renovate df5da8add8 chore(deps): update dependency happy-dom to v3 (#1870)
Reviewed-on: vikunja/frontend#1870
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 13:07:26 +00:00
renovate 67aab64e98 chore(deps): update dependency browserslist to v4.20.3 (#1860)
Reviewed-on: vikunja/frontend#1860
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 06:11:35 +00:00
renovate 4e3122f0ef chore(deps): update dependency sass to v1.51.0 (#1869)
Reviewed-on: vikunja/frontend#1869
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-26 06:10:59 +00:00
drone 13319be0d2 [skip ci] Updated translations via Crowdin 2022-04-26 00:25:00 +00:00
renovate ce09d5da42 chore(deps): update dependency express to v4.18.0 (#1868)
Reviewed-on: vikunja/frontend#1868
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 21:01:45 +00:00
renovate f558441250 chore(deps): update dependency vitest to v0.10.0 (#1864)
Reviewed-on: vikunja/frontend#1864
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 21:01:01 +00:00
renovate 6e2ffaca40 chore(deps): update dependency netlify-cli to v10 (#1862)
Reviewed-on: vikunja/frontend#1862
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 21:00:08 +00:00
renovate 9da55d2ee3 chore(deps): update dependency eslint to v8.14.0 (#1855)
Reviewed-on: vikunja/frontend#1855
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 20:59:38 +00:00
renovate bbb0c02233 chore(deps): update typescript-eslint monorepo to v5.21.0 (#1867)
Reviewed-on: vikunja/frontend#1867
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 18:16:57 +00:00
renovate 0d39543785 chore(deps): update dependency cypress to v9.6.0 (#1866)
Reviewed-on: vikunja/frontend#1866
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 18:16:25 +00:00
kolaente b40d6f783c
fix: actually deleting the list now works 2022-04-25 19:59:02 +02:00
Dominik Pschenitschni 8578225982 feat: simplify namespace search (#1835)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1835
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-25 17:38:57 +00:00
renovate ddc1cff7ea chore(deps): update dependency vite-svg-loader to v3.3.0 (#1859)
Reviewed-on: vikunja/frontend#1859
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-25 16:21:53 +00:00
drone d517627340 [skip ci] Updated translations via Crowdin 2022-04-25 00:23:33 +00:00
kolaente 87d4ceddb8
fix: date filters are now correclty converted 2022-04-24 18:36:53 +02:00
kolaente 8257586c90
chore: replace the same i18n string with a single entry 2022-04-24 18:14:41 +02:00
kolaente 62adf171ec
feat: show the number of tasks we're about to remove when deleting a list 2022-04-24 18:11:10 +02:00
renovate 202f6ce1b2 chore(deps): update dependency autoprefixer to v10.4.5 (#1858)
Reviewed-on: vikunja/frontend#1858
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-24 15:38:00 +00:00
kolaente fbcf587e93
fix: progress bar alignment in task list 2022-04-24 17:30:36 +02:00
kolaente 1eaca64e2a
chore: improve error handling in dev build 2022-04-24 17:27:16 +02:00
kolaente 24701a17f5
fix: new task input focus 2022-04-24 17:26:57 +02:00
kolaente 49946b2766
fix: update notification spacing 2022-04-24 17:09:03 +02:00
kolaente 89c81ae854
fix: subscription works correctly again 2022-04-24 17:06:00 +02:00
Dominik Pschenitschni 17a42dc2e7 feat: remove copy-to-clipboard (#1797)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1797
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-23 15:58:29 +00:00
Dominik Pschenitschni 2083a52a56 fix: update nvm node version (#1856)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1856
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-23 15:55:02 +00:00
renovate c7ad5aca85 chore(deps): update dependency vue-tsc to v0.34.10 2022-04-23 14:02:32 +00:00
Dominik Pschenitschni d325810e55 fix imports 2022-04-23 11:25:49 +00:00
renovate 50e297183c chore(deps): update dependency vitest to v0.9.4 2022-04-23 11:25:49 +00:00
renovate 050f959ee8 chore(deps): update dependency eslint-plugin-vue to v8.7.1 (#1854)
Reviewed-on: vikunja/frontend#1854
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-23 10:19:49 +00:00
drone 8ff2a17db2 [skip ci] Updated translations via Crowdin 2022-04-23 00:25:08 +00:00
renovate 151089ebda chore(deps): update dependency eslint-plugin-vue to v8.7.0 (#1853)
Reviewed-on: vikunja/frontend#1853
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-22 09:00:32 +00:00
kosssi bf3e16c6ee fix: checklist summary design on home page (#1842)
Co-authored-by: Simon C <simonc@linux.com>
Reviewed-on: vikunja/frontend#1842
Reviewed-by: konrad <k@knt.li>
Co-authored-by: kosssi <kosssi@noreply.kolaente.de>
Co-committed-by: kosssi <kosssi@noreply.kolaente.de>
2022-04-22 08:07:15 +00:00
renovate 4b8b17b61f fix(deps): update dependency @vueuse/core to v8.3.1 (#1849)
Reviewed-on: vikunja/frontend#1849
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-22 07:23:48 +00:00
renovate e4978c1e89 chore(deps): update dependency esbuild to v0.14.38 (#1852)
Reviewed-on: vikunja/frontend#1852
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-22 07:23:25 +00:00
drone 19238cfe72 [skip ci] Updated translations via Crowdin 2022-04-22 00:25:03 +00:00
renovate 5f16a4a3cc fix(deps): update dependency @vueuse/router to v8.3.1 (#1850)
Reviewed-on: vikunja/frontend#1850
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-21 21:20:34 +00:00
renovate 3ed6b0c21f chore(deps): update dependency @faker-js/faker to v6.2.0 (#1851)
Reviewed-on: vikunja/frontend#1851
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-21 21:20:07 +00:00
renovate 5ae54a4af7 chore(deps): update dependency vue-tsc to v0.34.9 (#1848)
Reviewed-on: vikunja/frontend#1848
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-21 16:20:15 +00:00
renovate d23a50a347 chore(deps): update node.js to v18 (#1845)
Reviewed-on: vikunja/frontend#1845
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-21 05:15:30 +00:00
renovate b4b5623399 chore(deps): update dependency esbuild to v0.14.37 (#1846)
Reviewed-on: vikunja/frontend#1846
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-21 05:14:19 +00:00
renovate b61f5654a1 chore(deps): update dependency vue-tsc to v0.34.8 (#1847)
Reviewed-on: vikunja/frontend#1847
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-21 05:13:49 +00:00
drone 03841d641f [skip ci] Updated translations via Crowdin 2022-04-21 00:23:13 +00:00
renovate d43f1f441f fix(deps): update dependency @vueuse/core to v8.3.0 (#1843)
Reviewed-on: vikunja/frontend#1843
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 18:55:29 +00:00
renovate 600a4fa373 fix(deps): update dependency @vueuse/router to v8.3.0 (#1844)
Reviewed-on: vikunja/frontend#1844
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 16:14:20 +00:00
renovate 54afd55abf fix(deps): update dependency flatpickr to v4.6.13 (#1826)
Reviewed-on: vikunja/frontend#1826
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:36:37 +00:00
renovate 0023740c78 fix(deps): update dependency @vueuse/core to v8.2.6 (#1828)
Reviewed-on: vikunja/frontend#1828
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:35:16 +00:00
renovate 417f1f6220 chore(deps): update dependency sass to v1.50.1 (#1837)
Reviewed-on: vikunja/frontend#1837
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:34:42 +00:00
renovate f3d8908252 chore(deps): update dependency vue-tsc to v0.34.7 (#1838)
Reviewed-on: vikunja/frontend#1838
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:34:12 +00:00
renovate 763a448875 chore(deps): update dependency vite-plugin-pwa to v0.12.0 (#1839)
Reviewed-on: vikunja/frontend#1839
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:33:31 +00:00
renovate 4db4afe1bf chore(deps): update typescript-eslint monorepo to v5.20.0 (#1840)
Reviewed-on: vikunja/frontend#1840
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:32:33 +00:00
renovate 368eaf96e3 fix(deps): update dependency codemirror to v5.65.3 (#1841)
Reviewed-on: vikunja/frontend#1841
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-20 11:31:50 +00:00
drone 71b7bb5685 [skip ci] Updated translations via Crowdin 2022-04-20 00:23:16 +00:00
drone d69d34978a [skip ci] Updated translations via Crowdin 2022-04-19 21:15:42 +00:00
kolaente c962c8c3f4
fix: typos in translation files 2022-04-18 21:06:27 +02:00
renovate 8ca3934e9d chore(deps): update workbox monorepo to v6.5.3 (#1820)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1820
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-18 17:33:01 +00:00
Dominik Pschenitschni 080675b38f fix: uppercase types (#1810)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1810
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-18 17:32:40 +00:00
Dominik Pschenitschni 9c2438026b fix: remove obsolete watchEffect (#1795)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1795
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-18 17:32:21 +00:00
Dominik Pschenitschni e0023b14e8 feat: improve dropdown (#1788)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1788
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-18 17:28:43 +00:00
Dominik Pschenitschni e3483b1a5a fix: rename caldavToken to ts (#1814)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1814
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-18 17:22:19 +00:00
Dominik Pschenitschni f7e4c5819c feat: use BaseButton in PoweredByLink.vue (#1825)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1825
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-18 17:05:55 +00:00
Dominik Pschenitschni f19221cb10 chore: move Modal to misc folder (#1834)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1834
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-18 17:04:10 +00:00
renovate de1af55baa fix(deps): update dependency vue to v3.2.33 2022-04-17 18:32:43 +00:00
renovate abeee5f463 chore(deps): update dependency caniuse-lite to v1.0.30001332 2022-04-17 18:25:42 +00:00
renovate e28634f520 fix(deps): update dependency @vueuse/router to v8.2.6 2022-04-17 18:24:51 +00:00
renovate 0744ee0a20 chore(deps): update dependency vite to v2.9.5 2022-04-17 18:20:10 +00:00
renovate 8621a2db62 chore(deps): update dependency rollup to v2.70.2 2022-04-17 18:19:37 +00:00
drone 10b8bbd04c [skip ci] Updated translations via Crowdin 2022-04-16 00:45:00 +00:00
drone 109bddf936 [skip ci] Updated translations via Crowdin 2022-04-15 00:29:01 +00:00
renovate 434409f719 chore(deps): update dependency vite to v2.9.4 2022-04-13 20:07:02 +00:00
renovate 1ce89b1440 chore(deps): update dependency vite to v2.9.3 2022-04-13 17:07:13 +00:00
renovate baad9107b9 chore(deps): update dependency esbuild to v0.14.36 2022-04-13 16:53:14 +00:00
renovate 5c739aaa29 chore(deps): update dependency caniuse-lite to v1.0.30001331 2022-04-13 16:52:31 +00:00
renovate 3d8c3ab79c chore(deps): update dependency vue-tsc to v0.34.6 2022-04-13 16:49:57 +00:00
renovate db75500b55 fix(deps): update dependency vue to v3.2.32 2022-04-13 16:49:26 +00:00
renovate 4e3009f7d0 chore(deps): update dependency @vitejs/plugin-legacy to v1.8.1 2022-04-13 14:07:28 +00:00
renovate e7fb488b54 fix(deps): update dependency vue-flatpickr-component to v9.0.6 2022-04-13 05:07:06 +00:00
Dominik Pschenitschni 8473bd6a8b feat: add scroll snapping to kanban view 2022-04-11 22:09:06 +00:00
renovate c2fdd82b98 chore(deps): update dependency cypress to v9.5.4 2022-04-11 19:06:52 +00:00
renovate 6d7118e3bb chore(deps): update typescript-eslint monorepo to v5.19.0 2022-04-11 17:27:14 +00:00
renovate 8431f2eecf chore(deps): update dependency netlify-cli to v9.16.5 2022-04-11 17:21:42 +00:00
renovate a8ae257d3b fix(deps): update dependency marked to v4.0.14 2022-04-11 17:21:14 +00:00
renovate f5acc346b5 fix(deps): update dependency highlight.js to v11.5.1 2022-04-11 17:20:41 +00:00
renovate 457978dc68 chore(deps): update dependency vue-tsc to v0.34.5 2022-04-11 11:07:02 +00:00
renovate 05b19145cd chore(deps): update dependency vue-tsc to v0.34.4 2022-04-11 06:08:19 +00:00
Dominik Pschenitschni ed8eb84617 feat: improve password component (#1802)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1802
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-10 19:00:11 +00:00
Dominik Pschenitschni 53c669b108 chore: add some types (#1790)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1790
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-10 18:56:14 +00:00
Dominik Pschenitschni 656c020125 chore: fix spelling (#1786)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1786
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-10 18:55:43 +00:00
Dominik Pschenitschni b9637e1bb6 chore: simple Login view improvements (#1791)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1791
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-10 18:42:29 +00:00
renovate aff83773af chore(deps): update dependency vue-tsc to v0.34.2 (#1801)
Reviewed-on: vikunja/frontend#1801
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-10 07:48:52 +00:00
renovate 5bc230de6f chore(deps): update dependency vue-tsc to v0.34.1 2022-04-09 23:07:11 +00:00
renovate 27bee500f2 chore(deps): update dependency vue-tsc to v0.34.0 2022-04-09 21:07:05 +00:00
Dominik Pschenitschni ba1a1fc041
chore: fix type 2022-04-09 19:57:19 +02:00
renovate 0948db624f chore(deps): update dependency eslint to v8.13.0 (#1784)
Reviewed-on: vikunja/frontend#1784
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-09 04:40:35 +00:00
drone ca8a0ba8f8 [skip ci] Updated translations via Crowdin 2022-04-09 00:29:09 +00:00
renovate 329aedeb7f fix(deps): update dependency marked to v4.0.13 (#1782)
Reviewed-on: vikunja/frontend#1782
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-08 19:56:16 +00:00
renovate 081862a917 chore(deps): update dependency caniuse-lite to v1.0.30001327 (#1783)
Reviewed-on: vikunja/frontend#1783
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-08 19:55:23 +00:00
renovate 84199aa487 fix(deps): update dependency @vueuse/router to v8.2.5 (#1776)
Reviewed-on: vikunja/frontend#1776
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-07 14:23:22 +00:00
renovate 5f6abcedb7 fix(deps): update sentry-javascript monorepo to v6.19.6 (#1781)
Reviewed-on: vikunja/frontend#1781
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-07 14:22:51 +00:00
renovate 1144f3d50d chore(deps): update dependency sass to v1.50.0 (#1778)
Reviewed-on: vikunja/frontend#1778
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-07 10:01:20 +00:00
renovate 6387311c44 chore(deps): update dependency esbuild to v0.14.34 (#1779)
Reviewed-on: vikunja/frontend#1779
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-07 10:00:51 +00:00
renovate e02c81e84f fix(deps): update sentry-javascript monorepo to v6.19.5 (#1780)
Reviewed-on: vikunja/frontend#1780
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-07 10:00:08 +00:00
renovate 764f8c5d19 fix(deps): update dependency @vueuse/core to v8.2.5 (#1775)
Reviewed-on: vikunja/frontend#1775
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-07 09:59:42 +00:00
renovate 5ab2bc06ec chore(deps): update dependency eslint-plugin-vue to v8.6.0 (#1774)
Reviewed-on: vikunja/frontend#1774
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-06 07:28:04 +00:00
renovate 5e85f62fd7 chore(deps): update dependency esbuild to v0.14.32 (#1773)
Reviewed-on: vikunja/frontend#1773
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-06 07:04:42 +00:00
kolaente a46c71f916
fix(deps): upgrade minimist to 1.2.6 2022-04-05 22:55:50 +02:00
renovate aa4c25ab95 fix(deps): update sentry-javascript monorepo to v6.19.4 (#1772)
Reviewed-on: vikunja/frontend#1772
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-05 08:32:22 +00:00
renovate ee3d22e7d6 chore(deps): update typescript-eslint monorepo to v5.18.0 (#1771)
Reviewed-on: vikunja/frontend#1771
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-04 19:06:21 +00:00
renovate 61efeaf6fb chore(deps): update dependency @faker-js/faker to v6.1.2 (#1770)
Reviewed-on: vikunja/frontend#1770
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-04 19:05:55 +00:00
renovate d5ec51b9e7 chore(deps): update dependency caniuse-lite to v1.0.30001325 (#1768)
Reviewed-on: vikunja/frontend#1768
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-04 07:19:41 +00:00
renovate 9cfd2bb0ab chore(deps): update dependency esbuild to v0.14.31 (#1767)
Reviewed-on: vikunja/frontend#1767
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-04 07:19:10 +00:00
renovate 2de3d25932 chore(deps): update dependency netlify-cli to v9.16.1 (#1766)
Reviewed-on: vikunja/frontend#1766
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-04 07:18:02 +00:00
drone b8bd41c51e [skip ci] Updated translations via Crowdin 2022-04-04 00:27:16 +00:00
renovate 231cfa70a5 fix(deps): update dependency @vueuse/router to v8.2.4 (#1765)
Reviewed-on: vikunja/frontend#1765
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-03 22:23:05 +00:00
renovate c477b3518b fix(deps): update dependency @vueuse/core to v8.2.4 (#1764)
Reviewed-on: vikunja/frontend#1764
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-03 21:50:43 +00:00
kolaente 1eb19f8764
fix: resetting the list when changing from a list view to a non-list view 2022-04-03 14:28:41 +02:00
kolaente 480bfbceef
fix: reset all tasks before loading new ones 2022-04-03 14:25:29 +02:00
kolaente b2897545e4
fix: properly set list backgrounds when switching between lists
Probably caused by the blur hash feature, switching between lists would not work if the list background was set via unsplash. I've refactored the whole decision tree which checks if a background should be loaded or not. It actually does not matter where the background is from (unsplash or upload) or if we had one in the last list - we only need to know if the current list has a background or if we just changed it and need to update right away.
2022-04-03 14:20:16 +02:00
renovate eb96a5533b chore(deps): update dependency vitest to v0.8.4 (#1763)
Reviewed-on: vikunja/frontend#1763
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-03 10:56:58 +00:00
renovate ab88b7bf55 chore(deps): update dependency vitest to v0.8.3 (#1762)
Reviewed-on: vikunja/frontend#1762
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-03 08:31:31 +00:00
kolaente 010eca1d0c
fix: menu on mobile devices 2022-04-02 23:09:28 +02:00
renovate 57c585ac63 fix(deps): update dependency blurhash to v1.1.5 (#1761)
Reviewed-on: vikunja/frontend#1761
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-02 18:00:18 +00:00
renovate 83de325a94 fix(deps): pin dependencies (#1760)
Reviewed-on: vikunja/frontend#1760
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-02 16:39:13 +00:00
Dominik Pschenitschni 52fdc2614b feat: nginx improvements (#1545)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1545
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-04-02 16:12:47 +00:00
konrad 0b31cce567 feat: manage caldav tokens (#1307)
Reviewed-on: vikunja/frontend#1307
Reviewed-by: konrad <k@knt.li>
2022-04-02 15:51:42 +00:00
kolaente 58b0397cec
fix: caldavToken model typehints 2022-04-02 17:37:52 +02:00
kolaente 898b22b377
fix: create token 2022-04-02 17:37:52 +02:00
Dominik Pschenitschni b1159f331f
feat: remove duplicate rel attribute 2022-04-02 17:37:52 +02:00
Dominik Pschenitschni 50575ffd68
feat: flatten and reorder after all 2022-04-02 17:37:51 +02:00
Dominik Pschenitschni eb7667e27e
chore: use BaseButton 2022-04-02 17:37:51 +02:00
kolaente 041f888492
chore: use .then instead of await 2022-04-02 17:37:51 +02:00
kolaente 343be4d5d6
chore: directly use newToken.value 2022-04-02 17:37:51 +02:00
kolaente b9fa08116d
chore: rename to useTokens 2022-04-02 17:37:51 +02:00
kolaente 460a4dbdbe
chore: use h5 2022-04-02 17:37:51 +02:00
kolaente d865af58a8
chore: return new model instead of modifying the existing 2022-04-02 17:37:51 +02:00
kolaente cd245e467c
chore: fix CalDAV casing 2022-04-02 17:37:51 +02:00
kolaente da4f5a0f75
chore: move success message after state changes 2022-04-02 17:37:51 +02:00
kolaente ca330fe63b
chore: use function statements everywhere 2022-04-02 17:37:51 +02:00
kolaente af6385bc60
chore: check for no results 2022-04-02 17:37:51 +02:00
kolaente 19b772f8ee
fix: type 2022-04-02 17:37:50 +02:00
kolaente b65839d0d7
fix: lint 2022-04-02 17:37:50 +02:00
kolaente 043bf62ef3
chore: extract getting all tokens into a composable 2022-04-02 17:37:50 +02:00
kolaente f042651986
chore: make server functions async 2022-04-02 17:37:50 +02:00
kolaente 0299ed32f3
chore: use findIndex to remove caldav token 2022-04-02 17:37:50 +02:00
kolaente cb067461aa
chore: use ts for caldav component 2022-04-02 17:37:50 +02:00
kolaente 6b899be202
chore: clarify token is required for non-local users 2022-04-02 17:37:50 +02:00
kolaente 7bdefd9a3e
chore: put action buttons right 2022-04-02 17:37:50 +02:00
kolaente 8e5a318d4c
feat: manage tokens 2022-04-02 17:37:50 +02:00
kolaente 75f09ec5db
chore: move to script setup 2022-04-02 17:37:48 +02:00
kolaente fb2eb4c439
fix: service worker path 2022-04-02 17:23:23 +02:00
Dominik Pschenitschni 175b786ec6
fix: remove self and replace with this 2022-04-02 17:17:09 +02:00
Dominik Pschenitschni 0e14e3053d
feat: convert create-edit to script setup and ts 2022-04-02 17:17:09 +02:00
Dominik Pschenitschni 16d8c2224b
feat: add TSDoc definition to some models 2022-04-02 17:17:09 +02:00
Dominik Pschenitschni 658ca4c955
feat: convert navigation to script setup and ts 2022-04-02 17:17:08 +02:00
Dominik Pschenitschni b5f867cc66
feat: convert some helpers to typescript 2022-04-02 17:16:58 +02:00
Dominik Pschenitschni ba9f69344a
feat: use defineComponent wrapper 2022-04-02 17:16:57 +02:00
Dominik Pschenitschni a3329f1b42
feat: add lang ts to script block 2022-04-02 17:15:46 +02:00
Dominik Pschenitschni 15b67136fe
feat: rename js files to ts 2022-04-02 17:14:59 +02:00
konrad 4cff3ebee1 feat: use blurHash when loading list backgrounds (#1188)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1188
2022-04-02 15:05:30 +00:00
kolaente 53787a65df
fix: lint 2022-04-02 14:57:03 +02:00
kolaente dfed1f438a
feat: directly create a new task from relations when none was selected 2022-04-02 13:54:45 +02:00
kolaente ad8ca462cb
fix: indention of nested checklist items 2022-04-02 12:55:08 +02:00
kolaente 2e537f6d63
fix: loading list views would sometimes not get loaded
To make sure the tasks of a list are only loaded after the list itself is fetched from the server, we hide the list view until the list is fully loaded. When switching between different views of the same list, this would cause the list view to not be loaded at all because the list was already loaded at that point.

closes #1732
2022-04-02 12:47:13 +02:00
renovate 4bf016f53e chore(deps): update dependency caniuse-lite to v1.0.30001324 (#1759)
Reviewed-on: vikunja/frontend#1759
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-02 08:33:23 +00:00
renovate deff90bd8f chore(deps): update dependency sass to v1.49.11 (#1757)
Reviewed-on: vikunja/frontend#1757
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-02 07:02:46 +00:00
renovate 5dbdfd3cd5 chore(deps): update dependency esbuild to v0.14.30 (#1758)
Reviewed-on: vikunja/frontend#1758
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-02 07:02:20 +00:00
renovate 2719e93cf1 chore(deps): update dependency vitest to v0.8.2 (#1756)
Reviewed-on: vikunja/frontend#1756
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-01 20:14:17 +00:00
renovate 756104c7b5 chore(deps): update dependency happy-dom to v2.55.0 (#1755)
Reviewed-on: vikunja/frontend#1755
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-04-01 05:47:11 +00:00
renovate ddec4bd979 fix(deps): update dependency @vueuse/router to v8.2.3 (#1752)
Reviewed-on: vikunja/frontend#1752
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 21:29:57 +00:00
renovate d14d2405d6 fix(deps): update dependency @vueuse/core to v8.2.3 (#1751)
Reviewed-on: vikunja/frontend#1751
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 21:03:19 +00:00
renovate 753e03dd46 chore(deps): update dependency happy-dom to v2.54.0 (#1753)
Reviewed-on: vikunja/frontend#1753
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 21:02:55 +00:00
renovate cd9928036d fix(deps): update dependency ufo to v0.8.3 (#1754)
Reviewed-on: vikunja/frontend#1754
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 21:02:31 +00:00
renovate e29b191fbe chore(deps): update dependency vite to v2.9.1 (#1750)
Reviewed-on: vikunja/frontend#1750
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 21:02:08 +00:00
renovate e8d8767d31 fix(deps): update dependency @vueuse/router to v8.2.2 (#1745)
Reviewed-on: vikunja/frontend#1745
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 11:37:49 +00:00
renovate 2966e0846a chore(deps): update dependency vite-svg-loader to v3.2.0 (#1743)
Reviewed-on: vikunja/frontend#1743
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 11:37:30 +00:00
renovate 7870247ad1 chore(deps): update dependency @vitejs/plugin-vue to v2.3.1 (#1746)
Reviewed-on: vikunja/frontend#1746
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 11:36:59 +00:00
renovate 1f769ae3ab chore(deps): update dependency happy-dom to v2.53.0 (#1749)
Reviewed-on: vikunja/frontend#1749
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 10:37:09 +00:00
renovate c0ecde5029 chore(deps): update dependency sass to v1.49.10 (#1747)
Reviewed-on: vikunja/frontend#1747
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 10:36:43 +00:00
renovate 94be991ff6 fix(deps): update dependency @vueuse/core to v8.2.2 (#1744)
Reviewed-on: vikunja/frontend#1744
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 10:36:20 +00:00
renovate 5a27973a23 chore(deps): update dependency caniuse-lite to v1.0.30001323 (#1748)
Reviewed-on: vikunja/frontend#1748
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-31 08:41:00 +00:00
drone e494af094d [skip ci] Updated translations via Crowdin 2022-03-31 00:29:19 +00:00
renovate ae643c49d2 chore(deps): update dependency @vitejs/plugin-vue to v2.3.0 (#1739)
Reviewed-on: vikunja/frontend#1739
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 17:40:15 +00:00
renovate ab569760ef chore(deps): update dependency @vitejs/plugin-legacy to v1.8.0 (#1738)
Reviewed-on: vikunja/frontend#1738
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 15:52:38 +00:00
renovate 614f15cf4a chore(deps): update dependency vitest to v0.8.1 (#1740)
Reviewed-on: vikunja/frontend#1740
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 15:51:49 +00:00
renovate 4b1003e5e4 chore(deps): update dependency happy-dom to v2.52.0 (#1741)
Reviewed-on: vikunja/frontend#1741
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 15:51:28 +00:00
renovate 78c6d6bb1d chore(deps): update dependency vite to v2.9.0 (#1742)
Reviewed-on: vikunja/frontend#1742
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 15:50:31 +00:00
renovate 5a214ce22c chore(deps): update dependency esbuild to v0.14.29 (#1736)
Reviewed-on: vikunja/frontend#1736
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 05:59:57 +00:00
renovate 3f68121750 fix(deps): update sentry-javascript monorepo to v6.19.3 (#1735)
Reviewed-on: vikunja/frontend#1735
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-30 05:59:12 +00:00
drone f3294ce755 [skip ci] Updated translations via Crowdin 2022-03-30 00:29:13 +00:00
renovate 897ba39037 chore(deps): update dependency caniuse-lite to v1.0.30001322 (#1730)
Reviewed-on: vikunja/frontend#1730
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-29 15:25:21 +00:00
renovate 0c12c4ebd6 chore(deps): update dependency vitest to v0.8.0 (#1731)
Reviewed-on: vikunja/frontend#1731
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-29 15:24:52 +00:00
renovate 6be67cfb98 chore(deps): update dependency happy-dom to v2.51.0 (#1733)
Reviewed-on: vikunja/frontend#1733
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-29 15:24:21 +00:00
renovate 160c099ff8 chore(deps): update dependency @faker-js/faker to v6.1.1 (#1728)
Reviewed-on: vikunja/frontend#1728
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-29 05:25:42 +00:00
renovate 5d7de25a92 chore(deps): update dependency cypress to v9.5.3 (#1729)
Reviewed-on: vikunja/frontend#1729
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-28 21:26:43 +00:00
konrad 9b09fadbd0 feat: add date math for filters (#1342)
Reviewed-on: vikunja/frontend#1342
2022-03-28 17:30:42 +00:00
renovate 75c68aa03e chore(deps): update typescript-eslint monorepo to v5.17.0 (#1727)
Reviewed-on: vikunja/frontend#1727
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-28 17:28:16 +00:00
renovate c49d582a03 chore(deps): update dependency netlify-cli to v9.13.5 (#1726)
Reviewed-on: vikunja/frontend#1726
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-28 05:18:34 +00:00
kolaente 46050611d8 fix: forgotten import 2022-03-27 21:06:30 +00:00
kolaente a055a3ea52 fix: lint 2022-03-27 21:06:30 +00:00
kolaente b7a976a9cf fix: setting the last viewed list after navigating away from it
The new list background was set on the home page when navigating to the list. This was because the `CURRENT_LIST` was set to the last visited list, even after the call to `this.$store.commit(CURRENT_LIST, null)` because everything is async. I tracked the problem down to the call to `watchEffect` in the ListWrapper component. Apparently, `watchEffect` is called every time _the watched variable is assigned to_ and not only when it changes. When navigating away from the list, that watcher is getting called with the list id, the one already loaded, and sets it in store which in turn overrides the call from the contentAuth component.
2022-03-27 21:06:30 +00:00
kolaente 42c0fc6185 fix: make sure a list background is set in store when adding one
When creating a new list, setting a background and then navigating to the home page, the list background would not be shown in the list card. Now, we're setting the newly updated list with all its background information properly in store (why are there even multiple places for this?).
2022-03-27 21:06:30 +00:00
kolaente f9b7e2fd76 feat: use vueuse to lock scrolling 2022-03-27 20:42:21 +00:00
kolaente 574ecff12d feat: prevent scrolling the rest of the page when a modal is open 2022-03-27 20:42:21 +00:00
kolaente 0af6d79eff
Merge branch 'main' into feature/date-math 2022-03-27 22:41:53 +02:00
konrad 3639498b3f fix: add task input layout on mobile (#1615)
On non-english locales the placeholder text would wrap, making the placeholder longer than it needed to be. To fix that, I've made sure the placeholder will never wrap and reduced the button to a single icon.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1615
2022-03-27 20:37:25 +00:00
konrad 7f56a3537c fix: load the list tasks only after the list itself was loaded (#1251)
Currently, when opening a list sometimes the tasks are shown before the list itself is loaded. Because the list contains the rights, this means no edit buttons etc are available at that point which is pretty confusing.

This PR ensures the list-specific view is loaded only after the list itself is loaded.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1251
2022-03-27 19:56:56 +00:00
adrinux a8fe2cdcbd Redefine all Bulma variables to fix undefined variables (#1165)
As per discussion in vikunja/frontend#1074

This will hopefully eventually be fixed at the root - with missing scss variables properly passed though, possibly by switching to Bulvar.

But in the mean time I experimented with add ALL the bulma css color related variables into color.scss

This fixes the issue with the date picker in light mode. Also has me wondering if it will allow removal of some of other little overrides we made to fix niggling issues with dark mode, so marking this WIP.

Not suggesting this ever be merged, just exploring.

Resolves #1497
Resolves #1074

Co-authored-by: Adrian Simmons <adrian@perlucida.co.uk>
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1165
Reviewed-by: konrad <k@knt.li>
Co-authored-by: adrinux <adrian@perlucida.co.uk>
Co-committed-by: adrinux <adrian@perlucida.co.uk>
2022-03-27 19:20:37 +00:00
renovate c8fa0cc6b1 chore(deps): update workbox monorepo to v6.5.2 (#1725)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1725
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-27 15:12:03 +00:00
renovate fcc096dcf7 chore(deps): update dependency vitest to v0.7.12 (#1724)
Reviewed-on: vikunja/frontend#1724
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-27 10:31:37 +00:00
renovate d696d16139 chore(deps): update dependency eslint to v8.12.0 (#1722)
Reviewed-on: vikunja/frontend#1722
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-27 08:52:01 +00:00
renovate 81efe27d50 fix(deps): update dependency @vueuse/router to v8.2.0 (#1721)
Reviewed-on: vikunja/frontend#1721
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-26 19:12:15 +00:00
renovate bd52ac71aa chore(deps): update dependency esbuild to v0.14.28 (#1723)
Reviewed-on: vikunja/frontend#1723
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-26 19:11:51 +00:00
renovate b949c9f832 fix(deps): update dependency @vueuse/core to v8.2.0 (#1720)
Reviewed-on: vikunja/frontend#1720
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-25 17:59:16 +00:00
renovate 1f4a016075 chore(deps): update dependency vitest to v0.7.11 (#1718)
Reviewed-on: vikunja/frontend#1718
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-25 15:28:48 +00:00
renovate 94c0f6d00f chore(deps): update dependency typescript to v4.6.3 (#1717)
Reviewed-on: vikunja/frontend#1717
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-25 14:32:08 +00:00
renovate 06f0597b13 chore(deps): update dependency vue-tsc to v0.33.9 (#1719)
Reviewed-on: vikunja/frontend#1719
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-25 14:30:45 +00:00
renovate bfe28787c3 chore(deps): update dependency caniuse-lite to v1.0.30001320 (#1716)
Reviewed-on: vikunja/frontend#1716
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-24 06:50:43 +00:00
renovate 8e6aa35f89 fix(deps): update sentry-javascript monorepo to v6.19.2 (#1715)
Reviewed-on: vikunja/frontend#1715
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-23 21:19:55 +00:00
renovate 25ca3e5eaf chore(deps): update dependency vitest to v0.7.10 (#1714)
Reviewed-on: vikunja/frontend#1714
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-23 13:51:10 +00:00
renovate 188eb02e07 chore(deps): update dependency vitest to v0.7.8 (#1713)
Reviewed-on: vikunja/frontend#1713
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-23 10:44:42 +00:00
renovate 3605d61a17 chore(deps): update dependency vue-tsc to v0.33.7 (#1712)
Reviewed-on: vikunja/frontend#1712
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-23 08:13:59 +00:00
kolaente 87ac22b448
fix: related done tasks strikethrough 2022-03-22 23:06:36 +01:00
kolaente 8f650316dc
fix: multiselect search results text color 2022-03-22 23:04:06 +01:00
kolaente d7b1d7da7f
fix: mobile menu backdrop 2022-03-22 23:00:43 +01:00
kolaente 63e04f874a
fix: modal close icon color in light mode on mobile 2022-03-22 22:55:28 +01:00
renovate 09f6c0d43e chore(deps): update dependency happy-dom to v2.50.0 (#1711)
Reviewed-on: vikunja/frontend#1711
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-22 19:17:17 +00:00
renovate 2b6cbe8006 chore(deps): update font awesome to v6.1.1 (#1710)
Reviewed-on: vikunja/frontend#1710
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-22 18:37:34 +00:00
renovate 501a720b7c fix(deps): update sentry-javascript monorepo to v6.19.1 (#1708)
Reviewed-on: vikunja/frontend#1708
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 19:50:38 +00:00
renovate a72329599b chore(deps): update typescript-eslint monorepo to v5.16.0 (#1707)
Reviewed-on: vikunja/frontend#1707
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 17:28:49 +00:00
renovate 50871beeee chore(deps): update dependency vue-tsc to v0.33.6 (#1706)
Reviewed-on: vikunja/frontend#1706
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 17:28:21 +00:00
renovate 51cafb9d56 fix(deps): update sentry-javascript monorepo to v6.19.0 (#1705)
Reviewed-on: vikunja/frontend#1705
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 17:27:27 +00:00
renovate 73ff2d4407 chore(deps): update dependency happy-dom to v2.49.2 (#1704)
Reviewed-on: vikunja/frontend#1704
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 14:29:28 +00:00
renovate 3f4bb1b64b chore(deps): update dependency vitest to v0.7.7 (#1702)
Reviewed-on: vikunja/frontend#1702
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 13:19:32 +00:00
renovate 6a5f5f81a8 chore(deps): update dependency happy-dom to v2.49.1 (#1703)
Reviewed-on: vikunja/frontend#1703
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 13:18:38 +00:00
renovate c90f87f74a chore(deps): update dependency netlify-cli to v9.13.3 (#1700)
Reviewed-on: vikunja/frontend#1700
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 06:50:00 +00:00
renovate a8da12a894 chore(deps): update dependency vue-tsc to v0.33.5 (#1701)
Reviewed-on: vikunja/frontend#1701
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-21 06:49:22 +00:00
renovate ae6c982755 chore(deps): update dependency postcss-preset-env to v7.4.3 (#1699)
Reviewed-on: vikunja/frontend#1699
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-20 10:19:24 +00:00
drone 8f367921cf [skip ci] Updated translations via Crowdin 2022-03-20 00:27:38 +00:00
renovate ea9e84b4d9 fix(deps): update dependency @vueuse/core to v8.1.2 (#1696)
Reviewed-on: vikunja/frontend#1696
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-19 13:56:50 +00:00
renovate 8aeaa322fe chore(deps): update yarn to v1.22.18 (#1694)
Reviewed-on: vikunja/frontend#1694
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-19 11:12:20 +00:00
renovate 83a91e9a11 fix(deps): update dependency @vueuse/router to v8.1.2 (#1697)
Reviewed-on: vikunja/frontend#1697
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-19 11:11:54 +00:00
renovate 5e6bce8b7e chore(deps): update dependency vitest to v0.7.6 (#1698)
Reviewed-on: vikunja/frontend#1698
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-19 11:11:32 +00:00
renovate 574b000b19 chore(deps): update dependency caniuse-lite to v1.0.30001319 (#1695)
Reviewed-on: vikunja/frontend#1695
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-19 11:11:11 +00:00
renovate 2c929c1f91 chore(deps): update dependency vitest to v0.7.4 (#1693)
Reviewed-on: vikunja/frontend#1693
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-17 21:10:10 +00:00
renovate c41f3edc99 chore(deps): update dependency @types/flexsearch to v0.7.3 (#1677)
Reviewed-on: vikunja/frontend#1677
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-17 12:21:30 +00:00
renovate 9606edbb39 fix(deps): update dependency @vueuse/router to v8.1.1 (#1691)
Reviewed-on: vikunja/frontend#1691
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-17 07:27:25 +00:00
renovate 360b4da7d3 chore(deps): update dependency vitest to v0.7.0 (#1692)
Reviewed-on: vikunja/frontend#1692
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-17 06:49:06 +00:00
renovate 7564c26201 fix(deps): update dependency @vueuse/core to v8.1.1 (#1690)
Reviewed-on: vikunja/frontend#1690
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-16 21:22:59 +00:00
renovate 6432d18c1b chore(deps): update dependency vitest to v0.6.3 (#1688)
Reviewed-on: vikunja/frontend#1688
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-16 15:31:56 +00:00
renovate b57540a8ff fix(deps): update dependency ufo to v0.8.1 (#1689)
Reviewed-on: vikunja/frontend#1689
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-16 15:31:24 +00:00
renovate 4c43c87bfe chore(deps): update dependency postcss to v8.4.12 (#1687)
Reviewed-on: vikunja/frontend#1687
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-16 15:31:03 +00:00
renovate 83b1333ee5 chore(deps): update dependency happy-dom to v2.49.0 (#1680)
Reviewed-on: vikunja/frontend#1680
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-16 15:30:32 +00:00
renovate eadfc3442f chore(deps): update dependency autoprefixer to v10.4.4 (#1686)
Reviewed-on: vikunja/frontend#1686
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-16 13:15:51 +00:00
renovate 14a7676fe4 chore(deps): update dependency @faker-js/faker to v6.0.0 (#1681)
Reviewed-on: vikunja/frontend#1681
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 22:28:20 +00:00
renovate 148046f7b8 chore(deps): update dependency browserslist to v4.20.2 (#1683)
Reviewed-on: vikunja/frontend#1683
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 22:27:34 +00:00
renovate 75ec8889a9 fix(deps): update dependency ufo to v0.8.0 (#1685)
Reviewed-on: vikunja/frontend#1685
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 22:23:04 +00:00
renovate 2292be3ff3 chore(deps): update dependency postcss to v8.4.11 (#1684)
Reviewed-on: vikunja/frontend#1684
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 22:20:49 +00:00
renovate c2ee125ba2 chore(deps): update dependency autoprefixer to v10.4.3 (#1682)
Reviewed-on: vikunja/frontend#1682
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 19:57:22 +00:00
renovate df53dc76ce chore(deps): update font awesome to v6 (major) (#1505)
Reviewed-on: vikunja/frontend#1505
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 19:55:37 +00:00
renovate 1d9fef9172 chore(deps): update dependency esbuild to v0.14.27 (#1678)
Reviewed-on: vikunja/frontend#1678
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 13:24:54 +00:00
renovate 19b4fc20a1 chore(deps): update dependency caniuse-lite to v1.0.30001317 (#1679)
Reviewed-on: vikunja/frontend#1679
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 13:24:01 +00:00
renovate d1e8931600 chore(deps): update dependency cypress to v9.5.2 (#1676)
Reviewed-on: vikunja/frontend#1676
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-15 12:31:00 +00:00
renovate 2dc888790f chore(deps): update dependency vue-tsc to v0.33.2 (#1674)
Reviewed-on: vikunja/frontend#1674
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 20:25:22 +00:00
renovate 811d62eb52 chore(deps): update dependency happy-dom to v2.47.0 (#1673)
Reviewed-on: vikunja/frontend#1673
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 20:24:53 +00:00
renovate 83159b44d0 chore(deps): update typescript-eslint monorepo to v5.15.0 (#1675)
Reviewed-on: vikunja/frontend#1675
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 20:24:13 +00:00
renovate b9c677e871 chore(deps): update dependency caniuse-lite to v1.0.30001316 (#1672)
Reviewed-on: vikunja/frontend#1672
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 13:52:19 +00:00
renovate 4fab17f798 fix(deps): update dependency @vueuse/router to v8.0.1 (#1669)
Reviewed-on: vikunja/frontend#1669
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 13:51:55 +00:00
renovate e95705f45f fix(deps): update dependency @vueuse/core to v8.0.1 (#1668)
Reviewed-on: vikunja/frontend#1668
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 07:08:26 +00:00
renovate 562f84d962 chore(deps): update dependency netlify-cli to v9.13.0 (#1667)
Reviewed-on: vikunja/frontend#1667
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 07:07:55 +00:00
renovate d29c7db4b6 chore(deps): update dependency esbuild to v0.14.26 (#1670)
Reviewed-on: vikunja/frontend#1670
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 07:01:04 +00:00
renovate d0a2b248e0 chore(deps): update dependency rollup to v2.70.1 (#1671)
Reviewed-on: vikunja/frontend#1671
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 07:00:31 +00:00
renovate f36c7783ee chore(deps): update dependency vitest to v0.6.1 (#1666)
Reviewed-on: vikunja/frontend#1666
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-14 07:00:09 +00:00
drone 42fa8bda71 [skip ci] Updated translations via Crowdin 2022-03-14 00:21:14 +00:00
renovate 2786f7a7bc fix(deps): update dependency @vueuse/router to v8 (#1664)
Reviewed-on: vikunja/frontend#1664
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 21:35:17 +00:00
renovate a534229bf5 fix(deps): update dependency vue-router to v4.0.14 (#1660)
Reviewed-on: vikunja/frontend#1660
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 20:44:00 +00:00
renovate 89ed8913fd fix(deps): update dependency @vueuse/core to v8 (#1663)
Reviewed-on: vikunja/frontend#1663
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 20:19:54 +00:00
renovate 5328c3d6b0 chore(deps): update dependency vue-tsc to v0.33.1 (#1665)
Reviewed-on: vikunja/frontend#1665
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 20:19:31 +00:00
renovate 6a3290b052 chore(deps): update dependency eslint to v8.11.0 (#1661)
Reviewed-on: vikunja/frontend#1661
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 17:41:01 +00:00
renovate 8ca64e9e1d fix(deps): update dependency highlight.js to v11.5.0 (#1662)
Reviewed-on: vikunja/frontend#1662
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 17:40:43 +00:00
renovate 276fc7a875 fix(deps): update dependency flatpickr to v4.6.11 (#1659)
Reviewed-on: vikunja/frontend#1659
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 17:40:08 +00:00
renovate 40e5945d5f chore(deps): update dependency happy-dom to v2.46.3 (#1658)
Reviewed-on: vikunja/frontend#1658
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 15:15:58 +00:00
renovate 1fd1645c04 chore(deps): update dependency caniuse-lite to v1.0.30001315 (#1657)
Reviewed-on: vikunja/frontend#1657
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-13 15:15:30 +00:00
renovate e96532d59f chore(deps): update dependency axios to v0.26.1 (#1656)
Reviewed-on: vikunja/frontend#1656
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-09 18:30:50 +00:00
renovate c6b3a39a84 fix(deps): update sentry-javascript monorepo to v6.18.2 (#1655)
Reviewed-on: vikunja/frontend#1655
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-08 20:37:21 +00:00
renovate 675d45cf9c chore(deps): update dependency caniuse-lite to v1.0.30001314 (#1654)
Reviewed-on: vikunja/frontend#1654
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-08 08:25:54 +00:00
renovate 1fd5ab8d98 chore(deps): update dependency @faker-js/faker to v6.0.0-beta.0 (#1653)
Reviewed-on: vikunja/frontend#1653
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 20:55:42 +00:00
renovate e19b338335 chore(deps): update typescript-eslint monorepo to v5.14.0 (#1652)
Reviewed-on: vikunja/frontend#1652
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 20:55:20 +00:00
renovate 50c8077d7e chore(deps): update dependency happy-dom to v2.46.0 (#1650)
Reviewed-on: vikunja/frontend#1650
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 15:24:02 +00:00
renovate 4136ed2f96 chore(deps): update dependency vitest to v0.6.0 (#1651)
Reviewed-on: vikunja/frontend#1651
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 15:23:32 +00:00
renovate 4d362c0462 chore(deps): update dependency happy-dom to v2.45.1 (#1649)
Reviewed-on: vikunja/frontend#1649
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 13:04:17 +00:00
renovate c82d2d4c2d chore(deps): update dependency postcss to v8.4.8 (#1647)
Reviewed-on: vikunja/frontend#1647
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 08:33:31 +00:00
renovate 9622096115 chore(deps): update dependency netlify-cli to v9.12.3 (#1646)
Reviewed-on: vikunja/frontend#1646
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 07:40:58 +00:00
renovate 9d6aed1a70 chore(deps): update dependency browserslist to v4.20.0 (#1645)
Reviewed-on: vikunja/frontend#1645
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 07:40:31 +00:00
renovate 91a537c379 chore(deps): update dependency rollup to v2.70.0 (#1648)
Reviewed-on: vikunja/frontend#1648
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-07 07:40:12 +00:00
renovate 59a5b7021c fix(deps): update dependency flatpickr to v4.6.10 (#1644)
Reviewed-on: vikunja/frontend#1644
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-06 15:53:02 +00:00
kolaente 81993cc2e6
fix: aria-label for password field 2022-03-06 13:31:57 +01:00
renovate 666d076801 chore(deps): update dependency rollup to v2.69.2 (#1643)
Reviewed-on: vikunja/frontend#1643
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-06 11:50:35 +00:00
renovate 880976f960 fix(deps): update dependency @vueuse/core to v7.7.1 (#1641)
Reviewed-on: vikunja/frontend#1641
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-05 09:20:48 +00:00
renovate db648a458a fix(deps): update dependency @vueuse/router to v7.7.1 (#1642)
Reviewed-on: vikunja/frontend#1642
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-05 08:17:12 +00:00
drone 9b67f5627e [skip ci] Updated translations via Crowdin 2022-03-05 00:14:52 +00:00
renovate d1bf513e39 chore(deps): update dependency happy-dom to v2.45.0 (#1640)
Reviewed-on: vikunja/frontend#1640
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-04 18:23:39 +00:00
renovate e2af71f577 chore(deps): update dependency rollup to v2.69.1 (#1638)
Reviewed-on: vikunja/frontend#1638
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-04 14:25:08 +00:00
renovate 210e782c6a chore(deps): update workbox monorepo to v6.5.1 (#1635)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1635
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-04 14:24:44 +00:00
renovate 08b087f590 chore(deps): update dependency esbuild to v0.14.25 (#1637)
Reviewed-on: vikunja/frontend#1637
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-04 10:49:22 +00:00
renovate 280ada0e2f chore(deps): update dependency caniuse-lite to v1.0.30001313 (#1636)
Reviewed-on: vikunja/frontend#1636
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-04 10:48:32 +00:00
drone 913ec95982 [skip ci] Updated translations via Crowdin 2022-03-04 00:10:15 +00:00
renovate 2ec7856cfe chore(deps): update dependency esbuild to v0.14.24 (#1634)
Reviewed-on: vikunja/frontend#1634
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-03 08:22:46 +00:00
kolaente cf5460d298
fix: keyboard shortcut text indicating what works where 2022-03-02 22:05:16 +01:00
kolaente f4b0e68322
feat: add a few new keyboard shortcuts 2022-03-02 21:59:51 +01:00
renovate 8849e5bee1 chore(deps): update dependency happy-dom to v2.43.1 (#1632)
Reviewed-on: vikunja/frontend#1632
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 16:48:26 +00:00
renovate 690c696d13 chore(deps): update dependency postcss-preset-env to v7.4.2 (#1633)
Reviewed-on: vikunja/frontend#1633
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 16:47:48 +00:00
renovate 22d10a3f6b chore(deps): update dependency vue-tsc to v0.32.1 (#1629)
Reviewed-on: vikunja/frontend#1629
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 14:20:34 +00:00
renovate 98f86b91a2 chore(deps): update dependency rollup to v2.69.0 (#1631)
Reviewed-on: vikunja/frontend#1631
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 14:20:14 +00:00
renovate a9160d223d chore(deps): update dependency vite to v2.8.6 (#1630)
Reviewed-on: vikunja/frontend#1630
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 12:51:25 +00:00
renovate 3d15d6e3d4 chore(deps): update dependency happy-dom to v2.43.0 (#1628)
Reviewed-on: vikunja/frontend#1628
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 12:50:55 +00:00
renovate 28fdc98d1d chore(deps): update dependency vitest to v0.5.9 (#1627)
Reviewed-on: vikunja/frontend#1627
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 12:50:09 +00:00
renovate e1a16ac5af chore(deps): update dependency cypress to v9.5.1 (#1625)
Reviewed-on: vikunja/frontend#1625
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 12:49:30 +00:00
renovate b171cfbf67 chore(deps): update dependency typescript to v4.6.2 (#1626)
Reviewed-on: vikunja/frontend#1626
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-03-02 10:37:56 +00:00
renovate ba0c0342fd chore(deps): update typescript-eslint monorepo to v5.13.0 (#1624)
Reviewed-on: vikunja/frontend#1624
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-28 19:20:59 +00:00
renovate 1081e7ea50 chore(deps): update dependency @vitejs/plugin-vue to v2.2.4 (#1622)
Reviewed-on: vikunja/frontend#1622
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-28 18:51:07 +00:00
renovate ae51c44a5e chore(deps): update dependency vite to v2.8.5 (#1623)
Reviewed-on: vikunja/frontend#1623
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-28 18:50:54 +00:00
renovate 7be75c998c fix(deps): update dependency vue-router to v4.0.13 (#1620)
Reviewed-on: vikunja/frontend#1620
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-28 17:10:27 +00:00
renovate 600fba6b71 fix(deps): update sentry-javascript monorepo to v6.18.1 (#1621)
Reviewed-on: vikunja/frontend#1621
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-28 17:10:15 +00:00
renovate 4aad36333d chore(deps): update dependency netlify-cli to v9.8.3 (#1619)
Reviewed-on: vikunja/frontend#1619
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-28 06:52:05 +00:00
renovate e901aef521 chore(deps): update dependency vitest to v0.5.8 (#1618)
Reviewed-on: vikunja/frontend#1618
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-27 21:17:08 +00:00
kolaente 7f2189b455
fix: don't rotate kanban cards while dragging
The way I implemented that had a few annoying side effects like wiggling around when clicking on the bucket
2022-02-27 19:43:05 +01:00
kolaente db47c1f10c
chore: move converting params to service 2022-02-27 17:21:07 +01:00
kolaente a8ee54d626
Merge branch 'main' into feature/date-math 2022-02-27 16:40:49 +01:00
kolaente b144802203
fix: "invalid date" error when trying to set a date and none was set before 2022-02-27 16:39:21 +01:00
kolaente a23b4a96ee
fix: kanban board layout on mobile 2022-02-27 16:36:20 +01:00
renovate fc0e3e0d51 fix(deps): update dependency @vueuse/core to v7.7.0 (#1613)
Reviewed-on: vikunja/frontend#1613
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-26 17:14:08 +00:00
renovate fd857d3db3 fix(deps): update dependency @vueuse/router to v7.7.0 (#1614)
Reviewed-on: vikunja/frontend#1614
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-26 16:26:11 +00:00
kolaente c06cc6ad7a
fix: pop sound not saved and played when marking tasks done 2022-02-26 14:48:46 +01:00
kolaente 553fd54f78
fix(kanban): background content scrolling when opening a task 2022-02-26 14:39:25 +01:00
kolaente 74ab197dc6
fix: don't always show a scrollbar 2022-02-26 14:36:43 +01:00
kolaente 5b509da215
fix(kanban): make sure the buckets don't appear glued to the bottom 2022-02-26 14:28:55 +01:00
kolaente f54f533700
fix(kanban): transition animation for bucket footer when adding a new task 2022-02-26 14:20:53 +01:00
kolaente 6d0cbc51f6
fix: missing app padding when opening the task detail modal 2022-02-26 14:13:37 +01:00
kolaente 17ba56f12d
feat: rotate task cards slightly while moving them between buckets 2022-02-26 14:03:30 +01:00
kolaente d5f0158b04
Merge branch 'main' into feature/date-math
# Conflicts:
#	src/views/tasks/ShowTasks.vue
2022-02-26 13:30:07 +01:00
kolaente 051dd98ff7
fix: undo task done from list view 2022-02-26 13:18:44 +01:00
kolaente 7b62a0895d
fix: update page title when changing the task title 2022-02-26 13:14:08 +01:00
kolaente 45c05296a6
fix: hide "title required" error after entering text 2022-02-26 13:05:39 +01:00
kolaente 1256c37b69
fix: removing a label from a task 2022-02-26 12:57:59 +01:00
kolaente 9a55482681
fix: don't fire close event multiple times 2022-02-26 12:55:38 +01:00
kolaente b83cec2f0e
fix: don't try to validate nonexisting fields 2022-02-26 12:35:09 +01:00
kolaente 731506fab7
fix: don't try to filter notifications if there are none 2022-02-26 12:33:49 +01:00
kolaente 8cdcfaf071
fix: don't try to sort tasks when none were returned 2022-02-26 12:30:56 +01:00
renovate 42303e37df chore(deps): update dependency eslint to v8.10.0 (#1611)
Reviewed-on: vikunja/frontend#1611
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-26 11:11:10 +00:00
renovate 683a68f3ef chore(deps): update dependency vitest to v0.5.7 (#1612)
Reviewed-on: vikunja/frontend#1612
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-26 11:10:50 +00:00
renovate f2a0a444b5 fix(deps): update dependency ufo to v0.7.11 (#1610)
Reviewed-on: vikunja/frontend#1610
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-25 22:16:35 +00:00
renovate 4dd914af13 chore(deps): update dependency rollup-plugin-visualizer to v5.6.0 (#1609)
Reviewed-on: vikunja/frontend#1609
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-25 11:43:34 +00:00
renovate c7a35fa251 chore(deps): update dependency vue-tsc to v0.32.0 (#1608)
Reviewed-on: vikunja/frontend#1608
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-25 08:07:02 +00:00
renovate e5e546bc0f chore(deps): update dependency postcss to v8.4.7 (#1607)
Reviewed-on: vikunja/frontend#1607
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-25 08:06:11 +00:00
renovate bdad9dadc8 chore(deps): update dependency sass to v1.49.9 (#1606)
Reviewed-on: vikunja/frontend#1606
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-24 21:47:06 +00:00
renovate 46cc8e0cec fix(deps): update sentry-javascript monorepo to v6.18.0 (#1605)
Reviewed-on: vikunja/frontend#1605
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-24 15:18:04 +00:00
renovate d8a60779ef chore(deps): update dependency vitest to v0.5.5 (#1604)
Reviewed-on: vikunja/frontend#1604
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-24 11:02:02 +00:00
renovate 52948864ad chore(deps): update workbox monorepo to v6.5.0 (#1603)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1603
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-24 08:15:11 +00:00
renovate eb505bbc25 chore(deps): update dependency vitest to v0.5.4 (#1602)
Reviewed-on: vikunja/frontend#1602
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-23 15:19:00 +00:00
Dominik Pschenitschni 9f5e68a125 feat: change preview api url (#1584)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1584
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-23 12:05:06 +00:00
drone 9bb73d9f64 [skip ci] Updated translations via Crowdin 2022-02-23 00:10:44 +00:00
renovate 1a50eb100c chore(deps): update dependency happy-dom to v2.41.0 (#1600)
Reviewed-on: vikunja/frontend#1600
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-22 20:52:11 +00:00
renovate 7e787fd99d chore(deps): update dependency vitest to v0.5.3 (#1599)
Reviewed-on: vikunja/frontend#1599
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-22 13:56:22 +00:00
renovate 3aec819e46 chore(deps): update dependency eslint-plugin-vue to v8.5.0 (#1598)
Reviewed-on: vikunja/frontend#1598
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-22 09:28:24 +00:00
renovate 64d9de2aa6 chore(deps): update dependency rollup to v2.68.0 (#1597)
Reviewed-on: vikunja/frontend#1597
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-22 07:14:57 +00:00
renovate 29675670c4 chore(deps): update dependency vitest to v0.5.1 (#1596)
Reviewed-on: vikunja/frontend#1596
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-22 07:14:29 +00:00
drone b512f4a6b8 [skip ci] Updated translations via Crowdin 2022-02-22 00:10:46 +00:00
renovate 6d6220627c chore(deps): update typescript-eslint monorepo to v5.12.1 (#1595)
Reviewed-on: vikunja/frontend#1595
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-21 19:16:25 +00:00
renovate e855728a3e fix(deps): update dependency codemirror to v5.65.2 (#1593)
Reviewed-on: vikunja/frontend#1593
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-21 09:19:15 +00:00
renovate 15a966cf0d chore(deps): update dependency netlify-cli to v9 (#1590)
Reviewed-on: vikunja/frontend#1590
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-21 07:42:47 +00:00
renovate 54d8ea443d chore(deps): update dependency vitest to v0.5.0 (#1592)
Reviewed-on: vikunja/frontend#1592
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-21 07:17:29 +00:00
renovate 213ddc0acb chore(deps): update dependency vitest to v0.4.3 (#1591)
Reviewed-on: vikunja/frontend#1591
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-21 06:39:39 +00:00
renovate f6bb2d1aee chore(deps): update dependency netlify-cli to v8.19.3 (#1589)
Reviewed-on: vikunja/frontend#1589
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-21 06:38:35 +00:00
drone 76566d3941 [skip ci] Updated translations via Crowdin 2022-02-21 00:13:32 +00:00
konrad bdb53ec8ee fix: api config domain name contains the current domain instead of the provided one (#1581)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1581
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-20 22:07:59 +00:00
kolaente da162d5652
fix: modal not scrolling content when open 2022-02-20 22:32:41 +01:00
kolaente c7943ef823
fix: popup not really hidden when hidden 2022-02-20 22:02:59 +01:00
kolaente 622f08fb1b
fix: lint 2022-02-20 21:34:45 +01:00
kolaente 4ce9ac9c66
chore: remove showAll prop and make it a computed instead 2022-02-20 21:32:02 +01:00
kolaente 95d8cdffe4
chore: return the title directly 2022-02-20 21:22:31 +01:00
kolaente 564f669ed4
chore: return key directly 2022-02-20 21:21:06 +01:00
kolaente 74766ce1d0
chore: hack the planet 2022-02-20 21:17:24 +01:00
kolaente 18f5f8da7d
chore: remove abstractions 2022-02-20 21:15:56 +01:00
kolaente 4195953696
chore: rename i18n key for datemath help 2022-02-20 21:13:42 +01:00
kolaente a6480cdb75
chore: remove rel for help docs 2022-02-20 21:07:49 +01:00
kolaente 0b6a74d11e
Merge branch 'main' into feature/date-math 2022-02-20 20:25:06 +01:00
renovate f9309c30b0 chore(deps): update dependency @faker-js/faker to v6.0.0-alpha.7 (#1587)
Reviewed-on: vikunja/frontend#1587
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-20 19:15:58 +00:00
Dominik Pschenitschni 60f58af41a
chore: align wording in task detail view
Changes only in task detail view. Probably this should be done everywhere:

- some buttons were using the uppercase words consistently, some were not
- some were using articles, some were not  => I removed them everywhere to shorten the label length
- some buttons were refering to the task, some were not. Since we are already in the context of the task (we are not the task detail page) I removed the reference everywhere.
2022-02-20 12:03:45 +01:00
drone 15d681122a [skip ci] Updated translations via Crowdin 2022-02-20 00:12:43 +00:00
renovate 90d184f7ad chore(deps): update dependency vitest to v0.4.2 (#1580)
Reviewed-on: vikunja/frontend#1580
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-19 12:19:00 +00:00
renovate e14cfd985c chore(deps): update dependency browserslist to v4.19.3 (#1579)
Reviewed-on: vikunja/frontend#1579
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-19 10:12:07 +00:00
drone 894792b207 [skip ci] Updated translations via Crowdin 2022-02-19 00:12:08 +00:00
renovate 6d66ee788c chore(deps): update dependency esbuild to v0.14.23 2022-02-18 21:03:19 +00:00
Dominik Pschenitschni c419062e49 fix: direct store manipulation in tasks (#1534)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1534
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-18 19:48:49 +00:00
Dominik Pschenitschni 8df73c973b feat: use AuthenticatedHTTPFactory for refreshToken (#1546)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1546
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-18 19:14:38 +00:00
renovate 026ee3e8da chore(deps): update dependency @vitejs/plugin-vue to v2.2.2 (#1577)
Reviewed-on: vikunja/frontend#1577
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 17:10:56 +00:00
Dominik Pschenitschni 8ea9d7541f feat: rename percent done to progress (#1542)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1542
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-18 16:56:15 +00:00
renovate c0670e6bfc chore(deps): update dependency vitest to v0.4.1 (#1576)
Reviewed-on: vikunja/frontend#1576
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 15:22:19 +00:00
renovate 3cda4c8478 chore(deps): update dependency vite to v2.8.4 (#1575)
Reviewed-on: vikunja/frontend#1575
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 15:21:52 +00:00
renovate e895c8d5d9 chore(deps): update dependency rollup to v2.67.3 2022-02-18 14:14:36 +00:00
renovate bde0b252bc chore(deps): update dependency sass to v1.49.8 (#1574)
Reviewed-on: vikunja/frontend#1574
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 14:14:17 +00:00
renovate 1b46bc9c47 chore(deps): update dependency browserslist to v4.19.2 2022-02-18 13:02:39 +00:00
Dominik Pschenitschni 98cb14a86c
feat: change port to 4173
See: https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#default-preview-port
2022-02-18 13:00:20 +01:00
renovate 95390390a7
chore(deps): update dependency vite to v2.8.3
For `<script setup>`
Wee need to change "preserveValueImports": true
See: <https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta/#preserve-value-imports>
2022-02-18 13:00:16 +01:00
renovate 11d450d651 chore(deps): update dependency vitest to v0.4.1 (#1570)
Reviewed-on: vikunja/frontend#1570
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 09:36:14 +00:00
renovate 0f3ba86efd chore(deps): update dependency vitest to v0.4.0 (#1568)
Reviewed-on: vikunja/frontend#1568
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 07:05:28 +00:00
renovate 91e92ef772 chore(deps): update dependency rollup to v2.67.3 (#1569)
Reviewed-on: vikunja/frontend#1569
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-18 07:04:54 +00:00
renovate 9a46540ebc chore(deps): update dependency sass to v1.49.8 2022-02-17 22:02:39 +00:00
renovate 64027d1ee0 chore(deps): update dependency happy-dom to v2.39.1 2022-02-17 18:02:48 +00:00
renovate fff113d418 chore(deps): update typescript-eslint monorepo to v5.12.0 2022-02-17 16:34:16 +00:00
renovate fc8d2d1a57 chore(deps): update dependency happy-dom to v2.36.0 2022-02-17 16:02:50 +00:00
renovate 6a959b2e53 chore(deps): update dependency postcss-preset-env to v7.4.1 2022-02-17 15:35:29 +00:00
renovate 56f48cab31 chore(deps): update dependency cypress to v9.5.0 2022-02-17 15:35:01 +00:00
renovate cd3244e0f9 chore(deps): update dependency happy-dom to v2.34.0 2022-02-17 15:34:31 +00:00
renovate b3f207eaff chore(deps): update dependency axios to v0.26.0 2022-02-17 15:34:09 +00:00
renovate 34990946f6 fix(deps): update dependency vue-advanced-cropper to v2.8.1 2022-02-17 15:02:59 +00:00
renovate a557a0085d fix(deps): update sentry-javascript monorepo to v6.17.9 2022-02-17 14:53:46 +00:00
renovate 762f21188d fix(deps): update dependency vue to v3.2.31 2022-02-17 13:01:38 +00:00
renovate a7a3dd7872 fix(deps): update dependency @vueuse/core to v7.6.2 2022-02-17 12:51:54 +00:00
renovate e9498b200d chore(deps): update dependency caniuse-lite to v1.0.30001312 2022-02-17 12:50:28 +00:00
renovate cd15a756d7 fix(deps): update dependency dompurify to v2.3.6 2022-02-17 12:50:03 +00:00
renovate 2c6ba1fa89 chore(deps): update dependency esbuild to v0.14.22 (#1549)
Reviewed-on: vikunja/frontend#1549
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-17 11:16:14 +00:00
renovate 51a93b5fd2 chore(deps): update dependency vue-tsc to v0.31.4 (#1552)
Reviewed-on: vikunja/frontend#1552
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-17 11:15:54 +00:00
renovate d4061d1b10 fix(deps): update dependency @vue/compat to v3.2.31 (#1553)
Reviewed-on: vikunja/frontend#1553
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-17 11:15:36 +00:00
renovate 7f9ba0c727 fix(deps): update dependency @vueuse/router to v7.6.2 (#1555)
Reviewed-on: vikunja/frontend#1555
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-17 11:15:11 +00:00
renovate 7020c99a7a chore(deps): update dependency express to v4.17.3 (#1550)
Reviewed-on: vikunja/frontend#1550
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-17 11:14:46 +00:00
renovate befa2d4004 chore(deps): update dependency vitest to v0.3.6 2022-02-17 09:03:34 +00:00
saibotk 28af46bcd3 fix: Replace slugify in deploy-preview-netlify with simple regex solution (#1543)
Co-authored-by: saibotk <git@saibotk.de>
Reviewed-on: vikunja/frontend#1543
Reviewed-by: konrad <k@knt.li>
Co-authored-by: saibotk <kolaente-dev@saibotk.de>
Co-committed-by: saibotk <kolaente-dev@saibotk.de>
2022-02-14 18:09:20 +00:00
Dominik Pschenitschni 17dc276971 fix: property spelling 2022-02-14 17:00:10 +00:00
Dominik Pschenitschni ede8bc5015 [skip ci] Updated translations via Crowdin 2022-02-14 00:12:21 +00:00
Dominik Pschenitschni 924359f739 fix(button): min-height 2022-02-13 22:12:10 +00:00
Dominik Pschenitschni b84fe4c88b feat: convert api-config to script setup and ts (#1535)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1535
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-13 22:06:26 +00:00
Dominik Pschenitschni d57c9af332 fix: use BaseButton in MenuButton and fix computed (#1532)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1532
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-13 22:01:36 +00:00
Dominik Pschenitschni eac07d3169 feat: make profile picture clickable (#1531)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1531
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-13 21:57:33 +00:00
Dominik Pschenitschni 72d6701404 feat: enable strictNullChecks ts setting (#1538)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1538
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-13 21:55:46 +00:00
konrad cb395f3f69 feat: increase task drop area size for bucket list (#1512)
Reviewed-on: vikunja/frontend#1512
Reviewed-by: konrad <k@knt.li>
2022-02-13 13:12:58 +00:00
Dominik Pschenitschni 45e1ae66d6
feat: restore styling / fix styling issues 2022-02-13 13:49:32 +01:00
Dominik Pschenitschni e2c81d840f
fix: hack to fix wrong index position 2022-02-13 13:49:32 +01:00
Dominik Pschenitschni 69654b823e
feat: increase task drop area size for bucket list 2022-02-13 13:49:31 +01:00
drone f72fc79861 [skip ci] Updated translations via Crowdin 2022-02-13 00:12:36 +00:00
kolaente 80664b6182
feat: add Polish, Dutch and Portuguese translations 2022-02-12 23:49:34 +01:00
kolaente 8b90b8f6a8
fix: namespace archive success message 2022-02-12 23:41:03 +01:00
renovate 78ad9becf3 chore(deps): update dependency @vitejs/plugin-legacy to v1.7.1 (#1529)
Reviewed-on: vikunja/frontend#1529
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-12 10:26:59 +00:00
renovate 864928b378 fix(deps): update sentry-javascript monorepo to v6.17.7 (#1528)
Reviewed-on: vikunja/frontend#1528
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-12 10:26:17 +00:00
renovate c2b7d03dc5 chore(deps): update dependency eslint to v8.9.0 (#1530)
Reviewed-on: vikunja/frontend#1530
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-12 10:05:36 +00:00
renovate 4ee651cb2e chore(deps): update dependency wait-on to v6.0.1 (#1527)
Reviewed-on: vikunja/frontend#1527
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-11 07:32:28 +00:00
renovate 5716a78127 chore(deps): update dependency @fortawesome/fontawesome-svg-core to v1.3.0 (#1504)
Reviewed-on: vikunja/frontend#1504
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-11 07:28:17 +00:00
renovate d4d40a05ac chore(deps): update dependency @faker-js/faker to v6.0.0-alpha.6 (#1526)
Reviewed-on: vikunja/frontend#1526
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-10 19:15:25 +00:00
renovate f557e310c3 chore(deps): update dependency caniuse-lite to v1.0.30001311 (#1524)
Reviewed-on: vikunja/frontend#1524
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-10 10:36:42 +00:00
renovate a3cab286cd chore(deps): update dependency vitest to v0.3.2 (#1523)
Reviewed-on: vikunja/frontend#1523
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-10 10:36:20 +00:00
renovate 8f726e17ef chore(deps): update dependency rollup to v2.67.2 (#1525)
Reviewed-on: vikunja/frontend#1525
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-10 10:35:54 +00:00
drone 6aa0651013 [skip ci] Updated translations via Crowdin 2022-02-10 00:12:06 +00:00
Dominik Pschenitschni badbae0e9a
fix: mark query parameter as string 2022-02-09 17:52:27 +01:00
renovate eece690c6c fix(deps): update dependency @vueuse/router to v7.6.1 (#1521)
Reviewed-on: vikunja/frontend#1521
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-09 15:34:09 +00:00
renovate 3bd302081a chore(deps): update dependency vitest to v0.3.0 (#1519)
Reviewed-on: vikunja/frontend#1519
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-09 14:36:14 +00:00
renovate 017c025aaa chore(deps): update dependency @vitejs/plugin-vue to v2.2.0 (#1517)
Reviewed-on: vikunja/frontend#1517
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-09 08:28:33 +00:00
renovate 232d2f7c88 chore(deps): update dependency @vitejs/plugin-legacy to v1.7.0 (#1516)
Reviewed-on: vikunja/frontend#1516
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-09 07:25:52 +00:00
renovate 9b0e8a06fa chore(deps): update dependency esbuild to v0.14.21 (#1515)
Reviewed-on: vikunja/frontend#1515
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-09 06:50:19 +00:00
renovate da8144c0c7 chore(deps): update dependency caniuse-lite to v1.0.30001310 (#1514)
Reviewed-on: vikunja/frontend#1514
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-09 06:48:54 +00:00
renovate c5e5b96853 fix(deps): update sentry-javascript monorepo to v6.17.6 (#1513)
Reviewed-on: vikunja/frontend#1513
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-08 21:21:09 +00:00
Dominik Pschenitschni cf849da104 fix: make logo change reactive (#1509)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1509
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-08 20:35:03 +00:00
Dominik Pschenitschni 10bcdc8804 fix: emit function name (#1511)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1511
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-08 19:05:27 +00:00
renovate 6c7fd4ef5b fix(deps): update dependency @vueuse/core to v7.6.0 (#1507)
Reviewed-on: vikunja/frontend#1507
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-08 14:51:22 +00:00
renovate ba1ff6af81 fix(deps): update dependency @vueuse/router to v7.6.0 2022-02-08 11:02:44 +00:00
renovate 6895b5ab94 chore(deps): update dependency vitest to v0.2.8 (#1506)
Reviewed-on: vikunja/frontend#1506
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-08 06:39:14 +00:00
Dominik Pschenitschni d1d51ac998 [skip ci] Updated translations via Crowdin 2022-02-08 00:11:31 +00:00
Dominik Pschenitschni 1e0607cb86 feat: simplify config mutation (#1498)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1498
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-07 21:18:22 +00:00
renovate 83d6f30d2d chore(deps): update dependency esbuild to v0.14.20 (#1500)
Reviewed-on: vikunja/frontend#1500
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 20:55:58 +00:00
renovate bb56158112 fix(deps): update sentry-javascript monorepo to v6.17.5 (#1501)
Reviewed-on: vikunja/frontend#1501
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 20:55:46 +00:00
renovate f39d4d09cf chore(deps): update typescript-eslint monorepo to v5.11.0 (#1502)
Reviewed-on: vikunja/frontend#1502
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 20:55:30 +00:00
renovate 6aa914ad9c fix(deps): update dependency vue to v3.2.30 (#1496)
Reviewed-on: vikunja/frontend#1496
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 07:14:07 +00:00
renovate f7f4bbbf3f fix(deps): update dependency @vue/compat to v3.2.30 (#1495)
Reviewed-on: vikunja/frontend#1495
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 07:13:39 +00:00
renovate 01961f48e9 chore(deps): update dependency rollup to v2.67.1 (#1494)
Reviewed-on: vikunja/frontend#1494
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 07:13:14 +00:00
renovate 2de0337638 chore(deps): update dependency caniuse-lite to v1.0.30001309 (#1493)
Reviewed-on: vikunja/frontend#1493
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 07:12:44 +00:00
renovate 25c230cf63 chore(deps): update dependency netlify-cli to v8.16.1 (#1492)
Reviewed-on: vikunja/frontend#1492
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-07 07:12:04 +00:00
Dominik Pschenitschni f7bbd95fef [skip ci] Updated translations via Crowdin 2022-02-07 00:10:52 +00:00
kolaente 4ac7d6b9df
fix: don't reset flatpickr date 2022-02-06 23:10:35 +01:00
kolaente 7cd89b7bf1
chore: rename el 2022-02-06 23:08:34 +01:00
kolaente a22792a4b4
fix: styling 2022-02-06 23:05:40 +01:00
kolaente b1ec5b58ee
chore: use BaseButton 2022-02-06 23:05:34 +01:00
kolaente 77bf347155
chore: move styling to the correct component 2022-02-06 23:03:58 +01:00
Dominik Pschenitschni 2a4bf25d20 feat: add more default attributes to the rel attribute in link mode (#1491)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1491
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-06 21:57:32 +00:00
kolaente 204e94aa74
chore: programmatically convert filter values to snake_case 2022-02-06 20:48:37 +01:00
kolaente aac777e286
fix: lint 2022-02-06 20:32:21 +01:00
kolaente 84f177c80e
feat: reduce dependency on router and move everything to route props instead 2022-02-06 20:11:13 +01:00
kolaente 1e4ef96150
chore: cleanup unnecessary css 2022-02-06 19:41:20 +01:00
kolaente 4268eee1f2
chore: simplify nesting 2022-02-06 19:40:11 +01:00
kolaente 436c0416d7
chore: use a primary button to select range in upcoming 2022-02-06 19:39:05 +01:00
kolaente a78ca6fad3
chore: fix nesting and positioning 2022-02-06 19:38:36 +01:00
kolaente 356b291a57
chore: change return 2022-02-06 19:35:30 +01:00
kolaente 60be8b428e
chore: rename date ranges export 2022-02-06 19:33:52 +01:00
kolaente f435ca99f4
chore: change import order and useStore 2022-02-06 19:31:48 +01:00
kolaente eefe6bd413
chore: move date math explanation to separate component 2022-02-06 19:29:15 +01:00
kolaente 204136266f
chore: watch values instead of listening to changes 2022-02-06 18:56:45 +01:00
kolaente 18f7adf420
chore: use more BaseButtons 2022-02-06 18:51:47 +01:00
kolaente c5d598cac4
chore: refactor trigger to slot 2022-02-06 18:46:53 +01:00
renovate cb381e2ce9 chore(deps): update dependency esbuild to v0.14.19 (#1490)
Reviewed-on: vikunja/frontend#1490
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-06 17:12:52 +00:00
konrad 581b2cb4ab fix: related tasks add button and task dates in read only view (#1268)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1268
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-06 15:58:52 +00:00
kolaente eeee1c842a
fix: correctly send filter values 2022-02-06 16:58:23 +01:00
kolaente 6d6f2b4e33
chore: cleanup 2022-02-06 16:48:28 +01:00
kolaente cbbcb7ef23
fix: setTitle import 2022-02-06 16:36:12 +01:00
konrad 2ea3499bf7 feat: add timezone setting (#1379)
Reviewed-on: vikunja/frontend#1379
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-06 15:23:02 +00:00
kolaente bcd34efe91
chore: convert ShowTasks component to script setup and ts 2022-02-06 16:04:49 +01:00
kolaente a812793ead
feat: add setting for time zone to user settings 2022-02-06 16:04:00 +01:00
kolaente 59da6686d0
feat: add authenticated http factory to create an axios instance with bearer header 2022-02-06 16:01:56 +01:00
kolaente 6c0d091e36
Merge branch 'fix/upcoming' into feature/date-math 2022-02-06 15:29:38 +01:00
renovate 7c954e9168 chore(deps): update dependency vue-tsc to v0.31.2 (#1488)
Reviewed-on: vikunja/frontend#1488
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-06 14:09:34 +00:00
konrad 3d3ccf629a feat: add remember me style login (#1339)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1339
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-02-06 13:17:55 +00:00
kolaente 1abd36ef6e
Merge branch 'main' into fix/upcoming 2022-02-06 12:45:17 +01:00
kolaente 9e7c258347
fix: sort tasks correctly by due date 2022-02-06 12:43:42 +01:00
kolaente 7135288800
fix: lint 2022-02-06 12:43:42 +01:00
kolaente 7aa2cfc8d4
feat: add date range filter to task filters 2022-02-06 12:43:40 +01:00
kolaente 3a12be505d
feat: add prop to maybe show selected date 2022-02-06 12:42:50 +01:00
kolaente a74fc47335
fix: llama position 2022-02-06 12:42:13 +01:00
kolaente 0ae8a0e6ef
feat: add more pre-defined ranges 2022-02-06 12:42:13 +01:00
kolaente e7fa1d3383
feat: add explanation of how date math works 2022-02-06 12:42:12 +01:00
kolaente 6c55411f71
fix: now correctly showing the title of predefined ranges 2022-02-06 12:41:41 +01:00
kolaente 4d23fae9ad
fix: reset the flatpickr range when setting a date either manually or through a quick setting 2022-02-06 12:41:40 +01:00
kolaente 16f48bcc2d
fix: custom date range with nothing specified 2022-02-06 12:41:40 +01:00
kolaente 1e46849c78
feat: make sure date ranges work with date picker and vice-versa 2022-02-06 12:41:39 +01:00
kolaente 8d5bfbe828
feat: add two inputs to toggle flatpickr 2022-02-06 12:41:20 +01:00
kolaente dabe87af4b
feat: make sure showTasks can handle dynamic dates 2022-02-06 12:41:19 +01:00
kolaente 6667df5f1f
feat: move everything to fancy date math ranges 2022-02-06 12:40:23 +01:00
kolaente 32bdf16892
feat: use object and loop to set date options 2022-02-06 12:40:23 +01:00
kolaente ba20ac3b89
fix: don't try to load a langauge if there's none provided
(cherry picked from commit 210a78be86)
2022-02-06 12:28:15 +01:00
Dominik Pschenitschni c1978e2f6c [skip ci] Updated translations via Crowdin 2022-02-06 00:12:30 +00:00
kolaente 210a78be86
fix: don't try to load a langauge if there's none provided 2022-02-05 21:41:22 +01:00
kolaente ecf679d8e1
chore: completely move logic of ShowTasksInRange component to ShowTasks and remove it 2022-02-05 21:14:40 +01:00
kolaente 43e83350bd
feat: move logic of ShowTasksInRange component to ShowTasks 2022-02-05 21:12:35 +01:00
kolaente c41397f5db
feat: add slot for trigger button in <datepicker-with-range> component 2022-02-05 20:29:57 +01:00
kolaente ccd8602bfd
chore: remove unused style 2022-02-05 20:18:42 +01:00
kolaente 4e8a03066e
chore: use v-else 2022-02-05 20:17:34 +01:00
kolaente 8d13b979ec
chore: remove unrequired type 2022-02-05 20:03:16 +01:00
kolaente d272eb2a7a
Merge branch 'main' into fix/upcoming
# Conflicts:
#	src/views/tasks/ShowTasks.vue
2022-02-05 20:02:30 +01:00
Dominik Pschenitschni 8058790f9a Merge pull request 'feat: improve login and register ux' (#1104) from feature/login-improvements into main
Reviewed-on: vikunja/frontend#1104
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-02-05 17:22:43 +00:00
Dominik Pschenitschni a8ac2fc2dd
Merge branch 'main' into feature/login-improvements 2022-02-05 18:04:33 +01:00
konrad a57676bf54 feat: implement modals with vue router 4 (#816)
Reviewed-on: vikunja/frontend#816
Reviewed-by: konrad <k@knt.li>
2022-02-05 16:49:04 +00:00
Dominik Pschenitschni 9a5b5c688d
Merge branch 'fix/app-ready' into feature/vue3-modals-with-router-4 2022-02-05 17:38:28 +01:00
Dominik Pschenitschni 6827390b77
feat: merge TaskDetailViewModal with modal 2022-02-05 17:29:15 +01:00
renovate bc2ac3e3d8 chore(deps): update dependency eslint-plugin-vue to v8.4.1 (#1486)
Reviewed-on: vikunja/frontend#1486
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-04 14:36:42 +00:00
renovate 42b2cded82 chore(deps): update dependency caniuse-lite to v1.0.30001307 (#1484)
Reviewed-on: vikunja/frontend#1484
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-04 07:16:07 +00:00
renovate 2a431507dc chore(deps): update dependency vitest to v0.2.7 (#1485)
Reviewed-on: vikunja/frontend#1485
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-04 07:15:49 +00:00
renovate fdcb6b31cb chore(deps): update dependency postcss-preset-env to v7.3.1 (#1483)
Reviewed-on: vikunja/frontend#1483
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-03 10:20:37 +00:00
renovate a68ebff8df chore(deps): update dependency caniuse-lite to v1.0.30001306 (#1482)
Reviewed-on: vikunja/frontend#1482
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-03 08:43:04 +00:00
renovate 7f7126b8be chore(deps): update dependency vitest to v0.2.6 (#1481)
Reviewed-on: vikunja/frontend#1481
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-03 06:46:49 +00:00
renovate 39094ec968 chore(deps): update dependency esbuild to v0.14.18 (#1480)
Reviewed-on: vikunja/frontend#1480
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-02 20:11:05 +00:00
renovate 64425b5c6e fix(deps): update sentry-javascript monorepo to v6.17.4 (#1479)
Reviewed-on: vikunja/frontend#1479
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-02 18:34:45 +00:00
renovate 6629cdd009 chore(deps): update dependency rollup to v2.67.0 (#1478)
Reviewed-on: vikunja/frontend#1478
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-02 07:41:15 +00:00
renovate 6a833bd8c4 chore(deps): update dependency esbuild to v0.14.17 (#1477)
Reviewed-on: vikunja/frontend#1477
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-02 07:40:45 +00:00
renovate fed852baec chore(deps): update dependency caniuse-lite to v1.0.30001305 (#1476)
Reviewed-on: vikunja/frontend#1476
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-02 06:58:15 +00:00
renovate 25011e57d6 chore(deps): update dependency sass to v1.49.7 (#1475)
Reviewed-on: vikunja/frontend#1475
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-02 06:57:55 +00:00
renovate 766a6e1fce chore(deps): update dependency sass to v1.49.6 (#1474)
Reviewed-on: vikunja/frontend#1474
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-01 22:19:02 +00:00
Dominik Pschenitschni 24a154422d
chore: remove vikunjaReady from store 2022-02-01 23:09:41 +01:00
renovate bf239849ba chore(deps): update dependency sass to v1.49.5 2022-02-01 21:02:40 +00:00
kolaente dfa30258aa
chore: rename function 2022-02-01 21:25:42 +01:00
renovate 1269cfeb5b chore(deps): update dependency postcss to v8.4.6 2022-02-01 12:02:39 +00:00
renovate 95a560584f chore(deps): update dependency sass to v1.49.4 (#1470)
Reviewed-on: vikunja/frontend#1470
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-01 06:58:03 +00:00
renovate 782e45eb8f chore(deps): update dependency esbuild to v0.14.16 (#1469)
Reviewed-on: vikunja/frontend#1469
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-01 06:56:12 +00:00
renovate 1e19cf7f8b fix(deps): update dependency @github/hotkey to v2 (#1471)
Reviewed-on: vikunja/frontend#1471
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-02-01 06:55:24 +00:00
renovate 7150e20d45 chore(deps): update dependency cypress to v9.4.1 2022-01-31 22:02:49 +00:00
renovate 0dedbfa901 chore(deps): update typescript-eslint monorepo to v5.10.2 2022-01-31 19:02:56 +00:00
renovate 749eb2e6a7 fix(deps): update dependency ufo to v0.7.10 (#1466)
Reviewed-on: vikunja/frontend#1466
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-31 13:05:03 +00:00
renovate aea910e1e4 chore(deps): update dependency happy-dom to v2.31.1 (#1465)
Reviewed-on: vikunja/frontend#1465
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-31 10:35:08 +00:00
renovate 110f48ebd7 chore(deps): update dependency postcss-preset-env to v7.3.0 (#1464)
Reviewed-on: vikunja/frontend#1464
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-31 09:20:00 +00:00
renovate 8242527d0f chore(deps): update dependency netlify-cli to v8.15.0 (#1463)
Reviewed-on: vikunja/frontend#1463
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-31 06:52:45 +00:00
Dominik Pschenitschni de626eab31
feat: don't open task detail in modal for list and table view 2022-01-31 01:31:41 +01:00
kolaente 3d420c3770
fix: make isButton prop optional 2022-01-30 23:27:22 +01:00
kolaente 3e311e07cd
fix: undefined prop subscription 2022-01-30 23:18:13 +01:00
kolaente dd518ce643
Merge branch 'main' into feature/vue3-modals-with-router-4 2022-01-30 23:13:17 +01:00
kolaente 20a9ad2c9e
fix: related task within the same namespace 2022-01-30 23:12:42 +01:00
kolaente 00ffe17eb8
fix: related task with the same namespace 2022-01-30 23:07:31 +01:00
kolaente a5b0a834bc
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.
2022-01-30 22:51:29 +01:00
kolaente b7c8138ad5
fix(tests): make sure to create all lists before doing anything 2022-01-30 22:47:59 +01:00
kolaente 92864fa5c1
chore(tests): remove test result upload to s3 since we now have cypress dashboard 2022-01-30 22:35:17 +01:00
kolaente 4fc9384acc
Merge branch 'main' into feature/vue3-modals-with-router-4 2022-01-30 22:33:44 +01:00
konrad c21f236249 feat: add cypress dashboard record (#1462)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1462
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-30 21:33:27 +00:00
kolaente 9995abf64c
fix: mark broken test as skipped 2022-01-30 22:11:26 +01:00
kolaente 56fca21320
trigger ci 2022-01-30 21:54:02 +01:00
kolaente a16e8fea61
Merge branch 'fix/app-ready' into feature/vue3-modals-with-router-4 2022-01-30 21:53:24 +01:00
kolaente 2a819eccb4
revert: model properties
partially reverts de3c47dc69
2022-01-30 20:18:34 +01:00
kolaente 8f04b10e08
Revert "fix: improve ListModel typing"
This reverts commit 98b41a22c6.
2022-01-30 20:15:53 +01:00
kolaente ec65a37dcb
Merge branch 'main' into feature/vue3-modals-with-router-4 2022-01-30 19:59:11 +01:00
renovate ea710e227a chore(deps): update dependency happy-dom to v2.31.0 (#1461)
Reviewed-on: vikunja/frontend#1461
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-30 18:13:34 +00:00
Dominik Pschenitschni 0bd235cea3
fix: expose configureCompat types
see: https://github.com/vuejs/docs/pull/1475
2022-01-30 17:24:38 +01:00
konrad 81cf8f2f29 feat(tests): replace cypress-file-upload with .selectFile() (#1460)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1460
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-30 16:17:03 +00:00
Dominik Pschenitschni a325e4b721
feat: use es2022 for @typescript-eslint/parser 2022-01-30 16:59:47 +01:00
Dominik Pschenitschni 6ff621ada1
chore: ignore wrong second argument argument for cause
see: https://github.com/tc39/proposal-error-cause
2022-01-30 16:58:59 +01:00
Dominik Pschenitschni 8937b42321
feat: improve Sort component 2022-01-30 16:53:46 +01:00
Dominik Pschenitschni 6894024ad4
fix: use to.hash for returned element 2022-01-30 16:53:46 +01:00
Dominik Pschenitschni de3c47dc69
fix ts errors in various files 2022-01-30 16:53:46 +01:00
Dominik Pschenitschni 98b41a22c6
fix: improve ListModel typing 2022-01-30 16:53:45 +01:00
Dominik Pschenitschni a9fb24aa35
fix: currentList typing 2022-01-30 16:53:45 +01:00
Dominik Pschenitschni 57965b1ea3
fix: keyboard-shortcuts typing 2022-01-30 16:53:45 +01:00
Dominik Pschenitschni 187e62a7ec
feat: make subscription a BaseButton 2022-01-30 16:53:45 +01:00
Dominik Pschenitschni 24b7821c50
fix: ts errors in subscription 2022-01-30 16:53:44 +01:00
kolaente 3f893fb16d
fix(tests): don't visit / directly but use navigation instead 2022-01-30 15:25:34 +01:00
kolaente 05350affad
fix(tests): don't assert for h3 anymore 2022-01-30 14:37:41 +01:00
kolaente 6ab7aac5ce
fix(tests): wait until lists are loaded 2022-01-30 14:10:46 +01:00
kolaente 6c1857b133
fix(tests): assert absence of last viewed headline more precisely 2022-01-30 14:03:50 +01:00
kolaente 3212bc8e86
fix(tests): add more waits for namespaces loaded 2022-01-30 14:00:14 +01:00
kolaente e6eb48b5af
fix(tests): wait until namespaces are loaded before checking if the history is present 2022-01-30 13:07:08 +01:00
kolaente 423195155e
Merge branch 'main' into feature/vue3-modals-with-router-4 2022-01-30 12:40:36 +01:00
kolaente d913fa1745
fix: edge cases for dates where the next month had fewer days than the current one 2022-01-30 12:38:17 +01:00
kolaente 931941359b
fix: don't try to parse date numbers with letters around them 2022-01-30 12:37:14 +01:00
kolaente b3697cb9bf
fix: subscription icon not rendered correctly
The computed property "icon" which holds the icon string to be rendered was overriding the <icon> component. Therefore, the component wasn't rendered at all, instead vue would render a html tag with the icon name.
2022-01-29 22:30:47 +01:00
konrad c98ab42e75 feat: move lists between namespaces (#1430)
Frontend implementation of vikunja/api#1096

I've implemented this re-using the drag and drop part of rearranging the list position in the menu. The only problem we have is there's no way to check if a namespace is read-only and disable dropping a list into it. I hope to solve this in the future on the api but for now you can drop a list into it and get an error message. I felt like properly handling the error and restoring the list and its position given this will change anyway.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1430
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-29 21:12:46 +00:00
renovate f5a92d1aec chore(deps): update dependency caniuse-lite to v1.0.30001304 (#1459)
Reviewed-on: vikunja/frontend#1459
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-29 20:54:49 +00:00
renovate fb17adcfe3 chore(deps): update dependency eslint to v8.8.0 (#1458)
Reviewed-on: vikunja/frontend#1458
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-28 22:45:24 +00:00
renovate 198c97af57 fix(deps): update sentry-javascript monorepo to v6.17.3 (#1457)
Reviewed-on: vikunja/frontend#1457
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-28 20:05:01 +00:00
renovate 3ff4f3516f chore(deps): update dependency vitest to v0.2.5 (#1456)
Reviewed-on: vikunja/frontend#1456
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-28 14:02:34 +00:00
renovate ab5d768895 fix(deps): update dependency vue-i18n to v9.2.0-beta.30 (#1454)
Reviewed-on: vikunja/frontend#1454
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-27 20:04:32 +00:00
renovate 0d2ff42673 chore(deps): update dependency caniuse-lite to v1.0.30001303 (#1453)
Reviewed-on: vikunja/frontend#1453
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-27 09:29:26 +00:00
renovate aeb548ee09 fix(deps): update dependency marked to v4.0.12 (#1452)
Reviewed-on: vikunja/frontend#1452
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-27 09:29:08 +00:00
renovate f168e36f68 chore(deps): update dependency eslint-plugin-vue to v8.4.0 (#1451)
Reviewed-on: vikunja/frontend#1451
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-27 09:28:49 +00:00
renovate 691644a3a3 chore(deps): update dependency vitest to v0.2.4 (#1450)
Reviewed-on: vikunja/frontend#1450
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-27 09:28:11 +00:00
renovate 0075ca0c99 fix(deps): update dependency marked to v4.0.11 (#1449)
Reviewed-on: vikunja/frontend#1449
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-26 22:14:59 +00:00
renovate 83676f51b5 fix(deps): update dependency dompurify to v2.3.5 (#1448)
Reviewed-on: vikunja/frontend#1448
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-26 19:26:16 +00:00
kolaente fdd2e7e538
fix: vuex store mutation violation when archiving a namespace 2022-01-26 14:36:32 +01:00
renovate 9e4ea9e597 chore(deps): update dependency caniuse-lite to v1.0.30001302 (#1447)
Reviewed-on: vikunja/frontend#1447
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-26 08:27:25 +00:00
renovate e0141f4a38 chore(deps): update dependency esbuild to v0.14.14 (#1446)
Reviewed-on: vikunja/frontend#1446
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-26 07:12:23 +00:00
renovate d3e95adc32 chore(deps): update dependency happy-dom to v2.30.1 (#1445)
Reviewed-on: vikunja/frontend#1445
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 22:11:13 +00:00
renovate 07ac1245a9 fix(deps): update sentry-javascript monorepo to v6.17.2 (#1444)
Reviewed-on: vikunja/frontend#1444
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 21:18:23 +00:00
renovate 075a7875bf fix(deps): update dependency @vueuse/core to v7.5.5 (#1442)
Reviewed-on: vikunja/frontend#1442
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 17:28:08 +00:00
renovate 43a537ef5b fix(deps): update dependency @vueuse/router to v7.5.5 (#1443)
Reviewed-on: vikunja/frontend#1443
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 16:25:34 +00:00
renovate 52a613bf7f chore(deps): update dependency @faker-js/faker to v6.0.0-alpha.5 (#1436)
Reviewed-on: vikunja/frontend#1436
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 16:00:36 +00:00
renovate 8e806f9308 chore(deps): update dependency vitest to v0.2.3 (#1441)
Reviewed-on: vikunja/frontend#1441
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 13:29:11 +00:00
renovate df5300fa02 chore(deps): update dependency vitest to v0.2.2 (#1440)
Reviewed-on: vikunja/frontend#1440
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 10:40:43 +00:00
renovate f469cac4d1 chore(deps): update dependency rollup to v2.66.1 (#1439)
Reviewed-on: vikunja/frontend#1439
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 09:21:08 +00:00
renovate 7ad200179b fix(deps): update dependency vue-i18n to v9.2.0-beta.29 (#1438)
Reviewed-on: vikunja/frontend#1438
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 08:08:40 +00:00
renovate f9eceeb6b6 chore(deps): update dependency happy-dom to v2.30.0 (#1437)
Reviewed-on: vikunja/frontend#1437
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-25 08:07:43 +00:00
renovate 3a82fd4ad9 fix(deps): update sentry-javascript monorepo to v6.17.1 (#1434)
Reviewed-on: vikunja/frontend#1434
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-24 19:47:51 +00:00
renovate 733e3c20c6 chore(deps): update typescript-eslint monorepo to v5.10.1 (#1435)
Reviewed-on: vikunja/frontend#1435
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-24 19:47:34 +00:00
renovate 842249eb2c chore(deps): update dependency vitest to v0.2.1 (#1433)
Reviewed-on: vikunja/frontend#1433
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-24 12:28:34 +00:00
renovate 7458130ee3 fix(deps): update sentry-javascript monorepo to v6.17.0 (#1432)
Reviewed-on: vikunja/frontend#1432
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-24 08:19:48 +00:00
renovate 19fd2d603b chore(deps): update dependency netlify-cli to v8.13.0 (#1431)
Reviewed-on: vikunja/frontend#1431
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-24 07:26:48 +00:00
konrad cd92d224a2 Merge branch 'main' into feature/login-improvements 2022-01-23 17:06:49 +00:00
renovate fc1f3966e6 fix(deps): update dependency vue to v3.2.29 (#1429)
Reviewed-on: vikunja/frontend#1429
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 15:57:32 +00:00
renovate 5886577108 fix(deps): update dependency @vue/compat to v3.2.29 (#1428)
Reviewed-on: vikunja/frontend#1428
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 15:57:20 +00:00
renovate e87311c746 fix(deps): update dependency vue-advanced-cropper to v2.8.0 (#1425)
Reviewed-on: vikunja/frontend#1425
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 13:00:10 +00:00
renovate 7c1c6b7dfc chore(deps): update dependency vitest to v0.2.0 (#1427)
Reviewed-on: vikunja/frontend#1427
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 13:00:01 +00:00
renovate 55b77725df chore(deps): update dependency rollup to v2.66.0 (#1424)
Reviewed-on: vikunja/frontend#1424
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 11:34:17 +00:00
renovate 55b710dbfa chore(deps): update dependency esbuild to v0.14.13 (#1426)
Reviewed-on: vikunja/frontend#1426
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 11:34:08 +00:00
renovate af6c48fd2e chore(deps): update dependency vue-tsc to v0.31.1 (#1423)
Reviewed-on: vikunja/frontend#1423
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-23 11:33:50 +00:00
renovate 692722d826 chore(deps): update dependency vitest to v0.1.27 (#1422)
Reviewed-on: vikunja/frontend#1422
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-22 06:42:01 +00:00
renovate 3f7fd3b9c0 chore(deps): update dependency @vitejs/plugin-vue to v2.1.0 (#1421)
Reviewed-on: vikunja/frontend#1421
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-22 06:41:09 +00:00
renovate 2f18d742e0 fix(deps): update dependency @vueuse/core to v7.5.4 (#1419)
Reviewed-on: vikunja/frontend#1419
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 13:00:05 +00:00
renovate aa182d1517 fix(deps): update dependency @vueuse/router to v7.5.4 (#1420)
Reviewed-on: vikunja/frontend#1420
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 11:33:51 +00:00
renovate 3ad133c5d6 chore(deps): update dependency vitest to v0.1.26 (#1418)
Reviewed-on: vikunja/frontend#1418
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 10:22:40 +00:00
renovate 3d1f2d8a77 fix(deps): update dependency vue to v3.2.28 (#1417)
Reviewed-on: vikunja/frontend#1417
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 10:08:00 +00:00
renovate 3e415cd7c9 fix(deps): update dependency @vue/compat to v3.2.28 (#1416)
Reviewed-on: vikunja/frontend#1416
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 10:07:29 +00:00
renovate 0215b4bcf9 chore(deps): update dependency rollup to v2.65.0 (#1415)
Reviewed-on: vikunja/frontend#1415
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 08:35:27 +00:00
renovate 9236a7cec8 chore(deps): update dependency vitest to v0.1.25 (#1411)
Reviewed-on: vikunja/frontend#1411
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 08:35:05 +00:00
renovate 8a2694a2f0 chore(deps): update dependency caniuse-lite to v1.0.30001301 (#1414)
Reviewed-on: vikunja/frontend#1414
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 08:34:41 +00:00
renovate 240ab2a72f chore(deps): update dependency happy-dom to v2.28.0 (#1412)
Reviewed-on: vikunja/frontend#1412
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 07:12:22 +00:00
renovate 9f5754ee42 chore(deps): update dependency esbuild to v0.14.12 (#1413)
Reviewed-on: vikunja/frontend#1413
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-21 07:11:56 +00:00
renovate f10152718c chore(deps): update dependency typescript to v4.5.5 (#1410)
Reviewed-on: vikunja/frontend#1410
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-20 19:35:54 +00:00
renovate 365a017efe fix(deps): update dependency codemirror to v5.65.1 (#1409)
Reviewed-on: vikunja/frontend#1409
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-20 13:33:38 +00:00
Dominik Pschenitschni 6db0559b81 fix: replace faker with community fork faker-js/faker (#1408)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1408
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-01-20 07:54:39 +00:00
Dominik Pschenitschni 5867f79735
fix: use AsyncEditor again in comments and description 2022-01-19 23:26:34 +01:00
Dominik Pschenitschni 959b53b3a6
chore: remove console.log 2022-01-19 23:16:44 +01:00
Dominik Pschenitschni c896ad5883
fix: subscription prop validation linting 2022-01-19 23:07:02 +01:00
renovate cae351d9bd chore(deps): update dependency vitest to v0.1.24 2022-01-19 20:02:33 +00:00
renovate faa34ee692 chore(deps): update dependency happy-dom to v2.27.2 (#1406)
Reviewed-on: vikunja/frontend#1406
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-19 19:27:00 +00:00
renovate 136ded9f73 chore(deps): update dependency sass to v1.49.0 (#1403)
Reviewed-on: vikunja/frontend#1403
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-19 08:53:05 +00:00
renovate 5661b352c0 chore(deps): update dependency vitest to v0.1.23 (#1405)
Reviewed-on: vikunja/frontend#1405
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-19 08:52:45 +00:00
renovate 02c551fdbc chore(deps): update dependency vue-tsc to v0.30.6 (#1404)
Reviewed-on: vikunja/frontend#1404
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-19 07:00:25 +00:00
renovate 2d7cafd329 chore(deps): update dependency cypress to v9.3.1 (#1402)
Reviewed-on: vikunja/frontend#1402
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-19 06:59:47 +00:00
renovate 7107044cc6 chore(deps): update dependency vite to v2.7.13 (#1401)
Reviewed-on: vikunja/frontend#1401
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-19 06:58:13 +00:00
Dominik Pschenitschni 375c3adfb1 fix: show namespace count for long titles (#1057)
When the namespace title is to long the count was only shown in the toolip. With this pull request the count is separated from the title and always shown.

Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Co-authored-by: kolaente <k@knt.li>
Co-authored-by: konrad <k@knt.li>
Reviewed-on: vikunja/frontend#1057
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-01-19 06:57:45 +00:00
drone 637f2e9742 [skip ci] Updated translations via Crowdin 2022-01-18 22:22:48 +00:00
kolaente 0548649257
fix: lint 2022-01-18 23:12:28 +01:00
renovate 4a290214c0 chore(deps): update dependency vitest to v0.1.21 (#1400)
Reviewed-on: vikunja/frontend#1400
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-18 21:54:50 +00:00
kolaente 8555ffcd17
Merge branch 'main' into feature/vue3-modals-with-router-4 2022-01-18 22:27:32 +01:00
kolaente ca938b8615
fix: subscription prop validation 2022-01-18 22:26:27 +01:00
kolaente 6a6203f553
fix: label edit spacing 2022-01-18 22:22:32 +01:00
kolaente ff9e1b3fca
fix: vuex store manipulation warning when modifying task labels 2022-01-18 22:12:08 +01:00
kolaente 1818ed3648
fix: scrolling to heading if it wasn't available 2022-01-18 22:00:13 +01:00
kolaente 8233c8c953
fix: check if a shortcut has an available function before trying to invoke it 2022-01-18 21:51:24 +01:00
kolaente e2d9aa3d7f
Merge branch 'main' into feature/vue3-modals-with-router-4
# Conflicts:
#	src/router/index.ts
#	src/views/tasks/TaskDetailView.vue
2022-01-18 21:47:17 +01:00
kolaente 50c3bcd793 fix: don't try to format invalid dates as ISO 2022-01-18 20:43:52 +00:00
kolaente 2e77df2db2 fix(a11y): remove wrong aria-label 2022-01-18 20:43:52 +00:00
kolaente 56d321e513 feat(a11y): make sure the contrast for the primary color works with dark and light themes 2022-01-18 20:43:52 +00:00
kolaente cb776872aa feat(a11y): honor prefer-reduced-motion 2022-01-18 20:43:52 +00:00
kolaente c255e3f025 feat(a11y): add aria-expanded 2022-01-18 20:43:52 +00:00
kolaente b96af50338 feat(a11y): use better markup tags everywhere 2022-01-18 20:43:52 +00:00
kolaente 0e47cebed5 feat(a11y): use <time> tag for dates everywhere 2022-01-18 20:43:52 +00:00
kolaente 443a9c14b9
fix: attachment meta data not aligned properly 2022-01-18 21:42:43 +01:00
kolaente cc3fcdf1c3
fix: keyboard shortcut message bottom margin 2022-01-18 21:33:10 +01:00
kolaente b73165fce4
fix: update available text color in dark mode 2022-01-18 21:31:40 +01:00
drone 729432bceb [skip ci] Updated translations via Crowdin 2022-01-18 18:18:15 +00:00
drone eddccc709d [skip ci] Updated translations via Crowdin 2022-01-18 14:18:13 +00:00
renovate 559ff5f7f7 chore(deps): update typescript-eslint monorepo to v5.10.0 (#1396)
Reviewed-on: vikunja/frontend#1396
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-18 09:04:07 +00:00
renovate b5661de152 chore(deps): update dependency happy-dom to v2.27.0 (#1397)
Reviewed-on: vikunja/frontend#1397
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-18 09:03:20 +00:00
renovate 3a1ce7458b chore(deps): update dependency vitest to v0.1.20 (#1398)
Reviewed-on: vikunja/frontend#1398
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-18 09:02:59 +00:00
renovate 2f938fe695 chore(deps): update dependency axios to v0.25.0 (#1399)
Reviewed-on: vikunja/frontend#1399
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-18 09:02:28 +00:00
renovate f2d7ee2be0 chore(deps): update dependency vitest to v0.1.19 2022-01-17 16:05:17 +00:00
renovate d673150d8a chore(deps): update dependency vitest to v0.1.18 (#1393)
Reviewed-on: vikunja/frontend#1393
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-17 10:50:27 +00:00
renovate 2ca5b3c817 chore(deps): update dependency caniuse-lite to v1.0.30001300 (#1391)
Reviewed-on: vikunja/frontend#1391
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-17 08:42:06 +00:00
renovate 017f82dad7 chore(deps): update dependency vue-tsc to v0.30.5 (#1392)
Reviewed-on: vikunja/frontend#1392
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-17 08:41:49 +00:00
kolaente 26a94c7e8c
fix: some typechecks
Most of what's still left now is related to models not exporting visible properties for typescript, that's a problem for another day.
2022-01-16 22:24:51 +01:00
renovate 654f5f8f57 chore(deps): update dependency vue-tsc to v0.30.4 (#1389)
Reviewed-on: vikunja/frontend#1389
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-16 16:16:12 +00:00
renovate e3ed0b2f1f fix(deps): update vue monorepo to v3.2.27 (#1387)
Reviewed-on: vikunja/frontend#1387
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-16 15:24:20 +00:00
renovate 2e99a0ed29 chore(deps): update dependency vue-tsc to v0.30.3 (#1386)
Reviewed-on: vikunja/frontend#1386
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-16 14:16:17 +00:00
renovate d450096303 chore(deps): update dependency vitest to v0.1.17 (#1385)
Reviewed-on: vikunja/frontend#1385
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-16 10:49:54 +00:00
renovate 315a50e5b2 chore(deps): update dependency eslint to v8.7.0 (#1384)
Reviewed-on: vikunja/frontend#1384
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-16 10:49:36 +00:00
renovate 5e4a9cca0c fix(deps): update dependency easymde to v2.16.1 2022-01-15 22:02:00 +00:00
renovate 864669fd3f chore(deps): update dependency vitest to v0.1.16 (#1382)
Reviewed-on: vikunja/frontend#1382
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-15 21:09:55 +00:00
renovate 010c4a2a3d chore(deps): update dependency rollup-plugin-visualizer to v5.5.4 (#1381)
Reviewed-on: vikunja/frontend#1381
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-15 21:09:48 +00:00
kolaente 9446550ce9
chore: update netlify-cli only weekly 2022-01-14 22:20:32 +01:00
kolaente c7ac81a99f
fix: save user language when it wasn't saved previously 2022-01-14 22:11:13 +01:00
renovate c8558e6b25 chore(deps): update dependency rollup to v2.64.0 (#1377)
Reviewed-on: vikunja/frontend#1377
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-14 15:09:06 +00:00
renovate 97ef78f1b0 chore(deps): update dependency netlify-cli to v8.8.2 (#1376)
Reviewed-on: vikunja/frontend#1376
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-14 15:08:51 +00:00
renovate 8a97483dc2 chore(deps): update dependency vitest to v0.1.13 (#1375)
Reviewed-on: vikunja/frontend#1375
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-14 10:08:50 +00:00
renovate 47b9878846 chore(deps): update dependency netlify-cli to v8.8.1 (#1374)
Reviewed-on: vikunja/frontend#1374
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-13 21:16:19 +00:00
renovate e8086aac39 chore(deps): update dependency vite to v2.7.12 (#1373)
Reviewed-on: vikunja/frontend#1373
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-13 20:23:21 +00:00
renovate b0ac968fbf chore(deps): update dependency netlify-cli to v8.8.0 (#1372)
Reviewed-on: vikunja/frontend#1372
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-13 15:15:48 +00:00
renovate ea8a5df0b5 chore(deps): update dependency vite to v2.7.11 2022-01-13 12:02:46 +00:00
renovate a03b7be194 fix(deps): update dependency marked to v4.0.10 2022-01-13 11:12:34 +00:00
renovate 3128e76e7a chore(deps): update dependency happy-dom to v2.25.2 2022-01-13 11:12:11 +00:00
renovate b17b7ec296 chore(deps): update dependency sass to v1.48.0 2022-01-13 11:11:43 +00:00
renovate ecd61cca63 chore(deps): update dependency vitest to v0.1.12 2022-01-13 11:11:19 +00:00
renovate 411847cd79 fix(deps): update dependency vue-i18n to v9.2.0-beta.28 2022-01-13 10:03:07 +00:00
renovate 1fe5e4bd8e chore(deps): update dependency vitest to v0.0.142 (#1365)
Reviewed-on: vikunja/frontend#1365
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 21:29:09 +00:00
drone b6788d9367 [skip ci] Updated translations via Crowdin 2022-01-12 21:10:32 +00:00
kolaente 796a56d5d8
fix: translation typo 2022-01-12 19:53:02 +01:00
renovate 9d1ebd675d chore(deps): update dependency netlify-cli to v8.6.23 (#1363)
Reviewed-on: vikunja/frontend#1363
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 18:15:26 +00:00
renovate 33cefd2c3e chore(deps): update dependency vite-plugin-pwa to v0.11.13 (#1364)
Reviewed-on: vikunja/frontend#1364
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 18:13:32 +00:00
renovate 1484c282eb chore(deps): update dependency postcss-preset-env to v7.2.3 (#1361)
Reviewed-on: vikunja/frontend#1361
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 16:39:59 +00:00
renovate f2c0460fdb fix(deps): update dependency v-tooltip to v4.0.0-beta.17 (#1362)
Reviewed-on: vikunja/frontend#1362
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 16:39:43 +00:00
renovate 6d6843fe96 chore(deps): update dependency netlify-cli to v8.6.22 (#1359)
Reviewed-on: vikunja/frontend#1359
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 14:27:00 +00:00
renovate e278bb4840 chore(deps): update dependency eslint-plugin-vue to v8.3.0 (#1360)
Reviewed-on: vikunja/frontend#1360
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 14:01:29 +00:00
renovate 14f999ba55 chore(deps): update dependency postcss-preset-env to v7.2.2 (#1358)
Reviewed-on: vikunja/frontend#1358
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 14:00:41 +00:00
renovate c85d1c241e chore(deps): update dependency caniuse-lite to v1.0.30001299 (#1357)
Reviewed-on: vikunja/frontend#1357
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-12 14:00:05 +00:00
renovate fa4560d4af fix(deps): update dependency easymde to v2.16.0 (#1356)
Reviewed-on: vikunja/frontend#1356
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 22:20:19 +00:00
renovate bd5483f100 chore(deps): update dependency netlify-cli to v8.6.21 (#1353)
Reviewed-on: vikunja/frontend#1353
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 20:41:12 +00:00
renovate 9c50fb3f4e fix(deps): update dependency v-tooltip to v4.0.0-beta.16 (#1354)
Reviewed-on: vikunja/frontend#1354
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 20:40:47 +00:00
renovate 23dc74b373 chore(deps): update dependency vitest to v0.0.141 (#1355)
Reviewed-on: vikunja/frontend#1355
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 20:40:15 +00:00
renovate 7ec5023c45 chore(deps): update dependency netlify-cli to v8.6.19 (#1352)
Reviewed-on: vikunja/frontend#1352
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 15:28:20 +00:00
renovate 9dbec1e11d chore(deps): update dependency vite-svg-loader to v3.1.2 (#1351)
Reviewed-on: vikunja/frontend#1351
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 13:14:31 +00:00
renovate 31ddc6cc5a chore(deps): update dependency netlify-cli to v8.6.18 (#1350)
Reviewed-on: vikunja/frontend#1350
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 06:59:09 +00:00
renovate c4bd5702ad chore(deps): update dependency cypress to v9.2.1 (#1349)
Reviewed-on: vikunja/frontend#1349
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-11 06:58:49 +00:00
renovate 9bb6360e05 chore(deps): update typescript-eslint monorepo to v5.9.1 (#1347)
Reviewed-on: vikunja/frontend#1347
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-10 21:25:43 +00:00
renovate 1570cccc36 chore(deps): update dependency vitest to v0.0.140 (#1348)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [vitest](https://github.com/vitest-dev/vitest) | devDependencies | patch | [`0.0.139` -> `0.0.140`](https://renovatebot.com/diffs/npm/vitest/0.0.139/0.0.140) |

---

### Release Notes

<details>
<summary>vitest-dev/vitest</summary>

### [`v0.0.140`](https://github.com/vitest-dev/vitest/releases/v0.0.140)

[Compare Source](https://github.com/vitest-dev/vitest/compare/v0.0.139...v0.0.140)

##### Bug Fixes

-   inline snapshot if not called inside suite ([6d743c5](https://github.com/vitest-dev/vitest/commit/6d743c5)), closes [#&#8203;484](https://github.com/vitest-dev/vitest/issues/484)
-   **ui:** flex / percentage based layout ([#&#8203;492](https://github.com/vitest-dev/vitest/issues/492)) ([c43ebaf](https://github.com/vitest-dev/vitest/commit/c43ebaf))
-   correctly inline shapshot with properties ([4603ffd](https://github.com/vitest-dev/vitest/commit/4603ffd))
-   mocking is lost with threads: false ([28b97d8](https://github.com/vitest-dev/vitest/commit/28b97d8)), closes [#&#8203;482](https://github.com/vitest-dev/vitest/issues/482)
-   Reflect.get called on non-object ([3c9073a](https://github.com/vitest-dev/vitest/commit/3c9073a)), closes [#&#8203;479](https://github.com/vitest-dev/vitest/issues/479)
-   snapshot ignores indentation ([aff1481](https://github.com/vitest-dev/vitest/commit/aff1481))
-   **ui:** reduce graph container size ([#&#8203;478](https://github.com/vitest-dev/vitest/issues/478)) ([23e1e62](https://github.com/vitest-dev/vitest/commit/23e1e62))

##### Features

-   global setup ([#&#8203;372](https://github.com/vitest-dev/vitest/issues/372)) ([eaa119f](https://github.com/vitest-dev/vitest/commit/eaa119f))
-   **ui:** tasks state group ([7782e7d](https://github.com/vitest-dev/vitest/commit/7782e7d))

</details>

---

### Configuration

📅 **Schedule**: At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box.

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Reviewed-on: vikunja/frontend#1348
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-10 21:23:42 +00:00
renovate b31008fe20 fix(deps): update dependency v-tooltip to v4.0.0-beta.15 (#1346)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [v-tooltip](https://github.com/Akryum/vue-tooltip) | dependencies | patch | [`4.0.0-beta.14` -> `4.0.0-beta.15`](https://renovatebot.com/diffs/npm/v-tooltip/4.0.0-beta.14/4.0.0-beta.15) |

---

### Release Notes

<details>
<summary>Akryum/vue-tooltip</summary>

### [`v4.0.0-beta.15`](https://github.com/Akryum/vue-tooltip/compare/v4.0.0-beta.14...v4.0.0-beta.15)

[Compare Source](https://github.com/Akryum/vue-tooltip/compare/v4.0.0-beta.14...v4.0.0-beta.15)

</details>

---

### Configuration

📅 **Schedule**: At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box.

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Reviewed-on: vikunja/frontend#1346
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-10 18:45:24 +00:00
renovate d3efcb499f chore(deps): update dependency netlify-cli to v8.6.17 (#1345)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [netlify-cli](https://github.com/netlify/cli) | devDependencies | patch | [`8.6.16` -> `8.6.17`](https://renovatebot.com/diffs/npm/netlify-cli/8.6.16/8.6.17) |

---

### Release Notes

<details>
<summary>netlify/cli</summary>

### [`v8.6.17`](https://github.com/netlify/cli/blob/master/CHANGELOG.md#&#8203;8617-httpsgithubcomnetlifyclicomparev8616v8617-2022-01-10)

[Compare Source](https://github.com/netlify/cli/compare/v8.6.16...v8.6.17)

</details>

---

### Configuration

📅 **Schedule**: At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box.

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Reviewed-on: vikunja/frontend#1345
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-10 13:22:00 +00:00
renovate 23e2550534 fix(deps): update dependency v-tooltip to v4.0.0-beta.14 (#1344)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [v-tooltip](https://github.com/Akryum/vue-tooltip) | dependencies | patch | [`4.0.0-beta.13` -> `4.0.0-beta.14`](https://renovatebot.com/diffs/npm/v-tooltip/4.0.0-beta.13/4.0.0-beta.14) |

---

### Release Notes

<details>
<summary>Akryum/vue-tooltip</summary>

### [`v4.0.0-beta.14`](https://github.com/Akryum/vue-tooltip/compare/v4.0.0-beta.13...v4.0.0-beta.14)

[Compare Source](https://github.com/Akryum/vue-tooltip/compare/v4.0.0-beta.13...v4.0.0-beta.14)

</details>

---

### Configuration

📅 **Schedule**: At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box.

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Reviewed-on: vikunja/frontend#1344
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-10 13:07:52 +00:00
renovate c3bc2e470c chore(deps): update dependency netlify-cli to v8.6.16 (#1343)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [netlify-cli](https://github.com/netlify/cli) | devDependencies | patch | [`8.6.15` -> `8.6.16`](https://renovatebot.com/diffs/npm/netlify-cli/8.6.15/8.6.16) |

---

### Release Notes

<details>
<summary>netlify/cli</summary>

### [`v8.6.16`](https://github.com/netlify/cli/blob/master/CHANGELOG.md#&#8203;8616-httpsgithubcomnetlifyclicomparev8615v8616-2022-01-10)

[Compare Source](https://github.com/netlify/cli/compare/v8.6.15...v8.6.16)

</details>

---

### Configuration

📅 **Schedule**: At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box.

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).

Reviewed-on: vikunja/frontend#1343
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-10 12:07:57 +00:00
kolaente 01323a1b45
Merge branch 'main' into fix/upcoming
# Conflicts:
#	src/views/tasks/ShowTasks.vue
2022-01-09 11:48:37 +01:00
drone 8d811fcf19 [skip ci] Updated translations via Crowdin 2022-01-09 10:29:59 +00:00
konrad 6080e49f26 fix: flatpickr date not updating (#1336)
Fixes https://github.com/go-vikunja/api/issues/16

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1336
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-09 10:17:18 +00:00
konrad ed88fb91bc fix: don't recognize emails in quick add magic (#1335)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1335
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-09 10:17:01 +00:00
konrad 76fe2ceac6 fix: editor color in dark mode (#1338)
This PR fixes the editor colors in dark mode. It bothered me enough to finally fix it :)
The implementation is probably only "good enough" as we'll replace the editor anyway in the future.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#1338
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-09 10:16:13 +00:00
renovate 99da6bb19a chore(deps): update dependency esbuild to v0.14.11 (#1341)
Reviewed-on: vikunja/frontend#1341
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-09 08:01:25 +00:00
drone c2e4fc1e3c [skip ci] Updated translations via Crowdin 2022-01-08 22:31:19 +00:00
dmorlitz 044f2b927d feat: changed green "Done" button to read "Mark task done" (#1340)
The green button can be confusing because the wording "Done" can be interpreted as "done editing the task" or "the task should be marked as done". Changing the text in the button makes the description more precise.

Co-authored-by: David Morlitz <david@morlitz.com>
Reviewed-on: vikunja/frontend#1340
Reviewed-by: konrad <k@knt.li>
Co-authored-by: dmorlitz <david@morlitz.com>
Co-committed-by: dmorlitz <david@morlitz.com>
2022-01-08 21:18:06 +00:00
kolaente 0473c385d6
fix: editor cursor color 2022-01-08 17:34:13 +01:00
kolaente 55826bb8c9
fix: make sure the app is fully ready before trying to redirect to the login page 2022-01-08 15:44:33 +01:00
kolaente 68a76faacc
fix: don't reset active fields when saving
Resolves #590
2022-01-08 15:13:49 +01:00
kolaente 4579dd3ce7
fix: button size on task detail view 2022-01-08 15:11:55 +01:00
kolaente 19a161ff78
fix: password validation field in test 2022-01-08 13:49:07 +01:00
kolaente 310578d349
Merge branch 'main' into feature/login-improvements
# Conflicts:
#	src/components/misc/no-auth-wrapper.vue
#	src/styles/components/_index.scss
#	src/views/user/Login.vue
#	src/views/user/Register.vue
2022-01-08 13:44:35 +01:00
renovate f4fee26fe4 chore(deps): update dependency sass to v1.47.0 (#1333)
Reviewed-on: vikunja/frontend#1333
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-08 11:03:51 +00:00
renovate 00398085fd chore(deps): update dependency caniuse-lite to v1.0.30001298 (#1334)
Reviewed-on: vikunja/frontend#1334
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-08 10:54:58 +00:00
renovate 13c8e6dbcd fix(deps): update dependency v-tooltip to v4.0.0-beta.13 (#1332)
Reviewed-on: vikunja/frontend#1332
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-07 16:21:41 +00:00
renovate 1b5f8a069b chore(deps): update dependency netlify-cli to v8.6.15 (#1331)
Reviewed-on: vikunja/frontend#1331
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-07 16:21:27 +00:00
renovate 21fec9461d chore(deps): update dependency vitest to v0.0.139 (#1330)
Reviewed-on: vikunja/frontend#1330
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-07 16:21:11 +00:00
renovate df3af739f8 chore(deps): update dependency autoprefixer to v10.4.2 (#1329)
Reviewed-on: vikunja/frontend#1329
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-07 16:20:45 +00:00
renovate b08d34bc96 fix(deps): update dependency v-tooltip to v4.0.0-beta.11 (#1326)
Reviewed-on: vikunja/frontend#1326
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-07 08:26:54 +00:00
renovate be03efd015 chore(deps): update dependency caniuse-lite to v1.0.30001297 (#1327)
Reviewed-on: vikunja/frontend#1327
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-07 08:26:35 +00:00
renovate c353fd151d chore(deps): update dependency vitest to v0.0.136 (#1325)
Reviewed-on: vikunja/frontend#1325
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 21:23:31 +00:00
renovate c32e9badf0 chore(deps): update dependency netlify-cli to v8.6.12 (#1322)
Reviewed-on: vikunja/frontend#1322
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 19:39:31 +00:00
renovate 8f64ab5dce chore(deps): update dependency vitest to v0.0.135 (#1323)
Reviewed-on: vikunja/frontend#1323
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 19:39:11 +00:00
renovate 63ca8ffc7c fix(deps): update dependency v-tooltip to v4.0.0-beta.10 (#1324)
Reviewed-on: vikunja/frontend#1324
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 19:38:46 +00:00
renovate fe9ddf33ca fix(deps): update dependency marked to v4.0.9 (#1321)
Reviewed-on: vikunja/frontend#1321
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 16:26:02 +00:00
renovate 74777d6bed chore(deps): update dependency netlify-cli to v8.6.9 (#1320)
Reviewed-on: vikunja/frontend#1320
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 16:25:44 +00:00
renovate 76d1c56fab chore(deps): update dependency netlify-cli to v8.6.8 (#1318)
Reviewed-on: vikunja/frontend#1318
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 15:23:22 +00:00
renovate f75e9135c2 fix(deps): update dependency highlight.js to v11.4.0 (#1319)
Reviewed-on: vikunja/frontend#1319
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 15:23:08 +00:00
renovate 480f0f8da9 fix(deps): update dependency v-tooltip to v4.0.0-beta.8 (#1317)
Reviewed-on: vikunja/frontend#1317
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 14:05:02 +00:00
renovate ac832186d6 chore(deps): update dependency netlify-cli to v8.6.6 (#1316)
Reviewed-on: vikunja/frontend#1316
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 11:38:23 +00:00
renovate 738e1e8370 chore(deps): update dependency sass to v1.46.0 (#1315)
Reviewed-on: vikunja/frontend#1315
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 11:10:06 +00:00
Dominik Pschenitschni 9b85817ddb feat: run vue-tsc in ci (#1295)
We had this in for a while already, but never cared for the result.
Might make sense to integrate in the pipeline.

To make things easy from the start we could add [`failure: ignore`](https://docs.drone.io/pipeline/macstadium/syntax/steps/#failure) to the step

Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1295
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-01-06 10:37:51 +00:00
Dominik Pschenitschni 49a6569db0 fix: remove obsolet code (#1312)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1312
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-01-06 10:34:14 +00:00
renovate e762f7f073 chore(deps): update dependency vitest to v0.0.134 (#1314)
Reviewed-on: vikunja/frontend#1314
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-06 10:33:07 +00:00
renovate e5d2b23cb3 chore(deps): update dependency netlify-cli to v8.6.5 2022-01-05 21:05:56 +00:00
renovate 6eddf23c0d fix(deps): update dependency vue-advanced-cropper to v2.7.1 2022-01-05 17:03:11 +00:00
renovate 70934c6a0b fix(deps): pin dependency @types/is-touch-device to 1.0.0 (#1308)
Reviewed-on: vikunja/frontend#1308
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-05 16:45:48 +00:00
Dominik Pschenitschni 49955eb03a
fix: remove some of the typescript warnings 2022-01-05 16:17:14 +01:00
renovate 2b302974cc chore(deps): update dependency vitest to v0.0.133 2022-01-05 14:52:22 +00:00
Dominik Pschenitschni 64d632b0a5 [skip ci] Updated translations via Crowdin 2022-01-05 14:36:24 +00:00
Dominik Pschenitschni e28f0f5be4 chore(addTask) improve order (#1297)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1297
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-01-05 13:14:50 +00:00
konrad c618b7e0b6 fix: namespace new buttons on mobile (#1262)
Before:

![image](/attachments/7626e28d-8a13-4f92-b162-697676f765c7)

After:

![image](/attachments/5331af47-4887-4ba5-98d7-ee70311e20d7)

Co-authored-by: kolaente <k@knt.li>
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1262
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2022-01-05 12:46:33 +00:00
renovate 380af7fbf2 fix(deps): update dependency @vueuse/router to v7.5.3 (#1303)
Reviewed-on: vikunja/frontend#1303
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2022-01-05 11:44:12 +00:00
renovate 9d3ef30be6 fix(deps): update dependency @vueuse/core to v7.5.2 2022-01-05 10:03:09 +00:00
renovate fc00169863 chore(deps): update dependency vitest to v0.0.132 2022-01-05 09:21:26 +00:00
renovate b652225a12 fix(deps): update dependency @vueuse/router to v7.5.2 2022-01-05 08:02:58 +00:00
Dominik Pschenitschni e6e8a98514
fix: don't set defined values for search and page 2022-01-04 21:55:33 +01:00
Dominik Pschenitschni 76f4cca5fe
fix: move local storage list view to router 2022-01-04 21:55:33 +01:00
Dominik Pschenitschni 5916a44724
feat: provide listId prop via router 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni 6d62ca1ada
fix: check now just once 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni e54d95802b
fix: closing modal 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni e837621ef8
Try to cache list views 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni 2db820d926
feat: review changes 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni f3358269e5
fix task remove label test 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni 700fce3c2c
fix: sharing components 2022-01-04 21:55:32 +01:00
Dominik Pschenitschni 58207db6c3
fix: kanban tests 2022-01-04 21:55:31 +01:00
Dominik Pschenitschni da8cf13619
fix: task done label test 2022-01-04 21:55:31 +01:00
Dominik Pschenitschni e78d47fdcf
fix: list specs 2022-01-04 21:55:30 +01:00
Dominik Pschenitschni 5937f01cc5
fix: list loading 2022-01-04 21:55:30 +01:00
Dominik Pschenitschni 29a9335844
feat: save current list view just once 2022-01-04 21:55:30 +01:00
Dominik Pschenitschni 7eed0628d0
feat: mount list views as route-views 2022-01-04 21:55:30 +01:00
Dominik Pschenitschni 16b0d03601
fix: readd modal transitions 2022-01-04 21:55:30 +01:00
Dominik Pschenitschni c70211ad32
feat: unify modal view
fix: List.vue
2022-01-04 21:55:30 +01:00
Dominik Pschenitschni 281c922de1
feat: make taskList a composable 2022-01-04 21:55:29 +01:00
Dominik Pschenitschni 5a0c0eff9f
feat: implement modals with vue router 4
This is an implementation of the modals with the new possibilities of vue router 3.

See: https://github.com/vuejs/vue-router/issues/703#issuecomment-865066913 for a better explanation
and the linked example implementation: https://github.com/vuejs/vue-router-next/blob/master/e2e/modal/index.ts
2022-01-04 21:55:29 +01:00
Dominik Pschenitschni 29d8422e94
fix(ready): remove class form fragment 2022-01-04 21:15:02 +01:00
Dominik Pschenitschni cdbd1c2ac4 feat: create BaseButton component (#1123)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#1123
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2022-01-04 18:58:06 +00:00
Dominik Pschenitschni cb37fd773d feat: convert to composable useDateTimeSalutation 2022-01-04 18:44:07 +00:00
kolaente d2577f1df6 feat: use useNow to provide auto updates 2022-01-04 18:44:07 +00:00
kolaente 27534a98e9 feat: return full translation key 2022-01-04 18:44:07 +00:00
kolaente de77393905 feat: move the calculation of the current salutation to a different function 2022-01-04 18:44:07 +00:00
renovate dd450263fb chore(deps): pin dependency happy-dom to 2.25.1 2022-01-04 18:03:16 +00:00
renovate d8106dcb73 chore(deps): update dependency vitest to v0.0.131 2022-01-04 14:03:26 +00:00
Dominik Pschenitschni 8114012997
feat: replace jest with vitest 2022-01-04 14:16:47 +01:00
renovate bc4ea82639 chore(deps): update dependency netlify-cli to v8.6.4 2022-01-04 13:03:16 +00:00
renovate cd97cfe612 chore(deps): update dependency netlify-cli to v8.6.3 2022-01-04 12:03:19 +00:00
renovate e6136fdee4 chore(deps): update dependency caniuse-lite to v1.0.30001296 2022-01-04 11:48:22 +00:00
renovate 2c395c720a chore(deps): update dependency vue-tsc to v0.30.2 2022-01-04 11:48:01 +00:00
renovate 8b639fd4af chore(deps): update dependency rollup to v2.63.0 2022-01-04 08:03:11 +00:00
renovate f7bd5f13ac fix(deps): update dependency v-tooltip to v4.0.0-beta.6 2022-01-03 20:03:15 +00:00
renovate 0ae774b95c chore(deps): update typescript-eslint monorepo to v5.9.0 2022-01-03 19:04:33 +00:00
renovate be899c3eb0 chore(deps): update dependency eslint to v8.6.0 2022-01-03 15:40:28 +00:00
renovate dc02827a33 chore(deps): update dependency slugify to v1.6.5 2022-01-03 15:39:59 +00:00
renovate 951e511bf9
chore(deps): update dependency postcss-preset-env to v7.2.0 2022-01-03 16:21:43 +01:00
renovate 5f1d936ca4 fix(deps): update dependency v-tooltip to v4.0.0-beta.5 2022-01-03 15:15:05 +00:00
renovate c3845e5690 chore(deps): update dependency netlify-cli to v8.6.1 2022-01-03 14:03:10 +00:00
kolaente 7dddfea79e
fix: test 2021-12-30 16:14:51 +01:00
kolaente 1648bcdb70
chore: make select date button actually a button 2021-12-30 16:12:44 +01:00
kolaente 0710cea9e5
fix: lint 2021-12-29 21:33:55 +01:00
kolaente 294e89b6f7
fix: z-index 2021-12-29 21:12:43 +01:00
kolaente 75cbc73b33
fix: loading spinner 2021-12-29 20:59:30 +01:00
kolaente 950fdce111
chore: move datepicker popup to real popup component 2021-12-29 20:54:01 +01:00
kolaente 932f1774ec
feat: move date filter to popup and improve styling 2021-12-29 20:36:53 +01:00
kolaente d825960836
chore: make showNulls and showOverdue computed 2021-12-29 18:12:43 +01:00
kolaente f691e96e22
fix: checkboxes 2021-12-29 18:06:12 +01:00
kolaente 0d6ef8f18a
chore: move task sorting to computed 2021-12-29 17:24:56 +01:00
kolaente d6dd1fc0e3
fix: date range 2021-12-29 17:22:14 +01:00
kolaente 729aa7d4cc
fix: date format 2021-12-29 17:08:33 +01:00
kolaente c24b8af00d
fix: pay attention to week start setting 2021-12-29 16:51:21 +01:00
kolaente 8f8d25ece1
feat: add more date ranges and make sure they actually make sense 2021-12-29 16:48:34 +01:00
kolaente e93be0d04c
chore: cleanup old stuff 2021-12-29 16:06:05 +01:00
kolaente a5b23a7048
feat: disable time 2021-12-29 16:03:29 +01:00
kolaente 858e7d60a6
docs: add fixmes 2021-12-29 16:03:05 +01:00
kolaente 12317c56b3
feat: make the custom button actually do stuff 2021-12-29 16:01:59 +01:00
kolaente 378f782d44
fix: disable broken stuff 2021-12-29 16:01:23 +01:00
kolaente b274a796d4
chore: use ts 2021-12-29 16:00:06 +01:00
kolaente 3d1c1e41c7
feat: make active class work 2021-12-29 15:56:50 +01:00
kolaente 8115563d67
feat: add new component for a datepicker with range 2021-12-29 15:44:13 +01:00
kolaente 7408c37dec
chore: cleanup and reorganize the date selection 2021-12-28 23:50:04 +01:00
kolaente 9c5613ad98
fix: lint 2021-12-26 13:42:21 +01:00
kolaente 0322daf4d4
feat: move password to separate component 2021-12-26 13:37:33 +01:00
kolaente 6041ad1482
Merge branch 'main' into feature/login-improvements 2021-12-26 12:19:44 +01:00
Dominik Pschenitschni 9a3069c20d
fix: propType validation in message.vue 2021-12-21 16:07:38 +01:00
Dominik Pschenitschni 27cd9535bf
fix: remove @ts-ignore 2021-12-21 15:47:57 +01:00
Dominik Pschenitschni c46273ca34
fix: remove unused var 2021-12-21 15:47:40 +01:00
kolaente a4ec41e937
fix: motd on mobile 2021-12-21 15:21:23 +01:00
kolaente 3eb0d58f79
fix: add .vue suffix to fix typescript warning 2021-12-21 15:21:23 +01:00
kolaente 5558d91f44
feat: change links to login / register pages 2021-12-21 15:21:23 +01:00
kolaente 9c04fb4e40
fix: disable login button 2021-12-21 15:21:23 +01:00
kolaente 1fc1c20c87
feat: add extra prop for message center text 2021-12-21 15:21:23 +01:00
kolaente a1814ea29d
fix: message spacing 2021-12-21 15:21:23 +01:00
kolaente fda0b81d9c
feat: add tooltip and aria-label 2021-12-21 15:21:22 +01:00
kolaente 8397608fef
chore: move password field toggle to scss file 2021-12-21 15:21:22 +01:00
kolaente 66d5e851e8
feat: improve error handling of login fields 2021-12-21 15:21:22 +01:00
kolaente 1d916e7e03
feat: change wording 2021-12-21 15:21:22 +01:00
kolaente aa12bffcbc
feat: replace password comparison with password toggle 2021-12-21 15:21:22 +01:00
kolaente 05e054f501
feat: improve input validation for register form 2021-12-21 15:21:20 +01:00
kolaente f7eb160509
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.
2021-12-21 14:34:16 +01:00
357 changed files with 16265 additions and 13644 deletions

View File

@ -39,7 +39,7 @@ steps:
# - '.cache'
- name: dependencies
image: node:16
image: node:18
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
@ -70,7 +70,7 @@ steps:
# - dependencies
- name: lint
image: node:16
image: node:18
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
@ -81,7 +81,7 @@ steps:
- dependencies
- name: build-prod
image: node:16
image: node:18
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
@ -91,13 +91,22 @@ steps:
- dependencies
- name: test-unit
image: node:16
image: node:18
pull: true
commands:
- yarn test:unit
depends_on:
- dependencies
- name: typecheck
failure: ignore
image: node:18
pull: true
commands:
- yarn typecheck
depends_on:
- dependencies
- name: test-frontend
image: cypress/browsers:node16.5.0-chrome94-ff93
pull: true
@ -107,38 +116,17 @@ 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 serve:dist & npx wait-on http://localhost:4173
- yarn test:frontend --browser chrome --record
depends_on:
- 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
image: node:18
pull: true
environment:
NETLIFY_AUTH_TOKEN:
@ -148,6 +136,9 @@ steps:
GITEA_TOKEN:
from_secret: gitea_token
commands:
- cp -r dist dist-preview
# Override the default api url used for preview
- sed -i 's|localhost:3456|try.vikunja.io|g' dist-preview/index.html
- shasum -a 384 -c ./scripts/deploy-preview-netlify.js.sha384
- node ./scripts/deploy-preview-netlify.js
depends_on:
@ -195,7 +186,7 @@ steps:
# - '.cache'
- name: build
image: node:16
image: node:18
pull: true
group: build-static
environment:
@ -270,7 +261,7 @@ steps:
# - '.cache'
- name: build
image: node:16
image: node:18
pull: true
group: build-static
environment:
@ -656,6 +647,6 @@ steps:
from_secret: crowdin_key
---
kind: signature
hmac: 188ee90100c5fc5922a445e531e7a47453121edddb2a64a182eb23ed2bf602de
hmac: 997e1badebe484ac29557c4af356e63db4d3d57f3d32e92d482f117f8cec64da
...

2
.nvmrc
View File

@ -1 +1 @@
v16
v18

View File

@ -1,5 +1,5 @@
# Stage 1: Build application
FROM node:16 AS compile-image
FROM node:18 AS compile-image
WORKDIR /build

22
cypress.config.ts Normal file
View File

@ -0,0 +1,22 @@
import { defineConfig } from 'cypress'
export default defineConfig({
env: {
API_URL: 'http://localhost:3456/api/v1',
TEST_SECRET: 'averyLongSecretToSe33dtheDB',
},
video: false,
retries: {
runMode: 2,
},
projectId: '181c7x',
e2e: {
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
return require('./cypress/plugins/index.js')(on, config)
},
baseUrl: 'http://localhost:4173',
specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}',
},
})

View File

@ -1,11 +0,0 @@
{
"baseUrl": "http://localhost:5000",
"env": {
"API_URL": "http://localhost:3456/api/v1",
"TEST_SECRET": "averyLongSecretToSe33dtheDB"
},
"video": false,
"retries": {
"runMode": 2
}
}

View File

@ -0,0 +1,56 @@
import {ListFactory} from '../../factories/list'
import '../../support/authenticateUser'
import {prepareLists} from './prepareLists'
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')
const lists = ListFactory.create(6)
cy.visit('/')
cy.wait('@loadNamespaces')
cy.get('body')
.should('not.contain', 'Last viewed')
cy.visit(`/lists/${lists[0].id}`)
cy.wait('@loadNamespaces')
cy.wait('@loadList')
cy.visit(`/lists/${lists[1].id}`)
cy.wait('@loadNamespaces')
cy.wait('@loadList')
cy.visit(`/lists/${lists[2].id}`)
cy.wait('@loadNamespaces')
cy.wait('@loadList')
cy.visit(`/lists/${lists[3].id}`)
cy.wait('@loadNamespaces')
cy.wait('@loadList')
cy.visit(`/lists/${lists[4].id}`)
cy.wait('@loadNamespaces')
cy.wait('@loadList')
cy.visit(`/lists/${lists[5].id}`)
cy.wait('@loadNamespaces')
cy.wait('@loadList')
// cy.visit('/')
// cy.wait('@loadNamespaces')
// Not using cy.visit here to work around the redirect issue fixed in #1337
cy.get('nav.menu.top-menu a')
.contains('Overview')
.click()
cy.get('body')
.should('contain', 'Last viewed')
cy.get('.list-cards-wrapper-2-rows')
.should('not.contain', lists[0].title)
.should('contain', lists[1].title)
.should('contain', lists[2].title)
.should('contain', lists[3].title)
.should('contain', lists[4].title)
.should('contain', lists[5].title)
})
})

View File

@ -0,0 +1,76 @@
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')
cy.get('.gantt-chart .tasks')
.should('not.contain', tasks[0].title)
})
it('Shows tasks from the current and next month', () => {
const now = new Date()
const nextMonth = now
nextMonth.setDate(1)
nextMonth.setMonth(now.getMonth() + 1)
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart .months')
.should('contain', format(now, 'MMMM'))
.should('contain', format(nextMonth, 'MMMM'))
})
it('Shows tasks with dates', () => {
const now = new Date()
const tasks = TaskFactory.create(1, {
start_date: formatISO(now),
end_date: formatISO(now.setDate(now.getDate() + 4))
})
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart .tasks')
.should('not.be.empty')
cy.get('.gantt-chart .tasks')
.should('contain', tasks[0].title)
})
it('Shows tasks with no dates after enabling them', () => {
TaskFactory.create(1, {
start_date: null,
end_date: null,
})
cy.visit('/lists/1/gantt')
cy.get('.gantt-options .fancycheckbox')
.contains('Show tasks which don\'t have dates set')
.click()
cy.get('.gantt-chart .tasks')
.should('not.be.empty')
cy.get('.gantt-chart .tasks .task.nodate')
.should('exist')
})
it('Drags a task around', () => {
const now = new Date()
TaskFactory.create(1, {
start_date: formatISO(now),
end_date: formatISO(now.setDate(now.getDate() + 4))
})
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart .tasks .task')
.first()
.trigger('mousedown', {which: 1})
.trigger('mousemove', {clientX: 500, clientY: 0})
.trigger('mouseup', {force: true})
})
})

View File

@ -0,0 +1,196 @@
import {BucketFactory} from '../../factories/bucket'
import {ListFactory} from '../../factories/list'
import {TaskFactory} from '../../factories/task'
import {prepareLists} from './prepareLists'
import '../../support/authenticateUser'
describe('List View Kanban', () => {
let buckets
prepareLists()
beforeEach(() => {
buckets = BucketFactory.create(2)
})
it('Shows all buckets with their tasks', () => {
const data = TaskFactory.create(10, {
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket .title')
.contains(buckets[0].title)
.should('exist')
cy.get('.kanban .bucket .title')
.contains(buckets[1].title)
.should('exist')
cy.get('.kanban .bucket')
.first()
.should('contain', data[0].title)
})
it('Can add a new task to a bucket', () => {
TaskFactory.create(2, {
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket')
.contains(buckets[0].title)
.get('.bucket-footer .button')
.contains('Add another task')
.click()
cy.get('.kanban .bucket')
.contains(buckets[0].title)
.get('.bucket-footer .field .control input.input')
.type('New Task{enter}')
cy.get('.kanban .bucket')
.first()
.should('contain', 'New Task')
})
it('Can create a new bucket', () => {
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket.new-bucket .button')
.click()
cy.get('.kanban .bucket.new-bucket input.input')
.type('New Bucket{enter}')
cy.wait(1000) // Wait for the request to finish
cy.get('.kanban .bucket .title')
.contains('New Bucket')
.should('exist')
})
it('Can set a bucket limit', () => {
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
.first()
.click()
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')
.first()
.type(3)
cy.get('[data-cy="setBucketLimit"]')
.first()
.click()
cy.get('.kanban .bucket .bucket-header span.limit')
.contains('0/3')
.should('exist')
})
it('Can rename a bucket', () => {
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .bucket-header .title')
.first()
.type('{selectall}New Bucket Title{enter}')
cy.get('.kanban .bucket .bucket-header .title')
.first()
.should('contain', 'New Bucket Title')
})
it('Can delete a bucket', () => {
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
.first()
.click()
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .dropdown-item')
.contains('Delete')
.click()
cy.get('.modal-mask .modal-container .modal-content .header')
.should('contain', 'Delete the bucket')
cy.get('.modal-mask .modal-container .modal-content .actions .button')
.contains('Do it!')
.click()
cy.get('.kanban .bucket .title')
.contains(buckets[0].title)
.should('not.exist')
cy.get('.kanban .bucket .title')
.contains(buckets[1].title)
.should('exist')
})
it('Can drag tasks around', () => {
const tasks = TaskFactory.create(2, {
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.getSettled('.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')
.should('not.contain', tasks[0].title)
})
it('Should navigate to the task when the task card is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .tasks .task')
.contains(tasks[0].title)
.should('be.visible')
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`, { timeout: 1000 })
})
it('Should remove a task from the kanban board when moving it to another list', () => {
const lists = ListFactory.create(2)
BucketFactory.create(2, {
list_id: '{increment}',
})
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
bucket_id: 1,
})
const task = tasks[0]
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .tasks .task')
.contains(task.title)
.should('be.visible')
.click()
cy.get('.task-view .action-buttons .button', { timeout: 3000 })
.contains('Move')
.click()
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
.type(`${lists[1].title}{enter}`)
// The requests happen with a 200ms timeout. Because of that, the results are not yet there when cypress
// presses enter and we can't simulate pressing on enter to select the item.
cy.get('.task-view .content.details .field .multiselect.control .search-results')
.children()
.first()
.click()
cy.get('.global-notification', { timeout: 1000 })
.should('contain', 'Success')
cy.go('back')
cy.get('.kanban .bucket')
.should('not.contain', task.title)
})
})

View File

@ -0,0 +1,107 @@
import {UserListFactory} from '../../factories/users_list'
import {TaskFactory} from '../../factories/task'
import {UserFactory} from '../../factories/user'
import {ListFactory} from '../../factories/list'
import {prepareLists} from './prepareLists'
import '../../support/authenticateUser'
describe('List View List', () => {
prepareLists()
it('Should be an empty list', () => {
cy.visit('/lists/1')
cy.url()
.should('contain', '/lists/1/list')
cy.get('.list-title h1')
.should('contain', 'First List')
cy.get('.list-title .dropdown')
.should('exist')
cy.get('p')
.contains('This list is currently empty.')
.should('exist')
})
it('Should create a new task', () => {
const newTaskTitle = 'New task'
cy.visit('/lists/1')
cy.get('.task-add textarea')
.type(newTaskTitle+'{enter}')
cy.get('.tasks')
.should('contain.text', newTaskTitle)
})
it('Should navigate to the task when the title is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
})
cy.visit('/lists/1/list')
cy.get('.tasks .task .tasktext')
.contains(tasks[0].title)
.first()
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`)
})
it('Should not see any elements for a list which is shared read only', () => {
UserFactory.create(2)
UserListFactory.create(1, {
list_id: 2,
user_id: 1,
right: 0,
})
const lists = ListFactory.create(2, {
owner_id: '{increment}',
namespace_id: '{increment}',
})
cy.visit(`/lists/${lists[1].id}/`)
cy.get('.list-title a.icon')
.should('not.exist')
cy.get('input.input[placeholder="Add a new task..."')
.should('not.exist')
})
it('Should only show the color of a list in the navigation and not in the list view', () => {
const lists = ListFactory.create(1, {
hex_color: '00db60',
})
TaskFactory.create(10, {
list_id: lists[0].id,
})
cy.visit(`/lists/${lists[0].id}/`)
cy.get('.menu-list li .list-menu-link .color-bubble')
.should('have.css', 'background-color', 'rgb(0, 219, 96)')
cy.get('.tasks-container .tasks .color-bubble')
.should('not.exist')
})
it('Should paginate for > 50 tasks', () => {
const tasks = TaskFactory.create(100, {
id: '{increment}',
title: i => `task${i}`,
list_id: 1,
})
cy.visit('/lists/1/list')
cy.get('.tasks-container .tasks')
.should('contain', tasks[99].title)
cy.get('.card-content .pagination .pagination-link')
.contains('2')
.click()
cy.url()
.should('contain', '?page=2')
cy.get('.tasks-container .tasks')
.should('contain', tasks[1].title)
cy.get('.tasks-container .tasks')
.should('not.contain', tasks[99].title)
})
})

View File

@ -0,0 +1,52 @@
import {TaskFactory} from '../../factories/task'
import '../../support/authenticateUser'
describe('List View Table', () => {
it('Should show a table with tasks', () => {
const tasks = TaskFactory.create(1)
cy.visit('/lists/1/table')
cy.get('.list-table table.table')
.should('exist')
cy.get('.list-table table.table')
.should('contain', tasks[0].title)
})
it('Should have working column switches', () => {
TaskFactory.create(1)
cy.visit('/lists/1/table')
cy.get('.list-table .filter-container .items .button')
.contains('Columns')
.click()
cy.get('.list-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
.contains('Priority')
.click()
cy.get('.list-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
.contains('Done')
.click()
cy.get('.list-table table.table th')
.contains('Priority')
.should('exist')
cy.get('.list-table table.table th')
.contains('Done')
.should('not.exist')
})
it('Should navigate to the task when the title is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
})
cy.visit('/lists/1/table')
cy.get('.list-table table.table')
.contains(tasks[0].title)
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`)
})
})

View File

@ -0,0 +1,101 @@
import {TaskFactory} from '../../factories/task'
import {prepareLists} from './prepareLists'
import '../../support/authenticateUser'
describe('Lists', () => {
let lists
prepareLists((newLists) => (lists = newLists))
it('Should create a new list', () => {
cy.visit('/')
cy.get('.namespace-title .dropdown-trigger')
.click()
cy.get('.namespace-title .dropdown .dropdown-item')
.contains('New list')
.click()
cy.url()
.should('contain', '/lists/new/1')
cy.get('.card-header-title')
.contains('New list')
cy.get('input.input')
.type('New List')
cy.get('.button')
.contains('Create')
.click()
cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new list is done
.should('contain', 'Success')
cy.url()
.should('contain', '/lists/')
cy.get('.list-title h1')
.should('contain', 'New List')
})
it('Should redirect to a specific list view after visited', () => {
cy.visit('/lists/1/kanban')
cy.url()
.should('contain', '/lists/1/kanban')
cy.visit('/lists/1')
cy.url()
.should('contain', '/lists/1/kanban')
})
it('Should rename the list in all places', () => {
TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
})
const newListName = 'New list name'
cy.visit('/lists/1')
cy.get('.list-title h1')
.should('contain', 'First List')
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-trigger')
.click()
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-content')
.contains('Edit')
.click()
cy.get('#title')
.type(`{selectall}${newListName}`)
cy.get('footer.modal-card-foot .button')
.contains('Save')
.click()
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.list-title h1')
.should('contain', newListName)
.should('not.contain', lists[0].title)
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child')
.should('contain', newListName)
.should('not.contain', lists[0].title)
cy.visit('/')
cy.get('.card-content')
.should('contain', newListName)
.should('not.contain', lists[0].title)
})
it('Should remove a list', () => {
cy.visit(`/lists/${lists[0].id}`)
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-trigger')
.click()
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-content')
.contains('Delete')
.click()
cy.url()
.should('contain', '/settings/delete')
cy.get('[data-cy="modalPrimary"]')
.contains('Do it')
.click()
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list')
.should('not.contain', lists[0].title)
cy.location('pathname')
.should('equal', '/')
})
})

View File

@ -15,7 +15,7 @@ describe('Namepaces', () => {
it('Should be all there', () => {
cy.visit('/namespaces')
cy.get('.namespace h1 span')
cy.get('[data-cy="namespace-title"]')
.should('contain', namespaces[0].title)
})
@ -23,14 +23,14 @@ describe('Namepaces', () => {
const newNamespaceTitle = 'New Namespace'
cy.visit('/namespaces')
cy.get('a.button')
.contains('Create a new namespace')
cy.get('[data-cy="new-namespace"]')
.should('contain', 'New namespace')
.click()
cy.url()
.should('contain', '/namespaces/new')
cy.get('.card-header-title')
.should('contain', 'Create a new namespace')
.should('contain', 'New namespace')
cy.get('input.input')
.type(newNamespaceTitle)
cy.get('.button')
@ -72,7 +72,7 @@ describe('Namepaces', () => {
cy.get('.namespace-container .menu.namespaces-lists')
.should('contain', newNamespaceName)
.should('not.contain', newNamespaces[0].title)
cy.get('.content.namespaces-list')
cy.get('[data-cy="namespaces-list"]')
.should('contain', newNamespaceName)
.should('not.contain', newNamespaces[0].title)
})
@ -89,7 +89,7 @@ describe('Namepaces', () => {
.click()
cy.url()
.should('contain', '/settings/delete')
cy.get('.modal-mask .modal-container .modal-content .actions a.button')
cy.get('[data-cy="modalPrimary"]')
.contains('Do it')
.click()
@ -116,30 +116,30 @@ describe('Namepaces', () => {
// Initial
cy.visit('/namespaces')
cy.get('.namespaces-list .namespace')
cy.get('.namespace')
.should('not.contain', 'Archived')
// Show archived
cy.get('.namespaces-list .fancycheckbox.show-archived-check label.check span')
cy.get('[data-cy="show-archived-check"] label.check span')
.should('be.visible')
.click()
cy.get('.namespaces-list .fancycheckbox.show-archived-check input')
cy.get('[data-cy="show-archived-check"] input')
.should('be.checked')
cy.get('.namespaces-list .namespace')
cy.get('.namespace')
.should('contain', 'Archived')
// Don't show archived
cy.get('.namespaces-list .fancycheckbox.show-archived-check label.check span')
cy.get('[data-cy="show-archived-check"] label.check span')
.should('be.visible')
.click()
cy.get('.namespaces-list .fancycheckbox.show-archived-check input')
cy.get('[data-cy="show-archived-check"] input')
.should('not.be.checked')
// Second time visiting after unchecking
cy.visit('/namespaces')
cy.get('.namespaces-list .fancycheckbox.show-archived-check input')
cy.get('[data-cy="show-archived-check"] input')
.should('not.be.checked')
cy.get('.namespaces-list .namespace')
cy.get('.namespace')
.should('not.contain', 'Archived')
})
})

View File

@ -0,0 +1,16 @@
import {ListFactory} from '../../factories/list'
import {UserFactory} from '../../factories/user'
import {NamespaceFactory} from '../../factories/namespace'
import {TaskFactory} from '../../factories/task'
export function prepareLists(setLists = () => {}) {
beforeEach(() => {
UserFactory.create(1)
NamespaceFactory.create(1)
const lists = ListFactory.create(1, {
title: 'First List'
})
setLists(lists)
TaskFactory.truncate()
})
}

View File

@ -0,0 +1,130 @@
import {ListFactory} from '../../factories/list'
import {seed} from '../../support/seed'
import {TaskFactory} from '../../factories/task'
import {formatISO} from 'date-fns'
import {UserFactory} from '../../factories/user'
import {NamespaceFactory} from '../../factories/namespace'
import {BucketFactory} from '../../factories/bucket'
import {updateUserSettings} from '../../support/updateUserSettings'
import '../../support/authenticateUser'
function seedTasks(numberOfTasks = 100, startDueDate = new Date()) {
UserFactory.create(1)
NamespaceFactory.create(1)
const list = ListFactory.create()[0]
BucketFactory.create(1, {
list_id: list.id,
})
const tasks = []
let dueDate = startDueDate
for (let i = 0; i < numberOfTasks; i++) {
const now = new Date()
dueDate = (new Date(dueDate.valueOf())).setDate((new Date(dueDate.valueOf())).getDate() + 2)
tasks.push({
id: i + 1,
list_id: list.id,
done: false,
created_by_id: 1,
title: 'Test Task ' + i,
index: i + 1,
due_date: formatISO(dueDate),
created: formatISO(now),
updated: formatISO(now),
})
}
seed(TaskFactory.table, tasks)
return {tasks, list}
}
describe('Home Page Task Overview', () => {
it('Should show tasks with a near due date first on the home page overview', () => {
const {tasks} = seedTasks()
cy.visit('/')
cy.get('[data-cy="showTasks"] .card .task')
.each(([task], index) => {
expect(task.innerText).to.contain(tasks[index].title)
})
})
it('Should show overdue tasks first, then show other tasks', () => {
const oldDate = (new Date()).setDate((new Date()).getDate() - 14)
const {tasks} = seedTasks(100, oldDate)
cy.visit('/')
cy.get('[data-cy="showTasks"] .card .task')
.each(([task], index) => {
expect(task.innerText).to.contain(tasks[index].title)
})
})
it('Should show a new task with a very soon due date at the top', () => {
const {tasks} = seedTasks()
const newTaskTitle = 'New Task'
cy.visit('/')
TaskFactory.create(1, {
id: 999,
title: newTaskTitle,
due_date: formatISO(new Date()),
}, false)
cy.visit(`/lists/${tasks[0].list_id}/list`)
cy.get('.tasks .task')
.first()
.should('contain.text', newTaskTitle)
cy.visit('/')
cy.get('[data-cy="showTasks"] .card .task')
.first()
.should('contain.text', newTaskTitle)
})
it('Should not show a new task without a date at the bottom when there are > 50 tasks', () => {
// We're not using the api here to create the task in order to verify the flow
const {tasks} = seedTasks()
const newTaskTitle = 'New Task'
cy.visit('/')
cy.visit(`/lists/${tasks[0].list_id}/list`)
cy.get('.task-add textarea')
.type(newTaskTitle+'{enter}')
cy.visit('/')
cy.get('[data-cy="showTasks"] .card .task')
.last()
.should('not.contain.text', newTaskTitle)
})
it('Should show a new task without a date at the bottom when there are < 50 tasks', () => {
seedTasks(40)
const newTaskTitle = 'New Task'
TaskFactory.create(1, {
id: 999,
title: newTaskTitle,
}, false)
cy.visit('/')
cy.get('[data-cy="showTasks"] .card .task')
.last()
.should('contain.text', newTaskTitle)
})
it('Should show a task without a due date added via default list at the bottom', () => {
const {list} = seedTasks(40)
updateUserSettings({
default_list_id: list.id,
})
const newTaskTitle = 'New Task'
cy.visit('/')
cy.get('.add-task-textarea')
.type(`${newTaskTitle}{enter}`)
cy.get('[data-cy="showTasks"] .card .task')
.last()
.should('contain.text', newTaskTitle)
})
})

View File

@ -6,13 +6,13 @@ import {TaskCommentFactory} from '../../factories/task_comment'
import {UserFactory} from '../../factories/user'
import {NamespaceFactory} from '../../factories/namespace'
import {UserListFactory} from '../../factories/users_list'
import '../../support/authenticateUser'
import {TaskAssigneeFactory} from '../../factories/task_assignee'
import {LabelFactory} from '../../factories/labels'
import {LabelTaskFactory} from '../../factories/label_task'
import {BucketFactory} from '../../factories/bucket'
import '../../support/authenticateUser'
describe('Task', () => {
let namespaces
let lists
@ -116,6 +116,7 @@ describe('Task', () => {
.should('be.visible')
.should('contain', 'Done')
cy.get('.task-view .action-buttons p.created')
.scrollIntoView()
.should('be.visible')
.should('contain', 'Done')
})
@ -128,7 +129,7 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`)
cy.get('.task-view .action-buttons .button')
.contains('Done!')
.contains('Mark task done!')
.click()
cy.get('.task-view .heading .is-done')
@ -168,7 +169,7 @@ describe('Task', () => {
.click()
cy.get('.task-view .details.content.description .editor .vue-easymde .EasyMDEContainer .CodeMirror-scroll')
.type('{selectall}New Description')
cy.get('.task-view .details.content.description .editor a')
cy.get('[data-cy="saveEditor"]')
.contains('Save')
.click()
@ -209,7 +210,7 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`)
cy.get('.task-view .action-buttons .button')
.contains('Move task')
.contains('Move')
.click()
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
.type(`${lists[1].title}{enter}`)
@ -236,7 +237,7 @@ describe('Task', () => {
cy.get('.task-view .action-buttons .button')
.should('be.visible')
.contains('Delete task')
.contains('Delete')
.click()
cy.get('.modal-mask .modal-container .modal-content .header')
.should('contain', 'Delete this task')
@ -316,7 +317,7 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`)
cy.get('.task-view .action-buttons .button')
.contains('Add labels')
.contains('Add Labels')
.should('be.visible')
.click()
cy.get('.task-view .details.labels-list .multiselect input')
@ -343,7 +344,7 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`)
cy.get('.task-view .action-buttons .button')
.contains('Add labels')
.contains('Add Labels')
.click()
cy.get('.task-view .details.labels-list .multiselect input')
.type(labels[0].title)
@ -372,13 +373,13 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`)
cy.get('.task-view .details.labels-list .multiselect .input-wrapper')
cy.getSettled('.task-view .details.labels-list .multiselect .input-wrapper')
.should('be.visible')
.should('contain', labels[0].title)
cy.get('.task-view .details.labels-list .multiselect .input-wrapper')
cy.getSettled('.task-view .details.labels-list .multiselect .input-wrapper')
.children()
.first()
.get('a.delete')
.get('[data-cy="taskDetail.removeLabel"]')
.click()
cy.get('.global-notification')
@ -404,7 +405,7 @@ describe('Task', () => {
cy.get('.datepicker .datepicker-popup a')
.contains('Tomorrow')
.click()
cy.get('.datepicker .datepicker-popup a.button')
cy.get('[data-cy="closeDatepicker"]')
.contains('Confirm')
.click()

View File

@ -6,7 +6,7 @@ describe('Log out', () => {
cy.get('.navbar .user .username')
.click()
cy.get('.navbar .user .dropdown-menu a.dropdown-item')
cy.get('.navbar .user .dropdown-menu .dropdown-item')
.contains('Logout')
.click()

View File

@ -25,7 +25,6 @@ context('Registration', () => {
cy.get('#username').type(fixture.username)
cy.get('#email').type(fixture.email)
cy.get('#password').type(fixture.password)
cy.get('#passwordValidation').type(fixture.password)
cy.get('#register-submit').click()
cy.url().should('include', '/')
cy.clock(1625656161057) // 13:00
@ -43,7 +42,6 @@ context('Registration', () => {
cy.get('#username').type(fixture.username)
cy.get('#email').type(fixture.email)
cy.get('#password').type(fixture.password)
cy.get('#passwordValidation').type(fixture.password)
cy.get('#register-submit').click()
cy.get('div.message.danger').contains('A user with this username already exists.')
})

View File

@ -8,21 +8,23 @@ 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})
.trigger('mouseup')
cy.get('a.button.is-primary')
cy.get('[data-cy="uploadAvatar"]')
.contains('Upload Avatar')
.click()
cy.wait(3000) // Wait for the request to finish
cy.wait('@uploadAvatar')
cy.get('.global-notification')
.should('contain', 'Success')
})
@ -33,7 +35,7 @@ describe('User Settings', () => {
cy.get('.general-settings .control input.input')
.first()
.type('Lorem Ipsum')
cy.get('.card.general-settings .button.is-primary')
cy.get('[data-cy="saveGeneralSettings"]')
.contains('Save')
.click()

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from 'date-fns'

View File

@ -1,6 +1,6 @@
import {Factory} from '../support/factory'
import {formatISO} from "date-fns"
import faker from 'faker'
import faker from '@faker-js/faker'
export class LinkShareFactory extends Factory {
static table = 'link_shares'

View File

@ -1,6 +1,6 @@
import {Factory} from '../support/factory'
import {formatISO} from "date-fns"
import faker from 'faker'
import faker from '@faker-js/faker'
export class ListFactory extends Factory {
static table = 'lists'

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from "date-fns"

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker'
import faker from '@faker-js/faker'
import {Factory} from '../support/factory'
import {formatISO} from "date-fns"

View File

@ -1,540 +0,0 @@
import {formatISO, format} from 'date-fns'
import {TaskFactory} from '../../factories/task'
import {ListFactory} from '../../factories/list'
import {UserListFactory} from '../../factories/users_list'
import {UserFactory} from '../../factories/user'
import {NamespaceFactory} from '../../factories/namespace'
import {BucketFactory} from '../../factories/bucket'
import '../../support/authenticateUser'
describe('Lists', () => {
let lists
beforeEach(() => {
UserFactory.create(1)
NamespaceFactory.create(1)
lists = ListFactory.create(1, {
title: 'First List'
})
TaskFactory.truncate()
})
it('Should create a new list', () => {
cy.visit('/')
cy.get('.namespace-title .dropdown-trigger')
.click()
cy.get('.namespace-title .dropdown .dropdown-item')
.contains('New list')
.click()
cy.url()
.should('contain', '/namespaces/1/list')
cy.get('.card-header-title')
.contains('Create a new list')
cy.get('input.input')
.type('New List')
cy.get('.button')
.contains('Create')
.click()
cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new list is done
.should('contain', 'Success')
cy.url()
.should('contain', '/lists/')
cy.get('.list-title h1')
.should('contain', 'New List')
})
it('Should redirect to a specific list view after visited', () => {
cy.visit('/lists/1/kanban')
cy.url()
.should('contain', '/lists/1/kanban')
cy.visit('/lists/1')
cy.url()
.should('contain', '/lists/1/kanban')
})
it('Should rename the list in all places', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
})
const newListName = 'New list name'
cy.visit('/lists/1')
cy.get('.list-title h1')
.should('contain', 'First List')
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-trigger')
.click()
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-content')
.contains('Edit')
.click()
cy.get('#title')
.type(`{selectall}${newListName}`)
cy.get('footer.modal-card-foot .button')
.contains('Save')
.click()
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.list-title h1')
.should('contain', newListName)
.should('not.contain', lists[0].title)
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child')
.should('contain', newListName)
.should('not.contain', lists[0].title)
cy.visit('/')
cy.get('.card-content .tasks')
.should('contain', newListName)
.should('not.contain', lists[0].title)
})
it('Should remove a list', () => {
cy.visit(`/lists/${lists[0].id}`)
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-trigger')
.click()
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list li:first-child .dropdown .dropdown-content')
.contains('Delete')
.click()
cy.url()
.should('contain', '/settings/delete')
cy.get('.modal-mask .modal-container .modal-content .actions a.button')
.contains('Do it')
.click()
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.namespace-container .menu.namespaces-lists .more-container .menu-list')
.should('not.contain', lists[0].title)
cy.location('pathname')
.should('equal', '/')
})
describe('List View', () => {
it('Should be an empty list', () => {
cy.visit('/lists/1')
cy.url()
.should('contain', '/lists/1/list')
cy.get('.list-title h1')
.should('contain', 'First List')
cy.get('.list-title .dropdown')
.should('exist')
cy.get('p')
.contains('This list is currently empty.')
.should('exist')
})
it('Should navigate to the task when the title is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
})
cy.visit('/lists/1/list')
cy.get('.tasks .task .tasktext')
.contains(tasks[0].title)
.first()
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`)
})
it('Should not see any elements for a list which is shared read only', () => {
UserFactory.create(2)
UserListFactory.create(1, {
list_id: 2,
user_id: 1,
right: 0,
})
const lists = ListFactory.create(2, {
owner_id: '{increment}',
namespace_id: '{increment}',
})
cy.visit(`/lists/${lists[1].id}/`)
cy.get('.list-title a.icon')
.should('not.exist')
cy.get('input.input[placeholder="Add a new task..."')
.should('not.exist')
})
it('Should only show the color of a list in the navigation and not in the list view', () => {
const lists = ListFactory.create(1, {
hex_color: '00db60',
})
TaskFactory.create(10, {
list_id: lists[0].id,
})
cy.visit(`/lists/${lists[0].id}/`)
cy.get('.menu-list li .list-menu-link .color-bubble')
.should('have.css', 'background-color', 'rgb(0, 219, 96)')
cy.get('.tasks-container .tasks .color-bubble')
.should('not.exist')
})
it('Should paginate for > 50 tasks', () => {
const tasks = TaskFactory.create(100, {
id: '{increment}',
title: i => `task${i}`,
list_id: 1,
})
cy.visit('/lists/1/list')
cy.get('.tasks-container .tasks')
.should('contain', tasks[99].title)
cy.get('.card-content .pagination .pagination-link')
.contains('2')
.click()
cy.url()
.should('contain', '?page=2')
cy.get('.tasks-container .tasks')
.should('contain', tasks[1].title)
cy.get('.tasks-container .tasks')
.should('not.contain', tasks[99].title)
})
})
describe('Table View', () => {
it('Should show a table with tasks', () => {
const tasks = TaskFactory.create(1)
cy.visit('/lists/1/table')
cy.get('.table-view table.table')
.should('exist')
cy.get('.table-view table.table')
.should('contain', tasks[0].title)
})
it('Should have working column switches', () => {
TaskFactory.create(1)
cy.visit('/lists/1/table')
cy.get('.table-view .filter-container .items .button')
.contains('Columns')
.click()
cy.get('.table-view .filter-container .card.columns-filter .card-content .fancycheckbox .check')
.contains('Priority')
.click()
cy.get('.table-view .filter-container .card.columns-filter .card-content .fancycheckbox .check')
.contains('Done')
.click()
cy.get('.table-view table.table th')
.contains('Priority')
.should('exist')
cy.get('.table-view table.table th')
.contains('Done')
.should('not.exist')
})
it('Should navigate to the task when the title is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
})
cy.visit('/lists/1/table')
cy.get('.table-view table.table')
.contains(tasks[0].title)
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`)
})
})
describe('Gantt View', () => {
it('Hides tasks with no dates', () => {
const tasks = TaskFactory.create(1)
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart-container .gantt-chart .tasks')
.should('not.contain', tasks[0].title)
})
it('Shows tasks from the current and next month', () => {
const now = new Date()
const nextMonth = now
nextMonth.setDate(1)
nextMonth.setMonth(now.getMonth() + 1)
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart-container .gantt-chart .months')
.should('contain', format(now, 'MMMM'))
.should('contain', format(nextMonth, 'MMMM'))
})
it('Shows tasks with dates', () => {
const now = new Date()
const tasks = TaskFactory.create(1, {
start_date: formatISO(now),
end_date: formatISO(now.setDate(now.getDate() + 4))
})
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart-container .gantt-chart .tasks')
.should('not.be.empty')
cy.get('.gantt-chart-container .gantt-chart .tasks')
.should('contain', tasks[0].title)
})
it('Shows tasks with no dates after enabling them', () => {
TaskFactory.create(1, {
start_date: null,
end_date: null,
})
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart-container .gantt-options .fancycheckbox')
.contains('Show tasks which don\'t have dates set')
.click()
cy.get('.gantt-chart-container .gantt-chart .tasks')
.should('not.be.empty')
cy.get('.gantt-chart-container .gantt-chart .tasks .task.nodate')
.should('exist')
})
it('Drags a task around', () => {
const now = new Date()
TaskFactory.create(1, {
start_date: formatISO(now),
end_date: formatISO(now.setDate(now.getDate() + 4))
})
cy.visit('/lists/1/gantt')
cy.get('.gantt-chart-container .gantt-chart .tasks .task')
.first()
.trigger('mousedown', {which: 1})
.trigger('mousemove', {clientX: 500, clientY: 0})
.trigger('mouseup', {force: true})
})
})
describe('Kanban', () => {
let buckets
beforeEach(() => {
buckets = BucketFactory.create(2)
})
it('Shows all buckets with their tasks', () => {
const data = TaskFactory.create(10, {
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket .title')
.contains(buckets[0].title)
.should('exist')
cy.get('.kanban .bucket .title')
.contains(buckets[1].title)
.should('exist')
cy.get('.kanban .bucket')
.first()
.should('contain', data[0].title)
})
it('Can add a new task to a bucket', () => {
const data = TaskFactory.create(2, {
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket')
.contains(buckets[0].title)
.get('.bucket-footer .button')
.contains('Add another task')
.click()
cy.get('.kanban .bucket')
.contains(buckets[0].title)
.get('.bucket-footer .field .control input.input')
.type('New Task{enter}')
cy.get('.kanban .bucket')
.first()
.should('contain', 'New Task')
})
it('Can create a new bucket', () => {
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket.new-bucket .button')
.click()
cy.get('.kanban .bucket.new-bucket input.input')
.type('New Bucket{enter}')
cy.wait(1000) // Wait for the request to finish
cy.get('.kanban .bucket .title')
.contains('New Bucket')
.should('exist')
})
it('Can set a bucket limit', () => {
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
.first()
.click()
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')
.first()
.type(3)
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .dropdown-item .field a.button.is-primary')
.first()
.click()
cy.get('.kanban .bucket .bucket-header span.limit')
.contains('0/3')
.should('exist')
})
it('Can rename a bucket', () => {
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket .bucket-header .title')
.first()
.type('{selectall}New Bucket Title{enter}')
cy.get('.kanban .bucket .bucket-header .title')
.first()
.should('contain', 'New Bucket Title')
})
it('Can delete a bucket', () => {
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
.first()
.click()
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-menu .dropdown-item')
.contains('Delete')
.click()
cy.get('.modal-mask .modal-container .modal-content .header')
.should('contain', 'Delete the bucket')
cy.get('.modal-mask .modal-container .modal-content .actions .button')
.contains('Do it!')
.click()
cy.get('.kanban .bucket .title')
.contains(buckets[0].title)
.should('not.exist')
cy.get('.kanban .bucket .title')
.contains(buckets[1].title)
.should('exist')
})
it('Can drag tasks around', () => {
const tasks = TaskFactory.create(2, {
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.get('.kanban .bucket .tasks .task')
.contains(tasks[0].title)
.first()
.drag('.kanban .bucket:nth-child(2) .tasks .dropper')
cy.get('.kanban .bucket:nth-child(2) .tasks')
.should('contain', tasks[0].title)
cy.get('.kanban .bucket:nth-child(1) .tasks')
.should('not.contain', tasks[0].title)
})
it('Should navigate to the task when the task card is clicked', () => {
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
bucket_id: 1,
})
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .tasks .task')
.contains(tasks[0].title)
.should('be.visible')
.click()
cy.url()
.should('contain', `/tasks/${tasks[0].id}`)
})
it('Should remove a task from the kanban board when moving it to another list', () => {
const lists = ListFactory.create(2)
BucketFactory.create(2, {
list_id: '{increment}',
})
const tasks = TaskFactory.create(5, {
id: '{increment}',
list_id: 1,
bucket_id: 1,
})
const task = tasks[0]
cy.visit('/lists/1/kanban')
cy.getSettled('.kanban .bucket .tasks .task')
.contains(task.title)
.should('be.visible')
.click()
cy.get('.task-view .action-buttons .button')
.contains('Move task')
.click()
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
.type(`${lists[1].title}{enter}`)
// The requests happen with a 200ms timeout. Because of that, the results are not yet there when cypress
// presses enter and we can't simulate pressing on enter to select the item.
cy.get('.task-view .content.details .field .multiselect.control .search-results')
.children()
.first()
.click()
cy.get('.global-notification', { timeout: 1000 })
.should('contain', 'Success')
cy.go('back')
cy.get('.kanban .bucket')
.should('not.contain', task.title)
})
})
describe('List history', () => {
it('should show a list history on the home page', () => {
const lists = ListFactory.create(6)
cy.visit('/')
cy.get('h3')
.contains('Last viewed')
.should('not.exist')
cy.visit(`/lists/${lists[0].id}`)
cy.visit(`/lists/${lists[1].id}`)
cy.visit(`/lists/${lists[2].id}`)
cy.visit(`/lists/${lists[3].id}`)
cy.visit(`/lists/${lists[4].id}`)
cy.visit(`/lists/${lists[5].id}`)
cy.visit('/')
cy.get('h3')
.contains('Last viewed')
.should('exist')
cy.get('.list-cards-wrapper-2-rows')
.should('not.contain', lists[0].title)
.should('contain', lists[1].title)
.should('contain', lists[2].title)
.should('contain', lists[3].title)
.should('contain', lists[4].title)
.should('contain', lists[5].title)
})
})
})

View File

@ -1,35 +0,0 @@
import '../../support/authenticateUser'
const setHours = hours => {
const date = new Date()
date.setHours(hours)
cy.clock(+date)
}
describe('Home Page', () => {
it('shows the right salutation in the night', () => {
setHours(4)
cy.visit('/')
cy.get('h2').should('contain', 'Good Night')
})
it('shows the right salutation in the morning', () => {
setHours(8)
cy.visit('/')
cy.get('h2').should('contain', 'Good Morning')
})
it('shows the right salutation in the day', () => {
setHours(13)
cy.visit('/')
cy.get('h2').should('contain', 'Hi')
})
it('shows the right salutation in the night', () => {
setHours(20)
cy.visit('/')
cy.get('h2').should('contain', 'Good Evening')
})
it('shows the right salutation in the night again', () => {
setHours(23)
cy.visit('/')
cy.get('h2').should('contain', 'Good Night')
})
})

View File

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

View File

@ -0,0 +1,26 @@
export function updateUserSettings(settings) {
const token = `Bearer ${window.localStorage.getItem('token')}`
return cy.request({
method: 'GET',
url: `${Cypress.env('API_URL')}/user`,
headers: {
'Authorization': token,
},
})
.its('body')
.then(oldSettings => {
return cy.request({
method: 'POST',
url: `${Cypress.env('API_URL')}/user/settings/general`,
headers: {
'Authorization': token,
},
body: {
...oldSettings,
...settings,
},
})
})
}

View File

@ -1,6 +1,6 @@
[build]
command = "yarn build"
publish = "dist"
publish = "dist-preview"
[[redirects]]
from = "/*"

View File

@ -6,79 +6,110 @@ pid /var/run/nginx.pid;
events {
worker_connections 1024;
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
types {
application/manifest+json webmanifest;
}
access_log /var/log/nginx/access.log main;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
#tcp_nopush on;
access_log /var/log/nginx/access.log main;
keepalive_timeout 65;
sendfile on;
#tcp_nopush on;
gzip on;
gzip_disable "msie6";
keepalive_timeout 65;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon audio/wav;
gzip on;
map_hash_max_size 128;
map_hash_bucket_size 128;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
text/plain
text/css
application/json
application/x-javascript
application/javascript
text/xml
application/xml
application/xml+rss
text/javascript
application/vnd.ms-fontobject
application/x-font-ttf
font/opentype
image/svg+xml
image/x-icon
audio/wav;
# Expires map
map $sent_http_content_type $expires {
default off;
text/html max;
text/css max;
application/javascript max;
text/javascript max;
application/vnd.ms-fontobject max;
application/x-font-ttf max;
font/opentype max;
font/woff2 max;
image/svg+xml max;
image/x-icon max;
audio/wav max;
~image/ max;
~font/ max;
}
map_hash_max_size 128;
map_hash_bucket_size 128;
server {
listen 80;
listen 81 default_server http2 proxy_protocol; ## Needed when behind HAProxy with SSL termination + HTTP/2 support
# Expires map
map $sent_http_content_type $expires {
default off;
text/css max;
application/javascript max;
text/javascript max;
application/vnd.ms-fontobject max;
application/x-font-ttf max;
font/opentype max;
font/woff2 max;
image/svg+xml max;
image/x-icon max;
audio/wav max;
~images/ max;
~font/ max;
}
server_name _;
server {
listen 80;
listen 81 default_server http2 proxy_protocol; ## Needed when behind HAProxy with SSL termination + HTTP/2 support
expires $expires;
server_name _;
location ~* .(txt|webmanifest|css|js|mjs|map|svg|jpg|jpeg|png|ico|ttf|woff|woff2|wav)$ {
root /usr/share/nginx/html;
try_files $uri $uri/ =404;
}
expires $expires;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html;
}
root /usr/share/nginx/html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# all assets contain hash in filename, cache forever
location ^~ /assets/ {
add_header Cache-Control "public, max-age=31536000, s-maxage=31536000, immutable";
try_files $uri =404;
}
# all workbox scripts are compiled with hash in filename, cache forever3
location ^~ /workbox- {
add_header Cache-Control "public, max-age=31536000, s-maxage=31536000, immutable";
try_files $uri =404;
}
# assume that everything else is handled by the application router, by injecting the index.html.
location / {
autoindex off;
expires off;
add_header Cache-Control "public, max-age=0, s-maxage=0, must-revalidate" always;
try_files $uri /index.html =404;
}
location ~* .(txt|webmanifest|css|js|mjs|map|svg|jpg|jpeg|png|ico|ttf|woff|woff2|wav)$ {
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}

View File

@ -5,93 +5,92 @@
"scripts": {
"serve": "vite",
"serve:dist-dev": "node scripts/serve-dist.js",
"serve:dist": "vite preview",
"serve:dist": "vite preview --port 4173",
"build": "vite build && workbox copyLibraries dist/",
"build:modern-only": "BUILD_MODERN_ONLY=true vite build && workbox copyLibraries dist/",
"build:dev": "vite build -m development --outDir dist-dev/",
"typecheck": "vue-tsc --noEmit",
"lint": "eslint --ignore-pattern '*.test.*' ./src --ext .vue,.js,.ts",
"lint:markup": "vue-tsc --noEmit",
"cypress:open": "cypress open",
"test:unit": "jest",
"test:unit": "vitest run",
"test:unit-watch": "vitest watch",
"test:frontend": "cypress run",
"browserslist:update": "npx browserslist@latest --update-db"
},
"dependencies": {
"@github/hotkey": "1.6.1",
"@github/hotkey": "2.0.0",
"@kyvg/vue3-notification": "2.3.4",
"@sentry/tracing": "6.16.1",
"@sentry/vue": "6.16.1",
"@vue/compat": "3.2.26",
"@vueuse/core": "7.5.1",
"@vueuse/router": "7.5.1",
"@sentry/tracing": "7.1.1",
"@sentry/vue": "7.1.1",
"@types/is-touch-device": "1.0.0",
"@types/sortablejs": "1.13.0",
"@vueuse/core": "8.6.0",
"@vueuse/router": "8.6.0",
"blurhash": "1.1.5",
"bulma-css-variables": "0.9.33",
"camel-case": "4.1.2",
"codemirror": "5.65.0",
"copy-to-clipboard": "3.3.1",
"date-fns": "2.28.0",
"dompurify": "2.3.4",
"easymde": "2.15.0",
"flatpickr": "4.6.9",
"dompurify": "2.3.8",
"easymde": "2.16.1",
"flatpickr": "4.6.13",
"flexsearch": "0.7.21",
"highlight.js": "11.3.1",
"highlight.js": "11.5.1",
"is-touch-device": "1.0.1",
"lodash.clonedeep": "4.5.0",
"lodash.debounce": "4.0.8",
"marked": "4.0.8",
"marked": "4.0.16",
"minimist": "1.2.6",
"register-service-worker": "1.7.2",
"snake-case": "3.0.4",
"ufo": "0.7.9",
"v-tooltip": "4.0.0-beta.2",
"vue": "3.2.26",
"vue-advanced-cropper": "2.7.0",
"ufo": "0.8.4",
"v-tooltip": "4.0.0-beta.17",
"vue": "3.2.37",
"vue-advanced-cropper": "2.8.1",
"vue-drag-resize": "2.0.3",
"vue-flatpickr-component": "9.0.5",
"vue-i18n": "9.2.0-beta.26",
"vue-router": "4.0.12",
"vuedraggable": "4.1.0",
"vue-flatpickr-component": "9.0.6",
"vue-i18n": "9.2.0-beta.36",
"vue-router": "4.0.16",
"vuex": "4.0.2",
"workbox-precaching": "6.4.2"
"workbox-precaching": "6.5.3",
"zhyswan-vuedraggable": "4.1.3"
},
"devDependencies": {
"@4tw/cypress-drag-drop": "2.1.0",
"@fortawesome/fontawesome-svg-core": "1.2.36",
"@fortawesome/free-regular-svg-icons": "5.15.4",
"@fortawesome/free-solid-svg-icons": "5.15.4",
"@fortawesome/vue-fontawesome": "3.0.0-5",
"@types/flexsearch": "0.7.2",
"@types/jest": "27.4.0",
"@typescript-eslint/eslint-plugin": "5.8.1",
"@typescript-eslint/parser": "5.8.1",
"@vitejs/plugin-legacy": "1.6.4",
"@vitejs/plugin-vue": "2.0.1",
"@faker-js/faker": "6.3.1",
"@fortawesome/fontawesome-svg-core": "6.1.1",
"@fortawesome/free-regular-svg-icons": "6.1.1",
"@fortawesome/free-solid-svg-icons": "6.1.1",
"@fortawesome/vue-fontawesome": "3.0.0",
"@types/flexsearch": "0.7.3",
"@typescript-eslint/eslint-plugin": "5.27.1",
"@typescript-eslint/parser": "5.27.1",
"@vitejs/plugin-legacy": "1.8.2",
"@vitejs/plugin-vue": "2.3.3",
"@vue/eslint-config-typescript": "10.0.0",
"autoprefixer": "10.4.1",
"axios": "0.24.0",
"browserslist": "4.19.1",
"caniuse-lite": "1.0.30001295",
"cypress": "9.2.0",
"cypress-file-upload": "5.0.8",
"esbuild": "0.14.10",
"eslint": "8.5.0",
"eslint-plugin-vue": "8.2.0",
"express": "4.17.2",
"faker": "5.5.3",
"jest": "27.4.5",
"netlify-cli": "8.6.0",
"postcss": "8.4.5",
"postcss-preset-env": "7.1.0",
"rollup": "2.62.0",
"rollup-plugin-visualizer": "5.5.2",
"sass": "1.45.2",
"slugify": "1.6.4",
"ts-jest": "27.1.2",
"typescript": "4.5.4",
"vite": "2.7.10",
"vite-plugin-pwa": "0.11.12",
"vite-svg-loader": "3.1.1",
"vue-tsc": "0.30.1",
"wait-on": "6.0.0",
"workbox-cli": "6.4.2"
"autoprefixer": "10.4.7",
"axios": "0.27.2",
"browserslist": "4.20.4",
"caniuse-lite": "1.0.30001341",
"cypress": "10.1.0",
"esbuild": "0.14.43",
"eslint": "8.17.0",
"eslint-plugin-vue": "9.1.1",
"express": "4.18.1",
"happy-dom": "5.2.0",
"netlify-cli": "10.3.1",
"postcss": "8.4.14",
"postcss-preset-env": "7.7.1",
"rollup": "2.75.6",
"rollup-plugin-visualizer": "5.6.0",
"sass": "1.52.3",
"typescript": "4.7.3",
"vite": "2.9.12",
"vite-plugin-pwa": "0.12.0",
"vite-svg-loader": "3.3.0",
"vitest": "0.14.2",
"vue-tsc": "0.37.3",
"wait-on": "6.0.1",
"workbox-cli": "6.5.3"
},
"eslintConfig": {
"root": true,
@ -129,7 +128,7 @@
"parser": "vue-eslint-parser",
"parserOptions": {
"parser": "@typescript-eslint/parser",
"ecmaVersion": 2021
"ecmaVersion": 2022
},
"ignorePatterns": [
"*.test.*",
@ -144,24 +143,6 @@
"autoprefixer": {}
}
},
"jest": {
"testPathIgnorePatterns": [
"cypress"
],
"testEnvironment": "jsdom",
"preset": "ts-jest",
"roots": [
"<rootDir>/src"
],
"transform": {
"^.+\\.(js|tsx?)$": "ts-jest"
},
"moduleFileExtensions": [
"ts",
"js",
"json"
]
},
"license": "AGPL-3.0-or-later",
"packageManager": "yarn@1.22.17"
"packageManager": "yarn@1.22.19"
}

View File

@ -3,5 +3,22 @@
"labels": ["dependencies"],
"extends": [
"config:base"
],
"packageRules": [
{
"matchPackageNames": ["netlify-cli"],
"extends": ["schedule:weekly"]
},
{
"groupName": "caniuse-and-related",
"matchPackageNames": ["caniuse-lite", "browserslist"],
"extends": ["schedule:weekly"]
},
{
"groupName": "vueuse",
"matchPackagePrefixes": [
"@vueuse/"
]
}
]
}

2
run.sh
View File

@ -16,7 +16,7 @@ VIKUNJA_API_URL=$(echo $VIKUNJA_API_URL |sed 's/\//\\\//g')
sed -i "s/http\:\/\/localhost\:3456//g" /usr/share/nginx/html/index.html # replacing in two steps to make sure api urls from releases are properly replaced as well
sed -i "s/'\/api\/v1/'$VIKUNJA_API_URL/g" /usr/share/nginx/html/index.html
sed -i "s/\.SENTRY_ENABLED = false/\.SENTRY_ENABLED = $VIKUNJA_SENTRY_ENABLED/g" /usr/share/nginx/html/index.html
sed -i "s/\.SENTRY_DSN = '.*'/\.SENTRY_DSN = '$VIKUNJA_SENTRY_DSN'/g" /usr/share/nginx/html/index.html
sed -i "s|\.SENTRY_DSN = '.*'|\.SENTRY_DSN = '$VIKUNJA_SENTRY_DSN'|g" /usr/share/nginx/html/index.html
sed -i "s/listen 80/listen $VIKUNJA_HTTP_PORT/g" /etc/nginx/nginx.conf
sed -i "s/listen 443/listen $VIKUNJA_HTTPS_PORT/g" /etc/nginx/nginx.conf

View File

@ -1,20 +1,24 @@
const slugify = require('slugify')
const {exec} = require('child_process')
const axios = require('axios')
const BOT_USER_ID = 513
const giteaToken = process.env.GITEA_TOKEN
const siteId = process.env.NETLIFY_SITE_ID
const branchSlug = slugify(process.env.DRONE_SOURCE_BRANCH)
const branchSlug = String(process.env.DRONE_SOURCE_BRANCH)
.trim()
.normalize('NFKD')
.toLowerCase()
.replace(/[.\s/]/g, '-')
.replace(/[^A-Za-z\d-]/g, '')
const prNumber = process.env.DRONE_PULL_REQUEST
const prIssueCommentsUrl = `https://kolaente.dev/api/v1/repos/vikunja/frontend/issues/${prNumber}/comments`
const alias = `${prNumber}-${branchSlug}`
const alias = `${prNumber}-${branchSlug}`.substring(0,37)
const fullPreviewUrl = `https://${alias}--vikunja-frontend-preview.netlify.app`
const promiseExec = cmd => {
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
exec(cmd, (error, stdout) => {
if (error) {
reject(error)
return

View File

@ -1 +1 @@
55ce0faaa2c1919341617ccfaeccbb6029ac12107964ff488985cff13dd952f1a991df3ab0d4b0705deb761e508e6434 ./scripts/deploy-preview-netlify.js
bb46342a0a08105b340ba7976cff9d80ef89901120ec0639669caa70bb7d2dbc43e78b1f635a7654ab2456e8358c98a4 ./scripts/deploy-preview-netlify.js

View File

@ -3,7 +3,7 @@ const express = require('express')
const app = express()
const p = path.join(__dirname, '..', 'dist-dev')
const port = 5000
const port = 4173
app.use(express.static(p))
// Handle urls set by the frontend

View File

@ -1,16 +1,14 @@
<template>
<ready :class="{'is-touch': isTouch}">
<div :class="{'is-hidden': !online}">
<template v-if="authUser">
<top-navigation/>
<content-auth/>
</template>
<content-link-share v-else-if="authLinkShare"/>
<no-auth-wrapper v-else>
<router-view/>
</no-auth-wrapper>
<Notification/>
</div>
<ready>
<template v-if="authUser">
<TheNavigation/>
<content-auth/>
</template>
<content-link-share v-else-if="authLinkShare"/>
<no-auth-wrapper v-else>
<router-view/>
</no-auth-wrapper>
<Notification/>
<transition name="fade">
<keyboard-shortcuts v-if="keyboardShortcutsActive"/>
@ -19,18 +17,17 @@
</template>
<script lang="ts" setup>
import {computed, watch, watchEffect, Ref} from 'vue'
import {computed, watch, Ref} from 'vue'
import {useRouter} from 'vue-router'
import {useRouteQuery} from '@vueuse/router'
import {useStore} from 'vuex'
import {useI18n} from 'vue-i18n'
import {useOnline} from '@vueuse/core'
import isTouchDevice from 'is-touch-device'
import {success} from '@/message'
import Notification from '@/components/misc/notification.vue'
import KeyboardShortcuts from './components/misc/keyboard-shortcuts/index.vue'
import TopNavigation from './components/home/topNavigation.vue'
import TheNavigation from '@/components/home/TheNavigation.vue'
import ContentAuth from './components/home/contentAuth.vue'
import ContentLinkShare from './components/home/contentLinkShare.vue'
import NoAuthWrapper from '@/components/misc/no-auth-wrapper.vue'
@ -38,23 +35,20 @@ import Ready from '@/components/misc/ready.vue'
import {setLanguage} from './i18n'
import AccountDeleteService from '@/services/accountDelete'
import {ONLINE} from '@/store/mutation-types'
import {useColorScheme} from '@/composables/useColorScheme'
import {useBodyClass} from '@/composables/useBodyClass'
const store = useStore()
const online = useOnline()
watchEffect(() => store.commit(ONLINE, online.value))
const router = useRouter()
const isTouch = computed(isTouchDevice)
useBodyClass('is-touch', isTouchDevice())
const keyboardShortcutsActive = computed(() => store.state.keyboardShortcutsActive)
const authUser = computed(() => store.getters['auth/authUser'])
const authLinkShare = computed(() => store.getters['auth/authLinkShare'])
const {t} = useI18n()
const {t} = useI18n({useScope: 'global'})
// setup account deletion verification
const accountDeletionConfirm = useRouteQuery('accountDeletionConfirm') as Ref<null | string>
@ -69,7 +63,7 @@ watch(accountDeletionConfirm, async (accountDeletionConfirm) => {
store.dispatch('auth/refreshUserInfo')
}, { immediate: true })
// setup passwort reset redirect
// setup password reset redirect
const userPasswordReset = useRouteQuery('userPasswordReset') as Ref<null | string>
watch(userPasswordReset, (userPasswordReset) => {
if (userPasswordReset === null) {

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,120 @@
<template>
<component
:is="componentNodeName"
class="base-button"
:class="{ 'base-button--type-button': isButton }"
v-bind="elementBindings"
:disabled="disabled || undefined"
>
<slot />
</component>
</template>
<script lang="ts">
import {defineComponent} from 'vue'
// see https://v3.vuejs.org/api/sfc-script-setup.html#usage-alongside-normal-script
export default defineComponent({
inheritAttrs: false,
})
</script>
<script lang="ts" setup>
// this component removes styling differences between links / vue-router links and button elements
// by doing so we make it easy abstract the functionality from style and enable easier and semantic
// correct button and link usage. Also see: https://css-tricks.com/a-complete-guide-to-links-and-buttons/#accessibility-considerations
// the component tries to heuristically determine what it should be checking the props (see the
// componentNodeName and elementBindings ref for this).
// NOTE: Do NOT use buttons with @click to push routes. => Use router-links instead!
import { ref, watchEffect, computed, useAttrs, PropType } from 'vue'
const BASE_BUTTON_TYPES_MAP = Object.freeze({
button: 'button',
submit: 'submit',
})
type BaseButtonTypes = keyof typeof BASE_BUTTON_TYPES_MAP
const props = defineProps({
type: {
type: String as PropType<BaseButtonTypes>,
default: 'button',
},
disabled: {
type: Boolean,
default: false,
},
})
const componentNodeName = ref<Node['nodeName']>('button')
interface ElementBindings {
type?: string;
rel?: string,
}
const elementBindings = ref({})
const attrs = useAttrs()
watchEffect(() => {
// by default this component is a button element with the attribute of the type "button" (default prop value)
let nodeName = 'button'
let bindings: ElementBindings = {type: props.type}
// if we find a "to" prop we set it as router-link
if ('to' in attrs) {
nodeName = 'router-link'
bindings = {}
}
// if there is a href we assume the user wants an external link via a link element
// we also set a predefined value for the attribute rel, but make it possible to overwrite this by the user.
if ('href' in attrs) {
nodeName = 'a'
bindings = {rel: 'noreferrer noopener nofollow'}
}
componentNodeName.value = nodeName
elementBindings.value = {
...bindings,
...attrs,
}
})
const isButton = computed(() => componentNodeName.value === 'button')
</script>
<style lang="scss">
// NOTE: we do not use scoped styles to reduce specifity and make it easy to overwrite
// We reset the default styles of a button element to enable easier styling
:where(.base-button--type-button) {
border: 0;
margin: 0;
padding: 0;
text-decoration: none;
background-color: transparent;
text-align: center;
appearance: none;
}
:where(.base-button) {
cursor: pointer;
display: block;
color: inherit;
font: inherit;
user-select: none;
pointer-events: auto; // disable possible resets
&:focus {
outline: transparent;
}
&[disabled] {
cursor: default;
}
}
</style>

View File

@ -0,0 +1,21 @@
export const DATE_RANGES = {
// Format:
// Key is the title, as a translation string, the first entry of the value array
// is the "from" date, the second one is the "to" date.
'today': ['now/d', 'now/d+1d'],
'lastWeek': ['now/w-1w', 'now/w-2w'],
'thisWeek': ['now/w', 'now/w+1w'],
'restOfThisWeek': ['now', 'now/w+1w'],
'nextWeek': ['now/w+1w', 'now/w+2w'],
'next7Days': ['now', 'now+7d'],
'lastMonth': ['now/M-1M', 'now/M-2M'],
'thisMonth': ['now/M', 'now/M+1M'],
'restOfThisMonth': ['now', 'now/M+1M'],
'nextMonth': ['now/M+1M', 'now/M+2M'],
'next30Days': ['now', 'now+30d'],
'thisYear': ['now/y', 'now/y+1y'],
'restOfThisYear': ['now', 'now/y+1y'],
}

View File

@ -0,0 +1,131 @@
<template>
<card
class="has-no-shadow how-it-works-modal"
:title="$t('input.datemathHelp.title')">
<p>
{{ $t('input.datemathHelp.intro') }}
</p>
<p>
<i18n-t keypath="input.datemathHelp.expression">
<code>now</code>
<code>||</code>
</i18n-t>
</p>
<p>
<i18n-t keypath="input.datemathHelp.similar">
<BaseButton
href="https://grafana.com/docs/grafana/latest/dashboards/time-range-controls/"
target="_blank">
Grafana
</BaseButton>
<BaseButton
href="https://www.elastic.co/guide/en/elasticsearch/reference/7.3/common-options.html#date-math"
target="_blank">
Elasticsearch
</BaseButton>
</i18n-t>
</p>
<p>{{ $t('misc.forExample') }}</p>
<ul>
<li><code>+1d</code>{{ $t('input.datemathHelp.add1Day') }}</li>
<li><code>-1d</code>{{ $t('input.datemathHelp.minus1Day') }}</li>
<li><code>/d</code>{{ $t('input.datemathHelp.roundDay') }}</li>
</ul>
<p>{{ $t('input.datemathHelp.supportedUnits') }}</p>
<table class="table">
<tbody>
<tr>
<td><code>s</code></td>
<td>{{ $t('input.datemathHelp.units.seconds') }}</td>
</tr>
<tr>
<td><code>m</code></td>
<td>{{ $t('input.datemathHelp.units.minutes') }}</td>
</tr>
<tr>
<td><code>h</code></td>
<td>{{ $t('input.datemathHelp.units.hours') }}</td>
</tr>
<tr>
<td><code>H</code></td>
<td>{{ $t('input.datemathHelp.units.hours') }}</td>
</tr>
<tr>
<td><code>d</code></td>
<td>{{ $t('input.datemathHelp.units.days') }}</td>
</tr>
<tr>
<td><code>w</code></td>
<td>{{ $t('input.datemathHelp.units.weeks') }}</td>
</tr>
<tr>
<td><code>M</code></td>
<td>{{ $t('input.datemathHelp.units.months') }}</td>
</tr>
<tr>
<td><code>y</code></td>
<td>{{ $t('input.datemathHelp.units.years') }}</td>
</tr>
</tbody>
</table>
<p>{{ $t('input.datemathHelp.someExamples') }}</p>
<table class="table">
<tbody>
<tr>
<td><code>now</code></td>
<td>{{ $t('input.datemathHelp.examples.now') }}</td>
</tr>
<tr>
<td><code>now+24h</code></td>
<td>{{ $t('input.datemathHelp.examples.in24h') }}</td>
</tr>
<tr>
<td><code>now/d</code></td>
<td>{{ $t('input.datemathHelp.examples.today') }}</td>
</tr>
<tr>
<td><code>now/w</code></td>
<td>{{ $t('input.datemathHelp.examples.beginningOfThisWeek') }}</td>
</tr>
<tr>
<td><code>now/w+1w</code></td>
<td>{{ $t('input.datemathHelp.examples.endOfThisWeek') }}</td>
</tr>
<tr>
<td><code>now+30d</code></td>
<td>{{ $t('input.datemathHelp.examples.in30Days') }}</td>
</tr>
<tr>
<td><code>{{ exampleDate }}||+1M/d</code></td>
<td>
<i18n-t keypath="input.datemathHelp.examples.datePlusMonth">
<code>{{ exampleDate }}</code>
</i18n-t>
</td>
</tr>
</tbody>
</table>
</card>
</template>
<script lang="ts" setup>
import {format} from 'date-fns'
import BaseButton from '@/components/base/BaseButton.vue'
const exampleDate = format(new Date(), 'yyyy-MM-dd')
</script>
<style scoped>
.how-it-works-modal {
font-size: 1rem;
}
p {
display: inline-block !important;
}
.base-button {
display: inline;
}
</style>

View File

@ -0,0 +1,254 @@
<template>
<div class="datepicker-with-range-container">
<popup>
<template #trigger="{toggle}">
<slot name="trigger" :toggle="toggle" :buttonText="buttonText"></slot>
</template>
<template #content="{isOpen}">
<div class="datepicker-with-range" :class="{'is-open': isOpen}">
<div class="selections">
<BaseButton @click="setDateRange(null)" :class="{'is-active': customRangeActive}">
{{ $t('misc.custom') }}
</BaseButton>
<BaseButton
v-for="(value, text) in DATE_RANGES"
:key="text"
@click="setDateRange(value)"
:class="{'is-active': from === value[0] && to === value[1]}">
{{ $t(`input.datepickerRange.ranges.${text}`) }}
</BaseButton>
</div>
<div class="flatpickr-container input-group">
<label class="label">
{{ $t('input.datepickerRange.from') }}
<div class="field has-addons">
<div class="control is-fullwidth">
<input class="input" type="text" v-model="from"/>
</div>
<div class="control">
<x-button icon="calendar" variant="secondary" data-toggle/>
</div>
</div>
</label>
<label class="label">
{{ $t('input.datepickerRange.to') }}
<div class="field has-addons">
<div class="control is-fullwidth">
<input class="input" type="text" v-model="to"/>
</div>
<div class="control">
<x-button icon="calendar" variant="secondary" data-toggle/>
</div>
</div>
</label>
<flat-pickr
:config="flatPickerConfig"
v-model="flatpickrRange"
/>
<p>
{{ $t('input.datemathHelp.canuse') }}
<BaseButton class="has-text-primary" @click="showHowItWorks = true">
{{ $t('input.datemathHelp.learnhow') }}
</BaseButton>
</p>
<modal
@close="() => showHowItWorks = false"
:enabled="showHowItWorks"
transition-name="fade"
:overflow="true"
variant="hint-modal"
>
<DatemathHelp/>
</modal>
</div>
</div>
</template>
</popup>
</div>
</template>
<script lang="ts" setup>
import {computed, ref, watch} from 'vue'
import {useStore} from 'vuex'
import {useI18n} from 'vue-i18n'
import flatPickr from 'vue-flatpickr-component'
import 'flatpickr/dist/flatpickr.css'
import Popup from '@/components/misc/popup.vue'
import {DATE_RANGES} from '@/components/date/dateRanges'
import BaseButton from '@/components/base/BaseButton.vue'
import DatemathHelp from '@/components/date/datemathHelp.vue'
const store = useStore()
const {t} = useI18n({useScope: 'global'})
const emit = defineEmits(['dateChanged'])
// FIXME: This seems to always contain the default value - that breaks the picker
const weekStart = computed<number>(() => store.state.auth.settings.weekStart ?? 0)
const flatPickerConfig = computed(() => ({
altFormat: t('date.altFormatLong'),
altInput: true,
dateFormat: 'Y-m-d H:i',
enableTime: false,
wrap: true,
mode: 'range',
locale: {
firstDayOf7Days: weekStart.value,
},
}))
const showHowItWorks = ref(false)
const flatpickrRange = ref('')
const from = ref('')
const to = ref('')
function emitChanged() {
emit('dateChanged', {
dateFrom: from.value === '' ? null : from.value,
dateTo: to.value === '' ? null : to.value,
})
}
watch(
() => flatpickrRange.value,
(newVal: string | null) => {
if (newVal === null) {
return
}
const [fromDate, toDate] = newVal.split(' to ')
if (typeof fromDate === 'undefined' || typeof toDate === 'undefined') {
return
}
from.value = fromDate
to.value = toDate
emitChanged()
},
)
watch(() => from.value, emitChanged)
watch(() => to.value, emitChanged)
function setDateRange(range: string[] | null) {
if (range === null) {
from.value = ''
to.value = ''
return
}
from.value = range[0]
to.value = range[1]
}
const customRangeActive = computed<boolean>(() => {
return !Object.values(DATE_RANGES).some(range => from.value === range[0] && to.value === range[1])
})
const buttonText = computed<string>(() => {
if (from.value !== '' && to.value !== '') {
return t('input.datepickerRange.fromto', {
from: from.value,
to: to.value,
})
}
return t('task.show.select')
})
</script>
<style lang="scss" scoped>
.datepicker-with-range-container {
position: relative;
}
:deep(.popup) {
z-index: 10;
margin-top: 1rem;
border-radius: $radius;
border: 1px solid var(--grey-200);
background-color: var(--white);
box-shadow: $shadow;
&.is-open {
width: 500px;
height: 320px;
}
}
.datepicker-with-range {
display: flex;
width: 100%;
height: 100%;
position: absolute;
}
:deep(.flatpickr-calendar) {
margin: 0 auto 8px;
box-shadow: none;
}
.flatpickr-container {
width: 70%;
border-left: 1px solid var(--grey-200);
padding: 1rem;
font-size: .9rem;
// Flatpickr has no option to use it without an input field so we're hiding it instead
:deep(input.form-control.input) {
height: 0;
padding: 0;
border: 0;
}
.field .control :deep(.button) {
border: 1px solid var(--input-border-color);
height: 2.25rem;
&:hover {
border: 1px solid var(--input-hover-border-color);
}
}
.label, .input, :deep(.button) {
font-size: .9rem;
}
}
.selections {
width: 30%;
display: flex;
flex-direction: column;
padding-top: .5rem;
overflow-y: scroll;
button {
display: block;
width: 100%;
text-align: left;
padding: .5rem 1rem;
transition: $transition;
font-size: .9rem;
color: var(--text);
background: transparent;
border: 0;
cursor: pointer;
&.is-active {
color: var(--primary);
}
&:hover, &.is-active {
background-color: var(--grey-100);
}
}
}
</style>

View File

@ -1,9 +1,12 @@
<script setup lang="ts">
import { computed } from 'vue'
import { useNow } from '@vueuse/core'
import LogoFull from '@/assets/logo-full.svg?component'
import LogoFullPride from '@/assets/logo-full-pride.svg?component'
const Logo = computed(() => new Date().getMonth() === 5 ? LogoFullPride : LogoFull)
const now = useNow()
const Logo = computed(() => now.value.getMonth() === 5 ? LogoFullPride : LogoFull)
</script>
<template>

View File

@ -1,8 +1,7 @@
<template>
<button
type="button"
@click="$store.commit('toggleMenu')"
<BaseButton
class="menu-show-button"
@click="$store.commit('toggleMenu')"
@shortkey="() => $store.commit('toggleMenu')"
v-shortcut="'Control+e'"
:title="$t('keyboardShortcuts.toggleMenu')"
@ -10,11 +9,14 @@
/>
</template>
<script setup>
<script setup lang="ts">
import {computed} from 'vue'
import {store} from '@/store'
import {useStore} from 'vuex'
const menuActive = computed(() => store.menuActive)
import BaseButton from '@/components/base/BaseButton.vue'
const store = useStore()
const menuActive = computed(() => store.state.menuActive)
</script>
<style lang="scss" scoped>
@ -22,11 +24,6 @@ $lineWidth: 2rem;
$size: $lineWidth + 1rem;
.menu-show-button {
// FIXME: create general button component
appearance: none;
background-color: transparent;
border: 0;
min-height: $size;
width: $size;

View File

@ -1,10 +1,11 @@
<template>
<a class="menu-bottom-link" :href="poweredByUrl" target="_blank" rel="noreferrer noopener nofollow">
<BaseButton class="menu-bottom-link" :href="poweredByUrl" target="_blank">
{{ $t('misc.poweredBy') }}
</a>
</BaseButton>
</template>
<script setup lang="ts">
import BaseButton from '@/components/base/BaseButton.vue'
import {POWERED_BY as poweredByUrl} from '@/urls'
</script>

View File

@ -1,9 +1,8 @@
<template>
<nav
:class="{'has-background': background}"
<header
:class="{'has-background': background, 'menu-active': menuActive}"
aria-label="main navigation"
class="navbar main-theme is-fixed-top"
role="navigation"
class="navbar main-theme is-fixed-top d-print-none"
>
<router-link :to="{name: 'home'}" class="logo-link">
<Logo width="164" height="48"/>
@ -33,12 +32,15 @@
</a>
<notifications/>
<div class="user">
<img :src="userAvatar" alt="" class="avatar" width="40" height="40"/>
<dropdown class="is-right" ref="usernameDropdown">
<template #trigger>
<template #trigger="{toggleOpen}">
<x-button
type="secondary"
:shadow="false">
class="username-dropdown-trigger"
@click="toggleOpen()"
variant="secondary"
:shadow="false"
>
<img :src="userAvatar" alt="" class="avatar" width="40" height="40"/>
<span class="username">{{ userInfo.name !== '' ? userInfo.name : userInfo.username }}</span>
<span class="icon is-small">
<icon icon="chevron-down"/>
@ -46,92 +48,98 @@
</x-button>
</template>
<router-link :to="{name: 'user.settings'}" class="dropdown-item">
<BaseButton
:to="{name: 'user.settings'}"
class="dropdown-item"
>
{{ $t('user.settings.title') }}
</router-link>
<a
</BaseButton>
<BaseButton
v-if="imprintUrl"
:href="imprintUrl"
class="dropdown-item"
target="_blank"
rel="noreferrer noopener nofollow"
v-if="imprintUrl">
>
{{ $t('navigation.imprint') }}
</a>
<a
</BaseButton>
<BaseButton
v-if="privacyPolicyUrl"
:href="privacyPolicyUrl"
class="dropdown-item"
target="_blank"
rel="noreferrer noopener nofollow"
v-if="privacyPolicyUrl">
>
{{ $t('navigation.privacy') }}
</a>
<a @click="$store.commit('keyboardShortcutsActive', true)" class="dropdown-item">
</BaseButton>
<BaseButton
@click="$store.commit('keyboardShortcutsActive', true)"
class="dropdown-item"
>
{{ $t('keyboardShortcuts.title') }}
</a>
<router-link :to="{name: 'about'}" class="dropdown-item">
</BaseButton>
<BaseButton
:to="{name: 'about'}"
class="dropdown-item"
>
{{ $t('about.title') }}
</router-link>
<a @click="logout()" class="dropdown-item">
</BaseButton>
<BaseButton
@click="logout()"
class="dropdown-item"
>
{{ $t('user.auth.logout') }}
</a>
</BaseButton>
</dropdown>
</div>
</div>
</nav>
</header>
</template>
<script>
import {mapState} from 'vuex'
import {CURRENT_LIST, QUICK_ACTIONS_ACTIVE} from '@/store/mutation-types'
<script setup lang="ts">
import {ref, computed, onMounted, nextTick} from 'vue'
import {useStore} from 'vuex'
import {useRouter} from 'vue-router'
import {QUICK_ACTIONS_ACTIVE} from '@/store/mutation-types'
import Rights from '@/models/constants/rights.json'
import Update from '@/components/home/update.vue'
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
import Dropdown from '@/components/misc/dropdown.vue'
import Notifications from '@/components/notifications/notifications.vue'
import Logo from '@/components/home/Logo.vue'
import BaseButton from '@/components/base/BaseButton.vue'
import MenuButton from '@/components/home/MenuButton.vue'
export default {
name: 'topNavigation',
components: {
Notifications,
Dropdown,
ListSettingsDropdown,
Update,
Logo,
MenuButton,
},
computed: {
...mapState({
userInfo: state => state.auth.info,
userAvatar: state => state.auth.avatarUrl,
userAuthenticated: state => state.auth.authenticated,
currentList: CURRENT_LIST,
background: 'background',
imprintUrl: state => state.config.legal.imprintUrl,
privacyPolicyUrl: state => state.config.legal.privacyPolicyUrl,
canWriteCurrentList: state => state.currentList.maxRight > Rights.READ,
}),
},
mounted() {
this.$nextTick(() => {
if (typeof this.$refs.usernameDropdown === 'undefined' || typeof this.$refs.listTitle === 'undefined') {
return
}
const store = useStore()
const usernameWidth = this.$refs.usernameDropdown.$el.clientWidth
this.$refs.listTitle.style.setProperty('--nav-username-width', `${usernameWidth}px`)
})
},
methods: {
logout() {
this.$store.dispatch('auth/logout')
this.$router.push({name: 'user.login'})
},
openQuickActions() {
this.$store.commit(QUICK_ACTIONS_ACTIVE, true)
},
},
const userInfo = computed(() => store.state.auth.info)
const userAvatar = computed(() => store.state.auth.avatarUrl)
const currentList = computed(() => store.state.currentList)
const background = computed(() => store.state.background)
const imprintUrl = computed(() => store.state.config.legal.imprintUrl)
const privacyPolicyUrl = computed(() => store.state.config.legal.privacyPolicyUrl)
const canWriteCurrentList = computed(() => store.state.currentList.maxRight > Rights.READ)
const menuActive = computed(() => store.state.menuActive)
const usernameDropdown = ref()
const listTitle = ref()
onMounted(async () => {
await nextTick()
if (typeof usernameDropdown.value === 'undefined' || typeof listTitle.value === 'undefined') {
return
}
const usernameWidth = usernameDropdown.value.$el.clientWidth
listTitle.value.style.setProperty('--nav-username-width', `${usernameWidth}px`)
})
const router = useRouter()
function logout() {
store.dispatch('auth/logout')
router.push({name: 'user.login'})
}
function openQuickActions() {
store.commit(QUICK_ACTIONS_ACTIVE, true)
}
</script>
@ -142,10 +150,6 @@ $user-dropdown-width-mobile: 5rem;
$hamburger-menu-icon-spacing: 1rem;
$hamburger-menu-icon-width: 28px;
.navbar {
z-index: 4 !important;
}
.logo-link {
display: none;
padding: 0.5rem 0.75rem;
@ -170,7 +174,6 @@ $hamburger-menu-icon-width: 28px;
.navbar.main-theme {
background: var(--site-background);
z-index: 5 !important;
justify-content: space-between;
align-items: center;
@ -194,21 +197,20 @@ $hamburger-menu-icon-width: 28px;
}
@media screen and (max-width: $tablet) {
&.menu-active {
z-index: 0;
}
.user {
width: $user-dropdown-width-mobile;
display: flex;
align-items: center;
:deep(.dropdown-trigger) {
.username-dropdown-trigger {
line-height: 1;
padding: 0 0.25rem;
height: 1rem;
.button {
padding: 0 0.25rem;
height: 1rem;
.icon {
width: .5rem;
}
.icon {
width: .5rem;
}
}
@ -247,9 +249,10 @@ $hamburger-menu-icon-width: 28px;
border-radius: 100%;
vertical-align: middle;
height: 40px;
margin-right: .5rem;
}
:deep(.dropdown-trigger .button) {
.username-dropdown-trigger {
background: none;
&:focus:not(:active), &:active {

View File

@ -1,47 +1,68 @@
<template>
<div>
<a @click="$store.commit('menuActive', false)" class="menu-hide-button" v-if="menuActive">
<icon icon="times" />
</a>
<div class="content-auth">
<BaseButton
v-if="menuActive"
@click="$store.commit('menuActive', false)"
class="menu-hide-button d-print-none"
>
<icon icon="times"/>
</BaseButton>
<div
:class="{'has-background': background}"
:style="{'background-image': background && `url(${background})`}"
:class="{'has-background': background || blurHash}"
:style="{'background-image': blurHash && `url(${blurHash})`}"
class="app-container"
>
<navigation/>
<div
:class="{'is-visible': background}"
class="app-container-background background-fade-in d-print-none"
:style="{'background-image': background && `url(${background})`}"></div>
<navigation class="d-print-none"/>
<main
:class="[
{ 'is-menu-enabled': menuActive },
$route.name,
]"
class="app-content"
>
<a @click="$store.commit('menuActive', false)" class="mobile-overlay" v-if="menuActive"></a>
<BaseButton
v-if="menuActive"
@click="$store.commit('menuActive', false)"
class="mobile-overlay d-print-none"
/>
<quick-actions/>
<router-view/>
<router-view name="popup" v-slot="{ Component }">
<transition name="modal">
<component :is="Component" />
</transition>
<router-view :route="routeWithModal" v-slot="{ Component }">
<keep-alive :include="['list.list', 'list.gantt', 'list.table', 'list.kanban']">
<component :is="Component"/>
</keep-alive>
</router-view>
<transition name="modal">
<modal
v-if="currentModal"
@close="closeModal()"
variant="scrolling"
class="task-detail-view-modal"
>
<component :is="currentModal"/>
</modal>
</transition>
<a
class="keyboard-shortcuts-button"
class="keyboard-shortcuts-button d-print-none"
@click="showKeyboardShortcuts()"
v-shortcut="'?'"
>
<icon icon="keyboard"/>
</a>
</div>
</main>
</div>
</div>
</template>
<script lang="ts" setup>
import {watch, computed} from 'vue'
import {watch, computed, shallowRef, watchEffect, VNode, h} from 'vue'
import {useStore} from 'vuex'
import {useRoute, useRouter} from 'vue-router'
import {useEventListener} from '@vueuse/core'
@ -49,10 +70,63 @@ import {useEventListener} from '@vueuse/core'
import {CURRENT_LIST, KEYBOARD_SHORTCUTS_ACTIVE, MENU_ACTIVE} from '@/store/mutation-types'
import Navigation from '@/components/home/navigation.vue'
import QuickActions from '@/components/quick-actions/quick-actions.vue'
import BaseButton from '@/components/base/BaseButton.vue'
function useRouteWithModal() {
const router = useRouter()
const route = useRoute()
const backdropView = computed(() => route.fullPath && window.history.state.backdropView)
const routeWithModal = computed(() => {
return backdropView.value
? router.resolve(backdropView.value)
: route
})
const currentModal = shallowRef<VNode>()
watchEffect(() => {
if (!backdropView.value) {
currentModal.value = undefined
return
}
// logic from vue-router
// https://github.com/vuejs/vue-router-next/blob/798cab0d1e21f9b4d45a2bd12b840d2c7415f38a/src/RouterView.ts#L125
const routePropsOption = route.matched[0]?.props.default
const routeProps = routePropsOption
? routePropsOption === true
? route.params
: typeof routePropsOption === 'function'
? routePropsOption(route)
: routePropsOption
: null
currentModal.value = h(
route.matched[0]?.components.default,
routeProps,
)
})
function closeModal() {
const historyState = computed(() => route.fullPath && window.history.state)
if (historyState.value) {
router.back()
} else {
const backdropRoute = historyState.value?.backdropView && router.resolve(historyState.value.backdropView)
router.push(backdropRoute)
}
}
return {routeWithModal, currentModal, closeModal}
}
const {routeWithModal, currentModal, closeModal} = useRouteWithModal()
const store = useStore()
const background = computed(() => store.state.background)
const blurHash = computed(() => store.state.blurHash)
const menuActive = computed(() => store.state.menuActive)
function showKeyboardShortcuts() {
@ -80,11 +154,11 @@ watch(() => route.name as string, (routeName) => {
'migrate.start',
'migrate.wunderlist',
'namespaces.index',
].includes(routeName) ||
].includes(routeName) ||
routeName.startsWith('user.settings')
)
) {
store.dispatch(CURRENT_LIST, null)
store.dispatch(CURRENT_LIST, {list: null})
}
})
@ -92,7 +166,7 @@ watch(() => route.name as string, (routeName) => {
function useRenewTokenOnFocus() {
const router = useRouter()
const userInfo = computed(() => store.state.auth.info)
const authenticated = computed(() => store.state.auth.authenticated)
@ -156,40 +230,47 @@ store.dispatch('labels/loadAllLabels')
}
.app-container {
min-height: calc(100vh - 65px);
min-height: calc(100vh - 65px);
@media screen and (max-width: $tablet) {
padding-top: $navbar-height;
}
.app-content {
padding: $navbar-height + 1.5rem 1.5rem 1rem 1.5rem;
z-index: 2;
@media screen and (max-width: $tablet) {
margin-left: 0;
padding-top: 1.5rem;
min-height: calc(100vh - 4rem);
}
&.is-menu-enabled {
margin-left: $navbar-width;
@media screen and (max-width: $tablet) {
min-width: 100%;
margin-left: 0;
}
}
&.task\.detail {
padding-left: 0;
padding-right: 0;
@media screen and (max-width: $tablet) {
padding-top: $navbar-height;
}
.card {
background: var(--white);
}
}
.app-content {
z-index: 10;
position: relative;
padding-top: 1rem;
@media screen {
padding: $navbar-height + 1.5rem 1.5rem 1rem 1.5rem;
}
// Used to make sure the spinner is always in the middle while loading
> .loader-container {
min-height: calc(100vh - #{$navbar-height + 1.5rem + 1rem});
}
@media screen and (max-width: $tablet) {
margin-left: 0;
padding-top: 1.5rem;
min-height: calc(100vh - 4rem);
}
@media screen {
&.is-menu-enabled {
margin-left: $navbar-width;
@media screen and (max-width: $tablet) {
min-width: 100%;
margin-left: 0;
}
}
}
.card {
background: var(--white);
}
}
}
.mobile-overlay {
@ -199,7 +280,9 @@ store.dispatch('labels/loadAllLabels')
bottom: 0;
left: 0;
right: 0;
background: rgba(250, 250, 250, 0.8);
height: 100vh;
width: 100vw;
background: hsla(var(--grey-100-hsl), 0.8);
z-index: 5;
opacity: 0;
transition: all $transition;
@ -218,9 +301,21 @@ store.dispatch('labels/loadAllLabels')
color: var(--grey-500);
transition: color $transition;
@media screen and (max-width: $tablet) {
display: none;
}
}
.content-auth {
position: relative;
z-index: 1;
}
.is-touch .content-auth,
.content-auth.z-unset {
z-index: unset;
}
@include modal-transition();
</style>

View File

@ -1,6 +1,6 @@
<template>
<div
:class="[background ? 'has-background' : '', $route.name+'-view']"
:class="[background ? 'has-background' : '', $route.name as string +'-view']"
:style="{'background-image': `url(${background})`}"
class="link-share-container"
>

View File

@ -1,12 +1,12 @@
<template>
<div :class="{'is-active': menuActive}" class="namespace-container">
<div class="menu top-menu">
<aside :class="{'is-active': menuActive}" class="namespace-container">
<nav class="menu top-menu">
<router-link :to="{name: 'home'}" class="logo">
<Logo width="164" height="48" />
<Logo width="164" height="48"/>
</router-link>
<ul class="menu-list">
<li>
<router-link :to="{ name: 'home'}">
<router-link :to="{ name: 'home'}" v-shortcut="'g o'">
<span class="icon">
<icon icon="calendar"/>
</span>
@ -14,7 +14,7 @@
</router-link>
</li>
<li>
<router-link :to="{ name: 'tasks.range'}">
<router-link :to="{ name: 'tasks.range'}" v-shortcut="'g u'">
<span class="icon">
<icon :icon="['far', 'calendar-alt']"/>
</span>
@ -22,7 +22,7 @@
</router-link>
</li>
<li>
<router-link :to="{ name: 'namespaces.index'}">
<router-link :to="{ name: 'namespaces.index'}" v-shortcut="'g n'">
<span class="icon">
<icon icon="layer-group"/>
</span>
@ -30,7 +30,7 @@
</router-link>
</li>
<li>
<router-link :to="{ name: 'labels.index'}">
<router-link :to="{ name: 'labels.index'}" v-shortcut="'g a'">
<span class="icon">
<icon icon="tags"/>
</span>
@ -38,7 +38,7 @@
</router-link>
</li>
<li>
<router-link :to="{ name: 'teams.index'}">
<router-link :to="{ name: 'teams.index'}" v-shortcut="'g m'">
<span class="icon">
<icon icon="users"/>
</span>
@ -46,31 +46,35 @@
</router-link>
</li>
</ul>
</div>
</nav>
<aside class="menu namespaces-lists loader-container is-loading-small" :class="{'is-loading': loading}">
<template v-for="(n, nk) in namespaces" :key="n.id" >
<nav class="menu namespaces-lists loader-container is-loading-small" :class="{'is-loading': loading}">
<template v-for="(n, nk) in namespaces" :key="n.id">
<div class="namespace-title" :class="{'has-menu': n.id > 0}">
<span
@click="toggleLists(n.id)"
class="menu-label"
v-tooltip="namespaceTitles[nk]">
v-tooltip="namespaceTitles[nk]"
>
<span
v-if="n.hexColor !== ''"
:style="{ backgroundColor: n.hexColor }"
class="color-bubble"
/>
<span class="name">
<span
:style="{ backgroundColor: n.hexColor }"
class="color-bubble"
v-if="n.hexColor !== ''">
</span>
{{ namespaceTitles[nk] }}
</span>
<a
class="icon is-small toggle-lists-icon pl-2"
:class="{'active': typeof listsVisible[n.id] !== 'undefined' ? listsVisible[n.id] : true}"
@click="toggleLists(n.id)"
>
<icon icon="chevron-down"/>
</a>
<span class="count" :class="{'ml-2 mr-0': n.id > 0}">
({{ namespaceListsCount[nk] }})
</span>
</span>
<a
class="icon is-small toggle-lists-icon"
:class="{'active': typeof listsVisible[n.id] !== 'undefined' ? listsVisible[n.id] : true}"
@click="toggleLists(n.id)"
>
<icon icon="chevron-down"/>
</a>
<namespace-settings-dropdown :namespace="n" v-if="n.id > 0"/>
</div>
<div
@ -81,18 +85,20 @@
<!--
NOTE: a v-model / computed setter is not possible, since the updateActiveLists function
triggered by the change needs to have access to the current namespace
-->
-->
<draggable
v-bind="dragOptions"
:modelValue="activeLists[nk]"
@update:modelValue="(lists) => updateActiveLists(n, lists)"
:group="`namespace-${n.id}-lists`"
group="namespace-lists"
@start="() => drag = true"
@end="e => saveListPosition(e, nk)"
@end="saveListPosition"
handle=".handle"
:disabled="n.id < 0 || null"
:disabled="n.id < 0 || undefined"
tag="transition-group"
item-key="id"
:data-namespace-id="n.id"
:data-namespace-index="nk"
:component-data="{
type: 'transition',
tag: 'ul',
@ -134,7 +140,7 @@
:class="{'is-favorite': l.isFavorite}"
@click.prevent.stop="toggleFavoriteList(l)"
class="favorite">
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']" />
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']"/>
</span>
</a>
</router-link>
@ -145,136 +151,140 @@
</draggable>
</div>
</template>
</aside>
<PoweredByLink />
</div>
</nav>
<PoweredByLink/>
</aside>
</template>
<script>
import {mapState} from 'vuex'
import draggable from 'vuedraggable'
<script setup lang="ts">
import {ref, computed, onMounted, onBeforeMount} from 'vue'
import {useStore} from 'vuex'
import draggable from 'zhyswan-vuedraggable'
import {SortableEvent} from 'sortablejs'
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
import NamespaceSettingsDropdown from '@/components/namespace/namespace-settings-dropdown.vue'
import PoweredByLink from '@/components/home/PoweredByLink.vue'
import Logo from '@/components/home/Logo.vue'
import {CURRENT_LIST, MENU_ACTIVE, LOADING, LOADING_MODULE} from '@/store/mutation-types'
import {MENU_ACTIVE} from '@/store/mutation-types'
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
import {useEventListener} from '@vueuse/core'
import NamespaceModel from '@/models/namespace'
import ListModel from '@/models/list'
const drag = ref(false)
const dragOptions = {
animation: 100,
ghostClass: 'ghost',
}
const store = useStore()
const currentList = computed(() => store.state.currentList)
const menuActive = computed(() => store.state.menuActive)
const loading = computed(() => store.state.loading && store.state.loadingModule === 'namespaces')
export default {
name: 'navigation',
const namespaces = computed(() => {
return (store.state.namespaces.namespaces as NamespaceModel[]).filter(n => !n.isArchived)
})
const activeLists = computed(() => {
return namespaces.value.map(({lists}) => {
return lists?.filter(item => {
return typeof item !== 'undefined' && !item.isArchived
})
})
})
components: {
ListSettingsDropdown,
NamespaceSettingsDropdown,
draggable,
Logo,
PoweredByLink,
},
const namespaceTitles = computed(() => {
return namespaces.value.map((namespace) => getNamespaceTitle(namespace))
})
data() {
return {
listsVisible: {},
drag: false,
dragOptions: {
animation: 100,
ghostClass: 'ghost',
},
listUpdating: {},
const namespaceListsCount = computed(() => {
return namespaces.value.map((_, index) => activeLists.value[index]?.length ?? 0)
})
useEventListener('resize', resize)
onMounted(() => resize())
function toggleFavoriteList(list: ListModel) {
// The favorites pseudo list is always favorite
// Archived lists cannot be marked favorite
if (list.id === -1 || list.isArchived) {
return
}
store.dispatch('lists/toggleListFavorite', list)
}
function resize() {
// Hide the menu by default on mobile
store.commit(MENU_ACTIVE, window.innerWidth >= 770)
}
function toggleLists(namespaceId: number) {
listsVisible.value[namespaceId] = !listsVisible.value[namespaceId]
}
const listsVisible = ref<{ [id: NamespaceModel['id']]: boolean }>({})
// FIXME: async action will be unfinished when component mounts
onBeforeMount(async () => {
const namespaces = await store.dispatch('namespaces/loadNamespaces') as NamespaceModel[]
namespaces.forEach(n => {
if (typeof listsVisible.value[n.id] === 'undefined') {
listsVisible.value[n.id] = true
}
},
computed: {
...mapState({
namespaces: state => state.namespaces.namespaces.filter(n => !n.isArchived),
currentList: CURRENT_LIST,
background: 'background',
menuActive: MENU_ACTIVE,
loading: state => state[LOADING] && state[LOADING_MODULE] === 'namespaces',
}),
activeLists() {
return this.namespaces.map(({lists}) => lists?.filter(item => !item.isArchived))
},
namespaceTitles() {
return this.namespaces.map((namespace, index) => {
const title = this.getNamespaceTitle(namespace)
return `${title} (${this.activeLists[index]?.length ?? 0})`
})
},
},
beforeCreate() {
// FIXME: async action in beforeCreate, might be unfinished when component mounts
this.$store.dispatch('namespaces/loadNamespaces')
.then(namespaces => {
namespaces.forEach(n => {
if (typeof this.listsVisible[n.id] === 'undefined') {
this.listsVisible[n.id] = true
}
})
})
},
created() {
window.addEventListener('resize', this.resize)
},
mounted() {
this.resize()
},
methods: {
toggleFavoriteList(list) {
// The favorites pseudo list is always favorite
// Archived lists cannot be marked favorite
if (list.id === -1 || list.isArchived) {
return
}
this.$store.dispatch('lists/toggleListFavorite', list)
},
resize() {
// Hide the menu by default on mobile
this.$store.commit(MENU_ACTIVE, window.innerWidth >= 770)
},
toggleLists(namespaceId) {
this.listsVisible[namespaceId] = !this.listsVisible[namespaceId]
},
updateActiveLists(namespace, activeLists) {
// this is a bit hacky: since we do have to filter out the archived items from the list
// for vue draggable updating it is not as simple as replacing it.
// instead we iterate over the non archived items in the old list and replace them with the ones in their new order
const lists = namespace.lists.map((item) => {
if (item.isArchived) {
return item
}
return activeLists.shift()
})
})
})
const newNamespace = {
...namespace,
lists,
}
function updateActiveLists(namespace: NamespaceModel, activeLists: ListModel[]) {
// This is a bit hacky: since we do have to filter out the archived items from the list
// for vue draggable updating it is not as simple as replacing it.
// To work around this, we merge the active lists with the archived ones. Doing so breaks the order
// because now all archived lists are sorted after the active ones. This is fine because they are sorted
// later when showing them anyway, and it makes the merging happening here a lot easier.
const lists = [
...activeLists,
...namespace.lists.filter(l => l.isArchived),
]
this.$store.commit('namespaces/setNamespaceById', newNamespace)
},
store.commit('namespaces/setNamespaceById', {
...namespace,
lists,
})
}
async saveListPosition(e, namespaceIndex) {
const listsActive = this.activeLists[namespaceIndex]
const list = listsActive[e.newIndex]
const listBefore = listsActive[e.newIndex - 1] ?? null
const listAfter = listsActive[e.newIndex + 1] ?? null
this.listUpdating[list.id] = true
const listUpdating = ref<{ [id: NamespaceModel['id']]: boolean }>({})
const position = calculateItemPosition(listBefore !== null ? listBefore.position : null, listAfter !== null ? listAfter.position : null)
async function saveListPosition(e: SortableEvent) {
if (!e.newIndex) return
try {
// create a copy of the list in order to not violate vuex mutations
await this.$store.dispatch('lists/updateList', {
...list,
position,
})
} finally {
this.listUpdating[list.id] = false
}
},
},
const namespaceId = parseInt(e.to.dataset.namespaceId as string)
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
const listsActive = activeLists.value[newNamespaceIndex]
const list = listsActive[e.newIndex]
const listBefore = listsActive[e.newIndex - 1] ?? null
const listAfter = listsActive[e.newIndex + 1] ?? null
listUpdating.value[list.id] = true
const position = calculateItemPosition(
listBefore !== null ? listBefore.position : null,
listAfter !== null ? listAfter.position : null,
)
try {
// create a copy of the list in order to not violate vuex mutations
await store.dispatch('lists/updateList', {
...list,
position,
namespaceId,
})
} finally {
listUpdating.value[list.id] = false
}
}
</script>
@ -285,7 +295,6 @@ $vikunja-nav-color: var(--grey-700);
$vikunja-nav-selected-width: 0.4rem;
.namespace-container {
z-index: 6;
background: $vikunja-nav-background;
color: $vikunja-nav-color;
padding: 0 0 1rem;
@ -298,10 +307,10 @@ $vikunja-nav-selected-width: 0.4rem;
overflow-x: auto;
width: $navbar-width;
@media screen and (max-width: $tablet) {
top: 0;
width: 70vw;
z-index: 20;
}
&.is-active {
@ -361,12 +370,17 @@ $vikunja-nav-selected-width: 0.4rem;
&:hover .favorite {
opacity: 1;
}
&:hover {
background: transparent;
}
}
.menu-label {
.color-bubble {
width: 14px !important;
height: 14px !important;
width: 14px;
height: 14px;
flex-basis: auto;
}
.is-archived {
@ -387,6 +401,12 @@ $vikunja-nav-selected-width: 0.4rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: auto;
}
.count {
color: var(--grey-500);
margin-right: .5rem;
}
}
@ -463,10 +483,6 @@ $vikunja-nav-selected-width: 0.4rem;
}
}
a:hover {
background: transparent;
}
span.list-menu-link, li > a {
padding: 0.75rem .5rem 0.75rem ($navbar-padding * 1.5 - 1.75rem);
transition: all 0.2s ease;
@ -482,7 +498,7 @@ $vikunja-nav-selected-width: 0.4rem;
height: 1rem;
vertical-align: middle;
padding-right: 0.5rem;
&.handle {
opacity: 0;
transition: opacity $transition;
@ -490,7 +506,7 @@ $vikunja-nav-selected-width: 0.4rem;
cursor: grab;
}
}
&:hover .icon.handle {
opacity: 1;
}
@ -513,8 +529,9 @@ $vikunja-nav-selected-width: 0.4rem;
.logo {
display: block;
padding-left: 2rem;
padding-left: 1rem;
margin-right: 1rem;
margin-bottom: 1rem;
@media screen and (min-width: $tablet) {
display: none;
@ -542,7 +559,7 @@ $vikunja-nav-selected-width: 0.4rem;
span.list-menu-link, li > a {
padding-left: 2rem;
display: inline-block;
.icon {
padding-bottom: .25rem;
}
@ -552,7 +569,15 @@ $vikunja-nav-selected-width: 0.4rem;
}
.list-setting-spacer {
width: 32px;
width: 2.5rem;
flex-shrink: 0;
}
.namespaces-list.loader-container.is-loading {
min-height: calc(100vh - #{$navbar-height + 1.5rem + 1rem + 1.5rem});
}
a.dropdown-item:hover {
background: var(--dropdown-item-hover-background-color) !important;
}
</style>

View File

@ -7,54 +7,47 @@
</div>
</template>
<script>
export default {
name: 'update',
data() {
return {
updateAvailable: false,
registration: null,
refreshing: false,
}
},
created() {
document.addEventListener('swUpdated', this.showRefreshUI, {once: true})
<script lang="ts" setup>
import {ref} from 'vue'
if (navigator && navigator.serviceWorker) {
navigator.serviceWorker.addEventListener(
'controllerchange', () => {
if (this.refreshing) return
this.refreshing = true
window.location.reload()
},
)
}
},
methods: {
showRefreshUI(e) {
console.log('recieved refresh event', e)
this.registration = e.detail
this.updateAvailable = true
const updateAvailable = ref(false)
const registration = ref(null)
const refreshing = ref(false)
document.addEventListener('swUpdated', showRefreshUI, {once: true})
if (navigator && navigator.serviceWorker) {
navigator.serviceWorker.addEventListener(
'controllerchange', () => {
if (refreshing.value) return
refreshing.value = true
window.location.reload()
},
refreshApp() {
this.updateExists = false
if (!this.registration || !this.registration.waiting) {
return
}
// Notify the service worker to actually do the update
this.registration.waiting.postMessage('skipWaiting')
},
},
)
}
function showRefreshUI(e) {
console.log('recieved refresh event', e)
registration.value = e.detail
updateAvailable.value = true
}
function refreshApp() {
if (!registration.value || !registration.value.waiting) {
return
}
// Notify the service worker to actually do the update
registration.value.waiting.postMessage('skipWaiting')
}
</script>
<style lang="scss" scoped>
.update-notification {
margin: 1rem;
margin: .5rem;
display: flex;
align-items: center;
background: $warning;
padding: 0 0 0 .5rem;
padding: 0 .25rem;
border-radius: $radius;
font-size: .9rem;
color: var(--grey-900);
@ -66,6 +59,7 @@ export default {
margin: 0;
width: 450px;
left: calc(50vw - 225px);
padding: .5rem;
}
@media screen and (max-width: $tablet) {
@ -85,4 +79,8 @@ export default {
margin-left: .5rem;
}
}
.dark .update-notification {
color: var(--grey-200);
}
</style>

View File

@ -1,77 +1,65 @@
<template>
<a
<BaseButton
class="button"
:class="{
'is-loading': loading,
'has-no-shadow': !shadow,
'is-primary': type === 'primary',
'is-outlined': type === 'secondary',
'is-text is-inverted has-no-shadow underline-none':
type === 'tertary',
}"
:disabled="disabled || null"
@click="click"
:href="href !== '' ? href : null"
:class="[
variantClass,
{
'is-loading': loading,
'has-no-shadow': !shadow || variant === 'tertiary',
}
]"
>
<icon :icon="icon" v-if="showIconOnly"/>
<span class="icon is-small" v-else-if="icon !== ''">
<icon :icon="icon"/>
</span>
<slot></slot>
</a>
<slot />
</BaseButton>
</template>
<script>
export default {
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
name: 'x-button',
props: {
type: {
type: String,
default: 'primary',
},
href: {
type: String,
default: '',
},
to: {
default: false,
},
icon: {
default: '',
},
loading: {
type: Boolean,
default: false,
},
shadow: {
type: Boolean,
default: true,
},
disabled: {
type: Boolean,
default: false,
},
},
emits: ['click'],
computed: {
showIconOnly() {
return this.icon !== '' && typeof this.$slots.default === 'undefined'
},
},
methods: {
click(e) {
if (this.disabled) {
return
}
})
</script>
if (this.to !== false) {
this.$router.push(this.to)
}
<script setup lang="ts">
import {computed, useSlots, PropType} from 'vue'
import BaseButton from '@/components/base/BaseButton.vue'
this.$emit('click', e)
},
const BUTTON_TYPES_MAP = Object.freeze({
primary: 'is-primary',
secondary: 'is-outlined',
tertiary: 'is-text is-inverted underline-none',
})
type ButtonTypes = keyof typeof BUTTON_TYPES_MAP
const props = defineProps({
variant: {
type: String as PropType<ButtonTypes>,
default: 'primary',
},
}
icon: {
type: [String, Array],
default: '',
},
loading: {
type: Boolean,
default: false,
},
shadow: {
type: Boolean,
default: true,
},
})
const variantClass = computed(() => BUTTON_TYPES_MAP[props.variant])
const slots = useSlots()
const showIconOnly = computed(() => props.icon !== '' && typeof slots.default === 'undefined')
</script>
<style lang="scss" scoped>
@ -81,10 +69,10 @@ export default {
text-transform: uppercase;
font-size: 0.85rem;
font-weight: bold;
height: $button-height;
min-height: $button-height;
box-shadow: var(--shadow-sm);
display: inline-flex;
&.is-hovered,
&:hover {
box-shadow: var(--shadow-md);
}
@ -106,9 +94,10 @@ export default {
color: var(--white);
}
&.is-small {
border-radius: $radius;
}
}
.is-small {
border-radius: $radius;
}
.underline-none {

View File

@ -1,7 +1,7 @@
<template>
<div class="color-picker-container">
<datalist :id="colorListID">
<option v-for="color in defaultColors" :key="color" :value="color" />
<option v-for="defaultColor in defaultColors" :key="defaultColor" :value="defaultColor" />
</datalist>
<div class="picker">
@ -27,14 +27,16 @@
@click="reset"
class="is-small ml-2"
:shadow="false"
type="secondary"
variant="secondary"
>
{{ $t('input.resetColor') }}
</x-button>
</div>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import {createRandomID} from '@/helpers/randomId'
const DEFAULT_COLORS = [
@ -46,7 +48,7 @@ const DEFAULT_COLORS = [
'#00db60',
]
export default {
export default defineComponent({
name: 'colorPicker',
data() {
return {
@ -58,6 +60,7 @@ export default {
},
props: {
modelValue: {
type: String,
required: true,
},
menuPosition: {
@ -105,7 +108,7 @@ export default {
this.update(true)
},
},
}
})
</script>
<style lang="scss" scoped>

View File

@ -101,6 +101,7 @@
class="is-fullwidth"
:shadow="false"
@click="close"
v-cy="'closeDatepicker'"
>
{{ $t('misc.confirm') }}
</x-button>
@ -109,10 +110,12 @@
</div>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import flatPickr from 'vue-flatpickr-component'
import 'flatpickr/dist/flatpickr.css'
import { i18n } from '@/i18n'
import {i18n} from '@/i18n'
import {format} from 'date-fns'
import {calculateDayInterval} from '@/helpers/time/calculateDayInterval'
@ -120,17 +123,13 @@ import {calculateNearestHours} from '@/helpers/time/calculateNearestHours'
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
import {createDateFromString} from '@/helpers/time/createDateFromString'
export default {
export default defineComponent({
name: 'datepicker',
data() {
return {
date: null,
show: false,
changed: false,
// Since flatpickr dates are strings, we need to convert them to native date objects.
// To make that work, we need a separate variable since flatpickr does not have a change event.
flatPickrDate: null,
}
},
components: {
@ -163,10 +162,6 @@ export default {
handler: 'setDateValue',
immediate: true,
},
flatPickrDate(newVal) {
this.date = createDateFromString(newVal)
this.updateData()
},
},
computed: {
flatPickerConfig() {
@ -182,10 +177,25 @@ export default {
},
}
},
// Since flatpickr dates are strings, we need to convert them to native date objects.
// To make that work, we need a separate variable since flatpickr does not have a change event.
flatPickrDate: {
set(newValue) {
this.date = createDateFromString(newValue)
this.updateData()
},
get() {
if (!this.date) {
return ''
}
return format(this.date, 'yyy-LL-dd H:mm')
},
},
},
methods: {
setDateValue(newVal) {
if(newVal === null) {
if (newVal === null) {
this.date = null
return
}
@ -197,7 +207,7 @@ export default {
this.$emit('change', this.date)
},
toggleDatePopup() {
if(this.disabled) {
if (this.disabled) {
return
}
@ -209,12 +219,16 @@ export default {
}
},
close() {
this.show = false
this.$emit('close', this.changed)
if(this.changed) {
this.changed = false
this.$emit('close-on-change', this.changed)
}
// Kind of dirty, but the timeout allows us to enter a time and click on "confirm" without
// having to click on another input field before it is actually used.
setTimeout(() => {
this.show = false
this.$emit('close', this.changed)
if (this.changed) {
this.changed = false
this.$emit('close-on-change', this.changed)
}
}, 200)
},
setDate(date) {
if (this.date === null) {
@ -241,7 +255,7 @@ export default {
return format(newDate, 'E')
},
},
}
})
</script>
<style lang="scss" scoped>
@ -280,7 +294,7 @@ export default {
}
&:hover {
background: var(--light);
background: var(--grey-100);
}
.text {
@ -301,7 +315,7 @@ export default {
text-align: center;
}
}
a.button {
margin: 1rem;
width: calc(100% - 2rem);

View File

@ -1,7 +1,7 @@
<template>
<div class="editor">
<div class="clear"></div>
<vue-easymde
:configs="config"
@change="bubble"
@ -16,11 +16,11 @@
<p class="has-text-centered has-text-grey is-italic my-5" v-if="showPreviewText">
{{ emptyText }}
<template v-if="isEditEnabled">
<a @click="toggleEdit">{{ $t('input.editor.edit') }}</a>.
<a @click="toggleEdit" class="d-print-none">{{ $t('input.editor.edit') }}</a>.
</template>
</p>
<ul class="actions" v-if="bottomActions.length > 0">
<ul class="actions d-print-none" v-if="bottomActions.length > 0">
<li v-if="isEditEnabled && !showPreviewText && showSave">
<a v-if="showEditButton" @click="toggleEdit">{{ $t('input.editor.edit') }}</a>
<a v-else-if="isEditActive" @click="toggleEdit" class="done-edit">{{ $t('misc.save') }}</a>
@ -30,20 +30,27 @@
</li>
</ul>
<template v-else-if="isEditEnabled && showSave">
<ul v-if="showEditButton" class="actions">
<ul v-if="showEditButton" class="actions d-print-none">
<li>
<a @click="toggleEdit">{{ $t('input.editor.edit') }}</a>
</li>
</ul>
<x-button v-else-if="isEditActive" @click="toggleEdit" type="secondary" :shadow="false">
<x-button
v-else-if="isEditActive"
@click="toggleEdit"
variant="secondary"
:shadow="false"
v-cy="'saveEditor'">
{{ $t('misc.save') }}
</x-button>
</template>
</div>
</template>
<script>
import VueEasymde from './vue-easymde/vue-easymde.vue'
<script lang="ts">
import {defineComponent} from 'vue'
import VueEasymde from './vue-easymde.vue'
import {marked} from 'marked'
import DOMPurify from 'dompurify'
import hljs from 'highlight.js/lib/common'
@ -55,7 +62,7 @@ import AttachmentService from '../../services/attachment'
import {findCheckboxesInText} from '../../helpers/checklistFromText'
import {createRandomID} from '@/helpers/randomId'
export default {
export default defineComponent({
name: 'editor',
components: {
VueEasymde,
@ -174,7 +181,7 @@ export default {
}
this.changeTimeout = setTimeout(() => {
this.$emit('update:modelValue',this.text)
this.$emit('update:modelValue', this.text)
this.$emit('change', this.text)
}, timeout)
},
@ -304,16 +311,13 @@ export default {
}
},
},
}
})
</script>
<style lang="scss">
@import 'codemirror/lib/codemirror.css';
@import './vue-easymde/vue-easymde.css';
@import 'highlight.js/scss/base16/equilibrium-gray-light';
$editor-border-color: #ddd;
.editor {
.clear {
clear: both;
@ -321,6 +325,8 @@ $editor-border-color: #ddd;
.preview.content {
margin-bottom: .5rem;
overflow-wrap: anywhere; // Safari does not understand "break-word" so we put that first to make sure it at least is able to show it somewhat properly there.
overflow-wrap: break-word;
ul li {
input[type="checkbox"] {
@ -328,7 +334,7 @@ $editor-border-color: #ddd;
}
&.has-checkbox {
margin-left: -2em;
margin-left: -1.25rem;
list-style: none;
}
}
@ -337,7 +343,7 @@ $editor-border-color: #ddd;
.CodeMirror {
padding: .5rem;
border: 1px solid $editor-border-color;
border: 1px solid var(--grey-200) !important;
background: var(--white);
&-lines pre {
@ -348,6 +354,10 @@ $editor-border-color: #ddd;
color: var(--grey-400) !important;
font-style: italic;
}
&-cursor {
border-color: var(--grey-700);
}
}
.editor-preview {
@ -359,12 +369,17 @@ $editor-border-color: #ddd;
}
.editor-toolbar {
background: #ffffff;
border-top: 1px solid $editor-border-color;
border-left: 1px solid $editor-border-color;
border-right: 1px solid $editor-border-color;
background: var(--grey-50);
border: 1px solid var(--grey-200);
border-bottom: none;
button {
color: var(--grey-700);
&.active {
background: var(--grey-200);
}
svg {
vertical-align: middle;
@ -379,6 +394,15 @@ $editor-border-color: #ddd;
top: 24px;
margin-left: -3px;
}
&:hover {
background: var(--grey-200);
border-color: var(--grey-300);
}
}
i.separator {
border-color: var(--grey-200) !important;
}
}

View File

@ -1,134 +0,0 @@
import EasyMDE from 'easymde'
import {i18n} from '@/i18n'
export function createEasyMDEConfig({ placeholder, uploadImage, imageUploadFunction }) {
return {
autoDownloadFontAwesome: false,
spellChecker: false,
placeholder,
uploadImage,
imageUploadFunction,
minHeight: '150px',
toolbar: [
{
name: 'heading-1',
action: EasyMDE.toggleHeading1,
title: i18n.global.t('input.editor.heading1'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-2',
action: EasyMDE.toggleHeading2,
title: i18n.global.t('input.editor.heading2'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-3',
action: EasyMDE.toggleHeading3,
title: i18n.global.t('input.editor.heading3'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-smaller',
action: EasyMDE.toggleHeadingSmaller,
title: i18n.global.t('input.editor.headingSmaller'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-bigger',
action: EasyMDE.toggleHeadingBigger,
title: i18n.global.t('input.editor.headingBigger'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
'|',
{
name: 'bold',
action: EasyMDE.toggleBold,
title: i18n.global.t('input.editor.bold'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3.5 3H6.5H15.25C18.15 3 20.5 5.36 20.5 8.25C20.5 9.8 19.81 11.19 18.73 12.15C20.37 13.04 21.5 14.76 21.5 16.75C21.5 19.64 19.15 22 16.25 22H6.5H3.5C2.95 22 2.5 21.55 2.5 21C2.5 20.45 2.95 20 3.5 20H5.5V5H3.5C2.95 5 2.5 4.55 2.5 4C2.5 3.45 2.95 3 3.5 3ZM7.5 20H16.25C18.04 20 19.5 18.54 19.5 16.75C19.5 14.96 18.04 13.5 16.25 13.5H7.5V20ZM7.5 11.5H15.25C17.04 11.5 18.5 10.04 18.5 8.25C18.5 6.46 17.04 5 15.25 5H7.5V11.5Z"/></svg>',
},
{
name: 'italic',
action: EasyMDE.toggleItalic,
title: i18n.global.t('input.editor.italic'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.0967 4.2H17.0001C17.3301 4.2 17.6001 3.93 17.6001 3.6C17.6001 3.27 17.3301 3 17.0001 3H10.2001C9.8701 3 9.6001 3.27 9.6001 3.6C9.6001 3.93 9.8701 4.2 10.2001 4.2H12.8748L9.90335 19.8H6.9999C6.6699 19.8 6.3999 20.07 6.3999 20.4C6.3999 20.73 6.6699 21 6.9999 21H13.7999C14.1299 21 14.3999 20.73 14.3999 20.4C14.3999 20.07 14.1299 19.8 13.7999 19.8H11.1253L14.0967 4.2Z"/></svg>',
},
{
name: 'strikethrough',
action: EasyMDE.toggleStrikethrough,
title: i18n.global.t('input.editor.strikethrough'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.25 7.17005C18.25 7.50005 17.98 7.77005 17.65 7.77005C17.32 7.77005 17.05 7.50005 17.05 7.17005V5.96005C15.97 5.12005 14.17 4.56005 12.79 4.31005C11.1 4.00005 9.51 4.30005 8.41 5.12005C7.2 6.03005 6.67 7.67005 7.19 8.88005C7.56 9.73005 8.37 10.31 8.98 10.64C9.57215 10.9644 10.1961 11.2013 10.8465 11.3999H20.4C20.73 11.3999 21 11.6699 21 11.9999C21 12.3299 20.73 12.5999 20.4 12.5999H15.3012C16.6583 13.0929 17.5255 13.7765 17.95 14.69C18.73 16.36 17.74 18.33 16.36 19.41C15.05 20.4401 13.35 21 11.54 21H11.16C9.78 20.9401 8.34 20.5301 6.95 19.85V20.3601C6.95 20.6901 6.68 20.96 6.35 20.96C6.02 20.96 5.75 20.6901 5.75 20.3601V17.36C5.75 17.03 6.02 16.76 6.35 16.76C6.68 16.76 6.95 17.03 6.95 17.36V18.5C8.35 19.2801 9.81 19.74 11.21 19.8C12.86 19.89 14.46 19.39 15.62 18.48C16.6 17.71 17.37 16.3 16.86 15.21C16.55 14.54 15.8 14.0201 14.58 13.63C13.9711 13.4331 13.3222 13.2762 12.6906 13.1235C12.6168 13.1056 12.5432 13.0878 12.47 13.07C12.4313 13.0607 12.3925 13.0514 12.3537 13.0421C11.7861 12.9055 11.2108 12.767 10.6413 12.5999H3.6C3.27 12.5999 3 12.3299 3 11.9999C3 11.6699 3.27 11.3999 3.6 11.3999H7.90288C7.04984 10.8343 6.42752 10.1363 6.09 9.36005C5.34 7.63005 6.03 5.40005 7.69 4.16005C9.05 3.15005 10.99 2.77005 13 3.13005C13.64 3.25005 15.53 3.66005 17.05 4.53005V4.17005C17.05 3.84005 17.32 3.57005 17.65 3.57005C17.98 3.57005 18.25 3.84005 18.25 4.17005V7.17005Z"/></svg>',
},
{
name: 'code',
action: EasyMDE.toggleCodeBlock,
title: i18n.global.t('input.editor.code'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M8.57 20.9601C8.64 20.9901 8.71 21.0001 8.78 21.0001C9.02 21.0001 9.24 20.8501 9.34 20.6101L15.79 3.81005C15.9 3.50005 15.75 3.15005 15.44 3.03005C15.14 2.92005 14.79 3.07005 14.67 3.38005L8.22 20.1801C8.11 20.4901 8.26 20.8401 8.57 20.9601ZM7.00007 18.0001C6.85007 18.0001 6.69007 17.9401 6.58007 17.8201L1.18007 12.4201C0.950068 12.1901 0.950068 11.8101 1.18007 11.5701L6.58007 6.17006C6.81007 5.94006 7.19007 5.94006 7.43007 6.17006C7.66007 6.40006 7.66007 6.78006 7.43007 7.02006L2.45007 12.0001L7.43007 16.9801C7.66007 17.2101 7.66007 17.5901 7.43007 17.8301C7.31007 17.9401 7.15007 18.0001 7.00007 18.0001ZM17 18.0001C16.85 18.0001 16.69 17.9401 16.58 17.8201C16.35 17.5901 16.35 17.2101 16.58 16.9701L21.55 12.0001L16.57 7.02006C16.34 6.79006 16.34 6.41006 16.57 6.17006C16.81 5.94006 17.19 5.94006 17.42 6.17006L22.82 11.5701C23.05 11.8001 23.05 12.1801 22.82 12.4201L17.42 17.8201C17.31 17.9401 17.15 18.0001 17 18.0001Z"/></svg>',
},
{
name: 'quote',
action: EasyMDE.toggleBlockquote,
title: i18n.global.t('input.editor.quote'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M19.373 5.16357H5.62695C4.79102 5.16357 4.11133 5.84326 4.11133 6.6792V16.2095C4.11133 17.0464 4.79102 17.7261 5.62695 17.7261H6.8877V21.1245C6.8877 21.3667 7.0332 21.5854 7.25684 21.6782C7.33203 21.7095 7.41016 21.7241 7.4873 21.7241C7.64258 21.7241 7.7959 21.6636 7.91113 21.5493L11.748 17.7261H19.373C20.209 17.7261 20.8887 17.0464 20.8887 16.2095V6.6792C20.8887 5.84326 20.209 5.16357 19.373 5.16357ZM19.6895 16.2095C19.6895 16.3843 19.5469 16.5269 19.373 16.5269H11.5C11.3408 16.5269 11.1895 16.5894 11.0762 16.7017L8.08691 19.6802V17.1265C8.08691 16.7954 7.81836 16.5269 7.4873 16.5269H5.62695C5.45312 16.5269 5.31055 16.3843 5.31055 16.2095V6.6792C5.31055 6.50537 5.45312 6.36279 5.62695 6.36279H19.373C19.5469 6.36279 19.6895 6.50537 19.6895 6.6792V16.2095ZM10.3431 8.45264C9.46326 8.45264 8.75 9.16589 8.75 10.0458C8.75 10.9257 9.46326 11.639 10.3431 11.639C10.4775 11.639 10.6058 11.6173 10.7305 11.5861V11.6195C10.7305 12.1322 10.3135 12.5492 9.75586 12.5492C9.4248 12.5492 9.17871 12.8177 9.17871 13.1488C9.17871 13.4799 9.46973 13.7484 9.80078 13.7484C10.9746 13.7484 11.9297 12.7933 11.9297 11.6195V10.1176L11.9294 10.1165L11.9292 10.1155C11.9297 10.1049 11.9312 10.0946 11.9326 10.0843L11.9326 10.0843C11.9345 10.0716 11.9363 10.059 11.9363 10.0458C11.9363 9.16589 11.223 8.45264 10.3431 8.45264ZM13.0637 10.0458C13.0637 9.16589 13.7771 8.45264 14.657 8.45264C15.5369 8.45264 16.2501 9.16589 16.2501 10.0458C16.2501 10.0584 16.2484 10.0706 16.2466 10.0828C16.2452 10.0929 16.2437 10.103 16.2433 10.1134C16.2433 10.1149 16.2441 10.1161 16.2441 10.1176V11.6195C16.2441 12.7933 15.2891 13.7484 14.1152 13.7484C13.7842 13.7484 13.4922 13.4799 13.4922 13.1488C13.4922 12.8177 13.7383 12.5492 14.0693 12.5492C14.6279 12.5492 15.0449 12.1322 15.0449 11.6195V11.5858C14.9202 11.6173 14.7915 11.639 14.657 11.639C13.7771 11.639 13.0637 10.9257 13.0637 10.0458Z"/></svg>',
},
{
name: 'unordered-list',
action: EasyMDE.toggleUnorderedList,
title: i18n.global.t('input.editor.unorderedList'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M6.5281 3.7002H3.5281C3.1981 3.7002 2.9281 3.9702 2.9281 4.3002V7.3002C2.9281 7.6302 3.1981 7.9002 3.5281 7.9002H6.5281C6.8581 7.9002 7.1281 7.6302 7.1281 7.3002V4.3002C7.1281 3.9702 6.8581 3.7002 6.5281 3.7002ZM5.9281 6.7002H4.1281V4.9002H5.9281V6.7002ZM3.5281 9.90015H6.5281C6.8581 9.90015 7.1281 10.1701 7.1281 10.5001V13.5001C7.1281 13.8301 6.8581 14.1001 6.5281 14.1001H3.5281C3.1981 14.1001 2.9281 13.8301 2.9281 13.5001V10.5001C2.9281 10.1701 3.1981 9.90015 3.5281 9.90015ZM4.1281 12.9001H5.9281V11.1001H4.1281V12.9001ZM3.5281 16.1001H6.5281C6.8581 16.1001 7.1281 16.3701 7.1281 16.7001V19.7001C7.1281 20.0301 6.8581 20.3001 6.5281 20.3001H3.5281C3.1981 20.3001 2.9281 20.0301 2.9281 19.7001V16.7001C2.9281 16.3701 3.1981 16.1001 3.5281 16.1001ZM4.1281 19.1001H5.9281V17.3001H4.1281V19.1001ZM9.72817 6.4002H20.7282C21.0582 6.4002 21.3282 6.1302 21.3282 5.8002C21.3282 5.4702 21.0582 5.2002 20.7282 5.2002H9.72817C9.39817 5.2002 9.12817 5.4702 9.12817 5.8002C9.12817 6.1302 9.39817 6.4002 9.72817 6.4002ZM9.72817 11.4001H20.7282C21.0582 11.4001 21.3282 11.6701 21.3282 12.0001C21.3282 12.3301 21.0582 12.6001 20.7282 12.6001H9.72817C9.39817 12.6001 9.12817 12.3301 9.12817 12.0001C9.12817 11.6701 9.39817 11.4001 9.72817 11.4001ZM9.72817 17.6001H20.7282C21.0582 17.6001 21.3282 17.8701 21.3282 18.2001C21.3282 18.5301 21.0582 18.8001 20.7282 18.8001H9.72817C9.39817 18.8001 9.12817 18.5301 9.12817 18.2001C9.12817 17.8701 9.39817 17.6001 9.72817 17.6001Z"/></svg>',
},
{
name: 'ordered-list',
action: EasyMDE.toggleOrderedList,
title: i18n.global.t('input.editor.orderedList'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M4.19494 8.29994H5.99494C6.26494 8.29994 6.49494 8.07995 6.49494 7.79994C6.49494 7.51995 6.27494 7.29994 5.99494 7.29994H5.59494V3.79994C5.59494 3.62994 5.50494 3.46994 5.36494 3.37994C5.22494 3.28994 5.04494 3.26994 4.89494 3.33994L3.89494 3.76994C3.64494 3.87994 3.52494 4.17994 3.63494 4.42994C3.74494 4.67994 4.03494 4.79994 4.29494 4.68994L4.59494 4.55994V7.29994H4.19494C3.91494 7.29994 3.69494 7.51995 3.69494 7.79994C3.69494 8.07995 3.91494 8.29994 4.19494 8.29994ZM20.195 6.39995H9.19497C8.86497 6.39995 8.59497 6.12995 8.59497 5.79995C8.59497 5.46995 8.86497 5.19995 9.19497 5.19995H20.195C20.525 5.19995 20.795 5.46995 20.795 5.79995C20.795 6.12995 20.525 6.39995 20.195 6.39995ZM3.78486 14.36H6.37486C6.65486 14.36 6.87486 14.14 6.87486 13.86C6.87486 13.58 6.65486 13.36 6.37486 13.36H4.88486C5.00486 13.23 5.12486 13.09 5.23486 12.95C5.26626 12.9151 5.29645 12.8802 5.32626 12.8458L5.32629 12.8457C5.38192 12.7814 5.43627 12.7186 5.49486 12.66C5.73486 12.4 5.98486 12.12 6.17486 11.79C6.47486 11.25 6.41486 10.63 6.01486 10.17C5.57486 9.66 4.86486 9.5 4.24486 9.74C3.74486 9.95 3.39486 10.35 3.22486 10.91C3.14486 11.18 3.29486 11.46 3.56486 11.54C3.82486 11.61 4.10486 11.46 4.18486 11.2C4.29486 10.85 4.48486 10.73 4.62486 10.67C4.88486 10.57 5.13486 10.68 5.26486 10.82C5.38486 10.96 5.40486 11.12 5.30486 11.29C5.17595 11.5202 4.99618 11.7165 4.80458 11.9257L4.75486 11.98C4.67298 12.0801 4.58283 12.1801 4.49946 12.2727L4.49945 12.2727L4.47486 12.3C4.12486 12.72 3.76486 13.13 3.40486 13.53C3.27486 13.68 3.23486 13.9 3.32486 14.07C3.41486 14.24 3.58486 14.36 3.78486 14.36ZM3.68486 20.3699C4.04486 20.5899 4.46486 20.6999 4.87486 20.6999C5.13486 20.6999 5.38486 20.6499 5.61486 20.5499C6.31486 20.2799 6.73486 19.5599 6.60486 18.8799C6.53486 18.5499 6.35486 18.2899 6.12486 18.0899C6.32486 17.8999 6.45486 17.6499 6.50486 17.3799C6.57486 17.0099 6.49486 16.6299 6.27486 16.3099C5.85486 15.6899 5.07486 15.5199 4.10486 15.8299C3.83486 15.9199 3.69486 16.1999 3.77486 16.4599C3.86486 16.7299 4.14486 16.8699 4.40486 16.7899C4.70486 16.6999 5.24486 16.5799 5.45486 16.8899C5.51486 16.9899 5.54486 17.0999 5.52486 17.1999C5.51486 17.2699 5.47486 17.3599 5.36486 17.4299C5.26486 17.4999 5.12486 17.5399 4.95486 17.5799L4.77486 17.6299C4.54486 17.6999 4.40486 17.9099 4.41486 18.1499C4.42486 18.3899 4.61486 18.5799 4.84486 18.6099C5.20486 18.6599 5.58486 18.8299 5.63486 19.0799C5.67486 19.2999 5.46486 19.5499 5.25486 19.6299C4.94486 19.7599 4.52486 19.7099 4.21486 19.5199C3.97486 19.3699 3.67486 19.4399 3.52486 19.6799C3.37486 19.9199 3.44486 20.2299 3.68486 20.3699ZM20.195 18.7999H9.19497C8.86497 18.7999 8.59497 18.5299 8.59497 18.1999C8.59497 17.8699 8.86497 17.5999 9.19497 17.5999H20.195C20.525 17.5999 20.795 17.8699 20.795 18.1999C20.795 18.5299 20.525 18.7999 20.195 18.7999ZM9.19497 12.5999H20.195C20.525 12.5999 20.795 12.3299 20.795 11.9999C20.795 11.6699 20.525 11.3999 20.195 11.3999H9.19497C8.86497 11.3999 8.59497 11.6699 8.59497 11.9999C8.59497 12.3299 8.86497 12.5999 9.19497 12.5999Z"/></svg>',
},
'|',
{
name: 'clean-block',
action: EasyMDE.cleanBlock,
title: i18n.global.t('input.editor.cleanBlock'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M9.25989 6.18384H20.4513C20.7823 6.18384 21.0509 6.45239 21.0509 6.78345V17.9749C21.0509 18.3059 20.7823 18.5745 20.4513 18.5745H9.25989C9.0929 18.5745 8.93469 18.5061 8.82043 18.384L3.6095 12.7883C3.39563 12.5579 3.39563 12.2004 3.6095 11.97L8.82043 6.37427C8.93469 6.2522 9.0929 6.18384 9.25989 6.18384ZM9.52063 17.3752H19.8517V7.38306H9.52063L4.86926 12.3792L9.52063 17.3752ZM12.7755 15.0686C12.6222 15.0686 12.4679 15.01 12.3517 14.8928C12.1173 14.6584 12.1173 14.2786 12.3517 14.0452L14.0503 12.3469L12.3517 10.6487C12.1173 10.4153 12.1173 10.0354 12.3517 9.80103C12.5841 9.56665 12.965 9.56665 13.1993 9.80103L14.8981 11.4994L16.5968 9.80103C16.8312 9.56665 17.212 9.56665 17.4445 9.80103C17.6788 10.0354 17.6788 10.4153 17.4445 10.6487L15.7458 12.3469L17.4445 14.0452C17.6788 14.2786 17.6788 14.6584 17.4445 14.8928C17.3282 15.01 17.174 15.0686 17.0206 15.0686C16.8673 15.0686 16.714 15.01 16.5968 14.8928L14.8981 13.1945L13.1993 14.8928C13.0822 15.01 12.9288 15.0686 12.7755 15.0686Z"/></svg>',
},
{
name: 'link',
action: EasyMDE.drawLink,
title: i18n.global.t('input.editor.link'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M11.4399 15.3452C11.4999 15.3652 11.5699 15.3752 11.6299 15.3752C11.8799 15.3752 12.1199 15.2152 12.1999 14.9652C12.2999 14.6452 12.1299 14.3052 11.8199 14.2052C11.3499 14.0452 10.9299 13.7852 10.5699 13.4152C10.1999 13.0552 9.9399 12.6452 9.7799 12.1552C9.6599 11.8252 9.5999 11.4652 9.5999 11.0952C9.5999 10.2152 9.9399 9.38518 10.5699 8.75518L15.1599 4.15518C16.4499 2.87518 18.5399 2.87518 19.8299 4.15518C20.4499 4.78518 20.7899 5.61518 20.7899 6.49518C20.7899 7.37518 20.4499 8.20518 19.8299 8.82518L16.7399 11.9052C16.5099 12.1452 16.5099 12.5252 16.7399 12.7552C16.9799 12.9852 17.3599 12.9852 17.5899 12.7552L20.6799 9.67518C21.5299 8.83518 21.9999 7.69518 21.9999 6.49518C21.9999 5.29518 21.5299 4.16518 20.6899 3.30518C18.9299 1.55518 16.0799 1.55518 14.3199 3.30518L9.7299 7.90518C8.8699 8.75518 8.3999 9.88518 8.3999 11.0952C8.3999 11.6152 8.4899 12.1152 8.6499 12.5552C8.8599 13.1952 9.2399 13.7952 9.7199 14.2652C10.1999 14.7552 10.7999 15.1352 11.4399 15.3452ZM3.32 20.6851C4.2 21.5551 5.35 21.9951 6.5 21.9951C7.65 21.9951 8.81 21.5551 9.69 20.7051L14.28 16.1051C15.14 15.2551 15.61 14.1251 15.61 12.9151C15.61 12.4551 15.54 11.9951 15.4 11.5551C15.17 10.8651 14.8 10.2551 14.28 9.73509C13.76 9.21509 13.15 8.84509 12.46 8.61509C12.14 8.51509 11.8 8.68509 11.7 8.99509C11.6 9.30509 11.77 9.64509 12.1 9.75509C12.61 9.91509 13.06 10.1951 13.44 10.5751C13.82 10.9551 14.09 11.4051 14.26 11.9151C14.36 12.2351 14.41 12.5651 14.41 12.9051C14.41 13.7951 14.06 14.6251 13.43 15.2451L8.84 19.8451C7.55 21.1251 5.46 21.1251 4.17 19.8451C3.55 19.2151 3.21 18.3951 3.21 17.5051C3.21 16.6151 3.55 15.7851 4.17 15.1651L7.35 11.9851C7.58 11.7451 7.59 11.3651 7.35 11.1351C7.11 10.9051 6.73 10.9051 6.5 11.1351L3.32 14.3151C2.47 15.1551 2 16.2851 2 17.4951C2 18.7051 2.47 19.8351 3.32 20.6851Z"/></svg>',
},
{
name: 'image',
action: EasyMDE.drawImage,
title: i18n.global.t('input.editor.image'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M4 4C2.89543 4 2 4.89543 2 6V16V17.5152V18C2 19.1046 2.89543 20 4 20H20C21.0528 20 21.9156 19.1866 21.9942 18.1539L22 18.1632V18V16V6C22 4.89543 21.1046 4 20 4H4ZM3.2 17.7V16.5642L6.78192 13.7254C6.8616 13.6622 6.97597 13.6689 7.04776 13.7409L10.3126 17.0146C10.7026 17.4056 11.3357 17.4065 11.7268 17.0165C11.7606 16.9827 11.792 16.9465 11.8207 16.9083L16.736 10.352C16.8023 10.2636 16.9277 10.2457 17.016 10.312C17.0355 10.3265 17.0521 10.3445 17.0651 10.365L20.8 16.2669V17.7C20.8 18.3075 20.3075 18.8 19.7 18.8H4.3C3.69249 18.8 3.2 18.3075 3.2 17.7ZM17.3865 8.61836L20.8 14.08V6.3C20.8 5.69249 20.3075 5.2 19.7 5.2H4.3C3.69249 5.2 3.2 5.69249 3.2 6.3V15.04L6.65054 12.2796C6.84949 12.1204 7.13629 12.1363 7.31645 12.3164L10.8369 15.8369C10.915 15.915 11.0417 15.915 11.1198 15.8369C11.1265 15.8302 16.5625 8.58336 16.5625 8.58336C16.7282 8.36245 17.0416 8.31768 17.2625 8.48336C17.3118 8.52034 17.3538 8.56611 17.3865 8.61836ZM8 8.5C8 9.32843 7.32843 10 6.5 10C5.67157 10 5 9.32843 5 8.5C5 7.67157 5.67157 7 6.5 7C7.32843 7 8 7.67157 8 8.5Z"/></svg>',
},
{
name: 'table',
action: EasyMDE.drawTable,
title: i18n.global.t('input.editor.table'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M6.18524 3.08496H19.4152C20.6752 3.08496 21.7152 4.11496 21.7152 5.38496V18.615C21.7152 19.885 20.6852 20.915 19.4152 20.915H6.18524C4.91524 20.915 3.88525 19.885 3.88525 18.615V5.38496C3.88525 4.11496 4.91524 3.08496 6.18524 3.08496ZM19.4052 19.705C20.0152 19.705 20.5052 19.215 20.5052 18.605H20.5153V5.38496C20.5153 4.77496 20.0252 4.28496 19.4152 4.28496H6.18524C5.57524 4.28496 5.08521 4.77496 5.08521 5.38496V18.605C5.08521 19.215 5.57524 19.705 6.18524 19.705H19.4052ZM17.4453 9.15503H8.15527C7.82527 9.15503 7.5553 9.42503 7.5553 9.75503C7.5553 10.085 7.82527 10.355 8.15527 10.355H17.4453C17.7753 10.355 18.0453 10.085 18.0453 9.75503C18.0453 9.42503 17.7753 9.15503 17.4453 9.15503ZM17.4453 13.635H8.15527C7.82527 13.635 7.5553 13.905 7.5553 14.235C7.5553 14.565 7.82527 14.835 8.15527 14.835H17.4453C17.7753 14.835 18.0453 14.565 18.0453 14.235C18.0453 13.905 17.7753 13.635 17.4453 13.635Z"/></svg>',
},
{
name: 'horizontal-rule',
action: EasyMDE.drawHorizontalRule,
title: i18n.global.t('input.editor.horizontalRule'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M21 13H3C2.45 13 2 12.55 2 12C2 11.45 2.45 11 3 11H21C21.55 11 22 11.45 22 12C22 12.55 21.55 13 21 13Z"/></svg>',
},
'|',
{
name: 'side-by-side',
action: EasyMDE.toggleSideBySide,
title: i18n.global.t('input.editor.sideBySide'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.4787 14.58C18.3587 14.69 18.2987 14.85 18.2987 15C18.2987 15.15 18.3587 15.31 18.4787 15.42C18.7187 15.65 19.0987 15.65 19.3287 15.42L22.3287 12.42C22.5587 12.18 22.5587 11.8 22.3287 11.57L19.3287 8.56996C19.0887 8.33996 18.7087 8.33996 18.4787 8.56996C18.2487 8.80996 18.2487 9.18996 18.4787 9.41996L20.451 11.3999L14.4487 11.3999L14.4487 4.6C14.4487 4.27 14.1787 4 13.8487 4C13.5187 4 13.2487 4.27 13.2487 4.6L13.2487 19.4C13.2487 19.73 13.5187 20 13.8487 20C14.1787 20 14.4487 19.73 14.4487 19.4L14.4487 12.5999L20.4511 12.5999L18.4787 14.58ZM9.54878 19.4L9.54878 12.5999L3.5486 12.5999L5.52867 14.58C5.75867 14.81 5.75867 15.19 5.52867 15.43C5.29867 15.66 4.91867 15.66 4.67867 15.43L1.67867 12.43C1.63274 12.384 1.5956 12.3323 1.56725 12.2774C1.53058 12.2077 1.50724 12.1299 1.50068 12.0477C1.49934 12.0317 1.49867 12.0158 1.49867 12C1.49867 11.9841 1.49933 11.9682 1.50067 11.9522C1.51454 11.778 1.60365 11.6242 1.73526 11.5234L4.67867 8.57997C4.90867 8.34997 5.28867 8.34997 5.52867 8.57997C5.75867 8.80997 5.75867 9.18997 5.52867 9.42997L3.55107 11.3999L9.54878 11.3999L9.54878 4.6C9.54878 4.27 9.81878 4 10.1488 4C10.4788 4 10.7488 4.27 10.7488 4.6L10.7488 11.9999L10.7488 19.4C10.7488 19.73 10.4788 20 10.1488 20C9.81878 20 9.54878 19.73 9.54878 19.4Z"/></svg>',
},
{
name: 'guide',
action() {
window.open('https://www.markdownguide.org/basic-syntax/', '_blank')
},
title: i18n.global.t('input.editor.guide'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M19.4999 2.3999H6.4999C5.0699 2.3999 3.8999 3.5699 3.8999 4.9999V18.9999C3.8999 20.4299 5.0699 21.5999 6.4999 21.5999H19.4999C19.8299 21.5999 20.0999 21.3299 20.0999 20.9999V16.9999V2.9999C20.0999 2.6699 19.8299 2.3999 19.4999 2.3999ZM5.0999 4.9999V16.8118C5.50468 16.5513 5.98546 16.3999 6.4999 16.3999H18.8999V3.5999H6.4999C5.7299 3.5999 5.0999 4.2299 5.0999 4.9999ZM6.4999 17.5999H18.8999V20.3999H6.4999C5.7299 20.3999 5.0999 19.7699 5.0999 18.9999C5.0999 18.2299 5.7299 17.5999 6.4999 17.5999ZM8.4999 8.5999H15.4999C15.8299 8.5999 16.0999 8.3299 16.0999 7.9999C16.0999 7.6699 15.8299 7.3999 15.4999 7.3999H8.4999C8.1699 7.3999 7.8999 7.6699 7.8999 7.9999C7.8999 8.3299 8.1699 8.5999 8.4999 8.5999ZM15.4999 11.3999H8.4999C8.1699 11.3999 7.8999 11.6699 7.8999 11.9999C7.8999 12.3299 8.1699 12.5999 8.4999 12.5999H15.4999C15.8299 12.5999 16.0999 12.3299 16.0999 11.9999C16.0999 11.6699 15.8299 11.3999 15.4999 11.3999Z"/></svg>',
},
],
}
}

View File

@ -0,0 +1,134 @@
import EasyMDE from 'easymde'
import {i18n} from '@/i18n'
export function createEasyMDEConfig({ placeholder, uploadImage, imageUploadFunction }) {
return {
autoDownloadFontAwesome: false,
spellChecker: false,
placeholder,
uploadImage,
imageUploadFunction,
minHeight: '150px',
toolbar: [
{
name: 'heading-1',
action: EasyMDE.toggleHeading1,
title: i18n.global.t('input.editor.heading1'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-2',
action: EasyMDE.toggleHeading2,
title: i18n.global.t('input.editor.heading2'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-3',
action: EasyMDE.toggleHeading3,
title: i18n.global.t('input.editor.heading3'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-smaller',
action: EasyMDE.toggleHeadingSmaller,
title: i18n.global.t('input.editor.headingSmaller'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
{
name: 'heading-bigger',
action: EasyMDE.toggleHeadingBigger,
title: i18n.global.t('input.editor.headingBigger'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
},
'|',
{
name: 'bold',
action: EasyMDE.toggleBold,
title: i18n.global.t('input.editor.bold'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M3.5 3H6.5H15.25C18.15 3 20.5 5.36 20.5 8.25C20.5 9.8 19.81 11.19 18.73 12.15C20.37 13.04 21.5 14.76 21.5 16.75C21.5 19.64 19.15 22 16.25 22H6.5H3.5C2.95 22 2.5 21.55 2.5 21C2.5 20.45 2.95 20 3.5 20H5.5V5H3.5C2.95 5 2.5 4.55 2.5 4C2.5 3.45 2.95 3 3.5 3ZM7.5 20H16.25C18.04 20 19.5 18.54 19.5 16.75C19.5 14.96 18.04 13.5 16.25 13.5H7.5V20ZM7.5 11.5H15.25C17.04 11.5 18.5 10.04 18.5 8.25C18.5 6.46 17.04 5 15.25 5H7.5V11.5Z"/></svg>',
},
{
name: 'italic',
action: EasyMDE.toggleItalic,
title: i18n.global.t('input.editor.italic'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M14.0967 4.2H17.0001C17.3301 4.2 17.6001 3.93 17.6001 3.6C17.6001 3.27 17.3301 3 17.0001 3H10.2001C9.8701 3 9.6001 3.27 9.6001 3.6C9.6001 3.93 9.8701 4.2 10.2001 4.2H12.8748L9.90335 19.8H6.9999C6.6699 19.8 6.3999 20.07 6.3999 20.4C6.3999 20.73 6.6699 21 6.9999 21H13.7999C14.1299 21 14.3999 20.73 14.3999 20.4C14.3999 20.07 14.1299 19.8 13.7999 19.8H11.1253L14.0967 4.2Z"/></svg>',
},
{
name: 'strikethrough',
action: EasyMDE.toggleStrikethrough,
title: i18n.global.t('input.editor.strikethrough'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.25 7.17005C18.25 7.50005 17.98 7.77005 17.65 7.77005C17.32 7.77005 17.05 7.50005 17.05 7.17005V5.96005C15.97 5.12005 14.17 4.56005 12.79 4.31005C11.1 4.00005 9.51 4.30005 8.41 5.12005C7.2 6.03005 6.67 7.67005 7.19 8.88005C7.56 9.73005 8.37 10.31 8.98 10.64C9.57215 10.9644 10.1961 11.2013 10.8465 11.3999H20.4C20.73 11.3999 21 11.6699 21 11.9999C21 12.3299 20.73 12.5999 20.4 12.5999H15.3012C16.6583 13.0929 17.5255 13.7765 17.95 14.69C18.73 16.36 17.74 18.33 16.36 19.41C15.05 20.4401 13.35 21 11.54 21H11.16C9.78 20.9401 8.34 20.5301 6.95 19.85V20.3601C6.95 20.6901 6.68 20.96 6.35 20.96C6.02 20.96 5.75 20.6901 5.75 20.3601V17.36C5.75 17.03 6.02 16.76 6.35 16.76C6.68 16.76 6.95 17.03 6.95 17.36V18.5C8.35 19.2801 9.81 19.74 11.21 19.8C12.86 19.89 14.46 19.39 15.62 18.48C16.6 17.71 17.37 16.3 16.86 15.21C16.55 14.54 15.8 14.0201 14.58 13.63C13.9711 13.4331 13.3222 13.2762 12.6906 13.1235C12.6168 13.1056 12.5432 13.0878 12.47 13.07C12.4313 13.0607 12.3925 13.0514 12.3537 13.0421C11.7861 12.9055 11.2108 12.767 10.6413 12.5999H3.6C3.27 12.5999 3 12.3299 3 11.9999C3 11.6699 3.27 11.3999 3.6 11.3999H7.90288C7.04984 10.8343 6.42752 10.1363 6.09 9.36005C5.34 7.63005 6.03 5.40005 7.69 4.16005C9.05 3.15005 10.99 2.77005 13 3.13005C13.64 3.25005 15.53 3.66005 17.05 4.53005V4.17005C17.05 3.84005 17.32 3.57005 17.65 3.57005C17.98 3.57005 18.25 3.84005 18.25 4.17005V7.17005Z"/></svg>',
},
{
name: 'code',
action: EasyMDE.toggleCodeBlock,
title: i18n.global.t('input.editor.code'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M8.57 20.9601C8.64 20.9901 8.71 21.0001 8.78 21.0001C9.02 21.0001 9.24 20.8501 9.34 20.6101L15.79 3.81005C15.9 3.50005 15.75 3.15005 15.44 3.03005C15.14 2.92005 14.79 3.07005 14.67 3.38005L8.22 20.1801C8.11 20.4901 8.26 20.8401 8.57 20.9601ZM7.00007 18.0001C6.85007 18.0001 6.69007 17.9401 6.58007 17.8201L1.18007 12.4201C0.950068 12.1901 0.950068 11.8101 1.18007 11.5701L6.58007 6.17006C6.81007 5.94006 7.19007 5.94006 7.43007 6.17006C7.66007 6.40006 7.66007 6.78006 7.43007 7.02006L2.45007 12.0001L7.43007 16.9801C7.66007 17.2101 7.66007 17.5901 7.43007 17.8301C7.31007 17.9401 7.15007 18.0001 7.00007 18.0001ZM17 18.0001C16.85 18.0001 16.69 17.9401 16.58 17.8201C16.35 17.5901 16.35 17.2101 16.58 16.9701L21.55 12.0001L16.57 7.02006C16.34 6.79006 16.34 6.41006 16.57 6.17006C16.81 5.94006 17.19 5.94006 17.42 6.17006L22.82 11.5701C23.05 11.8001 23.05 12.1801 22.82 12.4201L17.42 17.8201C17.31 17.9401 17.15 18.0001 17 18.0001Z"/></svg>',
},
{
name: 'quote',
action: EasyMDE.toggleBlockquote,
title: i18n.global.t('input.editor.quote'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M19.373 5.16357H5.62695C4.79102 5.16357 4.11133 5.84326 4.11133 6.6792V16.2095C4.11133 17.0464 4.79102 17.7261 5.62695 17.7261H6.8877V21.1245C6.8877 21.3667 7.0332 21.5854 7.25684 21.6782C7.33203 21.7095 7.41016 21.7241 7.4873 21.7241C7.64258 21.7241 7.7959 21.6636 7.91113 21.5493L11.748 17.7261H19.373C20.209 17.7261 20.8887 17.0464 20.8887 16.2095V6.6792C20.8887 5.84326 20.209 5.16357 19.373 5.16357ZM19.6895 16.2095C19.6895 16.3843 19.5469 16.5269 19.373 16.5269H11.5C11.3408 16.5269 11.1895 16.5894 11.0762 16.7017L8.08691 19.6802V17.1265C8.08691 16.7954 7.81836 16.5269 7.4873 16.5269H5.62695C5.45312 16.5269 5.31055 16.3843 5.31055 16.2095V6.6792C5.31055 6.50537 5.45312 6.36279 5.62695 6.36279H19.373C19.5469 6.36279 19.6895 6.50537 19.6895 6.6792V16.2095ZM10.3431 8.45264C9.46326 8.45264 8.75 9.16589 8.75 10.0458C8.75 10.9257 9.46326 11.639 10.3431 11.639C10.4775 11.639 10.6058 11.6173 10.7305 11.5861V11.6195C10.7305 12.1322 10.3135 12.5492 9.75586 12.5492C9.4248 12.5492 9.17871 12.8177 9.17871 13.1488C9.17871 13.4799 9.46973 13.7484 9.80078 13.7484C10.9746 13.7484 11.9297 12.7933 11.9297 11.6195V10.1176L11.9294 10.1165L11.9292 10.1155C11.9297 10.1049 11.9312 10.0946 11.9326 10.0843L11.9326 10.0843C11.9345 10.0716 11.9363 10.059 11.9363 10.0458C11.9363 9.16589 11.223 8.45264 10.3431 8.45264ZM13.0637 10.0458C13.0637 9.16589 13.7771 8.45264 14.657 8.45264C15.5369 8.45264 16.2501 9.16589 16.2501 10.0458C16.2501 10.0584 16.2484 10.0706 16.2466 10.0828C16.2452 10.0929 16.2437 10.103 16.2433 10.1134C16.2433 10.1149 16.2441 10.1161 16.2441 10.1176V11.6195C16.2441 12.7933 15.2891 13.7484 14.1152 13.7484C13.7842 13.7484 13.4922 13.4799 13.4922 13.1488C13.4922 12.8177 13.7383 12.5492 14.0693 12.5492C14.6279 12.5492 15.0449 12.1322 15.0449 11.6195V11.5858C14.9202 11.6173 14.7915 11.639 14.657 11.639C13.7771 11.639 13.0637 10.9257 13.0637 10.0458Z"/></svg>',
},
{
name: 'unordered-list',
action: EasyMDE.toggleUnorderedList,
title: i18n.global.t('input.editor.unorderedList'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M6.5281 3.7002H3.5281C3.1981 3.7002 2.9281 3.9702 2.9281 4.3002V7.3002C2.9281 7.6302 3.1981 7.9002 3.5281 7.9002H6.5281C6.8581 7.9002 7.1281 7.6302 7.1281 7.3002V4.3002C7.1281 3.9702 6.8581 3.7002 6.5281 3.7002ZM5.9281 6.7002H4.1281V4.9002H5.9281V6.7002ZM3.5281 9.90015H6.5281C6.8581 9.90015 7.1281 10.1701 7.1281 10.5001V13.5001C7.1281 13.8301 6.8581 14.1001 6.5281 14.1001H3.5281C3.1981 14.1001 2.9281 13.8301 2.9281 13.5001V10.5001C2.9281 10.1701 3.1981 9.90015 3.5281 9.90015ZM4.1281 12.9001H5.9281V11.1001H4.1281V12.9001ZM3.5281 16.1001H6.5281C6.8581 16.1001 7.1281 16.3701 7.1281 16.7001V19.7001C7.1281 20.0301 6.8581 20.3001 6.5281 20.3001H3.5281C3.1981 20.3001 2.9281 20.0301 2.9281 19.7001V16.7001C2.9281 16.3701 3.1981 16.1001 3.5281 16.1001ZM4.1281 19.1001H5.9281V17.3001H4.1281V19.1001ZM9.72817 6.4002H20.7282C21.0582 6.4002 21.3282 6.1302 21.3282 5.8002C21.3282 5.4702 21.0582 5.2002 20.7282 5.2002H9.72817C9.39817 5.2002 9.12817 5.4702 9.12817 5.8002C9.12817 6.1302 9.39817 6.4002 9.72817 6.4002ZM9.72817 11.4001H20.7282C21.0582 11.4001 21.3282 11.6701 21.3282 12.0001C21.3282 12.3301 21.0582 12.6001 20.7282 12.6001H9.72817C9.39817 12.6001 9.12817 12.3301 9.12817 12.0001C9.12817 11.6701 9.39817 11.4001 9.72817 11.4001ZM9.72817 17.6001H20.7282C21.0582 17.6001 21.3282 17.8701 21.3282 18.2001C21.3282 18.5301 21.0582 18.8001 20.7282 18.8001H9.72817C9.39817 18.8001 9.12817 18.5301 9.12817 18.2001C9.12817 17.8701 9.39817 17.6001 9.72817 17.6001Z"/></svg>',
},
{
name: 'ordered-list',
action: EasyMDE.toggleOrderedList,
title: i18n.global.t('input.editor.orderedList'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M4.19494 8.29994H5.99494C6.26494 8.29994 6.49494 8.07995 6.49494 7.79994C6.49494 7.51995 6.27494 7.29994 5.99494 7.29994H5.59494V3.79994C5.59494 3.62994 5.50494 3.46994 5.36494 3.37994C5.22494 3.28994 5.04494 3.26994 4.89494 3.33994L3.89494 3.76994C3.64494 3.87994 3.52494 4.17994 3.63494 4.42994C3.74494 4.67994 4.03494 4.79994 4.29494 4.68994L4.59494 4.55994V7.29994H4.19494C3.91494 7.29994 3.69494 7.51995 3.69494 7.79994C3.69494 8.07995 3.91494 8.29994 4.19494 8.29994ZM20.195 6.39995H9.19497C8.86497 6.39995 8.59497 6.12995 8.59497 5.79995C8.59497 5.46995 8.86497 5.19995 9.19497 5.19995H20.195C20.525 5.19995 20.795 5.46995 20.795 5.79995C20.795 6.12995 20.525 6.39995 20.195 6.39995ZM3.78486 14.36H6.37486C6.65486 14.36 6.87486 14.14 6.87486 13.86C6.87486 13.58 6.65486 13.36 6.37486 13.36H4.88486C5.00486 13.23 5.12486 13.09 5.23486 12.95C5.26626 12.9151 5.29645 12.8802 5.32626 12.8458L5.32629 12.8457C5.38192 12.7814 5.43627 12.7186 5.49486 12.66C5.73486 12.4 5.98486 12.12 6.17486 11.79C6.47486 11.25 6.41486 10.63 6.01486 10.17C5.57486 9.66 4.86486 9.5 4.24486 9.74C3.74486 9.95 3.39486 10.35 3.22486 10.91C3.14486 11.18 3.29486 11.46 3.56486 11.54C3.82486 11.61 4.10486 11.46 4.18486 11.2C4.29486 10.85 4.48486 10.73 4.62486 10.67C4.88486 10.57 5.13486 10.68 5.26486 10.82C5.38486 10.96 5.40486 11.12 5.30486 11.29C5.17595 11.5202 4.99618 11.7165 4.80458 11.9257L4.75486 11.98C4.67298 12.0801 4.58283 12.1801 4.49946 12.2727L4.49945 12.2727L4.47486 12.3C4.12486 12.72 3.76486 13.13 3.40486 13.53C3.27486 13.68 3.23486 13.9 3.32486 14.07C3.41486 14.24 3.58486 14.36 3.78486 14.36ZM3.68486 20.3699C4.04486 20.5899 4.46486 20.6999 4.87486 20.6999C5.13486 20.6999 5.38486 20.6499 5.61486 20.5499C6.31486 20.2799 6.73486 19.5599 6.60486 18.8799C6.53486 18.5499 6.35486 18.2899 6.12486 18.0899C6.32486 17.8999 6.45486 17.6499 6.50486 17.3799C6.57486 17.0099 6.49486 16.6299 6.27486 16.3099C5.85486 15.6899 5.07486 15.5199 4.10486 15.8299C3.83486 15.9199 3.69486 16.1999 3.77486 16.4599C3.86486 16.7299 4.14486 16.8699 4.40486 16.7899C4.70486 16.6999 5.24486 16.5799 5.45486 16.8899C5.51486 16.9899 5.54486 17.0999 5.52486 17.1999C5.51486 17.2699 5.47486 17.3599 5.36486 17.4299C5.26486 17.4999 5.12486 17.5399 4.95486 17.5799L4.77486 17.6299C4.54486 17.6999 4.40486 17.9099 4.41486 18.1499C4.42486 18.3899 4.61486 18.5799 4.84486 18.6099C5.20486 18.6599 5.58486 18.8299 5.63486 19.0799C5.67486 19.2999 5.46486 19.5499 5.25486 19.6299C4.94486 19.7599 4.52486 19.7099 4.21486 19.5199C3.97486 19.3699 3.67486 19.4399 3.52486 19.6799C3.37486 19.9199 3.44486 20.2299 3.68486 20.3699ZM20.195 18.7999H9.19497C8.86497 18.7999 8.59497 18.5299 8.59497 18.1999C8.59497 17.8699 8.86497 17.5999 9.19497 17.5999H20.195C20.525 17.5999 20.795 17.8699 20.795 18.1999C20.795 18.5299 20.525 18.7999 20.195 18.7999ZM9.19497 12.5999H20.195C20.525 12.5999 20.795 12.3299 20.795 11.9999C20.795 11.6699 20.525 11.3999 20.195 11.3999H9.19497C8.86497 11.3999 8.59497 11.6699 8.59497 11.9999C8.59497 12.3299 8.86497 12.5999 9.19497 12.5999Z"/></svg>',
},
'|',
{
name: 'clean-block',
action: EasyMDE.cleanBlock,
title: i18n.global.t('input.editor.cleanBlock'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.25989 6.18384H20.4513C20.7823 6.18384 21.0509 6.45239 21.0509 6.78345V17.9749C21.0509 18.3059 20.7823 18.5745 20.4513 18.5745H9.25989C9.0929 18.5745 8.93469 18.5061 8.82043 18.384L3.6095 12.7883C3.39563 12.5579 3.39563 12.2004 3.6095 11.97L8.82043 6.37427C8.93469 6.2522 9.0929 6.18384 9.25989 6.18384ZM9.52063 17.3752H19.8517V7.38306H9.52063L4.86926 12.3792L9.52063 17.3752ZM12.7755 15.0686C12.6222 15.0686 12.4679 15.01 12.3517 14.8928C12.1173 14.6584 12.1173 14.2786 12.3517 14.0452L14.0503 12.3469L12.3517 10.6487C12.1173 10.4153 12.1173 10.0354 12.3517 9.80103C12.5841 9.56665 12.965 9.56665 13.1993 9.80103L14.8981 11.4994L16.5968 9.80103C16.8312 9.56665 17.212 9.56665 17.4445 9.80103C17.6788 10.0354 17.6788 10.4153 17.4445 10.6487L15.7458 12.3469L17.4445 14.0452C17.6788 14.2786 17.6788 14.6584 17.4445 14.8928C17.3282 15.01 17.174 15.0686 17.0206 15.0686C16.8673 15.0686 16.714 15.01 16.5968 14.8928L14.8981 13.1945L13.1993 14.8928C13.0822 15.01 12.9288 15.0686 12.7755 15.0686Z"/></svg>',
},
{
name: 'link',
action: EasyMDE.drawLink,
title: i18n.global.t('input.editor.link'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M11.4399 15.3452C11.4999 15.3652 11.5699 15.3752 11.6299 15.3752C11.8799 15.3752 12.1199 15.2152 12.1999 14.9652C12.2999 14.6452 12.1299 14.3052 11.8199 14.2052C11.3499 14.0452 10.9299 13.7852 10.5699 13.4152C10.1999 13.0552 9.9399 12.6452 9.7799 12.1552C9.6599 11.8252 9.5999 11.4652 9.5999 11.0952C9.5999 10.2152 9.9399 9.38518 10.5699 8.75518L15.1599 4.15518C16.4499 2.87518 18.5399 2.87518 19.8299 4.15518C20.4499 4.78518 20.7899 5.61518 20.7899 6.49518C20.7899 7.37518 20.4499 8.20518 19.8299 8.82518L16.7399 11.9052C16.5099 12.1452 16.5099 12.5252 16.7399 12.7552C16.9799 12.9852 17.3599 12.9852 17.5899 12.7552L20.6799 9.67518C21.5299 8.83518 21.9999 7.69518 21.9999 6.49518C21.9999 5.29518 21.5299 4.16518 20.6899 3.30518C18.9299 1.55518 16.0799 1.55518 14.3199 3.30518L9.7299 7.90518C8.8699 8.75518 8.3999 9.88518 8.3999 11.0952C8.3999 11.6152 8.4899 12.1152 8.6499 12.5552C8.8599 13.1952 9.2399 13.7952 9.7199 14.2652C10.1999 14.7552 10.7999 15.1352 11.4399 15.3452ZM3.32 20.6851C4.2 21.5551 5.35 21.9951 6.5 21.9951C7.65 21.9951 8.81 21.5551 9.69 20.7051L14.28 16.1051C15.14 15.2551 15.61 14.1251 15.61 12.9151C15.61 12.4551 15.54 11.9951 15.4 11.5551C15.17 10.8651 14.8 10.2551 14.28 9.73509C13.76 9.21509 13.15 8.84509 12.46 8.61509C12.14 8.51509 11.8 8.68509 11.7 8.99509C11.6 9.30509 11.77 9.64509 12.1 9.75509C12.61 9.91509 13.06 10.1951 13.44 10.5751C13.82 10.9551 14.09 11.4051 14.26 11.9151C14.36 12.2351 14.41 12.5651 14.41 12.9051C14.41 13.7951 14.06 14.6251 13.43 15.2451L8.84 19.8451C7.55 21.1251 5.46 21.1251 4.17 19.8451C3.55 19.2151 3.21 18.3951 3.21 17.5051C3.21 16.6151 3.55 15.7851 4.17 15.1651L7.35 11.9851C7.58 11.7451 7.59 11.3651 7.35 11.1351C7.11 10.9051 6.73 10.9051 6.5 11.1351L3.32 14.3151C2.47 15.1551 2 16.2851 2 17.4951C2 18.7051 2.47 19.8351 3.32 20.6851Z"/></svg>',
},
{
name: 'image',
action: EasyMDE.drawImage,
title: i18n.global.t('input.editor.image'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M4 4C2.89543 4 2 4.89543 2 6V16V17.5152V18C2 19.1046 2.89543 20 4 20H20C21.0528 20 21.9156 19.1866 21.9942 18.1539L22 18.1632V18V16V6C22 4.89543 21.1046 4 20 4H4ZM3.2 17.7V16.5642L6.78192 13.7254C6.8616 13.6622 6.97597 13.6689 7.04776 13.7409L10.3126 17.0146C10.7026 17.4056 11.3357 17.4065 11.7268 17.0165C11.7606 16.9827 11.792 16.9465 11.8207 16.9083L16.736 10.352C16.8023 10.2636 16.9277 10.2457 17.016 10.312C17.0355 10.3265 17.0521 10.3445 17.0651 10.365L20.8 16.2669V17.7C20.8 18.3075 20.3075 18.8 19.7 18.8H4.3C3.69249 18.8 3.2 18.3075 3.2 17.7ZM17.3865 8.61836L20.8 14.08V6.3C20.8 5.69249 20.3075 5.2 19.7 5.2H4.3C3.69249 5.2 3.2 5.69249 3.2 6.3V15.04L6.65054 12.2796C6.84949 12.1204 7.13629 12.1363 7.31645 12.3164L10.8369 15.8369C10.915 15.915 11.0417 15.915 11.1198 15.8369C11.1265 15.8302 16.5625 8.58336 16.5625 8.58336C16.7282 8.36245 17.0416 8.31768 17.2625 8.48336C17.3118 8.52034 17.3538 8.56611 17.3865 8.61836ZM8 8.5C8 9.32843 7.32843 10 6.5 10C5.67157 10 5 9.32843 5 8.5C5 7.67157 5.67157 7 6.5 7C7.32843 7 8 7.67157 8 8.5Z"/></svg>',
},
{
name: 'table',
action: EasyMDE.drawTable,
title: i18n.global.t('input.editor.table'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M6.18524 3.08496H19.4152C20.6752 3.08496 21.7152 4.11496 21.7152 5.38496V18.615C21.7152 19.885 20.6852 20.915 19.4152 20.915H6.18524C4.91524 20.915 3.88525 19.885 3.88525 18.615V5.38496C3.88525 4.11496 4.91524 3.08496 6.18524 3.08496ZM19.4052 19.705C20.0152 19.705 20.5052 19.215 20.5052 18.605H20.5153V5.38496C20.5153 4.77496 20.0252 4.28496 19.4152 4.28496H6.18524C5.57524 4.28496 5.08521 4.77496 5.08521 5.38496V18.605C5.08521 19.215 5.57524 19.705 6.18524 19.705H19.4052ZM17.4453 9.15503H8.15527C7.82527 9.15503 7.5553 9.42503 7.5553 9.75503C7.5553 10.085 7.82527 10.355 8.15527 10.355H17.4453C17.7753 10.355 18.0453 10.085 18.0453 9.75503C18.0453 9.42503 17.7753 9.15503 17.4453 9.15503ZM17.4453 13.635H8.15527C7.82527 13.635 7.5553 13.905 7.5553 14.235C7.5553 14.565 7.82527 14.835 8.15527 14.835H17.4453C17.7753 14.835 18.0453 14.565 18.0453 14.235C18.0453 13.905 17.7753 13.635 17.4453 13.635Z"/></svg>',
},
{
name: 'horizontal-rule',
action: EasyMDE.drawHorizontalRule,
title: i18n.global.t('input.editor.horizontalRule'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M21 13H3C2.45 13 2 12.55 2 12C2 11.45 2.45 11 3 11H21C21.55 11 22 11.45 22 12C22 12.55 21.55 13 21 13Z"/></svg>',
},
'|',
{
name: 'side-by-side',
action: EasyMDE.toggleSideBySide,
title: i18n.global.t('input.editor.sideBySide'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.4787 14.58C18.3587 14.69 18.2987 14.85 18.2987 15C18.2987 15.15 18.3587 15.31 18.4787 15.42C18.7187 15.65 19.0987 15.65 19.3287 15.42L22.3287 12.42C22.5587 12.18 22.5587 11.8 22.3287 11.57L19.3287 8.56996C19.0887 8.33996 18.7087 8.33996 18.4787 8.56996C18.2487 8.80996 18.2487 9.18996 18.4787 9.41996L20.451 11.3999L14.4487 11.3999L14.4487 4.6C14.4487 4.27 14.1787 4 13.8487 4C13.5187 4 13.2487 4.27 13.2487 4.6L13.2487 19.4C13.2487 19.73 13.5187 20 13.8487 20C14.1787 20 14.4487 19.73 14.4487 19.4L14.4487 12.5999L20.4511 12.5999L18.4787 14.58ZM9.54878 19.4L9.54878 12.5999L3.5486 12.5999L5.52867 14.58C5.75867 14.81 5.75867 15.19 5.52867 15.43C5.29867 15.66 4.91867 15.66 4.67867 15.43L1.67867 12.43C1.63274 12.384 1.5956 12.3323 1.56725 12.2774C1.53058 12.2077 1.50724 12.1299 1.50068 12.0477C1.49934 12.0317 1.49867 12.0158 1.49867 12C1.49867 11.9841 1.49933 11.9682 1.50067 11.9522C1.51454 11.778 1.60365 11.6242 1.73526 11.5234L4.67867 8.57997C4.90867 8.34997 5.28867 8.34997 5.52867 8.57997C5.75867 8.80997 5.75867 9.18997 5.52867 9.42997L3.55107 11.3999L9.54878 11.3999L9.54878 4.6C9.54878 4.27 9.81878 4 10.1488 4C10.4788 4 10.7488 4.27 10.7488 4.6L10.7488 11.9999L10.7488 19.4C10.7488 19.73 10.4788 20 10.1488 20C9.81878 20 9.54878 19.73 9.54878 19.4Z"/></svg>',
},
{
name: 'guide',
action() {
window.open('https://www.markdownguide.org/basic-syntax/', '_blank')
},
title: i18n.global.t('input.editor.guide'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M19.4999 2.3999H6.4999C5.0699 2.3999 3.8999 3.5699 3.8999 4.9999V18.9999C3.8999 20.4299 5.0699 21.5999 6.4999 21.5999H19.4999C19.8299 21.5999 20.0999 21.3299 20.0999 20.9999V16.9999V2.9999C20.0999 2.6699 19.8299 2.3999 19.4999 2.3999ZM5.0999 4.9999V16.8118C5.50468 16.5513 5.98546 16.3999 6.4999 16.3999H18.8999V3.5999H6.4999C5.7299 3.5999 5.0999 4.2299 5.0999 4.9999ZM6.4999 17.5999H18.8999V20.3999H6.4999C5.7299 20.3999 5.0999 19.7699 5.0999 18.9999C5.0999 18.2299 5.7299 17.5999 6.4999 17.5999ZM8.4999 8.5999H15.4999C15.8299 8.5999 16.0999 8.3299 16.0999 7.9999C16.0999 7.6699 15.8299 7.3999 15.4999 7.3999H8.4999C8.1699 7.3999 7.8999 7.6699 7.8999 7.9999C7.8999 8.3299 8.1699 8.5999 8.4999 8.5999ZM15.4999 11.3999H8.4999C8.1699 11.3999 7.8999 11.6699 7.8999 11.9999C7.8999 12.3299 8.1699 12.5999 8.4999 12.5999H15.4999C15.8299 12.5999 16.0999 12.3299 16.0999 11.9999C16.0999 11.6699 15.8299 11.3999 15.4999 11.3999Z"/></svg>',
},
],
}
}

View File

@ -2,7 +2,7 @@
<div :class="{'is-disabled': disabled}" class="fancycheckbox">
<input
:checked="checked"
:disabled="disabled || null"
:disabled="disabled || undefined"
:id="checkBoxId"
@change="(event) => updateData(event.target.checked)"
type="checkbox"/>
@ -19,10 +19,12 @@
</div>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import {createRandomID} from '@/helpers/randomId'
export default {
export default defineComponent({
name: 'fancycheckbox',
data() {
return {
@ -57,7 +59,7 @@ export default {
this.$emit('change', checked)
},
},
}
})
</script>

View File

@ -82,11 +82,12 @@
</div>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import {i18n} from '@/i18n'
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
export default {
export default defineComponent({
name: 'multiselect',
data() {
return {
@ -366,7 +367,7 @@ export default {
this.$refs.searchInput.focus()
},
},
}
})
</script>
<style lang="scss" scoped>
@ -450,7 +451,6 @@ export default {
button {
background: transparent;
display: block;
text-align: left;
box-shadow: none;
border-radius: 0;
@ -460,6 +460,7 @@ export default {
padding: .5rem;
border: none;
cursor: pointer;
color: var(--grey-800);
display: flex;
justify-content: space-between;

View File

@ -0,0 +1,81 @@
<template>
<div class="password-field">
<input
class="input"
id="password"
name="password"
:placeholder="$t('user.auth.passwordPlaceholder')"
required
:type="passwordFieldType"
autocomplete="current-password"
@keyup.enter="e => $emit('submit', e)"
:tabindex="props.tabindex"
@focusout="validate"
@input="handleInput"
/>
<BaseButton
@click="togglePasswordFieldType"
class="password-field-type-toggle"
:aria-label="passwordFieldType === 'password' ? $t('user.auth.showPassword') : $t('user.auth.hidePassword')"
v-tooltip="passwordFieldType === 'password' ? $t('user.auth.showPassword') : $t('user.auth.hidePassword')">
<icon :icon="passwordFieldType === 'password' ? 'eye' : 'eye-slash'"/>
</BaseButton>
</div>
<p class="help is-danger" v-if="!isValid">
{{ $t('user.auth.passwordRequired') }}
</p>
</template>
<script lang="ts" setup>
import {ref, watch} from 'vue'
import {useDebounceFn} from '@vueuse/core'
import BaseButton from '@/components/base/BaseButton.vue'
const props = defineProps({
tabindex: String,
modelValue: String,
// This prop is a workaround to trigger validation from the outside when the user never had focus in the input.
validateInitially: Boolean,
})
const emit = defineEmits(['submit', 'update:modelValue'])
const passwordFieldType = ref('password')
const password = ref('')
const isValid = ref(!props.validateInitially)
watch(
props.validateInitially,
() => props.validateInitially && validate(),
{immediate: true},
)
const validate = useDebounceFn(() => {
isValid.value = password.value !== ''
}, 100)
function togglePasswordFieldType() {
passwordFieldType.value = passwordFieldType.value === 'password'
? 'text'
: 'password'
}
function handleInput(e: Event) {
password.value = (e.target as HTMLInputElement)?.value
emit('update:modelValue', password.value)
}
</script>
<style scoped>
.password-field {
position: relative;
}
.password-field-type-toggle {
position: absolute;
color: var(--grey-400);
top: 50%;
right: 1rem;
transform: translateY(-50%);
}
</style>

View File

@ -1,3 +1,150 @@
<template>
<div class="vue-easymde" ref="easymdeRef">
<textarea
class="vue-simplemde-textarea"
:name="name"
:value="modelValue"
@input="handleInput($event.target.value)"
/>
</div>
</template>
<script setup lang="ts">
import {ref, watch, onMounted, onDeactivated, onBeforeUnmount, nextTick, shallowReactive} from 'vue'
import type { ShallowReactive } from 'vue'
import EasyMDE from 'easymde'
import {marked} from 'marked'
const props = defineProps({
modelValue: String,
name: String,
previewClass: String,
autoinit: {
type: Boolean,
default: true,
},
highlight: {
type: Boolean,
default: false,
},
sanitize: {
type: Boolean,
default: false,
},
configs: {
type: Object,
default: () => ({}),
},
previewRender: {
type: Function,
},
})
const emit = defineEmits(['update:modelValue', 'blur', 'initialized'])
const isValueUpdateFromInner = ref(false)
let easymde: ShallowReactive<EasyMDE> | undefined
onMounted(() => {
if (props.autoinit) initialize()
})
onDeactivated(() => {
if (!easymde) return
const isFullScreen = easymde.codemirror.getOption('fullScreen')
if (isFullScreen) easymde.toggleFullScreen()
})
onBeforeUnmount(() => {
if (easymde) {
easymde.toTextArea()
easymde.cleanup()
easymde = undefined
}
})
const easymdeRef = ref<HTMLElement | null>(null)
function initialize() {
const configs = Object.assign({
element: easymdeRef.value?.firstElementChild,
initialValue: props.modelValue,
previewRender: props.previewRender,
renderingConfig: {},
}, props.configs)
// Synchronize the values of value and initialValue
if (configs.initialValue) {
emit('update:modelValue', configs.initialValue)
}
// Determine whether to enable code highlighting
if (props.highlight) {
configs.renderingConfig.codeSyntaxHighlighting = true
}
// Set whether to render the input html
marked.setOptions({ sanitize: props.sanitize })
// Instantiated editor
easymde = shallowReactive(new EasyMDE(configs))
// Add a custom previewClass
const className = props.previewClass || ''
addPreviewClass(className)
// Binding event
bindingEvents()
nextTick(() => emit('initialized', easymde))
}
function addPreviewClass(className: string) {
const wrapper = easymde.codemirror.getWrapperElement()
const preview = document.createElement('div')
wrapper.nextSibling.className += ` ${className}`
preview.className = `editor-preview ${className}`
wrapper.appendChild(preview)
}
function bindingEvents() {
easymde.codemirror.on('change', handleCodemirrorInput)
easymde.codemirror.on('blur', handleCodemirrorBlur)
}
function handleCodemirrorInput(instance, changeObj) {
if (changeObj.origin === 'setValue') {
return
}
const val = easymde.value()
handleInput(val)
}
function handleCodemirrorBlur() {
const val = easymde.value()
isValueUpdateFromInner.value = true
emit('blur', val)
}
function handleInput(val) {
isValueUpdateFromInner.value = true
emit('update:modelValue', val)
}
watch(
() => props.modelValue,
(val) => {
if (isValueUpdateFromInner.value) {
isValueUpdateFromInner.value = false
} else {
easymde.value(val)
}
},
)
</script>
<style lang="scss">
.EasyMDEContainer {
display: block;
}
@ -58,10 +205,6 @@
.editor-toolbar {
position: relative;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
padding: 9px 10px;
border-top: 1px solid #bbb;
@ -89,11 +232,6 @@
.editor-toolbar.fullscreen::before {
width: 20px;
height: 50px;
background: -moz-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 1)), color-stop(100%, rgba(255, 255, 255, 0)));
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
background: -o-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
background: -ms-linear-gradient(left, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
background: linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
position: fixed;
top: 0;
@ -105,11 +243,6 @@
.editor-toolbar.fullscreen::after {
width: 20px;
height: 50px;
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 1)));
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);
background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);
position: fixed;
top: 0;
@ -371,4 +504,16 @@ span[data-img-src]::after{
padding-top: var(--height);
width: var(--width);
background-repeat: no-repeat;
}
}
</style>
<style lang="scss" scoped>
.vue-easymde .markdown-body {
padding: 0.5em
}
.vue-easymde .editor-preview-active,
.vue-easymde .editor-preview-active-side {
display: block;
}
</style>

View File

@ -1,157 +0,0 @@
<template>
<div class="vue-easymde">
<textarea
class="vue-simplemde-textarea"
:name="name"
:value="modelValue"
@input="handleInput($event.target.value)"
/>
</div>
</template>
<script>
import EasyMDE from 'easymde'
import {marked} from 'marked'
export default {
name: 'vue-easymde',
props: {
modelValue: String,
name: String,
previewClass: String,
autoinit: {
type: Boolean,
default: true,
},
highlight: {
type: Boolean,
default: false,
},
sanitize: {
type: Boolean,
default: false,
},
configs: {
type: Object,
default() {
return {}
},
},
previewRender: {
type: Function,
},
},
emits: ['update:modelValue', 'blur', 'initialized'],
data() {
return {
isValueUpdateFromInner: false,
easymde: null,
}
},
mounted() {
if (this.autoinit) this.initialize()
},
deactivated() {
const editor = this.easymde
if (!editor) return
const isFullScreen = editor.codemirror.getOption('fullScreen')
if (isFullScreen) editor.toggleFullScreen()
},
beforeUnmount() {
if (this.easymde) {
this.easymde.toTextArea()
this.easymde.cleanup()
this.easymde = null
}
},
methods: {
initialize() {
const configs = Object.assign({
element: this.$el.firstElementChild,
initialValue: this.modelValue,
previewRender: this.previewRender,
renderingConfig: {},
}, this.configs)
// Synchronize the values of value and initialValue
if (configs.initialValue) {
this.$emit('update:modelValue', configs.initialValue)
}
// Determine whether to enable code highlighting
if (this.highlight) {
configs.renderingConfig.codeSyntaxHighlighting = true
}
// Set whether to render the input html
marked.setOptions({ sanitize: this.sanitize })
// Instantiated editor
this.easymde = new EasyMDE(configs)
// Add a custom previewClass
const className = this.previewClass || ''
this.addPreviewClass(className)
// Binding event
this.bindingEvents()
this.$nextTick(() => {
this.$emit('initialized', this.easymde)
})
},
addPreviewClass(className) {
const wrapper = this.easymde.codemirror.getWrapperElement()
const preview = document.createElement('div')
wrapper.nextSibling.className += ` ${className}`
preview.className = `editor-preview ${className}`
wrapper.appendChild(preview)
},
bindingEvents() {
this.easymde.codemirror.on('change', this.handleCodemirrorInput)
this.easymde.codemirror.on('blur', this.handleCodemirrorBlur)
},
handleCodemirrorInput(instance, changeObj) {
if (changeObj.origin === 'setValue') {
return
}
const val = this.easymde.value()
this.handleInput(val)
},
handleCodemirrorBlur() {
const val = this.easymde.value()
this.isValueUpdateFromInner = true
this.$emit('blur', val)
},
handleInput(val) {
this.isValueUpdateFromInner = true
this.$emit('update:modelValue', val)
},
},
watch: {
modelValue(val) {
if (this.isValueUpdateFromInner) {
this.isValueUpdateFromInner = false
} else {
this.easymde.value(val)
}
},
},
}
</script>
<style lang="scss" scoped>
.vue-easymde .markdown-body {
padding: 0.5em
}
.vue-easymde .editor-preview-active, .vue-easymde .editor-preview-active-side {
display: block;
}
</style>

View File

@ -2,21 +2,22 @@
<dropdown>
<template v-if="isSavedFilter">
<dropdown-item
:to="{ name: `${listRoutePrefix}.edit`, params: { listId: list.id } }"
:to="{ name: 'filter.settings.edit', params: { listId: list.id } }"
icon="pen"
>
{{ $t('menu.edit') }}
</dropdown-item>
<dropdown-item
:to="{ name: `${listRoutePrefix}.delete`, params: { listId: list.id } }"
:to="{ name: 'filter.settings.delete', params: { listId: list.id } }"
icon="trash-alt"
>
{{ $t('misc.delete') }}
</dropdown-item>
</template>
<template v-else-if="list.isArchived">
<dropdown-item
:to="{ name: `${listRoutePrefix}.archive`, params: { listId: list.id } }"
:to="{ name: 'list.settings.archive', params: { listId: list.id } }"
icon="archive"
>
{{ $t('menu.unarchive') }}
@ -24,32 +25,32 @@
</template>
<template v-else>
<dropdown-item
:to="{ name: `${listRoutePrefix}.edit`, params: { listId: list.id } }"
:to="{ name: 'list.settings.edit', params: { listId: list.id } }"
icon="pen"
>
{{ $t('menu.edit') }}
</dropdown-item>
<dropdown-item
:to="{ name: `${listRoutePrefix}.background`, params: { listId: list.id } }"
v-if="backgroundsEnabled"
:to="{ name: 'list.settings.background', params: { listId: list.id } }"
icon="image"
>
{{ $t('menu.setBackground') }}
</dropdown-item>
<dropdown-item
:to="{ name: `${listRoutePrefix}.share`, params: { listId: list.id } }"
:to="{ name: 'list.settings.share', params: { listId: list.id } }"
icon="share-alt"
>
{{ $t('menu.share') }}
</dropdown-item>
<dropdown-item
:to="{ name: `${listRoutePrefix}.duplicate`, params: { listId: list.id } }"
:to="{ name: 'list.settings.duplicate', params: { listId: list.id } }"
icon="paste"
>
{{ $t('menu.duplicate') }}
</dropdown-item>
<dropdown-item
:to="{ name: `${listRoutePrefix}.archive`, params: { listId: list.id } }"
:to="{ name: 'list.settings.archive', params: { listId: list.id } }"
icon="archive"
>
{{ $t('menu.archive') }}
@ -59,11 +60,11 @@
:is-button="false"
entity="list"
:entity-id="list.id"
:subscription="subscription"
:subscription="list.subscription"
@change="sub => subscription = sub"
/>
<dropdown-item
:to="{ name: `${listRoutePrefix}.delete`, params: { listId: list.id } }"
:to="{ name: 'list.settings.delete', params: { listId: list.id } }"
icon="trash-alt"
class="has-text-danger"
>
@ -73,56 +74,30 @@
</dropdown>
</template>
<script>
<script setup lang="ts">
import {ref, computed, watchEffect} from 'vue'
import {useStore} from 'vuex'
import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
import Dropdown from '@/components/misc/dropdown.vue'
import DropdownItem from '@/components/misc/dropdown-item.vue'
import TaskSubscription from '@/components/misc/subscription.vue'
import ListModel from '@/models/list'
import SubscriptionModel from '@/models/subscription'
export default {
name: 'list-settings-dropdown',
data() {
return {
subscription: null,
}
const props = defineProps({
list: {
type: ListModel,
required: true,
},
components: {
TaskSubscription,
DropdownItem,
Dropdown,
},
props: {
list: {
required: true,
},
},
mounted() {
this.subscription = this.list.subscription
},
computed: {
backgroundsEnabled() {
return this.$store.state.config.enabledBackgroundProviders !== null && this.$store.state.config.enabledBackgroundProviders.length > 0
},
listRoutePrefix() {
let name = 'list'
})
const subscription = ref<SubscriptionModel | null>(null)
watchEffect(() => {
subscription.value = props.list.subscription ?? null
})
if (this.$route.name !== null && this.$route.name.startsWith('list.')) {
// HACK: we should implement a better routing for the modals
const settingsRoutes = ['edit', 'delete', 'archive', 'background', 'share', 'duplicate']
const suffix = settingsRoutes.find((route) => this.$route.name.endsWith(`.settings.${route}`))
name = this.$route.name.replace(`.settings.${suffix}`,'')
}
if (this.isSavedFilter) {
name = name.replace('list.', 'filter.')
}
return `${name}.settings`
},
isSavedFilter() {
return getSavedFilterIdFromListId(this.list.id) > 0
},
},
}
const store = useStore()
const backgroundsEnabled = computed(() => store.state.config.enabledBackgroundProviders?.length > 0)
const isSavedFilter = computed(() => getSavedFilterIdFromListId(props.list.id) > 0)
</script>

View File

@ -1,41 +1,45 @@
<template>
<x-button
v-if="hasFilters"
type="secondary"
variant="secondary"
@click="clearFilters"
>
{{ $t('filters.clear') }}
</x-button>
<popup>
<template #trigger="{toggle}">
<x-button
@click.prevent.stop="toggle()"
type="secondary"
icon="filter"
>
{{ $t('filters.title') }}
</x-button>
</template>
<template #content="{isOpen}">
<filters
v-model="value"
ref="filters"
class="filter-popup"
:class="{'is-open': isOpen}"
/>
</template>
</popup>
<x-button
@click="() => modalOpen = true"
variant="secondary"
icon="filter"
>
{{ $t('filters.title') }}
</x-button>
<modal
@close="() => modalOpen = false"
:enabled="modalOpen"
transition-name="fade"
:overflow="true"
variant="hint-modal"
>
<filters
:has-title="true"
v-model="value"
ref="filters"
class="filter-popup"
:class="{'is-open': isOpen}"
/>
</modal>
</template>
<script>
import Filters from '@/components/list/partials/filters'
import {getDefaultParams} from '@/components/tasks/mixins/taskList'
import Popup from '@/components/misc/popup'
<script lang="ts">
import {defineComponent, ref} from 'vue'
export default {
import Filters from '@/components/list/partials/filters.vue'
import {getDefaultParams} from '@/composables/taskList'
export default defineComponent({
name: 'filter-popup',
components: {
Popup,
Filters,
},
props: {
@ -79,12 +83,19 @@ export default {
immediate: true,
},
},
setup() {
const modalOpen = ref(false)
return {
modalOpen,
}
},
methods: {
clearFilters() {
this.value = {...getDefaultParams()}
},
},
}
})
</script>
<style scoped lang="scss">

View File

@ -1,5 +1,5 @@
<template>
<card class="filters has-overflow">
<card class="filters has-overflow" :title="hasTitle ? $t('filters.title') : ''">
<div class="field">
<fancycheckbox v-model="params.filter_include_nulls">
{{ $t('filters.attributes.includeNulls') }}
@ -36,7 +36,7 @@
<label class="label">{{ $t('task.attributes.priority') }}</label>
<div class="control single-value-control">
<priority-select
:disabled="!filters.usePriority || null"
:disabled="!filters.usePriority || undefined"
v-model.number="filters.priority"
@change="setPriority"
/>
@ -54,7 +54,7 @@
<percent-done-select
v-model.number="filters.percentDone"
@change="setPercentDoneFilter"
:disabled="!filters.usePercentDone || null"
:disabled="!filters.usePercentDone || undefined"
/>
<fancycheckbox
v-model="filters.usePercentDone"
@ -67,49 +67,49 @@
<div class="field">
<label class="label">{{ $t('task.attributes.dueDate') }}</label>
<div class="control">
<flat-pickr
:config="flatPickerConfig"
@on-close="setDueDateFilter"
class="input"
:placeholder="$t('filters.attributes.dueDateRange')"
v-model="filters.dueDate"
/>
<datepicker-with-range @dateChanged="values => setDateFilter('due_date', values)">
<template #trigger="{toggle, buttonText}">
<x-button @click.prevent.stop="toggle()" variant="secondary" :shadow="false" class="mb-2">
{{ buttonText }}
</x-button>
</template>
</datepicker-with-range>
</div>
</div>
<div class="field">
<label class="label">{{ $t('task.attributes.startDate') }}</label>
<div class="control">
<flat-pickr
:config="flatPickerConfig"
@on-close="setStartDateFilter"
class="input"
:placeholder="$t('filters.attributes.startDateRange')"
v-model="filters.startDate"
/>
<datepicker-with-range @dateChanged="values => setDateFilter('start_date', values)">
<template #trigger="{toggle, buttonText}">
<x-button @click.prevent.stop="toggle()" variant="secondary" :shadow="false" class="mb-2">
{{ buttonText }}
</x-button>
</template>
</datepicker-with-range>
</div>
</div>
<div class="field">
<label class="label">{{ $t('task.attributes.endDate') }}</label>
<div class="control">
<flat-pickr
:config="flatPickerConfig"
@on-close="setEndDateFilter"
class="input"
:placeholder="$t('filters.attributes.endDateRange')"
v-model="filters.endDate"
/>
<datepicker-with-range @dateChanged="values => setDateFilter('end_date', values)">
<template #trigger="{toggle, buttonText}">
<x-button @click.prevent.stop="toggle()" variant="secondary" :shadow="false" class="mb-2">
{{ buttonText }}
</x-button>
</template>
</datepicker-with-range>
</div>
</div>
<div class="field">
<label class="label">{{ $t('task.attributes.reminders') }}</label>
<div class="control">
<flat-pickr
:config="flatPickerConfig"
@on-close="setReminderFilter"
class="input"
:placeholder="$t('filters.attributes.reminderRange')"
v-model="filters.reminders"
/>
<datepicker-with-range @dateChanged="values => setDateFilter('reminders', values)">
<template #trigger="{toggle, buttonText}">
<x-button @click.prevent.stop="toggle()" variant="secondary" :shadow="false" class="mb-2">
{{ buttonText }}
</x-button>
</template>
</datepicker-with-range>
</div>
</div>
@ -174,16 +174,17 @@
</card>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import DatepickerWithRange from '@/components/date/datepickerWithRange'
import Fancycheckbox from '../../input/fancycheckbox'
import flatPickr from 'vue-flatpickr-component'
import 'flatpickr/dist/flatpickr.css'
import {includesById} from '@/helpers/utils'
import {formatISO} from 'date-fns'
import PrioritySelect from '@/components/tasks/partials/prioritySelect.vue'
import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect.vue'
import Multiselect from '@/components/input/multiselect.vue'
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
import UserService from '@/services/user'
import ListService from '@/services/list'
@ -191,7 +192,7 @@ import NamespaceService from '@/services/namespace'
import EditLabels from '@/components/tasks/partials/editLabels.vue'
import {objectToSnakeCase} from '@/helpers/case'
import {getDefaultParams} from '@/components/tasks/mixins/taskList'
import {getDefaultParams} from '@/composables/taskList'
// FIXME: merge with DEFAULT_PARAMS in taskList.js
const DEFAULT_PARAMS = {
@ -222,15 +223,15 @@ const DEFAULT_FILTERS = {
namespace: '',
}
export const ALPHABETICAL_SORT = 'title'
export const ALPHABETICAL_SORT = 'title'
export default {
export default defineComponent({
name: 'filters',
components: {
DatepickerWithRange,
EditLabels,
PrioritySelect,
Fancycheckbox,
flatPickr,
PercentDoneSelect,
Multiselect,
},
@ -262,6 +263,10 @@ export default {
modelValue: {
required: true,
},
hasTitle: {
type: Boolean,
default: false,
},
},
emits: ['update:modelValue', 'change'],
watch: {
@ -281,7 +286,7 @@ export default {
return this.params?.sort_by?.find(sortBy => sortBy === ALPHABETICAL_SORT) !== undefined
},
set(sortAlphabetically) {
this.params.sort_by = sortAlphabetically
this.params.sort_by = sortAlphabetically
? [ALPHABETICAL_SORT]
: getDefaultParams().sort_by
@ -291,24 +296,13 @@ export default {
foundLabels() {
return this.$store.getters['labels/filterLabelsByQuery'](this.labels, this.query)
},
flatPickerConfig() {
return {
altFormat: this.$t('date.altFormatLong'),
altInput: true,
dateFormat: 'Y-m-d H:i',
enableTime: true,
time_24hr: true,
mode: 'range',
locale: {
firstDayOfWeek: this.$store.state.auth.settings.weekStart,
},
}
},
},
methods: {
change() {
this.$emit('update:modelValue', this.params)
this.$emit('change', this.params)
const params = {...this.params}
params.filter_value = params.filter_value.map(v => v instanceof Date ? v.toISOString() : v)
this.$emit('update:modelValue', params)
this.$emit('change', params)
},
prepareFilters() {
this.prepareDone()
@ -343,19 +337,12 @@ export default {
}
}
},
setDateFilter(filterName, variableName = null) {
if (variableName === null) {
variableName = filterName
}
// Only filter if we have a start and end due date
if (this.filters[variableName] !== '') {
setDateFilter(filterName, {dateFrom, dateTo}) {
dateFrom = parseDateOrString(dateFrom, null)
dateTo = parseDateOrString(dateTo, null)
const parts = this.filters[variableName].split(' to ')
if (parts.length < 2) {
return
}
// Only filter if we have a date
if (dateFrom !== null && dateTo !== null) {
// Check if we already have values in params and only update them if we do
let foundStart = false
@ -363,23 +350,23 @@ export default {
this.params.filter_by.forEach((f, i) => {
if (f === filterName && this.params.filter_comparator[i] === 'greater_equals') {
foundStart = true
this.params.filter_value[i] = formatISO(new Date(parts[0]))
this.params.filter_value[i] = dateFrom
}
if (f === filterName && this.params.filter_comparator[i] === 'less_equals') {
foundEnd = true
this.params.filter_value[i] = formatISO(new Date(parts[1]))
this.params.filter_value[i] = dateTo
}
})
if (!foundStart) {
this.params.filter_by.push(filterName)
this.params.filter_comparator.push('greater_equals')
this.params.filter_value.push(formatISO(new Date(parts[0])))
this.params.filter_value.push(dateFrom)
}
if (!foundEnd) {
this.params.filter_by.push(filterName)
this.params.filter_comparator.push('less_equals')
this.params.filter_value.push(formatISO(new Date(parts[1])))
this.params.filter_value.push(dateTo)
}
this.change()
return
@ -513,24 +500,12 @@ export default {
this.params.filter_concat = 'or'
}
},
setDueDateFilter() {
this.setDateFilter('due_date', 'dueDate')
},
setPriority() {
this.setSingleValueFilter('priority', 'priority', 'usePriority')
},
setStartDateFilter() {
this.setDateFilter('start_date', 'startDate')
},
setEndDateFilter() {
this.setDateFilter('end_date', 'endDate')
},
setPercentDoneFilter() {
this.setSingleValueFilter('percent_done', 'percentDone', 'usePercentDone')
},
setReminderFilter() {
this.setDateFilter('reminders')
},
clear(kind) {
this[`found${kind}`] = []
},
@ -606,10 +581,10 @@ export default {
this.setSingleValueFilter('labels', 'labels', '', 'in')
},
},
}
})
</script>
<style lang="scss">
<style lang="scss" scoped>
.single-value-control {
display: flex;
align-items: center;
@ -618,4 +593,8 @@ export default {
margin-left: .5rem;
}
}
:deep(.datepicker-with-range-container .popup) {
right: 0;
}
</style>

View File

@ -2,43 +2,54 @@
<router-link
:class="{
'has-light-text': !colorIsDark(list.hexColor),
'has-background': background !== null
'has-background': blurHashUrl !== ''
}"
:style="{
'background-color': list.hexColor,
'background-image': background !== null ? `url(${background})` : false,
'background-image': blurHashUrl !== null ? `url(${blurHashUrl})` : false,
}"
:to="{ name: 'list.index', params: { listId: list.id} }"
class="list-card"
v-if="list !== null && (showArchived ? true : !list.isArchived)"
>
<div class="is-archived-container">
<div
class="list-background background-fade-in"
:class="{'is-visible': background}"
:style="{'background-image': background !== null ? `url(${background})` : false}"></div>
<div class="list-content">
<div class="is-archived-container">
<span class="is-archived" v-if="list.isArchived">
{{ $t('namespace.archived') }}
</span>
<span
:class="{'is-favorite': list.isFavorite, 'is-archived': list.isArchived}"
@click.stop="toggleFavoriteList(list)"
class="favorite">
<icon :icon="list.isFavorite ? 'star' : ['far', 'star']" />
<span
:class="{'is-favorite': list.isFavorite, 'is-archived': list.isArchived}"
@click.stop="toggleFavoriteList(list)"
class="favorite">
<icon :icon="list.isFavorite ? 'star' : ['far', 'star']"/>
</span>
</div>
<div class="title">{{ list.title }}</div>
</div>
<div class="title">{{ list.title }}</div>
</router-link>
</template>
<script lang="ts" setup>
import {ref, watch} from 'vue'
import {PropType, ref, watch} from 'vue'
import {useStore} from 'vuex'
import ListService from '@/services/list'
import {getBlobFromBlurHash} from '@/helpers/getBlobFromBlurHash'
const background = ref(null)
import {colorIsDark} from '@/helpers/color/colorIsDark'
import ListModel from '@/models/list'
const background = ref<string | null>(null)
const backgroundLoading = ref(false)
const blurHashUrl = ref('')
const props = defineProps({
list: {
type: Object,
type: Object as PropType<ListModel>,
required: true,
},
showArchived: {
@ -47,13 +58,18 @@ const props = defineProps({
},
})
watch(props.list, loadBackground, { immediate: true })
watch(props.list, loadBackground, {immediate: true})
async function loadBackground() {
if (props.list === null || !props.list.backgroundInformation || backgroundLoading.value) {
return
}
const blurHash = await getBlobFromBlurHash(props.list.backgroundBlurHash)
if (blurHash) {
blurHashUrl.value = window.URL.createObjectURL(blurHash)
}
backgroundLoading.value = true
const listService = new ListService()
@ -66,7 +82,7 @@ async function loadBackground() {
const store = useStore()
function toggleFavoriteList(list) {
function toggleFavoriteList(list: ListModel) {
// The favorites pseudo list is always favorite
// Archived lists cannot be marked favorite
if (list.id === -1 || list.isArchived) {
@ -78,129 +94,145 @@ function toggleFavoriteList(list) {
<style lang="scss" scoped>
.list-card {
cursor: pointer;
width: calc((100% - #{($lists-per-row - 1) * 1rem}) / #{$lists-per-row});
height: $list-height;
background: var(--white);
margin: 0 $list-spacing $list-spacing 0;
padding: 1rem;
border-radius: $radius;
box-shadow: var(--shadow-sm);
transition: box-shadow $transition;
cursor: pointer;
width: calc((100% - #{($lists-per-row - 1) * 1rem}) / #{$lists-per-row});
height: $list-height;
background: var(--white);
margin: 0 $list-spacing $list-spacing 0;
border-radius: $radius;
box-shadow: var(--shadow-sm);
transition: box-shadow $transition;
position: relative;
overflow: hidden;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
&.has-light-text .title {
color: var(--grey-100);
}
&:hover {
box-shadow: var(--shadow-md);
}
&.has-background, .list-background {
background-size: cover;
background-repeat: no-repeat;
background-position: center;
}
&:active,
&:focus,
&:focus:not(:active) {
box-shadow: var(--shadow-xs) !important;
}
&.has-background .list-content .title {
text-shadow: 0 0 10px var(--black), 1px 1px 5px var(--grey-700), -1px -1px 5px var(--grey-700);
color: var(--white);
}
@media screen and (min-width: $widescreen) {
&:nth-child(#{$lists-per-row}n) {
margin-right: 0;
}
}
.list-background {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
@media screen and (max-width: $widescreen) and (min-width: $tablet) {
$lists-per-row: 3;
& {
width: calc((100% - #{($lists-per-row - 1) * 1rem}) / #{$lists-per-row});
}
&:hover {
box-shadow: var(--shadow-md);
}
&:nth-child(#{$lists-per-row}n) {
margin-right: 0;
}
}
&:active,
&:focus,
&:focus:not(:active) {
box-shadow: var(--shadow-xs) !important;
}
@media screen and (max-width: $tablet) {
$lists-per-row: 2;
& {
width: calc((100% - #{($lists-per-row - 1) * 1rem}) / #{$lists-per-row});
}
@media screen and (min-width: $widescreen) {
&:nth-child(#{$lists-per-row}n) {
margin-right: 0;
}
}
&:nth-child(#{$lists-per-row}n) {
margin-right: 0;
}
}
@media screen and (max-width: $widescreen) and (min-width: $tablet) {
$lists-per-row: 3;
& {
width: calc((100% - #{($lists-per-row - 1) * 1rem}) / #{$lists-per-row});
}
@media screen and (max-width: $mobile) {
$lists-per-row: 1;
& {
width: 100%;
margin-right: 0;
}
}
&:nth-child(#{$lists-per-row}n) {
margin-right: 0;
}
}
.is-archived-container {
width: 100%;
text-align: right;
@media screen and (max-width: $tablet) {
$lists-per-row: 2;
& {
width: calc((100% - #{($lists-per-row - 1) * 1rem}) / #{$lists-per-row});
}
.is-archived {
font-size: .75rem;
float: left;
}
}
&:nth-child(#{$lists-per-row}n) {
margin-right: 0;
}
}
.title {
align-self: flex-end;
font-family: $vikunja-font;
font-weight: 400;
font-size: 1.5rem;
color: var(--text);
width: 100%;
margin-bottom: 0;
max-height: calc(100% - 2rem); // 1rem padding, 1rem height of the "is archived" badge
overflow: hidden;
text-overflow: ellipsis;
@media screen and (max-width: $mobile) {
$lists-per-row: 1;
& {
width: 100%;
margin-right: 0;
}
}
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
.list-content {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
padding: 1rem;
position: absolute;
height: 100%;
width: 100%;
&.has-light-text .title {
color: var(--light);
}
.is-archived-container {
width: 100%;
text-align: right;
&.has-background {
background-size: cover;
background-repeat: no-repeat;
background-position: center;
.is-archived {
font-size: .75rem;
float: left;
}
}
.title {
text-shadow: 0 0 10px var(--black), 1px 1px 5px var(--grey-700), -1px -1px 5px var(--grey-700);
color: var(--white);
}
}
.title {
align-self: flex-end;
font-family: $vikunja-font;
font-weight: 400;
font-size: 1.5rem;
color: var(--text);
width: 100%;
margin-bottom: 0;
max-height: calc(100% - 2rem); // 1rem padding, 1rem height of the "is archived" badge
overflow: hidden;
text-overflow: ellipsis;
.favorite {
transition: opacity $transition, color $transition;
opacity: 0;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
&:hover {
color: var(--warning);
}
.favorite {
transition: opacity $transition, color $transition;
opacity: 0;
&.is-archived {
display: none;
}
&:hover {
color: var(--warning);
}
&.is-favorite {
display: inline-block;
opacity: 1;
color: var(--warning);
}
}
&.is-archived {
display: none;
}
&:hover .favorite {
opacity: 1;
}
&.is-favorite {
display: inline-block;
opacity: 1;
color: var(--warning);
}
}
&:hover .favorite {
opacity: 1;
}
}
}
</style>

View File

@ -16,7 +16,7 @@
/>
</div>
<div class="control">
<x-button @click="setApiUrl" :disabled="apiUrl === '' || null">
<x-button @click="setApiUrl" :disabled="apiUrl === '' || undefined">
{{ $t('apiConfig.change') }}
</x-button>
</div>
@ -39,79 +39,68 @@
</div>
</template>
<script>
import Message from '@/components/misc/message'
<script setup lang="ts">
import {ref, computed, watch} from 'vue'
import {useI18n} from 'vue-i18n'
import {parseURL} from 'ufo'
import {checkAndSetApiUrl} from '@/helpers/checkAndSetApiUrl'
import {success} from '@/message'
export default {
name: 'apiConfig',
components: {
Message,
import Message from '@/components/misc/message.vue'
const props = defineProps({
configureOpen: {
type: Boolean,
required: false,
default: false,
},
data() {
return {
configureApi: false,
apiUrl: window.API_URL,
errorMsg: '',
successMsg: '',
})
const emit = defineEmits(['foundApi'])
const apiUrl = ref(window.API_URL)
const configureApi = ref(apiUrl.value === '')
// Because we're only using this to parse the hostname, it should be fine to just prefix with http://
// regardless of whether the url is actually reachable under http.
const apiDomain = computed(() => parseURL(apiUrl.value, 'http://').host || parseURL(window.location.href).host)
watch(() => props.configureOpen, (value) => {
configureApi.value = value
}, {immediate: true})
const {t} = useI18n({useScope: 'global'})
const errorMsg = ref('')
const successMsg = ref('')
async function setApiUrl() {
if (apiUrl.value === '') {
// Don't try to check and set an empty url
errorMsg.value = t('apiConfig.urlRequired')
return
}
try {
const url = await checkAndSetApiUrl(apiUrl.value)
if (url === '') {
// If the config setter function could not figure out a url
throw new Error('URL cannot be empty.')
}
},
emits: ['foundApi'],
created() {
if (this.apiUrl === '') {
this.configureApi = true
}
},
computed: {
apiDomain() {
return parseURL(this.apiUrl).host || parseURL(window.location.href).host
},
},
props: {
configureOpen: {
type: Boolean,
required: false,
default: false,
},
},
watch: {
configureOpen: {
handler(value) {
this.configureApi = value
},
immediate: true,
},
},
methods: {
async setApiUrl() {
if (this.apiUrl === '') {
// Don't try to check and set an empty url
this.errorMsg = this.$t('apiConfig.urlRequired')
return
}
try {
const url = await checkAndSetApiUrl(this.apiUrl)
if (url === '') {
// If the config setter function could not figure out a url
throw new Error('URL cannot be empty.')
}
// Set it + save it to local storage to save us the hoops
this.errorMsg = ''
this.$message.success({message: this.$t('apiConfig.success', {domain: this.apiDomain})})
this.configureApi = false
this.apiUrl = url
this.$emit('foundApi', this.apiUrl)
} catch (e) {
// Still not found, url is still invalid
this.successMsg = ''
this.errorMsg = this.$t('apiConfig.error', {domain: this.apiDomain})
}
},
},
// Set it + save it to local storage to save us the hoops
errorMsg.value = ''
apiUrl.value = url
success({message: t('apiConfig.success', {domain: apiDomain.value})})
configureApi.value = false
emit('foundApi', apiUrl.value)
} catch (e) {
// Still not found, url is still invalid
successMsg.value = ''
errorMsg.value = t('apiConfig.error', {domain: apiDomain.value})
}
}
</script>

View File

@ -14,76 +14,69 @@
</div>
<footer class="modal-card-foot is-flex is-justify-content-flex-end">
<x-button
v-if="tertiary !== ''"
:shadow="false"
type="tertary"
@click.prevent.stop="$emit('tertary')"
v-if="tertary !== ''"
variant="tertiary"
@click.prevent.stop="$emit('tertiary')"
>
{{ tertary }}
{{ tertiary }}
</x-button>
<x-button
type="secondary"
variant="secondary"
@click.prevent.stop="$router.back()"
>
{{ $t('misc.cancel') }}
</x-button>
<x-button
type="primary"
@click.prevent.stop="primary"
variant="primary"
@click.prevent.stop="primary()"
:icon="primaryIcon"
:disabled="primaryDisabled"
v-if="primaryLabel !== ''"
>
{{ primaryLabel }}
{{ primaryLabel || $t('misc.create') }}
</x-button>
</footer>
</card>
</modal>
</template>
<script>
import { i18n } from '@/i18n'
<script lang="ts">
</script>
<script setup lang="ts">
defineProps({
title: {
type: String,
default: '',
},
primaryLabel: {
type: String,
},
primaryIcon: {
type: String,
default: 'plus',
},
primaryDisabled: {
type: Boolean,
default: false,
},
tertiary: {
type: String,
default: '',
},
wide: {
type: Boolean,
default: false,
},
loading: {
type: Boolean,
default: false,
},
})
export default {
name: 'create-edit',
props: {
title: {
type: String,
default: '',
},
primaryLabel: {
type: String,
default() {
return i18n.global.t('misc.create')
},
},
primaryIcon: {
type: String,
default: 'plus',
},
primaryDisabled: {
type: Boolean,
default: false,
},
tertary: {
type: String,
default: '',
},
wide: {
type: Boolean,
default: false,
},
loading: {
type: Boolean,
default: false,
},
},
emits: ['create', 'primary', 'tertary'],
methods: {
primary() {
this.$emit('create')
this.$emit('primary')
},
},
const emit = defineEmits(['create', 'primary', 'tertiary'])
function primary() {
emit('create')
emit('primary')
}
</script>

View File

@ -1,10 +1,11 @@
<template>
<div class="dropdown is-right is-active" ref="dropdown">
<div class="dropdown-trigger is-flex" @click="open = !open">
<slot name="trigger" :close="close">
<slot name="trigger" :close="close" :toggleOpen="toggleOpen">
<BaseButton class="dropdown-trigger is-flex" @click="toggleOpen">
<icon :icon="triggerIcon" class="icon"/>
</slot>
</div>
</BaseButton>
</slot>
<transition name="fade">
<div class="dropdown-menu" v-if="open">
<div class="dropdown-content">
@ -15,45 +16,42 @@
</div>
</template>
<script>
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
<script setup lang="ts">
import {ref} from 'vue'
import {onClickOutside} from '@vueuse/core'
export default {
name: 'dropdown',
data() {
return {
open: false,
}
},
mounted() {
document.addEventListener('click', this.handleClickOutside)
},
beforeUnmount() {
document.removeEventListener('click', this.handleClickOutside)
},
props: {
triggerIcon: {
type: String,
default: 'ellipsis-h',
},
},
emits: ['close'],
methods: {
close() {
this.open = false
},
toggleOpen() {
this.open = !this.open
},
handleClickOutside(e) {
if (!this.open) {
return
}
closeWhenClickedOutside(e, this.$refs.dropdown, () => {
this.open = false
this.$emit('close', e)
})
},
import BaseButton from '@/components/base/BaseButton.vue'
defineProps({
triggerIcon: {
type: String,
default: 'ellipsis-h',
},
})
const emit = defineEmits(['close'])
const open = ref(false)
function close() {
open.value = false
}
function toggleOpen() {
open.value = !open.value
}
const dropdown = ref()
onClickOutside(dropdown, (e: Event) => {
if (!open.value) {
return
}
close()
emit('close', e)
})
</script>
<style lang="scss" scoped>
.dropdown-menu .dropdown-content {
box-shadow: var(--shadow-md);
}
</style>

View File

@ -4,9 +4,15 @@
<template v-for="(s, i) in shortcuts" :key="i">
<h3>{{ $t(s.title) }}</h3>
<message>
<message class="mb-4" v-if="s.available">
{{
s.available($route) ? $t('keyboardShortcuts.currentPageOnly') : $t('keyboardShortcuts.allPages')
typeof s.available === 'undefined' ?
$t('keyboardShortcuts.allPages') :
(
s.available($route)
? $t('keyboardShortcuts.currentPageOnly')
: $t('keyboardShortcuts.somePagesOnly')
)
}}
</message>
@ -17,7 +23,8 @@
class="shortcut-keys"
is="dd"
:keys="sc.keys"
:combination="typeof sc.combination !== 'undefined' ? $t(`keyboardShortcuts.${sc.combination}`) : null"/>
:combination="sc.combination && $t(`keyboardShortcuts.${sc.combination}`)"
/>
</template>
</dl>
</template>
@ -25,28 +32,19 @@
</modal>
</template>
<script>
import {KEYBOARD_SHORTCUTS_ACTIVE} from '@/store/mutation-types'
import Shortcut from '@/components/misc/shortcut.vue'
import Message from '@/components/misc/message'
import {KEYBOARD_SHORTCUTS} from './shortcuts'
<script lang="ts" setup>
import {useStore} from 'vuex'
export default {
name: 'keyboard-shortcuts',
components: {
Message,
Shortcut,
},
data() {
return {
shortcuts: KEYBOARD_SHORTCUTS,
}
},
methods: {
close() {
this.$store.commit(KEYBOARD_SHORTCUTS_ACTIVE, false)
},
},
import Shortcut from '@/components/misc/shortcut.vue'
import Message from '@/components/misc/message.vue'
import {KEYBOARD_SHORTCUTS_ACTIVE} from '@/store/mutation-types'
import {KEYBOARD_SHORTCUTS as shortcuts} from './shortcuts'
const store = useStore()
function close() {
store.commit(KEYBOARD_SHORTCUTS_ACTIVE, false)
}
</script>

View File

@ -1,11 +1,24 @@
import {RouteLocation} from 'vue-router'
import {isAppleDevice} from '@/helpers/isAppleDevice'
const ctrl = isAppleDevice() ? '⌘' : 'ctrl'
export const KEYBOARD_SHORTCUTS = [
interface Shortcut {
title: string
keys: string[]
combination?: 'then'
}
interface ShortcutGroup {
title: string
available?: (route: RouteLocation) => boolean
shortcuts: Shortcut[]
}
export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
{
title: 'keyboardShortcuts.general',
available: () => null,
shortcuts: [
{
title: 'keyboardShortcuts.toggleMenu',
@ -17,6 +30,36 @@ export const KEYBOARD_SHORTCUTS = [
},
],
},
{
title: 'keyboardShortcuts.navigation.title',
shortcuts: [
{
title: 'keyboardShortcuts.navigation.overview',
keys: ['g', 'o'],
combination: 'then',
},
{
title: 'keyboardShortcuts.navigation.upcoming',
keys: ['g', 'u'],
combination: 'then',
},
{
title: 'keyboardShortcuts.navigation.namespaces',
keys: ['g', 'n'],
combination: 'then',
},
{
title: 'keyboardShortcuts.navigation.labels',
keys: ['g', 'a'],
combination: 'then',
},
{
title: 'keyboardShortcuts.navigation.teams',
keys: ['g', 'm'],
combination: 'then',
},
],
},
{
title: 'list.kanban.title',
available: (route) => route.name === 'list.kanban',
@ -29,7 +72,7 @@ export const KEYBOARD_SHORTCUTS = [
},
{
title: 'keyboardShortcuts.list.title',
available: (route) => route.name.startsWith('list.'),
available: (route) => (route.name as string)?.startsWith('list.'),
shortcuts: [
{
title: 'keyboardShortcuts.list.switchToListView',
@ -55,14 +98,12 @@ export const KEYBOARD_SHORTCUTS = [
},
{
title: 'keyboardShortcuts.task.title',
available: (route) => [
'task.detail',
'task.list.detail',
'task.gantt.detail',
'task.kanban.detail',
'task.detail',
].includes(route.name),
available: (route) => route.name === 'task.detail',
shortcuts: [
{
title: 'keyboardShortcuts.task.done',
keys: ['t'],
},
{
title: 'keyboardShortcuts.task.assign',
keys: ['a'],
@ -83,6 +124,18 @@ export const KEYBOARD_SHORTCUTS = [
title: 'keyboardShortcuts.task.related',
keys: ['r'],
},
{
title: 'keyboardShortcuts.task.move',
keys: ['m'],
},
{
title: 'keyboardShortcuts.task.color',
keys: ['c'],
},
{
title: 'keyboardShortcuts.task.reminder',
keys: ['alt', 'r'],
},
],
},
]

View File

@ -2,12 +2,17 @@
<div class="loader-container is-loading"></div>
</template>
<style scoped>
<style scoped lang="scss">
.loader-container {
height: 100%;
min-height: 200px;
width: 100%;
min-width: 600px;
max-width: 100vw;
&.is-loading-small {
min-height: 50px;
min-width: 100px;
}
}
</style>

View File

@ -1,18 +1,35 @@
<template>
<div class="message-wrapper">
<div class="message" :class="variant">
<div class="message" :class="[variant, textAlignClass]">
<slot/>
</div>
</div>
</template>
<script lang="ts" setup>
defineProps({
import {computed, PropType} from 'vue'
const TEXT_ALIGN_MAP = Object.freeze({
left: '',
center: 'has-text-centered',
right: 'has-text-right',
})
type textAlignVariants = keyof typeof TEXT_ALIGN_MAP
const props = defineProps({
variant: {
type: String,
default: 'info',
},
textAlign: {
type: String as PropType<textAlignVariants>,
default: 'left',
},
})
const textAlignClass = computed(() => TEXT_ALIGN_MAP[props.textAlign])
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,205 @@
<template>
<Teleport to="body">
<!-- FIXME: transition should not be included in the modal -->
<transition name="modal">
<section
v-if="enabled"
class="modal-mask"
:class="[
{ 'has-overflow': overflow },
variant,
]"
ref="modal"
>
<div
class="modal-container"
@click.self.prevent.stop="$emit('close')"
v-shortcut="'Escape'"
>
<div
class="modal-content"
:class="{
'has-overflow': overflow,
'is-wide': wide
}"
>
<BaseButton
@click="$emit('close')"
class="close"
>
<icon icon="times"/>
</BaseButton>
<slot>
<div class="header">
<slot name="header"></slot>
</div>
<div class="content">
<slot name="text"></slot>
</div>
<div class="actions">
<x-button
@click="$emit('close')"
variant="tertiary"
class="has-text-danger"
>
{{ $t('misc.cancel') }}
</x-button>
<x-button
@click="$emit('submit')"
variant="primary"
v-cy="'modalPrimary'"
:shadow="false"
>
{{ $t('misc.doit') }}
</x-button>
</div>
</slot>
</div>
</div>
</section>
</transition>
</Teleport>
</template>
<script lang="ts" setup>
import BaseButton from '@/components/base/BaseButton.vue'
import {onUnmounted, ref, watch} from 'vue'
import {useScrollLock} from '@vueuse/core'
const props = withDefaults(defineProps<{
enabled?: boolean,
overflow?: boolean,
wide?: boolean,
transitionName?: 'modal' | 'fade',
variant?: 'default' | 'hint-modal' | 'scrolling',
}>(), {
enabled: true,
transitionName: 'modal',
variant: 'default',
})
defineEmits(['close', 'submit'])
const modal = ref<HTMLElement | null>(null)
const scrollLock = useScrollLock(modal)
watch(
() => props.enabled,
enabled => {
scrollLock.value = enabled
},
)
onUnmounted(() => scrollLock.value = false)
</script>
<style lang="scss" scoped>
.modal-mask {
position: fixed;
z-index: 4000;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .8);
transition: opacity 150ms ease;
color: #fff;
}
.modal-container {
transition: all 150ms ease;
position: relative;
width: 100%;
height: 100%;
max-height: 100vh;
overflow: auto;
}
.default .modal-content,
.hint-modal .modal-content {
text-align: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
@media screen and (max-width: $tablet) {
margin: 0;
top: 25%;
transform: translate(-50%, -25%);
}
.header {
font-size: 2rem;
font-weight: 700;
}
.button {
margin: 0 0.5rem;
}
}
// scrolling-content
// used e.g. for <TaskDetailViewModal>
.scrolling .modal-content {
max-width: 1024px;
width: 100%;
margin: 4rem auto;
max-height: none; // reset bulma
overflow: visible; // reset bulma
@media screen and (min-width: $tablet) {
max-height: none; // reset bulma
margin: 4rem auto; // reset bulma
width: 100%;
}
@media screen and (max-width: $desktop) {
margin: 0;
}
}
.is-wide {
max-width: $desktop;
width: calc(100% - 2rem);
}
.hint-modal {
z-index: 4600;
:deep(.card-content) {
text-align: left;
.info {
font-style: italic;
}
p {
display: flex;
justify-content: space-between;
align-items: center;
}
}
}
.close {
position: fixed;
top: 5px;
right: 26px;
color: var(--white);
font-size: 2rem;
@media screen and (max-width: $desktop) {
color: var(--grey-900);
}
}
</style>
<style lang="scss">
// Close icon SVG uses currentColor, change the color to keep it visible
.dark .close {
color: var(--grey-900);
}
</style>

View File

@ -13,7 +13,10 @@
<section class="content">
<div>
<h2 class="title" v-if="title">{{ title }}</h2>
<api-config @foundApi="hasApiUrl = true"/>
<api-config/>
<Message v-if="motd !== ''" class="is-hidden-tablet mb-4">
{{ motd }}
</Message>
<slot/>
</div>
<legal/>
@ -23,9 +26,9 @@
</template>
<script lang="ts" setup>
import Logo from '@/components/home/Logo'
import Message from '@/components/misc/message'
import Legal from '@/components/misc/legal'
import Logo from '@/components/home/Logo.vue'
import Message from '@/components/misc/message.vue'
import Legal from '@/components/misc/legal.vue'
import ApiConfig from '@/components/misc/api-config.vue'
import {useStore} from 'vuex'
import {computed} from 'vue'
@ -35,11 +38,11 @@ import {useTitle} from '@/composables/useTitle'
const route = useRoute()
const store = useStore()
const {t} = useI18n()
const {t} = useI18n({useScope: 'global'})
const motd = computed(() => store.state.config.motd)
// @ts-ignore
const title = computed(() => t(route.meta.title ?? ''))
const title = computed(() => t(route.meta?.title as string || ''))
useTitle(() => title.value)
</script>

View File

@ -2,10 +2,4 @@
<p class="has-text-centered has-text-grey is-italic p-4 mb-4">
<slot></slot>
</p>
</template>
<script>
export default {
name: 'nothing',
}
</script>
</template>

View File

@ -26,7 +26,7 @@
@click="action.callback"
:shadow="false"
class="is-small"
type="secondary"
variant="secondary"
v-for="(action, i) in item.data.actions"
>
{{ action.title }}
@ -37,12 +37,6 @@
</notifications>
</template>
<script>
export default {
name: 'notification',
}
</script>
<style scoped>
.vue-notification {
z-index: 9999;

View File

@ -6,13 +6,13 @@
v-if="totalPages > 1"
>
<router-link
:disabled="currentPage === 1 || null"
:disabled="currentPage === 1 || undefined"
:to="getRouteForPagination(currentPage - 1)"
class="pagination-previous">
{{ $t('misc.previous') }}
</router-link>
<router-link
:disabled="currentPage === totalPages || null"
:disabled="currentPage === totalPages || undefined"
:to="getRouteForPagination(currentPage + 1)"
class="pagination-next">
{{ $t('misc.next') }}

View File

@ -1,11 +1,11 @@
<template>
<slot name="trigger" :isOpen="open" :toggle="toggle"></slot>
<div class="popup" :class="{'is-open': open}" ref="popup">
<div class="popup" :class="{'is-open': open, 'has-overflow': props.hasOverflow && open}" ref="popup">
<slot name="content" :isOpen="open"/>
</div>
</template>
<script setup>
<script setup lang="ts">
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
import {onBeforeUnmount, onMounted, ref} from 'vue'
@ -16,6 +16,13 @@ const toggle = () => {
open.value = !open.value
}
const props = defineProps({
hasOverflow: {
type: Boolean,
default: false,
},
})
function hidePopup(e) {
if (!open.value) {
return

View File

@ -50,11 +50,18 @@ import Message from '@/components/misc/message.vue'
import NoAuthWrapper from '@/components/misc/no-auth-wrapper.vue'
import {ERROR_NO_API_URL} from '@/helpers/checkAndSetApiUrl'
import {useOnline} from '@/composables/useOnline'
import {useRouter, useRoute} from 'vue-router'
import {getAuthForRoute} from '@/router'
const router = useRouter()
const route = useRoute()
const store = useStore()
const ready = computed(() => store.state.vikunjaReady)
const online = computed(() => store.state.online)
const ready = ref(false)
const online = useOnline()
const error = ref('')
const showLoading = computed(() => !ready.value && error.value === '')
@ -62,7 +69,12 @@ const showLoading = computed(() => !ready.value && error.value === '')
async function load() {
try {
await store.dispatch('loadApp')
} catch(e: any) {
const redirectTo = getAuthForRoute(route)
if (typeof redirectTo !== 'undefined') {
await router.push(redirectTo)
}
ready.value = true
} catch (e: any) {
error.value = e
}
}

View File

@ -1,63 +1,62 @@
<template>
<x-button
type="secondary"
:icon="icon"
v-if="isButton"
variant="secondary"
:icon="iconName"
v-tooltip="tooltipText"
@click="changeSubscription"
:disabled="disabled || null"
v-if="isButton"
:disabled="disabled || undefined"
>
{{ buttonText }}
</x-button>
<a
<BaseButton
v-else
v-tooltip="tooltipText"
@click="changeSubscription"
:class="{'is-disabled': disabled}"
v-else
>
<span class="icon">
<icon :icon="icon"/>
<icon :icon="iconName"/>
</span>
{{ buttonText }}
</a>
</BaseButton>
</template>
<script lang="ts" setup>
import {computed, shallowRef} from 'vue'
import {useI18n} from 'vue-i18n'
import BaseButton from '@/components/base/BaseButton.vue'
import SubscriptionService from '@/services/subscription'
import SubscriptionModel from '@/models/subscription'
import {success} from '@/message'
const props = defineProps({
entity: {
required: true,
type: String,
},
subscription: {
required: true,
},
entityId: {
required: true,
},
isButton: {
type: Boolean,
default: true,
},
interface Props {
entity: string
entityId: number
subscription: SubscriptionModel | null
isButton?: boolean
}
const props = withDefaults(defineProps<Props>(), {
isButton: true,
subscription: null,
})
const subscriptionEntity = computed<string | null>(() => props.subscription?.entity ?? null)
const emit = defineEmits(['change'])
const subscriptionService = shallowRef(new SubscriptionService())
const {t} = useI18n()
const {t} = useI18n({useScope: 'global'})
const tooltipText = computed(() => {
if (disabled.value) {
return t('task.subscription.subscribedThroughParent', {
entity: props.entity,
parent: props.subscription.entity,
parent: subscriptionEntity.value,
})
}
@ -67,13 +66,13 @@ const tooltipText = computed(() => {
})
const buttonText = computed(() => props.subscription !== null ? t('task.subscription.unsubscribe') : t('task.subscription.subscribe'))
const icon = computed(() => props.subscription !== null ? ['far', 'bell-slash'] : 'bell')
const iconName = computed(() => props.subscription !== null ? ['far', 'bell-slash'] : 'bell')
const disabled = computed(() => {
if (props.subscription === null) {
return false
}
return props.subscription.entity !== props.entity
return subscriptionEntity.value !== props.entity
})
function changeSubscription() {

View File

@ -1,212 +0,0 @@
<template>
<transition name="modal">
<section
v-if="enabled"
class="modal-mask"
:class="[
{ 'has-overflow': overflow },
variant,
]"
>
<div
class="modal-container"
:class="{'has-overflow': overflow}"
@click.self.prevent.stop="$emit('close')"
v-shortcut="'Escape'"
>
<div
class="modal-content"
:class="{
'has-overflow': overflow,
'is-wide': wide
}"
>
<slot>
<div class="header">
<slot name="header"></slot>
</div>
<div class="content">
<slot name="text"></slot>
</div>
<div class="actions">
<x-button
@click="$emit('close')"
type="tertary"
class="has-text-danger"
>
{{ $t('misc.cancel') }}
</x-button>
<x-button
@click="$emit('submit')"
type="primary"
:shadow="false"
>
{{ $t('misc.doit') }}
</x-button>
</div>
</slot>
</div>
</div>
</section>
</transition>
</template>
<script>
export const TRANSITION_NAMES = {
MODAL: 'modal',
FADE: 'fade',
}
export const VARIANTS = {
DEFAULT: 'default',
HINT_MODAL: 'hint-modal',
SCROLLING: 'scrolling',
}
function validValue(values) {
return (value) => Object.values(values).includes(value)
}
export default {
name: 'modal',
mounted() {
document.addEventListener('keydown', (e) => {
// Close the model when escape is pressed
if (e.keyCode === 27) {
this.$emit('close')
}
})
},
props: {
enabled: {
type: Boolean,
default: true,
},
overflow: {
type: Boolean,
default: false,
},
wide: {
type: Boolean,
default: false,
},
transitionName: {
type: String,
default: TRANSITION_NAMES.MODAL,
validator: validValue(TRANSITION_NAMES),
},
variant: {
type: String,
default: VARIANTS.DEFAULT,
validator: validValue(VARIANTS),
},
},
emits: ['close', 'submit'],
}
</script>
<style lang="scss" scoped>
.modal-mask {
position: fixed;
z-index: 4000;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .8);
transition: opacity 150ms ease;
color: #fff;
}
.modal-container {
transition: all 150ms ease;
position: relative;
width: 100%;
height: 100%;
max-height: 100vh;
overflow: auto;
}
.default .modal-content,
.hint-modal .modal-content {
text-align: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
@media screen and (max-width: $tablet) {
margin: 0;
top: 25%;
transform: translate(-50%, -25%);
}
.header {
font-size: 2rem;
font-weight: 700;
}
.button {
margin: 0 0.5rem;
}
}
// scrolling-content
// used e.g. for <TaskDetailViewModal>
.scrolling .modal-content {
max-width: 1024px;
width: 100%;
margin: 4rem auto;
max-height: none; // reset bulma
overflow: visible; // reset bulma
@media screen and (min-width: $tablet) {
max-height: none; // reset bulma
margin: 4rem auto; // reset bulma
width: 100%;
}
@media screen and (max-width: $desktop) {
margin: 0;
}
}
.is-wide {
max-width: $desktop;
width: calc(100% - 2rem);
}
.hint-modal {
z-index: 4600;
:deep(.card-content) {
text-align: left;
.info {
font-style: italic;
}
p {
display: flex;
justify-content: space-between;
align-items: center;
}
}
}
/* Transitions */
.modal-enter,
.modal-leave-active {
opacity: 0;
}
.modal-enter .modal-container,
.modal-leave-active .modal-container {
transform: scale(0.9);
}
</style>

View File

@ -1,31 +0,0 @@
<template>
<multiselect
:placeholder="$t('namespace.search')"
@search="findNamespaces"
:search-results="namespaces"
@select="select"
label="title"
:search-delay="10"
/>
</template>
<script lang="ts" setup>
import {ref, computed} from 'vue'
import {useStore} from 'vuex'
import Multiselect from '@/components/input/multiselect.vue'
const emit = defineEmits(['selected'])
const query = ref('')
const store = useStore()
const namespaces = computed(() => store.getters['namespaces/searchNamespace'](query.value))
function findNamespaces(newQuery: string) {
query.value = newQuery
}
function select(namespace) {
emit('selected', namespace)
}
</script>

View File

@ -16,13 +16,13 @@
{{ $t('menu.edit') }}
</dropdown-item>
<dropdown-item
:to="{ name: 'namespace.settings.share', params: { id: namespace.id } }"
:to="{ name: 'namespace.settings.share', params: { namespaceId: namespace.id } }"
icon="share-alt"
>
{{ $t('menu.share') }}
</dropdown-item>
<dropdown-item
:to="{ name: 'list.create', params: { id: namespace.id } }"
:to="{ name: 'list.create', params: { namespaceId: namespace.id } }"
icon="plus"
>
{{ $t('menu.newList') }}

View File

@ -21,20 +21,19 @@
:show-username="false"
:avatar-size="16"
v-if="n.notification.doer"/>
<span class="detail">
<p>
<span class="has-text-weight-bold" v-if="n.notification.doer">
{{ n.notification.doer.getDisplayName() }}
<div class="detail">
<div>
<span class="has-text-weight-bold mr-1" v-if="n.notification.doer">
{{ n.notification.doer.getDisplayName() }}
</span>
<a @click="() => to(n, index)()">
{{ n.toText(userInfo) }}
</a>
</div>
<span class="created" v-tooltip="formatDate(n.created)">
{{ formatDateSince(n.created) }}
</span>
<a @click="() => to(n, index)()">
{{ n.toText(userInfo) }}
</a>
</p>
<div class="created" v-tooltip="formatDate(n.created)">
{{ formatDateSince(n.created) }}
</div>
</span>
</div>
<p class="nothing" v-if="notifications.length === 0">
{{ $t('notification.none') }}<br/>
@ -47,90 +46,92 @@
</div>
</template>
<script>
<script lang="ts" setup>
import {computed, onMounted, onUnmounted, ref} from 'vue'
import NotificationService from '@/services/notification'
import User from '@/components/misc/user.vue'
import names from '@/models/constants/notificationNames.json'
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
import {mapState} from 'vuex'
import {useStore} from 'vuex'
import {useRouter} from 'vue-router'
const LOAD_NOTIFICATIONS_INTERVAL = 10000
export default {
name: 'notifications',
components: {User},
data() {
return {
notificationService: new NotificationService(),
allNotifications: [],
showNotifications: false,
interval: null,
const store = useStore()
const router = useRouter()
const allNotifications = ref([])
const showNotifications = ref(false)
const popup = ref(null)
const unreadNotifications = computed(() => {
return notifications.value.filter(n => n.readAt === null).length
})
const notifications = computed(() => {
return allNotifications.value ? allNotifications.value.filter(n => n.name !== '') : []
})
const userInfo = computed(() => store.state.auth.info)
let interval: number
onMounted(() => {
loadNotifications()
document.addEventListener('click', hidePopup)
interval = setInterval(loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
})
onUnmounted(() => {
document.removeEventListener('click', hidePopup)
clearInterval(interval)
})
async function loadNotifications() {
// We're recreating the notification service here to make sure it uses the latest api user token
const notificationService = new NotificationService()
allNotifications.value = await notificationService.getAll()
}
function hidePopup(e) {
if (showNotifications.value) {
closeWhenClickedOutside(e, popup.value, () => showNotifications.value = false)
}
}
function to(n, index) {
const to = {
name: '',
params: {},
}
switch (n.name) {
case names.TASK_COMMENT:
case names.TASK_ASSIGNED:
to.name = 'task.detail'
to.params.id = n.notification.task.id
break
case names.TASK_DELETED:
// Nothing
break
case names.LIST_CREATED:
to.name = 'task.index'
to.params.listId = n.notification.list.id
break
case names.TEAM_MEMBER_ADDED:
to.name = 'teams.edit'
to.params.id = n.notification.team.id
break
}
return async () => {
if (to.name !== '') {
router.push(to)
}
},
mounted() {
this.loadNotifications()
document.addEventListener('click', this.hidePopup)
this.interval = setInterval(this.loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
},
beforeUnmount() {
document.removeEventListener('click', this.hidePopup)
clearInterval(this.interval)
},
computed: {
unreadNotifications() {
return this.notifications.filter(n => n.readAt === null).length
},
notifications() {
return this.allNotifications.filter(n => n.name !== '')
},
...mapState({
userInfo: state => state.auth.info,
}),
},
methods: {
hidePopup(e) {
if (this.showNotifications) {
closeWhenClickedOutside(e, this.$refs.popup, () => this.showNotifications = false)
}
},
async loadNotifications() {
this.allNotifications = await this.notificationService.getAll()
},
to(n, index) {
const to = {
name: '',
params: {},
}
switch (n.name) {
case names.TASK_COMMENT:
case names.TASK_ASSIGNED:
to.name = 'task.detail'
to.params.id = n.notification.task.id
break
case names.TASK_DELETED:
// Nothing
break
case names.LIST_CREATED:
to.name = 'task.index'
to.params.listId = n.notification.list.id
break
case names.TEAM_MEMBER_ADDED:
to.name = 'teams.edit'
to.params.id = n.notification.team.id
break
}
return async () => {
if (to.name !== '') {
this.$router.push(to)
}
n.read = true
this.allNotifications[index] = await this.notificationService.update(n)
}
},
},
n.read = true
const notificationService = new NotificationService()
allNotifications.value[index] = await notificationService.update(n)
}
}
</script>

View File

@ -1,6 +1,6 @@
<template>
<modal v-if="active" class="quick-actions" @close="closeQuickActions" :overflow="isNewTaskCommand">
<div class="card">
<modal v-if="active" @close="closeQuickActions" :overflow="isNewTaskCommand">
<div class="card quick-actions">
<div class="action-input" :class="{'has-active-cmd': selectedCmd !== null}">
<div class="active-cmd tag" v-if="selectedCmd !== null">
{{ selectedCmd.title }}
@ -52,7 +52,9 @@
</modal>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import TaskService from '@/services/task'
import TeamService from '@/services/team'
@ -82,7 +84,7 @@ const SEARCH_MODE_TASKS = 'tasks'
const SEARCH_MODE_LISTS = 'lists'
const SEARCH_MODE_TEAMS = 'teams'
export default {
export default defineComponent({
name: 'quick-actions',
components: {QuickAddMagic},
data() {
@ -480,7 +482,7 @@ export default {
this.selectedCmd = null
},
},
}
})
</script>
<style lang="scss" scoped>

View File

@ -26,13 +26,13 @@
<div class="control">
<div class="select">
<select v-model="selectedRight" id="linkShareRight">
<option :value="rights.READ">
<option :value="RIGHTS.READ">
{{ $t('list.share.right.read') }}
</option>
<option :value="rights.READ_WRITE">
<option :value="RIGHTS.READ_WRITE">
{{ $t('list.share.right.readWrite') }}
</option>
<option :value="rights.ADMIN">
<option :value="RIGHTS.ADMIN">
{{ $t('list.share.right.admin') }}
</option>
</select>
@ -121,13 +121,13 @@
{{ s.sharedBy.getDisplayName() }}
</td>
<td class="type">
<template v-if="s.right === rights.ADMIN">
<template v-if="s.right === RIGHTS.ADMIN">
<span class="icon is-small">
<icon icon="lock"/>
</span>&nbsp;
{{ $t('list.share.right.admin') }}
</template>
<template v-else-if="s.right === rights.READ_WRITE">
<template v-else-if="s.right === RIGHTS.READ_WRITE">
<span class="icon is-small">
<icon icon="pen"/>
</span>&nbsp;
@ -175,87 +175,87 @@
</div>
</template>
<script>
import rights from '../../models/constants/rights'
<script setup lang="ts">
import {ref, watch, computed, shallowReactive} from 'vue'
import {useStore} from 'vuex'
import {useI18n} from 'vue-i18n'
import LinkShareService from '../../services/linkShare'
import LinkShareModel from '../../models/linkShare'
import RIGHTS from '@/models/constants/rights.json'
import LinkShareModel from '@/models/linkShare'
import copy from 'copy-to-clipboard'
import {mapState} from 'vuex'
import LinkShareService from '@/services/linkShare'
export default {
name: 'linkSharing',
props: {
listId: {
default: 0,
required: true,
},
},
data() {
return {
linkShares: [],
linkShareService: new LinkShareService(),
rights: rights,
selectedRight: rights.READ,
name: '',
password: '',
showDeleteModal: false,
linkIdToDelete: 0,
showNewForm: false,
}
},
watch: {
listId: {
handler: 'load',
immediate: true,
},
},
computed: mapState({
frontendUrl: (state) => state.config.frontendUrl,
}),
methods: {
async load(listId) {
// If listId == 0 the list on the calling component wasn't already loaded, so we just bail out here
if (listId === 0) {
return
}
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
import {success} from '@/message'
this.linkShares = await this.linkShareService.getAll({listId})
},
async add(listId) {
const newLinkShare = new LinkShareModel({
right: this.selectedRight,
listId,
name: this.name,
password: this.password,
})
await this.linkShareService.create(newLinkShare)
this.selectedRight = rights.READ
this.name = ''
this.password = ''
this.showNewForm = false
this.$message.success({message: this.$t('list.share.links.createSuccess')})
await this.load(listId)
},
async remove(listId) {
const linkshare = new LinkShareModel({
id: this.linkIdToDelete,
listId,
})
try {
await this.linkShareService.delete(linkshare)
this.$message.success({message: this.$t('list.share.links.deleteSuccess')})
await this.load(listId)
} finally {
this.showDeleteModal = false
}
},
copy,
getShareLink(hash) {
return this.frontendUrl + 'share/' + hash + '/auth'
},
const props = defineProps({
listId: {
default: 0,
required: true,
},
})
const {t} = useI18n({useScope: 'global'})
const linkShares = ref([])
const linkShareService = shallowReactive(new LinkShareService())
const selectedRight = ref(RIGHTS.READ)
const name = ref('')
const password = ref('')
const showDeleteModal = ref(false)
const linkIdToDelete = ref(0)
const showNewForm = ref(false)
const copy = useCopyToClipboard()
watch(
() => props.listId,
load,
{immediate: true},
)
const store = useStore()
const frontendUrl = computed(() => store.state.config.frontendUrl)
async function load(listId) {
// If listId == 0 the list on the calling component wasn't already loaded, so we just bail out here
if (listId === 0) {
return
}
linkShares.value = await linkShareService.getAll({listId})
}
async function add(listId) {
const newLinkShare = new LinkShareModel({
right: selectedRight.value,
listId,
name: name.value,
password: password.value,
})
await linkShareService.create(newLinkShare)
selectedRight.value = RIGHTS.READ
name.value = ''
password.value = ''
showNewForm.value = false
success({message: t('list.share.links.createSuccess')})
await load(listId)
}
async function remove(listId) {
try {
await linkShareService.delete(new LinkShareModel({
id: linkIdToDelete.value,
listId,
}))
success({message: t('list.share.links.deleteSuccess')})
await load(listId)
} finally {
showDeleteModal.value = false
}
}
function getShareLink(hash: string) {
return frontendUrl.value + 'share/' + hash + '/auth'
}
</script>
@ -264,4 +264,6 @@ export default {
.sharables-list:not(.card-content) {
overflow-y: auto
}
@include modal-transition();
</style>

View File

@ -9,7 +9,7 @@
class="control is-expanded"
:class="{ 'is-loading': searchService.loading }"
>
<multiselect
<Multiselect
:loading="searchService.loading"
:placeholder="$t('misc.searchPlaceholder')"
@search="find"
@ -130,238 +130,237 @@
</div>
</template>
<script>
import UserNamespaceService from '../../services/userNamespace'
import UserNamespaceModel from '../../models/userNamespace'
import UserListModel from '../../models/userList'
import UserListService from '../../services/userList'
import UserService from '../../services/user'
import UserModel from '../../models/user'
<script lang="ts">
import {defineComponent, ShallowReactive, shallowReactive} from 'vue'
export default defineComponent({ name: 'userTeamShare' })
</script>
import TeamNamespaceService from '../../services/teamNamespace'
import TeamNamespaceModel from '../../models/teamNamespace'
import TeamListModel from '../../models/teamList'
import TeamListService from '../../services/teamList'
import TeamService from '../../services/team'
import TeamModel from '../../models/team'
<script setup lang="ts">
import {ref, reactive, computed} from 'vue'
import type {PropType} from 'vue'
import {useStore} from 'vuex'
import {useI18n} from 'vue-i18n'
import rights from '../../models/constants/rights.json'
import UserNamespaceService from '@/services/userNamespace'
import UserNamespaceModel from '@/models/userNamespace'
import UserListModel from '@/models/userList'
import UserListService from '@/services/userList'
import UserService from '@/services/user'
import UserModel from '@/models/user'
import TeamNamespaceService from '@/services/teamNamespace'
import TeamNamespaceModel from '@/models/teamNamespace'
import TeamListModel from '@/models/teamList'
import TeamListService from '@/services/teamList'
import TeamService from '@/services/team'
import TeamModel from '@/models/team'
import RIGHTS from '@/models/constants/rights.json'
import Multiselect from '@/components/input/multiselect.vue'
import Nothing from '@/components/misc/nothing.vue'
import { success } from '@/message'
export default {
name: 'userTeamShare',
props: {
type: {
type: String,
default: '',
},
shareType: {
type: String,
default: '',
},
id: {
type: Number,
default: 0,
},
userIsAdmin: {
type: Boolean,
default: false,
},
const props = defineProps({
type: {
type: String as PropType<'list' | 'namespace'>,
default: '',
},
data() {
return {
stuffService: Object, // This user service is either a userNamespaceService or a userListService, depending on the type we are using
stuffModel: Object,
searchService: Object,
sharable: Object,
found: [],
searchLabel: '',
rights: rights,
selectedRight: {},
typeString: '',
sharables: [], // This holds either teams or users who this namepace or list is shared with
showDeleteModal: false,
}
shareType: {
type: String as PropType<'user' | 'team' | 'namespace'>,
default: '',
},
components: {
Nothing,
Multiselect,
id: {
type: Number,
default: 0,
},
computed: {
userInfo() {
return this.$store.state.auth.info
},
shareTypeNames() {
if (this.shareType === 'user') {
return this.$tc('list.share.userTeam.typeUser', 2)
}
if (this.shareType === 'team') {
return this.$tc('list.share.userTeam.typeTeam', 2)
}
return ''
},
shareTypeName() {
if (this.shareType === 'user') {
return this.$tc('list.share.userTeam.typeUser', 1)
}
if (this.shareType === 'team') {
return this.$tc('list.share.userTeam.typeTeam', 1)
}
return ''
},
sharableName() {
if (this.type === 'list') {
return this.$t('list.list.title')
}
if (this.shareType === 'namespace') {
return this.$t('namespace.namespace')
}
return ''
},
userIsAdmin: {
type: Boolean,
default: false,
},
created() {
if (this.shareType === 'user') {
this.searchService = new UserService()
this.sharable = new UserModel()
this.searchLabel = 'username'
})
if (this.type === 'list') {
this.typeString = 'list'
this.stuffService = new UserListService()
this.stuffModel = new UserListModel({listId: this.id})
} else if (this.type === 'namespace') {
this.typeString = 'namespace'
this.stuffService = new UserNamespaceService()
this.stuffModel = new UserNamespaceModel({
namespaceId: this.id,
})
} else {
throw new Error('Unknown type: ' + this.type)
}
} else if (this.shareType === 'team') {
this.searchService = new TeamService()
this.sharable = new TeamModel()
this.searchLabel = 'name'
const {t} = useI18n({useScope: 'global'})
if (this.type === 'list') {
this.typeString = 'list'
this.stuffService = new TeamListService()
this.stuffModel = new TeamListModel({listId: this.id})
} else if (this.type === 'namespace') {
this.typeString = 'namespace'
this.stuffService = new TeamNamespaceService()
this.stuffModel = new TeamNamespaceModel({
namespaceId: this.id,
})
} else {
throw new Error('Unknown type: ' + this.type)
}
} else {
throw new Error('Unkown share type')
// This user service is either a userNamespaceService or a userListService, depending on the type we are using
let stuffService: ShallowReactive<UserNamespaceService | UserListService | TeamListService | TeamNamespaceService>
let stuffModel: UserNamespaceModel | UserListModel | TeamListModel | TeamNamespaceModel
let searchService: ShallowReactive<UserService | TeamService>
let sharable: UserModel | TeamModel
const searchLabel = ref('')
const selectedRight = ref({})
// This holds either teams or users who this namepace or list is shared with
const sharables = ref([])
const showDeleteModal = ref(false)
const store = useStore()
const userInfo = computed(() => store.state.auth.info)
function createShareTypeNameComputed(count: number) {
return computed(() => {
if (props.shareType === 'user') {
return t('list.share.userTeam.typeUser', count)
}
this.load()
},
methods: {
async load() {
this.sharables = await this.stuffService.getAll(this.stuffModel)
this.sharables.forEach((s) =>
this.selectedRight[s.id] = s.right,
)
},
if (props.shareType === 'team') {
return t('list.share.userTeam.typeTeam', count)
}
async deleteSharable() {
if (this.shareType === 'user') {
this.stuffModel.userId = this.sharable.username
} else if (this.shareType === 'team') {
this.stuffModel.teamId = this.sharable.id
}
return ''
})
}
await this.stuffService.delete(this.stuffModel)
this.showDeleteModal = false
for (const i in this.sharables) {
if (
(this.sharables[i].username === this.stuffModel.userId && this.shareType === 'user') ||
(this.sharables[i].id === this.stuffModel.teamId && this.shareType === 'team')
) {
this.sharables.splice(i, 1)
}
}
this.$message.success({message: this.$t('list.share.userTeam.removeSuccess', {type: this.shareTypeName, sharable: this.sharableName})})
},
const shareTypeNames = createShareTypeNameComputed(2)
const shareTypeName = createShareTypeNameComputed(1)
async add(admin) {
if (admin === null) {
admin = false
}
this.stuffModel.right = rights.READ
if (admin) {
this.stuffModel.right = rights.ADMIN
}
const sharableName = computed(() => {
if (props.type === 'list') {
return t('list.list.title')
}
if (this.shareType === 'user') {
this.stuffModel.userId = this.sharable.username
} else if (this.shareType === 'team') {
this.stuffModel.teamId = this.sharable.id
}
if (props.shareType === 'namespace') {
return t('namespace.namespace')
}
await this.stuffService.create(this.stuffModel)
this.$message.success({message: this.$t('list.share.userTeam.addedSuccess', {type: this.shareTypeName})})
await this.load()
},
return ''
})
async toggleType(sharable) {
if (
this.selectedRight[sharable.id] !== rights.ADMIN &&
this.selectedRight[sharable.id] !== rights.READ &&
this.selectedRight[sharable.id] !== rights.READ_WRITE
) {
this.selectedRight[sharable.id] = rights.READ
}
this.stuffModel.right = this.selectedRight[sharable.id]
if (props.shareType === 'user') {
searchService = shallowReactive(new UserService())
sharable = reactive(new UserModel())
searchLabel.value = 'username'
if (this.shareType === 'user') {
this.stuffModel.userId = sharable.username
} else if (this.shareType === 'team') {
this.stuffModel.teamId = sharable.id
}
if (props.type === 'list') {
stuffService = shallowReactive(new UserListService())
stuffModel = reactive(new UserListModel({listId: props.id}))
} else if (props.type === 'namespace') {
stuffService = shallowReactive(new UserNamespaceService())
stuffModel = reactive(new UserNamespaceModel({
namespaceId: props.id,
}))
} else {
throw new Error('Unknown type: ' + props.type)
}
} else if (props.shareType === 'team') {
searchService = new TeamService()
sharable = reactive(new TeamModel())
searchLabel.value = 'name'
const r = await this.stuffService.update(this.stuffModel)
for (const i in this.sharables) {
if (
(this.sharables[i].username ===
this.stuffModel.userId &&
this.shareType === 'user') ||
(this.sharables[i].id === this.stuffModel.teamId &&
this.shareType === 'team')
) {
this.sharables[i].right = r.right
}
}
this.$message.success({message: this.$t('list.share.userTeam.updatedSuccess', {type: this.shareTypeName})})
},
if (props.type === 'list') {
stuffService = shallowReactive(new TeamListService())
stuffModel = reactive(new TeamListModel({listId: props.id}))
} else if (props.type === 'namespace') {
stuffService = shallowReactive(new TeamNamespaceService())
stuffModel = reactive(new TeamNamespaceModel({
namespaceId: props.id,
}))
} else {
throw new Error('Unknown type: ' + props.type)
}
} else {
throw new Error('Unkown share type')
}
async find(query) {
if (query === '') {
this.clearAll()
return
}
load()
this.found = await this.searchService.getAll({}, {s: query})
},
async function load() {
sharables.value = await stuffService.getAll(stuffModel)
sharables.value.forEach(({id, right}) =>
selectedRight.value[id] = right,
)
}
clearAll() {
this.found = []
},
},
async function deleteSharable() {
if (props.shareType === 'user') {
stuffModel.userId = sharable.username
} else if (props.shareType === 'team') {
stuffModel.teamId = sharable.id
}
await stuffService.delete(stuffModel)
showDeleteModal.value = false
for (const i in sharables.value) {
if (
(sharables.value[i].username === stuffModel.userId && props.shareType === 'user') ||
(sharables.value[i].id === stuffModel.teamId && props.shareType === 'team')
) {
sharables.value.splice(i, 1)
}
}
success({message: t('list.share.userTeam.removeSuccess', {
type: shareTypeName.value,
sharable: sharableName.value,
})})
}
async function add(admin) {
if (admin === null) {
admin = false
}
stuffModel.right = RIGHTS.READ
if (admin) {
stuffModel.right = RIGHTS.ADMIN
}
if (props.shareType === 'user') {
stuffModel.userId = sharable.username
} else if (props.shareType === 'team') {
stuffModel.teamId = sharable.id
}
await stuffService.create(stuffModel)
success({message: t('list.share.userTeam.addedSuccess', {type: shareTypeName.value})})
await load()
}
async function toggleType(sharable) {
if (
selectedRight.value[sharable.id] !== RIGHTS.ADMIN &&
selectedRight.value[sharable.id] !== RIGHTS.READ &&
selectedRight.value[sharable.id] !== RIGHTS.READ_WRITE
) {
selectedRight.value[sharable.id] = RIGHTS.READ
}
stuffModel.right = selectedRight.value[sharable.id]
if (props.shareType === 'user') {
stuffModel.userId = sharable.username
} else if (props.shareType === 'team') {
stuffModel.teamId = sharable.id
}
const r = await stuffService.update(stuffModel)
for (const i in sharables.value) {
if (
(sharables.value[i].username ===
stuffModel.userId &&
props.shareType === 'user') ||
(sharables.value[i].id === stuffModel.teamId &&
props.shareType === 'team')
) {
sharables.value[i].right = r.right
}
}
success({message: t('list.share.userTeam.updatedSuccess', {type: shareTypeName.value})})
}
const found = ref([])
async function find(query) {
if (query === '') {
clearAll()
return
}
found.value = await searchService.getAll({}, {s: query})
}
function clearAll() {
found.value = []
}
</script>
<style lang="scss" scoped>
@include modal-transition();
</style>

View File

@ -5,12 +5,13 @@
<textarea
:disabled="taskService.loading || undefined"
class="add-task-textarea input"
:class="{'textarea-empty': newTaskTitle === ''}"
:placeholder="$t('list.list.addPlaceholder')"
rows="1"
v-focus
v-model="newTaskTitle"
ref="newTaskInput"
@keyup="errorMessage = ''"
@keyup="resetEmptyTitleError"
@keydown.enter="handleEnter"
/>
<span class="icon is-small is-left">
@ -24,15 +25,18 @@
@click="addTask()"
icon="plus"
:loading="taskService.loading"
:aria-label="$t('list.list.add')"
>
{{ $t('list.list.add') }}
<span class="button-text">
{{ $t('list.list.add') }}
</span>
</x-button>
</p>
</div>
<p class="help is-danger" v-if="errorMessage !== ''">
{{ errorMessage }}
</p>
<quick-add-magic v-else />
<quick-add-magic v-else/>
</div>
</template>
@ -40,9 +44,9 @@
import {ref, watch, unref, shallowReactive} from 'vue'
import {useI18n} from 'vue-i18n'
import {useStore} from 'vuex'
import { tryOnMounted, debouncedWatch, useWindowSize, MaybeRef } from '@vueuse/core'
import {tryOnMounted, debouncedWatch, useWindowSize, MaybeRef} from '@vueuse/core'
import TaskService from '../../services/task'
import TaskService from '@/services/task'
import QuickAddMagic from '@/components/tasks/partials/quick-add-magic.vue'
function cleanupTitle(title: string) {
@ -54,12 +58,12 @@ function useAutoHeightTextarea(value: MaybeRef<string>) {
const minHeight = ref(0)
// adapted from https://github.com/LeaVerou/stretchy/blob/47f5f065c733029acccb755cae793009645809e2/src/stretchy.js#L34
function resize(textareaEl: HTMLInputElement|undefined) {
function resize(textareaEl: HTMLInputElement | undefined) {
if (!textareaEl) return
let empty
// the value here is the the attribute value
// the value here is the attribute value
if (!textareaEl.value && textareaEl.placeholder) {
empty = true
textareaEl.value = textareaEl.placeholder
@ -95,12 +99,12 @@ function useAutoHeightTextarea(value: MaybeRef<string>) {
}
})
const { width: windowWidth } = useWindowSize()
const {width: windowWidth} = useWindowSize()
debouncedWatch(
windowWidth,
() => resize(textarea.value),
{ debounce: 200 },
{debounce: 200},
)
// It is not possible to get notified of a change of the value attribute of a textarea without workarounds (setTimeout)
@ -117,9 +121,6 @@ function useAutoHeightTextarea(value: MaybeRef<string>) {
return textarea
}
const emit = defineEmits(['taskAdded'])
const props = defineProps({
defaultPosition: {
type: Number,
@ -127,15 +128,26 @@ const props = defineProps({
},
})
const taskService = shallowReactive(new TaskService())
const errorMessage = ref('')
const emit = defineEmits(['taskAdded'])
const newTaskTitle = ref('')
const newTaskInput = useAutoHeightTextarea(newTaskTitle)
const { t } = useI18n()
const {t} = useI18n({useScope: 'global'})
const store = useStore()
const taskService = shallowReactive(new TaskService())
const errorMessage = ref('')
function resetEmptyTitleError(e) {
if (
(e.which <= 90 && e.which >= 48 || e.which >= 96 && e.which <= 105)
&& newTaskTitle.value !== ''
) {
errorMessage.value = ''
}
}
async function addTask() {
if (newTaskTitle.value === '') {
errorMessage.value = t('list.create.addTitleRequired')
@ -195,9 +207,26 @@ function handleEnter(e: KeyboardEvent) {
.add-task-button {
height: 2.5rem;
@media screen and (max-width: $mobile) {
.button-text {
display: none;
}
:deep(.icon) {
margin: 0 !important;
}
}
}
.add-task-textarea {
transition: border-color $transition;
resize: none;
}
// Adding this class when the textarea has no text prevents the textarea from wrapping the placeholder.
.textarea-empty {
white-space: nowrap;
text-overflow: ellipsis;
}
</style>

View File

@ -11,7 +11,7 @@
<div class="control">
<input
:class="{ disabled: taskService.loading }"
:disabled="taskService.loading || null"
:disabled="taskService.loading || undefined"
@change="editTaskSubmit()"
class="input"
id="tasktext"
@ -67,7 +67,7 @@
<router-link
class="mt-2 has-text-centered is-block"
:to="{name: 'task.detail', params: {id: taskEditTask.id}}"
:to="taskDetailRoute"
>
{{ $t('task.openDetail') }}
</router-link>
@ -75,78 +75,81 @@
</card>
</template>
<script>
import AsyncEditor from '@/components/input/AsyncEditor'
<script setup lang="ts">
import {ref, reactive, computed, shallowReactive, watch, nextTick} from 'vue'
import {useRouter} from 'vue-router'
import {useI18n} from 'vue-i18n'
import ListService from '../../services/list'
import TaskService from '../../services/task'
import TaskModel from '../../models/task'
import priorities from '../../models/constants/priorities'
import EditLabels from './partials/editLabels'
import Reminders from './partials/reminders'
import ColorPicker from '../input/colorPicker'
import Editor from '@/components/input/AsyncEditor'
export default {
name: 'edit-task',
data() {
return {
listId: this.$route.params.id,
listService: new ListService(),
taskService: new TaskService(),
import TaskService from '@/services/task'
import TaskModel from '@/models/task'
import EditLabels from './partials/editLabels.vue'
import Reminders from './partials/reminders.vue'
import ColorPicker from '../input/colorPicker.vue'
priorities: priorities,
list: {},
editorActive: false,
newTask: new TaskModel(),
isTaskEdit: false,
taskEditTask: TaskModel,
import {success} from '@/message'
const {t} = useI18n({useScope: 'global'})
const router = useRouter()
const props = defineProps({
task: {
type: TaskModel,
required: true,
},
})
const taskService = shallowReactive(new TaskService())
const editorActive = ref(false)
let taskEditTask: TaskModel | undefined
// FIXME: this initialization should not be necessary here
function initTaskFields() {
taskEditTask.dueDate =
+new Date(props.task.dueDate) === 0 ? null : props.task.dueDate
taskEditTask.startDate =
+new Date(props.task.startDate) === 0
? null
: props.task.startDate
taskEditTask.endDate =
+new Date(props.task.endDate) === 0 ? null : props.task.endDate
// This makes the editor trigger its mounted function again which makes it forget every input
// it currently has in its textarea. This is a counter-hack to a hack inside of vue-easymde
// which made it impossible to detect change from the outside. Therefore the component would
// not update if new content from the outside was made available.
// See https://github.com/NikulinIlya/vue-easymde/issues/3
editorActive.value = false
nextTick(() => (editorActive.value = true))
}
watch(
() => props.task,
() => {
if (!taskEditTask) {
taskEditTask = reactive(props.task)
} else {
Object.assign(taskEditTask, new TaskModel(props.task))
}
initTaskFields()
},
components: {
ColorPicker,
Reminders,
EditLabels,
editor: AsyncEditor,
},
props: {
task: {
type: TaskModel,
required: true,
},
},
watch: {
task: {
handler() {
this.taskEditTask = this.task
this.initTaskFields()
},
immediate: true,
},
},
methods: {
initTaskFields() {
this.taskEditTask.dueDate =
+new Date(this.task.dueDate) === 0 ? null : this.task.dueDate
this.taskEditTask.startDate =
+new Date(this.task.startDate) === 0
? null
: this.task.startDate
this.taskEditTask.endDate =
+new Date(this.task.endDate) === 0 ? null : this.task.endDate
// This makes the editor trigger its mounted function again which makes it forget every input
// it currently has in its textarea. This is a counter-hack to a hack inside of vue-easymde
// which made it impossible to detect change from the outside. Therefore the component would
// not update if new content from the outside was made available.
// See https://github.com/NikulinIlya/vue-easymde/issues/3
this.editorActive = false
this.$nextTick(() => (this.editorActive = true))
},
async editTaskSubmit() {
this.taskEditTask = await this.taskService.update(this.taskEditTask)
this.initTaskFields()
this.$message.success({message: this.$t('task.detail.updateSuccess')})
},
},
{immediate: true },
)
const taskDetailRoute = computed(() => {
return {
name: 'task.detail',
params: { id: taskEditTask.id },
state: { backdropView: router.currentRoute.value.fullPath },
}
})
async function editTaskSubmit() {
const newTask = await taskService.update(taskEditTask)
Object.assign(taskEditTask, newTask)
initTaskFields()
success({message: t('task.detail.updateSuccess')})
}
</script>

View File

@ -170,7 +170,9 @@
</div>
</template>
<script>
<script lang="ts">
import {defineComponent} from 'vue'
import VueDragResize from 'vue-drag-resize'
import EditTask from './edit-task'
@ -183,7 +185,9 @@ import {mapState} from 'vuex'
import Rights from '../../models/constants/rights.json'
import FilterPopup from '@/components/list/partials/filter-popup.vue'
export default {
import {colorIsDark} from '@/helpers/color/colorIsDark'
export default defineComponent({
name: 'GanttChart',
components: {
FilterPopup,
@ -252,6 +256,7 @@ export default {
canWrite: (state) => state.currentList.maxRight > Rights.READ,
}),
methods: {
colorIsDark,
buildTheGanttChart() {
this.setDates()
this.prepareGanttDays()
@ -432,7 +437,7 @@ export default {
return this.format(date, 'MMMM, yyyy')
},
},
}
})
</script>
<style lang="scss" scoped>
@ -515,14 +520,14 @@ $gantt-vertical-border-color: var(--grey-100);
}
&.has-light-text {
color: var(--light);
color: var(--grey-100);
&.done span:after {
border-top: 1px solid var(--light);
border-top: 1px solid var(--grey-100);
}
.edit-toggle {
color: var(--light);
color: var(--grey-100);
}
}

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