From 4fc73626b754e17aae179ed56b97e39023d1a37c Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 16 Dec 2020 12:28:54 +0100 Subject: [PATCH 001/276] Properly cache html files --- nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nginx.conf b/nginx.conf index 71cc3e45c..64e3e6435 100644 --- a/nginx.conf +++ b/nginx.conf @@ -39,7 +39,7 @@ http { # Expires map map $sent_http_content_type $expires { default off; - text/html epoch; # We don't cache the html for the browser to get the content + text/html max; text/css max; application/javascript max; ~image/ max; From 66d4738ec502b8df9d9cc84117ee7460ee9f231c Mon Sep 17 00:00:00 2001 From: konrad Date: Wed, 16 Dec 2020 11:54:01 +0000 Subject: [PATCH 002/276] Make sure task title and task id are properly shown on mobile (#334) Make sure task title and task id are properly shown on mobile Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/334 Co-Authored-By: konrad Co-Committed-By: konrad --- src/styles/components/task.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/styles/components/task.scss b/src/styles/components/task.scss index 88a9ac85f..1ae148e51 100644 --- a/src/styles/components/task.scss +++ b/src/styles/components/task.scss @@ -44,6 +44,15 @@ color: lighten($grey, 25%); white-space: nowrap; } + + @media screen and (max-width: $tablet) { + flex-direction: column; + align-items: start; + + .title.input { + margin: 0 -.3em .5rem -.3em; // the title has 0.3em padding - this make the text inside of it align with the rest + } + } } .date-input { From 3346fe00ebc6c33f898b7493a1686858ed56c7c3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 16 Dec 2020 20:23:38 +0100 Subject: [PATCH 003/276] Add downloading assets when building docker images --- .drone.yml | 93 ++++++++++++++++++++++++++++++++++-------------------- Dockerfile | 9 ++++++ 2 files changed, 67 insertions(+), 35 deletions(-) diff --git a/.drone.yml b/.drone.yml index fd054322a..d2b7b7f04 100644 --- a/.drone.yml +++ b/.drone.yml @@ -294,6 +294,10 @@ kind: pipeline type: docker name: docker-arm-release +depends_on: + - release-latest + - release-version + platform: os: linux arch: arm @@ -304,12 +308,7 @@ trigger: - "refs/tags/**" steps: - - name: fetch-tags - image: docker:git - commands: - - git fetch --tags - - - name: docker + - name: docker-latest image: plugins/docker:linux-arm pull: true settings: @@ -320,8 +319,30 @@ steps: repo: vikunja/frontend auto_tag: true auto_tag_suffix: linux-arm - depends_on: - - fetch-tags + build_args: + - USE_RELEASE=true + - RELEASE_VERSION=master + when: + ref: + - refs/heads/master + + - name: docker-version + image: plugins/docker:linux-arm + pull: true + settings: + username: + from_secret: docker_username + password: + from_secret: docker_password + repo: vikunja/frontend + auto_tag: true + auto_tag_suffix: linux-arm + build_args: + - USE_RELEASE=true + - RELEASE_VERSION=${DRONE_TAG##v} + when: + ref: + - "refs/tags/**" --- kind: pipeline @@ -332,36 +353,17 @@ platform: os: linux arch: amd64 +depends_on: + - release-latest + - release-version + trigger: ref: - refs/heads/master - "refs/tags/**" steps: - - name: fetch-tags - image: docker:git - commands: - - git fetch --tags - - - name: restore-cache - image: meltwater/drone-cache:dev - pull: true - environment: - AWS_ACCESS_KEY_ID: - from_secret: cache_aws_access_key_id - AWS_SECRET_ACCESS_KEY: - from_secret: cache_aws_secret_access_key - settings: - restore: true - bucket: kolaente.dev-drone-dependency-cache - endpoint: https://s3.fr-par.scw.cloud - region: fr-par - path_style: true - cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}' - mount: - - '.cache' - - - name: docker + - name: docker-latest image: plugins/docker:linux-amd64 pull: true settings: @@ -372,9 +374,30 @@ steps: repo: vikunja/frontend auto_tag: true auto_tag_suffix: linux-amd64 - depends_on: - - fetch-tags - - restore-cache + build_args: + - USE_RELEASE=true + - RELEASE_VERSION=master + when: + ref: + - refs/heads/master + + - name: docker-version + image: plugins/docker:linux-amd64 + pull: true + settings: + username: + from_secret: docker_username + password: + from_secret: docker_password + repo: vikunja/frontend + auto_tag: true + auto_tag_suffix: linux-amd64 + build_args: + - USE_RELEASE=true + - RELEASE_VERSION=${DRONE_TAG##v} + when: + ref: + - "refs/tags/**" --- kind: pipeline diff --git a/Dockerfile b/Dockerfile index 220d7ab03..0e19bca73 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,10 +3,19 @@ FROM node:13.14.0 AS compile-image WORKDIR /build +ARG USE_RELEASE=false +ARG RELEASE_VERSION=master + ENV YARN_CACHE_FOLDER .cache/yarn/ COPY . ./ RUN \ + if [ $USE_RELEASE ]; then \ + rm -rf dist/ && \ + wget https://dl.vikunja.io/frontend/vikunja-frontend-$RELEASE_VERSION.zip -O frontend-release.zip && \ + unzip frontend-release.zip -d dist/ && \ + exit 0; \ + fi && \ # Build the frontend yarn install --frozen-lockfile --network-timeout 100000 && \ echo '{"VERSION": "'$(git describe --tags --always --abbrev=10 | sed 's/-/+/' | sed 's/^v//' | sed 's/-g/-/')'"}' > src/version.json && \ From 8e2b5d3bdd8856855a226f624174900b9753bace Mon Sep 17 00:00:00 2001 From: renovate Date: Wed, 16 Dec 2020 20:49:21 +0000 Subject: [PATCH 004/276] Update dependency vue-easymde to v1.3.2 (#335) Update dependency vue-easymde to v1.3.2 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/335 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index b5ba53695..86b67fcdf 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "vue": "2.6.12", "vue-advanced-cropper": "0.19.2", "vue-drag-resize": "1.4.2", - "vue-easymde": "1.3.1", + "vue-easymde": "1.3.2", "vue-shortkey": "3.1.7", "vue-smooth-dnd": "0.8.1", "vuex": "3.6.0" diff --git a/yarn.lock b/yarn.lock index 5e4f462d8..9e2544229 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10478,7 +10478,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@1.2.7: +marked@1.2.7, marked@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.7.tgz#6e14b595581d2319cdcf033a24caaf41455a01fb" integrity sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA== @@ -15125,13 +15125,13 @@ vue-drag-resize@1.4.2: resolved "https://registry.yarnpkg.com/vue-drag-resize/-/vue-drag-resize-1.4.2.tgz#656408b52c77c383a6aafb08c32bd220f0f25b73" integrity sha512-rPd8JkkueBegCX8niJg3aWwQBfys9upaxLDyH6+1Gkz6pUzldhVqpF0hragppo68q6NWqE9fbvypWVI43AFyqw== -vue-easymde@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/vue-easymde/-/vue-easymde-1.3.1.tgz#886aa7fecfe799136795fe8b19c9d40f904e806e" - integrity sha512-fTgc5TSj+YJgfTwwazE3cUloBRvpB1tTuX2npvQQrKr9jdQY9eNA4PT6WxnTCfvNZdw2dYfC4eMv+Ss+s9aNXA== +vue-easymde@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/vue-easymde/-/vue-easymde-1.3.2.tgz#6df7db2510f638b2a5722a001156df886d384b10" + integrity sha512-gBi57CKi/d/2QqeIa7Cp0iukdmvFkM4c03UtzXMnu+56FWVuuAnkn6lQ9djzg0+EsY3jQeA86B9c5S9i9XEiwg== dependencies: easymde "^2.13.0" - marked "^1.2.3" + marked "^1.2.7" vue-eslint-parser@^7.3.0: version "7.3.0" From 3c3d6a4af35fac27eadcf450d789d5f78cdbce9b Mon Sep 17 00:00:00 2001 From: azymondrian Date: Thu, 17 Dec 2020 11:45:26 +0000 Subject: [PATCH 005/276] Mobile Menu Fixes (#332) Fix main body overflow on medium screen sizes Remove wait for done button in cypress test Add wait for done button in cypress test Calc whether menu should be open on first page load Mobile Menu fixes - Doesn't scrunch the main content on opening the menu - Keep main content aligned left when the menu is open Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/332 Reviewed-by: konrad Co-Authored-By: azymondrian Co-Committed-By: azymondrian --- src/components/home/navigation.vue | 3 +++ src/styles/theme/content.scss | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/components/home/navigation.vue b/src/components/home/navigation.vue index d94d27bb6..0dd6b3379 100644 --- a/src/components/home/navigation.vue +++ b/src/components/home/navigation.vue @@ -153,6 +153,9 @@ export default { created() { window.addEventListener('resize', this.resize) }, + mounted() { + this.resize() + }, methods: { toggleFavoriteList(list) { // The favorites pseudo list is always favorite diff --git a/src/styles/theme/content.scss b/src/styles/theme/content.scss index d63b1251d..45ee2ff6d 100644 --- a/src/styles/theme/content.scss +++ b/src/styles/theme/content.scss @@ -16,6 +16,11 @@ margin-left: 0; padding-top: 1.5em; min-height: calc(100vh - 4rem); + + &.is-menu-enabled { + min-width: 100%; + margin-left: 0; + } } .card { From 60c5097d820f8885f9265ea7a33f3fdd82e258d3 Mon Sep 17 00:00:00 2001 From: konrad Date: Thu, 17 Dec 2020 13:44:22 +0000 Subject: [PATCH 006/276] Add trello migration (#336) Reload namespaces and lists after migrating Add trello logo Add trello migration Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/336 Co-Authored-By: konrad Co-Committed-By: konrad --- public/images/migration/trello.png | Bin 0 -> 4829 bytes src/components/migrator/migration.vue | 28 +++++++++++++++++++------- src/views/migrator/MigrateService.vue | 4 ++++ 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 public/images/migration/trello.png diff --git a/public/images/migration/trello.png b/public/images/migration/trello.png new file mode 100644 index 0000000000000000000000000000000000000000..02cfa114048a94290d2e60b67889a77a336ad5df GIT binary patch literal 4829 zcmd^Dc~Dc?myXCPMp{7>P#BvQ1wm{O5ZM|KP?1H&5JV)gS%d(J5SFmXA~Y!QQx;`! zL=;GXu!LQ*U_=Qa2qf%;eG3pFvWAd(s693R&D8ugRlisFo%h}EJLlFr@7}s~?u)mz zwgB&w-3J1Jz*jC`x&ZQ5^AwVp*y=G?y@SqYt z=rJAiVi5Eg4@&w7di)9W_#-IxGYAC$JP1VsJ^la+0r(G~Fyd}EtYz1Re#a;RC>Re4 zA%IYTCGIv9Uc85~y`cR5f})W^(M+M7 zPi@yqZP!j~*GX%?kWST2r(S$X)q6$Nf7M}-(P5a;VVp%X$)cHN(=KIqn&)&{UjPBFu&nBiQ)fTMfwVS4{8?R6>b zb1mz0FYoiJ81Swf@TnYlP&M$dYS6cO@KN=kA8ybeH-xMi3aA|lsv8cj8%EU+KW<|F zMHq`Gj3p4qo|49%k;aohj6Ww&ydY1ce4I%AIGNTu`SR1`t4~weZPPiF>5{HFbk|&I z_k4NJJeJO?V6Z9~tg2pCb?-t=-$GsgV*S8k!@y$W;9}F@QuELfet3yE!X}NdKQOd?X(b7^gKX?={n zKF(gB{JJr?uWfx@=Ps{vS2nnu4ekb)x5?#gZS%O> zylvhNkGBI{d_I3a`?Ni-Q;f#c)#Hiek6*fa=>0>?*}3@z_6lchbDLMtbD#|bl8C=@$=EJv zU~%|qUK%p8b(#6e3=R@H9>=}d;v`~g0k31`K8^u3_ED?-tJDS=0sU$e92FB#b^c&M zwK$>y=Lj|L^06-!Qn$=_6Kxv*G26(+!fssqoL>h!dz0rjlE)w2%w0!x_~iz7_?Z-8 zi0*k2#CCDVvp(LAO|NaIOQAyylrQCpruqf`0x_Q^s}+v298@Vc=X>39qyzOmGWl6Xe=cALie(KJHBuz9&t_>iNSDl?!VRGQM$Wz2nlF*nD03~$5V?28@gulc z7M-7R#35+3=Ke}&3HBm7INnzzz%rBetiyAo$2FE-S=>@kDce&$RD>#=vU306M?XjV z8}&XI{2ZE??RxF_Fy{F|DBa5cQQ^exixp+#tbD)rBFU_qV~4wApJ?}dz774H0U4Ik zQ7_7ZSSfQCAAY#QDdtWmou<)W3DtBL-#+*DnEi|zF58+j_jPEb(bNB3h4o;<$B~B2 z(P}3H-6wgSdiGSMn>5eqt6^%0C|nN*we8b4yM6V&E^U5HX1m@{q9ia6Ok;gPUhggM zp`@>kUY!%|9i+3Qv)Ax?$Q`31jm(e+{$-nr=WQNs9!vO@NZYBf^ZHXfht(z4%?vet zvOyto$rRF0o!dE&c#X6Rmu%$azGP1nMWrLxOV2SC?98b1(~|kFb`Ga_EzcpD&u_k(sSW9<`4u-iJ3~yaio2(^bQ-EQZHsYJKt|*-f4^Q0*_lehUt!ob zDIJeQ7XL0)&QQb~-4`b>tTJ`7-S&~a1`yb@I#2EeY$EV%FER2Wo%viIAxidMfI~I+ z=hsm$>_;@8kgDA*uak8ZA^X@J!7RJkE_@6mX8H(|eH!%S>=JJ`z;GGH6$o)S)}mAy zg%*zU!~DIGBPpBs_l6eACA#GL%~u|R z3csPo*`BO<#gIeC;4}-3SlrTJ;rS4l(<0PqnVoaRr?Z}ya0l+h2~wuZN7$6!apFNM z74-vTc&qPZg+Q3@wqXy8fe? zCE@Z5pYFvZp*fMbrQSk)R8vB4RauZ~%E54?nKo8lb*iftErJNqR`j9?F{}zh8;U*o zt#j>e(H(f|UdF&F&8StEv>lno02_0~g}Yfon2@WwNE;+9Oc#A{scjGAEziNb0k2Z4 zKAcnMZ_ zf8tm5&n*LK!*3hMTLv=Xza_!7&(R84Vu~*b+-$o zBa(5e(ff6H#$Hf8jbm_&0W8DcrOv}*Qa!gk{6x#ayU?8T7>U$J3$b;IO-7W1I~P5m zd9+8}wASNeRSrpC``^IB3@BE3`M?-%<*~8mH*kaOskah<$^}&38~EbqN8JX#7JWHW zqKzrBtAnaKJnx}{Yi_!v5kLe+;`v(Kr#*^Udjmh-{-`_J{4YZj7igirrpdR11OahX z?5@d*5|W0(B8Aee5<&kSKpJWe`k6e|Yv1>rrJ>qd0=r+~-vGd5_WYQ6ETK~QN6xVR z9?|c~|4-m#gNJ*%oPSi>MU0VKJyC&p^*E!-!RM+0T=tJpc8103id|at?dV~k_%@ESLGSC8rh?cutEuh zU#z5;@R=|uIwEga0PhTjY+)0)RgR-O0+{_Ur>wylQU`+Awg*z7ShXiW3g)_pwKoI& zRR=b;2i=!JUuLTk+5{OmbyxolbtiGiSs+;B;x>05wlWgu`#{?QAE*f3B&Zm^qGXL( zDge%+5Z^#0k%+)O5C}Gb-#*^QM}y92LRmX{(Wd-7By36;9mIL?!f1urR1Z3%2PHd3 zJl}}qk9!M2Wk@R8+o$IycD}?4U{v9U5ek<#unJJe$7#x#*Bh5CUW*Jb$9u|aL+P=% znz&znOAhXB6vtM^-jd>HkNjzp`ySWUx*r0D9nNZA3BA$E-L5$!j@{aWDNBwEG|XxL zVi?vNJFjpKii@Pv6D4q`9u_T13`0{2gwSr-hGyviUb;o@TqE1T-;nbuon_xU3niAE zz}PdT${RP=^lHLNYrGpL*0Rb6Z7D5+Xa-jJ@{f7mUFrXz^q+fy136EfN8L)pDV#c%jiCaoSx&)MS0CvQ}_y9IR!EJgz?w83u zEYl3))-Qs=1eE~SDbFK&>j@|}MW!CL`F{VT0D8mR9NQfEhapy*cUI0GKNthR1UbK8 z&Ctyj!AU`MU#1wQ6f`Ns0y8Nj`uYgykGt4}RU;~aZqpmW^NYUKN6MmAuiGWpPgUPF7RnJ*>slEd*j@|iqM%=moX zZ*%jf*vq6DF#5D%+DK^|*Ko>}rU3Dsvd^!Z1|)6iI|@59Lo`61XVvPjTw{jun>iU4HFxj>lwm&X{np!{VQMY2ViAG!9z0&l z49(FYgo7<%S72g5g$2}Dg6V?kz=}Nt1*ZFdLEhj;;z+^?%mi#7P|b~Zx(SlY)v9HU zml5D2a>mPz7pji}SnLSEG@ffeA2qI{c?Tv)W=B122I@XeOFvNNbsUJccQCGS)Vfgj zt!xALWYi>mythjT(I6w$IOl}@m}Oic#}q=O0^RFQSW>9oX&;WW?_sy2Ccas|M;TDl z(>{Mnw8**vb!s0RI`+u&wA;(~^D5UgpWM@4)PfdR<-bY{2dAss0eth4$~BGHajiK~ z%vKu176V}@L{1$LA)}|%%SadePD3V=qO@F|8%Vt~Gfj#*tR#2IH#4*vea=7LOse3d zX>#P@Osm&NwG>z?*|>J4k|tMod66^Mv=USv%rBRbzD_}|7pf_Q3t&23q;K8sjxQtq z9UO4om8v)K8`dNmZs!0Vdqb^!rsBc)?DXXMSzX{TkhCBSd3FC-8uP=_ohJ>tjO+E( zVwNFLpJ>{!(gem1|beqV_;m>YjFJ$xXGxl(z>YD)g%Q{jQ1x0SCl=^!u|eHjDBE zwJmgh{%x>K?|AQZVV5)R$#REEZu8z)QuRAMbL`j1e( hJoVilJ~_9ekm~*U224`CfA_!C6*KEgWhStw{{*;`GFSir literal 0 HcmV?d00001 diff --git a/src/components/migrator/migration.vue b/src/components/migrator/migration.vue index ac3998114..84c36c5a3 100644 --- a/src/components/migrator/migration.vue +++ b/src/components/migrator/migration.vue @@ -64,7 +64,7 @@ export default { isMigrating: false, lastMigrationDate: null, message: '', - wunderlistCode: '', + migratorAuthCode: '', } }, props: { @@ -82,13 +82,25 @@ export default { this.getAuthUrl() this.message = '' - if (typeof this.$route.query.code !== 'undefined') { - this.wunderlistCode = this.$route.query.code + if (typeof this.$route.query.code !== 'undefined' || location.hash.startsWith('#token=')) { + if (location.hash.startsWith('#token=')) { + this.migratorAuthCode = location.hash.substring(7) + console.log(location.hash.substring(7)) + } else { + this.migratorAuthCode = this.$route.query.code + } this.migrationService.getStatus() .then(r => { if (r.time) { - this.lastMigrationDate = new Date(r.time) - return + if (typeof r.time === 'string' && r.time.startsWith('0001-')) { + this.lastMigrationDate = null + } else { + this.lastMigrationDate = new Date(r.time) + } + + if (this.lastMigrationDate) { + return + } } this.migrate() }) @@ -109,10 +121,12 @@ export default { }, migrate() { this.isMigrating = true - this.lastMigrationDate = 0 - this.migrationService.migrate({code: this.wunderlistCode}) + this.lastMigrationDate = null + this.message = '' + this.migrationService.migrate({code: this.migratorAuthCode}) .then(r => { this.message = r.message + this.$store.dispatch('namespaces/loadNamespaces') }) .catch(e => { this.error(e, this) diff --git a/src/views/migrator/MigrateService.vue b/src/views/migrator/MigrateService.vue index f09d8a214..e126485cc 100644 --- a/src/views/migrator/MigrateService.vue +++ b/src/views/migrator/MigrateService.vue @@ -33,6 +33,10 @@ export default { this.name = 'Todoist' this.identifier = 'todoist' break + case 'trello': + this.name = 'Trello' + this.identifier = 'trello' + break default: router.push({name: '404'}) } From c400509635b37470ac943787b93b1a9e6d3ddbc5 Mon Sep 17 00:00:00 2001 From: renovate Date: Thu, 17 Dec 2020 20:48:45 +0000 Subject: [PATCH 007/276] Update dependency @fortawesome/vue-fontawesome to v2.0.2 (#337) Update dependency @fortawesome/vue-fontawesome to v2.0.2 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/337 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 86b67fcdf..777c75a31 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@fortawesome/fontawesome-svg-core": "1.2.32", "@fortawesome/free-regular-svg-icons": "5.15.1", "@fortawesome/free-solid-svg-icons": "5.15.1", - "@fortawesome/vue-fontawesome": "2.0.0", + "@fortawesome/vue-fontawesome": "2.0.2", "@vue/cli": "4.5.9", "@vue/cli-plugin-babel": "4.5.9", "@vue/cli-plugin-eslint": "4.5.9", diff --git a/yarn.lock b/yarn.lock index 9e2544229..b8aa9bb1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1585,10 +1585,10 @@ dependencies: "@fortawesome/fontawesome-common-types" "^0.2.32" -"@fortawesome/vue-fontawesome@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-2.0.0.tgz#63da3e459147cebb0a8d58eed81d6071db9f5973" - integrity sha512-N3VKw7KzRfOm8hShUVldpinlm13HpvLBQgT63QS+aCrIRLwjoEUXY5Rcmttbfb6HkzZaeqjLqd/aZCQ53UjQpg== +"@fortawesome/vue-fontawesome@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-2.0.2.tgz#5b86cd2fb7b4c17e5dede722c1c2855c97eceaea" + integrity sha512-ecpKSBUWXsxRJVi/dbOds4tkKwEcBQ1JSDZFzE2jTFpF8xIh3OgTX8POIor6bOltjibr3cdEyvnDjecMwUmxhQ== "@hapi/address@2.x.x": version "2.1.4" From 6921ba0fc601f7351ce103e9b9f174f6143bb01c Mon Sep 17 00:00:00 2001 From: renovate Date: Fri, 18 Dec 2020 00:30:00 +0000 Subject: [PATCH 008/276] Update dependency vue-advanced-cropper to v0.19.3 (#338) Update dependency vue-advanced-cropper to v0.19.3 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/338 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 777c75a31..0e23c41dd 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "snake-case": "3.0.4", "verte": "0.0.12", "vue": "2.6.12", - "vue-advanced-cropper": "0.19.2", + "vue-advanced-cropper": "0.19.3", "vue-drag-resize": "1.4.2", "vue-easymde": "1.3.2", "vue-shortkey": "3.1.7", diff --git a/yarn.lock b/yarn.lock index b8aa9bb1e..f0cce369a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15062,10 +15062,10 @@ vscode-uri@^1.0.6: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== -vue-advanced-cropper@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/vue-advanced-cropper/-/vue-advanced-cropper-0.19.2.tgz#d33f660f7d1a4a24babf24c7b6b32f72cc9b1f1a" - integrity sha512-RWlhU18UQD3l8ZN28OV4ED3E90CDfhKwjcvB2+v83qAyDmViQPgsZxQ+6kkRk2p7Qjb+BRaDp51G2GhAJcSKig== +vue-advanced-cropper@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/vue-advanced-cropper/-/vue-advanced-cropper-0.19.3.tgz#62e595fe71381768d78c3261c4a3073197e3c9dc" + integrity sha512-SZ89ooyWOWCi7afTYkUR4Or9qbIxLWePlc394Jts0HnSxA7JNfogjwHoZqjDFX0BxwV4hwIXgVUCOmU9/1qF+Q== dependencies: classnames "^2.2.6" debounce "^1.2.0" From 52f6425b3f0ce37702a8f0d4514e8e4eeed7a7ae Mon Sep 17 00:00:00 2001 From: konrad Date: Fri, 18 Dec 2020 11:12:20 +0000 Subject: [PATCH 009/276] Add Microsoft Todo migration (#339) Add microsoft todo migration cases & logo Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/339 Co-Authored-By: konrad Co-Committed-By: konrad --- public/images/migration/microsoft-todo.png | Bin 0 -> 70350 bytes src/views/migrator/MigrateService.vue | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 public/images/migration/microsoft-todo.png diff --git a/public/images/migration/microsoft-todo.png b/public/images/migration/microsoft-todo.png new file mode 100644 index 0000000000000000000000000000000000000000..38a2da38391b9dfc0305d9424c89fc92f1af40b9 GIT binary patch literal 70350 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⪻4a<}w#UE(TFy)2B2W@tvH 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 N(zn^=Z`yn6{{ReITG9Xj literal 0 HcmV?d00001 diff --git a/src/views/migrator/MigrateService.vue b/src/views/migrator/MigrateService.vue index e126485cc..f0c406077 100644 --- a/src/views/migrator/MigrateService.vue +++ b/src/views/migrator/MigrateService.vue @@ -37,6 +37,10 @@ export default { this.name = 'Trello' this.identifier = 'trello' break + case 'microsoft-todo': + this.name = 'Microsoft Todo' + this.identifier = 'microsoft-todo' + break default: router.push({name: '404'}) } From eac626d97e11dd937006a83d92d535db6d347eb3 Mon Sep 17 00:00:00 2001 From: renovate Date: Fri, 18 Dec 2020 15:57:17 +0000 Subject: [PATCH 010/276] Update dependency dompurify to v2.2.5 (#340) Update dependency dompurify to v2.2.5 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/340 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0e23c41dd..539b65e92 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "camel-case": "4.1.2", "copy-to-clipboard": "3.3.1", "date-fns": "2.16.1", - "dompurify": "2.2.4", + "dompurify": "2.2.5", "lodash": "4.17.20", "marked": "1.2.7", "register-service-worker": "1.7.2", diff --git a/yarn.lock b/yarn.lock index f0cce369a..bea6cb370 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6428,10 +6428,10 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -dompurify@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.4.tgz#a98cd182b729bdd8715c3eb7a8bf8eafb2ff7410" - integrity sha512-jE21SelIgWrGKoXGfGPA524Zt1IJFBnktwfFMHDlEYRx5FZOdc+4eEH9mkA6PuhExrq3HVpJnY8hMYUzAMl0OA== +dompurify@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.5.tgz#c42c897dc5a556b296327779270103bb23a64292" + integrity sha512-j5MdOrriBEpuU6MuUcmfvBjDb0grTUM+gsGz2VAVv83nnwjO/m+D43HFUZslR/0/y23tIas/p+oiliQoPWLwng== domutils@1.5.1: version "1.5.1" From e80ba3fd6ae7d72ded98f507936497b6a2874f24 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 18 Dec 2020 17:05:40 +0100 Subject: [PATCH 011/276] Add login via email --- src/views/user/Login.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/user/Login.vue b/src/views/user/Login.vue index c0f4de23b..fdbb2179f 100644 --- a/src/views/user/Login.vue +++ b/src/views/user/Login.vue @@ -8,7 +8,7 @@
- +
Date: Fri, 18 Dec 2020 18:51:01 +0000 Subject: [PATCH 012/276] Update dependency dompurify to v2.2.6 (#342) Update dependency dompurify to v2.2.6 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/342 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 539b65e92..6db583722 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "camel-case": "4.1.2", "copy-to-clipboard": "3.3.1", "date-fns": "2.16.1", - "dompurify": "2.2.5", + "dompurify": "2.2.6", "lodash": "4.17.20", "marked": "1.2.7", "register-service-worker": "1.7.2", diff --git a/yarn.lock b/yarn.lock index bea6cb370..50305e610 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6428,10 +6428,10 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -dompurify@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.5.tgz#c42c897dc5a556b296327779270103bb23a64292" - integrity sha512-j5MdOrriBEpuU6MuUcmfvBjDb0grTUM+gsGz2VAVv83nnwjO/m+D43HFUZslR/0/y23tIas/p+oiliQoPWLwng== +dompurify@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.6.tgz#54945dc5c0b45ce5ae228705777e8e59d7b2edc4" + integrity sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ== domutils@1.5.1: version "1.5.1" From 6688dac2c6371b175ec7a4b7bdae30fe0425caf2 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 18 Dec 2020 23:11:23 +0100 Subject: [PATCH 013/276] Change avatar endpoint --- src/models/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/user.js b/src/models/user.js index 813214eef..fc7f3dfdc 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -19,7 +19,7 @@ export default class UserModel extends AbstractModel { } getAvatarUrl(size = 50) { - return `${window.API_URL}/${this.username}/avatar?size=${size}` + return `${window.API_URL}/avatar/${this.username}?size=${size}` } getDisplayName() { From f2441a9f2b3a3001670fdecfc5ad484adb8968b4 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 18 Dec 2020 23:26:43 +0100 Subject: [PATCH 014/276] Fix related tasks width when the task is opened in a modal --- src/styles/components/task.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/styles/components/task.scss b/src/styles/components/task.scss index 1ae148e51..2ece6e716 100644 --- a/src/styles/components/task.scss +++ b/src/styles/components/task.scss @@ -245,10 +245,6 @@ color: $text; background-color: $light-background !important; - .task { - max-width: 500px; - } - @media screen and (max-width: 800px) { border-radius: 0; padding-top: 2rem; From a2ce7e761ccdfa0c60bc6a6d4085cf48ec0b3eae Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 18 Dec 2020 23:52:15 +0100 Subject: [PATCH 015/276] Change test waits (I wish I wouldn't need them) --- cypress/integration/list/list.spec.js | 2 +- cypress/integration/user/settings.spec.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cypress/integration/list/list.spec.js b/cypress/integration/list/list.spec.js index 79c882477..a1ac6a0d5 100644 --- a/cypress/integration/list/list.spec.js +++ b/cypress/integration/list/list.spec.js @@ -33,7 +33,7 @@ describe('Lists', () => { .contains('Add') .click() - cy.wait(3000) // Waiting until the request to create the new list is done + cy.wait(1000) // Waiting until the request to create the new list is done cy.get('.global-notification') .should('contain', 'Success') cy.url() diff --git a/cypress/integration/user/settings.spec.js b/cypress/integration/user/settings.spec.js index 95cbbb08a..761c1a26e 100644 --- a/cypress/integration/user/settings.spec.js +++ b/cypress/integration/user/settings.spec.js @@ -22,7 +22,7 @@ describe('User Settings', () => { .contains('Upload Avatar') .click() - cy.wait(1000) // Wait for the request to finish + cy.wait(3000) // Wait for the request to finish cy.get('.global-notification') .should('contain', 'Success') }) @@ -36,7 +36,7 @@ describe('User Settings', () => { .contains('Save') .click() - cy.wait(1000) // Wait for the request to finish + cy.wait(3000) // Wait for the request to finish cy.get('.global-notification') .should('contain', 'Success') cy.get('.navbar .user .username') From 206f32a7931464aeba9cd53b3b1312100ebecd42 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 19 Dec 2020 00:19:12 +0100 Subject: [PATCH 016/276] Fix deleting a saved filter --- src/views/filters/EditSavedFilter.vue | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/views/filters/EditSavedFilter.vue b/src/views/filters/EditSavedFilter.vue index 967134a22..49fa9ba7f 100644 --- a/src/views/filters/EditSavedFilter.vue +++ b/src/views/filters/EditSavedFilter.vue @@ -72,7 +72,7 @@ Delete this saved filter

@@ -152,6 +152,15 @@ export default { }) .catch(e => this.error(e, this)) }, + deleteSavedFilter() { + this.filterService.delete(this.filter) + .then(() => { + this.$store.dispatch('namespaces/loadNamespaces') + this.success({message: 'The filter was deleted successfully.'}, this) + this.$router.push({name: 'namespaces.index'}) + }) + .catch(e => this.error(e, this)) + }, }, } From d104f15debd417e11e30bf8270f69ee073e9c58f Mon Sep 17 00:00:00 2001 From: renovate Date: Fri, 18 Dec 2020 23:23:22 +0000 Subject: [PATCH 017/276] Update dependency eslint to v7.16.0 (#344) Update dependency eslint to v7.16.0 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/344 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 6db583722..03825bc44 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "babel-eslint": "10.1.0", "cypress": "6.1.0", "cypress-file-upload": "4.1.1", - "eslint": "7.15.0", + "eslint": "7.16.0", "eslint-plugin-vue": "7.3.0", "faker": "5.1.0", "jest": "26.6.3", diff --git a/yarn.lock b/yarn.lock index 50305e610..fece3dce9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4087,6 +4087,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -6825,10 +6830,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.15.0: - version "7.15.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.15.0.tgz#eb155fb8ed0865fcf5d903f76be2e5b6cd7e0bc7" - integrity sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA== +eslint@7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" + integrity sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.2" @@ -6864,7 +6869,7 @@ eslint@7.15.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.4" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -10288,7 +10293,7 @@ lodash@4, lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, loda resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@4.17.20: +lodash@4.17.20, lodash@^4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -13513,6 +13518,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + smooth-dnd@0.12.1: version "0.12.1" resolved "https://registry.yarnpkg.com/smooth-dnd/-/smooth-dnd-0.12.1.tgz#cdb44c972355659e32770368b29b6a80e0ed96f1" @@ -14170,7 +14184,7 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@5.4.6, table@^5.2.3: +table@5.4.6: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== @@ -14180,6 +14194,16 @@ table@5.4.6, table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" + integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== + dependencies: + ajv "^6.12.4" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" From 4a02a1b496e22028b6beebcf866c140663c8602c Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 19 Dec 2020 00:12:30 +0000 Subject: [PATCH 018/276] Add setting for sending reminder emails (#343) Fix the "Import your data button" in the settings Add setting for sending reminder emails Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/343 Co-Authored-By: konrad Co-Committed-By: konrad --- src/models/userName.js | 10 ------ src/models/userSettings.js | 11 +++++++ src/services/userName.js | 10 ------ src/services/userSettings.js | 10 ++++++ src/store/modules/auth.js | 3 +- src/views/user/Settings.vue | 59 ++++++++++++++++++++---------------- 6 files changed, 56 insertions(+), 47 deletions(-) delete mode 100644 src/models/userName.js create mode 100644 src/models/userSettings.js delete mode 100644 src/services/userName.js create mode 100644 src/services/userSettings.js diff --git a/src/models/userName.js b/src/models/userName.js deleted file mode 100644 index 1e1cc5d4e..000000000 --- a/src/models/userName.js +++ /dev/null @@ -1,10 +0,0 @@ - -import AbstractModel from './abstractModel' - -export default class UserNameModel extends AbstractModel { - defaults() { - return { - name: '', - } - } -} \ No newline at end of file diff --git a/src/models/userSettings.js b/src/models/userSettings.js new file mode 100644 index 000000000..2a11061f3 --- /dev/null +++ b/src/models/userSettings.js @@ -0,0 +1,11 @@ + +import AbstractModel from './abstractModel' + +export default class UserSettingsModel extends AbstractModel { + defaults() { + return { + name: '', + emailRemindersEnabled: true, + } + } +} \ No newline at end of file diff --git a/src/services/userName.js b/src/services/userName.js deleted file mode 100644 index 83a09cd72..000000000 --- a/src/services/userName.js +++ /dev/null @@ -1,10 +0,0 @@ - -import AbstractService from './abstractService' - -export default class UserNameService extends AbstractService { - constructor() { - super({ - update: '/user/settings/name', - }) - } -} \ No newline at end of file diff --git a/src/services/userSettings.js b/src/services/userSettings.js new file mode 100644 index 000000000..eb7aebf2e --- /dev/null +++ b/src/services/userSettings.js @@ -0,0 +1,10 @@ + +import AbstractService from './abstractService' + +export default class UserSettingsService extends AbstractService { + constructor() { + super({ + update: '/user/settings/general', + }) + } +} \ No newline at end of file diff --git a/src/store/modules/auth.js b/src/store/modules/auth.js index b431d53e4..6dd48623c 100644 --- a/src/store/modules/auth.js +++ b/src/store/modules/auth.js @@ -16,8 +16,9 @@ export default { state.info = info state.avatarUrl = info.getAvatarUrl() }, - setUserName(state, name) { + setUserSettings(state, {name, emailRemindersEnabled}) { state.info.name = name + state.info.emailRemindersEnabled = emailRemindersEnabled }, authenticated(state, authenticated) { state.authenticated = authenticated diff --git a/src/views/user/Settings.vue b/src/views/user/Settings.vue index 5fabdd950..aa49f4b40 100644 --- a/src/views/user/Settings.vue +++ b/src/views/user/Settings.vue @@ -106,30 +106,36 @@

- +

- Update your name + General Settings

-
- -
- -
+
+ +
+
+
+
+ +
- @@ -217,7 +223,7 @@
Import your data into Vikunja @@ -266,8 +272,8 @@ import EmailUpdateService from '../../services/emailUpdate' import EmailUpdateModel from '../../models/emailUpdate' import TotpModel from '../../models/totp' import TotpService from '../../services/totp' -import UserNameService from '../../services/userName' -import UserNameModel from '../../models/userName' +import UserSettingsService from '../../services/userSettings' +import UserSettingsModel from '../../models/userSettings' import {mapState} from 'vuex' @@ -295,8 +301,8 @@ export default { caldavUrl: '', - name: '', - userNameService: UserNameService, + settings: UserSettingsModel, + userSettingsService: UserSettingsService, } }, components: { @@ -312,8 +318,11 @@ export default { this.totpService = new TotpService() this.totp = new TotpModel() - this.userNameService = new UserNameService() - this.name = this.$store.state.auth.info.name + this.userSettingsService = new UserSettingsService() + this.settings = new UserSettingsModel({ + name: this.$store.state.auth.info.name, + emailRemindersEnabled: this.$store.state.auth.info.emailRemindersEnabled ?? false, + }) this.totpStatus() this.buildCaldavUrl() @@ -399,12 +408,10 @@ export default { }) .catch(e => this.error(e, this)) }, - updateName() { - const name = new UserNameModel({name: this.name}) - - this.userNameService.update(name) + updateSettings() { + this.userSettingsService.update(this.settings) .then(() => { - this.$store.commit('auth/setUserName', this.name) + this.$store.commit('auth/setUserSettings', this.settings) this.success({message: 'The name was successfully changed.'}, this) }) .catch(e => this.error(e, this)) From 0f213b933f0fc8ff1ac66b26c7e9d104f9a67b7f Mon Sep 17 00:00:00 2001 From: renovate Date: Sat, 19 Dec 2020 15:14:46 +0000 Subject: [PATCH 019/276] Update dependency vue-advanced-cropper to v0.20.0 (#346) Update dependency vue-advanced-cropper to v0.20.0 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/346 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 03825bc44..16603ac8b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "snake-case": "3.0.4", "verte": "0.0.12", "vue": "2.6.12", - "vue-advanced-cropper": "0.19.3", + "vue-advanced-cropper": "0.20.0", "vue-drag-resize": "1.4.2", "vue-easymde": "1.3.2", "vue-shortkey": "3.1.7", diff --git a/yarn.lock b/yarn.lock index fece3dce9..893a8d6e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15086,10 +15086,10 @@ vscode-uri@^1.0.6: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== -vue-advanced-cropper@0.19.3: - version "0.19.3" - resolved "https://registry.yarnpkg.com/vue-advanced-cropper/-/vue-advanced-cropper-0.19.3.tgz#62e595fe71381768d78c3261c4a3073197e3c9dc" - integrity sha512-SZ89ooyWOWCi7afTYkUR4Or9qbIxLWePlc394Jts0HnSxA7JNfogjwHoZqjDFX0BxwV4hwIXgVUCOmU9/1qF+Q== +vue-advanced-cropper@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/vue-advanced-cropper/-/vue-advanced-cropper-0.20.0.tgz#d67e54d061c3d62264be24b8b6238298cba262dc" + integrity sha512-i32Z2hSfKLly96H9zN3liKdPEEykNNM2ebJu3WWew8/qCGGlvwLA610xnhZ4DqonAOM57GIsIpJ7zXvXl4ikwg== dependencies: classnames "^2.2.6" debounce "^1.2.0" From 533d8f1236e19b5b13f33f9bb2426a608a321abf Mon Sep 17 00:00:00 2001 From: renovate Date: Sat, 19 Dec 2020 19:23:40 +0000 Subject: [PATCH 020/276] Update dependency vue-advanced-cropper to v0.20.1 (#348) Update dependency vue-advanced-cropper to v0.20.1 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/348 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 16603ac8b..36e73fb92 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "snake-case": "3.0.4", "verte": "0.0.12", "vue": "2.6.12", - "vue-advanced-cropper": "0.20.0", + "vue-advanced-cropper": "0.20.1", "vue-drag-resize": "1.4.2", "vue-easymde": "1.3.2", "vue-shortkey": "3.1.7", diff --git a/yarn.lock b/yarn.lock index 893a8d6e1..c5259d8ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15086,10 +15086,10 @@ vscode-uri@^1.0.6: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== -vue-advanced-cropper@0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/vue-advanced-cropper/-/vue-advanced-cropper-0.20.0.tgz#d67e54d061c3d62264be24b8b6238298cba262dc" - integrity sha512-i32Z2hSfKLly96H9zN3liKdPEEykNNM2ebJu3WWew8/qCGGlvwLA610xnhZ4DqonAOM57GIsIpJ7zXvXl4ikwg== +vue-advanced-cropper@0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/vue-advanced-cropper/-/vue-advanced-cropper-0.20.1.tgz#bf77f8c650d4e2f1b8d73152e4cdbb227eac8942" + integrity sha512-G/RloEFoAIMd8hK9xczcu9muUNq0GzHupcnuFQuiyk9+4W+JkT4Ypnrr0CLDrtuFwd1BFabiX9bdpk+Z/XP2EQ== dependencies: classnames "^2.2.6" debounce "^1.2.0" From 69a9f867b420f08dbde46777131370ad3b71d9a4 Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 19 Dec 2020 19:23:46 +0000 Subject: [PATCH 021/276] Add task filter for reminders (#347) Add task filter for reminders Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/347 Co-Authored-By: konrad Co-Committed-By: konrad --- src/components/list/partials/filters.vue | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/components/list/partials/filters.vue b/src/components/list/partials/filters.vue index 546e2f850..3be7bb50c 100644 --- a/src/components/list/partials/filters.vue +++ b/src/components/list/partials/filters.vue @@ -70,6 +70,18 @@ />
+
+ +
+ +
+
@@ -128,6 +140,7 @@ export default { endDate: '', percentDone: 0, usePercentDone: false, + reminders: '', }, flatPickerConfig: { altFormat: 'j M Y H:i', @@ -333,6 +346,9 @@ export default { setPercentDoneFilter() { this.setSingleValueFilter('percent_done', 'percentDone', 'usePercentDone') }, + setReminderFilter() { + this.setDateFilter('reminders', 'reminders') + }, prepareDueDate() { this.prepareDate('due_date', 'dueDate') }, @@ -348,6 +364,9 @@ export default { preparePercentDone() { this.prepareSingleValue('percent_done', 'percentDone', 'usePercentDone', true) }, + prepareReminders() { + this.prepareDate('reminders', 'reminders') + }, }, } From 8c41cd54a885f36bce8fedcfc77d7785f65b3cba Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 19 Dec 2020 21:39:25 +0000 Subject: [PATCH 022/276] Add task filter for assignees (#349) Rearrange filter Add task filter for assignees Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/349 Co-Authored-By: konrad Co-Committed-By: konrad --- src/components/list/partials/filters.vue | 146 ++++++++++++++++++----- 1 file changed, 119 insertions(+), 27 deletions(-) diff --git a/src/components/list/partials/filters.vue b/src/components/list/partials/filters.vue index 3be7bb50c..a2374802c 100644 --- a/src/components/list/partials/filters.vue +++ b/src/components/list/partials/filters.vue @@ -18,18 +18,6 @@
-
- -
- -
-
@@ -46,6 +34,34 @@
+
+ +
+ + + Enable Filter By Percent Done + +
+
+
+ +
+ +
+
@@ -82,20 +98,37 @@ />
+
- -
- - Assignees +
+ - Enable Filter By Percent Done - + +
@@ -106,11 +139,16 @@ import Fancycheckbox from '../../input/fancycheckbox' import flatPickr from 'vue-flatpickr-component' import 'flatpickr/dist/flatpickr.css' +import Multiselect from 'vue-multiselect' import {formatISO} from 'date-fns' +import differenceWith from 'lodash/differenceWith' + import PrioritySelect from '@/components/tasks/partials/prioritySelect' import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect' +import UserService from '../../../services/user' + export default { name: 'filters', components: { @@ -118,6 +156,7 @@ export default { Fancycheckbox, flatPickr, PercentDoneSelect, + Multiselect, }, data() { return { @@ -141,6 +180,7 @@ export default { percentDone: 0, usePercentDone: false, reminders: '', + assignees: '', }, flatPickerConfig: { altFormat: 'j M Y H:i', @@ -150,8 +190,15 @@ export default { time_24hr: true, mode: 'range', }, + + userService: UserService, + foundUsers: [], + users: [], } }, + created() { + this.userService = new UserService() + }, mounted() { this.params = this.value this.filters.requireAllFilters = this.params.filter_concat === 'and' @@ -254,8 +301,8 @@ export default { this.filters[variableName] = `${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()} to ${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()}` } }, - setSingleValueFilter(filterName, variableName, useVariableName) { - if (!this.filters[useVariableName]) { + setSingleValueFilter(filterName, variableName, useVariableName = '', comparator = 'equals') { + if (useVariableName !== '' && !this.filters[useVariableName]) { this.removePropertyFromFilter(filterName) return } @@ -270,7 +317,7 @@ export default { if (!found) { this.params.filter_by.push(filterName) - this.params.filter_comparator.push('equals') + this.params.filter_comparator.push(comparator) this.params.filter_value.push(this.filters[variableName]) } @@ -367,6 +414,51 @@ export default { prepareReminders() { this.prepareDate('reminders', 'reminders') }, + clearUsers() { + this.$set(this, 'foundUsers', []) + }, + findUser(query) { + + if(query === '') { + this.clearUsers() + } + + this.userService.getAll({}, {s: query}) + .then(response => { + // Filter the results to not include users who are already assigneid + this.$set(this, 'foundUsers', differenceWith(response, this.users, (first, second) => { + return first.id === second.id + })) + }) + .catch(e => { + this.error(e, this) + }) + }, + addUser() { + this.$nextTick(() => { + this.changeAssigneeFilter() + }) + }, + removeUser() { + this.$nextTick(() => { + this.changeAssigneeFilter() + }) + }, + changeAssigneeFilter() { + if(this.users.length === 0) { + this.removePropertyFromFilter('assignees') + this.change() + return + } + + let userIDs = [] + this.users.forEach(u => { + userIDs.push(u.id) + }) + + this.$set(this.filters, 'assignees', userIDs.join(',')) + this.setSingleValueFilter('assignees', 'assignees', '', 'in') + }, }, } From 79335aaedf1ba1bba17204ea6d8af482bf7a9f68 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 20 Dec 2020 12:41:47 +0000 Subject: [PATCH 023/276] Add task filter for labels (#350) Add task filter for labels Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/350 Co-Authored-By: konrad Co-Committed-By: konrad --- src/components/list/partials/filters.vue | 105 ++++++++++++++++++++++- 1 file changed, 102 insertions(+), 3 deletions(-) diff --git a/src/components/list/partials/filters.vue b/src/components/list/partials/filters.vue index a2374802c..d3b4d5b50 100644 --- a/src/components/list/partials/filters.vue +++ b/src/components/list/partials/filters.vue @@ -131,6 +131,47 @@
+ +
+ +
+ + + + +
+
@@ -147,7 +188,8 @@ import differenceWith from 'lodash/differenceWith' import PrioritySelect from '@/components/tasks/partials/prioritySelect' import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect' -import UserService from '../../../services/user' +import UserService from '@/services/user' +import LabelService from '@/services/label' export default { name: 'filters', @@ -194,10 +236,15 @@ export default { userService: UserService, foundUsers: [], users: [], + + labelService: LabelService, + foundLabels: [], + labels: [], } }, created() { this.userService = new UserService() + this.labelService = new LabelService() }, mounted() { this.params = this.value @@ -419,7 +466,7 @@ export default { }, findUser(query) { - if(query === '') { + if (query === '') { this.clearUsers() } @@ -445,7 +492,7 @@ export default { }) }, changeAssigneeFilter() { - if(this.users.length === 0) { + if (this.users.length === 0) { this.removePropertyFromFilter('assignees') this.change() return @@ -459,6 +506,58 @@ export default { this.$set(this.filters, 'assignees', userIDs.join(',')) this.setSingleValueFilter('assignees', 'assignees', '', 'in') }, + clearLabels() { + this.$set(this, 'foundLabels', []) + }, + findLabels(query) { + + if (query === '') { + this.clearLabels() + } + + this.labelService.getAll({}, {s: query}) + .then(response => { + // Filter the results to not include labels already selected + this.$set(this, 'foundLabels', differenceWith(response, this.labels, (first, second) => { + return first.id === second.id + })) + }) + .catch(e => { + this.error(e, this) + }) + }, + addLabel() { + this.$nextTick(() => { + this.changeLabelFilter() + }) + }, + removeLabel(label) { + this.$nextTick(() => { + for (const l in this.labels) { + if (this.labels[l].id === label.id) { + this.labels.splice(l, 1) + } + break + } + + this.changeLabelFilter() + }) + }, + changeLabelFilter() { + if (this.labels.length === 0) { + this.removePropertyFromFilter('labels') + this.change() + return + } + + let labelIDs = [] + this.labels.forEach(u => { + labelIDs.push(u.id) + }) + + this.$set(this.filters, 'labels', labelIDs.join(',')) + this.setSingleValueFilter('labels', 'labels', '', 'in') + }, }, } From 4de803073263371d859db85cd4a71e4b4d43d0f4 Mon Sep 17 00:00:00 2001 From: renovate Date: Mon, 21 Dec 2020 22:29:00 +0000 Subject: [PATCH 024/276] Update dependency cypress to v6.2.0 (#352) Update dependency cypress to v6.2.0 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/352 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 36e73fb92..41d169d9a 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@vue/cli-service": "4.5.9", "axios": "0.21.0", "babel-eslint": "10.1.0", - "cypress": "6.1.0", + "cypress": "6.2.0", "cypress-file-upload": "4.1.1", "eslint": "7.16.0", "eslint-plugin-vue": "7.3.0", diff --git a/yarn.lock b/yarn.lock index c5259d8ec..5ed5f5c94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5995,10 +5995,10 @@ cypress-file-upload@4.1.1: dependencies: mime "^2.4.4" -cypress@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.1.0.tgz#af2596cb110aa98eaf75fef3d8ab379ca0ff2413" - integrity sha512-uQnSxRcZ6hkf9R5cr8KpRBTzN88QZwLIImbf5DWa5RIxH6o5Gpff58EcjiYhAR8/8p9SGv7O6SRygq4H+k0Qpw== +cypress@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.2.0.tgz#1a8a7dd5bd08db3064551a9f12072963cc9337bf" + integrity sha512-m/rkcogYM9MTy8rbsZgyS5wT2L/J+B5V2bY2ztkDNMyqhk/oZgUF4KTWVLzkW2I+scg0iAddca95tLlt7XnAtw== dependencies: "@cypress/listr-verbose-renderer" "^0.4.1" "@cypress/request" "^2.88.5" From 6e3a884d60f3933ee91a19512649269485f60bb7 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 21 Dec 2020 23:13:39 +0000 Subject: [PATCH 025/276] Add task filter for lists and namespaces (#351) Add filter population method for labels Add filter population methods for lists and namespaces Re-extract one-line methods Who said you could abstract too much? Fix populating saved filters with assignees Add namespaces filter Add lists filter Abstract finding related entities Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/351 Co-Authored-By: konrad Co-Committed-By: konrad --- src/components/list/partials/filters.vue | 208 +++++++++++++++++------ 1 file changed, 154 insertions(+), 54 deletions(-) diff --git a/src/components/list/partials/filters.vue b/src/components/list/partials/filters.vue index d3b4d5b50..6c17c5d24 100644 --- a/src/components/list/partials/filters.vue +++ b/src/components/list/partials/filters.vue @@ -107,16 +107,16 @@ :close-on-select="true" :hide-selected="true" :internal-search="true" - :loading="userService.loading" + :loading="usersService.loading" :multiple="true" - :options="foundUsers" + :options="foundusers" :options-limit="300" :searchable="true" :showNoOptions="false" :taggable="false" - @search-change="findUser" - @select="user => addUser(user)" - @remove="removeUser" + @search-change="query => find('users', query)" + @select="() => add('users', 'assignees')" + @remove="() => remove('users', 'assignees')" label="username" placeholder="Type to search for a user..." track-by="id" @@ -124,7 +124,7 @@ > @@ -172,6 +172,73 @@ + + @@ -190,6 +257,8 @@ import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect' import UserService from '@/services/user' import LabelService from '@/services/label' +import ListService from '@/services/list' +import NamespaceService from '@/services/namespace' export default { name: 'filters', @@ -223,6 +292,9 @@ export default { usePercentDone: false, reminders: '', assignees: '', + labels: '', + list_id: '', + namespace: '', }, flatPickerConfig: { altFormat: 'j M Y H:i', @@ -233,18 +305,28 @@ export default { mode: 'range', }, - userService: UserService, - foundUsers: [], + usersService: UserService, + foundusers: [], users: [], labelService: LabelService, foundLabels: [], labels: [], + + listsService: ListService, + foundlists: [], + lists: [], + + namespaceService: NamespaceService, + foundnamespace: [], + namespace: [], } }, created() { - this.userService = new UserService() + this.usersService = new UserService() this.labelService = new LabelService() + this.listsService = new ListService() + this.namespaceService = new NamespaceService() }, mounted() { this.params = this.value @@ -269,11 +351,16 @@ export default { }, prepareFilters() { this.prepareDone() - this.prepareDueDate() - this.prepareStartDate() - this.prepareEndDate() - this.preparePriority() - this.preparePercentDone() + this.prepareDate('due_date', 'dueDate') + this.prepareDate('start_date', 'startDate') + this.prepareDate('end_date', 'endDate') + this.prepareSingleValue('priority', 'priority', 'usePriority', true) + this.prepareSingleValue('percent_done', 'percentDone', 'usePercentDone', true) + this.prepareDate('reminders') + this.prepareRelatedObjectFilter('users', 'assignees') + this.prepareRelatedObjectFilter('labels', 'labels', 'label') + this.prepareRelatedObjectFilter('lists', 'list_id') + this.prepareRelatedObjectFilter('namespace') }, removePropertyFromFilter(propertyName) { for (const i in this.params.filter_by) { @@ -370,7 +457,18 @@ export default { this.change() }, - prepareSingleValue(filterName, variableName, useVariableName, isNumber = false) { + /** + * + * @param filterName The filter name in the api. + * @param variableName The name of the variable in this.filters. + * @param useVariableName The name of the variable of the "Use this filter" variable. Will only be set if the parameter is not null. + * @param isNumber Toggles if the value should be parsed as a number. + */ + prepareSingleValue(filterName, variableName = null, useVariableName = null, isNumber = false) { + if (variableName === null) { + variableName = filterName + } + let found = false for (const i in this.params.filter_by) { if (this.params.filter_by[i] === filterName) { @@ -379,7 +477,7 @@ export default { } } - if (found === false) { + if (found === false && useVariableName !== null) { this.filters[useVariableName] = false return } @@ -390,7 +488,9 @@ export default { this.filters[variableName] = this.params.filter_value[found] } - this.filters[useVariableName] = true + if (useVariableName !== null) { + this.filters[useVariableName] = true + } }, prepareDone() { // Set filters.done based on params @@ -408,6 +508,24 @@ export default { this.$set(this.filters, 'done', true) } }, + prepareRelatedObjectFilter(kind, filterName = null, servicePrefix = null) { + if (filterName === null) { + filterName = kind + } + + if (servicePrefix === null) { + servicePrefix = kind + } + + this.prepareSingleValue(filterName) + if (this.filters[filterName] !== '') { + this[`${servicePrefix}Service`].getAll({}, {s: this.filters[filterName]}) + .then(r => { + this.$set(this, kind, r) + }) + .catch(e => this.error(e, this)) + } + }, setDoneFilter() { if (this.filters.done) { this.removePropertyFromFilter('done') @@ -441,39 +559,21 @@ export default { this.setSingleValueFilter('percent_done', 'percentDone', 'usePercentDone') }, setReminderFilter() { - this.setDateFilter('reminders', 'reminders') + this.setDateFilter('reminders') }, - prepareDueDate() { - this.prepareDate('due_date', 'dueDate') + clear(kind) { + this.$set(this, `found${kind}`, []) }, - preparePriority() { - this.prepareSingleValue('priority', 'priority', 'usePriority', true) - }, - prepareStartDate() { - this.prepareDate('start_date', 'startDate') - }, - prepareEndDate() { - this.prepareDate('end_date', 'endDate') - }, - preparePercentDone() { - this.prepareSingleValue('percent_done', 'percentDone', 'usePercentDone', true) - }, - prepareReminders() { - this.prepareDate('reminders', 'reminders') - }, - clearUsers() { - this.$set(this, 'foundUsers', []) - }, - findUser(query) { + find(kind, query) { if (query === '') { - this.clearUsers() + this.clear(kind) } - this.userService.getAll({}, {s: query}) + this[`${kind}Service`].getAll({}, {s: query}) .then(response => { // Filter the results to not include users who are already assigneid - this.$set(this, 'foundUsers', differenceWith(response, this.users, (first, second) => { + this.$set(this, `found${kind}`, differenceWith(response, this[kind], (first, second) => { return first.id === second.id })) }) @@ -481,30 +581,30 @@ export default { this.error(e, this) }) }, - addUser() { + add(kind, filterName) { this.$nextTick(() => { - this.changeAssigneeFilter() + this.changeMultiselectFilter(kind, filterName) }) }, - removeUser() { + remove(kind, filterName) { this.$nextTick(() => { - this.changeAssigneeFilter() + this.changeMultiselectFilter(kind, filterName) }) }, - changeAssigneeFilter() { - if (this.users.length === 0) { - this.removePropertyFromFilter('assignees') + changeMultiselectFilter(kind, filterName) { + if (this[kind].length === 0) { + this.removePropertyFromFilter(filterName) this.change() return } - let userIDs = [] - this.users.forEach(u => { - userIDs.push(u.id) + let ids = [] + this[kind].forEach(u => { + ids.push(u.id) }) - this.$set(this.filters, 'assignees', userIDs.join(',')) - this.setSingleValueFilter('assignees', 'assignees', '', 'in') + this.$set(this.filters, filterName, ids.join(',')) + this.setSingleValueFilter(filterName, filterName, '', 'in') }, clearLabels() { this.$set(this, 'foundLabels', []) From 1c95e7eae904995e68efa6e9ffa5bc3aa4c28d4b Mon Sep 17 00:00:00 2001 From: renovate Date: Tue, 22 Dec 2020 09:04:14 +0000 Subject: [PATCH 026/276] Update dependency axios to v0.21.1 (#353) Update dependency axios to v0.21.1 Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/353 Co-Authored-By: renovate Co-Committed-By: renovate --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 41d169d9a..bf848c5a0 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@vue/cli-plugin-eslint": "4.5.9", "@vue/cli-plugin-pwa": "4.5.9", "@vue/cli-service": "4.5.9", - "axios": "0.21.0", + "axios": "0.21.1", "babel-eslint": "10.1.0", "cypress": "6.2.0", "cypress-file-upload": "4.1.1", diff --git a/yarn.lock b/yarn.lock index 5ed5f5c94..3a8f7fb7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4169,10 +4169,10 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axios@0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca" - integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw== +axios@0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== dependencies: follow-redirects "^1.10.0" From 0f77ad2d584ee4dc821efa993cf44dd200cb844a Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 22 Dec 2020 12:49:34 +0100 Subject: [PATCH 027/276] Add task filter for kanban --- src/components/list/partials/filters.vue | 2 +- src/store/modules/kanban.js | 4 +-- src/views/list/views/Kanban.vue | 34 ++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/components/list/partials/filters.vue b/src/components/list/partials/filters.vue index 6c17c5d24..d2d2dfeaa 100644 --- a/src/components/list/partials/filters.vue +++ b/src/components/list/partials/filters.vue @@ -518,7 +518,7 @@ export default { } this.prepareSingleValue(filterName) - if (this.filters[filterName] !== '') { + if (typeof this.filters[filterName] !== 'undefined' && this.filters[filterName] !== '') { this[`${servicePrefix}Service`].getAll({}, {s: this.filters[filterName]}) .then(r => { this.$set(this, kind, r) diff --git a/src/store/modules/kanban.js b/src/store/modules/kanban.js index 25bcb0c3e..284b51ab8 100644 --- a/src/store/modules/kanban.js +++ b/src/store/modules/kanban.js @@ -113,14 +113,14 @@ export default { }, }, actions: { - loadBucketsForList(ctx, listId) { + loadBucketsForList(ctx, {listId, params}) { const cancel = setLoading(ctx) // Clear everything to prevent having old buckets in the list if loading the buckets from this list takes a few moments ctx.commit('setBuckets', []) const bucketService = new BucketService() - return bucketService.getAll({listId: listId}) + return bucketService.getAll({listId: listId}, params) .then(r => { ctx.commit('setBuckets', r) ctx.commit('setListId', listId) diff --git a/src/views/list/views/Kanban.vue b/src/views/list/views/Kanban.vue index c135e9126..c921e20a9 100644 --- a/src/views/list/views/Kanban.vue +++ b/src/views/list/views/Kanban.vue @@ -1,5 +1,22 @@ @@ -394,10 +390,16 @@ export default { this.bubble() this.renderPreview() }, - showPreview() { - this.isPreviewActive = true - this.isEditActive = false - this.renderPreview() + toggleEdit() { + if (this.isEditActive) { + this.isPreviewActive = true; + this.isEditActive = false; + this.renderPreview(); + this.bubble(0); // save instantly + } else { + this.isPreviewActive = false; + this.isEditActive = true; + } }, }, } From 158e697988c4d822f67f87aacd787917ff7c2820 Mon Sep 17 00:00:00 2001 From: azymondrian Date: Thu, 31 Dec 2020 15:16:07 +0000 Subject: [PATCH 045/276] Show task progress on task (#354) Shows the task completion percent as progress bar in task lists and on kanban cards. Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/354 Reviewed-by: konrad Co-authored-by: azymondrian Co-committed-by: azymondrian --- .../tasks/partials/singleTaskInList.vue | 6 ++++++ src/styles/components/kanban.scss | 6 ++++++ src/styles/components/tasks.scss | 17 +++++++++++++++-- src/styles/theme/navigation.scss | 2 +- src/views/list/views/Kanban.vue | 6 ++++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/components/tasks/partials/singleTaskInList.vue b/src/components/tasks/partials/singleTaskInList.vue index 6cb90706d..325a91842 100644 --- a/src/components/tasks/partials/singleTaskInList.vue +++ b/src/components/tasks/partials/singleTaskInList.vue @@ -56,6 +56,12 @@ + + {{ task.percentDone * 100 }}% +

{{ task.title }}

+ + {{ task.percentDone * 100 }}% +